dos33fsprogs/demos/xmas_2018/play_music.s

275 lines
4.1 KiB
ArmAsm

;MB_VALUE = $91
;MB_FRAME = $94
;MB_PATTERN = $95
mah00 = $8000
mah01 = $8100
mah02 = $8200
mah03 = $8300
mah04 = $8400
mah05 = $8500
mah06 = $8600
mah07 = $8700
mal00 = $8800
mal01 = $8900
mal02 = $8A00
mal03 = $8B00
mal04 = $8C00
mal05 = $8D00
mal06 = $8E00
mal07 = $8F00
mbh00 = $9000
mbh01 = $9100
mbh02 = $9200
mbh03 = $9300
mbh04 = $9400
mbh05 = $9500
mbh06 = $9600
mbh07 = $9700
mbl00 = $9800
mbl01 = $9900
mbl02 = $9A00
mbl03 = $9B00
mbl04 = $9C00
mbl05 = $9D00
mbl06 = $9E00
mbl07 = $9F00
mch00 = $A000
mch01 = $A100
mch02 = $A200
mch03 = $A300
mch04 = $A400
mch05 = $A500
mch06 = $A600
mch07 = $A700
mcl00 = $A800
mcl01 = $A900
mcl02 = $AA00
mcl03 = $AB00
mcl04 = $AC00
mcl05 = $AD00
mcl06 = $AE00
mcl07 = $AF00
mnh00 = $B000
mnh01 = $B100
mnh02 = $B200
mnh03 = $B300
mnh04 = $B400
mnh05 = $B500
mnh06 = $B600
mnh07 = $B700
mnl00 = $B800
mnl01 = $B900
mnl02 = $BA00
mnl03 = $BB00
mnl04 = $BC00
mnl05 = $BD00
mnl06 = $BE00
mnl07 = $BF00
; takes
; 7 load pattern
; 76 smc
; 3 loop init
; 910 play music 80 + 82 + 88 + 80 + 82 + 88 + 80 + 82 + 88 + 80 + 80
; 21 end
;==========
; = 1017
play_music:
mute_smc:
; self-modify the code
lda MB_PATTERN ; 3
and #$07 ; 2
tay ; 2
lda mal_pattern,Y ; 4
sta mb_smc1+2 ; 4
lda mah_pattern,Y ; 4
sta mb_smc2+2 ; 4
sta mb_smc3+2 ; 4
lda mbl_pattern,Y ; 4
sta mb_smc4+2 ; 4
lda mbh_pattern,Y ; 4
sta mb_smc5+2 ; 4
sta mb_smc6+2 ; 4
; mcl and mch patterns are the same
lda mcl_pattern,Y ; 4
sta mb_smc7+2 ; 4
lda mch_pattern,Y ; 4
sta mb_smc8+2 ; 4
sta mb_smc9+2 ; 4
lda mnl_pattern,Y ; 4
sta mb_smc10+2 ; 4
lda mnh_pattern,Y ; 4
sta mb_smc11+2 ; 4
;=======
; 76
; play the code
ldy MB_FRAME ; 3
;=======
; mal
mb_smc1:
lda mal00,Y ; 4
sta MB_VALUE ; 3
ldx #0 ; 2
jsr write_ay_both ; 6+65
;=========
; 80
; mah
mb_smc2:
lda mal00,Y ; 4
and #$f ; 2
sta MB_VALUE ; 3
ldx #1 ; 2
jsr write_ay_both ; 6+65
;========
; 82
mb_smc3:
lda mal00,Y ; 4
lsr ; 2
lsr ; 2
lsr ; 2
lsr ; 2
sta MB_VALUE ; 3
ldx #8 ; 2
jsr write_ay_both ; 6+65
;=======
; 88
; mbl
mb_smc4:
lda mbl00,Y ; 4
sta MB_VALUE ; 3
ldx #2 ; 2
jsr write_ay_both ; 6+65
;=======
; 80
; mbh
mb_smc5:
lda mbh00,Y ; 4
and #$f ; 2
sta MB_VALUE ; 3
ldx #3 ; 2
jsr write_ay_both ; 6+65
;=======
; 82
mb_smc6:
lda mbh00,Y ; 4
lsr ; 2
lsr ; 2
lsr ; 2
lsr ; 2
sta MB_VALUE ; 3
ldx #9 ; 2
jsr write_ay_both ; 6+65
;======
; 88
; mcl
mb_smc7:
lda mal00,Y ; 4
sta MB_VALUE ; 3
ldx #4 ; 2
jsr write_ay_both ; 6+65
;======
; 80
; mch
mb_smc8:
lda mal00,Y ; 4
and #$f ; 2
sta MB_VALUE ; 3
ldx #5 ; 2
jsr write_ay_both ; 6+65
;=======
; 82
mb_smc9:
lda mal00,Y ; 4
lsr ; 2
lsr ; 2
lsr ; 2
lsr ; 2
sta MB_VALUE ; 3
ldx #10 ; 2
jsr write_ay_both ; 6+65
;========
; 88
; mnl
mb_smc10:
lda mal00,Y ; 4
sta MB_VALUE ; 3
ldx #6 ; 2
jsr write_ay_both ; 6+65
;=======
; 80
; mnh
mb_smc11:
lda mnh00,Y ; 4
sta MB_VALUE ; 3
ldx #7 ; 2
jsr write_ay_both ; 6+65
;=======
; 80
inc MB_FRAME ; 5
bne mb_no_change ; 3
; -1
inc MB_PATTERN ; 5
jmp mb_done_change ; 3
mb_no_change:
lda $0 ; 3
nop ; 2
nop ; 2
mb_done_change:
; restore language card
rts ; 6
;=======
; 21
play_music_end:
.assert >play_music = >play_music_end, error, "play_music crosses page"
.align $100
pattern_begin:
; patterns 8 long
mal_pattern:
.byte >mal00,>mal01,>mal02,>mal03,>mal04,>mal05,>mal06,>mal07
mah_pattern:
.byte >mah00,>mah01,>mah02,>mah03,>mah04,>mah05,>mah06,>mah07
mbl_pattern:
.byte >mbl00,>mbl01,>mbl02,>mbl03,>mbl04,>mbl05,>mbl06,>mbl07
mbh_pattern:
.byte >mbh00,>mbh01,>mbh02,>mbh03,>mbh04,>mbh05,>mbh06,>mbh07
mcl_pattern:
.byte >mcl00,>mcl01,>mcl02,>mcl03,>mcl04,>mcl05,>mcl06,>mcl07
mch_pattern:
.byte >mch00,>mch01,>mch02,>mch03,>mch04,>mch05,>mch06,>mch07
mnl_pattern:
.byte >mnl00,>mnl01,>mnl02,>mnl03,>mnl04,>mnl05,>mnl06,>mnl07
mnh_pattern:
.byte >mnh00,>mnh01,>mnh02,>mnh03,>mnh04,>mnh05,>mnh06,>mnh07
pattern_end:
.assert >pattern_begin = >pattern_end, error, "pattern crosses page"