NEW AUTO 3,1 .LIST OFF .OP 65C02 .OR $2000 .TF bin/edit *-------------------------------------- FILEBUF.SIZE .EQ 2048 *-------------------------------------- .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.TERMCAP .DA MSG.TERMCAP L.MSG.TOPBAR .DA MSG.TOPBAR L.MSG.FILETYPES .DA MSG.TXTCR .DA MSG.TXTCRLF .DA MSG.ASM 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.TERMCAP >PUSHBI 0 >SYSCALL PrintF Send Query for term W & H bcs CS.INIT.RTS .1 jsr GetCh bcs CS.INIT.RTS * beq .11 * >SYSCALL PutChar * bcs CS.INIT.RTS .11 >LDA.G ScreenW Wait for Response from terminal for W & H beq .1 jsr SCRN.Init >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.... 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.Repaint bcs CS.RUN.RTS jsr CS.RUN.GetBuf64 bcs CS.RUN.RTS >STA.G hFind jsr CS.RUN.GetBuf64 bcs CS.RUN.RTS >STA.G hReplace *-------------------------------------- CS.RUN.LOOP jsr GetCh bcs CS.RUN.RTS I/O error beq .8 jsr CS.RUN.LOOP.CharIn bcs .9 .8 >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.RUN.LOOP.CharIn cmp #C.DEL bne .1 jmp Ctrl.DEL .1 cmp #C.SPACE bcc .2 jsr BUF.InsertA bcs .9 jsr SCRN.UpdateCurrentEOL bcs .9 jmp Ctrl.FS .2 asl tax jmp (J.CTRL,x) .9 rts *-------------------------------------- CS.RUN.GetBuf64 >LDYAI 64 >SYSCALL GetMem bcs .9 >STYA ZPPTR1 lda #0 sta (ZPPTR1) txa .9 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 .7 ldy #hBuf jsr .7 ldy #hBufBackup jsr .7 ldy #hClipBoard jsr .7 ldy #hFileName jsr .7 ldy #hFind jsr .7 ldy #hReplace .7 lda (pData),y beq .8 >SYSCALL FreeMem .8 clc rts *-------------------------------------- GetCh >SYSCALL GetChar bcs .9 cmp #C.CR bne GetCh.1 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 * clc .9 rts *-------------------------------------- GetCh.1 tax >LDA.G bEscMode bmi .1 cpx #C.ESC bne .8 lda #$ff >STA.G bEscMode inc clc rts .1 >LDA.G bCSIMode bmi .11 cpx #'[' \e[ ? bne GetCh.Esc lda #$ff >STA.G bCSIMode inc sta (pData) #EscBufferPtr clc rts *-------------------------------------- .11 lda (pData) #EscBufferPtr cmp #15 bcc .10 .19 >STZ.G bEscMode >STA.G bCSIMode clc rts .10 inc sta (pData) tay txa sta (pData),y cmp #64 bcs GetCh.CSI ldx #0 .8 txa clc rts *-------------------------------------- GetCh.Esc >STZ.G bEscMode GetCh.Esc1 txa ldx #EscChars.Cnt-1 .1 cmp EscChars,x beq .2 dex bpl .1 lda #0 clc rts .2 lda EscAscii,x clc rts *-------------------------------------- * \e[A UP * \e[B DOWN * \e[C FOWARD * \e[D BACK * \e[xxx;yyyR DSR ("\e[I6n" reply) *-------------------------------------- GetCh.CSI >STZ.G bEscMode >STA.G bCSIMode cpx #'R' Response to cursor position query? beq .3 >DEBUG bra GetCh.Esc1 .3 stz TmpByte ldy #0 .4 iny lda (pData),y cmp #';' beq .5 jsr GetCh.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 GetCh.TmpByte10pA bra .6 .7 lda TmpByte >STA.G ScreenW .8 lda #0 clc rts *-------------------------------------- GetCh.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 .CZ "\e[7m\e[37;40m" SEQ.DLG.BAR .CS "\e[0m\e[37;40m" .DA #C.SO,#'x',#C.SI .CZ "\e[7m\e[37;40m" SEQ.DLG .CS "\e[30;46m" .DA #C.SO,#'x',#C.SI .DA #0 SEQ.DLG.VBAR .CS "\e[37;40m" .DA #C.SO,#'x',#C.SI .DA #0 SEQ.DLG.LBL .CZ "\e[0m\e[30;46m" SEQ.DLG.TB .CZ "\e[0m\e[93;44m" SEQ.DLG.BUT .CZ "\e[7m\e[93;44m" SEQ.EDIT .CS "\e[0m\e[93;44m" +CEOL SEQ.CEOL .CZ "\e[K" SEQ.NORM .CZ "\e[0m" SEQ.INV .CZ "\e[7m" SEQ.CURSAVE .CZ "\e7" SEQ.CURRESTORE .CZ "\e8" *-------------------------------------- SEQ.RESET .CZ "\ec" SEQ.INIT .CS "\ec\e(B\e)0" SEQ.SCROLLRGN .CZ "\e[?7l\e[2;%dr" SEQ.SCROLLCURUP .CS "\e[?7l\e[%d;%dr" SEQ.SCROLLUP .CZ "\eD" SEQ.SCROLLCURDN .CS "\e[?7l\e[%d;%dr" SEQ.SCROLLDN .CZ "\eM" *-------------------------------------- MSG.TERMCAP .CZ "\r\n\e[999;999H\e[6n" MSG.TOPBAR .CZ "A2osX Edit %d.%d:%s (%s)" MSG.TXTCR .CZ "TXT/CR" MSG.TXTCRLF .CZ "TXT/CRLF" MSG.ASM .CZ "ASM" MSG.STATUSBAR .CZ "Press Ctrl-A For Help Len:%5D Pos:%5D Col:%3d Line:%5D" MSG.STATUSBAR.H .CZ "Press any key to exit this screen " MSG.STATUSBAR.U .CZ "Quit without Saving [Y/N] ? " MSG.STATUSBAR.S .CZ "%s Saved." MSG.STATUSBAR.E .CZ "Error:%h" MSG.GOTOXY .CZ "\e[%d;%dH" MSG.HELPLINE .CZ "\e[0m\e[93;44m%S\e[K" *-------------------------------------- MSG.HELP .PS "All commands:" .PS "-------------" .PS " Ctrl-A : This help screen" .PS " Ctrl-B : Mark beginning of selection" .PS " Ctrl-C : Copy selection to clipboard" .PS " Ctrl-D : Delete selection" .PS " Ctrl-E : Mark end of selection" .PS " Ctrl-F : Find/Replace..." .PS " Ctrl-G : Go to start of current line" .PS " Ctrl-L : Go to end of current line" .PS " Ctrl-N : Find next" .PS " Ctrl-O : Page up" .PS " Ctrl-P : Page down" .PS " Ctrl-Q : Quit" .PS " Ctrl-R : Replace next" .PS " Ctrl-S : Save file..." .PS " Ctrl-T : Go to top of file" .PS " Ctrl-V : Paste clipboard at cursor position" .PS " Ctrl-W : Erase current line" .PS " Ctrl-X : Cut block to clipboard" .PS " Ctrl-Y : Go to end of file" .PS " Ctrl-Z : Erase char under cursor" .HS 00 *-------------------------------------- MSG.NEWFILE .AZ "newfile" EscChars .AS "DABC" EscChars.Cnt .EQ *-EscChars EscAscii .DA #C.BS,#C.VT,#C.LF,#C.FS *-------------------------------------- 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 #1 .AZ "TXT/CRLF" DLG.SAVE.6 .DA #S.DLG.Ctrl.OL,#26,#6 .DA #1 Ctrl-A .DA #FileType .DA #2 .AZ "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,#63,#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,#63,#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 bCSIMode .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