--- np2/wince/arm/opngeng.s 2003/11/28 21:06:03 1.1 +++ np2/wince/arm/opngeng.s 2003/12/24 14:01:56 1.4 @@ -1,6 +1,4 @@ -; OPNGENARMを定義するか SIN_BITS,EVC_BITSの設定を合せること。 - FMDIV_BITS equ 8 FMDIV_ENT equ (1 << FMDIV_BITS) FMVOL_SFTBIT equ 4 @@ -54,39 +52,6 @@ S1_ENVINCDECAY2 equ 64 ; s_env_inc_release equ 68 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_FEEDBACK equ (S_SIZE * 4 + 1) C_PLAYING equ (S_SIZE * 4 + 2) @@ -134,7 +99,7 @@ T_envcurve equ (24 - T_ORG + SIN_ENT EXPORT opngen_getpcm EXPORT opngen_getpcmvr - AREA OPNGENA, CODE, READONLY + AREA .text, CODE, READONLY ; r0 Temporary Register ; r1 Offset @@ -150,6 +115,87 @@ T_envcurve equ (24 - T_ORG + SIN_ENT ; r11 opncfg Fix ; 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_getpcmvr @@ -188,188 +234,80 @@ slotcalc_lp ldrb r0, [r6, #C_PLAYING] str r12, [r10, #G_FEEDBACK2] str r12, [r10, #G_FEEDBACK3] str r12, [r10, #G_FEEDBACK4] -slot1calc ldr r3, [r6, #S1_ENV_INC] ; calc env - ldr r12, [r6, #S1_ENV_CNT] - add r3, r3, r12 - ldr r12, [r6, #S1_ENV_END] - cmp r3, r12 - 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] + +slot1calc SLTFREQ 0, slot1update +s1calcenv mov r12, r3, lsr #ENV_BITS + subs r4, r12, #EVC_ENT + addcc r4, r11, #T_envcurve ; r4 = opntbl.envcurve ldr r0, [r6, #S1_TOTALLEVEL] - subs r0, r0, r12 - ldr r3, [r6, #S1_FREQ_INC] ; freq + ldrcc r4, [r4, r12 lsl #2] + str r3, [r6, #S1_ENV_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 str r3, [r6, #S1_FREQ_CNT] bls slot2calc - ldrb r4, [r6, #C_FEEDBACK] + ldr r12, [r6, #C_OP1FB] cmp r4, #0 - ldrne r12, [r6, #C_OP1FB] 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 - ldr r3, [r4, r3, lsl #2] - add r4, r11, #T_envtable ; r1 = opntbl.envtable - ldr r4, [r4, r0, lsl #2] - mul r3, r4, r3 - mov r3, r3, asr #(ENVTBL_BIT + SINTBL_BIT - TL_BITS) + mov r3, r3 lsl #(32 - FREQ_BITS) + add r0, r11, r0 lsl #2 + mov r3, r3 lsr #(32 - SIN_BITS) + ldr r0, [r0, #T_envtable] + 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] addne r3, r3, r12 subne r3, r3, r3 asr #31 ; adjust.... - movne r3, r3, asr #1 - ldr r12, [r6, #C_CONNECT1] - cmp r12, #0 + movne r3, r3 asr #1 + cmp r4, #0 + ldrne r0, [r4] streq r3, [r10, #G_FEEDBACK2] streq r3, [r10, #G_FEEDBACK3] streq r3, [r10, #G_FEEDBACK4] - ldrne r0, [r12] addne r0, r0, r3 - strne r0, [r12] -slot2calc ldr r3, [r6, #S2_ENV_INC] ; calc env - ldr r12, [r6, #S2_ENV_CNT] - add r3, r3, r12 - ldr r12, [r6, #S2_ENV_END] - cmp r3, r12 - bcs slot2update -s2calcenv str r3, [r6, #S2_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, #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] + strne r0, [r4] + +slot2calc SLTFREQ (S_SIZE * 1), slot2update +s2calcenv SLTOUT (S_SIZE * 1), #G_FEEDBACK2, #C_CONNECT2 + +slot3calc SLTFREQ (S_SIZE * 2), slot3update +s3calcenv SLTOUT (S_SIZE * 2), #G_FEEDBACK3, #C_CONNECT3 + +slot4calc SLTFREQ (S_SIZE * 3), slot4update +s4calcenv SLTOUT (S_SIZE * 3), #G_FEEDBACK4, #C_CONNECT4 + slot5calc add r6, r6, #C_SIZE adds r5, r5, #256 bcc slotcalc_lp - - ldr r12, [r10, #G_OUTDC] + ldr r0, [r10, #G_OUTDC] ldr r3, [r10, #G_OUTDL] ldr r4, [r10, #G_OUTDR] - add r3, r3, r12 - add r4, r4, r12 + ldr r12, [r11, #T_CALC1024] + add r3, r3, r0 + add r4, r4, r0 mov r3, r3, asr #FMVOL_SFTBIT mov r4, r4, asr #FMVOL_SFTBIT - ldr r12, [r11, #T_CALC1024] subs lr, lr, r12 addle r12, lr, r12 mla r8, r12, r3, r8 mla r9, r12, r4, r9 bgt mksmp_lp ldr r0, [r11, #T_FMVOL] - mov r8, r8, asr #FMDIV_BITS - mov r9, r9, asr #FMDIV_BITS + mov r8, r8 asr #FMDIV_BITS + mov r9, r9 asr #FMDIV_BITS mul r8, r0, r8 + ldr r12, [r1] mul r9, r0, r9 - ldr r0, [r1] - add r0, r0, r8, asr #(OPM_OUTSB + FMDIV_BITS + 1 + 6 - FMVOL_SFTBIT - 8); - str r0, [r1], #4 - ldr r0, [r1] - add r0, r0, r9, asr #(OPM_OUTSB + FMDIV_BITS + 1 + 6 - FMVOL_SFTBIT - 8); + ldr r0, [r1, #4] + add r12, r12, r8 asr #(OPM_OUTSB + FMDIV_BITS + 1 + 6 - FMVOL_SFTBIT - 8) + str r12, [r1], #4 + add r0, r0, r9 asr #(OPM_OUTSB + FMDIV_BITS + 1 + 6 - FMVOL_SFTBIT - 8) str r0, [r1], #4 subs r2, r2, #1 bne getpcm_lp @@ -383,137 +321,10 @@ dcd_opngen dcd opngen dcd_opnch dcd opnch dcd_opncfg dcd opncfg + T_ORG -slot1update ldrb r3, [r6, #S1_ENV_MODE] - sub r3, r3, #1 - cmp r3, #EM_ATTACK - addcc pc, pc, r3, lsl #2 - 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 +slot1update SLTUPD s1calcenv, (S_SIZE * 0), #&fe +slot2update SLTUPD s2calcenv, (S_SIZE * 1), #&fd +slot3update SLTUPD s3calcenv, (S_SIZE * 2), #&fb +slot4update SLTUPD s4calcenv, (S_SIZE * 3), #&f7 END