gigatron/rom/Core/Reset_v1.gcl
2025-01-28 19:17:01 +03:00

130 lines
3.9 KiB
Plaintext

{-----------------------------------------------------------------------+
| |
| Reset Gigatron (pseudo) hardware |
| |
+-----------------------------------------------------------------------}
gcl0x
{ Setup video }
[def
{ Setup video indirection table }
$100 p= {videoTable}
$800 q= {frame}
[do
q>, p. p<++ { Y[i] = 8..127}
0 p. p<++ {dX[i] = 0}
q>++ q if>0loop]
{ Clear screen }
$800 p= $8801 i=
\SYS_VDrawBits_134 _sysFn= 32 \sysArgs0. \sysArgs1. {Blue}
[do
p [do
_sysArgs4= 134!! {Clears 8 pixels vertically}
$800 p+ p= if>0loop]
i+ p=
255& 160^ if<>0loop]
ret
] SetupVideo=
[def {PrintStartupMessage}
push
{ Startup message:
+--------------------------+
| *** Gigatron ??K *** |
| TTL microcomputer ROM v1 | }
[def
{Line 1}
$2a# $2a# $2a# $20# $47# $69# $67# $61#
$74# $72# $6f# $6e# $20# $3f# $3f# $4b#
$20# $2a# $2a# $2a# 10#
{Line 2}
$20# $54# $54# $4c# $20# $6d# $69# $63#
$72# $6f# $63# $6f# $6d# $70# $75# $74#
$65# $72# $20# $52# $4f# $4d# $20# $76#
$31# 0#
] Text=
{ Convert memory size into decimal text }
{StartupMessage} 13+ p= {Position within StartupMessage for memory size}
$2f2f Char= {Two ASCII counters, both starting at '0'-1}
\memSize, 1- 255& 1+ {Number of pages as counted at boot}
[do Char>++ 40- if>=0loop] 40+ {Count number of 10K chunks}
[do Char<++ 4- if>=0loop] {Count number of 1K chunks}
Char>, p. p<++ Char p. {Put decimals into StartupMessage}
[do
Text, if<>0 Char= Text<++ {while((Char=*Text++)!=0)...}
10^ [if=0 Pos<. Pos>, 8+ Pos>. else PrintChar!]
loop]
pop ret
] PrintStartupMessage=
{-----------------------------------------------------------------------+
|}\vLR>++ ret{ RAM page 3 |
+-----------------------------------------------------------------------}
$0300:
{ Print a 5x8 character on screen with the built-in font
Char must be in the 32-127 range (this is not checked) }
[def {PrintChar}
{Map ASCII code to offset in font table}
Char 82- [if<0 50+ i= \font32up
else i= \font82up] fontData= {Select low or high page}
i 2<< i+ {Multiply by 5}
fontData+ fontData= {Add to page address to reach bitmap data for Char}
{Draw 5 vertical slices: 5 using font data}
63 \sysArgs1. {White}
Pos _sysArgs4=
6+ Pos=
\SYS_VDrawBits_134 _sysFn=
$fb i= [do
fontData 0?? fontData<++ \sysArgs2. 134!!
\sysArgs4<++
i<++ i if<>0loop]
ret
] PrintChar=
{ Play a note on one channel
High byte is channel, low byte is note (should be even)
Reset the oscillators and channel variables }
[def {SetupChannel}
i= 255| 255^ $fa| p= {Pointer to channel struct}
i<, i= {Extract note}
0 p. p<++ {.wavA}
3 p. p<++ {.wavX, 3=Sawtooth}
\notesTable i+ 0?? p. p<++ {.keyL}
\notesTable i+ 1?? p. p<++ {.keyH}
p. p<++ {.oscL}
p. {.oscH}
ret
] SetupChannel=
{ Setup a G-major chord with 4 channels but don't play it yet }
[def {SetupAudio}
push
$158 {1: G-3} SetupChannel!
$270 {2: G-4} SetupChannel!
$378 {3: B-4} SetupChannel!
$47e {4: D-5} SetupChannel!
pop ret
] SetupAudio=
{ Now it is safe to call functions }
SetupAudio!
SetupVideo!
$812 Pos= PrintStartupMessage!
{ Load and start main program }
\Main _sysArgs0= $200 _vLR= \SYS_Exec_88 _sysFn= 88!!
{-----------------------------------------------------------------------+
| |
+-----------------------------------------------------------------------}