On Wednesday, September 12, 2012 10:46:14 PM UTC-7, (unknown) wrote:
> On Tuesday, September 11, 2012 1:11:29 PM UTC-7, (unknown) wrote:
>
> > :-) I know, just a start to get it to assemble without errors.
ORG $8500
;ADDRESSES FOR First 6522
ORB EQU $C400 ;PORT B
ORA EQU $C401 ;PORT A
DDRB EQU $C402 ;DATA DIRECTION REGISTER (A)
DDRA EQU $C403 ;DATA DIRECTION REGISTER (B)
;ADDRESSES FOR SECOND 6522
ORA2 EQU $C481 ;PORT A
ORB2 EQU $C480 ;PORT B
DDRA2 EQU $C483 ;DATA DIRECTION REGISTER (A)
DDRB2 EQU $C482 ;DATA DIRECTION REGISTER (B)
IFR EQU $C40D ;interrupt flag
*page 3 equates
TBL300N1 equ $300
TBL300N2 equ $308
TBL300N3 equ $310
TBL300N4 equ $318
*PAGE 0 EQUATES
PTR1LO equ $06
PTR1HI equ $07
TBL300PTRLO EQU $D6
TBL300PTRHI EQU $D7
;only the first 2 jmps are used. The rest are probably for testing purposes?
JMP INTROUTINE ;interrupt routine
JMP SETUP ;install, setup interrupt routine
JMP Music2Card
JMP RESETSTUFF
JMP $87E0
JMP $87F3
Tempo1 DFB #$04 ;tempo
Tempo2 DFB #$03 ;these two are poked in
L8514
MUSLO DFB #$FE ;start of music address - 2
MUSHI DFB #$3F ;
L8516 DFB #$7E ;USED BY SETUP ONLY
L8517 DFB #$44
L8518 DFB #$0A
L8519 DFB #$00 ; startx for Table1Code
L851A DFB #$06 ; endx+1 for Table1Code
;index into table1
DFB #$08
Counter1 DFB #$00 ;counter of some sort
Counter2 DFB #$00 ;these get incremented in interrupt routine
;AND COMPARED TO TEMPO1/2, DETERMINE WETHER OR NOT
;TO PLAY A NOTE?
DFB #$00
tEMPMUSIC1 DFB #$00 ;MUSIC DATA FROM $4000 TEMPORARILY STORED HERE ADDR = 851F
tEMPMUSIC2 DFB #$00 ;
TempX DFB #$00 ;Table1Code addr=8521
TEMPX2 DFB #$00 ;THIS IS TEMPX * 2
TEMPX3 DFB #$00 ; ADDR= 8523
TABLE22
L8524 DFB #$01
DFB #$01
TABLE1 ;table of 6 bytes, indexed by start=L8519,end=l851a
DFB #$FF ;#0
DFB #$FF ;#1
DFB #$FF ;#2
DFB #$FF ;#3
DFB #$FF ;#4
DFB #$FF ;#5
L852C DFB #$00 ;Table1Code access
L852D DFB #$00 ;TEMP STORAGE FOR DATA GOT FROM TABLE64
L852E DFB #$00 ;TEMP STORAGE FOR DATA GOT FROM TABLE64
L852F DFB #$00
DFB #$00
;64 bytes
;THESE MAY BE TABLES CORRESPONDING TO FREQUENCIES TO PLAY ???
TABLE641
DFB #$1E ;ADDR=8531
DFB #$1F
DFB #$20
DFB #$22
DFB #$24
DFB #$26
DFB #$29
DFB #$2C
DFB #$2E
DFB #$30
DFB #$33
DFB #$36
DFB #$3A
DFB #$3D
DFB #$41
DFB #$45 ;ADDR = 8540
DFB #$49
DFB #$4D
DFB #$52
DFB #$56
DFB #$5C
DFB #$61
DFB #$67
DFB #$6D
DFB #$73
DFB #$7A
DFB #$81
DFB #$89
DFB #$91
DFB #$9A
DFB #$A3
DFB #$AD ;ADDR =8550
DFB #$B7
DFB #$C2
DFB #$CE
DFB #$DA
DFB #$E7
DFB #$F4
DFB #$03
DFB #$12
DFB #$23
DFB #$34
DFB #$46
DFB #$5A
DFB #$6E
DFB #$84
DFB #$9B
DFB #$B3 ;ADDR=8560
DFB #$CD
DFB #$E9
DFB #$06
DFB #$25
DFB #$45
DFB #$68
DFB #$8C
DFB #$B3
DFB #$DC
DFB #$08
DFB #$36
DFB #$67
DFB #$9B
DFB #$D2
DFB #$01
DFB #$01 ;ADDR=8570
;another 64 bytes
TABLE641
DFB #$00 ;ADDR =8571
DFB #$01 ;40TH
DFB #$01
DFB #$01
DFB #$01
DFB #$01
DFB #$01
DFB #$01
DFB #$01
DFB #$01
DFB #$01
DFB #$01 ;50TH
DFB #$02
DFB #$02
DFB #$02
DFB #$02
DFB #$02
DFB #$02
DFB #$02
DFB #$03
DFB #$03
DFB #$03
DFB #$03
DFB #$03
DFB #$00
DFB #$00
**************************
*
* interrupt routine
*
*************************
INTROUTINE
;DOESN'T DO ANYTHING UNTIL
;COUNTER2 = TEMPO2 (JSR COUNTER2LIMIT)
;OR COUNTER1 = TEMPO1
;interrupt vector points to this routine
TXA ;save x and y regs on stack
PHA ;
TYA ;
PHA ;
LDA #$C0 ;disable mockingboard interrupts
STA IFR
INC Counter2 ;Tempo
INC Counter1
CHECKCOUNTER2
LDA Counter2
CMP Tempo2 ;compare to value poked in,
BNE cHKcOUNTER1
COUNTER2LIMIT
JSR COUNTER2LIMIT ;Counter2 reached limit
LDA #$00 ;reset counter2
STA Counter2
cHKcOUNTER1
LDA Counter1 ;compare to counter inc'd above
CMP Tempo1 ;compare to value poked in
BEQ cOUNTER1LIMIT
JMP RTNFRMINT ;done processing , return from interrupt
* counter1 reached limit
COUNTER1LIMIT
S6L2 LDA #$00
STA Counter1 ;reset counter1
LDX #$00 ;X GOES FROM 0 TO 1 AND THEN IS RESET TO 0
Xloop1 STX TempX
TXA
ASL ;multiply by 2
STA TEMPX2 ;first run through, this = 0
DEC TABLE22,X
LDA TABLE22,X ;=1 first run
BNE $8661
JSR Table1Code
LDX TEMPX2
LDA PTR1LO,X
CLC
ADC #$02
STA PTR1LO,X
BCC NOINCREMENT
INC PTR1HI,X
NOINCREMENT LDA (PTR1LO,X) ;get a byte from the music file at $4000
LSR ;divide by 2
STA tEMPMUSIC1
INC PTR1LO,X
LDA (PTR1LO,X) ; get a byte from the music file at $4000
DEC PTR1LO,X
STA tEMPMUSIC2
ORA tEMPMUSIC1
BNE NOTZERO
JSR RESETSTUFF
JMP RTN_INT_2 ;done processing sound? JSR's Music2Card before RTI
NOTZERO
LDX TempX
JSR SUB8
LDA TempX
STA TABLE1,X
STX TEMPX3
LDX tEMPMUSIC1
LDA TABLE641,X
STA L852D ;TEMP STORAGE FOR TABLE64 DATA
LDA TABLE642,X
STA L852E ;TEMP STORAGE FOR TABLE64 DATA
LDA L8518
STA L852C
LDX TEMPX3
JSR MoVdatTo300TBL
LDX TempX
LDA tEMPMUSIC2
AND #$40
STA L852F,X
LDA tEMPMUSIC2
AND #$3F
STA TABLE22,X
LDA tEMPMUSIC2
AND #$80
BNE $85F5
S6L466
LDX TempX
INX
CPX #$02
BEQ RTN_INT_2
JMP Xloop1
RTN_INT_2
JSR Music2Card
***************************
*
* return from interrupt
*
***************************
RTNFRMINT
PLA ;restore registers
TAY ;
PLA ;
TAX ;
LDA ; $45
RTI
******************************
*
* sub 8
*
*******************************
SUB8 CPX #$00 ;if x=0 and table1,(8519) = 0 to 127 then ??
BNE SUB8L1
LDX L8519
LDA TABLE1,X
BMI DoneSub8
INX
CPX L851A
BNE $867D ;SUB8L3
DEX
RTS
SUB8L1
LDX L851A
DEX
LDA TABLE1,X
BMI DoneSub8
DEX
CPX L8519
BNE $868E ;SUB8L5
DoneSub8 RTS
*********************
*
* MoVdatTo300TBL
*
*********************
;if x < 3 then x=x-3, deal with second register table (310)
;if X => 3 then deal with first register table ($300)
MoVdatTo300TBL
TXA ;save x and y registers
PHA ;
TYA ;
PHA ;
LDA #$00
CPX #$03 ;x= table1Code value (start = L8519
; end = L851a)
BCC S4L1 ;BRANCH IF >= 3,
;Set TBL300PTR to POINT TO 300
;FIRST AY8910 REGISTER table
DEX
DEX
DEX
LDA #$10 ;SET TBL300PTR TO point to 310,
;SECOND AY8190 REGISTER table
;X >= 3
S4L1 STA TBL300PTRLO ;a=0 or $10, see above
TXA ;x= table1Code value (start = L8519
; end = L851a)
ASL ;multiply by 2
TAY ;transfer to Y
LDA L852D ;THIS IS DATA FROM TABLE64 (music data)
STA (TBL300PTRLO),Y ;put music data in AY8910 register table
INY ;point to next byte in register table
LDA l852E ;THIS IS DATA FROM TABLE64
STA (TBL300PTRLO),Y ;put music data in AU8910 register table
TXA ;x= table1Code value (start = L8519
; end = L851a)
CLC
ADC #$08
TAY ;Y = X+8
LDA L852C
STA (TBL300PTRLO),Y;put music data in AU8910 register table
PLA ;restore x and y registers
TAY ;
PLA ;
TAX ;
RTS
**************************
*
* Music2Card
*
**************************
Music2Card ;sends 30 bytes to card,
;15 to 300 to 30E
;15 to 310 to 31e
TYA ;save y register
PHA
LDA #$FF ; init channel A
STA DDRA
STA DDRA2
LDA #$07 ;command = write data, so comfirm init
STA DDRB
STA DDRB2
LDY #$00 ;command = reset
STY ORA
LDA #$07
STA ORB
LDA #$04
STA ORB
LDA tbl300N1,Y
STA ORA
LDA #$06
STA ORB
LDA #$04
STA ORB
STY ORA2
LDA #$07
STA ORB2
LDA #$04
STA ORB2
LDA TBL300N3,Y
STA ORA2
LDA #$06
STA ORB2
LDA #$04
STA ORB2
INY
CPY #$0F ;send 15 bytes to ora,ora2 from 300
BNE $86DC ;L86DC
PLA ;restore y register
TAY
RTS
*************************
*
* Table1Code
*
*************************
;first run, does nothing
;for x=0 :8519 to l851a-1 (0 to 5)
;if Table1,x=tempx then table1,x = FF, jsr MoVdatTo300TBL
Table1Code
LDX L8519 ;=0
Table1LOOP LDA TABLE1,X
CMP TempX ;init to 1 in sub2
BNE TmpXnotTbl1
LDA #$FF
STA TABLE1,X ;Store FF in table if Table,x = TempX
LDA #$00
STA L852C
JSR MoVdatTo300TBL
TmpXnotTbl1 INX
CPX L851A ;(=$06 in obj file)
BNE Table1Loop
RTS
**************************
*
* RESETSTUFF
*
**************************
RESETSTUFF
;setup vectors, variables and jsr Table1code
LDA MUSLO ;fe ;setup pointer start of music in 06-07
STA PTR1LO ; 3ffe = start of music - 2
LDA MUSHI ;
STA PTR1HI ;
LDA L8516 ;7e
STA $08 ;
LDA L8517 ;44
STA $09 ;
;setUP interrupt vector TO
LDA #$00 ;3fe/ff = $8500, start of this routine
STA $03FE ;
LDA #$85 ;
STA $03FF ;
;setup AY8910 register table
LDA #$00 ;d6/d7 = 0300
STA TBL300PTRLO ;this is POINTER TO table of data moved by sub1
LDA #$03
STA TBL300PTRHI
LDA #$01 ;init stuff
STA TABLE22
STA TABLE22+1
LDA #$00 ;init for Table1Code
STA TempX
JSR Table1Code
LDA #$01 ;Tempx=#$01
STA TempX
JSR Table1Code
RTS
***********************
*
* Setup
*
***********************
SETUP
JSR MOVE300TBL ;move 32 bytes to 0300
JSR RESETSTUFF ;setup vectors, variables and jsr Table1code
LDA #$F8 ;init 307 and 317 to F8
STA $0307
STA $0317
LDA #$40 ;mb inits
STA $C40B ;aux control register
LDA #$7F
STA $C40E ;interrupt enable
LDA #$C0
STA IFR ;interrupt flag
STA $C40E ;interrupt enable
LDA #$FF
STA $C404 ;t1 low order
LDA #$40
STA $C405 ;t1 high order
CLI
RTS
***********************
*
* COUNTER2LIMIT
*
* counter 2 reached limit
*
***********************
COUNTER2LIMIT
LDX #$00
SUB7L0 LDA TABLE1,X
CMP #$02
BCS SUB7L1
TAY
LDA $852F,Y
BNE SUB7L1
LDA TBL300N2,X
CMP $851B
BEQ SUB7L1
DEC TBL300N2,X
SUB7L1
LDA $8529,X
CMP #$02
BCS $87DA ;SUB7L2
TAY
LDA $852F,Y
BNE $87DA ;SUB7L2
LDA TBL300N4,X
CMP $851B
BEQ $87DA ;SUB7L2
DEC TBL300N4,X
INX
CPX #$03
BNE SUB7L0
RTS
SEI
LDA #$00 ;run table1code with X set to 0 then 1
STA TempX
JSR Table1Code
INC TempX
JSR Table1Code
JSR Music2Card ; then send music to card
RTS
CLI
RTS
******************
*
* sub1
*
******************
MOVE300TBL
SUB1 LDX #$00 ;move 32 bytes from 8803 to 0300
LOOP1 LDA REGTABLE,X
STA $0300,X
INX
CPX #$20
BNE LOOP1
RTS
******************
*
* table 77
*
******************
REGTABLE
TABLE77
l300 DFB #$01 ;table of 8 bytes
DFB #$00 ;but actually table 16 bytes, registers on AY8190
DFB #$01
DFB #$00
DFB #$01
DFB #$00
DFB #$00
DFB #$3F
L308 DFB #$00 ;table of 8 bytes
DFB #$00
DFB #$00
DFB #$00
DFB #$00
DFB #$00
DFB #$00
DFB #$00 ;un-used? envelope control
;see music2card, Y counts from 0 to E(15)
L310 DFB #$01 ;table of 8 bytes
DFB #$00 ;but actually table 16 bytes, registers on AY8190
DFB #$01
DFB #$00
DFB #$01
DFB #$00
DFB #$00
DFB #$3F
L318 DFB #$00 ;table of 8 bytes
DFB #$00
DFB #$00
DFB #$00
DFB #$00
DFB #$00
DFB #$00
DFB #$00 ;un-used? envelope control
;see music2card, Y counts from 0 to E(15)