.MACRODEF LOAD_MUSIC =music_addr LD A, bank(=music_addr) LD ($mem_current_vgm_header), A LD A, high(ptr(=music_addr)) LD ($mem_current_vgm_header+1), A LD A, low(ptr(=music_addr)) LD ($mem_current_vgm_header+2), A .END Reset_Music_Channels: CALL =Reset_Music_Channel4 CALL =Reset_Music_Channel3 CALL =Reset_Music_Channel2 Reset_Music_Channel1: LD A, $00 LD ($11), A LD ($12), A LD ($13), A LD ($14), A RET Reset_Music_Channel2: LD A, $00 LD ($16), A LD ($17), A LD ($18), A LD ($19), A RET Reset_Music_Channel3: LD A, $00 LD ($1A), A LD ($1B), A LD ($1C), A LD ($1D), A LD ($1E), A RET Reset_Music_Channel4: LD A, $00 LD ($20), A LD ($21), A LD ($22), A LD ($23), A RET Start_Music: LD A, ($mem_current_vgm_header) .CHANGE_BANK_TO_A LD A, ($mem_current_vgm_header+1) LD H, A LD A, ($mem_current_vgm_header+2) LD L, A LD A, L ADD $34 LD L, A LD A, H ADC $00 LD H, A CALL =Fix_HL_Bank LD A, L ADD (HL) LD L, A LD A, H ADC $00 LD H, A CALL =Fix_HL_Bank LD A, $saved_rom_bank LD ($mem_current_vgm_pc), A LD A, H LD ($mem_current_vgm_pc+1), A LD A, L LD ($mem_current_vgm_pc+2), A RET Loop_Music: LD A, ($mem_current_vgm_header) .CHANGE_BANK_TO_A LD A, ($mem_current_vgm_header+1) LD H, A LD A, ($mem_current_vgm_header+2) LD L, A LD A, L ADD $1c LD L, A LD A, H ADC $00 LD H, A CALL =Fix_HL_Bank LD B, H LD C, L LD A, $saved_rom_bank LD E, A LD A, B SUB $40 LD B, A LD A, (HL) LD $tmp_var_1, A CALL =Inc_HL_Fix_Bank ADD C LD C, A LD A, (HL) LD $tmp_var_2, A CALL =Inc_HL_Fix_Bank ADC B LD B, A LD A, (HL) LD $tmp_var_3, A CALL =Inc_HL_Fix_Bank ADC E LD E, A LD A, $tmp_var_1 CP $00 JR NZ, =.end_check_empty LD A, $tmp_var_2 CP $00 JR NZ, =.end_check_empty LD A, $tmp_var_2 CP $00 JR Z, =Stop_music .end_check_empty: LD A, $00 SLA B RL A ADD E LD E, A SRA B LD A, $40 ADD B LD B, A LD A, E LD ($mem_current_vgm_pc), A LD A, B LD ($mem_current_vgm_pc+1), A LD A, C LD ($mem_current_vgm_pc+2), A RET Stop_Music: LD A, $mem_sound_flags RES 0, A LD $mem_sound_flags, A LD A, $mem_sound_flags BIT 1, A CALL Z, =Reset_Music_Channel1 LD A, $mem_sound_flags BIT 2, A CALL Z, =Reset_Music_Channel2 LD A, $mem_sound_flags BIT 3, A CALL Z, =Reset_Music_Channel3 LD A, $mem_sound_flags BIT 4, A CALL Z, =Reset_Music_Channel4 RET Inc_HL_Fix_Bank: PUSH AF INC HL CALL =Fix_HL_Bank POP AF RET Fix_HL_Bank: LD A, H CP $80 JR C, =.end SUB $40 LD H, A LD A, $saved_rom_bank INC A .CHANGE_BANK_TO_A .end: RET Check_Channel_Available: ; TODO: Channel panning register in $FF25 is still impacted by music CP $24 RET NC PUSH BC CP $1A JR NC =.channel_3_4 .channel_1_2: CP $16 JR NC, =.channel_2 .channel_1: LD C, A LD A, $mem_sound_flags BIT 1, A LD A, C JR Z, =.end LD A, $00 JR =.end .channel_2: LD C, A LD A, $mem_sound_flags BIT 2, A LD A, C JR Z, =.end LD A, $00 JR =.end .channel_3_4: CP $20 JR NC, =.channel_4 .channel_3: LD C, A LD A, $mem_sound_flags BIT 3, A LD A, C JR Z, =.end LD A, $00 JR =.end .channel_4: LD C, A LD A, $mem_sound_flags BIT 4, A LD A, C JR Z, =.end LD A, $00 .end: POP BC RET Play_Music: LD A, $mem_sound_flags BIT 0, A RET Z BIT 5, A JR Z, =.sound_effect_frame_count_dec_skip LD A, $mem_sound_effect_frame_count DEC A LD $mem_sound_effect_frame_count, A CP $00 JR NZ, =.sound_effect_frame_count_dec_skip LD A, $mem_sound_flags AND 0b11000001 LD $mem_sound_flags, A .sound_effect_frame_count_dec_skip: LD A, ($mem_current_vgm_pc) .CHANGE_BANK_TO_A LD A, ($mem_current_vgm_pc+1) LD H, A LD A, ($mem_current_vgm_pc+2) LD L, A .next: LD A, (HL) CALL =Inc_HL_Fix_Bank CP $b3 JR NZ, =.set_register.end .set_register: LD A, (HL) CALL =Inc_HL_Fix_Bank LD C, A LD B, (HL) CALL =Inc_HL_Fix_Bank LD A, C ADD $10 CALL =Check_Channel_Available CP $00 JR Z, =.next LD C, A LD A, B LD (C), A JR =.next .set_register.end: CP $66 JP Z, =Loop_Music CP $62 JR Z, =.panic.end CP $61 JR NZ, =.the61thingy.end .the61thingy: CALL =Inc_HL_Fix_Bank CALL =Inc_HL_Fix_Bank JR =.panic.end .the61thingy.end: .panic: LD A, $saved_rom_bank STOP .panic.end: LD A, H LD ($mem_current_vgm_pc+1), A LD A, L LD ($mem_current_vgm_pc+2), A LD A, $saved_rom_bank LD ($mem_current_vgm_pc), A RET