|
|
| version 1.1, 2003/11/28 21:06:03 | version 1.4, 2003/12/24 14:01:56 |
|---|---|
| Line 1 | Line 1 |
| ; OPNGENARMを定義するか SIN_BITS,EVC_BITSの設定を合せること。 | |
| FMDIV_BITS equ 8 | FMDIV_BITS equ 8 |
| FMDIV_ENT equ (1 << FMDIV_BITS) | FMDIV_ENT equ (1 << FMDIV_BITS) |
| FMVOL_SFTBIT equ 4 | FMVOL_SFTBIT equ 4 |
| Line 54 S1_ENVINCDECAY2 equ 64 | Line 52 S1_ENVINCDECAY2 equ 64 |
| ; s_env_inc_release equ 68 | ; s_env_inc_release equ 68 |
| S_SIZE equ 72 | S_SIZE equ 72 |
| S2_ENV_INC equ (S_SIZE * 1 + S1_ENV_INC) | |
| S2_ENV_CNT equ (S_SIZE * 1 + S1_ENV_CNT) | |
| S2_ENV_END equ (S_SIZE * 1 + S1_ENV_END) | |
| S2_TOTALLEVEL equ (S_SIZE * 1 + S1_TOTALLEVEL) | |
| S2_FREQ_INC equ (S_SIZE * 1 + S1_FREQ_INC) | |
| S2_FREQ_CNT equ (S_SIZE * 1 + S1_FREQ_CNT) | |
| S2_ENV_MODE equ (S_SIZE * 1 + S1_ENV_MODE) | |
| S2_DECAYLEVEL equ (S_SIZE * 1 + S1_DECAYLEVEL) | |
| S2_ENVINCDECAY1 equ (S_SIZE * 1 + S1_ENVINCDECAY1) | |
| S2_ENVINCDECAY2 equ (S_SIZE * 1 + S1_ENVINCDECAY2) | |
| S3_ENV_INC equ (S_SIZE * 2 + S1_ENV_INC) | |
| S3_ENV_CNT equ (S_SIZE * 2 + S1_ENV_CNT) | |
| S3_ENV_END equ (S_SIZE * 2 + S1_ENV_END) | |
| S3_TOTALLEVEL equ (S_SIZE * 2 + S1_TOTALLEVEL) | |
| S3_FREQ_INC equ (S_SIZE * 2 + S1_FREQ_INC) | |
| S3_FREQ_CNT equ (S_SIZE * 2 + S1_FREQ_CNT) | |
| S3_ENV_MODE equ (S_SIZE * 2 + S1_ENV_MODE) | |
| S3_DECAYLEVEL equ (S_SIZE * 2 + S1_DECAYLEVEL) | |
| S3_ENVINCDECAY1 equ (S_SIZE * 2 + S1_ENVINCDECAY1) | |
| S3_ENVINCDECAY2 equ (S_SIZE * 2 + S1_ENVINCDECAY2) | |
| S4_ENV_INC equ (S_SIZE * 3 + S1_ENV_INC) | |
| S4_ENV_CNT equ (S_SIZE * 3 + S1_ENV_CNT) | |
| S4_ENV_END equ (S_SIZE * 3 + S1_ENV_END) | |
| S4_TOTALLEVEL equ (S_SIZE * 3 + S1_TOTALLEVEL) | |
| S4_FREQ_INC equ (S_SIZE * 3 + S1_FREQ_INC) | |
| S4_FREQ_CNT equ (S_SIZE * 3 + S1_FREQ_CNT) | |
| S4_ENV_MODE equ (S_SIZE * 3 + S1_ENV_MODE) | |
| S4_DECAYLEVEL equ (S_SIZE * 3 + S1_DECAYLEVEL) | |
| S4_ENVINCDECAY1 equ (S_SIZE * 3 + S1_ENVINCDECAY1) | |
| S4_ENVINCDECAY2 equ (S_SIZE * 3 + S1_ENVINCDECAY2) | |
| ; C_algorithm equ (S_SIZE * 4 + 0) | ; C_algorithm equ (S_SIZE * 4 + 0) |
| C_FEEDBACK equ (S_SIZE * 4 + 1) | C_FEEDBACK equ (S_SIZE * 4 + 1) |
| C_PLAYING equ (S_SIZE * 4 + 2) | C_PLAYING equ (S_SIZE * 4 + 2) |
| Line 134 T_envcurve equ (24 - T_ORG + SIN_ENT | Line 99 T_envcurve equ (24 - T_ORG + SIN_ENT |
| EXPORT opngen_getpcm | EXPORT opngen_getpcm |
| EXPORT opngen_getpcmvr | EXPORT opngen_getpcmvr |
| AREA OPNGENA, CODE, READONLY | AREA .text, CODE, READONLY |
| ; r0 Temporary Register | ; r0 Temporary Register |
| ; r1 Offset | ; r1 Offset |
| Line 150 T_envcurve equ (24 - T_ORG + SIN_ENT | Line 115 T_envcurve equ (24 - T_ORG + SIN_ENT |
| ; r11 opncfg Fix | ; r11 opncfg Fix |
| ; r12 Temporary Register | ; r12 Temporary Register |
| MACRO | |
| $label SLTFREQ $o, $upd | |
| $label ldr r3, [r6, #($o + S1_ENV_INC)] ; calc env | |
| ldr r4, [r6, #($o + S1_ENV_CNT)] | |
| ldr r12, [r6, #($o + S1_ENV_END)] | |
| ; | |
| add r3, r3, r4 | |
| cmp r3, r12 | |
| bcs $upd | |
| MEND | |
| MACRO | |
| $label SLTOUT $o, $fd, $cn | |
| $label mov r4, r3 lsr #ENV_BITS | |
| subs r12, r4, #EVC_ENT | |
| addcc r12, r11, #T_envcurve ; r12 = opntbl.envcurve | |
| ldr r0, [r6, #($o + S1_TOTALLEVEL)] | |
| ldrcc r12, [r12, r4 lsl #2] | |
| str r3, [r6, #($o + S1_ENV_CNT)] | |
| ldr r4, [r6, #($o + S1_FREQ_CNT)] | |
| ldr r3, [r6, #($o + S1_FREQ_INC)] ; freq | |
| subs r0, r0, r12 | |
| ldr r12, [r10, $fd] | |
| add r3, r3, r4 | |
| str r3, [r6, #($o + S1_FREQ_CNT)] | |
| bls $label.ed | |
| add r3, r3, r12 | |
| add r0, r11, r0 lsl #2 | |
| mov r3, r3 lsl #(32 - FREQ_BITS) | |
| add r12, r11, #T_sintable ; r12 = opntbl.sintable | |
| mov r3, r3 lsr #(32 - SIN_BITS) | |
| ldr r4, [r6, $cn] | |
| ldr r0, [r0, #T_envtable] | |
| ldr r3, [r12, r3 lsl #2] | |
| ldr r12, [r4] | |
| mul r0, r3, r0 | |
| ; | |
| add r12, r12, r0 asr #(ENVTBL_BIT + SINTBL_BIT - TL_BITS) | |
| str r12, [r4] | |
| $label.ed | |
| MEND | |
| MACRO | |
| $label SLTUPD $r, $o, $m | |
| $label ldrb r3, [r6, #($o + S1_ENV_MODE)] | |
| ; | |
| ; | |
| sub r3, r3, #1 | |
| cmp r3, #EM_ATTACK | |
| addcc pc, pc, r3 lsl #2 | |
| b $label.off ; EM_OFF | |
| b $label.rel ; EM_RELEASE | |
| b $label.dc2 ; EM_DECAY2 | |
| b $label.dc1 ; EM_DECAY1 | |
| $label.att strb r3, [r6, #($o + S1_ENV_MODE)] | |
| ldr r0, [r6, #($o + S1_DECAYLEVEL)] | |
| ldr r4, [r6, #($o + S1_ENVINCDECAY1)] | |
| mov r3, #EC_DECAY | |
| str r0, [r6, #($o + S1_ENV_END)] | |
| str r4, [r6, #($o + S1_ENV_INC)] | |
| b $r | |
| $label.dc1 strb r3, [r6, #($o + S1_ENV_MODE)] | |
| mov r0, #EC_OFF | |
| ldr r4, [r6, #($o + S1_ENVINCDECAY2)] | |
| ldr r3, [r6, #($o + S1_DECAYLEVEL)] | |
| str r0, [r6, #($o + S1_ENV_END)] | |
| str r4, [r6, #($o + S1_ENV_INC)] | |
| b $r | |
| $label.rel strb r3, [r6, #($o + S1_ENV_MODE)] | |
| $label.dc2 add r3, r12, #1 | |
| ldrb r4, [r6, #C_PLAYING] | |
| mov r0, #0 | |
| str r3, [r6, #($o + S1_ENV_END)] | |
| str r0, [r6, #($o + S1_ENV_INC)] | |
| and r4, r4, $m | |
| strb r4, [r6, #C_PLAYING] | |
| $label.off mov r3, #EC_OFF | |
| b $r | |
| MEND | |
| opngen_getpcm | opngen_getpcm |
| opngen_getpcmvr | opngen_getpcmvr |
| Line 188 slotcalc_lp ldrb r0, [r6, #C_PLAYING] | Line 234 slotcalc_lp ldrb r0, [r6, #C_PLAYING] |
| str r12, [r10, #G_FEEDBACK2] | str r12, [r10, #G_FEEDBACK2] |
| str r12, [r10, #G_FEEDBACK3] | str r12, [r10, #G_FEEDBACK3] |
| str r12, [r10, #G_FEEDBACK4] | str r12, [r10, #G_FEEDBACK4] |
| slot1calc ldr r3, [r6, #S1_ENV_INC] ; calc env | |
| ldr r12, [r6, #S1_ENV_CNT] | slot1calc SLTFREQ 0, slot1update |
| add r3, r3, r12 | s1calcenv mov r12, r3, lsr #ENV_BITS |
| ldr r12, [r6, #S1_ENV_END] | subs r4, r12, #EVC_ENT |
| cmp r3, r12 | addcc r4, r11, #T_envcurve ; r4 = opntbl.envcurve |
| bcs slot1update | |
| s1calcenv str r3, [r6, #S1_ENV_CNT] | |
| mov r3, r3, lsr #ENV_BITS | |
| subs r12, r3, #EVC_ENT | |
| addcc r12, r11, #T_envcurve ; r12 = opntbl.envcurve | |
| ldrcc r12, [r12, r3, lsl #2] | |
| ldr r0, [r6, #S1_TOTALLEVEL] | ldr r0, [r6, #S1_TOTALLEVEL] |
| subs r0, r0, r12 | ldrcc r4, [r4, r12 lsl #2] |
| ldr r3, [r6, #S1_FREQ_INC] ; freq | str r3, [r6, #S1_ENV_CNT] |
| ldr r12, [r6, #S1_FREQ_CNT] | ldr r12, [r6, #S1_FREQ_CNT] |
| ldr r3, [r6, #S1_FREQ_INC] ; freq | |
| subs r0, r0, r4 | |
| ldrb r4, [r6, #C_FEEDBACK] | |
| add r3, r3, r12 | add r3, r3, r12 |
| str r3, [r6, #S1_FREQ_CNT] | str r3, [r6, #S1_FREQ_CNT] |
| bls slot2calc | bls slot2calc |
| ldrb r4, [r6, #C_FEEDBACK] | ldr r12, [r6, #C_OP1FB] |
| cmp r4, #0 | cmp r4, #0 |
| ldrne r12, [r6, #C_OP1FB] | |
| addne r3, r3, r12 asr r4 ; back! | addne r3, r3, r12 asr r4 ; back! |
| if 1 | |
| mov r3, r3, lsl #(32 - FREQ_BITS) | |
| else | |
| mov r3, r3, lsr #(FREQ_BITS - SIN_BITS) | |
| mov r3, r3, lsl #(32 - SIN_BITS) | |
| endif | |
| mov r3, r3, lsr #(32 - SIN_BITS) | |
| add r4, r11, #T_sintable ; r1 = opntbl.sintable | add r4, r11, #T_sintable ; r1 = opntbl.sintable |
| ldr r3, [r4, r3, lsl #2] | mov r3, r3 lsl #(32 - FREQ_BITS) |
| add r4, r11, #T_envtable ; r1 = opntbl.envtable | add r0, r11, r0 lsl #2 |
| ldr r4, [r4, r0, lsl #2] | mov r3, r3 lsr #(32 - SIN_BITS) |
| mul r3, r4, r3 | ldr r0, [r0, #T_envtable] |
| mov r3, r3, asr #(ENVTBL_BIT + SINTBL_BIT - TL_BITS) | ldr r3, [r4, r3 lsl #2] |
| ldr r4, [r6, #C_CONNECT1] | |
| mul r0, r3, r0 | |
| mov r3, r0 asr #(ENVTBL_BIT + SINTBL_BIT - TL_BITS) | |
| strne r3, [r6, #C_OP1FB] | strne r3, [r6, #C_OP1FB] |
| addne r3, r3, r12 | addne r3, r3, r12 |
| subne r3, r3, r3 asr #31 ; adjust.... | subne r3, r3, r3 asr #31 ; adjust.... |
| movne r3, r3, asr #1 | movne r3, r3 asr #1 |
| ldr r12, [r6, #C_CONNECT1] | cmp r4, #0 |
| cmp r12, #0 | ldrne r0, [r4] |
| streq r3, [r10, #G_FEEDBACK2] | streq r3, [r10, #G_FEEDBACK2] |
| streq r3, [r10, #G_FEEDBACK3] | streq r3, [r10, #G_FEEDBACK3] |
| streq r3, [r10, #G_FEEDBACK4] | streq r3, [r10, #G_FEEDBACK4] |
| ldrne r0, [r12] | |
| addne r0, r0, r3 | addne r0, r0, r3 |
| strne r0, [r12] | strne r0, [r4] |
| slot2calc ldr r3, [r6, #S2_ENV_INC] ; calc env | |
| ldr r12, [r6, #S2_ENV_CNT] | slot2calc SLTFREQ (S_SIZE * 1), slot2update |
| add r3, r3, r12 | s2calcenv SLTOUT (S_SIZE * 1), #G_FEEDBACK2, #C_CONNECT2 |
| ldr r12, [r6, #S2_ENV_END] | |
| cmp r3, r12 | slot3calc SLTFREQ (S_SIZE * 2), slot3update |
| bcs slot2update | s3calcenv SLTOUT (S_SIZE * 2), #G_FEEDBACK3, #C_CONNECT3 |
| s2calcenv str r3, [r6, #S2_ENV_CNT] | |
| mov r3, r3, lsr #ENV_BITS | slot4calc SLTFREQ (S_SIZE * 3), slot4update |
| subs r12, r3, #EVC_ENT | s4calcenv SLTOUT (S_SIZE * 3), #G_FEEDBACK4, #C_CONNECT4 |
| addcc r12, r11, #T_envcurve ; r12 = opntbl.envcurve | |
| ldrcc r12, [r12, r3, lsl #2] | |
| ldr r0, [r6, #S2_TOTALLEVEL] | |
| subs r0, r0, r12 | |
| ldr r3, [r6, #S2_FREQ_INC] ; freq | |
| ldr r12, [r6, #S2_FREQ_CNT] | |
| add r3, r3, r12 | |
| str r3, [r6, #S2_FREQ_CNT] | |
| bls slot3calc | |
| ldr r12, [r10, #G_FEEDBACK2] | |
| add r3, r3, r12 | |
| if 1 | |
| mov r3, r3, lsl #(32 - FREQ_BITS) | |
| else | |
| mov r3, r3, lsr #(FREQ_BITS - SIN_BITS) | |
| mov r3, r3, lsl #(32 - SIN_BITS) | |
| endif | |
| mov r3, r3, lsr #(32 - SIN_BITS) | |
| add r12, r11, #T_sintable ; r12 = opntbl.sintable | |
| ldr r3, [r12, r3, lsl #2] | |
| add r12, r11, #T_envtable ; r12 = opntbl.envtable | |
| ldr r12, [r12, r0, lsl #2] | |
| mul r3, r12, r3 | |
| ldr r12, [r6, #C_CONNECT2] | |
| ldr r0, [r12] | |
| add r0, r0, r3, asr #(ENVTBL_BIT + SINTBL_BIT - TL_BITS) | |
| str r0, [r12] | |
| slot3calc ldr r3, [r6, #S3_ENV_INC] ; calc env | |
| ldr r12, [r6, #S3_ENV_CNT] | |
| add r3, r3, r12 | |
| ldr r12, [r6, #S3_ENV_END] | |
| cmp r3, r12 | |
| bcs slot3update | |
| s3calcenv str r3, [r6, #S3_ENV_CNT] | |
| mov r3, r3, lsr #ENV_BITS | |
| subs r12, r3, #EVC_ENT | |
| addcc r12, r11, #T_envcurve ; r12 = opntbl.envcurve | |
| ldrcc r12, [r12, r3, lsl #2] | |
| ldr r0, [r6, #S3_TOTALLEVEL] | |
| subs r0, r0, r12 | |
| ldr r3, [r6, #S3_FREQ_INC] ; freq | |
| ldr r12, [r6, #S3_FREQ_CNT] | |
| add r3, r3, r12 | |
| str r3, [r6, #S3_FREQ_CNT] | |
| bls slot4calc | |
| ldr r12, [r10, #G_FEEDBACK3] | |
| add r3, r3, r12 | |
| if 1 | |
| mov r3, r3, lsl #(32 - FREQ_BITS) | |
| else | |
| mov r3, r3, lsr #(FREQ_BITS - SIN_BITS) | |
| mov r3, r3, lsl #(32 - SIN_BITS) | |
| endif | |
| mov r3, r3, lsr #(32 - SIN_BITS) | |
| add r12, r11, #T_sintable ; r12 = opntbl.sintable | |
| ldr r3, [r12, r3, lsl #2] | |
| add r12, r11, #T_envtable ; r12 = opntbl.envtable | |
| ldr r12, [r12, r0, lsl #2] | |
| mul r3, r12, r3 | |
| ldr r12, [r6, #C_CONNECT3] | |
| ldr r0, [r12] | |
| add r0, r0, r3, asr #(ENVTBL_BIT + SINTBL_BIT - TL_BITS) | |
| str r0, [r12] | |
| slot4calc ldr r3, [r6, #S4_ENV_INC] ; calc env | |
| ldr r12, [r6, #S4_ENV_CNT] | |
| add r3, r3, r12 | |
| ldr r12, [r6, #S4_ENV_END] | |
| cmp r3, r12 | |
| bcs slot4update | |
| s4calcenv str r3, [r6, #S4_ENV_CNT] | |
| mov r3, r3, lsr #ENV_BITS | |
| subs r12, r3, #EVC_ENT | |
| addcc r12, r11, #T_envcurve ; r12 = opntbl.envcurve | |
| ldrcc r12, [r12, r3, lsl #2] | |
| ldr r0, [r6, #S4_TOTALLEVEL] | |
| subs r0, r0, r12 | |
| ldr r3, [r6, #S4_FREQ_INC] ; freq | |
| ldr r12, [r6, #S4_FREQ_CNT] | |
| add r3, r3, r12 | |
| str r3, [r6, #S4_FREQ_CNT] | |
| bls slot5calc | |
| ldr r12, [r10, #G_FEEDBACK4] | |
| add r3, r3, r12 | |
| if 1 | |
| mov r3, r3, lsl #(32 - FREQ_BITS) | |
| else | |
| mov r3, r3, lsr #(FREQ_BITS - SIN_BITS) | |
| mov r3, r3, lsl #(32 - SIN_BITS) | |
| endif | |
| mov r3, r3, lsr #(32 - SIN_BITS) | |
| add r12, r11, #T_sintable ; r12 = opntbl.sintable | |
| ldr r3, [r12, r3, lsl #2] | |
| add r12, r11, #T_envtable ; r12 = opntbl.envtable | |
| ldr r12, [r12, r0, lsl #2] | |
| mul r3, r12, r3 | |
| ldr r12, [r6, #C_CONNECT4] | |
| ldr r0, [r12] | |
| add r0, r0, r3, asr #(ENVTBL_BIT + SINTBL_BIT - TL_BITS) | |
| str r0, [r12] | |
| slot5calc add r6, r6, #C_SIZE | slot5calc add r6, r6, #C_SIZE |
| adds r5, r5, #256 | adds r5, r5, #256 |
| bcc slotcalc_lp | bcc slotcalc_lp |
| ldr r0, [r10, #G_OUTDC] | |
| ldr r12, [r10, #G_OUTDC] | |
| ldr r3, [r10, #G_OUTDL] | ldr r3, [r10, #G_OUTDL] |
| ldr r4, [r10, #G_OUTDR] | ldr r4, [r10, #G_OUTDR] |
| add r3, r3, r12 | ldr r12, [r11, #T_CALC1024] |
| add r4, r4, r12 | add r3, r3, r0 |
| add r4, r4, r0 | |
| mov r3, r3, asr #FMVOL_SFTBIT | mov r3, r3, asr #FMVOL_SFTBIT |
| mov r4, r4, asr #FMVOL_SFTBIT | mov r4, r4, asr #FMVOL_SFTBIT |
| ldr r12, [r11, #T_CALC1024] | |
| subs lr, lr, r12 | subs lr, lr, r12 |
| addle r12, lr, r12 | addle r12, lr, r12 |
| mla r8, r12, r3, r8 | mla r8, r12, r3, r8 |
| mla r9, r12, r4, r9 | mla r9, r12, r4, r9 |
| bgt mksmp_lp | bgt mksmp_lp |
| ldr r0, [r11, #T_FMVOL] | ldr r0, [r11, #T_FMVOL] |
| mov r8, r8, asr #FMDIV_BITS | mov r8, r8 asr #FMDIV_BITS |
| mov r9, r9, asr #FMDIV_BITS | mov r9, r9 asr #FMDIV_BITS |
| mul r8, r0, r8 | mul r8, r0, r8 |
| ldr r12, [r1] | |
| mul r9, r0, r9 | mul r9, r0, r9 |
| ldr r0, [r1] | ldr r0, [r1, #4] |
| add r0, r0, r8, asr #(OPM_OUTSB + FMDIV_BITS + 1 + 6 - FMVOL_SFTBIT - 8); | add r12, r12, r8 asr #(OPM_OUTSB + FMDIV_BITS + 1 + 6 - FMVOL_SFTBIT - 8) |
| str r0, [r1], #4 | str r12, [r1], #4 |
| ldr r0, [r1] | add r0, r0, r9 asr #(OPM_OUTSB + FMDIV_BITS + 1 + 6 - FMVOL_SFTBIT - 8) |
| add r0, r0, r9, asr #(OPM_OUTSB + FMDIV_BITS + 1 + 6 - FMVOL_SFTBIT - 8); | |
| str r0, [r1], #4 | str r0, [r1], #4 |
| subs r2, r2, #1 | subs r2, r2, #1 |
| bne getpcm_lp | bne getpcm_lp |
| Line 383 dcd_opngen dcd opngen | Line 321 dcd_opngen dcd opngen |
| dcd_opnch dcd opnch | dcd_opnch dcd opnch |
| dcd_opncfg dcd opncfg + T_ORG | dcd_opncfg dcd opncfg + T_ORG |
| slot1update ldrb r3, [r6, #S1_ENV_MODE] | slot1update SLTUPD s1calcenv, (S_SIZE * 0), #&fe |
| sub r3, r3, #1 | slot2update SLTUPD s2calcenv, (S_SIZE * 1), #&fd |
| cmp r3, #EM_ATTACK | slot3update SLTUPD s3calcenv, (S_SIZE * 2), #&fb |
| addcc pc, pc, r3, lsl #2 | slot4update SLTUPD s4calcenv, (S_SIZE * 3), #&f7 |
| b s1u_off ; EM_OFF | |
| b s1u_rel ; EM_RELEASE | |
| b s1u_dc2 ; EM_DECAY2 | |
| b s1u_dc1 ; EM_DECAY1 | |
| s1u_att strb r3, [r6, #S1_ENV_MODE] | |
| ldr r3, [r6, #S1_DECAYLEVEL] | |
| str r3, [r6, #S1_ENV_END] | |
| ldr r3, [r6, #S1_ENVINCDECAY1] | |
| str r3, [r6, #S1_ENV_INC] | |
| mov r3, #EC_DECAY | |
| b s1calcenv | |
| s1u_dc1 strb r3, [r6, #S1_ENV_MODE] | |
| mov r3, #EC_OFF | |
| str r3, [r6, #S1_ENV_END] | |
| ldr r3, [r6, #S1_ENVINCDECAY2] | |
| str r3, [r6, #S1_ENV_INC] | |
| ldr r3, [r6, #S1_DECAYLEVEL] | |
| b s1calcenv | |
| s1u_rel strb r3, [r6, #S1_ENV_MODE] | |
| s1u_dc2 add r3, r12, #1 | |
| str r3, [r6, #S1_ENV_END] | |
| mov r3, #0 | |
| str r3, [r6, #S1_ENV_INC] | |
| ldrb r12, [r6, #C_PLAYING] | |
| and r12, r12, #0xfe | |
| strb r12, [r6, #C_PLAYING] | |
| s1u_off mov r3, #EC_OFF | |
| b s1calcenv | |
| slot2update ldrb r3, [r6, #S2_ENV_MODE] | |
| sub r3, r3, #1 | |
| cmp r3, #EM_ATTACK | |
| addcc pc, pc, r3, lsl #2 | |
| b s2u_off ; EM_OFF | |
| b s2u_rel ; EM_RELEASE | |
| b s2u_dc2 ; EM_DECAY2 | |
| b s2u_dc1 ; EM_DECAY1 | |
| s2u_att strb r3, [r6, #S2_ENV_MODE] | |
| ldr r3, [r6, #S2_DECAYLEVEL] | |
| str r3, [r6, #S2_ENV_END] | |
| ldr r3, [r6, #S2_ENVINCDECAY1] | |
| str r3, [r6, #S2_ENV_INC] | |
| mov r3, #EC_DECAY | |
| b s2calcenv | |
| s2u_dc1 strb r3, [r6, #S2_ENV_MODE] | |
| mov r3, #EC_OFF | |
| str r3, [r6, #S2_ENV_END] | |
| ldr r3, [r6, #S2_ENVINCDECAY2] | |
| str r3, [r6, #S2_ENV_INC] | |
| ldr r3, [r6, #S2_DECAYLEVEL] | |
| b s2calcenv | |
| s2u_rel strb r3, [r6, #S2_ENV_MODE] | |
| s2u_dc2 add r3, r12, #1 | |
| str r3, [r6, #S2_ENV_END] | |
| mov r3, #0 | |
| str r3, [r6, #S2_ENV_INC] | |
| ldrb r12, [r6, #C_PLAYING] | |
| and r12, r12, #0xfd | |
| strb r12, [r6, #C_PLAYING] | |
| s2u_off mov r3, #EC_OFF | |
| b s2calcenv | |
| slot3update ldrb r3, [r6, #S3_ENV_MODE] | |
| sub r3, r3, #1 | |
| cmp r3, #EM_ATTACK | |
| addcc pc, pc, r3, lsl #2 | |
| b s3u_off ; EM_OFF | |
| b s3u_rel ; EM_RELEASE | |
| b s3u_dc2 ; EM_DECAY2 | |
| b s3u_dc1 ; EM_DECAY1 | |
| s3u_att strb r3, [r6, #S3_ENV_MODE] | |
| ldr r3, [r6, #S3_DECAYLEVEL] | |
| str r3, [r6, #S3_ENV_END] | |
| ldr r3, [r6, #S3_ENVINCDECAY1] | |
| str r3, [r6, #S3_ENV_INC] | |
| mov r3, #EC_DECAY | |
| b s3calcenv | |
| s3u_dc1 strb r3, [r6, #S3_ENV_MODE] | |
| mov r3, #EC_OFF | |
| str r3, [r6, #S3_ENV_END] | |
| ldr r3, [r6, #S3_ENVINCDECAY2] | |
| str r3, [r6, #S3_ENV_INC] | |
| ldr r3, [r6, #S3_DECAYLEVEL] | |
| b s3calcenv | |
| s3u_rel strb r3, [r6, #S3_ENV_MODE] | |
| s3u_dc2 add r3, r12, #1 | |
| str r3, [r6, #S3_ENV_END] | |
| mov r3, #0 | |
| str r3, [r6, #S3_ENV_INC] | |
| ldrb r12, [r6, #C_PLAYING] | |
| and r12, r12, #0xfb | |
| strb r12, [r6, #C_PLAYING] | |
| s3u_off mov r3, #EC_OFF | |
| b s3calcenv | |
| slot4update ldrb r3, [r6, #S4_ENV_MODE] | |
| sub r3, r3, #1 | |
| cmp r3, #EM_ATTACK | |
| addcc pc, pc, r3, lsl #2 | |
| b s4u_off ; EM_OFF | |
| b s4u_rel ; EM_RELEASE | |
| b s4u_dc2 ; EM_DECAY2 | |
| b s4u_dc1 ; EM_DECAY1 | |
| s4u_att strb r3, [r6, #S4_ENV_MODE] | |
| ldr r3, [r6, #S4_DECAYLEVEL] | |
| str r3, [r6, #S4_ENV_END] | |
| ldr r3, [r6, #S4_ENVINCDECAY1] | |
| str r3, [r6, #S4_ENV_INC] | |
| mov r3, #EC_DECAY | |
| b s4calcenv | |
| s4u_dc1 strb r3, [r6, #S4_ENV_MODE] | |
| mov r3, #EC_OFF | |
| str r3, [r6, #S4_ENV_END] | |
| ldr r3, [r6, #S4_ENVINCDECAY2] | |
| str r3, [r6, #S4_ENV_INC] | |
| ldr r3, [r6, #S4_DECAYLEVEL] | |
| b s4calcenv | |
| s4u_rel strb r3, [r6, #S4_ENV_MODE] | |
| s4u_dc2 add r3, r12, #1 | |
| str r3, [r6, #S4_ENV_END] | |
| mov r3, #0 | |
| str r3, [r6, #S4_ENV_INC] | |
| ldrb r12, [r6, #C_PLAYING] | |
| and r12, r12, #0xf7 | |
| strb r12, [r6, #C_PLAYING] | |
| s4u_off mov r3, #EC_OFF | |
| b s4calcenv | |
| END | END |