; written by sheldon macdonald 2025 ; www.smdreloaded.com ; ; simple MML Player driven by the IRQ ; 3 channels mml playback ; ; ; demo playing single channel bomberman ; ; ; ; written in DUAL IDE by Sheldon MacDonald ; ; ; ; coco header opt forwardrefmax ; Function file loaded: coco\main_lib.txt ; Function file loaded: coco\disk_lib.txt ; Function file loaded: coco\cg3_display.txt ; Function file loaded: coco\sid_mml.txt ; Function file loaded: coco\cg3_font.txt ; function mem start address = $7000 org $4000 ;mem start? start ; prep the irq for a simple mml player jsr init_sidmml ; channel 1-3 , instrument 1-8 , playback 1=once 2=loop , playback speed 0-20 , #mmlmusic ;load first midi mml channel and play it looping ldb #1 stb playsid_mml_chan ldb #5 stb playsid_mml_ins ldb #2 stb playsid_mml_play ldb #2 stb playsid_mml_spd ldd #music1_1 std playsid_mml_addr jsr playsid_mml ; playsid_mml(#2,#2,#2,#2,#music1_2) ;only one channel for bomberman ;clear screen pshs x,y ldb #0 stb cls_page ldb #1 stb cls_cc jsr cls puls y,x ; print text to screen pshs x,y ldb #0 stb print_page ldb #1 stb print_cap ldd #0 std print_cc ldd #mytext std print_x jsr print puls y,x ; main loop do nothing doloop lbra doloop ; MML Programming info ; instrument change I0 - I8 ; INSTRUMENT 1=TRIANGLE ; 2=SAWTOOTH ; 3=TRI+SAW ; 4=PULSE ; 5=PULSE+TRI ; 6=PULSE+SAW ; 7=TRI+SAW+PULSE ; 8=NOISE ; this value gets shifted lsl 4 times into xxxx0000 on the sid ; all notes and commands must be capitals no spaces ; notes C,D,E,F,G,A,B ; C# , C- for sharp and flat ; volume V0 - V15 ; octave O0-O7 ; length ; L32 = 32nd note ; L16 = 16th note ; L8 = 1/8th ; L4 = 1/4 note ; L2 = 1/2 note ; L1 = 1 note ; L1. = 1.5 note ; pauses work the same ; P32 = 32nd note ; P16 = 16th note ; P8 = 1/8th ; P4 = 1/4 note ; P2 = 1/2 note ; P1 = 1 note ; P1. = 1.5 note ; tempo T0-T9 0=fastest playback ; mml midi for bomberman exported from QmidiStudio music1_1 FCC "O3L8BP8O4BO3BO4DP8F#A-AP8AP8A-P4.O3AP8O4AO3AO4C#P8E" FCC "F#GP8F#GO3AA-AP8F#P8O4F#O3F#O4EP8E-EO3F#P8O4F#P8O3F#P4.F#P8O4F#" FCN "O3F#O4EP8E-EO3F#P8O4F#P8O3F#P8A-B-" ; text to write on screen mytext fcn '1 CHANNEL SID MML DEMO' ;********************************************************************************************************** ; include file ; include file ; include file ; include file ; include file ; include file ; include file ; include file ; include file ;rem init_sidmml() ;rem ;rem ;rem setup sid music macro for assembly using irq ; playback speeds init_sidmml_playspeed fcb 0,0 fcb 0,1 fcb 1,1 fcb 1,2 fcb 2,2 fcb 2,3 fcb 3,3 fcb 3,4 fcb 4,4 fcb 5,5 fcb 6,6 fcb 7,7 fcb 8,8 fcb 9,9 fcb 10,10 fcb 11,11 fcb 12,12 fcb 13,13 fcb 14,14 fcb 15,15 fcb 16,16 fcb 17,17 fcb 18,18 fcb 19,19 fcb 20,20 ; tones for 8 octaves 0-7 init_sidmml_tones fdb 274,291,308,326,346,366,388,411,435,461,489,518 ;oct 0 fdb 549,581,616,652,691,732,776,822,871,923,978,1036 ;oct 1 fdb 1097,1163,1232,1305,1383,1465,1552,1644,1742,1845,1955,2071 ;oct 2 fdb 2195,2325,2463,2610,2765,2930,3104,3288,3484,3691,3910,4143 ;oct 3 fdb 4389,4650,4927,5220,5530,5859,6207,6577,6968,7382,7821,8286 ;oct 4 fdb 8779,9301,9854,10440,11060,11718,12415,13153,13935,14764,15642,16572 ;oct 5 fdb 17557,18601,19709,20897,22121,23436,24830,26306,27871,29528,31234,33144 ;oct 6 fdb 35115,37203,39415,41759,44242,46873,49660,52613,55741,59056,62567,65535 ;oct 7 tone b7 out of range ; note length table init_sidmml_lentable fcb 248,248,248 fcb 249,249,249 fcb 250,250,250,250,250 fcb 251,251,251,251,251 ;16 fcb 252,252,252,252,252,252,252,252 fcb 252,252,252,252,252,252,252,252 ;16 fcb 253,253,253,253,253,253,253,253 fcb 253,253,253,253,253,253,253,253 fcb 253,253,253,253,253,253,253,253 fcb 253,253,253,253,253,253,253,253 ;32 fcb 254,254,254,254,254,254,254,254 fcb 254,254,254,254,254,254,254,254 fcb 254,254,254,254,254,254,254,254 fcb 254,254,254,254,254,254,254,254 ;32 ; mml note table processing ABCDEFG into 0-11 (1 octave) init_sidmml_notetable fcb 9,11,0,2,4,5,7,9 init_sidmml_speedtable fcb 250,251,252,253 sid_slot equ $7000 sid_slot1 equ $7001 boot_slot equ $7002 sid_delta1 equ $7003 sid_oct1 equ $7004 sid_len1 equ $7005 sid_vol equ $7006 sid_ins1 equ $7007 sid_spd1 equ $7008 sid_pulse1 equ $7009 sid_p_address1 equ $700B sid_s_address1 equ $700D sid_r_address1 equ $700F sid_playback1 equ $7011 sid_gate1 equ $7012 sid_com1 equ $7013 sid_playcnt1 equ $7014 sid_delay1 equ $7015 sid_loop1 equ $7016 sid_sharp equ $7017 sid_delta2 equ $7018 sid_oct2 equ $7019 sid_len2 equ $701A sid_ins2 equ $701B sid_spd2 equ $701C sid_pulse2 equ $701D sid_p_address2 equ $701F sid_s_address2 equ $7021 sid_r_address2 equ $7023 sid_playback2 equ $7025 sid_gate2 equ $7026 sid_com2 equ $7027 sid_playcnt2 equ $7028 sid_delay2 equ $7029 sid_loop2 equ $702A sid_delta3 equ $702B sid_oct3 equ $702C sid_len3 equ $702D sid_ins3 equ $702E sid_spd3 equ $702F sid_pulse3 equ $7030 sid_p_address3 equ $7032 sid_s_address3 equ $7034 sid_r_address3 equ $7036 sid_playback3 equ $7038 sid_gate3 equ $7039 sid_com3 equ $703A sid_playcnt3 equ $703B sid_delay3 equ $703C sid_loop3 equ $703D init_sidmml orcc #$50 ;kill interupt lda $ff7f ;slot anda #240 sta boot_slot ;boot slot lsra lsra lsra lsra anda #12 adda boot_slot sta sid_slot adda #1 sta sid_slot1 lda $ff7f sta boot_slot ;fixed ; lets get some settings ready lda sid_slot sta $ff7f ;settings here lda #15 sta $ff58 ;master volume 15 max ; set all pulse widths to square ldd #2048 sta $ff43 stb $ff42 ldd #2048 sta $ff4a stb $ff49 ldd #2048 sta $ff51 stb $ff50 ldx #init_sidmml_player_irq stx $010d lda boot_slot sta $ff7f clr sid_playback1 ;not playing clr sid_playback2 ;not playing clr sid_playback3 ;not playing andcc #$ef ;interrupt back on lda #2 sta sid_oct1 ;starting octave lda #4 sta sid_len1 ;starting note sizes clr sid_gate1 clr sid_delay1 clr sid_delta1 clr sid_spd1 lda #2 sta sid_oct2 ;starting octave lda #4 sta sid_len2 ;starting note sizes clr sid_gate2 clr sid_delay2 clr sid_delta2 clr sid_spd2 lda #2 sta sid_oct3 ;starting octave lda #4 sta sid_len3 ;starting note sizes clr sid_gate3 clr sid_delay3 clr sid_delta3 clr sid_spd3 rts ;**************************************************************************************************************************************** ;****************** sid mml player version 1.5 by smdreloaded init_sidmml_player_irq ; we are set for sid programming ; update system clock ldd $112 ;sys clock addd #1 std $112 lda sid_slot sta $ff7f ;mpi slot 1 of 0-3 ; gate1 check com sid_com1 bmi not_comgate1 ; if statement processing ldb sid_gate1 bitb #1 lbeq iforelse_1 iforelse_0 lda sid_gate1 anda #254 sta sid_gate1 sta $ff44 iforelse_1 iforelse_9 not_comgate1 ; gate2 check com sid_com2 bmi not_comgate2 ; if statement processing ldb sid_gate2 bitb #1 lbeq iforelse_11 iforelse_10 lda sid_gate2 anda #254 sta sid_gate2 sta $ff4b iforelse_11 iforelse_19 not_comgate2 ; gate3 check com sid_com3 bmi not_comgate3 ; if statement processing ldb sid_gate3 bitb #1 lbeq iforelse_21 iforelse_20 lda sid_gate3 anda #254 sta sid_gate3 sta $ff52 iforelse_21 iforelse_29 not_comgate3 ;player 1 ; if statement processing ldb #0 cmpb sid_playback1 lbeq iforelse_31 iforelse_30 ; if statement processing ldb #0 cmpb sid_playcnt1 lbhs iforelse_41 iforelse_40 dec sid_playcnt1 lbra iforelse_49 iforelse_41 jsr sid_playmml1 ;jump to update iforelse_49 iforelse_31 iforelse_39 ;player 2 ; if statement processing ldb #0 cmpb sid_playback2 lbeq iforelse_51 iforelse_50 ; if statement processing ldb #0 cmpb sid_playcnt2 lbhs iforelse_61 iforelse_60 dec sid_playcnt2 lbra iforelse_69 iforelse_61 jsr sid_playmml2 ;jump to update iforelse_69 iforelse_51 iforelse_59 ;player3 ; if statement processing ldb #0 cmpb sid_playback3 lbeq iforelse_71 iforelse_70 ; if statement processing ldb #0 cmpb sid_playcnt3 lbhs iforelse_81 iforelse_80 dec sid_playcnt3 lbra iforelse_89 iforelse_81 jsr sid_playmml3 ;jump to update iforelse_89 iforelse_71 iforelse_79 lda boot_slot sta $ff7f ;mpi slot 1 of 0-3 lda $ff02 ;ack irq rti ; return to code sid_playmml1 ; sort out play speed ldx #init_sidmml_playspeed ldb #2 lda sid_spd1 mul addb sid_delta1 leax d,x lda ,x sta sid_playcnt1 inc sid_delta1 ; if statement processing ldb #1 cmpb sid_delta1 lbhs iforelse_91 iforelse_90 clr sid_delta1 iforelse_91 iforelse_99 lda sid_delay1 beq sid_playmusic_deltagood1 dec sid_delay1 rts ;no play yet sid_playmusic_deltagood1 ldx sid_p_address1 ;song pos sid_play_process1 ldu #init_sidmml_tones ldy #init_sidmml_notetable ;note process lda 0,x lbeq sid_play_done1 ;octave change ; if statement processing ldb #79 cmpb 0,x lbne iforelse_101 iforelse_100 lda 1,x suba #48 sta sid_oct1 leax 2,x lbra sid_play_process1 iforelse_101 iforelse_109 ;volume change 0-9 ; if statement processing ldb #86 cmpb 0,x lbne iforelse_111 ldb #64 cmpb 2,x lbhs iforelse_111 iforelse_110 lda 1,x suba #48 sta sid_vol sta $ff58 ;volume reg leax 2,x lbra sid_play_process1 iforelse_111 iforelse_119 ;volume change 10-15 ; if statement processing ldb #86 cmpb 0,x lbne iforelse_121 ldb #49 cmpb 1,x lbne iforelse_121 ldb #54 cmpb 2,x lbls iforelse_121 iforelse_120 lda 2,x suba #48 adda #10 sta sid_vol sta $ff58 ;volume reg leax 3,x lbra sid_play_process1 iforelse_121 iforelse_129 ;speed change 0-9 ; if statement processing ldb #83 cmpb 0,x lbne iforelse_131 iforelse_130 lda 1,x suba #48 sta sid_spd1 leax 2,x lbra sid_play_process1 iforelse_131 iforelse_139 ;length change ; if statement processing ldb #76 cmpb 0,x lbne iforelse_141 iforelse_140 jsr sid_change_len sta sid_len1 lbra sid_play_process1 iforelse_141 iforelse_149 ;pause len ; if statement processing ldb #80 cmpb 0,x lbne iforelse_151 iforelse_150 jsr sid_change_len sta sid_delay1 stx sid_p_address1 rts iforelse_151 iforelse_159 ;tempo change ; if statement processing ldb #84 cmpb 0,x lbne iforelse_161 iforelse_160 lda 1,x suba #48 sta sid_spd1 leax 2,x lbra sid_play_process1 iforelse_161 iforelse_169 ;instrument change ; if statement processing ldb #73 cmpb 0,x lbne iforelse_171 iforelse_170 lda 1,x suba #48 sta sid_ins1 ;save instrument lsla lsla lsla lsla adda #1 sta sid_gate1 leax 2,x lbra sid_play_process1 iforelse_171 iforelse_179 ;play note ; if statement processing ldb #65 cmpb 0,x lbhi iforelse_181 ldb #71 cmpb 0,x lblo iforelse_181 iforelse_180 ; sharp or not? clr sid_sharp ; if statement processing ldb #35 cmpb 1,x lbne iforelse_191 iforelse_190 lda #1 sta sid_sharp iforelse_191 iforelse_199 ;flat or not ; if statement processing ldb #45 cmpb 1,x lbne iforelse_201 ldb #67 cmpb 0,x lbeq iforelse_201 iforelse_200 lda #255 ;-1 sta sid_sharp iforelse_201 iforelse_209 ldb #24 ;12 word values lda sid_oct1 mul leau d,u ldb 0,x subb #65 lda b,y adda sid_sharp ldb #2 mul leau d,u lda 0,u ldb 1,u sta $ff41 ;frequency stb $ff40 ldy #init_sidmml_lentable ldb sid_len1 lda b,y ;length sta $ff46 ;sus release lda #$0c sta $ff45 ;attack/delay lda sid_gate1 anda #254 adda #1 sta sid_gate1 sta $ff44 ;note away clr sid_com1 ; if statement processing ldb #0 cmpb sid_sharp lbeq iforelse_211 iforelse_210 leax 1,x iforelse_211 iforelse_219 leax 1,x lda sid_len1 sta sid_delay1 stx sid_p_address1 rts iforelse_181 iforelse_189 ;not found leax 1,x lbra sid_play_process1 sid_play_done1 ; if statement processing ldb #1 cmpb sid_loop1 lbne iforelse_221 iforelse_220 ldd sid_r_address1 std sid_p_address1 rts lbra iforelse_229 iforelse_221 ldd sid_s_address1 std sid_p_address1 clr sid_playback1 rts iforelse_229 rts ;************************************************change length jsr ;***********************************************returns value on a sid_change_len ; if statement processing ldb #49 cmpb 1,x lbne iforelse_231 ldb #48 cmpb 2,x lbne iforelse_231 iforelse_230 lda #2 leax 3,x rts iforelse_231 iforelse_239 ; if statement processing ldb #49 cmpb 1,x lbne iforelse_241 ldb #46 cmpb 2,x lbne iforelse_241 iforelse_240 lda #47 leax 3,x rts iforelse_241 iforelse_249 ; if statement processing ldb #49 cmpb 1,x lbne iforelse_251 ldb #46 cmpb 2,x lbeq iforelse_251 ldb #54 cmpb 2,x lbeq iforelse_251 iforelse_250 lda #31 leax 2,x rts iforelse_251 iforelse_259 ; if statement processing ldb #50 cmpb 1,x lbne iforelse_261 ldb #46 cmpb 2,x lbne iforelse_261 iforelse_260 lda #23 leax 3,x rts iforelse_261 iforelse_269 ; if statement processing ldb #50 cmpb 1,x lbne iforelse_271 ldb #46 cmpb 2,x lbeq iforelse_271 iforelse_270 lda #15 leax 2,x rts iforelse_271 iforelse_279 ; if statement processing ldb #51 cmpb 1,x lbne iforelse_281 ldb #46 cmpb 2,x lbne iforelse_281 iforelse_280 lda #17 leax 3,x rts iforelse_281 iforelse_289 ; if statement processing ldb #51 cmpb 1,x lbne iforelse_291 ldb #46 cmpb 2,x lbeq iforelse_291 ldb #50 cmpb 2,x lbeq iforelse_291 iforelse_290 lda #11 leax 2,x rts iforelse_291 iforelse_299 ; if statement processing ldb #52 cmpb 1,x lbne iforelse_301 ldb #46 cmpb 2,x lbne iforelse_301 iforelse_300 lda #11 leax 3,x rts iforelse_301 iforelse_309 ; if statement processing ldb #52 cmpb 1,x lbne iforelse_311 ldb #46 cmpb 2,x lbeq iforelse_311 iforelse_310 lda #7 leax 2,x rts iforelse_311 iforelse_319 ; if statement processing ldb #56 cmpb 1,x lbne iforelse_321 ldb #46 cmpb 2,x lbne iforelse_321 iforelse_320 lda #5 leax 3,x rts iforelse_321 iforelse_329 ; if statement processing ldb #56 cmpb 1,x lbne iforelse_331 ldb #46 cmpb 2,x lbeq iforelse_331 iforelse_330 lda #3 leax 2,x rts iforelse_331 iforelse_339 ; l16 ; if statement processing ldb #49 cmpb 1,x lbne iforelse_341 ldb #54 cmpb 2,x lbne iforelse_341 iforelse_340 lda #1 leax 3,x rts iforelse_341 iforelse_349 ; l32 ; if statement processing ldb #51 cmpb 1,x lbne iforelse_351 ldb #50 cmpb 2,x lbne iforelse_351 iforelse_350 lda #0 leax 3,x rts iforelse_351 iforelse_359 ;fucked up string leax 1,x clra rts sid_playmml2 ; sort out play speed ldx #init_sidmml_playspeed ldb #2 lda sid_spd2 mul addb sid_delta2 leax d,x lda ,x sta sid_playcnt2 inc sid_delta2 ; if statement processing ldb #1 cmpb sid_delta2 lbhs iforelse_361 iforelse_360 clr sid_delta2 iforelse_361 iforelse_369 lda sid_delay2 beq sid_playmusic_deltagood2 dec sid_delay2 rts ;no play yet sid_playmusic_deltagood2 ldx sid_p_address2 ;song pos sid_play_process2 ldu #init_sidmml_tones ldy #init_sidmml_notetable ;note process lda 0,x lbeq sid_play_done2 ;octave change ; if statement processing ldb #79 cmpb 0,x lbne iforelse_371 iforelse_370 lda 1,x suba #48 sta sid_oct2 leax 2,x lbra sid_play_process2 iforelse_371 iforelse_379 ;length change ; if statement processing ldb #76 cmpb 0,x lbne iforelse_381 iforelse_380 jsr sid_change_len sta sid_len2 lbra sid_play_process2 iforelse_381 iforelse_389 ;pause len ; if statement processing ldb #80 cmpb 0,x lbne iforelse_391 iforelse_390 jsr sid_change_len sta sid_delay2 stx sid_p_address2 rts iforelse_391 iforelse_399 ;tempo change ; if statement processing ldb #84 cmpb 0,x lbne iforelse_401 iforelse_400 lda 1,x suba #48 sta sid_spd2 leax 2,x lbra sid_play_process2 iforelse_401 iforelse_409 ;instrument change ; if statement processing ldb #73 cmpb 0,x lbne iforelse_411 iforelse_410 lda 1,x suba #48 sta sid_ins2 ;save instrument lsla lsla lsla lsla adda #1 sta sid_gate2 leax 2,x lbra sid_play_process2 iforelse_411 iforelse_419 ;volume change 0-9 ; if statement processing ldb #86 cmpb 0,x lbne iforelse_421 ldb #64 cmpb 2,x lbhs iforelse_421 iforelse_420 lda 1,x suba #48 sta sid_vol sta $ff58 ;volume reg leax 2,x lbra sid_play_process1 iforelse_421 iforelse_429 ;volume change 10-15 ; if statement processing ldb #86 cmpb 0,x lbne iforelse_431 ldb #49 cmpb 1,x lbne iforelse_431 ldb #54 cmpb 2,x lbls iforelse_431 iforelse_430 lda 2,x suba #48 adda #10 sta sid_vol sta $ff58 ;volume reg leax 3,x lbra sid_play_process1 iforelse_431 iforelse_439 ;speed change 0-9 ; if statement processing ldb #83 cmpb 0,x lbne iforelse_441 iforelse_440 lda 1,x suba #48 sta sid_spd2 leax 2,x lbra sid_play_process1 iforelse_441 iforelse_449 ;play note ; if statement processing ldb #65 cmpb 0,x lbhi iforelse_451 ldb #71 cmpb 0,x lblo iforelse_451 iforelse_450 ; sharp or not? clr sid_sharp ; if statement processing ldb #35 cmpb 1,x lbne iforelse_461 iforelse_460 lda #1 sta sid_sharp iforelse_461 iforelse_469 ;flat or not ; if statement processing ldb #45 cmpb 1,x lbne iforelse_471 ldb #67 cmpb 0,x lbeq iforelse_471 iforelse_470 lda #255 ;-1 sta sid_sharp iforelse_471 iforelse_479 ldb #24 ;12 word values lda sid_oct2 mul leau d,u ldb 0,x subb #65 lda b,y adda sid_sharp ldb #2 mul leau d,u lda 0,u ldb 1,u sta $ff48 ;frequency stb $ff47 ldy #init_sidmml_lentable ldb sid_len2 lda b,y ;length sta $ff4d ;sus release lda #$0c sta $ff4c ;attack/delay lda sid_gate2 anda #254 adda #1 sta sid_gate2 sta $ff4b ;note away clr sid_com2 ; if statement processing ldb #0 cmpb sid_sharp lbeq iforelse_481 iforelse_480 leax 1,x iforelse_481 iforelse_489 leax 1,x lda sid_len2 sta sid_delay2 stx sid_p_address2 rts iforelse_451 iforelse_459 ;not found leax 1,x lbra sid_play_process2 sid_play_done2 ; if statement processing ldb #1 cmpb sid_loop2 lbne iforelse_491 iforelse_490 ldd sid_r_address2 std sid_p_address2 rts lbra iforelse_499 iforelse_491 ldd sid_s_address2 std sid_p_address2 clr sid_playback2 rts iforelse_499 rts sid_playmml3 ; sort out play speed ldx #init_sidmml_playspeed ldb #2 lda sid_spd3 mul addb sid_delta3 leax d,x lda ,x sta sid_playcnt3 inc sid_delta3 ; if statement processing ldb #1 cmpb sid_delta3 lbhs iforelse_501 iforelse_500 clr sid_delta3 iforelse_501 iforelse_509 lda sid_delay3 beq sid_playmusic_deltagood3 dec sid_delay3 rts ;no play yet sid_playmusic_deltagood3 ldx sid_p_address3 ;song pos sid_play_process3 ldu #init_sidmml_tones ldy #init_sidmml_notetable ;note process lda 0,x lbeq sid_play_done3 ;octave change ; if statement processing ldb #79 cmpb 0,x lbne iforelse_511 iforelse_510 lda 1,x suba #48 sta sid_oct3 leax 2,x lbra sid_play_process3 iforelse_511 iforelse_519 ;length change ; if statement processing ldb #76 cmpb 0,x lbne iforelse_521 iforelse_520 jsr sid_change_len sta sid_len3 lbra sid_play_process3 iforelse_521 iforelse_529 ;pause len ; if statement processing ldb #80 cmpb 0,x lbne iforelse_531 iforelse_530 jsr sid_change_len sta sid_delay3 stx sid_p_address3 rts iforelse_531 iforelse_539 ;tempo change ; if statement processing ldb #84 cmpb 0,x lbne iforelse_541 iforelse_540 lda 1,x suba #48 sta sid_spd3 leax 2,x lbra sid_play_process3 iforelse_541 iforelse_549 ;instrument change ; if statement processing ldb #73 cmpb 0,x lbne iforelse_551 iforelse_550 lda 1,x suba #48 sta sid_ins3 ;save instrument lsla lsla lsla lsla adda #1 sta sid_gate3 leax 2,x lbra sid_play_process3 iforelse_551 iforelse_559 ;volume change 0-9 ; if statement processing ldb #86 cmpb 0,x lbne iforelse_561 ldb #64 cmpb 2,x lbhs iforelse_561 iforelse_560 lda 1,x suba #48 sta sid_vol sta $ff58 ;volume reg leax 2,x lbra sid_play_process3 iforelse_561 iforelse_569 ;volume change 10-15 ; if statement processing ldb #86 cmpb 0,x lbne iforelse_571 ldb #49 cmpb 1,x lbne iforelse_571 ldb #54 cmpb 2,x lbls iforelse_571 iforelse_570 lda 2,x suba #48 adda #10 sta sid_vol sta $ff58 ;volume reg leax 3,x lbra sid_play_process3 iforelse_571 iforelse_579 ;speed change 0-9 ; if statement processing ldb #83 cmpb 0,x lbne iforelse_581 iforelse_580 lda 1,x suba #48 sta sid_spd3 leax 2,x lbra sid_play_process3 iforelse_581 iforelse_589 ;play note ; if statement processing ldb #65 cmpb 0,x lbhi iforelse_591 ldb #71 cmpb 0,x lblo iforelse_591 iforelse_590 ; sharp or not? clr sid_sharp ; if statement processing ldb #35 cmpb 1,x lbne iforelse_601 iforelse_600 lda #1 sta sid_sharp iforelse_601 iforelse_609 ;flat or not ; if statement processing ldb #45 cmpb 1,x lbne iforelse_611 ldb #67 cmpb 0,x lbeq iforelse_611 iforelse_610 lda #255 ;-1 sta sid_sharp iforelse_611 iforelse_619 ldb #24 ;12 word values lda sid_oct3 mul leau d,u ldb 0,x subb #65 lda b,y adda sid_sharp ldb #2 mul leau d,u lda 0,u ldb 1,u sta $ff4f ;frequency stb $ff4e ldy #init_sidmml_lentable ldb sid_len3 lda b,y ;length sta $ff54 ;sus release lda #$0c sta $ff53 ;attack/delay lda sid_gate3 anda #254 adda #1 sta sid_gate3 sta $ff52 ;note away clr sid_com3 ; if statement processing ldb #0 cmpb sid_sharp lbeq iforelse_621 iforelse_620 leax 1,x iforelse_621 iforelse_629 leax 1,x lda sid_len3 sta sid_delay3 stx sid_p_address3 rts iforelse_591 iforelse_599 ;not found leax 1,x lbra sid_play_process3 sid_play_done3 ; if statement processing ldb #1 cmpb sid_loop3 lbne iforelse_631 iforelse_630 ldd sid_r_address3 std sid_p_address3 rts lbra iforelse_639 iforelse_631 ldd sid_s_address3 std sid_p_address3 clr sid_playback3 rts iforelse_639 rts ;********************************************************************************************************** ;rem playsid_mml( channel.b , instrument.b , playback.b , speed.b , address.w ) ;rem ;rem ;rem plays back mml over selected channel playsid_mml_chan equ $703E playsid_mml_ins equ $703F playsid_mml_play equ $7040 playsid_mml_spd equ $7041 playsid_mml_addr equ $7042 playsid_mml ; if statement processing ldb #1 cmpb playsid_mml_chan lbne iforelse_641 iforelse_640 ldd playsid_mml_addr std sid_p_address1 std sid_s_address1 std sid_r_address1 clr sid_playcnt1 clr sid_delta1 lda playsid_mml_spd sta sid_spd1 ;speed setup ;setup instrument lda playsid_mml_ins lsla lsla lsla lsla adda #1 sta sid_gate1 ;setup instrument ;last ; if statement processing ldb #2 cmpb playsid_mml_play lbls iforelse_651 iforelse_650 clr sid_loop1 lbra iforelse_659 iforelse_651 lda #1 sta sid_loop1 iforelse_659 ; if statement processing ldb #0 cmpb playsid_mml_play lbeq iforelse_661 iforelse_660 lda #1 sta sid_playback1 iforelse_661 iforelse_669 rts iforelse_641 iforelse_649 ; if statement processing ldb #2 cmpb playsid_mml_chan lbne iforelse_671 iforelse_670 ldd playsid_mml_addr std sid_p_address2 std sid_s_address2 std sid_r_address2 clr sid_playcnt2 clr sid_delta2 lda playsid_mml_spd sta sid_spd2 ;speed setup ;setup instrument lda playsid_mml_ins lsla lsla lsla lsla adda #1 sta sid_gate2 ;setup instrument ;last ; if statement processing ldb #2 cmpb playsid_mml_play lbls iforelse_681 iforelse_680 clr sid_loop2 lbra iforelse_689 iforelse_681 lda #1 sta sid_loop2 iforelse_689 ; if statement processing ldb #0 cmpb playsid_mml_play lbeq iforelse_691 iforelse_690 lda #1 sta sid_playback2 iforelse_691 iforelse_699 rts iforelse_671 iforelse_679 ; if statement processing ldb #3 cmpb playsid_mml_chan lbne iforelse_701 iforelse_700 ldd playsid_mml_addr std sid_p_address3 std sid_s_address3 std sid_r_address3 clr sid_playcnt3 clr sid_delta3 lda playsid_mml_spd sta sid_spd3 ;speed setup ;setup instrument lda playsid_mml_ins lsla lsla lsla lsla adda #1 sta sid_gate3 ;setup instrument ;last ; if statement processing ldb #2 cmpb playsid_mml_play lbls iforelse_711 iforelse_710 clr sid_loop3 lbra iforelse_719 iforelse_711 lda #1 sta sid_loop3 iforelse_719 ; if statement processing ldb #0 cmpb playsid_mml_play lbeq iforelse_721 iforelse_720 lda #1 sta sid_playback3 iforelse_721 iforelse_729 rts iforelse_701 iforelse_709 ;********************************************************************************************************** cls_page equ $7044 cls_cc equ $7045 ;rem cls( page.b , color.b) ;rem page 0,1,2 ;rem color number from 0 to 8. ;rem ; stack push = x,y ; stack pull = x,y cls_c0 fcb 128 ;black fcb 143 ;green fcb 159 ;yellow fcb 175 ;blue fcb 191 ;red fcb 207 ;white fcb 223 ;cyan fcb 239 ;megenta fcb 255 ;orange cls ; if statement processing ldb #8 cmpb cls_cc lbhi iforelse_731 iforelse_730 ldb #8 stb cls_cc iforelse_731 iforelse_739 ; if statement processing ldb #0 cmpb cls_page lbne iforelse_741 iforelse_740 ldy #1024 ldx #cls_c0 ldb cls_cc abx ldb ,x lda ,x cls_lp1 std ,y++ cmpy #1536 blo cls_lp1 iforelse_741 iforelse_749 ; if statement processing ldb #1 cmpb cls_page lbne iforelse_751 iforelse_750 ldy #3584 ldx #cls_c0 ldb cls_cc abx ldb ,x lda ,x cls_lp2 std ,y++ cmpy #4096 blo cls_lp2 iforelse_751 iforelse_759 ; if statement processing ldb #2 cmpb cls_page lbhi iforelse_761 iforelse_760 ldy #4096 ldx #cls_c0 ldb cls_cc abx ldb ,x lda ,x cls_lp3 std ,y++ cmpy #4608 blo cls_lp3 iforelse_761 iforelse_769 rts ;********************************************************************************************************** ;rem print( page.b , capson.b , position.w, string.w) ;rem page 0,1,2 c=0 or 1 for starting in caps mode. pos=0-511 for screen position. ;rem ;rem print_page equ $7046 print_cap equ $7047 print_cc equ $7048 print_x equ $704A print_end equ $704C ; stack push = x,y ; stack pull = x,y print ldx print_x ldd print_cc ;check if out of bounds cmpd #511 bls print_lp0 ldd #511 std print_cc print_lp0 ; if statement processing ldb #0 cmpb print_page lbne iforelse_771 iforelse_770 ldd #1024 ; x=has string y is screen addd print_cc tfr d,y ;y is set addd #512 std print_end iforelse_771 iforelse_779 ; if statement processing ldb #1 cmpb print_page lbne iforelse_781 iforelse_780 ldd #3584 ; x=has string y is screen addd print_cc tfr d,y ;y is set addd #512 std print_end iforelse_781 iforelse_789 ; if statement processing ldb #2 cmpb print_page lbhi iforelse_791 iforelse_790 ldd #4096 ; x=has string y is screen addd print_cc tfr d,y ;y is set addd #512 std print_end iforelse_791 iforelse_799 ldb print_cap ;load b with caps flag print_lp1 lda ,x+ ;process this ascii code cmpa #97 blo print_lp2 clrb stb print_cap ;assume lowercase suba #96 print_lp2 cmpa #65 blo print_lp3 cmpa #90 bhi print_lp3 ldb #1 stb print_cap print_lp3 cmpa #32 bne print_lp4 cmpb #1 ;is cap on bne print_lp4 adda #64 ;fix green space ;lets look at numbers print_lp4 cmpa #33 blo print_lp5 cmpa #63 bhi print_lp5 ;its a number cmpb #1 bne print_lp5 ;change number to cap adda #64 print_lp5 sta ,y+ cmpy print_end bhs print_lp6 lda ,x cmpa #0 bne print_lp1 print_lp6 rts ;return end start