| version 1.1, 2003/11/28 21:06:03 | version 1.3, 2003/12/24 02:55:26 | 
| 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 | 
 |  |  | 
 |  | ; 14556 | 
 |  |  |