Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- diff -rupN xpmck-27/src/z80driver/z80driver.asm xpmck-28/src/z80driver/z80driver.asm
- --- xpmck-27/src/z80driver/z80driver.asm 2010-01-24 19:35:08.000000000 -0500
- +++ xpmck-28/src/z80driver/z80driver.asm 2010-02-10 13:32:18.000000000 -0500
- @@ -16,21 +16,21 @@
- ; The effect pointer tables are copied to fixed addresses in Z80 RAM by the 68k code.
- ; These addresses are defined here.
- -.DEFINE xpmp_dt_mac_tbl $1E00
- -.DEFINE xpmp_dt_mac_loop_tbl $1E02
- -.DEFINE xpmp_v_mac_tbl $1E04
- -.DEFINE xpmp_v_mac_loop_tbl $1E06
- -.DEFINE xpmp_EP_mac_tbl $1E08
- -.DEFINE xpmp_EP_mac_loop_tbl $1E0A
- -.DEFINE xpmp_EN_mac_tbl $1E0C
- -.DEFINE xpmp_EN_mac_loop_tbl $1E0E
- -.DEFINE xpmp_MP_mac_tbl $1E10
- -.DEFINE xpmp_ADSR_tbl $1E12
- -.DEFINE xpmp_MOD_tbl $1E14
- -.DEFINE xpmp_pattern_tbl $1E16
- -.DEFINE xpmp_FB_mac_tbl $1E18
- -.DEFINE xpmp_FB_mac_loop_tbl $1E1A
- -.DEFINE xpmp_song_tbl $1E1C
- +.DEFINE xpmp_dt_mac_tbl $1E40
- +.DEFINE xpmp_dt_mac_loop_tbl $1E42
- +.DEFINE xpmp_v_mac_tbl $1E44
- +.DEFINE xpmp_v_mac_loop_tbl $1E46
- +.DEFINE xpmp_EP_mac_tbl $1E48
- +.DEFINE xpmp_EP_mac_loop_tbl $1E4A
- +.DEFINE xpmp_EN_mac_tbl $1E4C
- +.DEFINE xpmp_EN_mac_loop_tbl $1E4E
- +.DEFINE xpmp_MP_mac_tbl $1E50
- +.DEFINE xpmp_ADSR_tbl $1E52
- +.DEFINE xpmp_MOD_tbl $1E54
- +.DEFINE xpmp_pattern_tbl $1E56
- +.DEFINE xpmp_FB_mac_tbl $1E58
- +.DEFINE xpmp_FB_mac_loop_tbl $1E5A
- +.DEFINE xpmp_song_tbl $1E5C
- .DEFINE XPMP_RAM_START $1B00
- @@ -65,6 +65,7 @@
- .EQU CMD_LEN $9A
- .EQU CMD_WRMEM $9B
- .EQU CMD_WRPORT $9C
- +.EQU CMD_TRANSP $9F
- .EQU CMD_MODE $A0
- .EQU CMD_FEEDBK $B0
- .EQU CMD_OPER $C0
- @@ -139,14 +140,31 @@ returnAddr dw ; 48
- oldPos dw ; 50
- delayLatch dw ; 52
- delayLatch2 db ; 54
- +transpose db ; 55
- .ENDST
- -.EQU _FM_DATAPOS 2
- -.EQU _FM_NOTE 7
- -.EQU _FM_VOLUME 15
- -.EQU _FM_OPER 39
- -.EQU _FM_TL 83
- +.EQU _CHN_DATAPTR 0
- +.EQU _CHN_DATAPOS 2
- +.EQU _CHN_DELAY 4
- +.EQU _CHN_NOTE 7
- +.EQU _CHN_NOTEOFFS 8
- +.EQU _CHN_OCTAVE 9
- +.EQU _PSG_VOLUME 13
- +.EQU _FM_VOLUME 15
- +.EQU _FM_VMAC 16
- +.EQU _PSG_VMAC 22
- +.EQU _PSG_ENMAC 26
- +.EQU _PSG_EN2MAC 30
- +.EQU _FM_LOOPPTR 34
- +.EQU _FM_OCT8 38
- +.EQU _FM_OPER 39
- +.EQU _FM_REG3X 40
- +.EQU _FM_REG4X 44
- +.EQU _FM_REG5X 48
- +.EQU _PSG_TRANSP 55
- +.EQU _FM_TL 83
- +.EQU _FM_TRANSP 87
- ; For YM2612 channels
- .STRUCT xpmp_fm_channel_t
- @@ -221,6 +239,7 @@ tl0 db ; 83
- tl1 db ; 84
- tl2 db ; 85
- tl3 db ; 86
- +transpose db ; 87
- .ENDST
- @@ -254,6 +273,36 @@ xpmp_tempw dw
- .ENDE
- +.MACRO INC_DATAPOS
- + .IF == 1
- + inc (ix+_CHN_DATAPOS)
- + jr nz,+
- + inc (ix+_CHN_DATAPOS+1)
- + +:
- + .ELSE
- + ld e,(ix+_CHN_DATAPOS)
- + ld d,(ix+_CHN_DATAPOS+1)
- + .rept
- + inc de
- + .endr
- + ld (ix+_CHN_DATAPOS),e
- + ld (ix+_CHN_DATAPOS+1),d
- + .ENDIF
- +.ENDM
- +
- +
- +.MACRO RESET_EFFECT
- + ld a,(ix+)
- + bit 7,a
- + jr nz,+
- + cp EFFECT_DISABLED
- + call nz,xpmp_\2_reset_\3_mac ; Reset effects as needed..
- + jr xpmp_\2_\3_reset
- + +:
- + call xpmp_\2_step_\3
- + xpmp_\2_\3_reset:
- +.ENDM
- +
- ; Compare HL with an immediate 16-bit number and jump if less (unsigned)
- .MACRO JL_IMM16
- push hl
- @@ -278,8 +327,8 @@ xpmp_tempw dw
- .MACRO INIT_CHANNEL
- ld a,(hl)
- - or $80
- - ld (xpmp_channel.dataPtr+1),a
- + or $80 ; Set bit 7 to access the 32k bank in M68000 memory
- + ld (xpmp_channel.dataPtr+1),a ; Convert from BE to LE
- inc hl
- ld a,(hl)
- ld (xpmp_channel\1.dataPtr),a
- @@ -368,8 +417,6 @@ xpmp_init:
- ld hl,(xpmp_tempw)
- - ;foo: jr foo
- -
- INIT_CHANNEL 0
- INIT_CHANNEL 1
- INIT_CHANNEL 2
- @@ -588,10 +635,7 @@ xpmp_fm_cmd_60:
- cp CMD_VOLUP
- jr nz,xpmp_fm_cmd_00_2
- - inc (ix+2)
- - jr nz,+
- - inc (ix+3)
- - +:
- + INC_DATAPOS 1
- inc hl
- ld b,(hl) ; Get increment
- ld (ix+16),0 ; Turn off volume macro
- @@ -624,28 +668,23 @@ xpmp_fm_cmd_00_volinc:
- ret
- xpmp_fm_cmd_00_2:
- - ld a,(ix+_FM_NOTE)
- + ld a,(ix+_CHN_NOTE)
- ld (xpmp_lastNote),a ; Save the previous note
- ld a,c
- and $0F
- - ld (ix+_FM_NOTE),a
- + ld (ix+_CHN_NOTE),a
- ld a,c
- and $F0
- cp CMD_NOTE2
- - jr z,xpmp_fm_cmd_00_std_delay
- - ld e,(ix+_FM_DATAPOS)
- - ld d,(ix+_FM_DATAPOS+1)
- - inc de
- - inc de
- - ld (ix+_FM_DATAPOS),e
- - ld (ix+_FM_DATAPOS+1),d
- + jr z,xpmp_fm_cmd_00_std_delay
- + INC_DATAPOS 2
- inc hl
- ld a,(hl)
- bit 7,a
- jr z,xpmp_fm_cmd_00_short_note
- inc de
- - ld (ix+_FM_DATAPOS),e
- - ld (ix+_FM_DATAPOS+1),d
- + ld (ix+_CHN_DATAPOS),e
- + ld (ix+_CHN_DATAPOS+1),d
- inc hl
- res 7,a
- ld d,a
- @@ -656,33 +695,33 @@ xpmp_fm_cmd_00_2:
- or e
- ld e,a
- inc hl
- - ld a,(ix+4)
- + ld a,(ix+_CHN_DELAY)
- add a,(hl)
- - ld (ix+4),a ; Fractional part
- + ld (ix+_CHN_DELAY),a ; Fractional part
- ld hl,0
- adc hl,de
- - ld (ix+5),l ; Whole part
- - ld (ix+6),h
- + ld (ix+_CHN_DELAY+1),l ; Whole part
- + ld (ix+_CHN_DELAY+2),h
- jp xpmp_fm_cmd_00_got_delay
- xpmp_fm_cmd_00_short_note:
- ld d,0
- ld e,a
- inc hl
- - ld a,(ix+4)
- + ld a,(ix+_CHN_DELAY)
- add a,(hl)
- - ld (ix+4),a ; Fractional part
- + ld (ix+_CHN_DELAY),a ; Fractional part
- ld hl,0
- adc hl,de
- ret z
- - ld (ix+5),l ; Whole part
- - ld (ix+6),h
- + ld (ix+_CHN_DELAY+1),l ; Whole part
- + ld (ix+_CHN_DELAY+2),h
- jp xpmp_fm_cmd_00_got_delay
- xpmp_fm_cmd_00_std_delay:
- ld a,(ix+80)
- ld b,a
- - ld a,(ix+4)
- + ld a,(ix+_CHN_DELAY)
- add a,b
- - ld (ix+4),a
- + ld (ix+_CHN_DELAY),a
- ld l,(ix+81)
- ld h,(ix+82)
- ld de,0
- @@ -693,37 +732,32 @@ xpmp_fm_cmd_00_2:
- xpmp_fm_cmd_00_got_delay:
- ld a,2
- ld (xpmp_freqChange),a
- - ld a,(ix+_FM_NOTE)
- + ld a,(ix+_CHN_NOTE)
- cp CMD_REST
- ret z ; If this was a rest command we can return now
- cp CMD_REST2
- ret z
- +
- .IFNDEF XPMP_VMAC_NOT_USED
- - ld a,(ix+16)
- - cp EFFECT_DISABLED
- - call nz,xpmp_fm_reset_v_mac ; Reset effects as needed..
- + RESET_EFFECT _FM_VMAC,fm,v
- .ENDIF
- +
- .IFNDEF XPMP_ENMAC_NOT_USED
- - ld a,(ix+20)
- - cp EFFECT_DISABLED
- - call nz,xpmp_fm_reset_en_mac
- + RESET_EFFECT 20,fm,en
- .ENDIF
- +
- .IFNDEF XPMP_EN2MAC_NOT_USED
- - ld a,(ix+24)
- - cp EFFECT_DISABLED
- - call nz,xpmp_fm_reset_en2_mac
- + RESET_EFFECT 24,fm,en2
- .ENDIF
- +
- .IFNDEF XPMP_EPMAC_NOT_USED
- - ld a,(ix+28)
- - cp EFFECT_DISABLED
- - call nz,xpmp_fm_reset_ep_mac
- + RESET_EFFECT 28,fm,ep
- .ENDIF
- - ld a,(ix+68)
- - cp EFFECT_DISABLED
- - call nz,xpmp_fm_reset_al_mac
- - ld a,(ix+72)
- - cp EFFECT_DISABLED
- - call nz,xpmp_fm_reset_fb_mac
- +
- + RESET_EFFECT 68,fm,al
- +
- + RESET_EFFECT 72,fm,fb
- +
- ;ld hl,(xpmp_channel\1.cbEvnote)
- ;ld a,h
- ;or l
- @@ -731,11 +765,11 @@ xpmp_fm_cmd_00_2:
- ;jp (hl)
- ret
- +
- ; Set octave
- xpmp_fm_cmd_10:
- ld a,c
- and $0F
- - ;inc a
- dec a ; Minimum octave is 1
- ld b,a
- add a,a
- @@ -743,9 +777,9 @@ xpmp_fm_cmd_10:
- add a,a
- sla b
- sla b
- - ld (ix+38),a ; A = (C & $0F) * 8
- + ld (ix+_FM_OCT8),a ; A = (C & $0F) * 8
- add a,b ; A = (C & $0F) * 12
- - ld (ix+9),a
- + ld (ix+_CHN_OCTAVE),a
- ret
- ; Set algorithm
- @@ -774,12 +808,12 @@ xpmp_fm_cmd_30:
- ; Octave up + note
- xpmp_fm_cmd_40:
- ld hl,(xpmp_tempw)
- - ld a,(ix+9)
- + ld a,(ix+_CHN_OCTAVE)
- add a,12
- - ld (ix+9),a
- - ld a,(ix+38)
- + ld (ix+_CHN_OCTAVE),a
- + ld a,(ix+_FM_OCT8)
- add a,8
- - ld (ix+38),a
- + ld (ix+_FM_OCT8),a
- ld a,c
- add a,$20
- ld c,a
- @@ -788,12 +822,12 @@ xpmp_fm_cmd_40:
- ; Octave down + note
- xpmp_fm_cmd_50:
- ld hl,(xpmp_tempw)
- - ld a,(ix+9)
- + ld a,(ix+_CHN_OCTAVE)
- sub 12
- - ld (ix+9),a
- - ld a,(ix+38)
- + ld (ix+_CHN_OCTAVE),a
- + ld a,(ix+_FM_OCT8)
- sub 8
- - ld (ix+38),a
- + ld (ix+_FM_OCT8),a
- ld a,c
- add a,$10
- ld c,a
- @@ -822,19 +856,21 @@ xpmp_fm_cmd_90:
- jp z,xpmp_fm_cmd_90_wrmem
- cp CMD_WRPORT
- jp z,xpmp_fm_cmd_90_wrport
- + cp CMD_TRANSP
- + jp z,xpmp_fm_cmd_90_transp
- ret
- xpmp_fm_cmd_90_90:
- ld a,0
- ld (ix+20),a
- ld (ix+24),a
- - ld (ix+8),a
- + ld (ix+_CHN_NOTEOFFS),a
- ret
- xpmp_fm_cmd_90_91:
- - inc (ix+_FM_DATAPOS)
- + inc (ix+_CHN_DATAPOS)
- jr nz,+
- - inc (ix+_FM_DATAPOS+1)
- + inc (ix+_CHN_DATAPOS+1)
- +:
- inc hl
- ld (ix+75),1
- @@ -842,6 +878,7 @@ xpmp_fm_cmd_90:
- ld (ix+72),a
- ret
- xpmp_fm_reset_fb_mac:
- + and $7F
- dec a
- add a,a
- ld hl,(xpmp_FB_mac_tbl)
- @@ -873,25 +910,25 @@ xpmp_fm_cmd_90:
- ; Return from pattern
- xpmp_fm_cmd_90_rts:
- ld a,(ix+76)
- - ld (ix+0),a
- + ld (ix+_CHN_DATAPTR),a
- ld a,(ix+77)
- - ld (ix+1),a
- + ld (ix+_CHN_DATAPTR+1),a
- ld a,(ix+78)
- - ld (ix+2),a
- + ld (ix+_CHN_DATAPOS),a
- ld a,(ix+79)
- - ld (ix+3),a
- + ld (ix+_CHN_DATAPOS+1),a
- ret
- ; Jump to pattern
- xpmp_fm_cmd_90_jsr:
- - ld e,(ix+_FM_DATAPOS)
- - ld d,(ix+_FM_DATAPOS+1)
- + ld e,(ix+_CHN_DATAPOS)
- + ld d,(ix+_CHN_DATAPOS+1)
- inc de
- ld (ix+78),e
- ld (ix+79),d
- - ld a,(ix+0)
- + ld a,(ix+_CHN_DATAPTR)
- ld (ix+76),a
- - ld a,(ix+1)
- + ld a,(ix+_CHN_DATAPTR+1)
- ld (ix+77),a
- ld hl,(xpmp_tempw)
- inc hl
- @@ -905,27 +942,22 @@ xpmp_fm_cmd_90:
- or $80
- inc hl
- ld d,(hl)
- - ld (ix+0),d
- - ld (ix+1),a
- - ld (ix+_FM_DATAPOS),$FF
- - ld (ix+_FM_DATAPOS+1),$FF
- + ld (ix+_CHN_DATAPTR),d
- + ld (ix+_CHN_DATAPTR+1),a
- + ld (ix+_CHN_DATAPOS),$FF
- + ld (ix+_CHN_DATAPOS+1),$FF
- ret
- xpmp_fm_cmd_90_len:
- ld hl,(xpmp_tempw)
- - ld e,(ix+_FM_DATAPOS)
- - ld d,(ix+_FM_DATAPOS+1)
- - inc de
- - inc de
- - ld (ix+_FM_DATAPOS),e
- - ld (ix+_FM_DATAPOS+1),d
- + INC_DATAPOS 2
- inc hl
- ld a,(hl)
- bit 7,a
- jr z,xpmp_fm_cmd_90_short_delay
- inc de
- - ld (ix+_FM_DATAPOS),e
- - ld (ix+_FM_DATAPOS+1),d
- + ld (ix+_CHN_DATAPOS),e
- + ld (ix+_CHN_DATAPOS+1),d
- inc hl
- res 7,a
- ld d,a
- @@ -961,17 +993,18 @@ xpmp_fm_cmd_90:
- ld a,(hl)
- ld (de),a
- -:
- - ld e,(ix+_FM_DATAPOS)
- - ld d,(ix+_FM_DATAPOS+1)
- - inc de
- - inc de
- - inc de
- - ld (ix+_FM_DATAPOS),e
- - ld (ix+_FM_DATAPOS+1),d
- + INC_DATAPOS 3
- ret
- xpmp_fm_cmd_90_wrport:
- jr - ; No ports on this system
- -
- +
- + xpmp_fm_cmd_90_transp:
- + ld hl,(xpmp_tempw)
- + inc hl
- + ld a,(hl)
- + ld (ix+_FM_TRANSP),a
- + INC_DATAPOS 1
- + ret
- ; Set mode
- xpmp_fm_cmd_A0:
- @@ -1003,18 +1036,15 @@ xpmp_fm_cmd_B0:
- xpmp_fm_cmd_C0:
- ld a,c
- and 7
- - ld (ix+39),a
- + ld (ix+_FM_OPER),a
- ret
- ; Set rate scaling
- xpmp_fm_cmd_D0:
- ld hl,(xpmp_tempw)
- - inc (ix+_FM_DATAPOS)
- - jr nz,+
- - inc (ix+_FM_DATAPOS+1)
- - +:
- + INC_DATAPOS 1
- inc hl
- - ld a,(ix+39)
- + ld a,(ix+_FM_OPER)
- cp 0
- jr z,xpmp_fm_cmd_D0_all
- ld a,(hl)
- @@ -1024,7 +1054,7 @@ xpmp_fm_cmd_D0:
- ld c,a
- ld (xpmp_tempw),ix
- ld hl,(xpmp_tempw)
- - ld a,(ix+39)
- + ld a,(ix+_FM_OPER)
- add a,47
- ld e,a
- ld d,0
- @@ -1086,10 +1116,7 @@ xpmp_fm_cmd_D0:
- xpmp_fm_cmd_E0:
- ld hl,(xpmp_tempw)
- - inc (ix+_FM_DATAPOS)
- - jr nz,+
- - inc (ix+_FM_DATAPOS+1)
- - +:
- + INC_DATAPOS 1
- ld a,c
- cp CMD_ADSR
- jr z,xpmp_fm_cmd_E0_adsr
- @@ -1119,7 +1146,7 @@ xpmp_fm_cmd_E0_adsr:
- ld e,(hl)
- ex de,hl
- - ld a,(ix+39)
- + ld a,(ix+_FM_OPER)
- cp 0
- jr z,xpmp_fm_adsr_all
- xpmp_fm_adsr_spec:
- @@ -1201,7 +1228,7 @@ xpmp_fm_cmd_E0_adsr:
- xpmp_fm_cmd_E0_mult:
- inc hl
- - ld a,(ix+39)
- + ld a,(ix+_FM_OPER)
- cp 0
- jr z,xpmp_fm_mult_all
- ld a,(hl)
- @@ -1209,7 +1236,7 @@ xpmp_fm_cmd_E0_mult:
- ld c,a
- ld (xpmp_tempw),ix
- ld hl,(xpmp_tempw)
- - ld a,(ix+39)
- + ld a,(ix+_FM_OPER)
- add a,39
- ld e,a
- ld d,0
- @@ -1219,7 +1246,7 @@ xpmp_fm_cmd_E0_mult:
- or c
- ld (hl),a
- ld (iy+1),a
- - ld a,(ix+39)
- + ld a,(ix+_FM_OPER)
- add a,a
- add a,a
- add a,$2C
- @@ -1233,28 +1260,28 @@ xpmp_fm_cmd_E0_mult:
- ld a,(hl)
- and 15
- ld d,a
- - ld a,(ix+40)
- + ld a,(ix+_FM_REG3X)
- and $70
- or d
- - ld (ix+40),a
- + ld (ix+_FM_REG3X),a
- ld (iy+1),a
- ld (iy+0),$30
- - ld a,(ix+41)
- + ld a,(ix+_FM_REG3X+1)
- and $70
- or d
- - ld (ix+41),a
- + ld (ix+_FM_REG3X+1),a
- ld (iy+3),a
- ld (iy+2),$34
- - ld a,(ix+42)
- + ld a,(ix+_FM_REG3X+2)
- and $70
- or d
- - ld (ix+42),a
- + ld (ix+_FM_REG3X+2),a
- ld (iy+5),a
- ld (iy+4),$38
- - ld a,(ix+43)
- + ld a,(ix+_FM_REG3X+3)
- and $70
- or d
- - ld (ix+43),a
- + ld (ix+_FM_REG3X+3),a
- ld (iy+7),a
- ld (iy+6),$3C
- ld hl,XPMP_FM_BUF
- @@ -1267,7 +1294,7 @@ xpmp_fm_cmd_E0_mult:
- xpmp_fm_cmd_E0_detune:
- inc hl
- - ld a,(ix+39)
- + ld a,(ix+_FM_OPER)
- cp 0
- jr z,xpmp_fm_detune_all
- ld a,(hl)
- @@ -1279,7 +1306,7 @@ xpmp_fm_cmd_E0_detune:
- ld c,a
- ld (xpmp_tempw),ix
- ld hl,(xpmp_tempw)
- - ld a,(ix+39)
- + ld a,(ix+_FM_OPER)
- add a,39
- ld e,a
- ld d,0
- @@ -1289,7 +1316,7 @@ xpmp_fm_cmd_E0_detune:
- or c
- ld (hl),a
- ld (iy+1),a
- - ld a,(ix+39)
- + ld a,(ix+_FM_OPER)
- add a,a
- add a,a
- add a,$2C
- @@ -1307,28 +1334,28 @@ xpmp_fm_cmd_E0_detune:
- add a,a
- add a,a
- ld d,a
- - ld a,(ix+40)
- + ld a,(ix+_FM_REG3X)
- and $0F
- or d
- - ld (ix+40),a
- + ld (ix+_FM_REG3X),a
- ld (iy+1),a
- ld (iy+0),$30
- - ld a,(ix+41)
- + ld a,(ix+_FM_REG3X+1)
- and $0F
- or d
- - ld (ix+41),a
- + ld (ix+_FM_REG3X+1),a
- ld (iy+3),a
- ld (iy+2),$34
- - ld a,(ix+42)
- + ld a,(ix+_FM_REG3X+2)
- and $0F
- or d
- - ld (ix+42),a
- + ld (ix+_FM_REG3X+2),a
- ld (iy+5),a
- ld (iy+4),$38
- - ld a,(ix+43)
- + ld a,(ix+_FM_REG3X+3)
- and $0F
- or d
- - ld (ix+43),a
- + ld (ix+_FM_REG3X+3),a
- ld (iy+7),a
- ld (iy+6),$3C
- ld hl,XPMP_FM_BUF
- @@ -1346,7 +1373,7 @@ xpmp_fm_cmd_E0_am:
- ld l,a
- ;ex de,hl
- - ld a,(ix+39)
- + ld a,(ix+_FM_OPER)
- cp 0
- jr z,xpmp_fm_am_all
- xpmp_fm_am_spec:
- @@ -1440,10 +1467,7 @@ xpmp_fm_cmd_E0_mod:
- xpmp_fm_cmd_F0:
- ld hl,(xpmp_tempw)
- - inc (ix+_FM_DATAPOS)
- - jr nz,+
- - inc (ix+_FM_DATAPOS+1)
- - +:
- + INC_DATAPOS 1
- ld a,c
- cp CMD_VOLSET
- jr z,xpmp_fm_cmd_F0_volset
- @@ -1473,7 +1497,7 @@ xpmp_fm_cmd_F0_volset:
- inc hl
- ld b,(hl)
- ld a,0
- - ld (ix+16),a ; Turn off volume macro
- + ld (ix+_FM_VMAC),a ; Turn off volume macro
- xpmp_fm_cmd_F0_volset_2:
- ld a,1
- ld (xpmp_volChange),a
- @@ -1481,28 +1505,28 @@ xpmp_fm_cmd_F0_volset_2:
- cp 0
- jr z,+
- xpmp_fm_cmd_F0_volset_spec:
- - ld (xpmp_tempv),ix
- - ld hl,(xpmp_tempv)
- - add a,_FM_TL-1
- - ld e,a
- - ld d,0
- - add hl,de
- - ld (hl),b
- + ld (xpmp_tempv),ix
- + ld hl,(xpmp_tempv)
- + add a,_FM_TL-1
- + ld e,a
- + ld d,0
- + add hl,de
- + ld (hl),b
- ret
- +:
- - ld a,1
- - call xpmp_fm_cmd_F0_volset_spec
- - ld a,2
- - call xpmp_fm_cmd_F0_volset_spec
- - ld a,3
- - call xpmp_fm_cmd_F0_volset_spec
- - ld a,4
- - call xpmp_fm_cmd_F0_volset_spec
- + ld a,1
- + call xpmp_fm_cmd_F0_volset_spec
- + ld a,2
- + call xpmp_fm_cmd_F0_volset_spec
- + ld a,3
- + call xpmp_fm_cmd_F0_volset_spec
- + ld a,4
- + call xpmp_fm_cmd_F0_volset_spec
- ret
- xpmp_fm_cmd_F0_END:
- ld a,CMD_END
- - ld (ix+7),a ; Playback of this channel should end
- + ld (ix+_CHN_NOTE),a ; Playback of this channel should end
- ld a,2
- ld (xpmp_freqChange),a ; The command-reading loop should exit
- ret
- @@ -1510,8 +1534,9 @@ xpmp_fm_cmd_F0_volset_2:
- xpmp_fm_cmd_F0_VOLMAC:
- inc hl
- ld a,(hl)
- - ld (ix+16),a
- + ld (ix+_FM_VMAC),a
- xpmp_fm_reset_v_mac:
- + and $7F
- dec a
- add a,a
- ld hl,(xpmp_v_mac_tbl)
- @@ -1538,6 +1563,7 @@ xpmp_fm_cmd_F0_volset_2:
- cp EFFECT_DISABLED
- jr z,xpmp_fm_cmd_F0_disable_SWPMAC
- xpmp_fm_reset_ep_mac:
- + and $7F
- dec a
- add a,a
- ld hl,(xpmp_EP_mac_tbl)
- @@ -1573,52 +1599,49 @@ xpmp_fm_cmd_F0_volset_2:
- inc hl
- ld d,(hl)
- dec de ; dataPos will be increased after the return, so we decrease it here
- - ld (ix+_FM_DATAPOS),e
- - ld (ix+_FM_DATAPOS+1),d
- + ld (ix+_CHN_DATAPOS),e
- + ld (ix+_CHN_DATAPOS+1),d
- ret
- ; Set loop count
- xpmp_fm_cmd_F0_LOPCNT:
- inc hl
- ld a,(hl)
- - ld l,(ix+34)
- - ld h,(ix+35)
- + ld l,(ix+_FM_LOOPPTR)
- + ld h,(ix+_FM_LOOPPTR+1)
- inc hl
- ld (hl),a
- - ld (ix+34),l
- - ld (ix+35),h
- + ld (ix+_FM_LOOPPTR),l
- + ld (ix+_FM_LOOPPTR+1),h
- ret
- ; Jump if one
- xpmp_fm_cmd_F0_J1:
- - ld l,(ix+34)
- - ld h,(ix+35)
- + ld l,(ix+_FM_LOOPPTR)
- + ld h,(ix+_FM_LOOPPTR+1)
- ld a,(hl)
- cp 1
- jr nz,xpmp_fm_cmd_F0_J1_N1 ; Check if the counter has reached 1
- dec hl
- - ld (ix+34),l
- - ld (ix+35),h
- + ld (ix+_FM_LOOPPTR),l
- + ld (ix+_FM_LOOPPTR+1),h
- ld hl,(xpmp_tempw)
- inc hl
- ld e,(hl)
- inc hl
- ld d,(hl)
- dec de ; dataPos will be increased after the return, so we decrease it here
- - ld (ix+_FM_DATAPOS),e
- - ld (ix+_FM_DATAPOS+1),d
- + ld (ix+_CHN_DATAPOS),e
- + ld (ix+_CHN_DATAPOS+1),d
- ret
- xpmp_fm_cmd_F0_J1_N1:
- - inc (ix+_FM_DATAPOS)
- - jr nz,+
- - inc (ix+_FM_DATAPOS+1)
- - +:
- + INC_DATAPOS 1
- ret
- ; Decrease and jump if not zero
- xpmp_fm_cmd_F0_DJNZ:
- - ld l,(ix+34)
- - ld h,(ix+35)
- + ld l,(ix+_FM_LOOPPTR)
- + ld h,(ix+_FM_LOOPPTR+1)
- dec (hl)
- jr z,xpmp_fm_cmd_F0_DJNZ_Z ; Check if the counter has reached zero
- ld hl,(xpmp_tempw)
- @@ -1627,17 +1650,14 @@ xpmp_fm_cmd_F0_volset_2:
- inc hl
- ld d,(hl)
- dec de ; dataPos will be increased after the return, so we decrease it here
- - ld (ix+_FM_DATAPOS),e
- - ld (ix+_FM_DATAPOS+1),d
- + ld (ix+_CHN_DATAPOS),e
- + ld (ix+_CHN_DATAPOS+1),d
- ret
- xpmp_fm_cmd_F0_DJNZ_Z:
- dec hl
- - ld (ix+34),l
- - ld (ix+35),h
- - inc (ix+_FM_DATAPOS)
- - jr nz,+
- - inc (ix+_FM_DATAPOS+1)
- - +:
- + ld (ix+_FM_LOOPPTR),l
- + ld (ix+_FM_LOOPPTR+1),h
- + INC_DATAPOS 1
- ret
- xpmp_fm_cmd_F0_ALGMAC:
- @@ -1645,6 +1665,7 @@ xpmp_fm_cmd_F0_volset_2:
- ld a,(hl)
- ld (ix+68),a
- xpmp_fm_reset_al_mac:
- + and $7F
- dec a
- add a,a
- ld hl,(xpmp_dt_mac_tbl)
- @@ -1679,6 +1700,7 @@ xpmp_fm_cmd_F0_volset_2:
- ld a,(hl)
- ld (ix+24),a
- xpmp_fm_reset_en2_mac:
- + and $7F
- dec a
- add a,a
- ld hl,(xpmp_EN_mac_tbl)
- @@ -1707,6 +1729,7 @@ xpmp_fm_cmd_F0_volset_2:
- ld a,(hl)
- ld (ix+20),a
- xpmp_fm_reset_en_mac:
- + and $7F
- dec a
- add a,a
- ld hl,(xpmp_EN_mac_tbl)
- @@ -1761,12 +1784,12 @@ xpmp_update_fm:
- ld (xpmp_freqChange),a
- ld (xpmp_volChange),a
- - ld a,(ix+7)
- + ld a,(ix+_CHN_NOTE)
- cp CMD_END
- ret z ; Playback has ended for this channel - all processing should be skipped
- - ld l,(ix+5) ; Decrement the whole part of the delay and check if it has reached zero
- - ld h,(ix+6)
- + ld l,(ix+_CHN_DELAY+1) ; Decrement the whole part of the delay and check if it has reached zero
- + ld h,(ix+_CHN_DELAY+2)
- dec hl
- ld a,h
- or l
- @@ -1774,10 +1797,10 @@ xpmp_update_fm:
- ; Loop here until a note/rest or END command is read (signaled by xpmp_freqChange == 2)
- xpmp_update_fm_read_cmd:
- - ld l,(ix+0)
- - ld h,(ix+1)
- - ld e,(ix+2)
- - ld d,(ix+3)
- + ld l,(ix+_CHN_DATAPTR)
- + ld h,(ix+_CHN_DATAPTR+1)
- + ld e,(ix+_CHN_DATAPOS)
- + ld d,(ix+_CHN_DATAPOS+1)
- add hl,de
- ld c,(hl)
- ld (xpmp_tempw),hl ; Store HL for later use
- @@ -1796,10 +1819,7 @@ xpmp_update_fm:
- ex de,hl
- call xpmp_call_hl
- - inc (ix+2)
- - jr nz,+
- - inc (ix+3)
- - +:
- + INC_DATAPOS 1
- ld a,(xpmp_freqChange)
- cp 2
- @@ -1808,7 +1828,7 @@ xpmp_update_fm:
- xpmp_update_fm_freq_change:
- call write_fm_buf
- - ld a,(ix+7)
- + ld a,(ix+_CHN_NOTE)
- cp CMD_REST
- jp z,xpmp_update_fm_rest
- cp CMD_REST2
- @@ -1826,12 +1846,14 @@ xpmp_update_fm:
- call write_fm_low ; KEY_OFF
- +:
- - ld a,(ix+8)
- - add a,c
- + ld a,(ix+_CHN_NOTEOFFS)
- + ld d,(ix+_FM_TRANSP)
- + add a,d
- + add a,c ; note + noteOffs + transpose
- ld b,a
- - ld a,(ix+9)
- + ld a,(ix+_CHN_OCTAVE)
- add a,b
- - bit 7,a
- + bit 7,a ; negative?
- jr z,fm_note_lb_ok
- ld a,0
- jr fm_note_ok
- @@ -1922,12 +1944,30 @@ xpmp_update_fm:
- ret
- xpmp_update_fm_effects:
- - ld (ix+5),l
- - ld (ix+6),h
- + ld (ix+_CHN_DELAY+1),l
- + ld (ix+_CHN_DELAY+2),h
- + call xpmp_fm_step_v_frame
- + call xpmp_fm_step_en_frame
- + call xpmp_fm_step_en2_frame
- + call xpmp_fm_step_al_frame
- + call xpmp_fm_step_fb_frame
- + call xpmp_fm_step_ep_frame
- +
- + ld a,(xpmp_freqChange)
- + cp 0
- + jp nz,xpmp_update_fm_freq_change
- + jp xpmp_update_fm_set_vol
- + ret
- +
- +
- + xpmp_fm_step_v_frame:
- + bit 7,(ix+_FM_VMAC)
- + ret nz
- + xpmp_fm_step_v:
- .IFNDEF XPMP_VMAC_NOT_USED
- ; Volume macro
- - ld a,(ix+16)
- + ld a,(ix+_FM_VMAC)
- cp EFFECT_DISABLED
- jr z,xpmp_update_fm_v_done
- xpmp_update_fm_v:
- @@ -1949,7 +1989,8 @@ xpmp_update_fm:
- call xpmp_fm_cmd_F0_volset_2
- jp xpmp_update_fm_v_done
- xpmp_update_fm_v_loop:
- - ld a,(ix+16) ; Which volume macro are we using?
- + ld a,(ix+_FM_VMAC) ; Which volume macro are we using?
- + and $7F
- dec a
- ld e,a
- sla e ; Each pointer is two bytes
- @@ -1974,15 +2015,24 @@ xpmp_update_fm:
- call xpmp_fm_cmd_F0_volset_2
- xpmp_update_fm_v_done:
- .ENDIF
- + ret
- + xpmp_fm_step_en_frame:
- + bit 7,(ix+20)
- + ret nz
- + xpmp_fm_step_en:
- .IFNDEF XPMP_ENMAC_NOT_USED
- ; Cumulative arpeggio
- ld a,(ix+20)
- cp EFFECT_DISABLED
- jr z,xpmp_update_fm_EN_done
- xpmp_update_fm_EN:
- + ld a,(xpmp_freqChange)
- + cp 2
- + jr z,+
- ld a,1
- ld (xpmp_freqChange),a ; Frequency has changed, but we haven't read a new note/rest yet
- + +:
- ld l,(ix+21)
- ld h,(ix+22)
- ld d,0
- @@ -2001,6 +2051,7 @@ xpmp_update_fm:
- jp xpmp_update_fm_EN_done
- xpmp_update_fm_EN_loop:
- ld a,(ix+20) ; Which arpeggio macro are we using?
- + and $7F
- dec a
- add a,a ; Each pointer is two bytes
- ld e,a
- @@ -2025,15 +2076,24 @@ xpmp_update_fm:
- ld (ix+8),a ; Reset note offset
- xpmp_update_fm_EN_done:
- .ENDIF
- -
- + ret
- +
- + xpmp_fm_step_en2_frame:
- + bit 7,(ix+24)
- + ret nz
- + xpmp_fm_step_en2:
- .IFNDEF XPMP_EN2MAC_NOT_USED
- ; Non-cumulative arpeggio
- ld a,(ix+24)
- cp EFFECT_DISABLED
- jr z,xpmp_update_fm_EN2_done
- xpmp_update_fm_EN2:
- + ld a,(xpmp_freqChange)
- + cp 2
- + jr z,+
- ld a,1
- ld (xpmp_freqChange),a ; Frequency has changed, but we haven't read a new note/rest yet
- + +:
- ld l,(ix+25)
- ld h,(ix+26)
- ld d,0
- @@ -2049,6 +2109,7 @@ xpmp_update_fm:
- jp xpmp_update_fm_EN2_done
- xpmp_update_fm_EN2_loop:
- ld a,(ix+24) ; Which arpeggio macro are we using?
- + and $7F
- dec a
- add a,a ; Each pointer is two bytes
- ld e,a
- @@ -2071,7 +2132,12 @@ xpmp_update_fm:
- ld (ix+8),a ; Reset note offset
- xpmp_update_fm_EN2_done:
- .ENDIF
- -
- + ret
- +
- + xpmp_fm_step_al_frame:
- + bit 7,(ix+68)
- + ret nz
- + xpmp_fm_step_al:
- ld a,(ix+68)
- cp EFFECT_DISABLED
- jr z,xpmp_update_fm_al_done
- @@ -2100,7 +2166,8 @@ xpmp_update_fm:
- ld (ix+71),a
- jp xpmp_update_fm_al_done
- xpmp_update_fm_al_loop:
- - ld a,(ix+68) ; Which arpeggio macro are we using?
- + ld a,(ix+68) ; Which algorithm macro are we using?
- + and $7F
- dec a
- add a,a ; Each pointer is two bytes
- ld e,a
- @@ -2131,7 +2198,12 @@ xpmp_update_fm:
- ld hl,XPMP_FM_BUF
- inc (hl)
- xpmp_update_fm_al_done:
- + ret
- + xpmp_fm_step_fb_frame:
- + bit 7,(ix+72)
- + ret nz
- + xpmp_fm_step_fb:
- ld a,(ix+72)
- cp EFFECT_DISABLED
- jr z,xpmp_update_fm_fb_done
- @@ -2160,7 +2232,8 @@ xpmp_update_fm:
- ld (ix+75),a
- jp xpmp_update_fm_fb_done
- xpmp_update_fm_fb_loop:
- - ld a,(ix+72) ; Which arpeggio macro are we using?
- + ld a,(ix+72) ; Which feedback macro are we using?
- + and $7F
- dec a
- add a,a ; Each pointer is two bytes
- ld e,a
- @@ -2191,15 +2264,24 @@ xpmp_update_fm:
- ld hl,XPMP_FM_BUF
- inc (hl)
- xpmp_update_fm_fb_done:
- -
- + ret
- +
- + xpmp_fm_step_ep_frame:
- + bit 7,(ix+28)
- + ret nz
- + xpmp_fm_step_ep:
- .IFNDEF XPMP_EPMAC_NOT_USED
- ; Sweep macro
- ld a,(ix+28)
- cp EFFECT_DISABLED
- jr z,xpmp_update_fm_EP_done
- xpmp_update_fm_EP:
- + ld a,(xpmp_freqChange)
- + cp 2
- + jr z,+
- ld a,1
- ld (xpmp_freqChange),a ; Frequency has changed, but we haven't read a new note/rest yet
- + +:
- ld l,(ix+29)
- ld h,(ix+30)
- ld d,0
- @@ -2227,6 +2309,7 @@ xpmp_update_fm:
- jp xpmp_update_fm_EP_done
- xpmp_update_fm_EP_loop:
- ld a,(ix+28) ; Which sweep macro are we using?
- + and $7F
- dec a
- add a,a ; Each pointer is two bytes
- ld e,a
- @@ -2258,13 +2341,7 @@ xpmp_update_fm:
- ld (ix+12),h
- xpmp_update_fm_EP_done:
- .ENDIF
- -
- - ld a,(xpmp_freqChange)
- - cp 0
- - jp nz,xpmp_update_fm_freq_change
- - jp xpmp_update_fm_set_vol
- -
- - ret
- + ret
- @@ -2281,43 +2358,34 @@ xpmp_tone_cmd_60:
- ld a,c
- cp CMD_VOLUP
- jr nz,xpmp_tone_cmd_00_2
- - inc (ix+2)
- - jr nz,+
- - inc (ix+3)
- - +:
- - ld a,(ix+13)
- + INC_DATAPOS 1
- + ld a,(ix+_PSG_VOLUME)
- inc hl
- add a,(hl)
- - ld (ix+13),a
- + ld (ix+_PSG_VOLUME),a
- ld a,1
- ld (xpmp_volChange),a ; Volume has changed
- - ld a,EFFECT_DISABLED
- - ld (ix+22),a ; Volume set overrides volume macros
- + ld (ix+_PSG_VMAC),EFFECT_DISABLED ; Volume set overrides volume macros
- ret
- xpmp_tone_cmd_00_2:
- - ld a,(ix+7)
- + ld a,(ix+_CHN_NOTE)
- ld (xpmp_lastNote),a
- ld a,c
- and $0F
- - ld (ix+7),a
- + ld (ix+_CHN_NOTE),a
- ld a,c
- and $F0
- cp CMD_NOTE2
- jr z,xpmp_tone_cmd_00_std_delay
- - ld e,(ix+2)
- - ld d,(ix+3)
- - inc de
- - inc de
- - ld (ix+2),e
- - ld (ix+3),d
- + INC_DATAPOS 2
- inc hl
- ld a,(hl)
- bit 7,a
- jr z,xpmp_tone_cmd_00_short_note
- inc de
- - ld (ix+2),e
- - ld (ix+3),d
- + ld (ix+_CHN_DATAPOS),e
- + ld (ix+_CHN_DATAPOS+1),d
- inc hl
- res 7,a
- ld d,a
- @@ -2328,26 +2396,26 @@ xpmp_tone_cmd_00_2:
- or e
- ld e,a
- inc hl
- - ld a,(ix+4)
- + ld a,(ix+_CHN_DELAY)
- add a,(hl)
- - ld (ix+4),a ; Fractional part
- + ld (ix+_CHN_DELAY),a ; Fractional part
- ld hl,0
- adc hl,de
- - ld (ix+5),l ; Whole part
- - ld (ix+6),h
- + ld (ix+_CHN_DELAY+1),l ; Whole part
- + ld (ix+_CHN_DELAY+2),h
- jp xpmp_tone_cmd_00_got_delay
- xpmp_tone_cmd_00_short_note:
- ld d,0
- ld e,a
- inc hl
- - ld a,(ix+4)
- + ld a,(ix+_CHN_DELAY)
- add a,(hl)
- - ld (ix+4),a ; Fractional part
- + ld (ix+_CHN_DELAY),a ; Fractional part
- ld hl,0
- adc hl,de
- ret z
- - ld (ix+5),l ; Whole part
- - ld (ix+6),h
- + ld (ix+_CHN_DELAY+1),l ; Whole part
- + ld (ix+_CHN_DELAY+2),h
- jp xpmp_tone_cmd_00_got_delay
- xpmp_tone_cmd_00_std_delay: ; Use delay set by last CMD_LEN
- ld a,(ix+52)
- @@ -2371,35 +2439,27 @@ xpmp_tone_cmd_00_2:
- cp CMD_REST2
- ret z
- .IFNDEF XPMP_VMAC_NOT_USED
- - ld a,(ix+22)
- - cp EFFECT_DISABLED
- - call nz,xpmp_tone_reset_v_mac ; Reset effects as needed..
- + RESET_EFFECT 22,tone,v
- .ENDIF
- .IFNDEF XPMP_ENMAC_NOT_USED
- - ld a,(ix+26)
- - cp EFFECT_DISABLED
- - call nz,xpmp_tone_reset_en_mac
- + RESET_EFFECT 26,tone,en
- .ENDIF
- .IFNDEF XPMP_EN2MAC_NOT_USED
- - ld a,(ix+30)
- - cp EFFECT_DISABLED
- - call nz,xpmp_tone_reset_en2_mac
- + RESET_EFFECT 30,tone,en2
- .ENDIF
- .IFNDEF XPMP_MPMAC_NOT_USED
- - ld a,(ix+38)
- - cp EFFECT_DISABLED
- - call nz,xpmp_tone_reset_mp_mac
- + RESET_EFFECT 38,tone,mp
- .ENDIF
- .IFNDEF XPMP_EPMAC_NOT_USED
- - ld a,(ix+34)
- - cp EFFECT_DISABLED
- - call nz,xpmp_tone_reset_ep_mac
- + RESET_EFFECT 34,tone,ep
- .ENDIF
- - .IFDEF XPMP_GAME_GEAR
- - ld a,(xpmp_channel.csMac)
- - cp EFFECT_DISABLED
- - call nz,xpmp__reset_cs_mac
- - .ENDIF
- +
- + ;.IFDEF XPMP_GAME_GEAR
- + ;ld a,(xpmp_channel.csMac)
- + ;cp EFFECT_DISABLED
- + ;call nz,xpmp__reset_cs_mac
- + ;.ENDIF
- +
- ;ld hl,(xpmp_channel\1.cbEvnote)
- ;ld a,h
- ;or l
- @@ -2419,30 +2479,20 @@ xpmp_tone_cmd_10:
- sla b
- sla b
- add a,b ; A = (C & $0F) * 12
- - ld (ix+9),a
- + ld (ix+_CHN_OCTAVE),a
- ret
- xpmp_tone_cmd_20:
- -; .IF == 3
- -; ld hl,(xpmp_tempw)
- -; ld a,c
- -; and 1
- -; xor 1
- -; add a,a
- -; add a,a
- -; ld (xpmp_channel.duty),a
- -; .ENDIF
- ret
- ; Set volume (short)
- xpmp_tone_cmd_30:
- ld a,c
- and $0F
- - ld (ix+13),a
- + ld (ix+_PSG_VOLUME),a
- ld a,1
- ld (xpmp_volChange),a ; Volume has changed
- - ld a,EFFECT_DISABLED
- - ld (ix+22),a ; Volume set overrides volume macros
- + ld (ix+_PSG_VMAC),EFFECT_DISABLED ; Volume set overrides volume macros
- ret
- ; Octave up + note
- @@ -2451,9 +2501,9 @@ xpmp_tone_cmd_40:
- ld a,(ix+9)
- add a,12
- ld (ix+9),a
- -ld a,c
- -add a,$20
- -ld c,a
- + ld a,c
- + add a,$20
- + ld c,a
- jp xpmp_tone_cmd_00_2
- ; Octave down + note
- @@ -2462,12 +2512,11 @@ xpmp_tone_cmd_50:
- ld a,(ix+9)
- sub 12
- ld (ix+9),a
- -ld a,c
- -add a,$10
- -ld c,a
- + ld a,c
- + add a,$10
- + ld c,a
- jp xpmp_tone_cmd_00_2
- -;xpmp_tone_cmd_60:
- xpmp_tone_cmd_70:
- xpmp_tone_cmd_80:
- ret
- @@ -2485,6 +2534,8 @@ xpmp_tone_cmd_90:
- jp z,xpmp_fm_cmd_90_wrmem
- cp CMD_WRPORT
- jp z,xpmp_fm_cmd_90_wrport
- + cp CMD_TRANSP
- + jp z,xpmp_tone_cmd_90_transp
- ld hl,(xpmp_tempw)
- ld a,0
- @@ -2495,14 +2546,14 @@ xpmp_tone_cmd_90:
- ; Jump to pattern
- xpmp_tone_cmd_90_jsr:
- - ld e,(ix+2)
- - ld d,(ix+3)
- + ld e,(ix+_CHN_DATAPOS)
- + ld d,(ix+_CHN_DATAPOS+1)
- inc de
- ld (ix+50),e
- ld (ix+51),d
- - ld a,(ix+0)
- + ld a,(ix+_CHN_DATAPTR)
- ld (ix+48),a
- - ld a,(ix+1)
- + ld a,(ix+_CHN_DATAPTR+1)
- ld (ix+49),a
- ld hl,(xpmp_tempw)
- inc hl
- @@ -2516,39 +2567,34 @@ xpmp_tone_cmd_90:
- or $80
- inc hl
- ld d,(hl)
- - ld (ix+0),d
- - ld (ix+1),a
- - ld (ix+2),$FF
- - ld (ix+3),$FF
- + ld (ix+_CHN_DATAPTR),d
- + ld (ix+_CHN_DATAPTR+1),a
- + ld (ix+_CHN_DATAPOS),$FF
- + ld (ix+_CHN_DATAPOS+1),$FF
- ret
- ; Return from pattern
- xpmp_tone_cmd_90_rts:
- ld a,(ix+48)
- - ld (ix+0),a
- + ld (ix+_CHN_DATAPTR),a
- ld a,(ix+49)
- - ld (ix+1),a
- + ld (ix+_CHN_DATAPTR+1),a
- ld a,(ix+50)
- - ld (ix+2),a
- + ld (ix+_CHN_DATAPOS),a
- ld a,(ix+51)
- - ld (ix+3),a
- + ld (ix+_CHN_DATAPOS+1),a
- ret
- xpmp_tone_cmd_90_len:
- ld hl,(xpmp_tempw)
- - ld e,(ix+2)
- - ld d,(ix+3)
- - inc de
- - inc de
- - ld (ix+2),e
- - ld (ix+3),d
- + INC_DATAPOS 2
- inc hl
- ld a,(hl)
- bit 7,a
- jr z,xpmp_tone_cmd_90_short_delay
- inc de
- - ld (ix+2),e
- - ld (ix+3),d
- + ld (ix+_CHN_DATAPOS),e
- + ld (ix+_CHN_DATAPOS+1),d
- inc hl
- res 7,a
- ld d,a
- @@ -2573,6 +2619,14 @@ xpmp_tone_cmd_90:
- ld (ix+53),e ; Whole part
- ld (ix+54),d ; ...
- ret
- +
- + xpmp_tone_cmd_90_transp:
- + ld hl,(xpmp_tempw)
- + inc hl
- + ld a,(hl)
- + ld (ix+_PSG_TRANSP),a
- + INC_DATAPOS 1
- + ret
- xpmp_tone_cmd_A0:
- xpmp_tone_cmd_B0:
- @@ -2583,10 +2637,7 @@ xpmp_tone_cmd_D0:
- ; Callback
- xpmp_tone_cmd_E0:
- ld hl,(xpmp_tempw)
- - inc (ix+2)
- - jr nz,+
- - inc (ix+3)
- - +:
- + INC_DATAPOS 1
- ld a,c
- cp CMD_CBOFF
- jr z,xpmp_tone_cmd_E0_cboff
- @@ -2653,10 +2704,7 @@ xpmp_tone_cmd_E0:
- xpmp_tone_cmd_F0:
- ld hl,(xpmp_tempw)
- - inc (ix+2)
- - jr nz,+
- - inc (ix+3)
- - +:
- + INC_DATAPOS 1
- ; Initialize volume macro
- ld a,c
- @@ -2671,6 +2719,7 @@ xpmp_tone_cmd_F0:
- ld a,(hl)
- ld (ix+22),a
- xpmp_tone_reset_v_mac:
- + and $7F
- dec a
- add a,a
- ld hl,(xpmp_v_mac_tbl)
- @@ -2706,6 +2755,7 @@ xpmp_tone_cmd_F0:
- jr z,xpmp_tone_cmd_F0_disable_VIBMAC
- ld (ix+38),a
- xpmp_tone_reset_mp_mac:
- + and $7F
- dec a
- add a,a
- ld hl,(xpmp_MP_mac_tbl)
- @@ -2751,6 +2801,7 @@ xpmp_tone_cmd_F0:
- cp EFFECT_DISABLED
- jr z,xpmp_tone_cmd_F0_disable_SWPMAC
- xpmp_tone_reset_ep_mac:
- + and $7F
- dec a
- add a,a
- ld hl,(xpmp_EP_mac_tbl)
- @@ -2789,8 +2840,8 @@ xpmp_tone_cmd_F0:
- inc hl
- ld d,(hl)
- dec de ; dataPos will be increased after the return, so we decrease it here
- - ld (ix+2),e
- - ld (ix+3),d
- + ld (ix+_CHN_DATAPOS),e
- + ld (ix+_CHN_DATAPOS+1),d
- ret
- ; Set loop count
- @@ -2821,17 +2872,14 @@ xpmp_tone_cmd_F0:
- inc hl
- ld d,(hl)
- dec de ; dataPos will be increased after the return, so we decrease it here
- - ld (ix+2),e
- - ld (ix+3),d
- + ld (ix+_CHN_DATAPOS),e
- + ld (ix+_CHN_DATAPOS+1),d
- ret
- xpmp_tone_cmd_F0_DJNZ_Z:
- dec hl
- ld (ix+44),l
- ld (ix+45),h
- - inc (ix+2)
- - jr nz,+
- - inc (ix+3)
- - +:
- + INC_DATAPOS 1
- ret
- ; Initialize non-cumulative arpeggio macro
- @@ -2843,6 +2891,7 @@ xpmp_tone_cmd_F0:
- ld a,(hl)
- ld (ix+30),a
- xpmp_tone_reset_en2_mac:
- + and $7F
- dec a
- add a,a
- ld hl,(xpmp_EN_mac_tbl)
- @@ -2866,7 +2915,7 @@ xpmp_tone_cmd_F0:
- ret
- .ENDIF
- - ; Initialize non-cumulative arpeggio macro
- + ; Initialize cumulative arpeggio macro
- xpmp_tone_cmd_F0_check_ARPMAC:
- .IFNDEF XPMP_ENMAC_NOT_USED
- cp CMD_ARPMAC
- @@ -2875,6 +2924,7 @@ xpmp_tone_cmd_F0:
- ld a,(hl)
- ld (ix+26),a
- xpmp_tone_reset_en_mac:
- + and $7F
- dec a
- add a,a
- ld hl,(xpmp_EN_mac_tbl)
- @@ -2958,19 +3008,14 @@ xpmp_noise_cmd_00_2:
- ld a,c
- and $0F
- ld (xpmp_channel3.note),a
- - ld e,(ix+2)
- - ld d,(ix+3)
- - inc de
- - inc de
- - ld (ix+2),e
- - ld (ix+3),d
- + INC_DATAPOS 2
- inc hl
- ld a,(hl)
- bit 7,a
- jr z,xpmp_noise_cmd_00_short_note
- inc de
- - ld (ix+2),e
- - ld (ix+3),d
- + ld (ix+_CHN_DATAPOS),e
- + ld (ix+_CHN_DATAPOS+1),d
- inc hl
- res 7,a
- ld d,a
- @@ -2981,9 +3026,9 @@ xpmp_noise_cmd_00_2:
- or e
- ld e,a
- inc hl
- - ld a,(ix+4)
- + ld a,(ix+_CHN_DELAY)
- add a,(hl)
- - ld (ix+4),a ; Fractional part
- + ld (ix+_CHN_DELAY),a ; Fractional part
- ld hl,0
- adc hl,de
- ld (ix+5),l ; Whole part
- @@ -3011,18 +3056,42 @@ xpmp_noise_cmd_00_2:
- ret z
- .IFNDEF XPMP_VMAC_NOT_USED
- ld a,(ix+22)
- + bit 7,a
- + jr nz,+
- cp EFFECT_DISABLED
- call nz,xpmp_tone_reset_v_mac ; Reset effects as needed..
- + jr xpmp_noise_v_reset
- + +:
- + call xpmp_tone_step_v
- + xpmp_noise_v_reset:
- .ENDIF
- .IFNDEF XPMP_ENMAC_NOT_USED
- ld a,(ix+26)
- + bit 7,a
- + jr nz,+
- cp EFFECT_DISABLED
- - call nz,xpmp_tone_reset_en_mac
- + call nz,xpmp_tone_reset_en_mac ; Reset effects as needed..
- + jr xpmp_noise_en_reset
- + +:
- + call xpmp_tone_step_en
- + xpmp_noise_en_reset:
- + ;ld a,(ix+26)
- + ;cp EFFECT_DISABLED
- + ;call nz,xpmp_tone_reset_en_mac
- .ENDIF
- .IFNDEF XPMP_EN2MAC_NOT_USED
- ld a,(ix+30)
- + bit 7,a
- + jr nz,+
- cp EFFECT_DISABLED
- - call nz,xpmp_tone_reset_en2_mac
- + call nz,xpmp_tone_reset_en2_mac ; Reset effects as needed..
- + jr xpmp_noise_en2_reset
- + +:
- + call xpmp_tone_step_en2
- + xpmp_noise_en2_reset:
- + ;ld a,(ix+30)
- + ;cp EFFECT_DISABLED
- + ;call nz,xpmp_tone_reset_en2_mac
- .ENDIF
- ret
- @@ -3042,9 +3111,9 @@ xpmp_noise_cmd_40:
- ld a,(xpmp_channel3.octave)
- add a,12
- ld (xpmp_channel3.octave),a
- - ld a,c
- - add a,$20
- - ld c,a
- + ld a,c
- + add a,$20
- + ld c,a
- jp xpmp_tone_cmd_60 ;xpmp_noise_cmd_00_2
- ; Octave down + note
- @@ -3053,19 +3122,16 @@ xpmp_noise_cmd_50:
- ld a,(xpmp_channel3.octave)
- sub 12
- ld (xpmp_channel3.octave),a
- - ld a,c
- - add a,$10
- - ld c,a
- + ld a,c
- + add a,$10
- + ld c,a
- jp xpmp_tone_cmd_60 ;xpmp_noise_cmd_00_2
- ; Callback
- xpmp_noise_cmd_E0:
- ld hl,(xpmp_tempw)
- - inc (ix+2)
- - jr nz,+
- - inc (ix+3)
- - +:
- + INC_DATAPOS 1
- ld a,c
- cp CMD_CBOFF
- jp z,xpmp_tone_cmd_E0_cboff
- @@ -3078,10 +3144,7 @@ xpmp_noise_cmd_E0:
- xpmp_noise_cmd_F0:
- ld hl,(xpmp_tempw)
- - inc (ix+2)
- - jr nz,+
- - inc (ix+3)
- - +:
- + INC_DATAPOS 1
- ; Initialize volume macro
- ld a,c
- @@ -3092,6 +3155,7 @@ xpmp_noise_cmd_F0:
- ld a,(hl)
- ld (ix+22),a
- xpmp_noise_reset_v_mac:
- + and $7F
- dec a
- add a,a
- ld hl,(xpmp_v_mac_tbl)
- @@ -3145,12 +3209,12 @@ xpmp_update_psg:
- ld (xpmp_freqChange),a
- ld (xpmp_volChange),a
- - ld a,(ix+7)
- + ld a,(ix+_CHN_NOTE)
- cp CMD_END
- ret z ; Playback has ended for this channel - all processing should be skipped
- - ld l,(ix+5) ; Decrement the whole part of the delay and check if it has reached zero
- - ld h,(ix+6)
- + ld l,(ix+_CHN_DELAY+1) ; Decrement the whole part of the delay and check if it has reached zero
- + ld h,(ix+_CHN_DELAY+2)
- dec hl
- ld a,h
- or l
- @@ -3158,10 +3222,10 @@ xpmp_update_psg:
- ; Loop here until a note/rest or END command is read (signaled by xpmp_freqChange == 2)
- xpmp_update_psg_read_cmd:
- - ld l,(ix+0)
- - ld h,(ix+1)
- - ld e,(ix+2)
- - ld d,(ix+3)
- + ld l,(ix+_CHN_DATAPTR)
- + ld h,(ix+_CHN_DATAPTR+1)
- + ld e,(ix+_CHN_DATAPOS)
- + ld d,(ix+_CHN_DATAPOS+1)
- add hl,de
- ld c,(hl)
- ld (xpmp_tempw),hl ; Store HL for later use
- @@ -3180,10 +3244,7 @@ xpmp_update_psg:
- ex de,hl
- call xpmp_call_hl
- - inc (ix+2)
- - jr nz,+
- - inc (ix+3)
- - +:
- + INC_DATAPOS 1
- ld a,(xpmp_freqChange)
- cp 2
- @@ -3191,7 +3252,7 @@ xpmp_update_psg:
- jp xpmp_update_psg_read_cmd
- xpmp_update_psg_freq_change:
- - ld a,(ix+7)
- + ld a,(ix+_CHN_NOTE)
- cp CMD_REST
- jp z,xpmp_update_psg_rest
- cp CMD_REST2
- @@ -3199,13 +3260,15 @@ xpmp_update_psg:
- cp CMD_END
- jp z,xpmp_update_psg_rest
- ld b,a
- - ld a,(ix+8)
- - add a,b
- + ld a,(ix+_CHN_NOTEOFFS)
- + ld d,(ix+_PSG_TRANSP)
- + add a,d
- + add a,b ; note + noteOffs + transpose
- ld b,a
- ld a,(xpmp_chnum)
- cp 3
- jr z,xpmp_update_psg_noise
- - ld a,(ix+9)
- + ld a,(ix+_CHN_OCTAVE)
- add a,b
- ld hl,xpmp_freq_tbl
- ld d,0
- @@ -3267,7 +3330,7 @@ xpmp_update_psg:
- jp xpmp_update_psg_set_vol3
- xpmp_update_psg_set_vol:
- - ld a,(ix+7)
- + ld a,(ix+_CHN_NOTE)
- cp CMD_REST
- jr z,xpmp_update_psg_rest
- xpmp_update_psg_set_vol2:
- @@ -3277,12 +3340,11 @@ xpmp_update_psg:
- ret z
- xpmp_update_psg_set_vol3:
- ld a,(xpmp_chsel)
- - or (ix+13)
- + or (ix+_PSG_VOLUME)
- xor $9F
- ld ($7F11),a
- res 7,a
- ld ($7F11),a
- -
- xpmp_update_psg_no_vol_change:
- ret
- @@ -3296,12 +3358,29 @@ xpmp_update_psg:
- ret
- xpmp_update_psg_effects:
- - ld (ix+5),l
- - ld (ix+6),h
- + ld (ix+_CHN_DELAY+1),l
- + ld (ix+_CHN_DELAY+2),h
- + call xpmp_tone_step_v_frame
- + call xpmp_tone_step_en_frame
- + call xpmp_tone_step_en2_frame
- + call xpmp_tone_step_ep_frame
- + call xpmp_tone_step_mp_frame
- +
- + xpmp_update_psg_effects_done:
- + ld a,(xpmp_freqChange)
- + cp 0
- + jp nz,xpmp_update_psg_freq_change
- + jp xpmp_update_psg_set_vol
- + ret
- +
- + xpmp_tone_step_v_frame:
- + bit 7,(ix+_PSG_VMAC)
- + ret nz
- + xpmp_tone_step_v:
- .IFNDEF XPMP_VMAC_NOT_USED
- ; Volume macro
- - ld a,(ix+22)
- + ld a,(ix+_PSG_VMAC)
- cp EFFECT_DISABLED
- jr z,xpmp_update_psg_v_done
- xpmp_update_psg_v:
- @@ -3322,12 +3401,15 @@ xpmp_update_psg:
- ld (ix+25),a
- jp xpmp_update_psg_v_done
- xpmp_update_psg_v_loop:
- - ld a,(ix+22) ; Which volume macro are we using?
- + ld a,(ix+_PSG_VMAC) ; Which volume macro are we using?
- + and $7F
- dec a
- ld e,a
- sla e ; Each pointer is two bytes
- ld bc,(xpmp_v_mac_loop_tbl)
- - ld hl,(xpmp_vMacPtr)
- + ;ld hl,(xpmp_vMacPtr)
- + ld l,(ix+23)
- + ld h,(ix+24)
- ex de,hl
- inc de
- add hl,bc ; HL = xpmp_vMac_loop_tbl + (vMac - 1)*2
- @@ -3346,15 +3428,24 @@ xpmp_update_psg:
- ld (ix+13),a
- xpmp_update_psg_v_done:
- .ENDIF
- -
- + ret
- +
- + xpmp_tone_step_en_frame:
- + bit 7,(ix+26)
- + ret nz
- + xpmp_tone_step_en:
- .IFNDEF XPMP_ENMAC_NOT_USED
- ; Cumulative arpeggio
- ld a,(ix+26)
- cp EFFECT_DISABLED
- jr z,xpmp_update_psg_EN_done
- xpmp_update_psg_EN:
- + ld a,(xpmp_freqChange)
- + cp 2
- + jr z,+
- ld a,1
- ld (xpmp_freqChange),a ; Frequency has changed, but we haven't read a new note/rest yet
- + +:
- ld l,(ix+27)
- ld h,(ix+28)
- ld d,0
- @@ -3373,6 +3464,7 @@ xpmp_update_psg:
- jp xpmp_update_psg_EN_done
- xpmp_update_psg_EN_loop:
- ld a,(ix+26) ; Which arpeggio macro are we using?
- + and $7F
- dec a
- add a,a ; Each pointer is two bytes
- ld e,a
- @@ -3397,15 +3489,24 @@ xpmp_update_psg:
- ld (ix+8),a ; Reset note offset
- xpmp_update_psg_EN_done:
- .ENDIF
- -
- + ret
- +
- + xpmp_tone_step_en2_frame:
- + bit 7,(ix+30)
- + ret nz
- + xpmp_tone_step_en2:
- .IFNDEF XPMP_EN2MAC_NOT_USED
- ; Non-cumulative arpeggio
- ld a,(ix+30)
- cp EFFECT_DISABLED
- jr z,xpmp_update_psg_EN2_done
- xpmp_update_psg_EN2:
- + ld a,(xpmp_freqChange)
- + cp 2
- + jr z,+
- ld a,1
- ld (xpmp_freqChange),a ; Frequency has changed, but we haven't read a new note/rest yet
- + +:
- ld l,(ix+31)
- ld h,(ix+32)
- ld d,0
- @@ -3421,6 +3522,7 @@ xpmp_update_psg:
- jp xpmp_update_psg_EN2_done
- xpmp_update_psg_EN2_loop:
- ld a,(ix+30) ; Which arpeggio macro are we using?
- + and $7F
- dec a
- add a,a ; Each pointer is two bytes
- ld e,a
- @@ -3443,18 +3545,27 @@ xpmp_update_psg:
- ld (ix+8),a ; Reset note offset
- xpmp_update_psg_EN2_done:
- .ENDIF
- + ret
- - ld a,(xpmp_chnum)
- - cp 3
- - jp z,xpmp_update_psg_effects_done
- + ;ld a,(xpmp_chnum)
- + ;cp 3
- + ;jp z,xpmp_update_psg_effects_done
- + xpmp_tone_step_ep_frame:
- + bit 7,(ix+34)
- + ret nz
- + xpmp_tone_step_ep:
- .IFNDEF XPMP_EPMAC_NOT_USED
- ; Sweep macro
- ld a,(ix+34)
- cp EFFECT_DISABLED
- jr z,xpmp_update_psg_EP_done
- xpmp_update_psg_EP:
- + ld a,(xpmp_freqChange)
- + cp 2
- + jr z,+
- ld a,1
- ld (xpmp_freqChange),a ; Frequency has changed, but we haven't read a new note/rest yet
- + +:
- ld l,(ix+35)
- ld h,(ix+36)
- ld d,0
- @@ -3482,6 +3593,7 @@ xpmp_update_psg:
- jp xpmp_update_psg_EP_done
- xpmp_update_psg_EP_loop:
- ld a,(ix+34) ; Which sweep macro are we using?
- + and $7F
- dec a
- add a,a ; Each pointer is two bytes
- ld e,a
- @@ -3513,18 +3625,28 @@ xpmp_update_psg:
- ld (ix+17),h
- xpmp_update_psg_EP_done:
- .ENDIF
- -
- + ret
- +
- + xpmp_tone_step_mp_frame:
- + bit 7,(ix+38)
- + ret nz
- + xpmp_tone_step_mp:
- .IFNDEF XPMP_MPMAC_NOT_USED
- ; Vibrato
- ld a,(ix+38)
- cp EFFECT_DISABLED
- jr z,xpmp_update_psg_MP_done
- ld a,(ix+41)
- - dec a
- + ;dec a
- + cp 0
- jr nz,xpmp_update_psg_MP_done2
- xpmp_update_psg_MP:
- + ld a,(xpmp_freqChange)
- + cp 2
- + jr z,+
- ld a,1
- - ld (xpmp_freqChange),a ; Volume has changed
- + ld (xpmp_freqChange),a ; Frequency has changed, but we haven't read a new note/rest yet
- + +:
- ld l,(ix+39)
- ld h,(ix+40)
- ld e,(ix+18) ; Load the frequency offset from the latch, then negate the latch
- @@ -3537,23 +3659,17 @@ xpmp_update_psg:
- sbc hl,de
- ld (ix+18),l
- ld (ix+19),h
- + inc a
- xpmp_update_psg_MP_done2:
- + dec a
- ld (ix+41),a
- xpmp_update_psg_MP_done:
- .ENDIF
- -
- - xpmp_update_psg_effects_done:
- - ld a,(xpmp_freqChange)
- - cp 0
- - jp nz,xpmp_update_psg_freq_change
- - jp xpmp_update_psg_set_vol
- -
- - ret
- -
- -
- + ret
- +
- -.macro UPDATE_FM
- +.MACRO UPDATE_FM
- ld a,\1
- ld (xpmp_chsel),a
- ld a,\2
- @@ -3570,7 +3686,7 @@ ld (xpmp_alMacPtr),hl
- ld hl,xpmp_channel\3.fbMacPtr
- ld (xpmp_fbMacPtr),hl
- call xpmp_update_fm
- -.endm
- +.ENDM
- xpmp_update:
- @@ -3586,8 +3702,6 @@ xpmp_update:
- ld a,0
- ld hl,xpmp_tone_jump_tbl
- ld (xpmp_jump_tbl),hl
- - ld hl,xpmp_channel0.vMacPtr
- - ld (xpmp_vMacPtr),hl
- ld hl,xpmp_channel0.enMacPtr
- ld (xpmp_enMacPtr),hl
- ld hl,xpmp_channel0.en2MacPtr
- @@ -3600,8 +3714,6 @@ xpmp_update:
- ld a,1
- ld hl,xpmp_tone_jump_tbl
- ld (xpmp_jump_tbl),hl
- - ld hl,xpmp_channel1.vMacPtr
- - ld (xpmp_vMacPtr),hl
- ld hl,xpmp_channel1.enMacPtr
- ld (xpmp_enMacPtr),hl
- ld hl,xpmp_channel1.en2MacPtr
- @@ -3614,8 +3726,6 @@ xpmp_update:
- ld a,2
- ld hl,xpmp_tone_jump_tbl
- ld (xpmp_jump_tbl),hl
- - ld hl,xpmp_channel2.vMacPtr
- - ld (xpmp_vMacPtr),hl
- ld hl,xpmp_channel2.enMacPtr
- ld (xpmp_enMacPtr),hl
- ld hl,xpmp_channel2.en2MacPtr
- @@ -3628,8 +3738,6 @@ xpmp_update:
- ld a,3
- ld hl,xpmp_noise_jump_tbl
- ld (xpmp_jump_tbl),hl
- - ld hl,xpmp_channel3.vMacPtr
- - ld (xpmp_vMacPtr),hl
- ld hl,xpmp_channel3.enMacPtr
- ld (xpmp_enMacPtr),hl
- ld hl,xpmp_channel3.en2MacPtr
- @@ -3738,12 +3846,7 @@ xpmp_fm_jump_tbl:
- xpmp_fm_freq_tbl:
- .dw 649, 688, 729, 772, 818, 867, 918, 973, 1031, 1092, 1157, 1226
- -;.dw 649, 688, 729, 772, 818, 867, 918, 973, 1031, 1092, 1157, 1226
- -;.dw 649, 688, 729, 772, 818, 867, 918, 973, 1031, 1092, 1157, 1226
- -;.dw 649, 688, 729, 772, 818, 867, 918, 973, 1031, 1092, 1157, 1226
- -;.dw 649, 688, 729, 772, 818, 867, 918, 973, 1031, 1092, 1157, 1226
- -;.dw 649, 688, 729, 772, 818, 867, 918, 973, 1031, 1092, 1157, 1226
- -;.dw 649, 688, 729, 772, 818, 867, 918, 973, 1031, 1092, 1157, 1226
- +
- xpmp_freq_tbl:
- .IFDEF XPMP_50_HZ
Advertisement
Add Comment
Please, Sign In to add comment