bazz

xpmck-27-28-z80driver.diff

Sep 3rd, 2015
119
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Diff 42.28 KB | None | 0 0
  1. diff -rupN xpmck-27/src/z80driver/z80driver.asm xpmck-28/src/z80driver/z80driver.asm
  2. --- xpmck-27/src/z80driver/z80driver.asm    2010-01-24 19:35:08.000000000 -0500
  3. +++ xpmck-28/src/z80driver/z80driver.asm    2010-02-10 13:32:18.000000000 -0500
  4. @@ -16,21 +16,21 @@
  5.  
  6.  ; The effect pointer tables are copied to fixed addresses in Z80 RAM by the 68k code.
  7.  ; These addresses are defined here.
  8. -.DEFINE xpmp_dt_mac_tbl    $1E00
  9. -.DEFINE xpmp_dt_mac_loop_tbl   $1E02
  10. -.DEFINE xpmp_v_mac_tbl         $1E04
  11. -.DEFINE xpmp_v_mac_loop_tbl    $1E06
  12. -.DEFINE xpmp_EP_mac_tbl    $1E08
  13. -.DEFINE xpmp_EP_mac_loop_tbl   $1E0A
  14. -.DEFINE xpmp_EN_mac_tbl    $1E0C
  15. -.DEFINE xpmp_EN_mac_loop_tbl   $1E0E
  16. -.DEFINE xpmp_MP_mac_tbl        $1E10
  17. -.DEFINE xpmp_ADSR_tbl      $1E12
  18. -.DEFINE xpmp_MOD_tbl       $1E14
  19. -.DEFINE xpmp_pattern_tbl   $1E16
  20. -.DEFINE xpmp_FB_mac_tbl    $1E18
  21. -.DEFINE xpmp_FB_mac_loop_tbl   $1E1A
  22. -.DEFINE xpmp_song_tbl      $1E1C
  23. +.DEFINE xpmp_dt_mac_tbl    $1E40
  24. +.DEFINE xpmp_dt_mac_loop_tbl   $1E42
  25. +.DEFINE xpmp_v_mac_tbl         $1E44
  26. +.DEFINE xpmp_v_mac_loop_tbl    $1E46
  27. +.DEFINE xpmp_EP_mac_tbl    $1E48
  28. +.DEFINE xpmp_EP_mac_loop_tbl   $1E4A
  29. +.DEFINE xpmp_EN_mac_tbl    $1E4C
  30. +.DEFINE xpmp_EN_mac_loop_tbl   $1E4E
  31. +.DEFINE xpmp_MP_mac_tbl        $1E50
  32. +.DEFINE xpmp_ADSR_tbl      $1E52
  33. +.DEFINE xpmp_MOD_tbl       $1E54
  34. +.DEFINE xpmp_pattern_tbl   $1E56
  35. +.DEFINE xpmp_FB_mac_tbl    $1E58
  36. +.DEFINE xpmp_FB_mac_loop_tbl   $1E5A
  37. +.DEFINE xpmp_song_tbl      $1E5C
  38.    
  39.  .DEFINE XPMP_RAM_START         $1B00
  40.  
  41. @@ -65,6 +65,7 @@
  42.  .EQU CMD_LEN   $9A
  43.  .EQU CMD_WRMEM  $9B
  44.  .EQU CMD_WRPORT $9C
  45. +.EQU CMD_TRANSP $9F
  46.  .EQU CMD_MODE   $A0
  47.  .EQU CMD_FEEDBK $B0
  48.  .EQU CMD_OPER   $C0
  49. @@ -139,14 +140,31 @@ returnAddr    dw  ; 48
  50.  oldPos     dw  ; 50
  51.  delayLatch dw  ; 52
  52.  delayLatch2    db  ; 54
  53. +transpose  db  ; 55
  54.  .ENDST
  55.  
  56.  
  57. -.EQU _FM_DATAPOS 2
  58. -.EQU _FM_NOTE 7
  59. -.EQU _FM_VOLUME 15
  60. -.EQU _FM_OPER 39
  61. -.EQU _FM_TL 83
  62. +.EQU _CHN_DATAPTR  0
  63. +.EQU _CHN_DATAPOS  2
  64. +.EQU _CHN_DELAY        4
  65. +.EQU _CHN_NOTE         7
  66. +.EQU _CHN_NOTEOFFS 8
  67. +.EQU _CHN_OCTAVE   9
  68. +.EQU _PSG_VOLUME   13
  69. +.EQU _FM_VOLUME    15
  70. +.EQU _FM_VMAC      16
  71. +.EQU _PSG_VMAC         22
  72. +.EQU _PSG_ENMAC        26
  73. +.EQU _PSG_EN2MAC   30
  74. +.EQU _FM_LOOPPTR   34
  75. +.EQU _FM_OCT8      38
  76. +.EQU _FM_OPER      39
  77. +.EQU _FM_REG3X     40
  78. +.EQU _FM_REG4X     44
  79. +.EQU _FM_REG5X     48
  80. +.EQU _PSG_TRANSP   55
  81. +.EQU _FM_TL        83
  82. +.EQU _FM_TRANSP        87
  83.  
  84.  ; For YM2612 channels
  85.  .STRUCT xpmp_fm_channel_t
  86. @@ -221,6 +239,7 @@ tl0     db  ; 83
  87.  tl1        db  ; 84
  88.  tl2        db  ; 85
  89.  tl3        db  ; 86
  90. +transpose  db  ; 87
  91.  .ENDST
  92.  
  93.  
  94. @@ -254,6 +273,36 @@ xpmp_tempw dw
  95.  .ENDE
  96.  
  97.  
  98. +.MACRO INC_DATAPOS
  99. +   .IF  == 1
  100. +   inc (ix+_CHN_DATAPOS)
  101. +   jr  nz,+
  102. +   inc (ix+_CHN_DATAPOS+1)
  103. +   +:
  104. +   .ELSE
  105. +   ld  e,(ix+_CHN_DATAPOS)
  106. +   ld  d,(ix+_CHN_DATAPOS+1)
  107. +   .rept
  108. +   inc de
  109. +   .endr
  110. +   ld  (ix+_CHN_DATAPOS),e
  111. +   ld  (ix+_CHN_DATAPOS+1),d
  112. +   .ENDIF
  113. +.ENDM
  114. +
  115. +
  116. +.MACRO RESET_EFFECT
  117. +   ld  a,(ix+)
  118. +   bit 7,a
  119. +   jr  nz,+
  120. +   cp  EFFECT_DISABLED
  121. +   call    nz,xpmp_\2_reset_\3_mac     ; Reset effects as needed..
  122. +   jr  xpmp_\2_\3_reset
  123. +   +:
  124. +   call    xpmp_\2_step_\3
  125. +   xpmp_\2_\3_reset:  
  126. +.ENDM
  127. +
  128.  ; Compare HL with an immediate 16-bit number and jump if less (unsigned)
  129.  .MACRO JL_IMM16
  130.     push    hl
  131. @@ -278,8 +327,8 @@ xpmp_tempw  dw
  132.  
  133.  .MACRO INIT_CHANNEL
  134.     ld  a,(hl)
  135. -   or  $80
  136. -   ld  (xpmp_channel.dataPtr+1),a
  137. +   or  $80             ; Set bit 7 to access the 32k bank in M68000 memory
  138. +   ld  (xpmp_channel.dataPtr+1),a  ; Convert from BE to LE
  139.     inc hl
  140.     ld  a,(hl)
  141.     ld  (xpmp_channel\1.dataPtr),a
  142. @@ -368,8 +417,6 @@ xpmp_init:
  143.    
  144.     ld  hl,(xpmp_tempw)
  145.    
  146. -   ;foo: jr foo
  147. -  
  148.     INIT_CHANNEL 0
  149.     INIT_CHANNEL 1
  150.     INIT_CHANNEL 2
  151. @@ -588,10 +635,7 @@ xpmp_fm_cmd_60:
  152.     cp  CMD_VOLUP
  153.     jr  nz,xpmp_fm_cmd_00_2
  154.  
  155. -   inc (ix+2)
  156. -   jr  nz,+
  157. -   inc (ix+3)
  158. -   +:
  159. +   INC_DATAPOS 1
  160.     inc hl
  161.     ld  b,(hl)              ; Get increment
  162.     ld  (ix+16),0           ; Turn off volume macro
  163. @@ -624,28 +668,23 @@ xpmp_fm_cmd_00_volinc:
  164.     ret
  165.    
  166.  xpmp_fm_cmd_00_2:
  167. -   ld  a,(ix+_FM_NOTE)
  168. +   ld  a,(ix+_CHN_NOTE)
  169.     ld  (xpmp_lastNote),a       ; Save the previous note
  170.     ld  a,c
  171.     and $0F
  172. -   ld  (ix+_FM_NOTE),a
  173. +   ld  (ix+_CHN_NOTE),a
  174.     ld  a,c
  175.     and $F0
  176.     cp  CMD_NOTE2
  177. -   jr  z,xpmp_fm_cmd_00_std_delay 
  178. -   ld  e,(ix+_FM_DATAPOS)
  179. -   ld  d,(ix+_FM_DATAPOS+1)
  180. -   inc de
  181. -   inc de
  182. -   ld  (ix+_FM_DATAPOS),e
  183. -   ld  (ix+_FM_DATAPOS+1),d
  184. +   jr  z,xpmp_fm_cmd_00_std_delay
  185. +   INC_DATAPOS 2
  186.     inc hl
  187.     ld  a,(hl)
  188.     bit 7,a
  189.     jr  z,xpmp_fm_cmd_00_short_note
  190.         inc de
  191. -       ld  (ix+_FM_DATAPOS),e
  192. -       ld  (ix+_FM_DATAPOS+1),d
  193. +       ld  (ix+_CHN_DATAPOS),e
  194. +       ld  (ix+_CHN_DATAPOS+1),d
  195.         inc hl
  196.         res 7,a
  197.         ld  d,a
  198. @@ -656,33 +695,33 @@ xpmp_fm_cmd_00_2:
  199.         or  e
  200.         ld  e,a
  201.         inc hl
  202. -       ld  a,(ix+4)   
  203. +       ld  a,(ix+_CHN_DELAY)  
  204.         add a,(hl)
  205. -       ld  (ix+4),a            ; Fractional part
  206. +       ld  (ix+_CHN_DELAY),a   ; Fractional part
  207.         ld  hl,0
  208.         adc hl,de
  209. -       ld  (ix+5),l            ; Whole part
  210. -       ld  (ix+6),h
  211. +       ld  (ix+_CHN_DELAY+1),l ; Whole part
  212. +       ld  (ix+_CHN_DELAY+2),h
  213.         jp  xpmp_fm_cmd_00_got_delay
  214.     xpmp_fm_cmd_00_short_note:
  215.     ld  d,0
  216.     ld  e,a
  217.     inc hl
  218. -   ld  a,(ix+4)   
  219. +   ld  a,(ix+_CHN_DELAY)  
  220.     add a,(hl)
  221. -   ld  (ix+4),a            ; Fractional part
  222. +   ld  (ix+_CHN_DELAY),a       ; Fractional part
  223.     ld  hl,0
  224.     adc hl,de
  225.     ret z
  226. -   ld  (ix+5),l            ; Whole part
  227. -   ld  (ix+6),h
  228. +   ld  (ix+_CHN_DELAY+1),l     ; Whole part
  229. +   ld  (ix+_CHN_DELAY+2),h
  230.     jp  xpmp_fm_cmd_00_got_delay
  231.     xpmp_fm_cmd_00_std_delay:
  232.     ld  a,(ix+80)
  233.     ld  b,a
  234. -   ld  a,(ix+4)
  235. +   ld  a,(ix+_CHN_DELAY)
  236.     add a,b
  237. -   ld  (ix+4),a
  238. +   ld  (ix+_CHN_DELAY),a
  239.     ld  l,(ix+81)
  240.     ld  h,(ix+82)
  241.     ld  de,0
  242. @@ -693,37 +732,32 @@ xpmp_fm_cmd_00_2:
  243.     xpmp_fm_cmd_00_got_delay:
  244.     ld  a,2
  245.     ld  (xpmp_freqChange),a
  246. -   ld  a,(ix+_FM_NOTE)
  247. +   ld  a,(ix+_CHN_NOTE)
  248.     cp  CMD_REST   
  249.     ret z               ; If this was a rest command we can return now
  250.     cp  CMD_REST2
  251.     ret z
  252. +
  253.     .IFNDEF XPMP_VMAC_NOT_USED
  254. -   ld  a,(ix+16)
  255. -   cp  EFFECT_DISABLED
  256. -   call    nz,xpmp_fm_reset_v_mac      ; Reset effects as needed..
  257. +   RESET_EFFECT _FM_VMAC,fm,v
  258.     .ENDIF
  259. +
  260.     .IFNDEF XPMP_ENMAC_NOT_USED
  261. -   ld  a,(ix+20)
  262. -   cp  EFFECT_DISABLED
  263. -   call    nz,xpmp_fm_reset_en_mac
  264. +   RESET_EFFECT 20,fm,en
  265.     .ENDIF
  266. +
  267.     .IFNDEF XPMP_EN2MAC_NOT_USED
  268. -   ld  a,(ix+24)
  269. -   cp  EFFECT_DISABLED
  270. -   call    nz,xpmp_fm_reset_en2_mac
  271. +   RESET_EFFECT 24,fm,en2
  272.     .ENDIF
  273. +
  274.     .IFNDEF XPMP_EPMAC_NOT_USED
  275. -   ld  a,(ix+28)
  276. -   cp  EFFECT_DISABLED
  277. -   call    nz,xpmp_fm_reset_ep_mac
  278. +   RESET_EFFECT 28,fm,ep
  279.     .ENDIF
  280. -   ld  a,(ix+68)
  281. -   cp  EFFECT_DISABLED
  282. -   call    nz,xpmp_fm_reset_al_mac
  283. -   ld  a,(ix+72)
  284. -   cp  EFFECT_DISABLED
  285. -   call    nz,xpmp_fm_reset_fb_mac
  286. +
  287. +   RESET_EFFECT 68,fm,al
  288. +
  289. +   RESET_EFFECT 72,fm,fb
  290. +
  291.     ;ld hl,(xpmp_channel\1.cbEvnote)
  292.     ;ld a,h
  293.     ;or l
  294. @@ -731,11 +765,11 @@ xpmp_fm_cmd_00_2:
  295.     ;jp (hl)       
  296.     ret
  297.  
  298. +
  299.  ; Set octave
  300.  xpmp_fm_cmd_10:
  301.     ld  a,c
  302.     and $0F
  303. -   ;inc    a
  304.     dec a               ; Minimum octave is 1
  305.     ld  b,a
  306.     add a,a
  307. @@ -743,9 +777,9 @@ xpmp_fm_cmd_10:
  308.     add a,a
  309.     sla b
  310.     sla b
  311. -   ld  (ix+38),a           ; A = (C & $0F) * 8
  312. +   ld  (ix+_FM_OCT8),a         ; A = (C & $0F) * 8
  313.     add a,b             ; A = (C & $0F) * 12
  314. -   ld  (ix+9),a
  315. +   ld  (ix+_CHN_OCTAVE),a
  316.     ret
  317.  
  318.  ; Set algorithm   
  319. @@ -774,12 +808,12 @@ xpmp_fm_cmd_30:
  320.  ; Octave up + note
  321.  xpmp_fm_cmd_40:
  322.     ld  hl,(xpmp_tempw)
  323. -   ld  a,(ix+9)
  324. +   ld  a,(ix+_CHN_OCTAVE)
  325.     add a,12
  326. -   ld  (ix+9),a
  327. -   ld  a,(ix+38)
  328. +   ld  (ix+_CHN_OCTAVE),a
  329. +   ld  a,(ix+_FM_OCT8)
  330.     add a,8
  331. -   ld  (ix+38),a
  332. +   ld  (ix+_FM_OCT8),a
  333.     ld  a,c
  334.     add     a,$20
  335.     ld  c,a
  336. @@ -788,12 +822,12 @@ xpmp_fm_cmd_40:
  337.  ; Octave down + note
  338.  xpmp_fm_cmd_50:
  339.     ld  hl,(xpmp_tempw)
  340. -   ld  a,(ix+9)
  341. +   ld  a,(ix+_CHN_OCTAVE)
  342.     sub 12
  343. -   ld  (ix+9),a
  344. -   ld  a,(ix+38)
  345. +   ld  (ix+_CHN_OCTAVE),a
  346. +   ld  a,(ix+_FM_OCT8)
  347.     sub 8
  348. -   ld  (ix+38),a
  349. +   ld  (ix+_FM_OCT8),a
  350.     ld  a,c
  351.     add     a,$10
  352.     ld  c,a
  353. @@ -822,19 +856,21 @@ xpmp_fm_cmd_90:
  354.     jp  z,xpmp_fm_cmd_90_wrmem
  355.     cp  CMD_WRPORT
  356.     jp  z,xpmp_fm_cmd_90_wrport
  357. +   cp  CMD_TRANSP
  358. +   jp  z,xpmp_fm_cmd_90_transp
  359.     ret
  360.    
  361.     xpmp_fm_cmd_90_90:
  362.     ld  a,0
  363.     ld  (ix+20),a
  364.     ld  (ix+24),a
  365. -   ld  (ix+8),a
  366. +   ld  (ix+_CHN_NOTEOFFS),a
  367.     ret
  368.  
  369.     xpmp_fm_cmd_90_91:
  370. -   inc (ix+_FM_DATAPOS)
  371. +   inc (ix+_CHN_DATAPOS)
  372.     jr  nz,+
  373. -   inc (ix+_FM_DATAPOS+1)
  374. +   inc (ix+_CHN_DATAPOS+1)
  375.     +:
  376.     inc hl
  377.     ld  (ix+75),1
  378. @@ -842,6 +878,7 @@ xpmp_fm_cmd_90:
  379.     ld  (ix+72),a
  380.     ret
  381.     xpmp_fm_reset_fb_mac:
  382. +   and $7F
  383.     dec a
  384.     add a,a
  385.     ld  hl,(xpmp_FB_mac_tbl)
  386. @@ -873,25 +910,25 @@ xpmp_fm_cmd_90:
  387.     ; Return from pattern
  388.     xpmp_fm_cmd_90_rts:
  389.     ld  a,(ix+76)
  390. -   ld  (ix+0),a
  391. +   ld  (ix+_CHN_DATAPTR),a
  392.     ld  a,(ix+77)
  393. -   ld  (ix+1),a
  394. +   ld  (ix+_CHN_DATAPTR+1),a
  395.     ld  a,(ix+78)
  396. -   ld  (ix+2),a
  397. +   ld  (ix+_CHN_DATAPOS),a
  398.     ld  a,(ix+79)
  399. -   ld  (ix+3),a
  400. +   ld  (ix+_CHN_DATAPOS+1),a
  401.     ret
  402.    
  403.     ; Jump to pattern
  404.     xpmp_fm_cmd_90_jsr:
  405. -   ld  e,(ix+_FM_DATAPOS)
  406. -   ld  d,(ix+_FM_DATAPOS+1)
  407. +   ld  e,(ix+_CHN_DATAPOS)
  408. +   ld  d,(ix+_CHN_DATAPOS+1)
  409.     inc de
  410.     ld  (ix+78),e
  411.     ld  (ix+79),d
  412. -   ld  a,(ix+0)
  413. +   ld  a,(ix+_CHN_DATAPTR)
  414.     ld  (ix+76),a
  415. -   ld  a,(ix+1)
  416. +   ld  a,(ix+_CHN_DATAPTR+1)
  417.     ld  (ix+77),a
  418.     ld  hl,(xpmp_tempw)
  419.     inc hl
  420. @@ -905,27 +942,22 @@ xpmp_fm_cmd_90:
  421.     or  $80
  422.     inc hl
  423.     ld  d,(hl)
  424. -   ld  (ix+0),d
  425. -   ld  (ix+1),a
  426. -   ld  (ix+_FM_DATAPOS),$FF
  427. -   ld  (ix+_FM_DATAPOS+1),$FF
  428. +   ld  (ix+_CHN_DATAPTR),d
  429. +   ld  (ix+_CHN_DATAPTR+1),a
  430. +   ld  (ix+_CHN_DATAPOS),$FF
  431. +   ld  (ix+_CHN_DATAPOS+1),$FF
  432.     ret
  433.    
  434.     xpmp_fm_cmd_90_len:
  435.     ld  hl,(xpmp_tempw)
  436. -   ld  e,(ix+_FM_DATAPOS)
  437. -   ld  d,(ix+_FM_DATAPOS+1)
  438. -   inc de
  439. -   inc de
  440. -   ld  (ix+_FM_DATAPOS),e
  441. -   ld  (ix+_FM_DATAPOS+1),d
  442. +   INC_DATAPOS 2
  443.     inc hl
  444.     ld  a,(hl)
  445.     bit 7,a
  446.     jr  z,xpmp_fm_cmd_90_short_delay
  447.         inc de
  448. -       ld  (ix+_FM_DATAPOS),e
  449. -       ld  (ix+_FM_DATAPOS+1),d
  450. +       ld  (ix+_CHN_DATAPOS),e
  451. +       ld  (ix+_CHN_DATAPOS+1),d
  452.         inc hl
  453.         res 7,a
  454.         ld  d,a
  455. @@ -961,17 +993,18 @@ xpmp_fm_cmd_90:
  456.     ld  a,(hl)
  457.     ld  (de),a
  458.     -:
  459. -   ld  e,(ix+_FM_DATAPOS)
  460. -   ld  d,(ix+_FM_DATAPOS+1)
  461. -   inc de
  462. -   inc de
  463. -   inc de
  464. -   ld  (ix+_FM_DATAPOS),e
  465. -   ld  (ix+_FM_DATAPOS+1),d
  466. +   INC_DATAPOS 3
  467.     ret
  468.     xpmp_fm_cmd_90_wrport:
  469.     jr  -       ; No ports on this system
  470. -  
  471. +
  472. +   xpmp_fm_cmd_90_transp:
  473. +   ld  hl,(xpmp_tempw)
  474. +   inc hl
  475. +   ld  a,(hl)
  476. +   ld  (ix+_FM_TRANSP),a
  477. +   INC_DATAPOS 1
  478. +   ret    
  479.  
  480.  ; Set mode
  481.  xpmp_fm_cmd_A0:
  482. @@ -1003,18 +1036,15 @@ xpmp_fm_cmd_B0:
  483.  xpmp_fm_cmd_C0:
  484.     ld  a,c
  485.     and 7
  486. -   ld  (ix+39),a
  487. +   ld  (ix+_FM_OPER),a
  488.     ret
  489.  
  490.  ; Set rate scaling
  491.  xpmp_fm_cmd_D0:
  492.     ld  hl,(xpmp_tempw)
  493. -   inc (ix+_FM_DATAPOS)
  494. -   jr  nz,+
  495. -   inc (ix+_FM_DATAPOS+1)
  496. -   +:
  497. +   INC_DATAPOS 1
  498.     inc hl
  499. -   ld  a,(ix+39)
  500. +   ld  a,(ix+_FM_OPER)
  501.     cp  0
  502.     jr  z,xpmp_fm_cmd_D0_all
  503.     ld  a,(hl)
  504. @@ -1024,7 +1054,7 @@ xpmp_fm_cmd_D0:
  505.     ld  c,a
  506.     ld  (xpmp_tempw),ix
  507.     ld  hl,(xpmp_tempw)
  508. -   ld  a,(ix+39)
  509. +   ld  a,(ix+_FM_OPER)
  510.     add a,47
  511.     ld  e,a
  512.     ld  d,0
  513. @@ -1086,10 +1116,7 @@ xpmp_fm_cmd_D0:
  514.  
  515.  xpmp_fm_cmd_E0:
  516.     ld  hl,(xpmp_tempw)
  517. -   inc (ix+_FM_DATAPOS)
  518. -   jr  nz,+
  519. -   inc (ix+_FM_DATAPOS+1)
  520. -   +:
  521. +   INC_DATAPOS 1
  522.     ld  a,c
  523.     cp  CMD_ADSR
  524.     jr  z,xpmp_fm_cmd_E0_adsr
  525. @@ -1119,7 +1146,7 @@ xpmp_fm_cmd_E0_adsr:
  526.     ld  e,(hl)
  527.     ex  de,hl
  528.    
  529. -   ld  a,(ix+39)
  530. +   ld  a,(ix+_FM_OPER)
  531.     cp  0
  532.     jr  z,xpmp_fm_adsr_all
  533.     xpmp_fm_adsr_spec:
  534. @@ -1201,7 +1228,7 @@ xpmp_fm_cmd_E0_adsr:
  535.  
  536.  xpmp_fm_cmd_E0_mult:
  537.     inc hl
  538. -   ld  a,(ix+39)
  539. +   ld  a,(ix+_FM_OPER)
  540.     cp  0
  541.     jr  z,xpmp_fm_mult_all
  542.     ld  a,(hl)
  543. @@ -1209,7 +1236,7 @@ xpmp_fm_cmd_E0_mult:
  544.     ld  c,a
  545.     ld  (xpmp_tempw),ix
  546.     ld  hl,(xpmp_tempw)
  547. -   ld  a,(ix+39)
  548. +   ld  a,(ix+_FM_OPER)
  549.     add a,39
  550.     ld  e,a
  551.     ld  d,0
  552. @@ -1219,7 +1246,7 @@ xpmp_fm_cmd_E0_mult:
  553.     or  c
  554.     ld  (hl),a
  555.     ld  (iy+1),a
  556. -   ld  a,(ix+39)
  557. +   ld  a,(ix+_FM_OPER)
  558.     add a,a
  559.     add a,a
  560.     add a,$2C
  561. @@ -1233,28 +1260,28 @@ xpmp_fm_cmd_E0_mult:
  562.     ld  a,(hl)
  563.     and 15
  564.     ld  d,a
  565. -   ld  a,(ix+40)
  566. +   ld  a,(ix+_FM_REG3X)
  567.     and $70
  568.     or  d
  569. -   ld  (ix+40),a
  570. +   ld  (ix+_FM_REG3X),a
  571.     ld  (iy+1),a
  572.     ld  (iy+0),$30
  573. -   ld  a,(ix+41)
  574. +   ld  a,(ix+_FM_REG3X+1)
  575.     and $70
  576.     or  d
  577. -   ld  (ix+41),a
  578. +   ld  (ix+_FM_REG3X+1),a
  579.     ld  (iy+3),a
  580.     ld  (iy+2),$34
  581. -   ld  a,(ix+42)
  582. +   ld  a,(ix+_FM_REG3X+2)
  583.     and $70
  584.     or  d
  585. -   ld  (ix+42),a
  586. +   ld  (ix+_FM_REG3X+2),a
  587.     ld  (iy+5),a
  588.     ld  (iy+4),$38
  589. -   ld  a,(ix+43)
  590. +   ld  a,(ix+_FM_REG3X+3)
  591.     and $70
  592.     or  d
  593. -   ld  (ix+43),a
  594. +   ld  (ix+_FM_REG3X+3),a
  595.     ld  (iy+7),a
  596.     ld  (iy+6),$3C
  597.     ld  hl,XPMP_FM_BUF
  598. @@ -1267,7 +1294,7 @@ xpmp_fm_cmd_E0_mult:
  599.  
  600.  xpmp_fm_cmd_E0_detune:
  601.     inc hl
  602. -   ld  a,(ix+39)
  603. +   ld  a,(ix+_FM_OPER)
  604.     cp  0
  605.     jr  z,xpmp_fm_detune_all
  606.     ld  a,(hl)
  607. @@ -1279,7 +1306,7 @@ xpmp_fm_cmd_E0_detune:
  608.     ld  c,a
  609.     ld  (xpmp_tempw),ix
  610.     ld  hl,(xpmp_tempw)
  611. -   ld  a,(ix+39)
  612. +   ld  a,(ix+_FM_OPER)
  613.     add a,39
  614.     ld  e,a
  615.     ld  d,0
  616. @@ -1289,7 +1316,7 @@ xpmp_fm_cmd_E0_detune:
  617.     or  c
  618.     ld  (hl),a
  619.     ld  (iy+1),a
  620. -   ld  a,(ix+39)
  621. +   ld  a,(ix+_FM_OPER)
  622.     add a,a
  623.     add a,a
  624.     add a,$2C
  625. @@ -1307,28 +1334,28 @@ xpmp_fm_cmd_E0_detune:
  626.     add a,a
  627.     add a,a
  628.     ld  d,a
  629. -   ld  a,(ix+40)
  630. +   ld  a,(ix+_FM_REG3X)
  631.     and $0F
  632.     or  d
  633. -   ld  (ix+40),a
  634. +   ld  (ix+_FM_REG3X),a
  635.     ld  (iy+1),a
  636.     ld  (iy+0),$30
  637. -   ld  a,(ix+41)
  638. +   ld  a,(ix+_FM_REG3X+1)
  639.     and $0F
  640.     or  d
  641. -   ld  (ix+41),a
  642. +   ld  (ix+_FM_REG3X+1),a
  643.     ld  (iy+3),a
  644.     ld  (iy+2),$34
  645. -   ld  a,(ix+42)
  646. +   ld  a,(ix+_FM_REG3X+2)
  647.     and $0F
  648.     or  d
  649. -   ld  (ix+42),a
  650. +   ld  (ix+_FM_REG3X+2),a
  651.     ld  (iy+5),a
  652.     ld  (iy+4),$38
  653. -   ld  a,(ix+43)
  654. +   ld  a,(ix+_FM_REG3X+3)
  655.     and $0F
  656.     or  d
  657. -   ld  (ix+43),a
  658. +   ld  (ix+_FM_REG3X+3),a
  659.     ld  (iy+7),a
  660.     ld  (iy+6),$3C
  661.     ld  hl,XPMP_FM_BUF
  662. @@ -1346,7 +1373,7 @@ xpmp_fm_cmd_E0_am:
  663.     ld  l,a
  664.     ;ex de,hl
  665.    
  666. -   ld  a,(ix+39)
  667. +   ld  a,(ix+_FM_OPER)
  668.     cp  0
  669.     jr  z,xpmp_fm_am_all
  670.     xpmp_fm_am_spec:
  671. @@ -1440,10 +1467,7 @@ xpmp_fm_cmd_E0_mod:
  672.    
  673.  xpmp_fm_cmd_F0:
  674.     ld  hl,(xpmp_tempw)
  675. -   inc (ix+_FM_DATAPOS)
  676. -   jr  nz,+
  677. -   inc (ix+_FM_DATAPOS+1)
  678. -   +:
  679. +   INC_DATAPOS 1
  680.     ld  a,c
  681.     cp  CMD_VOLSET
  682.     jr  z,xpmp_fm_cmd_F0_volset
  683. @@ -1473,7 +1497,7 @@ xpmp_fm_cmd_F0_volset:
  684.     inc hl
  685.     ld  b,(hl)
  686.     ld  a,0
  687. -   ld  (ix+16),a           ; Turn off volume macro
  688. +   ld  (ix+_FM_VMAC),a         ; Turn off volume macro
  689.  xpmp_fm_cmd_F0_volset_2:
  690.     ld  a,1
  691.     ld  (xpmp_volChange),a
  692. @@ -1481,28 +1505,28 @@ xpmp_fm_cmd_F0_volset_2:
  693.     cp  0
  694.     jr  z,+
  695.     xpmp_fm_cmd_F0_volset_spec:
  696. -   ld (xpmp_tempv),ix
  697. -   ld hl,(xpmp_tempv)
  698. -   add a,_FM_TL-1
  699. -   ld e,a
  700. -   ld d,0
  701. -   add hl,de
  702. -   ld (hl),b
  703. +   ld  (xpmp_tempv),ix
  704. +   ld  hl,(xpmp_tempv)
  705. +   add     a,_FM_TL-1
  706. +   ld  e,a
  707. +   ld  d,0
  708. +   add     hl,de
  709. +   ld  (hl),b
  710.     ret
  711.     +:
  712. -   ld a,1
  713. -   call xpmp_fm_cmd_F0_volset_spec
  714. -   ld a,2
  715. -   call xpmp_fm_cmd_F0_volset_spec
  716. -   ld a,3
  717. -   call xpmp_fm_cmd_F0_volset_spec
  718. -   ld a,4
  719. -   call xpmp_fm_cmd_F0_volset_spec
  720. +   ld  a,1
  721. +   call    xpmp_fm_cmd_F0_volset_spec
  722. +   ld  a,2
  723. +   call    xpmp_fm_cmd_F0_volset_spec
  724. +   ld  a,3
  725. +   call    xpmp_fm_cmd_F0_volset_spec
  726. +   ld  a,4
  727. +   call    xpmp_fm_cmd_F0_volset_spec
  728.     ret
  729.  
  730.     xpmp_fm_cmd_F0_END:
  731.     ld  a,CMD_END
  732. -   ld  (ix+7),a            ; Playback of this channel should end
  733. +   ld  (ix+_CHN_NOTE),a        ; Playback of this channel should end
  734.     ld  a,2
  735.     ld  (xpmp_freqChange),a     ; The command-reading loop should exit 
  736.     ret
  737. @@ -1510,8 +1534,9 @@ xpmp_fm_cmd_F0_volset_2:
  738.     xpmp_fm_cmd_F0_VOLMAC:
  739.     inc hl
  740.     ld  a,(hl)
  741. -   ld  (ix+16),a
  742. +   ld  (ix+_FM_VMAC),a
  743.     xpmp_fm_reset_v_mac:
  744. +   and $7F
  745.     dec a
  746.     add a,a
  747.     ld  hl,(xpmp_v_mac_tbl)
  748. @@ -1538,6 +1563,7 @@ xpmp_fm_cmd_F0_volset_2:
  749.     cp  EFFECT_DISABLED
  750.     jr  z,xpmp_fm_cmd_F0_disable_SWPMAC
  751.     xpmp_fm_reset_ep_mac:
  752. +   and $7F
  753.     dec a
  754.     add a,a
  755.     ld  hl,(xpmp_EP_mac_tbl)
  756. @@ -1573,52 +1599,49 @@ xpmp_fm_cmd_F0_volset_2:
  757.     inc hl
  758.     ld  d,(hl)
  759.     dec de              ; dataPos will be increased after the return, so we decrease it here
  760. -   ld  (ix+_FM_DATAPOS),e
  761. -   ld  (ix+_FM_DATAPOS+1),d
  762. +   ld  (ix+_CHN_DATAPOS),e
  763. +   ld  (ix+_CHN_DATAPOS+1),d
  764.     ret
  765.  
  766.     ; Set loop count
  767.     xpmp_fm_cmd_F0_LOPCNT:
  768.     inc hl
  769.     ld  a,(hl)
  770. -   ld  l,(ix+34)
  771. -   ld  h,(ix+35)
  772. +   ld  l,(ix+_FM_LOOPPTR)
  773. +   ld  h,(ix+_FM_LOOPPTR+1)
  774.     inc hl
  775.     ld  (hl),a
  776. -   ld  (ix+34),l
  777. -   ld  (ix+35),h
  778. +   ld  (ix+_FM_LOOPPTR),l
  779. +   ld  (ix+_FM_LOOPPTR+1),h
  780.     ret
  781.  
  782.     ; Jump if one
  783.     xpmp_fm_cmd_F0_J1:
  784. -   ld  l,(ix+34)
  785. -   ld  h,(ix+35)
  786. +   ld  l,(ix+_FM_LOOPPTR)
  787. +   ld  h,(ix+_FM_LOOPPTR+1)
  788.     ld  a,(hl)
  789.     cp  1
  790.     jr  nz,xpmp_fm_cmd_F0_J1_N1     ; Check if the counter has reached 1
  791.     dec hl
  792. -   ld  (ix+34),l
  793. -   ld  (ix+35),h
  794. +   ld  (ix+_FM_LOOPPTR),l
  795. +   ld  (ix+_FM_LOOPPTR+1),h
  796.     ld  hl,(xpmp_tempw)
  797.     inc hl
  798.     ld  e,(hl)
  799.     inc hl
  800.     ld  d,(hl)
  801.     dec de              ; dataPos will be increased after the return, so we decrease it here
  802. -   ld  (ix+_FM_DATAPOS),e
  803. -   ld  (ix+_FM_DATAPOS+1),d
  804. +   ld  (ix+_CHN_DATAPOS),e
  805. +   ld  (ix+_CHN_DATAPOS+1),d
  806.     ret
  807.     xpmp_fm_cmd_F0_J1_N1:
  808. -   inc (ix+_FM_DATAPOS)
  809. -   jr  nz,+
  810. -   inc (ix+_FM_DATAPOS+1)
  811. -   +:
  812. +   INC_DATAPOS 1
  813.     ret
  814.    
  815.     ; Decrease and jump if not zero
  816.     xpmp_fm_cmd_F0_DJNZ:
  817. -   ld  l,(ix+34)
  818. -   ld  h,(ix+35)
  819. +   ld  l,(ix+_FM_LOOPPTR)
  820. +   ld  h,(ix+_FM_LOOPPTR+1)
  821.     dec (hl)
  822.     jr  z,xpmp_fm_cmd_F0_DJNZ_Z     ; Check if the counter has reached zero
  823.     ld  hl,(xpmp_tempw)
  824. @@ -1627,17 +1650,14 @@ xpmp_fm_cmd_F0_volset_2:
  825.     inc hl
  826.     ld  d,(hl)
  827.     dec de              ; dataPos will be increased after the return, so we decrease it here
  828. -   ld  (ix+_FM_DATAPOS),e
  829. -   ld  (ix+_FM_DATAPOS+1),d
  830. +   ld  (ix+_CHN_DATAPOS),e
  831. +   ld  (ix+_CHN_DATAPOS+1),d
  832.     ret
  833.     xpmp_fm_cmd_F0_DJNZ_Z:
  834.     dec hl
  835. -   ld  (ix+34),l
  836. -   ld  (ix+35),h
  837. -   inc (ix+_FM_DATAPOS)
  838. -   jr  nz,+
  839. -   inc (ix+_FM_DATAPOS+1)
  840. -   +:
  841. +   ld  (ix+_FM_LOOPPTR),l
  842. +   ld  (ix+_FM_LOOPPTR+1),h
  843. +   INC_DATAPOS 1
  844.     ret
  845.  
  846.     xpmp_fm_cmd_F0_ALGMAC:
  847. @@ -1645,6 +1665,7 @@ xpmp_fm_cmd_F0_volset_2:
  848.     ld  a,(hl)
  849.     ld  (ix+68),a
  850.     xpmp_fm_reset_al_mac:
  851. +   and $7F
  852.     dec a
  853.     add a,a
  854.     ld  hl,(xpmp_dt_mac_tbl)
  855. @@ -1679,6 +1700,7 @@ xpmp_fm_cmd_F0_volset_2:
  856.     ld  a,(hl)
  857.     ld  (ix+24),a
  858.     xpmp_fm_reset_en2_mac:
  859. +   and $7F
  860.     dec a
  861.     add a,a
  862.     ld  hl,(xpmp_EN_mac_tbl)
  863. @@ -1707,6 +1729,7 @@ xpmp_fm_cmd_F0_volset_2:
  864.     ld  a,(hl)
  865.     ld  (ix+20),a
  866.     xpmp_fm_reset_en_mac:
  867. +   and $7F
  868.     dec a
  869.     add a,a
  870.     ld  hl,(xpmp_EN_mac_tbl)
  871. @@ -1761,12 +1784,12 @@ xpmp_update_fm:
  872.     ld  (xpmp_freqChange),a
  873.     ld  (xpmp_volChange),a
  874.    
  875. -   ld  a,(ix+7)
  876. +   ld  a,(ix+_CHN_NOTE)
  877.     cp  CMD_END
  878.     ret z               ; Playback has ended for this channel - all processing should be skipped
  879.    
  880. -   ld  l,(ix+5)            ; Decrement the whole part of the delay and check if it has reached zero
  881. -   ld  h,(ix+6)
  882. +   ld  l,(ix+_CHN_DELAY+1)     ; Decrement the whole part of the delay and check if it has reached zero
  883. +   ld  h,(ix+_CHN_DELAY+2)
  884.     dec hl
  885.     ld  a,h
  886.     or  l
  887. @@ -1774,10 +1797,10 @@ xpmp_update_fm:
  888.    
  889.     ; Loop here until a note/rest or END command is read (signaled by xpmp_freqChange == 2)
  890.     xpmp_update_fm_read_cmd:
  891. -   ld  l,(ix+0)
  892. -   ld  h,(ix+1)
  893. -   ld  e,(ix+2)
  894. -   ld  d,(ix+3)
  895. +   ld  l,(ix+_CHN_DATAPTR)
  896. +   ld  h,(ix+_CHN_DATAPTR+1)
  897. +   ld  e,(ix+_CHN_DATAPOS)
  898. +   ld  d,(ix+_CHN_DATAPOS+1)
  899.     add     hl,de
  900.     ld  c,(hl)
  901.     ld  (xpmp_tempw),hl         ; Store HL for later use
  902. @@ -1796,10 +1819,7 @@ xpmp_update_fm:
  903.     ex  de,hl
  904.     call    xpmp_call_hl
  905.  
  906. -   inc (ix+2)
  907. -   jr  nz,+
  908. -   inc (ix+3)
  909. -   +:
  910. +   INC_DATAPOS 1
  911.    
  912.     ld  a,(xpmp_freqChange)
  913.     cp  2
  914. @@ -1808,7 +1828,7 @@ xpmp_update_fm:
  915.    
  916.     xpmp_update_fm_freq_change:
  917.     call    write_fm_buf
  918. -   ld  a,(ix+7)
  919. +   ld  a,(ix+_CHN_NOTE)
  920.     cp  CMD_REST
  921.     jp  z,xpmp_update_fm_rest
  922.     cp  CMD_REST2
  923. @@ -1826,12 +1846,14 @@ xpmp_update_fm:
  924.     call    write_fm_low    ; KEY_OFF
  925.     +:
  926.    
  927. -   ld  a,(ix+8)
  928. -   add a,c
  929. +   ld  a,(ix+_CHN_NOTEOFFS)
  930. +   ld  d,(ix+_FM_TRANSP)
  931. +   add a,d
  932. +   add a,c     ; note + noteOffs + transpose
  933.     ld  b,a
  934. -   ld  a,(ix+9)
  935. +   ld  a,(ix+_CHN_OCTAVE)
  936.     add a,b
  937. -   bit 7,a
  938. +   bit 7,a     ; negative?
  939.     jr  z,fm_note_lb_ok
  940.     ld  a,0
  941.     jr  fm_note_ok
  942. @@ -1922,12 +1944,30 @@ xpmp_update_fm:
  943.     ret
  944.  
  945.     xpmp_update_fm_effects:
  946. -   ld  (ix+5),l
  947. -   ld  (ix+6),h
  948. +   ld  (ix+_CHN_DELAY+1),l
  949. +   ld  (ix+_CHN_DELAY+2),h
  950.  
  951. +   call    xpmp_fm_step_v_frame
  952. +   call    xpmp_fm_step_en_frame
  953. +   call    xpmp_fm_step_en2_frame
  954. +   call    xpmp_fm_step_al_frame
  955. +   call    xpmp_fm_step_fb_frame
  956. +   call    xpmp_fm_step_ep_frame
  957. +  
  958. +   ld  a,(xpmp_freqChange)
  959. +   cp  0
  960. +   jp  nz,xpmp_update_fm_freq_change
  961. +   jp  xpmp_update_fm_set_vol
  962. +   ret
  963. +
  964. +
  965. +   xpmp_fm_step_v_frame:
  966. +   bit     7,(ix+_FM_VMAC)
  967. +   ret nz
  968. +   xpmp_fm_step_v:
  969.     .IFNDEF XPMP_VMAC_NOT_USED
  970.     ; Volume macro
  971. -   ld  a,(ix+16)
  972. +   ld  a,(ix+_FM_VMAC)
  973.     cp  EFFECT_DISABLED
  974.     jr  z,xpmp_update_fm_v_done
  975.     xpmp_update_fm_v:
  976. @@ -1949,7 +1989,8 @@ xpmp_update_fm:
  977.     call    xpmp_fm_cmd_F0_volset_2
  978.     jp  xpmp_update_fm_v_done
  979.     xpmp_update_fm_v_loop:
  980. -   ld  a,(ix+16)           ; Which volume macro are we using?
  981. +   ld  a,(ix+_FM_VMAC)         ; Which volume macro are we using?
  982. +   and $7F
  983.     dec a
  984.     ld  e,a
  985.     sla e               ; Each pointer is two bytes
  986. @@ -1974,15 +2015,24 @@ xpmp_update_fm:
  987.     call    xpmp_fm_cmd_F0_volset_2
  988.     xpmp_update_fm_v_done:
  989.     .ENDIF
  990. +   ret
  991.    
  992. +   xpmp_fm_step_en_frame:
  993. +   bit     7,(ix+20)
  994. +   ret nz
  995. +   xpmp_fm_step_en:       
  996.     .IFNDEF XPMP_ENMAC_NOT_USED
  997.     ; Cumulative arpeggio
  998.     ld  a,(ix+20)
  999.     cp  EFFECT_DISABLED
  1000.     jr  z,xpmp_update_fm_EN_done
  1001.     xpmp_update_fm_EN:
  1002. +   ld  a,(xpmp_freqChange)
  1003. +   cp  2
  1004. +   jr  z,+
  1005.     ld  a,1
  1006.     ld  (xpmp_freqChange),a     ; Frequency has changed, but we haven't read a new note/rest yet
  1007. +   +:
  1008.     ld  l,(ix+21)
  1009.     ld  h,(ix+22)
  1010.     ld  d,0
  1011. @@ -2001,6 +2051,7 @@ xpmp_update_fm:
  1012.     jp  xpmp_update_fm_EN_done     
  1013.     xpmp_update_fm_EN_loop:
  1014.     ld  a,(ix+20)           ; Which arpeggio macro are we using?
  1015. +   and $7F
  1016.     dec a
  1017.     add a,a             ; Each pointer is two bytes
  1018.     ld  e,a
  1019. @@ -2025,15 +2076,24 @@ xpmp_update_fm:
  1020.     ld  (ix+8),a            ; Reset note offset
  1021.     xpmp_update_fm_EN_done:
  1022.     .ENDIF
  1023. -  
  1024. +   ret
  1025. +
  1026. +   xpmp_fm_step_en2_frame:
  1027. +   bit     7,(ix+24)
  1028. +   ret nz
  1029. +   xpmp_fm_step_en2:      
  1030.     .IFNDEF XPMP_EN2MAC_NOT_USED
  1031.     ; Non-cumulative arpeggio
  1032.     ld  a,(ix+24)
  1033.     cp  EFFECT_DISABLED
  1034.     jr  z,xpmp_update_fm_EN2_done
  1035.     xpmp_update_fm_EN2:
  1036. +   ld  a,(xpmp_freqChange)
  1037. +   cp  2
  1038. +   jr  z,+
  1039.     ld  a,1
  1040.     ld  (xpmp_freqChange),a     ; Frequency has changed, but we haven't read a new note/rest yet
  1041. +   +:
  1042.     ld  l,(ix+25)
  1043.     ld  h,(ix+26)
  1044.     ld  d,0
  1045. @@ -2049,6 +2109,7 @@ xpmp_update_fm:
  1046.     jp  xpmp_update_fm_EN2_done    
  1047.     xpmp_update_fm_EN2_loop:
  1048.     ld  a,(ix+24)           ; Which arpeggio macro are we using?
  1049. +   and $7F
  1050.     dec a
  1051.     add a,a             ; Each pointer is two bytes
  1052.     ld  e,a
  1053. @@ -2071,7 +2132,12 @@ xpmp_update_fm:
  1054.     ld  (ix+8),a            ; Reset note offset
  1055.     xpmp_update_fm_EN2_done:
  1056.     .ENDIF
  1057. -
  1058. +   ret
  1059. +  
  1060. +   xpmp_fm_step_al_frame:
  1061. +   bit     7,(ix+68)
  1062. +   ret nz
  1063. +   xpmp_fm_step_al:   
  1064.     ld  a,(ix+68)
  1065.     cp  EFFECT_DISABLED
  1066.     jr  z,xpmp_update_fm_al_done
  1067. @@ -2100,7 +2166,8 @@ xpmp_update_fm:
  1068.     ld  (ix+71),a
  1069.     jp  xpmp_update_fm_al_done     
  1070.     xpmp_update_fm_al_loop:
  1071. -   ld  a,(ix+68)           ; Which arpeggio macro are we using?
  1072. +   ld  a,(ix+68)           ; Which algorithm macro are we using?
  1073. +   and $7F
  1074.     dec a
  1075.     add a,a             ; Each pointer is two bytes
  1076.     ld  e,a
  1077. @@ -2131,7 +2198,12 @@ xpmp_update_fm:
  1078.     ld  hl,XPMP_FM_BUF
  1079.     inc (hl)   
  1080.     xpmp_update_fm_al_done:
  1081. +   ret
  1082.  
  1083. +   xpmp_fm_step_fb_frame:
  1084. +   bit     7,(ix+72)
  1085. +   ret nz
  1086. +   xpmp_fm_step_fb:       
  1087.     ld  a,(ix+72)
  1088.     cp  EFFECT_DISABLED
  1089.     jr  z,xpmp_update_fm_fb_done
  1090. @@ -2160,7 +2232,8 @@ xpmp_update_fm:
  1091.     ld  (ix+75),a
  1092.     jp  xpmp_update_fm_fb_done     
  1093.     xpmp_update_fm_fb_loop:
  1094. -   ld  a,(ix+72)           ; Which arpeggio macro are we using?
  1095. +   ld  a,(ix+72)           ; Which feedback macro are we using?
  1096. +   and $7F
  1097.     dec a
  1098.     add a,a             ; Each pointer is two bytes
  1099.     ld  e,a
  1100. @@ -2191,15 +2264,24 @@ xpmp_update_fm:
  1101.     ld  hl,XPMP_FM_BUF
  1102.     inc (hl)   
  1103.     xpmp_update_fm_fb_done:
  1104. -  
  1105. +   ret
  1106. +
  1107. +   xpmp_fm_step_ep_frame:
  1108. +   bit     7,(ix+28)
  1109. +   ret nz
  1110. +   xpmp_fm_step_ep:       
  1111.     .IFNDEF XPMP_EPMAC_NOT_USED
  1112.     ; Sweep macro
  1113.     ld  a,(ix+28)
  1114.     cp  EFFECT_DISABLED
  1115.     jr  z,xpmp_update_fm_EP_done
  1116.     xpmp_update_fm_EP:
  1117. +   ld  a,(xpmp_freqChange)
  1118. +   cp  2
  1119. +   jr  z,+
  1120.     ld  a,1
  1121.     ld  (xpmp_freqChange),a     ; Frequency has changed, but we haven't read a new note/rest yet
  1122. +   +:
  1123.     ld  l,(ix+29)
  1124.     ld  h,(ix+30)
  1125.     ld  d,0
  1126. @@ -2227,6 +2309,7 @@ xpmp_update_fm:
  1127.     jp  xpmp_update_fm_EP_done     
  1128.     xpmp_update_fm_EP_loop:
  1129.     ld  a,(ix+28)           ; Which sweep macro are we using?
  1130. +   and $7F
  1131.     dec a
  1132.     add a,a             ; Each pointer is two bytes
  1133.     ld  e,a
  1134. @@ -2258,13 +2341,7 @@ xpmp_update_fm:
  1135.     ld  (ix+12),h
  1136.     xpmp_update_fm_EP_done:
  1137.     .ENDIF
  1138. -  
  1139. -   ld  a,(xpmp_freqChange)
  1140. -   cp  0
  1141. -   jp  nz,xpmp_update_fm_freq_change
  1142. -   jp  xpmp_update_fm_set_vol
  1143. -
  1144. -   ret
  1145. +   ret
  1146.    
  1147.    
  1148.  
  1149. @@ -2281,43 +2358,34 @@ xpmp_tone_cmd_60:
  1150.     ld  a,c
  1151.     cp  CMD_VOLUP
  1152.     jr  nz,xpmp_tone_cmd_00_2
  1153. -   inc (ix+2)
  1154. -   jr  nz,+
  1155. -   inc (ix+3)
  1156. -   +:
  1157. -   ld  a,(ix+13)
  1158. +   INC_DATAPOS 1
  1159. +   ld  a,(ix+_PSG_VOLUME)
  1160.     inc hl
  1161.     add a,(hl)
  1162. -   ld  (ix+13),a
  1163. +   ld  (ix+_PSG_VOLUME),a
  1164.     ld  a,1
  1165.     ld  (xpmp_volChange),a      ; Volume has changed
  1166. -   ld  a,EFFECT_DISABLED
  1167. -   ld  (ix+22),a           ; Volume set overrides volume macros
  1168. +   ld  (ix+_PSG_VMAC),EFFECT_DISABLED  ; Volume set overrides volume macros
  1169.     ret
  1170.    
  1171.  xpmp_tone_cmd_00_2:
  1172. -   ld  a,(ix+7)
  1173. +   ld  a,(ix+_CHN_NOTE)
  1174.     ld  (xpmp_lastNote),a
  1175.     ld  a,c
  1176.     and $0F
  1177. -   ld  (ix+7),a
  1178. +   ld  (ix+_CHN_NOTE),a
  1179.     ld  a,c
  1180.     and $F0
  1181.     cp  CMD_NOTE2
  1182.     jr  z,xpmp_tone_cmd_00_std_delay   
  1183. -   ld  e,(ix+2)
  1184. -   ld  d,(ix+3)
  1185. -   inc de
  1186. -   inc de
  1187. -   ld  (ix+2),e
  1188. -   ld  (ix+3),d
  1189. +   INC_DATAPOS 2
  1190.     inc hl
  1191.     ld  a,(hl)
  1192.     bit 7,a
  1193.     jr  z,xpmp_tone_cmd_00_short_note
  1194.         inc de
  1195. -       ld  (ix+2),e
  1196. -       ld  (ix+3),d
  1197. +       ld  (ix+_CHN_DATAPOS),e
  1198. +       ld  (ix+_CHN_DATAPOS+1),d
  1199.         inc hl
  1200.         res 7,a
  1201.         ld  d,a
  1202. @@ -2328,26 +2396,26 @@ xpmp_tone_cmd_00_2:
  1203.         or  e
  1204.         ld  e,a
  1205.         inc hl
  1206. -       ld  a,(ix+4)   
  1207. +       ld  a,(ix+_CHN_DELAY)  
  1208.         add a,(hl)
  1209. -       ld  (ix+4),a        ; Fractional part
  1210. +       ld  (ix+_CHN_DELAY),a   ; Fractional part
  1211.         ld  hl,0
  1212.         adc hl,de
  1213. -       ld  (ix+5),l        ; Whole part
  1214. -       ld  (ix+6),h
  1215. +       ld  (ix+_CHN_DELAY+1),l ; Whole part
  1216. +       ld  (ix+_CHN_DELAY+2),h
  1217.         jp  xpmp_tone_cmd_00_got_delay
  1218.     xpmp_tone_cmd_00_short_note:
  1219.     ld  d,0
  1220.     ld  e,a
  1221.     inc hl
  1222. -   ld  a,(ix+4)   
  1223. +   ld  a,(ix+_CHN_DELAY)  
  1224.     add a,(hl)
  1225. -   ld  (ix+4),a            ; Fractional part
  1226. +   ld  (ix+_CHN_DELAY),a       ; Fractional part
  1227.     ld  hl,0
  1228.     adc hl,de
  1229.     ret z
  1230. -   ld  (ix+5),l            ; Whole part
  1231. -   ld  (ix+6),h
  1232. +   ld  (ix+_CHN_DELAY+1),l     ; Whole part
  1233. +   ld  (ix+_CHN_DELAY+2),h
  1234.     jp  xpmp_tone_cmd_00_got_delay
  1235.     xpmp_tone_cmd_00_std_delay:     ; Use delay set by last CMD_LEN
  1236.     ld  a,(ix+52)
  1237. @@ -2371,35 +2439,27 @@ xpmp_tone_cmd_00_2:
  1238.     cp  CMD_REST2
  1239.     ret z
  1240.     .IFNDEF XPMP_VMAC_NOT_USED
  1241. -   ld  a,(ix+22)
  1242. -   cp  EFFECT_DISABLED
  1243. -   call    nz,xpmp_tone_reset_v_mac    ; Reset effects as needed..
  1244. +   RESET_EFFECT 22,tone,v
  1245.     .ENDIF
  1246.     .IFNDEF XPMP_ENMAC_NOT_USED
  1247. -   ld  a,(ix+26)
  1248. -   cp  EFFECT_DISABLED
  1249. -   call    nz,xpmp_tone_reset_en_mac
  1250. +   RESET_EFFECT 26,tone,en
  1251.     .ENDIF
  1252.     .IFNDEF XPMP_EN2MAC_NOT_USED
  1253. -   ld  a,(ix+30)
  1254. -   cp  EFFECT_DISABLED
  1255. -   call    nz,xpmp_tone_reset_en2_mac
  1256. +   RESET_EFFECT 30,tone,en2
  1257.     .ENDIF
  1258.     .IFNDEF XPMP_MPMAC_NOT_USED
  1259. -   ld  a,(ix+38)
  1260. -   cp  EFFECT_DISABLED
  1261. -   call    nz,xpmp_tone_reset_mp_mac
  1262. +   RESET_EFFECT 38,tone,mp
  1263.     .ENDIF
  1264.     .IFNDEF XPMP_EPMAC_NOT_USED
  1265. -   ld  a,(ix+34)
  1266. -   cp  EFFECT_DISABLED
  1267. -   call    nz,xpmp_tone_reset_ep_mac
  1268. +   RESET_EFFECT 34,tone,ep
  1269.     .ENDIF
  1270. -   .IFDEF XPMP_GAME_GEAR
  1271. -   ld  a,(xpmp_channel.csMac)
  1272. -   cp  EFFECT_DISABLED
  1273. -   call    nz,xpmp__reset_cs_mac
  1274. -   .ENDIF 
  1275. +  
  1276. +   ;.IFDEF XPMP_GAME_GEAR
  1277. +   ;ld a,(xpmp_channel.csMac)
  1278. +   ;cp EFFECT_DISABLED
  1279. +   ;call   nz,xpmp__reset_cs_mac
  1280. +   ;.ENDIF
  1281. +  
  1282.     ;ld hl,(xpmp_channel\1.cbEvnote)
  1283.     ;ld a,h
  1284.     ;or l
  1285. @@ -2419,30 +2479,20 @@ xpmp_tone_cmd_10:
  1286.     sla b
  1287.     sla b
  1288.     add a,b             ; A = (C & $0F) * 12
  1289. -   ld  (ix+9),a
  1290. +   ld  (ix+_CHN_OCTAVE),a
  1291.     ret
  1292.    
  1293.  xpmp_tone_cmd_20:
  1294. -;  .IF  == 3
  1295. -;  ld  hl,(xpmp_tempw)
  1296. -;  ld  a,c
  1297. -;  and 1
  1298. -;  xor 1
  1299. -;  add a,a
  1300. -;  add a,a
  1301. -;  ld  (xpmp_channel.duty),a
  1302. -;  .ENDIF
  1303.     ret
  1304.  
  1305.  ; Set volume (short)
  1306.  xpmp_tone_cmd_30:
  1307.     ld  a,c
  1308.     and $0F
  1309. -   ld  (ix+13),a
  1310. +   ld  (ix+_PSG_VOLUME),a
  1311.     ld  a,1
  1312.     ld  (xpmp_volChange),a      ; Volume has changed
  1313. -   ld  a,EFFECT_DISABLED
  1314. -   ld  (ix+22),a           ; Volume set overrides volume macros
  1315. +   ld  (ix+_PSG_VMAC),EFFECT_DISABLED  ; Volume set overrides volume macros
  1316.     ret
  1317.  
  1318.  ; Octave up + note
  1319. @@ -2451,9 +2501,9 @@ xpmp_tone_cmd_40:
  1320.     ld  a,(ix+9)
  1321.     add a,12
  1322.     ld  (ix+9),a
  1323. -ld a,c
  1324. -add a,$20
  1325. -ld c,a
  1326. +   ld  a,c
  1327. +   add     a,$20
  1328. +   ld  c,a
  1329.     jp  xpmp_tone_cmd_00_2
  1330.  
  1331.  ; Octave down + note
  1332. @@ -2462,12 +2512,11 @@ xpmp_tone_cmd_50:
  1333.     ld  a,(ix+9)
  1334.     sub 12
  1335.     ld  (ix+9),a
  1336. -ld a,c
  1337. -add a,$10
  1338. -ld c,a
  1339. +   ld  a,c
  1340. +   add     a,$10
  1341. +   ld  c,a
  1342.     jp  xpmp_tone_cmd_00_2
  1343.  
  1344. -;xpmp_tone_cmd_60:
  1345.  xpmp_tone_cmd_70:
  1346.  xpmp_tone_cmd_80:
  1347.     ret
  1348. @@ -2485,6 +2534,8 @@ xpmp_tone_cmd_90:
  1349.     jp  z,xpmp_fm_cmd_90_wrmem
  1350.     cp  CMD_WRPORT
  1351.     jp  z,xpmp_fm_cmd_90_wrport
  1352. +   cp  CMD_TRANSP
  1353. +   jp  z,xpmp_tone_cmd_90_transp
  1354.    
  1355.     ld  hl,(xpmp_tempw)
  1356.     ld  a,0
  1357. @@ -2495,14 +2546,14 @@ xpmp_tone_cmd_90:
  1358.  
  1359.     ; Jump to pattern
  1360.     xpmp_tone_cmd_90_jsr:
  1361. -   ld  e,(ix+2)
  1362. -   ld  d,(ix+3)
  1363. +   ld  e,(ix+_CHN_DATAPOS)
  1364. +   ld  d,(ix+_CHN_DATAPOS+1)
  1365.     inc de
  1366.     ld  (ix+50),e
  1367.     ld  (ix+51),d
  1368. -   ld  a,(ix+0)
  1369. +   ld  a,(ix+_CHN_DATAPTR)
  1370.     ld  (ix+48),a
  1371. -   ld  a,(ix+1)
  1372. +   ld  a,(ix+_CHN_DATAPTR+1)
  1373.     ld  (ix+49),a
  1374.     ld  hl,(xpmp_tempw)
  1375.     inc hl
  1376. @@ -2516,39 +2567,34 @@ xpmp_tone_cmd_90:
  1377.     or  $80
  1378.     inc hl
  1379.     ld  d,(hl)
  1380. -   ld  (ix+0),d
  1381. -   ld  (ix+1),a
  1382. -   ld  (ix+2),$FF
  1383. -   ld  (ix+3),$FF
  1384. +   ld  (ix+_CHN_DATAPTR),d
  1385. +   ld  (ix+_CHN_DATAPTR+1),a
  1386. +   ld  (ix+_CHN_DATAPOS),$FF
  1387. +   ld  (ix+_CHN_DATAPOS+1),$FF
  1388.     ret
  1389.    
  1390.     ; Return from pattern
  1391.     xpmp_tone_cmd_90_rts:
  1392.     ld  a,(ix+48)
  1393. -   ld  (ix+0),a
  1394. +   ld  (ix+_CHN_DATAPTR),a
  1395.     ld  a,(ix+49)
  1396. -   ld  (ix+1),a
  1397. +   ld  (ix+_CHN_DATAPTR+1),a
  1398.     ld  a,(ix+50)
  1399. -   ld  (ix+2),a
  1400. +   ld  (ix+_CHN_DATAPOS),a
  1401.     ld  a,(ix+51)
  1402. -   ld  (ix+3),a
  1403. +   ld  (ix+_CHN_DATAPOS+1),a
  1404.     ret
  1405.  
  1406.     xpmp_tone_cmd_90_len:
  1407.     ld  hl,(xpmp_tempw)
  1408. -   ld  e,(ix+2)
  1409. -   ld  d,(ix+3)
  1410. -   inc de
  1411. -   inc de
  1412. -   ld  (ix+2),e
  1413. -   ld  (ix+3),d
  1414. +   INC_DATAPOS 2
  1415.     inc hl
  1416.     ld  a,(hl)
  1417.     bit 7,a
  1418.     jr  z,xpmp_tone_cmd_90_short_delay
  1419.         inc de
  1420. -       ld  (ix+2),e
  1421. -       ld  (ix+3),d
  1422. +       ld  (ix+_CHN_DATAPOS),e
  1423. +       ld  (ix+_CHN_DATAPOS+1),d
  1424.         inc hl
  1425.         res 7,a
  1426.         ld  d,a
  1427. @@ -2573,6 +2619,14 @@ xpmp_tone_cmd_90:
  1428.     ld  (ix+53),e   ; Whole part
  1429.     ld  (ix+54),d   ; ...
  1430.     ret
  1431. +
  1432. +   xpmp_tone_cmd_90_transp:
  1433. +   ld  hl,(xpmp_tempw)
  1434. +   inc hl
  1435. +   ld  a,(hl)
  1436. +   ld  (ix+_PSG_TRANSP),a
  1437. +   INC_DATAPOS 1
  1438. +   ret
  1439.    
  1440.  xpmp_tone_cmd_A0:
  1441.  xpmp_tone_cmd_B0:
  1442. @@ -2583,10 +2637,7 @@ xpmp_tone_cmd_D0:
  1443.  ; Callback
  1444.  xpmp_tone_cmd_E0:
  1445.     ld  hl,(xpmp_tempw)
  1446. -   inc (ix+2)
  1447. -   jr  nz,+
  1448. -   inc (ix+3)
  1449. -   +:
  1450. +   INC_DATAPOS 1
  1451.     ld  a,c
  1452.     cp  CMD_CBOFF
  1453.     jr  z,xpmp_tone_cmd_E0_cboff
  1454. @@ -2653,10 +2704,7 @@ xpmp_tone_cmd_E0:
  1455.    
  1456.  xpmp_tone_cmd_F0:
  1457.     ld  hl,(xpmp_tempw)
  1458. -   inc (ix+2)
  1459. -   jr  nz,+
  1460. -   inc (ix+3)
  1461. -   +: 
  1462. +   INC_DATAPOS 1
  1463.     ; Initialize volume macro  
  1464.     ld  a,c
  1465.  
  1466. @@ -2671,6 +2719,7 @@ xpmp_tone_cmd_F0:
  1467.     ld  a,(hl)
  1468.     ld  (ix+22),a
  1469.     xpmp_tone_reset_v_mac:
  1470. +   and $7F
  1471.     dec a
  1472.     add a,a
  1473.     ld  hl,(xpmp_v_mac_tbl)
  1474. @@ -2706,6 +2755,7 @@ xpmp_tone_cmd_F0:
  1475.     jr  z,xpmp_tone_cmd_F0_disable_VIBMAC
  1476.     ld  (ix+38),a
  1477.     xpmp_tone_reset_mp_mac:
  1478. +   and $7F
  1479.     dec a
  1480.     add a,a
  1481.     ld  hl,(xpmp_MP_mac_tbl)
  1482. @@ -2751,6 +2801,7 @@ xpmp_tone_cmd_F0:
  1483.     cp  EFFECT_DISABLED
  1484.     jr  z,xpmp_tone_cmd_F0_disable_SWPMAC  
  1485.     xpmp_tone_reset_ep_mac:
  1486. +   and $7F
  1487.     dec a
  1488.     add a,a
  1489.     ld  hl,(xpmp_EP_mac_tbl)
  1490. @@ -2789,8 +2840,8 @@ xpmp_tone_cmd_F0:
  1491.     inc hl
  1492.     ld  d,(hl)
  1493.     dec de              ; dataPos will be increased after the return, so we decrease it here
  1494. -   ld  (ix+2),e
  1495. -   ld  (ix+3),d
  1496. +   ld  (ix+_CHN_DATAPOS),e
  1497. +   ld  (ix+_CHN_DATAPOS+1),d
  1498.     ret
  1499.  
  1500.     ; Set loop count
  1501. @@ -2821,17 +2872,14 @@ xpmp_tone_cmd_F0:
  1502.     inc hl
  1503.     ld  d,(hl)
  1504.     dec de              ; dataPos will be increased after the return, so we decrease it here
  1505. -   ld  (ix+2),e
  1506. -   ld  (ix+3),d
  1507. +   ld  (ix+_CHN_DATAPOS),e
  1508. +   ld  (ix+_CHN_DATAPOS+1),d
  1509.     ret
  1510.     xpmp_tone_cmd_F0_DJNZ_Z:
  1511.     dec hl
  1512.     ld  (ix+44),l
  1513.     ld  (ix+45),h
  1514. -   inc (ix+2)
  1515. -   jr  nz,+
  1516. -   inc (ix+3)
  1517. -   +: 
  1518. +   INC_DATAPOS 1
  1519.     ret
  1520.    
  1521.     ; Initialize non-cumulative arpeggio macro
  1522. @@ -2843,6 +2891,7 @@ xpmp_tone_cmd_F0:
  1523.     ld  a,(hl)
  1524.     ld  (ix+30),a
  1525.     xpmp_tone_reset_en2_mac:
  1526. +   and $7F
  1527.     dec a
  1528.     add a,a
  1529.     ld  hl,(xpmp_EN_mac_tbl)
  1530. @@ -2866,7 +2915,7 @@ xpmp_tone_cmd_F0:
  1531.     ret
  1532.     .ENDIF
  1533.    
  1534. -   ; Initialize non-cumulative arpeggio macro
  1535. +   ; Initialize cumulative arpeggio macro
  1536.     xpmp_tone_cmd_F0_check_ARPMAC:
  1537.     .IFNDEF XPMP_ENMAC_NOT_USED
  1538.     cp  CMD_ARPMAC
  1539. @@ -2875,6 +2924,7 @@ xpmp_tone_cmd_F0:
  1540.     ld  a,(hl)
  1541.     ld  (ix+26),a
  1542.     xpmp_tone_reset_en_mac:
  1543. +   and $7F
  1544.     dec a
  1545.     add a,a
  1546.     ld  hl,(xpmp_EN_mac_tbl)
  1547. @@ -2958,19 +3008,14 @@ xpmp_noise_cmd_00_2:
  1548.     ld  a,c
  1549.     and $0F
  1550.     ld  (xpmp_channel3.note),a
  1551. -   ld  e,(ix+2)
  1552. -   ld  d,(ix+3)
  1553. -   inc de
  1554. -   inc de
  1555. -   ld  (ix+2),e
  1556. -   ld  (ix+3),d
  1557. +   INC_DATAPOS 2
  1558.     inc hl
  1559.     ld  a,(hl)
  1560.     bit 7,a
  1561.     jr  z,xpmp_noise_cmd_00_short_note
  1562.         inc de
  1563. -       ld  (ix+2),e
  1564. -       ld  (ix+3),d
  1565. +       ld  (ix+_CHN_DATAPOS),e
  1566. +       ld  (ix+_CHN_DATAPOS+1),d
  1567.         inc hl
  1568.         res 7,a
  1569.         ld  d,a
  1570. @@ -2981,9 +3026,9 @@ xpmp_noise_cmd_00_2:
  1571.         or  e
  1572.         ld  e,a
  1573.         inc hl
  1574. -       ld  a,(ix+4)   
  1575. +       ld  a,(ix+_CHN_DELAY)  
  1576.         add a,(hl)
  1577. -       ld  (ix+4),a        ; Fractional part
  1578. +       ld  (ix+_CHN_DELAY),a   ; Fractional part
  1579.         ld  hl,0
  1580.         adc hl,de
  1581.         ld  (ix+5),l        ; Whole part
  1582. @@ -3011,18 +3056,42 @@ xpmp_noise_cmd_00_2:
  1583.     ret z
  1584.     .IFNDEF XPMP_VMAC_NOT_USED
  1585.     ld  a,(ix+22)
  1586. +   bit 7,a
  1587. +   jr  nz,+
  1588.     cp  EFFECT_DISABLED
  1589.     call    nz,xpmp_tone_reset_v_mac    ; Reset effects as needed..
  1590. +   jr  xpmp_noise_v_reset
  1591. +   +:
  1592. +   call    xpmp_tone_step_v
  1593. +   xpmp_noise_v_reset:
  1594.     .ENDIF
  1595.     .IFNDEF XPMP_ENMAC_NOT_USED
  1596.     ld  a,(ix+26)
  1597. +   bit 7,a
  1598. +   jr  nz,+
  1599.     cp  EFFECT_DISABLED
  1600. -   call    nz,xpmp_tone_reset_en_mac
  1601. +   call    nz,xpmp_tone_reset_en_mac   ; Reset effects as needed..
  1602. +   jr  xpmp_noise_en_reset
  1603. +   +:
  1604. +   call    xpmp_tone_step_en
  1605. +   xpmp_noise_en_reset:   
  1606. +   ;ld a,(ix+26)
  1607. +   ;cp EFFECT_DISABLED
  1608. +   ;call   nz,xpmp_tone_reset_en_mac
  1609.     .ENDIF
  1610.     .IFNDEF XPMP_EN2MAC_NOT_USED
  1611.     ld  a,(ix+30)
  1612. +   bit 7,a
  1613. +   jr  nz,+
  1614.     cp  EFFECT_DISABLED
  1615. -   call    nz,xpmp_tone_reset_en2_mac
  1616. +   call    nz,xpmp_tone_reset_en2_mac  ; Reset effects as needed..
  1617. +   jr  xpmp_noise_en2_reset
  1618. +   +:
  1619. +   call    xpmp_tone_step_en2
  1620. +   xpmp_noise_en2_reset:  
  1621. +   ;ld a,(ix+30)
  1622. +   ;cp EFFECT_DISABLED
  1623. +   ;call   nz,xpmp_tone_reset_en2_mac
  1624.     .ENDIF
  1625.     ret
  1626.    
  1627. @@ -3042,9 +3111,9 @@ xpmp_noise_cmd_40:
  1628.     ld  a,(xpmp_channel3.octave)
  1629.     add a,12
  1630.     ld  (xpmp_channel3.octave),a
  1631. -   ld a,c
  1632. -   add a,$20
  1633. -   ld c,a
  1634. +   ld  a,c
  1635. +   add     a,$20
  1636. +   ld  c,a
  1637.     jp  xpmp_tone_cmd_60 ;xpmp_noise_cmd_00_2
  1638.  
  1639.  ; Octave down + note
  1640. @@ -3053,19 +3122,16 @@ xpmp_noise_cmd_50:
  1641.     ld  a,(xpmp_channel3.octave)
  1642.     sub 12
  1643.     ld  (xpmp_channel3.octave),a
  1644. -   ld a,c
  1645. -   add a,$10
  1646. -   ld c,a
  1647. +   ld  a,c
  1648. +   add     a,$10
  1649. +   ld  c,a
  1650.     jp  xpmp_tone_cmd_60 ;xpmp_noise_cmd_00_2
  1651.  
  1652.  
  1653.  ; Callback
  1654.  xpmp_noise_cmd_E0:
  1655.     ld  hl,(xpmp_tempw)
  1656. -   inc (ix+2)
  1657. -   jr  nz,+
  1658. -   inc (ix+3)
  1659. -   +:
  1660. +   INC_DATAPOS 1
  1661.     ld  a,c
  1662.     cp  CMD_CBOFF
  1663.     jp  z,xpmp_tone_cmd_E0_cboff
  1664. @@ -3078,10 +3144,7 @@ xpmp_noise_cmd_E0:
  1665.    
  1666.  xpmp_noise_cmd_F0:
  1667.     ld  hl,(xpmp_tempw)
  1668. -   inc (ix+2)
  1669. -   jr  nz,+
  1670. -   inc (ix+3)
  1671. -   +: 
  1672. +   INC_DATAPOS 1
  1673.     ; Initialize volume macro  
  1674.     ld  a,c
  1675.  
  1676. @@ -3092,6 +3155,7 @@ xpmp_noise_cmd_F0:
  1677.     ld  a,(hl)
  1678.     ld  (ix+22),a
  1679.     xpmp_noise_reset_v_mac:
  1680. +   and $7F
  1681.     dec a
  1682.     add a,a
  1683.     ld  hl,(xpmp_v_mac_tbl)
  1684. @@ -3145,12 +3209,12 @@ xpmp_update_psg:
  1685.     ld  (xpmp_freqChange),a
  1686.     ld  (xpmp_volChange),a
  1687.    
  1688. -   ld  a,(ix+7)
  1689. +   ld  a,(ix+_CHN_NOTE)
  1690.     cp  CMD_END
  1691.     ret z               ; Playback has ended for this channel - all processing should be skipped
  1692.    
  1693. -   ld  l,(ix+5)            ; Decrement the whole part of the delay and check if it has reached zero
  1694. -   ld  h,(ix+6)
  1695. +   ld  l,(ix+_CHN_DELAY+1)     ; Decrement the whole part of the delay and check if it has reached zero
  1696. +   ld  h,(ix+_CHN_DELAY+2)
  1697.     dec hl
  1698.     ld  a,h
  1699.     or  l
  1700. @@ -3158,10 +3222,10 @@ xpmp_update_psg:
  1701.    
  1702.     ; Loop here until a note/rest or END command is read (signaled by xpmp_freqChange == 2)
  1703.     xpmp_update_psg_read_cmd:
  1704. -   ld  l,(ix+0)
  1705. -   ld  h,(ix+1)
  1706. -   ld  e,(ix+2)
  1707. -   ld  d,(ix+3)
  1708. +   ld  l,(ix+_CHN_DATAPTR)
  1709. +   ld  h,(ix+_CHN_DATAPTR+1)
  1710. +   ld  e,(ix+_CHN_DATAPOS)
  1711. +   ld  d,(ix+_CHN_DATAPOS+1)
  1712.     add     hl,de
  1713.     ld  c,(hl)
  1714.     ld  (xpmp_tempw),hl         ; Store HL for later use
  1715. @@ -3180,10 +3244,7 @@ xpmp_update_psg:
  1716.     ex  de,hl
  1717.     call    xpmp_call_hl
  1718.  
  1719. -   inc (ix+2)
  1720. -   jr  nz,+
  1721. -   inc (ix+3)
  1722. -   +:
  1723. +   INC_DATAPOS 1
  1724.    
  1725.     ld  a,(xpmp_freqChange)
  1726.     cp  2
  1727. @@ -3191,7 +3252,7 @@ xpmp_update_psg:
  1728.     jp  xpmp_update_psg_read_cmd
  1729.    
  1730.     xpmp_update_psg_freq_change:
  1731. -   ld  a,(ix+7)
  1732. +   ld  a,(ix+_CHN_NOTE)
  1733.     cp  CMD_REST
  1734.     jp  z,xpmp_update_psg_rest
  1735.     cp  CMD_REST2
  1736. @@ -3199,13 +3260,15 @@ xpmp_update_psg:
  1737.     cp  CMD_END
  1738.     jp  z,xpmp_update_psg_rest
  1739.     ld  b,a
  1740. -   ld  a,(ix+8)
  1741. -   add a,b
  1742. +   ld  a,(ix+_CHN_NOTEOFFS)
  1743. +   ld  d,(ix+_PSG_TRANSP)
  1744. +   add a,d
  1745. +   add a,b             ; note + noteOffs + transpose
  1746.     ld  b,a
  1747.     ld  a,(xpmp_chnum)
  1748.     cp  3
  1749.     jr  z,xpmp_update_psg_noise
  1750. -   ld  a,(ix+9)
  1751. +   ld  a,(ix+_CHN_OCTAVE)
  1752.     add a,b
  1753.     ld  hl,xpmp_freq_tbl
  1754.     ld  d,0
  1755. @@ -3267,7 +3330,7 @@ xpmp_update_psg:
  1756.     jp  xpmp_update_psg_set_vol3
  1757.  
  1758.     xpmp_update_psg_set_vol:
  1759. -   ld  a,(ix+7)
  1760. +   ld  a,(ix+_CHN_NOTE)
  1761.     cp  CMD_REST
  1762.     jr  z,xpmp_update_psg_rest
  1763.     xpmp_update_psg_set_vol2:
  1764. @@ -3277,12 +3340,11 @@ xpmp_update_psg:
  1765.     ret z
  1766.     xpmp_update_psg_set_vol3:
  1767.     ld  a,(xpmp_chsel)
  1768. -   or  (ix+13)
  1769. +   or  (ix+_PSG_VOLUME)
  1770.     xor $9F
  1771.     ld  ($7F11),a
  1772.     res 7,a
  1773.     ld  ($7F11),a
  1774. -
  1775.     xpmp_update_psg_no_vol_change:
  1776.     ret
  1777.    
  1778. @@ -3296,12 +3358,29 @@ xpmp_update_psg:
  1779.     ret
  1780.  
  1781.     xpmp_update_psg_effects:
  1782. -   ld  (ix+5),l
  1783. -   ld  (ix+6),h
  1784. +   ld  (ix+_CHN_DELAY+1),l
  1785. +   ld  (ix+_CHN_DELAY+2),h
  1786.  
  1787. +   call    xpmp_tone_step_v_frame
  1788. +   call    xpmp_tone_step_en_frame
  1789. +   call    xpmp_tone_step_en2_frame
  1790. +   call    xpmp_tone_step_ep_frame
  1791. +   call    xpmp_tone_step_mp_frame
  1792. +
  1793. +   xpmp_update_psg_effects_done:
  1794. +   ld  a,(xpmp_freqChange)
  1795. +   cp  0
  1796. +   jp  nz,xpmp_update_psg_freq_change
  1797. +   jp  xpmp_update_psg_set_vol
  1798. +   ret
  1799. +  
  1800. +   xpmp_tone_step_v_frame:
  1801. +   bit     7,(ix+_PSG_VMAC)
  1802. +   ret nz
  1803. +   xpmp_tone_step_v:  
  1804.     .IFNDEF XPMP_VMAC_NOT_USED
  1805.     ; Volume macro
  1806. -   ld  a,(ix+22)
  1807. +   ld  a,(ix+_PSG_VMAC)
  1808.     cp  EFFECT_DISABLED
  1809.     jr  z,xpmp_update_psg_v_done
  1810.     xpmp_update_psg_v:
  1811. @@ -3322,12 +3401,15 @@ xpmp_update_psg:
  1812.     ld  (ix+25),a
  1813.     jp  xpmp_update_psg_v_done
  1814.     xpmp_update_psg_v_loop:
  1815. -   ld  a,(ix+22)           ; Which volume macro are we using?
  1816. +   ld  a,(ix+_PSG_VMAC)        ; Which volume macro are we using?
  1817. +   and $7F
  1818.     dec a
  1819.     ld  e,a
  1820.     sla e               ; Each pointer is two bytes
  1821.     ld  bc,(xpmp_v_mac_loop_tbl)
  1822. -   ld  hl,(xpmp_vMacPtr)
  1823. +   ;ld hl,(xpmp_vMacPtr)
  1824. +   ld  l,(ix+23)
  1825. +   ld  h,(ix+24)
  1826.     ex  de,hl
  1827.     inc de
  1828.     add hl,bc               ; HL = xpmp_vMac_loop_tbl + (vMac - 1)*2
  1829. @@ -3346,15 +3428,24 @@ xpmp_update_psg:
  1830.     ld  (ix+13),a
  1831.     xpmp_update_psg_v_done:
  1832.     .ENDIF
  1833. -  
  1834. +   ret
  1835. +
  1836. +   xpmp_tone_step_en_frame:
  1837. +   bit     7,(ix+26)
  1838. +   ret nz
  1839. +   xpmp_tone_step_en:     
  1840.     .IFNDEF XPMP_ENMAC_NOT_USED
  1841.     ; Cumulative arpeggio
  1842.     ld  a,(ix+26)
  1843.     cp  EFFECT_DISABLED
  1844.     jr  z,xpmp_update_psg_EN_done
  1845.     xpmp_update_psg_EN:
  1846. +   ld  a,(xpmp_freqChange)
  1847. +   cp  2
  1848. +   jr  z,+
  1849.     ld  a,1
  1850.     ld  (xpmp_freqChange),a     ; Frequency has changed, but we haven't read a new note/rest yet
  1851. +   +:
  1852.     ld  l,(ix+27)
  1853.     ld  h,(ix+28)
  1854.     ld  d,0
  1855. @@ -3373,6 +3464,7 @@ xpmp_update_psg:
  1856.     jp  xpmp_update_psg_EN_done    
  1857.     xpmp_update_psg_EN_loop:
  1858.     ld  a,(ix+26)           ; Which arpeggio macro are we using?
  1859. +   and $7F
  1860.     dec a
  1861.     add a,a             ; Each pointer is two bytes
  1862.     ld  e,a
  1863. @@ -3397,15 +3489,24 @@ xpmp_update_psg:
  1864.     ld  (ix+8),a            ; Reset note offset
  1865.     xpmp_update_psg_EN_done:
  1866.     .ENDIF
  1867. -  
  1868. +   ret
  1869. +
  1870. +   xpmp_tone_step_en2_frame:
  1871. +   bit     7,(ix+30)
  1872. +   ret nz
  1873. +   xpmp_tone_step_en2:    
  1874.     .IFNDEF XPMP_EN2MAC_NOT_USED
  1875.     ; Non-cumulative arpeggio
  1876.     ld  a,(ix+30)
  1877.     cp  EFFECT_DISABLED
  1878.     jr  z,xpmp_update_psg_EN2_done
  1879.     xpmp_update_psg_EN2:
  1880. +   ld  a,(xpmp_freqChange)
  1881. +   cp  2
  1882. +   jr  z,+
  1883.     ld  a,1
  1884.     ld  (xpmp_freqChange),a     ; Frequency has changed, but we haven't read a new note/rest yet
  1885. +   +:
  1886.     ld  l,(ix+31)
  1887.     ld  h,(ix+32)
  1888.     ld  d,0
  1889. @@ -3421,6 +3522,7 @@ xpmp_update_psg:
  1890.     jp  xpmp_update_psg_EN2_done       
  1891.     xpmp_update_psg_EN2_loop:
  1892.     ld  a,(ix+30)           ; Which arpeggio macro are we using?
  1893. +   and $7F
  1894.     dec a
  1895.     add a,a             ; Each pointer is two bytes
  1896.     ld  e,a
  1897. @@ -3443,18 +3545,27 @@ xpmp_update_psg:
  1898.     ld  (ix+8),a            ; Reset note offset
  1899.     xpmp_update_psg_EN2_done:
  1900.     .ENDIF
  1901. +   ret
  1902.    
  1903. -   ld  a,(xpmp_chnum)
  1904. -   cp  3
  1905. -   jp  z,xpmp_update_psg_effects_done
  1906. +   ;ld a,(xpmp_chnum)
  1907. +   ;cp 3
  1908. +   ;jp z,xpmp_update_psg_effects_done
  1909. +   xpmp_tone_step_ep_frame:
  1910. +   bit     7,(ix+34)
  1911. +   ret nz
  1912. +   xpmp_tone_step_ep:     
  1913.     .IFNDEF XPMP_EPMAC_NOT_USED
  1914.     ; Sweep macro
  1915.     ld  a,(ix+34)
  1916.     cp  EFFECT_DISABLED
  1917.     jr  z,xpmp_update_psg_EP_done
  1918.     xpmp_update_psg_EP:
  1919. +   ld  a,(xpmp_freqChange)
  1920. +   cp  2
  1921. +   jr  z,+
  1922.     ld  a,1
  1923.     ld  (xpmp_freqChange),a     ; Frequency has changed, but we haven't read a new note/rest yet
  1924. +   +:
  1925.     ld  l,(ix+35)
  1926.     ld  h,(ix+36)
  1927.     ld  d,0
  1928. @@ -3482,6 +3593,7 @@ xpmp_update_psg:
  1929.     jp  xpmp_update_psg_EP_done    
  1930.     xpmp_update_psg_EP_loop:
  1931.     ld  a,(ix+34)           ; Which sweep macro are we using?
  1932. +   and $7F
  1933.     dec a
  1934.     add a,a             ; Each pointer is two bytes
  1935.     ld  e,a
  1936. @@ -3513,18 +3625,28 @@ xpmp_update_psg:
  1937.     ld  (ix+17),h
  1938.     xpmp_update_psg_EP_done:
  1939.     .ENDIF
  1940. -  
  1941. +   ret
  1942. +
  1943. +   xpmp_tone_step_mp_frame:
  1944. +   bit     7,(ix+38)
  1945. +   ret nz
  1946. +   xpmp_tone_step_mp:     
  1947.     .IFNDEF XPMP_MPMAC_NOT_USED
  1948.     ; Vibrato
  1949.     ld  a,(ix+38)
  1950.     cp  EFFECT_DISABLED
  1951.     jr  z,xpmp_update_psg_MP_done
  1952.     ld  a,(ix+41)
  1953. -   dec a
  1954. +   ;dec    a
  1955. +   cp  0
  1956.     jr  nz,xpmp_update_psg_MP_done2
  1957.     xpmp_update_psg_MP:
  1958. +   ld  a,(xpmp_freqChange)
  1959. +   cp  2
  1960. +   jr  z,+
  1961.     ld  a,1
  1962. -   ld  (xpmp_freqChange),a     ; Volume has changed
  1963. +   ld  (xpmp_freqChange),a     ; Frequency has changed, but we haven't read a new note/rest yet
  1964. +   +:
  1965.     ld  l,(ix+39)
  1966.     ld  h,(ix+40)
  1967.     ld  e,(ix+18)           ; Load the frequency offset from the latch, then negate the latch
  1968. @@ -3537,23 +3659,17 @@ xpmp_update_psg:
  1969.     sbc hl,de
  1970.     ld  (ix+18),l
  1971.     ld  (ix+19),h
  1972. +   inc a
  1973.     xpmp_update_psg_MP_done2:
  1974. +   dec a
  1975.     ld  (ix+41),a
  1976.     xpmp_update_psg_MP_done:
  1977.     .ENDIF
  1978. -
  1979. -   xpmp_update_psg_effects_done:
  1980. -   ld  a,(xpmp_freqChange)
  1981. -   cp  0
  1982. -   jp  nz,xpmp_update_psg_freq_change
  1983. -   jp  xpmp_update_psg_set_vol
  1984. -
  1985. -   ret
  1986. -
  1987. -
  1988. +   ret
  1989. +  
  1990.  
  1991.    
  1992. -.macro UPDATE_FM
  1993. +.MACRO UPDATE_FM
  1994.  ld a,\1
  1995.  ld (xpmp_chsel),a
  1996.  ld a,\2
  1997. @@ -3570,7 +3686,7 @@ ld    (xpmp_alMacPtr),hl
  1998.  ld hl,xpmp_channel\3.fbMacPtr
  1999.  ld (xpmp_fbMacPtr),hl
  2000.  call   xpmp_update_fm
  2001. -.endm
  2002. +.ENDM
  2003.  
  2004.  
  2005.  xpmp_update:
  2006. @@ -3586,8 +3702,6 @@ xpmp_update:
  2007.     ld  a,0
  2008.     ld  hl,xpmp_tone_jump_tbl
  2009.     ld  (xpmp_jump_tbl),hl
  2010. -   ld  hl,xpmp_channel0.vMacPtr
  2011. -   ld  (xpmp_vMacPtr),hl
  2012.     ld  hl,xpmp_channel0.enMacPtr
  2013.     ld  (xpmp_enMacPtr),hl
  2014.     ld  hl,xpmp_channel0.en2MacPtr
  2015. @@ -3600,8 +3714,6 @@ xpmp_update:
  2016.     ld  a,1
  2017.     ld  hl,xpmp_tone_jump_tbl
  2018.     ld  (xpmp_jump_tbl),hl
  2019. -   ld  hl,xpmp_channel1.vMacPtr
  2020. -   ld  (xpmp_vMacPtr),hl
  2021.     ld  hl,xpmp_channel1.enMacPtr
  2022.     ld  (xpmp_enMacPtr),hl
  2023.     ld  hl,xpmp_channel1.en2MacPtr
  2024. @@ -3614,8 +3726,6 @@ xpmp_update:
  2025.     ld  a,2
  2026.     ld  hl,xpmp_tone_jump_tbl
  2027.     ld  (xpmp_jump_tbl),hl
  2028. -   ld  hl,xpmp_channel2.vMacPtr
  2029. -   ld  (xpmp_vMacPtr),hl
  2030.     ld  hl,xpmp_channel2.enMacPtr
  2031.     ld  (xpmp_enMacPtr),hl
  2032.     ld  hl,xpmp_channel2.en2MacPtr
  2033. @@ -3628,8 +3738,6 @@ xpmp_update:
  2034.     ld  a,3
  2035.     ld  hl,xpmp_noise_jump_tbl
  2036.     ld  (xpmp_jump_tbl),hl
  2037. -   ld  hl,xpmp_channel3.vMacPtr
  2038. -   ld  (xpmp_vMacPtr),hl
  2039.     ld  hl,xpmp_channel3.enMacPtr
  2040.     ld  (xpmp_enMacPtr),hl
  2041.     ld  hl,xpmp_channel3.en2MacPtr
  2042. @@ -3738,12 +3846,7 @@ xpmp_fm_jump_tbl:
  2043.  
  2044.  xpmp_fm_freq_tbl:
  2045.  .dw 649, 688, 729, 772, 818, 867, 918, 973, 1031, 1092, 1157, 1226
  2046. -;.dw 649, 688, 729, 772, 818, 867, 918, 973, 1031, 1092, 1157, 1226
  2047. -;.dw 649, 688, 729, 772, 818, 867, 918, 973, 1031, 1092, 1157, 1226
  2048. -;.dw 649, 688, 729, 772, 818, 867, 918, 973, 1031, 1092, 1157, 1226
  2049. -;.dw 649, 688, 729, 772, 818, 867, 918, 973, 1031, 1092, 1157, 1226
  2050. -;.dw 649, 688, 729, 772, 818, 867, 918, 973, 1031, 1092, 1157, 1226
  2051. -;.dw 649, 688, 729, 772, 818, 867, 918, 973, 1031, 1092, 1157, 1226
  2052. +
  2053.  
  2054.  xpmp_freq_tbl:
  2055.  .IFDEF XPMP_50_HZ
Advertisement
Add Comment
Please, Sign In to add comment