231 lines
11 KiB
Plaintext
231 lines
11 KiB
Plaintext
|
|
{-----------------------------------------------------------------------+
|
|
| |
|
|
| 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...}
|
|
<Pos, 155- if>0 0] {...or line wrap}
|
|
|
|
[if=0
|
|
|
|
{-------------------------------------------------------------------+
|
|
| Newline |
|
|
+-------------------------------------------------------------------}
|
|
|
|
{Clear new line first}
|
|
|
|
$100 <Pos. peek >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}
|
|
<j++ <\sysArgs4++ {Advance to next byte}
|
|
i 1- if>0loop] {Looping}
|
|
|
|
%-2 {Return position for backspace}
|
|
]
|
|
|
|
ret
|
|
]
|
|
|
|
{-----------------------------------------------------------------------+
|
|
| |
|
|
+-----------------------------------------------------------------------}
|
|
|