nxu/term.tal

603 lines
16 KiB
Tal
Raw Normal View History

2023-01-23 23:16:46 -05:00
( TODO: )
( 1. investigate femto/nano bugs )
( 2. support attributes (inverse, bold, dim) )
( 3. add more ansi control seqs )
( 4. log ESC [ ? x ; ... $c )
2023-01-22 21:07:10 -05:00
( ANSI sequences )
( )
( set attributes: ESC [ x ; ... m -> 0:reset 1:bright 2:dim 7:reverse )
( get cursor position: ESC [ 6 n -> ESC [ $row ; $col R )
( enable line wrap: ESC [ 7 h )
( disable line wrap: ESC [ 7 l )
( )
( move cursor home: ESC [ H )
( move cursor: ESC [ $row ; $col H )
2023-01-23 21:18:50 -05:00
( move to column: ESC [ $n G )
( move to row: ESC [ $n d )
2023-01-22 21:07:10 -05:00
( move up: ESC [ $n A )
( move down: ESC [ $n B )
( move forward: ESC [ $n C )
( move back: ESC [ $n D )
( )
( erase from cursor to end of line: ESC [ K )
( erase from start of line to cursor: ESC [ 1 K )
( erase line: ESC [ 2 K )
( erase from current line to bottom: ESC [ J )
( erase from current line to top: ESC [ 1 J )
( erase screen: ESC [ 2 J )
2023-01-23 21:00:00 -05:00
( )
2023-01-23 21:18:50 -05:00
( NOT SUPPORTED YET: )
( show cursor: ESC [ ? 25 h )
( hide cursor: ESC [ ? 25 l )
2023-01-23 23:16:46 -05:00
( insert lines: ESC [ $n L )
2023-01-24 11:59:01 -05:00
( )
( set bracketed paste mode (xterm): ESC [ ? 2004 h )
2023-01-22 21:07:10 -05:00
2022-11-06 21:49:02 -05:00
|00 @System [ &vect $2 &pad $6 &r $2 &g $2 &b $2 ]
|10 @Console [ &vect $2 &r $1 &pad $5 &w $1 ]
|20 @Screen [ &vect $2 &w $2 &h $2 &auto $1 &pad $1 &x $2 &y $2 &addr $2 &pixel $1 &sprite $1 ]
2023-01-23 20:22:59 -05:00
|80 @Controller [ &vect $2 &button $1 &key $1 &fn $1 ]
2023-01-23 20:54:52 -05:00
|a0 @File [ &vect $2 &ok $2 &stat $2 &del $1 &append $1 &name $2 &len $2 &r $2 &w $2 ]
2022-11-06 21:49:02 -05:00
|0000
2023-01-23 20:22:59 -05:00
@tint $1 ( draw mode. 01=regular, 04=inverted )
2023-01-25 12:11:16 -05:00
@attr $1 ( 5 bits: RxxxBBFF )
2023-01-23 20:22:59 -05:00
@dirty? $1 ( screen needs redraw? )
@lastkey $1 ( last button press )
@rows $2 ( height in characters )
@cols $2 ( width in characters )
@cur-x $2 ( cursor x: 0 <= cur-x < cols )
@cur-y $2 ( cursor y: 0 <= cur-y < rows )
@max-x $2 ( cols-1 )
@max-y $2 ( rows-1 )
2022-11-06 21:49:02 -05:00
|0100
2023-01-21 22:54:20 -05:00
( 80 cols x 24 rows )
#0028 .rows STZ2
#0050 .cols STZ2
2022-11-06 21:49:02 -05:00
2023-01-22 21:07:10 -05:00
( set max row/col )
.rows LDZ2 #0001 SUB2 .max-y STZ2
.cols LDZ2 #0001 SUB2 .max-x STZ2
( set initial cursor )
#0000 .cur-x STZ2
#0000 .cur-y STZ2
2023-01-23 20:22:59 -05:00
( confirm no buttons pressed yet )
#00 .lastkey STZ
2023-01-22 21:07:10 -05:00
2022-11-06 21:49:02 -05:00
( set screen height/width based on rows/cols )
.rows LDZ2 #30 SFT2 .Screen/h DEO2
.cols LDZ2 #30 SFT2 .Screen/w DEO2
( set colors )
2023-01-25 12:11:16 -05:00
#07bf .System/r DEO2
#07bf .System/g DEO2
#07bf .System/b DEO2
2023-01-25 12:51:25 -05:00
;load-theme JSR2
2023-01-25 12:11:16 -05:00
( set starting tint: reverse=0, bg=0, fg=2 )
#02 .attr STZ
;update-tint JSR2
2023-01-21 15:41:27 -05:00
2022-11-06 21:49:02 -05:00
( clear screen for initial draw )
;clear-screen JSR2
( set up interrupts )
;redraw .Screen/vect DEO2 ( set up screen )
;on-key .Controller/vect DEO2 ( set up keyboard )
2023-01-22 21:07:10 -05:00
;on-read .Console/vect DEO2 ( set up stdin )
2022-11-06 21:49:02 -05:00
2023-01-25 12:40:46 -05:00
( ( set up debug log )
2023-01-23 20:54:52 -05:00
;debug .File/name DEO2
2023-01-25 12:40:46 -05:00
#01 .File/append DEO )
2023-01-25 12:11:16 -05:00
2022-11-06 21:49:02 -05:00
BRK
2023-01-25 12:51:25 -05:00
@load-theme ( -> )
;&path .File/name DEO2
#0002 .File/len DEO2
;&r .File/r DEO2
;&g .File/r DEO2
;&b .File/r DEO2
.File/ok DEI2 ORA #01 JCN JMP2r
LIT2 &r $2 .System/r DEO2
LIT2 &g $2 .System/g DEO2
LIT2 &b $2 .System/b DEO2
JMP2r [ &path ".theme $1 ]
2023-01-23 16:26:08 -05:00
@first-addr ( -> )
2023-01-25 12:11:16 -05:00
;cells JMP2r
2023-01-23 16:26:08 -05:00
2023-01-23 11:14:45 -05:00
@bol-addr ( -> addr* )
2023-01-25 12:11:16 -05:00
.cols LDZ2 .cur-y LDZ2 MUL2 #0002 MUL2 ;cells ADD2 JMP2r
2023-01-23 11:14:45 -05:00
@cur-addr ( -> addr* )
2023-01-25 12:11:16 -05:00
.cols LDZ2 .cur-y LDZ2 MUL2 .cur-x LDZ2 ADD2 #0002 MUL2 ;cells ADD2 JMP2r
2023-01-23 11:14:45 -05:00
@eol-addr ( -> addr* )
2023-01-25 12:11:16 -05:00
.cols LDZ2 .cur-y LDZ2 INC2 MUL2 #0002 MUL2 ;cells ADD2 JMP2r
2023-01-23 16:26:08 -05:00
2023-01-25 12:11:16 -05:00
@limit-addr ( -> )
.cols LDZ2 .rows LDZ2 MUL2 #0002 MUL2 ;cells ADD2 JMP2r
2023-01-23 11:14:45 -05:00
2023-01-22 21:07:10 -05:00
@min ( x* y* -> min* )
LTH2k JMP SWP2 POP2 JMP2r
2023-01-22 23:44:00 -05:00
@max ( x* y* -> max* )
LTH2k JMP SWP2 NIP2 JMP2r
2023-01-22 21:07:10 -05:00
2022-11-06 21:49:02 -05:00
@clear-screen
2023-01-22 15:21:57 -05:00
#01 .dirty? STZ
2023-01-25 12:11:16 -05:00
;cells STH2 ( [addr*] )
#0000 &yloop ( y* [addr*] y* )
#0000 &xloop ( y* x* [addr*] )
#4220 STH2kr STA2 ( y* x* [addr*] )
INC2r INC2r ( y* x* [addr+2*] )
INC2 DUP2 .cols LDZ2 ( y* x+1* x+1* cols* [addr+2*] )
LTH2 ,&xloop JCN ( y* x+1* [addr+2*] )
POP2 ( y* [addr*] )
INC2 DUP2 .rows LDZ2 ( y+1* y+1* rows* [addr*] )
LTH2 ,&yloop JCN ( y+1* [addr*] )
POP2 POP2r JMP2r ( )
2022-11-06 21:49:02 -05:00
@redraw
2023-01-22 15:21:57 -05:00
.dirty? LDZ #00 EQU ,&done JCN
2023-01-25 12:11:16 -05:00
;cells STH2 ( [addr*] )
2022-11-06 21:49:02 -05:00
#0000 DUP2 .Screen/y DEO2
&yloop
#0000 DUP2 .Screen/x DEO2
&xloop
2023-01-25 12:11:16 -05:00
STH2kr LDA2 ;draw-cell JSR2
.Screen/x DEI2k #0008 ADD2 ROT DEO2
INC2 INC2r INC2r
2022-11-06 21:49:02 -05:00
DUP2 .cols LDZ2 LTH2 ,&xloop JCN
POP2
2023-01-25 12:11:16 -05:00
.Screen/y DEI2k #0008 ADD2 ROT DEO2
2022-11-06 21:49:02 -05:00
INC2
DUP2 .rows LDZ2 LTH2 ,&yloop JCN
POP2 POP2r
2023-01-25 12:11:16 -05:00
;draw-cursor JSR2
2023-01-22 15:21:57 -05:00
#00 .dirty? STZ
2022-11-06 21:49:02 -05:00
&done BRK
2023-01-25 12:11:16 -05:00
@clear-cursor
.cur-x LDZ2 #30 SFT2 .Screen/x DEO2
.cur-y LDZ2 #30 SFT2 .Screen/y DEO2
;cur-addr JSR2 LDA2
;draw-cell JMP2
2022-11-06 21:49:02 -05:00
@draw-cursor
.cur-x LDZ2 #30 SFT2 .Screen/x DEO2
.cur-y LDZ2 #30 SFT2 .Screen/y DEO2
2023-01-25 12:11:16 -05:00
;cur-addr JSR2 LDA2
SWP ;reverse-tint JSR2 SWP
;draw-cell JMP2
2022-11-06 21:49:02 -05:00
2023-01-23 20:22:59 -05:00
@on-button ( -> )
2023-01-25 12:11:16 -05:00
.lastkey LDZ ( last^ )
.Controller/button DEI ( last^ button^ )
STHk EOR ( last-xor-button^ [button^] )
STHr AND ( last-xor-button&button^ )
2023-01-23 20:22:59 -05:00
DUP #10 AND #00 EQU ,&no-n JCN LIT "A ,arrow JSR
&no-n DUP #20 AND #00 EQU ,&no-s JCN LIT "B ,arrow JSR
&no-s DUP #40 AND #00 EQU ,&no-w JCN LIT "D ,arrow JSR
&no-w DUP #80 AND #00 EQU ,&no-e JCN LIT "C ,arrow JSR
2023-01-25 12:11:16 -05:00
&no-e POP .Controller/button DEI .lastkey STZ BRK
2023-01-23 20:22:59 -05:00
( send ESC [ $c )
@arrow ( c^ -> )
.Console/w STH
#1b STHkr DEO LIT "[ STHkr DEO STHr DEO
JMP2r
2023-01-22 15:55:52 -05:00
@on-key ( -> )
2023-01-23 20:22:59 -05:00
.Controller/key DEI ,&ok JCN ,on-button JMP
2023-01-22 15:55:52 -05:00
&ok ,alt? JSR ,on-alt-key JCN
,ctrl? JSR ,on-ctrl-key JCN
.Controller/key DEI .Console/w DEO BRK
2023-01-23 20:54:52 -05:00
@ctrl? ( -> is-down? ) .Controller/button DEI #01 AND JMP2r
@alt? ( -> is-down? ) .Controller/button DEI #02 AND JMP2r
2023-01-22 15:55:52 -05:00
( alt-XYZ emits ESC and then emits XYZ )
@on-alt-key ( -> )
#1b .Console/w DEO
,ctrl? JSR ,on-ctrl-key JCN
.Controller/key DEI .Console/w DEO BRK
( ctrl-$n emits: )
( 0 <= $n < @ -> $n )
( @ <= $n < ` -> $n #40 SUB )
( ` <= $n <= #ff -> $n #60 SUB )
@on-ctrl-key ( -> )
.Controller/key DEI
DUP LIT "@ LTH ,&done JCN
DUP LIT "` LTH ,&c1 JCN
LIT "` SUB ,&done JMP
&c1 LIT "@ SUB
&done .Console/w DEO BRK
2023-01-22 15:21:57 -05:00
2023-01-24 11:59:01 -05:00
@on-read-priv
2023-01-22 23:44:00 -05:00
.Console/r DEI
DUP LIT "; EQU ;next-arg JCN2
2023-01-24 11:59:01 -05:00
DUP LIT "0 LTH ;end-arg-priv JCN2
DUP LIT "9 GTH ;end-arg-priv JCN2
;add-to-arg JMP2
@start-priv
;on-read-priv .Console/vect DEO2
BRK
@on-read-csi ( -> )
.Console/r DEI
DUP LIT "? EQU ;start-priv JCN2
DUP LIT "; EQU ;next-arg JCN2
2023-01-22 23:44:00 -05:00
DUP LIT "0 LTH ;end-arg JCN2
DUP LIT "9 GTH ;end-arg JCN2
;add-to-arg JMP2
2023-01-24 11:59:01 -05:00
@debug-priv ( c^ -> )
;scratch STH2
LIT "1 STH2kr STA INC2r
LIT "b STH2kr STA INC2r
#20 STH2kr STA INC2r
LIT "[ STH2kr STA INC2r
#20 STH2kr STA INC2r
LIT "? STH2kr STA INC2r
#20 STH2kr STA INC2r
( TODO: numeric args )
STH2kr STA INC2r
#0a STH2r STA
#0009 .File/len DEO2
;scratch .File/w DEO2
JMP2r
@end-arg-priv ( c^ -> )
;on-read .Console/vect DEO2
2023-01-25 12:40:46 -05:00
( DUP ,debug-priv JSR )
2023-01-24 11:59:01 -05:00
( TODO: handle these )
POP BRK
@debug-csi ( c^ -> )
2023-01-23 20:54:52 -05:00
;scratch STH2
LIT "1 STH2kr STA INC2r
LIT "b STH2kr STA INC2r
#20 STH2kr STA INC2r
LIT "[ STH2kr STA INC2r
#20 STH2kr STA INC2r
STH2kr STA INC2r
#0a STH2r STA
#0007 .File/len DEO2
;scratch .File/w DEO2
JMP2r
2023-01-22 23:44:00 -05:00
@end-arg ( c^ -> )
;on-read .Console/vect DEO2
2023-01-25 12:40:46 -05:00
( DUP ,debug-csi JSR )
2023-01-23 21:18:50 -05:00
DUP LIT "d EQU ;exec-move-row JCN2 ( move cursor to row )
2023-01-23 20:54:52 -05:00
DUP LIT "h EQU ;exec-noop JCN2 ( enable line wrap )
DUP LIT "l EQU ;exec-noop JCN2 ( disable line wrap )
2023-01-25 12:11:16 -05:00
DUP LIT "m EQU ;exec-set-attr JCN2 ( set attr )
2023-01-23 20:54:52 -05:00
DUP LIT "n EQU ;exec-status JCN2 ( get status )
DUP LIT "A EQU ;exec-up JCN2 ( up )
DUP LIT "B EQU ;exec-down JCN2 ( down )
DUP LIT "C EQU ;exec-forward JCN2 ( forward )
2023-01-23 16:26:08 -05:00
DUP LIT "D EQU ;exec-back JCN2 ( back )
2023-01-23 23:16:46 -05:00
DUP LIT "G EQU ;exec-move-col JCN2 ( move cursor to col )
DUP LIT "H EQU ;exec-move JCN2 ( move cursor )
2023-01-23 16:26:08 -05:00
DUP LIT "J EQU ;exec-erase-screen JCN2 ( erase screen )
DUP LIT "K EQU ;exec-erase-line JCN2 ( erase line )
2023-01-23 23:16:46 -05:00
DUP LIT "L EQU ;exec-insert-lines JCN2 ( insert blank lines )
2023-01-22 23:44:00 -05:00
POP BRK
@exec-noop ( c^ -> )
POP BRK
2023-01-25 12:11:16 -05:00
@read-attr ( attr* -> )
DUP2 #0000 NEQ2 ,&!0 JCN #02 .attr STZ ,&done JMP ( reset )
&!0 DUP2 #0001 NEQ2 ,&!1 JCN #03 ,&set-fg JMP ( bright )
&!1 DUP2 #0002 NEQ2 ,&!2 JCN #01 ,&set-fg JMP ( dim )
&!2 DUP2 #0007 NEQ2 ,&!7 JCN .attr LDZk #80 ORA SWP STZ ,&done JMP ( reverse )
&!7 ,&ignored JMP
&set-fg .attr LDZ #fc AND ORA .attr STZ
&done ;update-tint JSR2
&ignored POP2 JMP2r
@exec-set-attr ( c^ -> )
POP
( BRK ( FIXME: gaining 4 bytes per ls -F ) )
;args/pos LDA2 ;args
&loop
LDA2k ;read-attr JSR2
INC2 INC2
LTH2k ,&done JCN ,&loop JMP
&done
POP2 POP2 BRK
2023-01-22 23:44:00 -05:00
@exec1 ( addr* -> )
STH2 #0001 ;read-arg-1 JSR2 STH2r JSR2 BRK
2023-01-23 11:14:45 -05:00
@exec-status
POP #0000 ;read-arg-1 JSR2 #0006 NEQ2 ,&done
#1b .Console/w DEO
LIT "[ .Console/w DEO
LIT "4 .Console/w DEO
LIT "0 .Console/w DEO
LIT "; .Console/w DEO
LIT "7 .Console/w DEO
LIT "9 .Console/w DEO
LIT "R .Console/w DEO
&done BRK
2023-01-22 23:44:00 -05:00
@exec-up POP ;up-n ;exec1 JMP2
@exec-down POP ;down-n ;exec1 JMP2
@exec-forward POP ;forward-n ;exec1 JMP2
@exec-back POP ;back-n ;exec1 JMP2
2023-01-23 11:14:45 -05:00
@exec-erase-line
POP #0000 ;read-arg-1 JSR2
2023-01-23 14:48:29 -05:00
DUP2 #0000 EQU2 ,&erase-to-end JCN
DUP2 #0001 EQU2 ,&erase-from-start JCN
DUP2 #0002 EQU2 ,&erase-full JCN
POP2 BRK
&erase-full
2023-01-25 12:11:16 -05:00
POP2 ;bol-addr JSR2 ;eol-addr JSR2 ;erase JSR2 BRK
2023-01-23 11:14:45 -05:00
&erase-to-end
2023-01-25 12:11:16 -05:00
POP2 ;cur-addr JSR2 ;eol-addr JSR2 ;erase JSR2 BRK
2023-01-23 11:14:45 -05:00
&erase-from-start
2023-01-25 12:11:16 -05:00
POP2 ;bol-addr JSR2 ;cur-addr JSR2 ;erase JSR2 BRK
2023-01-23 11:14:45 -05:00
2023-01-23 16:26:08 -05:00
@exec-erase-screen
POP #0000 ;read-arg-1 JSR2
DUP2 #0000 EQU2 ,&erase-to-end JCN
DUP2 #0001 EQU2 ,&erase-from-start JCN
DUP2 #0002 EQU2 ,&erase-full JCN
POP2 BRK
&erase-full
2023-01-25 12:11:16 -05:00
POP2 ;first-addr JSR2 ;limit-addr JSR2 ;erase JSR2 BRK
2023-01-23 16:26:08 -05:00
&erase-to-end
2023-01-25 12:11:16 -05:00
POP2 ;bol-addr JSR2 ;limit-addr JSR2 ;erase JSR2 BRK
2023-01-23 16:26:08 -05:00
&erase-from-start
POP2 ;first-addr JSR2 ;eol-addr JSR2 ;erase JSR2 BRK
2023-01-23 11:14:45 -05:00
2023-01-23 16:26:08 -05:00
( TODO: needs to be smarter -- need to redraw tiles and keep x/y coords )
2023-01-23 11:14:45 -05:00
@erase ( start* end* -> )
2023-01-25 12:11:16 -05:00
EQU2k ,&skip JCN ( start* end* )
OVR2 SWP2 ( start* start* end* )
SUB2 STH2 #4220 SWP2 ( 4220 start* [count*] )
&loop ( 4220 addr* [i*] )
STA2k INC2 INC2 INC2r INC2r ( 4220 addr+2* [i+1*] )
ORAkr STHr ,&loop JCN ( 4220 addr+2* [i+2*] )
POP2r POP2 POP2 ( )
2023-01-23 16:26:08 -05:00
#01 .dirty? STZ ( ; FIXME just redraw affected tiles )
JMP2r ( )
2023-01-25 12:11:16 -05:00
&skip POP2 POP2 JMP2r ( )
2023-01-23 11:14:45 -05:00
2023-01-23 21:18:50 -05:00
@exec-move-row ( c^ -> )
POP
#0001 ;read-arg-1 JSR2 #0001 SUB2 ( row )
.cur-x LDZ2 ( col )
;goto JSR2 BRK
@exec-move-col ( c^ -> )
POP
.cur-y LDZ2 ( row )
#0001 ;read-arg-2 JSR2 #0001 SUB2 ( col )
;goto JSR2 BRK
2023-01-22 23:44:00 -05:00
@exec-move ( c^ -> )
2023-01-23 16:26:08 -05:00
POP
#0001 ;read-arg-1 JSR2 #0001 SUB2 ( row )
#0001 ;read-arg-2 JSR2 #0001 SUB2 ( col )
2023-01-22 23:44:00 -05:00
;goto JSR2 BRK
2023-01-23 23:16:46 -05:00
@exec-insert-lines ( c^ -> )
POP
#0001 ;read-arg-1 JSR2 ( n )
POP2 ( TODO: shift ;screen from bol forward by n*cols bytes )
BRK
2023-01-23 20:54:52 -05:00
@debug-esc ( c^ -> )
;scratch STH2
LIT "1 STH2kr STA INC2r
LIT "b STH2kr STA INC2r
#20 STH2kr STA INC2r
STH2kr STA INC2r
#0a STH2r STA
#0005 .File/len DEO2
;scratch .File/w DEO2
JMP2r
2023-01-22 23:44:00 -05:00
@on-read-esc ( -> )
2023-01-24 11:59:01 -05:00
.Console/r DEI LIT "[ EQU ;start-csi JCN2
2023-01-25 12:40:46 -05:00
( .Console/r DEI ,debug-esc JSR )
2023-01-22 23:44:00 -05:00
;on-read .Console/vect DEO2
;on-read JMP2
2023-01-24 11:59:01 -05:00
@start-csi ( -> )
2023-01-22 23:44:00 -05:00
;reset-args JSR2
2023-01-24 11:59:01 -05:00
;on-read-csi .Console/vect DEO2
2023-01-22 23:44:00 -05:00
BRK
2023-01-22 21:07:10 -05:00
@on-read
2023-01-22 15:55:52 -05:00
.Console/r DEI
DUP ,&ok JCN POP BRK
2023-01-25 12:11:16 -05:00
&ok ( #42 .tint STZ )
2023-01-23 20:54:52 -05:00
;read JMP2
2023-01-21 15:41:27 -05:00
2023-01-22 21:07:10 -05:00
@read ( c^ -> )
DUP #20 LTH ;read-ctrl JCN2
DUP #7f EQU ;read-del JCN2
;read-printable JMP2
@read-ctrl ( c^ -> )
2023-01-22 23:44:00 -05:00
DUP #07 EQU ;read-bel JCN2
2022-11-06 21:49:02 -05:00
DUP #08 EQU ;read-bs JCN2
DUP #09 EQU ;read-tab JCN2
DUP #0a EQU ;read-nl JCN2
DUP #0d EQU ;read-cr JCN2
DUP #1b EQU ;read-esc JCN2
2023-01-22 23:44:00 -05:00
@read-bel ( 07 -> )
2023-01-23 20:54:52 -05:00
POP BRK ( TODO: flash terminal )
2023-01-22 23:44:00 -05:00
@read-bs ( 08 -> )
2023-01-23 16:26:08 -05:00
POP
2023-01-25 12:11:16 -05:00
;clear-cursor JSR2
2023-01-23 16:26:08 -05:00
#0001 ;back-n JSR2
2023-01-25 12:11:16 -05:00
;draw-cursor JSR2
2023-01-23 16:26:08 -05:00
JMP2r
2023-01-22 23:44:00 -05:00
@read-esc ( 1b -> )
POP ;on-read-esc .Console/vect DEO2 BRK
@read-del ( 7f -> )
2023-01-23 20:54:52 -05:00
POP BRK
2022-11-06 21:49:02 -05:00
2023-01-21 22:54:20 -05:00
( @read-tab POP JMP2r )
@read-tab
POP
.cur-x LDZ2 NIP #07 AND #08 SUB
&loop
2023-01-25 12:11:16 -05:00
.tint LDZ #20 DUP ;cur-addr JSR2 STA2
;draw-cell JSR2
2023-01-21 22:54:20 -05:00
;forward JSR2
INC DUP ,&loop JCN
POP JMP2r
2022-11-06 21:49:02 -05:00
@read-cr ( 0d -> )
2023-01-25 12:11:16 -05:00
POP ;clear-cursor JSR2 #0000 .cur-x STZ2 BRK
2022-11-06 21:49:02 -05:00
2023-01-22 21:07:10 -05:00
@at-max-y ( -> true? )
.cur-y LDZ2 .max-y LDZ2 EQU2 JMP2r
2022-11-06 21:49:02 -05:00
@read-nl ( 0a -> )
2023-01-25 12:11:16 -05:00
POP ;clear-cursor JSR2
2023-01-23 20:54:52 -05:00
,at-max-y JSR ;scroll JCN2 ;down JSR2 BRK
2023-01-22 15:21:57 -05:00
@read-printable ( c -> )
2023-01-25 12:11:16 -05:00
.tint LDZ SWP DUP2 ;cur-addr JSR2 STA2
;draw-cell JSR2
2023-01-23 20:54:52 -05:00
;forward JSR2 BRK
2022-11-06 21:49:02 -05:00
2023-01-22 23:44:00 -05:00
@goto ( y* x* -> )
2023-01-25 12:11:16 -05:00
;clear-cursor JSR2
2023-01-22 23:44:00 -05:00
.max-x LDZ2 ;min JSR2 .cur-x STZ2
.max-y LDZ2 ;min JSR2 .cur-y STZ2
2023-01-25 12:11:16 -05:00
;draw-cursor JMP2
2023-01-22 23:44:00 -05:00
2023-01-22 21:07:10 -05:00
@forward-n ( n* -> )
2023-01-25 12:11:16 -05:00
;clear-cursor JSR2
2023-01-22 21:07:10 -05:00
.cur-x LDZ2 ADD2 .max-x LDZ2 ;min JSR2 .cur-x STZ2
2023-01-25 12:11:16 -05:00
;draw-cursor JMP2
2022-11-06 21:49:02 -05:00
2023-01-22 21:07:10 -05:00
@forward ( -> )
#0001 ,forward-n JMP
@back-n ( n* -> )
2023-01-25 12:11:16 -05:00
;clear-cursor JSR2
2023-01-22 21:07:10 -05:00
.cur-x LDZ2 GTH2k ,&zero JCN
SWP2 SUB2 ,&done JMP
&zero POP2 POP2 #0000
2023-01-25 12:11:16 -05:00
&done .cur-x STZ2 ;draw-cursor JMP2
2023-01-22 21:07:10 -05:00
@up-n ( n* -> )
2023-01-25 12:11:16 -05:00
;clear-cursor JSR2
2023-01-22 21:07:10 -05:00
.cur-y LDZ2 GTH2k ,&zero JCN
SWP2 SUB2 ,&done JMP
&zero POP2 POP2 #0000
2023-01-25 12:11:16 -05:00
&done .cur-y STZ2 ;draw-cursor JMP2
2023-01-22 21:07:10 -05:00
@down-n ( n* -> )
2023-01-25 12:11:16 -05:00
;clear-cursor JSR2
2023-01-22 21:07:10 -05:00
.cur-y LDZ2 ADD2 .max-y LDZ2 ;min JSR2 .cur-y STZ2
2023-01-25 12:11:16 -05:00
;draw-cursor JMP2
2023-01-22 15:21:57 -05:00
2022-11-06 21:49:02 -05:00
@down ( -> )
2023-01-22 21:07:10 -05:00
#0001 ,down-n JMP
2022-11-06 21:49:02 -05:00
@scroll
2023-01-25 12:11:16 -05:00
;limit-addr JSR2 STH2
;cells .cols LDZ2 #0002 MUL2 ADD2 STH2
2022-11-06 21:49:02 -05:00
&loop
2023-01-25 12:11:16 -05:00
STH2kr LDA2 #4220 STH2kr STA2
STH2kr .cols LDZ2 #0002 MUL2 SUB2 STA2
INC2r INC2r GTH2kr STHr ,&loop JCN
2022-11-06 21:49:02 -05:00
POP2r POP2r
2023-01-22 15:21:57 -05:00
#01 .dirty? STZ
2023-01-25 12:11:16 -05:00
;draw-cursor JSR2 BRK
2022-11-06 21:49:02 -05:00
( 0 <= index < 128 )
@load-tile ( index^ -> )
#00 SWP #30 SFT2
;ascii ADD2 .Screen/addr DEO2
JMP2r
2023-01-25 12:11:16 -05:00
( bits: Rx xx FF BB )
( - R: reversed [0=normal, 1=reversed] )
( - F: foreground [0:black, 1:dim, 2:normal, 3:bright] )
( - B: background [0:black, 1:dim, 2:normal, 3:bright] )
@update-tint ( -> )
.attr LDZ
DUP #80 LTH ,&ok JCN
#80 EOR DUP #02 SFT SWP #20 SFT #0c AND ORA
&ok #40 ORA
.tint STZ JMP2r
2022-11-06 21:49:02 -05:00
2023-01-25 12:11:16 -05:00
@reverse-tint ( tint^ -> tint^ )
#0f AND ( x=tint&0f )
DUP #02 SFT SWP ( x>>2 x )
#03 AND #20 SFT ( x>>2 (x&3)<<2 )
ORA #40 ORA ( res=40|x>>2|(x&3)<<2 )
JMP2r ( res^ )
( cell* = tint^ c^ )
@draw-cell ( cell* -> )
SWP STH ( c^ [tint^] )
DUP #80 LTH ,&draw JCN ( c^ [tint^] )
#80 SUB ( c-80^ [tint^] )
&draw ;load-tile JSR2 ( [tint^] )
STHr .Screen/sprite DEO ( )
JMP2r ( )
2022-11-06 21:49:02 -05:00
2023-01-22 23:44:00 -05:00
@next-arg ( c^ -> )
POP
( TODO: check if we already have max args )
2023-01-25 12:40:46 -05:00
;args/pos LDA2k INC2 INC2 SWP2 STA2 BRK
2023-01-22 23:44:00 -05:00
@add-to-arg ( c^ -> )
LIT "0 SUB LITr 00 STH ( [digit*] )
;args/pos LDA2 LDA2k ( addr* value* [digit*] )
#000a MUL2 STH2r ADD2 ( addr* value*10+digit )
SWP2 STA2 BRK
@read-arg-1 ( default* -> n* )
;args LDA2 ;max JMP2
@read-arg-2 ( default* -> n* )
;args INC2 INC2 LDA2 ;max JMP2
@reset-args ( -> )
;args ;args/pos STA2
#0000 ;args LITr f8
&loop STA2k INC2 INC2
INCr STHkr ,&loop JCN
POPr POP2 POP2 JMP2r
2023-01-23 20:54:52 -05:00
@debug "debug_term.log 00
@scratch $40
2023-01-22 23:44:00 -05:00
( store up to 8 arguments for control sequences )
@args $10 &pos $2
2023-01-25 12:11:16 -05:00
( 128 1-bit 8x8 tiles for ASCII 7-bit characters )
@ascii
~chr/ascii.tal
2023-01-22 15:21:57 -05:00
2023-01-25 12:11:16 -05:00
( store tint+char for each screen position )
@cells $1900 ( 80 x 40 x 2 )