NEW
  AUTO 3,1
				.LIST OFF
				.OP	65C02
				.OR	$2000
				.TF bin/edit
*--------------------------------------
				.INB inc/macros.i
				.INB inc/a2osx.i
				.INB inc/mli.i
				.INB inc/mli.e.i
*--------------------------------------
				.DUMMY
				.OR ZPBIN
ZS.START
BufPtr			.BS 2
BufPtrDst		.BS 2
ClipboardPtr	.BS 2
LineBufPtr		.BS 2

BUF.LOffset		.BS 2
BUF.COffset		.BS 2
BUF.TmpLine1	.BS 2
BUF.TmpLine2	.BS 2

FileLen			.BS 2
BufLen			.BS 2
SelLen			.BS 2
ZPPTR1			.BS 2

bRepaint		.BS 1
bSelected		.BS 1

ZPPTR2			.EQ *
TmpLen			.BS 2

TmpIndex		.BS 2
TmpCount		.BS 1
TmpByte			.BS 1

ZS.END			.ED
*--------------------------------------
*			File Header (16 Bytes)
*--------------------------------------
CS.START		cld
				jmp (.1,x)
				.DA #$61				6502,Level 1 (65c02)
				.DA #1					BIN Layout Version 1
				.DA #S.PS.F.EVENT		S.PS.F
				.DA #0
				.DA CS.END-CS.START		CS
				.DA DS.END-DS.START		DS
				.DA #64					SS
				.DA #ZS.END-ZS.START	Zero Page Size
				.DA 0
*--------------------------------------
* Relocation Table
*--------------------------------------
.1				.DA CS.INIT
				.DA CS.RUN
				.DA CS.DOEVENT		
				.DA	CS.QUIT
L.SEQ.INIT		.DA SEQ.INIT
L.SEQ.SCROLLRGN	.DA SEQ.SCROLLRGN
L.SEQ.RESET		.DA SEQ.RESET
L.SEQ.SCROLLUP	.DA SEQ.SCROLLUP
L.SEQ.SCROLLDN	.DA SEQ.SCROLLDN
L.SEQ.SCROLLCURUP .DA SEQ.SCROLLCURUP
L.SEQ.SCROLLCURDN .DA SEQ.SCROLLCURDN
L.SEQ.CEOL		.DA SEQ.CEOL
L.MSG.DETECT	.DA MSG.DETECT
L.MSG.TOPBAR	.DA MSG.TOPBAR
L.MSG.FILETYPES	.DA MSG.TXTCR
				.DA MSG.TXTCRLF
				.DA MSG.TXTASM
L.MSG.STATUSBAR	.DA MSG.STATUSBAR
L.MSG.STATUSBAR.H	.DA MSG.STATUSBAR.H
L.MSG.STATUSBAR.U	.DA MSG.STATUSBAR.U
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.HELPLINE	.DA MSG.HELPLINE
L.MSG.HELP		.DA MSG.HELP
J.SAVE			.DA FILE.Save.CR
				.DA FILE.Save.CRLF
				.DA FILE.Save.ASM
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.Invalid
				.DA Ctrl.Invalid
				.DA Ctrl.Invalid
				.DA Ctrl.Invalid
				.DA Ctrl.Invalid
L.DLG.SAVE		.DA DLG.SAVE
L.DLG.FIND		.DA DLG.FIND
J.DLG.CTRL.Draw	.DA DLG.CTRL.Draw.LBL
				.DA DLG.CTRL.Draw.TB
				.DA DLG.CTRL.Draw.OL
				.DA DLG.CTRL.Draw.BUT
J.DLG.CTRL.Focus
				.DA DLG.CTRL.Focus.LBL
				.DA DLG.CTRL.Focus.TB
				.DA DLG.CTRL.Focus.OL
				.DA DLG.CTRL.Focus.BUT
J.DLG.CTRL.GetWitdh
				.DA DLG.CTRL.GetWitdh.LBL
				.DA DLG.CTRL.GetWitdh.TB
				.DA DLG.CTRL.GetWitdh.OL
				.DA DLG.CTRL.GetWitdh.BUT
J.DLG.CTRL.CharIn
				.DA DLG.CTRL.CharIn.LBL
				.DA DLG.CTRL.CharIn.TB
				.DA DLG.CTRL.CharIn.OL
				.DA DLG.CTRL.CharIn.BUT
				.DA 0
*--------------------------------------
CS.INIT			clc
CS.INIT.RTS		rts
*--------------------------------------
CS.RUN			>PUSHW L.MSG.DETECT
				>PUSHBI 0
				>SYSCALL PrintF		Send Query for term W & H
				bcs CS.INIT.RTS

.1				>SYSCALL GetChar
				bcs CS.INIT.RTS

				jsr CharIn
				>LDA.G ScreenW			Wait for Response from terminal for W & H
				beq .1

				>LDYAI 510+5+5+4+1		potentially 255*\\ NORM,INV,CEOL & \0
				>SYSCALL GetMem
				bcs CS.INIT.RTS
				>STYA.G LineBufBase
				txa
				>STA.G hLineBuf
				
				lda #1
				>SYSCALL ArgV
				bcs .2					No arg, new file....

				>PUSHYA
				>PUSHWI 0				Allocate
				>SYSCALL RealPath
				bcs CS.INIT.RTS
				txa
				>STA.G hFileName
				jsr FILE.Load
				bcc .3					if CS, Failed to load file, keep name, but new file....

				cmp #E.OOM
				beq CS.RUN.RTS

.2				jsr FILE.New
				bcs CS.RUN.RTS

.3				jsr SCRN.Init
				bcs CS.RUN.RTS
				
				>LDYAI 65
				>SYSCALL GetMem
				bcs CS.RUN.RTS
				>STYA ZPPTR1
				txa
				>STA.G hFind

				lda #0
				sta (ZPPTR1)
				
				>LDYAI 65
				>SYSCALL GetMem
				bcs CS.RUN.RTS
				>STYA ZPPTR1
				txa
				>STA.G hReplace

				lda #0
				sta (ZPPTR1)

CS.RUN.LOOP		jsr GetCh
				bcs CS.RUN.RTS			I/O error

				jsr CharIn
				bcs .9

				>LDA.G bExit
				bpl CS.RUN.LOOP
	
				lda #0

.9				pha
				>PUSHW L.SEQ.RESET
				>PUSHBI 0
				>SYSCALL PrintF
				pla
				sec
CS.RUN.RTS		rts
*--------------------------------------
CS.DOEVENT		lda (pEvent)
				bpl .9					is it a TIMER event?

				asl
				bpl .9

				>STA.G bUpdateTop
				>STA.G bUpdateStatus

.9				sec
				rts
*--------------------------------------
CS.QUIT			ldy #hLineBuf
				jsr .8

				ldy #hBuf
				jsr .8

				ldy #hBufBackup
				jsr .8

				ldy #hClipBoard
				jsr .8

				ldy #hFileName
				jsr .8

				ldy #hFind
				jsr .8

				ldy #hReplace

.8				lda (pData),y
				beq .9

				>SYSCALL FreeMem

.9
CS.QUIT.CLCRTS	clc
				rts
*--------------------------------------
GetCh			>SYSCALL GetChar
				bcs .9
				
				cmp #C.CR
				bne CS.QUIT.CLCRTS
				
				ldy #S.PS.hStdIn		Check for any extra LF
				lda (pPS),y
				>SYSCALL FEOF
				bcs .9
				
				tay
				bne .8
				>SYSCALL GetChar
				bcs .9
				
.8				lda #C.CR

.9				rts
*--------------------------------------
CharIn			tax

				>LDA.G bEscMode
				bpl .1					Not in ESC mode

				cpx #'['				\e[ ?
				bne .11
				
				lda (pData)				#EscBufferPtr
				bne .19					buffer not empty...bad SEQ
				clc
				rts
				
.11				lda (pData)				#EscBufferPtr
				cmp #16
				bne .10

.19				>STZ.G bEscMode

				clc
				rts
				
.10				inc
				sta (pData)
				tay
				
				txa
				sta (pData),y
				cmp #64

				bcc .8					not a letter...SEQ is incomplete

				jsr CharIn.Esc
				bcs .8					Not translated, exit
				.HS	B0					BCS
*--------------------------------------
.1				txa
				
				cmp #C.ESC
				bne .2

				lda #$ff
				>STA.G bEscMode
				inc
				sta (pData)				#EscBufferPtr

.8				clc
.9				rts	

.2				cmp #C.DEL
				bne .22
				
				jmp Ctrl.DEL

.22				cmp #C.SPACE
				bcc .3

				jsr BUF.InsertA
				bcs .9

				jsr SCRN.UpdateCurrentEOL
				bcs .9

				jmp Ctrl.FS

.3				asl
				tax
				jmp (J.CTRL,x)
*--------------------------------------
CharIn.Esc		>STZ.G bEscMode

				lda (pData)				#EscBufferPtr
				tay
				
				lda #0
				sta (pData)
				
				lda (pData),y
	
				cpy #1
				bne .10
	
				ldx #EscChars.Cnt-1

.1				cmp EscChars,x
				beq .2
				dex
				bpl .1
				
				sec
				rts

.10				cmp #'R'				Response to cursor position query?
				beq .3

				sec
				rts

.2				lda EscAscii,x
				clc
				rts
*--------------------------------------
* \e[xx;yyR
*--------------------------------------
.3				stz TmpByte

				ldy #0

.4				iny

				lda (pData),y
				cmp #';'
				beq .5

				jsr CharIn.TmpByte10pA
				bra .4

.5				phy

				lda TmpByte
				>STA.G ScreenH

				dec						Remove 2 (top & status bar) for viewportH
				dec

				>STA.G ViewPortH

				dec

				>STA.G ViewPortHm1		Remove 1 more to store offsert to last line of viewport

				ply
				stz TmpByte

.6				iny
				
				lda (pData),y
				cmp #'R'
				beq .7

				jsr CharIn.TmpByte10pA
				bra .6

.7				lda TmpByte
				>STA.G ScreenW

				sec
				rts
*--------------------------------------
CharIn.TmpByte10pA
				and #$0f
				pha
				lda TmpByte
				asl
				asl
				clc
				adc TmpByte
				asl
				sta TmpByte
				pla
				clc
				adc TmpByte
				sta TmpByte
				rts
*--------------------------------------
				.INB usr/src/bin/edit.s.buf
				.INB usr/src/bin/edit.s.ctrl
				.INB usr/src/bin/edit.s.dlg
				.INB usr/src/bin/edit.s.file
				.INB usr/src/bin/edit.s.scrn
*--------------------------------------
CS.END
SEQS			.EQ *
SEQ.BAR			.AZ "\e[7m\e[37;40m"
SEQ.DLG			.AS "\e[30;46m"
				.DA #C.SO,#'x',#C.SI
				.DA #0
SEQ.DLG.RIGHT	.AS "\e[37;40m"
				.DA #C.SO,#'x',#C.SI
				.DA #0
SEQ.DLG.LBL		.AZ "\e[0m\e[30;46m"
SEQ.DLG.TB		.AZ "\e[0m\e[93;44m"
SEQ.DLG.BUT		.AZ "\e[7m\e[93;44m"
SEQ.EDIT		.AS "\e[0m\e[93;44m"	+CEOL
SEQ.CEOL		.AZ "\e[K"
SEQ.NORM		.AZ "\e[0m"
SEQ.INV			.AZ "\e[7m"
SEQ.CURSAVE		.AZ "\e7"
SEQ.CURRESTORE	.AZ "\e8"
*--------------------------------------
SEQ.RESET		.AZ "\ec"
SEQ.INIT		.AS "\ec\e(B\e)0"
SEQ.SCROLLRGN	.AZ "\e[?7l\e[2;%dr"
SEQ.SCROLLCURUP	.AS "\e[?7l\e[%d;%dr"
SEQ.SCROLLUP	.AZ "\eD"
SEQ.SCROLLCURDN	.AS "\e[?7l\e[%d;%dr"
SEQ.SCROLLDN	.AZ "\eM"
*--------------------------------------
MSG.DETECT		.AZ "Querying term caps...\e[999;999H\e[6n"
MSG.TOPBAR		.AZ "A2osX Edit %d.%d:%s  (%s)"
MSG.TXTCR		.AZ "TXT/CR"
MSG.TXTCRLF		.AZ "TXT/CRLF"
MSG.TXTASM		.AZ "S-C/ASM"
MSG.STATUSBAR	.AZ "Press Ctrl-A For Help    Len:%5D  Pos:%5D  Col:%3d  Line:%5D"
MSG.STATUSBAR.H	.AZ "Press any key to exit this screen "
MSG.STATUSBAR.U	.AZ "Quit without Saving [Y/N] ? "
MSG.STATUSBAR.S	.AZ "%s Saved."
MSG.STATUSBAR.E	.AZ "Error:%h"
MSG.GOTOXY		.AZ "\e[%d;%dH"
MSG.HELPLINE	.AZ "\e[0m\e[93;44m%S\e[K"
MSG.HELP		>PSTR "All commands:"
				>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/Replace..."
				>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 next"
				>PSTR "  Ctrl-S : Save file..."
				>PSTR "  Ctrl-T : Go to top of file"
				>PSTR "  Ctrl-V : Paste 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 : Erase char under cursor"
				.HS 00
*--------------------------------------
MSG.NEWFILE		.AZ "newfile"
EscChars		.AS "DBAC"
EscChars.Cnt	.EQ *-EscChars
EscAscii		.HS 080A0B15
*--------------------------------------
S.DLG.Size		.EQ 0
S.DLG.X			.EQ 1
S.DLG.Y			.EQ 2
S.DLG.W			.EQ 3
S.DLG.H			.EQ 4
S.DLG.Title		.EQ 5
S.DLG.Status	.EQ 6
S.DLG.Focus		.EQ 7
S.DLG.Ctrls		.EQ 8
S.DLG.Ctrl.LBL		.EQ 0
S.DLG.Ctrl.TB		.EQ 2
S.DLG.Ctrl.OL		.EQ 4
S.DLG.Ctrl.BUT		.EQ 6
*--------------------------------------
DLG.SAVE		.DA #DLG.SAVE.LEN		Size
				.DA #0					X
				.DA #0					Y
				.DA #70					W
				.DA #11					H
				.DA #DLG.SAVE.T-DLG.SAVE	Title
				.DA #DLG.SAVE.S-DLG.SAVE	Status

				.DA #9					Focus
				.DA #DLG.SAVE.1-DLG.SAVE
				.DA #DLG.SAVE.2-DLG.SAVE
				.DA #DLG.SAVE.3-DLG.SAVE
				.DA #DLG.SAVE.4-DLG.SAVE
				.DA #DLG.SAVE.5-DLG.SAVE
				.DA #DLG.SAVE.6-DLG.SAVE
				.DA #DLG.SAVE.7-DLG.SAVE
				.DA #DLG.SAVE.8-DLG.SAVE
				.DA #0

DLG.SAVE.1		.DA #S.DLG.Ctrl.LBL,#2,#2
				.AZ "Filename :"

DLG.SAVE.2		.DA #S.DLG.Ctrl.TB,#2,#3
				.DA #0,#64,#hFileName	CURPOS,MAXCHAR,hMem
				
DLG.SAVE.3		.DA #S.DLG.Ctrl.LBL,#2,#5
				.AZ "Filetype :"
				
DLG.SAVE.4		.DA #S.DLG.Ctrl.OL,#2,#6
				.DA #18					Ctrl-R
				.DA #FileType
				.DA #0
				.AZ "TXT/CR"

DLG.SAVE.5		.DA #S.DLG.Ctrl.OL,#13,#6
				.DA #12					Ctrl-L
				.DA #FileType
				.DA #2
				.AZ "TXT/CRLF"

DLG.SAVE.6		.DA #S.DLG.Ctrl.OL,#26,#6
				.DA #1					Ctrl-A
				.DA #FileType
				.DA #4
				.AZ "S-C/ASM"
				
DLG.SAVE.7		.DA #S.DLG.Ctrl.BUT,#40,#8
				.DA #C.CR
				.AZ "  Save  "

DLG.SAVE.8		.DA #S.DLG.Ctrl.BUT,#52,#8
				.DA #3					Ctrl-C
				.AZ " Cancel "				
				
DLG.SAVE.T		.AZ "Save As..."		Title
DLG.SAVE.S		.AZ "CR:Save, Ctrl-R/L/A:Change Type, Ctrl-C:Cancel"
DLG.SAVE.LEN	.EQ *-DLG.SAVE
*--------------------------------------
DLG.FIND		.DA #DLG.FIND.LEN		Size
				.DA #0					X
				.DA #0					Y
				.DA #70					W
				.DA #11					H
				.DA #DLG.FIND.T-DLG.FIND	Title
				.DA #DLG.FIND.S-DLG.FIND	Status

				.DA #9					Focus
				.DA #DLG.FIND.1-DLG.FIND
				.DA #DLG.FIND.2-DLG.FIND
				.DA #DLG.FIND.3-DLG.FIND
				.DA #DLG.FIND.4-DLG.FIND
				.DA #DLG.FIND.5-DLG.FIND
				.DA #DLG.FIND.6-DLG.FIND
				.DA #0

DLG.FIND.1		.DA #S.DLG.Ctrl.LBL,#2,#2
				.AZ "Find :"

DLG.FIND.2		.DA #S.DLG.Ctrl.TB,#2,#3
				.DA #0,#64,#hFind
				
DLG.FIND.3		.DA #S.DLG.Ctrl.LBL,#2,#5
				.AZ "Replace :"
				
DLG.FIND.4		.DA #S.DLG.Ctrl.TB,#2,#6
				.DA #0,#64,#hReplace
				
DLG.FIND.5		.DA #S.DLG.Ctrl.BUT,#40,#8
				.DA #C.CR
				.AZ "  Find  "

DLG.FIND.6		.DA #S.DLG.Ctrl.BUT,#52,#8
				.DA #3					Ctrl-C
				.AZ " Cancel "				
				
DLG.FIND.T		.AZ "Find/Replace..."	Title
DLG.FIND.S		.AZ "CR:Find, Ctrl-C:Cancel"
DLG.FIND.LEN	.EQ *-DLG.FIND
*--------------------------------------
				.DUMMY
				.OR 0
DS.START
EscBuffer		.BS 16

bEscMode		.BS 1
bExit			.BS 1
bUnSaved		.BS 1
bUpdateTop		.BS 1
bUpdateStatus	.BS 1

hFileName		.BS 1
FileType		.BS 1

hFind			.BS 1
hReplace		.BS 1

hLineBuf		.BS 1
LineBufBase		.BS 2

hBuf			.BS 1
BufBase			.BS 2
hBufBackup		.BS 1
hClipBoard		.BS 1
ClipBoardLen	.BS 2

SelStart		.BS 2
SelEnd			.BS 2

ScreenW			.BS 1
ScreenH			.BS 1
ViewPortH		.BS 1
ViewPortHm1		.BS 1
FileX			.BS 1
FileY			.BS 2
ScreenX			.BS 1
ScreenY			.BS 2
CurX			.BS 1
CurY			.BS 1

hDLG			.BS 1

STATBUF			.BS S.STAT
DS.END
				.ED
*--------------------------------------
MAN
SAVE usr/src/bin/edit.s
ASM
