From df70eb084862eb488520993df53f10e7e68953ad Mon Sep 17 00:00:00 2001 From: d6 Date: Sat, 26 Mar 2022 15:29:00 -0400 Subject: [PATCH] converted to absolute cursor, fixed a lot of bugs --- femto.tal | 105 +++++++++++++++++++++++++----------------------------- 1 file changed, 48 insertions(+), 57 deletions(-) diff --git a/femto.tal b/femto.tal index 5f66815..be62f94 100644 --- a/femto.tal +++ b/femto.tal @@ -281,14 +281,10 @@ @up ( -> ) ;cur-abs-row JSR2 #0000 EQU2 ,&done JCN - ;cur-rel-row JSR2 #0001 LTH2 ,&screen-up JCN ;dec-row JSR2 + ;ensure-visible-cursor JSR2 ;draw-statusbar JSR2 &done ;draw-cursor JSR2 BRK - &screen-up - ;cur-abs-row JSR2 #0001 SUB2 - ;jump-to-line JSR2 - ;draw-all JSR2 BRK @down ( -> ) ;cur-abs-row JSR2 ;last-abs-row JSR2 EQU2 ,&done JCN @@ -297,31 +293,42 @@ ;draw-statusbar JSR2 &done ;draw-cursor JSR2 BRK +@center-view + ;term/rows LDZ2 INC2 #0002 DIV2 STH2k + .cursor/row LDZ2 LTH2 ,&standard JCN + POP2r + #0000 .buffer/line-offset STZ2 + ;data .buffer/offset STZ2 + ,&done JMP + &standard + .cursor/row LDZ2 STH2r SUB2 + DUP2 .buffer/line-offset STZ2 + ;abs-line JSR2 .buffer/offset STZ2 + &done + ;draw-all JSR2 BRK + @page-up ( -> ) - ;bof-is-visible JSR2 ,&at-bof JCN - .buffer/line-offset LDZ2 - .term/rows LDZ2 #0003 SUB2 - LTH2k ,&near-bof JCN - SUB2 DUP2 ;abs-line JSR2 .buffer/offset STZ2 - .buffer/line-offset STZ2 - ;ensure-visible-cursor JSR2 - ;draw-all JSR2 BRK - &near-bof POP2 POP2 + .term/rows LDZ2 #0002 SUB2 STH2k + .buffer/line-offset LDZ2 LTH2 ,&move-full JCN + POP2r ;zero-row JSR2 #0000 .cursor/col STZ2 + ,&done JMP + &move-full + .cursor/row LDZ2 STH2kr SUB2 .cursor/row STZ2 + .buffer/line-offset LDZ2 STH2r SUB2 + DUP2 .buffer/line-offset STZ2 + ;abs-line JSR2 .buffer/offset STZ2 + &done ;draw-all JSR2 BRK - &at-bof - ;zero-row JSR2 - #0000 .cursor/col STZ2 - ;draw-cursor JSR2 BRK @page-down ;eof-is-visible JSR2 ,&near-eof JCN - .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 + .term/rows LDZ2 #0002 SUB2 STH2k + .buffer/line-offset LDZ2 ADD2 + DUP2 .buffer/line-offset STZ2 + ;abs-line JSR2 .buffer/offset STZ2 + .cursor/row LDZ2 STH2r ADD2 .cursor/row STZ2 ;draw-all JSR2 BRK &near-eof .buffer/line-count LDZ2 #0001 SUB2 ;set-abs-row JSR2 @@ -411,23 +418,6 @@ ;delete JMP2 &skip BRK -( @backspace ( -> ) - #01 .state/modified STZ - ;at-buffer-start JSR2 ,&skip JCN - ;at-line-start JSR2 ,&prev-line JCN - ;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 STZ2 - .buffer/line-count LDZ2k #0001 SUB2 ROT STZ2 - &finish - ;cur-pos JSR2 ;shift-left JSR2 - ;draw-all JSR2 BRK - &skip - ;draw-cursor JSR2 BRK ) - @backspace-prompt ( -> ) #00 .tmp/pos LDZ2 #0001 SUB2 ( 0 pos-1 ) STH2k STA ( data[pos-1] <- 0 ) @@ -450,12 +440,11 @@ #01 .state/saw-esc STZ BRK @goto-end ( -> ) - ;more-than-one-screen JSR2 ,&large JCN - .buffer/line-count LDZ2 #0001 SUB2 .cursor/row STZ2 - #0000 ,&continue JMP - &large - .term/rows LDZ2 #0001 SUB2 .cursor/row STZ2 - .buffer/line-count LDZ2 .term/rows LDZ2 SUB2 + .buffer/line-count LDZ2 #0001 SUB2 .cursor/row STZ2 + .buffer/line-count LDZ2 .term/rows LDZ2 LTH2k ,&use-zero JCN + SUB2 #0002 ADD2 ,&continue JMP + &use-zero + POP2 POP2 #0000 &continue DUP2 .buffer/line-offset STZ2 ;abs-line JSR2 .buffer/offset STZ2 @@ -508,7 +497,7 @@ BRK @jump-to-line ( n* -> ) - .term/rows LDZ2 #0002 DIV2 LTH2k ( n rows/2 n s* ) - ;cur-rel-row JSR2 ;rel-line JMP2 + ;cur-rel-row JSR2 .term/rows LDZ2 LTH2 ,&safe JCN + .cursor/row LDZ2 ;abs-line JMP2 + &safe ;cur-rel-row JSR2 ;rel-line JMP2 @cur-pos ( -> s* ) ;cur-line JSR2 ;cur-col JSR2 ADD2 JMP2r @@ -1013,10 +1002,12 @@ &tabs INC2 .config/tab-width LDZ2 STH2 ADD2r ,&loop JMP @cur-rel-row ( -> row* ) - .cursor/row LDZ2 JMP2r +( .cursor/row LDZ2 JMP2r ) + .cursor/row LDZ2 .buffer/line-offset LDZ2 SUB2 JMP2r @set-abs-row ( n* -> ) - .buffer/line-offset LDZ2 SUB2 .cursor/row STZ2 JMP2r +( .buffer/line-offset LDZ2 SUB2 .cursor/row STZ2 JMP2r ) + .cursor/row STZ2 JMP2r ( @set-rel-row ( n* -> ) .cursor/row STZ2 JMP2r ) @@ -1036,8 +1027,8 @@ @last-pos ( -> addr* ) .buffer/limit LDZ2 #0001 SUB2 JMP2r -@more-than-one-screen ( -> bool^ ) - .buffer/line-count LDZ2 .term/rows LDZ2 GTH2 JMP2r +( @more-than-one-screen ( -> bool^ ) + .buffer/line-count LDZ2 .term/rows LDZ2 GTH2 JMP2r ) ( @fits-in-one-screen ( -> bool^ ) .buffer/line-count LDZ2 .term/rows LDZ2 INC2 LTH2 JMP2r )