mirror of
https://github.com/tomcw/Cybernoid.git
synced 2025-07-04 10:23:56 +00:00
Compare commits
20 Commits
Author | SHA1 | Date | |
---|---|---|---|
ffef8a91ef | |||
f3e394202f | |||
0c58998e02 | |||
6622164bac | |||
d84745262f | |||
25a3efc4ff | |||
0378adc3b1 | |||
ee44c17b8a | |||
94b58b49d5 | |||
57b5ea265a | |||
7218584326 | |||
d22d64473c | |||
3d223a3134 | |||
9ef98da9bf | |||
8e100ae88a | |||
581c02e7dd | |||
09d885c8e4 | |||
95255e1e4f | |||
bf40c52a25 | |||
4f462151d3 |
@ -18,7 +18,7 @@ nMaskB: !byte 0 ; Voice-B mask (0=enable)
|
|||||||
nMaskC: !byte 0 ; Voice-C mask (0=enable)
|
nMaskC: !byte 0 ; Voice-C mask (0=enable)
|
||||||
;
|
;
|
||||||
nAttA: !byte 0 ; Attenuation of Voice-A
|
nAttA: !byte 0 ; Attenuation of Voice-A
|
||||||
nAttB: !byte 1 ; Attenuation of Voice-B : B Volume / 2 (logarithmic, so: if (A) A--)
|
nAttB: !byte 1 ; Attenuation of Voice-B : B Volume / 2 (logarithmic, so: if (B) B--)
|
||||||
nAttC: !byte 0 ; Attenuation of Voice-C
|
nAttC: !byte 0 ; Attenuation of Voice-C
|
||||||
;
|
;
|
||||||
pAYRegValues: !word AYRegValues ; For VU-meter
|
pAYRegValues: !word AYRegValues ; For VU-meter
|
||||||
@ -43,7 +43,7 @@ SongNumOK:
|
|||||||
; . Saving ZPBlock
|
; . Saving ZPBlock
|
||||||
|
|
||||||
lda #1<<6
|
lda #1<<6
|
||||||
MB0: sta CARD_BASE+SY6522_IER ; Disable Timer1 IRQ
|
MB0: sta CARD_BASE+SY6522_IER+SY6522_A_PH_BASE ; Disable Timer1 IRQ
|
||||||
|
|
||||||
FindMB:
|
FindMB:
|
||||||
|
|
||||||
@ -89,22 +89,38 @@ GotMBSlot:
|
|||||||
|
|
||||||
;
|
;
|
||||||
|
|
||||||
|
!if USE_PHASOR { ; Phasor 2MHz mode
|
||||||
|
lda MBBaseH
|
||||||
|
asl
|
||||||
|
asl
|
||||||
|
asl
|
||||||
|
asl ; slot * 16
|
||||||
|
clc
|
||||||
|
adc #PH_PHASOR
|
||||||
|
tax
|
||||||
|
lda $c080,x
|
||||||
|
}
|
||||||
|
|
||||||
|
!if USE_PHASOR {
|
||||||
|
lda #$1f ; Phasor has 2 extra chip-select bits (b4:3)
|
||||||
|
}else{
|
||||||
lda #$07
|
lda #$07
|
||||||
ldy #SY6522_DDRB
|
}
|
||||||
|
ldy #SY6522_DDRB+SY6522_A_PH_BASE
|
||||||
sta (MBBase),y
|
sta (MBBase),y
|
||||||
ldy #SY6522_DDRB+$80
|
ldy #SY6522_DDRB+SY6522_B_BASE
|
||||||
sta (MBBase),y
|
sta (MBBase),y
|
||||||
|
|
||||||
lda #$ff
|
lda #$ff
|
||||||
ldy #SY6522_DDRA
|
ldy #SY6522_DDRA+SY6522_A_PH_BASE
|
||||||
sta (MBBase),y
|
sta (MBBase),y
|
||||||
ldy #SY6522_DDRA+$80
|
ldy #SY6522_DDRA+SY6522_B_BASE
|
||||||
sta (MBBase),y
|
sta (MBBase),y
|
||||||
|
|
||||||
lda #AY_RESET
|
lda #AY_RESET ; Phasor chip-select b4:3=%00 (so select both AY's)
|
||||||
ldy #SY6522_ORB
|
ldy #SY6522_ORB+SY6522_A_PH_BASE
|
||||||
sta (MBBase),y
|
sta (MBBase),y
|
||||||
ldy #SY6522_ORB+$80
|
ldy #SY6522_ORB+SY6522_B_BASE
|
||||||
sta (MBBase),y
|
sta (MBBase),y
|
||||||
|
|
||||||
ldx nSongNum
|
ldx nSongNum
|
||||||
@ -127,23 +143,23 @@ NotFini:
|
|||||||
sta nFrameNum+2
|
sta nFrameNum+2
|
||||||
|
|
||||||
; Setup Timer1 IRQ to trigger at 50Hz
|
; Setup Timer1 IRQ to trigger at 50Hz
|
||||||
; Apple CLK = 1.022727 MHz, so set Timer1=0x4fe7
|
; Apple NTSC CLK = 1.022727 MHz, so set Timer1=0x4fe7
|
||||||
|
|
||||||
sei
|
sei
|
||||||
|
|
||||||
lda #$e7
|
lda #$e7
|
||||||
ldy #SY6522_TIMER1L_COUNTER
|
ldy #SY6522_TIMER1L_COUNTER+SY6522_A_PH_BASE
|
||||||
sta (MBBase),y
|
sta (MBBase),y
|
||||||
lda #$4f
|
lda #$4f
|
||||||
ldy #SY6522_TIMER1H_COUNTER
|
ldy #SY6522_TIMER1H_COUNTER+SY6522_A_PH_BASE
|
||||||
sta (MBBase),y
|
sta (MBBase),y
|
||||||
|
|
||||||
lda #1<<6
|
lda #1<<6
|
||||||
ldy #SY6522_ACR
|
ldy #SY6522_ACR+SY6522_A_PH_BASE
|
||||||
sta (MBBase),y ; Free running timer
|
sta (MBBase),y ; Free running timer
|
||||||
|
|
||||||
lda #1<<7 | 1<<6
|
lda #1<<7 | 1<<6
|
||||||
ldy #SY6522_IER
|
ldy #SY6522_IER+SY6522_A_PH_BASE
|
||||||
sta (MBBase),y ; Enable Timer1 IRQ
|
sta (MBBase),y ; Enable Timer1 IRQ
|
||||||
|
|
||||||
lda #<Interrupt ; ADDR_L
|
lda #<Interrupt ; ADDR_L
|
||||||
@ -162,26 +178,31 @@ InitExit2:
|
|||||||
|
|
||||||
;--------------------------------------
|
;--------------------------------------
|
||||||
|
|
||||||
!macro SF_UpdateAY {
|
!if USE_PHASOR {
|
||||||
|
PHASOR_CS_MASK = AY_CS1 ; Phasor: b4=0 (select), b3=1 (not select)
|
||||||
|
} else {
|
||||||
|
PHASOR_CS_MASK = 0
|
||||||
|
}
|
||||||
|
|
||||||
; Skyfox's routine to update AY regs:
|
; Skyfox's routine to update AY regs:
|
||||||
|
!macro SF_UpdateAY {
|
||||||
|
|
||||||
SF_SelectReg:
|
SF_SelectReg:
|
||||||
MBx1: sta CARD_BASE+SY6522_ORA,x
|
MBx1: sta CARD_BASE+SY6522_ORA,x
|
||||||
lda #AY_LATCH
|
lda #AY_LATCH | PHASOR_CS_MASK
|
||||||
bne .l675e
|
bne .l675e
|
||||||
|
|
||||||
SF_WriteReg:
|
SF_WriteReg:
|
||||||
MBx2: sta CARD_BASE+SY6522_ORA,x
|
MBx2: sta CARD_BASE+SY6522_ORA,x
|
||||||
lda #AY_WRITE
|
lda #AY_WRITE | PHASOR_CS_MASK
|
||||||
bne .l675e
|
bne .l675e
|
||||||
|
|
||||||
SF_ChipReset:
|
SF_ChipReset:
|
||||||
lda #AY_RESET
|
lda #AY_RESET | PHASOR_CS_MASK
|
||||||
|
|
||||||
.l675e:
|
.l675e:
|
||||||
MBx3: sta CARD_BASE+SY6522_ORB,x
|
MBx3: sta CARD_BASE+SY6522_ORB,x
|
||||||
lda #AY_INACTIVE
|
lda #AY_INACTIVE | PHASOR_CS_MASK
|
||||||
MBx4: sta CARD_BASE+SY6522_ORB,x
|
MBx4: sta CARD_BASE+SY6522_ORB,x
|
||||||
rts
|
rts
|
||||||
}
|
}
|
||||||
@ -238,6 +259,9 @@ AYPostProc:
|
|||||||
;
|
;
|
||||||
; Attenuate AVOL
|
; Attenuate AVOL
|
||||||
|
|
||||||
|
; lda .ay_regs_base+AY_AVOL
|
||||||
|
; and #AY_AMPLITUDE_MODE
|
||||||
|
; bne + ; don't attenuate if amp.mode=envelope (Cybernoid doesn't use envelopes)
|
||||||
lda .ay_regs_base+AY_AVOL
|
lda .ay_regs_base+AY_AVOL
|
||||||
sec
|
sec
|
||||||
sbc nAttA
|
sbc nAttA
|
||||||
@ -245,10 +269,14 @@ AYPostProc:
|
|||||||
lda #0
|
lda #0
|
||||||
.ay_set_a_vol
|
.ay_set_a_vol
|
||||||
sta .ay0_regs+AY_AVOL
|
sta .ay0_regs+AY_AVOL
|
||||||
|
+
|
||||||
|
|
||||||
;
|
;
|
||||||
; Attenuate BVOL
|
; Attenuate BVOL
|
||||||
|
|
||||||
|
; lda .ay_regs_base+AY_BVOL
|
||||||
|
; and #AY_AMPLITUDE_MODE
|
||||||
|
; bne + ; don't attenuate if amp.mode=envelope (Cybernoid doesn't use envelopes)
|
||||||
lda .ay_regs_base+AY_BVOL
|
lda .ay_regs_base+AY_BVOL
|
||||||
sec
|
sec
|
||||||
sbc nAttB
|
sbc nAttB
|
||||||
@ -257,10 +285,14 @@ AYPostProc:
|
|||||||
.ay_set_b_vol
|
.ay_set_b_vol
|
||||||
sta .ay0_regs+AY_BVOL
|
sta .ay0_regs+AY_BVOL
|
||||||
sta .ay1_regs+AY_BVOL
|
sta .ay1_regs+AY_BVOL
|
||||||
|
+
|
||||||
|
|
||||||
;
|
;
|
||||||
; Attenuate CVOL
|
; Attenuate CVOL
|
||||||
|
|
||||||
|
; lda .ay_regs_base+AY_CVOL
|
||||||
|
; and #AY_AMPLITUDE_MODE
|
||||||
|
; bne + ; don't attenuate if amp.mode=envelope (Cybernoid doesn't use envelopes)
|
||||||
lda .ay_regs_base+AY_CVOL
|
lda .ay_regs_base+AY_CVOL
|
||||||
sec
|
sec
|
||||||
sbc nAttC
|
sbc nAttC
|
||||||
@ -268,6 +300,7 @@ AYPostProc:
|
|||||||
lda #0
|
lda #0
|
||||||
.ay_set_c_vol
|
.ay_set_c_vol
|
||||||
sta .ay1_regs+AY_CVOL
|
sta .ay1_regs+AY_CVOL
|
||||||
|
+
|
||||||
|
|
||||||
;
|
;
|
||||||
; User disable A/B/C
|
; User disable A/B/C
|
||||||
@ -311,7 +344,7 @@ AYPostProc:
|
|||||||
|
|
||||||
;
|
;
|
||||||
|
|
||||||
ldx #0
|
ldx #SY6522_A_PH_BASE ; Works for both MB & Phasor modes
|
||||||
ldy #$0D
|
ldy #$0D
|
||||||
.sf_loop0: tya
|
.sf_loop0: tya
|
||||||
jsr SF_SelectReg
|
jsr SF_SelectReg
|
||||||
@ -322,7 +355,7 @@ AYPostProc:
|
|||||||
|
|
||||||
;
|
;
|
||||||
|
|
||||||
ldx #$80
|
ldx #SY6522_B_BASE
|
||||||
ldy #$0D
|
ldy #$0D
|
||||||
.sf_loop1: tya
|
.sf_loop1: tya
|
||||||
jsr SF_SelectReg
|
jsr SF_SelectReg
|
||||||
@ -373,24 +406,24 @@ AYPostProc:
|
|||||||
|
|
||||||
.ay_loop:
|
.ay_loop:
|
||||||
; Select AY reg
|
; Select AY reg
|
||||||
MB1: sty CARD_BASE+SY6522_ORA
|
MB1: sty CARD_BASE+SY6522_ORA+SY6522_A_PH_BASE
|
||||||
MB1b: sty CARD_BASE+SY6522_ORA+$80
|
MB1b: sty CARD_BASE+SY6522_ORA+$80
|
||||||
lda #$07 ; LATCH
|
lda #$07 ; LATCH
|
||||||
MB2: sta CARD_BASE+SY6522_ORB
|
MB2: sta CARD_BASE+SY6522_ORB+SY6522_A_PH_BASE
|
||||||
MB2b: sta CARD_BASE+SY6522_ORB+$80
|
MB2b: sta CARD_BASE+SY6522_ORB+$80
|
||||||
lda #$04 ; INACTIVE
|
lda #$04 ; INACTIVE
|
||||||
MB3: sta CARD_BASE+SY6522_ORB
|
MB3: sta CARD_BASE+SY6522_ORB+SY6522_A_PH_BASE
|
||||||
MB3b: sta CARD_BASE+SY6522_ORB+$80
|
MB3b: sta CARD_BASE+SY6522_ORB+$80
|
||||||
|
|
||||||
; Write AY reg
|
; Write AY reg
|
||||||
lda (TmpL),y
|
lda (TmpL),y
|
||||||
MB4: sta CARD_BASE+SY6522_ORA
|
MB4: sta CARD_BASE+SY6522_ORA+SY6522_A_PH_BASE
|
||||||
MB4b: sta CARD_BASE+SY6522_ORA+$80
|
MB4b: sta CARD_BASE+SY6522_ORA+$80
|
||||||
lda #$06 ; WRITE
|
lda #$06 ; WRITE
|
||||||
MB5: sta CARD_BASE+SY6522_ORB
|
MB5: sta CARD_BASE+SY6522_ORB+SY6522_A_PH_BASE
|
||||||
MB5b: sta CARD_BASE+SY6522_ORB+$80
|
MB5b: sta CARD_BASE+SY6522_ORB+$80
|
||||||
lda #$04 ; INACTIVE
|
lda #$04 ; INACTIVE
|
||||||
MB6: sta CARD_BASE+SY6522_ORB
|
MB6: sta CARD_BASE+SY6522_ORB+SY6522_A_PH_BASE
|
||||||
MB6b: sta CARD_BASE+SY6522_ORB+$80
|
MB6b: sta CARD_BASE+SY6522_ORB+$80
|
||||||
|
|
||||||
dey
|
dey
|
||||||
@ -428,7 +461,7 @@ MB6b: sta CARD_BASE+SY6522_ORB+$80
|
|||||||
|
|
||||||
lda #1<<6
|
lda #1<<6
|
||||||
MB7:
|
MB7:
|
||||||
sta CARD_BASE+SY6522_IFR ; Clear Timer1 IRQ flag
|
sta CARD_BASE+SY6522_IFR+SY6522_A_PH_BASE ; Clear Timer1 IRQ flag
|
||||||
|
|
||||||
pla
|
pla
|
||||||
tay
|
tay
|
||||||
|
@ -2,44 +2,124 @@
|
|||||||
|
|
||||||
CARD_BASE = $C100
|
CARD_BASE = $C100
|
||||||
|
|
||||||
|
SY6522_A_BASE = $00
|
||||||
|
SY6522_A_PH_BASE = $10 ; Phasor mode (this is common to both MB & Phasor modes)
|
||||||
|
SY6522_B_BASE = $80
|
||||||
|
|
||||||
SY6522_ORB = 0
|
SY6522_ORB = 0
|
||||||
|
SY6522_IRB = 0
|
||||||
SY6522_ORA = 1
|
SY6522_ORA = 1
|
||||||
|
SY6522_IRA = 1
|
||||||
SY6522_DDRB = 2
|
SY6522_DDRB = 2
|
||||||
SY6522_DDRA = 3
|
SY6522_DDRA = 3
|
||||||
SY6522_TIMER1L_COUNTER = 4
|
SY6522_TIMER1L_COUNTER = 4
|
||||||
SY6522_TIMER1H_COUNTER = 5
|
SY6522_TIMER1H_COUNTER = 5
|
||||||
|
SY6522_TIMER1L_LATCH = 6
|
||||||
|
SY6522_TIMER1H_LATCH = 7
|
||||||
SY6522_TIMER2L_COUNTER = 8
|
SY6522_TIMER2L_COUNTER = 8
|
||||||
SY6522_TIMER2H_COUNTER = 9
|
SY6522_TIMER2H_COUNTER = 9
|
||||||
|
SY6522_SR = $A
|
||||||
SY6522_ACR = $B
|
SY6522_ACR = $B
|
||||||
|
SY6522_PCR = $C
|
||||||
SY6522_IFR = $D
|
SY6522_IFR = $D
|
||||||
SY6522_IER = $E
|
SY6522_IER = $E
|
||||||
|
|
||||||
AY_AFINE = 0
|
ACR_ONESHOT = 0<<6
|
||||||
AY_ACOARSE = 1
|
ACR_FREERUNNING = 1<<6
|
||||||
AY_BFINE = 2
|
|
||||||
AY_BCOARSE = 3
|
|
||||||
AY_CFINE = 4
|
|
||||||
AY_CCOARSE = 5
|
|
||||||
AY_NOISEPER = 6
|
|
||||||
AY_ENABLE = 7
|
|
||||||
AY_AVOL = 8
|
|
||||||
AY_BVOL = 9
|
|
||||||
AY_CVOL = 10
|
|
||||||
AY_EFINE = 11
|
|
||||||
AY_ECOARSE = 12
|
|
||||||
AY_ESHAPE = 13
|
|
||||||
|
|
||||||
AY_ENA_A = %110110 ; Enable A (Noise & Tone)
|
IER_SET = 1<<7
|
||||||
AY_ENA_B = %101101 ; Enable B (Noise & Tone)
|
IER_CLR = 0<<7
|
||||||
AY_ENA_C = %011011 ; Enable C (Noise & Tone)
|
IxR_TIMER1 = 1<<6
|
||||||
|
IxR_TIMER2 = 1<<5
|
||||||
|
IxR_VOTRAX = 1<<4 ; 6522 CB1
|
||||||
|
IxR_SSI263 = 1<<1 ; 6522 CA1/Peripheral
|
||||||
|
|
||||||
AY_DIS_A = %001001 ; Disable A (Noise & Tone)
|
AY_AFINE = 0 ; b7:0
|
||||||
AY_DIS_B = %010010 ; Disable B (Noise & Tone)
|
AY_ACOARSE = 1 ; b3:0
|
||||||
AY_DIS_C = %100100 ; Disable C (Noise & Tone)
|
AY_BFINE = 2 ; b7:0
|
||||||
|
AY_BCOARSE = 3 ; b3:0
|
||||||
|
AY_CFINE = 4 ; b7:0
|
||||||
|
AY_CCOARSE = 5 ; b3:0
|
||||||
|
AY_NOISEPER = 6 ; b4:0
|
||||||
|
AY_ENABLE = 7 ; b7:0 - for AY-3-8913, there is no PORTA/B so b7:6 are redundant
|
||||||
|
AY_AVOL = 8 ; b4:0
|
||||||
|
AY_BVOL = 9 ; b4:0
|
||||||
|
AY_CVOL = 10 ; b4:0
|
||||||
|
AY_EFINE = 11 ; b7:0
|
||||||
|
AY_ECOARSE = 12 ; b7:0
|
||||||
|
AY_ESHAPE = 13 ; b3:0
|
||||||
|
AY_PORTA = 14 ; b7:0 - not available on AY-3-8913
|
||||||
|
AY_PORTB = 15 ; b7:0 - not available on AY-3-8913
|
||||||
|
|
||||||
; AY inputs on BDIR|BC2|BC1:
|
AY_NOISE_MASK = $1f ; valid bits of AY_NOISEPER
|
||||||
AY_RESET = 0
|
AY_AMPLITUDE_MODE = $10 ; b4 of AY_xVOL (0=fixed, 1=envelope)
|
||||||
AY_INACTIVE = 4
|
|
||||||
AY_READ = 5
|
AY_ENA_A = %00110110 ; Enable A (Noise & Tone)
|
||||||
AY_WRITE = 6
|
AY_ENA_B = %00101101 ; Enable B (Noise & Tone)
|
||||||
AY_LATCH = 7
|
AY_ENA_C = %00011011 ; Enable C (Noise & Tone)
|
||||||
|
|
||||||
|
AY_DIS_A = %00001001 ; Disable A (Noise & Tone)
|
||||||
|
AY_DIS_B = %00010010 ; Disable B (Noise & Tone)
|
||||||
|
AY_DIS_C = %00100100 ; Disable C (Noise & Tone)
|
||||||
|
|
||||||
|
; 6522 ORB bit: 2 1 0
|
||||||
|
; AY inputs on: /RESET|BDIR|BC1: (BC2=1)
|
||||||
|
AY_RESET = 0 ; 0 - -
|
||||||
|
AY_INACTIVE = 4 ; 1 0 0
|
||||||
|
AY_READ = 5 ; 1 0 1
|
||||||
|
AY_WRITE = 6 ; 1 1 0
|
||||||
|
AY_LATCH = 7 ; 1 1 1
|
||||||
|
AY_FUNC_MASK = %00000111
|
||||||
|
; Phasor extra chip-select bits (when in native Phasor mode):
|
||||||
|
AY_NOT_CS1 = $10
|
||||||
|
AY_NOT_CS2 = $08
|
||||||
|
AY_CS1 = AY_NOT_CS2
|
||||||
|
AY_CS2 = AY_NOT_CS1
|
||||||
|
AY_NO_CS = AY_NOT_CS1|AY_NOT_CS2 ; each CS is active low
|
||||||
|
AY_BOTH_CS = $00
|
||||||
|
; Echo+ extra chip-select bits:
|
||||||
|
AY_ECHO_CS1 = $08
|
||||||
|
AY_ECHO_CS2 = $10
|
||||||
|
AY_ECHO_NO_CS = AY_ECHO_CS1|AY_ECHO_CS2 ; each CS is active low
|
||||||
|
AY_ECHO_BOTH_CS = $00
|
||||||
|
|
||||||
|
; SSI263:
|
||||||
|
SSI_DURPHON = 0
|
||||||
|
SSI_INFLECT = 1
|
||||||
|
SSI_RATEINF = 2
|
||||||
|
SSI_CTTRAMP = 3
|
||||||
|
SSI_FILFREQ = 4
|
||||||
|
SSI_NUM_REGS = SSI_FILFREQ+1
|
||||||
|
SSI_A_BASE = $40
|
||||||
|
SSI_A_DURPHON = SSI_A_BASE + SSI_DURPHON
|
||||||
|
SSI_A_INFLECT = SSI_A_BASE + SSI_INFLECT
|
||||||
|
SSI_A_RATEINF = SSI_A_BASE + SSI_RATEINF
|
||||||
|
SSI_A_CTTRAMP = SSI_A_BASE + SSI_CTTRAMP
|
||||||
|
SSI_A_FILFREQ = SSI_A_BASE + SSI_FILFREQ
|
||||||
|
SSI_B_BASE = $20
|
||||||
|
SSI_B_DURPHON = SSI_B_BASE + SSI_DURPHON
|
||||||
|
SSI_B_INFLECT = SSI_B_BASE + SSI_INFLECT
|
||||||
|
SSI_B_RATEINF = SSI_B_BASE + SSI_RATEINF
|
||||||
|
SSI_B_CTTRAMP = SSI_B_BASE + SSI_CTTRAMP
|
||||||
|
SSI_B_FILFREQ = SSI_B_BASE + SSI_FILFREQ
|
||||||
|
|
||||||
|
; Duration/Phoneme
|
||||||
|
DURATION_MODE_MASK = $C0
|
||||||
|
PHONEME_MASK = $3F
|
||||||
|
|
||||||
|
MODE_PHONEME_TRANSITIONED_INFLECTION = $C0 ; IRQ active
|
||||||
|
MODE_PHONEME_IMMEDIATE_INFLECTION = $80 ; IRQ active
|
||||||
|
MODE_FRAME_IMMEDIATE_INFLECTION = $40 ; IRQ active
|
||||||
|
MODE_IRQ_DISABLED = $00
|
||||||
|
|
||||||
|
; Ctrl/Art/Amp
|
||||||
|
CONTROL_MASK = $80
|
||||||
|
CONTROL_H = CONTROL_MASK
|
||||||
|
CONTROL_L = 0
|
||||||
|
|
||||||
|
REQ_NEW_DATA = 1<<7 ; D7 (inverted state of A/!R). Phasor mode only, when reading any register
|
||||||
|
|
||||||
|
; Phasor mode
|
||||||
|
PH_MOCKINGBOARD = 8
|
||||||
|
PH_PHASOR = $D
|
||||||
|
PH_ECHOPLUS = $F
|
||||||
|
@ -1,17 +1,19 @@
|
|||||||
;ACME 0.85
|
;ACME 0.97
|
||||||
|
|
||||||
!cpu 6502 ; Compatible with all Apple2's
|
!cpu 6502 ; Compatible with all Apple2's
|
||||||
!to "Cybernoid", plain
|
!to "CYBERNOID", plain
|
||||||
!sl "Cybernoid.labels"
|
!sl "Cybernoid.labels"
|
||||||
*=$6000
|
*=$6000
|
||||||
|
|
||||||
;------------------------------------------------------------------------------
|
;------------------------------------------------------------------------------
|
||||||
|
|
||||||
!source "..\Common\Z80-Macros.a"
|
;USE_PHASOR = 0 ; defined on command line
|
||||||
!source "..\Common\ZP-Macros.a"
|
|
||||||
!source "..\Common\AppleDefs.a"
|
!source "..\\Common\\Z80-Macros.a"
|
||||||
!source "..\Common\MockingboardDefs.a"
|
!source "..\\Common\\ZP-Macros.a"
|
||||||
!source "..\Common\MB-Macros.a"
|
!source "..\\Common\\AppleDefs.a"
|
||||||
|
!source "..\\Common\\MockingboardDefs.a"
|
||||||
|
!source "..\\Common\\MB-Macros.a"
|
||||||
|
|
||||||
;------------------------------------------------------------------------------
|
;------------------------------------------------------------------------------
|
||||||
|
|
||||||
@ -415,7 +417,7 @@ lf0f3: ; Cmd_F0
|
|||||||
|
|
||||||
;--------------------------------------
|
;--------------------------------------
|
||||||
|
|
||||||
lf492 = lf40a + ($f492-$f40a)
|
lf492 = $28b2
|
||||||
|
|
||||||
lf0f9: ; Cmd_E2
|
lf0f9: ; Cmd_E2
|
||||||
; Pseudo random number generator
|
; Pseudo random number generator
|
||||||
@ -459,7 +461,7 @@ lf0f9_SMC_h:
|
|||||||
lf111: ; Cmd_E3
|
lf111: ; Cmd_E3
|
||||||
|
|
||||||
lf111_SMC:
|
lf111_SMC:
|
||||||
lda #$05
|
lda #$2a
|
||||||
sta RegA
|
sta RegA
|
||||||
|
|
||||||
;--------------------------------------
|
;--------------------------------------
|
||||||
@ -545,7 +547,7 @@ lf116: ; Cmd_00
|
|||||||
bne lf156
|
bne lf156
|
||||||
|
|
||||||
; ld hl,(0f212h)
|
; ld hl,(0f212h)
|
||||||
+LDW_INDIRECT RegHL, lf1f6 ; HL = A-freq
|
+LDW_INDIRECT RegHL, lf212
|
||||||
|
|
||||||
; ld (0f20ah),hl
|
; ld (0f20ah),hl
|
||||||
+LDW_INDIRECT lf20a, RegHL
|
+LDW_INDIRECT lf20a, RegHL
|
||||||
@ -734,7 +736,7 @@ lf1b1:
|
|||||||
jsr lf1c9
|
jsr lf1c9
|
||||||
|
|
||||||
; ld hl,0f1fch
|
; ld hl,0f1fch
|
||||||
+LDW RegHL, lf1fc
|
+LDW RegHL, lf1fc ; lf1fc = AYRegValues.NOISEPER
|
||||||
|
|
||||||
; ld a,(hl)
|
; ld a,(hl)
|
||||||
+LD_REG_INDIRECT RegA, RegHL
|
+LD_REG_INDIRECT RegA, RegHL
|
||||||
@ -758,13 +760,13 @@ lf1b1:
|
|||||||
+RET_C
|
+RET_C
|
||||||
|
|
||||||
; inc hl
|
; inc hl
|
||||||
+INCW RegHL
|
+INCW RegHL ; lf1fd = AYRegValues.ENABLE
|
||||||
|
|
||||||
; ld a,(hl)
|
; ld a,(hl)
|
||||||
+LD_REG_INDIRECT RegA, RegHL
|
+LD_REG_INDIRECT RegA, RegHL
|
||||||
|
|
||||||
; or 38h
|
; or 38h
|
||||||
ora #$38
|
ora #$38 ; ENABLE |= 0x38 (disable noise CBA)
|
||||||
sta RegA
|
sta RegA
|
||||||
|
|
||||||
; ld (hl),a
|
; ld (hl),a
|
||||||
@ -791,8 +793,15 @@ lf1c9:
|
|||||||
; inc (hl)
|
; inc (hl)
|
||||||
+INC_INDIRECT RegHL
|
+INC_INDIRECT RegHL
|
||||||
|
|
||||||
|
lda RegD ; $00nn?
|
||||||
|
bne +
|
||||||
|
lda #$f3 ; 48K ROM $0000
|
||||||
|
sta RegA
|
||||||
|
bne ++ ; branch always
|
||||||
|
+
|
||||||
; ld a,(de)
|
; ld a,(de)
|
||||||
+LD_REG_INDIRECT RegA, RegDE
|
+LD_REG_INDIRECT RegA, RegDE
|
||||||
|
++
|
||||||
|
|
||||||
; sub (hl)
|
; sub (hl)
|
||||||
+SUB_INDIRECT RegHL
|
+SUB_INDIRECT RegHL
|
||||||
@ -813,8 +822,15 @@ lf1c9:
|
|||||||
; inc de
|
; inc de
|
||||||
+INCW RegDE
|
+INCW RegDE
|
||||||
|
|
||||||
|
lda RegD ; $00nn?
|
||||||
|
bne +
|
||||||
|
lda #$af ; 48K ROM $0001
|
||||||
|
sta RegA
|
||||||
|
bne ++ ; branch always
|
||||||
|
+
|
||||||
; ld a,(de)
|
; ld a,(de)
|
||||||
+LD_REG_INDIRECT RegA, RegDE
|
+LD_REG_INDIRECT RegA, RegDE
|
||||||
|
++
|
||||||
|
|
||||||
; ld c,a
|
; ld c,a
|
||||||
+LD RegC, RegA
|
+LD RegC, RegA
|
||||||
@ -828,8 +844,15 @@ lf1c9:
|
|||||||
; inc (hl)
|
; inc (hl)
|
||||||
+INC_INDIRECT RegHL
|
+INC_INDIRECT RegHL
|
||||||
|
|
||||||
|
lda RegD ; $00nn?
|
||||||
|
bne +
|
||||||
|
lda #$11 ; 48K ROM $0002
|
||||||
|
sta RegA
|
||||||
|
bne ++ ; branch always
|
||||||
|
+
|
||||||
; ld a,(de)
|
; ld a,(de)
|
||||||
+LD_REG_INDIRECT RegA, RegDE
|
+LD_REG_INDIRECT RegA, RegDE
|
||||||
|
++
|
||||||
|
|
||||||
; sub (hl)
|
; sub (hl)
|
||||||
+SUB_INDIRECT RegHL
|
+SUB_INDIRECT RegHL
|
||||||
@ -902,11 +925,11 @@ SF_Detect:
|
|||||||
ldx #7
|
ldx #7
|
||||||
|
|
||||||
.SlotNext:
|
.SlotNext:
|
||||||
ldy #$00+SY6522_TIMER1L_COUNTER
|
ldy #SY6522_TIMER1L_COUNTER+SY6522_A_PH_BASE
|
||||||
jsr SF_GetTimerL
|
jsr SF_GetTimerL
|
||||||
bne .SlotLoop
|
bne .SlotLoop
|
||||||
|
|
||||||
ldy #$80+SY6522_TIMER1L_COUNTER
|
ldy #SY6522_TIMER1L_COUNTER+SY6522_B_BASE
|
||||||
jsr SF_GetTimerL
|
jsr SF_GetTimerL
|
||||||
beq .SlotDone
|
beq .SlotDone
|
||||||
|
|
||||||
@ -961,63 +984,67 @@ SongTbl: !byte 01 ; 0: (AY: Title/In-game)
|
|||||||
|
|
||||||
; AY regs [0..$D]
|
; AY regs [0..$D]
|
||||||
AYRegValues:
|
AYRegValues:
|
||||||
lf1f6: !word 0 ; A period
|
lf1f6: !word $01a8 ; A period
|
||||||
lf1f8: !word 0 ; B period
|
lf1f8: !word 0 ; B period
|
||||||
lf1fa: !word 0 ; C period
|
lf1fa: !word 0 ; C period
|
||||||
lf1fc: !byte 0 ; Noise period
|
lf1fc: !byte $2f ; Noise period
|
||||||
lf1fd: !byte 0 ; Enable
|
lf1fd: !byte $3f ; Enable
|
||||||
lf1fe: !byte 0 ; A volume
|
lf1fe: !byte 0 ; A volume
|
||||||
lf1ff: !byte 0 ; B volume
|
lf1ff: !byte 0 ; B volume
|
||||||
lf200: !byte 0 ; C volume
|
lf200: !byte 0 ; C volume
|
||||||
lf201: !word 0 ; Envelope period
|
lf201: !word $0064 ; Envelope period (not used)
|
||||||
lf203: !byte 0 ; Envelope shape
|
lf203: !byte $0a ; Envelope shape (not used)
|
||||||
|
|
||||||
;--------------------------------------
|
;--------------------------------------
|
||||||
|
|
||||||
lf204: !word 0 ; Tone period
|
lf204: !word 0 ; Tone period
|
||||||
lf206: !word 0
|
lf206: !word $014a
|
||||||
!word 0
|
!word $000a
|
||||||
|
|
||||||
;--------------------------------------
|
;--------------------------------------
|
||||||
|
|
||||||
lf20a: !word 0
|
lf20a: !word 0
|
||||||
|
!word $0004
|
||||||
!word 0
|
!word 0
|
||||||
!word 0
|
!word $0012
|
||||||
!word 0
|
|
||||||
|
|
||||||
lf212: !word 0
|
lf212: !word 0
|
||||||
|
|
||||||
;--------------------------------------
|
;--------------------------------------
|
||||||
|
|
||||||
|
!macro MUSIC_DATA_ADDR .addr {
|
||||||
|
!word lf40a + (.addr - $f40a)
|
||||||
|
}
|
||||||
|
|
||||||
; Voice-A struct
|
; Voice-A struct
|
||||||
|
|
||||||
lf214: !byte 0
|
lf214: !byte 0
|
||||||
|
!byte 2
|
||||||
!byte 0
|
!byte 0
|
||||||
!byte 0
|
!byte 0
|
||||||
!byte 0
|
+MUSIC_DATA_ADDR $f41b
|
||||||
!word 0
|
+MUSIC_DATA_ADDR $f471
|
||||||
!word 0
|
|
||||||
!byte 0
|
!byte 0
|
||||||
!byte 0
|
!byte 0
|
||||||
!byte 0
|
!byte 0
|
||||||
!byte 0
|
!byte 0
|
||||||
!word 0
|
+MUSIC_DATA_ADDR $f418
|
||||||
!word 0
|
+MUSIC_DATA_ADDR $f471
|
||||||
lf224: !byte 0
|
lf224: !byte 0
|
||||||
!byte 0
|
!byte $0a
|
||||||
!word 0
|
+MUSIC_DATA_ADDR $f65e
|
||||||
!word 0
|
+MUSIC_DATA_ADDR $f575
|
||||||
!word 0
|
+MUSIC_DATA_ADDR $f56f
|
||||||
!byte 0
|
!byte 7
|
||||||
!byte 0
|
!byte 0
|
||||||
!byte $08 ; 001000 - Disable A (Noise)
|
!byte $08 ; 001000 - Disable A (Noise)
|
||||||
!byte $36 ; 110110 - Enable A (Noise & Tone)
|
!byte $36 ; 110110 - Enable A (Noise & Tone)
|
||||||
!word lf1fe ; &VolA
|
!word lf1fe ; &VolA
|
||||||
|
!byte $12
|
||||||
!byte 0
|
!byte 0
|
||||||
!byte 0
|
!byte $10
|
||||||
!byte 0
|
!byte $29
|
||||||
!byte 0
|
!byte 1
|
||||||
!byte 0
|
|
||||||
|
|
||||||
;--------------------------------------
|
;--------------------------------------
|
||||||
|
|
||||||
@ -1086,7 +1113,8 @@ lf26a: !byte 0
|
|||||||
;--------------------------------------
|
;--------------------------------------
|
||||||
|
|
||||||
;lf27d:
|
;lf27d:
|
||||||
!fill 17,0 ; ?
|
!byte $2a
|
||||||
|
!fill 16,0 ; ?
|
||||||
|
|
||||||
;--------------------------------------
|
;--------------------------------------
|
||||||
|
|
||||||
@ -1101,7 +1129,12 @@ lf28e:
|
|||||||
; . Envelopes are not used, so no E-Periods to convert
|
; . Envelopes are not used, so no E-Periods to convert
|
||||||
|
|
||||||
!macro ZX2MB .period {
|
!macro ZX2MB .period {
|
||||||
!word .period*10227/17734
|
!if USE_PHASOR {
|
||||||
|
!word .period*20358/17734 ; Phasor 2MHz ((PAL:14.25045e6 / 7) / 100)
|
||||||
|
}else{
|
||||||
|
!word .period*10227/17734 ; Mockingboard 1MHz ((NTSC:14.3181818e6 / 14) / 100)
|
||||||
|
}
|
||||||
|
; !word .period
|
||||||
}
|
}
|
||||||
|
|
||||||
+ZX2MB $0000
|
+ZX2MB $0000
|
||||||
|
@ -1,4 +1,6 @@
|
|||||||
D:\Apple][\acme085\acme.exe cybernoid.a
|
acme.exe -DUSE_PHASOR=1 cybernoid.a
|
||||||
D:\Apple][\InsertBIN2AWS\debug\InsertBIN2AWS.exe cybernoid 6000 cybernoid.aws
|
@REM copy cybernoid.labels %APPLEWIN_DBG%\A2_USER1.sym
|
||||||
java -jar "D:\Apple][\Apple Commander\ac\AppleCommander-1.3.3.9-ac.jar" -d cybernoid ..\ReleaseDSK\Cybernoid.dsk
|
move /y CYBERNOID CYBERNOID.PH
|
||||||
cat cybernoid | java -jar "D:\Apple][\Apple Commander\ac\AppleCommander-1.3.3.9-ac.jar" -p Cybernoid bin 24576 ..\ReleaseDSK\Cybernoid.dsk
|
|
||||||
|
acme.exe -DUSE_PHASOR=0 cybernoid.a
|
||||||
|
copy cybernoid.labels %APPLEWIN_DBG%\A2_USER1.sym
|
||||||
|
@ -1,17 +1,19 @@
|
|||||||
;ACME 0.85
|
;ACME 0.85
|
||||||
|
|
||||||
!cpu 6502 ; Compatible with all Apple2's
|
!cpu 6502 ; Compatible with all Apple2's
|
||||||
!to "Cybernoid2", plain
|
!to "CYBERNOID2", plain
|
||||||
!sl "Cybernoid2.labels"
|
!sl "Cybernoid2.labels"
|
||||||
*=$6000
|
*=$6000
|
||||||
|
|
||||||
;------------------------------------------------------------------------------
|
;------------------------------------------------------------------------------
|
||||||
|
|
||||||
!source "..\Common\Z80-Macros.a"
|
;USE_PHASOR = 0 ; defined on command line
|
||||||
!source "..\Common\ZP-Macros.a"
|
|
||||||
!source "..\Common\AppleDefs.a"
|
!source "..\\Common\\Z80-Macros.a"
|
||||||
!source "..\Common\MockingboardDefs.a"
|
!source "..\\Common\\ZP-Macros.a"
|
||||||
!source "..\Common\MB-Macros.a"
|
!source "..\\Common\\AppleDefs.a"
|
||||||
|
!source "..\\Common\\MockingboardDefs.a"
|
||||||
|
!source "..\\Common\\MB-Macros.a"
|
||||||
|
|
||||||
;------------------------------------------------------------------------------
|
;------------------------------------------------------------------------------
|
||||||
|
|
||||||
@ -937,7 +939,12 @@ lf700:
|
|||||||
; . Envelopes are not used, so no E-Periods to convert
|
; . Envelopes are not used, so no E-Periods to convert
|
||||||
|
|
||||||
!macro ZX2MB .period {
|
!macro ZX2MB .period {
|
||||||
!word .period*10227/17734
|
!if USE_PHASOR {
|
||||||
|
!word .period*20358/17734 ; Phasor 2MHz ((PAL:14.25045e6 / 7) / 100)
|
||||||
|
}else{
|
||||||
|
!word .period*10227/17734 ; Mockingboard 1MHz ((NTSC:14.3181818e6 / 14) / 100)
|
||||||
|
}
|
||||||
|
; !word .period
|
||||||
}
|
}
|
||||||
|
|
||||||
+ZX2MB $0000
|
+ZX2MB $0000
|
||||||
|
@ -1,4 +1,6 @@
|
|||||||
D:\Apple][\acme085\acme.exe cybernoid2.a
|
acme.exe -DUSE_PHASOR=1 cybernoid2.a
|
||||||
D:\Apple][\InsertBIN2AWS\debug\InsertBIN2AWS.exe cybernoid2 6000 cybernoid2.aws
|
@REM copy cybernoid2.labels %APPLEWIN_DBG%\A2_USER1.sym
|
||||||
java -jar "D:\Apple][\Apple Commander\ac\AppleCommander-1.3.3.9-ac.jar" -d cybernoid2 ..\ReleaseDSK\Cybernoid.dsk
|
move /y CYBERNOID2 CYBERNOID2.PH
|
||||||
cat cybernoid2 | java -jar "D:\Apple][\Apple Commander\ac\AppleCommander-1.3.3.9-ac.jar" -p Cybernoid2 bin 24576 ..\ReleaseDSK\Cybernoid.dsk
|
|
||||||
|
acme.exe -DUSE_PHASOR=0 cybernoid2.a
|
||||||
|
copy cybernoid2.labels %APPLEWIN_DBG%\A2_USER1.sym
|
||||||
|
2501
CybernoidTest/Cybernoid.a
Normal file
2501
CybernoidTest/Cybernoid.a
Normal file
File diff suppressed because it is too large
Load Diff
2
CybernoidTest/build.bat
Normal file
2
CybernoidTest/build.bat
Normal file
@ -0,0 +1,2 @@
|
|||||||
|
acme.exe cybernoid.a
|
||||||
|
copy cybernoid.labels %APPLEWIN_DBG%\A2_USER1.sym
|
3
CybernoidTest/debug.txt
Normal file
3
CybernoidTest/debug.txt
Normal file
@ -0,0 +1,3 @@
|
|||||||
|
// PWD: <root>\AY-Z80\Cybernoid
|
||||||
|
// run "debug.txt"
|
||||||
|
bload "cybernoid",4000
|
963
CybernoidTest2/CybernoidTest2.a
Normal file
963
CybernoidTest2/CybernoidTest2.a
Normal file
@ -0,0 +1,963 @@
|
|||||||
|
;ACME 0.96.4
|
||||||
|
|
||||||
|
!cpu 6502 ; Compatible with all Apple2's
|
||||||
|
!to "CybernoidTest2", plain
|
||||||
|
!sl "CybernoidTest2.labels"
|
||||||
|
*=$4000
|
||||||
|
|
||||||
|
USE_AYDATA1 = 1
|
||||||
|
|
||||||
|
;------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
!source "..\Common\AppleDefs.a"
|
||||||
|
!source "..\Common\MockingboardDefs.a"
|
||||||
|
!source "..\Common\MB-Macros.a"
|
||||||
|
|
||||||
|
;------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
zpTmp = $f9
|
||||||
|
pTonesTbl = $fa
|
||||||
|
TmpL = $fc ; alias with pAYData
|
||||||
|
pAYData = $fc
|
||||||
|
MBBase = $fe
|
||||||
|
MBBaseL = MBBase
|
||||||
|
MBBaseH = MBBase+1
|
||||||
|
|
||||||
|
!zone code
|
||||||
|
|
||||||
|
;--------------------------------------
|
||||||
|
|
||||||
|
Entrypoint:
|
||||||
|
lda zpTmp
|
||||||
|
sta saveF9
|
||||||
|
lda pTonesTbl+0
|
||||||
|
sta saveFA
|
||||||
|
lda pTonesTbl+1
|
||||||
|
sta saveFB
|
||||||
|
lda pAYData+0
|
||||||
|
sta saveFC
|
||||||
|
lda pAYData+1
|
||||||
|
sta saveFD
|
||||||
|
lda MBBaseL
|
||||||
|
sta saveFE
|
||||||
|
lda MBBaseH
|
||||||
|
sta saveFF
|
||||||
|
|
||||||
|
jsr SF_GetMBSlot
|
||||||
|
bne GotMBSlot
|
||||||
|
|
||||||
|
; MB not found!
|
||||||
|
brk
|
||||||
|
|
||||||
|
GotMBSlot:
|
||||||
|
stx nMBBaseHi
|
||||||
|
|
||||||
|
stx MB1x+2
|
||||||
|
stx MB2x+2
|
||||||
|
stx MB3x+2
|
||||||
|
stx MB4x+2
|
||||||
|
stx MB5x+2
|
||||||
|
stx MB6x+2
|
||||||
|
|
||||||
|
stx MB7x+2
|
||||||
|
stx MB8x+2
|
||||||
|
stx MB9x+2
|
||||||
|
stx MBAx+2
|
||||||
|
stx MBBx+2
|
||||||
|
stx MBCx+2
|
||||||
|
|
||||||
|
stx MB1y+2
|
||||||
|
stx MB2y+2
|
||||||
|
stx MB3y+2
|
||||||
|
stx MB4y+2
|
||||||
|
stx MB5y+2
|
||||||
|
stx MB6y+2
|
||||||
|
stx MB7y+2
|
||||||
|
stx MB8y+2
|
||||||
|
stx MB9y+2
|
||||||
|
|
||||||
|
stx MB7+2
|
||||||
|
|
||||||
|
;
|
||||||
|
|
||||||
|
lda #$07
|
||||||
|
ldy #SY6522_DDRB
|
||||||
|
sta (MBBase),y
|
||||||
|
ldy #SY6522_DDRB+$80
|
||||||
|
sta (MBBase),y
|
||||||
|
|
||||||
|
lda #$ff
|
||||||
|
ldy #SY6522_DDRA
|
||||||
|
sta (MBBase),y
|
||||||
|
ldy #SY6522_DDRA+$80
|
||||||
|
sta (MBBase),y
|
||||||
|
|
||||||
|
lda #AY_RESET
|
||||||
|
ldy #SY6522_ORB
|
||||||
|
sta (MBBase),y
|
||||||
|
ldy #SY6522_ORB+$80
|
||||||
|
sta (MBBase),y
|
||||||
|
|
||||||
|
;
|
||||||
|
|
||||||
|
; Setup Timer1 IRQ to trigger at 50Hz
|
||||||
|
; Apple CLK = 1.022727 MHz, so set Timer1=0x4fe7
|
||||||
|
|
||||||
|
sei
|
||||||
|
|
||||||
|
lda #$e7
|
||||||
|
ldy #SY6522_TIMER1L_COUNTER
|
||||||
|
sta (MBBase),y
|
||||||
|
lda #$4f
|
||||||
|
ldy #SY6522_TIMER1H_COUNTER
|
||||||
|
sta (MBBase),y
|
||||||
|
|
||||||
|
lda #1<<6
|
||||||
|
ldy #SY6522_ACR
|
||||||
|
sta (MBBase),y ; Free running timer
|
||||||
|
|
||||||
|
lda #1<<7 | 1<<6
|
||||||
|
ldy #SY6522_IER
|
||||||
|
sta (MBBase),y ; Enable Timer1 IRQ
|
||||||
|
|
||||||
|
lda #<Interrupt ; ADDR_L
|
||||||
|
sta IRQL
|
||||||
|
lda #>Interrupt ; ADDR_H
|
||||||
|
sta IRQH
|
||||||
|
|
||||||
|
jsr InitAYData
|
||||||
|
jsr InitTones
|
||||||
|
|
||||||
|
lda #0
|
||||||
|
sta AYDataDoneFlag
|
||||||
|
sta nFrameNum+0
|
||||||
|
sta nFrameNum+1
|
||||||
|
sta nFrameNum+2
|
||||||
|
|
||||||
|
cli
|
||||||
|
|
||||||
|
loop lda AYDataDoneFlag
|
||||||
|
bne done
|
||||||
|
lda $c000
|
||||||
|
bpl loop
|
||||||
|
bit $c010
|
||||||
|
cmp #27+$80 ; ESC to quit
|
||||||
|
beq done
|
||||||
|
cmp #9+$80 ; TAB to toggle AY-chip
|
||||||
|
bne +
|
||||||
|
jsr toggle_ay
|
||||||
|
bcs loop
|
||||||
|
+ jsr TonesInc
|
||||||
|
bcs loop
|
||||||
|
jsr TonesDec
|
||||||
|
bcs loop
|
||||||
|
|
||||||
|
pause ; step via one-shot mode
|
||||||
|
sei
|
||||||
|
lda #0
|
||||||
|
ldy #SY6522_ACR
|
||||||
|
sta (MBBase),y
|
||||||
|
lda nFrameNum+2
|
||||||
|
cli
|
||||||
|
- cmp nFrameNum+2
|
||||||
|
beq -
|
||||||
|
|
||||||
|
ldy nFrameNum+1 ; Second
|
||||||
|
ldx nFrameNum+2 ; Frame#
|
||||||
|
jsr $f940 ; PRNTYX
|
||||||
|
- lda $c000
|
||||||
|
bpl -
|
||||||
|
bit $c010
|
||||||
|
tax ; keycode
|
||||||
|
|
||||||
|
lda #$e7
|
||||||
|
ldy #SY6522_TIMER1L_COUNTER
|
||||||
|
sta (MBBase),y
|
||||||
|
lda #$4f
|
||||||
|
ldy #SY6522_TIMER1H_COUNTER
|
||||||
|
sta (MBBase),y
|
||||||
|
|
||||||
|
cpx #' '+$80
|
||||||
|
beq pause
|
||||||
|
|
||||||
|
; restart
|
||||||
|
lda #1<<6
|
||||||
|
ldy #SY6522_ACR
|
||||||
|
sta (MBBase),y ; Free running timer
|
||||||
|
jmp loop
|
||||||
|
|
||||||
|
done
|
||||||
|
lda #1<<6
|
||||||
|
ldy #SY6522_IER
|
||||||
|
sta (MBBase),y ; Disable Timer1 IRQ
|
||||||
|
|
||||||
|
lda #AY_RESET
|
||||||
|
ldy #SY6522_ORB
|
||||||
|
sta (MBBase),y
|
||||||
|
ldy #SY6522_ORB+$80
|
||||||
|
sta (MBBase),y
|
||||||
|
|
||||||
|
lda saveF9
|
||||||
|
sta zpTmp
|
||||||
|
lda saveFA
|
||||||
|
sta pTonesTbl+0
|
||||||
|
lda saveFB
|
||||||
|
sta pTonesTbl+1
|
||||||
|
lda saveFC
|
||||||
|
sta pAYData+0
|
||||||
|
lda saveFD
|
||||||
|
sta pAYData+1
|
||||||
|
lda saveFE
|
||||||
|
sta MBBaseL
|
||||||
|
lda saveFF
|
||||||
|
sta MBBaseH
|
||||||
|
|
||||||
|
rts
|
||||||
|
|
||||||
|
;--------------------------------------
|
||||||
|
|
||||||
|
Interrupt
|
||||||
|
; Pre:
|
||||||
|
; 6502 has pushed P
|
||||||
|
; Apple ROM has stored A to $45 (not Apple //e ROM!)
|
||||||
|
;
|
||||||
|
|
||||||
|
txa
|
||||||
|
pha
|
||||||
|
tya
|
||||||
|
pha
|
||||||
|
|
||||||
|
jsr lefe5
|
||||||
|
|
||||||
|
;
|
||||||
|
|
||||||
|
;; lda AYDataDoneFlag
|
||||||
|
;; bne .done
|
||||||
|
|
||||||
|
lda pAYData+0
|
||||||
|
sta MBsmc1+1
|
||||||
|
sta MBsmc2+1
|
||||||
|
lda pAYData+1
|
||||||
|
sta MBsmc1+2
|
||||||
|
sta MBsmc2+2
|
||||||
|
|
||||||
|
ldx #AY_INACTIVE
|
||||||
|
ldy #13 ; write AY regs from $D to $0 (like Cybernoid)
|
||||||
|
-
|
||||||
|
MB1x sty CARD_BASE+SY6522_ORA
|
||||||
|
lda #AY_LATCH
|
||||||
|
MB2x sta CARD_BASE+SY6522_ORB
|
||||||
|
MB3x stx CARD_BASE+SY6522_ORB ; Set INACTIVE
|
||||||
|
MBsmc1 lda AYData1,y
|
||||||
|
MB4x sta CARD_BASE+SY6522_ORA
|
||||||
|
lda #AY_WRITE
|
||||||
|
MB5x sta CARD_BASE+SY6522_ORB
|
||||||
|
MB6x stx CARD_BASE+SY6522_ORB ; Set INACTIVE
|
||||||
|
dey
|
||||||
|
;
|
||||||
|
MB7x sty CARD_BASE+SY6522_ORA
|
||||||
|
lda #AY_LATCH
|
||||||
|
MB8x sta CARD_BASE+SY6522_ORB
|
||||||
|
MB9x stx CARD_BASE+SY6522_ORB ; Set INACTIVE
|
||||||
|
MBsmc2 lda AYData1,y
|
||||||
|
cpy #AY_NOISEPER
|
||||||
|
bne +
|
||||||
|
and #AY_NOISE_MASK
|
||||||
|
+
|
||||||
|
MBAx sta CARD_BASE+SY6522_ORA
|
||||||
|
lda #AY_WRITE
|
||||||
|
MBBx sta CARD_BASE+SY6522_ORB
|
||||||
|
MBCx stx CARD_BASE+SY6522_ORB ; Set INACTIVE
|
||||||
|
dey
|
||||||
|
bpl -
|
||||||
|
|
||||||
|
; Verify AY writes
|
||||||
|
lda pAYData+0
|
||||||
|
sta MBsmc3+1
|
||||||
|
lda pAYData+1
|
||||||
|
sta MBsmc3+2
|
||||||
|
|
||||||
|
ldx #AY_INACTIVE
|
||||||
|
ldy #13 ; read AY regs from $D to $0
|
||||||
|
|
||||||
|
- lda #$ff ; Port-A direction = output
|
||||||
|
MB1y sta CARD_BASE+SY6522_DDRA
|
||||||
|
MB2y sty CARD_BASE+SY6522_ORA ; AY reg to read
|
||||||
|
|
||||||
|
lda #AY_LATCH
|
||||||
|
MB3y sta CARD_BASE+SY6522_ORB
|
||||||
|
MB4y stx CARD_BASE+SY6522_ORB
|
||||||
|
|
||||||
|
lda #$00 ; Port-A direction = input
|
||||||
|
MB5y sta CARD_BASE+SY6522_DDRA
|
||||||
|
|
||||||
|
lda #AY_READ
|
||||||
|
MB6y sta CARD_BASE+SY6522_ORB
|
||||||
|
MB7y stx CARD_BASE+SY6522_ORB
|
||||||
|
|
||||||
|
MBsmc3 lda AYData1,y
|
||||||
|
cpy #AY_NOISEPER
|
||||||
|
bne +
|
||||||
|
and #AY_NOISE_MASK
|
||||||
|
+ sta zpTmp
|
||||||
|
MB8y lda CARD_BASE+SY6522_ORA ; and read it!
|
||||||
|
cmp zpTmp
|
||||||
|
beq +
|
||||||
|
; ERR Reg:Val(read):Val(expect)
|
||||||
|
sty $404 ; reg#
|
||||||
|
sta $406 ; value read
|
||||||
|
lda zpTmp
|
||||||
|
sta $408 ; value expected
|
||||||
|
lda #'E'+$80
|
||||||
|
sta $400
|
||||||
|
lda #'R'+$80
|
||||||
|
sta $401
|
||||||
|
lda #'R'+$80
|
||||||
|
sta $402
|
||||||
|
lda #' '+$80
|
||||||
|
sta $403
|
||||||
|
lda #':'+$80
|
||||||
|
sta $405
|
||||||
|
lda #':'+$80
|
||||||
|
sta $407
|
||||||
|
|
||||||
|
+ dey
|
||||||
|
bpl -
|
||||||
|
|
||||||
|
; And finally Port-A = output
|
||||||
|
lda #$ff
|
||||||
|
MB9y sta CARD_BASE+SY6522_DDRA
|
||||||
|
|
||||||
|
; Setup for next AY-reg set
|
||||||
|
clc
|
||||||
|
lda pAYData+0
|
||||||
|
adc #14
|
||||||
|
sta pAYData+0
|
||||||
|
lda pAYData+1
|
||||||
|
adc #0
|
||||||
|
sta pAYData+1
|
||||||
|
|
||||||
|
; $ff,$ff = end of data
|
||||||
|
ldy #0
|
||||||
|
lda (pAYData),y
|
||||||
|
iny
|
||||||
|
and (pAYData),y
|
||||||
|
cmp #$ff
|
||||||
|
bne +
|
||||||
|
;; sta AYDataDoneFlag
|
||||||
|
jsr InitAYData
|
||||||
|
+
|
||||||
|
|
||||||
|
;
|
||||||
|
|
||||||
|
.done
|
||||||
|
lda #1<<6
|
||||||
|
MB7 sta CARD_BASE+SY6522_IFR ; Clear Timer1 IRQ flag
|
||||||
|
|
||||||
|
pla
|
||||||
|
tay
|
||||||
|
pla
|
||||||
|
tax
|
||||||
|
|
||||||
|
lda $45
|
||||||
|
rti
|
||||||
|
|
||||||
|
|
||||||
|
;--------------------------------------
|
||||||
|
|
||||||
|
lefe5:
|
||||||
|
inc nFrameNum+2
|
||||||
|
lda nFrameNum+2
|
||||||
|
cmp #50
|
||||||
|
bne .fnum_ok
|
||||||
|
lda #0
|
||||||
|
sta nFrameNum+2
|
||||||
|
inc nFrameNum+1
|
||||||
|
lda nFrameNum+1
|
||||||
|
cmp #60
|
||||||
|
bne .fnum_ok
|
||||||
|
lda #0
|
||||||
|
sta nFrameNum+1
|
||||||
|
inc nFrameNum+0
|
||||||
|
.fnum_ok:
|
||||||
|
|
||||||
|
rts
|
||||||
|
|
||||||
|
;------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
; Skyfox MB detection routine:
|
||||||
|
|
||||||
|
SF_GetMBSlot:
|
||||||
|
; Pre:
|
||||||
|
; Post:
|
||||||
|
; Z = 0 (NE) : MB detected
|
||||||
|
; X = HI(MB base address)
|
||||||
|
; (MBBase) = MB slot address
|
||||||
|
;
|
||||||
|
|
||||||
|
jsr SF_Detect
|
||||||
|
|
||||||
|
.Loop: stx TmpL
|
||||||
|
jsr SF_Detect
|
||||||
|
cpx TmpL
|
||||||
|
bne .Loop
|
||||||
|
|
||||||
|
cpx #$C8
|
||||||
|
rts
|
||||||
|
|
||||||
|
;--------------------------------------
|
||||||
|
|
||||||
|
SF_Detect:
|
||||||
|
lda #0
|
||||||
|
sta MBBaseL
|
||||||
|
lda #$c1
|
||||||
|
sta MBBaseH
|
||||||
|
ldx #7
|
||||||
|
|
||||||
|
.SlotNext:
|
||||||
|
ldy #$00+SY6522_TIMER1L_COUNTER
|
||||||
|
jsr SF_GetTimerL
|
||||||
|
bne .SlotLoop
|
||||||
|
|
||||||
|
ldy #$80+SY6522_TIMER1L_COUNTER
|
||||||
|
jsr SF_GetTimerL
|
||||||
|
beq .SlotDone
|
||||||
|
|
||||||
|
.SlotLoop:
|
||||||
|
inc MBBaseH
|
||||||
|
dex
|
||||||
|
bne .SlotNext
|
||||||
|
|
||||||
|
.SlotDone:
|
||||||
|
ldx MBBaseH
|
||||||
|
rts
|
||||||
|
|
||||||
|
;--------------------------------------
|
||||||
|
|
||||||
|
SF_GetTimerL:
|
||||||
|
lda (MBBase),y
|
||||||
|
cmp MBBaseL
|
||||||
|
sbc (MBBase),y
|
||||||
|
cmp #$08
|
||||||
|
rts
|
||||||
|
|
||||||
|
;--------------------------------------
|
||||||
|
|
||||||
|
InitAYData
|
||||||
|
!if USE_AYDATA1 {
|
||||||
|
lda #<AYData1
|
||||||
|
sta pAYData+0
|
||||||
|
lda #>AYData1
|
||||||
|
sta pAYData+1
|
||||||
|
} else {
|
||||||
|
lda #<AYData2
|
||||||
|
sta pAYData+0
|
||||||
|
lda #>AYData2
|
||||||
|
sta pAYData+1
|
||||||
|
}
|
||||||
|
rts
|
||||||
|
|
||||||
|
;--------------------------------------
|
||||||
|
|
||||||
|
toggle_ay
|
||||||
|
sei
|
||||||
|
|
||||||
|
lda #AY_RESET
|
||||||
|
ldy #SY6522_ORB
|
||||||
|
sta (MBBase),y
|
||||||
|
ldy #SY6522_ORB+$80
|
||||||
|
sta (MBBase),y
|
||||||
|
|
||||||
|
lda MB1x+1 ; ORA
|
||||||
|
eor #$80
|
||||||
|
tax
|
||||||
|
lda MB2x+1 ; ORB
|
||||||
|
eor #$80
|
||||||
|
|
||||||
|
stx MB1x+1
|
||||||
|
sta MB2x+1
|
||||||
|
sta MB3x+1
|
||||||
|
|
||||||
|
stx MB4x+1
|
||||||
|
sta MB5x+1
|
||||||
|
sta MB6x+1
|
||||||
|
|
||||||
|
stx MB7x+1
|
||||||
|
sta MB8x+1
|
||||||
|
sta MB9x+1
|
||||||
|
|
||||||
|
stx MBAx+1
|
||||||
|
sta MBBx+1
|
||||||
|
sta MBCx+1
|
||||||
|
|
||||||
|
;
|
||||||
|
|
||||||
|
lda MB1y+1
|
||||||
|
eor #$80
|
||||||
|
sta MB1y+1
|
||||||
|
sta MB5y+1
|
||||||
|
sta MB9y+1
|
||||||
|
|
||||||
|
lda MB2y+1
|
||||||
|
eor #$80
|
||||||
|
sta MB2y+1
|
||||||
|
sta MB8y+1
|
||||||
|
|
||||||
|
lda MB3y+1
|
||||||
|
eor #$80
|
||||||
|
sta MB3y+1
|
||||||
|
sta MB4y+1
|
||||||
|
sta MB6y+1
|
||||||
|
sta MB7y+1
|
||||||
|
|
||||||
|
cli
|
||||||
|
|
||||||
|
sec
|
||||||
|
rts
|
||||||
|
|
||||||
|
;------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
!zone data
|
||||||
|
|
||||||
|
nMBBaseHi !byte 0
|
||||||
|
AYDataDoneFlag !byte 0
|
||||||
|
nFrameNum !byte 0,0,0 ; Minute:Second:FrameNum (@ 50Hz)
|
||||||
|
|
||||||
|
saveF9 !byte 0
|
||||||
|
saveFA !byte 0
|
||||||
|
saveFB !byte 0
|
||||||
|
saveFC !byte 0
|
||||||
|
saveFD !byte 0
|
||||||
|
saveFE !byte 0
|
||||||
|
saveFF !byte 0
|
||||||
|
|
||||||
|
;--------------------------------------
|
||||||
|
|
||||||
|
SetTones
|
||||||
|
sei
|
||||||
|
|
||||||
|
; Even lines
|
||||||
|
|
||||||
|
jsr InitAYData
|
||||||
|
|
||||||
|
lda #<TonesTbl
|
||||||
|
sta pTonesTbl+0
|
||||||
|
lda #>TonesTbl
|
||||||
|
sta pTonesTbl+1
|
||||||
|
|
||||||
|
ldy #0 ; TonesTbl index
|
||||||
|
|
||||||
|
-- lda (pTonesTbl),y
|
||||||
|
sta smc1+1
|
||||||
|
iny
|
||||||
|
lda (pTonesTbl),y
|
||||||
|
sta smc2+1
|
||||||
|
iny
|
||||||
|
lda (pTonesTbl),y
|
||||||
|
tax ; count
|
||||||
|
iny
|
||||||
|
tya
|
||||||
|
pha ; TonesTbl index
|
||||||
|
|
||||||
|
- ldy #0
|
||||||
|
smc1 lda #$00
|
||||||
|
sta (pAYData),y
|
||||||
|
iny
|
||||||
|
smc2 lda #$00
|
||||||
|
sta (pAYData),y
|
||||||
|
clc
|
||||||
|
lda pAYData+0
|
||||||
|
adc #14*2 ; alternate AY-reg sets
|
||||||
|
sta pAYData+0
|
||||||
|
lda pAYData+1
|
||||||
|
adc #0
|
||||||
|
sta pAYData+1
|
||||||
|
dex
|
||||||
|
bne -
|
||||||
|
|
||||||
|
pla
|
||||||
|
tay
|
||||||
|
lda (pTonesTbl),y
|
||||||
|
iny
|
||||||
|
and (pTonesTbl),y
|
||||||
|
dey
|
||||||
|
cmp #$ff
|
||||||
|
bne --
|
||||||
|
|
||||||
|
; Odd lines
|
||||||
|
|
||||||
|
jsr InitAYData
|
||||||
|
clc
|
||||||
|
lda pAYData+0
|
||||||
|
adc #14 ; 1st odd set
|
||||||
|
sta pAYData+0
|
||||||
|
lda pAYData+1
|
||||||
|
adc #0
|
||||||
|
sta pAYData+1
|
||||||
|
|
||||||
|
lda #<TonesTblOdd
|
||||||
|
sta pTonesTbl+0
|
||||||
|
lda #>TonesTblOdd
|
||||||
|
sta pTonesTbl+1
|
||||||
|
|
||||||
|
ldy #0 ; TonesTblOdd index
|
||||||
|
|
||||||
|
-- lda (pTonesTbl),y
|
||||||
|
sta smc3+1
|
||||||
|
iny
|
||||||
|
lda (pTonesTbl),y
|
||||||
|
sta smc4+1
|
||||||
|
iny
|
||||||
|
lda (pTonesTbl),y
|
||||||
|
tax ; count
|
||||||
|
iny
|
||||||
|
tya
|
||||||
|
pha ; TonesTbl index
|
||||||
|
|
||||||
|
- ldy #0
|
||||||
|
smc3 lda #$00
|
||||||
|
sta (pAYData),y
|
||||||
|
iny
|
||||||
|
smc4 lda #$00
|
||||||
|
sta (pAYData),y
|
||||||
|
clc
|
||||||
|
lda pAYData+0
|
||||||
|
adc #14*2 ; alternate AY-reg sets
|
||||||
|
sta pAYData+0
|
||||||
|
lda pAYData+1
|
||||||
|
adc #0
|
||||||
|
sta pAYData+1
|
||||||
|
dex
|
||||||
|
bne -
|
||||||
|
|
||||||
|
pla
|
||||||
|
tay
|
||||||
|
lda (pTonesTbl),y
|
||||||
|
iny
|
||||||
|
and (pTonesTbl),y
|
||||||
|
dey
|
||||||
|
cmp #$ff
|
||||||
|
bne --
|
||||||
|
|
||||||
|
|
||||||
|
jsr InitAYData
|
||||||
|
cli
|
||||||
|
rts
|
||||||
|
|
||||||
|
;--------------------------------------
|
||||||
|
|
||||||
|
PrintTones
|
||||||
|
lda TonesTbl+0*3+1
|
||||||
|
sta $400
|
||||||
|
lda TonesTbl+0*3+0
|
||||||
|
sta $401
|
||||||
|
|
||||||
|
lda #$A0
|
||||||
|
sta $402
|
||||||
|
sta $403
|
||||||
|
|
||||||
|
!if USE_AYDATA1 {
|
||||||
|
lda TonesTbl+1*3+1
|
||||||
|
sta $404
|
||||||
|
lda TonesTbl+1*3+0
|
||||||
|
sta $405
|
||||||
|
|
||||||
|
lda #$A0
|
||||||
|
sta $406
|
||||||
|
sta $407
|
||||||
|
|
||||||
|
lda TonesTbl+3*3+1
|
||||||
|
sta $408
|
||||||
|
lda TonesTbl+3*3+0
|
||||||
|
sta $409
|
||||||
|
|
||||||
|
lda #$A0
|
||||||
|
sta $40A
|
||||||
|
sta $40B
|
||||||
|
|
||||||
|
lda TonesTbl+4*3+1
|
||||||
|
sta $40C
|
||||||
|
lda TonesTbl+4*3+0
|
||||||
|
sta $40D
|
||||||
|
|
||||||
|
lda #$A0
|
||||||
|
sta $40E
|
||||||
|
sta $40F
|
||||||
|
|
||||||
|
lda TonesTbl+5*3+1
|
||||||
|
sta $410
|
||||||
|
lda TonesTbl+5*3+0
|
||||||
|
sta $411
|
||||||
|
|
||||||
|
lda #$A0
|
||||||
|
sta $412
|
||||||
|
sta $413
|
||||||
|
} else {
|
||||||
|
lda TonesTbl+2*3+1
|
||||||
|
sta $404
|
||||||
|
lda TonesTbl+2*3+0
|
||||||
|
sta $405
|
||||||
|
|
||||||
|
lda #$A0
|
||||||
|
sta $406
|
||||||
|
sta $407
|
||||||
|
}
|
||||||
|
|
||||||
|
sec
|
||||||
|
rts
|
||||||
|
|
||||||
|
;--------------------------------------
|
||||||
|
|
||||||
|
TonesInc
|
||||||
|
!if USE_AYDATA1 {
|
||||||
|
ldy #0
|
||||||
|
cmp #'1'+$80
|
||||||
|
beq .inc
|
||||||
|
iny
|
||||||
|
cmp #'2'+$80
|
||||||
|
beq .inc
|
||||||
|
iny ; skip 'evens' end marker
|
||||||
|
iny
|
||||||
|
cmp #'3'+$80
|
||||||
|
beq .inc
|
||||||
|
iny
|
||||||
|
cmp #'4'+$80
|
||||||
|
beq .inc
|
||||||
|
iny
|
||||||
|
cmp #'5'+$80
|
||||||
|
beq .inc
|
||||||
|
} else {
|
||||||
|
ldy #0
|
||||||
|
cmp #'1'+$80
|
||||||
|
beq .inc
|
||||||
|
iny ; skip 'evens' end marker
|
||||||
|
iny
|
||||||
|
cmp #'2'+$80
|
||||||
|
beq .inc
|
||||||
|
}
|
||||||
|
clc
|
||||||
|
rts
|
||||||
|
|
||||||
|
.inc
|
||||||
|
sty pTonesTbl
|
||||||
|
tya
|
||||||
|
asl ; =lsl
|
||||||
|
clc
|
||||||
|
adc pTonesTbl
|
||||||
|
tay ; y=y*3
|
||||||
|
|
||||||
|
lda #<TonesTbl
|
||||||
|
sta pTonesTbl+0
|
||||||
|
lda #>TonesTbl
|
||||||
|
sta pTonesTbl+1
|
||||||
|
|
||||||
|
clc
|
||||||
|
lda (pTonesTbl),y
|
||||||
|
adc #1
|
||||||
|
sta (pTonesTbl),y
|
||||||
|
iny
|
||||||
|
lda (pTonesTbl),y
|
||||||
|
adc #0
|
||||||
|
sta (pTonesTbl),y
|
||||||
|
|
||||||
|
jsr SetTones
|
||||||
|
jmp PrintTones
|
||||||
|
|
||||||
|
;--------------------------------------
|
||||||
|
|
||||||
|
TonesDec
|
||||||
|
!if USE_AYDATA1 {
|
||||||
|
ldy #0
|
||||||
|
cmp #'Q'+$80
|
||||||
|
beq .dec
|
||||||
|
iny
|
||||||
|
cmp #'W'+$80
|
||||||
|
beq .dec
|
||||||
|
iny ; skip 'evens' end marker
|
||||||
|
iny
|
||||||
|
cmp #'E'+$80
|
||||||
|
beq .dec
|
||||||
|
iny
|
||||||
|
cmp #'R'+$80
|
||||||
|
beq .dec
|
||||||
|
iny
|
||||||
|
cmp #'T'+$80
|
||||||
|
beq .dec
|
||||||
|
} else {
|
||||||
|
ldy #0
|
||||||
|
cmp #'Q'+$80
|
||||||
|
beq .dec
|
||||||
|
iny ; skip 'evens' end marker
|
||||||
|
iny
|
||||||
|
cmp #'W'+$80
|
||||||
|
beq .dec
|
||||||
|
}
|
||||||
|
clc
|
||||||
|
rts
|
||||||
|
|
||||||
|
.dec
|
||||||
|
sty pTonesTbl
|
||||||
|
tya
|
||||||
|
asl ; =lsl
|
||||||
|
clc
|
||||||
|
adc pTonesTbl
|
||||||
|
tay ; y=y*3
|
||||||
|
|
||||||
|
lda #<TonesTbl
|
||||||
|
sta pTonesTbl+0
|
||||||
|
lda #>TonesTbl
|
||||||
|
sta pTonesTbl+1
|
||||||
|
|
||||||
|
sec
|
||||||
|
lda (pTonesTbl),y
|
||||||
|
sbc #1
|
||||||
|
sta (pTonesTbl),y
|
||||||
|
iny
|
||||||
|
lda (pTonesTbl),y
|
||||||
|
sbc #0
|
||||||
|
sta (pTonesTbl),y
|
||||||
|
|
||||||
|
jsr SetTones
|
||||||
|
jmp PrintTones
|
||||||
|
|
||||||
|
;--------------------------------------
|
||||||
|
|
||||||
|
InitTones
|
||||||
|
!if USE_AYDATA1 {
|
||||||
|
ldy #0*3
|
||||||
|
lda #$01
|
||||||
|
sta TonesTbl+0*3+1
|
||||||
|
lda #$e9
|
||||||
|
sta TonesTbl+0*3+0
|
||||||
|
;
|
||||||
|
lda #$02
|
||||||
|
sta TonesTbl+1*3+1
|
||||||
|
lda #$68
|
||||||
|
sta TonesTbl+1*3+0
|
||||||
|
;
|
||||||
|
lda #$00
|
||||||
|
sta TonesTbl+3*3+1
|
||||||
|
lda #$cd
|
||||||
|
sta TonesTbl+3*3+0
|
||||||
|
;
|
||||||
|
lda #$00
|
||||||
|
sta TonesTbl+4*3+1
|
||||||
|
lda #$d9
|
||||||
|
sta TonesTbl+4*3+0
|
||||||
|
;
|
||||||
|
lda #$00
|
||||||
|
sta TonesTbl+5*3+1
|
||||||
|
lda #$f4
|
||||||
|
sta TonesTbl+5*3+0
|
||||||
|
} else {
|
||||||
|
ldy #0*3
|
||||||
|
lda #$01
|
||||||
|
sta TonesTbl+0*3+1
|
||||||
|
lda #$e9
|
||||||
|
sta TonesTbl+0*3+0
|
||||||
|
;
|
||||||
|
lda #$00
|
||||||
|
sta TonesTbl+2*3+1
|
||||||
|
lda #$cd
|
||||||
|
sta TonesTbl+2*3+0
|
||||||
|
}
|
||||||
|
rts
|
||||||
|
|
||||||
|
;--------------------------------------
|
||||||
|
|
||||||
|
TonesTbl ; word freq, byte count
|
||||||
|
!if USE_AYDATA1 {
|
||||||
|
; even sets
|
||||||
|
!word $01e9
|
||||||
|
!byte 18
|
||||||
|
!word $0268
|
||||||
|
!byte 6
|
||||||
|
!word $ffff ; end
|
||||||
|
!byte $ff
|
||||||
|
|
||||||
|
TonesTblOdd
|
||||||
|
; odd sets
|
||||||
|
!word $00cd
|
||||||
|
!byte 6
|
||||||
|
!word $00d9
|
||||||
|
!byte 12
|
||||||
|
!word $00f4
|
||||||
|
!byte 6
|
||||||
|
!word $ffff ; end
|
||||||
|
!byte $ff
|
||||||
|
} else {
|
||||||
|
; even sets
|
||||||
|
!word $01e9
|
||||||
|
!byte 1
|
||||||
|
!word $ffff ; end
|
||||||
|
!byte $ff
|
||||||
|
|
||||||
|
TonesTblOdd
|
||||||
|
; odd sets
|
||||||
|
!word $00cd
|
||||||
|
!byte 1
|
||||||
|
!word $ffff ; end
|
||||||
|
!byte $ff
|
||||||
|
}
|
||||||
|
|
||||||
|
;--------------------------------------
|
||||||
|
|
||||||
|
AYData1
|
||||||
|
; A-period C-period Ena BVol Envelope
|
||||||
|
; B-period Noise AVol CVol
|
||||||
|
; Cybernoid AY-regs generated by AppleII Cybernoid (so has Mockingboard tone freqs)
|
||||||
|
; . loop around 1st noisy section
|
||||||
|
!byte $E9,$01,$00,$00,$00,$00,$2F,$3E,$0D,$00,$00,$64,$00,$0A
|
||||||
|
!byte $CD,$00,$00,$00,$00,$00,$2F,$3E,$0C,$00,$00,$64,$00,$0A
|
||||||
|
!byte $E9,$01,$00,$00,$00,$00,$2F,$3E,$0B,$00,$00,$64,$00,$0A
|
||||||
|
!byte $CD,$00,$00,$00,$00,$00,$2F,$3E,$0A,$00,$00,$64,$00,$0A
|
||||||
|
!byte $E9,$01,$00,$00,$00,$00,$2F,$3E,$09,$00,$00,$64,$00,$0A
|
||||||
|
!byte $CD,$00,$00,$00,$00,$00,$2F,$3E,$00,$00,$00,$64,$00,$0A
|
||||||
|
!byte $E9,$01,$00,$00,$00,$00,$2F,$3E,$0D,$00,$00,$64,$00,$0A
|
||||||
|
!byte $CD,$00,$00,$00,$00,$00,$2F,$3E,$0C,$00,$00,$64,$00,$0A
|
||||||
|
!byte $E9,$01,$00,$00,$00,$00,$2F,$3E,$0B,$00,$00,$64,$00,$0A
|
||||||
|
!byte $CD,$00,$00,$00,$00,$00,$2F,$3E,$0A,$00,$00,$64,$00,$0A
|
||||||
|
!byte $E9,$01,$00,$00,$00,$00,$2F,$3E,$09,$00,$00,$64,$00,$0A
|
||||||
|
!byte $CD,$00,$00,$00,$00,$00,$2F,$3E,$00,$00,$00,$64,$00,$0A
|
||||||
|
!byte $E9,$01,$00,$00,$00,$00,$2F,$3E,$0D,$00,$00,$64,$00,$0A
|
||||||
|
!byte $D9,$00,$00,$00,$00,$00,$2F,$3E,$0C,$00,$00,$64,$00,$0A
|
||||||
|
!byte $E9,$01,$00,$00,$00,$00,$2F,$3E,$0B,$00,$00,$64,$00,$0A
|
||||||
|
!byte $D9,$00,$00,$00,$00,$00,$2F,$3E,$0A,$00,$00,$64,$00,$0A
|
||||||
|
!byte $E9,$01,$00,$00,$00,$00,$2F,$3E,$09,$00,$00,$64,$00,$0A
|
||||||
|
!byte $D9,$00,$00,$00,$00,$00,$2F,$3E,$00,$00,$00,$64,$00,$0A
|
||||||
|
!byte $E9,$01,$00,$00,$00,$00,$2F,$3E,$0D,$00,$00,$64,$00,$0A
|
||||||
|
!byte $D9,$00,$00,$00,$00,$00,$2F,$3E,$0C,$00,$00,$64,$00,$0A
|
||||||
|
!byte $E9,$01,$00,$00,$00,$00,$2F,$3E,$0B,$00,$00,$64,$00,$0A
|
||||||
|
!byte $D9,$00,$00,$00,$00,$00,$2F,$3E,$0A,$00,$00,$64,$00,$0A
|
||||||
|
!byte $E9,$01,$00,$00,$00,$00,$2F,$3E,$09,$00,$00,$64,$00,$0A
|
||||||
|
!byte $D9,$00,$00,$00,$00,$00,$2F,$3E,$00,$00,$00,$64,$00,$0A
|
||||||
|
!byte $E9,$01,$00,$00,$00,$00,$2F,$3E,$0D,$00,$00,$64,$00,$0A
|
||||||
|
!byte $D9,$00,$00,$00,$00,$00,$2F,$3E,$0C,$00,$00,$64,$00,$0A
|
||||||
|
!byte $E9,$01,$00,$00,$00,$00,$2F,$3E,$0B,$00,$00,$64,$00,$0A
|
||||||
|
!byte $D9,$00,$00,$00,$00,$00,$2F,$3E,$0A,$00,$00,$64,$00,$0A
|
||||||
|
!byte $E9,$01,$00,$00,$00,$00,$2F,$3E,$09,$00,$00,$64,$00,$0A
|
||||||
|
!byte $D9,$00,$00,$00,$00,$00,$2F,$3E,$00,$00,$00,$64,$00,$0A
|
||||||
|
!byte $E9,$01,$00,$00,$00,$00,$2F,$3E,$0D,$00,$00,$64,$00,$0A
|
||||||
|
!byte $D9,$00,$00,$00,$00,$00,$2F,$3E,$0C,$00,$00,$64,$00,$0A
|
||||||
|
!byte $E9,$01,$00,$00,$00,$00,$2F,$3E,$0B,$00,$00,$64,$00,$0A
|
||||||
|
!byte $D9,$00,$00,$00,$00,$00,$2F,$3E,$0A,$00,$00,$64,$00,$0A
|
||||||
|
!byte $E9,$01,$00,$00,$00,$00,$2F,$3E,$09,$00,$00,$64,$00,$0A
|
||||||
|
!byte $D9,$00,$00,$00,$00,$00,$2F,$3E,$00,$00,$00,$64,$00,$0A
|
||||||
|
!byte $68,$02,$00,$00,$00,$00,$2F,$3E,$0D,$00,$00,$64,$00,$0A
|
||||||
|
!byte $F4,$00,$00,$00,$00,$00,$2F,$3E,$0C,$00,$00,$64,$00,$0A
|
||||||
|
!byte $68,$02,$00,$00,$00,$00,$2F,$3E,$0B,$00,$00,$64,$00,$0A
|
||||||
|
!byte $F4,$00,$00,$00,$00,$00,$2F,$3E,$0A,$00,$00,$64,$00,$0A
|
||||||
|
!byte $68,$02,$00,$00,$00,$00,$2F,$3E,$09,$00,$00,$64,$00,$0A
|
||||||
|
!byte $F4,$00,$00,$00,$00,$00,$2F,$3E,$00,$00,$00,$64,$00,$0A
|
||||||
|
!byte $68,$02,$00,$00,$00,$00,$2F,$3E,$0D,$00,$00,$64,$00,$0A
|
||||||
|
!byte $F4,$00,$00,$00,$00,$00,$2F,$3E,$0C,$00,$00,$64,$00,$0A
|
||||||
|
!byte $68,$02,$00,$00,$00,$00,$2F,$3E,$0B,$00,$00,$64,$00,$0A
|
||||||
|
!byte $F4,$00,$00,$00,$00,$00,$2F,$3E,$0A,$00,$00,$64,$00,$0A
|
||||||
|
!byte $68,$02,$00,$00,$00,$00,$2F,$3E,$09,$00,$00,$64,$00,$0A
|
||||||
|
!byte $F4,$00,$00,$00,$00,$00,$2F,$3E,$00,$00,$00,$64,$00,$0A
|
||||||
|
!byte $ff,$ff
|
||||||
|
|
||||||
|
AYData2 ; just freq modulation (no amplitude modulation)
|
||||||
|
!byte $E9,$01,$00,$00,$00,$00,$2F,$3E,$0D,$00,$00,$64,$00,$0A
|
||||||
|
!byte $CD,$00,$00,$00,$00,$00,$2F,$3E,$0D,$00,$00,$64,$00,$0A
|
||||||
|
!byte $ff,$ff
|
2
CybernoidTest2/build.bat
Normal file
2
CybernoidTest2/build.bat
Normal file
@ -0,0 +1,2 @@
|
|||||||
|
acme.exe CybernoidTest2.a
|
||||||
|
copy CybernoidTest2.labels %APPLEWIN_DBG%\A2_USER1.sym
|
3
CybernoidTest2/debug.txt
Normal file
3
CybernoidTest2/debug.txt
Normal file
@ -0,0 +1,3 @@
|
|||||||
|
// PWD: <root>\AY-Z80\CybernoidTest2
|
||||||
|
// run "debug.txt"
|
||||||
|
bload "CybernoidTest2",4000
|
25
README.md
25
README.md
@ -8,25 +8,22 @@ So as a little R&D proj, I thought I'd convert Dave Rogers' Spectrum
|
|||||||
128 Cybernoid routine (written in 1988).
|
128 Cybernoid routine (written in 1988).
|
||||||
|
|
||||||
Here's a summary of how I did it:
|
Here's a summary of how I did it:
|
||||||
. I got cybernoid.ay from
|
- I got cybernoid.ay from [here](http://www.worldofspectrum.org/projectay/gdmusic.htm)
|
||||||
http://www.worldofspectrum.org/projectay/gdmusic.htm
|
- Split it into bin's with AYSplitR
|
||||||
. Split it into bin's with AYSplitR
|
- Disassembled with Inkland's dz80w [here](http://www.inkland.org.uk/dz80/index.htm)
|
||||||
. Disassembled with Inkland's dz80w (http://www.inkland.org.uk/dz80/index.htm)
|
- I wrote 6502 macros to replace the z80 opcodes
|
||||||
. I wrote 6502 macros to replace the z80 opcodes
|
- For cybernoid, I hand converted the z80 code to 6502 (using the macros)
|
||||||
. For cybernoid, I hand converted the z80 code to 6502 (using the
|
- I added a few extension to AppleWin's debugger to help debug the 6502 code (ACME symbol loading & ZP pointer support).
|
||||||
macros)
|
|
||||||
. I added a few extension to AppleWin's debugger to help debug the 6502
|
|
||||||
code (ACME symbol loading & ZP pointer support).
|
|
||||||
|
|
||||||
I use Skyfox's MB detection routine.
|
I use Skyfox's MB detection routine.
|
||||||
|
|
||||||
The Z80 regs are emulated with zero-page memory locations $F0..$F8
|
The Z80 regs are emulated with zero-page memory locations $F0..$F8
|
||||||
The playback routine is very inefficient, as it:
|
The playback routine is very inefficient, as it:
|
||||||
. saves the ZP memory
|
- saves the ZP memory
|
||||||
. restores the Z80 regs
|
- restores the Z80 regs
|
||||||
. runs the IRQ handler
|
- runs the IRQ handler
|
||||||
. saves the Z80 regs
|
- saves the Z80 regs
|
||||||
. restores the ZP memory
|
- restores the ZP memory
|
||||||
|
|
||||||
This allows playback to work simultaneously with Applesoft & ProDOS. If
|
This allows playback to work simultaneously with Applesoft & ProDOS. If
|
||||||
DOS3.3 doesn't disable IRQs around disk I/O, then it won't work on a
|
DOS3.3 doesn't disable IRQs around disk I/O, then it won't work on a
|
||||||
|
Reference in New Issue
Block a user