ca65 V2.17 - Git 582aa41 Main file : nim.ca65 Current file: nim.ca65 000000r 1 ; 000000r 1 ; ACORN System 1 Applications: Nim 000000r 1 ; 000000r 1 ; From the Acorn System 1 User's Manual 000000r 1 ; 000000r 1 ; (Chris Oddy January 2022) 000000r 1 ; 000000r 1 ; entry points $0200 for human move, $022B for computer move 000000r 1 ; 000000r 1 .setcpu "6502" 000000r 1 .listbytes unlimited 000000r 1 ; 000000r 1 DISPLAY := $FE0C ; scan the display 000000r 1 HEXTD := $FE7A ; hex to display 000000r 1 RESTART := $FF04 ; Monitor reentry point 000000r 1 ; 000000r 1 .org $0200 000200 1 ; 000200 1 KEY := $0D 000200 1 REPEAT := $0E 000200 1 D := $10 000200 1 COUNT := $1F 000200 1 NSTACK := $20 000200 1 POSS := $24 000200 1 ANAL := $28 000200 1 ; 000200 1 20 99 02 HUMMOV: jsr DSPGAP ; display stacks 000203 1 B5 10 SHFTPT: lda D,x ; set decimal point on 000205 1 09 80 ora #$80 000207 1 95 11 sta D+1,x 000209 1 20 0C FE CHEAT: jsr DISPLAY ; wait for input 00020C 1 90 10 bcc MINUS 00020E 1 B5 11 lda D+1,x ; remove current decimal point 000210 1 29 7F and #$7F 000212 1 95 11 sta D+1,x 000214 1 E8 inx ; move forward 000215 1 E8 inx 000216 1 E0 07 cpx #$07 ; end of stacks ? 000218 1 90 E9 bcc SHFTPT 00021A 1 A2 00 ldx #$00 00021C 1 F0 E5 beq SHFTPT 00021E 1 A8 MINUS: tay 00021F 1 F0 E8 beq CHEAT ; prevent zero from being used 000221 1 8A txa 000222 1 4A lsr A ; address of required stack 000223 1 AA tax 000224 1 38 sec 000225 1 B5 20 lda NSTACK,x ; do the players move 000227 1 E5 0D sbc KEY 000229 1 95 20 sta NSTACK,x 00022B 1 20 99 02 COMMOV: jsr DSPGAP ; show stacks 00022E 1 84 0E sty REPEAT 000230 1 A2 00 ldx #$00 000232 1 20 0C FE WAIT: jsr DISPLAY ; thinking time 000235 1 CA dex 000236 1 D0 FA bne WAIT 000238 1 CA dex 000239 1 86 0E stx REPEAT ; clear repeat status 00023B 1 A0 03 ldy #$03 00023D 1 A2 03 NEXT: ldx #$03 ; transfer STACK to POSS 00023F 1 B5 20 BLOCK: lda NSTACK,x ; POSS repreensts the possible computer 000241 1 95 24 sta POSS,x ; moves 000243 1 CA dex 000244 1 10 F9 bpl BLOCK 000246 1 A2 03 ONEOFF: ldx #$03 ; transfer POSS to ANAL 000248 1 B5 24 BRICK: lda POSS,x ; ANAL represents the move being 00024A 1 95 28 sta ANAL,x ; analysed 00024C 1 CA dex 00024D 1 10 F9 bpl BRICK 00024F 1 A2 03 ldx #$03 000251 1 B9 24 00 lda POSS,y 000254 1 38 sec 000255 1 E9 01 sbc #$01 000257 1 99 24 00 sta POSS,y ; POSS contains possible move 00025A 1 99 28 00 sta ANAL,y ; ANAL contains possible move 00025D 1 B0 12 bcs CHECK 00025F 1 88 dey 000260 1 10 DB bpl NEXT ; try all stacks 000262 1 B5 20 TRY1: lda NSTACK,x ; check if stack is empty 000264 1 F0 05 beq EMPTY 000266 1 D6 20 dec NSTACK,x ; make desperate move 000268 1 4C 00 02 jmp HUMMOV 00026B 1 CA EMPTY: dex 00026C 1 10 F4 bpl TRY1 00026E 1 4C 04 FF jmp RESTART ; lost 000271 1 A9 04 CHECK: lda #$04 000273 1 85 1F sta COUNT 000275 1 A9 00 CONT: lda #$00 ; evaluate move 000277 1 46 28 lsr ANAL 000279 1 2A rol A 00027A 1 46 29 lsr ANAL+1 00027C 1 69 00 adc #$00 00027E 1 46 2A lsr ANAL+2 000280 1 69 00 adc #$00 000282 1 46 2B lsr ANAL+3 000284 1 69 00 adc #$00 000286 1 4A lsr A 000287 1 B0 BD bcs ONEOFF ; not a good move 000289 1 C6 1F dec COUNT 00028B 1 D0 E8 bne CONT ; keep checking the move 00028D 1 A2 03 ldx #$03 ; good move, transfer to actual stacks 00028F 1 B5 24 BAT: lda POSS,x 000291 1 95 20 sta NSTACK,x 000293 1 CA dex 000294 1 10 F9 bpl BAT 000296 1 4C 00 02 jmp HUMMOV ; opponent 000299 1 A9 00 DSPGAP: lda #$00 00029B 1 A2 07 ldx #$07 00029D 1 95 10 CLEAR1: sta D,x ; clear the display first 00029F 1 CA dex 0002A0 1 10 FB bpl CLEAR1 0002A2 1 D8 cld ; clear decimal mode 0002A3 1 A2 04 ldx #$04 0002A5 1 A0 07 ldy #$07 0002A7 1 B5 1F AROUND: lda NSTACK-1,x 0002A9 1 20 7A FE jsr HEXTD 0002AC 1 88 dey 0002AD 1 88 dey 0002AE 1 CA dex 0002AF 1 D0 F6 bne AROUND 0002B1 1 A0 1F ldy #$1F 0002B3 1 60 rts 0002B3 1