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
 | 
						|
]
 | 
						|
 | 
						|
{-----------------------------------------------------------------------+
 | 
						|
|                                                                       |
 | 
						|
+-----------------------------------------------------------------------}
 | 
						|
 |