Coding for Ethanol based scalings (A01G ROM base)
The code below returns and stores a few values based on ethanol content; will describe how to modify ROM and do cranking comp to use these later on:
The clutch switch has been added to use as a failsafe in case the code added after is no good for testing purposes so fewer ECUs get bricked - the code only executes if clutch is depressed. Change the "branch if true" instruction at B97E6 to "00 09" (nop) to turn this switch off.
Initially the ethanol value in fr9 in passed to fr4 and this value is limited by the Check_Bounds routine at 011260 (max value in fr6 and min value in fr5)
The value returned in fr0 (Ethanol content) is stored to RAM_Ethanol and a Fuelling Multiplier is looked up from that table (E0=1.00, E85=1.40 in linear scale)
This value is used to multiply the PI Injector Flow Scaling BRZ value for Port injector operation and a GDI multiplier that works on GDI pressure multiplier tables A and B (I call this GDI multiplier C).
An interpolating value is then looked up in a table to scale between 2 Primary OL fuelling tables (E0=0.00, E85=1.00).
A further interpolating value is looked up for use between 2 base timing tables (E0=0.00, E85=1.00) which are then added to the Knock Correction advance table which remains un-modified. This interpolation value is multiplied by the AVCS active value (0.00 = AVCS not active (looks up Base Timing A), 1.00 = AVCS active (looks up Base Timing B) to use the E0 map as a AVCS inactive map also.
Theoretical table values input in image below. Please feel free to contribute data to discussion as to how best to scale these multipliers or interpolants to hit optimal fuelling and MBT with the 12.5:1 compression ratios with or without boost.
Code:
000B97DE
000B97DE Check_Clutch:
000B97DE 02 80 93 9B movi20 #RAM_Clutch_SW, r2
000B97E2 60 20 mov.b @R2, r0
000B97E4 88 00 cmp/eq #0, r0 ; Clutch out = 0 (A33-15=12V)
000B97E4 ; Clutch depressed = 1 (A33-15=GND)
000B97E6 89 2A bt loc_B983E
000B97E8
000B97E8 FlexFuel_Scalings:
000B97E8 F4 9C fmov fr9, fr4
000B97EA F5 8D fldi0 fr5
000B97EC D2 39 mov.l #Check_Bounds, r2
000B97EE D6 36 mov.l #Ethanol_Max, r6
000B97F0 42 0B jsr @R2 ; Check_Bounds
000B97F2 F6 68 fmov.s @r6, fr6
000B97F4 D8 2C mov.l #RAM_Ethanol, r8
000B97F6 F8 0A fmov.s fr0, @R8
000B97F8 02 10 13 88 movi20 #Pull_2D_A, r2
000B97FC F1 0C fmov fr0, fr1
000B97FE F4 1C fmov fr1, fr4 ; Pull_2D_A
000B9800 D4 38 mov.l #Ethanol_Fuelling_Comp_Table, r4
000B9802 42 4B jsr/n @R2 ; Pull_2D_A
000B9804 D4 29 mov.l #RAM_Fuelling_Multiplier, r4
000B9806 F4 0A fmov.s fr0, @r4
000B9808 D6 30 mov.l #Injector_Flow_Scaling_BRZ, r6
000B980A F6 68 fmov.s @r6, fr6
000B980C F6 02 fmul fr0, fr6
000B980E D4 28 mov.l #RAM_Flex_PI_Scaling, r4
000B9810 F4 6A fmov.s fr6, @r4
000B9812 D6 2F mov.l #GDI_Pressure_Multiplier_C, r6
000B9814 F6 68 fmov.s @r6, fr6
000B9816 F6 02 fmul fr0, fr6
000B9818 D4 26 mov.l #RAM_Flex_GDI_Mult_C, r4
000B981A F4 6A fmov.s fr6, @r4
000B981C 02 10 13 88 movi20 #Pull_2D_A, r2
000B9820 D4 31 mov.l #Ethanol_Fuelling_Interp_Table, r4
000B9822 42 0B jsr @R2 ; Pull_2D_A
000B9824 F4 88 fmov.s @R8, fr4
000B9826 D4 25 mov.l #RAM_Flex_Fuelling_Interpolant, r4
000B9828 F4 0A fmov.s fr0, @r4
000B982A D4 30 mov.l #Ethanol_Timing_Interp_Table, r4
000B982C 02 10 13 88 movi20 #Pull_2D_A, r2
000B9830 42 0B jsr @R2 ; Pull_2D_A
000B9832 F4 88 fmov.s @R8, fr4
000B9834 D4 22 mov.l #RAM_Flex_Timing_Interpolant, r4
000B9836 D2 23 mov.l #RAM_AVCS_Timing_Interp, r2
000B9838 F2 28 fmov.s @R2, fr2
000B983A F2 02 fmul fr0, fr2
000B983C F4 2A fmov.s fr2, @r4
000B983E
000B983E loc_B983E: ; CODE XREF: sub_B97C0
000B983E ; sub_B97C0
000B983E 4F 26 lds.l @r15+, pr
000B9840 00 6B rts/n
000B98A4 FF F8 93 9B off_B98A4: .data.l RAM_Clutch_SW ; DATA XREF: sub_B97C0:Check_Clutch
000B98A8 FF F8 D4 10 off_B98A8: .data.l RAM_Ethanol ; DATA XREF: sub_B97C0
000B98AC FF F8 D4 14 off_B98AC: .data.l RAM_Fuelling_Multiplier
000B98AC ; DATA XREF: sub_B97C0
000B98AC ; sub_B97C0
000B98B0 FF F8 D4 18 off_B98B0: .data.l RAM_Flex_PI_Scaling ; DATA XREF: sub_B97C0
000B98B4 FF F8 D4 1C off_B98B4: .data.l RAM_Flex_GDI_Mult_C ; DATA XREF: sub_B97C0
000B98B8 FF F8 D4 20 off_B98B8: .data.l RAM_Flex_Crank_Comp ; DATA XREF: sub_B97C0
000B98BC FF F8 D4 24 off_B98BC: .data.l RAM_Flex_Fuelling_Interpolant
000B98BC ; DATA XREF: sub_B97C0
000B98C0 FF F8 D4 28 off_B98C0: .data.l RAM_Flex_Timing_Interpolant
000B98C0 ; DATA XREF: sub_B97C0
000B98C0 ; sub_B97C0
000B98C4 FF F8 AD B8 off_B98C4: .data.l RAM_AVCS_Timing_Interp
000B98C4 ; DATA XREF: sub_B97C0
000B98C8 00 0B 98 DC off_B98C8: .data.l Ethanol_Max ; DATA XREF: sub_B97C0
000B98CC 00 10 C6 80 off_B98CC: .data.l Injector_Flow_Scaling_BRZ
000B98CC ; DATA XREF: sub_B97C0
000B98D0 00 10 C6 14 off_B98D0: .data.l GDI_Pressure_Multiplier_C
000B98D0 ; DATA XREF: sub_B97C0
000B98D4 00 01 12 60 off_B98D4: .data.l Check_Bounds ; DATA XREF: sub_B97C0
000B98D4 ; sub_B97C0
000B98D8 FF FF FF FF .data.l h'FFFFFFFF
000B98DC 42 AA 00 00 Ethanol_Max: .float 85.0 ; DATA XREF: sub_B97C0
000B98DC ; ROM:off_B98C8
000B98E0 00 0B 99 10 off_B98E0: .data.l Ethanol_Cranking_Comp_Table
000B98E0 ; DATA XREF: sub_B97C0
000B98E4 00 0B 99 24 off_B98E4: .data.l Ethanol_Fuelling_Comp_Table
000B98E4 ; DATA XREF: sub_B97C0
000B98E8 00 0B 99 38 off_B98E8: .data.l Ethanol_Fuelling_Interp_Table
000B98E8 ; DATA XREF: sub_B97C0
000B98E8 ; sub_B97C0
000B98EC 00 0B 99 4C off_B98EC: .data.l Ethanol_Timing_Interp_Table
000B98EC ; DATA XREF: sub_B97C0