1083 lines
48 KiB
Plaintext
1083 lines
48 KiB
Plaintext
|
|
{-----------------------------------------------------------------------+
|
|
| |
|
|
| Apple-1 mockup |
|
|
| For testing original Microchess code on v6502 |
|
|
| |
|
|
+-----------------------------------------------------------------------}
|
|
gcl0x
|
|
|
|
{
|
|
Zero page usage:
|
|
$30-$31 Pos
|
|
$32-$33 PrintChar
|
|
$34-$3b WozMon variables
|
|
}
|
|
|
|
_i=$3c {2 bytes}
|
|
_j=$3e {2 bytes}
|
|
_k=$3a {1 bytes, share with wozmon YSAV}
|
|
|
|
{-----------------------------------------------------------------------+
|
|
| ROM type check |
|
|
+-----------------------------------------------------------------------}
|
|
|
|
{ This code runs once and is then reused as the input buffer for wozmon }
|
|
|
|
*=\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 {Continue in page 8}
|
|
|
|
{-----------------------------------------------------------------------+
|
|
| Setup |
|
|
+-----------------------------------------------------------------------}
|
|
|
|
*=$8a0
|
|
|
|
_Setup=* {Continuation of program start}
|
|
|
|
{ Setup video indirection table such that WozMon can be at $7F00/$FF00 }
|
|
\videoTable Pos= {First GCL variable at $30, later becomes Pos}
|
|
120 {7^127}
|
|
[do 127^ {Loop over 7..126 range}
|
|
Pos: <Pos++ <Pos++ {Y[y]=7+j and dX[y]=0}
|
|
1+ 127^ if<>0loop] {Next in range}
|
|
|
|
&_PrintChar PrintChar= {Prepare for vCPU calls}
|
|
|
|
[def #$d0 #$e5 #$f4 #$e5 #$f2 #$a0 #$ca #$e5 #$ee #$ee {Peter Jenn}
|
|
#$e9 #$ee #$e7 #$f3 #$a7 #$a0 #$cd #$e9 #$e3 #$f2 {ings' Micr}
|
|
#$ef #$e3 #$e8 #$e5 #$f3 #$f3 #$a8 #$c3 #$a9 #$b1 {ochess(C)1}
|
|
#$b9 #$b7 #$b6 #$a0 #$e2 #$e5 #$ee #$ec #$ef #$ae {976 benlo.}
|
|
#$e3 #$ef #$ed #0 ] s= {com}
|
|
|
|
[do s, if<>0 {Print message}
|
|
PrintChar!
|
|
<s++ loop]
|
|
|
|
&_Apple1 _vLR= {Prepare transfer to main loop}
|
|
&_CHESS {Start address for 6502 program}
|
|
[ret] {Jump to Main (the brackets avoid the automatic vLR patch)}
|
|
|
|
{-----------------------------------------------------------------------+
|
|
| Microchess |
|
|
+-----------------------------------------------------------------------}
|
|
|
|
{
|
|
(C) COPYRIGHT 1976, PETER JENNINGS, MICROCHESS,
|
|
1612-43 THORNCLIFFE PK DR, TORONTO, CANADA.
|
|
ALL RIGHTS RESERVED. REPRODUCTION BY ANY
|
|
MEANS, IN WHOLE OR IN PART, IS PROHIBITED.
|
|
|
|
Adapted for Gigatron by Marcel van Kervinck, July 2019
|
|
With assistance of Oscar Vermeulen
|
|
|
|
Primarily based on the original KIM-1 sources at
|
|
http://www.benlo.com/microchess/Kim-1Microchess.html
|
|
- Transcribed for assembly by GCL
|
|
- Some changes adopted from Daryl Rictor and Bill Foster
|
|
- All changes to original are marked `[Gigatron]'
|
|
|
|
Published with permission of Peter Jennings, June 2019
|
|
}
|
|
|
|
{ Zero page variables }
|
|
|
|
_BOARD=$50 { LOCATION OF PIECES }
|
|
_BK=$60 { OPPONENT'S PIECES }
|
|
{_SETW} { [Gigatron] Moved to $7A0.$7BF }
|
|
{_MOVEX} { [Gigatron] Moved to $7C0.$7CF }
|
|
{_POINTS} { [Gigatron] Moved to $7D0.$7DF }
|
|
_PIECE=$70 { CURRENT PIECE UNDER ANALYSIS [Gigatron] Was $B0 }
|
|
_SQUARE=$F3 { TO SQUARE OF .PIECE [Gigatron] Was $B1 }
|
|
_SP2=$F4 { STACK POINTER FOR STACK 2 [Gigatron] Was $B2 }
|
|
_SP1=$F5 { STACK POINTER FOR STACK 1 [Gigatron] Was $B3 }
|
|
_INCHEK=$F6 { MOVE INTO CHECK FLAG [Gigatron] Was $B4 }
|
|
_STATE=$F7 { STATE OF ANALYSIS [Gigatron] Was $B5 }
|
|
_MOVEN=$F8 { MOVE TABLE POINTER [Gigatron] Was $B6 }
|
|
_OMOVE=$DC { OPENING POINTER }
|
|
{_OPNING} { [Gigatron] Moved to $7E0.$7FB }
|
|
_WCAP0=$DD { COMPUTER CAPTURE 0 }
|
|
_COUNT=$DE { START OF COUNT TABLE }
|
|
_BCAP2=$DE { OPPONENT CAPTURE 2 }
|
|
_WCAP2=$DF { COMPUTER CAPTURE 2 }
|
|
_BCAP1=$E0 { OPPONENT CAPTURE 1 }
|
|
_WCAP1=$E1 { COMPUTER CAPTURE 1 }
|
|
_BCAP0=$E2 { OPPONENT CAPTURE 0 }
|
|
_MOB=$E3 { MOBILITY }
|
|
_MAXC=$E4 { MAXIMUM CAPTURE }
|
|
_CC=$E5 { CAPTURE COUNT }
|
|
_PCAP=$E6 { PIECE ID OF MAXC }
|
|
_BMOB=$E3 { OPPONENT MOBILITY }
|
|
_BMAXC=$E4 { OPPONENT MAXIMUM CAPTURE }
|
|
_BMCC=$E5 { OPPONENT CAPTURE COUNT [Gigatron] Was BCC (vCPU conflict) }
|
|
_BMAXP=$E6 { OPPONENT MAXP }
|
|
_XMAXC=$E8 { CURRENT MAXIMUM CAPTURE }
|
|
_WMOB=$EB { COMPUTER MOBILITY }
|
|
_WMAXC=$EC { COMPUTER MAXIMUM CAPTURE }
|
|
_WCC=$ED { COMPUTER CAPTURE COUNT }
|
|
_WMAXP=$EE { COMPUTER MAXP }
|
|
_PMOB=$EF { PREVIOUS COMPUTER MOB }
|
|
_PMAXC=$F0 { PREVIOUS COMPUTER MAXC }
|
|
_PCC=$F1 { PREVIOUS COMPUTER CC }
|
|
_PCP=$F2 { PREVIOUS COMPUTER MAXP }
|
|
{_OLDKY=$F3} { KEY INPUT TEMPORARY [Gigatron] Removed }
|
|
_BESTP=$FB { PIECE OF BEST MOVE FOUND }
|
|
_BESTV=$FA { VALUE OF BEST MOVE FOUND }
|
|
_BESTM=$F9 { TO SQUARE OF BEST MOVE }
|
|
_DIS1=$FB { DISPLAY POINT 1 }
|
|
_DIS2=$FA { DISPLAY POINT 2 }
|
|
_DIS3=$F9 { DISPLAY POINT 3 }
|
|
|
|
*=$220 { [Gigatron] Keep $200.$21F as input buffer }
|
|
|
|
{ +++ }
|
|
_CHESS=* #_CLD_ { INITIALIZE }
|
|
#_LDXIM_ #$DB { TWO STACKS [Gigatron] Was #$FF }
|
|
#_TXS_
|
|
#_LDXIM_ #$9F { [Gigatron] Was #$C8 }
|
|
#_STXZ_ #_SP2
|
|
{
|
|
ROUTINES TO LIGHT LED
|
|
DISPLAY AND GET KEY
|
|
FROM KEYBOARD.
|
|
}
|
|
_OUT=* #_LDAIM_ #$8d { [Gigatron] CR }
|
|
#_BRK_ { [Gigatron] Character out }
|
|
#_LDXIM_ #2 { [Gigatron] }
|
|
_NEXT=* #_LDAZX_ #_DIS3 { [Gigatron] }
|
|
#_JSR_ ##_PRBYTE { [Gigatron] Print as hex }
|
|
#_DEX_ { [Gigatron] }
|
|
#_BPL_ #@_NEXT { [Gigatron] }
|
|
#_LDAIM_ #$A0 { [Gigatron] Space }
|
|
#_BRK_ { [Gigatron] Character out }
|
|
#_LDAIM_ #$BF { [Gigatron] '?' }
|
|
#_BRK_ { [Gigatron] Character out}
|
|
#_LDAIM_ #0 { [Gigatron] }
|
|
#_BRK_ { [Gigatron] Wait for input }
|
|
#_PHA_ { [Gigatron] }
|
|
#_ORAIM_ #128 { [Gigatron] Set bit 7 for echo }
|
|
#_BRK_ { [Gigatron] Character out}
|
|
#_PLA_ { [Gigatron] }
|
|
#_ANDIM_ #$4F { [Gigatron] MASK 0-7, AND ALPHA'S }
|
|
|
|
#_CMPIM_ #$43 { [Gigatron] [C] Was #$0C }
|
|
#_BNE_ #@_NOSET { SET UP }
|
|
#_LDXIM_ #$1F { BOARD }
|
|
_WHSET=* #_LDAAX_ ##_SETW { FROM }
|
|
#_STAZX_ #_BOARD { SETW }
|
|
#_DEX_
|
|
#_BPL_ #@_WHSET
|
|
#_STXZ_ #_OMOVE
|
|
#_LDAIM_ #$CC
|
|
#_BNE_ #@_CLDSP
|
|
|
|
_NOSET=* #_CMPIM_ #$45 { [Gigatron] [E] Was #$0E }
|
|
#_BNE_ #@_NOREV { REVERSE }
|
|
#_JSR_ ##_REVERSE { BOARD AS }
|
|
#_LDAIM_ #$EE { IS }
|
|
#_BNE_ #@_CLDSP
|
|
|
|
_NOREV=* #_CMPIM_ #$40 { [Gigatron] [P] Was #$14 [PC] }
|
|
#_BNE_ #@_NOGO { PLAY CHESS }
|
|
#_JSR_ ##_GO
|
|
_CLDSP=* #_STAZ_ #_DIS1 { DISPLAY }
|
|
#_STAZ_ #_DIS2 { ACROSS }
|
|
#_STAZ_ #_DIS3 { DISPLAY }
|
|
#_BNE_ #@_CHESS
|
|
|
|
_NOGO=* #_CMPIM_ #$0D { [Gigatron] [Enter] Was #$0F [F] }
|
|
#_BNE_ #@_NOMV { MOVE MAN }
|
|
#_JSR_ ##_MOVE { AS ENTERED }
|
|
#_JMP_ ##_DISP
|
|
_NOMV=*
|
|
#_CMPIM_ #$41 { [Gigatron] [Q] ***Added to allow game exit*** }
|
|
#_BEQ_ #@_DONE { [Gigatron] quit the game, exit back to system. }
|
|
#_JMP_ ##_INPUT { [Gigatron] process move }
|
|
_DONE=* #_JMP_ ##_GETLINE { [Gigatron] *** MUST set this to YOUR OS starting address }
|
|
{
|
|
THE ROUTINE JANUS DIRECTS THE
|
|
ANALYSIS BY DETERMINING WHAT
|
|
SHOULD OCCUR AFTER EACH MOVE
|
|
GENERATED BY GNM
|
|
}
|
|
{ +++ }
|
|
_JANUS=* #_LDXZ_ #_STATE
|
|
#_BMI_ #@_NOCOUNT
|
|
{
|
|
THIS ROUTINE COUNTS OCCURRENCES
|
|
IT DEPENDS UPON STATE TO INDEX
|
|
THE CORRECT COUNTERS
|
|
}
|
|
_COUNTS=* #_LDAZ_ #_PIECE
|
|
#_BEQ_ #@_OVER { IF STATE=8 }
|
|
#_CPXIM_ #$08 { DO NOT COUNT }
|
|
#_BNE_ #@_OVER { BLK MAX CAP }
|
|
#_CMPZ_ #_BMAXP { MOVES FOR }
|
|
#_BEQ_ #@_XRT { WHITE }
|
|
|
|
_OVER=* #_INCZX_ #_MOB { MOBILITY }
|
|
#_CMPIM_ #$01 { + QUEEN }
|
|
#_BNE_ #@_NOQ { FOR TWO }
|
|
#_INCZX_ #_MOB
|
|
|
|
_NOQ=* #_BVC_ #@_NOCAP
|
|
#_LDYIM_ #$0F { CALCULATE }
|
|
#_LDAZ_ #_SQUARE { POINTS }
|
|
_ELOOP=* #_CMPAY_ ##_BK { CAPTURED }
|
|
#_BEQ_ #@_FOUN { BY THIS }
|
|
#_DEY_ { MOVE }
|
|
#_BPL_ #@_ELOOP
|
|
_FOUN=* #_LDAAY_ ##_POINTS
|
|
#_CMPZX_ #_MAXC
|
|
#_BCC_ #@_LESS { SAVE IF }
|
|
#_STYZX_ #_PCAP { BEST THIS }
|
|
#_STAZX_ #_MAXC { STATE }
|
|
|
|
_LESS=* #_CLC_
|
|
#_PHP_ { ADD TO }
|
|
#_ADCZX_ #_CC { CAPTURE }
|
|
#_STAZX_ #_CC { COUNTS }
|
|
#_PLP_
|
|
|
|
_NOCAP=* #_CPXIM_ #$04
|
|
#_BEQ_ #@_ON4
|
|
#_BMI_ #@_TREE { (=00 ONLY) }
|
|
_XRT=* #_RTS_
|
|
{
|
|
GENERATE FURTHER MOVES FOR COUNT
|
|
AND ANALYSIS
|
|
}
|
|
_ON4=* #_LDAZ_ #_XMAXC { SAVE ACTUAL }
|
|
#_STAZ_ #_WCAP0 { CAPTURE }
|
|
#_LDAIM_ #$00 { STATE=0 }
|
|
#_STAZ_ #_STATE
|
|
#_JSR_ ##_MOVE { GENERATE }
|
|
#_JSR_ ##_REVERSE { IMMEDIATE }
|
|
#_JSR_ ##_GNMZ { REPLY MOVES }
|
|
#_JSR_ ##_REVERSE
|
|
|
|
#_LDAIM_ #$08 { STATE=8 }
|
|
#_STAZ_ #_STATE { GENERATE }
|
|
#_JSR_ ##_GNM { CONTINUATION }
|
|
#_JSR_ ##_UMOVE { MOVES }
|
|
|
|
#_JMP_ ##_STRATGY { FINAL EVALUATION }
|
|
_NOCOUNT=* #_CPXIM_ #$F9
|
|
#_BNE_ #@_TREE
|
|
{
|
|
DETERMINE IF THE KING CAN BE
|
|
TAKEN, USED BY CHKCHK
|
|
}
|
|
#_LDAZ_ #_BK { IS KING }
|
|
#_CMPZ_ #_SQUARE { IN CHECK? }
|
|
#_BNE_ #@_RETJ { SET INCHEK=0 }
|
|
#_LDAIM_ #$00 { IF IT IS }
|
|
#_STAZ_ #_INCHEK
|
|
_RETJ=* #_RTS_
|
|
{
|
|
IF A PIECE HAS BEEN CAPTURED BY
|
|
A TRIAL MOVE, GENERATE REPLIES &
|
|
EVALUATE THE EXCHANGE GAIN/LOSS
|
|
}
|
|
_TREE=* #_BVC_ #@_RETJ { NO CAP }
|
|
#_LDYIM_ #$07 { (PIECES) }
|
|
#_LDAZ_ #_SQUARE
|
|
_LOOPX=* #_CMPAY_ ##_BK
|
|
#_BEQ_
|
|
*=$300
|
|
#@_FOUNX
|
|
#_DEY_
|
|
#_BEQ_ #@_RETJ { (KING) }
|
|
#_BPL_ #@_LOOPX { SAVE }
|
|
_FOUNX=* #_LDAAY_ ##_POINTS { BEST CAP }
|
|
#_CMPZX_ #_BCAP0 { AT THIS }
|
|
#_BCC_ #@_NOMAX { LEVEL }
|
|
#_STAZX_ #_BCAP0
|
|
_NOMAX=* #_DECZ_ #_STATE
|
|
#_LDAIM_ #$FF { [Gigatron] Was #$FB, changed for super blitz }
|
|
#_CMPZ_ #_STATE { TIME TO TURN }
|
|
#_BEQ_ #@_UPTREE { AROUND }
|
|
#_JSR_ ##_GENRM { GENERATE FURTHER }
|
|
_UPTREE=* #_INCZ_ #_STATE { CAPTURES }
|
|
#_RTS_
|
|
|
|
{ THE PLAYER'S MOVE IS INPUT }
|
|
|
|
_INPUT=* #_CMPIM_ #$08 { NOT A LEGAL }
|
|
#_BCS_ #@_ERROR { SQUARE # }
|
|
#_JSR_ ##_DISMV
|
|
_DISP=* #_LDXIM_ #$1F
|
|
_SEARCH=* #_LDAZX_ #_BOARD
|
|
#_CMPZ_ #_DIS2
|
|
#_BEQ_ #@_HERE { DISPLAY }
|
|
#_DEX_ { PIECE AT }
|
|
#_BPL_ #@_SEARCH { FROM }
|
|
_HERE=* #_STXZ_ #_DIS1 { SQUARE }
|
|
#_STXZ_ #_PIECE
|
|
_ERROR=* #_JMP_ ##_CHESS
|
|
{
|
|
GENERATE ALL MOVES FOR ONE
|
|
SIDE, CALL JANUS AFTER EACH
|
|
ONE FOR NEXT STEP
|
|
}
|
|
{ +++ }
|
|
_GNMZ=* #_LDXIM_ #$10 { CLEAR }
|
|
_GNMX=* #_LDAIM_ #$00 { COUNTERS }
|
|
_CLEAR=* #_STAZX_ #_COUNT
|
|
#_DEX_
|
|
#_BPL_ #@_CLEAR
|
|
|
|
_GNM=* #_LDAIM_ #$10 { SET UP }
|
|
#_STAZ_ #_PIECE { PIECE }
|
|
_NEWP=* #_DECZ_ #_PIECE { NEW PIECE }
|
|
#_BPL_ #@_NEX { ALL DONE? }
|
|
#_RTS_ { -YES }
|
|
|
|
_NEX=* #_JSR_ ##_RESETX {READY }
|
|
#_LDYZ_ #_PIECE { GET PIECE }
|
|
#_LDXIM_ #$08
|
|
#_STXZ_ #_MOVEN { COMMON START }
|
|
#_CPYIM_ #$08 { WHAT IS IT? }
|
|
#_BPL_ #@_PAWN { PAWN }
|
|
#_CPYIM_ #$06
|
|
#_BPL_ #@_KNIGHT { KNIGHT }
|
|
#_CPYIM_ #$04
|
|
#_BPL_ #@_BISHOP { BISHOP }
|
|
#_CPYIM_ #$01
|
|
#_BEQ_ #@_QUEEN { QUEEN }
|
|
#_BPL_ #@_ROOK { ROOK }
|
|
|
|
_KING=* #_JSR_ ##_SNGMV { MUST BE KING! }
|
|
#_BNE_ #@_KING { MOVES }
|
|
#_BEQ_ #@_NEWP { 8 TO 1 }
|
|
_QUEEN=* #_JSR_ ##_LINE
|
|
#_BNE_ #@_QUEEN { MOVES }
|
|
#_BEQ_ #@_NEWP { 8 TO 1 }
|
|
|
|
_ROOK=* #_LDXIM_ #$04
|
|
#_STXZ_ #_MOVEN { MOVES }
|
|
_AGNR=* #_JSR_ ##_LINE { 4 TO 1 }
|
|
#_BNE_ #@_AGNR
|
|
#_BEQ_ #@_NEWP
|
|
|
|
_BISHOP=* #_JSR_ ##_LINE
|
|
#_LDAZ_ #_MOVEN { MOVES }
|
|
#_CMPIM_ #$04 { 8 TO 5 }
|
|
#_BNE_ #@_BISHOP
|
|
#_BEQ_ #@_NEWP
|
|
|
|
_KNIGHT=* #_LDXIM_ #$10
|
|
#_STXZ_ #_MOVEN { MOVES }
|
|
_AGNN=* #_JSR_ ##_SNGMV { 16 TO 9 }
|
|
#_LDAZ_ #_MOVEN
|
|
#_CMPIM_ #$08
|
|
#_BNE_ #@_AGNN
|
|
#_BEQ_ #@_NEWP
|
|
|
|
_PAWN=* #_LDXIM_ #$06
|
|
#_STXZ_ #_MOVEN
|
|
_P1=* #_JSR_ ##_CMOVE { RIGHT CAP? }
|
|
#_BVC_ #@_P2
|
|
#_BMI_ #@_P2
|
|
#_JSR_ ##_JANUS { YES }
|
|
_P2=* #_JSR_ ##_RESETX
|
|
#_DECZ_ #_MOVEN { LEFT CAP? }
|
|
#_LDAZ_ #_MOVEN
|
|
#_CMPIM_ #$05
|
|
#_BEQ_ #@_P1
|
|
_P3=* #_JSR_ ##_CMOVE { AHEAD }
|
|
#_BVS_ #@_NEWP { ILLEGAL }
|
|
#_BMI_ #@_NEWP
|
|
#_JSR_ ##_JANUS
|
|
#_LDAZ_ #_SQUARE { GETS TO }
|
|
#_ANDIM_ #$F0 { 3RD RANK? }
|
|
#_CMPIM_ #$20
|
|
#_BEQ_ #@_P3 { DO DOUBLE }
|
|
#_JMP_ ##_NEWP
|
|
{
|
|
CALCULATE SINGLE STEP MOVES
|
|
FOR K, N
|
|
}
|
|
_SNGMV=* #_JSR_ ##_CMOVE { CALC MOVE }
|
|
#_BMI_ #@_ILL1 { -IF LEGAL }
|
|
#_JSR_ ##_JANUS { -EVALUATE }
|
|
_ILL1=* #_JSR_ ##_RESETX
|
|
#_DECZ_ #_MOVEN
|
|
#_RTS_
|
|
{
|
|
CALCULATE ALL MOVES DOWN A
|
|
STRAIGHT LINE FOR Q,B,R
|
|
}
|
|
_LINE=* #_JSR_ ##_CMOVE { CALC MOVE }
|
|
#_BCC_ #@_OVL { NO CHK }
|
|
#_BVC_ #@_LINE { CH,NOCAP }
|
|
_OVL=* #_BMI_ #@_ILL { RETURN }
|
|
#_PHP_
|
|
#_JSR_ ##_JANUS { EVALUATE POSN }
|
|
#_PLP_
|
|
#_BVC_ #@_LINE { NOT A CAP }
|
|
_ILL=* #_JSR_ ##_RESETX { LINE STOPPED }
|
|
#_DECZ_ #_MOVEN { NEXT DIR }
|
|
#_RTS_
|
|
{
|
|
EXCHANGE SIDES FOR REPLY
|
|
ANALYSIS
|
|
}
|
|
_REVERSE=* #_LDXIM_ #$0F
|
|
_ETC=* #_SEC_
|
|
#_LDYZX_ #_BK { SUBTRACT }
|
|
#_LDAIM_ #$77 { POSITION }
|
|
#_SBCZX_ #_BOARD { FROM 77 }
|
|
#_STAZX_ #_BK
|
|
#_STYZX_ #_BOARD { AND }
|
|
#_SEC_
|
|
#_LDAIM_ #$77 { EXCHANGE }
|
|
#_SBCZX_ #_BOARD { PIECES }
|
|
#_STAZX_ #_BOARD
|
|
#_DEX_
|
|
#_BPL_ #@_ETC
|
|
#_RTS_
|
|
*=$400
|
|
{
|
|
CMOVE CALCULATES THE TO SQUARE
|
|
USING .SQUARE AND THE MOVE
|
|
TABLE. FLAGS SET AS FOLLOWS:
|
|
N - ILLEGAL MOVE
|
|
V - CAPTURE (LEGAL UNLESS IN CH)
|
|
C - ILLEGAL BECAUSE OF CHECK
|
|
[MY THANKS TO JIM BUTTERFIELD
|
|
WHO WROTE THIS MORE EFFICIENT
|
|
VERSION OF CMOVE]
|
|
}
|
|
_CMOVE=* #_LDAZ_ #_SQUARE { GET SQUARE }
|
|
#_LDXZ_ #_MOVEN { MOVE POINTER }
|
|
#_CLC_
|
|
#_ADCAX_ ##_MOVEX { MOVE LIST }
|
|
#_STAZ_ #_SQUARE { NEW POS'N }
|
|
#_ANDIM_ #$88
|
|
#_BNE_ #@_ILLEGAL { OFF BOARD }
|
|
#_LDAZ_ #_SQUARE
|
|
|
|
#_LDXIM_ #$20
|
|
_LOOP=* #_DEX_ { IS TO }
|
|
#_BMI_ #@_NO { SQUARE }
|
|
#_CMPZX_ #_BOARD { OCCUPIED? }
|
|
#_BNE_ #@_LOOP
|
|
|
|
#_CPXIM_ #$10 { BY SELF? }
|
|
#_BMI_ #@_ILLEGAL
|
|
|
|
#_LDAIM_ #$7F { MUST BE CAP! }
|
|
#_ADCIM_ #$01 { SET V FLAG }
|
|
#_BVS_ #@_SPX { (JMP) }
|
|
|
|
_NO=* #_CLV_ { NO CAPTURE }
|
|
|
|
_SPX=* #_LDAZ_ #_STATE { SHOULD WE }
|
|
#_BMI_ #@_RETL { DO THE }
|
|
#_CMPIM_ #$00 { CHECK CHECK? [Gigatron] Was #$08, changed for super blitz }
|
|
#_BPL_ #@_RETL
|
|
{
|
|
CHKCHK REVERSES SIDES
|
|
AND LOOKS FOR A KING
|
|
CAPTURE TO INDICATE
|
|
ILLEGAL MOVE BECAUSE OF
|
|
CHECK. SINCE THIS IS
|
|
TIME CONSUMING, IT IS NOT
|
|
ALWAYS DONE.
|
|
}
|
|
_CHKCHK=* #_PHA_ { STATE }
|
|
#_PHP_
|
|
#_LDAIM_ #$F9
|
|
#_STAZ_ #_STATE { GENERATE }
|
|
#_STAZ_ #_INCHEK { ALL REPLY }
|
|
#_JSR_ ##_MOVE { MOVES TO }
|
|
#_JSR_ ##_REVERSE { SEE IF KING }
|
|
#_JSR_ ##_GNM { IS IN }
|
|
#_JSR_ ##_RUM { CHECK }
|
|
#_PLP_
|
|
#_PLA_
|
|
#_STAZ_ #_STATE
|
|
#_LDAZ_ #_INCHEK
|
|
#_BMI_ #@_RETL { NO - SAFE }
|
|
#_SEC_ { YES - IN CHK }
|
|
#_LDAIM_ #$FF
|
|
#_RTS_
|
|
|
|
_RETL=* #_CLC_ { LEGAL }
|
|
#_LDAIM_ #$00 { RETURN }
|
|
#_RTS_
|
|
|
|
_ILLEGAL=* #_LDAIM_ #$FF
|
|
#_CLC_ { ILLEGAL }
|
|
#_CLV_ { RETURN }
|
|
#_RTS_
|
|
{
|
|
REPLACE .PIECE ON CORRECT .SQUARE
|
|
}
|
|
_RESETX=* #_LDXZ_ #_PIECE { GET LOGAT. }
|
|
#_LDAZX_ #_BOARD { FOR PIECE }
|
|
#_STAZ_ #_SQUARE { FROM BOARD }
|
|
#_RTS_
|
|
|
|
_GENRM=* #_JSR_ ##_MOVE { MAKE MOVE }
|
|
_GENR2=* #_JSR_ ##_REVERSE { REVERSE BOARD }
|
|
#_JSR_ ##_GNM { GENERATE MOVES }
|
|
_RUM=* #_JSR_ ##_REVERSE { REVERSE BACK }
|
|
{
|
|
ROUTINE TO UNMAKE A MOVE MADE BY
|
|
MOVE
|
|
}
|
|
_UMOVE=* #_TSX_ { UNMAKE MOVE }
|
|
#_STXZ_ #_SP1
|
|
#_LDXZ_ #_SP2 { EXCHANGE }
|
|
#_TXS_ { STACKS }
|
|
#_PLA_ { MOVEN }
|
|
#_STAZ_ #_MOVEN
|
|
#_PLA_ { CAPTURED }
|
|
#_STAZ_ #_PIECE { PIECE }
|
|
#_TAX_
|
|
#_PLA_ { FROM SQUARE }
|
|
#_STAZX_ #_BOARD
|
|
#_PLA_ { PIECE }
|
|
#_TAX_
|
|
#_PLA_ { TO SOUARE }
|
|
#_STAZ_ #_SQUARE
|
|
#_STAZX_ #_BOARD
|
|
#_JMP_ ##_STRV
|
|
{
|
|
THIS ROUTINE MOVES .PIECE
|
|
TO .SQUARE, PARAMETERS
|
|
ARE SAVED IN A STACK TO UNMAKE
|
|
THE MOVE LATER
|
|
}
|
|
_MOVE=* #_TSX_
|
|
#_STXZ_ #_SP1 { SWITCH }
|
|
#_LDXZ_ #_SP2 { STACKS }
|
|
#_TXS_
|
|
#_LDAZ_ #_SQUARE
|
|
#_PHA_ { TO SQUARE }
|
|
#_TAY_
|
|
#_LDXIM_ #$1F
|
|
_CHECK=* #_CMPZX_ #_BOARD { CHECK FOR }
|
|
#_BEQ_ #@_TAKE { CAPTURE }
|
|
#_DEX_
|
|
#_BPL_ #@_CHECK
|
|
_TAKE=* #_LDAIM_ #$CC
|
|
#_STAZX_ #_BOARD
|
|
#_TXA_ { CAPTURED }
|
|
#_PHA_ { PIECE }
|
|
#_LDXZ_ #_PIECE
|
|
#_LDAZX_ #_BOARD
|
|
#_STYZX_ #_BOARD { FROM }
|
|
#_PHA_ { SQUARE }
|
|
#_TXA_
|
|
#_PHA_ { PIECE }
|
|
#_LDAZ_ #_MOVEN
|
|
#_PHA_ { MOVEN }
|
|
_STRV=* #_TSX_
|
|
#_STXZ_ #_SP2 { SWITCH }
|
|
#_LDXZ_ #_SP1 { STACKS }
|
|
#_TXS_ { BACK }
|
|
#_RTS_
|
|
{
|
|
CONTINUATION OF SUB STRATGY
|
|
-CHECKS FOR CHECK OR CHECKMATE
|
|
AND ASSIGNS VALUE TO MOVE
|
|
}
|
|
_CKMATE=* #_LDXZ_ #_BMAXC { CAN BLK CAP }
|
|
#_CPX_ ##_POINTS { MY KING? }
|
|
#_BNE_ #@_NOCHEK
|
|
#_LDAIM_ #$00 { GULP! }
|
|
#_BEQ_ #@_RETV { DUMB MOVE! }
|
|
|
|
_NOCHEK=* #_LDXZ_ #_BMOB { IS BLACK }
|
|
#_BNE_ #@_RETV { UNABLE TO }
|
|
#_LDXZ_ #_WMAXP { MOVE AND }
|
|
#_BNE_ #@_RETV { KING IN CH? }
|
|
#_LDAIM_ #$FF { YES! MATE }
|
|
|
|
_RETV=* #_LDXIM_ #$04 { RESTORE }
|
|
#_STXZ_ #_STATE { STATE=4 }
|
|
{
|
|
THE VALUE OF THE MOVE (IN ACCU)
|
|
IS COMPARED TO THE BEST MOVE AND
|
|
REPLACES IT IF IT IS BETTER
|
|
}
|
|
{_PUSH} #_CMPZ_ #_BESTV { IS THIS BEST }
|
|
#_BCC_ #@_RETP { MOVE SO FAR? }
|
|
#_BEQ_ #@_RETP
|
|
#_STAZ_ #_BESTV { YES! }
|
|
#_LDAZ_ #_PIECE { SAVE IT }
|
|
#_STAZ_ #_BESTP
|
|
#_LDAZ_ #_SQUARE
|
|
#_STAZ_ #_BESTM { FLASH DISPLAY }
|
|
_RETP=*
|
|
#_LDAIM_ #$AE { [Gigatron] '.' }
|
|
#_BRK_ { [Gigatron] Character out }
|
|
#_RTS_ { [Gigatron] }
|
|
{
|
|
MAIN PROGRAM TO PLAY CHESS
|
|
PLAY FROM OPENING OR THINK
|
|
}
|
|
_GO=* #_LDXZ_ #_OMOVE { OPENING? }
|
|
#_BPL_ #@_NOOPEN { -NO }
|
|
#_LDAZ_ #_DIS3 { -YES WAS }
|
|
#_CMPAX_ ##_OPNING { OPPONENT'S }
|
|
#_BNE_ #@_END { MOVE OK? }
|
|
#_DEX_
|
|
#_LDAAX_ ##_OPNING { GET NEXT }
|
|
#_STAZ_ #_DIS1 { CANNED }
|
|
#_DEX_ { OPENING MOVE }
|
|
#_LDAAX_ ##_OPNING
|
|
#_STAZ_ #_DIS3 { DISPLAY IT }
|
|
#_DEX_
|
|
#_STXZ_ #_OMOVE { MOVE IT }
|
|
#_BNE_ #@_MV2 { (JMP) }
|
|
|
|
_END=* #_STAZ_ #_OMOVE { FLAG OPENING }
|
|
_NOOPEN=* #_LDXIM_ #$0C { FINISHED }
|
|
#_STXZ_ #_STATE { STATE=C }
|
|
#_STXZ_ #_BESTV { CLEAR BESTV }
|
|
#_LDXIM_
|
|
*=$500
|
|
#$14 { GENERATE P }
|
|
#_JSR_ ##_GNMX { MOVES }
|
|
|
|
#_LDXIM_ #$04 { STATE=4 }
|
|
#_STXZ_ #_STATE { GENERATE AND }
|
|
#_JSR_ ##_GNMZ { TEST AVAILABLE }
|
|
{ MOVES }
|
|
|
|
#_LDXZ_ #_BESTV { GET BEST MOVE }
|
|
#_CPXIM_ #$0F { IF NONE }
|
|
#_BCC_ #@_MATE { OH OH! }
|
|
|
|
_MV2=* #_LDXZ_ #_BESTP { MOVE }
|
|
#_LDAZX_ #_BOARD { THE }
|
|
#_STAZ_ #_BESTV { BEST }
|
|
#_STXZ_ #_PIECE { MOVE }
|
|
#_LDAZ_ #_BESTM
|
|
#_STAZ_ #_SQUARE { AND DISPLAY }
|
|
#_JSR_ ##_MOVE { IT }
|
|
#_JMP_ ##_CHESS
|
|
|
|
_MATE=* #_LDAIM_ #$FF { RESIGN }
|
|
#_RTS_ { OR STALEMATE }
|
|
{
|
|
SUBROUTINE TO ENTER THE
|
|
PLAYER'S MOVE
|
|
}
|
|
_DISMV=* #_LDXIM_ #$04 { ROTATE }
|
|
_ROL=* #_ASLZ_ #_DIS3 { KEY }
|
|
#_ROLZ_ #_DIS2 { INTO }
|
|
#_DEX_ { DISPLAY }
|
|
#_BNE_ #@_ROL
|
|
#_ORAZ_ #_DIS3
|
|
#_STAZ_ #_DIS3
|
|
#_STAZ_ #_SQUARE
|
|
#_RTS_
|
|
{
|
|
THE FOLLOWING SUBROUTINE ASSIGNS
|
|
A VALUE TO THE MOVE UNDER
|
|
CONSIDERATION AND RETURNS IT IN
|
|
THE ACCUMULATOR
|
|
}
|
|
{ +++ }
|
|
_STRATGY=* #_CLC_
|
|
#_LDAIM_ #$80
|
|
#_ADCZ_ #_WMOB { PARAMETERS }
|
|
#_ADCZ_ #_WMAXC { WITH WEIGHT }
|
|
#_ADCZ_ #_WCC { OF 0.25 }
|
|
#_ADCZ_ #_WCAP1
|
|
#_ADCZ_ #_WCAP2
|
|
#_SEC_
|
|
#_SBCZ_ #_PMAXC
|
|
#_SBCZ_ #_PCC
|
|
#_SBCZ_ #_BCAP0
|
|
#_SBCZ_ #_BCAP1
|
|
#_SBCZ_ #_BCAP2
|
|
#_SBCZ_ #_PMOB
|
|
#_SBCZ_ #_BMOB
|
|
#_BCS_ #@_POS { UNDERFLOW }
|
|
#_LDAIM_ #$00 { PREVENTION }
|
|
_POS=* #_LSRA_
|
|
#_CLC_ { ************** }
|
|
#_ADCIM_ #$40
|
|
#_ADCZ_ #_WMAXC { PARAMETERS }
|
|
#_ADCZ_ #_WCC { WITH WEIGHT }
|
|
#_SEC_ { OF 0.5 }
|
|
#_SBCZ_ #_BMAXC
|
|
#_LSRA_ { ************** }
|
|
#_CLC_
|
|
#_ADCIM_ #$90
|
|
#_ADCZ_ #_WCAP0 { PARAMETERS }
|
|
#_ADCZ_ #_WCAP0 { WITH WEIGHT }
|
|
#_ADCZ_ #_WCAP0 { OF 1.0 }
|
|
#_ADCZ_ #_WCAP0
|
|
#_ADCZ_ #_WCAP1
|
|
#_SEC_ { [UNDER OR OVER- }
|
|
#_SBCZ_ #_BMAXC { FLOW MAY OCCUR }
|
|
#_SBCZ_ #_BMAXC { FROM THIS }
|
|
#_SBCZ_ #_BMCC { SECTION] }
|
|
#_SBCZ_ #_BMCC
|
|
#_SBCZ_ #_BCAP1
|
|
#_LDXZ_ #_SQUARE { *************** }
|
|
#_CPXIM_ #$33
|
|
#_BEQ_ #@_POSN { POSITION }
|
|
#_CPXIM_ #$34 { BONUS FOR }
|
|
#_BEQ_ #@_POSN { MOVE TO }
|
|
#_CPXIM_ #$22 { CENTRE }
|
|
#_BEQ_ #@_POSN { OR }
|
|
#_CPXIM_ #$25 { OUT OF }
|
|
#_BEQ_ #@_POSN { BACK RANK }
|
|
#_LDXZ_ #_PIECE
|
|
#_BEQ_ #@_NOPOSN
|
|
#_LDYZX_ #_BOARD
|
|
#_CPYIM_ #$10
|
|
#_BPL_ #@_NOPOSN
|
|
_POSN=* #_CLC_
|
|
#_ADCIM_ #$02
|
|
_NOPOSN=* #_JMP_ ##_CKMATE { CONTINUE }
|
|
|
|
*=$7A0 { Tables fit nicely in Gigatron screen memory }
|
|
|
|
{ INITIAL PIECE LOCATIONS }
|
|
_SETW=* #$03 #$04 #$00 #$07 #$02 #$05 #$01 #$06
|
|
#$10 #$17 #$11 #$16 #$12 #$15 #$14 #$13
|
|
#$73 #$74 #$70 #$77 #$72 #$75 #$71 #$76
|
|
#$60 #$67 #$61 #$66 #$62 #$65 #$64
|
|
_MOVEX=* #$63
|
|
{ TABLE OF MOVE DIRECTIONS }
|
|
#$F0 #$FF #$01 #$10 #$11 #$0F #$EF #$F1
|
|
#$DF #$E1 #$EE #$F2 #$12 #$0E #$1F #$21
|
|
|
|
{ TABLE OF PIECE VALUES }
|
|
_POINTS=* #$0B #$0A #$06 #$06 #$04 #$04 #$04 #$04
|
|
#$02 #$02 #$02 #$02 #$02 #$02 #$02 #$02
|
|
|
|
{ OPENING MOVE TABLE }
|
|
{ GIUOCO PIANO (COMPUTER IS WHITE) }
|
|
#$99 #$25 #$0B #$25 #$01 #$00 #$33 #$25
|
|
#$07 #$36 #$34 #$0D #$34 #$34 #$0E #$52
|
|
#$25 #$0D #$45 #$35 #$04 #$55 #$22 #$06
|
|
#$43 #$33 #$0F #$CC
|
|
_OPNING=$6FC { _OPNING[$FF] == $CC }
|
|
|
|
{
|
|
----------------------------------------------------------------
|
|
| | FRENCH | GIUOCO | RUY | QUEEN'S | FOUR |
|
|
|ADDR|W DEFENCE B|W PIANO B|W LOPEZ B|W INDIAN B|W KNIGHTS B|
|
|
|----+-----------+-----------+-----------+-----------+-----------|
|
|
| DB |CC 44|CC 44|CC 44|CC 43|CC 44|
|
|
| DA |0F P-K3 0F|0F P-K4 0F|0F P-K4 0F|0E P-Q4 06|0F P-K4 0F|
|
|
| D9 |33 P-K3 24|33 P-K4 34|33 P-K4 34|34 N-KB3 25|33 P-K4 34|
|
|
| D8 |53 43|43 55|43 55|52 42|43 55|
|
|
| D7 |0E P-Q4 0E|06 N-KB3 07|06 N-KB3 07|0D P-QB4 0F|06 N-KB3 07|
|
|
| D6 |43 P-Q4 33|22 N-QB3 22|22 N-QB3 22|35 P-K3 24|22 N-QB3 22|
|
|
| D5 |44 52|55 42|55 31|53 55|55 52|
|
|
| D4 |07 N-QB3 06|04 B-B4 04|04 B-N5 06|06 N-KB3 0B|07 N-B3 06|
|
|
| D3 |25 N-KB3 25|35 B-B4 32|46 N-B3 25|22 P-QN3 21|25 N-B3 25|
|
|
| D2 |52 36|45 52|52 75|56 56|52 31|
|
|
| D1 |05 B-N5 04|0D P-B3 06|00 O-O 06|0A P-KN3 05|04 B-N5 04|
|
|
| D0 |41 B-K2 14|25 N-B3 25|01 NxP 44|21 B-N2 11|46 B-N5 41|
|
|
| CF |63 34|52 43|33 43|66 66|36 75|
|
|
| CE |0F P-K5 06|0E P-Q4 0F|0E P-Q4 04|04 B-N2 04|00 O-O 00|
|
|
| CD |43 KN-Q2 13|34 PxP 43|34 B-K2 14|11 B-K2 14|01 O-O 06|
|
|
| CC |64 14|34 43|63 64|63 75|72 53|
|
|
| CB |05 BxB 01|0D PxP 04|01 Q-K2 06|00 O-O 00|0E P-Q3 0E|
|
|
| CA |63 QxB 14|34 B-N5 41|13 N-Q3 23|01 O-O 06|24 P-Q3 23|
|
|
| C9 |63 63|36 52|54 22|72 52|54 36|
|
|
| C8 |01 Q-Q2 00|07 N-B3 06|04 BxN 0B|07 N-B3 06|05 B-N5 04|
|
|
| C7 |14 O-O 06|25 NxKP 44|55 NPxB 22|25 N-K5 44|41 BxN 52|
|
|
| C6 |72 45|33 75|55 34|33 62|25 52|
|
|
| C5 |0C P-B4 0D|00 O-O 06|0E PxP 06|01 Q-B2 06|0B PxB 01|
|
|
| C4 |32 P-QB4 32|01 NxN 52|43 N-N2 11|15 NxN 52|25 Q-K2 14|
|
|
| C3 |45 55|25 52|66 52|25 52|63 74|
|
|
| C2 |06 N-B3 07|0B PxN 04|07 N-B3 00|01 QxN 0C|02 R-K1 07|
|
|
| C1 |22 N-QB3 22|25 BxP 52|25 O-O 06|25 P-KB4 35|03 N-Q1 03|
|
|
| C0 |99 99|99 99|99 99|99 99|99 99|
|
|
----------------------------------------------------------------
|
|
}
|
|
|
|
{-----------------------------------------------------------------------+
|
|
| Main loop |
|
|
+-----------------------------------------------------------------------}
|
|
|
|
*=$600
|
|
|
|
_Apple1=*
|
|
|
|
_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, 119- [if<0 127+
|
|
else 7+] _i. {Rotate by 8 in 7..126 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
|
|
]
|
|
|
|
{-----------------------------------------------------------------------+
|
|
| WozMon |
|
|
+-----------------------------------------------------------------------}
|
|
|
|
*=$ff00
|
|
|
|
{ Original ZP usage is 24.2B, but that's taken by Gigatron }
|
|
|
|
_XAML=$34 _XAML_MINUS1=$33
|
|
_XAMH=$35
|
|
_STL=$36 _STL_MINUS1=$35
|
|
_STH=$37
|
|
_L=$38 _L_MINUS1=$37
|
|
_H=$39
|
|
_YSAV=$3A
|
|
_MODE=$3B
|
|
|
|
{ Patches with respect to original are marked [Gigatron] }
|
|
|
|
_IN=$200
|
|
|
|
_KBD=$D010
|
|
_KBDCR=$D011
|
|
_DSP=$D012
|
|
_DSPCR=$D013
|
|
|
|
_RESET=* #_CLD_ { Clear decimal arithmetic mode. }
|
|
#_CLI_
|
|
#_LDYIM_ #$7F { Mask for DSP data direction register. }
|
|
#_STY_ ##_DSP
|
|
#_LDAIM_ #$A7 { KBD and DSP control register mask. }
|
|
#_STA_ ##_KBDCR
|
|
#_STA_ ##_DSPCR
|
|
_NOTCR=* #_CMPIM_ #$DF { "<-"? }
|
|
#_BEQ_ #@_BACKSPACE { Yes. }
|
|
#_CMPIM_ #$9B { ESC? }
|
|
#_BEQ_ #@_ESCAPE { Yes. }
|
|
#_INY_ { Advance text index. }
|
|
#_BPL_ #@_NEXTCHAR { Auto ESC if > 127. }
|
|
_ESCAPE=* #_LDAIM_ #$DC { "\". }
|
|
#_JSR_ ##_ECHO { Output it. }
|
|
_GETLINE=* #_LDAIM_ #$8D { CR. }
|
|
#_JSR_ ##_ECHO { Output it. }
|
|
#_LDYIM_ #$01 { Initiallize text index. }
|
|
_BACKSPACE=* #_DEY_ { Back up text index. }
|
|
#_BMI_ #@_GETLINE { Beyond start of line, reinitialize. }
|
|
_NEXTCHAR=* #_LDAIM_ #$00 { [Gigatron] A=0 to read keyboard. }
|
|
#_BRK_ { [Gigatron] Transfer to vCPU for input. }
|
|
#_ORAIM_ #$80 { [Gigatron] B7 should be '1'. }
|
|
#_BIT_ ##_KBD { [Gigatron] Was: LDA }
|
|
#_STAAY_ ##_IN { Add to text buffer. }
|
|
#_JSR_ ##_ECHO { Display character. }
|
|
#_CMPIM_ #$8D { CR? }
|
|
#_BNE_ #@_NOTCR { No. }
|
|
#_LDYIM_ #$FF { Reset text index. }
|
|
#_LDAIM_ #$00 { For XAM mode. }
|
|
#_TAX_ { 0->X. }
|
|
_SETSTOR=* #_ASLA_ { Leaves $7B if setting STOR mode. }
|
|
_SETMODE=* #_STAZ_ #_MODE { $00 = XAM, $7B= STOR,$AE= BLOK XAM }
|
|
_BLSKIP=* #_INY_ { Advance text index. }
|
|
_NEXTITEM=* #_LDAAY_ ##_IN { Get character. }
|
|
#_CMPIM_ #$8D { CR? }
|
|
#_BEQ_ #@_GETLINE { Yes, done this line. }
|
|
#_CMPIM_ #$AE { "."? }
|
|
#_BCC_ #@_BLSKIP { Skip delimiter. }
|
|
#_BEQ_ #@_SETMODE { Yes, BLOCK XAM mode. }
|
|
#_CMPIM_ #$BA { ":"? }
|
|
#_BEQ_ #@_SETSTOR { Yes, set STOR mode. }
|
|
#_CMPIM_ #$D2 { "R"? }
|
|
#_BEQ_ #@_RUN { Yes, run user program. }
|
|
#_STXZ_ #_L { $00->L. }
|
|
#_STXZ_ #_H { and H. }
|
|
#_STYZ_ #_YSAV { Save Y for comparison. }
|
|
_NEXTHEX=* #_LDAAY_ ##_IN { Get character for hex test. }
|
|
#_EORIM_ #$B0 { Map digits to $0-9. }
|
|
#_CMPIM_ #$0A { Digit? }
|
|
#_BCC_ #@_DIG { Yes. }
|
|
#_ADCIM_ #$88 { Map letter "A"-"F" to $FA-FF. }
|
|
#_CMPIM_ #$FA { Hex letter? }
|
|
#_BCC_ #@_NOTHEX { No, character not hex. }
|
|
_DIG=* #_ASLA_ { }
|
|
#_ASLA_ { Hex digit to MSD of A. }
|
|
#_ASLA_ { }
|
|
#_ASLA_ { }
|
|
#_LDXIM_ #$04 { Shift count. }
|
|
_HEXSHIFT=* #_ASLA_ { Hex digit left, MSB to carry. }
|
|
#_ROLZ_ #_L { Rotate into LSD. }
|
|
#_ROLZ_ #_H { Rotate into MSD's. }
|
|
#_DEX_ { Done 4 shifts? }
|
|
#_BNE_ #@_HEXSHIFT { No, loop. }
|
|
#_INY_ { Advance text index. }
|
|
#_BNE_ #@_NEXTHEX { Always taken. Check next character for hex.}
|
|
_NOTHEX=* #_CPYZ_ #_YSAV { Check if L, H empty (no hex digits). }
|
|
#_BEQ_ #@_ESCAPE { Yes, generate ESC sequence. }
|
|
#_BITZ_ #_MODE { Test MODE byte. }
|
|
#_BVC_ #@_NOTSTOR { B6 = 0 for STOR, 1 for XAM and BLOCK XAM}
|
|
#_LDAZ_ #_L { LSD's of hex data. }
|
|
#_STAIX_ #_STL { Store at current 'store index'. }
|
|
#_INCZ_ #_STL { Increment store index. }
|
|
#_BNE_ #@_NEXTITEM { Get next item. (no carry). }
|
|
#_INCZ_ #_STH { Add carry to 'store index' high order. }
|
|
_TONEXTITEM=* #_JMP_ ##_NEXTITEM { Get next command item. }
|
|
_RUN=* #_JMI_ ##_XAML { Run at current XAM index. }
|
|
_NOTSTOR=* #_BMI_ #@_XAMNEXT { B7 = 0 for XAM, 1 for BLOCK XAM. }
|
|
#_LDXIM_ #$02 { Byte count. }
|
|
_SETADR=* #_LDAZX_ #_L_MINUS1 { Copy hex data to }
|
|
#_STAZX_ #_STL_MINUS1 { 'store index'. }
|
|
#_STAZX_ #_XAML_MINUS1 { And to 'XAM index'. }
|
|
#_DEX_ { Next of 2 bytes. }
|
|
#_BNE_ #@_SETADR { Loop unless X = 0. }
|
|
_NXTPRNT=* #_BNE_ #@_PRDATA { NE means no address to print. }
|
|
#_LDAIM_ #$8D { CR. }
|
|
#_JSR_ ##_ECHO { Output it. }
|
|
#_LDAZ_ #_XAMH { 'Examine index' high-order byte. }
|
|
#_JSR_ ##_PRBYTE { Output it in hex format. }
|
|
#_LDAZ_ #_XAML { Low-order 'examine index' byte. }
|
|
#_JSR_ ##_PRBYTE { Output it in hex format. }
|
|
#_LDAIM_ #$BA { ":". }
|
|
#_JSR_ ##_ECHO { Output it. }
|
|
_PRDATA=* #_LDAIM_ #$04 { [Gigatron] 4 pixels wide blank. }
|
|
#_JSR_ ##_BLANK { [Gigatron] Output it. }
|
|
#_LDAIX_ #_XAML { Get data byte at 'examine index'. }
|
|
#_JSR_ ##_PRBYTE { Output it in hex format. }
|
|
_XAMNEXT=* #_STXZ_ #_MODE { 0->MODE (XAM mode). }
|
|
#_LDAZ_ #_XAML { }
|
|
#_CMPZ_ #_L { Compare 'examine index' to hex data. }
|
|
#_LDAZ_ #_XAMH { }
|
|
#_SBCZ_ #_H { }
|
|
#_BCS_ #@_TONEXTITEM { Not less, so no more data to output. }
|
|
#_INCZ_ #_XAML { }
|
|
#_BNE_ #@_MOD8CHK { Increment 'examine index'. }
|
|
#_INCZ_ #_XAMH { }
|
|
_MOD8CHK=* #_LDAZ_ #_XAML { Check low-order 'examine index' byte }
|
|
#_ANDIM_ #$07 { For MOD 8= 0 }
|
|
#_BPL_ #@_NXTPRNT { Always taken. }
|
|
_PRBYTE=* #_PHA_ { Save A for LSD. }
|
|
#_LSRA_ { }
|
|
#_LSRA_ { }
|
|
#_LSRA_ { MSD to LSD position. }
|
|
#_LSRA_ { }
|
|
#_JSR_ ##_PRHEX { Output hex digit. }
|
|
#_PLA_ { Restore A. }
|
|
_PRHEX=* #_ANDIM_ #$0F { Mask LSD for hex print. }
|
|
#_ORAIM_ #$B0 { Add "0". }
|
|
#_CMPIM_ #$BA { Digit? }
|
|
#_BCC_ #@_ECHO { Yes, output it. }
|
|
#_ADCIM_ #$06 { Add offset for letter. }
|
|
_CHAROUT=*
|
|
_ECHO=* #_PHA_ { [Gigatron] }
|
|
#_BRK_ { [Gigatron] Transfer to vCPU for display.}
|
|
#_PLA_ { [Gigatron] }
|
|
#_RTS_ { [Gigatron] Return. }
|
|
_BLANK=* #_CLC_ { [Gigatron] Advance few pixels so BLOCK }
|
|
#_ADCZ_ #<Pos { [Gigatron] XAM doesn't wrap around }
|
|
#_STAZ_ #<Pos { [Gigatron] the 160 pixel wide screen. }
|
|
#_RTS_ { [Gigatron] }
|
|
#$00 { (unused) }
|
|
{FFFA} ##$0000 { (NMI) }
|
|
{FFFC} ##_RESET { (RESET) }
|
|
{FFFE} ##$0000 { (IRQ) }
|
|
|
|
{-----------------------------------------------------------------------+
|
|
| |
|
|
+-----------------------------------------------------------------------}
|
|
|