selection almost kinda working
This commit is contained in:
parent
0768b2302d
commit
f5017b1988
177
term.tal
177
term.tal
|
@ -89,7 +89,7 @@
|
||||||
|0000
|
|0000
|
||||||
@tint $1 ( draw mode. 01=regular, 04=inverted )
|
@tint $1 ( draw mode. 01=regular, 04=inverted )
|
||||||
@attr $1 ( 5 bits: RxxxBBFF )
|
@attr $1 ( 5 bits: RxxxBBFF )
|
||||||
@dirty? $1 ( screen needs redraw? )
|
@dirty $1 ( screen needs redraw? )
|
||||||
@lastkey $1 ( last button press )
|
@lastkey $1 ( last button press )
|
||||||
@rows $2 ( height in characters )
|
@rows $2 ( height in characters )
|
||||||
@cols $2 ( width in characters )
|
@cols $2 ( width in characters )
|
||||||
|
@ -102,6 +102,11 @@
|
||||||
@lastmouse-x $2 ( last mouse x )
|
@lastmouse-x $2 ( last mouse x )
|
||||||
@lastmouse-y $2 ( last mouse y )
|
@lastmouse-y $2 ( last mouse y )
|
||||||
@lastmouse-st $1 ( last mouse press )
|
@lastmouse-st $1 ( last mouse press )
|
||||||
|
@is-lit $1
|
||||||
|
@lit-first-x $2
|
||||||
|
@lit-first-y $2
|
||||||
|
@lit-last-x $2
|
||||||
|
@lit-last-y $2
|
||||||
|
|
||||||
( terminal settings )
|
( terminal settings )
|
||||||
@irm $1 ( 01: insert and move right, 00: replace and overwrite )
|
@irm $1 ( 01: insert and move right, 00: replace and overwrite )
|
||||||
|
@ -172,8 +177,8 @@
|
||||||
( set to 01 to enable debug log )
|
( set to 01 to enable debug log )
|
||||||
#00 .debug STZ
|
#00 .debug STZ
|
||||||
|
|
||||||
.debug LDZ ?&continue BRK &continue
|
|
||||||
#99 #010e DEO
|
#99 #010e DEO
|
||||||
|
.debug LDZ ?&continue BRK &continue
|
||||||
;debug-log .File1/name DEO2
|
;debug-log .File1/name DEO2
|
||||||
#01 .File1/append DEO
|
#01 .File1/append DEO
|
||||||
BRK
|
BRK
|
||||||
|
@ -214,7 +219,7 @@
|
||||||
LTH2k JMP SWP2 NIP2 JMP2r
|
LTH2k JMP SWP2 NIP2 JMP2r
|
||||||
|
|
||||||
@clear-screen
|
@clear-screen
|
||||||
#01 .dirty? STZ
|
#01 .dirty STZ
|
||||||
LIT2r =cells ( [addr*] )
|
LIT2r =cells ( [addr*] )
|
||||||
#0000 &yloop ( y* [addr*] y* )
|
#0000 &yloop ( y* [addr*] y* )
|
||||||
#0000 &xloop ( y* x* [addr*] )
|
#0000 &xloop ( y* x* [addr*] )
|
||||||
|
@ -227,15 +232,21 @@
|
||||||
LTH2 ?&yloop ( y+1* [addr*] )
|
LTH2 ?&yloop ( y+1* [addr*] )
|
||||||
POP2 POP2r JMP2r ( )
|
POP2 POP2r JMP2r ( )
|
||||||
|
|
||||||
@redraw
|
@redraw ( -> )
|
||||||
.dirty? LDZ #00 EQU ?&done
|
.dirty LDZ #00 EQU ?&done
|
||||||
LIT2r =cells ( [addr*] )
|
LIT2r =cells ( [addr*] )
|
||||||
.rows LDZ2 #0000 DUP2 #0008 ( border ) ADD2 .Screen/y DEO2
|
.rows LDZ2 #0000 DUP2 #0008 ( border ) ADD2 .Screen/y DEO2
|
||||||
&yloop
|
&yloop
|
||||||
.cols LDZ2 #0000 DUP2 #0008 ( border ) ADD2 .Screen/x DEO2
|
.cols LDZ2 #0000 DUP2 #0008 ( border ) ADD2 .Screen/x DEO2
|
||||||
&xloop
|
&xloop
|
||||||
STH2kr LDA2 draw-cell
|
STH2kr LDA2 ( DUP2 erase-cell ) draw-cell
|
||||||
.Screen/x DEI2k #0008 ( width ) ADD2 ROT DEO2
|
#40 .Screen/sprite DEO
|
||||||
|
( FIXME start )
|
||||||
|
.Screen/y DEI2k #0004 ADD2 ROT DEO2
|
||||||
|
#40 .Screen/sprite DEO
|
||||||
|
.Screen/y DEI2k #0004 SUB2 ROT DEO2
|
||||||
|
( FIXME end )
|
||||||
|
.Screen/x DEI2k #0008 ( width/2 ) ADD2 ROT DEO2
|
||||||
INC2 INC2r INC2r
|
INC2 INC2r INC2r
|
||||||
GTH2k ?&xloop
|
GTH2k ?&xloop
|
||||||
POP2 POP2
|
POP2 POP2
|
||||||
|
@ -243,28 +254,25 @@
|
||||||
INC2
|
INC2
|
||||||
GTH2k ?&yloop
|
GTH2k ?&yloop
|
||||||
POP2 POP2 POP2r
|
POP2 POP2 POP2r
|
||||||
draw-cursor #00 .dirty? STZ &done BRK
|
.is-lit LDZ #00 EQU ?&cursor redraw-selection
|
||||||
|
&cursor draw-cursor #00 .dirty STZ
|
||||||
|
&done BRK
|
||||||
|
|
||||||
@clear-cursor
|
@screen-to-cell ( row* col* -> )
|
||||||
.cur-x LDZ2 #30 SFT2 ( width ) #0008 ( border ) ADD2 .Screen/x DEO2
|
#30 SFT2 ( width ) #0008 ( border ) ADD2 .Screen/x DEO2
|
||||||
.cur-y LDZ2 #000c MUL2 ( height ) #0008 ( border ) ADD2 .Screen/y DEO2
|
#000c MUL2 ( height ) #0008 ( border ) ADD2 .Screen/y DEO2
|
||||||
cur-addr LDA2
|
|
||||||
!draw-cell
|
|
||||||
|
|
||||||
@screen-to-cursor
|
|
||||||
.cur-x LDZ2 #30 SFT2 ( width ) #0008 ( border ) ADD2 .Screen/x DEO2
|
|
||||||
.cur-y LDZ2 #000c MUL2 ( height ) #0008 ( border ) ADD2 .Screen/y DEO2
|
|
||||||
JMP2r
|
JMP2r
|
||||||
|
|
||||||
|
@screen-to-cursor ( -> )
|
||||||
|
.cur-y LDZ2 .cur-x LDZ2 !screen-to-cell
|
||||||
|
|
||||||
|
@clear-cursor
|
||||||
|
screen-to-cursor cur-addr LDA2 !draw-cell
|
||||||
|
|
||||||
@draw-cursor
|
@draw-cursor
|
||||||
( .cur-x LDZ2 #30 SFT2 ( width ) #0008 ( border ) ADD2 .Screen/x DEO2
|
screen-to-cursor cur-addr LDA2
|
||||||
.cur-y LDZ2 #000c MUL2 ( height ) #0008 ( border ) ADD2 .Screen/y DEO2 )
|
.tcem LDZ #00 EQU ?&skip SWP reverse-tint SWP
|
||||||
screen-to-cursor
|
&skip !draw-cell
|
||||||
cur-addr LDA2
|
|
||||||
.tcem LDZ #00 EQU ?&skip
|
|
||||||
SWP reverse-tint SWP
|
|
||||||
&skip
|
|
||||||
!draw-cell
|
|
||||||
|
|
||||||
@on-button ( -> )
|
@on-button ( -> )
|
||||||
.lastkey LDZ ( last^ )
|
.lastkey LDZ ( last^ )
|
||||||
|
@ -315,13 +323,86 @@
|
||||||
.paste LDZ #00 EQU ?&end LIT "1 ;bracket-paste JSR2 &end
|
.paste LDZ #00 EQU ?&end LIT "1 ;bracket-paste JSR2 &end
|
||||||
JMP2r [ &path ".snarf 00 ]
|
JMP2r [ &path ".snarf 00 ]
|
||||||
|
|
||||||
|
@redraw-selection ( -> )
|
||||||
|
#010e DEO
|
||||||
|
.lit-first-y LDZ2 .cols LDZ2 MUL2 ( y0*cols* )
|
||||||
|
.lit-first-x LDZ2 ADD2 #0002 MUL2 ( 2(y0*cols+x0)* )
|
||||||
|
;cells ADD2 STH2 ( [addr*] )
|
||||||
|
.lit-last-y LDZ2 INC2 .lit-first-y LDZ2 ( yn* y0* [addr*] )
|
||||||
|
DUP2 .lit-first-x LDZ2 STH2k ( yn* y0* x0* [addr* x0*] )
|
||||||
|
screen-to-cell ( yn* y0* [addr* x0*] )
|
||||||
|
&yloop ( yn* y* [addr* x*] )
|
||||||
|
OVR2 OVR2 INC2 GTH2 STH .cols LDZ2 ( yn* y* cols* [addr* x* last^] )
|
||||||
|
.lit-last-x LDZ2 INC2 ( yn* y* cols* xn* [addr* x* last^] )
|
||||||
|
STHr JMP SWP2 POP2 STH2r ( yn* y* xlim* x* [addr*] )
|
||||||
|
&xloop ( yn* y* xlim* x* [addr*] )
|
||||||
|
STH2kr LDA2 highlight-cell ( yn* y* xlim* x* [addr*] )
|
||||||
|
.Screen/x DEI2k #0008 ADD2 ROT DEO2 ( yn* y* xlim* x* [addr*] )
|
||||||
|
INC2 INC2r INC2r ( yn* y* xlim* x+1* [addr+2*] )
|
||||||
|
GTH2k ?&xloop ( yn* y* xlim* x+1* [addr+2*] )
|
||||||
|
POP2 POP2 ( yn* y* [addr+2*] )
|
||||||
|
.Screen/y DEI2k #000c ADD2 ROT DEO2 ( yn* y* [addr+2*] )
|
||||||
|
#0008 .Screen/x DEO2 ( yn* y* [addr+2*] )
|
||||||
|
LIT2r 0000 INC2 GTH2k ?&yloop ( yn* y+1* [addr+2* 0*] )
|
||||||
|
POP2 POP2 POP2r POP2r ( )
|
||||||
|
#010e DEO
|
||||||
|
JMP2r ( )
|
||||||
|
|
||||||
|
@point-to-coord ( x* y* -> row* col* )
|
||||||
|
DUP2 #0008 SUB2 min #000c DIV2 #0017 min SWP2 ( row=(y-8)/12* x* )
|
||||||
|
DUP2 #0008 SUB2 min #0008 DIV2 #004f min JMP2r ( row* col=(x-8)/8* )
|
||||||
|
|
||||||
|
@start-selection ( -> )
|
||||||
|
#01 .is-lit STZ ( )
|
||||||
|
.Mouse/x DEI2 .Mouse/y DEI2 ( x* y* )
|
||||||
|
point-to-coord OVR2 OVR2 ( row* col* row* col* )
|
||||||
|
.lit-first-x STZ2 .lit-first-y STZ2 ( row* col* )
|
||||||
|
.lit-last-x STZ2 .lit-last-y STZ2 ( )
|
||||||
|
redraw-selection !draw-cursor ( )
|
||||||
|
|
||||||
|
@selection-is-empty ( -> bool^ )
|
||||||
|
.lit-first-y LDZ2 .lit-last-y LDZ2 EQU2
|
||||||
|
.lit-first-x LDZ2 .lit-last-x LDZ2 EQU2 AND JMP2r
|
||||||
|
|
||||||
|
@handle-selection ( -> )
|
||||||
|
selection-is-empty ?&skip
|
||||||
|
( .lit-first-y LDZ2 .lit-first-x LDZ2
|
||||||
|
.lit-last-y LDZ2 .lit-last-x LDZ2
|
||||||
|
#010e DEO POP2 POP2 POP2 POP2 )
|
||||||
|
&skip !clear-selection
|
||||||
|
|
||||||
|
@clear-selection ( -> )
|
||||||
|
#00 .is-lit STZ
|
||||||
|
#01 .dirty STZ
|
||||||
|
#0000 DUP2 .lit-first-y STZ2
|
||||||
|
DUP2 .lit-first-x STZ2
|
||||||
|
DUP2 .lit-last-y STZ2
|
||||||
|
.lit-last-x STZ2 JMP2r
|
||||||
|
|
||||||
|
@update-selection ( -> )
|
||||||
|
.Mouse/x DEI2 .Mouse/y DEI2 ( x* y* )
|
||||||
|
point-to-coord OVR2 ( row* col* row* )
|
||||||
|
.lit-first-y LDZ2 LTH2 ?&earlier ( row* col* )
|
||||||
|
.lit-last-x STZ2 .lit-last-y STZ2 JMP2r ( )
|
||||||
|
&earlier ( row* col* )
|
||||||
|
.lit-first-x STZ2 .lit-first-y STZ2 JMP2r ( )
|
||||||
|
|
||||||
|
@end-selection ( -> )
|
||||||
|
update-selection redraw-selection ( )
|
||||||
|
draw-cursor !handle-selection ( )
|
||||||
|
|
||||||
@on-click-down ( click^ -> )
|
@on-click-down ( click^ -> )
|
||||||
#02 AND ?&middle-click !&done
|
DUP #01 AND ?&left-click
|
||||||
&middle-click paste-snarf
|
DUP #02 AND ?&middle-click
|
||||||
&done JMP2r
|
!&done
|
||||||
|
&left-click POP !start-selection
|
||||||
|
&middle-click POP !paste-snarf
|
||||||
|
&done POP JMP2r
|
||||||
|
|
||||||
@on-click-up ( unclick^ -> )
|
@on-click-up ( unclick^ -> )
|
||||||
POP JMP2r
|
#01 AND ?&left-click !&done
|
||||||
|
&left-click !end-selection
|
||||||
|
&done JMP2r
|
||||||
|
|
||||||
@draw-at ( x* y* addr* -> )
|
@draw-at ( x* y* addr* -> )
|
||||||
STH2k .Screen/addr DEO2 ( x* y* [addr*] )
|
STH2k .Screen/addr DEO2 ( x* y* [addr*] )
|
||||||
|
@ -332,11 +413,15 @@
|
||||||
STH2r #0008 ADD2 .Screen/addr DEO2 ( 43 sprite^ )
|
STH2r #0008 ADD2 .Screen/addr DEO2 ( 43 sprite^ )
|
||||||
DEO JMP2r ( )
|
DEO JMP2r ( )
|
||||||
|
|
||||||
|
( TODO: need to adjust first/last x/y while dragging )
|
||||||
|
|
||||||
@on-move ( -> )
|
@on-move ( -> )
|
||||||
.Mouse/x DEI2 .lastmouse-x LDZ2 NEQ2 ?&redraw ( )
|
.Mouse/x DEI2 .lastmouse-x LDZ2 NEQ2 ?&redraw ( )
|
||||||
.Mouse/y DEI2 .lastmouse-y LDZ2 NEQ2 ?&redraw ( )
|
.Mouse/y DEI2 .lastmouse-y LDZ2 NEQ2 ?&redraw ( )
|
||||||
JMP2r ( )
|
JMP2r ( )
|
||||||
&redraw ( )
|
&redraw ( )
|
||||||
|
.is-lit LDZ #00 EQU ?&next redraw-selection &next
|
||||||
|
update-selection ( )
|
||||||
.lastmouse-x LDZ2 .lastmouse-y LDZ2 ( lx* ly* )
|
.lastmouse-x LDZ2 .lastmouse-y LDZ2 ( lx* ly* )
|
||||||
#0200 ;cp437 ADD2 draw-at ( )
|
#0200 ;cp437 ADD2 draw-at ( )
|
||||||
.Mouse/x DEI2 .Mouse/y DEI2 ( x* y* )
|
.Mouse/x DEI2 .Mouse/y DEI2 ( x* y* )
|
||||||
|
@ -604,7 +689,7 @@
|
||||||
STA2k INC2 INC2 INC2r INC2r ( 4220 addr+2* [i+1*] )
|
STA2k INC2 INC2 INC2r INC2r ( 4220 addr+2* [i+1*] )
|
||||||
ORAkr STHr ?&loop ( 4220 addr+2* [i+2*] )
|
ORAkr STHr ?&loop ( 4220 addr+2* [i+2*] )
|
||||||
POP2r POP2 POP2 ( )
|
POP2r POP2 POP2 ( )
|
||||||
#01 .dirty? STZ ( ; FIXME just redraw affected tiles )
|
#01 .dirty STZ ( ; FIXME just redraw affected tiles )
|
||||||
JMP2r ( )
|
JMP2r ( )
|
||||||
&skip POP2 POP2 JMP2r ( )
|
&skip POP2 POP2 JMP2r ( )
|
||||||
|
|
||||||
|
@ -801,7 +886,7 @@
|
||||||
#0002 SUB2 ( bound* pos-2* [i*] )
|
#0002 SUB2 ( bound* pos-2* [i*] )
|
||||||
GTH2k #00 EQU ?&loop ( bound* pos-2* [i*] )
|
GTH2k #00 EQU ?&loop ( bound* pos-2* [i*] )
|
||||||
POP2 POP2 POP2r ( )
|
POP2 POP2 POP2r ( )
|
||||||
#01 .dirty? STZ JMP2r ( )
|
#01 .dirty STZ JMP2r ( )
|
||||||
|
|
||||||
@insert-n-spaces ( n* -> )
|
@insert-n-spaces ( n* -> )
|
||||||
STH2 ( [n*] )
|
STH2 ( [n*] )
|
||||||
|
@ -822,7 +907,7 @@
|
||||||
STA2k INC2 INC2 INC2r ( 4220 pos+2* [-i+1*] )
|
STA2k INC2 INC2 INC2r ( 4220 pos+2* [-i+1*] )
|
||||||
ORAkr STHr ?&loop2 ( 4220 pos+2* [-i+1*] )
|
ORAkr STHr ?&loop2 ( 4220 pos+2* [-i+1*] )
|
||||||
POP2 POP2 POP2r ( )
|
POP2 POP2 POP2r ( )
|
||||||
#01 .dirty? STZ JMP2r ( )
|
#01 .dirty STZ JMP2r ( )
|
||||||
|
|
||||||
( starts with cursor pos )
|
( starts with cursor pos )
|
||||||
@delete-n-chars ( n* -> )
|
@delete-n-chars ( n* -> )
|
||||||
|
@ -835,7 +920,7 @@
|
||||||
OVR2 STA2 INC2 INC2 ( limit* pos+2* [i*] ; pos<-x )
|
OVR2 STA2 INC2 INC2 ( limit* pos+2* [i*] ; pos<-x )
|
||||||
GTH2k ?&loop ( limit* pos+2* [i*] )
|
GTH2k ?&loop ( limit* pos+2* [i*] )
|
||||||
POP2 POP2 POP2r ( )
|
POP2 POP2 POP2r ( )
|
||||||
#01 .dirty? STZ JMP2r ( )
|
#01 .dirty STZ JMP2r ( )
|
||||||
|
|
||||||
( starts below current line )
|
( starts below current line )
|
||||||
@delete-n-lines ( n* -> )
|
@delete-n-lines ( n* -> )
|
||||||
|
@ -852,7 +937,7 @@
|
||||||
STH2kr .col-bytes LDZ2 SUB2 STA2
|
STH2kr .col-bytes LDZ2 SUB2 STA2
|
||||||
INC2r INC2r GTH2kr STHr ?&loop
|
INC2r INC2r GTH2kr STHr ?&loop
|
||||||
POP2r POP2r
|
POP2r POP2r
|
||||||
#01 .dirty? STZ
|
#01 .dirty STZ
|
||||||
draw-cursor BRK
|
draw-cursor BRK
|
||||||
|
|
||||||
( ( 0 <= index < 128 )
|
( ( 0 <= index < 128 )
|
||||||
|
@ -895,6 +980,28 @@
|
||||||
.Screen/y DEI2k #0004 SUB2 ROT DEO2 ( )
|
.Screen/y DEI2k #0004 SUB2 ROT DEO2 ( )
|
||||||
JMP2r ( )
|
JMP2r ( )
|
||||||
|
|
||||||
|
@erase-cell ( cell* -> )
|
||||||
|
NIP LITr 40 ( c^ [tint^] )
|
||||||
|
#00 SWP #40 SFT2 ;cp437 ADD2 ( addr* [tint^] )
|
||||||
|
.Screen/addr DEO2k ( addr* s^ [tint^] )
|
||||||
|
STHkr .Screen/sprite DEO ( addr* s^ [tint^] )
|
||||||
|
.Screen/y DEI2k #0004 ADD2 ROT DEO2 ( addr* s^ [tint^] )
|
||||||
|
STH #0004 ADD2 STHr DEO2 ( [tint^] )
|
||||||
|
STHr .Screen/sprite DEO ( )
|
||||||
|
.Screen/y DEI2k #0004 SUB2 ROT DEO2 ( )
|
||||||
|
JMP2r ( )
|
||||||
|
|
||||||
|
@highlight-cell ( cell* -> )
|
||||||
|
NIP LITr 47 ( c^ [tint^] )
|
||||||
|
#00 SWP #40 SFT2 ;cp437 ADD2 ( addr* [tint^] )
|
||||||
|
.Screen/addr DEO2k ( addr* s^ [tint^] )
|
||||||
|
STHkr .Screen/sprite DEO ( addr* s^ [tint^] )
|
||||||
|
.Screen/y DEI2k #0004 ADD2 ROT DEO2 ( addr* s^ [tint^] )
|
||||||
|
STH #0004 ADD2 STHr DEO2 ( [tint^] )
|
||||||
|
STHr .Screen/sprite DEO ( )
|
||||||
|
.Screen/y DEI2k #0004 SUB2 ROT DEO2 ( )
|
||||||
|
JMP2r ( )
|
||||||
|
|
||||||
@next-arg ( c^ -> )
|
@next-arg ( c^ -> )
|
||||||
POP
|
POP
|
||||||
( TODO: check if we already have max args )
|
( TODO: check if we already have max args )
|
||||||
|
@ -948,5 +1055,7 @@
|
||||||
01
|
01
|
||||||
( device mask ) 41 0d07
|
( device mask ) 41 0d07
|
||||||
|
|
||||||
|
@lengths $18 ( keep consistent with .cols )
|
||||||
|
|
||||||
( store tint+char for each screen position )
|
( store tint+char for each screen position )
|
||||||
@cells
|
@cells
|
||||||
|
|
Loading…
Reference in New Issue