1 /****************************************************************************
3 * ____ ___ ____ __ ______ ___ ____ ____/ / *
4 * / __ `__ \/ __ `/ |/ / __ `__ \/ __ \/ __ / *
5 * / / / / / / /_/ /> </ / / / / / /_/ / /_/ / *
6 * /_/ /_/ /_/\__,_/_/|_/_/ /_/ /_/\____/\__,_/ *
10 * Copyright (c) 2008, Mukunda Johnson (mukunda@maxmod.org) *
12 * Permission to use, copy, modify, and/or distribute this software for any *
13 * purpose with or without fee is hereby granted, provided that the above *
14 * copyright notice and this permission notice appear in all copies. *
16 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES *
17 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF *
18 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR *
19 * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES *
20 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN *
21 * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF *
22 * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. *
23 ****************************************************************************/
25 #include "mp_format_mas.inc"
26 #include "mp_mas_structs.inc"
27 #include "mp_defs.inc"
28 #include "mp_macros.inc"
30 //-----------------------------------------------------------------------------
32 //-----------------------------------------------------------------------------
34 #include "mp_mixer_gba.inc"
35 #include "swi_gba.inc"
37 //-----------------------------------------------------------------------------
39 //-----------------------------------------------------------------------------
41 //-----------------------------------------------------------------------------
43 //-----------------------------------------------------------------------------
44 #include "mp_mixer_ds.inc"
45 #include "swi_nds.inc"
46 //-----------------------------------------------------------------------------
48 //-----------------------------------------------------------------------------
51 .equ S3M_FREQ_DIVIDER ,57268224 // (s3m,xm,it)
52 .equ MOD_FREQ_DIVIDER_PAL ,56750314 // (mod)
53 .equ MOD_FREQ_DIVIDER_NTSC ,57272724 // (---)
57 /******************************************************************************
61 ******************************************************************************/
68 /******************************************************************************
71 * Layer data for module playback.
72 ******************************************************************************/
74 mmLayerMain: .space MPL_SIZE
76 /******************************************************************************
79 * Layer data for jingle playback.
80 ******************************************************************************/
82 mmLayerSub: .space MPL_SIZE
84 /******************************************************************************
87 * Holds intermediate data during the module processing.
88 ******************************************************************************/
90 mpp_vars: .space MPV_SIZE
94 /******************************************************************************
97 * Pointer to layer data during processing.
98 ******************************************************************************/
102 /******************************************************************************
105 * Pointer to channel array during processing
106 ******************************************************************************/
108 mpp_channels: .space 4
110 /******************************************************************************
113 * Speed divider for DS timing.
114 ******************************************************************************/
116 mpp_resolution: .space 4
118 /******************************************************************************
121 * Master tempo scaler.
122 ******************************************************************************/
124 mm_mastertempo: .space 4
126 /******************************************************************************
129 * Master pitch scaler.
130 ******************************************************************************/
132 mm_masterpitch: .space 4
134 /******************************************************************************
137 * Number of channels in layer
138 ******************************************************************************/
139 .global mpp_nchannels
140 mpp_nchannels: .space 1
142 /******************************************************************************
145 * Layer selection, 0 = main, 1 = sub
146 ******************************************************************************/
150 /******************************************************************************
151 * mm_achannels, mm_pchannels, mm_num_mch, mm_num_ach, mm_schannels
153 * Channel data/sizes, don't move these around--see mmInit first
154 ******************************************************************************/
157 .global mm_achannels, mm_pchannels, mm_num_mch, mm_num_ach, mm_schannels
159 mm_achannels: .space 4
160 mm_pchannels: .space 4
163 mm_schannels: .space MP_SCHANNELS*MCH_SIZE
167 /******************************************************************************
171 ******************************************************************************/
174 /******************************************************************************
175 * mpp_InstrumentPointer
177 * Calculate instrument address.
178 * Requires r8 = layer
181 ******************************************************************************/
182 .macro mpp_InstrumentPointer
184 ldr r2,[r1,#MPL_SONGADR]
185 ldr r1,[r1,#MPL_INSTTABLE]
191 /******************************************************************************
194 * Calculate sample address.
195 * Requires r8 = layer
198 ******************************************************************************/
199 .macro mpp_SamplePointer
201 ldr r2,[r1,#MPL_SONGADR]
202 ldr r1,[r1,#MPL_SAMPTABLE]
210 /******************************************************************************
214 ******************************************************************************/
221 /******************************************************************************
222 * mpp_resetchannels(...)
224 * Reset channel data, and any active channels linked to the layer.
225 * Requires r5 = layer, r6 = channels, r7 = #channels
226 ******************************************************************************/
232 mov r0, r6 // clear channel data to 0
233 mov r1, #MCH_SIZE/4 //
236 1: stmia r0!, {r2} //
240 mov r0, r6 // reset channel indexes
241 sub r0, #MCH_SIZE-MCH_ALLOC //
245 1: strb r2, [r0, r1] //
249 GET_MIXCH r4 // reset active channels linked to this layer
250 ldr r6,=mpp_clayer //
253 #ifdef SYS_GBA // disabled status differs between systems
260 ldr r0,=mm_achannels // r0 = achannels
262 ldr r1,=mm_num_ach // r1 = #achannels
264 mov r2, #0 // r2 = 0 (for clearing)
267 ldrb r3, [r0, #MCA_FLAGS] // test if layer matches
272 mov r3, #MCA_SIZE-4 // clear achannel data to zero
278 str r5, [r4] // disable mixer channel
282 add r0, #MCA_SIZE // increment stuff and loop
283 add r4, #MIXER_CHN_SIZE //
293 /******************************************************************************
294 * mm_reset_channels()
296 * Reset all channels.
297 ******************************************************************************/
298 .global mm_reset_channels
304 ldr r0,=mm_achannels // clear active channel data
307 ldr r2,=MCA_SIZE*32/4 //
309 1: stmia r0!, {r1} //
313 ldr r0,=mm_pchannels // reset channel allocation
318 1: strb r1, [r0, #MCH_ALLOC] //
323 ldr r0,=mm_schannels // reset channel allocation
326 1: strb r1, [r0, #MCH_ALLOC] //
338 /******************************************************************************
341 * Suspend main module and associated channels.
342 ******************************************************************************/
354 ldrb r3, [r0, #MCA_FLAGS]
358 str r4, [r1, #MIXER_CHN_FREQ]
360 strh r4, [r1, #MIXER_CHN_FREQ]
361 strh r4, [r1, #MIXER_CHN_VOL]
366 add r1, #MIXER_CHN_SIZE
372 /******************************************************************************
376 ******************************************************************************/
378 //-----------------------------------------------------------------------------
380 //-----------------------------------------------------------------------------
382 /******************************************************************************
383 * mmStart( module_ID, mode )
385 * Start module playback.
387 * module_ID : Index of module.
388 * mode : Playback mode.
389 ******************************************************************************/
407 /******************************************************************************
408 * mmJingle( module_ID )
410 * Play module as jingle.
412 * module_ID : Index of module
413 ******************************************************************************/
419 mov r1, #MPP_PLAY_ONCE
422 //-----------------------------------------------------------------------------
424 //-----------------------------------------------------------------------------
426 /******************************************************************************
430 ******************************************************************************/
432 //-----------------------------------------------------------------------------
434 //-----------------------------------------------------------------------------
436 /******************************************************************************
437 * mmStart( module_ID, mode )
439 * Start module playback
441 * module_ID : id of module
442 * mode : mode of playback
443 ******************************************************************************/
451 ldr r2,=mp_solution @ resolve song address
469 /******************************************************************************
470 * mmJingle( module_ID )
472 * Start jingle playback
474 * module_ID : index of module
475 ******************************************************************************/
481 mov r1, #MPP_PLAY_ONCE
484 //-----------------------------------------------------------------------------
486 //-----------------------------------------------------------------------------
488 /******************************************************************************
489 * mmPlayModule( address, mode, layer )
491 * Start playing module.
492 ******************************************************************************/
506 @ldr r6,=mpp_pchannels
509 @mov r7, #MP_MCHANNELS
513 1: ldr r5,=mmLayerSub
515 mov r7, #MP_SCHANNELS
523 str r4, [r5, #MPL_SONGADR]
527 ldrb r3, [r4, #C_MAS_INSTN]
528 ldrb r2, [r4, #C_MAS_SAMPN]
534 add r0, #C_MAS_TABLES-255
536 str r0, [r5, #MPL_INSTTABLE] @ setup instrument table
538 str r0, [r5, #MPL_SAMPTABLE] @ setup sample table
540 str r0, [r5, #MPL_PATTTABLE] @ setup pattern table
542 mov r0, #0 @ set pattern to 0
544 @ldr r1,=mpp_setposition
548 ldrb r0, [r4, #C_MAS_TEMPO] @ load initial tempo
552 ldrb r0, [r4, #C_MAS_GV] @ load initial global volume
555 strb r0, [r5, #MPL_GV]
557 ldrb r0, [r4, #C_MAS_FLAGS] @ read song flags
558 strb r0, [r5, #MPL_FLAGS] @ save
562 strb r0, [r5, #MPL_OLDEFFECTS]
564 ldrb r0, [r4, #C_MAS_SPEED] @ speed
565 strb r0, [r5, #MPL_SPEED] @ and set
567 mov r0, #1 // mpp_playing=true
568 strb r0, [r5, #MPL_ISPLAYING]
570 mov r1, #MPL_VALID // set valid flag
575 @ setup channel volumes
579 add r4, #C_MAS_CHANVOL
602 // pop {r2} @ <-- FIX.2 WHY WAS THIS PRESERVED
610 /******************************************************************************
613 * Pause module playback.
614 ******************************************************************************/
630 strb r0, [r5, #MPL_ISPLAYING]
637 /******************************************************************************
640 * Resume module playback.
641 ******************************************************************************/
653 strb r0, [r1, #MPL_ISPLAYING]
656 /******************************************************************************
659 * Returns true if module is playing.
660 ******************************************************************************/
666 ldrb r0, [r0, #MPL_ISPLAYING]
669 /******************************************************************************
672 * Returns true if a jingle is playing.
673 ******************************************************************************/
679 ldrb r0, [r0, #MPL_ISPLAYING]
682 /******************************************************************************
683 * mmSetModuleVolume( volume )
685 * Set master module volume.
688 ******************************************************************************/
689 .global mmSetModuleVolume
693 @ clamp volume 0->1024
700 1: ldr r1,=mmLayerMain
705 /******************************************************************************
706 * mmSetJingleVolume( volume )
708 * Set master jingle volume.
711 ******************************************************************************/
712 .global mmSetJingleVolume
716 @ clamp volume 0->1024
723 1: ldr r1,=mmLayerSub @mpp_layerB
728 /******************************************************************************
729 * mppStop() [[internal function]]
731 * Stop module playback.
732 ******************************************************************************/
745 mov r7, #MP_SCHANNELS
747 1: ldr r5,=mmLayerMain
748 @ldr r6,=mpp_pchannels
751 @mov r7, #MP_MCHANNELS
757 strb r0, [r5, #MPL_ISPLAYING]
766 /******************************************************************************
769 * Get playback position
770 ******************************************************************************/
771 .global mmGetPosition
776 ldrb r0, [r1, #MPL_POSITION]
779 /******************************************************************************
780 * mmPosition( position )
782 * Set playback position
783 ******************************************************************************/
796 // bl mpp_resetchannels
805 /******************************************************************************
806 * mmSetModuleTempo( tempo )
810 * tempo : x.10 fixed point tempo, 0.5->2.0
811 ******************************************************************************/
812 .global mmSetModuleTempo
818 mov r1, #1 // clamp value: 512->2048
830 ldr r1,=mm_mastertempo
838 ldrb r0, [r5, #MPL_BPM]
847 /******************************************************************************
848 * mmSetModulePitch( pitch )
852 * pitch : x.10 fixed point value, range = 0.5->2.0
853 ******************************************************************************/
854 .global mmSetModulePitch
859 mov r1, #1 // clamp value: 512->2048
871 ldr r1,=mm_masterpitch
880 //-----------------------------------------------------------------------------
882 //-----------------------------------------------------------------------------
884 /******************************************************************************
885 * mmSetResolution( divider )
887 * Set update resolution
888 ******************************************************************************/
889 .global mmSetResolution
895 ldr r1,=mpp_resolution
904 ldrb r0, [r5, #MPL_BPM]
908 1: ldr r5,=mmLayerSub
914 ldrb r0, [r5, #MPL_BPM]
924 /******************************************************************************
927 * Stop module playback.
928 ******************************************************************************/
941 /******************************************************************************
944 * Reset pattern variables
946 ******************************************************************************/
951 strb r0, [r5, #MPL_PATTJUMP]
953 strb r0, [r5, #MPL_PATTJUMP_ROW]
956 /******************************************************************************
959 * Set BPM. bpm = 32..255
961 ******************************************************************************/
965 strb r0, [r5, #MPL_BPM]
974 ldr r1,=mm_mastertempo // multiply by master tempo
979 ldr r0,=mm_bpmdv @ samples per tick ~= mixfreq / (bpm/2.5) ~= mixfreq*2.5/bpm
982 swi SWI_DIVIDE @ SWI 07h, divide r1/r0
983 lsr r0, #1 @ multiple of two
984 lsl r0, #1 @ ---------------
985 mov r1, #MPL_TICKRATE
987 mov r1, #MPL_SAMPCOUNT
992 1: @ SUB LAYER, time using vsync (rate = bpm/2.5 / 59.7)
997 mov r1, #MPL_TICKRATE
1005 @ vsync = ~59.8261 HZ (says GBATEK)
1006 @ divider = hz * 2.5 * 64
1012 ldr r1,=mm_mastertempo // multiply by master tempo
1022 @ using 60hz vsync for timing
1024 ldr r1,=mpp_resolution
1028 mov r1, #MPL_TICKRATE
1036 /******************************************************************************
1037 * mpp_setposition( position )
1039 * Set sequence position.
1041 ******************************************************************************/
1049 strb r0, [r5, #MPL_POSITION]
1051 ldr r1, [r5, #MPL_SONGADR]
1053 add r1, #C_MAS_ORDER @ get sequence entry
1065 @ END OF SONG!!! WOOPHEE!!!!
1068 mov r0, #MPL_MODE @mpp_playmode
1071 cmp r0, #MPP_PLAY_ONCE
1076 1: @ its playing once:
1079 mov r0, #MPCB_SONGFINISHED
1090 ldrb r0, [r5, #MPL_ISPLAYING]
1097 ldr r0, [r5, #MPL_SONGADR] @ set position to 'restart'
1098 ldrb r0, [r0, #C_MAS_REP]
1104 ldr r1, [r5, #MPL_PATTTABLE]
1107 @ r1 = pattern address( in table )
1110 add r1, r3 @ add song address
1112 @ r1 = pattern address
1114 ldrb r2, [r1] @ set pattern size
1115 strb r2, [r5, #MPL_NROWS] @
1117 mov r2, #0 @ reset tick/row
1118 strh r2, [r5, #MPL_TICK]
1119 strb r2, [r5, #MPL_FPATTDELAY]
1120 strb r2, [r5, #MPL_PATTDELAY]
1122 mov r0, #MPL_PATTREAD
1124 str r1, [r5, r0] @ store pattern data address
1126 mov r0, #MPL_PLOOP_ADR @ reset pattern loop
1129 strb r0, [r5, #MPL_PLOOP_ROW]
1130 strb r0, [r5, #MPL_PLOOP_TIMES]
1134 //-----------------------------------------------------------------------------
1136 //-----------------------------------------------------------------------------
1138 /******************************************************************************
1139 * mppUpdateLayer( layer )
1141 * Update module layer
1142 ******************************************************************************/
1149 mov r1, #MPL_TICKRATE
1151 mov r2, #MPL_TICKFRAC
1166 /******************************************************************************
1170 ******************************************************************************/
1177 ldr r0,=mpp_channels // update main layer
1178 ldr r1,=mm_pchannels //
1181 ldr r0,=mpp_nchannels //
1182 ldr r1,=mm_num_mch //
1185 ldr r0,=mpp_clayer //
1189 ldr r0,=mmLayerMain //
1190 bl mppUpdateLayer //
1192 ldr r0,=mpp_channels // update sub layer
1193 ldr r1,=mm_schannels //
1195 ldr r0,=mpp_nchannels //
1196 mov r1, #MP_SCHANNELS //
1198 ldr r0,=mpp_clayer //
1202 ldr r0,=mmLayerSub //
1203 bl mppUpdateLayer //
1207 //-----------------------------------------------------------------------------
1209 //-----------------------------------------------------------------------------
1211 //-----------------------------------------------------------------------------
1213 //-----------------------------------------------------------------------------
1215 /******************************************************************************
1218 * Update sub-module/jingle, this is bad for some reason...
1219 ******************************************************************************/
1220 .global mppUpdateSub
1225 ldrb r0, [r0, #MPL_ISPLAYING]
1231 ldr r0,=mpp_channels
1232 ldr r1,=mm_schannels
1234 ldr r0,=mpp_nchannels
1235 mov r1, #MP_SCHANNELS
1246 mov r1, #MPL_TICKRATE
1248 mov r2, #MPL_TICKFRAC
1256 ldr r1,=mppProcessTick
1263 //-----------------------------------------------------------------------------
1265 //-----------------------------------------------------------------------------
1269 //-----------------------------------------------------------------------------
1271 //-----------------------------------------------------------------------------
1273 .SECTION ".iwram", "ax", %progbits
1276 //-----------------------------------------------------------------------------
1278 /******************************************************************************
1281 * Process module tick.
1282 ******************************************************************************/
1283 .global mppProcessTick @@@@@@@@@@@@@@@@@@
1284 .thumb_func @@@@ @@@ @@
1286 mppProcessTick: @@ @@@ @ @@
1290 add r0,pc,#0 // switch to ARM to preserve regs
1294 stmfd sp!, {r4-r10} //
1296 add r0,pc,#1 // switch back to THUMB
1300 ldr r0,=mpp_layerp // test if module is playing
1303 ldrb r1, [r0, #MPL_ISPLAYING] //
1306 ldr r1,=.mppt_exit //
1310 @---------------------------------------------------
1312 @---------------------------------------------------
1314 ldrb r1, [r0, #MPL_PATTDELAY]
1316 bne .mpp_pt_skippatternread
1317 ldrb r0, [r0, #MPL_TICK]
1319 bne .mpp_pt_skippatternread
1322 fjump2 mmReadPattern
1323 //bl mpp_ReadPattern
1326 @-----------------------------------------
1327 .mpp_pt_skippatternread:
1330 mov r4, #MPL_MCH_UPDATE
1333 @---------------------------------------------------
1334 @ loop through module channels
1335 @---------------------------------------------------
1337 ldr r7,=mpp_channels
1340 mov r10, r0 @ use r10 as channel counter
1342 ldrb r0, [r0, #MPL_TICK]
1344 bne pchannel_loop_other
1346 @---------------------------------------------------
1347 pchannel_loop_first:
1348 @---------------------------------------------------
1351 fjump2 mmUpdateChannel_T0
1357 bne pchannel_loop_first
1358 b pchannel_loop_finished
1360 @---------------------------------------------------
1361 pchannel_loop_other:
1362 @---------------------------------------------------
1366 bl mpp_Update_Channel
1368 fjump2 mmUpdateChannel_TN
1376 bne pchannel_loop_other
1378 pchannel_loop_finished:
1380 @---------------------------------------------------
1381 @ loop through active channels
1382 @---------------------------------------------------
1384 ldr r6,=mm_achannels
1386 @ldr r6,=mpp_achannels
1389 @---------------------------------------------------
1391 @---------------------------------------------------
1393 ldrb r0, [r6, #MCA_TYPE]
1394 cmp r0, #ACHN_DISABLED
1395 beq .mpp_pt_achn_disabled
1398 ldrb r1, [r6, #MCA_FLAGS]
1401 bne .mpp_pt_achn_next
1404 ldrb r0, [r6, #MCA_VOLUME]
1405 strb r0, [r1, #MPV_AFVOL]
1407 strh r0, [r1, #MPV_PANPLUS]
1409 ldr r5, [r6, #MCA_PERIOD]
1415 @---------------------------------------------------
1416 .mpp_pt_achn_disabled:
1418 @ bl mp_Mixer_StopChannel
1420 @---------------------------------------------------
1422 @---------------------------------------------------
1424 ldrb r0, [r6, #MCA_FLAGS]
1425 mov r1, #MCAF_UPDATED
1427 strb r0, [r6, #MCA_FLAGS]
1434 @ cmp r4, #MP_NCHANNELS
1435 bne .mpp_pt_achn_loop
1436 @---------------------------------------------------
1441 ldr r1,=mppProcessTick_incframe
1446 //-----------------------------------------------------------------------------
1448 //-----------------------------------------------------------------------------
1452 //-----------------------------------------------------------------------------
1454 /******************************************************************************
1455 * mppProcessTick_incframe [[internal]]
1456 ******************************************************************************/
1458 mppProcessTick_incframe:
1460 @---------------------------------------------------
1461 @ update tick/row/position
1462 @---------------------------------------------------
1464 mov r5, r8 @ get tick#
1465 ldrb r1, [r5, #MPL_TICK] @ ..
1466 add r1, #1 @ increment
1468 ldrb r2, [r5, #MPL_SPEED] @ compare with speed
1470 blt .mppt_continuerow @ if less than, continue this row
1472 ldrb r2, [r5, #MPL_FPATTDELAY]
1476 strb r2, [r5, #MPL_FPATTDELAY]
1480 mov r1, #0 @ .. otherwise clear tick count
1481 b .mppt_nextrow @ and advance to next row
1483 .mppt_continuerow: @ continue current row:
1484 strb r1, [r5, #MPL_TICK] @ save tick#
1487 .mppt_nextrow: @ advance row
1489 ldrb r2, [r5, #MPL_PATTDELAY]
1493 strb r2, [r5, #MPL_PATTDELAY]
1498 strb r1, [r5, #MPL_TICK] @ save tick# (0)
1499 ldrb r1, [r5, #MPL_PATTJUMP]
1504 strb r2, [r5, #MPL_PATTJUMP]
1508 ldrb r1, [r5, #MPL_PATTJUMP_ROW]
1510 beq .mppt_pj_no_offset
1512 strb r2, [r5, #MPL_PATTJUMP_ROW]
1520 mov r3, #MPL_PLOOP_JUMP
1526 ldrb r1, [r5, #MPL_PLOOP_ROW]
1527 strb r1, [r5, #MPL_ROW]
1528 mov r3, #MPL_PLOOP_ADR
1531 mov r3, #MPL_PATTREAD
1535 ldrb r1, [r5, #MPL_ROW] @ ..
1536 add r1, #1 @ increment
1537 ldrb r2, [r5, #MPL_NROWS] @
1539 cmp r1, r2 @ check with #rows for pattern
1540 bne .mppt_continuepattern @ if !=, then continue playing this pattern
1542 .mppt_nextposition: @ advance position
1544 ldrb r0, [r5, #MPL_POSITION] @ increment position
1550 .mppt_continuepattern:
1552 strb r1, [r5, #MPL_ROW] @ save row count
1571 //-----------------------------------------------------------------------------
1573 //-----------------------------------------------------------------------------
1575 .SECTION ".iwram", "ax", %progbits
1578 //-----------------------------------------------------------------------------
1580 /******************************************************************************
1581 * mpp_Channel_NewNote()
1584 * Input r7 = pchannel address
1585 ******************************************************************************/
1586 .global mpp_Channel_NewNote
1588 mpp_Channel_NewNote:
1590 @ r7 = pchannel address
1593 ldrb r0, [r7, #MCH_INST] @ get instrument#
1597 bl mpp_Channel_GetACHN
1599 beq .mppt_alloc_channel
1601 ldrb r0, [r7, #MCH_INST] @ get instrument#
1604 mpp_InstrumentPointer
1606 ldrb r1, [r7, #MCH_BFLAGS] @ fetch NNA
1609 beq .mppt_NNA_CUT @ skip if zero
1611 ldrb r1, [r0, #C_MASI_DCT] @ otherwise check duplicate check type
1614 lsl r1, #1 @ jump to mppt_DCT_TABLE[dct]
1623 .mppt_DCT_NOTE: @ DCT note ---------------------
1624 ldrb r1, [r7, #MCH_PNOTE] @ get pattern note
1625 lsl r1, #1 @ translate to real note
1626 add r1, #C_MASI_MAP @ with note/sample map
1627 ldrb r1, [r0, r1] @ r1 = real note
1628 ldrb r2, [r7, #MCH_NOTE] @ compare with last note
1630 beq .mppt_DCA @ equal? perform DCA
1631 b .mppt_DCNA @ otherwise skip
1633 .mppt_DCT_SAMP: @ DCT sample -------------------
1635 // **WARNING: code not functional with new instrument table
1636 ldrb r1, [r7, #MCH_PNOTE] @ get pattern note
1637 lsl r1, #1 @ translate to sample#
1638 add r1, #C_MASI_MAP+1 @ with note/sample map
1639 ldrb r1, [r0, r1] @ r1 = sample#
1640 ldrb r2, [r6, #MCA_SAMPLE] @ compare with achn's sample
1642 beq .mppt_DCA @ equal? perform DCA
1643 b .mppt_DCNA @ otherwise skip
1645 .mppt_DCT_INST: @ DCT instrument ---------------
1646 ldrb r1, [r7, #MCH_INST] @ load instrument
1647 ldrb r2, [r6, #MCA_INST] @ compare with active inst
1649 bne .mppt_DCNA @ not equal? skip DCA
1651 .mppt_DCA: @ DUPLICATE CHECK ACTION -------
1652 ldrb r1, [r0, #C_MASI_DCA] @ read type
1653 cmp r1, #IT_DCA_CUT @ cut?
1654 beq .mppt_NNA_CUT @ branch
1655 cmp r1, #IT_DCA_OFF @ note-off?
1656 beq .mppt_NNA_OFF @ branch
1657 b .mppt_NNA_FADE @ note-fade otherwise
1661 ldrb r1, [r7, #MCH_BFLAGS]
1662 lsr r1, #6 @ get NNA
1663 lsl r1, #1 @ and jump to
1664 add r1, pc @ NNA_TABLE[NNA]
1668 b .mppt_NNA_CONTINUE
1672 @---------------------------------------------------------------------------------
1674 @---------------------------------------------------------------------------------
1676 #ifdef SYS_NDS // nds supports volume ramping
1678 ldrb r1, [r6, #MCA_TYPE]
1680 BEQ .mppt_samechannel
1681 mov r1, #ACHN_BACKGROUND
1682 strb r1, [r6, #MCA_TYPE]
1684 strb r1, [r6, #MCA_VOLUME]
1685 b .mppt_NNA_FINISHED
1691 @---------------------------------------------------------------------------------
1693 @---------------------------------------------------------------------------------
1695 mov r1, #ACHN_BACKGROUND @ use different channel
1696 strb r1, [r6, #MCA_TYPE] @ set active channel to "background"
1697 b .mppt_NNA_FINISHED @ finished
1699 @---------------------------------------------------------------------------------
1701 @---------------------------------------------------------------------------------
1703 ldrb r1, [r6, #MCA_FLAGS] @ clear KEYON in flags byte
1707 strb r1, [r6, #MCA_FLAGS]
1708 mov r1, #ACHN_BACKGROUND @ set type to "background"
1709 strb r1, [r6, #MCA_TYPE]
1710 b .mppt_NNA_FINISHED @ finished
1712 @---------------------------------------------------------------------------------
1714 @---------------------------------------------------------------------------------
1716 ldrb r1, [r6, #MCA_FLAGS] @ set NOTE FADE in flags byte
1719 strb r1, [r6, #MCA_FLAGS]
1720 mov r1, #ACHN_BACKGROUND @ set type to "background"
1721 strb r1, [r6, #MCA_TYPE] @
1725 .mppt_alloc_channel:
1729 ldr r1,=mmAllocChannel
1730 jump1 @ find new active channel
1731 strb r0, [r7, #MCH_ALLOC] @ save number
1736 beq .mppt_samechannel
1738 mov r1, #MCA_SIZE @ copy data from previous channel
1739 mul r0, r1 @ (for volume ramping wierdness)
1740 ldr r1,=mm_achannels @
1750 /* ldr r1, [r4, #MCA_FADE] @
1751 str r1, [r0, #MCA_FADE] @
1752 ldr r1, [r4, #MCA_ENVC_PAN] @
1753 str r1, [r0, #MCA_ENVC_PAN] @
1754 ldr r1, [r4, #MCA_AVIB_DEP] @
1755 str r1, [r0, #MCA_AVIB_DEP] @
1756 ldrb r1, [r4, #MCA_FLAGS] @
1757 strb r1, [r0, #MCA_FLAGS] @
1758 ldrb r1, [r4, #MCA_VOLUME]
1759 strb r1, [r0, #MCA_VOLUME]
1760 ldrb r1, [r4, #MCA_PANNING]
1761 strb r1, [r0, #MCA_PANNING]
1762 ldrb r1, [r4, #MCA_SAMPLE]
1763 strb r1, [r0, #MCA_SAMPLE]
1764 ldrb r1, [r4, #MCA_INST]
1765 strb r1, [r0, #MCA_INST]*/
1780 @------------------------------------------------------------------------------------------------------
1781 mpp_Channel_GetACHN:
1782 @------------------------------------------------------------------------------------------------------
1784 @ gets the active channel pointer
1788 ldrb r0, [r7, #MCH_ALLOC]
1791 ldr r6,=mm_achannels
1804 @----------------------------------------------------------------------------------------------------
1806 @----------------------------------------------------------------------------------------------------
1808 @ r5 = affected period
1809 @ r6 = achannel address
1811 push {lr} @ enter subroutine
1813 @ check updated flag & exit if already updated
1815 ldrb r0, [r6, #MCA_FLAGS]
1816 mov r1, #MCAF_UPDATED
1818 beq .mpp_achn_update
1821 @--------------------------------------------
1823 .global mpp_Update_ACHN_notest
1825 @----------------------------------------------------------------------------------------------------
1826 mpp_Update_ACHN_notest:
1827 @----------------------------------------------------------------------------------------------------
1832 @------------------------------------------------------------------------
1833 @ Envelope Processing
1834 @------------------------------------------------------------------------
1836 ldrb r0, [r6, #MCA_INST]
1840 1: mpp_InstrumentPointer
1842 @ get envelope flags
1845 ldrb r2, [r1, #C_MASI_ENVFLAGS]
1846 add r1, #C_MASI_ENVELOPES
1848 lsr r2, #1 @ shift out volume envelope bit
1851 ldrb r3, [r6, #MCA_FLAGS]
1854 bcs .mppt_achn_ve_enabled
1858 .mppt_achn_ve_enabled:
1862 ldrh r0, [r6, #MCA_ENVC_VOL]
1864 ldrb r1, [r6, #MCA_ENVN_VOL]
1865 bl mpph_ProcessEnvelope
1866 strb r1, [r6, #MCA_ENVN_VOL]
1867 strh r0, [r6, #MCA_ENVC_VOL]
1871 bne .mpph_volenv_notend
1872 ldrb r0, [r6, #MCA_FLAGS]
1874 mov r3, r8 @ stupid xm doesn't fade out at envelope end
1875 ldrb r3, [r3, #MPL_FLAGS]
1878 mov r3, #MCAF_ENVEND
1880 mov r3, #MCAF_ENVEND+MCAF_FADE
1883 strb r0, [r6, #MCA_FLAGS]
1884 .mpph_volenv_notend:
1887 blt .mpph_volenv_normal
1889 @ check keyon and turn on fade...
1890 ldrb r0, [r6, #MCA_FLAGS]
1893 bne .mpph_volenv_normal
1894 .mpph_volenv_notefade:
1897 strb r0, [r6, #MCA_FLAGS]
1899 .mpph_volenv_normal:
1902 ldrb r2, [r0, #MPV_AFVOL]
1905 strb r2, [r0, #MPV_AFVOL]
1912 ldrb r0, [r6, #MCA_FLAGS]
1913 mov r3, #MCAF_ENVEND
1917 bne .mppt_has_volenv
1920 strb r0, [r6, #MCA_FLAGS]
1922 mov r0, r8 @ check XM MODE and cut note
1923 ldrb r0, [r0, #MPL_FLAGS]
1925 bcc .mppt_has_volenv
1927 strh r0, [r6, #MCA_FADE]
1933 ldrh r0, [r6, #MCA_ENVC_PAN]
1935 ldrb r1, [r6, #MCA_ENVN_PAN]
1936 bl mpph_ProcessEnvelope
1937 strb r1, [r6, #MCA_ENVN_PAN]
1938 strh r0, [r6, #MCA_ENVC_PAN]
1942 mov r3, #MPV_PANPLUS
1952 bcc .mppt_no_pitchenv
1953 ldrb r0, [r1, #C_MASIE_FILTER]
1955 bne .mppt_no_pitchenv
1957 ldrh r0, [r6, #MCA_ENVC_PIC]
1959 ldrb r1, [r6, #MCA_ENVN_PIC]
1960 bl mpph_ProcessEnvelope
1961 strb r1, [r6, #MCA_ENVN_PIC]
1962 strh r0, [r6, #MCA_ENVC_PIC]
1968 bmi .mppt_pitchenv_minus
1970 ldr r2,=mpph_LinearPitchSlide_Up
1973 bl mpph_LinearPitchSlide_Up
1975 b .mppt_pitchenv_plus
1976 .mppt_pitchenv_minus:
1979 ldr r2,=mpph_LinearPitchSlide_Down
1982 bl mpph_LinearPitchSlide_Down
1984 .mppt_pitchenv_plus:
1989 ldrb r0, [r6, #MCA_FLAGS]
1992 beq .mppt_achn_nofade
1993 ldrb r0, [r6, #MCA_INST]
1996 mpp_InstrumentPointer
1997 ldrb r0, [r0, #C_MASI_FADE]
1999 ldrh r1, [r6, #MCA_FADE]
2002 bcs .mppt_achn_fadeout_clip
2004 .mppt_achn_fadeout_clip:
2005 strh r1, [r6, #MCA_FADE]
2012 @----------------------------------------------------------------------------------
2013 @ *** PROCESS AUTO VIBRATO
2014 @----------------------------------------------------------------------------------
2016 ldrb r0, [r6, #MCA_SAMPLE]
2018 bcc .mppt_achn_nostart @ no sample!!
2020 @bl mpp_SamplePointer
2022 ldrh r1, [r0, #C_MASS_VIR] @ get av-rate
2024 beq .mppt_av_disabled @ if 0 then its disabled
2025 ldrh r2, [r6, #MCA_AVIB_DEP] @ get depth counter
2026 add r2, r1 @ add rate
2027 lsr r1, r2, #15 @ check for 15-bit overflow
2028 beq .mppt_av_depclip @ ..
2030 ldr r2,=32768 @ and clamp to 32768
2032 strh r2, [r6, #MCA_AVIB_DEP] @ save depth counter
2033 ldrb r1, [r0, #C_MASS_VID] @ get av-depth
2034 mul r1, r2 @ multiply
2036 ldrb r3, [r6, #MCA_AVIB_POS] @ get table position
2037 ldrb r2, [r0, #C_MASS_VIS] @ get av-speed
2038 add r3, r2 @ add to position
2039 lsl r3, #32-8 @ wrap position to 0->255
2041 strb r3, [r6, #MCA_AVIB_POS] @ save position
2042 ldr r2,=mpp_TABLE_FineSineData @ get table pointer
2043 ldrsb r2, [r2, r3] @ load table value at position
2044 mul r2, r1 @ multiply with depth
2045 asr r2, #23 @ shift value
2046 bmi .mppt_av_minus @ and perform slide...
2047 .mppt_av_plus: @ --slide up
2048 mov r1, r2 @ r1 = slide value
2049 mov r0, r5 @ r0 = frequency
2051 fjump2 mpph_PitchSlide_Up
2053 bl mpph_PitchSlide_Up @ pitch slide
2055 b .mppt_av_finished @
2056 .mppt_av_minus: @ --slide down
2057 neg r1, r2 @ r1 = slide value
2058 mov r0, r5 @ r0 = frequency
2060 ldr r2,=mpph_PitchSlide_Down
2063 bl mpph_PitchSlide_Down @ pitch slide
2067 mov r5, r0 @ affect frequency
2070 @---------------------------------------------------------------------------------
2075 mov r0, #MIXER_CHN_SIZE
2077 @ldr r0,=mp_channels
2078 @ ldr r0,=mm_mixchannels
2083 @ *** UPDATE MIXING INFORMATION
2085 ldrb r0, [r6, #MCA_FLAGS] @ read flags
2086 mov r1, #MCAF_START @ test start bit
2088 beq .mppt_achn_nostart @
2089 .mppt_achn_start: @ START NOTE
2090 bic r0, r1 @ clear bit
2091 strb r0, [r6, #MCA_FLAGS] @ save flags
2092 ldrb r0, [r6, #MCA_SAMPLE] @ get sample #
2095 bcc .mppt_achn_nostart @ quit if invalid
2096 @bl mpp_SamplePointer @ get sample address
2099 ldrh r3, [r0, #C_MASS_MSLID]
2101 add r1,r3,#1 @ msl id == 0xFFFF?
2104 bcc .mppt_achn_msl_sample
2106 .mppt_achn_direct_sample: @ then sample follows
2110 //------------------------------------------------
2112 // ldr r1, [r0,#C_SAMPLE_LEN] @ setup mixer (GBA)
2113 // lsl r1, #MP_SAMPFRAC
2114 // str r1, [r4,#MIXER_CHN_LEN]
2115 // ldr r1, [r0,#C_SAMPLE_LOOP]
2116 // str r1, [r4,#MIXER_CHN_LOOP]
2117 add r0, #C_SAMPLE_DATA
2118 str r0, [r4,#MIXER_CHN_SRC]
2121 //-------------------------------------------
2125 str r0, [r4, #MIXER_CHN_SAMP]
2126 ldrb r1, [r4, #MIXER_CHN_CNT]
2127 mov r0, #MIXER_CF_START
2129 strb r1, [r4, #MIXER_CHN_CNT]
2132 //-------------------
2134 b .mppt_achn_gotsample
2135 .mppt_achn_msl_sample: @ otherwise get from solution
2148 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ NOTICE, USE LDM HERE
2150 // ldr r1, [r0,#C_SAMPLE_LEN] @ setup mixer (GBA)
2151 // lsl r1, #MP_SAMPFRAC
2152 // str r1, [r4,#MIXER_CHN_LEN]
2153 // ldr r1, [r0,#C_SAMPLE_LOOP]
2154 // str r1, [r4,#MIXER_CHN_LOOP]
2155 add r0, #C_SAMPLE_DATA
2156 str r0, [r4,#MIXER_CHN_SRC]
2162 ldr r2,=mmSampleBank @ get samplebank pointer
2164 lsl r3, #2 @ add msl_id *4
2167 lsl r1, #8 @ mask out counter value
2171 str r1, [r4,#MIXER_CHN_SAMP]
2172 ldrb r1, [r4,#MIXER_CHN_CNT] // read control **CNT was cleared, no need to read it
2173 mov r0, #MIXER_CF_START // set start bit
2175 strb r1, [r4,#MIXER_CHN_CNT] // save control
2179 .mppt_achn_gotsample:
2181 ldrb r1, [r1, #MPV_SAMPOFF]
2183 lsl r1, #MP_SAMPFRAC+8
2184 str r1, [r4, #MIXER_CHN_READ]
2186 str r1, [r4, #MIXER_CHN_READ]
2192 ldrb r0, [r6, #MCA_SAMPLE] @ get sample#
2194 bcc .mppt_achn_setvolumeA
2195 @bl mpp_SamplePointer @ quit if invalid
2200 ldrb r1, [r1, #MPL_FLAGS]
2202 bcc .mppt_achn_amigafreqs
2203 .mppt_achn_linearfreqs:
2205 ldrh r0, [r0, #C_MASS_FREQ] @ get C5SPEED
2207 lsr r1, r5, #8 @ do some stuff...
2208 mul r1, r0 @ ... period * freq?
2216 ldr r0,=mm_masterpitch
2225 // ldr r0,=mm_freqscalar
2227 ldr r0,=(4096*65536)/15768
2230 str r0, [r4, #MIXER_CHN_FREQ]
2237 strh r0, [r4, #MIXER_CHN_FREQ]
2239 //strh r1, [r4, #MIXER_CHN_FREQ]
2242 b .mppt_achn_setvolume
2244 .mppt_achn_amigafreqs:
2245 ldr r0,=MOD_FREQ_DIVIDER_PAL
2248 beq .mppt_achn_setvolume @ 0 is a bad period
2255 ldr r1,=mm_masterpitch
2263 // ldr r1,=mm_freqscalar
2265 ldr r1,=(4096*65536)/15768
2269 str r0, [r4, #MIXER_CHN_FREQ]
2272 // ldr r0,=16756991 @ calculate ds mixer timing
2279 strh r0, [r4, #MIXER_CHN_FREQ]
2282 @----------------------------------------------------------------------------------------------------
2283 .mppt_achn_setvolume:
2284 @----------------------------------------------------------------------------------------------------
2289 @ <-- stepped oct 28, 3:27pm
2290 ldrb r3, [r0, #C_MASS_GV] @ SV, 6-bit
2291 ldrb r0, [r6, #MCA_INST]
2296 .mppt_achn_setvolumeA:
2298 b .mppt_achn_badinstrument
2300 mpp_InstrumentPointer
2301 ldrb r0, [r0, #C_MASI_GVOL] @ IV, 7-bit
2305 ldrb r0, [r1, #MPV_AFVOL] @ ((CV*VOL)/32*VEV/64) 7-bit
2309 mov r1, r8 @ get global vollume
2310 ldrb r0, [r1, #MPL_FLAGS]
2312 ldrb r0, [r1, #MPL_GV] @ .. 7-bit
2315 lsl r0, #1 @ xm mode global volume is only 0->64, shift to 0->128
2317 1: mul r3, r0 @ multiply
2321 ldrh r0, [r6, #MCA_FADE]
2333 //------------------------------------------------
2335 lsr r1, r3, #19-3-5 ///#19-3 (new 16-bit levels!)
2336 ldr r3,=65535 //2047
2337 cmp r1, r3 @ clip values over 255
2341 .mppt_achn_badinstrument:
2342 // lsr r3, r1, #3 (new 16-bit levels!)
2344 strb r3, [r6, #MCA_FVOL]
2349 cmp r1, #255 @ clip values over 255
2353 .mppt_achn_badinstrument:
2354 strb r1, [r6, #MCA_FVOL]
2359 bne .mppt_achn_audible
2361 #ifdef SYS_NDS // nds has volume ramping!
2363 ldrb r3, [r6, #MCA_TYPE]
2364 cmp r3, #ACHN_BACKGROUND
2366 ldrb r3, [r6, #MCA_VOLUME]
2369 ldrh r3, [r4, #MIXER_CHN_CVOL]
2371 beq .mppt_achn_not_audible
2374 1: ldrb r3, [r6, #MCA_FLAGS]
2375 mov r2, #MCAF_ENVEND
2377 beq .mppt_achn_audible
2380 bne .mppt_achn_audible
2383 // ldrh r3, [r4, #MIXER_CHN_CVOL] // nds has volume ramping!!
2385 // bne .mppt_achn_audible
2388 .mppt_achn_not_audible:
2393 str r0,[r4,#MIXER_CHN_SRC] @ stop mixer channel
2396 str r0,[r4,#MIXER_CHN_SAMP] @ stop mixer channel
2399 ldrb r3, [r6, #MCA_TYPE]
2400 cmp r3, #ACHN_FOREGROUND
2401 bne .mpp_achn_noparent
2402 ldrb r1, [r6, #MCA_PARENT]
2405 ldr r0,=mpp_channels
2409 strb r1, [r0, #MCH_ALLOC]
2412 mov r1, #ACHN_DISABLED
2413 strb r1, [r6, #MCA_TYPE]
2419 strh r1, [r4, #MIXER_CHN_VOL]
2423 strb r1, [r4, #MIXER_CHN_VOL]
2427 #ifdef SYS_GBA // check if mixer channel has ended
2429 ldr r0, [r4, #MIXER_CHN_SRC]
2435 ldr r0, [r4, #MIXER_CHN_SAMP]
2441 ldrb r3, [r6, #MCA_TYPE]
2442 cmp r3, #ACHN_FOREGROUND
2445 ldrb r1, [r6, #MCA_PARENT] // stop channel if channel ended
2448 ldr r0,=mpp_channels
2452 strb r1, [r0, #MCH_ALLOC]
2457 str r0,[r4,#MIXER_CHN_SRC] @ stop mixer channel
2460 str r0,[r4,#MIXER_CHN_SAMP] @ stop mixer channel
2463 mov r1, #ACHN_DISABLED
2464 strb r1, [r6, #MCA_TYPE]
2469 mov r3, #MPV_PANPLUS
2471 ldrb r1, [r6, #MCA_PANNING]
2476 bge .mpp_achn_clippan1
2480 ble .mpp_achn_clippan2
2486 ldrb r0, [r4, #MIXER_CHN_CNT]
2490 strb r0, [r4, #MIXER_CHN_CNT]
2494 strb r1, [r4, #MIXER_CHN_PAN]
2507 @-------------------------------------------------------------------------
2508 mpph_ProcessEnvelope: @ params={count,node,address}
2509 @-------------------------------------------------------------------------
2511 @ processes the envelope at <address>
2522 add r4, #C_MASIE_NODES
2529 @ check for zero count
2532 bne .mpph_pe_between
2535 @ process envelope loop
2537 ldrb r5, [r2, #C_MASIE_LEND]
2540 ldrb r1, [r2, #C_MASIE_LSTART]
2544 @ process envelope sustain loop
2546 1: ldrb r5, [r6, #MCA_FLAGS]
2549 ldrb r5, [r2, #C_MASIE_SEND]
2552 ldrb r1, [r2, #C_MASIE_SSTART]
2558 1: ldrb r5, [r2, #C_MASIE_NODEC]
2568 @ formula : y = base*2^6 + -----------------
2578 @ increment count and check if == read count
2586 @ increment node and reset counter
2600 @--------------------------------------------------------------------------------------------
2602 @--------------------------------------------------------------------------------------------
2604 @ find a channel to use
2605 @ returns invalid channel if none available
2606 push {r4,r5} @ preserve reg(s)
2610 @ldr r1,=mpp_achannels @ load pointer
2611 ldr r1,=mm_achannels
2613 mov r0, #0 @ load counter
2614 mov r2, #255 @ r2 = MAXVOL+1 (highest)
2616 mov r3, #255 @ r3 = 255 (none found)
2620 add r1, #MCA_SIZE @ change pointer
2627 mov r0, r3 @ if no disabled channels are found, use lowest volume channel
2634 ldrb r4, [r1, #MCA_TYPE] @ check active channel type
2635 cmp r4, #ACHN_DISABLED @ disabled?
2636 beq .mppac_found @ if so, use this channel
2637 cmp r4, #ACHN_BACKGROUND @ check if its a background channel
2640 ldrb r4, [r1, #MCA_FVOL] @ compare volumes
2643 mov r3, r0 @ save channel#
2644 mov r2, r4 @ and volume
2650 @........................................................................................
2655 ldr r2,[r1,#MPL_SONGADR]
2656 ldr r1,[r1,#MPL_PATTTABLE]
2670 @ r0 = IT/S3M PERIOD
2673 ldrb r1, [r1, #MPL_FLAGS]
2679 ldr r0,=note_table_mod
2688 ldr r3,=ST3_FREQTABLE
2704 ldr r1,=IT_PitchTable
2712 @=============================================================================
2714 @=============================================================================
2718 mpp_effect_memmap_xm:
2719 .byte 0,0,0,0,2,3,4,0,0,5,0,6,7,0,0,8,9,10,11,0,0,0,0,12,0,0,0,0,0,0,13
2720 @ /,A,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P,Q, R, S,T,U,V,W, X,Y,Z,0,1,2,3
2722 .equ MPP_XM_VFX_MEM_VS, 12 @ $ud
2723 .equ MPP_XM_VFX_MEM_FVS, 13 @ $ud
2724 .equ MPP_XM_VFX_MEM_GLIS, 14 @ $0x
2725 .equ MPP_XM_VFX_MEM_PANSL, 7 @ $lr
2727 mpp_effect_memmap_it:
2728 .byte 0,0,0,0,2,3,3,0,0,4,5,2,2,0,6,7,8,9,10,11,12,0,0,13,0,14,0
2729 @ /,A,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P,Q,R, S, T, U,V,W, X,Y, Z
2730 mpp_veffect_memmap_it:
2732 .equ MPP_IT_VFX_MEM, 14
2733 .equ MPP_GLIS_MEM, 0
2734 .equ MPP_IT_PORTAMEM, 2
2737 @ 0 means custom behavior, or disabled
2741 @-----------------------------------------------------------------------------
2742 mpp_Channel_ExchangeMemory:
2743 @-----------------------------------------------------------------------------
2748 @ check flags for XM mode
2751 ldrb r2, [r2, #MPL_FLAGS]
2757 ldr r2,=mpp_effect_memmap_it
2763 ldr r2,=mpp_effect_memmap_xm
2764 2: ldrb r2, [r2, r0]
2768 @ if param=0 then load memory value, otherwise save param to memory
2774 strb r1, [r7, #MCH_PARAM]
2775 1: strb r1, [r7, r2]
2779 @----------------------------------------------------------
2780 mpp_Channel_ExchangeGxx:
2781 @----------------------------------------------------------
2787 /******************************************************************************
2791 ******************************************************************************/
2795 /******************************************************************************
2796 * mpp_Process_VolumeCommand()
2798 * Process volume command
2799 ******************************************************************************/
2800 .global mpp_Process_VolumeCommand
2802 mpp_Process_VolumeCommand:
2805 ldrb r2, [r0, #MPL_TICK]
2806 ldr r0, [r0, #MPL_SONGADR]
2807 ldrb r0, [r0, #C_MAS_FLAGS]
2809 ldrb r0, [r7, #MCH_VOLCMD]
2814 @ determine which command to use
2827 ble .mppuv_glissando
2834 @-----------------------------------------------------------------------------------
2835 .mppuv_setvol: @ SET VOLUME
2836 @-----------------------------------------------------------------------------------
2838 @ sets volume on tick0
2841 bne .mppuv_setvol_exit
2842 strb r0, [r7, #MCH_VOLUME]
2847 @-----------------------------------------------------------------------------------
2848 .mppuv_fvol: @ FINE VOLUME SLIDE UP/DOWN
2849 @-----------------------------------------------------------------------------------
2851 cmp r2, #0 @ only slide on tick0
2852 bne .mppuv_exit1 @ ..
2853 ldrb r1, [r7, #MCH_VOLUME] @ load channel volume
2854 mov r2, #MCH_MEMORY+MPP_IT_VFX_MEM
2855 cmp r0, #75 @ check slide direction
2856 bge .mppuv_fvoldown @ jump to slide down if value is 75+ (75-84 is slide down)
2857 .mppuv_fvolup: @ ------ slide up ----------
2858 sub r0, #65 @ 65->74 , 0->9
2859 .mppuv_volup: @ ** entry for volume slide up
2860 bne 1f @ is value 0?
2861 ldrb r0, [r7, r2] @ then fetch value from memory
2862 1: strb r0, [r7, r2] @ save value
2864 add r1, r0 @ add to volume
2865 cmp r1, #64 @ clamp to 0->64
2866 blt .mppuv_fvol_exit @ ..
2868 b .mppuv_fvol_exit @ ..
2869 .mppuv_fvoldown: @ ------ slide down --------
2870 sub r0, #75 @ 75->84 , 0->9
2871 .mppuv_voldown: @ ** entry for volume slide down
2872 bne 1f @ is value 0?
2873 ldrb r0, [r7, r2] @ then fetch value from memory
2874 1: strb r0, [r7, r2] @ save value
2876 sub r1, r0 @ subtract from volume
2877 bcs .mppuv_fvol_exit @ check overflow and clamp
2879 .mppuv_fvol_exit: @ ..
2880 strb r1, [r7, #MCH_VOLUME] @ store volume
2882 bx lr @ exit function
2885 @----------------------------------------------------------------------------------
2886 .mppuv_volslide: @ VOLUME SLIDE UP/DOWN
2887 @----------------------------------------------------------------------------------
2889 cmp r2, #0 @ only slide on other ticks
2890 beq .mppuv_exit1 @ ..
2891 ldrb r1, [r7, #MCH_VOLUME] @ get volume
2892 cmp r0, #95 @ check slide direction
2894 .mppuv_vs_up: @ slide up...
2895 mov r2, #MCH_MEMORY+MPP_IT_VFX_MEM
2896 sub r0, #85 @ 85->94 , 0->9
2897 b .mppuv_volup @ branch to function (use fvol code)
2899 .mppuv_vs_down: @ slide down...
2900 mov r2, #MCH_MEMORY+MPP_IT_VFX_MEM
2901 sub r0, #95 @ 95->104 , 0->9
2902 b .mppuv_voldown @ branch to function (use fvol code)
2905 @---------------------------------------------------------------------------------------
2906 .mppuv_porta: @ PORTAMENTO UP/DOWN
2907 @---------------------------------------------------------------------------------------
2909 cmp r2, #0 @ only slide on other ticks
2912 push {lr} @ save return address
2913 mov r1, r0 @ get period value
2917 cmp r1, #115 @ check slide direction
2920 sub r1, #105 @ map value 0->9
2921 lsl r1, #2 @ volume command slides are
2923 ldrb r1, [r7, #MCH_MEMORY+MPP_IT_PORTAMEM]
2924 1: strb r1, [r7, #MCH_MEMORY+MPP_IT_PORTAMEM]
2925 bl mpph_PitchSlide_Down @ equal to normal slides *4
2929 sub r1, #115 @ slide up...
2932 ldrb r1, [r7, #MCH_MEMORY+MPP_IT_PORTAMEM]
2933 1: strb r1, [r7, #MCH_MEMORY+MPP_IT_PORTAMEM]
2934 bl mpph_PitchSlide_Up
2937 mov r2, #MCH_PERIOD @ store new period
2940 sub r0, r1 @ and edit temp period
2948 @---------------------------------------------------------------------------------------
2949 .mppuv_panning: @ SET PANNING
2950 @---------------------------------------------------------------------------------------
2952 cmp r2, #0 @ only set on tick 0
2953 bne .mppuv_exit1 @ ..
2954 sub r0, #128 @ map to 0->64
2960 strb r0, [r7, #MCH_PANNING] @ save to active channel
2965 @---------------------------------------------------------------------------------------
2966 .mppuv_glissando: @ GLISSANDO
2967 @---------------------------------------------------------------------------------------
2973 ldr r1,=vcmd_glissando_table
2977 ldrb r1, [r1, #MPL_FLAGS]
2984 ldrb r0, [r7, #MCH_MEMORY+MPP_GLIS_MEM]
2985 1: strb r0, [r7, #MCH_MEMORY+MPP_GLIS_MEM]
2992 ldrb r0, [r7, #MCH_MEMORY+MPP_IT_PORTAMEM]
2993 1: strb r0, [r7, #MCH_MEMORY+MPP_IT_PORTAMEM]
2994 strb r0, [r7, #MCH_MEMORY+MPP_GLIS_MEM]
2999 vcmd_glissando_table:
3000 .byte 0,1,4,8,16,32,64,96,128,255
3003 @---------------------------------------------------------------------------------------
3004 .mppuv_vibrato: @ VIBRATO (SPEED)
3005 @---------------------------------------------------------------------------------------
3007 @ vibrato... sets speed
3013 strb r0, [r7, #MCH_VIBSPD]
3020 /******************************************************************************
3022 * XM Volume Commands
3024 ******************************************************************************/
3030 @---------------------------------------------------------------------------------------
3032 @---------------------------------------------------------------------------------------
3034 @ determine command type
3036 cmp r0, #0 @ 0 = none
3039 ble .mppuv_xm_setvol
3041 blt .mppuv_xm_volslide
3043 blt .mppuv_xm_fvolslide
3045 blt .mppuv_xm_vibrato
3047 blt .mppuv_xm_panning
3049 blt .mppuv_xm_panslide
3050 b .mppuv_xm_toneporta
3054 @----------------------------------------------------------------------------------------
3055 .mppuv_xm_setvol: @ Set Volume
3056 @----------------------------------------------------------------------------------------
3061 strb r0, [r7, #MCH_VOLUME]
3067 @----------------------------------------------------------------------------------------
3068 .mppuv_xm_volslide: @ Volume Slide
3069 @----------------------------------------------------------------------------------------
3073 ldrb r1, [r7, #MCH_VOLUME]
3074 mov r3, #MCH_MEMORY+MPP_XM_VFX_MEM_VS
3077 bge .mppuv_xm_volslide_up
3079 .mppuv_xm_volslide_dn_check:
3089 2: b .mppuv_voldownA
3091 .mppuv_xm_volslide_up:
3093 .mppuv_xm_volslide_up_check:
3108 @----------------------------------------------------------------------------------------
3109 .mppuv_xm_fvolslide: @ Fine Volume Slide
3110 @----------------------------------------------------------------------------------------
3114 ldrb r1, [r7, #MCH_VOLUME]
3115 mov r3, #MCH_MEMORY+MPP_XM_VFX_MEM_FVS
3118 bge .mppuv_xm_fvolslide_up
3120 b .mppuv_xm_volslide_dn_check
3121 .mppuv_xm_fvolslide_up:
3123 b .mppuv_xm_volslide_up_check
3127 @----------------------------------------------------------------------------------------
3128 .mppuv_xm_vibrato: @ Vibrato
3129 @----------------------------------------------------------------------------------------
3132 @ sets speed or depth
3135 beq .mppuv_xm_vibexit
3137 bge .mppuv_xm_vibdepth
3143 strb r0, [r7, #MCH_VIBSPD]
3150 strb r0, [r7, #MCH_VIBDEP]
3158 @----------------------------------------------------------------------------------------
3159 .mppuv_xm_panning: @ Panning
3160 @----------------------------------------------------------------------------------------
3167 beq .mppuv_xm_panhack
3168 strb r0, [r7, #MCH_PANNING]
3172 strb r0, [r7, #MCH_PANNING]
3178 @----------------------------------------------------------------------------------------
3179 .mppuv_xm_panslide: @ Panning Slide
3180 @----------------------------------------------------------------------------------------
3184 ldrb r2, [r7, #MCH_PANNING]
3185 ldrb r3, [r7, #MCH_MEMORY + MPP_XM_VFX_MEM_PANSL]
3187 bge .mppuv_xm_panslide_right
3197 strb r3, [r7, #MCH_MEMORY + MPP_XM_VFX_MEM_PANSL]
3201 bcs .mppuv_xm_panslide_set
3203 b .mppuv_xm_panslide_set
3204 .mppuv_xm_panslide_right:
3213 strb r3, [r7, #MCH_MEMORY + MPP_XM_VFX_MEM_PANSL]
3217 blt .mppuv_xm_panslide_set
3219 .mppuv_xm_panslide_set:
3220 strb r2, [r7, #MCH_PANNING]
3225 @-------------------------------------------------------------------------------------
3226 .mppuv_xm_toneporta: @ Glissando
3227 @-------------------------------------------------------------------------------------
3230 @ on nonzero ticks, do a regular glissando slide at speed * 16
3237 mov r1, #MCH_MEMORY+MPP_XM_VFX_MEM_GLIS
3239 2: ldrb r0, [r7, r1]
3242 b .mppe_glis_backdoor
3248 /******************************************************************************
3252 ******************************************************************************/
3256 /******************************************************************************
3257 * mpp_ProcessEffect()
3259 * Process pattern effect.
3260 ******************************************************************************/
3261 .global mpp_Process_Effect
3266 ldrb r0, [r7, #MCH_EFFECT] @ get effect#
3267 ldrb r1, [r7, #MCH_PARAM] @ r1 = param
3268 bl mpp_Channel_ExchangeMemory
3276 ldrb r2, [r2, #MPL_TICK] @ r2 = tick#
3278 cmp r2, #0 @ Z flag = tick0 :)
3293 b mppe_VibratoVolume
3295 b mppe_ChannelVolume
3296 b mppe_ChannelVolumeSlide
3300 b mppe_Tremolo @ tremolo
3304 b mppe_SetGlobalVolume
3305 b mppe_GlobalVolumeSlide
3317 @---------------------------------------------------------------------------------
3318 mppe_SetSpeed: @ EFFECT Axy: SET SPEED
3319 @---------------------------------------------------------------------------------
3321 bne .mppe_ss_exit @ dont set on nonzero ticks
3326 strb r1, [r0, #MPL_SPEED]
3334 @---------------------------------------------------------------------------------
3335 mppe_PositionJump: @ EFFECT Bxy: SET POSITION
3336 @---------------------------------------------------------------------------------
3338 bne .mppe_pj_exit @ skip nonzero ticks
3340 strb r1, [r0, #MPL_PATTJUMP]
3347 @---------------------------------------------------------------------------------
3348 mppe_PatternBreak: @ EFFECT Cxy: PATTERN BREAK
3349 @---------------------------------------------------------------------------------
3350 bne .mppe_pb_exit @ skip nonzero ticks
3351 mov r0, r8 @ get variables
3352 strb r1, [r0, #MPL_PATTJUMP_ROW] @ save param to row value
3353 ldrb r1, [r0, #MPL_PATTJUMP] @ check if pattjump=empty
3354 cmp r1, #255 @ 255=empty
3355 bne .mppe_pb_exit @ ...
3356 ldrb r1, [r0, #MPL_POSITION] @ if empty, set pattjump=position+1
3358 strb r1, [r0, #MPL_PATTJUMP]
3365 @------------------------------------------------------------------------------------------
3366 mppe_VolumeSlide: @ EFFECT Dxy: VOLUME SLIDE
3367 @------------------------------------------------------------------------------------------
3370 ldrb r0, [r7, #MCH_VOLUME] @ load volume
3372 bl mpph_VolumeSlide64
3374 strb r0, [r7, #MCH_VOLUME] @ save volume
3382 @----------------------------------------------------------------------------------
3383 mppe_Portamento: @ EFFECT Exy/Fxy: Portamento
3384 @----------------------------------------------------------------------------------
3391 lsr r0, #4 @ test for Ex param (Extra fine slide)
3393 .mppe_pd_checkE: @ ..
3394 bne .mppe_pd_checkF @ ..
3395 cmp r2, #0 @ Extra fine slide: only slide on tick0
3396 bne .mppe_pd_exit @ ..
3397 lsl r1, #32-4 @ mask out slide value
3400 b .mppe_pd_otherslide @ skip the *4 multiplication
3401 .mppe_pd_checkF: @ ------------------------------------
3402 cmp r0, #0xF @ test for Fx param (Fine slide)
3403 bne .mppe_pd_regslide @ ..
3404 cmp r2, #0 @ Fine slide: only slide on tick0
3405 bne .mppe_pd_exit @ ..
3406 lsl r1, #32-4 @ mask out slide value
3408 b .mppe_pd_otherslide
3412 .mppe_pd_otherslide:
3414 ldrb r0, [r7, #MCH_EFFECT] @ check slide direction
3416 cmp r0, #5 @ .. (5 = portamento down)
3417 ldr r0, [r7, r2] @ get period
3419 bne .mppe_pd_slideup @ branch to function
3420 .mppe_pd_slidedown: @ -------SLIDE DOWN-------
3423 bne .mppe_pd_fineslidedown
3424 bl mpph_PitchSlide_Down
3426 b .mppe_pd_store @ store & exit
3428 .mppe_pd_fineslidedown:
3429 bl mpph_FinePitchSlide_Down
3432 .mppe_pd_slideup: @ ---------SLIDE UP---------
3435 bne .mppe_pd_fineslideup
3436 bl mpph_PitchSlide_Up
3438 .mppe_pd_fineslideup:
3439 bl mpph_FinePitchSlide_Up
3443 ldr r1, [r7, #MCH_PERIOD]
3444 str r0, [r7, #MCH_PERIOD]
3453 @---------------------------------------------------------------------------------
3454 mppe_Glissando: @ EFFECT Gxy: Glissando
3455 @---------------------------------------------------------------------------------
3460 ldrb r0, [r0, #MPL_FLAGS]
3463 @ gxx is shared, IT MODE ONLY!!
3466 ldrb r1, [r7, #MCH_MEMORY+MPP_IT_PORTAMEM]
3467 strb r1, [r7, #MCH_PARAM]
3468 3: strb r1, [r7, #MCH_MEMORY+MPP_IT_PORTAMEM]
3469 strb r1, [r7, #MCH_MEMORY+MPP_GLIS_MEM] @ for simplification later
3472 2: @ gxx is separate
3476 ldrb r1, [r7, #MCH_MEMORY+MPP_GLIS_MEM]
3477 strb r1, [r7, #MCH_PARAM]
3478 3: strb r1, [r7, #MCH_MEMORY+MPP_GLIS_MEM]
3481 // b .mppe_glis_exit
3484 push {lr} // save return address
3486 ldrb r1, [r7, #MCH_MEMORY+MPP_GLIS_MEM]
3488 .mppe_glis_backdoor:
3492 cmp r6, #0 // exit if no active channel
3498 ldrb r0, [r6, #MCA_SAMPLE] // get target period
3500 mpp_SamplePointer //
3501 ldrh r1, [r0, #C_MASS_FREQ] //
3503 ldrb r2, [r7, #MCH_NOTE] //
3504 ldr r3,=mmGetPeriod //
3507 pop {r1} // r1 = parameter
3510 mov r3, r0 // r3 = target period
3511 mov r2, #MCH_PERIOD // r0 = current period
3513 mov r2, r8 // test S flag
3514 ldrb r2, [r2, #MPL_FLAGS] //
3515 lsr r2, #C_FLAGS_SS //
3516 bCC .mppe_glis_amiga
3518 blt .mppe_glis_slideup
3519 bgt .mppe_glis_slidedown
3526 bl mpph_PitchSlide_Up
3530 blt .mppe_glis_store
3533 .mppe_glis_slidedown:
3534 bl mpph_PitchSlide_Down
3537 bgt .mppe_glis_store
3542 ldr r1, [r7, r2] @#MCA_PERIOD]
3543 str r0, [r7, r2] @#MCA_PERIOD]
3557 blt .mppe_glis_amiga_up
3558 bgt .mppe_glis_amiga_down
3563 .mppe_glis_amiga_down:
3564 bl mpph_PitchSlide_Up
3567 bgt .mppe_glis_store
3570 .mppe_glis_amiga_up:
3571 bl mpph_PitchSlide_Down
3574 blt .mppe_glis_store
3580 @---------------------------------------------------------------------------------
3581 mppe_Vibrato: @ EFFECT Hxy: Vibrato
3582 @---------------------------------------------------------------------------------
3585 lsr r0, r1, #4 @ if (x != 0) {
3586 beq .mppe_v_nospd @ speed = 4*x;
3588 strb r0, [r7, #MCH_VIBSPD] @ ..
3591 lsl r0, r1, #32-4 @ if (y != 0) {
3592 beq .mppe_v_nodep @ ..
3593 lsr r0, #32-6 @ depth = y * 4;
3595 ldrb r1, [r1, #MPL_OLDEFFECTS] @ if(OldEffects)
3596 lsl r0, r1 @ depth <<= 1;
3597 strb r0, [r7, #MCH_VIBDEP] @
3604 @-------------------------------------------------------
3606 @-------------------------------------------------------
3610 ldrb r1, [r0, #MPL_TICK]
3611 ldrb r0, [r0, #MPL_OLDEFFECTS]
3619 ldrb r1, [r7, #MCH_VIBPOS]
3620 b .mppe_dv_notupdate
3623 ldrb r0, [r7, #MCH_VIBSPD]
3624 ldrb r1, [r7, #MCH_VIBPOS]
3628 strb r1, [r7, #MCH_VIBPOS]
3630 ldr r2,=mpp_TABLE_FineSineData
3632 ldrb r0, [r7, #MCH_VIBDEP]
3637 blt .mppe_dv_negative
3638 bl mpph_PitchSlide_Up
3642 bl mpph_PitchSlide_Down
3647 // pop {pc} @ return THUMB
3652 @---------------------------------------------------------------------------------
3653 mppe_Tremor: @ EFFECT Ixy: Tremor
3654 @---------------------------------------------------------------------------------
3659 @---------------------------------------------------------------------------------
3660 mppe_Arpeggio: @ EFFECT Jxy: Arpeggio
3661 @---------------------------------------------------------------------------------
3666 strb r0, [r7, #MCH_FXMEM]
3670 ldrb r0, [r7, #MCH_FXMEM]
3671 // ldrb r3, [r6, #MCA_SAMPLE] ? ???
3677 strb r0, [r7, #MCH_FXMEM]
3683 mov r0, #2 @ set next tick to '2'
3684 strb r0, [r7, #MCH_FXMEM] @ save...
3686 lsr r1, #4 @ mask out high nibble of param
3689 cmp r1, #12 @ see if its >= 12
3691 add r2, r5 @ add period if so... (octave higher)
3693 lsl r1, #4 @ *16*hword
3697 bl mpph_LinearPitchSlide_Up
3706 strb r0, [r7, #MCH_FXMEM]
3714 @---------------------------------------------------------------------------------
3715 mppe_VibratoVolume: @ EFFECT Kxy: Vibrato+Volume Slide
3716 @---------------------------------------------------------------------------------
3730 @---------------------------------------------------------------------------------
3731 mppe_PortaVolume: @ EFFECT Lxy: Portamento+Volume Slide
3732 @---------------------------------------------------------------------------------
3736 ldrb r1, [r7, #MCH_MEMORY+MPP_GLIS_MEM]
3747 @---------------------------------------------------------------------------------
3748 mppe_ChannelVolume: @ EFFECT Mxy: Set Channel Volume
3749 @---------------------------------------------------------------------------------
3751 bne .mppe_cv_exit @ quite simple...
3753 bgt .mppe_cv_exit @ ignore command if parameter is > 0x40
3754 strb r1, [r7, #MCH_CVOLUME]
3760 @------------------------------------------------------------------------------------
3761 mppe_ChannelVolumeSlide: @ EFFECT Nxy: Channel Volume Slide
3762 @------------------------------------------------------------------------------------
3766 ldrb r0, [r7, #MCH_CVOLUME] @ load volume
3767 bl mpph_VolumeSlide64
3769 strb r0, [r7, #MCH_CVOLUME] @ save volume
3776 @----------------------------------------------------------------------------------
3777 mppe_SampleOffset: @ EFFECT Oxy Sample Offset
3778 @----------------------------------------------------------------------------------
3780 bne .mppe_so_exit @ skip on other ticks
3783 strb r1, [r0, #MPV_SAMPOFF] @ set offset
3790 @---------------------------------------------------------------------------------
3791 mppe_PanningSlide: @ EFFECT Pxy Panning Slide
3792 @---------------------------------------------------------------------------------
3798 ldrb r0, [r7, #MCH_PANNING] @ load panning
3802 strb r0, [r7, #MCH_PANNING] @ save panning
3809 @---------------------------------------------------------------------------------
3810 mppe_Retrigger: @ EFFECT Qxy Retrigger Note
3811 @---------------------------------------------------------------------------------
3813 ldrb r0, [r7, #MCH_FXMEM]
3815 bne .mppe_retrig_refillN
3816 .mppe_retrig_refill:
3820 .mppe_retrig_exitcount:
3821 strb r0, [r7, #MCH_FXMEM]
3823 .mppe_retrig_refillN:
3826 bne .mppe_retrig_exitcount
3829 ldrb r2, [r7, #MCH_VOLUME]
3831 beq .mppe_retrig_v_change0
3833 ble .mppe_retrig_v_change_sub
3835 beq .mppe_retrig_v_change_23
3837 beq .mppe_retrig_v_change_12
3839 beq .mppe_retrig_v_change0
3841 ble .mppe_retrig_v_change_add
3843 beq .mppe_retrig_v_change_32
3845 beq .mppe_retrig_v_change_21
3846 .mppe_retrig_v_change_21:
3849 blt .mppe_retrig_finish
3851 .mppe_retrig_v_change0:
3852 b .mppe_retrig_finish
3853 .mppe_retrig_v_change_sub:
3858 bcs .mppe_retrig_finish
3860 b .mppe_retrig_finish
3861 .mppe_retrig_v_change_23:
3865 b .mppe_retrig_finish
3866 .mppe_retrig_v_change_12:
3868 b .mppe_retrig_finish
3869 .mppe_retrig_v_change_add:
3875 blt .mppe_retrig_finish
3877 b .mppe_retrig_finish
3878 .mppe_retrig_v_change_32:
3882 .mppe_retrig_finish:
3883 strb r2, [r7, #MCH_VOLUME]
3885 beq .mppe_retrig_refill
3886 ldrb r0, [r6, #MCA_FLAGS]
3889 strb r0, [r6, #MCA_FLAGS]
3890 b .mppe_retrig_refill
3894 @---------------------------------------------------------------------------------
3895 mppe_Tremolo: @ EFFECT Rxy: Tremolo
3896 @---------------------------------------------------------------------------------
3901 beq .mppe_trem_zt @ skip this part on tick0
3903 @ X = speed, Y = depth
3904 ldrb r0, [r7, #MCH_FXMEM] @ get sine position
3905 lsr r3, r1, #4 @ mask out SPEED
3906 lsl r3, #2 @ speed*4 to compensate for larger sine table
3907 add r0, r3 @ add to position
3908 strb r0, [r7, #MCH_FXMEM] @ save (value & 255)
3910 ldrb r0, [r7, #MCH_FXMEM] @ get sine position
3911 ldr r3,=mpp_TABLE_FineSineData @ load sine table value
3913 lsl r1, #32-4 @ mask out DEPTH
3915 mul r0, r1 @ SINE*DEPTH / 64
3918 ldrb r1, [r1, #MPL_FLAGS]
3922 1: ldr r1,=mpp_vars @ set volume addition variable
3923 strb r0, [r1, #MPV_VOLPLUS]
3929 @---------------------------------------------------------------------------------
3930 mppe_Extended: @ EFFECT Sxy: Extended Effects
3931 @---------------------------------------------------------------------------------
3940 b mppex_XM_FVolSlideUp @ S0x
3941 b mppex_XM_FVolSlideDown @ S1x
3942 b mppex_OldRetrig @ S2x
3943 b mppex_VibForm @ S3x
3944 b mppex_TremForm @ S4x
3945 b mppex_PanbForm @ S5x
3946 b mppex_FPattDelay @ S6x
3947 b mppex_InstControl @ S7x
3948 b mppex_SetPanning @ S8x
3949 b mppex_SoundControl @ S9x
3950 b mppex_HighOffset @ SAx
3951 b mppex_PatternLoop @ SBx
3952 b mppex_NoteCut @ SCx
3953 b mppex_NoteDelay @ SDx
3954 b mppex_PatternDelay @ SEy
3955 b mppex_SongMessage @ SFx
3959 @-------------------------------------------
3964 @-------------------------------------------
3967 mppex_XM_FVolSlideUp:
3969 ldrb r0, [r7, #MCH_VOLUME]
3976 1: strb r0, [r7, #MCH_VOLUME]
3980 mppex_XM_FVolSlideDown:
3982 ldrb r0, [r7, #MCH_VOLUME]
3988 1: strb r0, [r7, #MCH_VOLUME]
3991 @-------------------------------------------
3997 strb r1, [r7, #MCH_FXMEM]
4000 1: ldrb r0, [r7, #MCH_FXMEM]
4007 strb r0, [r7, #MCH_FXMEM]
4011 ldrb r1, [r6, #MCA_FLAGS]
4015 strb r1, [r6, #MCA_FLAGS]
4017 1: strb r0, [r7, #MCH_FXMEM]
4020 @-------------------------------------------
4025 @-------------------------------------------
4030 @-------------------------------------------
4035 @-------------------------------------------
4042 strb r1, [r0, #MPL_FPATTDELAY]
4046 @-------------------------------------------
4053 ble .mppex_ic_pastnotes
4057 ble .mppex_ic_envelope
4059 .mppex_ic_pastnotes:
4065 ldrb r2, [r7, #MCH_BFLAGS]
4070 strb r2, [r7, #MCH_BFLAGS]
4075 ldrb r2, [r6, #MCA_FLAGS]
4081 strb r2, [r6, #MCA_FLAGS]
4086 @-------------------------------------------
4090 strb r1, [r7, #MCH_PANNING]
4093 @-------------------------------------------
4097 beq .mppex_sc_surround
4103 @-------------------------------------------
4109 @-------------------------------------------
4112 bne .mppex_pl_exit @ dont update on nonzero ticks
4115 lsl r1, #32-4 @ mask low nibble of parameter
4117 bne .mppex_pl_not0 @ is zero?
4119 ldrb r1, [r2, #MPL_ROW] @ ...
4120 strb r1, [r2, #MPL_PLOOP_ROW] @ ...
4121 ldr r1,=mpp_vars @ ....
4122 ldr r1, [r1, #MPV_PATTREAD_P] @ .. ...
4123 mov r3, #MPL_PLOOP_ADR
4124 str r1, [r2, r3] @ ... ...
4126 .mppex_pl_not0: @ otherwise...
4127 ldrb r0, [r2, #MPL_PLOOP_TIMES] @ get pattern loop counter
4129 bne .mppex_pl_active @ if not then its already active
4130 strb r1, [r2, #MPL_PLOOP_TIMES] @ zero: save parameter to counter
4131 b .mppex_pl_exit_enable @ exit & enable jump
4132 .mppex_pl_active: @ nonzero:
4133 sub r0, #1 @ decrement counter
4134 strb r0, [r2, #MPL_PLOOP_TIMES] @ save
4135 beq .mppex_pl_exit @ enable jump if not 0
4136 .mppex_pl_exit_enable:
4137 mov r0, #1 @ enable jump
4138 mov r3, #MPL_PLOOP_JUMP
4139 strb r0, [r2, r3] @ ..
4140 .mppex_pl_exit: @ exit
4144 @-------------------------------------------
4147 lsl r1, #32-4 @ mask parameter
4149 cmp r1, r2 @ compare with tick#
4150 bne .mppex_nc_exit @ if equal:
4151 mov r0, #0 @ cut volume
4152 strb r0, [r7, #MCH_VOLUME] @ ..
4153 .mppex_nc_exit: @ exit
4156 @-------------------------------------------
4161 ldrb r2, [r0, #MPL_TICK]
4167 strb r1, [r0, #MPV_NOTEDELAY]
4170 @-------------------------------------------
4173 bne .mppex_pd_quit @ update on tick0
4174 lsl r1, #32-4 @ mask parameter
4177 ldrb r2, [r0, #MPL_PATTDELAY] @ get patterndelay
4178 cmp r2, #0 @ only update if it's 0
4179 bne .mppex_pd_quit @ ..
4180 add r1, #1 @ set to param+1
4181 strb r1, [r0, #MPL_PATTDELAY] @ ..
4182 .mppex_pd_quit: @ exit
4185 @-------------------------------------------
4189 bne .mppex_pd_quit @ update on tick0
4190 push {lr} @ save return address
4191 lsl r1, #32-4 @ mask parameter
4197 mov r0, #MPCB_SONGMESSAGE
4208 @----------------------------------------------------------------------------------------
4209 mppe_SetTempo: @ EFFECT Txy: Set Tempo / Tempo Slide
4210 @----------------------------------------------------------------------------------------
4217 // not using setbpm for slides???
4225 ldrb r2, [r0, #MPL_BPM]
4228 bge .mppe_st_slideup
4266 @----------------------------------------------------------------------------------------
4267 mppe_FineVibrato: @ EFFECT Uxy: Fine Vibrato
4268 @----------------------------------------------------------------------------------------
4274 strb r0, [r7, #MCH_VIBSPD]
4279 // lsr r0, #32 heh...
4282 ldrb r1, [r1, #MPL_OLDEFFECTS]
4284 strb r0, [r7, #MCH_VIBDEP]
4293 @------------------------------------------------------------------------------------
4294 mppe_SetGlobalVolume: @ EFFECT Vxy: Set Global Volume
4295 @------------------------------------------------------------------------------------
4297 bne .mppe_sgv_exit @ on tick0:
4299 ldrb r2, [r0, #MPL_FLAGS]
4300 mov r3, #(1<<(C_FLAGS_XS-1))+(1<<(C_FLAGS_LS-1))
4310 1: strb r1, [r0, #MPL_GV] @ save param to global volume
4318 @----------------------------------------------------------------------------------
4319 mppe_GlobalVolumeSlide: @ EFFECT Wxy: Global Volume Slide
4320 @----------------------------------------------------------------------------------
4326 ldrb r0, [r0, #MPL_FLAGS]
4337 ldrb r0, [r0, #MPL_GV] @ load global volume
4339 bl mpph_VolumeSlide @ slide..
4342 strb r0, [r1, #MPL_GV] @ save global volume
4351 @---------------------------------------------------------------------------------------
4352 mppe_SetPanning: @ EFFECT Xxy: Set Panning
4353 @---------------------------------------------------------------------------------------
4355 bne .mppe_sp_exit @ on tick0:
4356 strb r1, [r7, #MCH_PANNING] @ set panning=param
4363 @---------------------------------------------------------------------------------------
4364 mppe_Panbrello: @ EFFECT Yxy: Panbrello
4365 @---------------------------------------------------------------------------------------
4372 @---------------------------------------------------------------------------------
4373 mppe_ZXX: @ EFFECT Zxy: Set Filter
4374 @---------------------------------------------------------------------------------
4376 @ ZXX IS NOT SUPPORTED
4380 @=======================================================================================
4382 @=======================================================================================
4386 @-----------------------------------------------------------------------------------
4387 mppe_SetVolume: @ EFFECT 0xx: Set Volume
4388 @-----------------------------------------------------------------------------------
4390 bne .mppe_sv_exit @ on tick0:
4391 strb r1, [r7, #MCH_VOLUME] @ set volume=param
4397 @-----------------------------------------------------------------------------------
4398 mppe_KeyOff: @ EFFECT 1xx: Key Off
4399 @-----------------------------------------------------------------------------------
4400 cmp r1, r2 @ if tick=param:
4404 ldrb r0, [r6, #MCA_FLAGS] @ clear keyon from flags
4405 mov r1, #MCAF_KEYON @
4407 strb r0, [r6, #MCA_FLAGS] @
4414 @-----------------------------------------------------------------------------------
4415 mppe_EnvelopePos: @ EFFECT 1xx: Envelope Position
4416 @-----------------------------------------------------------------------------------
4417 bne .mppe_ep_ot @ on tick0:
4421 @ - NOT SUPPORTED ANYMORE -
4423 @ strh r1, [r6, #MCA_ENVP_VOL] @ set volume envelope position
4424 @ strh r1, [r6, #MCA_ENVP_PAN] @ set panning envelope positin
4425 @ pitch envelope wasn't invented yet
4431 @-----------------------------------------------------------------------------------
4432 mppe_OldTremor: @ EFFECT 3xy: Old Tremor
4433 @-----------------------------------------------------------------------------------
4438 ldrb r0, [r7, #MCH_FXMEM]
4442 ldrb r0, [r7, #MCH_BFLAGS+1]
4445 strb r0, [r7, #MCH_BFLAGS+1]
4450 strb r1, [r7, #MCH_FXMEM]
4456 strb r1, [r7, #MCH_FXMEM]
4461 strb r0, [r7, #MCH_FXMEM]
4464 ldrb r2, [r7, #MCH_BFLAGS+1]
4470 strb r1, [r2, #MPV_VOLPLUS]
4474 @===============================================================================
4476 @===============================================================================
4480 @--------------------------------------------------------------------------
4481 mpph_PitchSlide_Down: @ Linear/Amiga slide down
4482 @--------------------------------------------------------------------------
4485 @ r1 = slide value (/4)
4487 ldrb r2, [r2, #MPL_FLAGS]
4493 @--------------------------------------------------------------------------
4494 mpph_LinearPitchSlide_Down: @ Linear slide down
4495 @--------------------------------------------------------------------------
4498 ldrb r2, [r2, #MPL_FLAGS]
4502 ldr r2,=mpp_TABLE_LinearSlideDownTable
4511 bge .mpph_psd_clipdone
4517 .mpph_psd_amiga_fine:
4520 beq .mpph_psd_clipdone
4527 @--------------------------------------------------------------------------
4528 mpph_PitchSlide_Up: @ Linear/Amiga slide up
4529 @--------------------------------------------------------------------------
4532 @ r1 = slide value (/4)
4535 ldrb r2, [r2, #MPL_FLAGS]
4540 mpph_LinearPitchSlide_Up: @ Linear slide up
4542 ldrb r2, [r2, #MPL_FLAGS]
4546 ldr r2,=mpp_TABLE_LinearSlideUpTable
4549 blt .mpph_psu_notdouble
4551 .mpph_psu_notdouble:
4562 beq .mpph_psu_clipped
4569 .mpph_psu_amiga_fine:
4571 bcs .mpph_psu_clipped
4577 @---------------------------------------------------------------------------
4578 mpph_FinePitchSlide_Up:
4579 @---------------------------------------------------------------------------
4582 @ r1 = slide value (0-15)
4584 ldrb r2, [r2, #MPL_FLAGS]
4586 bcc .mpph_fpsu_amiga
4587 ldr r2,=mpp_TABLE_FineLinearSlideUpTable
4592 b .mpph_psu_amiga_fine
4596 @-----------------------------------------------------------------------------------
4597 mpph_FinePitchSlide_Down:
4598 @-----------------------------------------------------------------------------------
4601 @ r1 = slide value (0-15)
4604 ldrb r2, [r2, #MPL_FLAGS]
4606 bcc .mpph_fpsd_amiga
4607 ldr r2,=mpp_TABLE_FineLinearSlideDownTable
4611 b .mpph_psd_amiga_fine
4614 @-----------------------------------------------------------------------------------
4619 @-----------------------------------------------------------------------------------
4621 @-----------------------------------------------------------------------------------
4623 @ r1 = #rows to skip
4631 ldrb r2, [r0, #MPL_NROWS]
4635 strb r1, [r0, #MPL_ROW]
4637 ldr r7,=mmReadPattern //mpp_ReadPattern
4651 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
4654 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
4658 @-----------------------------------------------------------------------------
4660 @-----------------------------------------------------------------------------
4666 @-----------------------------------------------------------------------------
4668 @-----------------------------------------------------------------------------
4673 @ stack:1 = max volume
4676 ldrb r3, [r3, #MPL_FLAGS]
4680 cmp r1, #0x0F @ is value 15?
4681 bne .mpph_vs_hack1 @ then only slide on tick0
4684 cmp r1, #0xF0 @ is value 15?
4685 bne .mpph_vs_hack2 @ then only slide on tick0
4687 bne .mpph_vs_exit @ ..
4691 mov r3, r1 @ test for Dx0
4693 bne .mpph_vs_next1 @ ..
4694 .mpph_vs_add: @ Dx0: (used for DxF too)
4698 lsr r1, #4 @ fix value
4699 add r0, r1 @ add to volume
4701 cmp r0, r1 @ clip values past 64
4702 blt .mpph_vs_exit2 @ ..
4704 b .mpph_vs_exit2 @ ..
4705 .mpph_vs_next1: @---------------------
4706 mov r3, r1 @ test for D0x
4708 bne .mpph_vs_next2 @ ..
4709 .mpph_vs_sub: @ D0x:
4713 lsl r1, #32-4 @ mask value
4716 sub r0, r1 @ subtract from volume
4717 bcs .mpph_vs_exit @ clip values under 0
4719 b .mpph_vs_exit @ ..
4720 .mpph_vs_next2: @---------------------
4721 cmp r2, #0 @ fine slides now... only slide on tick0
4722 bne .mpph_vs_exit @ ..
4724 mov r3, r1 @ test for DxF
4728 beq .mpph_vs_fadd @ branch
4730 mov r3, r1 @ test for DFx
4733 beq .mpph_vs_fsub @ branch
4739 bx lr @ exit if all fail
4752 blt .mpph_vsxm_testlow
4761 @==========================================================================================
4763 @==========================================================================================
4768 /******************************************************************************
4771 * LUT for amiga periods.
4772 ******************************************************************************/
4773 .global ST3_FREQTABLE
4776 .hword 1712*8, 1616*8, 1524*8, 1440*8, 1356*8, 1280*8, 1208*8, 1140*8, 1076*8, 1016*8, 960*8, 907*8 @ MORE ACCURACY SCALARS
4778 @middle octave is 4.
4780 @ 133808 * ( period(NOTE) >> octave )
4781 @ note_st3period = --------------------------------------------
4782 @ middle_c_finetunevalue(INSTRUMENT)
4786 @-------------------------------------------------------------------------------------------
4787 mpp_TABLE_LinearSlideUpTable: @ value = 2^(val/192), 16.16 fixed
4788 @-------------------------------------------------------------------------------------------
4790 .hword 0, 237, 475, 714, 953 @ 0->4 @ ADD 1.0
4791 .hword 1194, 1435, 1677, 1920, 2164 @ 5->9
4792 .hword 2409, 2655, 2902, 3149, 3397 @ 10->14
4793 .hword 3647, 3897, 4148, 4400, 4653 @ 15->19
4794 .hword 4907, 5157, 5417, 5674, 5932 @ 20->24
4795 .hword 6190, 6449, 6710, 6971, 7233 @ 25->29
4796 .hword 7496, 7761, 8026, 8292, 8559 @ 30->34
4797 .hword 8027, 9096, 9366, 9636, 9908 @ 35->39
4798 .hword 10181, 10455, 10730, 11006, 11283 @ 40->44
4799 .hword 11560, 11839, 12119, 12400, 12682 @ 45->49
4800 .hword 12965, 13249, 13533, 13819, 14106 @ 50->54
4801 .hword 14394, 14684, 14974, 15265, 15557 @ 55->59
4802 .hword 15850, 16145, 16440, 16737, 17034 @ 60->64
4803 .hword 17333, 17633, 17933, 18235, 18538 @ 65->69
4804 .hword 18842, 19147, 19454, 19761, 20070 @ 70->74
4805 .hword 20379, 20690, 21002, 21315, 21629 @ 75->79
4806 .hword 21944, 22260, 22578, 22897, 23216 @ 80->84
4807 .hword 23537, 23860, 24183, 24507, 24833 @ 85->89
4808 .hword 25160, 25488, 25817, 26148, 26479 @ 90->94
4809 .hword 26812, 27146, 27481, 27818, 28155 @ 95->99
4810 .hword 28494, 28834, 29175, 29518, 29862 @ 100->104
4811 .hword 30207, 30553, 30900, 31248, 31599 @ 105->109
4812 .hword 31951, 32303, 32657, 33012, 33369 @ 110->114
4813 .hword 33726, 34085, 34446, 34807, 35170 @ 115->119
4814 .hword 35534, 35900, 36267, 36635, 37004 @ 120->124
4815 .hword 37375, 37747, 38121, 38496, 38872 @ 125->129
4816 .hword 39250, 39629, 40009, 40391, 40774 @ 130->134
4817 .hword 41158, 41544, 41932, 42320, 42710 @ 135->139
4818 .hword 43102, 43495, 43889, 44285, 44682 @ 140->144
4819 .hword 45081, 45481, 45882, 46285, 46690 @ 145->149
4820 .hword 47095, 47503, 47917, 48322, 48734 @ 150->154
4821 .hword 49147, 49562, 49978, 50396, 50815 @ 155->159
4822 .hword 51236, 51658, 52082, 52507, 52934 @ 160->164
4823 .hword 53363, 53793, 54224, 54658, 55092 @ 165->169
4824 .hword 55529, 55966, 56406, 56847, 57289 @ 170->174
4825 .hword 57734, 58179, 58627, 59076, 59527 @ 175->179
4826 .hword 59979, 60433, 60889, 61346, 61805 @ 180->184
4827 .hword 62265, 62727, 63191, 63657, 64124 @ 185->189
4828 .hword 64593, 65064, 0, 474, 950 @ 190->194 @ ADD 2.0 w/ 192+
4829 .hword 1427, 1906, 2387, 2870, 3355 @ 195->199
4830 .hword 3841, 4327, 4818, 5310, 5803 @ 200->204
4831 .hword 6298, 6795, 7294, 7794, 8296 @ 205->209
4832 .hword 8800, 9306, 9814, 10323, 10835 @ 210->214
4833 .hword 11348, 11863, 12380, 12899, 13419 @ 215->219
4834 .hword 13942, 14467, 14993, 15521, 16051 @ 220->224
4835 .hword 16583, 17117, 17653, 18191, 18731 @ 225->229
4836 .hword 19273, 19817, 20362, 20910, 21460 @ 230->234
4837 .hword 22011, 22565, 23121, 23678, 24238 @ 235->239
4838 .hword 24800, 25363, 25929, 25497, 27067 @ 240->244
4839 .hword 27639, 28213, 28789, 29367, 29947 @ 245->249
4840 .hword 30530, 31114, 31701, 32289, 32880 @ 250->254
4841 .hword 33473, 34068 @ 255->256
4844 @-------------------------------------------------------------------------------------
4845 mpp_TABLE_LinearSlideDownTable: @ value = 2^(-val/192), 16.16 fixed
4846 @-------------------------------------------------------------------------------------
4848 .hword 65535, 65300, 65065, 64830, 64596, 64364, 64132, 63901 @ 0->7
4849 .hword 63670, 63441, 63212, 62984, 62757, 62531, 62306, 62081 @ 8->15
4850 .hword 61858, 61635, 61413, 61191, 60971, 60751, 60532, 60314 @ 16->23
4851 .hword 60097, 59880, 59664, 59449, 59235, 59022, 58809, 58597 @ 24->31
4852 .hword 58386, 58176, 57966, 57757, 57549, 57341, 57135, 56929 @ 32->39
4853 .hword 56724, 56519, 56316, 56113, 55911, 55709, 55508, 55308 @ 40->47
4854 .hword 55109, 54910, 54713, 54515, 54319, 54123, 53928, 53734 @ 48->55
4855 .hword 53540, 53347, 53155, 52963, 52773, 52582, 52393, 52204 @ 56->63
4856 .hword 52016, 51829, 51642, 51456, 51270, 51085, 50901, 50718 @ 64->71
4857 .hword 50535, 50353, 50172, 49991, 49811, 49631, 49452, 49274 @ 72->79
4858 .hword 49097, 48920, 48743, 48568, 48393, 48128, 48044, 47871 @ 80->87
4859 .hword 47699, 47527, 47356, 47185, 47015, 46846, 46677, 46509 @ 88->95
4860 .hword 46341, 46174, 46008, 45842, 45677, 45512, 45348, 45185 @ 96->103
4861 .hword 45022, 44859, 44698, 44537, 44376, 44216, 44057, 43898 @104->111
4862 .hword 43740, 43582, 43425, 43269, 43113, 42958, 42803, 42649 @112->119
4863 .hword 42495, 42342, 42189, 42037, 41886, 41735, 41584, 41434 @120->127
4864 .hword 41285, 41136, 40988, 40840, 40639, 40566, 40400, 40253 @128->135
4865 .hword 40110, 39965, 39821, 39678, 39535, 39392, 39250, 39109 @136->143
4866 .hword 38968, 38828, 38688, 38548, 38409, 38271, 38133, 37996 @144->151
4867 .hword 37859, 37722, 37586, 37451, 37316, 37181, 37047, 36914 @152->159
4868 .hword 36781, 36648, 36516, 36385, 36254, 36123, 35993, 35863 @160->167
4869 .hword 35734, 35605, 35477, 35349, 35221, 35095, 34968, 34842 @168->175
4870 .hword 34716, 34591, 34467, 34343, 34219, 34095, 33973, 33850 @176->183
4871 .hword 33728, 33607, 33486, 33365, 33245, 33125, 33005, 32887 @184->191
4872 .hword 32768, 32650, 32532, 32415, 32298, 32182, 32066, 31950 @192->199
4873 .hword 31835, 31720, 31606, 31492, 31379, 31266, 31153, 31041 @200->207
4874 .hword 30929, 30817, 30706, 30596, 30485, 30376, 30226, 30157 @208->215
4875 .hword 30048, 29940, 29832, 29725, 29618, 29511, 29405, 29299 @216->223
4876 .hword 29193, 29088, 28983, 28879, 28774, 28671, 28567, 28464 @224->231
4877 .hword 28362, 28260, 28158, 28056, 27955, 27855, 27754, 27654 @232->239
4878 .hword 27554, 27455, 27356, 27258, 27159, 27062, 26964, 26867 @240->247
4879 .hword 26770, 26674, 26577, 26482, 26386, 26291, 26196, 26102 @248->255
4882 /******************************************************************************
4885 * LUT for linear periods.
4886 ******************************************************************************/
4887 .global IT_PitchTable
4891 .hword 2048, 0, 2170, 0, 2299, 0, 2435, 0, 2580, 0, 2734, 0 @ C-0
4892 .hword 2896, 0, 3069, 0, 3251, 0, 3444, 0, 3649, 0, 3866, 0 @>B-0
4894 .hword 4096, 0, 4340, 0, 4598, 0, 4871, 0, 5161, 0, 5468, 0 @ C-1
4895 .hword 5793, 0, 6137, 0, 6502, 0, 6889, 0, 7298, 0, 7732, 0 @>B-1
4897 .hword 8192, 0, 8679, 0, 9195, 0, 9742, 0, 10321, 0, 10935, 0 @ octave 2
4898 .hword 11585, 0, 12274, 0, 13004, 0, 13777, 0, 14596, 0, 15464, 0
4900 .hword 16384, 0, 17358, 0, 18390, 0, 19484, 0, 20643, 0, 21870, 0 @ octave 3
4901 .hword 23170, 0, 24548, 0, 26008, 0, 27554, 0, 29193, 0, 30929, 0
4903 .hword 32768, 0, 34716, 0, 36781, 0, 38968, 0, 41285, 0, 43740, 0 @ octave 4
4904 .hword 46341, 0, 49097, 0, 52016, 0, 55109, 0, 58386, 0, 61858, 0
4906 .hword 0, 1, 3897, 1, 8026, 1, 12400, 1, 17034, 1, 21944, 1 @ octave 5
4907 .hword 27146, 1, 32657, 1, 38496, 1, 44682, 1, 51236, 1, 58179, 1
4909 .hword 0, 2, 7794, 2, 16051, 2, 24800, 2, 34068, 2, 43888, 2 @ octave 6
4910 .hword 54292, 2, 65314, 2, 11456, 3, 23828, 3, 36936, 3, 50823, 3
4912 .hword 0, 4, 15588, 4, 32103, 4, 49600, 4, 2601, 5, 22240, 5 @ octave 7
4913 .hword 43048, 5, 65092, 5, 22912, 6, 47656, 6, 8336, 7, 36110, 7
4915 .hword 0, 8, 31176, 8, 64205, 8, 33663, 9, 5201, 10, 44481, 10 @ octave 8
4916 .hword 20559, 11, 64648, 11, 45823, 12, 29776, 13, 16671, 14, 6684, 15
4918 .hword 0, 16, 62352, 16, 62875, 17, 1790, 19, 10403, 20, 23425, 21 @ octave 9
4919 .hword 41118, 22, 63761, 23, 26111, 25, 59552, 26, 33342, 28, 13368, 30
4922 @-------------------------------------------------------------------------------------
4923 mpp_TABLE_FineLinearSlideUpTable:
4924 @-------------------------------------------------------------------------------------
4926 .hword 0, 59, 118, 178, 237 @ 0->4 ADD 1x
4927 .hword 296, 356, 415, 475, 535 @ 5->9
4928 .hword 594, 654, 714, 773, 833 @ 10->14
4932 @-------------------------------------------------------------------------------------
4933 mpp_TABLE_FineLinearSlideDownTable:
4934 @-------------------------------------------------------------------------------------
4936 .hword 65535, 65477, 65418, 65359, 65300, 65241, 65182, 65359 @ 0->7
4937 .hword 65065, 65006, 64947, 64888, 64830, 64772, 64713, 64645 @ 8->15
4939 @-------------------------------------------------------------------------------------
4940 mpp_TABLE_FineSineData:
4941 @-------------------------------------------------------------------------------------
4943 .byte 0, 2, 3, 5, 6, 8, 9, 11, 12, 14, 16, 17, 19, 20, 22, 23
4944 .byte 24, 26, 27, 29, 30, 32, 33, 34, 36, 37, 38, 39, 41, 42, 43, 44
4945 .byte 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 56, 57, 58, 59
4946 .byte 59, 60, 60, 61, 61, 62, 62, 62, 63, 63, 63, 64, 64, 64, 64, 64
4947 .byte 64, 64, 64, 64, 64, 64, 63, 63, 63, 62, 62, 62, 61, 61, 60, 60
4948 .byte 59, 59, 58, 57, 56, 56, 55, 54, 53, 52, 51, 50, 49, 48, 47, 46
4949 .byte 45, 44, 43, 42, 41, 39, 38, 37, 36, 34, 33, 32, 30, 29, 27, 26
4950 .byte 24, 23, 22, 20, 19, 17, 16, 14, 12, 11, 9, 8, 6, 5, 3, 2
4951 .byte 0, -2, -3, -5, -6, -8, -9,-11,-12,-14,-16,-17,-19,-20,-22,-23
4952 .byte -24,-26,-27,-29,-30,-32,-33,-34,-36,-37,-38,-39,-41,-42,-43,-44
4953 .byte -45,-46,-47,-48,-49,-50,-51,-52,-53,-54,-55,-56,-56,-57,-58,-59
4954 .byte -59,-60,-60,-61,-61,-62,-62,-62,-63,-63,-63,-64,-64,-64,-64,-64
4955 .byte -64,-64,-64,-64,-64,-64,-63,-63,-63,-62,-62,-62,-61,-61,-60,-60
4956 .byte -59,-59,-58,-57,-56,-56,-55,-54,-53,-52,-51,-50,-49,-48,-47,-46
4957 .byte -45,-44,-43,-42,-41,-39,-38,-37,-36,-34,-33,-32,-30,-29,-27,-26
4958 .byte -24,-23,-22,-20,-19,-17,-16,-14,-12,-11, -9, -8, -6, -5, -3, -2