For this code, I'm using Base Timing B as a E85 table, Base Timing A as an E0 table and interpolating between them based on E%.
The stock ROM has a value (FFF8ADB8 in A01G) which interpolates between the tables and we'll hijack that. Base Timing A gets used after a flash in the first few minutes AVCS is calibrating then switches to Base Timing B for the rest of the time.
Stock code for the base timing table pull:
Code:
ROM:00069C76 D2 46 mov.l #RAM_ECT, r2
ROM:00069C78 F8 28 fmov.s @R2, fr8
ROM:00069C7A FF 8A fmov.s fr8, @r15
ROM:00069C7C D2 45 mov.l #RAM_E_Load, r2
ROM:00069C7E FD 28 fmov.s @R2, fr13
ROM:00069C80 0E 80 AD 70 movi20 #RAM_Base_Timing, r14
ROM:00069C84 35 E1 70 0D fmov.s @((RAM_RPM_1 - RAM_Base_Timing),r14), fr5
ROM:00069C88 FC 5C fmov fr5, fr12
ROM:00069C8A D4 43 mov.l #Table_Base_Timing_B, r4
ROM:00069C8C D2 3E mov.l #Pull_3D_A, r2
ROM:00069C8E 42 0B jsr @R2 ; Pull_3D_A
ROM:00069C90 F4 DC fmov fr13, fr4
ROM:00069C90
ROM:00069C92 E0 5C mov #h'5C, r0 ; '\'
ROM:00069C94 FE 07 fmov.s fr0, @(r0,r14) ; ADCC
ROM:00069C96 FE E6 fmov.s @(r0,r14), fr14
ROM:00069C98 3F E1 70 12 fmov.s @((RAM_Base_Timing_Interp_Factor - RAM_Base_Timing),r14), fr15
ROM:00069C9C D4 3F mov.l #Table_Base_Timing_A, r4
ROM:00069C9E F4 DC fmov fr13, fr4
ROM:00069CA0 D2 39 mov.l #Pull_3D_A, r2
ROM:00069CA2 42 0B jsr @R2 ; Pull_3D_A
ROM:00069CA4 F5 CC fmov fr12, fr5
ROM:00069CA4
ROM:00069CA6 E0 60 mov #h'60, r0 ; '`'
ROM:00069CA8 FE 07 fmov.s fr0, @(r0,r14) ; FFF8ADD0
ROM:00069CAA FE F2 fmul fr15, fr14 ; FFF8ADB8*Base Timing B result
ROM:00069CAC F0 9D fldi1 fr0
ROM:00069CAE F0 F1 fsub fr15, fr0 ; 1.0-FFF8ADB8
ROM:00069CB0 F8 E6 fmov.s @(r0,r14), fr8
ROM:00069CB2 FE 8E fmac fr0, fr8, fr14 ; Base_Timing A *(1-FFF8ADB8) + Base_Timing_B * FFF8ADB8
Modified Flex Fuel Timing code:
Code:
00069C76 D2 46 mov.l #RAM_ECT, r2
00069C78 F8 28 fmov.s @R2, fr8
00069C7A FF 8A fmov.s fr8, @r15
00069C7C D2 45 mov.l #RAM_E_Load, r2
00069C7E FD 28 fmov.s @R2, fr13
00069C80 0E 80 AD 70 movi20 #RAM_Base_Timing, r14
00069C84 35 E1 70 0D fmov.s @((RAM_RPM_1 - RAM_Base_Timing),r14), fr5
00069C88 FC 5C fmov fr5, fr12
00069C8A D4 43 mov.l #Table_Base_Timing_E85, r4
00069C8C D2 3E mov.l #Pull_3D_A, r2
00069C8E 42 0B jsr @R2 ; Pull_3D_A
00069C90 F4 DC fmov fr13, fr4
00069C92 D2 02 mov.l #FlexFuel_Timing_Interpolation, r2
00069C94 42 4B jsr/n @R2 ; FlexFuel_Timing_Interpolation
00069C96 A0 03 bra loc_69CA0
00069C98 00 09 nop
00069C98 ; ---------------------------------------------------------------------------
00069C9A FF FF .data.w h'FFFF
00069C9C 00 0B 98 50 off_69C9C: .data.l FlexFuel_Timing_Interpolation
00069C9C ; DATA XREF: Base_Timing_Lookup
00069CA0 ; ---------------------------------------------------------------------------
00069CA0
00069CA0 loc_69CA0: ; CODE XREF: Base_Timing_Lookup
00069CA0 D2 39 mov.l #Pull_3D_A, r2
00069CA2 42 0B jsr @R2 ; Pull_3D_A
00069CA4 F5 CC fmov fr12, fr5
00069CA6 E0 60 mov #h'60, r0 ; '`'
00069CA8 FE 07 fmov.s fr0, @(r0,r14) ; FFF8ADD0: Base Timing E0 Result
00069CAA FE F2 fmul fr15, fr14 ; Base timing E85 * FF_Timing_Interpolant
00069CAC F0 9D fldi1 fr0
00069CAE F0 F1 fsub fr15, fr0 ; 1-FF_Timing_Interpolant
00069CB0 F8 E6 fmov.s @(r0,r14), fr8
00069CB2 FE 8E fmac fr0, fr8, fr14 ; (Base timing E0 * (1-FF_Timing_Interpolant)) + (Base timing E85 * FF_Timing_Interpolant)
000B9850 FlexFuel_Timing_Interpolation: ; CODE XREF: Base_Timing_Lookup
000B9850 ; DATA XREF: Base_Timing_Lookup
000B9850 4F 22 sts.l pr, @-r15
000B9852 E0 5C mov #h'5C, r0 ; '\'
000B9854 FE 07 fmov.s fr0, @(r0,r14)
000B9856 FE E6 fmov.s @(r0,r14), fr14
000B9858 D4 19 mov.l #RAM_Flex_Timing_Interpolant, r4
000B985A FF 48 fmov.s @r4, fr15
000B985C D4 24 mov.l #Table_Base_Timing_E0, r4
000B985E F4 DC fmov fr13, fr4
000B9860 4F 26 lds.l @r15+, pr
000B9862 00 6B rts/n
Below are daily drive logs moving slowly from E5 to E60 displaying the interpolation value as well as base timing from a significantly knock limited area on E0 : 3200 +/- 50 RPM and 0.8 +/- 0.05 Load