mirror of
https://github.com/tomcw/Cybernoid.git
synced 2024-05-28 10:41:30 +00:00
Compare commits
18 Commits
Author | SHA1 | Date | |
---|---|---|---|
|
0c58998e02 | ||
|
6622164bac | ||
|
d84745262f | ||
|
25a3efc4ff | ||
|
0378adc3b1 | ||
|
ee44c17b8a | ||
|
94b58b49d5 | ||
|
57b5ea265a | ||
|
7218584326 | ||
|
d22d64473c | ||
|
3d223a3134 | ||
|
9ef98da9bf | ||
|
8e100ae88a | ||
|
581c02e7dd | ||
|
09d885c8e4 | ||
|
95255e1e4f | ||
|
bf40c52a25 | ||
|
4f462151d3 |
|
@ -1,6 +1,7 @@
|
|||
|
||||
SPECTRUM128_STEREO = 1 ; L = A+Bx0.5, R = C'+B'x0.5
|
||||
DUAL_MONO = 0 ; L = A+B+C, R=A'+B'+C'
|
||||
USE_PHASOR = 1
|
||||
|
||||
|
||||
!macro MB_Init1 .RegSongNum {
|
||||
|
@ -18,7 +19,7 @@ nMaskB: !byte 0 ; Voice-B mask (0=enable)
|
|||
nMaskC: !byte 0 ; Voice-C mask (0=enable)
|
||||
;
|
||||
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
|
||||
;
|
||||
pAYRegValues: !word AYRegValues ; For VU-meter
|
||||
|
@ -43,7 +44,7 @@ SongNumOK:
|
|||
; . Saving ZPBlock
|
||||
|
||||
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:
|
||||
|
||||
|
@ -89,22 +90,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
|
||||
ldy #SY6522_DDRB
|
||||
}
|
||||
ldy #SY6522_DDRB+SY6522_A_PH_BASE
|
||||
sta (MBBase),y
|
||||
ldy #SY6522_DDRB+$80
|
||||
ldy #SY6522_DDRB+SY6522_B_BASE
|
||||
sta (MBBase),y
|
||||
|
||||
lda #$ff
|
||||
ldy #SY6522_DDRA
|
||||
ldy #SY6522_DDRA+SY6522_A_PH_BASE
|
||||
sta (MBBase),y
|
||||
ldy #SY6522_DDRA+$80
|
||||
ldy #SY6522_DDRA+SY6522_B_BASE
|
||||
sta (MBBase),y
|
||||
|
||||
lda #AY_RESET
|
||||
ldy #SY6522_ORB
|
||||
lda #AY_RESET ; Phasor chip-select b4:3=%00 (so select both AY's)
|
||||
ldy #SY6522_ORB+SY6522_A_PH_BASE
|
||||
sta (MBBase),y
|
||||
ldy #SY6522_ORB+$80
|
||||
ldy #SY6522_ORB+SY6522_B_BASE
|
||||
sta (MBBase),y
|
||||
|
||||
ldx nSongNum
|
||||
|
@ -127,23 +144,23 @@ NotFini:
|
|||
sta nFrameNum+2
|
||||
|
||||
; 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
|
||||
|
||||
lda #$e7
|
||||
ldy #SY6522_TIMER1L_COUNTER
|
||||
ldy #SY6522_TIMER1L_COUNTER+SY6522_A_PH_BASE
|
||||
sta (MBBase),y
|
||||
lda #$4f
|
||||
ldy #SY6522_TIMER1H_COUNTER
|
||||
ldy #SY6522_TIMER1H_COUNTER+SY6522_A_PH_BASE
|
||||
sta (MBBase),y
|
||||
|
||||
lda #1<<6
|
||||
ldy #SY6522_ACR
|
||||
ldy #SY6522_ACR+SY6522_A_PH_BASE
|
||||
sta (MBBase),y ; Free running timer
|
||||
|
||||
lda #1<<7 | 1<<6
|
||||
ldy #SY6522_IER
|
||||
ldy #SY6522_IER+SY6522_A_PH_BASE
|
||||
sta (MBBase),y ; Enable Timer1 IRQ
|
||||
|
||||
lda #<Interrupt ; ADDR_L
|
||||
|
@ -162,26 +179,31 @@ InitExit2:
|
|||
|
||||
;--------------------------------------
|
||||
|
||||
!macro SF_UpdateAY {
|
||||
!if USE_PHASOR {
|
||||
PHASOR_CS_MASK = %10000 ; Phasor: b4=1 (don't select), b3=0 (select)
|
||||
} else {
|
||||
PHASOR_CS_MASK = 0
|
||||
}
|
||||
|
||||
; Skyfox's routine to update AY regs:
|
||||
!macro SF_UpdateAY {
|
||||
|
||||
SF_SelectReg:
|
||||
MBx1: sta CARD_BASE+SY6522_ORA,x
|
||||
lda #AY_LATCH
|
||||
lda #AY_LATCH | PHASOR_CS_MASK
|
||||
bne .l675e
|
||||
|
||||
SF_WriteReg:
|
||||
MBx2: sta CARD_BASE+SY6522_ORA,x
|
||||
lda #AY_WRITE
|
||||
lda #AY_WRITE | PHASOR_CS_MASK
|
||||
bne .l675e
|
||||
|
||||
SF_ChipReset:
|
||||
lda #AY_RESET
|
||||
lda #AY_RESET | PHASOR_CS_MASK
|
||||
|
||||
.l675e:
|
||||
MBx3: sta CARD_BASE+SY6522_ORB,x
|
||||
lda #AY_INACTIVE
|
||||
lda #AY_INACTIVE | PHASOR_CS_MASK
|
||||
MBx4: sta CARD_BASE+SY6522_ORB,x
|
||||
rts
|
||||
}
|
||||
|
@ -238,6 +260,9 @@ AYPostProc:
|
|||
;
|
||||
; 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
|
||||
sec
|
||||
sbc nAttA
|
||||
|
@ -245,10 +270,14 @@ AYPostProc:
|
|||
lda #0
|
||||
.ay_set_a_vol
|
||||
sta .ay0_regs+AY_AVOL
|
||||
+
|
||||
|
||||
;
|
||||
; 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
|
||||
sec
|
||||
sbc nAttB
|
||||
|
@ -257,10 +286,14 @@ AYPostProc:
|
|||
.ay_set_b_vol
|
||||
sta .ay0_regs+AY_BVOL
|
||||
sta .ay1_regs+AY_BVOL
|
||||
+
|
||||
|
||||
;
|
||||
; 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
|
||||
sec
|
||||
sbc nAttC
|
||||
|
@ -268,6 +301,7 @@ AYPostProc:
|
|||
lda #0
|
||||
.ay_set_c_vol
|
||||
sta .ay1_regs+AY_CVOL
|
||||
+
|
||||
|
||||
;
|
||||
; User disable A/B/C
|
||||
|
@ -311,7 +345,7 @@ AYPostProc:
|
|||
|
||||
;
|
||||
|
||||
ldx #0
|
||||
ldx #SY6522_A_PH_BASE ; Works for both MB & Phasor modes
|
||||
ldy #$0D
|
||||
.sf_loop0: tya
|
||||
jsr SF_SelectReg
|
||||
|
@ -322,7 +356,7 @@ AYPostProc:
|
|||
|
||||
;
|
||||
|
||||
ldx #$80
|
||||
ldx #SY6522_B_BASE
|
||||
ldy #$0D
|
||||
.sf_loop1: tya
|
||||
jsr SF_SelectReg
|
||||
|
@ -373,24 +407,24 @@ AYPostProc:
|
|||
|
||||
.ay_loop:
|
||||
; 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
|
||||
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
|
||||
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
|
||||
|
||||
; Write AY reg
|
||||
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
|
||||
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
|
||||
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
|
||||
|
||||
dey
|
||||
|
@ -428,7 +462,7 @@ MB6b: sta CARD_BASE+SY6522_ORB+$80
|
|||
|
||||
lda #1<<6
|
||||
MB7:
|
||||
sta CARD_BASE+SY6522_IFR ; Clear Timer1 IRQ flag
|
||||
sta CARD_BASE+SY6522_IFR+SY6522_A_PH_BASE ; Clear Timer1 IRQ flag
|
||||
|
||||
pla
|
||||
tay
|
||||
|
|
|
@ -2,6 +2,10 @@
|
|||
|
||||
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_ORA = 1
|
||||
SY6522_DDRB = 2
|
||||
|
@ -29,6 +33,9 @@ AY_EFINE = 11
|
|||
AY_ECOARSE = 12
|
||||
AY_ESHAPE = 13
|
||||
|
||||
AY_NOISE_MASK = $1f ; valid bits of AY_NOISEPER
|
||||
AY_AMPLITUDE_MODE = $10 ; b4 of AY_xVOL (0=fixed, 1=envelope)
|
||||
|
||||
AY_ENA_A = %110110 ; Enable A (Noise & Tone)
|
||||
AY_ENA_B = %101101 ; Enable B (Noise & Tone)
|
||||
AY_ENA_C = %011011 ; Enable C (Noise & Tone)
|
||||
|
@ -42,4 +49,9 @@ AY_RESET = 0
|
|||
AY_INACTIVE = 4
|
||||
AY_READ = 5
|
||||
AY_WRITE = 6
|
||||
AY_LATCH = 7
|
||||
AY_LATCH = 7
|
||||
|
||||
; Phasor mode
|
||||
PH_MOCKINGBOARD = 8
|
||||
PH_PHASOR = $D
|
||||
PH_ECHOPLUS = $F
|
||||
|
|
|
@ -415,7 +415,7 @@ lf0f3: ; Cmd_F0
|
|||
|
||||
;--------------------------------------
|
||||
|
||||
lf492 = lf40a + ($f492-$f40a)
|
||||
lf492 = $28b2
|
||||
|
||||
lf0f9: ; Cmd_E2
|
||||
; Pseudo random number generator
|
||||
|
@ -459,7 +459,7 @@ lf0f9_SMC_h:
|
|||
lf111: ; Cmd_E3
|
||||
|
||||
lf111_SMC:
|
||||
lda #$05
|
||||
lda #$2a
|
||||
sta RegA
|
||||
|
||||
;--------------------------------------
|
||||
|
@ -545,7 +545,7 @@ lf116: ; Cmd_00
|
|||
bne lf156
|
||||
|
||||
; ld hl,(0f212h)
|
||||
+LDW_INDIRECT RegHL, lf1f6 ; HL = A-freq
|
||||
+LDW_INDIRECT RegHL, lf212
|
||||
|
||||
; ld (0f20ah),hl
|
||||
+LDW_INDIRECT lf20a, RegHL
|
||||
|
@ -734,7 +734,7 @@ lf1b1:
|
|||
jsr lf1c9
|
||||
|
||||
; ld hl,0f1fch
|
||||
+LDW RegHL, lf1fc
|
||||
+LDW RegHL, lf1fc ; lf1fc = AYRegValues.NOISEPER
|
||||
|
||||
; ld a,(hl)
|
||||
+LD_REG_INDIRECT RegA, RegHL
|
||||
|
@ -758,13 +758,13 @@ lf1b1:
|
|||
+RET_C
|
||||
|
||||
; inc hl
|
||||
+INCW RegHL
|
||||
+INCW RegHL ; lf1fd = AYRegValues.ENABLE
|
||||
|
||||
; ld a,(hl)
|
||||
+LD_REG_INDIRECT RegA, RegHL
|
||||
|
||||
; or 38h
|
||||
ora #$38
|
||||
ora #$38 ; ENABLE |= 0x38 (disable noise CBA)
|
||||
sta RegA
|
||||
|
||||
; ld (hl),a
|
||||
|
@ -791,8 +791,15 @@ lf1c9:
|
|||
; inc (hl)
|
||||
+INC_INDIRECT RegHL
|
||||
|
||||
lda RegD ; $00nn?
|
||||
bne +
|
||||
lda #$f3 ; 48K ROM $0000
|
||||
sta RegA
|
||||
bne ++ ; branch always
|
||||
+
|
||||
; ld a,(de)
|
||||
+LD_REG_INDIRECT RegA, RegDE
|
||||
++
|
||||
|
||||
; sub (hl)
|
||||
+SUB_INDIRECT RegHL
|
||||
|
@ -813,8 +820,15 @@ lf1c9:
|
|||
; inc de
|
||||
+INCW RegDE
|
||||
|
||||
lda RegD ; $00nn?
|
||||
bne +
|
||||
lda #$af ; 48K ROM $0001
|
||||
sta RegA
|
||||
bne ++ ; branch always
|
||||
+
|
||||
; ld a,(de)
|
||||
+LD_REG_INDIRECT RegA, RegDE
|
||||
++
|
||||
|
||||
; ld c,a
|
||||
+LD RegC, RegA
|
||||
|
@ -828,8 +842,15 @@ lf1c9:
|
|||
; inc (hl)
|
||||
+INC_INDIRECT RegHL
|
||||
|
||||
lda RegD ; $00nn?
|
||||
bne +
|
||||
lda #$11 ; 48K ROM $0002
|
||||
sta RegA
|
||||
bne ++ ; branch always
|
||||
+
|
||||
; ld a,(de)
|
||||
+LD_REG_INDIRECT RegA, RegDE
|
||||
++
|
||||
|
||||
; sub (hl)
|
||||
+SUB_INDIRECT RegHL
|
||||
|
@ -902,11 +923,11 @@ SF_Detect:
|
|||
ldx #7
|
||||
|
||||
.SlotNext:
|
||||
ldy #$00+SY6522_TIMER1L_COUNTER
|
||||
ldy #SY6522_TIMER1L_COUNTER+SY6522_A_PH_BASE
|
||||
jsr SF_GetTimerL
|
||||
bne .SlotLoop
|
||||
|
||||
ldy #$80+SY6522_TIMER1L_COUNTER
|
||||
ldy #SY6522_TIMER1L_COUNTER+SY6522_B_BASE
|
||||
jsr SF_GetTimerL
|
||||
beq .SlotDone
|
||||
|
||||
|
@ -961,63 +982,67 @@ SongTbl: !byte 01 ; 0: (AY: Title/In-game)
|
|||
|
||||
; AY regs [0..$D]
|
||||
AYRegValues:
|
||||
lf1f6: !word 0 ; A period
|
||||
lf1f6: !word $01a8 ; A period
|
||||
lf1f8: !word 0 ; B period
|
||||
lf1fa: !word 0 ; C period
|
||||
lf1fc: !byte 0 ; Noise period
|
||||
lf1fd: !byte 0 ; Enable
|
||||
lf1fc: !byte $2f ; Noise period
|
||||
lf1fd: !byte $3f ; Enable
|
||||
lf1fe: !byte 0 ; A volume
|
||||
lf1ff: !byte 0 ; B volume
|
||||
lf200: !byte 0 ; C volume
|
||||
lf201: !word 0 ; Envelope period
|
||||
lf203: !byte 0 ; Envelope shape
|
||||
lf201: !word $0064 ; Envelope period (not used)
|
||||
lf203: !byte $0a ; Envelope shape (not used)
|
||||
|
||||
;--------------------------------------
|
||||
|
||||
lf204: !word 0 ; Tone period
|
||||
lf206: !word 0
|
||||
!word 0
|
||||
lf206: !word $014a
|
||||
!word $000a
|
||||
|
||||
;--------------------------------------
|
||||
|
||||
lf20a: !word 0
|
||||
!word $0004
|
||||
!word 0
|
||||
!word 0
|
||||
!word 0
|
||||
!word $0012
|
||||
|
||||
lf212: !word 0
|
||||
|
||||
;--------------------------------------
|
||||
|
||||
!macro MUSIC_DATA_ADDR .addr {
|
||||
!word lf40a + (.addr - $f40a)
|
||||
}
|
||||
|
||||
; Voice-A struct
|
||||
|
||||
lf214: !byte 0
|
||||
!byte 2
|
||||
!byte 0
|
||||
!byte 0
|
||||
!byte 0
|
||||
!word 0
|
||||
!word 0
|
||||
+MUSIC_DATA_ADDR $f41b
|
||||
+MUSIC_DATA_ADDR $f471
|
||||
!byte 0
|
||||
!byte 0
|
||||
!byte 0
|
||||
!byte 0
|
||||
!word 0
|
||||
!word 0
|
||||
+MUSIC_DATA_ADDR $f418
|
||||
+MUSIC_DATA_ADDR $f471
|
||||
lf224: !byte 0
|
||||
!byte 0
|
||||
!word 0
|
||||
!word 0
|
||||
!word 0
|
||||
!byte 0
|
||||
!byte $0a
|
||||
+MUSIC_DATA_ADDR $f65e
|
||||
+MUSIC_DATA_ADDR $f575
|
||||
+MUSIC_DATA_ADDR $f56f
|
||||
!byte 7
|
||||
!byte 0
|
||||
!byte $08 ; 001000 - Disable A (Noise)
|
||||
!byte $36 ; 110110 - Enable A (Noise & Tone)
|
||||
!word lf1fe ; &VolA
|
||||
!byte $12
|
||||
!byte 0
|
||||
!byte 0
|
||||
!byte 0
|
||||
!byte 0
|
||||
!byte 0
|
||||
!byte $10
|
||||
!byte $29
|
||||
!byte 1
|
||||
|
||||
;--------------------------------------
|
||||
|
||||
|
@ -1086,7 +1111,8 @@ lf26a: !byte 0
|
|||
;--------------------------------------
|
||||
|
||||
;lf27d:
|
||||
!fill 17,0 ; ?
|
||||
!byte $2a
|
||||
!fill 16,0 ; ?
|
||||
|
||||
;--------------------------------------
|
||||
|
||||
|
@ -1101,7 +1127,9 @@ lf28e:
|
|||
; . Envelopes are not used, so no E-Periods to convert
|
||||
|
||||
!macro ZX2MB .period {
|
||||
!word .period*10227/17734
|
||||
; !word .period*10227/17734 ; Mockingboard 1MHz ((NTSC:14.3181818e6 / 14) / 100)
|
||||
!word .period*20358/17734 ; Phasor 2MHz ((PAL:14.25045e6 / 7) / 100)
|
||||
; !word .period
|
||||
}
|
||||
|
||||
+ZX2MB $0000
|
||||
|
|
|
@ -1,4 +1,2 @@
|
|||
D:\Apple][\acme085\acme.exe cybernoid.a
|
||||
D:\Apple][\InsertBIN2AWS\debug\InsertBIN2AWS.exe cybernoid 6000 cybernoid.aws
|
||||
java -jar "D:\Apple][\Apple Commander\ac\AppleCommander-1.3.3.9-ac.jar" -d cybernoid ..\ReleaseDSK\Cybernoid.dsk
|
||||
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 cybernoid.a
|
||||
copy cybernoid.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).
|
||||
|
||||
Here's a summary of how I did it:
|
||||
. I got cybernoid.ay from
|
||||
http://www.worldofspectrum.org/projectay/gdmusic.htm
|
||||
. Split it into bin's with AYSplitR
|
||||
. Disassembled with Inkland's dz80w (http://www.inkland.org.uk/dz80/index.htm)
|
||||
. I wrote 6502 macros to replace the z80 opcodes
|
||||
. For cybernoid, I hand converted the z80 code to 6502 (using the
|
||||
macros)
|
||||
. I added a few extension to AppleWin's debugger to help debug the 6502
|
||||
code (ACME symbol loading & ZP pointer support).
|
||||
- I got cybernoid.ay from [here](http://www.worldofspectrum.org/projectay/gdmusic.htm)
|
||||
- Split it into bin's with AYSplitR
|
||||
- Disassembled with Inkland's dz80w [here](http://www.inkland.org.uk/dz80/index.htm)
|
||||
- I wrote 6502 macros to replace the z80 opcodes
|
||||
- For cybernoid, I hand converted the z80 code to 6502 (using the 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.
|
||||
|
||||
The Z80 regs are emulated with zero-page memory locations $F0..$F8
|
||||
The playback routine is very inefficient, as it:
|
||||
. saves the ZP memory
|
||||
. restores the Z80 regs
|
||||
. runs the IRQ handler
|
||||
. saves the Z80 regs
|
||||
. restores the ZP memory
|
||||
- saves the ZP memory
|
||||
- restores the Z80 regs
|
||||
- runs the IRQ handler
|
||||
- saves the Z80 regs
|
||||
- restores the ZP memory
|
||||
|
||||
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
|
||||
|
|
Loading…
Reference in New Issue
Block a user