Compare commits

20 Commits
v5 ... master

Author SHA1 Message Date
ffef8a91ef Build both Cybernoid2 (for MB) and Cybernoid2.PH (for Phasor) 2024-09-30 21:21:29 +01:00
f3e394202f Build both Cybernoid (for MB) and Cybernoid.PH (for Phasor) 2024-09-30 21:02:01 +01:00
0c58998e02 Mask AY_NOISEPER (reg-6) with 0x1F, as Cybernoid reg data has a value of 0x2F, which reads back at 0x0F on real hw 2021-01-17 21:47:04 +00:00
6622164bac Verify the AY writes by reading back the AY regs 2021-01-17 19:49:45 +00:00
d84745262f Support TAB to switch AY chip & revert to USE_AYDATA1=1 (tag:CYB-TEST2-D) 2021-01-03 17:08:33 +00:00
25a3efc4ff Added assembly-time USE_AYDATA1 define:
. USE_AYDATA1=0: use the Cybernoid noisy section of 48 AY-reg sets
  - keys (to change A-period): 1...5; Q...T
. USE_AYDATA1=1: use just 2 AY-reg sets
  - keys (to change A-period): 1,2; Q,W
2021-01-02 21:41:06 +00:00
0378adc3b1 Fixed typo in comment 2020-09-21 19:53:21 +01:00
ee44c17b8a Cybernoid Test 1
. Cybernoid AY-regs exported from FUSE (so Spectrum freqs)
. Cybernoid AY-regs generated by fixed 6502 code (so MB freqs)
. convert noise period from ZX to MB(1MHz)
. moved org from $6000 to $4000
2020-09-20 12:06:07 +01:00
94b58b49d5 Cybernoid Test 2
. Write AY regs from $D to $0 (like real Cybernoid)
. Write AY regs in pairs (eg. $1,$0) as optimally as possible
2020-09-20 12:03:05 +01:00
57b5ea265a Fixes for Cybernoid1:
. Ultimately switched from MB(1MHz clock) to Phasor(2MHz clock) for less noisy playback.
. Fixed a bug in Cmd_00 where HL was loaded with the wrong value.
. Fixed bugs where (DE) was referencing $00nn Spectrum ROM values.
. Fixed initial state to mirror the Cybernoid game (not the AY player binary).
2020-09-20 11:50:15 +01:00
7218584326 Use keys (1-5) & (Q-T) to inc/dec the 5 tone periods. 2020-09-19 23:51:20 +01:00
d22d64473c Trim all the unused AY-reg sets! 2020-09-19 21:51:32 +01:00
3d223a3134 Cybernoid Test 2:
. Continuous loop around noisy section
. SPACE to single-step the playback; RETURN to resume playback; ESC to quit
2020-09-19 21:30:22 +01:00
9ef98da9bf CybernoidTest: added comments for where noisy problem occurs
Cybernoid: Updated build.bat
Updated MB-Macros.a to not attenuate if amp.mode=envelope
. Nb. neither cybernoid1/2 use envelopes
2020-09-06 11:27:21 +01:00
8e100ae88a Reduce AY access times some more. 2020-09-06 10:53:50 +01:00
581c02e7dd Tried a version reducing AY WRITE time 2020-09-06 10:36:00 +01:00
09d885c8e4 Added CybernoidTest
. Simple array of 14xAY regs written each interrupt
. First few seconds of tune showing the problem
. SPACE to single-step the playback; RETURN to resume playback
2020-09-06 09:32:14 +01:00
95255e1e4f Update README.md: Fix links 2017-04-21 22:23:53 +01:00
bf40c52a25 Update README.md: Fix links 2017-04-21 22:23:28 +01:00
4f462151d3 Update README.md: Formatting 2017-04-21 22:21:14 +01:00
13 changed files with 3751 additions and 123 deletions

View File

@ -18,7 +18,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 +43,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 +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
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 +143,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 +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:
!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 +259,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 +269,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 +285,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 +300,7 @@ AYPostProc:
lda #0
.ay_set_c_vol
sta .ay1_regs+AY_CVOL
+
;
; 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
.sf_loop0: tya
jsr SF_SelectReg
@ -322,7 +355,7 @@ AYPostProc:
;
ldx #$80
ldx #SY6522_B_BASE
ldy #$0D
.sf_loop1: tya
jsr SF_SelectReg
@ -373,24 +406,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 +461,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

View File

@ -2,44 +2,124 @@
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_IRB = 0
SY6522_ORA = 1
SY6522_IRA = 1
SY6522_DDRB = 2
SY6522_DDRA = 3
SY6522_TIMER1L_COUNTER = 4
SY6522_TIMER1H_COUNTER = 5
SY6522_TIMER1L_LATCH = 6
SY6522_TIMER1H_LATCH = 7
SY6522_TIMER2L_COUNTER = 8
SY6522_TIMER2H_COUNTER = 9
SY6522_SR = $A
SY6522_ACR = $B
SY6522_PCR = $C
SY6522_IFR = $D
SY6522_IER = $E
AY_AFINE = 0
AY_ACOARSE = 1
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
ACR_ONESHOT = 0<<6
ACR_FREERUNNING = 1<<6
AY_ENA_A = %110110 ; Enable A (Noise & Tone)
AY_ENA_B = %101101 ; Enable B (Noise & Tone)
AY_ENA_C = %011011 ; Enable C (Noise & Tone)
IER_SET = 1<<7
IER_CLR = 0<<7
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_DIS_B = %010010 ; Disable B (Noise & Tone)
AY_DIS_C = %100100 ; Disable C (Noise & Tone)
AY_AFINE = 0 ; b7:0
AY_ACOARSE = 1 ; b3:0
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_RESET = 0
AY_INACTIVE = 4
AY_READ = 5
AY_WRITE = 6
AY_LATCH = 7
AY_NOISE_MASK = $1f ; valid bits of AY_NOISEPER
AY_AMPLITUDE_MODE = $10 ; b4 of AY_xVOL (0=fixed, 1=envelope)
AY_ENA_A = %00110110 ; Enable A (Noise & Tone)
AY_ENA_B = %00101101 ; Enable B (Noise & Tone)
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

View File

@ -1,17 +1,19 @@
;ACME 0.85
;ACME 0.97
!cpu 6502 ; Compatible with all Apple2's
!to "Cybernoid", plain
!to "CYBERNOID", plain
!sl "Cybernoid.labels"
*=$6000
;------------------------------------------------------------------------------
!source "..\Common\Z80-Macros.a"
!source "..\Common\ZP-Macros.a"
!source "..\Common\AppleDefs.a"
!source "..\Common\MockingboardDefs.a"
!source "..\Common\MB-Macros.a"
;USE_PHASOR = 0 ; defined on command line
!source "..\\Common\\Z80-Macros.a"
!source "..\\Common\\ZP-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
; Pseudo random number generator
@ -459,7 +461,7 @@ lf0f9_SMC_h:
lf111: ; Cmd_E3
lf111_SMC:
lda #$05
lda #$2a
sta RegA
;--------------------------------------
@ -545,7 +547,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 +736,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 +760,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 +793,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 +822,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 +844,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 +925,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 +984,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 +1113,8 @@ lf26a: !byte 0
;--------------------------------------
;lf27d:
!fill 17,0 ; ?
!byte $2a
!fill 16,0 ; ?
;--------------------------------------
@ -1101,7 +1129,12 @@ lf28e:
; . Envelopes are not used, so no E-Periods to convert
!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

View File

@ -1,4 +1,6 @@
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 -DUSE_PHASOR=1 cybernoid.a
@REM copy cybernoid.labels %APPLEWIN_DBG%\A2_USER1.sym
move /y CYBERNOID CYBERNOID.PH
acme.exe -DUSE_PHASOR=0 cybernoid.a
copy cybernoid.labels %APPLEWIN_DBG%\A2_USER1.sym

View File

@ -1,17 +1,19 @@
;ACME 0.85
!cpu 6502 ; Compatible with all Apple2's
!to "Cybernoid2", plain
!to "CYBERNOID2", plain
!sl "Cybernoid2.labels"
*=$6000
;------------------------------------------------------------------------------
!source "..\Common\Z80-Macros.a"
!source "..\Common\ZP-Macros.a"
!source "..\Common\AppleDefs.a"
!source "..\Common\MockingboardDefs.a"
!source "..\Common\MB-Macros.a"
;USE_PHASOR = 0 ; defined on command line
!source "..\\Common\\Z80-Macros.a"
!source "..\\Common\\ZP-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
!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

View File

@ -1,4 +1,6 @@
D:\Apple][\acme085\acme.exe cybernoid2.a
D:\Apple][\InsertBIN2AWS\debug\InsertBIN2AWS.exe cybernoid2 6000 cybernoid2.aws
java -jar "D:\Apple][\Apple Commander\ac\AppleCommander-1.3.3.9-ac.jar" -d cybernoid2 ..\ReleaseDSK\Cybernoid.dsk
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=1 cybernoid2.a
@REM copy cybernoid2.labels %APPLEWIN_DBG%\A2_USER1.sym
move /y CYBERNOID2 CYBERNOID2.PH
acme.exe -DUSE_PHASOR=0 cybernoid2.a
copy cybernoid2.labels %APPLEWIN_DBG%\A2_USER1.sym

2501
CybernoidTest/Cybernoid.a Normal file

File diff suppressed because it is too large Load Diff

2
CybernoidTest/build.bat Normal file
View File

@ -0,0 +1,2 @@
acme.exe cybernoid.a
copy cybernoid.labels %APPLEWIN_DBG%\A2_USER1.sym

3
CybernoidTest/debug.txt Normal file
View File

@ -0,0 +1,3 @@
// PWD: <root>\AY-Z80\Cybernoid
// run "debug.txt"
bload "cybernoid",4000

View 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
View File

@ -0,0 +1,2 @@
acme.exe CybernoidTest2.a
copy CybernoidTest2.labels %APPLEWIN_DBG%\A2_USER1.sym

3
CybernoidTest2/debug.txt Normal file
View File

@ -0,0 +1,3 @@
// PWD: <root>\AY-Z80\CybernoidTest2
// run "debug.txt"
bload "CybernoidTest2",4000

View File

@ -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