Cybernoid/CybernoidTest2/CybernoidTest2.a
tomcw 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

788 lines
13 KiB
Plaintext

;ACME 0.96.4
!cpu 6502 ; Compatible with all Apple2's
!to "CybernoidTest2", plain
!sl "CybernoidTest2.labels"
*=$4000
AY_UPDATE_OLD = 0
;------------------------------------------------------------------------------
!source "..\Common\AppleDefs.a"
!source "..\Common\MockingboardDefs.a"
!source "..\Common\MB-Macros.a"
;------------------------------------------------------------------------------
pTonesTbl = $fa
TmpL = $fc ; alias with pAYData
pAYData = $fc
MBBase = $fe
MBBaseL = MBBase
MBBaseH = MBBase+1
!zone code
;--------------------------------------
Entrypoint:
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
!if AY_UPDATE_OLD {
stx MBx1+2
stx MBx2+2
stx MBx3+2
stx MBx4+2
} else {
stx MB1+2
stx MB2+2
stx MB3+2
stx MB4+2
stx MB5+2
stx MB6+2
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 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
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 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 AYData,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 AYData,y
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 -
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
;--------------------------------------
!if AY_UPDATE_OLD {
+SF_UpdateAY
} else {
SF_SelectReg ; Select AY reg
MB1 sta CARD_BASE+SY6522_ORA
ldx #AY_INACTIVE
lda #AY_LATCH
MB2 sta CARD_BASE+SY6522_ORB
MB3 stx CARD_BASE+SY6522_ORB ; Set INACTIVE
rts
SF_WriteReg ; Write AY reg
MB4 sta CARD_BASE+SY6522_ORA
ldx #AY_INACTIVE
lda #AY_WRITE
MB5 sta CARD_BASE+SY6522_ORB
MB6 stx CARD_BASE+SY6522_ORB ; Set INACTIVE
rts
}
;--------------------------------------
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
lda #<AYData
sta pAYData+0
lda #>AYData
sta pAYData+1
rts
;------------------------------------------------------------------------------
!zone data
nMBBaseHi !byte 0
AYDataDoneFlag !byte 0
nFrameNum !byte 0,0,0 ; Minute:Second:FrameNum (@ 50Hz)
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
lda #<(AYData+14)
sta pAYData+0
lda #>(AYData+14)
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
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
sec
rts
;--------------------------------------
TonesInc
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
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
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
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
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
;
rts
;--------------------------------------
TonesTbl ; word freq, byte count
; 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
;--------------------------------------
AYData
; 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
AYDataReset
!byte $00,$00,$00,$00,$00,$00,$00,$3F,$00,$00,$00,$00,$00,$00 ; Set all channels off