;================================ ; REPLAY.BIN for MuSICA 1.0 ; (disassembly ver 0.12) ; (for use with tniasm) ; (c) 1990 ASCII corp. ; for MuSICA .BGM files ;================================ ; USAGE: ; Un-comment the fname and binary header statements ; in order to compile as-is (it will be identical to the REPLAY.BIN ; distributed with MuSICA) or include the .z80 file in your ; own assembly projects. ; ; Refer to music.z80 for information on how to utilize the source. ; Version history ; ------------- ; 0.12: Fully labeled (temporary) ; 0.11: Progress with labels ; 0.1: First version ; fname "replay.bin" ; Definitions: RDSLT: equ $0c WRSLT: equ $14 ENASLT: equ $24 WRTPSG: equ $93 RDPSG: equ $96 OPLTXT: equ $401c WRTOPL: equ $4110 INIOPL: equ $4113 SCCMOD: equ $bffe RAMAD2: equ $f343 EXPTBL: equ $fcc1 HTIMI: equ $fd9f IRQADR: equ $fda0 SCCBAS: equ $9800 SCC_H: equ $98 SCCVOL: equ $988a SCC_ON: equ $988f ; binary header ;db $fe ;dw replayStart ;dw replayEOF-1 ;dw replaySTART org $ce00 replayStart: InitMus: jp InitMus2 StartMus: jp StartMus2 StopMus: jp StopMus2 FadeCtrl: jp FadeCtrl2 PSGSet: call PushArgs jp PSGSet2 StartMus2: call PushArgs jp InitializeIRQ FadeCtrl2: call PushArgs jp ChangeVolume PushArgs: push hl ; stores addr of pointer pop ix ; puts ptr addr in ix ld l, (ix+2) ; l = low byte of ptr ld h, (ix+3) ; h = high byte of ptr push hl ; store on stack pop ix ; pop real addr to ix ld a, (ix+0) ; a is first byte of song data ld l, (ix+2) ; l is 2 bytes up ld h, (ix+3) ; h is 3 bytes up ret InitializeIRQ: ld b, a ; $ce34 ld a, (IsPlaying) or a ret nz push hl push bc ld hl, HTIMI ld de, AreaBytes ld bc, 5 ldir pop af pop hl di call InitMuSICA ld a, $c3 ; sets hook ld (HTIMI), a ld hl, IRQLink ld (IRQADR), hl ; interrupt hook addr ld a, 1 ld (IsPlaying), a ei Breakpoint: ret IRQLink: call PlayRoutine AreaBytes: db "area " IsPlaying: db 0 StopMus2: ld a, (IsPlaying) ; + 67 or a ret z di ld hl, AreaBytes ; +62 ld de, HTIMI ld bc, 5 ldir call MuteAll ; + 35a xor a ld (IsPlaying), a ; +67 ei ret jp InitMus2 jp InitMuSICA jp MuteAll jp PlayRoutine jp GetVar5 jp ChangeVolume jp PSGSet2 MuSICABytes: db "MuSICA10" dw WorkRAM+$1d2 ;$ac, $dd ; M: ^ OPLL slot ; u: ^ SCC slot ; S: ^ music chip slots ; I: ; C: I think this is 'interrupt active' ChangeSlot: ld a, (MuSICABytes) jr ChangeSlot._b ._a: ld a, (MuSICABytes+2) ._b: ld h, $40 call ENASLT ret SearchMusicSlot: ; find slot, store in MuSICABytes ld b, 4 push bc ; loop point ld a, 4 sub b ld c, a ld hl, EXPTBL ; MNROM ld e, a ld d, 0 add hl, de ld a, (hl) add a, a jr nc, ._d ld b, 4 ._e: push bc ld a, $24 sub b rlca rlca or c call FindOPLL pop bc jr z, ._h djnz ._e ._i: xor a ld (MuSICABytes), a pop bc djnz SearchMusicSlot+2 ret ._d: ld a, c call FindOPLL jr nz, ._i ._h: pop bc ret FindOPLL: ld (MuSICABytes), a push bc ld hl, OPLTXT ; "OPLL" in mnrom ld de, OPLLBytes ld b, 4 ._g: push af push bc push de call RDSLT ei pop de pop bc ld c, a ld a, (de) cp c jr nz, ._f pop af inc de inc hl djnz ._g pop bc xor a ret ._f: pop af pop bc xor a inc a ret OPLLBytes: db "OPLL" DetectSCC: ld b, 4 ._u: push bc ld a, 4 sub b ld c, a ld hl, EXPTBL ; MNROM ld e, a ld d, 0 add hl, de ; slot target ld a, (hl) add a, a jr nc, ._a ld b, 4 ._t: push bc ld a, $24 sub b rlca rlca or c call ConfigureSCC pop bc jr z, ._s djnz ._t ._v: xor a ld (MuSICABytes+1), a pop bc djnz ._u ret ._a: ld a, c call ConfigureSCC jr nz, ._v ._s: pop bc ret ConfigureSCC: ld (MuSICABytes+1), a ld l, a ld a, (RAMAD2) cp l jr z, ._w push bc xor a ld (Copyright), a call ReadSCC ._z: ld hl, $b000 ld a, (Copyright) ; slot of SCC? ld e, a call CallWriteSlot ; write to b0xx = activate scc+@b8xx ld hl, SCCMOD ld e, $3f call CallWriteSlot ; set to konami / SCC+ mode call LABEL5 push af ld hl, SCCMOD ld e, 0 call CallWriteSlot pop af jr z, ._y ld a, (Copyright) inc a ld (Copyright), a cp $40 jr c, ._z jr ._x ._y: call LABEL5 jr z, ._x pop bc xor a ret ._x: call WriteSCC pop bc ._w: ld a, 1 or a ret LABEL5: ; probably enable SCC? ld hl, $a000 call CallReadSlot cpl ; complement a ld e, a push de call CallWriteSlot call CallReadSlot pop de cp e ret ReadSCC: ld hl, $a000 call CallReadSlot ld (Copyright+1), a ld hl, SCCMOD call CallReadSlot ld (Copyright+2), a ld hl, $b000 call CallReadSlot ld (Copyright+3), a ret WriteSCC: ld de, (Copyright+1) ld hl, $a000 call CallWriteSlot ld de, (Copyright+2) ld hl, SCCMOD call CallWriteSlot ld de, (Copyright+3) ld hl, $b000 call CallWriteSlot ret CallReadSlot: ;; Reads byte @ HL into A from slot A (Mu+1) ld a, (MuSICABytes+1) call RDSLT ; RDSLT ei ret CallWriteSlot: ;; Writes E to slot A (Mu+1) @ address HL ld a, (MuSICABytes+1) call WRSLT ; WRSLT ei ret GetMapperSlots: ld b, 1 in a, ($a8) ; PPI (primary A) call GetSlotNo and 3 ld e, a ld d, 0 ld hl, EXPTBL add hl, de ld a, (hl) or e jp p, ._ab ld e, a inc hl inc hl inc hl inc hl ld a, (hl) rlca rlca call GetSlotNo and RDSLT or e ._ab: ld (MuSICABytes+2), a ret GetSlotNo: inc b dec b ret z ; is b already 0 ? push bc ._aa: rrca rrca djnz ._aa ; dec b, [2]lsr a, jnz *-2 pop bc ret InitMus2: xor a ld (MuSICABytes+4), a ld (MuSICABytes+3), a call SearchMusicSlot di ld (WorkRAM), sp ld sp, WorkRAM+$1a0 ei call DetectSCC di ld sp, (WorkRAM) ei call GetMapperSlots ld a, (MuSICABytes) or a jr z, ._ac call ChangeSlot ld hl, Copyright ld a, l and $fe ; make byte even ld l, a call INIOPL call ChangeSlot._a ._ac: ld a, (MuSICABytes+1) or a jr z, ._ad ld hl, $9000 ld e, $3f call JumpWriteSlot ._ad: call MuteAll ret InitMuSICA: ; probably MuSICA init routine ld b, a ; first loop = 0 xor a ld (MuSICABytes+4), a ; 0 ld a, b ld (MuSICABytes+5), hl ; a5b7 ld (MuSICABytes+7), a ; <>0 call PSGOff ld e, %10111000 ld a, 7 call WRTPSG ; writes tone-only on to r#7 ld a, (MuSICABytes+1) or a jr z, ._ae ; is byte+1 != 0? call ResetSCC ld hl, SCC_ON ld e, %00011111 call JumpWriteSlot ; then reset scc ._ae: ld a, (MuSICABytes) or a jr z, ._af ; is opll (byte 0) != 0? call ChangeSlot call ResetOPLL ; then reset opll ld a, $0e ; r#14 ld e, 0 ; = 0 call WRTOPL ; rythym mode OFF call EnableOPLLVoices call ChangeSlot._a ._af: ld hl, (MuSICABytes+5) ld de, WorkRAM ld b, $11 inc hl ._ai: push bc ld a, (hl) ld (de), a inc hl inc de ld a, (hl) ld (de), a inc hl ex de, hl ld bc, 25 ; $19 add hl, bc ex de, hl pop bc djnz ._ai ; loop all this 17 times ld a, (MuSICABytes) or a jr nz, ._aj ; opll byte != 0? ld hl, WorkRAM ld b, 9 ._ak: ld (hl), 0 inc hl ld (hl), 0 ld de, 25 add hl, de djnz ._ak ; then do it 9 more times ._aj: ld a, (MuSICABytes+1) or a jr nz, ._al ; scc byte != 0? ld hl, WorkRAM+$138 ld b, 5 ._am: ld (hl), 0 inc hl ld (hl), 0 ld de, 25 add hl, de djnz ._am ._al: ld ix, WorkRAM xor a ld (MuSICABytes+8), a ; 0 ._an: call VarsSetup ld bc, 26 ; $1a add ix, bc ld hl, MuSICABytes+8 inc (hl) ld a, (hl) cp $11 jr c, ._an ld de, WorkRAM+$1ba ld a, 8 ._ao: ld hl, OPLLWaves+12 ld bc, 9 ldir dec a jr nz, ._ao ld a, 1 ld (MuSICABytes+9), a ld hl, Copyright+$b1 ; de8 ld c, 1 ld b, $11 ._aq: ld a, (hl) or a jr z, ._ap ld de, 26 add hl, de djnz ._aq dec c ._ap: ld a, c ld (MuSICABytes+4), a ret EnableOPLLVoices: ;;; channels 30-35 (6-8 are for ryhtym) ld hl, (MuSICABytes+5) ld a, (hl) or a ret nz ld hl, OPLLWaves ld b, 6 ._ag: ld a, (hl) inc hl ld e, (hl) inc hl call WRTOPL djnz ._ag ret OPLLWaves: db $16, $54, $17, $54, $18, $54 db $26, $08, $27, $08, $28, $04 db $1f, $1f, $0f, $1f, $00, $08, $00, $00, $00 MuteAll: ; probably xor a ld (MuSICABytes+4), a call PSGOff ld a, (MuSICABytes+1) or a call nz, ResetSCC ld a, (MuSICABytes) or a ret z call ChangeSlot call ResetOPLL call ChangeSlot._a ret GetVar5: ld a, (MuSICABytes+4) or a ; clears carry ret PSGOff: ld b, 14 ; sets all PSG regs to 0 xor a ld e, a ._as: call WRTPSG ; WRTPSG inc a djnz ._as ld a, 7 ld e, $bf call WRTPSG ; disables psg output ret ResetOPLL: ld a, 16 call ClearOPLLRegs ld a, 32 call ClearOPLLRegs ld a, 48 call ClearOPLLRegs ld a, $0e ; rythym register ld e, 0 ; all off call WRTOPL ret ClearOPLLRegs: ld b, 9 ld e, 0 ._ar: call WRTOPL inc a djnz ._ar ret ResetSCC: ld b, $8f ; SCC reset ld hl, SCCBAS ld e, 0 ._ah: push bc call JumpWriteSlot pop bc inc hl djnz ._ah ld hl, SCC_ON ld e, 0 call JumpWriteSlot ret VarsSetup: ; maybe sets up workram? ld l, (ix+0) ld h, (ix+1) ld (ix+2), l ld (ix+3), h ld a, h or l ld a, 1 jr z, ._bt xor a ._bt: ld (ix+7), a ld e, (hl) inc hl ld d, (hl) inc hl ld a, (hl) ld (ix+4), e ld (ix+5), d ld (ix+6), a push ix pop hl ld de, 8 add hl, de ex de, hl ld hl, VariableAlloc ld bc, 18 ldir ret VariableAlloc: db 0, 0, 0, 0, 8 db 0, 0, 0, 0, 10 db 0, 1, 0, 0, 0, 0, 0, 0 ChangeVolume: ; probably for changing volume cp 16 jr z, ._n cp 17 jr z, SoundOff cp 18 jp z, SoundOn and 15 ; low 4 bits only - volume level ld (MuSICABytes+3), a ld a, (MuSICABytes) or a jr z, ._j call ChangeSlot ld hl, (MuSICABytes+5) ld a, (hl) or a ld h, 6 jr z, ._at ld h, 9 ._at: ex af, af' ld ix, WorkRAM ld l, $30 ; instrument/volume reg ._k: call GetOPLLVol ld e, a ld a, l call WRTOPL ld bc, 26 add ix, bc inc l dec h jr nz, ._k ex af, af' call z, LABEL1 call ChangeSlot._a ._j: ld ix, WorkRAM+$ea ; ddab = start of workram ld h, 3 ld l, 8 ._l: call LABEL2 ld e, a ld a, l call LABEL6 ld bc, 26 add ix, bc inc l dec h jr nz, ._l ld a, (MuSICABytes+1) or a ret z ld ix, WorkRAM+$138 ld b, 5 ld hl, SCCVOL ._m: push bc call LABEL2 ld e, a call JumpWriteSlot ld bc, 26 add ix, bc inc hl pop bc djnz ._m ret ._n: ld a, (MuSICABytes+3) and $0f ret SoundOff: xor a ; probably mutes all channels ld (MuSICABytes+4), a ld a, (MuSICABytes) or a jr z, ._o call ChangeSlot ld e, 0 ld a, 32 ; r $20 = key/block etc ._au: call WRTOPL inc a cp 41 jr c, ._au call ChangeSlot._a ._o: ld a, 7 ld e, $bf ; all psg output off call WRTPSG ld a, (MuSICABytes+1) or a ret z ld hl, SCC_ON ld e, 0 call JumpWriteSlot ret SoundOn: ; turns on sound ld a, (MuSICABytes) or a jr z, ._q call ChangeSlot ld ix, WorkRAM xor a ld (MuSICABytes+8), a ._r: call LABEL7 ld bc, 26 add ix, bc ld hl, MuSICABytes+8 inc (hl) ld a, (hl) cp 10 jr c, ._r call EnableOPLLVoices call ChangeSlot._a ._q: call EnablePSGChannels ld a, (MuSICABytes+1) or a jr z, ._p ld e, %00011111 ld hl, SCC_ON call JumpWriteSlot ._p: ld a, 1 ld (MuSICABytes+4), a ret ; +$f7, +$111, and +$12b are all 1a (26b) apart ; what is 26 bytes? register info? PSGSet2: ld b, a ld hl, WorkRAM+$f7 res 2, (hl) ld hl, WorkRAM+$111 res 2, (hl) ld hl, WorkRAM+$12b res 2, (hl) ld a, 7 ld e, $bf ; all off call WRTPSG bit 0, b jr z, ._ax ld hl, WorkRAM+$f7 set 2, (hl) ._ax: bit 1, b jr z, ._az ld hl, WorkRAM+$111 set 2, (hl) ._az: bit 2, b jr z, ._ba ld hl, WorkRAM+$12b set 2, (hl) ._ba: call EnablePSGChannels ret PlayRoutine: ; probably PlayRoutine ld a, (MuSICABytes+4) or a ret z ld a, (MuSICABytes+9) or a jr z, ._c dec a ld (MuSICABytes+9), a ret ._c: ld a, 9 ld (MuSICABytes+8), a ld ix, WorkRAM+$ea ld iy, WorkRAM+$1ba ld b, 3 ._bo: push bc call LABEL17 ld bc, 26 add ix, bc ld bc, 9 add iy, bc ld hl, MuSICABytes+8 inc (hl) pop bc djnz ._bo ld a, (MuSICABytes) or a jr z, ._bp call ChangeSlot xor a ld (MuSICABytes+8), a ld ix, WorkRAM ld hl, (MuSICABytes+5) ld a, (hl) or a push af ld b, 6 jr z, ._bq ld b, 9 ._bq: push bc call LABEL17 ld bc, 26 add ix, bc ld hl, MuSICABytes+8 inc (hl) pop bc djnz ._bq pop af ld ix, WorkRAM+$9c call z, LABEL18 call ChangeSlot._a ._bp: ld a, (MuSICABytes+1) or a jr z, ._br ld a, 12 ld (MuSICABytes+8), a ld ix, WorkRAM+$138 ld iy, WorkRAM+$1d5 ld b, 5 ._bs: push bc call LABEL17 ld bc, 26 add ix, bc ld bc, 9 add iy, bc ld hl, MuSICABytes+8 inc (hl) pop bc djnz ._bs ._br: ld hl, WorkRAM+7 ld b, 17 ._bn: ld a, (hl) or a ret z ld de, 26 add hl, de djnz ._bn ld hl, MuSICABytes+7 ld a, (hl) or a jr z, ._bm dec (hl) jr nz, ._bm call MuteAll xor a ld (MuSICABytes+4), a ret ._bm: call InitMuSICA._af ret LABEL6: bit 2, (ix+13) jp z, WRTPSG ret JumpWriteSlot: ld a, (MuSICABytes+1) jp WRSLT LABEL9: ; possibly increment playback position ld l, (ix+4) ld h, (ix+5) ld a, (hl) inc hl ld (ix+4), l ld (ix+5), h ret OPLLVolByte: ; add by+3 and A, if not 15, set to 15. ; possibly sets max volume? ld b, a ld a, (MuSICABytes+3) add a, b cp 15 ret c ld a, 15 ret LABEL4: ld bc, (MuSICABytes+3) sub c ret nc xor a ret LABEL2: ; instrument for opll? ld a, (ix+16) call LABEL4 ld b, a ld a, 15 sub b ld b, a ld a, (iy+8) sub b ret nc xor a ret LABEL7: ld a, (MuSICABytes+8) cp 9 jr c, ._aw cp 12 jr c, ._av sub 12 add a, a add a, $80 ld l, a ld h, SCC_H ; scc addr ld e, (ix+14) call JumpWriteSlot inc hl ld e, (ix+15) jp JumpWriteSlot ._av: sub 9 add a, a ld e, (ix+14) call LABEL6 inc a ld e, (ix+15) jp LABEL6 ._aw: call LABEL8 ld e, l ld a, (MuSICABytes+8) add a, 16 call WRTOPL ld e, h add a, 16 jp WRTOPL LABEL35: ; probably volume related ld a, (MuSICABytes+8) cp 9 jr c, ._bb cp 12 jr c, ._bc call LABEL2 ld e, a ld a, (MuSICABytes+8) add a, $7e ld l, a ld h, SCC_H ; more scc stuff jp JumpWriteSlot ._bc: call LABEL2 ld e, a ld a, (MuSICABytes+8) dec a jp LABEL6 ._bb: call GetOPLLVol ld e, a ld a, (MuSICABytes+8) add a, $30 ; vol addresses jp WRTOPL LABEL11: set 6, (ix+12) jr ._bd ._bg: res 6, (ix+12) ._bd: ld hl, 0 ._bf: ex de, hl call LABEL9 ; $608 ex de, hl ld d, 0 ld e, a add hl, de cp 255 jr z, ._bf ld de, 0 ld a, (ix+12) ld b, a and $60 jr nz, ._bl ld a, b and 15 cp 8 jr z, ._bl inc e or a jr z, ._bl push hl push hl ld b, a ld d, h ld e, l ._bk: add hl, de djnz ._bk srl h rr l srl h rr l srl h rr l ld a, h or l jr nz, ._bj inc l ._bj: ex de, hl pop hl or a sbc hl, de ex de, hl pop hl ._bl: dec hl ld (ix+8), l ld (ix+9), h ld (ix+10), e ld (ix+11), d ret ._ca: ld a, (ix+6) dec a jr z, ._bi ld (ix+6), a ld l, (ix+2) ld h, (ix+3) ld e, (hl) inc hl ld d, (hl) ld (ix+4), e ld (ix+5), d scf ret ._bi: ld l, (ix+2) ld h, (ix+3) inc hl inc hl inc hl ld (ix+2), l ld (ix+3), h ld e, (hl) inc hl ld d, (hl) inc hl ld a, (hl) ld (ix+4), e ld (ix+5), d ld (ix+6), a ld a, d or e scf ret nz ld a, 1 ld (ix+7), a or a ret LABEL8: ld l, (ix+14) ld a, (ix+13) add a, a add a, a add a, a add a, a and $30 or (ix+15) ld h, a ret GetOPLLVol: ld a, (ix+16) call OPLLVolByte ld b, a ld a, (ix+17) add a, a add a, a add a, a add a, a or b ret EnablePSGChannels: ld a, 7 call RDPSG ld e, a ld a, (WorkRAM+$f7) bit 2, a jr nz, ._bh ld a, e and %11110110 ld e, a ld a, (WorkRAM+$1bf) and %00001001 or e ld e, a ._bh: ld a, (WorkRAM+$111) bit 2, a jr nz, ._bu ld a, e and %11101101 ld e, a ld a, (WorkRAM+$1c8) and %00001001 add a, a or e ld e, a ._bu: ld a, (WorkRAM+$12b) bit 2, a jr nz, ._bv ld a, e and %11011011 ld e, a ld a, (WorkRAM+$1d1) and %00001001 add a, a add a, a or e ld e, a ._bv: ld a, 7 call WRTPSG ret LABEL1: ld bc, (WorkRAM+$202) ld h, 54 call LABEL20 ld bc, (WorkRAM+$203) inc h call LABEL20 ld bc, (WorkRAM+$205) inc h LABEL20: ld a, b call OPLLVolByte add a, a add a, a add a, a add a, a ld l, a ld a, c call OPLLVolByte or l ld e, a ld a, h call WRTOPL ret LABEL13: push hl or a sbc hl, de pop hl ret LABEL18: ld a, (ix+7) or a ret nz ld l, (ix+8) ld h, (ix+9) ld a, h or l jr z, ._be dec hl ld (ix+8), l ld (ix+9), h ret ._be: call LABEL9 cp 255 jr z, ._bw cp 192 jr z, ._bx cp 193 jr z, ._bz bit 7, a jp nz, LABEL19 push af ld e, 32 ld a, 14 call WRTOPL pop af and %00011111 or %00100000 ld e, a ld a, 14 call WRTOPL call LABEL11._bg ret ._bw: call LABEL11._ca jp c, LABEL18._be ret ._bx: call LABEL9 ld b, a call LABEL9 ld e, a ld a, b call WRTOPL jr LABEL18._be ._bz: call LABEL11 jr LABEL18._be LABEL19: ld b, a call LABEL9 and %00001111 bit 4, b jr z, ._cb ld (WorkRAM+$202), a ; workram = dbda ._cb: bit 3, b jr z, ._cc ld (WorkRAM+$203), a ._cc: bit 2, b jr z, ._cd ld (WorkRAM+$206), a ._cd: bit 1, b jr z, ._ce ld (WorkRAM+$205), a ._ce: bit 0, b jp z, LABEL12 ld (WorkRAM+$204), a LABEL12: call LABEL1 jr LABEL18._be LABEL17: ld a, (ix+7) or a ret nz ld l, (ix+8) ld h, (ix+9) ld e, (ix+10) ld d, (ix+11) call LABEL13 jr nz, ._cf ld a, (ix+12) and %01100000 jr nz, ._cf res 0, (ix+13) ld a, (MuSICABytes+8) cp 9 jr nc, ._cg call LABEL7 jr ._cf ._cg: call LABEL21 ._cf: ld l, (ix+8) ld h, (ix+9) ld a, h or l jr z, LABEL10 dec hl ld (ix+8), l ld (ix+9), h jr LABEL14 LABEL10: call LABEL9 cp 255 jr z, LABEL22 cp $60 jp c, LABEL23 cp $70 jp c, LABEL24 cp $80 jp c, LABEL25 sub $80 add a, a ld d, 0 ld e, a ld hl, Table_A add hl, de ld e, (hl) inc hl ld d, (hl) ex de, hl jp (hl) Table_A: ; db $21, $da, dw LABEL25.xa dw LABEL25.xb dw LABEL25.xc dw LABEL25.xd dw LABEL25.xe dw LABEL25.xf dw LABEL25.xg dw LABEL25.xh dw LABEL25.xi dw LABEL25.xj dw LABEL25.xk dw LABEL25.xl dw LABEL25.xm dw LABEL25.xn ;db $28, $da, ;db $2f, $da, $35, $da ; db $a3, $da, $aa, $da, $b1, $da, $c1, $da ; db $ca, $da, $e3, $da, $f0, $da, $f3, $da ; db $ff, $da, ; db $2a, $db LABEL22: call LABEL11._ca ; cd 06 d5 jp c, LABEL10 ; da ac d6 ; probably playback jp LABEL14 ; c3 f6 d6 LABEL14: bit 6, (ix+12) ; dd cb 0c 76 jr nz, ._ch ; 20 10 call LABEL26 ; cd 1c d7 call LABEL27 ; cd 00 d8 ld a, (MuSICABytes+8) ; 3a 9f ce cp 9 ; fe 09 jr c, ._ch ; 38 03 call LABEL28 ; cd 42 d7 ._ch: ld a, (ix+20) ; dd 7e 14 or a jr nz, ._ci ld a, (ix+19) ; dd 7e 13 ld (ix+20), a ; dd 77 14 ._ci: dec (ix+20) ; dd 35 14 ret ; c9 LABEL26: ld a, (ix+21) ; dd 7e 15 or a ret z ; b7 c8 ld a, (ix+20) ; dd 7e 14 or a ret nz ; b7 c0 ld a, (ix+22) ; dd 7e 16 neg ; ed 44 ld (ix+22), a ; dd 77 16 ld e, a ; 5f 07 9f rlca sbc a, a ld d, a ; 57 ld l, (ix+23) ; dd 6e 17 ld h, (ix+24) add hl, de ; dd 66 18 19 ld (ix+14), l ; dd 75 0e ; 940 ld (ix+15), h ; dd 74 0f jp LABEL7 ; c3 35 d4 : 946h LABEL28: ld a, (iy+6) ; fd 7e 06 dec a ; 3d jp z, LABEL29 ; ca 72 d7 dec a ; 3d ret z ; c8 dec a ; 3d jp z, LABEL30 ; ca 94 d7 dec a ; 3d jp z, LABEL30._cj ; ca af d7 dec (iy+7) ; fd 35 07 ret nz ; c0 ld a, (iy+0) ; fd 7e 00 call LABEL31 ; cd b2 d7 ld (iy+7), b ; fd 70 07 add a, (iy+8) ; fd 86 08 cp 15 ; fe 0f jr c, ._ck ; 38 05 call LABEL32 ; cd d0 d7 3e 0f ld a, 15 ._ck: ld (iy+8), a ; fd 77 08 jp LABEL30._cj ; c3 af d7 LABEL29: dec (iy+7) ; fd 35 07 c0 ret nz ld a, (iy+1) ; fd 7e 01 call LABEL31 ; cd b2 d7 ld (iy+7), b ; fd 70 07 47 ld b, a ld a, (iy+8) ; fd 7e 08 90 sub b ld (iy+8), a ; fd 77 08 jr c, ._cl ; 38 05 cp (iy+2) ; fd be 02 jr nc, ._cm ; 30 03 ._cl: call LABEL33 ; cd de d7 ._cm: jp LABEL30._cj ; c3 af d7 LABEL30: dec (iy+7) ; fd 35 07 ret nz ; c0 ld a, (iy+3) ; fd 7e 03 call LABEL31 ; cd b2 d7 ld (iy+7), b ; fd 70 07 ld b, a ; 47 ld a, (iy+8) ; fd 7e 08 sub b ; 90 jr nc, ._cn ; 30 04 call LABEL34 ; cd f7 d7 xor a ; af ._cn: ld (iy+8), a ; fd 77 08 ._cj: jp LABEL35 ; c3 77 d4 LABEL31: ld c, a ; 4f rra ; 1f 1f 1f 1f rra rra rra and %00001111 ; e6 0f ld b, a ; 47 ld a, c ; 79 and %00001111 ; e6 0f ret ; 9c4: c9 LABEL15: ld a, (iy+0) ; fd 7e 00 call LABEL31 ; cd b2 d7 ld (iy+7), b ; fd 70 07 ld (iy+6), 0 ; fd 36 06 00 ld (iy+8), 0 ; fd 36 08 00 ret ; 9d6h: c9 LABEL32: ld a, (iy+1) ; fd 7e 01 call LABEL31 ; cd b2 d7 ld (iy+7), b ; fd 70 07 ld (iy+6), 1 ; fd 36 06 01 ret LABEL33: ld (iy+6), 2 ld a, (iy+2) ld (iy+8), a ret LABEL21: ld a, (iy+3) call LABEL31 ld (iy+7), b ld (iy+6), 3 ret LABEL34: ld (iy+6), 4 ld (iy+8), 0 ret LABEL27: ld a, (ix+25) or a ret z ld a, (ix+20) or a ret nz ld e, (ix+14) ld d, (ix+15) ld l, (ix+23) ld h, (ix+24) call LABEL13 jp z, LABEL27._co jp c, LABEL27._cp ld l, (ix+25) ld h, 0 add hl, de ld a, (MuSICABytes+8) cp 9 jr nc, ._cq push hl ld a, h and 1 ld h, a ld de, $0156 ; ??? or a sbc hl, de pop hl jr c, ._cq ld a, h and %00001110 add a, 2 ld h, a ld l, $ab ._cq: ld e, (ix+23) ld d, (ix+24) call LABEL13 jr c, ._co jr ._cr ._cp: ld l, (ix+25) ld h, 0 ex de, hl or a sbc hl, de ld a, (MuSICABytes+8) cp 9 jr nc, ._cs push hl ld a, h and 1 ld h, a ld de, 171 or a sbc hl, de pop hl jr nc, ._cs ld a, h and %00001110 sub 2 or 1 ld h, a ld l, 85 ._cs: ld e, (ix+23) ld d, (ix+24) call LABEL13 jr nc, ._co jr ._cr ._cr: ex de, hl ._co: ld (ix+14), l ld (ix+15), h call LABEL7 ret LABEL23: ld b, a ld a, (MuSICABytes+8) cp 9 ld a, b jp nc, LABEL16 or a jr z, LABEL23._ct dec a ld l, a ld h, 0 ld b, 8 ._cv: add hl, hl ld a, h sub 12 jr c, ._cu inc l ld h, a ._cu: djnz ._cv push hl sla h ld e, h ld d, 0 ld hl, Table_B add hl, de ld c, (hl) inc hl ld b, (hl) inc hl ld e, (hl) inc hl ld d, (hl) ld a, (ix+21) or a jr z, ._cw push de call LABEL36 pop de ld (ix+22), a ._cw: ld a, (ix+18) or a ld hl, 0 jr z, ._cx call LABEL36 ld h, 0 ld l, a ._cx: add hl, bc pop de ld a, e add a, a or h ld h, a ld (ix+23), l ld (ix+24), h set 0, (ix+13) call LABEL11._bg ld a, (ix+25) or a jp nz, LABEL14 ld a, (ix+23) ld (ix+14), a ld a, (ix+24) ld (ix+15), a call LABEL7 jp LABEL14 ._ct: res 0, (ix+13) call LABEL11._bg call LABEL7 jp LABEL14 Table_B: ; Note frequency table db $ab, $00, $b6, $00, $c0, $00, $cc, $00 db $d8, $00, $e5, $00, $f2, $00, $01, $01 db $10, $01, $20, $01, $32, $01, $44, $01 db $56, $01 LABEL16: or a jp z, ._cz dec a ld l, a ld h, 0 ld b, 8 ._db: add hl, hl ld a, h sub 12 jr c, ._da inc l ld h, a ._da: djnz ._db push hl sla h ld e, h ld d, 0 ld hl, Table_C add hl, de ld c, (hl) inc hl ld b, (hl) inc hl ld e, (hl) inc hl ld d, (hl) pop hl inc l ._dd: dec l jr z, ._dc srl b rr c srl d rr e jr ._dd ._dc: ld a, (ix+21) or a jr z, ._de push de call LABEL36._df pop de ld (ix+22), a ._de: ld a, (ix+18) or a ld hl, 0 jr z, ._dg call LABEL36._df ld h, 0 ld l, a ._dg: add hl, bc ld (ix+23), l ld (ix+24), h bit 0, (ix+13) jr nz, ._dh call LABEL15 ._dh: set 0, (ix+13) call LABEL11._bg ld a, (ix+25) or a jp nz, LABEL14 ld a, (ix+23) ld (ix+14), a ld a, (ix+24) ld (ix+15), a call LABEL7 jp LABEL14 ._cz: res 0, (ix+13) call LABEL21 call LABEL35 call LABEL11._bg jp LABEL14 ; c3 f6 d6 Table_C: db $5d, $0d, $9c, $0c, $e7, $0b, $3c, $0b db $9b, $0a, $02, $0a, $73, $09, $eb, $08 db $6b, $08, $f2, $07, $80, $07, $1a, $07, $af, $06 LABEL36: ex de, hl ; 00bdfh or a ; b7 sbc hl, bc ; ed 42 jr ._di ; 18 05 ._df: ld h, b ld l, c ; 60 69 or a ; b7 sbc hl, de ; ed 52 ._di: ex de, hl ; eb ld hl, 0 ; 21 00 00 ._dl: or a ; b7 jr z, ._dj ; 28 0b srl a ; cb 3f jr nc, ._dk ; 30 01 add hl, de ; 19 ._dk: sla e rl d ; cb 23 cb 12 jr ._dl ; 18 f2 ._dj: ld a, h ; 7c or a ; b7 ret nz ; c0 inc a ; 3c ret ; c00: c9 LABEL24: sub $60 ld (ix+16), a call LABEL35 jp LABEL10 LABEL25: sub $70 ld (ix+17), a ld a, (MuSICABytes+8) cp 9 jp nc, LABEL10 call GetOPLLVol ld e, a ld a, (MuSICABytes+8) add a, $30 call WRTOPL jp LABEL10 .xa: res 1, (ix+13) jp LABEL10 .xb: set 1, (ix+13) jp LABEL10 .xc: call LABEL9 jp LABEL10 .xd: call LABEL9 ld e, a call LABEL9 ld d, a ex de, hl ld a, (MuSICABytes+8) cp 12 jr nc, ._dm cp 9 jr nc, ._dn xor a ._do: ld e, (hl) call WRTOPL inc a inc hl cp 8 jr c, ._do jp LABEL10 ._dn: push iy pop de ld bc, 6 ldir call EnablePSGChannels ld a, (iy+5) and %00001000 jp nz, LABEL10 ld e, (iy+4) ld a, 6 call LABEL6 jp LABEL10 ._dm: push iy pop de ld bc, 4 ldir ex de, hl ld a, (MuSICABytes+8) sub 12 cp 4 jr nz, ._dp ld a, 3 ._dp: add a, a add a, a add a, a add a, a add a, a ld l, a ld h, SCC_H ld b, $20 ._dq: push bc push de ld a, (de) ld e, a call JumpWriteSlot pop de pop bc inc de inc hl djnz ._dq jp LABEL10 .xe: res 5, (ix+12) jp LABEL10 .xf: set 5, (ix+12) jp LABEL10 .xg: call LABEL9 ld b, a ld a, (ix+12) and %11110000 or b ld (ix+12), a jp LABEL10 .xh: call LABEL9 ld (ix+18), a jp LABEL10 .xi: call LABEL9 ld (ix+25), a ld (ix+21), 0 ld l, (ix+23) ld h, (ix+24) ld (ix+14), l ld (ix+15), h jp LABEL10 .xj: call LABEL9 ld (ix+21), a ld (ix+25), 0 jp LABEL10 .xk: jp LABEL10 .xl: call LABEL9 ld (ix+19), a ld (ix+20), a jp LABEL10 .xm: call LABEL9 ld b, a call LABEL9 ld e, a ld a, (MuSICABytes+8) cp 12 jr nc, ._ds cp 9 ld a, b jr nc, ._dr call WRTOPL ; wrtopl jp LABEL10 ; c3 ac d6 ._dr: call LABEL6 jp LABEL10 ._ds: ld l, b set 7, l ld h, SCC_H call JumpWriteSlot jp LABEL10 .xn: call LABEL11 jp LABEL10 Copyright: db "COPYRIGHT 1990 ASCII CORPORATION MSX-MAGAZINE MUSIC DRIVER [MuSICA ver 1.0]" db " PROGRAM BY TETSUMA YOSHIDA" ds 64, $20 WorkRAM: ; dbda ds 519 replayEOF: ; dde1... problem bc TPA is d606