nxu/term.tal

233 lines
5.0 KiB
Tal

|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 ]
|80 @Controller [ &vect $2 &button $1 &key $1 ]
|0000
@dirty $1 ( screen needs redraw? )
@tint $1 ( draw mode. 01=regular, 04=inverted )
@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 )
@buffer $c8 ( input buffer, 200 bytes )
@pos $1 ( buffer position )
@subinput $1 ( reading from subprocess? )
|0100
( 80 cols x 24 rows )
#0028 .rows STZ2
#0050 .cols STZ2
( set screen height/width based on rows/cols )
.rows LDZ2 #30 SFT2 .Screen/h DEO2
.cols LDZ2 #30 SFT2 .Screen/w DEO2
( set colors )
#0cf0 .System/r DEO2
#0c88 .System/g DEO2
#0c0f .System/b DEO2
( set pos, subinput flag )
.buffer .pos STZ
#00 .subinput STZ
( 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 )
;on-input .Console/vect DEO2 ( set up stdin )
( return )
BRK
@clear-screen
#01 .dirty STZ
;screen STH2
#0000 &yloop
#0000 &xloop
#20 STH2kr STA INC2r
INC2 DUP2 .cols LDZ2 LTH2 ,&xloop JCN
POP2
INC2 DUP2 .rows LDZ2 LTH2 ,&yloop JCN
POP2 POP2r
JMP2r
@redraw
#41 .tint STZ
.dirty LDZ #00 EQU ,&done JCN
;screen STH2
#0000 DUP2 .Screen/y DEO2
&yloop
#0000 DUP2 .Screen/x DEO2
&xloop
STH2kr LDA ;draw-tile JSR2
.Screen/x DEI2 #0008 ADD2 .Screen/x DEO2
INC2 INC2r
DUP2 .cols LDZ2 LTH2 ,&xloop JCN
POP2
.Screen/y DEI2 #0008 ADD2 .Screen/y DEO2
INC2
DUP2 .rows LDZ2 LTH2 ,&yloop JCN
POP2 POP2r
;show-cursor JSR2
#00 .dirty STZ
&done BRK
@hide-cursor
.tint LDZ
#41 .tint STZ
;draw-cursor JSR2
.tint STZ JMP2r
@show-cursor
.tint LDZ
#44 .tint STZ
;draw-cursor JSR2
.tint STZ JMP2r
@draw-cursor
.cur-x LDZ2 #30 SFT2 .Screen/x DEO2
.cur-y LDZ2 #30 SFT2 .Screen/y DEO2
.cur-y LDZ2 .cols LDZ2 MUL2 .cur-x LDZ2 ADD2 ;screen ADD2 LDA
;draw-tile JMP2
@on-key
#00 .subinput STZ
.Controller/key DEI #00 EQU ,&skip JCN
#41 .tint STZ
.Controller/key DEI ;read JSR2
&skip BRK
@on-input
#01 .subinput STZ
.Console/r DEI #00 EQU ,&skip JCN
#41 .tint STZ
.Console/r DEI ;read JSR2
&skip BRK
@read ( byte^ -> )
DUP #07 EQU ;read-bel JCN2
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
DUP #7f EQU ;read-del JCN2
;read-normal JMP2
( TODO: we need line-editing! )
@read-bel POP JMP2r
@read-bs POP JMP2r ( POP ;scroll JMP2 )
@read-esc POP JMP2r
@read-del POP JMP2r
@write-line ( -> )
.pos LDZ .buffer
&loop GTHk ,&next JCN ,&done JMP
&next LDZk .Console/w DEO INC ,&loop JMP
&done #0a .Console/w DEO .buffer .pos STZ JMP2r
( @read-tab POP JMP2r )
@read-tab
POP
.subinput LDZ ,&display JCN
#01 #0e DEO JMP2r ( POP POP2r #0000 DIV )
&display
.cur-x LDZ2 NIP #07 AND #08 SUB
&loop
#20 DUP ;cursor-addr JSR2 STA
;draw-tile JSR2
;forward JSR2
INC DUP ,&loop JCN
POP JMP2r
@read-cr ( 0d -> )
POP
.subinput LDZ ,&display JCN
;write-line JSR2
&display
;hide-cursor JSR2
#0000 .cur-x STZ2
;down JMP2
@read-nl ( 0a -> )
POP
JMP2r
( ,read-cr JMP )
@forward ( -> )
.cur-x LDZ2 INC2 DUP2 .cols LDZ2 LTH2 ,&ok JCN
POP2 #0000 .cur-x STZ2 ;down JMP2
&ok .cur-x STZ2
;show-cursor JMP2
@down ( -> )
.cur-y LDZ2 INC2 DUP2 .rows LDZ2 LTH2 ,&ok JCN
POP2 ;scroll JMP2
&ok .cur-y STZ2
;show-cursor JMP2
@scroll
;end-screen STH2
;screen .cols LDZ2 ADD2 STH2
&loop
STH2kr LDA #20 STH2kr STA
STH2kr .cols LDZ2 SUB2 STA
INC2r GTH2kr STHr ,&loop JCN
POP2r POP2r
#01 .dirty STZ
;show-cursor JMP2
@cursor-addr ( -> addr* )
.cur-y LDZ2 .cols LDZ2 MUL2
.cur-x LDZ2 ADD2 ;screen ADD2
JMP2r
@read-normal ( c -> )
.subinput LDZ ,&display JCN
.pos LDZ STZk INC .pos STZ
&display
DUP ;cursor-addr JSR2 STA
;draw-tile JSR2
;forward JMP2
( 0 <= c < 256 )
@draw-tile ( c^ -> )
DUP #80 LTH
,draw-7bit JCN
,draw-8bit JMP
( 0 <= index < 128 )
@load-tile ( index^ -> )
#00 SWP #30 SFT2
;ascii ADD2 .Screen/addr DEO2
JMP2r
( 0 <= c < 128 )
@draw-7bit ( c^ -> )
;load-tile JSR2
.tint LDZ .Screen/sprite DEO
JMP2r
( 128 <= c < 256 )
@draw-8bit ( 8bit^ -> )
#80 SUB ;load-tile JSR2
.tint LDZ #05 EOR .Screen/sprite DEO
JMP2r
( 128 1-bit 8x8 tiles for ASCII 7-bit characters )
@ascii
~chr/ascii.tal
( screen to store characters for redraw, etc. )
( @screen $0800 ( 64 x 32 ) )
@screen $0c80 ( 64 x 32 )
@end-screen