qasm/src/edit/edit.s

5516 lines
183 KiB
ArmAsm

lst off
ttl "QuickEdit v2.00d2"
tr on
lstdo off
cas in
exp off
*======================================================
* QuickEdit -- for use with the QuickAsm system
* Written by Shawn Quick & ReWritten by Lane Roath
* Copyright (c) 1988-1990 QuickSoft & Ideas From the Deep
*------------------------------------------------------
* 29-Feb-89 2.00 :d1- start rewrite
*======================================================
xc
xc
mx %00
rel
use 4/util.macs
use qatools.macs
use edit.macs
put 2/qa.equates
put edit.equs
*------------------------------------------------------
editor
phb
phd
phk
plb
rep $30
sta userid
tdc
sta editdp
sta dppointer
pea 0
_QAStatus
pla
bne :runit
pld
plb
plp
rep $30
jsl $e100a8 ;error- quit
dw $29
adrl :q
:q adrl $0
dw $0
:runit
rep $30
pea 0
pea 0
_QACompilerActive
_QALinkerActive
pla
ora 1,s
sta 1,s
pla
jne :allout
pea 0
psl #$00
lda userid
pha
_QAGetMessagebyID
pla
plx
ply
cmp #startmess
beq :runit1
pld
plb
clc
rtl
:runit1 stz superquit
sep $20
ldal $e0c029
sta grafentry
ldal $E100BC
jeq :editerr
rep $20
stz emstarted
lda userid
bne :haveuser
~GetNewID #$5000 ;get a user id if a CDA
pla
sta userid
:haveuser
lda dppointer
bne :havedp
phd
tsc
sec
sbc #5
tcs
inc
pha
pld
~NewHandle #0;#dplength;userid;#$C015;#0
bcc :derefdp
plx
plx
tsc
clc
adc #5
tcs
pld
brl :editerr
:derefdp
pla
sta dphandle
sta 0
pla
sta dphandle+2
sta 2
lda [0]
sta dppointer
tsc
clc
adc #5
tcs
pld
lda dppointer
pha
pld
ldx #0
]lup stz 0,X ;init direct page
inx
inx
cpx #dplength
blt ]lup
:havedp
* lda editbufhdl
* ora editbufhdl+2
* beq :needbuf
* psl editbufhdl
* tll $1E02
~CheckHandle editbufhdl ;is our text handle valid?
bcs :needbuf
lda editbufhdl
sta zpage
lda editbufhdl+2
sta zpage+2
ldy #$02
lda [zpage] ; yes- still point to valid data?
ora [zpage],y
bne :havebuffer
:rstrbuf
* psl editbufhdl
* tll $0B02 ;restorehandle
~RestoreHandle editbufhdl ; no- reallocate it!
jcs :editerr
jsr newdoc1
bra :havebuffer
:needbuf psl #$00
psl #$10000
pea 0
_QAGetShellID
pla
ora #$100
pha ;allocate text buffer
pea $0010
psl #$00
_NewHandle
bcc :deref
plx
plx
brl :editerr
:deref
pll editbufhdl
jsr newdoc1
:havebuffer
* pea 0
* psl editbufhdl
* tll $2402 ;no more purging...
~SetPurge #0;editbufhdl ;don't allow purge while in use
* stz equitflag
* stz superquit
* stz dirty
* stz intstatus
* stz loaderstat
do mouse
pea $00
tll $1803 ;init mouse
jsr initmouse
fin
pha
tll $0606 ;event manager active??
pla
beq :noem
sec
ror emstarted
:noem psl editbufhdl
tll $2002
lda editbufhdl
sta zpage
lda editbufhdl+2
sta zpage+2
ldy #$02
lda [zpage]
sta fileptr
lda [zpage],y
sta fileptr+2
stz loaderstat
:init
jsr initedit
jsr selectoff
:loop rep $30
jsr drawcpos
do debug
jsr showinfo
fin
bit equitflag
jmi :editout
do mouse
stz mousecr
stz mousecrchar ;init if mouse is in use
fin
jsr getkey
sep $30
and #$7F
sta :char
bit selecting+1
bpl :sel1
cmp #$0a
beq :sel1
cmp #$0b
beq :sel1
cmp #$15
beq :sel0
cmp #$08
beq :sel0
and #$5f
cmp #'C'
beq :sel0
cmp #'X'
beq :sel0
:sel3 jsr selectoff
jmp :loop
:sel0 lda emod+1
bit emstarted+1
bmi :sel2
and #%10000000
beq :sel3
bra :sel1
:sel2 and #%00000001
beq :sel3
:sel1 lda :char
cmp #$0d
beq :c
bit oflag
bmi :nomod
:c stz oflag
jsr commands
bcc :loop
lda :char
jsr keypads
bcc :loop
lda :char
jsr controls
bcc :loop
:nomod lda cursor
stz oflag
and #$7F
cmp #'_'
beq :insert
ldx pos
inx
cpx linebuff
bge :insert
dex
:over lda :char
sta linebuff+1,x
sec
ror dirty
lda termch
cmp #right-1
bge :dl
inc pos
:dl jsr drawline
jsr poscurs
jmp :loop
:insert ldx linebuff
cpx #$FF
jge :loop
ldx pos
cpx linebuff
bge :ldx
ldx linebuff
]lup lda linebuff,x
sta linebuff+1,x
dex
beq :ldx
cpx pos
bge ]lup
:ldx ldx pos
lda :char
sta linebuff+1,x
sec
ror dirty
inc linebuff
lda termch
cmp #right-1
bge :dl1
inc pos
:dl1 rep $30
jsr drawline
jsr poscurs
jmp :loop
:editout rep $30
jsr savebuff
* jsr exitquestion
* bcc :lds
* stz equitflag
* jmp :loop
:lds
:pfx
do 0
jsl prodos
dw $0a
adrl mypfxparm
jsl prodos
dw $09 ;setpfx
adrl pfxparm
fin
lda flen
sta editlen
psl editbufhdl
tll $2202
psl dphandle
_disposehandle
stz dphandle
stz dphandle+2
stz dppointer
sep $20
ldal $E0C027
and #%10111111
ora intstatus
stal $E0C027
rep $20
lda texttype
pha
psl textdevice
tll $100C ;setoutputdevice
lda textand
pha
lda textor
pha
tll $0A0C
bit emstarted
bpl :super
pha
pea %0000010000101110
pea 0
tll $1506 ;flush events
pla
:super
do cda.library
bit superquit
bpl :pldxit
fin
jsl shutdown
:pldxit rep $30
sep $20
lda grafentry
stal $e0c029
:allout rep $30
pld
plb
clc
rtl
:editerr rep $30
psl #:es1
tll $200c
ldy #20
ldal $e0c01f
and #$80
beq :c1
]lup phy
pea $20
tll $180c
ply
dey
bne ]lup
:c1 psl #:es2
tll $200c
ldy #20
ldal $e0c01f
and #$80
beq :c2
]lup phy
pea $20
tll $180c
ply
dey
bne ]lup
:c2 psl #:es3
tll $200c
pha
pea $0000
tll $220c
pla
jmp :pldxit
pld
plb
rtl
:char ds 2
:es1 hex 0c0d0d0d0d0d0d0d0d,00
:es2 asc ' Unable to run QuickEDIT',8d,00
:es3 asc 'Insufficient memory or GS/OS not active',0d,00
editsdown ent
shutdown
php
phb
phd
phk
plb
rep $30
lda editbufhdl
ora editbufhdl+2
beq :nobuffer
pea 2
psl editbufhdl
tll $2402 ;set purge
do 0 ;cda!1
psl editbufhdl
_Disposehandle
stz editbufhdl
stz editbufhdl+2
fin
:nobuffer lda dphandle
ora dphandle+2
beq :nodp
psl dphandle
_Disposehandle
stz dphandle
stz dphandle+2
stz dppointer
:nodp lda userid
beq :nouserid
* pha
* tll $2103
* stz userid
:nouserid
jsl inittext
psl #:str
tll $1c0c
pld
plb
rtl
:str str 0d,'Shell.',0d,0d
shutdownrtl
rtl
inittext php
rep $30
pea $00
psl #$03
tll $100c
pea $00
psl #$03
tll $0f0c
pea $00
psl #$03
tll $110c
pea $00
tll $150c
pea $01
tll $150c
pea $02
tll $150c
pea #$ff
pea #$80
tll $0a0c
pea #$ff
pea #$80
tll $090c
pea $0c
tll $180c
plp
rtl
newdoc jsr newdoc1
jsr drawfname
jsr drawmem
stz gotolnum
lda #-1
sta linenum ;fool goto line!!
jsr gotoline
rts
newdoc1 php
sep $20
:tabsoff ldx #$07
]lup stz tabs,x ;zero out tabs
dex
bpl ]lup
:dtabs ldx #$07
]lup lda dtabs,x
sta tabs1,x
sta tabs,x
dex
bpl ]lup
jsr drawtabs
rep $20
stz linenum
stz flen
stz editlen
stz showcr
stz pos
stz pos1
stz position
stz dirty
stz selecting
stz efilename
stz alldirty
stz marker
lda #$FFFF
sta selstart
sta selend
plp
rts
put edit.1
cmdxit sep $30
plp
clc
rts
keypads php
sep $30
and #$7F
cmp #'a'
blt :schar
cmp #'z'+1
bge :schar
and #$5F
:schar sta :char
lda emod+1
bit emstarted+1
bmi :emmod
bit #%00010000
beq :xit
jmp :chk
:emmod bit #%00100000
beq :xit
:chk ldx #$00
]lup lda :tbl,x
beq :xit1
cmp :char
beq :found
inx
jmp ]lup
:found rep $30
txa
asl
tax
lda :tbl1,x
sta :jmp+1
lda dirty
beq :sep
jsr savebuff
jsr getbuff
jsr drawline
jsr poscurs
:sep sep $30
lda :char
:jmp jmp $FFFF
:cmdxit sep $30
plp
clc
rts
:xit lda :char
plp
sec
rts
:xit1 lda :char
plp
clc
rts
:char ds 2
:tbl dfb 'X'&$1f
:tbl1 dw :donew
dw $00
:donew rep $30
jsr drawbox
stz :string
jsr drawesccan1
jsl print
dfb 47
dfb 7
asc "CLEAR current contents?",00
sep $30
jsr yesno
dfb 51+3
dfb 9
rep $30
pha
php
jsr erasebox
jsr drawesc
plp
pla
bcs :cbplp1
and #$ff
beq :cbplp1
jsr newdoc
jsr drawfname
jsr gotoline
:cbplp1 jmp :cmdxit
:string ds 33,0
commands php
sep $30
and #$7F
cmp #'a'
blt :schar
cmp #'z'+1
bge :schar
and #$5F
:schar sta :char
lda emod+1
bit emstarted+1
bmi :emmod
and #%10000000
beq :xit
jmp :chk
:emmod and #%00000001
beq :xit
:chk ldx #$00
]lup lda :tbl,x
beq :xit1
cmp :char
beq :found
inx
jmp ]lup
:found rep $30
txa
asl
tax
lda :tbl1,x
sta :jmp+1
lda dirty
beq :sep
jsr savebuff
jsr getbuff
jsr drawline
jsr poscurs
:sep sep $30
lda :char
:jmp jmp $FFFF
:cmdxit sep $30
plp
clc
rts
:xit sep $30
lda :char
and #$ff
plp
sec
rts
:xit1 lda :char
and #$ff
plp
clc
rts
:char ds 2
:tbl dfb 'Q' ;Quit
dfb 'E' ;Toggle cursor
dfb 'M' ;show <CR>
hex 0b ;up 10 lines
hex 0a ;down 10 lines
hex 08 ;up 24 lines
hex 15 ;down 24 lines
dfb '9' ;eof
dfb 'N' ;eof
dfb 'B' ;beginning of file
dfb '1' ;beginning of file
dfb 'Z' ;center current line
dfb 'D' ;delete current line
dfb 'I' ;insert line
hex 09 ;insert line (same as 'I')
dfb 'J' ;goto line number/label
hex 7f ;delete line above
dfb 'S' ;save file
dfb '-' ;tabs off
dfb '_' ;tabs off
dfb '+' ;default tabs on
dfb '=' ;default tabs on
dfb '0' ;set/clear tabs
dfb 'C' ;copy command
hex 1b ;quit
dfb 'O' ;open command box
dfb 'L' ;load file
dfb 'P' ;show prefix (status box)
dfb 'A' ;Assemble
dfb '/' ;status box
dfb '?' ;status box
hex 0D ;insert CR
dfb '2' ;go relative position
dfb '3'
dfb '4'
dfb '5'
dfb '6'
dfb '7'
dfb '8'
dfb 'T' ;goto marker
dfb 'X' ;cut
dfb 'V' ;paste
dfb 'Y' ;select all
dfb 'W' ;find word
dfb 'F' ;find
dfb 'R' ;find/replace
hex 00 ;must end with $00
:tbl1 dw :quit
dw :cursor
dw :showcr
dw :up10
dw :dn10
dw :up24
dw :dn24
dw :goend
dw :goend
dw :gobegin
dw :gobegin
dw :crupdate
dw :delline
dw :insline
dw :insline
dw :gotolabel
dw :delline1
dw :savefile
dw :tabsoff
dw :tabsoff
dw :tabson
dw :tabson
dw :settabs
dw :copy
dw :superquit
dw :extcommand
dw loadfile
dw :prefix1
dw :asm ;:marker
dw :prefix
dw :prefix
dw insertcr
dw gopos
dw gopos
dw gopos
dw gopos
dw gopos
dw gopos
dw gopos
dw :marker
dw :cut
dw :paste
dw :selall
dw :findword
dw :find
dw :replace
:findword jsr findword
jmp :cmdxit
:find jsr find
jmp :cmdxit
:replace jsr findreplace
jmp :cmdxit
:asm rep $30
do 0
stz automode
stz asmpath
lda flen
sta editlen
jsl inittext
phd
lda globalptr
tcd
clc
adc #goasmptr
sta :jsl+1
stz shellerrors
stz objcodesaved
stz keyquit
stz gobjaux
stz gobjaux+2
stz gobjtype
lda #$02
sta asmhdlid
lda editbufhdl
sta asmfileptr
lda editbufhdl+2
sta asmfileptr+2
lda editlen
sta asmfilelen
stz asmfilelen+2
lda #$01
sta asmhdlid
:jsl jsl $000000
rep $30
tay
phk
plb
pld
pha
psl #:keystr
tll $1c0c
sep $20
:k1 ldal $e0c000
bpl :k1
ldal $e0c010
rep $20
pea $01 ;pascal...
psl #$03 ;turn on 80 column
tll $100c
pea $01
tll $150c
pea $02
psl #textdriver
tll $100C ;setoutputdevice
pea $FF
pea $80
tll $0A0C
jsl clrscreen
jsr editscreen
stz termcv
stz termch
sta oflag
lda #$FFFF
sta sof
jsl setch
lda linenum
sta gotolnum
jsr gotoline
pla
fin
jmp :cmdxit
:keystr str 'Press a key.',0d
:marker rep $30
lda marker
sta gotolnum
jsr gotoline
jmp :cmdxit
]left equ 24
:prefix1 jmp :cmdxit
:prefix rep $30
lda termch
pha
lda termcv
pha
jsr drawbox1
jsl print
dfb ]left
dfb 12-6
asc " QuickEdit v2.00d2",00
jsl print
dfb ]left
dfb 13-6
asc " by",00
jsl print
dfb ]left
dfb 14-6
asc "Shawn Quick & Lane Roath",00
jsl print
do softdisk
dfb ]left-5
dfb 16-6
asc "copyright 1989, SoftDisk Publishing, Inc.",00
else
dfb ]left-1
dfb 16-6
asc "copyright 1989, QuickSoft Software",00
fin
jsl print
dfb ]left
dfb 17-6
asc " All Rights Reserved.",00
jsl print
dfb 18
dfb 16
asc "Prefix: ",00
lda #26
sta mych
lda #16
sta mycv
jsl textbascalc
jsl prodos
dw $0a
adrl :pparm
jcc :pprt
sta :pfx
:pprt lda :pfx
and #$00ff
sta :plen
jeq :pinfo
ldx #$00
]lup lda :pfx+1,x
phx
jsl drawchar
plx
inx
cpx :plen
bge :pinfo
cpx #70-26
blt ]lup
:pinfo jsl print
dfb ]left
dfb 9+4
asc "Memory: Used: ",00
lda #]left+15
sta mych
lda #9+4
sta mycv
jsl textbascalc
psl #flen
pea $0000
jsl printdec
lda flen
eor #$FFFF
sta :pfree
jsl print
dfb ]left+22
dfb 9+4
asc "Free: ",00
lda #]left+28
sta mych
lda #9+4
sta mycv
jsl textbascalc
psl #:pfree
pea $0000
jsl printdec
jsl print
dfb ]left+9
dfb 9+5
asc "Clip: ",00
lda cliphandle
ora cliphandle+2
beq :czero
psl #$00
psl cliphandle
_gethandlesize
pll :pfree
bra :pclip
:czero stz :pfree
stz :pfree+2
:pclip lda #]left+15
sta mych
lda #9+5
sta mycv
jsl textbascalc
psl #:pfree
pea $0000
jsl printdec
:pkey2 jsl keyscan
bpl :pkey2
and #$7f
cmp #$1b
beq :done
* jmp :about
:done ;jsr initmouse
jsr erasebox1
pla
sta termcv
pla
sta termch
jsl setch
jmp :cmdxit
:about jsr aboutsd
;jsr initmouse
:pkeysd jsl keyscan
bpl :pkeysd
jmp :done
:plen ds 2
:pfree ds 4
:pparm dw $00
adrl :pfx
:pfx ds 68,0
:extcommand rep $30
jsr drawbox
stz instring
stz commandlen
jsr drawesccan
jsl print
dfb 44
dfb 7
asc "Command?",00
jsl getline
adrl instring
dfb 30
dfb 44
dfb 10
php
jsr drawesc
plp
lda #$00
bcs :dcplp
rep $30
sep $20
lda instring
beq :dcplp
sta :len1
ldx #$00
]lup cpx :len1
bge :run
lda instring+1,x
and #$7f
cmp #' '
beq :run
cmp #'a'
blt :sta
cmp #'z'+1
bge :sta
and #$5f
:sta sta externname,x
inx
jmp ]lup
:run txa
and #$00ff
sta commandlen
clc
adc externdflt
sta externpath
rep $30
jsr checkcommands
bcc :dcplp
lda #syntaxerr
jsr doerror
lda #$00
jmp :dcplp
jsr runcommand
:dcplp rep $30
and #$00ff
beq :dc1
jmp :cmdxit
:dc1 jsr erasebox
jmp :cmdxit
:len1 ds 2,0
:string1 ds 65
:superquit rep $30
lda #$FFFF
sta equitflag
sta superquit
jmp :cmdxit
:copy rep $30
bit selecting
jmi :copy1
lda position
sta selstart
pha
ldx eof
beq :copyyes
lda flen
bra :copy0
:copyyes jsr foreptr
lda position
dec
:copy0 sta selend
pla
sta position
sec
ror selecting
jsr drawline
jmp :cmdxit
:copy1 jsr copyselect
lda selstart
sta gotoposition
jsr selectoff1
jsr gotopos
jsr drawmem
jmp :cmdxit
:cut rep $30
bit selecting
bmi :cut1
lda position
sta selstart
pha
ldx eof
beq :copyyes1
lda flen
jmp :cut0
:copyyes1 jsr foreptr
lda position
dec
:cut0 sta selend
pla
sta position
sec
ror selecting
jsr drawline
jmp :cmdxit
:cut1 jsr copyselect
bcs :cutxit
psl #$00
psl cliphandle
_GetHandlesize
pla
plx
ldx selend
ldy selstart
jsr deletetext
lda selstart
sta gotoposition
jsr selectoff1
jsr gotopos
jsr drawmem
:cutxit jmp :cmdxit
:paste rep $30
lda cliphandle
ora cliphandle+2
bne :paste1
jmp :cmdxit
:paste1 psl #$00
psl cliphandle
_GetHandleSize
pla
plx
sta workspace
lda position
clc
adc workspace
tay
ldx position
lda workspace
jsr inserttext
jcs :cmdxit
psl cliphandle
lda position
clc
adc fileptr
tax
lda #$00
adc fileptr+2
pha
phx
psl #$00
psl cliphandle
_GetHandleSize
tll $2902 ;_HandToPtr
jsr drawmem
lda position
jsr updatescreen
jsr drawcpos
jsr getbuff
jsr drawline
jsr poscurs
jsr setfflags
:pastexit jmp :cmdxit
:selall rep $30
lda position
sta selstart
lda flen
sta selend
sta gotoposition
lda #$8000
sta selecting
jsr gotopos
jmp :cmdxit
mx %11
:settabs
lda termch
sta :ch
lda termcv
sta :cv
lda cursor
sta :curs
lda #$16
sta termcv
lda #$01
sta termch
jsl setch
lda #' '
sta cursor
ldx #$07
]lup lda tabs,x
sta tabstemp,x
dex
bpl ]lup
:stloop
do mouse
sec
ror mousecr+1 ;setup for mouse
lda #'S'
sta mousecrchar
fin
jsr getkey
and #$7F
cmp #$1B
jeq :stcan
cmp #$0D
jeq :stcr
and #$5F
cmp #'C'
beq :stclr
cmp #'S'
beq :set
cmp #'R'
jeq :reset
cmp #$08
beq :stbs
cmp #$15
beq :stra
cmp #'D'
beq :default
jmp :stloop
:default ldx #$07
]lup lda dtabs,x
sta tabs,x
dex
bpl ]lup
jsr drawtabs
jmp :stloop
:stbs lda termch
cmp #$02
jlt :stloop
dec
sta termch
jsl setch
jmp :stloop
:stra lda termch
cmp #right-2
jge :stloop
inc
sta termch
jsl setch
jmp :stloop
:stclr ldx #$07
]lup stz tabs,x ;zero out tabs
dex
bpl ]lup
jsr drawtabs
jmp :stloop
:set ldx #$07
ldy #$00
]lup lda tabs,x
beq :sdex
iny
:sdex dex
bpl ]lup
cpy #$08
blt :set2
rep $30
tll $2C03
sep $30
jmp :stloop
:set2 lda termch
sta :temp
ldx #$00
]lup lda tabs,x
beq :stset1
cmp :temp
jeq :stloop
bge :sthere
inx
cpx #$08
blt ]lup
jmp :stloop
:sthere stx :temp
ldx #$08
]lup lda tabs,x
sta tabs+1,x
dex
cpx #$FF
beq :zero
cpx :temp
bge ]lup
jmp :ldx1
:zero ldx #$00
bra :stset1
:ldx1 ldx :temp
:stset1 lda termch
sta tabs,x
jsr drawtabs
jmp :stloop
:reset ldx #$07
lda termch
]lup cmp tabs,x
beq :kill
dex
bpl ]lup
jmp :stloop
:kill lda tabs+1,x
sta tabs,x
inx
cpx #$08
blt :kill
stz tabs+7
stz tabs+8
jsr drawtabs
jmp :stloop
:stcan ldx #$07
]lup lda tabstemp,x
sta tabs,x
dex
bpl ]lup
jsr drawtabs
jmp :stxit
:stcr ldx #$07
]lup lda tabs,x
sta tabs1,x
dex
bpl ]lup
jsr drawtabs
rep $30
lda linenum
sta gotolnum
jsr gotoline
sep $30
jmp :stxit1
:stxit lda :cv
sta termcv
lda :ch
sta termch
jsl setch
:stxit1 lda :curs
sta cursor
jmp :cmdxit
:temp ds 2
:ch ds 2
:cv ds 2
:curs ds 2
mx %11
:tabsoff ldx #$07
]lup lda tabs,x
sta tabs1,x
stz tabs,x
dex
bpl ]lup
rep $30
jsr drawtabs
lda linenum
sta gotolnum
jsr gotoline
jsr getbuff
jsr drawline
stz pos
jsr poscurs
jmp :cmdxit
mx %11
:tabson ldx #$07
]lup lda tabs1,x
sta tabs,x
dex
bpl ]lup
jsr drawtabs
rep $30
lda linenum
sta gotolnum
jsr gotoline
jsr getbuff
jsr drawline
stz pos
jsr poscurs
jmp :cmdxit
:savefile rep $30
lda flen
bne :sstz
jmp :cmdxit
:sstz stz :openflag
stz :loaded
jsr drawbox
jsr drawesccan
sep $30
ldx efilename
]lup lda efilename,x
and #$7f
cmp #'a'
blt :uc1
cmp #'z'+1
bge :uc1
and #$5f
:uc1 sta :filename,x
dex
bpl ]lup
rep $30
jsl print
dfb 44
dfb 7
asc "SAVE file as:",00
jsl getline
adrl :filename
dfb 15
dfb 44
dfb 10
php
jsr drawesc
plp
jcs :sfplp
rep $30
lda :filename
and #$00FF
jeq :sfplp
jsl print
dfb 44
dfb 7
asc "Saving... ",00
lda flen
sta editlen
sta :request
sta :eof+2
stz :openflag
lda :filename
and #$ff
tax
lda :filename,x
and #$7f
cmp #'!'
bne :notapw
lda :filename
and #$ff
tax
sep $20
:lfn lda :filename,x
sta loadfilename,x
dex
bpl :lfn
rep $20
jmp saveapw
:notapw lda :filename
and #$ff
cmp #3
blt :notmerlin
tax
lda :filename,x
and #$5f
cmp #'S'
bne :notmerlin
dex
lda :filename,x
and #$7f
cmp #'.'
bne :notmerlin
jmp :merlin
:notmerlin
ldy #$00
sep $20
]lup lda [fileptr],y
and #$7f
sta [fileptr],y
iny
cpy editlen
blt ]lup
rep $20
:merlin
jsl prodos
dw $01
adrl :create
jsl prodos
dw $06
adrl :info
jcs :err
lda :type
cmp #$b0
beq :p16open
cmp #$1a
beq :settxt
cmp #$04
bne :badtype
lda #$04
sta :type
lda :aux
and #$fffe
sta :aux
bra :p16
:settxt lda #$04
sta :type
stz :aux
:p16 jsl prodos
dw $05
adrl :info
jcs :err
jmp :p16open
:badtype lda #nottext
jmp :err
:p16open jsl prodos
dw $10
adrl :open
jcs :err
sec
ror :openflag
lda :open
sta :write
sta :close
sta :eof
stz :request+2
stz :eof+4
lda fileptr
sta :where
lda fileptr+2
sta :where+2
jsl prodos
dw $18
adrl :eof
jcs :err
jsl prodos
dw $13
adrl :write
jcs :err
jsl prodos
dw $14
adrl :close
stz :openflag
sec
ror :loaded
stz alldirty
sep $30
ldx :filename
]lup lda :filename,x
and #$7f
cmp #'a'
blt :uc
cmp #'z'+1
bge :uc
and #$5f
:uc sta efilename,x
dex
bpl ]lup
rep $30
jsr drawfname
:sfplp rep $30
bit :openflag
bpl :sfplp1
jsl prodos
dw $14
adrl :close
stz :openflag
:sfplp1 jsr erasebox
jmp :cmdxit
:err jsr doerror
jmp :sfplp
:loaded ds 2
:openflag ds 2
:close ds 2
:open ds 2
adrl :filename
adrl $0000
:write ds 2
:where adrl $00
:request adrl $00
adrl $00
:info adrl :filename
ds 2
:type ds 2
:aux ds 4
ds 16
:eof ds 6
:filename ds 16,0
:create adrl :filename
dw $E3
dw $04
adrl $00
dw $01
adrl $0000
:gotolabel rep $30
jsr drawbox
stz :string
jsr drawesccan
jsl print
dfb 44
dfb 7
asc "JUMP to:",00
jsl getline
adrl :string
dfb 28
dfb 44
dfb 10
php
jsr erasebox
jsr drawesc
plp
bcs :cbplp
rep $30
lda :string
and #$FF
beq :cbplp
lda :string+1
and #$7F
cmp #'0'
blt :label
cmp #'9'+1
bge :label
pha
psl #:string+1
lda :string
and #$FF
pha
pea $00
tll $280B
pla
sta gotolnum
jsr gotoline
:cbplp jmp :cmdxit
:label sep $30
ldx :string
]lup lda :string,x
cpx #$00
beq :sl8
and #$7f
cmp #'a'
blt :sl8
cmp #'z'+1
bge :sl8
and #$5f
:sl8 sta glabstr,x
dex
bpl ]lup
rep $30
lda #$ffff
sta gotolnum
jsr gotolable
jmp :cmdxit
:string ds 30
:insline rep $30
jsr savebuff
lda flen
cmp #$FFFF
jge :nomem
jsr setfflags
lda #$FFFF
sta dirty
stz oldlen
lda #$0D01
sta linebuff
jsr savebuff
:crup jsl setch
jsr updatescreen
jsr drawcpos
jsr getbuff
stz pos
jsr drawline
jsr poscurs
jsr setfflags
jmp :cmdxit
:nomem jsr memfull
jmp :cmdxit
:crtemp ds 2
:delline rep $30
lda position
cmp flen
jge :cmdxit
lda position
sta :dpos
jsr foreptr
sep $20
lda fileptr+2
sta :mvn+1
sta :mvn+2
rep $30
ldy :dpos
ldx position
lda flen
sec
sbc position
dec
cmp #$FFFF
beq :ateof
phb
:mvn mvn $00,$00
plb
lda flen
sec
sbc oldlen
sta flen
jmp :dupd
:ateof lda :dpos
sta flen
:dupd lda :dpos
sta position
jsr updatescreen
jsr drawcpos
jsr getbuff
jsr drawline
jsr poscurs
jsr drawmem
jsr setfflags
jmp :cmdxit
:dpos ds 2
:delline1 rep $30
lda sof
jne :cmdxit
lda position
sta :dpos
jsr backptr
jsr getbuff
sep $20
lda fileptr+2
sta :mvn1+1
sta :mvn1+2
rep $30
ldy position
ldx :dpos
lda flen
sec
sbc :dpos
dec
cmp #$FFFF
beq :eof1
phb
:mvn1 mvn $00,$00
plb
:eof1 lda flen
sec
sbc oldlen
sta flen
dec linenum
lda termcv
beq :sch1
dec
:ok sta termcv
:sch1 jsl setch
jmp :dupd1
:eof12 lda :dpos
sta flen
:dupd1 jsr updatescreen
jsr drawcpos
jsr getbuff
jsr drawline
jsr poscurs
jsr drawmem
jsr setfflags
jmp :cmdxit
:gobegin rep $30
stz findstr
stz replacestr
lda sof
jne :cmdxit
lda #$0001
sta gotolnum
jsr gotoline
jmp :cmdxit
:goend rep $30
stz findstr
stz replacestr
lda eof
jne :cmdxit
lda #$FFFF
sta gotolnum
jsr gotoline
jmp :cmdxit
:up10 rep $30
lda sof
jne :cmdxit
lda dirty
beq :u1
jsr savebuff
:u1 lda linenum
sec
sbc #10
bcs :u10ok
lda #$01
:u10ok sta gotolnum
lda #10
jsr selbackward
jsr gotoline
jmp :cmdxit
:dn10 rep $30
lda eof
jne :cmdxit
lda dirty
beq :d1
jsr savebuff
:d1 lda linenum
clc
adc #10
bcc :d10ok
lda #$FFFF
:d10ok sta gotolnum
lda #10
jsr selforward
jsr gotoline
jmp :cmdxit
:up24 rep $30
lda sof
jne :cmdxit
lda dirty
beq :u2
jsr savebuff
:u2 lda linenum
sec
sbc #24
bcs :u24ok
lda #$01
:u24ok sta gotolnum
lda #24
jsr selbackward
jsr gotoline
jmp :cmdxit
:dn24 rep $30
lda eof
jne :cmdxit
lda dirty
beq :d2
jsr savebuff
:d2 lda linenum
clc
adc #24
bcc :d24ok
lda #$FFFF
:d24ok sta gotolnum
lda #24
jsr selforward
jsr gotoline
jmp :cmdxit
mx %11
:quit lda #$FF
sta equitflag
sta equitflag+1
jmp :cmdxit
:cursor lda cursor
and #$7F
cmp #'_'
beq :ow
lda #"_"
sta cursor
jmp :cmdxit
:ow lda #' '
sta cursor
jmp :cmdxit
:showcr lda showcr
bne :soff
lda #$FF
sta showcr
sta showcr+1
jmp :crupdate
:soff
stz showcr
stz showcr+1
:crupdate rep $30
lda linenum
sta gotolnum
jsr gotoline
jmp :cmdxit
mx %11
controls php
sep $30
ldx #$00
sta :char
cmp #$7F
jeq :delete
cmp #$20
bge :plp
]lup lda :tbl,x
beq :plp1
cmp :char
beq :found
inx
jmp ]lup
:found rep $30
txa
asl
tax
lda :tbl1,x
sta :jmp+1
sep $30
:jmp jmp $FFFF
:plp lda :char
plp
sec
rts
:plp1 lda :char
plp
clc
rts
:char ds 2
:tbl hex 08 ;backspace char
hex 15 ;right arrow
hex 0d ;carriage return
hex 0a ;down arrow
hex 0b ;up arrow
hex 1b ;escape
hex 09 ;tab
hex 0e ;^N eoln
hex 0f ;^O insert next char
hex 02 ;^B beginning of line
hex 14 ;^T set marker
dfb 'Y'&$1f ;^Y truncate line
dfb 'X'&$1f ;^X cancel find/replace
hex 00 ;must end with zero
:tbl1 dw :bspace
dw :rarrow
dw :cr
dw :darrow
dw :uarrow
dw :esc
dw :tab
dw :controln
dw :controlo
dw :controlb
dw :controla
dw :controly
dw :controlx
:tab lda #$09
plp
sec
rts
:controlx jsr controlx
jmp :ctrlxit
:controly jsr controly
jmp :ctrlxit
:controlo sec
ror oflag
jmp :ctrlxit
:controln lda #$FF
sta pos
jsr poscurs
jmp :ctrlxit
:controlb
stz pos
jsr poscurs
jmp :ctrlxit
:controla lda linenum
sta marker
lda linenum+1
sta marker+1
jmp :ctrlxit
:esc lda #$FF
sta equitflag
sta equitflag+1
:ctrlxit plp
clc
rts
:cr rep $30
jsr savebuff
lda flen
cmp #$FFFF
jge :nomem
jsr setfflags
lda eof
sta :crtemp
jsr foreptr
lda #$FFFF
sta dirty
stz oldlen
lda #$0D01
sta linebuff
jsr savebuff
lda :crtemp
bne :crup
inc linenum
lda termcv
inc
cmp #22
blt :s
jsl scroll
lda #21
:s sta termcv
:crup jsl setch
jsr updatescreen
* jsr showcv
jsr drawcpos
jsr getbuff
stz pos
jsr drawline
jsr poscurs
jsr setfflags
:cmdxit plp
clc
rts
:nomem jsr memfull
jmp :cmdxit
:crtemp ds 2
mx %11
:darrow lda dirty
beq :dn
jsr savebuff
:dn lda eof
bne :darx
lda termch
sta :ch
jsr foreptr
lda termcv
inc
cmp #22
blt :dok
jsl scroll
lda #21
:dok sta termcv
jsl setch
bit selecting+1
bpl :dg
lda position
sta selend
lda position+1
sta selend+1
:dg jsr getbuff
jsr drawline
lda :ch
sta oldch
jsr setpos
jsr poscurs
rep $30
inc linenum
jsr drawcpos
* jsr showcv
:darx plp
clc
rts
:ch ds 2
mx %11
:uarrow lda dirty
beq :up
jsr savebuff
:up rep $30
bit selecting
bpl :nosel
lda selend
pha
stz selend
jsr drawline
pla
sta selend
:nosel lda position
sta :pos
lda termch
sta :ch
jsr backptr
lda position
cmp :pos
bne :tcv
sep $30
lda sof
bne :uarx
:tcv sep $30
lda termcv
beq :bs
dec
jmp :uok
:bs jsl bscroll
lda #00
:uok sta termcv
jsl setch
bit selecting+1
bpl :ug
rep $30
lda position
sta selend
cmp selstart
bge :ug
jsr selectoff1
:ug sep $30
jsr getbuff
jsr drawline
lda :ch
sta oldch
jsr setpos
jsr poscurs
rep $30
dec linenum
jsr drawcpos
* jsr showcv
:uarx plp
clc
rts
:pos ds 2
mx %11
:rarrow lda linebuff
beq :bxit
lda termch
cmp #right-1
bge :bxit
lda pos
inc
cmp linebuff
bge :bxit
inc pos
lda pos
cmp #255
blt :rpos
lda #255
sta pos
:rpos jsr poscurs
jmp :bxit
:bspace lda linebuff
beq :bxit
lda pos
beq :bxit
cmp #right
blt :bdec
lda #right
sta pos
:bdec dec pos
jsr poscurs
:bxit plp
clc
rts
:delete lda linebuff
beq :dxit
ldx pos
beq :dxit
]lup cpx linebuff
bge :ddec
:d lda linebuff+1,x
sta linebuff,x
inx
jmp ]lup
:ddec dec linebuff
dec pos
sec
ror dirty
jsr drawline
jsr poscurs
:dxit plp
clc
rts
controlx php
rep $30
stz findstr
stz replacestr
plp
rts
controly php
sep $30
ldx pos
beq :cy
inx
stx linebuff
lda #$0d
sta linebuff,x
:cy1 lda #$ff
sta dirty
sta dirty+1
jsr savebuff
jsr getbuff
jsr drawline
jsr poscurs
jmp :xit
:cy stz pos
lda #$01
sta linebuff
lda #$0d
sta linebuff+1
jmp :cy1
:xit plp
rts
selectoff php
rep $30
jsr selectoff1 ;why duplicate?
lda position
sta gotoposition
jsr gotopos
plp
rts
selectoff1 php
rep $30
lda #$ffff
sta selstart
sta selend
stz selecting
lda #$80
sta selectflag
plp
rts
inserttext php
rep $30
sta :ct
stx :source
sty :dest
clc
adc flen
bcs :toobig
lda fileptr
clc
adc :source
tax
lda fileptr+2
adc #$00
pha
phx
lda fileptr
clc
adc :dest
tax
lda fileptr+2
adc #$00
pha
phx
pea 0
lda flen
sec
sbc :source
pha
tll $2b02 ;_BlockMove
lda :ct
clc
adc flen
sta flen
plp
clc
rts
:toobig jsr memfull
plp
sec
rts
:ct ds 2
:source ds 2
:dest ds 2
deletetext php
rep $30
sta :ct
stx :source
sty :dest
lda flen
sec
sbc :ct
bcs :ok
stz flen
plp
clc
rts
:ok lda fileptr
clc
adc :source
tax
lda fileptr+2
adc #$00
pha
phx
lda fileptr
clc
adc :dest
tax
lda fileptr+2
adc #$00
pha
phx
pea 0
lda flen
sec
sbc :source
pha
tll $2b02 ;_BlockMove
lda flen
sec
sbc :ct
bcs :f
lda #$00
:f sta flen
plp
clc
rts
:ct ds 2
:source ds 2
:dest ds 2
selforward php
rep $30
bit selecting
bpl :xit
and #$ff
sta :ct
stz eof
]lup lda :ct
beq :done
jsr foreptr
dec :ct
bra ]lup
:done lda position
sta selend
:xit plp
rts
:ct ds 2
selbackward php
rep $30
bit selecting
bpl :xit
and #$ff
sta :ct
stz eof
]lup lda :ct
beq :done
jsr backptr
dec :ct
bra ]lup
:done lda position
sta selend
cmp selstart
bge :xit
jsr selectoff1
:xit plp
rts
:ct ds 2
*------------------------------------------------------
copyselect php
rep $30
lda cliphandle
ora cliphandle+2
bne :resize
psl #$00
psl #$01
lda userid
ora #$900
pha
pea 0
psl #$00
_Newhandle
plx
ply
jcs :err
stx cliphandle
sty cliphandle+2
:resize lda position
pha
lda sof
pha
lda eof
pha
stz eof
stz sof
lda selend
sta position
jsr foreptr
lda position
ldy eof
beq :1
lda flen
:1 sta selend
sec
sbc selstart
pea 0
pha
psl cliphandle
_SetHandleSize
ply
sty eof
ply
sty sof
ply
sty position
jcs :err
lda selstart
clc
adc fileptr
tax
lda #$00
adc fileptr+2
pha
phx
psl cliphandle
psl #$00
psl cliphandle
_GetHandleSize
tll $2802 ;_PtrToHand
plp
clc
rts
:err jsr memfull
plp
sec
rts
mx %00
initedit php
rep $30
stz findstr
stz replacestr
stz cliphandle
stz cliphandle+2
lda editlen
sta flen
stz pos
stz pos1
stz linebuff
stz position
stz eof
stz dirty
stz selecting
lda #$FFFF
sta selstart
sta selend
sta selstart
sta selend
stz termcv
stz termch
pha
psl #$00
tll $130C
pll textdevice
pla
sta texttype
pha
pha
tll $0D0C
pla
sta textor
pla
sta textand
pea $01 ;pascal...
psl #$03 ;turn on 80 column
tll $100c
pea $01
tll $150c
pea $02
psl #textdriver
tll $100C ;setoutputdevice
pea $FF
pea $80
tll $0A0C
jsl clrscreen
jsr editscreen
stz termcv
stz termch
sta oflag
lda #$FFFF
sta sof
jsl setch
jsr checkload
lda linenum
sta gotolnum
jsr gotoline
sep $20
ldal $E0C029
and #$7F
stal $E0C029
rep $20
plp
rts
*------------------------------------------------------
savebuff
]y1 equ workspace
]y2 equ ]y1+2
]len equ ]y2+2
]where equ ]len+2
]len1 equ ]where+2
php
rep $30
lda dirty
bne :save
plp
rts
:save sec
ror alldirty
lda linebuff
and #$00FF
sta ]len1
bne :tax
lda #$0D01
sta linebuff
and #$00FF
sta ]len1
:tax tax
lda linebuff,x
and #$7F
cmp #$0D
beq :olen
cpx #$FF
beq :noinc
inx
:noinc lda #$0D
sta linebuff,x
txa
and #$00FF
sta ]len1
:olen lda oldlen
and #$00FF
sta oldlen
lda ]len1
sec
sbc oldlen
jeq :replace
jcs :bigger
:smaller lda position
clc
adc oldlen
sta ]len
lda flen
sec
sbc ]len
dec
sta ]y2
lda oldlen
sec
sbc ]len1
and #$00FF
sta ]y1
lda flen
sec
sbc ]y1
sta flen
sep $20
lda fileptr+2
sta :mvn+1
sta :mvn+2
rep $20
ldx ]len
lda position
clc
adc ]len1
tay
lda ]y2
cmp #$FFFF
jeq :replace
phb
:mvn mvn $00,$00
plb
jmp :replace
:bigger and #$00FF
sta ]y1 ;num of bytes to move
lda position
cmp flen
jeq :add
clc
adc oldlen
sta ]y2 ;temp
lda flen
sec
sbc ]y2
* dec
sta ]y2 ;for mvp call
sep $20
lda fileptr+2
sta :mvp+1
sta :mvp+2
rep $20
ldx flen
txa
clc
adc ]y1
bcs :memerr
sta flen
tay
lda ]y2
phb
:mvp mvp $00,$00
plb
jmp :replace
:memerr jsr memfull
jmp :xit
:add lda ]y1
clc
adc flen
bcs :memerr
sta flen
:replace rep $30
sep $20
lda #^linebuff
sta :mvn1+2
lda fileptr+2
sta :mvn1+1
rep $20
lda ]len1
and #$00FF
beq :xit
dec
ldx #linebuff+1
ldy position
phb
:mvn1 mvn $00,$00
plb
:xit rep $30
jsr drawmem
jsr setfflags
stz dirty
plp
rts
getbuff php
rep $30
stz oldlen
lda eof
jne :newline
:main ldy position
cpy flen
bge :newline
ldx #$00
sep $20
:loop lda [fileptr],y
sta linebuff+1,x
and #$7F
iny
inx
cmp #$0D
beq :next
cpx #$FF
bge :next1
cpy flen
blt :loop
jmp :next
:next1 ldx #$FF
:next txa
sta linebuff
lda linebuff,x
and #$7F
cmp #$0D
beq :plp
lda linebuff
cmp #$FF
bge :stacr
inx
inc linebuff
:stacr lda #$0D
sta linebuff,x
:plp lda linebuff
sta oldlen
stz dirty
stz dirty+1
plp
rts
mx %00
:newline lda #$0D01
sta linebuff
stz oldlen
stz dirty
plp
rts
mx %00
setrange php
rep $30
lda selstart
cmp selend
beq :couldbe
bge :off
:couldbe lda position
cmp selstart
blt :off
cmp selend
beq :on
bge :off
:on
stz selectflag
plp
rts
:off lda #$80
sta selectflag
* stz selecting
plp
rts
setfflags php
rep $30
stz eof
stz sof
lda position
bne :seof
dec sof
:seof cmp flen
blt :plp
dec eof
:plp plp
rts
backptr php
rep $30
stz sof
stz eof
stz :crflag
ldy position
bne :move
:sof jmp :plp
:move sep $20
]loop dey
cpy #$FFFF
beq :endxit
lda [fileptr],y
and #$7F
cmp #$0D
beq :cr
:first sec
ror :crflag
jmp ]loop
:cr bit :crflag
bpl :first
:endxit iny
:xit sty position
:plp rep $30
lda position
bne :qeof
ldy #$FFFF
sty sof
:qeof cmp flen
blt :plp1
lda #$FFFF
sta eof
:plp1 plp
rts
:crflag ds 2
mx %00
do 1
gotoline php
rep $30
lda #$01
sta :line
stz position
stz :offset
stz :ct
ldy #$00
:nline rep $30
lda :offset
asl
tax
lda position
sta :array,x
inc :offset
inc :ct
lda :offset
cmp #12
blt :gline
stz :offset
:gline lda :line
cmp gotolnum
bge :done
sep $20
]lup lda [fileptr],y
and #$7f
cmp #$0d
beq :eoln
iny
cpy flen
blt ]lup
bra :done
:eoln iny
sty position
inc :line
bne :nline
inc :line+1
bra :nline
:done rep $30
stz termch
stz pos
lda :line
sta linenum
lda position
sta :pos
lda :ct
cmp #12
blt :garray
]sbc cmp #12
blt :goffset
sec
sbc #12
jmp ]sbc
:goffset inc
cmp #12
blt :asl
lda #$00
:asl asl
tax
lda :array,x
sta position
lda #10
sta termcv
jmp :set
:garray dec
sta :offset
lda #$00
asl
tax
lda :array,x
sta position
lda :offset
sta termcv
:set jsl setch
jsr drawcpos
jsr drawscreen
stz eof
stz sof
lda :pos
sta position
cmp #$00
bne :seof
dec sof
:seof cmp flen
blt :gbuff
dec eof
:gbuff jsr getbuff
jsr drawline
jsr poscurs
plp
rts
:line ds 2
:offset ds 2
:ct ds 2
:array ds 24*2,0
:pos ds 2
else
gotoline php
rep $30
stz eof
stz position
lda position
cmp flen
bne :stz
lda #$ffff
sta eof
:stz stz position
stz :offset
stz :ct
lda #$01
sta sof
sta :line
]lup lda :offset
asl
tax
lda position
sta :array,x
inc :offset
inc :ct
lda :offset
cmp #12
blt :gline
stz :offset
:gline lda :line
cmp gotolnum
bge :done
lda eof
bne :done
jsr foreptr
inc :line
jmp ]lup
:done
stz termch
stz pos
lda :line
sta linenum
lda position
sta :pos
lda :ct
cmp #12
blt :garray
]sbc cmp #12
blt :goffset
sec
sbc #12
jmp ]sbc
:goffset inc
cmp #12
blt :asl
lda #$00
:asl asl
tax
lda :array,x
sta position
lda #10
sta termcv
jmp :set
:garray dec
sta :offset
lda #$00
asl
tax
lda :array,x
sta position
lda :offset
* clc
* adc #$02
sta termcv
:set jsl setch
jsr drawcpos
jsr drawscreen
* jsr showch
* jsr showcv
stz eof
stz sof
lda :pos
sta position
* cmp #$00
bne :seof
dec sof
:seof cmp flen
blt :gbuff
dec eof
:gbuff jsr getbuff
jsr drawline
jsr poscurs
plp
rts
:line ds 2
:offset ds 2
:ct ds 2
:array ds 24*2,0
:pos ds 2
fin
gotolable php
rep $30
lda glabstr
and #$ff
jeq :gbuff
sta :len
stz eof
stz position
* lda position
lda flen
bne :stz
lda #$ffff
sta eof
:stz stz position
stz :offset
stz :ct
lda #$01
sta sof
sta :line
]lup lda :offset
asl
tax
lda position
sta :array,x
inc :offset
inc :ct
lda :offset
cmp #12
blt :gline
stz :offset
:gline lda :line
cmp gotolnum
bge :done
lda eof
bne :done
ldx #$01
ldy position
sep $20
]cmp lda [fileptr],y
and #$7f
cmp #'a'
blt :l1
cmp #'z'+1
bge :l1
and #$5f
:l1 cmp glabstr,x
bne :no
iny
inx
cpy flen
bge :done
cpx :len
blt ]cmp
beq ]cmp
jmp :done
:no rep $30
jsr foreptr
inc :line
jmp ]lup
:done rep $30
stz termch
stz pos
lda :line
sta linenum
lda position
sta :pos
lda :ct
cmp #12
blt :garray
]sbc cmp #12
blt :goffset
sec
sbc #12
jmp ]sbc
:goffset inc
cmp #12
blt :asl
lda #$00
:asl asl
tax
lda :array,x
sta position
lda #10
sta termcv
jmp :set
:garray dec
sta :offset
lda #$00
asl
tax
lda :array,x
sta position
lda :offset
* clc
* adc #$02
sta termcv
:set jsl setch
jsr drawcpos
jsr drawscreen
* jsr showch
* jsr showcv
stz eof
stz sof
lda :pos
sta position
* cmp #$00
bne :seof
dec sof
:seof cmp flen
blt :gbuff
dec eof
:gbuff rep $30
jsr getbuff
jsr drawline
jsr poscurs
plp
rts
:len ds 2
:line ds 2
:offset ds 2
:ct ds 2
:array ds 24*2,0
:pos ds 2
gotopos php
rep $30
stz eof
stz position
* lda position
lda flen
bne :stz
lda #$ffff
sta eof
:stz stz position
stz :offset
stz :ct
lda #$01
sta sof
sta :line
]lup lda :offset
asl
tax
lda position
sta :array,x
inc :offset
inc :ct
lda :offset
cmp #12
blt :gline
stz :offset
:gline lda position
cmp gotoposition
bge :done
lda eof
bne :done
jsr foreptr
inc :line
jmp ]lup
:done
stz termch
stz pos
lda :line
sta linenum
lda position
sta :pos
lda :ct
cmp #12
blt :garray
]sbc cmp #12
blt :goffset
sec
sbc #12
jmp ]sbc
:goffset inc
cmp #12
blt :asl
lda #$00
:asl asl
tax
lda :array,x
sta position
lda #10
sta termcv
jmp :set
:garray dec
sta :offset
lda #$00
asl
tax
lda :array,x
sta position
lda :offset
* clc
* adc #$02
sta termcv
:set jsl setch
jsr drawcpos
jsr drawscreen
* jsr showch
* jsr showcv
stz eof
stz sof
lda :pos
sta position
* cmp #$00
bne :seof
dec sof
:seof cmp flen
blt :gbuff
dec eof
:gbuff jsr getbuff
jsr drawline
jsr poscurs
plp
rts
:line ds 2
:offset ds 2
:ct ds 2
:array ds 24*2,0
:pos ds 2
foreptr php
rep $30
stz eof
stz sof
ldy position
cpy flen
bge :plp
ldx #$00
sep $20
:loop lda [fileptr],y
and #$7F
iny
inx
cmp #$0D
beq :cr
cpx #$100
bge :cr
cpy flen
blt :loop
jmp :cr
:cr sty position
:plp rep $30
lda position
bne :qeof
ldy #$FFFF
sty sof
:qeof cmp flen
blt :plp1
lda #$FFFF
sta eof
:plp1 plp
rts
mx %00
:pos ds 2
drawscreen php
rep $30
* lda flen
* bne :sta
* plp
* rts
:sta lda position
sta :pos
lda termcv
sta :cv
stz termcv
jsl setch
jsr setfflags
lda eof
bne :done
:main ldy position
ldx #$00
cpy flen
bge :docr
sep $20
:loop lda [fileptr],y
sta linebuff+1,x
and #$7F
iny
inx
cmp #$0D
beq :next
cpx #$100
bge :next1
cpy flen
blt :loop
:docr sep $20
lda #$0D
sta linebuff+1,x
inx
jmp :next
:next1 ldx #$FF
:next txa
sta linebuff
rep $30
jsr drawline
lda termcv
inc
sta termcv
cmp #22
bge :done
jsl setch
bit eof
bmi :done
jsr foreptr
jmp :main
:done sep $20
lda termcv
cmp #22
bge :done1
jsl setch
ldy #$00
]clr lda #" "
phy
jsl storchar
ply
iny
cpy #right
blt ]clr
lda termcv
inc
sta termcv
jmp :done
:done1 lda :cv
sta termcv
jsl setch
rep $30
lda :pos
sta position
jsr setfflags
jsr getbuff
plp
rts
:pos ds 2
:cv ds 2
updatescreen php
rep $30
:sta lda position
sta :pos
lda termcv
sta :cv
jsl setch
jsr setfflags
lda flen
jeq :done
lda eof
bne :done
:main ldy position
ldx #$00
cpy flen
bge :docr
sep $20
:loop lda [fileptr],y
sta linebuff+1,x
and #$7F
iny
inx
cmp #$0D
beq :next
cpx #$100
bge :next1
cpy flen
blt :loop
:docr sep $20
lda #$0D
sta linebuff+1,x
inx
jmp :next
:next1 ldx #$FF
:next txa
sta linebuff
rep $30
jsr drawline
lda termcv
inc
sta termcv
cmp #22
bge :done
jsl setch
bit eof
bmi :done
jsr foreptr
jmp :main
:done sep $20
lda termcv
cmp #22
bge :done1
jsl setch
ldy #$00
]clr lda #" "
phy
jsl storchar
ply
iny
cpy #right
blt ]clr
lda termcv
inc
sta termcv
jmp :done
:done1 lda :cv
sta termcv
jsl setch
rep $30
lda :pos
sta position
jsr setfflags
plp
rts
:pos ds 2
:cv ds 2
drawline pha
phx
phy
php
sep $30
jsr modify
jsr setrange
stz :litflag
ldy #$00
sty :ch
sty :tabct
lda linebuff
jeq :xit
ldx #$07
lda #$00
]lup ora tabs,x
dex
bpl ]lup
ldx #$00
cmp #$00
jeq :normal
lda linebuff+1
and #$7F
cmp #';'
jeq :docomment
cmp #'*'
jeq :normal
cmp #$0D
jeq :normal
:loop lda :ch
cmp #right
jge :xit
inx
cpx linebuff
blt :ok
beq :ok
jmp :xit
:ok lda linebuff,x
cmp #$A0
beq :tab
and #$7F
cmp #';'
beq :comment
cmp #$09
beq :tab
cmp #$27
beq :literal
cmp #$22
beq :literal
cmp #$0D
bne :ora
lda showcr
beq :loop
bit selectflag
bmi :ncr
lda #$46+$80
bra :phx
:ncr lda #$4D+$80
bra :phx
:ora cmp #$20
blt :phx
* ora selectflag
:phx phx
ldy :ch
jsl storchar1
plx
:incch inc :ch
jmp :loop
:literal pha
lda #$80
eor :litflag
sta :litflag
pla
jmp :ora
:comment bit :litflag
bmi :cjmp
dex
lda linebuff,x
and #$7F
cmp #$20
jeq :docomment
cmp #$09
jeq :docomment
inx
lda #';'
:cjmp jmp :ora
:tab ldy :tabct
cpy #$08
bge :space
inc :tabct
lda tabs,y
beq :space
cmp :ch
blt :space
beq :space
sta :tabval
ldy :ch
sta :ch
]lup cpy :tabval
blt :s1
jmp :loop
:s1 lda #' '
* ora selectflag
phy
jsl storchar1
ply
iny
jmp ]lup
:space lda #$20
jmp :ora
:xit sep $30
ldy :ch
dey
]lup iny
cpy #right
bge :plp1
lda #' '
* ora selectflag
phy
jsl storchar1
ply
jmp ]lup
:plp1 plp
ply
plx
pla
rts
:docomment phx
ldx #$07
:xloop lda tabs,x
beq :dext
cmp :ch
blt :space1
beq :space1
sta :tabval
ldy :ch
sta :ch
]lup cpy :tabval
blt :s11
jmp :cplx
:s11 lda #' '
* ora selectflag
phy
jsl storchar1
ply
iny
jmp ]lup
:space1 lda #$20
* ora selectflag
ldy :ch
jsl storchar1
plx
phx
beq :cplx
lda linebuff,x
and #$7F
cmp #$20
beq :cplx
cmp #$09
beq :cplx
:dcinx inc :ch
jmp :cplx
:dext dex
bpl :xloop
:cplx plx
:normal lda :ch
cmp #right
jge :xit
inx
cpx linebuff
blt :ok3
beq :ok3
jmp :xit
:ok3 lda linebuff,x
and #$7F
cmp #$0D
bne :nora
lda showcr
beq :normal
bit selectflag
bmi :nncr
lda #$46+$80
bra :phx2
:nncr lda #$4D+$80
bra :phx2
:nora cmp #$09
bne :nora1
lda #$20
:nora1 cmp #$20
blt :phx2
* ora selectflag
:phx2 phx
ldy :ch
jsl storchar1
plx
inc :ch
jmp :normal
:ch ds 2
:tabct ds 2
:tabval ds 2
:schar ds 2
:litflag ds 2
modify php
sep $30
lda #$A0
sta :space
lda linebuff
jeq :mxit
lda #$00
ldx #$07
]lup ora tabs,x
dex
bpl ]lup
cmp #$00
jeq :20
lda linebuff+1
and #$7F
cmp #'*'
jeq :20
cmp #';'
beq :20
stz :spacect
stz :spacect+1
lda #$80
sta :eorflag
ldx #$01
]lup lda linebuff,x
and #$7F
cmp #$27
beq :literal
cmp #$22
beq :literal
cmp #$20
bne :inx
lda :space
sta linebuff,x
:inx cmp #$A0
beq :incsp
cmp #$09
beq :incsp
cmp #';'
bne :inx1
bit :space
bpl :inx1
dex
beq :stz1
lda linebuff,x
inx
and #$7F
cmp #$20
beq :stz
cmp #$09
beq :stz
jmp :inx1
:incsp inc :spacect
ldy :spacect
cpy #$08
bge :stz
lda tabs,y
bne :inx1
bra :stz
:stz1 inx
:stz stz :eorflag
lda #$20
sta :space
:inx1 inx
cpx linebuff
blt ]lup
beq ]lup
jmp :mxit
:literal pha
lda :space
eor :eorflag
sta :space
pla
jmp :inx
:20 ldx linebuff
]lup lda linebuff,x
and #$7F
cmp #$20
bne :dex
sta linebuff,x
:dex dex
bne ]lup
:mxit plp
rts
:char ds 2
:space ds 2
:spacect ds 2
:eorflag ds 2
poscurs pha
phx
phy
php
sep $30
jsr modify
stz :litflag
stz aval
stz aval+1
ldy #$00
sty :ch
sty :tabct
lda pos
cmp linebuff
blt :ldx
ldx linebuff
beq :stapos
lda linebuff,x
and #$7F
cmp #$0D
bne :stapos
dex
:stapos stx pos
:ldx ldx pos
lda linebuff
jeq :xit
ldx #$07
lda #$00
]lup ora tabs,x
dex
bpl ]lup
ldx #$00
cmp #$00
jeq :normal
lda linebuff+1
and #$7F
cmp #';'
jeq :docomment
cmp #'*'
jeq :normal
cmp #$0D
jeq :normal
:loop stz :incflag
inx
cpx pos
blt :lb
beq :lb
jmp :xit
:lb cpx linebuff
blt :ok
beq :ok
jmp :xit
:ok lda linebuff,x
cmp #$A0
beq :tab
and #$7F
cmp #';'
beq :comment
cmp #$09
beq :tab
cmp #$27
beq :literal
cmp #$22
beq :literal
:ora
:space
:incch inc :ch
jmp :loop
:literal pha
lda #$80
eor :litflag
sta :litflag
pla
jmp :ora
:comment bit :litflag
bmi :cjmp
dex
lda linebuff,x
and #$7F
cmp #$20
jeq :docomment
cmp #$09
jeq :docomment
inx
lda #';'
:cjmp jmp :ora
:tab cpx pos
blt :tab1
bit :litflag
bmi :tab1
inx
cpx linebuff
beq :chkcomm
bge :tab2
:chkcomm lda linebuff,x
dex
and #$7F
cmp #';'
bne :tab1
sec
ror :incflag
jmp :docomment
:tab2 dex
:tab1 ldy :tabct
cpy #$08
bge :space
inc :tabct
lda tabs,y
beq :space
cmp :ch
blt :space
beq :space
sta :ch
jmp :loop
:xit stx pos1
rep $30
lda :ch
and #$00FF
cmp #right
blt :s
lda #right-1
:s sta termch
lda termcv
jsl setch
plp
ply
plx
pla
rts
mx %11
:docomment phx
ldx #$07
:xloop lda tabs,x
beq :dext
cmp :ch
blt :space1
beq :space1
sta :ch
sta aval
jmp :cplx
:space1 plx
phx
beq :cplx
lda linebuff,x
and #$7F
cmp #$20
beq :cplx1
cmp #$09
bne :dcinx
:cplx1 bit :incflag
bpl :cplx
:dcinx inc :ch
jmp :cplx
:dext dex
bpl :xloop
:cplx plx
:normal inx
cpx pos
blt :ok3
beq :ok3
jmp :xit
:ok3 lda linebuff,x
and #$7F
inc :ch
jmp :normal
:ch ds 2
:tabct ds 2
:tabval ds 2
:schar ds 2
:litflag ds 2
:incflag ds 2
setpos pha
phx
phy
php
sep $30
jsr modify
stz :litflag
stz aval
stz aval+1
lda #$FF
sta pos
ldy #$00
sty :ch
sty :tabct
lda pos
cmp linebuff
blt :ldx
ldx linebuff
beq :stapos
lda linebuff,x
and #$7F
cmp #$0D
bne :stapos
dex
:stapos stx pos
:ldx ldx pos
lda linebuff
jeq :xit
ldx #$07
lda #$00
]lup ora tabs,x
dex
bpl ]lup
ldx #$00
cmp #$00
jeq :normal
lda linebuff+1
and #$7F
cmp #';'
jeq :docomment
cmp #'*'
jeq :normal
cmp #$0D
jeq :normal
:loop stz :incflag
lda :ch
cmp oldch
blt :i1
jmp :xit
:i1 inx
cpx pos
blt :lb
beq :lb
jmp :xit
:lb cpx linebuff
blt :ok
beq :ok
jmp :xit
:ok lda linebuff,x
cmp #$A0
beq :tab
and #$7F
cmp #';'
beq :comment
cmp #$09
beq :tab
cmp #$27
beq :literal
cmp #$22
beq :literal
:ora
:space
:incch inc :ch
jmp :loop
:literal pha
lda #$80
eor :litflag
sta :litflag
pla
jmp :ora
:comment bit :litflag
bmi :cjmp
dex
lda linebuff,x
and #$7F
cmp #$20
jeq :docomment
cmp #$09
jeq :docomment
inx
lda #';'
:cjmp jmp :ora
:tab cpx pos
blt :tab1
bit :litflag
bmi :tab1
inx
cpx linebuff
beq :chkcomm
bge :tab2
:chkcomm lda linebuff,x
dex
and #$7F
cmp #';'
bne :tab1
sec
ror :incflag
jmp :docomment
:tab2 dex
:tab1 ldy :tabct
cpy #$08
bge :space
inc :tabct
lda tabs,y
beq :space
cmp :ch
blt :space
beq :space
sta :ch
jmp :loop
:xit stx pos1
stx pos
rep $30
lda :ch
and #$00FF
cmp #right
blt :s
lda #right-1
:s sta termch
lda termcv
jsl setch
plp
ply
plx
pla
rts
mx %11
:docomment phx
ldx #$07
:xloop lda tabs,x
beq :dext
cmp :ch
blt :space1
beq :space1
sta :ch
sta aval
jmp :cplx
:space1 plx
phx
beq :cplx
lda linebuff,x
and #$7F
cmp #$20
beq :cplx1
cmp #$09
bne :dcinx
:cplx1 bit :incflag
bpl :cplx
:dcinx inc :ch
jmp :cplx
:dext dex
bpl :xloop
:cplx plx
:normal lda :ch
cmp oldch
blt :norm1
jmp :xit
:norm1 inx
cpx pos
blt :ok3
beq :ok3
jmp :xit
:ok3 lda linebuff,x
and #$7F
inc :ch
jmp :normal
:ch ds 2
:tabct ds 2
:tabval ds 2
:schar ds 2
:litflag ds 2
:incflag ds 2
oldch ds 2
tabs dfb 12,18,30,0,0,0,0,0,0,0,0,0,0 ;no tabs >= right
tabs1 dfb 12,18,30,0,0,0,0,0,0,0,0,0,0 ;no tabs >= right
asc 'TABS'
dtabs dfb 12,18,30,0,0,0,0,0,0,0,0,0,0 ;no tabs >= right
tabstemp ds 16,0
*------------------------------------------------------
getkey php
rep $30
stz emod
lda termch
tay
jsl pickchar
sta :char
stz :on
:loop jsr :invert
lda #$04
sta :ct1
:key2 lda #$80
sta :ct
:key
do mouse
jsr mousekey ;optional mouse control
fin
bmi :xit
jsl keyscan
bpl :dec
cmp #$89 ;tab?
bne :xit
lda #$a0
jmp :xit
:dec rep $20
dec :ct
bne :key
bit emstarted
bmi :loop
dec :ct1
bne :key2
jmp :loop
:xit pha
lda termch
tay
lda :char
jsl storchar
pla
plp
rts
:invert bit :on
bpl :block
lda termch
tay
lda :char
bit selecting
bmi :s1
jsl storchar
:s1 stz :on
rts
:block lda cursor
ora #$80
cmp #"_"
bne :block1
lda termch
tay
lda #"_"
bit selecting
bmi :s2
jsl storchar
:s2 sec
ror :on
rts
:block1 bit selecting
bmi :s3
jsl invert
:s3 sec
ror :on
rts
:char ds 2
:ct ds 2
:on ds 2
:ct1 ds 2
*------------------------------------------------------
initmouse
do mouse ;no mouse at this time!
php
rep $30
bit emstarted
bpl :nomouse
pea $80
pea $80
tll $1e03
plp
rts
:nomouse pea $80
pea $80
tll $1e03
plp
rts
mousekey php
rep $30
stz mousecr
pha
pha
pha
tll $1703
pla
sta mousestat
pla
sta mouseypos
pla
sta mousexpos
jcs :nomouse
:x lda mousexpos
cmp #$70
blt :left
cmp #$90
bge :right
lda mouseypos
cmp #$70
blt :up
cmp #$90
bge :down
lda mousestat
bit #$8000
bne :mdown0
* stz mouselast
jmp :nomouse
:mdown0 sep $20
ldal $e0c030
rep $20
lda mouselast
beq :nomouse
and #$7f
ora #$80
jmp :keyxit
:left lda #$08+$80
stz mouselast
jmp :keyxit
:right lda #$15+$80
stz mouselast
jmp :keyxit
:up lda #$0b+$80
sta mouselast
jmp :keyxit
:down lda #$0a+$80
sta mouselast
jmp :keyxit
:keyxit and #$ff
pha
lda mousestat
bmi :pla
* jsr initmouse
:pla pla
:kx1 and #$ff
plp
sep $80
rts
:nomouse
pha
lda mousestat
bmi :pla1
* jsr initmouse
:pla1 pla
plp
rep $80
rts
mouseypos ds 2
mousexpos ds 2
mousestat ds 2
mouselast ds 2
mousecr ds 2
mousecrchar ds 2
else
rts ;--- no mouse control ---
fin
*------------------------------------------------------
showcv php
rep $30
lda andflag
pha
lda orflag
pha
stz orflag
lda #$7f
sta andflag
psl #linenum
pea #$0000 ;was 8000
jsl printdec
pla
sta orflag
pla
sta andflag
plp
rts
showch php
rep $30
lda termch
pha
inc
sta termch
lda andflag
pha
lda orflag
pha
stz orflag
lda #$7f
sta andflag
:psl psl #termch
pea $0000
jsl printdec
pla
sta orflag
pla
sta andflag
pla
sta termch
plp
rts
print php
phb
phk
plb
sep $30
lda termch
sta :ch
lda termcv
sta :cv
lda 5,s ; get bank of data
pha
plb
ldy #$01 ; add 1 to return address
lda (3,s),y
sta termch
iny
lda (3,s),y
sta termcv
iny
sep $30
jsl setch
ldy #$03
:loop lda (3,s),y ; get a character to print
beq :fix ; 0 = end of string
phy
ldy termch
pha
and #$7f
cmp #'N'&$1f
beq :normal
cmp #'O'&$1f
bne :pla
stz orflag
lda #$7f
sta andflag
jmp :pla1
:normal lda #$7f
sta andflag
lda #$80
sta orflag
:pla1 pla
jmp :ply
:pla pla
and andflag
ora orflag
cmp #$40
blt :s
cmp #$60
bge :s
sec
sbc #$40
:s jsl storchar ; print ascii character
inc termch
:ply ply
iny ; y = y + 1
bra :loop ; next character
:fix rep $30
tya
sta :len
lda 3,s ; get low word of return address
clc
adc :len ; add to length of string
sta 3,s ; put back in place
sep $30
lda :cv
sta termcv
lda :ch
sta termch
jsl setch
plb
plp
rtl
:len hex 0000
:ch ds 2
:cv ds 2
*------------------------------------------------------
editscreen php
sep $30
stz mych
lda #$17
sta mycv
jsl textbascalc
ldy #$00
]lup lda #' '
jsr textstore
iny
cpy #80
blt ]lup
jsr drawtabs
jsr drawbottom
jsr drawcpos
jsr drawmem
plp
rts
drawbottom php
sep $30
lda termch
pha
lda termcv
pha
jsr drawfname
jsr drawname
jsr drawcpos
jsr drawscroll
pla
sta termcv
pla
sta termch
jsl setch
plp
rts
drawscroll rts ;lda #$02
sta termcv
jsl setch
ldy #right
lda #$D2-$80
jsl storchar
]lup lda termcv
inc
cmp #21
bge :end
sta termcv
jsl setch
ldy #right
lda #$D6-$80
jsl storchar
jmp ]lup
:end sta termcv
jsl setch
lda #$D1-$80
ldy #right
jsl storchar
rts
showpath rts ;php
sep $30
jsl print
hex 0000
asc "File: ",00
stz mycv
lda #$06
sta mych
jsl textbascalc
rep $30
lda getname
and #$00FF
bne :n
psl #:nonestr
jmp :d
:n psl #getname
:d jsl drawstr
plp
rts
:nonestr str 'None'
mx %11
drawfname rts ;php
sep $30
jsl print
hex 0000
asc "File: ",00
stz mycv
lda #$06
sta mych
jsl textbascalc
rep $30
lda efilename
and #$00FF
bne :n
psl #:nonestr
jmp :d
:n psl #efilename
:d jsl drawstr
plp
rts
:nonestr str 'None'
mx %11
drawname rts ;php
jsl print
hex 1e00
asc "*** QuickEDIT ***",00
plp
drawesc rts ;php
jsl print
hex 3f00
asc "Escape: CDA Menu",00
plp
rts
drawesccan rts ;php
sep $30
jsl print
hex 3c00
asc " Escape: Edit",00
plp
rts
drawesccan1 rts ;php
sep $30
jsl print
hex 3c00
asc " Escape: Cancel",00
plp
rts
drawcpos php
rep $30
lda #$7f
sta andflag
stz orflag
lda dirty
bne :plus
jsl print
hex 0017
asc " Line:",00
jmp :sep
:plus jsl print
hex 0017
asc "+Line:",00
:sep
sep $20
lda #$06
sta mych
lda #23
sta mycv
rep $20
jsl textbascalc
jsr showcv
sep $20
lda mych
sta :ch
lda mycv
sta :ch+1
rep $20
jsl print
:ch hex 0000
asc " Col:",00
lda :ch
clc
adc #06
sta mych
jsl textbascalc
jsr showch
lda #' '
jsl drawchar
lda #' '
jsl drawchar
lda #' '
jsl drawchar
do 0
lda selecting
jsl tprbytel
lda #' '
jsl drawchar
lda selectflag
jsl prbyte
lda #' '
jsl drawchar
lda selstart
jsl tprbytel
lda #' '
jsl drawchar
lda selend
jsl tprbytel
lda #' '
jsl drawchar
lda flen
jsl tprbytel
lda #' '
jsl drawchar
lda #' '
jsl drawchar
lda #' '
jsl drawchar
fin
lda #$80
sta orflag
plp
rts
drawmem php
rep $30
stz orflag
lda #$0000
sec
sbc flen
sta :size
lda #$01
sbc #$00
sta :size+2
lup 10
lsr :size+$2
ror :size
--^
psl :size
psl #:str
pea $04
pea $00
tll $270B
sep $30
ldy #$00
]lup lda :str,y
ora #$80
sta :str,y
iny
cpy #$07
blt ]lup
jsl print
hex 4317
:str ds 4,0
asc "K Avail.",00
lda #$80
sta orflag
plp
rts
:size ds 4
drawtabs php
sep $30
lda termch
pha
lda termcv
pha
stz termch
lda #$16 ;#$01
sta termcv
jsl setch
ldy #$00
lda #'-'
jsl storchar
ldy #$01
]lup sty :ct
ldx #$00
:which lda tabs,x
beq :inx
cmp :ct
beq :yes
:inx inx
cpx #$08
blt :which
lda #'-'
jmp :ldy
:yes lda #'|'
:ldy ldy :ct
jsl storchar
ldy :ct
iny
cpy #right
blt ]lup
ldy #right-1
lda #'-'
jsl storchar
pla
sta termcv
pla
sta termch
jsl setch
plp
rts
:ct ds 2
mx %00
do debug
showinfo php
rep $30
sep $20
stz mych
lda #23
sta mycv
rep $20
jsl textbascalc
lda flen
jsl tprbytel
lda #' '
jsl drawchar
lda linebuff
and #$00FF
jsl prbyte
lda oldlen
jsl prbyte
lda #' '
jsl drawchar
lda position
jsl tprbytel
lda #' '
jsl drawchar
lda pos
jsl prbyte
lda pos1
jsl prbyte
lda #' '
jsl drawchar
lda aval
jsl tprbytel
* lda xval
* jsl tprbytel
* lda yval
* jsl tprbytel
jsl setch
plp
rts
fin
***** RAM based TEXT driver for editor *****
* (faster than GS text tools...but still compatible with them!)
textdriver
jmp textinit ;needed entry vectors
jmp textread
jmp textwrite
jmp textstatus
jmp textcontrol
textinit php
phb
phd
phk
plb
rep $30
lda editdp
tcd
stz mych
stz mycv
lda mycv
asl
tax
lda scrtbl,x
sta base
jsl clrscreen
pld
plb
plp
rtl
textwrite php
phb
phd
phk
plb
rep $30
lda editdp
tcd
sep $20
sta :char
and #$7F
cmp #$20
bge :normal
jmp :control
:normal lda mych
and #$00FF
tay
lda :char
and andflag
ora orflag
jsr textstore
inc mych
lda mych
cmp #80
blt :r
stz mych
inc mycv
lda mycv
cmp #24
blt :r
lda #23
sta mycv
rep $30
jsl scroll
lda mycv
asl
tax
lda scrtbl,x
sta base
:r pld
plb
plp
rtl
mx %10
:control cmp #$0D
beq :cr
jmp :r
:cr
stz mych
sep $20
inc mycv
lda mycv
cmp #24
blt :crn
lda #23
sta mycv
rep $30
jsl scroll
:crn rep $30
lda mycv
and #$00FF
asl
tax
lda scrtbl,x
sta base
jmp :r
:char ds 2
:basl ds 2
andflag dw $7f
orflag dw $80
textread rtl
textcontrol rtl
textstatus php
rep $30
lda #$00
plp
clc
rtl
textstore phy
php
phb
rep $30
sty :y
sei
ldy basl
phy
ldy base
sty basl
sep $30
ldy :y
pea $0000
plb
plb
pha ;save the character
tya ;get character position
lsr ;divide by 2
tay ;restore screen pos
bcs :storeit ;if so, then ok
pea $0101
plb
plb
:storeit pla ;get char to store
cmp #$40
blt :ok
cmp #$60
bge :ok
sec
sbc #$40
:ok sta (basl),y ;put char on screen
rep $30
ply
sty basl
plb
plp
ply
rts ;return
:y ds 2
textbascalc
phx
php
rep $30
lda mycv
and #$00FF
asl
tax
lda scrtbl,x
sta base
plp
plx
rtl
*-----------------------------------------------*
* Name : BASCALC *
* Function : CALC BASE ADDR FOR SCREEN LINE *
* Input : AC=CV *
* Output : BASL/BASH *
* Volatile : NOTHING *
* Calls : NONE *
*-----------------------------------------------*
bascalc
pha
phx
php
rep $30
and #$00FF
asl
tax ;get index for line #
lda scrtbl,x ;get l.o. byte
sta basl ;store in basl
plp ;restore interupts
plx
pla ;restore a-reg
rtl ;return to caller
mx %11
*-----------------------------------------------*
* Name : STORCHAR *
* Function : STORE A CHAR ON SCREEN *
* Input : AC=CHAR *
* Y=CH POS *
* Output : CHAR ON SCREEN *
* Volatile : NOTHING *
* Calls : NONE *
*-----------------------------------------------*
storchar
phb
phx
phy
php
sep $30
pea $0000
plb
plb
pha ;save the character
tya ;get character position
lsr ;divide by 2
tay ;restore screen pos
bcs :storeit ;if so, then ok
pea $0101
plb
plb
:storeit pla ;get char to store
* andl andflag
* oral orflag
sta (basl),y ;put char on screen
plp
ply
plx
plb
rtl ;return
storchar1
phb
phx
phy
php
sep $30
pea $0000
plb
plb
pha ;save the character
tya ;get character position
lsr ;divide by 2
tay ;restore screen pos
bcs :storeit ;if so, then ok
pea $0101
plb
plb
:storeit pla ;get char to store
cmp #$4d+$80
beq :sta2
cmp #$46+$80
beq :sta2
cmp #$40
blt :sta1
cmp #$5f+1
bge :sta1
:sec sec
sbc #$40
bra :sta1
:sta2 and #$7f
bra :sta
:sta1 ora selectflag
:sta sta (basl),y ;put char on screen
plp
ply
plx
plb
rtl ;return
*-----------------------------------------------*
* Name : PICKCHAR *
* Function : GET A CHAR FROM SCREEN *
* Input : Y=CH POSITION *
* Output : AC=CHAR *
* Volatile : NOTHING *
* Calls : NONE *
*-----------------------------------------------*
pickchar
phx
phy
php
phb
sep $30
pea $0000
plb
plb
tya ;get character position
lsr ;divide by 2
tay ;restore screen pos
bcs :pickit ;if so, then ok
pea $0101
plb
plb
:pickit lda (basl),y ;put char on screen
plb
plp
ply
plx
rtl ;return
*-----------------------------------------------*
* Name : SETCH *
* Function : MOVE CURSOR TO CH/CV *
* Input : CH/CV *
* Output : CURSOR POSITION *
* Volatile : NOTHING *
* Calls : NONE *
*-----------------------------------------------*
setch
pha ;save the a-reg
php
sep $30
lda termch ;get our ch value
stal $57B ;store in 80 col ch
stal $24
:chcont lda termcv ;get our cv value
stal $25 ;store in monitor cv
stal $5FB ;store in 80 col cv
jsl bascalc ;calculate base address
plp
pla ;restore a-reg
rtl ;return
*-----------------------------------------------*
* Name : INVERT *
* Function : INVERT THE CHAR AT CH/CV *
* Input : NOTHING *
* Output : CHAR AT CH/CV INVERTED *
* Volatile : NOTHING *
* Calls : PICKCHAR, STORCHAR *
*-----------------------------------------------*
invert
phb
pha ;save the a-reg
phy ;save the y-reg
phx
php
sep $30
pea $0000
plb
plb
lda termch
tay
jsl pickchar ;get char at cursor
cmp #$46
beq :cr1
cmp #$4D
beq :cr
cmp #$80
bge :inv
cmp #$20
bge :normal
clc
adc #$40
:normal ora #$80 ;convert to normal char
bne :stuffit
:inv and #$7F ;convert to inverse char
cmp #$60
bge :stuffit
cmp #$40
blt :stuffit
sec
sbc #$40
:stuffit jsl storchar ;put it back
plp
plx
ply ;get y value
pla ;restore a-reg
plb
rtl ;return
:cr lda #$46
bra :stuffit
:cr1 lda #$4D
bra :stuffit
*======================================================
scroll ;fast scroll routine
phy
php
phb
rep $30
ldy #$26 ;get ready for each column
:start pea $0101
plb
plb
lda $480,y
sta $400,y
lda $500,y
sta $480,y
lda $580,Y ;scroll one column
sta $500,Y
lda $600,Y
sta $580,Y
lda $680,Y
sta $600,Y
lda $700,Y
sta $680,Y
lda $780,Y
sta $700,Y
lda $428,Y
sta $780,Y
lda $4A8,Y
sta $428,Y
lda $528,Y
sta $4A8,Y
lda $5A8,Y
sta $528,Y
lda $628,Y
sta $5A8,Y
lda $6A8,Y
sta $628,Y
lda $728,Y
sta $6A8,Y
lda $7A8,Y
sta $728,Y
lda $450,Y
sta $7A8,Y
lda $4D0,Y
sta $450,Y
lda $550,Y
sta $4D0,Y
lda $5D0,Y
sta $550,Y
lda $650,Y
sta $5D0,Y
lda $6D0,Y
sta $650,Y
lda selecting
bmi :inv1
pea #$A0A0
pla
bra :sta1
:inv1 pea #$2020
pla
:sta1 sta $6D0,Y
pea $0000
plb
plb
:lda2
lda $480,y
sta $400,y
lda $500,y
sta $480,y
lda $580,Y ;scroll an odd column
sta $500,Y
lda $600,Y
sta $580,Y
lda $680,Y
sta $600,Y
lda $700,Y
sta $680,Y
lda $780,Y
sta $700,Y
lda $428,Y
sta $780,Y
lda $4A8,Y
sta $428,Y
lda $528,Y
sta $4A8,Y
lda $5A8,Y
sta $528,Y
lda $628,Y
sta $5A8,Y
lda $6A8,Y
sta $628,Y
lda $728,Y
sta $6A8,Y
lda $7A8,Y
sta $728,Y
lda $450,Y
sta $7A8,Y
lda $4D0,Y
sta $450,Y
lda $550,Y
sta $4D0,Y
lda $5D0,Y
sta $550,Y
lda $650,Y
sta $5D0,Y
lda $6D0,Y
sta $650,Y
lda $750,Y
lda selecting
bmi :inv2
pea #$A0A0
pla
bra :sta2
:inv2 pea #$2020
pla
:sta2 sta $6D0,Y
dey ;decrement index
dey
bmi :exit ;if not done with screen..
brl :start ;continue
:exit plb
plp ;restore flags
ply
rtl ;and return
*------------------------------------------------------
bscroll ;fast back scroll routine
phy
php
phb
rep $30
ldy #$26 ;get ready for each column
:start pea $0101
plb
plb
lda $650,Y ;scroll one column
sta $6D0,Y
lda $5D0,Y
sta $650,Y
lda $550,Y
sta $5D0,Y
lda $4D0,Y
sta $550,Y
lda $450,Y
sta $4D0,Y
lda $7A8,Y
sta $450,Y
lda $728,Y
sta $7A8,Y
lda $6A8,Y
sta $728,Y
lda $628,Y
sta $6A8,Y
lda $5A8,Y
sta $628,Y
lda $528,Y
sta $5A8,Y
lda $4A8,Y
sta $528,Y
lda $428,Y
sta $4A8,Y
lda $780,Y
sta $428,Y
lda $700,Y
sta $780,Y
lda $680,Y
sta $700,Y
lda $600,Y
sta $680,Y
lda $580,Y
sta $600,Y
lda $500,Y
sta $580,Y
lda $480,Y
sta $500,y
lda $400,y
sta $480,y
lda selecting
bmi :inv1
pea #$A0A0
pla
bra :sta1
:inv1 pea #$2020
pla
:sta1 sta $400,Y
pea $0000
plb
plb
:lda2
lda $650,Y ;scroll one column
sta $6D0,Y
lda $5D0,Y
sta $650,Y
lda $550,Y
sta $5D0,Y
lda $4D0,Y
sta $550,Y
lda $450,Y
sta $4D0,Y
lda $7A8,Y
sta $450,Y
lda $728,Y
sta $7A8,Y
lda $6A8,Y
sta $728,Y
lda $628,Y
sta $6A8,Y
lda $5A8,Y
sta $628,Y
lda $528,Y
sta $5A8,Y
lda $4A8,Y
sta $528,Y
lda $428,Y
sta $4A8,Y
lda $780,Y
sta $428,Y
lda $700,Y
sta $780,Y
lda $680,Y
sta $700,Y
lda $600,Y
sta $680,Y
lda $580,Y
sta $600,Y
lda $500,Y
sta $580,Y
lda $480,Y
sta $500,y
lda $400,y
sta $480,y
lda selecting
bmi :inv2
pea #$A0A0
pla
bra :sta2
:inv2 pea #$2020
pla
:sta2 sta $400,Y
dey ;decrement index
dey
bmi :exit ;if not done with screen..
brl :start ;continue
:exit plb
plp ;restore flags
ply
rtl ;and return
*======================================================
clrscreen
phy
php
phb
rep $30
ldy #$26 ;get ready for each column
:start pea $0101
plb
plb
lda #$A0A0
sta $7D0,Y
sta $750,Y
sta $6D0,Y
sta $650,Y
sta $5D0,Y
sta $550,Y
sta $4D0,Y
sta $450,Y
sta $7A8,Y
sta $728,Y
sta $6A8,Y
sta $628,Y
sta $5A8,Y
sta $528,Y
sta $4A8,Y
sta $428,Y
sta $780,Y
sta $700,Y
sta $680,Y
sta $600,Y
sta $580,Y
sta $500,Y
sta $480,Y
sta $400,Y ;clear it
pea #$0000
plb
plb
sta $7D0,Y
sta $750,Y
sta $6D0,Y
sta $650,Y
sta $5D0,Y
sta $550,Y
sta $4D0,Y
sta $450,Y
sta $7A8,Y
sta $728,Y
sta $6A8,Y
sta $628,Y
sta $5A8,Y
sta $528,Y
sta $4A8,Y
sta $428,Y
sta $780,Y
sta $700,Y
sta $680,Y
sta $600,Y
sta $580,Y
sta $500,Y
sta $480,Y
sta $400,Y ;clear it
dey ;decrement index
dey
bmi :exit ;if not done with screen..
brl :start ;continue
:exit plb
plp ;restore flags
ply
rtl ;and return
put edit.apw
put edit.types
*======================================================
* Variable storage
rtl rtl
asm rtl
cursor dw "_"
dum * ;reseved space in linker!
automode ds 2
asmpath ds 256
glabstr ds 30
editdp ds 2
findstr ds 32
replacestr ds 32
linebuff ds 275
boxbuff ds 20*60 ;20 lines by 60 chars
dend
ent cursor
ent linenum
sav obj/edit.l