RC-Project-Board/projects/GB-001 Game Board/software/BE6502/CH05-MagicSquare/magicsquare.list
Tor-Eirik Bakke Lunde 8a4310ad55 Chapter 5
2020-03-02 20:05:09 +01:00

156 lines
11 KiB
Plaintext

0000- 4 ;
0000- 5 ; MAGIC SQUARE GAME FOR THE KIM-1 USING '6502 GAMES' HARDWARE. BOARD SHOULD BE
0000- 6 ; JUMPERED WITH VIA CHIPS AT THE ADDRESSES SPECIFIED BELOW. OTHER THAN THAT
0000- 7 ; THE CODE IS UNCHANGED FROM THE BOOK.
0000- 8 ;
4000- 9 VIA1 .EQ $4000 ; GAME BOARD (VIA #1)
4C00- 10 VIA3 .EQ $4C00 ; GAME BOARD (VIA #3)
0000- 11
8000- 12 .OR $8000
8000- 13 .TA $0000
8000-20 A4 80 14 ( 6) BE6502 JSR INITKEY
8003- 15 .IN ../../common/CH05-MagicSquare/game.asm
8003- I 1 ; 'MAGIC SQUARE'
8003- I 2 ; KEYS 1-9 ON THE HEX KEYBOARD ARE EACH ASSOCIATED WITH ON LED IN THE 3X3
8003- I 3 ; ARRAY. WHEN A KEY IS PRESSET, IT CHANGES THE PATTERN OF THE LIT LEDS IN THE
8003- I 4 ; ARRAY. THE OBJECT OF THE GAME IS TO CONVERT THE RANDOM PATTERN THE GAME
8003- I 5 ; STARTS WITH TO A SQUARE OF LIT LEDS BY PRESSING THE KEYS. THE LEDS WILL FLASH
8003- I 6 ; WHEN THE WINNING PATTERN IS ACHIEVED. KEY #0 CAN BE USED AT ANY TIME TO
8003- I 7 ; RESTART THE GAME WITH A NEW PATTERN.
8003- I 8 ;
8003- I 9 ;
4004- I 10 T1CL .EQ VIA1+4 ; LOW LATCH OF TIMER 1
4003- I 11 DDR1A .EQ VIA1+3 ; PORT A DATA DIRECTION REGISTER
4002- I 12 DDR1B .EQ VIA1+2 ; PORT B DATA DIRECTION REGISTER
4001- I 13 PORT1A .EQ VIA1+1 ; PORT A
4000- I 14 PORT2 .EQ VIA1
4000- I 15 PORT1B .EQ VIA1 ; PORT B
4C03- I 16 DDR3A .EQ VIA3+3 ; PORT A DATA DIRECTION REGISTER
4C02- I 17 DDR3B .EQ VIA3+2 ; PORT B DATA DIRECTION REGISTER
4C00- I 18 PORT3B .EQ VIA3 ; PORT B
4C01- I 19 PORT3A .EQ VIA3+1 ; PORT A
8003- I 20
0000- I 21 ZP .EQ $00
0000- I 22 TEMP .EQ ZP ; TEMPORARY STORAGE
8003- I 23 ;
8003- I 24 ; COMMENTS: THIS PROGRAM USES A TIMER REGISTER FOR A RANDOM NUMBER SOURCE. IF
8003- I 25 ; NONE IS AVAILABLE, A RANDOM NUMBER GENERATOR COULD BE USED, BUT DUE TO ITS
8003- I 26 ; REPEATABILITY, IT WOULD NOT WORK AS WELL. THIS PROGRAM USES THE REGISTERS OF
8003- I 27 ; VIA1 PORT A FOR THE STORAGE OF THE LED PATTERN. SINCE WHAT IS READ BY THE
8003- I 28 ; PROCESSOR IS THE POLARITY OF THE OUTPUT, AN EXCESSIVE LOAD ON THE LINES WOULD
8003- I 29 ; PREVENT THE PROGAM FROM WORKING CORRECTLY.
8003- I 30 ;
8003-A9 FF I 31 ( 2) LDA #$FF ; SET UP DATA DIRECTION REGISTERS
8005-8D 03 40 I 32 ( 4) STA DDR1A
8008-8D 02 40 I 33 ( 4) STA DDR1B
800B-AD 04 40 I 34 ( 4) START LDA T1CL ; GET 1ST RANDOM NUMBER
800E-8D 01 40 I 35 ( 4) STA PORT1A
8011-AD 04 40 I 36 ( 4) LDA T1CL ; ... AND SECOND.
8014-29 01 I 37 ( 2) AND #01 ; MASK OUT BOTTOM ROW LEDS
8016-8D 00 40 I 38 ( 4) STA PORT1B
8019-20 7F 80 I 39 ( 6) KEY JSR GETKEY
801C-C9 00 I 40 ( 2) CMP #0 ; KEY MUST BE 1-9: IS IT 0?
801E-F0 EB I 41 (2**) BEQ START ; YES, RESTART GAME WITH NEW BOARD.
8020-C9 0A I 42 ( 2) CMP #10 ; IS IT LESS THAN 10?
8022-10 F5 I 43 (2**) BPL KEY ; + IF KEY >=10, SO GET ANOTHER.
8024- I 44 ;
8024- I 45 ; FOLLOWING SECTION USES KEY NUMBER AS INDEX TO FIND IN TABLE A BIT PATTERN
8024- I 46 ; USED TO COMPLEMENT LEDS.
8024- I 47 ;
8024-38 I 48 ( 2) SEC ; DECREMENT A FOR TABLE ACCESS
8025-E9 01 I 49 ( 2) SBC #1
8027-0A I 50 ( 2) ASL A ; MULTIPLY A*2 (EACH ENTRY IN TABLE IS 2 BYTES)
8028-AA I 51 ( 2) TAX ; USE A AS INDEX
8029-AD 01 40 I 52 ( 4) LDA PORT1A ; GET PORT CONTENTS FOR COMPLEMENT
802C-5D 6E 80 I 53 ( 4*) EOR TABLE,X ; EOR PORT CONTENTS WITH PATTERN
802F-8D 01 40 I 54 ( 4) STA PORT1A ; RESTORE PORT1A
8032-AD 00 40 I 55 ( 4) LDA PORT1B ; DO SAME FOR PORT1B,
8035-5D 6F 80 I 56 ( 4*) EOR TABLE+1,X ; ... USING NEXT TABLE ENTRY.
8038-29 01 I 57 ( 2) AND #01 ; MASK OUT BOTTOM ROW LEDS
803A-8D 00 40 I 58 ( 4) STA PORT1B ; ... AND RESTORE.
803D- I 59 ;
803D- I 60 ; THIS SECTION CHECKS FOR WINNING PATTERN IN LEDS.
803D- I 61 ;
803D-4A I 62 ( 2) LSR A ; SHIFT BIT 0 OF PORT 1 INTO CARRY.
803E-90 D9 I 63 (2**) BCC KEY ; IF NOT WIN PATTERN, GET NEXT MOVE.
8040-AD 01 40 I 64 ( 4) LDA PORT1A ; LOAD PORT1A FOR WIN TEST
8043-C9 EF I 65 ( 2) CMP #%11101111 ; CHECK FOR WIN PATTERN
8045-D0 D2 I 66 (2**) BNE KEY ; NO WIN, GET NEXT MOVE
8047- I 67 ;
8047- I 68 ; WIN - BLINK LEDS EVERY 1/2 SECOND, 4 TIMES
8047- I 69 ;
8047-A9 0E I 70 ( 2) LDA #14
8049-85 00 I 71 ( 3) STA TEMP ; LOAD NUMBER OF BLINKS
804B-A2 20 I 72 ( 2) BLINK LDX #$20 ; DELAY CONSTANT FOR .08 SECOND
804D-A0 FF I 73 ( 2) DELAY LDY #$FF ; OUTER LOOP OF VARIABLE DELAY ROUTINE, WHOSE DELAY
804F- I 74 ; IS 2556 * (CONTENTS OF X ON ENTER
804F-EA I 75 ( 2) DLY NOP ; 10 MICROSECOND LOOP)
8050-D0 00 I 76 (2**) BNE DLY0
8052-88 I 77 ( 2) DLY0 DEY
8053-D0 FA I 78 (2**) BNE DLY
8055-CA I 79 ( 2) DEX
8056-D0 F5 I 80 (2**) BNE DELAY
8058-AD 01 40 I 81 ( 4) LDA PORT1A ; GET PORTS AND COMPLEMENT THEM
805B-49 FF I 82 ( 2) EOR #$FF
805D-8D 01 40 I 83 ( 4) STA PORT1A
8060-AD 00 40 I 84 ( 4) LDA PORT1B
8063-49 01 I 85 ( 2) EOR #1
8065-8D 00 40 I 86 ( 4) STA PORT1B
8068-C6 00 I 87 ( 5) DEC TEMP ; COUNT DOWN NUMBER OF BLINKS
806A-D0 DF I 88 (2**) BNE BLINK ; DO AGAIN IF NOT DONE
806C-F0 AB I 89 (2**) BEQ KEY
806E- I 90 ;
806E- I 91 ; TABLE OF CODES USED TO COMPLEMENT LEDS
806E- I 92 ;
806E-1B 00 07 36
00 49 00 BA
00 24 01 D8
00 C0 01 B0
01 I 93 TABLE .HS 1B.00.07.36.00.49.00.BA.00.24.01.D8.00.C0.01.B0.01
807F- 16 .IN ../../common/CH01-Getkey/getkey_routine.asm
807F- I 1 ; 'GETKEY' KEYBOARD INPUT ROUTINE READS AND DEBOUNCES KEYBOARD. RETURNS WITH
807F- I 2 ; KEY NUMBER IN ACCUMULATOR IF KEY DOWN. OPERATION: SENDS NUMBERS 0-F TO 74154
807F- I 3 ; (4 TO 16 LINE DECODER), WHICH GROUNDS ONE SIDE OF KEYSWITCHES ONE AT A TIME.
807F- I 4 ; IF A KEY IS DOWN, PA7 OF VIA #3 WILL BE GROUNDED, AND THE CURRENT VALUE
807F- I 5 ; APPLIED TO THE 74154 BE THE KEY NUMBER. WHEN THE PROGRAM DETECTS A KEY CLOSE
807F- I 6 ; CHECKS FOR KEY CLOSURE FOR 50 MS. TO ELIMINATE BOUNCE.
807F- I 7 ; NOTE: IF NO KEY IS PRESSED, GETKEY WILL WAIT.
807F- I 8 ;
807F-2C 01 4C I 9 ( 4) GETKEY BIT PORT3A ; SEE IF KEY IS STILL DOWN FROM LAST KEY CLOSURE:
8082- I 10 ; KEYSTROBE IN 'N' STATUS BIT.
8082-10 FB I 11 (2**) BPL GETKEY ; IF YES, WAIT FOR KEY RELEASE
8084-A2 0F I 12 ( 2) RSTART LDX #15 ; SET KEY COUNTER TO 15
8086-8E 00 4C I 13 ( 4) NXTKEY STX PORT3B ; OUTPUT KEY # TO 74154
8089-2C 01 4C I 14 ( 4) BIT PORT3A ; SEE IF KEY DOWN: STROBE IN 'N'
808C-10 05 I 15 (2**) BPL BOUNCE ; IF YES, GO DEBOUNCE
808E-CA I 16 ( 2) DEX ; DECREMENT KEY #
808F-10 F5 I 17 (2**) BPL NXTKEY ; NO, DO NEXT KEY
8091-30 F1 I 18 (2**) BMI RSTART ; START OVER
8093-8A I 19 ( 2) BOUNCE TXA ; SAVE KEY NUMBER IN A
8094-A0 12 I 20 ( 2) LDY #$12 ; OUTER LOOP CNT LOAD FOR DELAY OF 50 MS.
8096-A2 FF I 21 ( 2) LP1 LDX #$FF ; INNER 11 US. LOOP
8098-2C 01 4C I 22 ( 4) LP2 BIT PORT3A ; SEE IF KEY STILL DOWN
809B-30 E7 I 23 (2**) BMI RSTART ; IF NOT, KEY NOT VALID, RESTART
809D-CA I 24 ( 2) DEX
809E-D0 F8 I 25 (2**) BNE LP2 ; THIS LOOP USES 2115*5 US.
80A0-88 I 26 ( 2) DEY
80A1-D0 F3 I 27 (2**) BNE LP1 ; OUTER LOOP: TOTAL IS 50 MS.
80A3-60 I 28 ( 6) RTS ; DONE: KEY IN A.
80A4- I 29 ;
80A4- I 30 ; SUBROUTINE 'INITKEY'
80A4- I 31 ; TAKES CARE OF INITIALIZING VIA #3 FOR USING WITH THE GETKEY ROUTINE FROM
80A4- I 32 ; THE CODE.
80A4- I 33 ;
80A4-A9 00 I 34 ( 2) INITKEY LDA #0
80A6-8D 03 4C I 35 ( 4) STA DDR3A ; SET KEY STROBE PORT FOR INPUT
80A9-A9 FF I 36 ( 2) LDA #$FF
80AB-8D 02 4C I 37 ( 4) STA DDR3B ; SET KEYS FOR OUTPUT
80AE-60 I 38 ( 6) RTS
80AF- 17 ;
80AF- 18 ; STORE CPU INITIALIZATION VECTORS AT THE END OF THE EEPROM.
80AF- 19 ;
FFFA 20 .NO $FFFA,$FF
FFFA-00 80 21 .DA BE6502 ; NMI VECTOR
FFFC-00 80 22 .DA BE6502 ; RESET VECTOR
FFFE-00 80 23 .DA BE6502 ; IRQ VECTOR