|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 ) @bg-frame $2 @bg-counter $1 |0100 ( 32 characters = 256 pixels ) #0020 .rows STZ2 #0040 .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 ) #0ff3 .System/r DEO2 #0fd5 .System/g DEO2 #2f66 .System/b DEO2 ( #08f3 .System/r DEO2 #0cd5 .System/g DEO2 #0b66 .System/b DEO2 ) ( clear screen for initial draw ) ;clear-screen JSR2 ( draw background ) #0000 .bg-frame STZ2 #00 .bg-counter STZ ( #0000 ;draw-background JSR2 ) ( set up interrupts ) ;redraw .Screen/vect DEO2 ( set up screen ) ;on-key .Controller/vect DEO2 ( set up keyboard ) ( return ) BRK @draw-background ( frame* -> ) STH2 STH2kr #70 SFT2 ;cyber ADD2 #0048 ADD2 .Screen/addr DEO2 LIT2r 000f LIT2 0000 &loop1 DUP2 #30 SFT2 .Screen/y DEO2 DUP2 .cols LDZ2 OVR2 SUB2 ,hline JSR INC2 DUP2 STH2kr LTH2 ,&loop1 JCN POP2 POP2r STH2kr #70 SFT2 ;cyber ADD2 #0040 ADD2 .Screen/addr DEO2 LIT2r 0020 LIT2 0011 &loop2 DUP2 #30 SFT2 .Screen/y DEO2 .rows LDZ2 OVR2 INC2 SUB2 .cols LDZ2 OVR2 SUB2 ,hline JSR INC2 DUP2 STH2kr LTH2 ,&loop2 JCN POP2 POP2r POP2r JMP2r @dline ( n -> ) #0000 SWP2 SUB2 STH2 &loop .Screen/x DEI2 #0008 ADD2 .Screen/x DEO2 .Screen/y DEI2 #0008 ADD2 .Screen/y DEO2 #02 .Screen/sprite DEO INC2r STH2kr ORA ,&loop JCN POP2r JMP2r @hline ( x1 x2 -> ) STH2 &loop DUP2 #30 SFT2 .Screen/x DEO2 #02 .Screen/sprite DEO INC2 DUP2 STH2kr LTH2 ,&loop JCN POP2 POP2r JMP2r @vline ( y1 y2 -> ) STH2 &loop DUP2 #30 SFT2 .Screen/y DEO2 #02 .Screen/sprite DEO INC2 DUP2 STH2kr LTH2 ,&loop JCN POP2 POP2r JMP2r @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 .bg-counter LDZ DUP ,&done-bg JCN .bg-frame LDZ2 ( DUP2 NIP LIT "a ADD #18 DEO #0a #18 DEO ) DUP2 ;draw-background JSR2 INC2 #0007 AND2 .bg-frame STZ2 &done-bg INC #03 AND .bg-counter STZ #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 #41 .tint STZ ;draw-cursor JMP2 @show-cursor #44 .tint STZ ;draw-cursor JMP2 @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 .Controller/key DEI #00 EQU ,&skip JCN .Controller/key 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 @read-bel JMP2r @read-bs POP ;scroll JMP2 @read-tab POP POP2r #0000 DIV @read-esc JMP2r @read-del JMP2r @read-cr ( 0d -> ) POP ;hide-cursor JSR2 #0000 .cur-x STZ2 ;down JMP2 @read-nl ( 0a -> ) ,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 -> ) ;hide-cursor JSR2 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 ( cyber background ) @cyber ~chr/cyber.tal ( screen to store characters for redraw, etc. ) @screen $0800 ( 64 x 32 ) @end-screen ( northwest=10 north=40 northeast=28 ) ( west=30 center=56 east=38 ) ( southwest=20 south=48 southeast=08 ) @bg-layout $0800