Groups | Search | Server Info | Keyboard shortcuts | Login | Register [http] [https] [nntp] [nntps]


Groups > comp.sys.apple2.programmer > #493

Re: mockingboard

Newsgroups comp.sys.apple2.programmer
Date 2012-09-13 09:16 -0700
References (3 earlier) <b78850aa-4d7f-474b-9111-fd7f2e2b4448@googlegroups.com> <e54563e8-61b8-48bf-b047-7d25b69590a0@googlegroups.com> <464d1c62-e863-4f3f-bcfb-eab9ce78e5a7@googlegroups.com> <9f08faf8-e636-43ed-a7dc-bc0d84b4c83f@googlegroups.com> <18c34350-229d-4b50-b3a5-0158506b0e7f@googlegroups.com>
Message-ID <1e7ce10a-3280-43db-8dd0-ac75743bab5a@googlegroups.com> (permalink)
Subject Re: mockingboard
From aiiadict@gmail.com

Show all headers | View raw


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 #$00
 DFB #$00
 DFB #$00
 DFB #$00
 DFB #$00
 DFB #$00
 DFB #$00
 DFB #$00
 DFB #$00
 DFB #$00
 DFB #$00
 DFB #$00
 DFB #$00
 DFB #$00
 DFB #$00
 DFB #$00
 DFB #$00
 DFB #$00
 DFB #$00
 DFB #$00
 DFB #$00
 DFB #$00
 DFB #$00
 DFB #$00
 DFB #$00
 DFB #$00
 DFB #$00
 DFB #$00
 DFB #$00
 DFB #$00
 DFB #$00
 DFB #$00
 DFB #$00
 DFB #$00
 DFB #$00
 DFB #$00
 DFB #$00
 DFB #$01
 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)


Back to comp.sys.apple2.programmer | Previous | NextPrevious in thread | Next in thread | Find similar


Thread

mockingboard aiiadict@gmail.com - 2012-09-09 12:44 -0700
  Re: mockingboard Michael J. Mahon <mjmahon@aol.com> - 2012-09-10 02:01 -0500
    Re: mockingboard aiiadict@gmail.com - 2012-09-10 08:42 -0700
      Re: mockingboard aiiadict@gmail.com - 2012-09-10 16:21 -0700
        Re: mockingboard aiiadict@gmail.com - 2012-09-11 08:10 -0700
          Re: mockingboard Antoine Vignau <antoine.vignau@laposte.net> - 2012-09-11 10:55 -0700
            Re: mockingboard aiiadict@gmail.com - 2012-09-11 13:11 -0700
              Re: mockingboard aiiadict@gmail.com - 2012-09-12 22:46 -0700
                Re: mockingboard aiiadict@gmail.com - 2012-09-13 09:16 -0700
                Re: mockingboard aiiadict@gmail.com - 2012-09-14 12:16 -0700
                Re: mockingboard aiiadict@gmail.com - 2012-09-15 19:18 -0700
                Re: mockingboard aiiadict@gmail.com - 2012-09-15 22:16 -0700
                Re: mockingboard aiiadict@gmail.com - 2012-09-16 10:20 -0700
                Re: mockingboard aiiadict@gmail.com - 2012-09-16 09:25 -0700
                Re: mockingboard aiiadict@gmail.com - 2012-09-16 09:34 -0700
    Re: mockingboard aiiadict@gmail.com - 2012-09-16 09:52 -0700
      Re: mockingboard Daniel Kruszyna <dan@krue.net> - 2012-09-16 17:04 +0000
        Re: mockingboard aiiadict@gmail.com - 2012-09-16 10:47 -0700
          Re: mockingboard aiiadict@gmail.com - 2012-09-16 11:56 -0700
          Re: mockingboard Daniel Kruszyna <dan@krue.net> - 2012-09-19 22:59 +0000
            Re: mockingboard aiiadict@gmail.com - 2012-09-19 17:46 -0700
              Re: mockingboard aiiadict@gmail.com - 2012-09-19 20:40 -0700
  Re: mockingboard aiiadict@gmail.com - 2012-09-20 09:32 -0700

csiph-web