Skip to content

Instantly share code, notes, and snippets.

@djg
Created January 28, 2022 01:11
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save djg/395ffd5c0c6b0e8a35cd85cb756b9ea2 to your computer and use it in GitHub Desktop.
Save djg/395ffd5c0c6b0e8a35cd85cb756b9ea2 to your computer and use it in GitHub Desktop.
Gyruss 8039 ROM
;;; ----------------------------------------------------------------------------
;;;
;;; gyrussk.3a - Gyruss 8039 sound cpu2 rom
;;;
;;; If you ever wondered how the percussion samples are generated in the arcade
;;; version of Gyruss.
;;;
;;; Builds with SB-Cross Assembler 3.
;;;
;;; % sbasm audio2.asm
;;;
;;; Should produce one warning:
;;;
;;; *** Warning: Target program memory full
;;; 873 .NO $1000,$FF
;;;
;;; I've tried to working around the warning but the instructions at
;;; https://www.sbprojects.net/sbasm/8048.php on bank switching don't work to
;;; silence it.
;;;
;;; ----------------------------------------------------------------------------
.CR 8048
.TF audio2.rom,bin
.LF audio2.lst
.OR $000
_RESET:
jmp INIT
nop
_INTERRUPT:
jmp INT_HANDLER
nop
nop
_TIMER:
jmp TIMER_HANDLER
INIT:
;; start timer running
strt t
;; clear sample
mov a,#$00
outl p1,a
;;
mov a,#$00
outl p2,a
mov a,#$80
outl p2,a
;;
mov r2,#$00
en i
;; PLAY_SOUND(r2) - Sound to play is passed in r2
PLAY_SOUND_R2:
mov a,r2
jmp PLAY_SOUND
HALT:
nop
jmp HALT
INT_HANDLER:
movx a,@r0
mov r2,a
;;
mov a,#$00
outl p2,a
mov a,#$80
outl p2,a
;;
STACK_0 = $8
mov r0,#STACK_0
mov a,#PLAY_SOUND_R2
mov @r0,a
mov r0,#STACK_0+1
mov a,/PLAY_SOUND_R2
mov @r0,a ; Stack 0 : PLAY_SOUND_R2
mov a,#$09 ; A = %00001001
mov psw,a ; set SP to 1
retr ; goto LOC_016
JO_PLAY_SOUND:
.OT
.DB JT_PLAY_SOUND_0
.DB JT_PLAY_SOUND_1
.DB JT_PLAY_SOUND_2
.DB JT_PLAY_SOUND_3
.DB JT_PLAY_SOUND_4
.DB JT_PLAY_SOUND_5
.DB JT_PLAY_SOUND_6
.DB JT_PLAY_SOUND_7
.DB JT_PLAY_SOUND_8
.DB JT_PLAY_SOUND_9
.DB JT_PLAY_SOUND_A
.DB JT_PLAY_SOUND_B
.DB JT_PLAY_SOUND_C
.DB JT_PLAY_SOUND_D
.DB JT_PLAY_SOUND_E
.DB JT_PLAY_SOUND_F
JT_PLAY_SOUND_0:
jmp SOUND_OFF
JT_PLAY_SOUND_1:
jmp SOUND_1
JT_PLAY_SOUND_2:
jmp SOUND_2
JT_PLAY_SOUND_3:
jmp SOUND_3
JT_PLAY_SOUND_4:
jmp SOUND_4
JT_PLAY_SOUND_5:
jmp SOUND_5
JT_PLAY_SOUND_6:
jmp SOUND_6
JT_PLAY_SOUND_7:
jmp SOUND_7
JT_PLAY_SOUND_8:
jmp SOUND_OFF
JT_PLAY_SOUND_9:
jmp SOUND_OFF
JT_PLAY_SOUND_A:
jmp SOUND_OFF
JT_PLAY_SOUND_B:
jmp SOUND_OFF
JT_PLAY_SOUND_C:
jmp SOUND_OFF
JT_PLAY_SOUND_D:
jmp SOUND_OFF
JT_PLAY_SOUND_E:
jmp SOUND_OFF
JT_PLAY_SOUND_F:
jmp SOUND_OFF
;; PLAY_SOUND(a) - Play sound $0-$F
PLAY_SOUND:
anl a,#$0F
add a,#JO_PLAY_SOUND
jmpp @a
.CT
TIMER_HANDLER:
retr
;; Dead code
mov a,t
add a,r2
mov t,a
anl a,r0
movp a,@a
retr
;; Dead code
;; NOISE_R3(r6=off) - Return random value
;; *[(timer + r6) & $3F]
NOISE_R3:
mov a,t
add a,r6
mov t,a
anl a,#$3F
movp a,@a
mov r3,a
retr
;; NOISE_A(r2=off) - Return random value
;; *[(timer + r2) & $3F]
NOISE_A:
mov a,t
add a,r2
mov t,a
anl a,#$3F
movp a,@a
retr
SOUND_OFF:
mov a,#$00
outl p1,a
jmp HALT
SOUND_1:
mov r4,#$15 ; dinit - delay initializer
mov r5,#$15 ; delay - 2*delay cycle delay for each sample
mov r6,#$00 ; vptr - voice pointer (curr idx into sample)
mov r7,#$10 ; bv - base voice
mov r2,#$01 ; lcurr - current loop count
mov r3,#$01 ; linit - loop initializer
.loop:
call VOICE_OUT ; jump table (r7=$10) -> jmp $2A2
;; r4 += $20
mov a,r4
add a,#$20
mov r4,a
mov r5,a
;;
djnz r2,.loop
;; lcurr = linit
mov a,r3
mov r2,a
;; bvx += 1
mov a,r7
inc a
mov r7,a
;;
anl a,#$01
jz HALT
jmp .loop
SOUND_2:
mov r4,#$20
mov r5,#$20
mov r6,#$00
mov r7,#$00
mov r2,#$02
mov r3,#$02
mov r1,#$02
mov r0,#$20
.l1:
call VOICE_OUT ; jump table (r7=$00) -> goto $200
mov a,r4
add a,#$10
mov r4,a
mov r5,a
djnz r2,.l1
mov a,r3
mov r2,a
mov a,r0
add a,#$04
mov r0,a
mov r4,a
mov r5,a
djnz r1,.l1
mov r1,#$02
mov a,r7
inc a
anl a,#$07
mov r7,a ; r7 = (r7 + 1) & 0x7
jz HALT
jmp .l1
SOUND_3:
mov r4,#$0A
mov r5,#$0A
mov r6,#$00
mov r7,#$00
mov r2,#$02
mov r3,#$02
mov r1,#$02
mov r0,#$0A
.l1:
call VOICE_OUT ; jump table (r7=$00) -> jmp $200
mov a,r4
add a,#$10
mov r4,a
mov r5,a
djnz r2,.l1
mov a,r3
mov r2,a
mov a,r0
add a,#$01
mov r0,a
mov r4,a
mov r5,a
djnz r1,.l1
mov r1,#$02
mov a,r7
inc a
anl a,#$07
mov r7,a ; r7 = (r7 + 1) & 0x7
jz HALT
jmp .l1
.NO $100,$FF
.OT
JO_VOICE:
.DB JT_VOICE_00
.DB JT_VOICE_01
.DB JT_VOICE_02
.DB JT_VOICE_03
.DB JT_VOICE_04
.DB JT_VOICE_05
.DB JT_VOICE_06
.DB JT_VOICE_07
.DB JT_VOICE_08
.DB JT_VOICE_09
.DB JT_VOICE_0A
.DB JT_VOICE_0B
.DB JT_VOICE_0C
.DB JT_VOICE_0D
.DB JT_VOICE_0E
.DB JT_VOICE_0F
.DB JT_VOICE_10
.DB JT_VOICE_11
.DB JT_VOICE_12
.DB JT_VOICE_13
.DB JT_VOICE_14
.DB JT_VOICE_15
.DB JT_VOICE_16
.DB JT_VOICE_17
.DB JT_VOICE_18
.DB JT_VOICE_19
.DB JT_VOICE_1A
.DB JT_VOICE_1B
.DB JT_VOICE_1C
.DB JT_VOICE_1D
.DB JT_VOICE_1E
.DB JT_VOICE_1F
.DB JT_VOICE_20
.DB JT_VOICE_21
.DB JT_VOICE_22
.DB JT_VOICE_23
.DB JT_VOICE_24
.DB JT_VOICE_25
.DB JT_VOICE_26
.DB JT_VOICE_27
.DB JT_VOICE_28
.DB JT_VOICE_29
.DB JT_VOICE_2A
.DB JT_VOICE_2B
.DB JT_VOICE_2C
.DB JT_VOICE_2D
.DB JT_VOICE_2E
.DB JT_VOICE_2F
JT_VOICE_00:
jmp LOC_200
JT_VOICE_01:
jmp LOC_216
JT_VOICE_02:
jmp LOC_22A
JT_VOICE_03:
jmp LOC_23E
JT_VOICE_04:
jmp LOC_252
JT_VOICE_05:
jmp LOC_266
JT_VOICE_06:
jmp LOC_27A
JT_VOICE_07:
jmp LOC_28E
JT_VOICE_08:
jmp LOC_39D
JT_VOICE_09:
jmp LOC_3BA
JT_VOICE_0A:
jmp LOC_3D4
JT_VOICE_0B:
jmp LOC_400
JT_VOICE_0C:
jmp LOC_41D
JT_VOICE_0D:
jmp LOC_437
JT_VOICE_0E:
jmp LOC_451
JT_VOICE_0F:
jmp LOC_46B
JT_VOICE_10:
jmp LOC_2A2
JT_VOICE_11:
jmp LOC_2C8
JT_VOICE_12:
jmp LOC_22A
JT_VOICE_13:
jmp LOC_23E
JT_VOICE_14:
jmp LOC_252
JT_VOICE_15:
jmp LOC_266
JT_VOICE_16:
jmp LOC_27A
JT_VOICE_17:
jmp LOC_28E
JT_VOICE_18:
jmp LOC_39D
JT_VOICE_19:
jmp LOC_216
JT_VOICE_1A:
jmp LOC_216
JT_VOICE_1B:
jmp LOC_216
JT_VOICE_1C:
jmp LOC_216
JT_VOICE_1D:
jmp LOC_216
JT_VOICE_1E:
jmp LOC_216
JT_VOICE_1F:
jmp LOC_216
JT_VOICE_20:
jmp LOC_500
JT_VOICE_21:
jmp LOC_507
JT_VOICE_22:
jmp LOC_50E
JT_VOICE_23:
jmp LOC_515
JT_VOICE_24:
jmp LOC_51C
JT_VOICE_25:
jmp LOC_523
JT_VOICE_26:
jmp LOC_52A
JT_VOICE_27:
jmp LOC_531
JT_VOICE_28:
jmp LOC_538
JT_VOICE_29:
jmp LOC_53F
JT_VOICE_2A:
jmp LOC_546
JT_VOICE_2B:
jmp LOC_54D
JT_VOICE_2C:
jmp LOC_554
JT_VOICE_2D:
jmp LOC_55B
JT_VOICE_2E:
jmp LOC_562
JT_VOICE_2F:
jmp LOC_569
;; VOICE_OUT(r7=voice,r6=vptr,)
;; Output voice
VOICE_OUT:
mov a,r7
add a,#JO_VOICE
jmpp @a
;; Output 32 sample voice + 64
VOICE_OUT_32_64:
add a,#$40
;; Output 32 sample voice
VOICE_OUT_32:
outl p1,a ; sample = a
;; delay 2*r5 cycles
.delay:
djnz r5,.delay
;; delay = dinit
mov a,r4
mov r5,a
;; (r6 + 1) & $1F
mov a,r6
inc a
anl a,#$1F
mov r6,a
;;
jnz .not_done
retr
.not_done:
jmp VOICE_OUT
;; Output 16 sample voice
VOICE_OUT_16:
outl p1,a ; sample = a
;; delay 2*r5 cycles
.delay
djnz r5,.delay
;; delay = dinit
mov a,r4
mov r5,a
;; vptr = (vptr + 1) & $F
mov a,r6
inc a
anl a,#$0F
mov r6,a
;;
jnz .not_done
retr
.not_done:
jmp VOICE_OUT
.CT
;; Page $2
.NO $200,$FF
.OT
LOC_200:
mov a,#DATA_206
LOC_202:
add a,r6
movp a,@a ; A = TABLE[A]
jmp VOICE_OUT_16
DATA_206:
.DB $80,$80,$80,$80,$00,$60,$00,$00
.DB $00,$00,$00,$00,$00,$00,$00,$00
LOC_216:
mov a,#DATA_21A
jmp LOC_202
DATA_21A:
.DB $0E,$1C,$2A,$38,$46,$54,$62,$70
.DB $70,$62,$54,$46,$38,$2A,$1C,$0E
LOC_22A:
mov a,#DATA_22E
jmp LOC_202
DATA_22E:
.DB $0C,$18,$24,$30,$3C,$48,$54,$60
.DB $60,$54,$48,$3C,$30,$24,$18,$0C
LOC_23E:
mov a,#DATA_242
jmp LOC_202
DATA_242:
.DB $0A,$14,$1E,$28,$32,$3C,$46,$50
.DB $50,$46,$3C,$32,$28,$1E,$14,$0A
LOC_252:
mov a,#DATA_256
jmp LOC_202
DATA_256:
.DB $08,$10,$18,$20,$28,$30,$38,$40
.DB $40,$38,$30,$28,$20,$18,$10,$08
LOC_266:
mov a,#DATA_26A
jmp LOC_202
DATA_26A:
.DB $06,$0C,$12,$18,$1E,$24,$2A,$30
.DB $30,$2A,$24,$1E,$18,$12,$0C,$06
LOC_27A:
mov a,#DATA_27E
jmp LOC_202
DATA_27E:
.DB $04,$08,$0C,$10,$14,$18,$1C,$20
.DB $20,$1C,$18,$14,$10,$0C,$08,$04
LOC_28E:
mov a,#DATA_292
jmp LOC_202
DATA_292:
.DB $02,$04,$06,$08,$0A,$0C,$0E,$10
.DB $10,$0E,$0C,$0A,$08,$06,$04,$02
LOC_2A2:
mov a,#DATA_2A8
LOC_2A4:
add a,r6
movp a,@a
;;
jmp VOICE_OUT_32_64
DATA_2A8:
.DB $08,$10,$18,$20,$28,$30,$38,$40
.DB $48,$50,$58,$60,$58,$50,$58,$60
.DB $60,$58,$50,$58,$60,$58,$50,$48
.DB $40,$38,$30,$28,$20,$18,$10,$08
LOC_2C8:
mov a,#DATA_2CC
jmp LOC_2A4
DATA_2CC:
.DB $04,$08,$0C,$10,$14,$18,$1C,$20
.DB $24,$28,$2C,$30,$2C,$28,$2C,$30
.DB $30,$2C,$28,$2C,$30,$2C,$28,$24
.DB $20,$1C,$18,$14,$10,$0C,$08,$04
.CT
;; Page $3
.NO $300, $FF
.OT
SOUND_5:
mov r7,#$FF ; aenv - amplitude envelope
mov r4,#$01
mov r5,#$01
mov r6,#$01
mov r1,#$04
mov r2,#$70
mov r3,#$70
.sample_out:
call NOISE_A ; NOISE_A(r2)
anl a,r7
outl p1,a ; sample = noise & aenv
;; delay 2*r5 cycles
.delay:
djnz r5,.delay
;;
mov a,r4
inc a
anl a,#$07
jz .r4_wrap
.r4_nowrap:
mov r4,a
mov r5,a
djnz r6,.sample_out
;;
mov a,r1
mov r6,a
djnz r3,.sample_out
;;
mov a,r2
mov r3,a
;; aenv >>= 1
mov a,r7
rr a
anl a,#$7F
mov r7,a
;; done if aenv has decayed to 0
jz .done
add a,#$C1
jz .l5
jmp .sample_out
.r4_wrap:
mov a,#$04
jmp .r4_nowrap
.l5:
mov a,r1
add a,#$10
mov r1,a
mov r6,a
jmp .sample_out
.done:
jmp HALT
SOUND_6:
mov r7,#$3F ; aenv - amplitude envelope
mov r4,#$01
mov r5,#$01
mov r6,#$01
mov r2,#$70
mov r3,#$70
.sample_out:
call NOISE_A ; NOISE_A(r2)
anl a,r7
outl p1,a ; sample = noise & aenv
;; delay 2*r5 cycles
.delay:
djnz r5,.delay
;;
mov a,r4
inc a
anl a,#$03
jz .r4_wrap
.r4_nowrap:
mov r4,a
mov r5,a
djnz r6,.sample_out
;;
mov r6,#$04
djnz r3,.sample_out
;;
mov a,r2
mov r3,a
;; aenv >>= 1
mov a,r7
rr a
anl a,#$7F
mov r7,a
;; done if aenv has decayed to 0
jz .done
jmp .sample_out
.r4_wrap:
mov a,#$01
jmp .r4_nowrap
.done:
jmp HALT
SOUND_4:
mov r4,#$0A
mov r5,#$0A
mov r6,#$00
mov r7,#$08
mov r2,#$02
mov r1,#$02
mov r0,#$06
.loop:
call VOICE_OUT ; jump table (r7=$08) -> jmp $39D
mov a,r4
add a,#$10
mov r4,a
mov r5,a
djnz r2,.loop
mov r2,#$03
mov a,r0
add a,#$01
mov r0,a
mov r4,a
mov r5,a
djnz r1,.loop
mov r1,#$01
mov a,r7
inc a
mov r7,a
anl a,#$0F
jz .done
jmp .loop
.done:
jmp HALT
LOC_39D:
call NOISE_R3
mov a,r3
anl a,#$7F
mov r3,a
mov a,#DATA_3AA
LOC_3A5:
add a,r6
movp a,@a
add a,r3
jmp VOICE_OUT_16
DATA_3AA:
.DB $40,$40,$40,$40,$00,$20,$00,$00
.DB $00,$00,$00,$00,$00,$00,$00,$00
LOC_3BA:
call NOISE_R3
mov a,r3
anl a,#$7F
mov r3,a
mov a,#DATA_3C4
jmp LOC_3A5
DATA_3C4:
.DB $0E,$1C,$2A,$38,$46,$54,$62,$70
.DB $70,$62,$54,$46,$38,$2A,$1C,$0E
LOC_3D4:
call NOISE_R3
mov a,r3
anl a,#$7F
mov r3,a
mov a,#DATA_3DE
jmp LOC_3A5
DATA_3DE:
.DB $0C,$18,$24,$30,$3C,$48,$54,$60
.DB $60,$54,$48,$3C,$30,$24,$18,$0C
.CT
;; Page $4
.NO $400,$FF
.OT
LOC_400:
call NOISE_R3
mov a,r3
anl a,#$3F
mov r3,a
mov a,#DATA_40D
LOC_408:
add a,r6
movp a,@a
add a,r3
jmp VOICE_OUT_16
DATA_40D:
.DB $0A,$14,$1E,$28,$32,$3C,$46,$50
.DB $50,$46,$3C,$32,$28,$1E,$14,$0A
LOC_41D:
call NOISE_R3
mov a,r3
anl a,#$1F
mov r3,a
mov a,#DATA_427
jmp LOC_408
DATA_427:
.DB $08,$10,$18,$20,$28,$30,$38,$40
.DB $40,$38,$30,$28,$20,$18,$10,$08
LOC_437:
call NOISE_R3
mov a,r3
anl a,#$0F
mov r3,a
mov a,#DATA_441
jmp LOC_408
DATA_441:
.DB $06,$0C,$12,$18,$1E,$24,$2A,$30
.DB $30,$2A,$24,$1E,$18,$12,$0C,$06
LOC_451:
call NOISE_R3
mov a,r3
anl a,#$07
mov r3,a
mov a,#DATA_45B
jmp LOC_408
DATA_45B:
.DB $04,$08,$0C,$10,$14,$18,$1C,$20
.DB $20,$1C,$18,$14,$10,$0C,$08,$04
LOC_46B:
call NOISE_R3
mov a,r3
anl a,#$03
mov r3,a
mov a,#DATA_475
jmp LOC_408
DATA_475:
.DB $02,$04,$06,$08,$0A,$0C,$0E,$10
.DB $10,$0E,$0C,$0A,$08,$06,$04,$02
SOUND_7:
mov r0,#$00
mov r6,#$00
mov r7,#$20
.l1:
mov a,r0
add a,#$F8
jz .done
mov a,r0
add a,#DATA_4B1
movp a,@a
mov r2,a
mov r3,a
inc r0
mov a,r0
add a,#DATA_4B1
movp a,@a
mov r4,a
mov r5,a
inc r0
.l2:
call VOICE_OUT ; jump table (r7=$20) -> jmp $500
djnz r3,.l2
mov a,r2
mov r3,a
mov a,r7
inc a
mov r7,a
anl a,#$0F
jnz .l2
mov r7,#$20
jmp .l1
.done:
jmp HALT
DATA_4B1:
.DB $07,$62,$07,$62,$07,$62,$07,$62
.DB $0A,$33,$0A,$33,$0A,$33,$0A,$33
.DB $0A,$33,$0A,$33,$0A,$33,$0A,$33
.DB $0A,$33,$0A,$33,$0A,$33,$0A,$33
.DB $0A,$33,$0A,$33,$0A,$33,$0A,$33
.DB $0A,$33
.CT
;; Page $5
.NO $500,$FF
LOC_500:
mov a,r6
add a,#$F1
jc LOC_570
jmp LOC_574
LOC_507:
mov a,r6
add a,#$F0
jc LOC_570
jmp LOC_574
LOC_50E:
mov a,r6
add a,#$EF
jc LOC_570
jmp LOC_574
LOC_515:
mov a,r6
add a,#$EE
jc LOC_570
jmp LOC_574
LOC_51C:
mov a,r6
add a,#$ED
jc LOC_570
jmp LOC_574
LOC_523:
mov a,r6
add a,#$EC
jc LOC_570
jmp LOC_574
LOC_52A:
mov a,r6
add a,#$EB
jc LOC_570
jmp LOC_574
LOC_531:
mov a,r6
add a,#$EA
jc LOC_570
jmp LOC_574
LOC_538:
mov a,r6
add a,#$E9
jc LOC_570
jmp LOC_574
LOC_53F:
mov a,r6
add a,#$E8
jc LOC_570
jmp LOC_574
LOC_546:
mov a,r6
add a,#$E7
jc LOC_570
jmp LOC_574
LOC_54D:
mov a,r6
add a,#$E6
jc LOC_570
jmp LOC_574
LOC_554:
mov a,r6
add a,#$E5
jc LOC_570
jmp LOC_574
LOC_55B:
mov a,r6
add a,#$E4
jc LOC_570
jmp LOC_574
LOC_562:
mov a,r6
add a,#$E3
jc LOC_570
jmp LOC_574
LOC_569:
mov a,r6
add a,#$E2
jc LOC_570
jmp LOC_574
LOC_570:
mov a,#$00
jmp VOICE_OUT_32
LOC_574:
mov a,#$40
jmp VOICE_OUT_32
.NO $1000,$FF
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment