{-----------------------------------------------------------------------+ | | | VTL02 | | | +-----------------------------------------------------------------------} gcl0x {-----------------------------------------------------------------------+ | ROM type check | +-----------------------------------------------------------------------} *=\userCode \romType, \romTypeValue_ROMv4- {Version check >= ROMv4, see Docs/GT1-files.txt} [if<0 do _frameCount _vPCH: {https://forum.gigatron.io/viewtopic.php?f=4&t=130} loop] &_Setup call {-----------------------------------------------------------------------+ | VTL02 | +-----------------------------------------------------------------------} *=$219 _VTL02=* #$a9 #$00 #$85 #$8c #$a9 #$07 #$85 #$8d #$a9 #$00 #$85 #$94 #$a9 #$08 #$85 #$95 #$38 #$d8 #$a2 #$7f #$9a #$90 #$10 #$20 #$52 #$03 #$a9 #$4f #$20 #$f9 #$05 #$a9 #$4b #$20 #$f9 #$05 #$20 #$52 #$03 #$20 #$7d #$05 #$a2 #$86 #$20 #$48 #$05 #$f0 #$39 #$18 #$a5 #$86 #$05 #$87 #$d0 #$41 #$20 #$29 #$03 #$a2 #$90 #$20 #$ad #$03 #$a9 #$20 #$20 #$f9 #$05 #$a9 #$00 #$20 #$33 #$03 #$b0 #$ec #$f0 #$14 #$a4 #$91 #$a6 #$90 #$c4 #$87 #$d0 #$04 #$e4 #$86 #$f0 #$0c #$e8 #$d0 #$01 #$c8 #$86 #$82 #$84 #$83 #$2a #$49 #$01 #$6a #$20 #$29 #$03 #$c8 #$08 #$20 #$57 #$03 #$28 #$a5 #$86 #$05 #$87 #$90 #$d7 #$f0 #$9a #$d0 #$e9 #$98 #$48 #$20 #$9d #$05 #$b0 #$34 #$45 #$86 #$d0 #$30 #$e4 #$87 #$d0 #$2c #$aa #$b1 #$c0 #$a8 #$49 #$ff #$65 #$8c #$85 #$8c #$b0 #$02 #$c6 #$8d #$a5 #$c0 #$85 #$bc #$a5 #$c1 #$85 #$bd #$a5 #$bc #$c5 #$8c #$a5 #$bd #$e5 #$8d #$b0 #$0c #$b1 #$bc #$81 #$bc #$e6 #$bc #$d0 #$ee #$e6 #$bd #$90 #$ea #$68 #$aa #$a5 #$86 #$48 #$a5 #$87 #$48 #$a0 #$02 #$e8 #$c8 #$bd #$ff #$01 #$48 #$d0 #$f8 #$c0 #$04 #$90 #$43 #$aa #$98 #$18 #$65 #$8c #$85 #$bc #$8a #$65 #$8d #$85 #$bd #$a5 #$bc #$c5 #$94 #$a5 #$bd #$e5 #$95 #$b0 #$2d #$a5 #$8c #$d0 #$02 #$c6 #$8d #$c6 *=$300 #$8c #$a5 #$8c #$c5 #$c0 #$a5 #$8d #$e5 #$c1 #$90 #$06 #$a1 #$8c #$91 #$8c #$b0 #$e8 #$98 #$aa #$68 #$88 #$91 #$c0 #$d0 #$fa #$a0 #$02 #$8a #$91 #$c0 #$a5 #$bc #$85 #$8c #$a5 #$bd #$85 #$8d #$4c #$2a #$02 #$20 #$9d #$05 #$b0 #$f8 #$85 #$86 #$86 #$87 #$60 #$c8 #$aa #$8a #$d1 #$c0 #$f0 #$0a #$b1 #$c0 #$f0 #$06 #$20 #$f9 #$05 #$c8 #$10 #$f1 #$aa #$20 #$e5 #$05 #$8a #$f0 #$07 #$20 #$db #$05 #$c9 #$3b #$f0 #$4f #$a9 #$0d #$4c #$f9 #$05 #$20 #$dc #$05 #$f0 #$45 #$c9 #$29 #$f0 #$41 #$c8 #$a2 #$a0 #$20 #$4a #$04 #$20 #$dc #$05 #$20 #$db #$05 #$c9 #$22 #$f0 #$c3 #$a2 #$a2 #$20 #$d8 #$03 #$a5 #$a2 #$a0 #$00 #$a6 #$a1 #$d0 #$12 #$a6 #$a0 #$e0 #$c0 #$f0 #$25 #$e0 #$88 #$f0 #$cd #$e0 #$be #$f0 #$20 #$e0 #$bc #$f0 #$13 #$91 #$a0 #$65 #$8f #$2a #$aa #$c8 #$a5 #$a3 #$91 #$a0 #$65 #$8e #$2a #$85 #$8f #$86 #$8e #$60 #$aa #$a5 #$a3 #$6c #$84 #$00 #$91 #$b8 #$60 #$a2 #$a2 #$a5 #$8a #$48 #$a5 #$8b #$48 #$a9 #$00 #$48 #$95 #$03 #$a9 #$0a #$95 #$02 #$20 #$1d #$05 #$a5 #$8a #$09 #$30 #$48 #$b5 #$00 #$15 #$01 #$d0 #$f2 #$68 #$20 #$f9 #$05 #$68 #$d0 #$fa #$68 #$85 #$8b #$68 #$85 #$8a #$60 #$a9 #$00 #$95 #$00 #$95 #$01 #$a9 #$2b #$48 #$e8 #$e8 #$20 #$f7 #$03 #$ca #$ca #$68 #$20 #$9a #$04 #$20 #$dc #$05 #$f0 #$05 #$c8 #$c9 #$29 #$d0 #$ea #$60 #$20 #$48 #$05 #$d0 #$4d #$20 #$dc #$05 #$c8 *=$400 #$c9 #$3f #$d0 #$17 #$98 #$48 #$a5 #$c0 #$48 #$a5 #$c1 #$48 #$20 #$7d #$05 #$20 #$d8 #$03 #$68 #$85 #$c1 #$68 #$85 #$c0 #$68 #$a8 #$60 #$c9 #$24 #$d0 #$05 #$20 #$eb #$05 #$b0 #$23 #$c9 #$40 #$d0 #$0a #$84 #$88 #$a0 #$00 #$b1 #$b8 #$a4 #$88 #$d0 #$15 #$c9 #$28 #$f0 #$a2 #$20 #$4a #$04 #$a1 #$00 #$48 #$f6 #$00 #$d0 #$02 #$f6 #$01 #$a1 #$00 #$95 #$01 #$68 #$95 #$00 #$60 #$c9 #$3a #$d0 #$11 #$20 #$d8 #$03 #$16 #$00 #$36 #$01 #$a5 #$8c #$95 #$02 #$a5 #$8d #$95 #$03 #$d0 #$2d #$0a #$69 #$40 #$d0 #$72 #$b5 #$00 #$85 #$bc #$b5 #$01 #$85 #$bd #$a9 #$00 #$95 #$00 #$95 #$01 #$a5 #$bc #$05 #$bd #$f0 #$13 #$46 #$bd #$66 #$bc #$90 #$03 #$20 #$8c #$04 #$16 #$02 #$36 #$03 #$b5 #$02 #$15 #$03 #$d0 #$e7 #$60 #$18 #$b5 #$00 #$75 #$02 #$95 #$00 #$b5 #$01 #$75 #$03 #$95 #$01 #$60 #$c9 #$2b #$f0 #$ee #$c9 #$2a #$f0 #$c2 #$c9 #$2f #$f0 #$77 #$c9 #$5b #$f0 #$32 #$c9 #$5d #$f0 #$3c #$ca #$c9 #$2d #$f0 #$41 #$c9 #$21 #$f0 #$52 #$c9 #$5e #$f0 #$58 #$c9 #$26 #$f0 #$40 #$49 #$3c #$85 #$bc #$20 #$f4 #$04 #$c6 #$bc #$d0 #$05 #$15 #$00 #$f0 #$04 #$18 #$a5 #$bc #$2a #$69 #$00 #$29 #$01 #$95 #$00 #$a9 #$00 #$f0 #$20 #$b5 #$00 #$15 #$01 #$f0 #$1c #$b5 #$02 #$95 #$00 #$b5 #$03 #$b0 #$12 #$b5 #$00 #$15 #$01 #$f0 #$9c #$a9 #$00 #$f0 #$e2 #$20 #$f8 #$04 #$e8 #$b5 #$01 #$f5 #$03 #$95 #$01 #$60 #$20 *=$500 #$03 #$05 #$e8 #$b5 #$01 #$35 #$03 #$b0 #$f3 #$20 #$0d #$05 #$e8 #$b5 #$01 #$15 #$03 #$b0 #$e9 #$20 #$17 #$05 #$e8 #$b5 #$01 #$55 #$03 #$b0 #$df #$a9 #$00 #$85 #$8a #$85 #$8b #$a9 #$10 #$85 #$bc #$16 #$00 #$36 #$01 #$26 #$8a #$26 #$8b #$a5 #$8a #$d5 #$02 #$a5 #$8b #$f5 #$03 #$90 #$0a #$85 #$8b #$a5 #$8a #$f5 #$02 #$85 #$8a #$f6 #$00 #$c6 #$bc #$d0 #$e0 #$60 #$a9 #$00 #$95 #$00 #$95 #$01 #$95 #$03 #$20 #$dc #$05 #$84 #$be #$b1 #$c0 #$49 #$30 #$c9 #$0a #$b0 #$13 #$48 #$a9 #$0a #$95 #$02 #$20 #$64 #$04 #$95 #$03 #$68 #$95 #$02 #$20 #$8c #$04 #$c8 #$10 #$e5 #$c4 #$be #$60 #$c9 #$1b #$f0 #$03 #$c8 #$10 #$10 #$20 #$52 #$03 #$a0 #$00 #$84 #$c0 #$a0 #$02 #$84 #$c1 #$a0 #$01 #$88 #$30 #$f0 #$20 #$eb #$05 #$c9 #$5f #$f0 #$f6 #$c9 #$0d #$d0 #$02 #$a9 #$00 #$91 #$c0 #$d0 #$d8 #$a8 #$60 #$a2 #$07 #$a9 #$00 #$90 #$15 #$a6 #$c1 #$a0 #$02 #$a5 #$c0 #$c5 #$8c #$a5 #$c1 #$e5 #$8d #$b0 #$29 #$a5 #$c0 #$71 #$c0 #$90 #$03 #$e8 #$86 #$c1 #$85 #$c0 #$a0 #$00 #$b1 #$c0 #$85 #$90 #$c5 #$86 #$c8 #$b1 #$c0 #$85 #$91 #$e5 #$87 #$c8 #$90 #$d9 #$a5 #$c0 #$c5 #$8c #$a5 #$c1 #$e5 #$8d #$a5 #$90 #$a6 #$91 #$60 #$c8 #$b1 #$c0 #$f0 #$04 #$c9 #$20 #$f0 #$f7 #$60 #$a5 #$0f #$c9 #$ff #$f0 #$14 #$84 #$88 #$a9 #$00 #$00 #$a4 #$88 #$c9 #$03 #$d0 #$03 #$4c #$2a #$02 #$48 #$09 #$80 #$00 #$68 #$38 #$60 {-----------------------------------------------------------------------+ | Initialize | +-----------------------------------------------------------------------} { This code runs once } *=$8a0 _Setup=* &_PrintChar PrintChar= {Forward reference} &_MainLoop _vLR= {Prepare transfer to main loop} &_VTL02 {Start address for 6502 program} [ret] {Jump to Main (the brackets avoid the automatic vLR patch)} {-----------------------------------------------------------------------+ | Main system loop | +-----------------------------------------------------------------------} *=$600 _MainLoop=* _vLR= {Reset v6502 PC} [do \SYS_Run6502_v4_80 _sysFn= k {ASCII code in A} 80!! {Run 6502 code until BRK} push {Save v6502 PC} [if=0 {A=0 reads from keyboard} [do \serialRaw, 255^ {Wait for idle keyboard} if<>0loop] [do \frameCount, 15& [if=0 {4 Hz cursor redraw rate} \frameCount, 48& {Flash at 1 Hz with 75% duty cycle} [if=0 $a0 else $c0] {Select space or '@'} PrintChar! Pos=] {Display cursor and move back} \serialRaw, k= 128& {Key ready?} if<>0loop] {Loop until ready} $a0 PrintChar! Pos= {Overwrite '@' with a space} k $60- [if>=0 $40+ k=] {Map to upper case, and DEL to rubout} k 10^ [if=0 13 k=] {Map LF to CR} else {A<>0 for echo} k= PrintChar! ] pop {Restore v6502 PC} loop] {Back to wozmon} {-----------------------------------------------------------------------+ | Character output with automatic scrolling | +-----------------------------------------------------------------------} _PrintChar=* [ {Minimalistic terminal output, with bit 7 set by WozMon} %-2= {Park character in stack area} \SYS_VDrawBits_134 _sysFn= {Prepare SYS calls} $800 \sysArgs0: {Green on black} %-2 {Get character back} $8d^ [if<>0 {Test for CR...} 0 0] {...or line wrap} [if=0 {-------------------------------------------------------------------+ | Newline | +-------------------------------------------------------------------} {Clear new line first} $100 Pos. Pos {Go to start of next line} \sysArgs4: {Set screen position} \sysArgs2. {Set all-zero output pattern} [do 134!! {SYS call to draw 8 pixels vertically} <\sysArgs4++ {Step 1 pixel right} \sysArgs4, 160^ {Test for end of line} if<>0loop] {Then scroll up by modifying videoTable} $01ee i= {Last entry in video table} [do i, 120- [if<0 128+ else 8+] i. {Rotate by 8 in 8..127 range} i 2- i= {Move to previous entry in video table} $fe^ if<>0loop] {Until all done} ] %-2 $a0- {WozMon sends ASCII with bit 7 set} [if>=0 {If printable} {-------------------------------------------------------------------+ | PrintChar | +-------------------------------------------------------------------} { Draw ASCII character (32..127) on screen in 5x8 pixels } { and advance cursor position } 50- {Map ASCII code to offset in font table} [if<0 50+ i= \font32up {ASCII 32..81} else i= \font82up] {ASCII 82..127} j= i 2<< i+ {Multiply char code by 5} j+ j= {Add to page address to reach bitmap data} Pos \sysArgs4: {Screen position for character} %-2= {Remember this position} 6+ Pos= {Advance by 6 pixels} 5 [do i= {Draw character as 5 vertical bit slices} j 0? \sysArgs2. {Get bit slice as byte from ROM table} 134!! {SYS call to draw 8 pixels vertically} 0loop] {Looping} %-2 {Return position for backspace} ] ret ] {-----------------------------------------------------------------------+ | | +-----------------------------------------------------------------------}