gigatron/rom/Apps/Queens/Queens.gcl
2025-01-28 19:17:01 +03:00

122 lines
2.1 KiB
Plaintext

gcl0x
{ Queens(N) for N=1-10: 51.385 seconds }
$ffff FFFF=
\SYS_LSRW1_48 \sysFn:
[def {Search}
push
10-- cols 0%= diagL 2%= diagR 4%= next 6%= avail 8%=
diagL diagR| FFFF^ cols& avail=
[do
0 avail- avail& next=
if<>0
0% {cols} next^ [if<>0
cols=
2% {diagL} next^ 1<< {LSLW} diagL=
4% {diagR} next^ 48!! {LSRW} diagR=
Search!
avail next^ avail=
loop]
Count 1+ Count=
{Break}
]
0% cols= 2% diagL= 4% diagR= 6% next= 8% avail= 10++
pop ret
] Search=
[def {DrawChar}
{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 i+ tmp= tmp+ i+ {Multiply by 5}
fontData+ fontData= {Add to page address to reach bitmap data for Char}
$800 Pos+ q= {Where to stop the inner drawing loop}
{Draw 6 vertical slices: 5 using font data, the last with all-zeros}
5 i= [do
[if<>0 fontData 0? fontData<++ else 0] bits=
Pos p=
{Draw vertical slice}
[do
bits 128& [if=0 32 {Blue} else Color] p.
bits bits+ bits=
p>++
p q- if<0loop]
Pos<++
i 1- i= if>=0loop]
ret
] DrawChar=
{-----------------------------------------------------------------------+
|}\vLR>++ ret{ RAM page 4 |
+-----------------------------------------------------------------------}
$0400:
[def {DrawNextDigit}
push
Radix=
Value Radix- [if>=0
Value=
$31 Char=
Value [do
Radix-
if>=0
Value=
Char<++
loop
]
DrawChar!
$30 Char=
else
DrawChar!
]
pop ret
] DrawNextDigit=
[def {DrawNumber}
push
Value=
$20 Char=
10000 DrawNextDigit!
1000 DrawNextDigit!
100 DrawNextDigit!
10 DrawNextDigit! $30 Char=
1 DrawNextDigit!
pop ret
] DrawNumber=
[def {NewLine}
$800 Pos+ 255| 255^ Pos=
ret
] NewLine=
{ Main }
63 Color=
[do
1 Q= A= $2000 Pos=
[do
Q DrawNumber!
0 Count=
A cols= 0 diagL= diagR= Search!
Count DrawNumber! NewLine!
A 1<< 1+ A=
Q 1+ Q=
10- if<=0loop]
120 \soundTimer.
Color 9- Color=
loop]