Build for BE6502

This commit is contained in:
Tor-Eirik Bakke Lunde 2020-02-29 21:34:23 +01:00
parent d6a1f36d3c
commit e4e412d659
22 changed files with 7125 additions and 330 deletions

View File

@ -0,0 +1,4 @@
@echo off
sbasm.py readkey.asm
type readkey.list
pause

View File

@ -0,0 +1,40 @@
.CR 65C02
.TF readkey.hex,hex
.LF readkey.list
;
; SMALL PROGRAM FOR THE BE6502 COMPUTER THAT SEEKS TO DEMONSTRATE THE GET KEY
; ROUTINE FROM CH1 - ESSENTIALLY WE ATTEMPT TO READ THE KEY AND JUST OUTPUT
; IT ONTO THE ONBOARD LEDS. THE BOOK ACTUALLY DETAILS THE USE OF A SYM-1
; COMPUTER, SO WHATEVER BUGS YOU MAY FIND SHOULD PROBABLY BE BLAMED ON ME AND
; NOT THE AUTHOR OF THE BOOK.
;
; NOTE THAT ALL OF THE PARTS BELONGING TO THE GAME BOARD ASSUMES A TIMING OF
; 1 MHZ, SO ANY MANUAL CLOCKING AND SLOW CLOCKS ARE NOT APPLICABLE.
;
VIA0 .EQ $6000 ; VIA FOUND ON THE BE6502 ITSELF
VIA1 .EQ $4000 ; GAME BOARD (VIA #1)
VIA3 .EQ $4C00 ; GAME BOARD (VIA #3)
PORT0B .EQ VIA0
DDR0B .EQ VIA0+2
DDR3A .EQ VIA3+3
DDR3B .EQ VIA3+2
PORT3A .EQ VIA3+1
PORT3B .EQ VIA3
.OR $8000
.TA $0000
BE6502 LDA #$FF
STA DDR0B
JSR INITKEY
LOOP JSR GETKEY ; GET THE KEY USING THE SUB-ROUTINE FROM THE BOOK,
STA PORT0B ; IT'LL BE IN IN A SO PUT ON LEDS FOR DISPLAY.
JMP LOOP ; DO IT ALL AGAIN
.IN ../../common/CH01-Getkey/getkey_routine.asm
;
; STORE CPU INITIALIZATION VECTORS AT THE END OF THE EEPROM.
;
.NO $FFFA,$FF
.DA BE6502 ; NMI VECTOR
.DA BE6502 ; RESET VECTOR
.DA BE6502 ; IRQ VECTOR

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,74 @@
0000- 4 ;
0000- 5 ; SMALL PROGRAM FOR THE BE6502 COMPUTER THAT SEEKS TO DEMONSTRATE THE GET KEY
0000- 6 ; ROUTINE FROM CH1 - ESSENTIALLY WE ATTEMPT TO READ THE KEY AND JUST OUTPUT
0000- 7 ; IT ONTO THE ONBOARD LEDS. THE BOOK ACTUALLY DETAILS THE USE OF A SYM-1
0000- 8 ; COMPUTER, SO WHATEVER BUGS YOU MAY FIND SHOULD PROBABLY BE BLAMED ON ME AND
0000- 9 ; NOT THE AUTHOR OF THE BOOK.
0000- 10 ;
0000- 11 ; NOTE THAT ALL OF THE PARTS BELONGING TO THE GAME BOARD ASSUMES A TIMING OF
0000- 12 ; 1 MHZ, SO ANY MANUAL CLOCKING AND SLOW CLOCKS ARE NOT APPLICABLE.
0000- 13 ;
6000- 14 VIA0 .EQ $6000 ; VIA FOUND ON THE BE6502 ITSELF
4000- 15 VIA1 .EQ $4000 ; GAME BOARD (VIA #1)
4C00- 16 VIA3 .EQ $4C00 ; GAME BOARD (VIA #3)
6000- 17 PORT0B .EQ VIA0
6002- 18 DDR0B .EQ VIA0+2
4C03- 19 DDR3A .EQ VIA3+3 ; USING RC-ONE ADDRESS DECODING SCHEME, PLACING
4C02- 20 DDR3B .EQ VIA3+2 ; VIA3 AT $CC00 BY DEFAULT (INSTEAD OF $AC00)
4C01- 21 PORT3A .EQ VIA3+1 ; TO FIT RC-ONE ADDRESS DECODING THOUGH ORIGINAL
4C00- 22 PORT3B .EQ VIA3 ; CAN BE JUMPERED IF NEEDED/WANTED.
0000- 23
8000- 24 .OR $8000
8000- 25 .TA $0000
8000-A9 FF 26 ( 2) BE6502 LDA #$FF
8002-8D 02 60 27 ( 4) STA DDR0B
8005-20 36 80 28 ( 6) JSR INITKEY
8008-20 11 80 29 ( 6) LOOP JSR GETKEY ; GET THE KEY USING THE SUB-ROUTINE FROM THE BOOK,
800B-8D 00 60 30 ( 4) STA PORT0B ; IT'LL BE IN IN A SO PUT ON LEDS FOR DISPLAY.
800E-4C 08 80 31 ( 3) JMP LOOP ; DO IT ALL AGAIN
8011- 32
8011- 33 .IN ../../common/CH01-Getkey/getkey_routine.asm
8011- I 1 ; 'GETKEY' KEYBOARD INPUT ROUTINE READS AND DEBOUNCES KEYBOARD. RETURNS WITH
8011- I 2 ; KEY NUMBER IN ACCUMULATOR IF KEY DOWN. OPERATION: SENDS NUMBERS 0-F TO 74154
8011- I 3 ; (4 TO 16 LINE DECODER), WHICH GROUNDS ONE SIDE OF KEYSWITCHES ONE AT A TIME.
8011- I 4 ; IF A KEY IS DOWN, PA7 OF VIA #3 WILL BE GROUNDED, AND THE CURRENT VALUE
8011- I 5 ; APPLIED TO THE 74154 BE THE KEY NUMBER. WHEN THE PROGRAM DETECTS A KEY CLOSE
8011- I 6 ; CHECKS FOR KEY CLOSURE FOR 50 MS. TO ELIMINATE BOUNCE.
8011- I 7 ; NOTE: IF NO KEY IS PRESSED, GETKEY WILL WAIT.
8011- I 8 ;
8011-2C 01 4C I 9 ( 4) GETKEY BIT PORT3A ; SEE IF KEY IS STILL DOWN FROM LAST KEY CLOSURE:
8014- I 10 ; KEYSTROBE IN 'N' STATUS BIT.
8014-10 FB I 11 (2**) BPL GETKEY ; IF YES, WAIT FOR KEY RELEASE
8016-A2 0F I 12 ( 2) RSTART LDX #15 ; SET KEY COUNTER TO 15
8018-8E 00 4C I 13 ( 4) NXTKEY STX PORT3B ; OUTPUT KEY # TO 74154
801B-2C 01 4C I 14 ( 4) BIT PORT3A ; SEE IF KEY DOWN: STROBE IN 'N'
801E-10 05 I 15 (2**) BPL BOUNCE ; IF YES, GO DEBOUNCE
8020-CA I 16 ( 2) DEX ; DECREMENT KEY #
8021-10 F5 I 17 (2**) BPL NXTKEY ; NO, DO NEXT KEY
8023-30 F1 I 18 (2**) BMI RSTART ; START OVER
8025-8A I 19 ( 2) BOUNCE TXA ; SAVE KEY NUMBER IN A
8026-A0 12 I 20 ( 2) LDY #$12 ; OUTER LOOP CNT LOAD FOR DELAY OF 50 MS.
8028-A2 FF I 21 ( 2) LP1 LDX #$FF ; INNER 11 US. LOOP
802A-2C 01 4C I 22 ( 4) LP2 BIT PORT3A ; SEE IF KEY STILL DOWN
802D-30 E7 I 23 (2**) BMI RSTART ; IF NOT, KEY NOT VALID, RESTART
802F-CA I 24 ( 2) DEX
8030-D0 F8 I 25 (2**) BNE LP2 ; THIS LOOP USES 2115*5 US.
8032-88 I 26 ( 2) DEY
8033-D0 F3 I 27 (2**) BNE LP1 ; OUTER LOOP: TOTAL IS 50 MS.
8035-60 I 28 ( 6) RTS ; DONE: KEY IN A.
8036- I 29 ;
8036- I 30 ; SUBROUTINE 'INITKEY'
8036- I 31 ; TAKES CARE OF INITIALIZING VIA #3 FOR USING WITH THE GETKEY ROUTINE FROM
8036- I 32 ; THE CODE.
8036-A9 00 I 33 ( 2) INITKEY LDA #0
8038-8D 03 4C I 34 ( 4) STA DDR3A ; SET KEY STROBE PORT FOR INPUT
803B-A9 FF I 35 ( 2) LDA #$FF
803D-8D 02 4C I 36 ( 4) STA DDR3B ; SET KEYS FOR OUTPUT
8040-60 I 37 ( 6) RTS
8041- 34 ;
8041- 35 ; STORE CPU INITIALIZATION VECTORS AT THE END OF THE EEPROM.
8041- 36 ;
FFFA 37 .NO $FFFA,$FF
FFFA-00 80 38 .DA BE6502 ; NMI VECTOR
FFFC-00 80 39 .DA BE6502 ; RESET VECTOR
FFFE-00 80 40 .DA BE6502 ; IRQ VECTOR

View File

@ -0,0 +1,4 @@
@echo off
sbasm.py music.asm
type music.list
pause

View File

@ -0,0 +1,27 @@
.CR 6502
.TF music.hex,hex
.LF music.list
;
; MUSIC PLAYER FOR THE BE6502 USING '6502 GAMES' HARDWARE. BOARD SHOULD BE
; JUMPERED WITH VIA CHIPS AT THE ADDRESSES SPECIFIED BELOW. OTHER THAN THAT
; THE CODE IS UNCHANGED FROM THE BOOK.
;
VIA1 .EQ $4000 ; GAME BOARD (VIA #1)
VIA3 .EQ $4C00 ; GAME BOARD (VIA #3)
DDR3A .EQ VIA3+3
DDR3B .EQ VIA3+2
PORT3A .EQ VIA3+1
PORT3B .EQ VIA3
.OR $8000
.TA $0000
BE6502 JSR INITKEY
.IN ../../common/CH02-Music/player.asm
.IN ../../common/CH01-Getkey/getkey_routine.asm
;
; STORE CPU INITIALIZATION VECTORS AT THE END OF THE EEPROM.
;
.NO $FFFA,$FF
.DA BE6502 ; NMI VECTOR
.DA BE6502 ; RESET VECTOR
.DA BE6502 ; IRQ VECTOR

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,224 @@
0000- 4 ;
0000- 5 ; MUSIC PLAYER FOR THE BE6502 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)
4C03- 11 DDR3A .EQ VIA3+3
4C02- 12 DDR3B .EQ VIA3+2
4C01- 13 PORT3A .EQ VIA3+1
4C00- 14 PORT3B .EQ VIA3
0000- 15
8000- 16 .OR $8000
8000- 17 .TA $0000
8000-20 06 81 18 ( 6) BE6502 JSR INITKEY
8003- 19 .IN ../../common/CH02-Music/player.asm
8003- I 1 ; MUSIC PLAYER PROGRAM
8003- I 2 ; USES 16-KEY KEYBOARD AND BUFFERED SPEAKER
8003- I 3 ; PROGRAM PLAYS STORED MUSICAL NOTES. THERE ARE TWO MODES OF OPERATION: INPUT
8003- I 4 ; AND PLAY. INPUT MODE IS THE DEFAULT, AND ALL NON-COMMAND KEYS PRESSED PRESSED
8003- I 5 ; (0-D) ARE STORED FOR REPLAY. IF AN OVERFLOW OCCURS, THE USER IS WARNED WITH
8003- I 6 ; A THREE-TONE WARNING. THE SAME WARBLING TONE IS ALSO USED TO SIGNAL A RESTART
8003- I 7 ; OF THE PROGRAM.
8003- I 8 ;
0000- I 9 PILEN .EQ $00 ; LENGTH OF NOTE LIST
0001- I 10 TEMP .EQ $01 ; TEMPORARY STORAGE
0002- I 11 PTR .EQ $02 ; CURRENT LOCATION IN LIST
0003- I 12 FREQ .EQ $03 ; TEMPORARY STORAGE FOR FREQUENCY
0004- I 13 DUR .EQ $04 ; TEMP STORAGE FOR DURATION
0300- I 14 TABEG .EQ $0300 ; TABLE TO STORE MUSIC
4C00- I 15 PORT3B .EQ VIA3 ; VIA OUTPUT PORT B
4C02- I 16 DDR3B .EQ VIA3+2 ; VIA PORT B DIRECTION REGISTER
8003- I 17 ;
8003- I 18 ; COMMAND LINE INTERPRETER
8003- I 19 ; $F AS INPUT MEANS RESET POINTERS, START OVER.
8003- I 20 ; $E MEANS PLAY CURRENTLY STORED NOTES
8003- I 21 ; ANYTHING ELSE IS STORED FOR REPLAY.
8003- I 22 ;
8003-A9 00 I 23 ( 2) START LDA #0 ; CLEAR NOTE LIST LENGTH
8005-85 00 I 24 ( 2) STA PILEN
8007-18 I 25 ( 2) CLC ; CLEAR NIBBLE MARKER
8008-20 E1 80 I 26 ( 6) NXKEY JSR GETKEY
800B-C9 0F I 27 ( 2) CMP #15 ; IS KEY #15?
800D-D0 05 I 28 (2**) BNE NXTST ; NO, DO NEXT TEST
800F-20 8A 80 I 29 ( 6) JSR BEEP3 ; TELL USER OF CLEARING
8012-90 EF I 30 (2**) BCC START ; CLEAR POINTERS AND START OVER
8014-C9 0E I 31 ( 2) NXTST CMP #14 ; IS KEY #14?
8016-D0 06 I 32 (2**) BNE NUMKEY ; NO, KEY IS NOTE NUMBER
8018-20 4B 80 I 33 ( 6) JSR PLAYEM ; PLAY NOTES
801B-18 I 34 ( 2) CLC
801C-90 EA I 35 (2**) BCC NXKEY ; GET NEXT COMMAND
801E- I 36 ;
801E- I 37 ; ROUTINE TO LOAD NOT LIST WITH NOTES
801E- I 38 ;
801E-85 01 I 39 ( 2) NUMKEY STA TEMP ; SAVE KEY, FREE A
8020-20 73 80 I 40 ( 6) JSR PLAYIT ; PLAY NOTE
8023-A5 00 I 41 ( 3) LDA PILEN ; GET LIST LENGTH
8025-C9 FF I 42 ( 2) CMP #$FF ; OVERFLOW?
8027-D0 05 I 43 (2**) BNE OK ; NO, ADD NOTE TO LIST
8029-20 8A 80 I 44 ( 6) JSR BEEP3 ; YES, WARN USER
802C-90 DA I 45 (2**) BCC NXKEY ; RETURN TO INPUT MODE
802E-4A I 46 ( 2) OK LSR A ; SHIFT LOW BIT INTO NIBBLE POINTER
802F-A8 I 47 ( 2) TAY ; USE SHIFTED NIBBLE POINTER AS BYTE INDEX
8030-A5 01 I 48 ( 3) LDA TEMP ; RESTORE KEY#
8032-B0 09 I 49 (2**) BCS FINBYT ; IF BYTE ALREADY HAS A NIBBLE, FINISH IT AND STORE
8034-29 0F I 50 ( 2) AND #%00001111 ; 1ST NIBBLE. MASK HIGH NIBBLE
8036-99 00 03 I 51 ( 5) STA TABEG,Y ; SAVE UNFINISHED 1/2 BYTE
8039-E6 00 I 52 ( 5) INC PILEN ; POINT TO NEXT NIBBLE
803B-90 CB I 53 (2**) BCC NXKEY ; GET NEXT KEYSTROKE
803D-0A I 54 ( 2) FINBYT ASL A ; SHIFT NIBBLE 2 TO HIGH ORDER
803E-0A I 55 ( 2) ASL A
803F-0A I 56 ( 2) ASL A
8040-0A I 57 ( 2) ASL A
8041-19 00 03 I 58 ( 4*) ORA TABEG,Y ; JOIN 2 NIBBLES AS BYTE
8044-99 00 03 I 59 ( 5) STA TABEG,Y ; ... AND STORE.
8047-E6 00 I 60 ( 5) INC PILEN ; POINT TO NEXT NIBBLE IN NEXT BYTE
8049-90 BD I 61 (2**) BCC NXKEY ; RETURN
804B- I 62 ;
804B- I 63 ; ROUTINE TO PLAY NOTES
804B- I 64 ;
804B-A2 00 I 65 ( 2) PLAYEM LDX #0 ; CLEAR POINTER
804D-86 02 I 66 ( 3) STX PTR
804F-A5 02 I 67 ( 3) LDA PTR ; LOAD ACCUMULATOR WITH CURRENT POINTER VALUE
8051-4A I 68 ( 2) LOOP LSR A ; SHIFT NIBBLE INDICATOR INTO CARRY
8052-AA I 69 ( 2) TAX ; USE SHIFTED NIBBLE POINTER AS BYTE POINTER
8053-BD 00 03 I 70 ( 4*) LDA TABEG,X ; LOAD NOTE TO PLAY
8056-B0 04 I 71 (2**) BCS ENDBYT ; LOW NIBBLE USED, GET HIGH
8058-29 0F I 72 ( 2) AND #%00001111 ; MASK OUT HIGH BITS
805A-90 06 I 73 (2**) BCC FINISH ; PLAY NOTE
805C-29 F0 I 74 ( 2) ENDBYT AND #%11110000 ; THROW AWAY LOW NIBBLE
805E-4A I 75 ( 2) LSR A ; SHIFT INTO LOW
805F-4A I 76 ( 2) LSR A
8060-4A I 77 ( 2) LSR A
8061-4A I 78 ( 2) LSR A
8062-20 73 80 I 79 ( 6) FINISH JSR PLAYIT ; CALCULATE CONSTANTS & PLAY
8065-A2 20 I 80 ( 2) LDX #$20 ; BETWEEN-NOTE DELAY
8067-20 9F 80 I 81 ( 6) JSR DELAY
806A-E6 02 I 82 ( 5) INC PTR ; ONE NIBBLE USED
806C-A5 02 I 83 ( 3) LDA PTR
806E-C5 00 I 84 ( 3) CMP PILEN ; END OF LIST?
8070-90 DF I 85 (2**) BCC LOOP ; NO, GET NEXT NOTE
8072-60 I 86 ( 6) RTS ; DONE
8073- I 87 ;
8073- I 88 ; ROUTINE TO DO TABLE LOOK UP, SEPARATE REST
8073- I 89 ;
8073-C9 0D I 90 ( 2) PLAYIT CMP #13 ; REST?
8075-D0 06 I 91 (2**) BNE SOUND ; NO.
8077-A2 54 I 92 ( 2) LDX #$54 ; DELAY = NOTE LENGTH = .21SEC
8079-20 9F 80 I 93 ( 6) JSR DELAY
807C-60 I 94 ( 6) RTS
807D-AA I 95 ( 2) SOUND TAX ; USE KEYS AS INDEX..
807E-BD D4 80 I 96 ( 4*) LDA DURTAB,X ; ... TO FIND DURATION.
8081-85 04 I 97 ( 2) STA DUR ; STORE DURATION FOR USE
8083-BD C7 80 I 98 ( 4*) LDA NOTAB,X ; LOAD NOTE VALUE
8086-20 AB 80 I 99 ( 6) JSR TONE
8089-60 I 100 ( 6) RTS
808A- I 101 ;
808A- I 102 ; ROUTINE TO MAKE 3 TONE SIGNAL
808A- I 103 ;
808A-A9 FF I 104 ( 2) BEEP3 LDA #$FF ; DURATION FOR BEEPS
808C-85 04 I 105 ( 2) STA DUR
808E-A9 4B I 106 ( 2) LDA #$4B ; CODE FOR E2
8090-20 AB 80 I 107 ( 6) JSR TONE ; 1ST NOTE
8093-A9 38 I 108 ( 2) LDA #$38 ; CODE FOR D2
8095-20 AB 80 I 109 ( 6) JSR TONE
8098-A9 4B I 110 ( 2) LDA #$4B
809A-20 AB 80 I 111 ( 6) JSR TONE
809D-18 I 112 ( 2) CLC
809E-60 I 113 ( 6) RTS
809F- I 114 ;
809F- I 115 ; VARIABLE-LENGTH DELAY
809F- I 116 ;
809F-A0 FF I 117 ( 2) DELAY LDY #$FF
80A1-EA I 118 ( 2) DLY NOP
80A2-D0 00 I 119 (2**) BNE DL0 ; (.+2 IN BOOK)
80A4-88 I 120 ( 2) DL0 DEY
80A5-D0 FA I 121 (2**) BNE DLY ; 10 US. LOOP
80A7-CA I 122 ( 2) DEX
80A8-D0 F5 I 123 (2**) BNE DELAY ; LOOP TIME = 2556*[X]
80AA-60 I 124 ( 6) RTS
80AB- I 125 ;
80AB- I 126 ; ROUTINE TO MAKE TONE: # OF 1/2 CYCLES IS IN 'DUR', AND 1/2 CYCLE TIME IS IN
80AB- I 127 ; ACCUMULATOR. LOOP TIME = 20*[A]+26 US SINCE TWO RUNS THROUGH THE OUTER LOOP
80AB- I 128 ; MAKES ONE CYCLE OF THE TONE.
80AB- I 129 ;
80AB-85 03 I 130 ( 2) TONE STA FREQ ; FREQ IS TEMP FOR # OF CYCLES
80AD-A9 FF I 131 ( 2) LDA #$FF ; SET UP DATA DIRECTION REGISTER
80AF-8D 02 4C I 132 ( 4) STA DDR3B
80B2-A9 00 I 133 ( 2) LDA #$00 ; A IS SENT TO PORT, START HI
80B4-A6 04 I 134 ( 3) LDX DUR
80B6-A4 03 I 135 ( 3) FL2 LDY FREQ
80B8-88 I 136 ( 2) FL1 DEY
80B9-18 I 137 ( 2) CLC
80BA-90 00 I 138 (2**) BCC FL0 ; (.+2 IN BOOK)
80BC-D0 FA I 139 (2**) FL0 BNE FL1 ; INNER, 10 US LOOP.
80BE-49 FF I 140 ( 2) EOR #$FF ; COMPLEMENT I/O PORT
80C0-8D 00 4C I 141 ( 4) STA PORT3B ; ... AND SET IT
80C3-CA I 142 ( 2) DEX
80C4-D0 F0 I 143 (2**) BNE FL2 ; OUTER LOOP
80C6-60 I 144 ( 6) RTS
80C7- I 145 ;
80C7- I 146 ; TABLE OF NOTE CONSTANTS
80C7- I 147 ; CONTAINS:
80C7- I 148 ; [OCTAVE BELOW MIDDLE C] : G,A,BCC
80C7- I 149 ; [OCTAVE OF MIDDLE C] : C,D,E,F,F#,G,G#,A,B
80C7- I 150 ; [OCTAVE ABOVE MIDDLE C] : C
80C7- I 151 ;
80C7-FE E2 C9 BE
A9 96 8E 86
7E 77 70 64
5E I 152 NOTAB .HS FE.E2.C9.BE.A9.96.8E.86.7E.77.70.64.5E
80D4- I 153 ;
80D4- I 154 ; TABLE OF NOTE DURATIONS IN # OF 1/2 CYCLES SET FOR A NOTE LENGTH OF
80D4- I 155 ; ABOUT .21 SEC.
80D4- I 156 ;
80D4-55 60 6B 72
80 8F 94 A1
AA B5 BF D7
E4 I 157 DURTAB .HS 55.60.6B.72.80.8F.94.A1.AA.B5.BF.D7.E4
80E1- 20 .IN ../../common/CH01-Getkey/getkey_routine.asm
80E1- I 1 ; 'GETKEY' KEYBOARD INPUT ROUTINE READS AND DEBOUNCES KEYBOARD. RETURNS WITH
80E1- I 2 ; KEY NUMBER IN ACCUMULATOR IF KEY DOWN. OPERATION: SENDS NUMBERS 0-F TO 74154
80E1- I 3 ; (4 TO 16 LINE DECODER), WHICH GROUNDS ONE SIDE OF KEYSWITCHES ONE AT A TIME.
80E1- I 4 ; IF A KEY IS DOWN, PA7 OF VIA #3 WILL BE GROUNDED, AND THE CURRENT VALUE
80E1- I 5 ; APPLIED TO THE 74154 BE THE KEY NUMBER. WHEN THE PROGRAM DETECTS A KEY CLOSE
80E1- I 6 ; CHECKS FOR KEY CLOSURE FOR 50 MS. TO ELIMINATE BOUNCE.
80E1- I 7 ; NOTE: IF NO KEY IS PRESSED, GETKEY WILL WAIT.
80E1- I 8 ;
80E1-2C 01 4C I 9 ( 4) GETKEY BIT PORT3A ; SEE IF KEY IS STILL DOWN FROM LAST KEY CLOSURE:
80E4- I 10 ; KEYSTROBE IN 'N' STATUS BIT.
80E4-10 FB I 11 (2**) BPL GETKEY ; IF YES, WAIT FOR KEY RELEASE
80E6-A2 0F I 12 ( 2) RSTART LDX #15 ; SET KEY COUNTER TO 15
80E8-8E 00 4C I 13 ( 4) NXTKEY STX PORT3B ; OUTPUT KEY # TO 74154
80EB-2C 01 4C I 14 ( 4) BIT PORT3A ; SEE IF KEY DOWN: STROBE IN 'N'
80EE-10 05 I 15 (2**) BPL BOUNCE ; IF YES, GO DEBOUNCE
80F0-CA I 16 ( 2) DEX ; DECREMENT KEY #
80F1-10 F5 I 17 (2**) BPL NXTKEY ; NO, DO NEXT KEY
80F3-30 F1 I 18 (2**) BMI RSTART ; START OVER
80F5-8A I 19 ( 2) BOUNCE TXA ; SAVE KEY NUMBER IN A
80F6-A0 12 I 20 ( 2) LDY #$12 ; OUTER LOOP CNT LOAD FOR DELAY OF 50 MS.
80F8-A2 FF I 21 ( 2) LP1 LDX #$FF ; INNER 11 US. LOOP
80FA-2C 01 4C I 22 ( 4) LP2 BIT PORT3A ; SEE IF KEY STILL DOWN
80FD-30 E7 I 23 (2**) BMI RSTART ; IF NOT, KEY NOT VALID, RESTART
80FF-CA I 24 ( 2) DEX
8100-D0 F8 I 25 (2**) BNE LP2 ; THIS LOOP USES 2115*5 US.
8102-88 I 26 ( 2) DEY
8103-D0 F3 I 27 (2**) BNE LP1 ; OUTER LOOP: TOTAL IS 50 MS.
8105-60 I 28 ( 6) RTS ; DONE: KEY IN A.
8106- I 29 ;
8106- I 30 ; SUBROUTINE 'INITKEY'
8106- I 31 ; TAKES CARE OF INITIALIZING VIA #3 FOR USING WITH THE GETKEY ROUTINE FROM
8106- I 32 ; THE CODE.
8106-A9 00 I 33 ( 2) INITKEY LDA #0
8108-8D 03 4C I 34 ( 4) STA DDR3A ; SET KEY STROBE PORT FOR INPUT
810B-A9 FF I 35 ( 2) LDA #$FF
810D-8D 02 4C I 36 ( 4) STA DDR3B ; SET KEYS FOR OUTPUT
8110-60 I 37 ( 6) RTS
8111- 21 ;
8111- 22 ; STORE CPU INITIALIZATION VECTORS AT THE END OF THE EEPROM.
8111- 23 ;
FFFA 24 .NO $FFFA,$FF
FFFA-00 80 25 .DA BE6502 ; NMI VECTOR
FFFC-00 80 26 .DA BE6502 ; RESET VECTOR
FFFE-00 80 27 .DA BE6502 ; IRQ VECTOR

View File

@ -0,0 +1,4 @@
@echo off
sbasm.py translate.asm
type translate.list
pause

View File

@ -0,0 +1,25 @@
.CR 65C02
.TF translate.hex,hex
.LF translate.list
;
; BINARY TRANSLATION GAME FOR THE BE6502 USING '6502 GAMES' HARDWARE. BOARD
; SHOULD BE JUMPERED WITH VIA CHIPS AT THE ADDRESSES SPECIFIED BELOW. CODE
; IS MOSTLY UNCHANGED FROM THE BOOK, LOOKUP TABLE 'NUMTAB' WAS MOVED OUT OF
; ZERO PAGE TO MAKE LOADING A BIT EASIER.
;
; NOTE THAT ALL OF THE PARTS BELONGING TO THE GAME BOARD ASSUMES A TIMING OF
; 1 MHZ, SO ANY MANUAL CLOCKING AND SLOW CLOCKS ARE NOT APPLICABLE.
;
VIA1 .EQ $4000 ; GAME BOARD (VIA #1)
VIA3 .EQ $4C00 ; GAME BOARD (VIA #3)
.OR $8000
.TA $0000
.IN ../../common/CH03-Translate/game.asm
;
; STORE CPU INITIALIZATION VECTORS AT THE END OF THE EEPROM.
;
.NO $FFFA,$FF
.DA START ; NMI VECTOR
.DA START ; RESET VECTOR
.DA START ; IRQ VECTOR

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,219 @@
0000- 4 ;
0000- 5 ; BINARY TRANSLATION GAME FOR THE BE6502 USING '6502 GAMES' HARDWARE. BOARD
0000- 6 ; SHOULD BE JUMPERED WITH VIA CHIPS AT THE ADDRESSES SPECIFIED BELOW. CODE
0000- 7 ; IS MOSTLY UNCHANGED FROM THE BOOK, LOOKUP TABLE 'NUMTAB' WAS MOVED OUT OF
0000- 8 ; ZERO PAGE TO MAKE LOADING A BIT EASIER.
0000- 9 ;
0000- 10 ; NOTE THAT ALL OF THE PARTS BELONGING TO THE GAME BOARD ASSUMES A TIMING OF
0000- 11 ; 1 MHZ, SO ANY MANUAL CLOCKING AND SLOW CLOCKS ARE NOT APPLICABLE.
0000- 12 ;
4000- 13 VIA1 .EQ $4000 ; GAME BOARD (VIA #1)
4C00- 14 VIA3 .EQ $4C00 ; GAME BOARD (VIA #3)
0000- 15
8000- 16 .OR $8000
8000- 17 .TA $0000
8000- 18 .IN ../../common/CH03-Translate/game.asm
8000- I 1 ; 'TRANSLATE'
8000- I 2 ; PROGRAM TO TEST 2 PLAYERS SPEED IN TRANSLATING A BINARY NUMBER TO A SINGLE
8000- I 3 ; HEXADECIMAL DIGIT. EACH PLAYER IS GIVEN A TURN, AS SHOWN BY A LIGHTED LEFT
8000- I 4 ; OR RIGHT POINTER. THE NUMBER WILL SUDDENLY FLASH ON LEDS 12-15, ACCOMPANIED
8000- I 5 ; BY THE LIGHTING OF LED #10. THE PLAYER MUST THEN PUSH THE CORRESPONDING
8000- I 6 ; BUTTON. AFTER BOTH PLAYERS TAKE TURNS, RESULTS ARE SHOWN ON BOTTOM ROW. AFTER
8000- I 7 ; 10 WINS, A PLAYERS RESULT WILL FLASH, SHOWING THE BETTER PLAYER. THEN THE
8000- I 8 ; GAME RESTARTS.
8000- I 9 ;
4000- I 10 PORT1B .EQ VIA1 ; LEDS 9-15
4001- I 11 PORT1A .EQ VIA1+1 ; LEDS 1-8
4002- I 12 DDR1B .EQ VIA1+2
4003- I 13 DDR1A .EQ VIA1+3
4C00- I 14 PORT3B .EQ VIA3 ; KEY # OUTPUT
4C01- I 15 PORT3A .EQ VIA3+1 ; KEY STROBE INPUT.
4C02- I 16 DDR3B .EQ VIA3+2
4C03- I 17 DDR3A .EQ VIA3+3
8000- I 18 ;
8000- I 19 ; VARIABLE STORAGE:
8000- I 20 ;
0000- I 21 ZP .EQ $00
0000- I 22 TEMP .EQ ZP ; TEMPORARY STORAGE FOR AMOUNT OF TIME PLAYER
8000- I 23 ; USES TO GUESS.
0001- I 24 CNTHI .EQ ZP+1
0002- I 25 CNTLO .EQ ZP+2
0003- I 26 CNT1H .EQ ZP+3 ; AMOUNT OF TIME PLYR1 USES TO GUESS.
0004- I 27 CNT1L .EQ ZP+4
0005- I 28 PLYR1 .EQ ZP+5 ; SCORE OF # WON FOR PLAYER 1.
0006- I 29 PLYR2 .EQ ZP+6 ; PLAYER 2 SCORE.
0007- I 30 NUMBER .EQ ZP+7 ; STORES NUMBER TO BE GUESSED.
0008- I 31 SCR .EQ ZP+8 ; SCRATCHPAD FOR RND # GEN.
8000- I 32 ;
8000- I 33 ; MAIN PROGRAM
8000- I 34 ;
8000-A9 FF I 35 ( 2) START LDA #$FF : SET UP PORTS
8002-8D 03 40 I 36 ( 4) STA DDR1A
8005-8D 02 40 I 37 ( 4) STA DDR1B
8008-8D 02 4C I 38 ( 4) STA DDR3B
800B-A9 00 I 39 ( 2) LDA #0
800D-8D 03 4C I 40 ( 4) STA DDR3A
8010-85 05 I 41 ( 3) STA PLYR1 ; CLEAR NUMBER OF WINS.
8012-85 06 I 42 ( 3) STA PLYR2
8014-A9 79 I 43 ( 2) MOVE LDA #%01111001
8016-8D 01 40 I 44 ( 4) STA PORT1A ; SHOW RIGHT ARROW
8019-A9 00 I 45 ( 2) LDA #0
801B-8D 00 40 I 46 ( 4) STA PORT1B
801E-85 02 I 47 ( 3) STA CNTLO ; CLEAR COUNTERS
8020-85 01 I 48 ( 3) STA CNTHI
8022-20 8C 80 I 49 ( 6) JSR PLAY ; GET PLAYER 1S TIME.
8025-A5 02 I 50 ( 3) LDA CNTLO ; TRANSFER TEMP COUNT TO PERMANENT STORAGE
8027-85 04 I 51 ( 3) STA CNT1L
8029-A5 01 I 52 ( 3) LDA CNTHI
802B-85 03 I 53 ( 3) STA CNT1H
802D-A9 3C I 54 ( 2) LDA #%00111100 ; SHOW LEFT ARROW
802F-8D 01 40 I 55 ( 4) STA PORT1A
8032-A9 01 I 56 ( 2) LDA #1
8034-8D 00 40 I 57 ( 4) STA PORT1B
8037-A9 00 I 58 ( 2) LDA #0
8039-85 02 I 59 ( 3) STA CNTLO ; CLEAR COUNTERS
803B-85 01 I 60 ( 3) STA CNTHI
803D-20 8C 80 I 61 ( 6) JSR PLAY ; GET PLAYER 2S TIME.
8040-A5 01 I 62 ( 3) LDA CNTHI ; GET PLAYER 2S COUNT AND...
8042-C5 03 I 63 ( 3) CMP CNT1H ; COMPARE TO PLAYER 1S.
8044-F0 04 I 64 (2**) BEQ EQUAL ; CHECK LOW ORDER BYTES TO RESOLVE WINNER.
8046-90 27 I 65 (2**) BCC PLR2 ; PLAYER 2 HAS SMALLER COUNT, SHOW IT.
8048-B0 08 I 66 (2**) BCS PLR1 ; PLAYER 1 HAS SMALLER COUNT, SHOW IT.
804A-A5 02 I 67 ( 3) EQUAL LDA CNTLO ; HI BYTES WERE EQUAL, SO CHECK LOW BYTES.
804C-C5 04 I 68 ( 3) CMP CNT1L ; COMPARE SCORES.
804E-90 1F I 69 (2**) BCC PLR2 ; PLAYER 2 WINS, SHOW IT.
8050-B0 00 I 70 (2**) BCS PLR1 ; PLAYER 1 WINS, SHOW IT.
8052-A9 F0 I 71 ( 2) PLR1 LDA #%11110000 ; LIGTH RIGHT SIDE OF BOTTOM ROW
8054-8D 00 40 I 72 ( 4) STA PORT1B ; TO SHOW WIN.
8057-A9 00 I 73 ( 2) LDA #0
8059-8D 01 40 I 74 ( 4) STA PORT1A ; CLEAR LOW LEDS.
805C-A9 40 I 75 ( 2) LDA #$40 ; WAIT A WHILE TO SHOW WIN.
805E-20 E4 80 I 76 ( 6) JSR DELAY
8061-E6 05 I 77 ( 5) INC PLYR1 ; PLAYER 1 WINS ONE MORE...
8063-A9 0A I 78 ( 2) LDA #10 ; ... HAS HE WON 10?
8065-C5 05 I 79 ( 3) CMP PLYR1
8067-D0 AB I 80 (2**) BNE MOVE ; IF NOT, PLAY ANOTHER ROUND
8069-A9 F0 I 81 ( 2) LDA #%11110000 ; YES - GET BLINK PATTERN.
806B-20 CC 80 I 82 ( 6) JSR BLINK ; BLINK WINNING SIDE.
806E-60 I 83 ( 6) RTS ; END OF GAME: RETURN TO MONITOR.
806F-A9 0E I 84 ( 2) PLR2 LDA #%1110 ; LIGHT LEFT SIDE OF BOTTOM.
8071-8D 00 40 I 85 ( 4) STA PORT1B
8074-A9 00 I 86 ( 2) LDA #0
8076-8D 01 40 I 87 ( 4) STA PORT1A ; CLEAR LOW LEDS.
8079-A9 40 I 88 ( 2) LDA #$40 ; WAIT A WHILE TO SHOW WIN.
807B-20 E4 80 I 89 ( 6) JSR DELAY
807E-E6 06 I 90 ( 5) INC PLYR2 ; PLAYER 2 HAS WON ANOTHER ROUND...
8080-A9 0A I 91 ( 2) LDA #10 ; ... HAS HE WON 10?
8082-C5 06 I 92 ( 3) CMP PLYR2
8084-D0 8E I 93 (2**) BNE MOVE ; IF NOT, PLAY ANOTHER ROUND.
8086-A9 0E I 94 ( 2) LDA #%1110 ; YES - GET PATTERN TO BLINK LEDS.
8088-20 CC 80 I 95 ( 6) JSR BLINK ; BLINK THEM
808B-60 I 96 ( 6) RTS ; END.
808C- I 97 ;
808C- I 98 ; SUBROUTINE 'PLAY'
808C- I 99 ; GETS TIME COUNT OF EACH PLAYER, AND IF BAD GUESSES ARE MADE, THE PLAYER IS
808C- I 100 ; GIVEN ANOTHER CHANCE. THE NEW TIME ADDED TO THE OLD.
808C- I 101 ;
808C-20 F5 80 I 102 ( 6) PLAY JSR RANDOM ; GET RANDOM NUMBER.
808F-20 E4 80 I 103 ( 6) JSR DELAY ; RANDOM - LENGTH DELAY.
8092-20 F5 80 I 104 ( 6) JSR RANDOM ; GET ANOTHER
8095-29 0F I 105 ( 2) AND #$0F ; KEEP UNDER 16 FOR USE AS
8097-85 07 I 106 ( 3) STA NUMBER ; NUMBER TO GUESS.
8099-AA I 107 ( 2) TAX ; USE AS INDEX TO ...
809A-BD 08 81 I 108 ( 4*) LDA NUMTAB,X ; GET REVERSED PATTERN FROM TABLE
809D-0D 00 40 I 109 ( 4) ORA PORT1B ; TO DISPLAY IN LEDS 12-15.
80A0-8D 00 40 I 110 ( 4) STA PORT1B
80A3-20 B6 80 I 111 ( 6) JSR CNTSUB ; GET KEYSTROKE 1 DURATION COUNT.
80A6-C4 07 I 112 ( 3) CPY NUMBER ; IS KEYSTROKE CORRECT GUESS?
80A8-F0 0B I 113 (2**) BEQ DONE ; IF SO, DONE.
80AA-A9 01 I 114 ( 2) LDA #01 ; NO: CLEAR OLD GUESS FROM LEDS.
80AC-2D 00 40 I 115 ( 4) AND PORT1B
80AF-8D 00 40 I 116 ( 4) STA PORT1B
80B2-4C 8C 80 I 117 ( 3) JMP PLAY ; TRY AGAIN W/ANOTHER NUMBER.
80B5-60 I 118 ( 6) DONE RTS ; RETURN WITH DURATION IN CNTLO+CNTHI
80B6- I 119 ;
80B6- I 120 ; SUBROUTINE 'COUNTER'
80B6- I 121 ; GETS KEYSTROKE WHILE KEEPING TRACK OF AMOUNT OF TIME BEFORE KEYPRESS.
80B6- I 122 ;
80B6-A0 0F I 123 ( 2) CNTSUB LDY #$0F ; SET UP KEY # COUNTER.
80B8-8C 00 4C I 124 ( 4) KEYLP STY PORT3B ; OUTPUT KEY # TO KEYBOARD MPXR
80BB-2C 01 4C I 125 ( 4) BIT PORT3A ; KEY DOWN?
80BE-10 0B I 126 (2**) BPL FINISH ; IF YES, DONE.
80C0-88 I 127 ( 2) DEY ; COUNT DOWN KEY #.
80C1-10 F5 I 128 (2**) BPL KEYLP ; TRY NEXT KEY.
80C3-E6 02 I 129 ( 5) INC CNTLO ; ALL KEYS TRIED, INCREMENT COUNT.
80C5-D0 EF I 130 (2**) BNE CNTSUB ; TRY KEYS AGAIN IF NO OVERFLOW.
80C7-E6 01 I 131 ( 5) INC CNTHI ; OVERFLOW, INCREMENT HIGH BYTE.
80C9-D0 EB I 132 (2**) BNE CNTSUB ; TRY KEYS AGAIN.
80CB-60 I 133 ( 6) FINISH RTS ; DONE: TIME RAN OUT OR KEY PRESSED.
80CC- I 134 ;
80CC- I 135 ; SUBROUTINE 'BLINK'
80CC- I 136 ; BLINKS LEDS WHOSE BITS ARE SET IN ACCUMULATOR ON ENTRY.
80CC- I 137 ;
80CC-A2 14 I 138 ( 2) BLINK LDX #20 ; 20 BLINKS.
80CE-86 01 I 139 ( 3) STX CNTHI ; SET BLINK COUNTER.
80D0-85 02 I 140 ( 3) STA CNTLO ; BLINK REGISTER
80D2-A5 02 I 141 ( 3) BLOOP LDA CNTLO ; GET BLINK PATTERN
80D4-4D 00 40 I 142 ( 4) EOR PORT1B ; BLINK LEDS.
80D7-8D 00 40 I 143 ( 4) STA PORT1B
80DA-A9 0A I 144 ( 2) LDA #10 ; SHORT DELAY
80DC-20 E4 80 I 145 ( 6) JSR DELAY
80DF-C6 01 I 146 ( 5) DEC CNTHI
80E1-D0 EF I 147 (2**) BNE BLOOP ; LOOP IF NOT DONE.
80E3-60 I 148 ( 6) RTS
80E4- I 149 ;
80E4- I 150 ; SUBROUTINE 'DELAY'
80E4- I 151 ; CONTENTS OF ACCUMULATOR DETERMINES DELAY LENGTH.
80E4- I 152 ;
80E4-85 00 I 153 ( 3) DELAY STA TEMP
80E6-A0 10 I 154 ( 2) DL1 LDY #$10
80E8-A2 FF I 155 ( 2) DL2 LDX #$FF
80EA-CA I 156 ( 2) DL3 DEX
80EB-D0 FD I 157 (2**) BNE DL3
80ED-88 I 158 ( 2) DEY
80EE-D0 F8 I 159 (2**) BNE DL2
80F0-C6 00 I 160 ( 5) DEC TEMP
80F2-D0 F2 I 161 (2**) BNE DL1
80F4-60 I 162 ( 6) RTS
80F5- I 163 ;
80F5- I 164 ; SUBROUTINE 'RANDOM'
80F5- I 165 ; RANDOM NUMBER GENERATOR, RETURNS RANDOM NUMBER IN ACCUMULATOR.
80F5- I 166 ;
80F5-38 I 167 ( 2) RANDOM SEC
80F6-A5 09 I 168 ( 3) LDA SCR+1
80F8-65 0C I 169 ( 3) ADC SCR+4
80FA-65 0D I 170 ( 3) ADC SCR+5
80FC-85 08 I 171 ( 3) STA SCR
80FE-A2 04 I 172 ( 2) LDX #4
8100-B5 08 I 173 ( 4) RNDLP LDA SCR,X
8102-95 09 I 174 ( 4) STA SCR+1,X
8104-CA I 175 ( 2) DEX
8105-10 F9 I 176 (2**) BPL RNDLP
8107-60 I 177 ( 6) RTS
8108- I 178 ;
8108- I 179 ; TABLE OF 'REVERSED' NUMBERS FOR DISPLAY
8108- I 180 ; IN BITS 3-8 OF PORT1B, OR LEDS 12-15.
8108- I 181 ;
8108-02 I 182 NUMTAB .DA #%00000010
8109-82 I 183 .DA #%10000010
810A-22 I 184 .DA #%00100010
810B-A2 I 185 .DA #%10100010
810C-12 I 186 .DA #%00010010
810D-92 I 187 .DA #%10010010
810E-32 I 188 .DA #%00110010
810F-B2 I 189 .DA #%10110010
8110-0A I 190 .DA #%00001010
8111-8A I 191 .DA #%10001010
8112-2A I 192 .DA #%00101010
8113-AA I 193 .DA #%10101010
8114-1A I 194 .DA #%00011010
8115-9A I 195 .DA #%10011010
8116-3A I 196 .DA #%00111010
8117-BA I 197 .DA #%10111010
8118- 19 ;
8118- 20 ; STORE CPU INITIALIZATION VECTORS AT THE END OF THE EEPROM.
8118- 21 ;
FFFA 22 .NO $FFFA,$FF
FFFA-00 80 23 .DA START ; NMI VECTOR
FFFC-00 80 24 .DA START ; RESET VECTOR
FFFE-00 80 25 .DA START ; IRQ VECTOR

View File

@ -50,26 +50,26 @@ CC03- I 17 DDR3A .EQ VIA3+3
0208-8D 02 CC I 38 ( 4) STA DDR3B
020B-A9 00 I 39 ( 2) LDA #0
020D-8D 03 CC I 40 ( 4) STA DDR3A
0210-85 05 I 41 ( 2) STA PLYR1 ; CLEAR NUMBER OF WINS.
0212-85 06 I 42 ( 2) STA PLYR2
0210-85 05 I 41 ( 3) STA PLYR1 ; CLEAR NUMBER OF WINS.
0212-85 06 I 42 ( 3) STA PLYR2
0214-A9 79 I 43 ( 2) MOVE LDA #%01111001
0216-8D 01 C0 I 44 ( 4) STA PORT1A ; SHOW RIGHT ARROW
0219-A9 00 I 45 ( 2) LDA #0
021B-8D 00 C0 I 46 ( 4) STA PORT1B
021E-85 02 I 47 ( 2) STA CNTLO ; CLEAR COUNTERS
0220-85 01 I 48 ( 2) STA CNTHI
021E-85 02 I 47 ( 3) STA CNTLO ; CLEAR COUNTERS
0220-85 01 I 48 ( 3) STA CNTHI
0222-20 8C 02 I 49 ( 6) JSR PLAY ; GET PLAYER 1S TIME.
0225-A5 02 I 50 ( 3) LDA CNTLO ; TRANSFER TEMP COUNT TO PERMANENT STORAGE
0227-85 04 I 51 ( 2) STA CNT1L
0227-85 04 I 51 ( 3) STA CNT1L
0229-A5 01 I 52 ( 3) LDA CNTHI
022B-85 03 I 53 ( 2) STA CNT1H
022B-85 03 I 53 ( 3) STA CNT1H
022D-A9 3C I 54 ( 2) LDA #%00111100 ; SHOW LEFT ARROW
022F-8D 01 C0 I 55 ( 4) STA PORT1A
0232-A9 01 I 56 ( 2) LDA #1
0234-8D 00 C0 I 57 ( 4) STA PORT1B
0237-A9 00 I 58 ( 2) LDA #0
0239-85 02 I 59 ( 2) STA CNTLO ; CLEAR COUNTERS
023B-85 01 I 60 ( 2) STA CNTHI
0239-85 02 I 59 ( 3) STA CNTLO ; CLEAR COUNTERS
023B-85 01 I 60 ( 3) STA CNTHI
023D-20 8C 02 I 61 ( 6) JSR PLAY ; GET PLAYER 2S TIME.
0240-A5 01 I 62 ( 3) LDA CNTHI ; GET PLAYER 2S COUNT AND...
0242-C5 03 I 63 ( 3) CMP CNT1H ; COMPARE TO PLAYER 1S.
@ -115,7 +115,7 @@ CC03- I 17 DDR3A .EQ VIA3+3
028F-20 E4 02 I 103 ( 6) JSR DELAY ; RANDOM - LENGTH DELAY.
0292-20 F5 02 I 104 ( 6) JSR RANDOM ; GET ANOTHER
0295-29 0F I 105 ( 2) AND #$0F ; KEEP UNDER 16 FOR USE AS
0297-85 07 I 106 ( 2) STA NUMBER ; NUMBER TO GUESS.
0297-85 07 I 106 ( 3) STA NUMBER ; NUMBER TO GUESS.
0299-AA I 107 ( 2) TAX ; USE AS INDEX TO ...
029A-BD 08 03 I 108 ( 4*) LDA NUMTAB,X ; GET REVERSED PATTERN FROM TABLE
029D-0D 00 C0 I 109 ( 4) ORA PORT1B ; TO DISPLAY IN LEDS 12-15.
@ -146,63 +146,64 @@ CC03- I 17 DDR3A .EQ VIA3+3
02CC- I 134 ;
02CC- I 135 ; SUBROUTINE 'BLINK'
02CC- I 136 ; BLINKS LEDS WHOSE BITS ARE SET IN ACCUMULATOR ON ENTRY.
02CC-A2 14 I 137 ( 2) BLINK LDX #20 ; 20 BLINKS.
02CE-86 01 I 138 ( 3) STX CNTHI ; SET BLINK COUNTER.
02D0-85 02 I 139 ( 2) STA CNTLO ; BLINK REGISTER
02D2-A5 02 I 140 ( 3) BLOOP LDA CNTLO ; GET BLINK PATTERN
02D4-4D 00 C0 I 141 ( 4) EOR PORT1B ; BLINK LEDS.
02D7-8D 00 C0 I 142 ( 4) STA PORT1B
02DA-A9 0A I 143 ( 2) LDA #10 ; SHORT DELAY
02DC-20 E4 02 I 144 ( 6) JSR DELAY
02DF-C6 01 I 145 ( 5) DEC CNTHI
02E1-D0 EF I 146 (2**) BNE BLOOP ; LOOP IF NOT DONE.
02E3-60 I 147 ( 6) RTS
02E4- I 148 ;
02E4- I 149 ; SUBROUTINE 'DELAY'
02E4- I 150 ; CONTENTS OF ACCUMULATOR DETERMINES DELAY LENGTH.
02E4- I 151 ;
02E4-85 00 I 152 ( 2) DELAY STA TEMP
02E6-A0 10 I 153 ( 2) DL1 LDY #$10
02E8-A2 FF I 154 ( 2) DL2 LDX #$FF
02EA-CA I 155 ( 2) DL3 DEX
02EB-D0 FD I 156 (2**) BNE DL3
02ED-88 I 157 ( 2) DEY
02EE-D0 F8 I 158 (2**) BNE DL2
02F0-C6 00 I 159 ( 5) DEC TEMP
02F2-D0 F2 I 160 (2**) BNE DL1
02F4-60 I 161 ( 6) RTS
02F5- I 162 ;
02F5- I 163 ; SUBROUTINE 'RANDOM'
02F5- I 164 ; RANDOM NUMBER GENERATOR, RETURNS RANDOM NUMBER IN ACCUMULATOR.
02F5- I 165 ;
02F5-38 I 166 ( 2) RANDOM SEC
02F6-A5 09 I 167 ( 3) LDA SCR+1
02F8-65 0C I 168 ( 3) ADC SCR+4
02FA-65 0D I 169 ( 3) ADC SCR+5
02FC-85 08 I 170 ( 2) STA SCR
02FE-A2 04 I 171 ( 2) LDX #4
0300-B5 08 I 172 ( 4) RNDLP LDA SCR,X
0302-95 09 I 173 ( 4) STA SCR+1,X
0304-CA I 174 ( 2) DEX
0305-10 F9 I 175 (2**) BPL RNDLP
0307-60 I 176 ( 6) RTS
0308- I 177 ;
0308- I 178 ; TABLE OF 'REVERSED' NUMBERS FOR DISPLAY
0308- I 179 ; IN BITS 3-8 OF PORT1B, OR LEDS 12-15.
0308- I 180 ;
0308-02 I 181 NUMTAB .DA #%00000010
0309-82 I 182 .DA #%10000010
030A-22 I 183 .DA #%00100010
030B-A2 I 184 .DA #%10100010
030C-12 I 185 .DA #%00010010
030D-92 I 186 .DA #%10010010
030E-32 I 187 .DA #%00110010
030F-B2 I 188 .DA #%10110010
0310-0A I 189 .DA #%00001010
0311-8A I 190 .DA #%10001010
0312-2A I 191 .DA #%00101010
0313-AA I 192 .DA #%10101010
0314-1A I 193 .DA #%00011010
0315-9A I 194 .DA #%10011010
0316-3A I 195 .DA #%00111010
0317-BA I 196 .DA #%10111010
02CC- I 137 ;
02CC-A2 14 I 138 ( 2) BLINK LDX #20 ; 20 BLINKS.
02CE-86 01 I 139 ( 3) STX CNTHI ; SET BLINK COUNTER.
02D0-85 02 I 140 ( 3) STA CNTLO ; BLINK REGISTER
02D2-A5 02 I 141 ( 3) BLOOP LDA CNTLO ; GET BLINK PATTERN
02D4-4D 00 C0 I 142 ( 4) EOR PORT1B ; BLINK LEDS.
02D7-8D 00 C0 I 143 ( 4) STA PORT1B
02DA-A9 0A I 144 ( 2) LDA #10 ; SHORT DELAY
02DC-20 E4 02 I 145 ( 6) JSR DELAY
02DF-C6 01 I 146 ( 5) DEC CNTHI
02E1-D0 EF I 147 (2**) BNE BLOOP ; LOOP IF NOT DONE.
02E3-60 I 148 ( 6) RTS
02E4- I 149 ;
02E4- I 150 ; SUBROUTINE 'DELAY'
02E4- I 151 ; CONTENTS OF ACCUMULATOR DETERMINES DELAY LENGTH.
02E4- I 152 ;
02E4-85 00 I 153 ( 3) DELAY STA TEMP
02E6-A0 10 I 154 ( 2) DL1 LDY #$10
02E8-A2 FF I 155 ( 2) DL2 LDX #$FF
02EA-CA I 156 ( 2) DL3 DEX
02EB-D0 FD I 157 (2**) BNE DL3
02ED-88 I 158 ( 2) DEY
02EE-D0 F8 I 159 (2**) BNE DL2
02F0-C6 00 I 160 ( 5) DEC TEMP
02F2-D0 F2 I 161 (2**) BNE DL1
02F4-60 I 162 ( 6) RTS
02F5- I 163 ;
02F5- I 164 ; SUBROUTINE 'RANDOM'
02F5- I 165 ; RANDOM NUMBER GENERATOR, RETURNS RANDOM NUMBER IN ACCUMULATOR.
02F5- I 166 ;
02F5-38 I 167 ( 2) RANDOM SEC
02F6-A5 09 I 168 ( 3) LDA SCR+1
02F8-65 0C I 169 ( 3) ADC SCR+4
02FA-65 0D I 170 ( 3) ADC SCR+5
02FC-85 08 I 171 ( 3) STA SCR
02FE-A2 04 I 172 ( 2) LDX #4
0300-B5 08 I 173 ( 4) RNDLP LDA SCR,X
0302-95 09 I 174 ( 4) STA SCR+1,X
0304-CA I 175 ( 2) DEX
0305-10 F9 I 176 (2**) BPL RNDLP
0307-60 I 177 ( 6) RTS
0308- I 178 ;
0308- I 179 ; TABLE OF 'REVERSED' NUMBERS FOR DISPLAY
0308- I 180 ; IN BITS 3-8 OF PORT1B, OR LEDS 12-15.
0308- I 181 ;
0308-02 I 182 NUMTAB .DA #%00000010
0309-82 I 183 .DA #%10000010
030A-22 I 184 .DA #%00100010
030B-A2 I 185 .DA #%10100010
030C-12 I 186 .DA #%00010010
030D-92 I 187 .DA #%10010010
030E-32 I 188 .DA #%00110010
030F-B2 I 189 .DA #%10110010
0310-0A I 190 .DA #%00001010
0311-8A I 191 .DA #%10001010
0312-2A I 192 .DA #%00101010
0313-AA I 193 .DA #%10101010
0314-1A I 194 .DA #%00011010
0315-9A I 195 .DA #%10011010
0316-3A I 196 .DA #%00111010
0317-BA I 197 .DA #%10111010

View File

@ -8,7 +8,15 @@
;
VIA1 .EQ $C000
VIA3 .EQ $CC00
DDR3A .EQ VIA3+3 ; USING RC-ONE ADDRESS DECODING SCHEME, PLACING
DDR3B .EQ VIA3+2 ; VIA3 AT $CC00 BY DEFAULT (INSTEAD OF $AC00)
PORT3A .EQ VIA3+1 ; TO FIT RC-ONE ADDRESS DECODING THOUGH ORIGINAL
PORT3B .EQ VIA3 ; CAN BE JUMPERED IF NEEDED/WANTED.
.OR $0100 ; NOTE: BOOK PLACES $0100 INSIDE STACK, MEANING
.TA $0100 ; THAT ROUTINE MAY EASILY GET OVERWRITTEN.
START LDA #0
STA DDR3A ; SET KEY STROBE PORT FOR INPUT
LDA #$FF
STA DDR3B ; SET KEYS FOR OUTPUT
.IN getkey_routine.asm

View File

@ -1,3 +1,4 @@
A9008D03CCA9FF8D02CC2C01CC10FBA2
0F8E00CC2C01CC1005CA10F530F18AA0
12A2FF2C01CC30E7CAD0F888D0F360
12A2FF2C01CC30E7CAD0F888D0F360A9
008D03CCA9FF8D02CC60

View File

@ -5,44 +5,52 @@
0000- 8 ;
C000- 9 VIA1 .EQ $C000
CC00- 10 VIA3 .EQ $CC00
0000- 11
0100- 12 .OR $0100 ; NOTE: BOOK PLACES $0100 INSIDE STACK, MEANING
0100- 13 .TA $0100 ; THAT ROUTINE MAY EASILY GET OVERWRITTEN.
0100- 14 .IN getkey_routine.asm
0100- I 1 ; 'GETKEY' KEYBOARD INPUT ROUTINE READS AND DEBOUNCES KEYBOARD. RETURNS WITH
0100- I 2 ; KEY NUMBER IN ACCUMULATOR IF KEY DOWN. OPERATION: SENDS NUMBERS 0-F TO 74154
0100- I 3 ; (4 TO 16 LINE DECODER), WHICH GROUNDS ONE SIDE OF KEYSWITCHES ONE AT A TIME.
0100- I 4 ; IF A KEY IS DOWN, PA7 OF VIA #3 WILL BE GROUNDED, AND THE CURRENT VALUE
0100- I 5 ; APPLIED TO THE 74154 BE THE KEY NUMBER. WHEN THE PROGRAM DETECTS A KEY CLOSE
0100- I 6 ; CHECKS FOR KEY CLOSURE FOR 50 MS. TO ELIMINATE BOUNCE.
0100- I 7 ; NOTE: IF NO KEY IS PRESSED, GETKEY WILL WAIT.
0100- I 8 ;
CC03- I 9 DDR3A .EQ VIA3+3 ; USING RC-ONE ADDRESS DECODING SCHEME, PLACING
CC02- I 10 DDR3B .EQ VIA3+2 ; VIA3 AT $CC00 BY DEFAULT (INSTEAD OF $AC00)
CC01- I 11 PORT3A .EQ VIA3+1 ; TO FIT RC-ONE ADDRESS DECODING THOUGH ORIGINAL
CC00- I 12 PORT3B .EQ VIA3 ; CAN BE JUMPERED IF NEEDED/WANTED.
0100- I 13
0100-A9 00 I 14 ( 2) LDA #0
0102-8D 03 CC I 15 ( 4) STA DDR3A ; SET KEY STROBE PORT FOR INPUT
0105-A9 FF I 16 ( 2) LDA #$FF
0107-8D 02 CC I 17 ( 4) STA DDR3B ; SET KEYS FOR OUTPUT
010A-2C 01 CC I 18 ( 4) GETKEY BIT PORT3A ; SEE IF KEY IS STILL DOWN FROM LAST KEY CLOSURE:
010D- I 19 ; KEYSTROBE IN 'N' STATUS BIT.
010D-10 FB I 20 (2**) BPL GETKEY ; IF YES, WAIT FOR KEY RELEASE
010F-A2 0F I 21 ( 2) RSTART LDX #15 ; SET KEY COUNTER TO 15
0111-8E 00 CC I 22 ( 4) NXTKEY STX PORT3B ; OUTPUT KEY # TO 74154
0114-2C 01 CC I 23 ( 4) BIT PORT3A ; SEE IF KEY DOWN: STROBE IN 'N'
0117-10 05 I 24 (2**) BPL BOUNCE ; IF YES, GO DEBOUNCE
0119-CA I 25 ( 2) DEX ; DECREMENT KEY #
011A-10 F5 I 26 (2**) BPL NXTKEY ; NO, DO NEXT KEY
011C-30 F1 I 27 (2**) BMI RSTART ; START OVER
011E-8A I 28 ( 2) BOUNCE TXA ; SAVE KEY NUMBER IN A
011F-A0 12 I 29 ( 2) LDY #$12 ; OUTER LOOP CNT LOAD FOR DELAY OF 50 MS.
0121-A2 FF I 30 ( 2) LP1 LDX #$FF ; INNER 11 US. LOOP
0123-2C 01 CC I 31 ( 4) LP2 BIT PORT3A ; SEE IF KEY STILL DOWN
0126-30 E7 I 32 (2**) BMI RSTART ; IF NOT, KEY NOT VALID, RESTART
0128-CA I 33 ( 2) DEX
0129-D0 F8 I 34 (2**) BNE LP2 ; THIS LOOP USES 2115*5 US.
012B-88 I 35 ( 2) DEY
012C-D0 F3 I 36 (2**) BNE LP1 ; OUTER LOOP: TOTAL IS 50 MS.
012E-60 I 37 ( 6) RTS ; DONE: KEY IN A.
CC03- 11 DDR3A .EQ VIA3+3 ; USING RC-ONE ADDRESS DECODING SCHEME, PLACING
CC02- 12 DDR3B .EQ VIA3+2 ; VIA3 AT $CC00 BY DEFAULT (INSTEAD OF $AC00)
CC01- 13 PORT3A .EQ VIA3+1 ; TO FIT RC-ONE ADDRESS DECODING THOUGH ORIGINAL
CC00- 14 PORT3B .EQ VIA3 ; CAN BE JUMPERED IF NEEDED/WANTED.
0000- 15
0100- 16 .OR $0100 ; NOTE: BOOK PLACES $0100 INSIDE STACK, MEANING
0100- 17 .TA $0100 ; THAT ROUTINE MAY EASILY GET OVERWRITTEN.
0100-A9 00 18 ( 2) START LDA #0
0102-8D 03 CC 19 ( 4) STA DDR3A ; SET KEY STROBE PORT FOR INPUT
0105-A9 FF 20 ( 2) LDA #$FF
0107-8D 02 CC 21 ( 4) STA DDR3B ; SET KEYS FOR OUTPUT
010A- 22 .IN getkey_routine.asm
010A- I 1 ; 'GETKEY' KEYBOARD INPUT ROUTINE READS AND DEBOUNCES KEYBOARD. RETURNS WITH
010A- I 2 ; KEY NUMBER IN ACCUMULATOR IF KEY DOWN. OPERATION: SENDS NUMBERS 0-F TO 74154
010A- I 3 ; (4 TO 16 LINE DECODER), WHICH GROUNDS ONE SIDE OF KEYSWITCHES ONE AT A TIME.
010A- I 4 ; IF A KEY IS DOWN, PA7 OF VIA #3 WILL BE GROUNDED, AND THE CURRENT VALUE
010A- I 5 ; APPLIED TO THE 74154 BE THE KEY NUMBER. WHEN THE PROGRAM DETECTS A KEY CLOSE
010A- I 6 ; CHECKS FOR KEY CLOSURE FOR 50 MS. TO ELIMINATE BOUNCE.
010A- I 7 ; NOTE: IF NO KEY IS PRESSED, GETKEY WILL WAIT.
010A- I 8 ;
010A-2C 01 CC I 9 ( 4) GETKEY BIT PORT3A ; SEE IF KEY IS STILL DOWN FROM LAST KEY CLOSURE:
010D- I 10 ; KEYSTROBE IN 'N' STATUS BIT.
010D-10 FB I 11 (2**) BPL GETKEY ; IF YES, WAIT FOR KEY RELEASE
010F-A2 0F I 12 ( 2) RSTART LDX #15 ; SET KEY COUNTER TO 15
0111-8E 00 CC I 13 ( 4) NXTKEY STX PORT3B ; OUTPUT KEY # TO 74154
0114-2C 01 CC I 14 ( 4) BIT PORT3A ; SEE IF KEY DOWN: STROBE IN 'N'
0117-10 05 I 15 (2**) BPL BOUNCE ; IF YES, GO DEBOUNCE
0119-CA I 16 ( 2) DEX ; DECREMENT KEY #
011A-10 F5 I 17 (2**) BPL NXTKEY ; NO, DO NEXT KEY
011C-30 F1 I 18 (2**) BMI RSTART ; START OVER
011E-8A I 19 ( 2) BOUNCE TXA ; SAVE KEY NUMBER IN A
011F-A0 12 I 20 ( 2) LDY #$12 ; OUTER LOOP CNT LOAD FOR DELAY OF 50 MS.
0121-A2 FF I 21 ( 2) LP1 LDX #$FF ; INNER 11 US. LOOP
0123-2C 01 CC I 22 ( 4) LP2 BIT PORT3A ; SEE IF KEY STILL DOWN
0126-30 E7 I 23 (2**) BMI RSTART ; IF NOT, KEY NOT VALID, RESTART
0128-CA I 24 ( 2) DEX
0129-D0 F8 I 25 (2**) BNE LP2 ; THIS LOOP USES 2115*5 US.
012B-88 I 26 ( 2) DEY
012C-D0 F3 I 27 (2**) BNE LP1 ; OUTER LOOP: TOTAL IS 50 MS.
012E-60 I 28 ( 6) RTS ; DONE: KEY IN A.
012F- I 29 ;
012F- I 30 ; SUBROUTINE 'INITKEY'
012F- I 31 ; TAKES CARE OF INITIALIZING VIA #3 FOR USING WITH THE GETKEY ROUTINE FROM
012F- I 32 ; THE CODE.
012F-A9 00 I 33 ( 2) INITKEY LDA #0
0131-8D 03 CC I 34 ( 4) STA DDR3A ; SET KEY STROBE PORT FOR INPUT
0134-A9 FF I 35 ( 2) LDA #$FF
0136-8D 02 CC I 36 ( 4) STA DDR3B ; SET KEYS FOR OUTPUT
0139-60 I 37 ( 6) RTS

View File

@ -6,15 +6,6 @@
; CHECKS FOR KEY CLOSURE FOR 50 MS. TO ELIMINATE BOUNCE.
; NOTE: IF NO KEY IS PRESSED, GETKEY WILL WAIT.
;
DDR3A .EQ VIA3+3 ; USING RC-ONE ADDRESS DECODING SCHEME, PLACING
DDR3B .EQ VIA3+2 ; VIA3 AT $CC00 BY DEFAULT (INSTEAD OF $AC00)
PORT3A .EQ VIA3+1 ; TO FIT RC-ONE ADDRESS DECODING THOUGH ORIGINAL
PORT3B .EQ VIA3 ; CAN BE JUMPERED IF NEEDED/WANTED.
LDA #0
STA DDR3A ; SET KEY STROBE PORT FOR INPUT
LDA #$FF
STA DDR3B ; SET KEYS FOR OUTPUT
GETKEY BIT PORT3A ; SEE IF KEY IS STILL DOWN FROM LAST KEY CLOSURE:
; KEYSTROBE IN 'N' STATUS BIT.
BPL GETKEY ; IF YES, WAIT FOR KEY RELEASE
@ -34,4 +25,13 @@ LP2 BIT PORT3A ; SEE IF KEY STILL DOWN
BNE LP2 ; THIS LOOP USES 2115*5 US.
DEY
BNE LP1 ; OUTER LOOP: TOTAL IS 50 MS.
RTS ; DONE: KEY IN A.
RTS ; DONE: KEY IN A.
;
; SUBROUTINE 'INITKEY'
; TAKES CARE OF INITIALIZING VIA #3 FOR USING WITH THE GETKEY ROUTINE FROM
; THE CODE.
INITKEY LDA #0
STA DDR3A ; SET KEY STROBE PORT FOR INPUT
LDA #$FF
STA DDR3B ; SET KEYS FOR OUTPUT
RTS

View File

@ -9,8 +9,13 @@
;
VIA1 .EQ $C000
VIA3 .EQ $CC00
DDR3A .EQ VIA3+3 ; USING RC-ONE ADDRESS DECODING SCHEME, PLACING
DDR3B .EQ VIA3+2 ; VIA3 AT $CC00 BY DEFAULT (INSTEAD OF $AC00)
PORT3A .EQ VIA3+1 ; TO FIT RC-ONE ADDRESS DECODING THOUGH ORIGINAL
PORT3B .EQ VIA3 ; CAN BE JUMPERED IF NEEDED/WANTED.
.OR $0200
.TA $0200
BEGIN JSR INITKEY
.IN player.asm
.IN ../CH01-Getkey/getkey_routine.asm

View File

@ -1,17 +1,18 @@
A90085001820E802C90FD00520870290
EFC90ED0062048021890EA8501207002
A500C9FFD00520870290DA4AA8A501B0
09290F990003E60090CB0A0A0A0A1900
03990003E60090BDA2008602A5024AAA
BD0003B004290F900629F04A4A4A4A20
7002A220209C02E602A502C50090DF60
C90DD006A254209C0260AABDD1028504
BDC40220A80260A9FF8504A94B20A802
A93820A802A94B20A8021860A0FFEAD0
0088D0FACAD0F5608503A9FF8D02CCA9
00A604A40388189000D0FA49FF8D00CC
CAD0F060FEE2C9BEA9968E867E777064
5E55606B72808F94A1AAB5BFD7E4A900
8D03CCA9FF8D02CC2C01CC10FBA20F8E
00CC2C01CC1005CA10F530F18AA012A2
FF2C01CC30E7CAD0F888D0F360
200603A90085001820E102C90FD00520
8A0290EFC90ED006204B021890EA8501
207302A500C9FFD005208A0290DA4AA8
A501B009290F990003E60090CB0A0A0A
0A190003990003E60090BDA2008602A5
024AAABD0003B004290F900629F04A4A
4A4A207302A220209F02E602A502C500
90DF60C90DD006A254209F0260AABDD4
028504BDC70220AB0260A9FF8504A94B
20AB02A93820AB02A94B20AB021860A0
FFEAD00088D0FACAD0F5608503A9FF8D
02CCA900A604A40388189000D0FA49FF
8D00CCCAD0F060FEE2C9BEA9968E867E
7770645E55606B72808F94A1AAB5BFD7
E42C01CC10FBA20F8E00CC2C01CC1005
CA10F530F18AA012A2FF2C01CC30E7CA
D0F888D0F360A9008D03CCA9FF8D02CC
60

View File

@ -6,18 +6,23 @@
0000- 9 ;
C000- 10 VIA1 .EQ $C000
CC00- 11 VIA3 .EQ $CC00
0000- 12
0200- 13 .OR $0200
0200- 14 .TA $0200
0200- 15 .IN player.asm
0200- I 1 ; MUSIC PLAYER PROGRAM
0200- I 2 ; USES 16-KEY KEYBOARD AND BUFFERED SPEAKER
0200- I 3 ; PROGRAM PLAYS STORED MUSICAL NOTES. THERE ARE TWO MODES OF OPERATION: INPUT
0200- I 4 ; AND PLAY. INPUT MODE IS THE DEFAULT, AND ALL NON-COMMAND KEYS PRESSED PRESSED
0200- I 5 ; (0-D) ARE STORED FOR REPLAY. IF AN OVERFLOW OCCURS, THE USER IS WARMED WITH
0200- I 6 ; A THREE-TONE WARNING. THE SAME WARBLING TONE IS ALSO USED TO SIGNAL A RESTART
0200- I 7 ; OF THE PROGRAM.
0200- I 8 ;
CC03- 12 DDR3A .EQ VIA3+3 ; USING RC-ONE ADDRESS DECODING SCHEME, PLACING
CC02- 13 DDR3B .EQ VIA3+2 ; VIA3 AT $CC00 BY DEFAULT (INSTEAD OF $AC00)
CC01- 14 PORT3A .EQ VIA3+1 ; TO FIT RC-ONE ADDRESS DECODING THOUGH ORIGINAL
CC00- 15 PORT3B .EQ VIA3 ; CAN BE JUMPERED IF NEEDED/WANTED.
0000- 16
0200- 17 .OR $0200
0200- 18 .TA $0200
0200-20 06 03 19 ( 6) BEGIN JSR INITKEY
0203- 20 .IN player.asm
0203- I 1 ; MUSIC PLAYER PROGRAM
0203- I 2 ; USES 16-KEY KEYBOARD AND BUFFERED SPEAKER
0203- I 3 ; PROGRAM PLAYS STORED MUSICAL NOTES. THERE ARE TWO MODES OF OPERATION: INPUT
0203- I 4 ; AND PLAY. INPUT MODE IS THE DEFAULT, AND ALL NON-COMMAND KEYS PRESSED PRESSED
0203- I 5 ; (0-D) ARE STORED FOR REPLAY. IF AN OVERFLOW OCCURS, THE USER IS WARNED WITH
0203- I 6 ; A THREE-TONE WARNING. THE SAME WARBLING TONE IS ALSO USED TO SIGNAL A RESTART
0203- I 7 ; OF THE PROGRAM.
0203- I 8 ;
0000- I 9 PILEN .EQ $00 ; LENGTH OF NOTE LIST
0001- I 10 TEMP .EQ $01 ; TEMPORARY STORAGE
0002- I 11 PTR .EQ $02 ; CURRENT LOCATION IN LIST
@ -26,188 +31,188 @@ CC00- 11 VIA3 .EQ $CC00
0300- I 14 TABEG .EQ $0300 ; TABLE TO STORE MUSIC
CC00- I 15 PORT3B .EQ VIA3 ; VIA OUTPUT PORT B
CC02- I 16 DDR3B .EQ VIA3+2 ; VIA PORT B DIRECTION REGISTER
0200- I 17 ;
0200- I 18 ; COMMAND LINE INTERPRETER
0200- I 19 ; $F AS INPUT MEANS RESET POINTERS, START OVER.
0200- I 20 ; $E MEANS PLAY CURRENTLY STORED NOTES
0200- I 21 ; ANYTHING ELSE IS STORED FOR REPLAY.
0200- I 22 ;
0200-A9 00 I 23 ( 2) START LDA #0 ; CLEAR NOTE LIST LENGTH
0202-85 00 I 24 ( 2) STA PILEN
0204-18 I 25 ( 2) CLC ; CLEAR NIBBLE MARKER
0205-20 E8 02 I 26 ( 6) NXKEY JSR GETKEY
0208-C9 0F I 27 ( 2) CMP #15 ; IS KEY #15?
020A-D0 05 I 28 (2**) BNE NXTST ; NO, DO NEXT TEST
020C-20 87 02 I 29 ( 6) JSR BEEP3 ; TELL USER OF CLEARING
020F-90 EF I 30 (2**) BCC START ; CLEAR POINTERS AND START OVER
0211-C9 0E I 31 ( 2) NXTST CMP #14 ; IS KEY #14?
0213-D0 06 I 32 (2**) BNE NUMKEY ; NO, KEY IS NOTE NUMBER
0215-20 48 02 I 33 ( 6) JSR PLAYEM ; PLAY NOTES
0218-18 I 34 ( 2) CLC
0219-90 EA I 35 (2**) BCC NXKEY ; GET NEXT COMMAND
021B- I 36 ;
021B- I 37 ; ROUTINE TO LOAD NOT LIST WITH NOTES
021B- I 38 ;
021B-85 01 I 39 ( 2) NUMKEY STA TEMP ; SAVE KEY, FREE A
021D-20 70 02 I 40 ( 6) JSR PLAYIT ; PLAY NOTE
0220-A5 00 I 41 ( 3) LDA PILEN ; GET LIST LENGTH
0222-C9 FF I 42 ( 2) CMP #$FF ; OVERFLOW?
0224-D0 05 I 43 (2**) BNE OK ; NO, ADD NOTE TO LIST
0226-20 87 02 I 44 ( 6) JSR BEEP3 ; YES, WARN USER
0229-90 DA I 45 (2**) BCC NXKEY ; RETURN TO INPUT MODE
022B-4A I 46 ( 2) OK LSR A ; SHIFT LOW BIT INTO NIBBLE POINTER
022C-A8 I 47 ( 2) TAY ; USE SHIFTED NIBBLE POINTER AS BYTE INDEX
022D-A5 01 I 48 ( 3) LDA TEMP ; RESTORE KEY#
022F-B0 09 I 49 (2**) BCS FINBYT ; IF BYTE ALREADY HAS A NIBBLE, FINISH IT AND STORE
0231-29 0F I 50 ( 2) AND #%00001111 ; 1ST NIBBLE. MASK HIGH NIBBLE
0233-99 00 03 I 51 ( 5) STA TABEG,Y ; SAVE UNFINISHED 1/2 BYTE
0236-E6 00 I 52 ( 5) INC PILEN ; POINT TO NEXT NIBBLE
0238-90 CB I 53 (2**) BCC NXKEY ; GET NEXT KEYSTROKE
023A-0A I 54 ( 2) FINBYT ASL A ; SHIFT NIBBLE 2 TO HIGH ORDER
023B-0A I 55 ( 2) ASL A
023C-0A I 56 ( 2) ASL A
023D-0A I 57 ( 2) ASL A
023E-19 00 03 I 58 ( 4*) ORA TABEG,Y ; JOIN 2 NIBBLES AS BYTE
0241-99 00 03 I 59 ( 5) STA TABEG,Y ; ... AND STORE.
0244-E6 00 I 60 ( 5) INC PILEN ; POINT TO NEXT NIBBLE IN NEXT BYTE
0246-90 BD I 61 (2**) BCC NXKEY ; RETURN
0248- I 62 ;
0248- I 63 ; ROUTINE TO PLAY NOTES
0248- I 64 ;
0248-A2 00 I 65 ( 2) PLAYEM LDX #0 ; CLEAR POINTER
024A-86 02 I 66 ( 3) STX PTR
024C-A5 02 I 67 ( 3) LDA PTR ; LOAD ACCUMULATOR WITH CURRENT POINTER VALUE
024E-4A I 68 ( 2) LOOP LSR A ; SHIFT NIBBLE INDICATOR INTO CARRY
024F-AA I 69 ( 2) TAX ; USE SHIFTED NIBBLE POINTER AS BYTE POINTER
0250-BD 00 03 I 70 ( 4*) LDA TABEG,X ; LOAD NOTE TO PLAY
0253-B0 04 I 71 (2**) BCS ENDBYT ; LOW NIBBLE USED, GET HIGH
0255-29 0F I 72 ( 2) AND #%00001111 ; MASK OUT HIGH BITS
0257-90 06 I 73 (2**) BCC FINISH ; PLAY NOTE
0259-29 F0 I 74 ( 2) ENDBYT AND #%11110000 ; THROW AWAY LOW NIBBLE
025B-4A I 75 ( 2) LSR A ; SHIFT INTO LOW
025C-4A I 76 ( 2) LSR A
025D-4A I 77 ( 2) LSR A
025E-4A I 78 ( 2) LSR A
025F-20 70 02 I 79 ( 6) FINISH JSR PLAYIT ; CALCULATE CONSTANTS & PLAY
0262-A2 20 I 80 ( 2) LDX #$20 ; BETWEEN-NOTE DELAY
0264-20 9C 02 I 81 ( 6) JSR DELAY
0267-E6 02 I 82 ( 5) INC PTR ; ONE NIBBLE USED
0269-A5 02 I 83 ( 3) LDA PTR
026B-C5 00 I 84 ( 3) CMP PILEN ; END OF LIST?
026D-90 DF I 85 (2**) BCC LOOP ; NO, GET NEXT NOTE
026F-60 I 86 ( 6) RTS ; DONE
0270- I 87 ;
0270- I 88 ; ROUTINE TO DO TABLE LOOK UP, SEPARATE REST
0270- I 89 ;
0270-C9 0D I 90 ( 2) PLAYIT CMP #13 ; REST?
0272-D0 06 I 91 (2**) BNE SOUND ; NO.
0274-A2 54 I 92 ( 2) LDX #$54 ; DELAY = NOTE LENGTH = .21SEC
0276-20 9C 02 I 93 ( 6) JSR DELAY
0279-60 I 94 ( 6) RTS
027A-AA I 95 ( 2) SOUND TAX ; USE KEYS AS INDEX..
027B-BD D1 02 I 96 ( 4*) LDA DURTAB,X ; ... TO FIND DURATION.
027E-85 04 I 97 ( 2) STA DUR ; STORE DURATION FOR USE
0280-BD C4 02 I 98 ( 4*) LDA NOTAB,X ; LOAD NOTE VALUE
0283-20 A8 02 I 99 ( 6) JSR TONE
0286-60 I 100 ( 6) RTS
0287- I 101 ;
0287- I 102 ; ROUTINE TO MAKE 3 TONE SIGNAL
0287- I 103 ;
0287-A9 FF I 104 ( 2) BEEP3 LDA #$FF ; DURATION FOR BEEPS
0289-85 04 I 105 ( 2) STA DUR
028B-A9 4B I 106 ( 2) LDA #$4B ; CODE FOR E2
028D-20 A8 02 I 107 ( 6) JSR TONE ; 1ST NOTE
0290-A9 38 I 108 ( 2) LDA #$38 ; CODE FOR D2
0292-20 A8 02 I 109 ( 6) JSR TONE
0295-A9 4B I 110 ( 2) LDA #$4B
0297-20 A8 02 I 111 ( 6) JSR TONE
029A-18 I 112 ( 2) CLC
029B-60 I 113 ( 6) RTS
029C- I 114 ;
029C- I 115 ; VARIABLE-LENGTH DELAY
029C- I 116 ;
029C-A0 FF I 117 ( 2) DELAY LDY #$FF
029E-EA I 118 ( 2) DLY NOP
029F-D0 00 I 119 (2**) BNE DL0 ; (.+2 IN BOOK)
02A1-88 I 120 ( 2) DL0 DEY
02A2-D0 FA I 121 (2**) BNE DLY ; 10 US. LOOP
02A4-CA I 122 ( 2) DEX
02A5-D0 F5 I 123 (2**) BNE DELAY ; LOOP TIME = 2556*[X]
02A7-60 I 124 ( 6) RTS
02A8- I 125 ;
02A8- I 126 ; ROUTINE TO MAKE TONE: # OF 1/2 CYCLES IS IN 'DUR', AND 1/2 CYCLE TIME IS IN
02A8- I 127 ; ACCUMULATOR. LOOP TIME = 20*[A]+26 US SINCE TWO RUNS THROUGH THE OUTER LOOP
02A8- I 128 ; MAKES ONE CYCLE OF THE TONE.
02A8- I 129 ;
02A8-85 03 I 130 ( 2) TONE STA FREQ ; FREQ IS TEMP FOR # OF CYCLES
02AA-A9 FF I 131 ( 2) LDA #$FF ; SET UP DATA DIRECTION REGISTER
02AC-8D 02 CC I 132 ( 4) STA DDR3B
02AF-A9 00 I 133 ( 2) LDA #$00 ; A IS SENT TO PORT, START HI
02B1-A6 04 I 134 ( 3) LDX DUR
02B3-A4 03 I 135 ( 3) FL2 LDY FREQ
02B5-88 I 136 ( 2) FL1 DEY
02B6-18 I 137 ( 2) CLC
02B7-90 00 I 138 (2**) BCC FL0 ; (.+2 IN BOOK)
02B9-D0 FA I 139 (2**) FL0 BNE FL1 ; INNER, 10 US LOOP.
02BB-49 FF I 140 ( 2) EOR #$FF ; COMPLEMENT I/O PORT
02BD-8D 00 CC I 141 ( 4) STA PORT3B ; ... AND SET IT
02C0-CA I 142 ( 2) DEX
02C1-D0 F0 I 143 (2**) BNE FL2 ; OUTER LOOP
02C3-60 I 144 ( 6) RTS
02C4- I 145 ;
02C4- I 146 ; TABLE OF NOTE CONSTANTS
02C4- I 147 ; CONTAINS:
02C4- I 148 ; [OCTAVE BELOW MIDDLE C] : G,A,BCC
02C4- I 149 ; [OCTAVE OF MIDDLE C] : C,D,E,F,F#,G,G#,A,B
02C4- I 150 ; [OCTAVE ABOVE MIDDLE C] : C
02C4- I 151 ;
02C4-FE E2 C9 BE
0203- I 17 ;
0203- I 18 ; COMMAND LINE INTERPRETER
0203- I 19 ; $F AS INPUT MEANS RESET POINTERS, START OVER.
0203- I 20 ; $E MEANS PLAY CURRENTLY STORED NOTES
0203- I 21 ; ANYTHING ELSE IS STORED FOR REPLAY.
0203- I 22 ;
0203-A9 00 I 23 ( 2) START LDA #0 ; CLEAR NOTE LIST LENGTH
0205-85 00 I 24 ( 2) STA PILEN
0207-18 I 25 ( 2) CLC ; CLEAR NIBBLE MARKER
0208-20 E1 02 I 26 ( 6) NXKEY JSR GETKEY
020B-C9 0F I 27 ( 2) CMP #15 ; IS KEY #15?
020D-D0 05 I 28 (2**) BNE NXTST ; NO, DO NEXT TEST
020F-20 8A 02 I 29 ( 6) JSR BEEP3 ; TELL USER OF CLEARING
0212-90 EF I 30 (2**) BCC START ; CLEAR POINTERS AND START OVER
0214-C9 0E I 31 ( 2) NXTST CMP #14 ; IS KEY #14?
0216-D0 06 I 32 (2**) BNE NUMKEY ; NO, KEY IS NOTE NUMBER
0218-20 4B 02 I 33 ( 6) JSR PLAYEM ; PLAY NOTES
021B-18 I 34 ( 2) CLC
021C-90 EA I 35 (2**) BCC NXKEY ; GET NEXT COMMAND
021E- I 36 ;
021E- I 37 ; ROUTINE TO LOAD NOT LIST WITH NOTES
021E- I 38 ;
021E-85 01 I 39 ( 2) NUMKEY STA TEMP ; SAVE KEY, FREE A
0220-20 73 02 I 40 ( 6) JSR PLAYIT ; PLAY NOTE
0223-A5 00 I 41 ( 3) LDA PILEN ; GET LIST LENGTH
0225-C9 FF I 42 ( 2) CMP #$FF ; OVERFLOW?
0227-D0 05 I 43 (2**) BNE OK ; NO, ADD NOTE TO LIST
0229-20 8A 02 I 44 ( 6) JSR BEEP3 ; YES, WARN USER
022C-90 DA I 45 (2**) BCC NXKEY ; RETURN TO INPUT MODE
022E-4A I 46 ( 2) OK LSR A ; SHIFT LOW BIT INTO NIBBLE POINTER
022F-A8 I 47 ( 2) TAY ; USE SHIFTED NIBBLE POINTER AS BYTE INDEX
0230-A5 01 I 48 ( 3) LDA TEMP ; RESTORE KEY#
0232-B0 09 I 49 (2**) BCS FINBYT ; IF BYTE ALREADY HAS A NIBBLE, FINISH IT AND STORE
0234-29 0F I 50 ( 2) AND #%00001111 ; 1ST NIBBLE. MASK HIGH NIBBLE
0236-99 00 03 I 51 ( 5) STA TABEG,Y ; SAVE UNFINISHED 1/2 BYTE
0239-E6 00 I 52 ( 5) INC PILEN ; POINT TO NEXT NIBBLE
023B-90 CB I 53 (2**) BCC NXKEY ; GET NEXT KEYSTROKE
023D-0A I 54 ( 2) FINBYT ASL A ; SHIFT NIBBLE 2 TO HIGH ORDER
023E-0A I 55 ( 2) ASL A
023F-0A I 56 ( 2) ASL A
0240-0A I 57 ( 2) ASL A
0241-19 00 03 I 58 ( 4*) ORA TABEG,Y ; JOIN 2 NIBBLES AS BYTE
0244-99 00 03 I 59 ( 5) STA TABEG,Y ; ... AND STORE.
0247-E6 00 I 60 ( 5) INC PILEN ; POINT TO NEXT NIBBLE IN NEXT BYTE
0249-90 BD I 61 (2**) BCC NXKEY ; RETURN
024B- I 62 ;
024B- I 63 ; ROUTINE TO PLAY NOTES
024B- I 64 ;
024B-A2 00 I 65 ( 2) PLAYEM LDX #0 ; CLEAR POINTER
024D-86 02 I 66 ( 3) STX PTR
024F-A5 02 I 67 ( 3) LDA PTR ; LOAD ACCUMULATOR WITH CURRENT POINTER VALUE
0251-4A I 68 ( 2) LOOP LSR A ; SHIFT NIBBLE INDICATOR INTO CARRY
0252-AA I 69 ( 2) TAX ; USE SHIFTED NIBBLE POINTER AS BYTE POINTER
0253-BD 00 03 I 70 ( 4*) LDA TABEG,X ; LOAD NOTE TO PLAY
0256-B0 04 I 71 (2**) BCS ENDBYT ; LOW NIBBLE USED, GET HIGH
0258-29 0F I 72 ( 2) AND #%00001111 ; MASK OUT HIGH BITS
025A-90 06 I 73 (2**) BCC FINISH ; PLAY NOTE
025C-29 F0 I 74 ( 2) ENDBYT AND #%11110000 ; THROW AWAY LOW NIBBLE
025E-4A I 75 ( 2) LSR A ; SHIFT INTO LOW
025F-4A I 76 ( 2) LSR A
0260-4A I 77 ( 2) LSR A
0261-4A I 78 ( 2) LSR A
0262-20 73 02 I 79 ( 6) FINISH JSR PLAYIT ; CALCULATE CONSTANTS & PLAY
0265-A2 20 I 80 ( 2) LDX #$20 ; BETWEEN-NOTE DELAY
0267-20 9F 02 I 81 ( 6) JSR DELAY
026A-E6 02 I 82 ( 5) INC PTR ; ONE NIBBLE USED
026C-A5 02 I 83 ( 3) LDA PTR
026E-C5 00 I 84 ( 3) CMP PILEN ; END OF LIST?
0270-90 DF I 85 (2**) BCC LOOP ; NO, GET NEXT NOTE
0272-60 I 86 ( 6) RTS ; DONE
0273- I 87 ;
0273- I 88 ; ROUTINE TO DO TABLE LOOK UP, SEPARATE REST
0273- I 89 ;
0273-C9 0D I 90 ( 2) PLAYIT CMP #13 ; REST?
0275-D0 06 I 91 (2**) BNE SOUND ; NO.
0277-A2 54 I 92 ( 2) LDX #$54 ; DELAY = NOTE LENGTH = .21SEC
0279-20 9F 02 I 93 ( 6) JSR DELAY
027C-60 I 94 ( 6) RTS
027D-AA I 95 ( 2) SOUND TAX ; USE KEYS AS INDEX..
027E-BD D4 02 I 96 ( 4*) LDA DURTAB,X ; ... TO FIND DURATION.
0281-85 04 I 97 ( 2) STA DUR ; STORE DURATION FOR USE
0283-BD C7 02 I 98 ( 4*) LDA NOTAB,X ; LOAD NOTE VALUE
0286-20 AB 02 I 99 ( 6) JSR TONE
0289-60 I 100 ( 6) RTS
028A- I 101 ;
028A- I 102 ; ROUTINE TO MAKE 3 TONE SIGNAL
028A- I 103 ;
028A-A9 FF I 104 ( 2) BEEP3 LDA #$FF ; DURATION FOR BEEPS
028C-85 04 I 105 ( 2) STA DUR
028E-A9 4B I 106 ( 2) LDA #$4B ; CODE FOR E2
0290-20 AB 02 I 107 ( 6) JSR TONE ; 1ST NOTE
0293-A9 38 I 108 ( 2) LDA #$38 ; CODE FOR D2
0295-20 AB 02 I 109 ( 6) JSR TONE
0298-A9 4B I 110 ( 2) LDA #$4B
029A-20 AB 02 I 111 ( 6) JSR TONE
029D-18 I 112 ( 2) CLC
029E-60 I 113 ( 6) RTS
029F- I 114 ;
029F- I 115 ; VARIABLE-LENGTH DELAY
029F- I 116 ;
029F-A0 FF I 117 ( 2) DELAY LDY #$FF
02A1-EA I 118 ( 2) DLY NOP
02A2-D0 00 I 119 (2**) BNE DL0 ; (.+2 IN BOOK)
02A4-88 I 120 ( 2) DL0 DEY
02A5-D0 FA I 121 (2**) BNE DLY ; 10 US. LOOP
02A7-CA I 122 ( 2) DEX
02A8-D0 F5 I 123 (2**) BNE DELAY ; LOOP TIME = 2556*[X]
02AA-60 I 124 ( 6) RTS
02AB- I 125 ;
02AB- I 126 ; ROUTINE TO MAKE TONE: # OF 1/2 CYCLES IS IN 'DUR', AND 1/2 CYCLE TIME IS IN
02AB- I 127 ; ACCUMULATOR. LOOP TIME = 20*[A]+26 US SINCE TWO RUNS THROUGH THE OUTER LOOP
02AB- I 128 ; MAKES ONE CYCLE OF THE TONE.
02AB- I 129 ;
02AB-85 03 I 130 ( 2) TONE STA FREQ ; FREQ IS TEMP FOR # OF CYCLES
02AD-A9 FF I 131 ( 2) LDA #$FF ; SET UP DATA DIRECTION REGISTER
02AF-8D 02 CC I 132 ( 4) STA DDR3B
02B2-A9 00 I 133 ( 2) LDA #$00 ; A IS SENT TO PORT, START HI
02B4-A6 04 I 134 ( 3) LDX DUR
02B6-A4 03 I 135 ( 3) FL2 LDY FREQ
02B8-88 I 136 ( 2) FL1 DEY
02B9-18 I 137 ( 2) CLC
02BA-90 00 I 138 (2**) BCC FL0 ; (.+2 IN BOOK)
02BC-D0 FA I 139 (2**) FL0 BNE FL1 ; INNER, 10 US LOOP.
02BE-49 FF I 140 ( 2) EOR #$FF ; COMPLEMENT I/O PORT
02C0-8D 00 CC I 141 ( 4) STA PORT3B ; ... AND SET IT
02C3-CA I 142 ( 2) DEX
02C4-D0 F0 I 143 (2**) BNE FL2 ; OUTER LOOP
02C6-60 I 144 ( 6) RTS
02C7- I 145 ;
02C7- I 146 ; TABLE OF NOTE CONSTANTS
02C7- I 147 ; CONTAINS:
02C7- I 148 ; [OCTAVE BELOW MIDDLE C] : G,A,BCC
02C7- I 149 ; [OCTAVE OF MIDDLE C] : C,D,E,F,F#,G,G#,A,B
02C7- I 150 ; [OCTAVE ABOVE MIDDLE C] : C
02C7- I 151 ;
02C7-FE E2 C9 BE
A9 96 8E 86
7E 77 70 64
5E I 152 NOTAB .HS FE.E2.C9.BE.A9.96.8E.86.7E.77.70.64.5E
02D1- I 153 ;
02D1- I 154 ; TABLE OF NOTE DURATIONS IN # OF 1/2 CYCLES SET FOR A NOTE LENGTH OF
02D1- I 155 ; ABOUT .21 SEC.
02D1- I 156 ;
02D1-55 60 6B 72
02D4- I 153 ;
02D4- I 154 ; TABLE OF NOTE DURATIONS IN # OF 1/2 CYCLES SET FOR A NOTE LENGTH OF
02D4- I 155 ; ABOUT .21 SEC.
02D4- I 156 ;
02D4-55 60 6B 72
80 8F 94 A1
AA B5 BF D7
E4 I 157 DURTAB .HS 55.60.6B.72.80.8F.94.A1.AA.B5.BF.D7.E4
02DE- 16 .IN ../CH01-Getkey/getkey_routine.asm
02DE- I 1 ; 'GETKEY' KEYBOARD INPUT ROUTINE READS AND DEBOUNCES KEYBOARD. RETURNS WITH
02DE- I 2 ; KEY NUMBER IN ACCUMULATOR IF KEY DOWN. OPERATION: SENDS NUMBERS 0-F TO 74154
02DE- I 3 ; (4 TO 16 LINE DECODER), WHICH GROUNDS ONE SIDE OF KEYSWITCHES ONE AT A TIME.
02DE- I 4 ; IF A KEY IS DOWN, PA7 OF VIA #3 WILL BE GROUNDED, AND THE CURRENT VALUE
02DE- I 5 ; APPLIED TO THE 74154 BE THE KEY NUMBER. WHEN THE PROGRAM DETECTS A KEY CLOSE
02DE- I 6 ; CHECKS FOR KEY CLOSURE FOR 50 MS. TO ELIMINATE BOUNCE.
02DE- I 7 ; NOTE: IF NO KEY IS PRESSED, GETKEY WILL WAIT.
02DE- I 8 ;
CC03- I 9 DDR3A .EQ VIA3+3 ; USING RC-ONE ADDRESS DECODING SCHEME, PLACING
CC02- I 10 DDR3B .EQ VIA3+2 ; VIA3 AT $CC00 BY DEFAULT (INSTEAD OF $AC00)
CC01- I 11 PORT3A .EQ VIA3+1 ; TO FIT RC-ONE ADDRESS DECODING THOUGH ORIGINAL
CC00- I 12 PORT3B .EQ VIA3 ; CAN BE JUMPERED IF NEEDED/WANTED.
02DE- I 13
02DE-A9 00 I 14 ( 2) LDA #0
02E0-8D 03 CC I 15 ( 4) STA DDR3A ; SET KEY STROBE PORT FOR INPUT
02E3-A9 FF I 16 ( 2) LDA #$FF
02E5-8D 02 CC I 17 ( 4) STA DDR3B ; SET KEYS FOR OUTPUT
02E8-2C 01 CC I 18 ( 4) GETKEY BIT PORT3A ; SEE IF KEY IS STILL DOWN FROM LAST KEY CLOSURE:
02EB- I 19 ; KEYSTROBE IN 'N' STATUS BIT.
02EB-10 FB I 20 (2**) BPL GETKEY ; IF YES, WAIT FOR KEY RELEASE
02ED-A2 0F I 21 ( 2) RSTART LDX #15 ; SET KEY COUNTER TO 15
02EF-8E 00 CC I 22 ( 4) NXTKEY STX PORT3B ; OUTPUT KEY # TO 74154
02F2-2C 01 CC I 23 ( 4) BIT PORT3A ; SEE IF KEY DOWN: STROBE IN 'N'
02F5-10 05 I 24 (2**) BPL BOUNCE ; IF YES, GO DEBOUNCE
02F7-CA I 25 ( 2) DEX ; DECREMENT KEY #
02F8-10 F5 I 26 (2**) BPL NXTKEY ; NO, DO NEXT KEY
02FA-30 F1 I 27 (2**) BMI RSTART ; START OVER
02FC-8A I 28 ( 2) BOUNCE TXA ; SAVE KEY NUMBER IN A
02FD-A0 12 I 29 ( 2) LDY #$12 ; OUTER LOOP CNT LOAD FOR DELAY OF 50 MS.
02FF-A2 FF I 30 ( 2) LP1 LDX #$FF ; INNER 11 US. LOOP
0301-2C 01 CC I 31 ( 4) LP2 BIT PORT3A ; SEE IF KEY STILL DOWN
0304-30 E7 I 32 (2**) BMI RSTART ; IF NOT, KEY NOT VALID, RESTART
0306-CA I 33 ( 2) DEX
0307-D0 F8 I 34 (2**) BNE LP2 ; THIS LOOP USES 2115*5 US.
0309-88 I 35 ( 2) DEY
030A-D0 F3 I 36 (2**) BNE LP1 ; OUTER LOOP: TOTAL IS 50 MS.
030C-60 I 37 ( 6) RTS ; DONE: KEY IN A.
02E1- 21 .IN ../CH01-Getkey/getkey_routine.asm
02E1- I 1 ; 'GETKEY' KEYBOARD INPUT ROUTINE READS AND DEBOUNCES KEYBOARD. RETURNS WITH
02E1- I 2 ; KEY NUMBER IN ACCUMULATOR IF KEY DOWN. OPERATION: SENDS NUMBERS 0-F TO 74154
02E1- I 3 ; (4 TO 16 LINE DECODER), WHICH GROUNDS ONE SIDE OF KEYSWITCHES ONE AT A TIME.
02E1- I 4 ; IF A KEY IS DOWN, PA7 OF VIA #3 WILL BE GROUNDED, AND THE CURRENT VALUE
02E1- I 5 ; APPLIED TO THE 74154 BE THE KEY NUMBER. WHEN THE PROGRAM DETECTS A KEY CLOSE
02E1- I 6 ; CHECKS FOR KEY CLOSURE FOR 50 MS. TO ELIMINATE BOUNCE.
02E1- I 7 ; NOTE: IF NO KEY IS PRESSED, GETKEY WILL WAIT.
02E1- I 8 ;
02E1-2C 01 CC I 9 ( 4) GETKEY BIT PORT3A ; SEE IF KEY IS STILL DOWN FROM LAST KEY CLOSURE:
02E4- I 10 ; KEYSTROBE IN 'N' STATUS BIT.
02E4-10 FB I 11 (2**) BPL GETKEY ; IF YES, WAIT FOR KEY RELEASE
02E6-A2 0F I 12 ( 2) RSTART LDX #15 ; SET KEY COUNTER TO 15
02E8-8E 00 CC I 13 ( 4) NXTKEY STX PORT3B ; OUTPUT KEY # TO 74154
02EB-2C 01 CC I 14 ( 4) BIT PORT3A ; SEE IF KEY DOWN: STROBE IN 'N'
02EE-10 05 I 15 (2**) BPL BOUNCE ; IF YES, GO DEBOUNCE
02F0-CA I 16 ( 2) DEX ; DECREMENT KEY #
02F1-10 F5 I 17 (2**) BPL NXTKEY ; NO, DO NEXT KEY
02F3-30 F1 I 18 (2**) BMI RSTART ; START OVER
02F5-8A I 19 ( 2) BOUNCE TXA ; SAVE KEY NUMBER IN A
02F6-A0 12 I 20 ( 2) LDY #$12 ; OUTER LOOP CNT LOAD FOR DELAY OF 50 MS.
02F8-A2 FF I 21 ( 2) LP1 LDX #$FF ; INNER 11 US. LOOP
02FA-2C 01 CC I 22 ( 4) LP2 BIT PORT3A ; SEE IF KEY STILL DOWN
02FD-30 E7 I 23 (2**) BMI RSTART ; IF NOT, KEY NOT VALID, RESTART
02FF-CA I 24 ( 2) DEX
0300-D0 F8 I 25 (2**) BNE LP2 ; THIS LOOP USES 2115*5 US.
0302-88 I 26 ( 2) DEY
0303-D0 F3 I 27 (2**) BNE LP1 ; OUTER LOOP: TOTAL IS 50 MS.
0305-60 I 28 ( 6) RTS ; DONE: KEY IN A.
0306- I 29 ;
0306- I 30 ; SUBROUTINE 'INITKEY'
0306- I 31 ; TAKES CARE OF INITIALIZING VIA #3 FOR USING WITH THE GETKEY ROUTINE FROM
0306- I 32 ; THE CODE.
0306-A9 00 I 33 ( 2) INITKEY LDA #0
0308-8D 03 CC I 34 ( 4) STA DDR3A ; SET KEY STROBE PORT FOR INPUT
030B-A9 FF I 35 ( 2) LDA #$FF
030D-8D 02 CC I 36 ( 4) STA DDR3B ; SET KEYS FOR OUTPUT
0310-60 I 37 ( 6) RTS

View File

@ -2,7 +2,7 @@
; USES 16-KEY KEYBOARD AND BUFFERED SPEAKER
; PROGRAM PLAYS STORED MUSICAL NOTES. THERE ARE TWO MODES OF OPERATION: INPUT
; AND PLAY. INPUT MODE IS THE DEFAULT, AND ALL NON-COMMAND KEYS PRESSED PRESSED
; (0-D) ARE STORED FOR REPLAY. IF AN OVERFLOW OCCURS, THE USER IS WARMED WITH
; (0-D) ARE STORED FOR REPLAY. IF AN OVERFLOW OCCURS, THE USER IS WARNED WITH
; A THREE-TONE WARNING. THE SAME WARBLING TONE IS ALSO USED TO SIGNAL A RESTART
; OF THE PROGRAM.
;

View File

@ -134,6 +134,7 @@ FINISH RTS ; DONE: TIME RAN OUT OR KEY PRESSED.
;
; SUBROUTINE 'BLINK'
; BLINKS LEDS WHOSE BITS ARE SET IN ACCUMULATOR ON ENTRY.
;
BLINK LDX #20 ; 20 BLINKS.
STX CNTHI ; SET BLINK COUNTER.
STA CNTLO ; BLINK REGISTER