A2osX/BIN/EDIT.S.txt
2017-03-06 21:08:38 +01:00

546 lines
10 KiB
Plaintext
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

PR#3
PREFIX /A2OSX.SRC
NEW
INC 1
AUTO 6
.LIST OFF
.OP 65C02
.OR $2000
.TF /A2OSX.BOOT/BIN/EDIT
*--------------------------------------
.INB /A2OSX.DEV/INC/MACROS.I
.INB /A2OSX.DEV/INC/A2OSX.I
*--------------------------------------
ZPPTR1 .EQ ZPBIN
ZPPTR2 .EQ ZPBIN+2
BufPtr .EQ ZPBIN+4
BufPtrBackup .EQ ZPBIN+6
ClipboardPtr .EQ ZPBIN+8
*--------------------------------------
PromptBufferMax .EQ 64
PromptModeHelp .EQ 2
PromptModeFind .EQ 4
PromptModeReplace .EQ 6
PromptModeSave .EQ 8
*--------------------------------------
* File Header (16 Bytes)
*--------------------------------------
CS.START cld
jmp (.1,x)
.DA #$61 6502,Level 1 (65c02)
.DA #1 BIN Layout Version 1
.DA 0
.DA CS.END-CS.START Code Length To Relocate
.DA DS.END-DS.START Data Segment to Allocate
.DA 0
.DA 0
*--------------------------------------
* Relocation Table
*--------------------------------------
.1 .DA CS.INIT
.DA CS.RUN
.DA CS.DOEVENT
.DA CS.QUIT
L.SEQ.DETECT .DA SEQ.DETECT
L.SEQ.INIT .DA SEQ.INIT
L.SEQ.RESET .DA SEQ.RESET
L.SEQ.SCROLLUP .DA SEQ.SCROLLUP
L.SEQ.SCROLLDN .DA SEQ.SCROLLDN
L.SEQ.INV .DA SEQ.INV
L.SEQ.NORM .DA SEQ.NORM
L.SEQ.CEOL .DA SEQ.CEOL
L.MSG.TOPBAR .DA MSG.TOPBAR
L.MSG.STATUSBAR .DA MSG.STATUSBAR
L.MSG.STATUSBAR.H .DA MSG.STATUSBAR.H
L.MSG.STATUSBAR.F .DA MSG.STATUSBAR.F
L.MSG.STATUSBAR.R .DA MSG.STATUSBAR.R
L.MSG.STATUSBAR.S .DA MSG.STATUSBAR.S
L.MSG.STATUSBAR.E .DA MSG.STATUSBAR.E
L.MSG.NEWFILE .DA MSG.NEWFILE
L.MSG.GOTOXY .DA MSG.GOTOXY
L.MSG.HELP .DA MSG.HELP
J.PROMPT .DA Prompt.Editor
.DA Prompt.Help
.DA Prompt.Find
.DA Prompt.Replace
.DA Prompt.Save
J.CTRL .DA Ctrl.Invalid
.DA Ctrl.A
.DA Ctrl.B
.DA Ctrl.C
.DA Ctrl.D
.DA Ctrl.E
.DA Ctrl.F
.DA Ctrl.G
.DA Ctrl.BS
.DA Ctrl.TAB
.DA Ctrl.LF
.DA Ctrl.VT
.DA Ctrl.L
.DA Ctrl.CR
.DA Ctrl.N
.DA Ctrl.O
.DA Ctrl.P
.DA Ctrl.Q
.DA Ctrl.R
.DA Ctrl.S
.DA Ctrl.T
.DA Ctrl.FS
.DA Ctrl.V
.DA Ctrl.W
.DA Ctrl.X
.DA Ctrl.Y
.DA Ctrl.Z
.DA Ctrl.ESC
.DA Ctrl.Invalid
.DA Ctrl.Invalid
.DA Ctrl.Invalid
.DA Ctrl.Invalid
.DA 0
*--------------------------------------
CS.INIT lda #$ff
ldy #bSaved
sta (pData),y
>SYSCALL GetArgC
cmp #1
beq .1 No arg, new file....
lda #1
>SYSCALL GetArgA
>SYSCALL GetFullPathYA
txa
ldy #hFileName
sta (pData),y
jsr LoadFile
bcc .8 if CS, Failed to load file, keep name, but new file....
.1 >PUSHWI 1 buffer size = 0 (+ 1 for ending 0)
>PUSHBI S.MEM.F.INIT0
>SYSCALL GetMem
bcs .9
txa
ldy #hBuffer FileLen already set to 0
sta (pData),y
.8 lda (pPs)
ora #S.PS.F.EVENT Now accept events
sta (pPs)
clc
.9 rts
*--------------------------------------
CS.RUN >LDYA L.SEQ.DETECT
>SYSCALL CPrintFYA Send Query for term W & H
bcs .9
.1 >SYSCALL Sleep
>SYSCALL GetC
bcs .1
jsr CharIn
ldy #ScreenW Wait for Response from terminal
lda (pData),y for W & H
beq .1
jsr SCRN.Init
bcs .9
.2 ldy #bCancel
lda (pData),y
bne .99
>SYSCALL Sleep
>SYSCALL GetC
bcs .2
jsr CharIn
bra .2
.99 lda #0
.9 sec
rts
*--------------------------------------
CS.DOEVENT sec
rts
*--------------------------------------
CS.QUIT ldy #hBuffer
lda (pData),y
beq .1
>SYSCALL FreeMemA
.1 ldy #hBufferBackup
lda (pData),y
beq .2
>SYSCALL FreeMemA
.2 ldy #hClipBoard
lda (pData),y
beq .3
>SYSCALL FreeMemA
.3 ldy #hFileName
lda (pData),y
beq .8
>SYSCALL FreeMemA
.8 >LDYA L.SEQ.RESET
>SYSCALL CPrintFYA
.9 rts
*--------------------------------------
CharIn tax
ldy #bEscMode
lda (pData),y
asl
txa
bcc .1 Not in ESC mode
cmp #'['
beq .8
ldy #EscBuffer
lda (pData),y
inc
sta (pData),y
clc
adc #EscBuffer
tay
txa
sta (pData),y
cmp #64
bcc .8
jsr CharIn.Esc
bcs .8 Not translated, exit
.1 cmp #27 Esc ?
bne .2
ldy #bEscMode
lda #$ff
sta (pData),y
inc
ldy #EscBuffer
sta (pData),y
.8 clc
rts
.2 pha
ldy #PromptMode
lda (pData),y
tax
pla
jmp (J.PROMPT,x)
*--------------------------------------
CharIn.Esc ldy #bEscMode
lda #0
sta (pData),y
ldy #EscBuffer
lda (pData),y
clc
adc #EscBuffer
tay
lda (pData),y
ldx EscChars
.1 cmp EscChars,x
beq .2
dex
bne .1
cmp #'R' Response to cursor position query?
beq .3
sec
rts
.2 lda EscAscii,x
clc
rts
.3 stz TmpByte
ldy #EscBuffer+1
.4 lda (pData),y
cmp #';'
beq .5
and #$0f
pha
lda TmpByte
asl
asl
clc
adc TmpByte
asl
sta TmpByte
pla
clc
adc TmpByte
sta TmpByte
iny
bra .4
.5 phy
lda TmpByte
ldy #ScreenH
sta (pData),y
dec Remove 2 (top & status bar) for viewportH
dec
ldy #ViewPortH
sta (pData),y
dec
ldy #ViewPortHm1 Remove 1 more to store offsert to last line of viewport
sta (pData),y
ply
stz TmpByte
iny
.6 lda (pData),y
cmp #'R'
beq .7
and #$0f
pha
lda TmpByte
asl
asl
clc
adc TmpByte
asl
sta TmpByte
pla
clc
adc TmpByte
sta TmpByte
iny
bra .6
.7 lda TmpByte
ldy #ScreenW
sta (pData),y
sec
rts
*--------------------------------------
LoadFile >PUSHWI 0 Aux type
>PUSHBI 4 S.FILEINFO.TYPE.TXT
>PUSHBI SYS.FOpen.R
ldy #hFileName
lda (pData),y
>SYSCALL GetMemPtrA
>PUSHYA
>SYSCALL LoadFile
bcs .9
stx hMem
>STYA TmpLen
iny
bne .2
inc +1 for ending zero
.2 >PUSHYA
>PUSHBI S.MEM.F.INIT0
>SYSCALL GetMem
bcs .98
>STYA ZPPTR2
txa
ldy #hBuffer
sta (pData),y
lda hMem
>SYSCALL GetMemPtrA
>STYA ZPPTR1
lda TmpLen
eor #$ff
tax
lda TmpLen+1
eor #$ff
pha
ldy #0
.5 inx
bne .6
pla
inc
beq .7
pha
.6 lda (ZPPTR1),y
sta (ZPPTR2),y
iny
bne .5
inc ZPPTR1+1
inc ZPPTR2+1
bra .5
.7 ldy #FileLen
lda TmpLen
sta (pData),y
iny
lda TmpLen+1
sta (pData),y
jsr .98
clc
rts
.98 pha
lda hMem
>SYSCALL FreeMemA
pla
sec
.9 rts
*--------------------------------------
SaveFile ldy #hBuffer
lda (pData),y
>SYSCALL GetMemPtrA
>PUSHYA
ldy #FileLen+1
>PUSHB (pData),y
dey
>PUSHB (pData),y
>PUSHWI 0 Aux type
>PUSHBI 4 S.FILEINFO.TYPE.TXT
>PUSHBI SYS.FOpen.X+SYS.FOpen.W
ldy #hFileName
lda (pData),y
>SYSCALL GetMemPtrA
>PUSHYA
>SYSCALL SaveFile
rts
*--------------------------------------
DecTmpCount lda TmpCount
bne .1
lda TmpCount+1
beq .9
dec TmpCount+1
.1 dec TmpCount
ora #$ff make sure NZ
.9 rts
*--------------------------------------
.INB BIN/EDIT.S.BUF
.INB BIN/EDIT.S.CTRL
.INB BIN/EDIT.S.SCRN
*--------------------------------------
CS.END
SEQ.DETECT >CSTR "Querying terminal capabilities...\e[999;999H\e[6n"
SEQ.INIT >CSTR "\ec\e[2;%dr" \e[?6h
SEQ.RESET >CSTR "\ec"
SEQ.SCROLLUP >CSTR "\e[%d;%dH\eD"
SEQ.SCROLLDN >CSTR "\e[%d;%dH\eM"
SEQ.INV >CSTR "\e[7m"
SEQ.NORM >CSTR "\e[0m"
SEQ.CEOL >CSTR "\e[K"
MSG.TOPBAR >CSTR "\e[1;1HA2osX Edit:%S\e[0m"
MSG.STATUSBAR >CSTR "Press Ctrl-A For Help Length:%D Col:%d Line:%D\e[0m"
MSG.STATUSBAR.H >CSTR "Press any key to exit this screen:\e[0m"
MSG.STATUSBAR.F >CSTR "Find:%S\e[0m"
MSG.STATUSBAR.R >CSTR "Replace:%S\e[0m"
MSG.STATUSBAR.S >CSTR "Save:%S\e[0m"
MSG.STATUSBAR.E >CSTR "Error:%h\e[0m"
MSG.GOTOXY >CSTR "\e[%d;%dH"
MSG.HELP >PSTR "All commands: (* = Not yet implemented)"
>PSTR "------------"
>PSTR " Ctrl-A : This help screen"
>PSTR " Ctrl-B : Mark beginning of selection"
>PSTR " Ctrl-C : Copy selection to clipboard"
>PSTR " Ctrl-D : Delete selection"
>PSTR " Ctrl-E : Mark end of selection"
>PSTR " Ctrl-F : * Find a string..."
>PSTR " Ctrl-G : Go to start of current line"
>PSTR " Ctrl-L : Go to end of current line"
>PSTR " Ctrl-N : * Find next"
>PSTR " Ctrl-O : Page up"
>PSTR " Ctrl-P : Page down"
>PSTR " Ctrl-Q : Quit"
>PSTR " Ctrl-R : * Replace found string with..."
>PSTR " Ctrl-S : Save file to disk..."
>PSTR " Ctrl-T : Go to top of file"
>PSTR " Ctrl-V : Past clipboard at cursor position"
>PSTR " Ctrl-W : Erase current line"
>PSTR " Ctrl-X : Cut block to clipboard"
>PSTR " Ctrl-Y : Go to end of file"
>PSTR " Ctrl-Z : * Undo previous change"
.HS 00
*--------------------------------------
MSG.NEWFILE >PSTR "(new file)"
EscChars >PSTR "DBAC"
EscAscii .HS 04080A0B15
hMem .BS 1
TmpFilename .BS 1
TmpByte .BS 1
TmpLen .BS 2
TmpCount .BS 2
TmpIndex .BS 2
SelLen .BS 2
BUF.LOffset .BS 2
BUF.COffset .BS 2
BUF.TmpLine1 .BS 2
BUF.TmpLine2 .BS 2
bNotRepaint .BS 1
bSelected .BS 1
*--------------------------------------
.DUMMY
.OR 0
DS.START
PromptBuffer .BS PromptBufferMax+1
PromptMode .BS 1
bCancel .BS 1
bSaved .BS 1
bEscMode .BS 1
EscBuffer .BS 16
hFileName .BS 1
hFind .BS 1
hReplace .BS 1
hBuffer .BS 1
hBufferBackup .BS 1
FileLen .BS 2
hClipBoard .BS 1
ClipBoardLen .BS 2
ScreenW .BS 1
ScreenH .BS 1
ViewPortH .BS 1
ViewPortHm1 .BS 1
ScreenX .BS 1
ScreenY .BS 2
CurX .BS 1
CurY .BS 1
FileX .BS 1
FileY .BS 2
SelStart .BS 2
SelEnd .BS 2
DS.END
.ED
*--------------------------------------
MAN
SAVE BIN/EDIT.S
ASM