diff --git a/femto.tal b/femto.tal index 25c1995..bdf4480 100644 --- a/femto.tal +++ b/femto.tal @@ -69,11 +69,72 @@ ( zero page ) |0000 +@term [ + &cols $2 ( zzz ) + &rows $2 ( zzz ) + &lmargin $2 ( zzz ) +] + +@config [ + &tab-width $2 ( how many spaces to display tab chars ) + &insert-tabs $1 ( tab key inserts tabs when true ) + &color $2 ( digits of highlight color in reverse order ) +] + +@buffer [ + &limit $2 ( last byte of actual data (not including \0) + 1 ) + &offset $2 ( first byte of data visible in terminal ) + &line-count $2 ( total number of lines in file ) + &line-offset $2 ( first line of text visible in terminal ) +] + +( relative cursor positions, e.g. 0 to cols-1 ) +@cursor [ + &col $2 ( current column value 0-n (may exceed lenght of row) ) + &row $2 ( current relative row value, 0-(height-1) ) +] + +@state [ + &saw-esc $1 ( did we just see ESC? ) +] + +( prompt uses .tmp/pos and .tmp/data to track user input ) +@prompt [ + &active $1 ( is prompt currently active? ) + &vector $2 ( what code to run when user responds ) + &string $20 ( string to print for the prompt ) +] + +@tmp [ + &pos $2 ( temporary pointer to address when reading data ) + &data $40 ( small scratch pad when reading data ) +] + ( startup ) -|0100 ;startup JMP2 +|0100 + ;init-zero-page JSR2 + ;startup JMP2 + +( intialize zero page variables ) +( ) +( everything not specified starts as zero ) +@init-zero-page ( -> ) + #0050 .term/cols STZ2 + #0018 .term/rows STZ2 + #0006 .term/lmargin STZ2 + + #0004 .config/tab-width STZ2 + #01 .config/insert-tabs STZ + #3333 .config/color STZ2 + + ;data .buffer/offset STZ2 + JMP2r ( code to run on startup ) -@startup ;read-filename .Console/vector DEO2 BRK +@startup + ;filename .tmp/pos STZ2 + ;read-filename .Console/vector DEO2 + BRK ( ERROR HANDLING ) @@ -93,93 +154,91 @@ @open-file ( filename* -> ) .File/name DEO2 #f000 .File/length DEO2 - ;buffer/data .File/read DEO2 + ;data .File/read DEO2 .File/success DEI2 #0000 GTH2 ,&ok JCN ;messages/input-error ;print JSR2 nl quit! ( calculate buffer limit address using start + size ) - &ok .File/success DEI2 ;buffer/data ADD2 ;buffer/limit STA2 + &ok .File/success DEI2 ;data ADD2 .buffer/limit STZ2 JMP2r @setup-terminal-size ( -> ) ( ;setup-80x24 JMP2 ) #03e7 #03e7 ;term-move-cursor JSR2 ;term-get-cursor-position JSR2 - ;tmp/data ;tmp/pos STA2 + ;tmp/data .tmp/pos STZ2 ;receive-terminal-size .Console/vector DEO2 JMP2r @receive-terminal-size ( -> ) - .Console/read DEI ;tmp/pos LDA2 STA - ;tmp/pos LDA2 INC2 ;tmp/pos STA2 + .Console/read DEI .tmp/pos LDZ2 STA + .tmp/pos LDZ2 INC2 .tmp/pos STZ2 .Console/read DEI LIT 'R EQU ;parse-terminal-size JCN2 BRK @parse-terminal-size ( -> ) LIT2r 0000 LIT2r 0000 - ;tmp/data LDAk #1b NEQ ,&parse-error JCN ( i ) INC2 - LDAk LIT '[ NEQ ,&parse-error JCN ( i ) INC2 + .tmp/data LDZk #1b NEQ ,&parse-error JCN ( i ) INC + LDZk LIT '[ NEQ ,&parse-error JCN ( i ) INC &loop - LDAk LIT '; EQU ,&parse-col JCN + LDZk LIT '; EQU ,&parse-col JCN LIT2r 000a MUL2r - LDAk LIT '0 SUB #00 SWP STH2 ADD2r - INC2 ,&loop JMP + LDZk LIT '0 SUB #00 SWP STH2 ADD2r + INC ,&loop JMP &parse-col - INC2 STH2r #0002 SUB2 ;term/rows STA2 + INC STH2r #0002 SUB2 .term/rows STZ2 &loop2 - LDAk LIT 'R EQU ,&done JCN + LDZk LIT 'R EQU ,&done JCN LIT2r 000a MUL2r - LDAk LIT '0 SUB #00 SWP STH2 ADD2r - INC2 ,&loop2 JMP + LDZk LIT '0 SUB #00 SWP STH2 ADD2r + INC ,&loop2 JMP &done - STH2r ;term/cols STA2 POP2 + STH2r .term/cols STZ2 POP ;on-key .Console/vector DEO2 ;draw-all JSR2 BRK - &parse-error POP2 ;tmp/data LDA2 + &parse-error POP .tmp/data LDZ2 ;term-size-parse-error ;error! JMP2 @setup-linecount ( -> ) - ;buffer/data LIT2r 0001 - &loop DUP2 ;buffer/limit LDA2 EQU2 ,&done JCN + ;data LIT2r 0001 + &loop DUP2 .buffer/limit LDZ2 EQU2 ,&done JCN LDAk #00 EQU ,&done JCN LDAk #0a NEQ JMP INC2r INC2 ,&loop JMP &done POP2 - STH2r ;buffer/line-count STA2 + STH2r .buffer/line-count STZ2 JMP2r @setup-80x24 ( -> ) - #0050 ;term/cols STA2 - #0014 ;term/rows STA2 + #0050 .term/cols STZ2 + #0014 .term/rows STZ2 ;on-key .Console/vector DEO2 ;draw-all JSR2 JMP2r @read-filename ( -> ) #12 DEI #0a EQU ,&execute JCN ( did we read \n ? ) - #12 DEI ;tmp/pos LDA2 STA ( no, so save in buffer ) - ;tmp/pos LDA2 INC2 ;tmp/pos STA2 ( pos++ ) + #12 DEI .tmp/pos LDZ2 STA ( no, so save in buffer ) + .tmp/pos LDZ2 INC2 .tmp/pos STZ2 ( pos++ ) BRK ( return ) &execute ( we saw a newline, so do something ) - #00 ;tmp/pos LDA2 STA ( null terminate str ) - ;tmp/data ;tmp/pos STA2 ( reset pos ) - ;tmp/data ;filename ;str-copy JSR2 ( open file ) + #00 .tmp/pos LDZ2 STA ( null terminate str ) ;filename ;open-file JSR2 ( open file ) ;setup-linecount JSR2 ( determine # of lines ) ;setup-terminal-size JSR2 ( detect terminal dimensions ) BRK @bol ( -> ) - #0000 ;cursor/col STA2 + #0000 .cursor/col STZ2 ;draw-statusbar JSR2 ;draw-cursor JSR2 BRK ( FIXME: handle long lines ) @eol ( -> ) - ;cur-line JSR2 ;line-len JSR2 ;cursor/col STA2 + ;cur-line JSR2 ;line-len JSR2 .cursor/col STZ2 ;draw-statusbar JSR2 ;draw-cursor JSR2 BRK @@ -187,10 +246,10 @@ @forward ( -> ) ;cur-pos JSR2 ;last-pos JSR2 GTH2 ,&skip JCN ;cur-col JSR2 ;cur-last JSR2 GTH2 ,&next-line JCN - ;cur-col JSR2 INC2 ;cursor/col STA2 + ;cur-col JSR2 INC2 .cursor/col STZ2 ;draw-statusbar JSR2 ;draw-cursor JSR2 ,&skip JMP - &next-line #0000 ;cursor/col STA2 + &next-line #0000 .cursor/col STZ2 ;inc-row JSR2 ;ensure-visible-cursor JSR2 ;draw-cursor JSR2 @@ -199,7 +258,7 @@ ( FIXME: handle long lines ) @back ( -> ) ;cur-col JSR2 #01 LTH ,&skip JCN - ;cur-col JSR2 #0001 SUB2 ;cursor/col STA2 + ;cur-col JSR2 #0001 SUB2 .cursor/col STZ2 ;draw-statusbar JSR2 ;draw-cursor JSR2 &skip BRK @@ -226,33 +285,33 @@ @page-up ( -> ) ;bof-is-visible JSR2 ,&at-bof JCN - ;buffer/line-offset LDA2 - ;term/rows LDA2 #0003 SUB2 + .buffer/line-offset LDZ2 + .term/rows LDZ2 #0003 SUB2 LTH2k ,&near-bof JCN - SUB2 DUP2 ;abs-line JSR2 ;buffer/offset STA2 - ;buffer/line-offset STA2 + SUB2 DUP2 ;abs-line JSR2 .buffer/offset STZ2 + .buffer/line-offset STZ2 ;ensure-visible-cursor JSR2 ;draw-all JSR2 BRK &near-bof POP2 POP2 ;zero-row JSR2 - #0000 ;cursor/col STA2 + #0000 .cursor/col STZ2 ;draw-all JSR2 BRK &at-bof ;zero-row JSR2 - #0000 ;cursor/col STA2 + #0000 .cursor/col STZ2 ;draw-cursor JSR2 BRK @page-down ;eof-is-visible JSR2 ,&near-eof JCN - ;buffer/line-offset LDA2 - ;term/rows LDA2 ADD2 #0003 SUB2 - DUP2 ;abs-line JSR2 ;buffer/offset STA2 - ;buffer/line-offset STA2 + .buffer/line-offset LDZ2 + .term/rows LDZ2 ADD2 #0003 SUB2 + DUP2 ;abs-line JSR2 .buffer/offset STZ2 + .buffer/line-offset STZ2 ;ensure-visible-cursor JSR2 ;draw-all JSR2 BRK &near-eof - ;buffer/line-count LDA2 #0001 SUB2 ;set-abs-row JSR2 - ;cur-len JSR2 ;cursor/col STA2 + .buffer/line-count LDZ2 #0001 SUB2 ;set-abs-row JSR2 + ;cur-len JSR2 .cursor/col STZ2 ;draw-cursor JSR2 BRK @quit quit! @@ -261,19 +320,19 @@ @insert ( c^ -> ) ;cur-pos JSR2 ;shift-right JSR2 - ;cur-col JSR2 INC2 ;cursor/col STA2 + ;cur-col JSR2 INC2 .cursor/col STZ2 ;draw-all JSR2 BRK @insert-tab ( -> ) - ;config/insert-tabs LDA ,&use-tabs JCN - #0000 ;config/tab-width LDA2 SUB2 + .config/insert-tabs LDZ ,&use-tabs JCN + #0000 .config/tab-width LDZ2 SUB2 &loop DUP2 #0000 EQU2 ,&done JCN #20 ;cur-pos JSR2 ;shift-right JSR2 INC2 ,&loop JMP &done - ;cur-col JSR2 ;config/tab-width LDA2 ADD2 ;cursor/col STA2 + ;cur-col JSR2 .config/tab-width LDZ2 ADD2 .cursor/col STZ2 ;draw-all JSR2 BRK &use-tabs #09 ;insert JMP2 @@ -281,37 +340,37 @@ ( TODO: handle last line ) @newline ( c^ -> ) #0a ;cur-pos JSR2 ;shift-right JSR2 - #0000 ;cursor/col STA2 + #0000 .cursor/col STZ2 ;inc-row JSR2 - ;buffer/line-count LDA2k INC2 SWP2 STA2 + .buffer/line-count LDZ2k INC2 SWP2 STA2 ;ensure-visible-cursor JSR2 ;draw-all JSR2 BRK @at-buffer-start ( -> bool^ ) - ;cur-pos JSR2 ;buffer/data EQU2 JMP2r + ;cur-pos JSR2 ;data EQU2 JMP2r @at-line-start ( -> bool^ ) - ;cursor/col LDA2 #0000 EQU2 JMP2r + .cursor/col LDZ2 #0000 EQU2 JMP2r @bof-is-visible ( -> bool^ ) - ;buffer/line-offset LDA2 #0000 EQU2 JMP2r + .buffer/line-offset LDZ2 #0000 EQU2 JMP2r @eof-is-visible ( -> bool^ ) - ;buffer/line-offset LDA2 ;term/rows LDA2 ADD2 INC2 - ;buffer/line-count LDA2 + .buffer/line-offset LDZ2 .term/rows LDZ2 ADD2 INC2 + .buffer/line-count LDZ2 GTH2 JMP2r @backspace ( -> ) ;at-buffer-start JSR2 ,&skip JCN ;at-line-start JSR2 ,&prev-line JCN - ;cur-col JSR2 #0001 SUB2 ;cursor/col STA2 + ;cur-col JSR2 #0001 SUB2 .cursor/col STZ2 ,&finish JMP &prev-line ;cur-abs-row JSR2 #0001 SUB2 ;jump-to-line JSR2 ( TODO: fix weird eof behavior ) - ;cur-len JSR2 ;cursor/col STA2 - ;buffer/line-count LDA2k #0001 SUB2 SWP2 STA2 + ;cur-len JSR2 .cursor/col STZ2 + .buffer/line-count LDZ2k #0001 SUB2 SWP2 STA2 &finish ;cur-pos JSR2 ;shift-left JSR2 ;draw-all JSR2 @@ -323,29 +382,29 @@ ;cur-pos JSR2 LDAk STH ( cur [c] ) ;shift-left JSR2 ( [c] ) STHr #0a NEQ ,¬-newline JCN - ;buffer/line-count LDA2k #0001 SUB2 SWP2 STA2 + .buffer/line-count LDZ2k #0001 SUB2 SWP2 STA2 ¬-newline ;draw-all JSR2 &skip BRK @escape ( -> ) - #01 ;saw-esc STA BRK + #01 .state/saw-esc STZ BRK @goto-end ( -> ) ;more-than-one-screen JSR2 ,&large JCN - ;buffer/line-count LDA2 #0001 SUB2 ;cursor/row STA2 + .buffer/line-count LDZ2 #0001 SUB2 .cursor/row STZ2 #0000 ,&continue JMP &large - ;term/rows LDA2 #0001 SUB2 ;cursor/row STA2 - ;buffer/line-count LDA2 ;term/rows LDA2 SUB2 + .term/rows LDZ2 #0001 SUB2 .cursor/row STZ2 + .buffer/line-count LDZ2 .term/rows LDZ2 SUB2 &continue - DUP2 ;buffer/line-offset STA2 - ;abs-line JSR2 ;buffer/offset STA2 - ;cur-len JSR2 ;cursor/col STA2 + DUP2 .buffer/line-offset STZ2 + ;abs-line JSR2 .buffer/offset STZ2 + ;cur-len JSR2 .cursor/col STZ2 ;draw-all JSR2 BRK @goto-start ( -> ) ;zero-row JSR2 - #0000 ;cursor/col STA2 + #0000 .cursor/col STZ2 ;draw-all JSR2 BRK @@ -354,10 +413,10 @@ ;draw-all JSR2 BRK @jump-to-line ( n* -> ) - ;term/rows LDA2 #0002 DIV2 LTH2k ( n rows/2 nlines-rows? ) ,&late JCN ( n n-rows/2 lines-rows ) POP2 ,&finish JMP @@ -367,14 +426,14 @@ NIP2 &finish ( n o ) SUB2k STH2 DUP2 ( n o o [n-o] ) - ;buffer/line-offset STA2 ( n o [n-o] ) - ;abs-line JSR2 ;buffer/offset STA2 ( n [n-o] ) - #0000 ;cursor/col STA2 ( n [n-o] ) - POP2 STH2r ;cursor/row STA2 + .buffer/line-offset STZ2 ( n o [n-o] ) + ;abs-line JSR2 .buffer/offset STZ2 ( n [n-o] ) + #0000 .cursor/col STZ2 ( n [n-o] ) + POP2 STH2r .cursor/row STZ2 JMP2r -@ensure-visible-cursor - ;cur-rel-row JSR2 ;term/rows LDA2 LTH2 ,&noop JCN +@ensure-visible-cursor + ;cur-rel-row JSR2 .term/rows LDZ2 LTH2 ,&noop JCN ;cur-abs-row JSR2 ;jump-to-line JSR2 ;draw-all JSR2 &noop JMP2r @@ -389,7 +448,7 @@ ( M-n and M-p for next/previous paragraph ) ( maybe M-% for search&replace ) @on-key-escaped ( -> ) - #00 ;saw-esc STA + #00 .state/saw-esc STZ .Console/read DEI LIT '< EQU ( M-< ) ;goto-start JCN2 .Console/read DEI LIT '> EQU ( M-> ) ;goto-end JCN2 .Console/read DEI LIT 'g EQU ( M-g ) ;goto-line JCN2 @@ -397,14 +456,14 @@ BRK @move-to-message-line ( -> ) - #0002 ;term/rows LDA2 #0002 ADD2 ;term-move-cursor JMP2 + #0002 .term/rows LDZ2 #0002 ADD2 ;term-move-cursor JMP2 ( TODO: filename prmopt ) @save ( -> ) - ;buffer/limit LDA2 ;buffer/data SUB2 STH2 ( [size] ) + .buffer/limit LDZ2 ;data SUB2 STH2 ( [size] ) ;tmp-file-name .File/name DEO2 STH2kr .File/length DEO2 - ;buffer/data .File/write DEO2 + ;data .File/write DEO2 ;move-to-message-line JSR2 .File/success DEI2 STH2r EQU2 ( ok? ) ,&ok JCN @@ -418,7 +477,7 @@ ( TODO: C-s for search ) ( TODO: tab input? ) @on-key - ;saw-esc LDA ;on-key-escaped JCN2 + .state/saw-esc LDZ ;on-key-escaped JCN2 .Console/read DEI #01 EQU ( C-a ) ;bol JCN2 .Console/read DEI #02 EQU ( C-b ) ;back JCN2 .Console/read DEI #04 EQU ( C-d ) ;delete JCN2 @@ -461,28 +520,28 @@ ansi LIT '2 emit LIT 'J emit JMP2r @draw-cursor ( -> ) - ;cur-w-col JSR2 ;term/lmargin LDA2 ADD2 + ;cur-w-col JSR2 .term/lmargin LDZ2 ADD2 ;cur-rel-row JSR2 ;term-move-cursor JMP2 @draw-statusbar ( -> ) - #0000 ;term/rows LDA2 ;term-move-cursor JSR2 + #0000 .term/rows LDZ2 ;term-move-cursor JSR2 ;emit-color-reverse JSR2 LIT2r 2018 - ;term/cols LDA2 #0000 + .term/cols LDZ2 #0000 &loop GTH2k ,&continue JCN ,&done JMP &continue DEOkr INC2 ,&loop JMP &done POP2 POP2 POP2r - #0000 ;term/rows LDA2 ;term-move-cursor JSR2 + #0000 .term/rows LDZ2 ;term-move-cursor JSR2 ;messages/saved ;print JSR2 ;filename ;print JSR2 #20 emit LIT '[ emit - ;buffer/limit LDA2 ;buffer/data SUB2 ;emit-dec2 JSR2 + .buffer/limit LDZ2 ;data SUB2 ;emit-dec2 JSR2 ;messages/bytes ;print JSR2 #20 emit - ;buffer/line-count LDA2 ;emit-dec2 JSR2 + .buffer/line-count LDZ2 ;emit-dec2 JSR2 ;messages/lines ;print JSR2 #20 emit LIT '( emit @@ -496,12 +555,12 @@ @draw-linenum ( n* -> ) ;emit-reset JSR2 - ansi ;config/color LDA2 emit emit LIT 'm emit + ansi .config/color LDZ2 emit emit LIT 'm emit ;emit-dec2-pad JSR2 ansi LIT2 'm '0 emit emit JMP2r @emit-tab ( -> ) - #0000 ;config/tab-width LDA2 SUB2 + #0000 .config/tab-width LDZ2 SUB2 LIT2r 2018 &loop ORAk ,&next JCN POP2 POP2r JMP2r &next DEOkr INC2 ,&loop JMP @@ -516,23 +575,23 @@ ;emit-red JSR2 LIT '$ emit ;emit-reset JMP2 @emit-color-reverse ( -> ) - ansi ;config/color LDA2 emit emit LIT2 '7 '; emit emit LIT 'm emit JMP2r + ansi .config/color LDZ2 emit emit LIT2 '7 '; emit emit LIT 'm emit JMP2r @draw-all ( -> ) ;term-erase-all JSR2 #0000 #0000 ;term-move-cursor JSR2 - ;buffer/line-offset LDA2 STH2 LIT2r 0001 ( [k line-offset] ) - ;buffer/offset LDA2 + .buffer/line-offset LDZ2 STH2 LIT2r 0001 ( [k line-offset] ) + .buffer/offset LDZ2 &bol ADD2kr STH2r ;draw-linenum JSR2 - ;term/lmargin LDA2 INC2 ,&x STR2 + .term/lmargin LDZ2 INC2 ,&x STR2 ( TODO: use this for cursor-line highlighting and long line support ) -( STH2kr ;cursor/row LDA2 INC2 NEQ2 ,&loop JCN +( STH2kr .cursor/row LDZ2 INC2 NEQ2 ,&loop JCN ;emit-color-reverse JSR2 ) &loop ( offset [k line-offset] ) LDAk #00 EQU ,&eof JCN LDAk #0a EQU ,&eol JCN - ,&x LDR2 ;term/cols LDA2 + ,&x LDR2 .term/cols LDZ2 LTH2k ,&ok JCN GTH2 ,&skip JCN ;emit-red-dollar JSR2 ,&x LDR2 INC2 ,&x STR2 @@ -543,18 +602,18 @@ LDAk emit INC2 ,&x LDR2 INC2 ,&x STR2 ,&loop JMP &eol INC2r - STH2kr ;term/rows LDA2 GTH2 ,&done JCN + STH2kr .term/rows LDZ2 GTH2 ,&done JCN cr nl INC2 ,&bol JMP &do-tab ;emit-tab JSR2 INC2 - ;config/tab-width LDA2 ,&x LDR2 ADD2 ,&x STR2 + .config/tab-width LDZ2 ,&x LDR2 ADD2 ,&x STR2 ,&loop JMP [ &x $2 ] &eof ;emit-red JSR2 &eof-loop - STH2kr ;term/rows LDA2 GTH2 ,&done JCN + STH2kr .term/rows LDZ2 GTH2 ,&done JCN cr nl - ;term/lmargin LDA2 ;term-move-right JSR2 + .term/lmargin LDZ2 ;term-move-right JSR2 LIT '~ emit INC2r ,&eof-loop JMP &done POP2 POP2r POP2r @@ -606,7 +665,7 @@ @abs-line ( y* -> s* ) #0000 SWP2 SUB2 STH2 ( [-y] ) - ;buffer/data ( addr ) + ;data ( addr ) &newline ( addr [-y] ) STH2kr ORA ,&loop JCN ,&done JMP &loop ( addr [-y] ) @@ -620,7 +679,7 @@ ( line number relative to the offset, starting at 0 ) @rel-line ( y* -> s* ) #0000 SWP2 SUB2 STH2 ( [-y] ) - ;buffer/offset LDA2 ( addr* ) + .buffer/offset LDZ2 ( addr* ) STH2kr #0000 EQU2 ,&done JCN ( addr [-y] ) &newline ( addr [-y] ) STH2kr ORA ,&loop JCN ,&done JMP @@ -639,10 +698,10 @@ ;cur-line JSR2 ;cur-col JSR2 ADD2 JMP2r @cur-abs-row ( -> n* ) - ;cur-rel-row JSR2 ;buffer/line-offset LDA2 ADD2 JMP2r + ;cur-rel-row JSR2 .buffer/line-offset LDZ2 ADD2 JMP2r @last-abs-row ( -> n* ) - ;buffer/line-count LDA2 #0001 SUB2 JMP2r + .buffer/line-count LDZ2 #0001 SUB2 JMP2r @shift-right ( c^ addr* -> ) ROT STH ( addr [prev^] ) @@ -655,7 +714,7 @@ &done NIP2 DUP2 ( addr addr [prev^] ) STHr ROT ROT ( addr prev^ addr ) STA INC2 ( addr+1 ) - ;buffer/limit STA2 ( ) + .buffer/limit STZ2 ( ) JMP2r ( TODO: change last/addr order and GTH -> LTH to remove hack ) @@ -668,50 +727,50 @@ ROT ROT ( last addr+1 c1^ addr ) STA ,&loop JMP ( last addr+1 ) &done POP2 ( last ) - ;buffer/limit STA2 ( ) - #00 ;buffer/limit LDA2 STA ( ensure null termination ) + .buffer/limit STZ2 ( ) + #00 .buffer/limit LDZ2 STA ( ensure null termination ) JMP2r @cur-col ( -> col* ) - ;cursor/col LDA2 ;cur-len JSR2 ;min2 JMP2 + .cursor/col LDZ2 ;cur-len JSR2 ;min2 JMP2 @cur-w-col ( -> col* ) LIT2r 0000 ( [0] ) ;cur-line JSR2 DUP2 ;cur-col JSR2 ADD2 SWP2 ( lim s [0] ) &loop GTH2k ,&next JCN POP2 POP2 STH2r JMP2r - &next LDAk #09 EQU ,&tabs JCN INC2 INC2r ,&loop JMP - &tabs INC2 ;config/tab-width LDA2 STH2 ADD2r ,&loop JMP + &next LDAk #09 EQU ,&tabs JCN INC2 INC2r ,&loop JMP + &tabs INC2 .config/tab-width LDZ2 STH2 ADD2r ,&loop JMP @cur-rel-row ( -> row* ) - ;cursor/row LDA2 JMP2r + .cursor/row LDZ2 JMP2r @set-abs-row ( n* -> ) - ;buffer/line-offset LDA2 SUB2 ;cursor/row STA2 JMP2r + .buffer/line-offset LDZ2 SUB2 .cursor/row STZ2 JMP2r @set-rel-row ( n* -> ) - ;cursor/row STA2 JMP2r + .cursor/row STZ2 JMP2r @zero-row ( -> ) - ;buffer/data ;buffer/offset STA2 - #0000 ;buffer/line-offset STA2 - #0000 ;cursor/row STA2 + ;data .buffer/offset STZ2 + #0000 .buffer/line-offset STZ2 + #0000 .cursor/row STZ2 JMP2r @inc-row ( -> ) - ;cursor/row LDA2k INC2 SWP2 STA2 JMP2r + .cursor/row LDZ2k INC2 SWP2 STA2 JMP2r @dec-row ( -> ) - ;cursor/row LDA2k #0001 SUB2 SWP2 STA2 + .cursor/row LDZ2k #0001 SUB2 SWP2 STA2 @last-pos ( -> addr* ) - ;buffer/limit LDA2 #0001 SUB2 JMP2r + .buffer/limit LDZ2 #0001 SUB2 JMP2r @more-than-one-screen ( -> bool^ ) - ;buffer/line-count LDA2 ;term/rows LDA2 GTH2 JMP2r + .buffer/line-count LDZ2 .term/rows LDZ2 GTH2 JMP2r @fits-in-one-screen ( -> bool^ ) - ;buffer/line-count LDA2 ;term/rows LDA2 INC2 LTH2 JMP2r + .buffer/line-count LDZ2 .term/rows LDZ2 INC2 LTH2 JMP2r @mod-div ( x^ y^ -> x%d x/y ) DIVk STHk MUL SUB STHr JMP2r @@ -765,6 +824,7 @@ &do1 NIP ;emit-digit JSR2 DEOr JMP2r +( various string constants used as messages for the user ) @messages [ &input-error "input 20 "error 00 &bytes 20 "bytes, 00 &save-ok "saved 00 @@ -773,50 +833,6 @@ &saved "-- 20 00 &unsaved "** 20 00 ] -@tmp [ &pos :tmp/data - &data $100 ] +@filename $80 ( path to file being edited ) -@term [ &cols 0050 - &rows 0018 - &lmargin 0006 ] - -@prompt [ &vector $2 - &string $40 ] - -( COLORS ) -( ) -( SHORT STRING NAME ) -( 3033 "30" black ) -( 3133 "31" red ) -( 3233 "32" green ) -( 3333 "33" yellow ) -( 3433 "34" blue ) -( 3533 "35" magenta ) -( 3633 "36" cyan ) -( 3733 "37" white ) -( 3030 "00" default ) -( ) -( digits are reversed ) -( to emit from stack in ) -( last-in-first-out order ) -@config [ &tab-width 0004 - &insert-tabs 01 - &color 3333 ] - -( relative cursor positions, e.g. 0 to cols-1 ) -@cursor [ &col 0000 &row 0000 ] - -( did we just see ESC? ) -@saw-esc 00 - -( ) -@filename $80 - -( |1ffc ) -( offset is address of the first visible line ) -( size is total size of data in bytes ) -@buffer [ &limit 0000 - &offset :buffer/data - &line-count 0000 - &line-offset 0000 - &data $f000 ] +@data $f000 ( actual file data to be edited )