; *********************************************************************
; EDIT04A
; Pascal editor file 04A
; B.Bridgwater 5.12.83
; *********************************************************************
;
;-----------------------------------------------------------------------
initedit ;
;
;Set up edit keys as softkeys, and set softkeys to have
;following bases -
;
;plain = &80
;shift = &90
;ctrl  = &A0
;
       ldaIM 4
       ldxIM 2
       jsr OSBYTE
       ldaIM &E1
       ldxIM &80
       ldyIM 0
       jsr OSBYTE
       ldaIM &E2
       ldxIM &90
       ldyIM 0
       jsr OSBYTE
       ldaIM &E3
       ldxIM &A0
       ldyIM 0
       jsr OSBYTE
       ;
       ;Turn page mode off, in case punter has been anti-social and set it.
       ;
       ldaIM ctrlO
       jmp OSWRCH
;-----------------------------------------------------------------------
inituser ;Return cursor-keys & softkeys to 'normal' state.
;
       ldaIM 4
       ldxIM 0
       jsr OSBYTE
       ;
       ldaIM 225
       ldxIM 1
       ldyIM 0
       jmp OSBYTE
;-----------------------------------------------------------------------
starttest ;Returns CS if on 1st line (GS = TSTART), else CC.
;
       lda TSTART
       cmp GS
       lda TSTART+1
       sbc GS+1
       ;
       rts
;-----------------------------------------------------------------------
endtest ;Returns CSAs if on last line (GE+scrimcreenY = TMAX), else CC.
;
       clc
       lda currlength
       adc GE
       tax
       ldaIM 0
       adc GE+1
       ;
       cpx TMAX
       sbc TMAX+1
       ;
etstexit rts
;-----------------------------------------------------------------------
lengthcalc ;Find length of current line.
;
;Exit - A = length - 1
;
       ldx pagewidth
       ldyIM 0
leccloop ldaIY GE
       andIM &7F
       cmpIM CR
       beq leccres
       iny
       dex
       bne leccloop
       ;
leccres tya
       rts
;-----------------------------------------------------------------------
checkroomXY ;Check for space in edit buffer.
;
;Entry - XY = required No. of bytes
;
;Exit  - size = XY
;        XY = temp = GE - XY
;        Error if temp < GS
;
       stx size
       sty size+1
       ;
       sec
       lda GE
       sbc size
       tax
       lda GE+1
       sbc size+1
       tay
       ;
       stx temp
       sty temp+1
       ;
       cpx GS
       sbc GS+1
       bcc chkrXYerr
       ;
       rts
;
chkrXYerr jmp brkX6 ;'No room'
;-----------------------------------------------------------------------
curon  ldxIM 1
       ldyIM 1
       bne vdu23
curoff ldxIM 1
       ldyIM 0
;
vdu23 ;
;
;Entry - X = 1st byte
;        Y = 2nd byte
;
;Exit  - VDU 23,X,Y,0,0,0,0,0,0,0 Output.
;
       ldaIM 23
       jsr OSWRCH
       txa
       jsr OSWRCH
       tya
       jsr OSWRCH
       ldaIM 0
vdu23cont ldxIM 7
vdu23loop jsr OSWRCH
       dex
       bne vdu23loop
       rts
;-----------------------------------------------------------------------
clearscreen ;
;
       ldaIM FF
       jsr OSWRCH
       ;
       ;Initialize scrim.
       ldaIM 0
       ldy scrnlg
scmiloop staAY scrim
       dey
       bpl scmiloop
       ;
       jsr status
       ldaIM none
       sta scrnpy
       rts
;-----------------------------------------------------------------------
edrdch ;
;
;Exit - A holds character read (=&1B if escape (acknowledged)
;
       lda nextreadflag
       beq edrdOSRD
       ;
       lda nxtchr
       dec nextreadflag
       rts
;
edrdOSRD jsr OSRDCH
       bcc edrdexit
       ;
       ldaIM &7E
       jsr OSBYTE
       ;
       ldaIM ESCAPE
       ;
edrdexit rts
;-----------------------------------------------------------------------
status ;Output status on status line.
;
       ldy scrnlg
       ;
statsY ;Output status on screen line Y.
       ;
       sty atemp
       ;
       jsr csr0Y
       ;
       ldaIM "#"
       jsr OSWRCH
       ldx insertflag
       ldaAX IOstattxt
       ;
       jsr OSWRCH
       ldx cursedflag
       ldaAX CEstattxt
       jsr OSWRCH
       ;
       ldaIM "#"
       jsr OSWRCH
       lda markX
       oraim "0"
       jsr OSWRCH
       ldaIM "M"
       jsr OSWRCH
       ;
       ldaIM 5
       ldy atemp
       jsr wipetail
       ;
       rts
;
IOstattxt ;
       = "O"
       = "I"
;
CEstattxt ;
       = " "
       = "*"
;-----------------------------------------------------------------------
prompt ;
;
       ldy scrnlg
       jsr wipeline
       ;
       ldxIM 0
prmptX ;
       ldy scrnlg
       jsr csrXY
       ;
       ldaIM 1
       bne strmflag
;
strimo ;
;
       ldaIM 0
strmflag sta flag
       ;
       pla
       sta string
       pla
       sta string+1
       ;
       jsr strout
       ;
       sec ;+1
       tya
       adc string
       sta string
       bcc strmnhi
       inc string+1
       ;
strmnhi lda flag
       beq strmexit
       ;
       ldx pagewidth
       dex
       txa
       ldy scrnlg
       staAY scrim
       ;
strmexit jmi string
;-----------------------------------------------------------------------
prptline ;
;
       jsr prpttext
       ;
       jmp rensco
;-----------------------------------------------------------------------
prpttext ;
;
       jsr rdlnRE
       bcs ptxtES
       ;
       ldaim thelot
       sta updatereqd
       ;
       rts
;
ptxtES ldaim &7E
       jsr OSBYTE
       ;
       jmp editco
;-----------------------------------------------------------------------
csrscrnXY ldx scrnX
       ldy scrnY
       bpl csrXY
       ;
csr0statusY ldy scrnlg
       bne csr0Y
       ;
csr0scrupY ldy scrupY
csr0Y ldxIM 0
       ;
csrXY ;
       ;
       ldaIM 31
       jsr OSWRCH
       txa
       jsr OSWRCH
       tya
       jmp OSWRCH
;----------------------------------------------------------------------
wordprint ;Outputs word in decimal, suppressing leading zeros.
;
       ldxIM 4
       stx count
       ;
woprnext ldaIM 0
       sta digit
woprloop sec
       lda word
       sbcAX woptbl
       tay
       lda word+1
       sbcAX woptbh
       bcc woprdigi
       sty word
       sta word+1
       inc digit
       bne woprloop
       ;
woprdigi lda digit
       bne woprgen
       dec count
       bpl woprcont
woprgen oraIM "0"
       jsr OSWRCH
       ldaIM 0
       sta count
       ;
woprcont dex
       bpl woprnext
       rts
;
woptbl = :LSB: 1
       = :LSB: 10
       = :LSB: 100
       = :LSB: 1000
       = :LSB: 10000
;
woptbh = :MSB: 1
       = :MSB: 10
       = :MSB: 100
       = :MSB: 1000
       = :MSB: 10000
;--------------------------------------------------------------------

       lnk edit4b    
