;-----------------------------------------------
;
; ECM 1228746, MaskId: $61
;
; Disassembly of ANLU, '89 Police Caprice
;
; 350 ci, auto, TBI
;
; (Also used in TBI f-body's)
;
; By, Robert Rauscher, March 2001
;
; No guarantees of accuracy, use at your own risk.
;
; As many areas are the same as the 1227747 ECM.
; I want to thank the Ecmguy for his hac of ASDZ.
;
;-----------------------------------------------
;HTML version by Ian Cole, January 2003
;-----------------------------------------------

;-----------------------------------------------
;
; Start of Code
;
;-----------------------------------------------

ORG $D569

;*==============================================
;*
;* Fuel Minor Loop
;*
;*==============================================

LD569: 86 03 LDAA #3 ; O2 channel
LD56B: C6 01 LDAB #1 ; return immed
LD56D: BD FC 1A JSR LFC1A ; ADC routine
LD570: BD FA 90 JSR LFA90 ;
;
;
; Lookup VE% from FL2 table
;
LD573: 96 1B LDAA L001B ; rpm / 25
LD575: CE D2 F9 LDX #$D2F9 ; FL2 VE% tbl
LD578: BD FB 95 JSR LFB95 ; 2d lkup
LD57B: 97 50 STAA L0050 ;
;
;
; read O2 from ADC & start tps convert
;
LD57D: BD FC 27 JSR LFC27 ; get O2 val from adc
LD580: 97 39 STAA L0039 ; save raw O2
;
LD582: 86 0B LDAA #11 ; tps channel
LD584: C6 01 LDAB #1 ; return immed
LD586: BD FC 1A JSR LFC1A ; ADC routine
LD589: 96 3A LDAA L003A ; O2, minor loop filtered
LD58B: 97 B9 STAA L00B9 ; O2, minor loop filtered, one delayed from L003A

;
; lag filter O2 term
;
LD58D: DE 3A LDX L003A ; O2, minor loop filtered
LD58F: 96 39 LDAA L0039 ; O2, adc raw
LD591: F6 D2 1C LDAB LD21C ; filt coef, 240
LD594: BD FB 40 JSR LFB40 ; Lag Filter
LD597: DD 3A STD L003A ; O2, minor loop filtered
;
LD599: 58 LSLB ; round up A, O2 val, filtered
LD59A: 89 00 ADCA #0 ;
LD59C: 97 39 STAA L0039 ; O2, minor loop filtered (rndup)

;
; lag filter O2 term vs. airflow
;
LD59E: 36 PSHA ; save O2
LD59F: 96 BA LDAA L00BA ; gms/sec, limited to 64
LD5A1: CE D3 DE LDX #$D3DE ; filt coef tbl vs gms/sec
LD5A4: BD FB 95 JSR LFB95 ; 2d lkup
LD5A7: 16 TAB ; filt coef
LD5A8: 32 PULA ; O2 val
LD5A9: DE 3E LDX L003E ; O2, filtered vs. airflow
LD5AB: BD FB 40 JSR LFB40 ; Lag Filter
LD5AE: DD 3E STD L003E ; O2, filtered vs. airflow

;
; Lookup Main VE%
;
LD5B0: 96 25 LDAA L0025 ; s/d map, KPa = (N * 0.3125) + 20
LD5B2: 44 LSRA ;
LD5B3: D6 1B LDAB L001B ; rpm / 25
LD5B5: 2A 02 BPL LD5B9 ;
LD5B7: C6 80 LDAB #128 ;
LD5B9: CE D2 AE LDX #$D2AE ;
LD5BC: BD FB B3 JSR LFBB3 ; 3d lkup
LD5BF: 9B 50 ADDA L0050 ; add in VE% from FL2 tbl
LD5C1: 24 02 BCC LD5C5 ;
LD5C3: 86 FF LDAA #255 ;
;
LD5C5: 97 A8 STAA L00A8 ; VE%
;
;
; get TPS val from adc
;
LD5C7: BD FC 27 JSR LFC27 ; get tps val from adc
LD5CA: 97 42 STAA L0042 ; tps, adc cnts, volts = n * .0196
;
;
;
;
LD5CC: D6 08 LDAB L0008 ; status word
LD5CE: C4 DF ANDB #$DF ;
LD5D0: 96 01 LDAA L0001 ; status word
LD5D2: 2A 18 BPL LD5EC ; Engine is not Running
;
LD5D4: B6 D4 3A LDAA LD43A ; Diag mask 1, 1111 1111
LD5D7: 85 04 BITA #$04 ;
LD5D9: 27 19 BEQ LD5F4 ;
;
LD5DB: 96 42 LDAA L0042 ; tps, adc cnts, volts = n * .0196
LD5DD: B1 D4 52 CMPA LD452 ;
LD5E0: 24 12 BCC LD5F4 ;
;
LD5E2: 96 12 LDAA L0012 ; error flag 1
LD5E4: 8A 04 ORAA #$04 ;
LD5E6: 97 12 STAA L0012 ; error flag 1
LD5E8: CA 20 ORAB #$20 ;
LD5EA: 20 08 BRA LD5F4 ;
;
LD5EC: B6 D2 1A LDAA LD21A ; 51, tps idle setting init
LD5EF: 97 47 STAA L0047 ; tps minimum setting, idle position
;
LD5F1: 7F 00 48 CLR L0048 ;
;
;
; Test if in Idle
;
LD5F4: D7 08 STAB L0008 ; status word
LD5F6: BD FC DA JSR LFCDA ; minimum tps setting & tps% calc
LD5F9: D6 02 LDAB L0002 ; status word
LD5FB: C4 7F ANDB #$7F ; pre-clr in idle bit
LD5FD: B1 D5 14 CMPA LD514 ; 5, 2% tps
LD600: 22 09 BHI LD60B ; bra if tps% > 2%, not in idle
;
LD602: 96 30 LDAA L0030 ; mph / 1, filtered
LD604: B1 D2 85 CMPA LD285 ; 7 mph
LD607: 22 02 BHI LD60B ; bra if mph > 7 mph
;
LD609: CA 80 ORAB #$80 ; set in idle bit
LD60B: D7 02 STAB L0002 ; status word
;
;
; Take two paths depending on engine running or not
;
LD60D: 96 01 LDAA L0001 ; status word
LD60F: 2B 03 BMI LD614 ; Engine is Running
LD611: 7E D6 D5 JMP LD6D5 ;

;-----------------------------------------------
;
; Engine is Running
;
;-----------------------------------------------

LD614: F6 08 01 LDAB L0801 ; MCU2 I/O
LD617: 96 03 LDAA L0003 ; status word
LD619: 85 08 BITA #$08 ;
LD61B: 27 15 BEQ LD632 ;
;
LD61D: C5 10 BITB #$10 ; pk/neut bir
LD61F: 26 15 BNE LD636 ; bra if in pk/neut
;
LD621: 84 F7 ANDA #$F7 ; clear b3, pk/neut status bit
;
LD623: F6 D2 8D LDAB LD28D ; 0, coolant thres
LD626: 85 20 BITA #$20 ;
LD628: 26 0E BNE LD638 ;
;
LD62A: D1 21 CMPB L0021 ; coolant, defaulted, 1k pu, inverse, adc cnts
LD62C: 24 0A BCC LD638 ;
;
LD62E: 8A 60 ORAA #$60 ;
LD630: 20 06 BRA LD638 ;
;
;
; test for pk/neut on io and set internal status bit
;
LD632: C5 10 BITB #$10 ; b4 of MCUIO2, 0801
LD634: 27 02 BEQ LD638 ; bra if not in pk/nuet
;
LD636: 8A 08 ORAA #$08 ; set pk/neut status bit

;
; save status bit
;
LD638: 97 03 STAA L0003 ; status word
;
;
;
;
LD63A: 5F CLRB ;
LD63B: 96 25 LDAA L0025 ; s/d map, KPa = (N * 0.3125) + 20
LD63D: 93 2C SUBD L002C ; s/d map, slo filtered from L0025
LD63F: 23 2E BLS LD66F ; bra if map val is dropping, less load
;
LD641: 5D TSTB ; test to rnd up A
LD642: 2A 01 BPL LD645 ; no rndup of A
;
LD644: 4C INCA ; rndup A
;
LD645: 36 PSHA ; Save delta of rising map
LD646: 97 2F STAA L002F ; Save delta of rising map

;-------------------------------------------------
; Is map rising fast enough to need a map AE?
;-------------------------------------------------

LD648: F6 D2 1E LDAB LD21E ; 32
;
LD64B: 96 43 LDAA L0043 ; tps%, from idle
LD64D: B1 D2 1F CMPA LD21F ; 48, 18.7%
LD650: 22 05 BHI LD657 ; bra if tps% > 18.7%
;
;-------------------------------------------------
; map ae term requirement is dbl'd
;-------------------------------------------------

LD652: 58 LSLB ; double val from D21E,
LD653: 24 02 BCC LD657 ;
;
LD655: C6 FF LDAB #255 ;

;-------------------------------------------------
; Have enough delta map for AE?
;-------------------------------------------------

LD657: 32 PULA ; get delta of rising map
LD658: 11 CBA ; compare
LD659: 23 17 BLS LD672 ; bra if not enough delta map

;-------------------------------------------------
; Have enough delta map for map AE
;-------------------------------------------------
; Lk Up Accel Enrich vs Diff Map
; *** Pump Shot ***
;
; Async Only To Stretch Bpw
; Table = msec * 16.384
;-------------------------------------------------

LD65B: CE D2 95 LDX #$D295 ;
LD65E: BD FB 8C JSR LFB8C ; 2d lkup w/line cnt

;-------------------------------------------------
; see if enough tps% to double map AE term
;-------------------------------------------------

LD661: D6 43 LDAB L0043 ; tps%, from idle
LD663: F1 D2 20 CMPB LD220 ; 128
LD666: 23 0B BLS LD673 ;
;
LD668: 48 ASLA ;
LD669: 24 08 BCC LD673 ;
LD66B: 86 FF LDAA #255 ;
LD66D: 20 04 BRA LD673 ;
;
;
; map is dropping
;
LD66F: 7F 00 2F CLR L002F ; diff map

;-------------------------------------------------
; Save Map Pump shot value
;-------------------------------------------------

LD672: 4F CLRA ;
;
LD673: 97 4B STAA L004B ; save pump shot

;-------------------------------------------------
; Ck Current Tps vs Old tps
; Check if enough delta tps for tps Accel Enrich
;-------------------------------------------------

LD675: D6 E0 LDAB L00E0 ; status word
LD677: 96 43 LDAA L0043 ; tps%, from idle
LD679: 90 44 SUBA L0044 ; tps%, one delayed from L0043
LD67B: 23 20 BLS LD69D ; bra if new tps% <= old tps%
; clear PS
;
; reg A == delta tps if > 0
;
; ck afr opt word 2
;
;
LD67D: C5 10 BITB #$10 ;
LD67F: 26 05 BNE LD686 ;
;
;
; check for enough delta tps to enrich ae
;
LD681: B1 D2 21 CMPA LD221 ; 4, 1.6% tps
LD684: 23 17 BLS LD69D ; bra if delta tps% <= 1.6%
; go clr tps PS
;
LD686: 48 ASLA ; delta tps% *= 2
LD687: 25 06 BCS LD68F ;
;
LD689: 48 ASLA ; delta tps% *= 2
LD68A: 25 03 BCS LD68F ;
;
LD68C: 48 ASLA ; delta tps% *= 2
LD68D: 24 02 BCC LD691 ;
;
LD68F: 86 FF LDAA #255 ; clr ovrflw

;-------------------------------------------------
; Lk Up Accel Enrich vs Diff Tps
; **** Tps Pump Shot ******
;
; Async Only To Stretch Bpw.
; Table = msec * 16.384
;-------------------------------------------------

LD691: CE D2 9B LDX #$D29B ;
LD694: BD FB 8C JSR LFB8C ; 2d lkup w/line cnt
;
LD697: D6 E0 LDAB L00E0 ; status word
LD699: CA 10 ORAB #$10 ; set b4, (tps ae in effect)
LD69B: 20 03 BRA LD6A0 ;

;-------------------------------------------------
; clear tps pump shot value
;-------------------------------------------------

LD69D: 4F CLRA ;
LD69E: C4 EF ANDB #$EF ;

;-------------------------------------------------
; save tps AE status & term
;-------------------------------------------------

LD6A0: D7 E0 STAB L00E0 ; save status word
LD6A2: 97 4A STAA L004A ; save pump shot bpw

;-------------------------------------------------
; check for opening IAC, add extra fuel
;-------------------------------------------------

LD6A4: 4F CLRA ; pre-clr, IAC added fuel when opening
LD6A5: D6 E0 LDAB L00E0 ; status word
LD6A7: C5 04 BITB #$04 ; b2 (iac opening)
LD6A9: 27 03 BEQ LD6AE ;
;
LD6AB: B6 D2 22 LDAA LD222 ; IAC opening additional AE bpw, 120usc

;-------------------------------------------------
; Sum totals: IAC map AE & tps AE
;-------------------------------------------------

LD6AE: 9B 4A ADDA L004A ; add IAC opening to ae bpw
LD6B0: 25 04 BCS LD6B6 ; bra if ovrflw
;
LD6B2: 9B 4B ADDA L004B ; add in map ae
LD6B4: 24 02 BCC LD6B8 ;
;
LD6B6: 86 FF LDAA #255 ; clear ovrflw
LD6B8: 27 13 BEQ LD6CD ;
;
;-------------------------------------------------
; reg A has total additional async fuel,
; now scale according to coolant term
; and add to fuel accumulator.
;-------------------------------------------------

LD6BA: D6 99 LDAB L0099 ; accel enrichment vs coolant
LD6BC: 3D MUL ;
LD6BD: 04 LSRD ;
LD6BE: 04 LSRD ;
LD6BF: 04 LSRD ;
;
LD6C0: D3 97 ADDD L0097 ; async fuel accumulator
LD6C2: DD 97 STD L0097 ; async fuel accumulator
LD6C4: FD 04 47 STD L0447 ; HU ram

;-------------------------------------------------
; do status bits
;-------------------------------------------------

LD6C7: 96 0D LDAA L000D ; status word
LD6C9: 8A 60 ORAA #$60 ; b6 & b5, reset INT & quasi async
LD6CB: 20 04 BRA LD6D1 ;
;
;-------------------------------------------------
; bra here for AE & IAC sums == 0
;-------------------------------------------------

LD6CD: 96 0D LDAA L000D ; status word
LD6CF: 84 BF ANDA #$BF ; 1011 1111
;
LD6D1: 97 0D STAA L000D ; status word
LD6D3: 20 09 BRA LD6DE ;
;
;
; Eng not running branches here
;
LD6D5: 96 43 LDAA L0043 ; tps%, from idle
LD6D7: 5F CLRB ;
LD6D8: DD 45 STD L0045 ; tps%, slow filtered
;
LD6DA: 96 25 LDAA L0025 ; s/d map, KPa = (N * 0.3125) + 20
LD6DC: DD 2C STD L002C ; s/d map, slo filtered from L0025
;
LD6DE: 96 DF LDAA L00DF ; status word
LD6E0: 85 40 BITA #$40 ; engine start ok
LD6E2: 27 16 BEQ LD6FA ; bra to not start eng
;
;
; eng start ok here
;
; Check for high speed fuel shutoff
;
LD6E4: F6 D2 61 LDAB LD261 ; 255 mph
LD6E7: 96 0F LDAA L000F ; status word
LD6E9: 85 01 BITA #$01 ; fuel kill bit, 1 == in kill
LD6EB: 27 06 BEQ LD6F3 ; bra if b0 == 0
;
LD6ED: 7A 00 0F DEC L000F ; set b0 to 0
LD6F0: F6 D2 62 LDAB LD262 ; 255 mph
;
LD6F3: D1 30 CMPB L0030 ; mph / 1, filtered
LD6F5: 22 06 BHI LD6FD ; bra if thres > current mph
LD6F7: 7C 00 0F INC L000F ; set b0 of L000F to 1
;
LD6FA: 7E D8 74 JMP LD874 ; kill engine

;-----------------------------------------------
;
; Lets do fuel, engine run OK'd
;
;-----------------------------------------------

;*==============================================
;*
;* Start building the BPW
;*
;* BPW = BPC * MAP * ~T * ~AFR * VE * BVcor * BLM * DFCO * DE +- CLT
;*
;*==============================================

LD6FD: 96 A5 LDAA L00A5 ; Injector Constant
LD6FF: D6 A3 LDAB L00A3 ; desired AFR
LD701: C1 3F CMPB #63 ; 6.3 afr
LD703: 22 2D BHI LD732 ; bra if afr > 6.3
;
LD705: C1 0F CMPB #15 ; 1.5 afr
LD707: 22 09 BHI LD712 ; bra if afr > 1.5 ( && < 6.3)
;
;-------------------------------------------------
; AFR =< 1.5
;-------------------------------------------------

LD709: 5F CLRB ; lsb of bpw term
LD70A: DD AA STD L00AA ; save that & inj cnst
LD70C: 96 A3 LDAA L00A3 ; desired AFR
LD70E: 48 ASLA ; x2
LD70F: 48 ASLA ; x2
LD710: 20 07 BRA LD719 ;
;
;-------------------------------------------------
; AFR > 1.5 & =< 6.3
;-------------------------------------------------

LD712: C6 40 LDAB #64 ;
LD714: 3D MUL ;
LD715: DD AA STD L00AA ; start of bpw
LD717: 96 A3 LDAA L00A3 ; desired AFR
;
LD719: 48 ASLA ;
LD71A: 48 ASLA ;
LD71B: 20 1C BRA LD739 ;
;
;-----------------------------------------------
;
; Another entry to below Subroutine to add to BPW
;
;-----------------------------------------------

LD71D: 36 PSHA ;
LD71E: DC AA LDD L00AA ; sync bpw
LD720: 05 LSLD ;
LD721: 24 03 BCC LD726 ;
LD723: CC FF FF LDD #$FFFF ; clr ovrflw
LD726: DD AA STD L00AA ; sync bpw
LD728: 32 PULA ;

;-----------------------------------------------
;
; Subroutine to add to BPW
;
;-----------------------------------------------

LD729: CE 00 AA LDX #$00AA ; sync bpw
LD72C: BD FC 05 JSR LFC05 ; AB = (A x *X) / 256
LD72F: DD AA STD L00AA ; sync bpw
LD731: 39 RTS ;

;-----------------------------------------------
;
; Build up that BPW
;
;-----------------------------------------------

LD732: C6 10 LDAB #16 ; constant
LD734: 3D MUL ; A has inj cnst
LD735: DD AA STD L00AA ; sync bpw
;
LD737: 96 A3 LDAA L00A3 ; desired AFR
LD739: CE FE 35 LDX #$FE35 ; Inverse AFR term tbl
LD73C: BD FB 8C JSR LFB8C ; 2d lkup w/line cnt
LD73F: 8D E8 BSR LD729 ; add to BPW
;
LD741: 96 A8 LDAA L00A8 ; VE%
LD743: 8D E4 BSR LD729 ; add to BPW
;
LD745: 96 2B LDAA L002B ; map term for BPW & gms/sec calc's
LD747: 8D E0 BSR LD729 ; add to BPW
;
LD749: 96 A9 LDAA L00A9 ; Inverse coolant term for bpw calc
LD74B: 8D DC BSR LD729 ; add to BPW
;
LD74D: 96 0D LDAA L000D ; status word
LD74F: 2B 04 BMI LD755 ; bra if in PE/WOT mode
LD751: 96 A1 LDAA L00A1 ; BLM, bin val
LD753: 8D C8 BSR LD71D ; add to BPW * 2

;-----------------------------------------------
; End of BPW calc so Far
;-----------------------------------------------

;*==============================================
;*
;* Check DFCO qual's
;*
;*==============================================
;
LD755: 96 21 LDAA L0021 ; coolant, defaulted, 1k pu, inverse, adc cnts
LD757: B1 D2 7E CMPA LD27E ; 231, 0c
LD75A: 23 03 BLS LD75F ; coolant high enough for DFCO
LD75C: 7E D7 FC JMP LD7FC ; skip dfco

;-----------------------------------------------
;-----------------------------------------------

LD75F: 96 10 LDAA L0010 ; status word
LD761: 85 10 BITA #$10 ; b4, in park/neut
LD763: 26 23 BNE LD788 ; bra if b4 == 1, exit fuel c/o
;
LD765: D6 08 LDAB L0008 ; status word
LD767: C5 24 BITB #$24 ; tps diag bits
LD769: 26 07 BNE LD772 ; skip tps qual if tps diags xx
;
LD76B: 96 43 LDAA L0043 ; tps%, from idle
LD76D: B1 D2 7C CMPA LD27C ; 8, 3.1%
LD770: 24 2C BCC LD79E ; bra if tps% > 8
;
LD772: 96 1F LDAA L001F ; rpm / 12.5, filtered, one delayed
LD774: 90 1D SUBA L001D ; rpm / 12.5, filtered
LD776: 25 05 BCS LD77D ; bra if rpm rising
;
LD778: B1 D2 76 CMPA LD276 ; delta rpm val, 4
LD77B: 22 0B BHI LD788 ; bra if delta rpm > 4: 50 rpm
;
LD77D: C5 C0 BITB #$C0 ;
LD77F: 26 34 BNE LD7B5 ;
;
LD781: 96 2F LDAA L002F ; delta of rising map, from ae routine
LD783: B1 D2 77 CMPA LD277 ; 10, 23KPa
LD786: 23 1B BLS LD7A3 ; bra if delta map < 23 Kpa

;-------------------------------
;
; Here To Come Out of DFCO
;
;
; L009E: Post DFCO timer
; L00AF: DFCO timer
;
;-------------------------------
;
LD788: 96 9E LDAA L009E ; post DFCO timer
LD78A: 27 12 BEQ LD79E ; bra if tmr == 0
;
LD78C: DC 97 LDD L0097 ; async fuel accumulator
LD78E: F3 D2 78 ADDD LD278 ; fuel pulse when exiting dfco
LD791: 24 03 BCC LD796 ; bra if no ovrflw
;
LD793: CC 7F FF LDD #$7FFF ; use max
LD796: DD 97 STD L0097 ; async fuel accumulator

LD798: 96 0D LDAA L000D ; status word
LD79A: 8A 20 ORAA #$20 ; set b5, quasi-async fuel in effect
LD79C: 97 0D STAA L000D ; status word
;
;
; DFCO just active
;
LD79E: 7F 00 9E CLR L009E ; post DFCO timer
LD7A1: 20 4D BRA LD7F0 ;
;
;
; do map limits
;
LD7A3: 96 28 LDAA L0028 ; map adc value, raw
LD7A5: D6 07 LDAB L0007 ; status word
LD7A7: B1 D2 74 CMPA LD274 ; decel fuel c/o map thresh, lower, 23 kpa
LD7AA: 25 09 BCS LD7B5 ; bra if map < lower limit
;
LD7AC: C5 08 BITB #$08 ; b3, dfco active bit
LD7AE: 27 40 BEQ LD7F0 ; bra if not in dfco
;
LD7B0: B1 D2 75 CMPA LD275 ; decel fuel c/o map thresh, upper, 35 KPa
LD7B3: 24 3B BCC LD7F0 ; bra if map > upper limit
;
;
; do rpm & mph limits
;
; 4 line table
;
; rpm: 1350/850
; mph: 40/35
;
LD7B5: CE D2 70 LDX #$D270 ; point to 4 line tbl, use X as index
LD7B8: D6 07 LDAB L0007 ; status word
LD7BA: C5 08 BITB #$08 ; b3, dfco avtive bit
LD7BC: 27 01 BEQ LD7BF ; bra if not in dfco
;
LD7BE: 08 INX ; nxt tbl entry
;
LD7BF: 96 1B LDAA L001B ; rpm / 25
LD7C1: A1 00 CMPA 0,X ; 1350/850 rpm
LD7C3: 23 C3 BLS LD788 ; bra to exit dfco
;
LD7C5: 96 30 LDAA L0030 ; mph / 1, filtered
LD7C7: A1 02 CMPA 2,X ; 40/35 mph
LD7C9: 25 BD BCS LD788 ; bra to exit dfco
;
;
; Check decel fuel C/O timer
;
LD7CB: 96 9F LDAA L009F ; DFCO timer
LD7CD: 26 1E BNE LD7ED ;
;
LD7CF: CA 08 ORAB #$08 ; set dfco active bit
LD7D1: D7 07 STAB L0007 ; status word
LD7D3: B6 D2 7B LDAA LD27B ; 400 msec, after decel fuel cut off for bpw
; val = msec x 0.80
LD7D6: 97 9E STAA L009E ; post DFCO timer
;
LD7D8: 96 0D LDAA L000D ; status word
LD7DA: 8A 10 ORAA #$10 ; set b4, entering decel enleanment
LD7DC: 97 0D STAA L000D ; status word
;
LD7DE: 96 9D LDAA L009D ; DFCO fuel mult
LD7E0: B0 D2 7D SUBA LD27D ; 10.2% mult for bpw in decel fuel c/o
LD7E3: 24 01 BCC LD7E6 ; bra if no underflow
;
LD7E5: 4F CLRA ;
LD7E6: 97 9D STAA L009D ; DFCO fuel mult
LD7E8: BD D7 29 JSR LD729 ; add to BPW
LD7EB: 20 6B BRA LD858 ;
;
;
LD7ED: 4A DECA ; decr decel fuel tmr
LD7EE: 20 03 BRA LD7F3 ;
;
;
; do DFCO timers
;
LD7F0: B6 D2 7A LDAA LD27A ; 80
LD7F3: 97 9F STAA L009F ; save DFCO timer
LD7F5: 96 9E LDAA L009E ; post DFCO
LD7F7: 27 03 BEQ LD7FC ; bra if tmr == 0
;
LD7F9: 7A 00 9E DEC L009E ; decr post DFCO timer

;-------------------------------------------------
;
; No DFCO bra here
;
;-------------------------------------------------

LD7FC: 96 07 LDAA L0007 ; status word
LD7FE: 84 F7 ANDA #$F7 ; clr b3, dfco bit
LD800: 97 07 STAA L0007 ; status word
LD802: 86 FF LDAA #255 ;
LD804: 97 9D STAA L009D ; DFCO fuel mult, set to max

;*==============================================
;*
;* Check for decel enleanment
;*
;*==============================================

LD806: DC 45 LDD L0045 ; tps%, slow filtered
LD808: 58 LSLB ; get b7 of reg B, need to round
LD809: 89 00 ADCA #0 ; round A
LD80B: 24 01 BCC LD80E ;
LD80D: 4A DECA ;
;
LD80E: 90 43 SUBA L0043 ; tps%, from idle
LD810: 25 40 BCS LD852 ; bra if filtered tps < current, skip enlean
;
;-------------------------------
; check decel enleanment quals
;-------------------------------

;
; check delta tps%
;
;
LD812: B1 D2 6D CMPA LD26D ; 3, 1.2%
LD815: 23 3B BLS LD852 ; no decel enlean if <= 1.2%
;
;
; check delta map
;
LD817: DC 2C LDD L002C ; s/d map, slo filtered from L0025
LD819: 58 LSLB ;
LD81A: 89 00 ADCA #0 ;
LD81C: 24 01 BCC LD81F ;
LD81E: 4A DECA ;
LD81F: 90 25 SUBA L0025 ; s/d map, KPa = (N * 0.3125) + 20
LD821: 25 2F BCS LD852 ; no decel enlean
;
LD823: B1 D2 6E CMPA LD26E ; 8
LD826: 23 2A BLS LD852 ; no decel enlean if map delta <
;
;
; do decel enleanment
;
; ((decel fac * cool fac) * 8 ) / 256
;
;
LD828: F6 D2 6F LDAB LD26F ; 224, decel enleanment factor
LD82B: 3D MUL ;
LD82C: D6 9C LDAB L009C ; decel coolant factor vs coolant
LD82E: 3D MUL ; AB = A * B
LD82F: 05 LSLD ; AB *= 8
LD830: 25 06 BCS LD838 ;
LD832: 05 LSLD ;
LD833: 25 03 BCS LD838 ;
LD835: 05 LSLD ;
LD836: 24 02 BCC LD83A ;
LD838: 86 FF LDAA #255 ;
LD83A: 40 NEGA ;
LD83B: 27 15 BEQ LD852 ; no decel enlean
;
LD83D: D6 0D LDAB L000D ; status word
LD83F: CA 10 ORAB #$10 ; decel enleanment in effect
LD841: D7 0D STAB L000D ; status word
LD843: 36 PSHA ; enleanment bpw term

;
; mult decel enleanment into sync & async bpw's
;
LD844: CE 00 97 LDX #$0097 ; async fuel accumulator
LD847: BD FC 05 JSR LFC05 ; AB = (A x *X) / 256
LD84A: DD 97 STD L0097 ; async fuel accumulator
;
LD84C: 32 PULA ; enleanment bpw term
LD84D: BD D7 29 JSR LD729 ; add to sync BPW
LD850: 20 06 BRA LD858 ;

;-------------------------------------------------
;
; Skip decel enleanment bra here
;
;-------------------------------------------------

LD852: 96 0D LDAA L000D ; status word
LD854: 84 EF ANDA #$EF ; 1110 1111
LD856: 97 0D STAA L000D ; status word

;*==============================================
;*
;* Continue Building BPW
;*
;*==============================================

;-------------------------------------------------
;
; Add volts correction term to bpw
;
;-------------------------------------------------

LD858: 96 B1 LDAA L00B1 ; bpw inj volts correction term
LD85A: BD D7 1D JSR LD71D ; add to BPW * 2

;-------------------------------------------------
;
; add closed loop correction term to BPW
;
; INT & Proportional
;
;-------------------------------------------------

LD85D: 4F CLRA ;
LD85E: D6 B0 LDAB L00B0 ; closed loop correction term
LD860: 2B 09 BMI LD86B ; bra if term negative
;
;-------------------------------
; Do positive INT/Prop, more fuel
;-------------------------------
LD862: D3 AA ADDD L00AA ; bpw, (sync), add in clsd lp corr term
LD864: 24 10 BCC LD876 ; bra if no overflow
;
LD866: CC FF FF LDD #$FFFF ; max it, clr ovrflw
LD869: 20 0B BRA LD876 ; continue >>
;
;-------------------------------
; Do negative INT/Prop, less fuel
;-------------------------------
LD86B: 50 NEGB ; B is INT/Prop term
LD86C: DD 49 STD L0049 ; tmp storage
;
LD86E: DC AA LDD L00AA ; sync bpw
LD870: 93 49 SUBD L0049 ; subtract out clsd lp corr term
LD872: 24 02 BCC LD876 ; bra if no underflow

;-------------------------------
; no fuel here
;-------------------------------
LD874: 4F CLRA ; to clear sync bpw
LD875: 5F CLRB ; to clear sync bpw

;-------------------------------
;
; Done with INT & Prop terms,
; Save Final BPW result!
;
;-------------------------------

LD876: DD AA STD L00AA ; sync bpw
LD878: FD 04 58 STD L0458 ; HU ram

;-------------------------------
; Mult BPW * 4 and save tmp
; for async bpw calc
;-------------------------------
LD87B: 05 LSLD ; BPW *= 2
LD87C: 25 05 BCS LD883 ; bra if ovrflw
;
LD87E: 05 LSLD ; BPW *= 2
LD87F: 25 02 BCS LD883 ; bra if ovrflw
;
LD881: 2A 03 BPL LD886 ; bra if not ovrflw
;
LD883: CC 7F FF LDD #$7FFF ; load max
;
;-------------------------------------------------
;
; Look Up Async Mult vs Rpm
;
; Convert sync bpw to an async bpw term. This
; term is not always used. However, it is
; available if required.
;-------------------------------------------------

LD886: DD 4B STD L004B ; tmp of modified sync bpw
LD888: 96 1B LDAA L001B ; rpm / 25
LD88A: CE D3 9C LDX #$D39C ; conversion tbl
LD88D: BD FB 8C JSR LFB8C ; 2d lkup w/line cnt
;
LD890: CE 00 4B LDX #$004B ; addr of tmp of modified sync bpw
LD893: BD FC 05 JSR LFC05 ; AB = (A x *X) / 256
LD896: DD 4F STD L004F ; tmp storage


;*==============================================
;*
;* Time to do Injector Pulse Programming
;*
;*
;* 0xBC0E: sync pulse width counter
;* 0xBC14: async pulse width counter
;* 0xBC3C: PWM control, bit 0x0080 for async bpw
;*
;*==============================================

LD898: 96 00 LDAA L0000 ; status word
LD89A: 85 10 BITA #$10 ; engine shutdown
LD89C: 27 08 BEQ LD8A6 ; bra if not shutting down

;
; Do Zero Pw Sync Injection, engine shutdown
; or fuel kill in effect.
;
LD89E: 4F CLRA ;
LD89F: 5F CLRB ;
LD8A0: FD BC 0E STD LBC0E ; ecu sync bpw
LD8A3: 7E D9 47 JMP LD947 ;

;------------------------------------------------
;
; Test if need to do async fuel.
;
; Test BPW switch points, if < low point, do
; async fuel. Bpw needs to be > than upper
; point to go back to sync fuel.
;
;------------------------------------------------

LD8A6: 96 01 LDAA L0001 ; status word
LD8A8: 2A 24 BPL LD8CE ; Engine is not Running
;
LD8AA: DE AA LDX L00AA ; sync bpw
LD8AC: BC D2 63 CPX LD263 ; max bpw hyst val, 992usec
LD8AF: 22 1D BHI LD8CE ;
;
LD8B1: 96 0E LDAA L000E ; status word
LD8B3: 85 10 BITA #$10 ; b4, async fuel in effect
LD8B5: 26 09 BNE LD8C0 ; bra if in async fuel, stay
;
LD8B7: BC D2 65 CPX LD265 ; min bpw hyst val, 687usec
LD8BA: 22 12 BHI LD8CE ;
;
LD8BC: 8A 10 ORAA #$10 ; set b4, async fuel in effect
LD8BE: 97 0E STAA L000E ; status word

;-------------------------------
;
; Doing async fuel only
;
;-------------------------------

LD8C0: DC 4F LDD L004F ; async inj BPW (cnvt'd from sync bpw)
LD8C2: D3 AC ADDD L00AC ; async tmp bpw
LD8C4: DD AC STD L00AC ; async tmp bpw

;
; Do Zero Sync Injection,
; then go do async fuel
;
LD8C6: CE 00 00 LDX #$0000 ;
LD8C9: FF BC 0E STX LBC0E ; ecu sync bpw
LD8CC: 20 20 BRA LD8EE ; bra & do async fuel

;-------------------------------
;
; Do sync fuel. Clear async
; fuel flag & tmp async fuel
;
;-------------------------------

LD8CE: 96 0E LDAA L000E ; a/f mode word flag
LD8D0: 84 EF ANDA #$EF ; clr b4, async fuel flag
LD8D2: 97 0E STAA L000E ; status word, a/f mode
LD8D4: CE 00 00 LDX #$0000 ;
LD8D7: DF AC STX L00AC ; clear async fuel

;
; Add In Inj Offset Bias
; And Do Sync Injection
;
LD8D9: FC D2 67 LDD LD267 ; injector bias, 396usec
LD8DC: D3 AA ADDD L00AA ; sync bpw
LD8DE: 25 02 BCS LD8E2 ; bra if no ovrflw
LD8E0: 2A 03 BPL LD8E5 ;
LD8E2: CC 7F FF LDD #7FFF ;
;
LD8E5: FD BC 0E STD LBC0E ; ecu sync bpw

;
; Test if doing quasi-async fuel
;

LD8E8: 96 0D LDAA L000D ; status word
LD8EA: 85 20 BITA #$20 ; quasi flag
LD8EC: 27 59 BEQ LD947 ; bra if no quasi async fuel

;-------------------------------
;
; Do (quasi)ASync fuel
;
;-------------------------------

LD8EE: DC AC LDD L00AC ; async tmp bpw
LD8F0: D3 97 ADDD L0097 ; async fuel accumulator
LD8F2: 37 PSHB ;
LD8F3: 36 PSHA ;
LD8F4: 38 PULX ; async bpw
LD8F5: BC D2 69 CPX LD269 ; max async bpw, 12msec
LD8F8: 22 13 BHI LD90D ; bra if bpw > 12msec
;
LD8FA: BC D2 6B CPX LD26B ; min async bpw, 687usec
LD8FD: 23 42 BLS LD941 ; bra if bpw < minimum
;
LD8FF: F3 D2 67 ADDD LD267 ; injector bias, 396usec
LD902: FD BC 14 STD LBC14 ; ecu async bpw
;
;
; Now Clear Async Values
;

LD905: 4F CLRA ;
LD906: 5F CLRB ;
LD907: DD 97 STD L0097 ; async fuel accumulator
LD909: DD AC STD L00AC ; async tmp bpw
LD90B: 20 18 BRA LD925 ;

;-------------------------------
;
; Async Fuel Requested is
; greater than 11.99msec.
;
;-------------------------------

LD90D: FC D2 69 LDD LD269 ;
LD910: F3 D2 67 ADDD LD267 ; injector bias, 396usec
LD913: FD BC 14 STD LBC14 ; ecu async bpw
LD916: DC AC LDD L00AC ; async tmp bpw
LD918: B3 D2 69 SUBD LD269 ; max async bpw, 12msec
LD91B: 24 06 BCC LD923 ;
;
LD91D: D3 97 ADDD L0097 ; async fuel accumulator
LD91F: DD 97 STD L0097 ; async fuel accumulator
LD921: 4F CLRA ;
LD922: 5F CLRB ;
;
LD923: DD AC STD L00AC ; async tmp bpw

;-------------------------------
;
; toggle pwm bit to kick off
; async fuel.
;
;-------------------------------

LD925: BD FD 19 JSR LFD19 ; delay, rts only
LD928: FC BC 3C LDD LBC3C ; PWM control register
LD92B: C4 7F ANDB #$7F ; clr b7
LD92D: BD FD 19 JSR LFD19 ; delay, rts only
;
LD930: FD BC 3C STD LBC3C ; PWM control register
LD933: CA 80 ORAB #$80 ; set b7
LD935: BD FD 19 JSR LFD19 ; delay, rts only
;
LD938: FD BC 3C STD LBC3C ; PWM control register
;
LD93B: 96 0D LDAA L000D ; status word
LD93D: 8A 20 ORAA #$20 ; set b5, quasi-async fuel
LD93F: 20 04 BRA LD945 ;
;
;-------------------------------
; Finished w/Async fuel
;-------------------------------

LD941: 96 0D LDAA L000D ; status word
LD943: 84 DF ANDA #$DF ; clr b5, quasi-async fuel
;
LD945: 97 0D STAA L000D ; status word

;*===============================================
;*
;* Jump to from zero sync fuel
;*
;* Alternate between two different code
;* paths every other pass through.
;*
;*===============================================

LD947: 96 66 LDAA L0066 ; 160Hz rts counter
LD949: 84 03 ANDA #$03 ;
LD94B: 81 03 CMPA #$03 ;
LD94D: 27 03 BEQ LD952 ;
LD94F: 7E DC 43 JMP LDC43 ;

;*==================================================
;*
;* Enter Fuel Loop1
;*
;*==================================================

;-------------------------------------------------
; Decide whether to use open loop afr or
; closed loop afr.
;-------------------------------------------------

LD952: B6 D2 32 LDAA LD232 ; 14.7, stoich
LD955: D6 0E LDAB L000E ; status word, a/f mode
LD957: 2B 1E BMI LD977 ; bra if in closed loop
;
;
; not closed loop here
;
LD959: B6 D2 33 LDAA LD233 ; 18 (1.8 afr vs vac for idle)
LD95C: D6 02 LDAB L0002 ; status word
LD95E: 2B 08 BMI LD968 ; bra if in idle
;

;-------------------------------------------------
; Do Open Loop Engine Afr vs Vacuum/Coolant
;-------------------------------------------------

LD960: CE D3 43 LDX #$D343 ; Open Loop AFR vs Vacuum
LD963: 96 2E LDAA L002E ; vac
LD965: BD FB 8C JSR LFB8C ; 2d lkup w/line cnt
;
LD968: 9B B2 ADDA L00B2 ; add in afr from AfrCool tbl
LD96A: 24 02 BCC LD96E ; bra if no ovrflw
LD96C: 86 FF LDAA #255 ;
;
LD96E: 90 E5 SUBA L00E5 ; choke adj, makes richer
LD970: 25 04 BCS LD976 ; bra if udrflw
LD972: 90 BC SUBA L00BC ; ??an afr val
LD974: 24 01 BCC LD977 ; bra if no udrflw
;
LD976: 4F CLRA ; clr undrflw

;
; Check if OK for hiway fuel mode
;
LD977: D6 01 LDAB L0001 ; status word
LD979: 2A 72 BPL LD9ED ; Engine is not Running
;
LD97B: D6 0E LDAB L000E ; status word, a/f mode
LD97D: 2A 35 BPL LD9B4 ; bra if open loop, no hiway
;
LD97F: D6 2E LDAB L002E ; vac
LD981: F1 D0 22 CMPB LD022 ; 240
LD984: 24 2E BCC LD9B4 ; bra if vac > thres, no hiway
;
LD986: D6 21 LDAB L0021 ; coolant, defaulted, 1k pu, inverse, adc cnts
LD988: F1 D2 28 CMPB LD228 ; 199, 20c
LD98B: 24 27 BCC LD9B4 ; bra if cool < thres, no hiway
;
LD98D: D6 DE LDAB L00DE ; status word
LD98F: C5 10 BITB #$10 ; b4, ????
LD991: 26 07 BNE LD99A ; bra if b4 == 1, skip nxt qual
;
LD993: D6 7D LDAB L007D ; used in egr test, a clsd lp term
LD995: F1 D2 35 CMPB LD235 ; 166
LD998: 23 1A BLS LD9B4 ; bra if thres <= 166, no hiway
;
LD99A: D6 08 LDAB L0008 ; status word
LD99C: C5 C0 BITB #$C0 ; b7 & b6
LD99E: 26 14 BNE LD9B4 ; bra if b7 | b6 == 1, no hiway
;
LD9A0: D6 30 LDAB L0030 ; mph / 1, filtered
LD9A2: F1 D2 34 CMPB LD234 ; 52 mph
LD9A5: 25 0D BCS LD9B4 ; bra if vehicle mph < 52, no hiway
;
;
; passed all quals for hiway mode
;
LD9A7: D6 0F LDAB L000F ; status word
LD9A9: C5 10 BITB #$10 ; in hiway mode
LD9AB: 27 12 BEQ LD9BF ; bra if not in hiway mode, OK for hiway
;
LD9AD: D6 A4 LDAB L00A4 ; HiWay Fuel timer, max time
LD9AF: F1 D2 37 CMPB LD237 ; 255
LD9B2: 25 15 BCS LD9C9 ; bra if timer < 255, stay in hiway
;
;
; No hiway fuel here
;
LD9B4: 7F 00 A4 CLR L00A4 ; HiWay Fuel timer
LD9B7: D6 0F LDAB L000F ; status word
LD9B9: C4 EF ANDB #$EF ; clr b4, 1110 1111
LD9BB: D7 0F STAB L000F ; status word
LD9BD: 20 22 BRA LD9E1 ;

;
; Hiway fuel OK here
;
LD9BF: D6 A4 LDAB L00A4 ; HiWay Fuel timer
LD9C1: F1 D2 36 CMPB LD236 ; 100
LD9C4: 25 12 BCS LD9D8 ; bra if lockout timer < 100
LD9C6: 7F 00 A4 CLR L00A4 ; HiWay Fuel timer
;
LD9C9: D6 0F LDAB L000F ; status word
LD9CB: CA 10 ORAB #$10 ; set b4, in hiway afr mode
LD9CD: D7 0F STAB L000F ; status word
;
LD9CF: CE D3 BC LDX #$D3BC ; hiway afr tbl
LD9D2: 96 2E LDAA L002E ; vac
LD9D4: 44 LSRA ;
LD9D5: BD FB 95 JSR LFB95 ; 2d lkup
;
LD9D8: D6 66 LDAB L0066 ; 160Hz rts counter
LD9DA: C1 33 CMPB #$33 ; chk if time to inc timer
LD9DC: 26 03 BNE LD9E1 ; bra if not yet
;
LD9DE: 7C 00 A4 INC L00A4 ; HiWay Fuel timer
;
;
; check that afr isn't any leaner than 20:1
;
LD9E1: B1 D2 53 CMPA LD253 ; 200, max lean afr, 20:1
LD9E4: 23 03 BLS LD9E9 ;
LD9E6: B6 D2 53 LDAA LD253 ; 200, max lean afr, 20:1
LD9E9: 97 A3 STAA L00A3 ; desired AFR
LD9EB: 20 38 BRA LDA25 ;

;-----------------------------------------------
;
; Engine not running branch here
;
;-----------------------------------------------

LD9ED: B6 D2 55 LDAA LD255 ; clear flood afr, 20:1
LD9F0: F6 D2 54 LDAB LD254 ; clear flood tps% thres, 80%
LD9F3: D1 43 CMPB L0043 ; tps%, from idle
LD9F5: 23 2A BLS LDA21 ; bra if in clear flood
;
LD9F7: 96 B3 LDAA L00B3 ; crank afr
LD9F9: D6 21 LDAB L0021 ; coolant, defaulted, 1k pu, inverse, adc cnts
LD9FB: F1 D2 56 CMPB LD256 ; 241, coolant threshold, -10c
LD9FE: 23 21 BLS LDA21 ; bra if coolant > -10c
;
;
; Cold crank AFR Mult? for cts < -10c vs Vac
;
LDA00: 36 PSHA ;
LDA01: 96 2E LDAA L002E ; vac
LDA03: C6 60 LDAB #96 ;
LDA05: CE D3 80 LDX #$D380 ;
LDA08: BD FB 91 JSR LFB91 ; 2d lkup w/SBA
LDA0B: 33 PULB ;
LDA0C: 3D MUL ;
LDA0D: 05 LSLD ;
LDA0E: 25 09 BCS LDA19 ;
LDA10: 05 LSLD ;
LDA11: 25 06 BCS LDA19 ;
LDA13: 05 LSLD ;
LDA14: 25 03 BCS LDA19 ;
LDA16: 05 LSLD ;
LDA17: 24 02 BCC LDA1B ;
LDA19: 86 FF LDAA #255 ;
;
LDA1B: 91 B2 CMPA L00B2 ; afr vs coolant, open loop
LDA1D: 25 02 BCS LDA21 ; use richer of two afr's
LDA1F: 96 B2 LDAA L00B2 ; afr vs coolant, open loop
;
LDA21: 97 A3 STAA L00A3 ; desired AFR
LDA23: 20 24 BRA LDA49 ;

;-----------------------------------------------
;
; Continue with eng running
;
;-----------------------------------------------

;*==============================================
;*
;* Do Power Enrichment Quals
;*
;*==============================================

;
; get baro adj tps% val
;
LDA25: CE D3 AE LDX #$D3AE ; Tps Mult vs. Baro
LDA28: BD FB 67 JSR LFB67 ; get a baro adjusted tps% value
LDA2B: 36 PSHA ; save baro adj tps%

;
; get tps% required for PE from tbl vs. rpm
;
LDA2C: CE D3 C5 LDX #$D3C5 ; tps% for pe tbl
;
LDA2F: D6 21 LDAB L0021 ; coolant, defaulted, 1k pu, inverse, adc cnts
LDA31: F1 D2 57 CMPB LD257 ; 23, coolant threshold, 120c
LDA34: 23 03 BLS LDA39 ; bra if coolant > 120c
;
LDA36: CE D3 B2 LDX #$D3B2 ; tps% for pe tbl
;
;
; Do Lookup for tps% required
;
LDA39: 8D 16 BSR LDA51 ; do 2d lkup w/scaled rpm

;
; if in PE now, sub out tps% hyst
;
LDA3B: 96 0D LDAA L000D ; status word
LDA3D: 2A 06 BPL LDA45 ; bra if not in PE already
;
LDA3F: F0 D2 58 SUBB LD258 ; result of lookup - 8
LDA42: 24 01 BCC LDA45 ; bra if no undrflw
LDA44: 5F CLRB ;
;
;
; now test for enough tps% for PE
;
LDA45: 32 PULA ; baro adj tps%
LDA46: 10 SBA ;
LDA47: 24 13 BCC LDA5C ;
;
;
; bra here for no PE
;
LDA49: 96 0D LDAA L000D ; status word
LDA4B: 84 7F ANDA #$7F ; clr b7, 0111 1111, PE mode bit
LDA4D: 97 0D STAA L000D ; status word
LDA4F: 20 29 BRA LDA7A ;
;
;-----------------------------------------------
;
; SubRoutine for 2d lookup w/scaled rpm val
;
;-----------------------------------------------

LDA51: 96 1A LDAA L001A ; rpm scaled
LDA53: 44 LSRA ; rpm /= 2
LDA54: 44 LSRA ; rpm /= 2
LDA55: 89 00 ADCA #0 ; rnd up A
LDA57: BD FB 95 JSR LFB95 ; 2d lkup
LDA5A: 16 TAB ; return w/val in both A & B
LDA5B: 39 RTS ; and done >>>>

;-----------------------------------------------
;
; Go Into or Stay in PE/WOT mode
;
;-----------------------------------------------

LDA5C: 96 0D LDAA L000D ; status word
LDA5E: 8A 80 ORAA #$80 ; set b7, PE mode active bit
LDA60: 97 0D STAA L000D ; status word
;
LDA62: CE D3 B7 LDX #$D3B7 ; Wot Fuel Afr Vs. Rpm
LDA65: 8D EA BSR LDA51 ; do 2d lkup w/scaled rpm
;
LDA67: 96 21 LDAA L0021 ; coolant, defaulted, 1k pu, inverse, adc cnts
LDA69: B1 D2 59 CMPA LD259 ; 112, ~55c
LDA6C: 25 06 BCS LDA74 ; bra if coolant > thres
;
LDA6E: F0 D2 5A SUBB LD25A ; 10, 1.0:1 afr richer
LDA71: 24 01 BCC LDA74 ;
;
LDA73: 5F CLRB ;

;
; Save current AFR, richer of two vals
;
LDA74: D1 A3 CMPB L00A3 ; desired AFR
LDA76: 24 02 BCC LDA7A ;
LDA78: D7 A3 STAB L00A3 ; desired AFR

;-----------------------------------------------
;
;
;
;-----------------------------------------------

LDA7A: 96 00 LDAA L0000 ; check for Headsup on line
LDA7C: 85 02 BITA #$02 ;
LDA7E: 27 03 BEQ LDA83 ;
LDA80: BD 58 00 JSR L5800 ;

;*==================================================
;*
;* BLM Stuff
;*
;* See:
;*==================================================

LDA83: 96 0D LDAA L000D ; status word
LDA85: 84 FB ANDA #$FB ; clr b2, 1111 1011 INT reset bit
LDA87: 97 0D STAA L000D ; status word

;
; Check if still in same BLM cell
;
LDA89: D6 A0 LDAB L00A0 ; blm cell # in current use
LDA8B: C4 03 ANDB #$03 ;
LDA8D: CE D2 39 LDX #$D239 ; cell boundry tbl by rpm
LDA90: 3A ABX ;
LDA91: 09 DEX ;
LDA92: 5D TSTB ;
LDA93: 27 0F BEQ LDAA4 ;
;
LDA95: A6 00 LDAA 0,X ; 32, 800 rpm
LDA97: B0 D2 3F SUBA LD23F ; 2, 50 rpm hyst
LDA9A: 25 04 BCS LDAA0 ;
;
LDA9C: 91 1B CMPA L001B ; rpm / 25
LDA9E: 22 3B BHI LDADB ;
;
LDAA0: C1 03 CMPB #3 ;
LDAA2: 27 0B BEQ LDAAF ;
;
LDAA4: A6 01 LDAA 1,X ; 64, 1600 rpm
LDAA6: BB D2 3F ADDA LD23F ; 2, 50 rpm hyst
LDAA9: 25 04 BCS LDAAF ;
;
LDAAB: 91 1B CMPA L001B ; rpm / 25
LDAAD: 25 2C BCS LDADB ;
;
LDAAF: D6 A0 LDAB L00A0 ; blm cell # in current use
LDAB1: C4 0C ANDB #$0C ;
LDAB3: 54 LSRB ;
LDAB4: 54 LSRB ;
;
LDAB5: CE D2 3C LDX #$D23C ; cell boundry tbl by map, 29.4 Kpa
LDAB8: 3A ABX ;
LDAB9: 09 DEX ;
LDABA: 5D TSTB ;
LDABB: 27 0F BEQ LDACC ;
;
LDABD: A6 00 LDAA 0,X ; 29.4 Kpa
LDABF: B0 D2 40 SUBA LD240 ; 6, 1.9KPa hyst on cell boundy
LDAC2: 25 04 BCS LDAC8 ;
;
LDAC4: 91 25 CMPA L0025 ; s/d map, KPa = (N * 0.3125) + 20
LDAC6: 22 13 BHI LDADB ;
;
LDAC8: C1 03 CMPB #3 ;
LDACA: 27 0B BEQ LDAD7 ;
;
LDACC: A6 01 LDAA 1,X ; 55.0 Kpa
LDACE: BB D2 40 ADDA LD240 ; 6, 1.9KPa hyst on cell boundy
LDAD1: 25 04 BCS LDAD7 ;
;
LDAD3: 91 25 CMPA L0025 ; s/d map, KPa = (N * 0.3125) + 20
LDAD5: 25 04 BCS LDADB ;
;
LDAD7: D6 A0 LDAB L00A0 ; blm cell # in current use
LDAD9: 20 32 BRA LDB0D ;

;
; New cell in use, calc which one
;
LDADB: 96 0D LDAA L000D ; status word
LDADD: 8A 0C ORAA #$0C ; flag new cell in use, reset int
LDADF: 97 0D STAA L000D ; status word
;
LDAE1: 5F CLRB ;
LDAE2: 96 1B LDAA L001B ; rpm / 25
LDAE4: B1 D2 39 CMPA LD239 ; 32, 800 rpm
LDAE7: 25 0D BCS LDAF6 ;
LDAE9: 5C INCB ;
LDAEA: B1 D2 3A CMPA LD23A ; 64, 1600 rpm
LDAED: 25 07 BCS LDAF6 ;
LDAEF: 5C INCB ;
LDAF0: B1 D2 3B CMPA LD23B ; 96, 2400 rpm
LDAF3: 25 01 BCS LDAF6 ;
LDAF5: 5C INCB ;
;
LDAF6: 96 25 LDAA L0025 ; s/d map, KPa = (N * 0.3125) + 20
LDAF8: B1 D2 3C CMPA LD23C ; cell boundry, 29.4 Kpa
LDAFB: 25 10 BCS LDB0D ;
LDAFD: CB 04 ADDB #4 ;
LDAFF: B1 D2 3D CMPA LD23D ; cell boundry, 55 Kpa
LDB02: 25 09 BCS LDB0D ;
LDB04: CB 04 ADDB #4 ;
LDB06: B1 D2 3E CMPA LD23E ; cell boundry, 75 Kpa
LDB09: 25 02 BCS LDB0D ;
LDB0B: CB 04 ADDB #4 ;
;
LDB0D: CE 00 ED LDX #$00ED ; BLM Cells
LDB10: 3A ABX ;
LDB11: A6 00 LDAA 0,X ; get current cell value
LDB13: B1 D2 46 CMPA LD246 ; 150, max blm
LDB16: 22 05 BHI LDB1D ;
LDB18: B1 D2 47 CMPA LD247 ; 108, min blm
LDB1B: 24 09 BCC LDB26 ;

;
; trouble, cell is outa' limit terms
;
LDB1D: 96 07 LDAA L0007 ; status word
LDB1F: 8A 40 ORAA #$40 ;
LDB21: 97 07 STAA L0007 ; status word
;
LDB23: BD FD D7 JSR LFDD7 ; Set all BLM cells to 128
LDB26: 97 A1 STAA L00A1 ; BLM, bin val
LDB28: D7 A0 STAB L00A0 ; blm cell # in current use

;
; check if EGR active
;
LDB2A: D6 DF LDAB L00DF ; status word
LDB2C: C5 02 BITB #$02 ; tst b1
LDB2E: 27 0C BEQ LDB3C ; bra if b1 == 0, EGR active bit

;
; Do EGR lookup of Injector Constant
;
LDB30: 96 2E LDAA L002E ; vac
LDB32: 43 COMA ; 1's comp
LDB33: 81 40 CMPA #64 ;
LDB35: 23 0D BLS LDB44 ;
;
LDB37: 44 LSRA ;
LDB38: 8B 60 ADDA #96 ;
LDB3A: 20 09 BRA LDB45 ; go do lookup

;
; Do Egr off Injector Constant
;
LDB3C: B6 D2 41 LDAA LD241 ; 135, Injector Constant, egr off
LDB3F: F6 D2 42 LDAB LD242 ; filt coef, 32
LDB42: 20 0A BRA LDB4E ; go filter it

;
; do lookup of egr on Injector Constant
;
LDB44: 48 ASLA ;
;
LDB45: CE D2 A1 LDX #$D2A1 ;
LDB48: BD FB 82 JSR LFB82 ; 2d lkup w/upr limt in 1st tbl entry
LDB4B: F6 D2 43 LDAB LD243 ; filt coef, 28
;
LDB4E: DE A6 LDX L00A6 ; inj cnst, egr lag filtered
LDB50: BD FB 40 JSR LFB40 ; Lag Filter
LDB53: DD A6 STD L00A6 ; inj cnst, egr lag filtered
LDB55: 58 LSLB ; round up A
LDB56: 89 00 ADCA #0 ;
LDB58: 36 PSHA ; save inj cnst

;
; Do iat correction to inj cnst
;
LDB59: CE D3 A6 LDX #$D3A6 ; iat correction to Inj Cnst
LDB5C: 96 24 LDAA L0024 ; iat, 1k pu, inverse, adc cnts
LDB5E: 43 COMA ; 1's comp
LDB5F: 44 LSRA ; A /= 2
LDB60: C6 50 LDAB #80 ; lower limit for lookup
LDB62: BD FB 91 JSR LFB91 ; 2d lkup w/SBA
LDB65: 33 PULB ; get inj cnst
LDB66: 3D MUL ; (A * B) / 128
LDB67: 05 LSLD ; (Inj Cnst * Mult) / 128
LDB68: 24 02 BCC LDB6C ; bra if no ovrflw
LDB6A: 86 FF LDAA #255 ;
;
;
; Check option byte to do baro adjustment on inj cnst
;
LDB6C: F6 D0 06 LDAB LD006 ; option byte: 0001 0001
LDB6F: C5 08 BITB #$08 ; b3 == 0
LDB71: 26 0E BNE LDB81 ; do not bra
LDB73: 36 PSHA ; save inj cnst

;
; Do Baro Adjustment on Injector Cnst
;
LDB74: CE D3 AA LDX #$D3AA ; BPW Injector Constant Mult vs Baro
LDB77: BD FB 6F JSR LFB6F ; get baro & do 2d lkup
LDB7A: 33 PULB ; get inj cnst
LDB7B: 3D MUL ;
LDB7C: 05 LSLD ; AB *= 2
LDB7D: 24 02 BCC LDB81 ; bra if no ovrflw
LDB7F: 86 FF LDAA #255 ;
;
LDB81: 97 A5 STAA L00A5 ; Injector Constant

;-----------------------------------------------
;
;
;-----------------------------------------------

LDB83: 96 66 LDAA L0066 ; 160Hz rts counter
LDB85: 85 04 BITA #$04 ;
LDB87: 26 03 BNE LDB8C ;
LDB89: 7E DC 40 JMP LDC40 ; JMP LE3D4, return to rts loop

;-----------------------------------------------
;
;
;-----------------------------------------------

LDB8C: 96 9A LDAA L009A ; transient fuel calc interval timer (for tps/map filters)
LDB8E: 26 29 BNE LDBB9 ;
LDB90: B6 D2 23 LDAA LD223 ; 0
LDB93: 97 9A STAA L009A ; transient fuel calc interval timer (for tps/map filters)

;
; lag filter tps% term
;
LDB95: F6 D2 24 LDAB LD224 ; filt coef, 16
LDB98: DE 45 LDX L0045 ; tps%, slow filtered
LDB9A: 96 43 LDAA L0043 ; tps%, from idle
LDB9C: BD FB 40 JSR LFB40 ; Lag Filter
LDB9F: DD 45 STD L0045 ; tps%, slow filtered
;
;
; lag filter slo map term
;
LDBA1: F6 D2 27 LDAB LD227 ; filt coef, 37
LDBA4: 96 21 LDAA L0021 ; coolant, defaulted, 1k pu, inverse, adc cnts
LDBA6: B1 D2 25 CMPA LD225 ; 64
LDBA9: 25 03 BCS LDBAE ; bra if coolant > thres
;
LDBAB: F6 D2 26 LDAB LD226 ; filt coef, 20
;
LDBAE: DE 2C LDX L002C ; s/d map, slo filtered from L0025
LDBB0: 96 25 LDAA L0025 ; s/d map, KPa = (N * 0.3125) + 20
LDBB2: BD FB 40 JSR LFB40 ; Lag Filter
LDBB5: DD 2C STD L002C ; s/d map, slo filtered from L0025
;
LDBB7: 20 03 BRA LDBBC ;

;
;
;
LDBB9: 7A 00 9A DEC L009A ; transient fuel calc interval timer (for tps/map filters)
;
;-----------------------------------------------
;
; Check if time to move BLM
;
;-----------------------------------------------

LDBBC: 96 0E LDAA L000E ; status word, a/f mode
LDBBE: 85 02 BITA #$02 ; learn enable bit
LDBC0: 27 6F BEQ LDC31 ; bra to not move BLM
;
LDBC2: 96 0D LDAA L000D ; status word
LDBC4: 85 08 BITA #$08 ;
LDBC6: 26 69 BNE LDC31 ; bra to not move BLM
;
LDBC8: 96 A2 LDAA L00A2 ; integrator
LDBCA: 81 80 CMPA #128 ; tst if INT @ neutral of 128
LDBCC: 27 63 BEQ LDC31 ; bra to not move BLM
;
;
; check INT delay timer
;
LDBCE: D6 B6 LDAB L00B6 ; integrator delay tmr
LDBD0: 5C INCB ; adv timer
LDBD1: 2B 07 BMI LDBDA ; bra if ovrflw
;
LDBD3: D7 B6 STAB L00B6 ; integrator delay tmr
LDBD5: 58 LSLB ; B /= 2
LDBD6: D1 AF CMPB L00AF ; INTegrator timer term
LDBD8: 25 5C BCS LDC36 ; bra to not move BLM
;
;
; check BLM delay timer
;
LDBDA: D6 B5 LDAB L00B5 ; blk learn tmr
LDBDC: 5C INCB ;
LDBDD: 27 07 BEQ LDBE6 ;
;
LDBDF: D7 B5 STAB L00B5 ; blk learn tmr
LDBE1: F1 D2 38 CMPB LD238 ; 12, blm update time
LDBE4: 25 50 BCS LDC36 ; bra to not move BLM
;
LDBE6: 80 80 SUBA #128 ; normalize INT to 0
LDBE8: 25 0D BCS LDBF7 ; bra if int removing fuel, < 128

;
; check if enough + delta int to move blm
;
LDBEA: B1 D2 44 CMPA LD244 ; 3, INT delta from 128 to move blm cell
LDBED: 23 47 BLS LDC36 ;
LDBEF: 96 0E LDAA L000E ; status word, a/f mode
LDBF1: 85 40 BITA #$40 ; b6, fast R/L direction bit
LDBF3: 26 41 BNE LDC36 ; if b6, rich, do not update BLM (rich & adding fuel)
LDBF5: 20 0C BRA LDC03 ;

;
; check if enough - delta int to move blm
;
LDBF7: 40 NEGA ;
LDBF8: B1 D2 44 CMPA LD244 ; 3, INT delta from 128 to move blm cell
LDBFB: 23 39 BLS LDC36 ;
LDBFD: 96 0E LDAA L000E ; status word, a/f mode
LDBFF: 85 40 BITA #$40 ; b6, fast R/L direction bit
LDC01: 27 33 BEQ LDC36 ; bra if not b6, lean

;
; Time to adjust the current blm cell
;
LDC03: CE 00 ED LDX #$00ED ; BLM Cells
LDC06: D6 A0 LDAB L00A0 ; blm cell # in current use
LDC08: 3A ABX ;
LDC09: A6 00 LDAA 0,X ; get current blm cell val
;
LDC0B: D6 0E LDAB L000E ; status word, a/f mode
LDC0D: C5 40 BITB #$40 ;
LDC0F: 27 0F BEQ LDC20 ;
;
;
; remove fuel from blm
;
LDC11: B0 D2 45 SUBA LD245 ; blm modifier, 1
LDC14: 25 05 BCS LDC1B ;
;
LDC16: B1 D2 47 CMPA LD247 ; 108, min blm
LDC19: 24 12 BCC LDC2D ; bra if blm >= min
;
LDC1B: B6 D2 47 LDAA LD247 ; 108, min blm
LDC1E: 20 0D BRA LDC2D ;

;
; add fuel to blm
;
LDC20: BB D2 45 ADDA LD245 ; blm modifier, 1
LDC23: 25 05 BCS LDC2A ;
;
LDC25: B1 D2 46 CMPA LD246 ; 150, max blm
LDC28: 23 03 BLS LDC2D ; bra if blm <= max
;
LDC2A: B6 D2 46 LDAA LD246 ; 150, max blm

;
; misc blm/prop/int work
;
LDC2D: A7 00 STAA 0,X ; save new cell value
LDC2F: 97 A1 STAA L00A1 ; BLM, bin val
;
LDC31: 5F CLRB ; clr B
LDC32: D7 B6 STAB L00B6 ; integrator delay tmr
LDC34: D7 B5 STAB L00B5 ; blk learn tmr
;
LDC36: 96 0D LDAA L000D ; status word
LDC38: 84 F7 ANDA #$F7 ; 1111 0111
LDC3A: 97 0D STAA L000D ; status word
;
LDC3C: 96 1D LDAA L001D ; rpm / 12.5, filtered
LDC3E: 97 1F STAA L001F ; rpm / 12.5, filtered, one delayed
LDC40: 7E E3 D4 JMP LE3D4 ; return to rts loop

;-----------------------------------------------
; End of Fuel Loop 1
;-----------------------------------------------

;*==================================================
;*
;* Enter Fuel Loop2
;*
;*==================================================

;
; Check whether O2 is good for closed loop
;
LDC43: 96 01 LDAA L0001 ; status word
LDC45: 2A 23 BPL LDC6A ; Engine is not Running
;
LDC47: 96 0E LDAA L000E ; status word, a/f mode
LDC49: 2B 08 BMI LDC53 ; bra if closed loop
;
LDC4B: B6 D2 4A LDAA LD24A ; O2 val to go clsd lp, 556mv
LDC4E: F6 D2 4B LDAB LD24B ; O2 val to go clsd lp, 243mv
LDC51: 20 06 BRA LDC59 ;
;
LDC53: B6 D2 48 LDAA LD248 ; O2 val to stay clsd lp, 811mv
LDC56: F6 D2 49 LDAB LD249 ; O2 val to stay clsd lp, 365mv
;
LDC59: 91 39 CMPA L0039 ; O2, adc, filtered, round up from L003A
LDC5B: 25 04 BCS LDC61 ; bra if clsd lp ok
;
LDC5D: D1 39 CMPB L0039 ; O2, adc, filtered, round up from L003A
LDC5F: 23 09 BLS LDC6A ; bra if clsd lp not ok
;
LDC61: 7F 00 9B CLR L009B ; clear closed loop timeout timer
LDC64: D6 DE LDAB L00DE ; status word
LDC66: CA 01 ORAB #1 ; set b0, ok to go closed loop
LDC68: D7 DE STAB L00DE ; status word

;
; calc gms/sec airflow
;
; simplified:
;
; gms/sec = ( (((map * 120d) / 256) + 18) * (rpm / 12.5) ) / 256
;
;
LDC6A: 96 2B LDAA L002B ; map term for BPW & gms/sec calc's
LDC6C: F6 D2 81 LDAB LD281 ; 120, constant
LDC6F: 3D MUL ;
LDC70: BB D2 82 ADDA LD282 ; 18, add in offset
LDC73: B1 D2 84 CMPA LD284 ; 100, max map term
LDC76: 23 03 BLS LDC7B ;
LDC78: B6 D2 84 LDAA LD284 ; 100
;
LDC7B: D6 1B LDAB L001B ; rpm / 25
LDC7D: 58 LSLB ; B *= 2, now rpm / 12.5
LDC7E: 25 05 BCS LDC85 ;
LDC80: F1 D2 83 CMPB LD283 ; 164, max rpm term
LDC83: 23 03 BLS LDC88 ;
LDC85: F6 D2 83 LDAB LD283 ; 164
;
LDC88: 3D MUL ; map term * rpm
LDC89: 81 40 CMPA #64 ; max airflow val
LDC8B: 23 02 BLS LDC8F ; bra if <= 64
;
LDC8D: 86 40 LDAA #64 ; load max allowed
LDC8F: 97 BA STAA L00BA ; gms/sec, limited to 64

;-------------------------------------------------
;
; Four Pass Loop
;
; Table lookups are by gms/sec airflow
;
; L004D: mean R/L O2 threshold
; L004E: rich O2 threshold
; L004F: lean O2 threshold
; L00AF: INT delay
;-------------------------------------------------

LDC91: C6 03 LDAB #3 ; do 4 tables
LDC93: 96 02 LDAA L0002 ; status word
LDC95: 2A 0B BPL LDCA2 ; bra if not in idle
;
LDC97: B6 D2 4C LDAA LD24C ; 132, sub val for in idle
LDC9A: 97 4E STAA L004E ;
LDC9C: FC D2 4D LDD LD24D ; 159, 160, sub vals for in idle
LDC9F: DD 4F STD L004F ; tmp storage
LDCA1: 5F CLRB ;
;
LDCA2: D7 4C STAB L004C ; loop cnt, 0 | 3 <<<<
LDCA4: 86 05 LDAA #5 ; lines per table
LDCA6: 3D MUL ; nxt tbl addr offset
LDCA7: CE D3 CA LDX #$D3CA ; first tbl addr
LDCAA: 3A ABX ; add in offset
LDCAB: 96 BA LDAA L00BA ; gms/sec, limited to 64
LDCAD: BD FB 95 JSR LFB95 ; 2d lkup
LDCB0: CE 00 4D LDX #$004D ;
LDCB3: D6 4C LDAB L004C ;
LDCB5: 27 06 BEQ LDCBD ; done w/lkup's>>>
LDCB7: 3A ABX ;
LDCB8: A7 00 STAA 0,X ;
LDCBA: 5A DECB ;
LDCBB: 20 E5 BRA LDCA2 ; do next tbl>>>
;
LDCBD: 97 AF STAA L00AF ; save from last lkup
; INTegrator timer term

;-------------------------------------------------
;
; Check & flag direction of O2 value, fast filt minor loop
;
;-------------------------------------------------

LDCBF: D6 0E LDAB L000E ; status word, a/f mode
LDCC1: 96 4E LDAA L004E ; mean R/L threshold from lookup
LDCC3: BB D2 7F ADDA LD27F ; 156 mvdc, O2 window for fast O2 r/l
LDCC6: 25 04 BCS LDCCC ; bra if ovrflw
;
LDCC8: 91 3A CMPA L003A ; O2, minor loop filtered
LDCCA: 25 15 BCS LDCE1 ; go set rich direction flag, filt O2 > mean R/L
;
LDCCC: 96 4E LDAA L004E ;
LDCCE: B0 D2 7F SUBA LD27F ; 156 mvdc, O2 window for fast O2 r/l
LDCD1: 25 04 BCS LDCD7 ; bra if underflow
;
LDCD3: 91 3A CMPA L003A ; O2, minor loop filtered
LDCD5: 22 06 BHI LDCDD ; bra if O2 < fast filt - fast O2 R/L bias
;
LDCD7: 96 3A LDAA L003A ; O2, minor loop filtered
LDCD9: 91 B9 CMPA L00B9 ; O2, minor loop filtered, one delayed from L003A
LDCDB: 22 04 BHI LDCE1 ; bra if O2 richer than one delayed O2
;
;
; set as leaner
;
LDCDD: C4 BF ANDB #$BF ; clr b6, L000E, rich bit: show leaner
LDCDF: 20 02 BRA LDCE3 ;
;
;
; set as richer
;
LDCE1: CA 40 ORAB #$40 ; set b6, richer

;
;
;
LDCE3: D1 0E CMPB L000E ; a/f mode word flag, test for x-cnt
LDCE5: 27 0C BEQ LDCF3 ; bra if no change in Richer/Leaner bit
;
;
; Increment O2 Cross Counts
;
LDCE7: 7C 00 B7 INC L00B7 ; x-counts
;
LDCEA: 96 06 LDAA L0006 ;
LDCEC: 8A 10 ORAA #$10 ; set b4, x-cnt occurred
LDCEE: 97 06 STAA L0006 ;
;
LDCF0: 4F CLRA ; clear prop timer
LDCF1: 20 05 BRA LDCF8 ;
;
;
; incr prop duration timer
;
LDCF3: 96 BB LDAA L00BB ; proportional timer for CLT
LDCF5: 4C INCA ;
LDCF6: 27 02 BEQ LDCFA ;
;
LDCF8: 97 BB STAA L00BB ; proportional timer for CLT

;
; check if need to reset INT
;
LDCFA: D7 0E STAB L000E ; status word, a/f mode
LDCFC: 2A 72 BPL LDD70 ; bra if not closed loop, reset int to 128
;
LDCFE: 96 05 LDAA L0005 ;
LDD00: 85 02 BITA #$02 ; b1, ????
LDD02: 27 06 BEQ LDD0A ; bra if b1 == 0
;
LDD04: 84 FD ANDA #$FD ; clr b1, 1111 1101
LDD06: 97 05 STAA L0005 ;
LDD08: 20 66 BRA LDD70 ; bra reset int to 128

;
; reset int if one of these
;
LDD0A: 96 0F LDAA L000F ; status word
LDD0C: 85 10 BITA #$10 ; in hiway fuel bit
LDD0E: 26 5A BNE LDD6A ; bra if in hiway fuel
;
LDD10: 96 07 LDAA L0007 ; status word
LDD12: 85 08 BITA #$08 ; DFCO flag
LDD14: 26 54 BNE LDD6A ; bra if in dfco
;
LDD16: D6 0D LDAB L000D ; status word
LDD18: 2B 50 BMI LDD6A ; bra if in PE/WOT mode
;
;
; ae int reset test
;
LDD1A: F6 D0 06 LDAB LD006 ; option byte: 0001 0001
LDD1D: C5 20 BITB #$20 ; bit 5, if set reset INT on AE
LDD1F: 27 0C BEQ LDD2D ; bra if b5 == 0, chk other for INT reset
;
LDD21: D6 0D LDAB L000D ; status word
LDD23: C5 40 BITB #$40 ; b6, need to reset int on ae mode
LDD25: 27 06 BEQ LDD2D ; bra if == 0, no int reset on ae
;
LDD27: C4 BF ANDB #$BF ; clr b6, 1011 1111
LDD29: D7 0D STAB L000D ; status word
LDD2B: 20 43 BRA LDD70 ; bra reset int to 128

;
; decel enleanment int reset test
;
LDD2D: D6 0D LDAB L000D ; status word
LDD2F: C5 10 BITB #$10 ; decel enleanment in effect
LDD31: 27 0C BEQ LDD3F ; bra if no decel enleanment
;
LDD33: 96 0E LDAA L000E ; status word, a/f mode
LDD35: 85 40 BITA #$40 ; b6, rich
LDD37: 26 47 BNE LDD80 ; bra if b6, rich, skip reset of INT
;
LDD39: 96 A2 LDAA L00A2 ; integrator
LDD3B: 2A 43 BPL LDD80 ; bra if int < 128, no reset
;
LDD3D: 20 31 BRA LDD70 ; bra reset int to 128
;
;
; blm cell change int reset test
;
LDD3F: F6 D0 06 LDAB LD006 ; option byte: 0001 0001
LDD42: C5 10 BITB #$10 ; b4, 1 = do int reset on blm cell change
LDD44: 27 06 BEQ LDD4C ; bra for no int reset on blm cell change
;
LDD46: 96 0D LDAA L000D ; status word
LDD48: 85 04 BITA #$04 ; blm cell change bit
LDD4A: 26 24 BNE LDD70 ; bra if == 1, go reset int
;
;
; test for aldl mode
;
LDD4C: D6 02 LDAB L0002 ; status word
LDD4E: C5 20 BITB #$20 ; b5, aldl mode forced closed loop (10K)
LDD50: 26 2E BNE LDD80 ; bra if b5, closed loop, do not reset INT
;
;
; Ck Decel Qual's
;
LDD52: D6 25 LDAB L0025 ; s/d map, KPa = (N * 0.3125) + 20
LDD54: F1 D2 4F CMPB LD24F ; cls lp decel, enlean map thresh. (26 kpa)
LDD57: 22 27 BHI LDD80 ; bra if map > thresh, no INT reset
;
LDD59: D6 1B LDAB L001B ; rpm / 25
LDD5B: F1 D2 50 CMPB LD250 ; cls lp decel, enlean rpm thresh. (1000 rpm)
LDD5E: 23 20 BLS LDD80 ; bra if <= 1000 rpm
;
LDD60: 96 0E LDAA L000E ; status word, a/f mode
LDD62: 85 40 BITA #$40 ; b6, rich
LDD64: 26 1A BNE LDD80 ; bra if b6, no INT reset
;
LDD66: 96 A2 LDAA L00A2 ; integrator
LDD68: 2A 16 BPL LDD80 ; subbing fuel, no INT reset

;
; set bit & clear INT stuff
;
LDD6A: 96 0A LDAA L000A ; status word
LDD6C: 8A 04 ORAA #$04 ; set b2
LDD6E: 97 0A STAA L000A ; status word

;
; Do INT reset & filtered O2
;
LDD70: 86 66 LDAA #102 ; 443 mV
LDD72: 97 3E STAA L003E ; O2, filtered vs. airflow
;
LDD74: 86 80 LDAA #128 ; neutral val
LDD76: 97 A2 STAA L00A2 ; integrator
LDD78: 4F CLRA ;
LDD79: 97 AE STAA L00AE ; integrator delay timer
LDD7B: 97 B8 STAA L00B8 ; proportional gain term
LDD7D: 7E DE 90 JMP LDE90 ; do closed-loop-correction-term

;-------------------------------------------------
;
; Calculate O2 Error Value
;
;-------------------------------------------------

LDD80: D6 07 LDAB L0007 ; status word
LDD82: 96 3E LDAA L003E ; O2, slo filtered vs. airflow
LDD84: 91 4F CMPA L004F ; rich O2 threshold (tmp)
LDD86: 22 0C BHI LDD94 ; bra if O2 > rich O2 threshold
;
LDD88: 90 50 SUBA L0050 ; lean O2 threshold (tmp)
LDD8A: 25 03 BCS LDD8F ; bra if O2 < lean O2 threshold
;
;
; inside of rich/lean O2 thresholds
;
LDD8C: 4F CLRA ; O2 error is zero
LDD8D: 20 21 BRA LDDB0 ; bra to save O2 error term
;
;
; O2 val < lean threshold
;
LDD8F: 40 NEGA ; 2's comp of O2 error
LDD90: C4 FD ANDB #$FD ; clear b1 of L0007, R/L Flag, slo O2
LDD92: 20 0A BRA LDD9E ;
;
;
; O2 val > rich O2 threshold
;
LDD94: 90 4F SUBA L004F ; tmp storage
LDD96: F6 D2 8B LDAB LD28B ; 232,
LDD99: 3D MUL ;
LDD9A: D6 07 LDAB L0007 ; status word
LDD9C: CA 02 ORAB #2 ;

;
; continue calc of O2 err term
;
LDD9E: D7 07 STAB L0007 ; status word
LDDA0: 97 4E STAA L004E ;
;
LDDA2: D6 02 LDAB L0002 ; status word
LDDA4: 2A 04 BPL LDDAA ; bra if not in idle
;
LDDA6: F6 D2 8C LDAB LD28C ; 208, O2 err term multiplier for in idle
LDDA9: 3D MUL ;
;
LDDAA: 81 60 CMPA #96 ;
LDDAC: 23 02 BLS LDDB0 ;
;
LDDAE: 86 60 LDAA #96 ;
;
LDDB0: B7 04 5D STAA L045D ; HU ram for O2 err term
LDDB3: 48 ASLA ; O2 Err *= 2
LDDB4: 97 4E STAA L004E ; O2 Err Term * 2
;
LDDB6: CE D3 E3 LDX #$D3E3 ;
LDDB9: BD FB 95 JSR LFB95 ; 2d lkup
LDDBC: 97 B8 STAA L00B8 ; proportional gain term
;
LDDBE: D6 02 LDAB L0002 ; status word
LDDC0: 2A 28 BPL LDDEA ; bra if not in idle
;
;
; additional idle stuff
;
LDDC2: B6 D2 86 LDAA LD286 ; 9, prop duration offset for in idle
LDDC5: 36 PSHA ;
;
LDDC6: CE D2 87 LDX #$D287 ;
LDDC9: DC 0E LDD L000E ; status word, a/f mode & L000F
LDDCB: 85 40 BITA #$40 ;
LDDCD: 26 02 BNE LDDD1 ;
;
LDDCF: C8 84 EORB #$84 ; toggle b7 & b2 of L000F
;
LDDD1: C5 08 BITB #$08 ; tst b3 of L000F
LDDD3: 27 04 BEQ LDDD9 ;
;
LDDD5: C5 04 BITB #$04 ;
LDDD7: 26 09 BNE LDDE2 ;
;
LDDD9: C5 40 BITB #$40 ;
LDDDB: 27 04 BEQ LDDE1 ;
;
LDDDD: C5 80 BITB #$80 ; test idle level
LDDDF: 26 01 BNE LDDE2 ;
;
LDDE1: 08 INX ;
;
LDDE2: A6 02 LDAA 2,X ; mean R/L O2 threshold for idle
LDDE4: 97 4D STAA L004D ; save mean R/L O2 threshold for idle
LDDE6: A6 00 LDAA 0,X ; prop gain multiplier
LDDE8: 20 11 BRA LDDFB ;
;
;
;
; Not in idle here
;
LDDEA: 96 4E LDAA L004E ; O2 Err Term * 2
LDDEC: CE D3 F0 LDX #$D3F0 ;
LDDEF: BD FB 95 JSR LFB95 ; 2d lkup
LDDF2: 36 PSHA ;
;
LDDF3: 96 BA LDAA L00BA ; gms/sec, limited to 64
LDDF5: CE D4 02 LDX #$D402 ;
LDDF8: BD FB 95 JSR LFB95 ; 2d lkup
;
;
;
;
;
LDDFB: D6 B8 LDAB L00B8 ; proportional gain term
LDDFD: 3D MUL ;
LDDFE: 89 00 ADCA #0 ;
LDE00: 97 B8 STAA L00B8 ; proportional gain term

;
;
;
LDE02: 96 BA LDAA L00BA ; gms/sec, limited to 64
LDE04: CE D3 FD LDX #$D3FD ;
LDE07: BD FB 95 JSR LFB95 ; 2d lkup
LDE0A: 33 PULB ;
LDE0B: 1B ABA ; add to prop duration
LDE0C: 24 02 BCC LDE10 ;
LDE0E: 86 FF LDAA #255 ;
;
LDE10: 97 50 STAA L0050 ; final prop duration term
;
LDE12: 96 4E LDAA L004E ; O2 Err Term * 2
LDE14: CE D4 07 LDX #$D407 ;
LDE17: BD FB 95 JSR LFB95 ; 2d lkup
LDE1A: D6 AF LDAB L00AF ; INTegrator timer term
LDE1C: 3D MUL ;
LDE1D: D6 02 LDAB L0002 ; status word
LDE1F: 2A 06 BPL LDE27 ; bra if not in idle
;
LDE21: 9B 4D ADDA L004D ;
LDE23: 24 02 BCC LDE27 ;
LDE25: 86 FF LDAA #255 ;
;
LDE27: 97 AF STAA L00AF ; INTegrator timer term
LDE29: B7 04 5E STAA L045E ; HU ram
;
;
LDE2C: 96 07 LDAA L0007 ; status word
LDE2E: 84 02 ANDA #$02 ;
LDE30: D6 0E LDAB L000E ; status word, a/f mode
LDE32: C4 40 ANDB #$40 ;
LDE34: 1B ABA ;
LDE35: 27 0D BEQ LDE44 ;
;
LDE37: 81 42 CMPA #66 ;
LDE39: 27 09 BEQ LDE44 ;
;
LDE3B: 96 B8 LDAA L00B8 ; proportional gain term
LDE3D: 27 0C BEQ LDE4B ;
;
LDE3F: 7A 00 B8 DEC L00B8 ; proportional gain term
LDE42: 20 07 BRA LDE4B ;
;
;
LDE44: 96 4E LDAA L004E ; O2 Err Term
LDE46: B1 D2 80 CMPA LD280 ; 0
LDE49: 22 0E BHI LDE59 ;
;
LDE4B: 7F 00 AE CLR L00AE ; integrator delay timer
LDE4E: 96 BB LDAA L00BB ; proportional timer for CLT
LDE50: 91 50 CMPA L0050 ;
LDE52: 23 2B BLS LDE7F ;
;
LDE54: 7F 00 B8 CLR L00B8 ; proportional gain term
LDE57: 20 26 BRA LDE7F ;
;
LDE59: 96 AE LDAA L00AE ; integrator delay timer
LDE5B: 91 AF CMPA L00AF ; INTegrator timer term
LDE5D: 25 03 BCS LDE62 ;
LDE5F: 4F CLRA ;
LDE60: 20 01 BRA LDE63 ;
;
LDE62: 4C INCA ;
;
LDE63: 97 AE STAA L00AE ; integrator delay timer
LDE65: 26 18 BNE LDE7F ;
;
;
; time to move INT
;
LDE67: 96 A2 LDAA L00A2 ; integrator
LDE69: D6 07 LDAB L0007 ; status word
LDE6B: C5 02 BITB #$02 ;
LDE6D: 26 08 BNE LDE77 ;
;
LDE6F: B1 D2 52 CMPA LD252 ; 158, max int
LDE72: 27 09 BEQ LDE7D ;
;
LDE74: 4C INCA ; incr INT
LDE75: 20 06 BRA LDE7D ;
;
LDE77: B1 D2 51 CMPA LD251 ; 40, min int
LDE7A: 27 01 BEQ LDE7D ;
;
LDE7C: 4A DECA ; decr INT

;
; save new INT value
;
LDE7D: 97 A2 STAA L00A2 ; integrator
;
LDE7F: 96 B8 LDAA L00B8 ; proportional gain term
LDE81: D6 0E LDAB L000E ; status word, a/f mode
LDE83: C5 40 BITB #$40 ;
LDE85: 27 09 BEQ LDE90 ;
;
LDE87: 96 A2 LDAA L00A2 ; integrator
LDE89: 90 B8 SUBA L00B8 ; proportional gain term
LDE8B: 24 09 BCC LDE96 ;
;
LDE8D: 4F CLRA ;
LDE8E: 20 06 BRA LDE96 ;
LDE90: 9B A2 ADDA L00A2 ; integrator
LDE92: 24 02 BCC LDE96 ;
;
LDE94: 86 FF LDAA #255 ;
LDE96: 80 80 SUBA #128 ;
LDE98: 97 B0 STAA L00B0 ; closed loop correction term
;
LDE9A: B6 D4 3C LDAA LD43C ; diag mask 3, 1111 0011
LDE9D: 85 02 BITA #$02 ;
LDE9F: 27 3C BEQ LDEDD ;
;
LDEA1: 96 00 LDAA L0000 ; status word
LDEA3: D6 09 LDAB L0009 ; status word
LDEA5: 85 10 BITA #$10 ; engine shutdown
LDEA7: 27 04 BEQ LDEAD ;
;
LDEA9: C4 FD ANDB #$FD ;
LDEAB: 20 2E BRA LDEDB ;
;
LDEAD: C5 04 BITB #$04 ;
LDEAF: 26 2C BNE LDEDD ;
;
LDEB1: B6 08 81 LDAA L0881 ; MCU1 I/O
LDEB4: 85 20 BITA #$20 ;
LDEB6: 27 21 BEQ LDED9 ;
;
LDEB8: 96 01 LDAA L0001 ; status word
LDEBA: 2B 21 BMI LDEDD ; Engine is Running
;
LDEBC: D6 96 LDAB L0096 ; fuel pump volts diag timer
LDEBE: 5C INCB ;
LDEBF: F1 D4 98 CMPB LD498 ;
LDEC2: 23 1A BLS LDEDE ;
;
LDEC4: 96 41 LDAA L0041 ; Pump Volts, * 10, adc cnts
LDEC6: D6 09 LDAB L0009 ; status word
LDEC8: 81 28 CMPA #40 ; 4.0v
LDECA: 24 0D BCC LDED9 ;
;
LDECC: 96 E3 LDAA L00E3 ;
LDECE: 8A 02 ORAA #$02 ;
LDED0: 97 E3 STAA L00E3 ;
LDED2: BD FD 1A JSR LFD1A ; Do CkSum on Error Flags
LDED5: 97 EA STAA L00EA ; error flag cksum
LDED7: CA 02 ORAB #$02 ;
LDED9: CA 04 ORAB #$04 ;
LDEDB: D7 09 STAB L0009 ; status word
;
;
LDEDD: 5F CLRB ;
LDEDE: D7 96 STAB L0096 ; fuel pump volts diag timer
LDEE0: 7E DC 40 JMP LDC40 ; JMP LE3D4, return to rts loop

;-----------------------------------------------
;
; Misc 80Hz stuff
;
;-----------------------------------------------

LDEE3: F6 08 01 LDAB L0801 ; MCU2 I/O
LDEE6: B6 D0 07 LDAA LD007 ; option byte: 0010 0100
LDEE9: 85 04 BITA #$04 ; b2 == 1
LDEEB: 27 02 BEQ LDEEF ; do not bra
LDEED: C8 40 EORB #$40 ;
;
LDEEF: 96 10 LDAA L0010 ; status word
LDEF1: 84 E3 ANDA #$E3 ;
LDEF3: C5 40 BITB #$40 ;
LDEF5: 26 02 BNE LDEF9 ;
LDEF7: 8A 04 ORAA #$04 ;
;
LDEF9: C5 10 BITB #$10 ;
LDEFB: 27 02 BEQ LDEFF ;
LDEFD: 8A 10 ORAA #$10 ;
LDEFF: 5D TSTB ;
LDF00: 2B 02 BMI LDF04 ; bra if A/C not requested
LDF02: 8A 08 ORAA #$08 ; set A/C on bit
;
LDF04: 97 10 STAA L0010 ; status word
LDF06: D6 02 LDAB L0002 ; status word
LDF08: C5 20 BITB #$20 ;
LDF0A: 27 15 BEQ LDF21 ;
LDF0C: D6 1B LDAB L001B ; rpm / 25
LDF0E: F1 D5 23 CMPB LD523 ;
LDF11: 23 0E BLS LDF21 ;
LDF13: D6 E0 LDAB L00E0 ; status word
LDF15: C5 08 BITB #$08 ;
LDF17: 26 08 BNE LDF21 ;
LDF19: CA 08 ORAB #$08 ;
LDF1B: D7 E0 STAB L00E0 ; status word
LDF1D: 84 FE ANDA #$FE ;
LDF1F: 20 0E BRA LDF2F ;
;
LDF21: 85 01 BITA #$01 ;
LDF23: 26 2D BNE LDF52 ;
LDF25: 85 02 BITA #$02 ;
LDF27: 26 12 BNE LDF3B ;
LDF29: D6 00 LDAB L0000 ; status word
LDF2B: C5 20 BITB #$20 ;
LDF2D: 27 23 BEQ LDF52 ;
;
LDF2F: 8A 02 ORAA #2 ;
LDF31: 97 10 STAA L0010 ; status word
LDF33: F6 D5 1D LDAB LD51D ; 200, retract pulse steps
LDF36: D7 FD STAB L00FD ; Current IAC position, steps
LDF38: 5F CLRB ;
LDF39: D7 C7 STAB L00C7 ; IAC steps, A/C, park position
LDF3B: D6 FD LDAB L00FD ; Current IAC position, steps ;
LDF3D: 27 01 BEQ LDF40 ;
;
LDF3F: 39 RTS ;

;-----------------------------------------------
;
;
;-----------------------------------------------

LDF40: 8A 01 ORAA #1 ;
LDF42: 97 10 STAA L0010 ; status word
LDF44: B6 D5 0F LDAA LD50F ; 40
LDF47: 97 E4 STAA L00E4 ;
;
LDF49: BB D5 10 ADDA LD510 ; 18
LDF4C: 24 02 BCC LDF50 ;
LDF4E: 86 FF LDAA #255 ;
;
LDF50: 97 BE STAA L00BE ;
;
LDF52: D6 00 LDAB L0000 ; status word
LDF54: C5 10 BITB #$10 ; engine shutdown
LDF56: 26 04 BNE LDF5C ; bra if shutting down
;
LDF58: D6 01 LDAB L0001 ; status word
LDF5A: 2B 0E BMI LDF6A ; Engine is Running
;
;
; engine shutdown or not running
;
LDF5C: F6 D5 11 LDAB LD511 ; 160, IAC park position
LDF5F: 96 14 LDAA L0014 ; error flag 3
LDF61: 85 10 BITA #$10 ;
LDF63: 26 02 BNE LDF67 ;
LDF65: D7 C7 STAB L00C7 ; IAC steps, A/C, park position
;
LDF67: 7E E0 FD JMP LE0FD ;

;-----------------------------------------------
;
;
;-----------------------------------------------

LDF6A: D6 07 LDAB L0007 ; status word
LDF6C: C5 08 BITB #$08 ;
LDF6E: 27 0B BEQ LDF7B ;
LDF70: 8D 3E BSR LDFB0 ; set L0010, b6 == 1 & clr B
LDF72: B6 D5 20 LDAA LD520 ;
LDF75: 91 BF CMPA L00BF ; IAC steps, lag filtered
LDF77: 25 02 BCS LDF7B ;
;
LDF79: DD BF STD L00BF ; IAC steps, lag filtered
;
LDF7B: 96 10 LDAA L0010 ; status word
LDF7D: 85 04 BITA #$04 ;
LDF7F: 27 0B BEQ LDF8C ;
;
LDF81: 8D 2D BSR LDFB0 ; set L0010, b6 == 1 & clr B
LDF83: B6 D5 21 LDAA LD521 ;
LDF86: 91 C1 CMPA L00C1 ; IAC steps, lag filtered
LDF88: 25 02 BCS LDF8C ;
LDF8A: DD C1 STD L00C1 ; IAC steps, lag filtered
;
LDF8C: F6 D5 13 LDAB LD513 ; 52, 650 rpm to exit stall saver
LDF8F: 96 10 LDAA L0010 ; status word
LDF91: 2B 03 BMI LDF96 ;
;
LDF93: F6 D5 12 LDAB LD512 ; 38, 475 rpm
LDF96: D1 1D CMPB L001D ; rpm / 12.5, filtered
LDF98: 25 1E BCS LDFB8 ;
;
LDF9A: 8A 80 ORAA #$80 ;
LDF9C: 84 BF ANDA #$BF ;
LDF9E: 97 10 STAA L0010 ; status word

;
; Get IAC steps vs. Baro
;
LDFA0: CE D5 58 LDX #$D558 ; steps vs. baro
LDFA3: BD FB 6F JSR LFB6F ; get baro & do 2d lkup
LDFA6: D6 C1 LDAB L00C1 ; IAC steps, lag filtered
LDFA8: 11 CBA ;
LDFA9: 25 16 BCS LDFC1 ;
LDFAB: 5F CLRB ;
LDFAC: DD C1 STD L00C1 ; IAC steps, lag filtered
LDFAE: 20 11 BRA LDFC1 ;


;-----------------------------------------------
;
; Subroutine
;
; set L0010, b6 == 1 & clr B
;-----------------------------------------------

LDFB0: D6 10 LDAB L0010 ; status word
LDFB2: CA 40 ORAB #$40 ;
LDFB4: D7 10 STAB L0010 ; status word
LDFB6: 5F CLRB ;
LDFB7: 39 RTS ;

;-----------------------------------------------
;
;
;-----------------------------------------------

LDFB8: 4D TSTA ;
LDFB9: 2A 06 BPL LDFC1 ; bra if b7 == 0
;
LDFBB: 84 7F ANDA #$7F ; 0111 1111
LDFBD: 8A 40 ORAA #$40 ; 0100 0000
LDFBF: 97 10 STAA L0010 ; status word
;
;
; Calc Throttle Follower IAC steps
;
LDFC1: F6 D5 43 LDAB LD543 ; 64, TF factor not in prk/neut
LDFC4: 96 10 LDAA L0010 ; status word
LDFC6: 85 10 BITA #$10 ; prk/neut bit
LDFC8: 27 03 BEQ LDFCD ; bra if not in prk/neut
;
LDFCA: F6 D5 42 LDAB LD542 ; 32, TF factor in prk/neut
;
LDFCD: 96 43 LDAA L0043 ; tps%, from idle
LDFCF: B0 D5 41 SUBA LD541 ; 6, TF tps% bias
LDFD2: 24 01 BCC LDFD5 ; bra if tps% > 6, 2.3%
;
LDFD4: 4F CLRA ; else, no TF
;
LDFD5: 3D MUL ; do the math
LDFD6: 05 LSLD ;
LDFD7: 25 06 BCS LDFDF ;
LDFD9: 05 LSLD ;
LDFDA: 25 03 BCS LDFDF ;
LDFDC: 05 LSLD ;
LDFDD: 24 02 BCC LDFE1 ;
LDFDF: 86 FF LDAA #255 ;
LDFE1: 97 C5 STAA L00C5 ; throttle follower steps, raw
LDFE3: 90 C3 SUBA L00C3 ; throttle follower steps, filtered
LDFE5: 23 12 BLS LDFF9 ;
LDFE7: B1 D5 44 CMPA LD544 ; 4
LDFEA: 23 0D BLS LDFF9 ;
;
LDFEC: B6 D5 38 LDAA LD538 ; 96, max TF steps
LDFEF: 91 C5 CMPA L00C5 ; throttle follower steps, raw
LDFF1: 23 02 BLS LDFF5 ; bra if max TF <= current TF steps
;
LDFF3: 96 C5 LDAA L00C5 ; throttle follower steps, raw
LDFF5: 8D B9 BSR LDFB0 ; set L0010, b6 == 1 & clr B
LDFF7: DD C3 STD L00C3 ; throttle follower steps, filtered
;
;
; Get IAC steps vs coolant
;
LDFF9: CE D5 47 LDX #$D547 ;
LDFFC: 96 21 LDAA L0021 ; coolant, defaulted, 1k pu, inverse, adc cnts
LDFFE: 43 COMA ; 1's comp
LDFFF: BD FB 95 JSR LFB95 ; 2d lkup
LE002: D6 DF LDAB L00DF ; status word
LE004: C5 10 BITB #$10 ;
LE006: 26 30 BNE LE038 ;
;
LE008: C4 04 ANDB #$04 ; b2 of L00DF
LE00A: 27 03 BEQ LE00F ; bra if not in hot restart
LE00C: F6 D2 5F LDAB LD25F ; added iac steps for hot restart
;
LE00F: 36 PSHA ;
LE010: 37 PSHB ;
;
LE011: 96 21 LDAA L0021 ; coolant, defaulted, 1k pu, inverse, adc cnts
LE013: 43 COMA ; 1's comp
LE014: 44 LSRA ;
LE015: CE D5 60 LDX #$D560 ;
LE018: BD FB 95 JSR LFB95 ; 2d lkup
LE01B: 33 PULB ;
LE01C: 1B ABA ;
LE01D: 91 55 CMPA L0055 ;
LE01F: 32 PULA ;
LE020: 24 1C BCC LE03E ;
;
;
;
;
LE022: D6 DF LDAB L00DF ; status word
LE024: CA 10 ORAB #$10 ;
LE026: C4 FB ANDB #$FB ;
LE028: D7 DF STAB L00DF ; status word
LE02A: F6 D5 27 LDAB LD527 ; 65
LE02D: D1 BF CMPB L00BF ; IAC steps, lag filtered
LE02F: 25 07 BCS LE038 ;
LE031: D7 BF STAB L00BF ; IAC steps, lag filtered
LE033: BD DF B0 JSR LDFB0 ; set L0010, b6 == 1 & clr B
LE036: D7 C0 STAB L00C0 ;

;
;
;
LE038: B0 D5 27 SUBA LD527 ; 65
LE03B: 24 01 BCC LE03E ;
LE03D: 4F CLRA ;
;
LE03E: 97 CD STAA L00CD ;
LE040: D6 03 LDAB L0003 ; status word
LE042: 96 10 LDAA L0010 ; status word
LE044: 85 08 BITA #$08 ;
LE046: 26 07 BNE LE04F ;
LE048: 4F CLRA ;
LE049: C4 FB ANDB #$FB ;
LE04B: D7 03 STAB L0003 ; status word
LE04D: 20 13 BRA LE062 ;
LE04F: C5 04 BITB #$04 ;
LE051: 26 11 BNE LE064 ;
LE053: CA 04 ORAB #$04 ;
LE055: D7 03 STAB L0003 ; status word
LE057: 96 CD LDAA L00CD ;
LE059: 26 09 BNE LE064 ;
LE05B: D6 02 LDAB L0002 ; status word
LE05D: 2A 05 BPL LE064 ; bra if not in idle
LE05F: B6 D5 28 LDAA LD528 ; 2
LE062: 97 C8 STAA L00C8 ;
;
LE064: 96 CE LDAA L00CE ; desired idle speed
LE066: D6 10 LDAB L0010 ; status word
LE068: 2A 0A BPL LE074 ; bra if stall saver not in effect
;
LE06A: B6 D5 13 LDAA LD513 ; 52, 650 rpm to exit stall saver
LE06D: BB D5 1B ADDA LD51B ; 25 rpm, stall saver hyst?
LE070: 24 02 BCC LE074 ;
LE072: 86 FF LDAA #255 ;
;
LE074: 91 1D CMPA L001D ; rpm / 12.5, filtered
LE076: 22 04 BHI LE07C ;
;
LE078: C4 DF ANDB #$DF ;
LE07A: 20 02 BRA LE07E ;
;
;
LE07C: CA 20 ORAB #$20 ;
LE07E: 96 E4 LDAA L00E4 ;
LE080: D7 10 STAB L0010 ; status word
LE082: C5 08 BITB #$08 ;
LE084: 27 08 BEQ LE08E ;
;
LE086: 91 BE CMPA L00BE ;
LE088: 23 02 BLS LE08C ;
;
LE08A: 97 BE STAA L00BE ;

;
; Add up the IAC steps
;
LE08C: 96 BE LDAA L00BE ;
LE08E: 9B CD ADDA L00CD ;
LE090: 25 2A BCS LE0BC ;
;
LE092: 9B BF ADDA L00BF ; IAC steps, lag filtered
LE094: 25 26 BCS LE0BC ;
;
LE096: 9B C1 ADDA L00C1 ; IAC steps, lag filtered
LE098: 25 22 BCS LE0BC ;
;
LE09A: 97 49 STAA L0049 ;
LE09C: F6 D5 40 LDAB LD540 ; 10
LE09F: D1 C3 CMPB L00C3 ; throttle follower steps, filtered
LE0A1: 24 0B BCC LE0AE ;
;
LE0A3: 1B ABA ;
LE0A4: 25 16 BCS LE0BC ;
;
LE0A6: 91 C3 CMPA L00C3 ; throttle follower steps, filtered
LE0A8: 24 0A BCC LE0B4 ;
;
LE0AA: 96 C3 LDAA L00C3 ; throttle follower steps, filtered
LE0AC: 20 10 BRA LE0BE ;
;
LE0AE: 96 C3 LDAA L00C3 ; throttle follower steps, filtered
LE0B0: 9B 49 ADDA L0049 ;
LE0B2: 25 08 BCS LE0BC ;
;
LE0B4: 9B CC ADDA L00CC ;
LE0B6: 25 04 BCS LE0BC ;
;
LE0B8: 9B C8 ADDA L00C8 ;
LE0BA: 24 02 BCC LE0BE ;
;
LE0BC: 86 FF LDAA #255 ;
LE0BE: D6 10 LDAB L0010 ; status word
LE0C0: C5 10 BITB #$10 ;
LE0C2: 27 06 BEQ LE0CA ;
;
LE0C4: B0 D5 29 SUBA LD529 ; 0
LE0C7: 24 01 BCC LE0CA ;
;
LE0C9: 4F CLRA ;
LE0CA: 97 C7 STAA L00C7 ; IAC steps, A/C, park position
;
;
;
; Check if need A/C IAC steps vs. baro
;
LE0CC: D6 10 LDAB L0010 ; status word
LE0CE: C5 08 BITB #$08 ;
LE0D0: 27 21 BEQ LE0F3 ;
;
LE0D2: CE D5 5C LDX #$D55C ; A/C requested additional steps
LE0D5: BD FB 6F JSR LFB6F ; get baro & do 2d lkup
;
LE0D8: D6 21 LDAB L0021 ; coolant, defaulted, 1k pu, inverse, adc cnts
LE0DA: F1 D5 24 CMPB LD524 ; 36, 102c, coolant threshold
LE0DD: 24 05 BCC LE0E4 ;
;
LE0DF: BB D5 25 ADDA LD525 ; 5 steps
LE0E2: 25 0D BCS LE0F1 ;
;
LE0E4: 9B C7 ADDA L00C7 ; IAC steps, A/C, park position
LE0E6: 25 09 BCS LE0F1 ;
;
LE0E8: D6 02 LDAB L0002 ; status word
LE0EA: 2B 07 BMI LE0F3 ; bra if in idle
;
LE0EC: BB D5 26 ADDA LD526 ; 3 steps
LE0EF: 24 02 BCC LE0F3 ;
LE0F1: 86 FF LDAA #255 ;

;
;
;
LE0F3: 16 TAB ;
LE0F4: 90 C9 SUBA L00C9 ; IAC steps, bias
LE0F6: 24 03 BCC LE0FB ;
LE0F8: D7 C9 STAB L00C9 ; IAC steps, bias
LE0FA: 4F CLRA ;
LE0FB: 97 C7 STAA L00C7 ; IAC steps, A/C, park position
;
LE0FD: 96 00 LDAA L0000 ; status word
LE0FF: 85 02 BITA #$02 ;
LE101: 27 03 BEQ LE106 ; no HU
LE103: BD 58 03 JSR L5803 ;
;
LE106: 39 RTS ; done >>>>

;-----------------------------------------------
;
; Reset Vector
;
;-----------------------------------------------

LE107: 8E 00 DC LDS #$DC ; load stack address
LE10A: BD FD 19 JSR LFD19 ; delay, rts only
LE10D: CE 00 0A LDX #$000A ;
LE110: FF BC 3C STX LBC3C ; PWM control register
;
LE113: CE BC 00 LDX #$BC00 ; ecm drp counter
LE116: 4F CLRA ;
LE117: 5F CLRB ;
;
LE118: ED 00 STD 0,X ; clear ecu counters<<
LE11A: 08 INX ;
LE11B: 08 INX ;
LE11C: 8C BC 38 CPX #$BC38 ; last ecu addr to clear
LE11F: 26 F7 BNE LE118 ; not done yet>>>
;
LE121: CE 01 99 LDX #$0199 ; 0000 0001 1001 1001
LE124: FF BC 0C STX LBC0C ;
;
LE127: CE 00 D1 LDX #$00D1 ; clear from L00D1 to L0000
;
LE12A: 6F 00 CLR 0,X ; clear scratch pad ram<<<<
LE12C: 09 DEX ;
LE12D: 8C FF FF CPX #$FFFF ;
LE130: 26 F8 BNE LE12A ; bra if not done yet>>>>
;
LE132: F6 08 80 LDAB L0880 ; Monitor BatV loss (b7)
LE135: F7 08 80 STAB L0880 ; Monitor BatV loss (b7)
LE138: 2B 07 BMI LE141 ;
;
LE13A: BD FD 1A JSR LFD1A ; Do CkSum on Error Flags
LE13D: 91 EA CMPA L00EA ; error flag cksum
LE13F: 27 1E BEQ LE15F ; bra if cksum ok
;
;
; ECM Battery lost, additional reset's
;
LE141: CE 00 FF LDX #$00FF ; clear from top of ram
LE144: 6F 00 CLR 0,X ;
LE146: 09 DEX ;
LE147: 8C 00 DC CPX #$00DC ;
LE14A: 26 F8 BNE LE144 ; until done>>>>
;
LE14C: B6 D5 1E LDAA LD51E ; 22
LE14F: 97 E4 STAA L00E4 ;
;
LE151: B6 D5 11 LDAA LD511 ; 160, IAC park position
LE154: 97 FD STAA L00FD ; Current IAC position, steps
;
LE156: BD FD D7 JSR LFDD7 ; Set all BLM cells to 128
;
LE159: 96 07 LDAA L0007 ; status word
LE15B: 8A 40 ORAA #$40 ;
LE15D: 97 07 STAA L0007 ; status word
;
LE15F: 96 E4 LDAA L00E4 ;
LE161: BB D5 10 ADDA LD510 ; 18
LE164: 24 02 BCC LE168 ;
LE166: 86 FF LDAA #255 ;
;
LE168: 97 BE STAA L00BE ;
;
LE16A: 96 E0 LDAA L00E0 ; status word
LE16C: 84 C0 ANDA #$C0 ;
LE16E: 97 E0 STAA L00E0 ; status word
;
LE170: FE 58 00 LDX L5800 ; HU on line?
LE173: 8C 7E 58 CPX #$7E58 ; chk for cookie val
LE176: 26 03 BNE LE17B ; bra for no HU
LE178: BD 58 15 JSR L5815 ; go do HU

;
; Do eprom cksum
;
LE17B: CE E0 00 LDX #$E000 ; end of EPROM + 1
LE17E: DF 4D STX L004D ;
LE180: CE D0 04 LDX #$D004 ; Beginning of cksum area
LE183: BD E2 89 JSR LE289 ; Do CheckSum
LE186: B3 D0 00 SUBD LD000 ; sub out cksum val
LE189: 26 07 BNE LE192 ; bra if cksum does not match

;
; cksum OK, ck mask id
;
LE18B: B6 D0 04 LDAA LD004 ; maskId
LE18E: 81 61 CMPA #$61 ; ck maskid
LE190: 27 24 BEQ LE1B6 ;

;
; cksum failed, chk for x maskid
;
LE192: B6 D0 04 LDAA LD004 ; maskId
LE195: 81 AA CMPA #$AA ; test for x maskid
LE197: 27 1D BEQ LE1B6 ; bra if it is, ok
;
;
; Eprom checksum error here
;
LE199: BD FC 40 JSR LFC40 ; do SES light on
;
LE19C: 96 14 LDAA L0014 ; error flag 3
LE19E: 8A 10 ORAA #$10 ; b4
LE1A0: 97 14 STAA L0014 ; error flag 3
;
LE1A2: 96 E3 LDAA L00E3 ; set eprom err code
LE1A4: 8A 10 ORAA #$10 ; b4
LE1A6: 97 E3 STAA L00E3 ; save
;
LE1A8: BD FD 1A JSR LFD1A ; Do CkSum on Error Flags
LE1AB: 97 EA STAA L00EA ; error flag cksum
;
LE1AD: 86 0C LDAA #12 ; aldl channel
LE1AF: BD FF 00 JSR LFF00 ; ADC w/wait for data
LE1B2: 81 99 CMPA #153 ;
LE1B4: 24 FC BCC LE1B2 ; loop here if in normal mode
;
LE1B6: CE F9 2A LDX #$F92A ;
LE1B9: FF BC 3C STX LBC3C ; PWM control register

;
; init map
;
LE1BC: 86 05 LDAA #5 ; map channel
LE1BE: BD FF 00 JSR LFF00 ; ADC w/wait for data
LE1C1: 97 28 STAA L0028 ; map adc value, raw
;
LE1C3: 80 1A SUBA #26 ; ADC to S/D calc
LE1C5: C6 97 LDAB #151 ;
LE1C7: BD FC 6C JSR LFC6C ; A = (A * B) / 128
LE1CA: 97 25 STAA L0025 ; s/d map, KPa = (N * 0.3125) + 20
LE1CC: 97 2C STAA L002C ; s/d map, slo filtered from L0025

;
; init baro, iat & coolant
;
LE1CE: BD FC C0 JSR LFCC0 ; init baro
LE1D1: BD FD 84 JSR LFD84 ; init iat
LE1D4: BD FD 27 JSR LFD27 ; Read Coolant Temp & do Diag Tests
LE1D7: 97 22 STAA L0022 ; save startup coolant, adc inverse
LE1D9: BD FD E5 JSR LFDE5 ; Test Iat | Cts against 75c threshold

;
; init O2 values
;
LE1DC: B6 D2 1D LDAA LD21D ; 138
LE1DF: 97 3A STAA L003A ; O2, minor loop filtered
LE1E1: 97 39 STAA L0039 ; O2, adc, filtered, round up from L003A
LE1E3: 97 3C STAA L003C ; O2, major loop filtered (slow)
LE1E5: 97 3E STAA L003E ; O2, filtered vs. airflow

;
; init tps value
;
LE1E7: 86 0B LDAA #11 ; TPS channel
LE1E9: BD FF 00 JSR LFF00 ; ADC w/wait for data
LE1EC: 97 42 STAA L0042 ; tps, adc cnts, volts = n * .0196
;
LE1EE: B6 D2 1A LDAA LD21A ; 51, tps idle setting init
LE1F1: 97 47 STAA L0047 ; tps minimum setting, idle position
LE1F3: BD FC DA JSR LFCDA ; minimum tps setting & tps% calc
LE1F6: 97 44 STAA L0044 ; tps%, one delayed from L0043
LE1F8: 97 45 STAA L0045 ; tps%, slow filtered

;
; init batV
;
LE1FA: BD FE FE JSR LFEFE ; read BatV adc channel
LE1FD: 97 40 STAA L0040 ; Battery Volts, * 10, adc cnts
;
LE1FF: FC BC 06 LDD LBC06 ; EST Circuit
LE202: DD 93 STD L0093 ; EST circuit data
;
LE204: 96 FD LDAA L00FD ; Current IAC position, steps
LE206: 97 C7 STAA L00C7 ; IAC steps, A/C, park position
;
LE208: 96 DE LDAA L00DE ; status word
LE20A: 85 04 BITA #$04 ;
LE20C: 26 06 BNE LE214 ;
;
LE20E: D6 09 LDAB L0009 ; status word
LE210: CA 04 ORAB #$04 ;
LE212: D7 09 STAB L0009 ; status word
;
LE214: FE BC 04 LDX LBC04 ; MAF/VATS Frequency
LE217: 84 FB ANDA #$FB ;
LE219: 97 DE STAA L00DE ; status word
;
LE21B: B6 D2 32 LDAA LD232 ; 14.7, stoich
LE21E: 97 A3 STAA L00A3 ; desired AFR
LE220: 97 B3 STAA L00B3 ; crank afr
LE222: FF BC 1A STX LBC1A ; vats
;
LE225: 86 0E LDAA #$0E ; start @ rts # $0E
LE227: 97 66 STAA L0066 ; 160Hz rts counter
;
LE229: 86 80 LDAA #128 ;
LE22B: 97 67 STAA L0067 ; init to $80, bit for ADC hardware
LE22D: 97 A1 STAA L00A1 ; BLM, bin val
;
LE22F: 86 14 LDAA #20 ; twenty bytes of aldl data
LE231: 97 71 STAA L0071 ; aldl byte count
;
LE233: 86 A0 LDAA #160 ;
LE235: 97 32 STAA L0032 ; vss interval counter, 159 | 160
;
LE237: BD FD D7 JSR LFDD7 ; Set all BLM cells to 128
LE23A: BD FF 05 JSR LFF05 ;
LE23D: 24 44 BCC LE283 ;
;
LE23F: 4F CLRA ; PumpV channel
LE240: BD FF 00 JSR LFF00 ; ADC w/wait for data
LE243: 81 A0 CMPA #160 ; 16.0v
LE245: 23 3C BLS LE283 ; bra if BatV <= 16.0V
;
LE247: BD FE FE JSR LFEFE ; read BatV adc channel
LE24A: 81 64 CMPA #100 ; 10.0v
LE24C: 24 35 BCC LE283 ; bra if BatV > 10.0V
;
LE24E: 96 06 LDAA L0006 ;
LE250: 8A 01 ORAA #$01 ; Do factory diags!
LE252: 97 06 STAA L0006 ;

;-----------------------------------------------
;
; Do Factory Diags!
;
;-----------------------------------------------

;
; init coolant?
;
LE254: 86 CC LDAA #204 ; deault coolant temp
LE256: 97 21 STAA L0021 ; coolant, defaulted, 1k pu, inverse, adc cnts
LE258: 97 23 STAA L0023 ; coolant, adc cnts

;
; set stack pointer & $AA fill
;
LE25A: CE 00 DC LDX #$00DC ;
LE25D: 35 TXS ;
LE25E: 86 AA LDAA #$AA ; stack fill val
LE260: 08 INX ;
LE261: A7 00 STAA 0,X ;
LE263: 8C 00 FF CPX #$FF ; end of stack?
LE266: 25 F8 BCS LE260 ; no, not yet>>>>
;
LE268: CE E0 00 LDX #$E000 ;
LE26B: DF 4D STX L004D ;
LE26D: CE D0 00 LDX #$D000 ;
LE270: 8D 17 BSR LE289 ; Do CheckSum
LE272: DD 16 STD L0016 ;
;
LE274: 86 F0 LDAA #240 ;
LE276: 97 4D STAA L004D ;
LE278: 8D 0F BSR LE289 ; Do CheckSum
LE27A: DD 12 STD L0012 ; error flag 1
LE27C: 7F 00 4D CLR L004D ;
LE27F: 8D 08 BSR LE289 ; Do CheckSum
LE281: DD 14 STD L0014 ; error flag 3
;
LE283: FE BC 38 LDX LBC38 ;
LE286: 7E E3 FE JMP LE3FE ; go wait for next interrupt

;*==================================================
;*
;* SubRoutine
;*
;* Do CheckSum on area of Memory
;*
;* Enter with:
;*
;* L004D,E => last memory location + 1
;* X => first memory location
;*
;*==================================================

LE289: 4F CLRA ;
LE28A: 5F CLRB ;
LE28B: DF 49 STX L0049 ;
;
LE28D: 7C 00 4A INC L004A ; inc COP kick timer<<<<
LE290: 2A 11 BPL LE2A3 ;
;
LE292: 7F 00 4A CLR L004A ; clear COP kick timer
LE295: 36 PSHA ;
LE296: 37 PSHB ;
LE297: FC BC 3C LDD LBC3C ; PWM control register
LE29A: C8 04 EORB #$04 ; toggle b2, watch dog
LE29C: 8D 0E BSR LE2AC ;
LE29E: FD BC 3C STD LBC3C ; PWM control register
LE2A1: 33 PULB ;
LE2A2: 32 PULA ;
;
LE2A3: EB 00 ADDB 0,X ; add in next byte value
LE2A5: 89 00 ADCA #0 ;
LE2A7: 08 INX ;
LE2A8: 9C 4D CPX L004D ; holds last addr + 1
LE2AA: 26 E1 BNE LE28D ; not done >>>>
;
LE2AC: 39 RTS ;

;*==================================================
;*
;* Vector Handler
;*
;* Hardware tickler
;*
;*==================================================

LE2AD: FC BC 38 LDD LBC38 ; ecm
LE2B0: 85 10 BITA #$10 ; test bit 4
LE2B2: 26 01 BNE LE2B5 ; bra if b4 == 1
LE2B4: 3B RTI ; just return

;-----------------------------------------------
;
;-----------------------------------------------

LE2B5: 30 TSX ; stack pointer to X
LE2B6: 8C 00 D6 CPX #$00D6 ; mid-point of stack
LE2B9: 27 06 BEQ LE2C1 ;
;
LE2BB: D6 00 LDAB L0000 ; flag stack error
LE2BD: CA 01 ORAB #1 ;
LE2BF: D7 00 STAB L0000 ; status word
;
LE2C1: 8E 00 DC LDS #$00DC ; load stack address
LE2C4: D6 02 LDAB L0002 ; status word
LE2C6: 85 08 BITA #$08 ;
LE2C8: 27 02 BEQ LE2CC ;
;
LE2CA: CA 04 ORAB #4 ;
LE2CC: 85 20 BITA #$20 ;
LE2CE: 27 02 BEQ LE2D2 ;
;
LE2D0: CA 01 ORAB #1 ;
LE2D2: 96 00 LDAA L0000 ; status word
LE2D4: 85 10 BITA #$10 ; engine shutdown
LE2D6: 27 02 BEQ LE2DA ;
;
LE2D8: C4 FB ANDB #$FB ;
LE2DA: D7 02 STAB L0002 ; status word
LE2DC: 96 06 LDAA L0006 ;
LE2DE: 47 ASRA ;
LE2DF: 25 06 BCS LE2E7 ;
;
LE2E1: 96 14 LDAA L0014 ; error flag 3
LE2E3: 85 10 BITA #$10 ;
LE2E5: 26 0A BNE LE2F1 ;
;
LE2E7: 86 BF LDAA #191 ;
LE2E9: BD FC 42 JSR LFC42 ;
LE2EC: 86 40 LDAA #64 ;
LE2EE: BD FC 4D JSR LFC4D ;
LE2F1: DE EB LDX L00EB ; eng run time
LE2F3: 96 66 LDAA L0066 ; 160Hz rts counter
LE2F5: 4C INCA ;
LE2F6: 81 A0 CMPA #160 ;
LE2F8: 26 1E BNE LE318 ;

;
; one second has elapsed
;
LE2FA: D6 06 LDAB L0006 ;
LE2FC: C8 20 EORB #32 ;
LE2FE: D7 06 STAB L0006 ;
LE300: D6 01 LDAB L0001 ; status word
LE302: 2B 0B BMI LE30F ; Engine is Running
;
LE304: 7F 00 55 CLR L0055 ;
LE307: 96 DF LDAA L00DF ; status word
LE309: 84 EF ANDA #$EF ;
LE30B: 97 DF STAA L00DF ; status word
LE30D: 20 08 BRA LE317 ;
LE30F: 7C 00 55 INC L0055 ;
;
;
LE312: 08 INX ;
LE313: 27 02 BEQ LE317 ;
LE315: DF EB STX L00EB ; eng run time
;
LE317: 4F CLRA ;
;
LE318: 97 66 STAA L0066 ; 160Hz rts counter
LE31A: 84 1F ANDA #$1F ;
LE31C: 26 09 BNE LE327 ;
;
LE31E: D6 00 LDAB L0000 ; HU on line?
LE320: C5 02 BITB #$02 ;
LE322: 27 03 BEQ LE327 ;
LE324: BD 58 0F JSR L580F ;
;
LE327: 96 06 LDAA L0006 ;
LE329: 47 ASRA ;
LE32A: 24 03 BCC LE32F ;
LE32C: 7E FE 6B JMP LFE6B ;

;-----------------------------------------------
;
;
;-----------------------------------------------

LE32F: CC 05 01 LDD #$0501 ; map channel, return immed
LE332: BD FC 1A JSR LFC1A ; ADC routine
;
LE335: BD EB A7 JSR LEBA7 ; check for BatV overvolts
;
LE338: 96 02 LDAA L0002 ; status word
LE33A: 47 ASRA ;
LE33B: 24 05 BCC LE342 ;
LE33D: 48 ASLA ;
LE33E: 97 02 STAA L0002 ; status word
LE340: 20 13 BRA LE355 ;
LE342: D6 32 LDAB L0032 ; vss interval counter, 159 | 160
LE344: 5C INCB ;
LE345: C1 9F CMPB #159 ;
LE347: 23 08 BLS LE351 ;
LE349: D6 01 LDAB L0001 ; status word
LE34B: C4 EF ANDB #$EF ; 1110 1111
LE34D: D7 01 STAB L0001 ; status word
LE34F: C6 9F LDAB #159 ;
LE351: D7 32 STAB L0032 ; vss interval counter, 159 | 160
LE353: 20 23 BRA LE378 ;

;------------------------------------
; VSS work
;------------------------------------

LE355: D6 01 LDAB L0001 ; status word
LE357: C5 10 BITB #$10 ; b4, vss detects movement bit
LE359: 26 0D BNE LE368 ; bra if b4 == 1
;
LE35B: CA 10 ORAB #$10 ; b4, vss detects movement bit
LE35D: D7 01 STAB L0001 ; save status word

LE35F: FE BC 02 LDX LBC02 ; VSS counter
LE362: 08 INX ;
LE363: DF 37 STX L0037 ; L0037 & L0038
LE365: 08 INX ;
LE366: DF 35 STX L0035 ; L0035 & L0036

;
; shift vss vals
;
; L0033 & L0034 << L0035 & L0036 << L0037 & L0038 << LBC02
;

LE368: 7F 00 32 CLR L0032 ; vss interval counter, 159 | 160
;
LE36B: DE 35 LDX L0035 ;
LE36D: DF 33 STX L0033 ;
;
LE36F: DE 37 LDX L0037 ;
LE371: DF 35 STX L0035 ;
;
LE373: FE BC 02 LDX LBC02 ; VSS counter
LE376: DF 37 STX L0037 ;

;-------------------------------
;
;-------------------------------

;
; check vats
;
LE378: 96 DF LDAA L00DF ; status word
LE37A: 85 40 BITA #$40 ; vats ok bit
LE37C: 26 28 BNE LE3A6 ; bra if b6 == 1, OK
;
LE37E: FE BC 04 LDX LBC04 ; MAF/VATS Frequency
LE381: F6 D0 07 LDAB LD007 ; option byte: 0010 0100
LE384: C5 40 BITB #$40 ;
LE386: 27 1A BEQ LE3A2 ; bra if b6 == 0, no VATS
;
LE388: 3C PSHX ; move X to AB
LE389: 32 PULA ;
LE38A: 33 PULB ;
LE38B: B3 BC 1A SUBD LBC1A ; vats
LE38E: 27 16 BEQ LE3A6 ;
LE390: 37 PSHB ;
LE391: 36 PSHA ;
LE392: 96 DF LDAA L00DF ; status word
LE394: FF BC 1A STX LBC1A ; vats
LE397: 38 PULX ;
LE398: BC D2 91 CPX LD291 ;
LE39B: 22 09 BHI LE3A6 ;
LE39D: BC D2 93 CPX LD293 ;
LE3A0: 25 04 BCS LE3A6 ;
;
LE3A2: 8A 40 ORAA #$40 ; b6, engine start ok
LE3A4: 97 DF STAA L00DF ; status word
;
;
;
;
LE3A6: BD FC 27 JSR LFC27 ; get val from adc
LE3A9: 97 2A STAA L002A ; adc map val, raw?
LE3AB: D6 14 LDAB L0014 ; error flag 3
LE3AD: C5 10 BITB #$10 ;
LE3AF: 27 08 BEQ LE3B9 ;
LE3B1: 96 66 LDAA L0066 ; 160Hz rts counter
LE3B3: 47 ASRA ;
LE3B4: 25 1E BCS LE3D4 ; return to rts loop
LE3B6: 7E EA 14 JMP LEA14 ;

;-----------------------------------------------
;
;
;-----------------------------------------------

LE3B9: 96 66 LDAA L0066 ; 160Hz rts counter
LE3BB: 47 ASRA ; test b0
LE3BC: 25 05 BCS LE3C3 ; bra if b0 == 1
;
LE3BE: BD DE E3 JSR LDEE3 ; misc init & IAC stuff

;
; Go Do Spark Minor Loop
;

LE3C1: 20 5E BRA LE421 ; Spark Minor Loop >>>>
;
;
; Keep est alive?
;

LE3C3: B6 08 81 LDAA L0881 ; MCU1 I/O
LE3C6: D6 02 LDAB L0002 ; status word
LE3C8: C5 08 BITB #$08 ; b3, aldl backup mode (3.9K Ohm)
LE3CA: 26 02 BNE LE3CE ; bra if b3 == 1, (limp)
;
LE3CC: 88 08 EORA #8 ; toggle b3, sentry, bypass
LE3CE: B7 08 81 STAA L0881 ; MCU1 I/O

;
; Go Do Fuel Minor Loop
;

LE3D1: 7E D5 69 JMP LD569 ; Fuel Minor Loop >>>>

;-----------------------------------------------
;
;
;-----------------------------------------------

LE3D4: 96 66 LDAA L0066 ; 160Hz rts counter
LE3D6: 47 ASRA ;
LE3D7: 24 05 BCC LE3DE ;
LE3D9: 86 FB LDAA #251 ;
LE3DB: BD FC 42 JSR LFC42 ;
;
;
; Time to run a major loop
;
LE3DE: D6 66 LDAB L0066 ; 160Hz rts counter
LE3E0: C4 0F ANDB #$0F ; get lower 4 bits
LE3E2: CE E4 01 LDX #$E401 ; Major loop jmp table addr
LE3E5: 58 LSLB ; B *= 2 for 2 byte addr's
LE3E6: 3A ABX ; add to X
LE3E7: EE 00 LDX 0,X ; Load Address to jmp to
LE3E9: AD 00 JSR 0,X ; Run a Major Loop
;
LE3EB: 96 01 LDAA L0001 ; status word
LE3ED: 85 04 BITA #$04 ;
LE3EF: 26 0D BNE LE3FE ;
LE3F1: 8A 04 ORAA #4 ;
LE3F3: 97 01 STAA L0001 ; status word
LE3F5: D6 66 LDAB L0066 ; 160Hz rts counter
LE3F7: D7 DD STAB L00DD ;
LE3F9: 0E CLI ;
LE3FA: 84 FB ANDA #$FB ;
LE3FC: 97 01 STAA L0001 ; status word
LE3FE: 0E CLI ;
LE3FF: 20 FD BRA LE3FE ;

;-----------------------------------------------
;
; 100msec RTS table
;
;-----------------------------------------------

LE401:

FCB $EA35 ; 0
FCB $EAFB ; 1
FCB $EB02 ; 2
FCB $EB27 ; 3
FCB $EC42 ; 4
FCB $EDFB ; 5
FCB $FE04 ; 6
FCB $F269 ; 7
FCB $F4D0 ; 8
FCB $F19F ; 9
FCB $FD19 ; A, rts
FCB $EFC7 ; B
FCB $FD19 ; C, rts
FCB $F529 ; D
FCB $FE1B ; E
FCB $EC57 ; F

;-----------------------------------------------
;
; Spark Minor Loop
;
;-----------------------------------------------

LE421: BD FA 90 JSR LFA90 ;
LE424: D6 26 LDAB L0026 ; s/d map, one delayed from L0025
LE426: D7 27 STAB L0027 ; s/d map, two delayed from L0025
LE428: D6 25 LDAB L0025 ; s/d map, KPa = (N * 0.3125) + 20
LE42A: D7 26 STAB L0026 ; s/d map, one delayed from L0025

;
; Convert map & baro to vac
;
LE42C: C6 97 LDAB #151 ;
LE42E: 96 FE LDAA L00FE ; baro pressure, A/D cnts
LE430: 90 28 SUBA L0028 ; map adc value, raw
LE432: 22 03 BHI LE437 ;
LE434: 86 01 LDAA #1 ;
LE436: 0C CLC ;
;
LE437: BD FC 68 JSR LFC68 ; A = (A * B) / 128
LE43A: 40 NEGA ;
LE43B: 97 2E STAA L002E ; vac
;
;
; Convert Map to S/D Map
;
LE43D: C6 97 LDAB #151 ;
LE43F: 96 28 LDAA L0028 ; map adc value, raw
LE441: 80 1A SUBA #26 ;
LE443: BD FC 68 JSR LFC68 ; A = (A * B) / 128
LE446: 97 25 STAA L0025 ; s/d map, KPa = (N * 0.3125) + 20
;
;
; do map sensor low diag, err 34
;
LE448: D6 08 LDAB L0008 ; status word
LE44A: C4 7F ANDB #$7F ; clear b3, lo map err
LE44C: C5 04 BITB #$04 ; b2, tps hi err
LE44E: 26 21 BNE LE471 ; bra if b2 == 1, do not do test
;
LE450: 96 2A LDAA L002A ; map value, ADC cnts
LE452: B1 D4 74 CMPA LD474 ; map limit, (11.9 kpa)
LE455: 24 1A BCC LE471 ; bra if map gt 14.4, no err
;
LE457: 96 8A LDAA L008A ; error 34 timer, map, (12.5 msec incr's)
LE459: B1 D4 76 CMPA LD476 ;
LE45C: 22 18 BHI LE476 ;
;
LE45E: 96 1A LDAA L001A ; rpm scaled
LE460: B1 D4 75 CMPA LD475 ; bra if rpm < 1200 for incr timer & no err yet
LE463: 25 07 BCS LE46C ;
LE465: 96 43 LDAA L0043 ; tps%, from idle
LE467: B1 D4 77 CMPA LD477 ;
LE46A: 23 05 BLS LE471 ;
LE46C: 7C 00 8A INC L008A ; error 34 timer, map
LE46F: 20 0D BRA LE47E ;
;
LE471: 7F 00 8A CLR L008A ; error 34 timer, map
LE474: 20 08 BRA LE47E ; bra for no error
;
;
; map test failed
;
LE476: 96 13 LDAA L0013 ; error flag 2
LE478: 8A 08 ORAA #$08 ;
LE47A: 97 13 STAA L0013 ; error flag 2
LE47C: CA 80 ORAB #$80 ;
LE47E: D7 08 STAB L0008 ; status word

;-------------------------------
;
;-------------------------------

LE480: 96 02 LDAA L0002 ; status word
LE482: 85 04 BITA #$04 ;
LE484: 27 67 BEQ LE4ED ;
;
;-------------------------------
;
; exponential decay dynamic dwell to zero
;
;-------------------------------

LE486: DC 59 LDD L0059 ; dynamic dwell
LE488: 04 LSRD ;
LE489: 04 LSRD ;
LE48A: 04 LSRD ;
LE48B: 43 COMA ; 1's comp
LE48C: 53 COMB ; 1's comp
LE48D: D3 59 ADDD L0059 ; dynamic dwell
LE48F: 2A 02 BPL LE493 ;
LE491: 4F CLRA ;
LE492: 5F CLRB ;
;
LE493: DD 59 STD L0059 ; dynamic dwell


;-------------------------------
; engine in crank ?
;-------------------------------

LE495: 7F 00 68 CLR L0068 ; start/crank timer of some nature
LE498: 96 01 LDAA L0001 ; status word
LE49A: 2A 15 BPL LE4B1 ; Engine is not Running
LE49C: 85 40 BITA #$40 ;
LE49E: 27 69 BEQ LE509 ;
LE4A0: DE 63 LDX L0063 ; drp info
LE4A2: 8C FE F0 CPX #65264 ; $FEF0, (15 rpm, crank speed?)
LE4A5: 22 62 BHI LE509 ;
;
LE4A7: F6 D0 18 LDAB LD018 ; 6, filt coef
LE4AA: 86 FF LDAA #255 ;
LE4AC: BD FB 40 JSR LFB40 ; Lag Filter
LE4AF: 20 38 BRA LE4E9 ;
;
LE4B1: D6 00 LDAB L0000 ; status word
LE4B3: C5 08 BITB #$08 ;
LE4B5: 27 45 BEQ LE4FC ;
LE4B7: FC D0 10 LDD LD010 ; 400 rpm, startup drp cnt
LE4BA: B3 BC 00 SUBD LBC00 ; ecm drp counter
LE4BD: 22 05 BHI LE4C4 ;
LE4BF: 4F CLRA ;
LE4C0: 97 51 STAA L0051 ;
LE4C2: 20 3C BRA LE500 ;
;
LE4C4: 96 51 LDAA L0051 ;
LE4C6: B1 D0 12 CMPA LD012 ; 6, eng run time out param, drp's
LE4C9: 4C INCA ;
LE4CA: 25 F4 BCS LE4C0 ;
;
;
; engine is now running
;
LE4CC: 96 01 LDAA L0001 ; status word
LE4CE: 8A 80 ORAA #$80 ; Engine is Running
LE4D0: 97 01 STAA L0001 ; status word

;
; check for clear flood mode
;
LE4D2: B6 D2 54 LDAA LD254 ; clear flood tps% thres, 80%
LE4D5: 91 43 CMPA L0043 ; tps%, from idle
LE4D7: 22 06 BHI LE4DF ;
;
LE4D9: 96 08 LDAA L0008 ; status word
LE4DB: 8A 01 ORAA #$01 ; set in clr-flood
LE4DD: 97 08 STAA L0008 ; status word
;
LE4DF: 96 DE LDAA L00DE ; status word
LE4E1: 8A 08 ORAA #$08 ; set b3
LE4E3: 97 DE STAA L00DE ; status word
;
LE4E5: 4F CLRA ;
LE4E6: 97 51 STAA L0051 ;
LE4E8: 5F CLRB ;
;
LE4E9: DD 63 STD L0063 ; drp info
LE4EB: 20 1C BRA LE509 ;
;
;-------------------------------
;
;-------------------------------

LE4ED: 96 68 LDAA L0068 ; start/crank timer of some nature
LE4EF: D6 01 LDAB L0001 ; status word
LE4F1: 81 17 CMPA #23 ; 23 secs?
LE4F3: 25 0E BCS LE503 ;
;
LE4F5: C4 7F ANDB #$7F ; Engine is not Running
LE4F7: D7 01 STAB L0001 ; status word
LE4F9: 7E EA 27 JMP LEA27 ;

;-----------------------------------------------
;
;
;-----------------------------------------------

LE4FC: CA 08 ORAB #$08 ; 0000 1000
LE4FE: D7 00 STAB L0000 ; status word
;
LE500: 7E EA 14 JMP LEA14 ;

;-----------------------------------------------
;
; Do RPM calculations
;
;-----------------------------------------------

LE503: 5D TSTB ; b7 of L0001
LE504: 2A FA BPL LE500 ; bra Engine is not Running
;
LE506: 4C INCA ; L0068, start/crank timer of some nature
LE507: 97 68 STAA L0068 ; start/crank timer of some nature
;
LE509: 86 04 LDAA #$04 ; 0000 0100
LE50B: BD FC 4D JSR LFC4D ;
;
LE50E: 96 1B LDAA L001B ; rpm / 25
LE510: 97 1C STAA L001C ; rpm / 25 one delayed
;
LE512: FC BC 00 LDD LBC00 ; ecm drp counter
LE515: DD 18 STD L0018 ; drp count
LE517: DD 4F STD L004F ; drp count

;
; calc drp relative to 8 cyl
;
LE519: CE 00 18 LDX #$0018 ; drp counter val
LE51C: B6 D0 0F LDAA LD00F ; cyl count
LE51F: C6 20 LDAB #32 ; constant
LE521: 3D MUL ;
LE522: 17 TBA ;
LE523: 27 05 BEQ LE52A ; bra if B == 0, 8 cyl
LE525: BD FC 05 JSR LFC05 ; AB = (A x *X) / 256
LE528: DD 18 STD L0018 ; drp count relative to 8 cyl
;
;
; calc rpm values
;
LE52A: DC 18 LDD L0018 ; drp count
LE52C: 05 LSLD ; AB *= 2
LE52D: DD 4B STD L004B ; tmp store
LE52F: CC 01 33 LDD #307 ; constant for 6375 rpm max
LE532: BD FB DE JSR LFBDE ; vss/rpm calc routine (FDIV)
LE535: DD 49 STD L0049 ; rpm / 25, tmp storage
;
LE537: 81 60 CMPA #96 ; 2400 rpm
LE539: 25 09 BCS LE544 ; bra if rpm < 2400
;
;
; rpm >= 2400 here
;
LE53B: C3 40 80 ADDD #$4080 ; add 64 to A & 128 to B for rnd up
LE53E: 24 0B BCC LE54B ; 1600 rpm offset?
LE540: 86 FF LDAA #255 ;
LE542: 20 07 BRA LE54B ;

;
; rpm < 2400 here
;
LE544: 05 LSLD ; AB *= 2, now rpm / 12.5
LE545: 83 1F 80 SUBD #$1F80 ; sub 31 from A & 128 from B (rnd dwn)
LE548: 24 01 BCC LE54B ; bra if no undr flw
LE54A: 4F CLRA ; clr undrflw

;
; save rpm term
;
LE54B: 97 1A STAA L001A ; 400 - 2400 x 200's
; 2400 - 4800 x 400's
;
;
; do rpm / 25
;
LE54D: DC 49 LDD L0049 ; rpm / 25, tmp
LE54F: C3 00 80 ADDD #$0080 ; round up
LE552: 24 02 BCC LE556 ;
LE554: 86 FF LDAA #255 ;
LE556: 97 1B STAA L001B ; rpm / 25

;
; do rpm / 12.5, filtered
;
LE558: DC 49 LDD L0049 ; rpm / 25, tmp
LE55A: 05 LSLD ; now rpm / 12.5
LE55B: 24 03 BCC LE560 ;
LE55D: CC FF FF LDD #$FFFF ; clear overflow
LE560: DE 1D LDX L001D ; rpm / 12.5, filtered
LE562: 27 06 BEQ LE56A ; bra if == 0
LE564: F6 D0 1C LDAB LD01C ; filter coef, 240
LE567: BD FB 40 JSR LFB40 ; Lag Filter
LE56A: DD 1D STD L001D ; rpm / 12.5, filtered

;*==================================================
;*
;* Do Dwell Calculation
;*
;*==================================================

;-------------------------------
;
; Dynamic Dwell
;
;-------------------------------

LE56C: 86 FF LDAA #255 ; pre-load max dynamic dwell
LE56E: D6 25 LDAB L0025 ; s/d map, KPa = (N * 0.3125) + 20
LE570: D0 27 SUBB L0027 ; s/d map, two delayed
LE572: 25 04 BCS LE578 ; bra if map dropping
;
;
; Check for map Accel
;
LE574: C1 20 CMPB #32 ; 10 KPa delta test
LE576: 24 0B BCC LE583 ; bra if delta map > 10 KPa
;
; ----------------------
; No Accel
;
; If Delta RefPer > Dynamic Dwell
; set
; Dynamic Dwell = -2 * Delta RefPer
; ----------------------

LE578: DC 57 LDD L0057 ; drp one delayed (RefPer)
LE57A: 93 4F SUBD L004F ; drp count
LE57C: 05 LSLD ;
LE57D: 93 59 SUBD L0059 ; dynamic dwell
LE57F: 2B 04 BMI LE585 ;
LE581: D3 59 ADDD L0059 ; dynamic dwell
LE583: DD 59 STD L0059 ; dynamic dwell

;
; Limit Dynamic Dwell to RefPer/8; 11 deg for V8
;

LE585: DC 4F LDD L004F ; drp count
LE587: 04 LSRD ;
LE588: 04 LSRD ;
LE589: 04 LSRD ;
LE58A: 93 59 SUBD L0059 ; dynamic dwell
LE58C: 24 04 BCC LE592 ;

;
; Save new dynamic dwell (was > (RefPer/8))
;

LE58E: D3 59 ADDD L0059 ; dynamic dwell
LE590: DD 59 STD L0059 ; dynamic dwell

;-------------------------------
;
; Done w/Dynamic Dwell, do Static Dwell
;
;-------------------------------

LE592: DC 4F LDD L004F ; drp count
LE594: DD 57 STD L0057 ; save as old drp cnt/RefPer for nxt pass
LE596: 04 LSRD ; RefPer /= 2
LE597: 83 00 E5 SUBD #229 ; 3.49msec (15.26 usec/bit)
LE59A: 24 05 BCC LE5A1 ;
;
;
; RefPer/2 <= 3.49msec (RefPer <= 7msec)
;
; 1). LT 7.0 ms: Static Dwell = 4.7 ms + (RefPer - 7ms) / 2
;

LE59C: C3 01 34 ADDD #308 ;
LE59F: 20 10 BRA LE5B1 ;

;
; RefPer/2 > 3.49msec
;

LE5A1: 04 LSRD ;
LE5A2: 83 01 27 SUBD #295 ;
LE5A5: 25 05 BCS LE5AC ;

;
; RefPer/2 > 4.5msec
;
; 2). GT 7.0 ms and LT 25 ms:
; Static Dwell = 4.7 ms + (RefPer - 7 ms) / 16
;

LE5A7: C3 01 7E ADDD #382 ;
LE5AA: 20 05 BRA LE5B1 ;

;
; Make RefPer = (RefPer + 23.3 msec) / 4
;
; 3). GT 25 ms: Static Dwell = 5.825 ms + (RefPer - 25 ms) / 46
;

LE5AC: C3 05 F7 ADDD #1527 ;
LE5AF: 04 LSRD ;
LE5B0: 04 LSRD ;
LE5B1: DD 49 STD L0049 ;

;
; Check BatV dwell required
;

LE5B3: 86 78 LDAA #120 ; 12.0v
LE5B5: 90 40 SUBA L0040 ; Battery Volts, * 10, adc cnts
LE5B7: 24 01 BCC LE5BA ;
LE5B9: 4F CLRA ;

;
; BatV dwell comp
;
; A has BatV delta from 12.0V
;

LE5BA: C6 04 LDAB #4 ;
LE5BC: 3D MUL ; D = delta BatV * 4: 610usec/volt

;
; Add the BatV + Stat Dwell + Dyn Dwell together
;

LE5BD: D3 49 ADDD L0049 ;
LE5BF: D3 59 ADDD L0059 ; dynamic dwell
LE5C1: DD 5B STD L005B ; dwell to ecu (15.26 usec bit)

;
; Limit dwell to ensure a 600usec firing period
;

LE5C3: FC BC 00 LDD LBC00 ; ecm drp counter
LE5C6: 83 00 27 SUBD #39 ;
LE5C9: 93 5B SUBD L005B ;
LE5CB: 24 04 BCC LE5D1 ;

;
; add back the original dwell minus the 600 usec for firing
;

LE5CD: D3 5B ADDD L005B ;
LE5CF: DD 5B STD L005B ;

;*==================================================
;*
;* Do SA lookups
;*
;*==================================================

;
; Lookup Main SA
;

LE5D1: CE D0 38 LDX #$D038 ; Main SA tbl
LE5D4: BD FA 84 JSR LFA84 ; get s/d map in A
LE5D7: 16 TAB ;
LE5D8: 96 1A LDAA L001A ; rpm scaled
LE5DA: 81 D0 CMPA #208 ; max of 3600 rpm
LE5DC: 23 02 BLS LE5E0 ;
LE5DE: 86 D0 LDAA #208 ;
LE5E0: BD FB B3 JSR LFBB3 ; 3d lkup, saved in L0049

;
; Do slope SA
;

LE5E3: D6 1B LDAB L001B ; rpm / 25
LE5E5: C1 90 CMPB #144 ; 3600 rpm, start of slope
LE5E7: 23 15 BLS LE5FE ;
LE5E9: F1 D0 0A CMPB LD00A ; 192: 4800 rpm
LE5EC: 23 03 BLS LE5F1 ; bra if rpm <= 4800
LE5EE: F6 D0 0A LDAB LD00A ; use as max: 4800 rpm
;
LE5F1: C0 90 SUBB #144 ; slope start rpm offset
LE5F3: 58 LSLB ; now rpm / 12.5
LE5F4: B6 D0 0B LDAA LD00B ; 32, 3.5 deg/1K rpm
LE5F7: 3D MUL ;
LE5F8: 9B 49 ADDA L0049 ; add in from main SA lookup
LE5FA: 24 02 BCC LE5FE ;
LE5FC: 86 FF LDAA #255 ;
;
LE5FE: 16 TAB ;
LE5FF: 4F CLRA ;
LE600: DD 4F STD L004F ; SA so Far

;
; Alternate between tcc locked & Coolant Comp SA
;

LE602: 96 66 LDAA L0066 ; 160Hz rts counter
LE604: 85 02 BITA #$02 ; b1, 0000 0010
LE606: 27 23 BEQ LE62B ; bra if b1 == 0

;
; Do Locked TCC retard SA, Rpm vs. Vac
;

LE608: B6 D0 28 LDAA LD028 ; 57, SA bias
LE60B: F6 D0 07 LDAB LD007 ; option byte: 0010 0100
LE60E: 2B 17 BMI LE627 ; do not bra, tcc equiped
;
LE610: D6 05 LDAB L0005 ;
LE612: 2A 13 BPL LE627 ; bra if b7 == 0, tcc unlocked
;
LE614: CE D1 45 LDX #$D145 ;
LE617: BD FA 84 JSR LFA84 ; get vac into A
LE61A: 44 LSRA ;
LE61B: 16 TAB ;
LE61C: 96 1B LDAA L001B ; rpm / 25
LE61E: 81 50 CMPA #80 ; 2000 rpm max
LE620: 23 02 BLS LE624 ;
LE622: 86 50 LDAA #80 ;
LE624: BD FB B3 JSR LFBB3 ; 3d lkup
;
LE627: 97 60 STAA L0060 ; tcc lcked retard SA
LE629: 20 11 BRA LE63C ; skip coolant comp lkup>>

;
; Do Coolant & Vac SA compensation
;

LE62B: CE D1 0E LDX #$D10E ;
LE62E: BD FA 84 JSR LFA84 ; get vac into A
LE631: 44 LSRA ;
LE632: 16 TAB ;
LE633: 96 21 LDAA L0021 ; coolant, defaulted, 1k pu, inverse, adc cnts
LE635: 43 COMA ; 1's comp
LE636: 44 LSRA ; deg C /= 2
LE637: BD FB B3 JSR LFBB3 ; 3d lkup
LE63A: 97 5F STAA L005F ; Coolant & Vac SA

;
; Do EGR SA
;
; This will lag filter L005D to 0 | 255 depending upon L00DF, b1
; b1 of L00DF is EGR active bit
;
LE63C: DE 5D LDX L005D ; EGR filtered SA
;
LE63E: F6 D0 1A LDAB LD01A ; filt coef, 12, egr off
LE641: 96 DF LDAA L00DF ; status word
LE643: 84 02 ANDA #$02 ; b1
LE645: 27 05 BEQ LE64C ; bra if b1 == 0, no egr
;
LE647: F6 D0 1B LDAB LD01B ; filt coef, 8, egr on
LE64A: 86 FF LDAA #255 ;
;
LE64C: BD FB 40 JSR LFB40 ; Lag Filter
LE64F: DD 5D STD L005D ; EGR filtered SA
;
LE651: C3 00 80 ADDD #$80 ; round up A
LE654: 36 PSHA ; save A
;
LE655: F6 D0 19 LDAB LD019 ; 11, 3.8 deg SA max for egr
LE658: 3D MUL ;
LE659: 89 00 ADCA #0 ; (L005D * 11) / 256
;
LE65B: 97 4C STAA L004C ; added to SA
;
;
; Do PE SA
;
; The inverse of L005D is used to attack in PE/WOT SA
;
LE65D: 4F CLRA ; pre-clr SA value
LE65E: D6 09 LDAB L0009 ; status word
LE660: 2A 0E BPL LE670 ; bra if b7 == 0
; required knock has NOT occurred
;
LE662: C5 60 BITB #$60 ; 0110 0000
LE664: 26 0A BNE LE670 ; bra if have ESC diag errors
;
LE666: D6 0D LDAB L000D ; status word
LE668: 2A 06 BPL LE670 ; bra if not in PE/WOT mode
;
LE66A: CE D1 5D LDX #$D15D ; PE SA tbl
LE66D: BD FB 6F JSR LFB6F ; get baro & do 2d lkup
;
LE670: 33 PULB ; msb of L005D, used to attack
LE671: 53 COMB ; 1's comp
LE672: 3D MUL ; (~L005D * LkUp) / 256
LE673: 89 00 ADCA #0 ;
LE675: 97 4E STAA L004E ; added to SA

;
; Do HiWay SA mode
;
LE677: CE 00 00 LDX #$0000 ; used to clr L006E,F
LE67A: 96 2E LDAA L002E ; vac
LE67C: B1 D0 22 CMPA LD022 ; 240
LE67F: 24 16 BCC LE697 ; bra & clr L006E timer
;
LE681: D6 21 LDAB L0021 ; coolant, defaulted, 1k pu, inverse, adc cnts
LE683: F1 D2 28 CMPB LD228 ; 199, 20c
LE686: 24 0F BCC LE697 ; bra & clr L006E timer
;
LE688: D6 30 LDAB L0030 ; mph / 1, filtered
LE68A: F1 D0 23 CMPB LD023 ; 52 mph
LE68D: 25 08 BCS LE697 ; bra & clr L006E timer
;
LE68F: DE 6E LDX L006E ; timer
LE691: BC D0 24 CPX LD024 ; 4800 (4800 / 80 = 60 sec)
LE694: 22 06 BHI LE69C ; go do SA lookup
;
LE696: 08 INX ; advance timer
LE697: DF 6E STX L006E ; save timer
LE699: 4F CLRA ; pre-clr spark
LE69A: 20 09 BRA LE6A5 ; go save 0 deg SA & continue
;
LE69C: 44 LSRA ; VAC /= 2
LE69D: C6 30 LDAB #48 ; lower vac limit
LE69F: CE D1 3F LDX #$D13F ; HiWay SA table
LE6A2: BD FB 91 JSR LFB91 ; 2d lkup w/SBA
;
LE6A5: 97 4D STAA L004D ; HiWay SA
;
;
; for transient fuel calc interval timer (for tps/map filters)
;
LE6A7: D6 0D LDAB L000D ; status word
;
LE6A9: 96 30 LDAA L0030 ; mph / 1, filtered
LE6AB: B1 D0 29 CMPA LD029 ; 6
LE6AE: 22 0D BHI LE6BD ; bra if mph > 6 mph
;
LE6B0: 96 25 LDAA L0025 ; s/d map, KPa = (N * 0.3125) + 20
;
LE6B2: C5 02 BITB #$02 ;
LE6B4: 27 0E BEQ LE6C4 ;
;
LE6B6: 90 2C SUBA L002C ; s/d map, slo filtered from L0025
LE6B8: B1 D0 2B CMPA LD02B ; 10, 3KPa
LE6BB: 24 17 BCC LE6D4 ; bra if delta map > 3 Kpa

;
; here for no transient fuel calc interval timer (for tps/map filters)
;
LE6BD: C4 FD ANDB #$FD ; clr b1, 1111 1101
LE6BF: D7 0D STAB L000D ; status word
LE6C1: 4F CLRA ; clear for no SA
LE6C2: 20 2D BRA LE6F1 ;

;
;
;
LE6C4: 90 27 SUBA L0027 ; s/d map, two delayed from L0025
LE6C6: 25 F5 BCS LE6BD ;
;
LE6C8: B1 D0 2A CMPA LD02A ; 32, 10 KPa
LE6CB: 25 F0 BCS LE6BD ;
;
;
; Here to do transient fuel calc interval timer (for tps/map filters)
;
LE6CD: CA 02 ORAB #$02 ;
LE6CF: D7 0D STAB L000D ; status word
LE6D1: 7F 00 9A CLR L009A ; transient fuel calc interval timer (for tps/map filters)
;
LE6D4: 44 LSRA ; delta map /= 2
LE6D5: CE D1 CC LDX #$D1CC ;
LE6D8: BD FB 95 JSR LFB95 ; 2d lkup
LE6DB: 36 PSHA ; save result

;
; get map mult for trans SA
;
LE6DC: 96 25 LDAA L0025 ; s/d map, KPa = (N * 0.3125) + 20
LE6DE: CE D1 D5 LDX #$D1D5 ;
LE6E1: BD FB 95 JSR LFB95 ; 2d lkup
LE6E4: 33 PULB ; base trans sa
LE6E5: 3D MUL ;
LE6E6: 36 PSHA ; save result of calc
;
;
; get iat mult for trans SA
;
LE6E7: 96 24 LDAA L0024 ; iat, 1k pu, inverse, adc cnts
LE6E9: CE D2 00 LDX #$D200 ;
LE6EC: BD FB 8C JSR LFB8C ; 2d lkup w/line cnt
LE6EF: 33 PULB ;
LE6F0: 3D MUL ;
;
LE6F1: 97 4B STAA L004B ; trans SA

;
; Load additional ALDL SA value
;
LE6F3: 5F CLRB ;
LE6F4: 96 02 LDAA L0002 ; status word
LE6F6: 85 20 BITA #$20 ;
LE6F8: 27 03 BEQ LE6FD ; bra for no ALDL SA
;
LE6FA: F6 D0 21 LDAB LD021 ; 6, 2.1 deg of aldl SA

;
; Add up the SA so far
;

LE6FD: DE 4F LDX L004F ; SA so far
LE6FF: 3A ABX ; from previous lookup
;
LE700: D6 5F LDAB L005F ; Coolant & Vac SA
LE702: 3A ABX ;
LE703: D6 60 LDAB L0060 ; Tcc locked retard SA
LE705: 3A ABX ;
LE706: D6 4B LDAB L004B ; Transient SA
LE708: 3A ABX ;
LE709: D6 4C LDAB L004C ; Egr SA
LE70B: 3A ABX ;
LE70C: D6 4E LDAB L004E ; Pe SA
LE70E: 3A ABX ;
LE70F: D6 4D LDAB L004D ; Hiway SA
LE711: 3A ABX ;
LE712: D6 E7 LDAB L00E7 ; Choke SA
LE714: 3A ABX ;
;
LE715: DF 4F STX L004F ; SA

;
; Do idle correction SA
;

LE717: CE D1 72 LDX #$D172 ; SA corr idle low
LE71A: DC 02 LDD L0002 ; status word
LE71C: 2A 30 BPL LE74E ; bra if not in idle
;
LE71E: C5 08 BITB #$08 ; b3 of L0003
LE720: 26 2C BNE LE74E ; bra if b3 == 1
;
LE722: D6 CD LDAB L00CD ;
LE724: 26 28 BNE LE74E ;
;
LE726: 96 CF LDAA L00CF ; desired idle rpm / 12.5, final
LE728: 90 1D SUBA L001D ; rpm / 12.5, filtered
LE72A: 24 05 BCC LE731 ; bra if idle < desired
;
LE72C: 40 NEGA ; delta from desired & true rpm
LE72D: 5A DECB ;
LE72E: CE D1 61 LDX #$D161 ; SA corr idle high
;
LE731: 37 PSHB ; L00CD
LE732: 3C PSHX ; tbl address
LE733: 48 ASLA ; rpm/12.5 *= 2
LE734: 48 ASLA ; rpm/12.5 *= 2
; rpm now / 3.125
;
LE735: BD FB 82 JSR LFB82 ; 2d lkup w/upr limt in 1st tbl entry
;
;
LE738: 38 PULX ; get tbl addr
LE739: 36 PSHA ; save result of lookup
LE73A: C6 08 LDAB #8 ; offset to next tbl
LE73C: 3A ABX ; add to tbl addr
LE73D: 96 25 LDAA L0025 ; s/d map, KPa = (N * 0.3125) + 20
LE73F: BD FB 82 JSR LFB82 ; 2d lkup w/upr limt in 1st tbl entry
LE742: 33 PULB ; result of SA lookup
LE743: 3D MUL ;
LE744: 16 TAB ; (SA * Mult) / 256
;
LE745: 32 PULA ; L00CD
LE746: 4D TSTA ;
LE747: 27 01 BEQ LE74A ;
;
LE749: 53 COMB ; 1's comp
;
LE74A: D3 4F ADDD L004F ; SA
LE74C: DD 4F STD L004F ; SA

;
; Some sort of delta tps% & delta rpm SA term
;
;
; LD02C: FCB 3 ; delta tps%, 1.2%
; LD02D: FCB 3 ; delta tps%, 1.2% (closing)
; LD02E: FCB 128 ; tps%, 50%
; LD02F: FCB 26 ; tps%, 10% (closing)
; LD030: FCB 9 ;
; LD031: FCB 7 ; (closing)

LE74E: CE D0 2C LDX #$D02C ; indexed tbl address
LE751: 96 43 LDAA L0043 ; tps%, from idle
LE753: D6 44 LDAB L0044 ; tps%, one delayed from L0043
LE755: 10 SBA ;
LE756: 24 04 BCC LE75C ; bra if opening throttle
;
;
; throttle is closing
;
LE758: 40 NEGA ; 2's compl
LE759: 08 INX ;
LE75A: D6 43 LDAB L0043 ; tps%, from idle
;
;
; throttle is opening (| closing)
;
LE75C: A1 00 CMPA 0,X ; delta tps%
LE75E: 25 27 BCS LE787 ; bra if delta tps > 0,X (1.2%)
;
LE760: E1 02 CMPB 2,X ; tps%
LE762: 24 06 BCC LE76A ; bra if tps% < 2,X (10% | 50%)
;
LE764: D6 03 LDAB L0003 ; status word
LE766: CA 02 ORAB #$02 ;
LE768: 20 25 BRA LE78F ;
;
;
; delta tps% < 1.2% & TPS% < 10% | 50%
;
LE76A: 96 1B LDAA L001B ; rpm / 25
LE76C: 90 1C SUBA L001C ; rpm / 25 one delayed
LE76E: 8B 08 ADDA #8 ; add in 200 rpm
LE770: 2A 01 BPL LE773 ; bra if no undrflow
LE772: 4F CLRA ;
;
LE773: 81 10 CMPA #16 ; delta of 400 rpm, max val
LE775: 23 02 BLS LE779 ; bra if <= 400 rpm
LE777: 86 10 LDAA #16 ; load max
;
LE779: B1 D0 33 CMPA LD033 ; 3, 75 rpm
LE77C: 25 15 BCS LE793 ; bra if < 75 rpm, go do lkup
;
LE77E: B1 D0 32 CMPA LD032 ; 13, 325 rpm
LE781: 24 10 BCC LE793 ; bra if > 325 rpm, go do lkup
;
LE783: DC 4F LDD L004F ; SA
LE785: 20 31 BRA LE7B8 ; and skip next routine
;
;
; delta tps% > 0,X (1.2%)
;
LE787: D6 03 LDAB L0003 ; status word
LE789: C5 02 BITB #$02 ; b1
LE78B: 27 DD BEQ LE76A ;
;
LE78D: C4 FD ANDB #$FD ;

;
; delta tps% < 0,x (1.2%) & tps% > 10% | 50%
;
LE78F: D7 03 STAB L0003 ; status word
LE791: A6 04 LDAA 4,X ; 7 | 9
;
;
; do lookup and get indexed mult
;
LE793: 36 PSHA ; delta rpm/25 value
LE794: 96 1B LDAA L001B ; rpm / 25
LE796: C6 10 LDAB #16 ; lwr lim of 400 rpm
LE798: CE D1 F7 LDX #$D1F7 ; tbl addr
LE79B: BD FB 83 JSR LFB83 ; 2d lkup w/upr limt in 1st tbl entry, lwr limt in B
;
LE79E: 33 PULB ; delta rpm/25 value
LE79F: CE D1 E6 LDX #$D1E6 ;
LE7A2: 3A ABX ; add in delta rpm/25 offset
LE7A3: E6 00 LDAB 0,X ; get mult value
LE7A5: 2A 01 BPL LE7A8 ; bra if b7 == 0
LE7A7: 50 NEGB ;
;
LE7A8: 3D MUL ; AB = A * B
LE7A9: 05 LSLD ; mult result by 4
LE7AA: 05 LSLD ;
LE7AB: 16 TAB ;
LE7AC: 4F CLRA ;
LE7AD: 6D 00 TST 0,X ; tst mult term
LE7AF: 2A 02 BPL LE7B3 ;
LE7B1: 50 NEGB ;
LE7B2: 4A DECA ;
;
LE7B3: FD 04 51 STD L0451 ; HU ram
;
LE7B6: D3 4F ADDD L004F ; SA

;
; sub off SA bias's
;

LE7B8: F0 D0 0D SUBB LD00D ; 57, 20 deg, coolant comp bias
LE7BB: 82 00 SBCA #0 ;
LE7BD: F0 D0 0E SUBB LD00E ; 57, 20 deg, tcc locked bias
LE7C0: 82 00 SBCA #0 ;
LE7C2: F0 D0 28 SUBB LD028 ; 57, 20 deg, main SA bias
LE7C5: 82 00 SBCA #0 ;
LE7C7: DD 49 STD L0049 ; SA
;
;
; Check for HU's SA
;
LE7C9: 96 00 LDAA L0000 ; status word
LE7CB: 85 02 BITA #$02 ;
LE7CD: 27 03 BEQ LE7D2 ;
LE7CF: BD 58 0C JSR L580C ; HU

;
; Sub off Initial SA (base)
;
LE7D2: DC 49 LDD L0049 ; SA
LE7D4: F0 D0 09 SUBB LD009 ; 0, initial SA (base timing)
LE7D7: 82 00 SBCA #0 ;
LE7D9: DD 61 STD L0061 ; SA

;
; Test for max SA allowed
;
LE7DB: FC D0 14 LDD LD014 ; max SA, 40.1deg
LE7DE: 93 61 SUBD L0061 ; SA
LE7E0: 2E 04 BGT LE7E6 ;
LE7E2: D3 61 ADDD L0061 ;
LE7E4: DD 61 STD L0061 ; SA

;
; Knock retard
;
LE7E6: FC BC 0A LDD LBC0A ; Knock counter (PA3)
LE7E9: DD 4A STD L004A ; tmp PA3 cnts
LE7EB: 93 69 SUBD L0069 ; any new knocks?
LE7ED: 4D TSTA ;
LE7EE: 27 02 BEQ LE7F2 ;
LE7F0: C6 FF LDAB #255 ; rolled to A, set MAX cnt's
;
LE7F2: D7 4D STAB L004D ; delta knock cnts (new ones)
LE7F4: DE EB LDX L00EB ; eng run time
LE7F6: BC D4 86 CPX LD486 ; 240 sec's
LE7F9: 23 0B BLS LE806 ; bra if eng run < 240 sec
;
LE7FB: F1 D4 90 CMPB LD490 ; 2 cnts
LE7FE: 23 09 BLS LE809 ; bra if new cnts <= 2
;
LE800: 96 09 LDAA L0009 ; status word
LE802: 8A 80 ORAA #$80 ; flag that required knock has occurred
LE804: 97 09 STAA L0009 ; status word
;
LE806: 7F 00 90 CLR L0090 ; knock test timer, ESC 43
;
LE809: DE 4A LDX L004A ; tmp PA3 cnts
LE80B: DF 69 STX L0069 ; perm PA3 cnts

;
; Check Knock Retard quals
;
LE80D: 4F CLRA ;
LE80E: D6 21 LDAB L0021 ; coolant, defaulted, 1k pu, inverse, adc cnts
LE810: F1 D0 36 CMPB LD036 ; 50c
LE813: 24 7C BCC LE891 ;
;
LE815: 96 30 LDAA L0030 ; mph / 1, filtered
LE817: B1 D0 34 CMPA LD034 ; 10 mph
LE81A: 24 07 BCC LE823 ;
;
LE81C: 96 1D LDAA L001D ; rpm / 12.5, filtered
LE81E: B1 D0 35 CMPA LD035 ; 1000 rpm
LE821: 25 7B BCS LE89E ;
;
LE823: 96 40 LDAA L0040 ; Battery Volts, * 10, adc cnts
LE825: 81 5A CMPA #90 ; 9.0V
LE827: 25 06 BCS LE82F ; bra if BatV < 9v
;
LE829: 96 09 LDAA L0009 ; status word
LE82B: 85 60 BITA #$60 ;
LE82D: 27 04 BEQ LE833 ;
;
;
; Low BatV, use max knock's
;
LE82F: 86 FF LDAA #255 ; max
LE831: 97 4D STAA L004D ; delta knock cnts (new ones)

;
; Lookup IAT knock retard SA multiplier
;
LE833: CE D1 9F LDX #$D19F ;
LE836: 96 24 LDAA L0024 ; iat, 1k pu, inverse, adc cnts
LE838: 43 COMA ; 1's comp
LE839: 44 LSRA ; IAT /= 2
LE83A: BD FB 95 JSR LFB95 ; 2d lkup
LE83D: 97 4E STAA L004E ;

;
; Decide whether PE or Not
;
LE83F: D6 0D LDAB L000D ; status word
LE841: 2A 0D BPL LE850 ; bra if not in PE/WOT mode

;
; Do PE Knock tbls
;
LE843: CE D1 B6 LDX #$D1B6 ;
LE846: 3C PSHX ;
LE847: CE D1 93 LDX #$D193 ; knck sa mul tbl
LE84A: 96 1B LDAA L001B ; rpm / 25
LE84C: C6 10 LDAB #16 ; lwr limit for lkup
LE84E: 20 13 BRA LE863 ;

;
; Do non-PE Knock tbls
;
LE850: 86 FF LDAA #255 ;
LE852: D6 08 LDAB L0008 ; status word
LE854: C5 C0 BITB #$C0 ;
LE856: 26 02 BNE LE85A ;
;
LE858: 96 2E LDAA L002E ; vac
;
LE85A: C6 40 LDAB #64 ; lwr limit for lkup
LE85C: CE D1 BC LDX #$D1BC ;
LE85F: 3C PSHX ;
LE860: CE D1 99 LDX #$D199 ;

;
; lkup & calc Knock SA Multiplier
;
LE863: 44 LSRA ; vac | rpm
LE864: DD 4F STD L004F ; tmp storage, lkup idx & lwr lim
LE866: BD FB 83 JSR LFB83 ; 2d lkup w/upr limt in 1st tbl entry, lwr limt in B
LE869: D6 4E LDAB L004E ; IAT knock retard SA multiplier
LE86B: 3D MUL ;
LE86C: 05 LSLD ;
LE86D: 24 02 BCC LE871 ;
LE86F: 86 FF LDAA #255 ;
;
LE871: 97 4E STAA L004E ; max SA knock retard allowed

;
; Do Final Knock Attack SA Calc
;
LE873: 38 PULX ;
LE874: DC 4F LDD L004F ; tmp storage
LE876: BD FB 83 JSR LFB83 ; 2d lkup w/upr limt in 1st tbl entry, lwr limt in B
LE879: D6 4D LDAB L004D ; delta knock cnts (new ones)
LE87B: F1 D0 37 CMPB LD037 ; 2, min cnts to do retard
LE87E: 24 01 BCC LE881 ;
LE880: 5F CLRB ;
;
LE881: 3D MUL ;
LE882: 05 LSLD ;
LE883: 25 04 BCS LE889 ;
;
LE885: 9B 6D ADDA L006D ; knock retard SA
LE887: 24 02 BCC LE88B ;
;
LE889: 86 FF LDAA #255 ;
LE88B: 91 4E CMPA L004E ; max SA knock retard allowed
LE88D: 23 02 BLS LE891 ;
;
LE88F: 96 4E LDAA L004E ; max SA knock retard allowed
;
;
; Sub Knock SA from total SA
;
LE891: 97 6D STAA L006D ; knock retard SA
LE893: 44 LSRA ; sa /= 2
LE894: 97 49 STAA L0049 ; tmp save
LE896: DC 61 LDD L0061 ; get final SA
LE898: D0 49 SUBB L0049 ; sub out knock retard
LE89A: 82 00 SBCA #0 ; rnd dwn
LE89C: DD 61 STD L0061 ; and Save
;
;
; Lag Filter val in L008C
;
LE89E: B6 D4 3B LDAA LD43B ; diag mask 2, 1011 1001
LE8A1: 85 20 BITA #$20 ; 0010 0000
LE8A3: 27 2B BEQ LE8D0 ; do not bra
;
LE8A5: F6 D4 6E LDAB LD46E ; 32, filt coef
LE8A8: DE 8C LDX L008C ; SA term
LE8AA: 96 0B LDAA L000B ;
LE8AC: 84 04 ANDA #$04 ; b2
LE8AE: 27 05 BEQ LE8B5 ;
;
LE8B0: 86 FF LDAA #255 ;
LE8B2: F6 D4 6D LDAB LD46D ; 128, filt coef
;
LE8B5: BD FB 40 JSR LFB40 ; Lag Filter
LE8B8: DD 8C STD L008C ; SA term
LE8BA: CE 00 8C LDX #$008C ; SA term addr
LE8BD: B6 D4 6C LDAA LD46C ; 4.2deg
LE8C0: BD FC 05 JSR LFC05 ; AB = (A x *X) / 256
LE8C3: 58 LSLB ;
LE8C4: 89 00 ADCA #0 ; rndup A

;
; Now sub L008C from final SA
;
LE8C6: 97 49 STAA L0049 ;
LE8C8: DC 61 LDD L0061 ; final SA
LE8CA: D0 49 SUBB L0049 ;
LE8CC: 82 00 SBCA #0 ;
LE8CE: DD 61 STD L0061 ; final SA

;
; Check & adjust for Minimum SA
;
LE8D0: FC D0 16 LDD LD016 ; min SA, -3.5deg ($FFF5)
LE8D3: 93 61 SUBD L0061 ;
LE8D5: 2D 04 BLT LE8DB ;
LE8D7: D3 61 ADDD L0061 ;
LE8D9: DD 61 STD L0061 ; Final SA

;
; Add SA to create knock, if required
;
LE8DB: 96 90 LDAA L0090 ; knock test timer, ESC 43
LE8DD: 27 1B BEQ LE8FA ;
;
LE8DF: DE 61 LDX L0061 ; final SA
LE8E1: F6 D4 8E LDAB LD48E ; added SA for knock test, 14 deg
LE8E4: 96 09 LDAA L0009 ; status word
LE8E6: 85 10 BITA #$10 ;
LE8E8: 27 03 BEQ LE8ED ;
;
LE8EA: F6 D4 8F LDAB LD48F ; added SA for knock test, 20 deg
LE8ED: 3A ABX ;
LE8EE: BC D0 14 CPX LD014 ; max SA, 40.1deg
LE8F1: 23 05 BLS LE8F8 ;
;
LE8F3: 7F 00 90 CLR L0090 ; clr knock test timer
LE8F6: DE 61 LDX L0061 ;
LE8F8: DF 61 STX L0061 ; Final SA
;
;
; test if SA is adv | rtd
;
LE8FA: DC 61 LDD L0061 ; Final SA
LE8FC: 2B 08 BMI LE906 ;
;
LE8FE: 96 01 LDAA L0001 ; status word
LE900: 84 FE ANDA #$FE ;
LE902: 97 01 STAA L0001 ; status word
LE904: 20 07 BRA LE90D ;
;
LE906: 96 01 LDAA L0001 ; status word
LE908: 8A 01 ORAA #1 ;
LE90A: 97 01 STAA L0001 ; status word
LE90C: 50 NEGB ;
;
LE90D: 96 63 LDAA L0063 ; drp info
LE90F: 7D 00 64 TST L0064 ;
LE912: 2A 01 BPL LE915 ;
LE914: 4C INCA ;
;
LE915: 3D MUL ;
LE916: 4C INCA ;
;
;
; check HU
;
LE917: D6 00 LDAB L0000 ; status word
LE919: C5 02 BITB #$02 ;
LE91B: 27 03 BEQ LE920 ;
LE91D: BD 58 12 JSR L5812 ;
;
;
; Convert SA to time based & program ecu
;
LE920: CE 00 18 LDX #$0018 ; DRP cnt's
LE923: BD FC 05 JSR LFC05 ; AB = (A x *X) / 256
LE926: DD 4E STD L004E ;

;
; Lookup SA latency corretion
;
LE928: 96 1B LDAA L001B ; rpm / 25
LE92A: CE D1 A8 LDX #$D1A8 ;
LE92D: BD FB 82 JSR LFB82 ; 2d lkup w/upr limt in 1st tbl entry
LE930: 97 4C STAA L004C ;
;
;
; Finalize SA value for ecu programming
;
LE932: D6 01 LDAB L0001 ; status word
LE934: C5 01 BITB #$01 ;
LE936: 26 06 BNE LE93E ;
LE938: 4F CLRA ;
LE939: 5F CLRB ;
LE93A: 93 4E SUBD L004E ;
LE93C: 20 02 BRA LE940 ;
LE93E: DC 4E LDD L004E ;
LE940: D0 4C SUBB L004C ;
LE942: 82 00 SBCA #0 ;
LE944: DD 49 STD L0049 ;
LE946: 4F CLRA ;
LE947: 5F CLRB ;
LE948: B3 BC 00 SUBD LBC00 ; ecm drp counter
LE94B: 04 LSRD ;
LE94C: 04 LSRD ;
LE94D: 04 LSRD ;
LE94E: 04 LSRD ;
LE94F: 8A F0 ORAA #$F0 ;

;
; Program ecu SA counters
;
LE951: F3 BC 20 ADDD LBC20 ;
LE954: 93 49 SUBD L0049 ;
LE956: 2B 04 BMI LE95C ;
;
LE958: D3 49 ADDD L0049 ;
LE95A: DD 49 STD L0049 ;
;
LE95C: DC 49 LDD L0049 ;
LE95E: B3 BC 20 SUBD LBC20 ;
LE961: BD FD 19 JSR LFD19 ; delay, rts only
LE964: FD BC 28 STD LBC28 ;
LE967: BD FD 19 JSR LFD19 ; delay, rts only
LE96A: F3 BC 1C ADDD LBC1C ;
LE96D: 93 5B SUBD L005B ;
LE96F: 01 NOP ;
LE970: DE 5B LDX L005B ;
LE972: FD BC 26 STD LBC26 ;
LE975: BD FD 19 JSR LFD19 ; delay, rts only
LE978: FF BC 1C STX LBC1C ;
LE97B: BD FD 19 JSR LFD19 ; delay, rts only
LE97E: DC 49 LDD L0049 ;
LE980: FD BC 36 STD LBC36 ;

;
; Do EST diag test
;
LE983: 96 00 LDAA L0000 ; status word
LE985: 85 08 BITA #$08 ;
LE987: 27 6D BEQ LE9F6 ;
;
LE989: D6 02 LDAB L0002 ; status word
LE98B: C5 04 BITB #$04 ;
LE98D: 27 4D BEQ LE9DC ;
LE98F: FE BC 06 LDX LBC06 ; EST Circuit
LE992: DF 49 STX L0049 ;
LE994: F6 D4 3B LDAB LD43B ; diag mask 2, 1011 1001
LE997: C5 01 BITB #$01 ;
LE999: 27 43 BEQ LE9DE ;
LE99B: F6 08 81 LDAB L0881 ; MCU1 I/O
LE99E: C5 20 BITB #$20 ;
LE9A0: 27 2C BEQ LE9CE ;
LE9A2: D6 01 LDAB L0001 ; status word
LE9A4: C5 40 BITB #$40 ;
LE9A6: 26 41 BNE LE9E9 ;
LE9A8: 96 00 LDAA L0000 ; status word
LE9AA: 2B 26 BMI LE9D2 ;
;
LE9AC: 36 PSHA ;
LE9AD: DC 49 LDD L0049 ;
LE9AF: 93 93 SUBD L0093 ; EST circuit data
LE9B1: 4D TSTA ;
LE9B2: 32 PULA ;
LE9B3: 26 0D BNE LE9C2 ;
LE9B5: F1 D4 83 CMPB LD483 ; 0
LE9B8: 22 08 BHI LE9C2 ;
LE9BA: 85 40 BITA #$40 ;
LE9BC: 26 20 BNE LE9DE ;
LE9BE: 8A 40 ORAA #64 ;
LE9C0: 20 0C BRA LE9CE ;
LE9C2: D6 95 LDAB L0095 ; err 42A cnt'r
LE9C4: F1 D4 84 CMPB LD484 ; 4, Num of EST faults for 42A
LE9C7: 22 09 BHI LE9D2 ;
LE9C9: 7C 00 95 INC L0095 ; err 42A cnt'r
LE9CC: 84 BF ANDA #$BF ;
LE9CE: DF 93 STX L0093 ; EST circuit data
LE9D0: 20 08 BRA LE9DA ;
;
;
LE9D2: 8A 80 ORAA #$80 ;
LE9D4: D6 13 LDAB L0013 ; error flag 2
LE9D6: CA 01 ORAB #$01 ;
LE9D8: D7 13 STAB L0013 ; error flag 2
;
LE9DA: 97 00 STAA L0000 ; status word
LE9DC: 20 4E BRA LEA2C ;
LE9DE: D6 01 LDAB L0001 ; status word
LE9E0: CA 40 ORAB #64 ;
LE9E2: D7 01 STAB L0001 ; status word
LE9E4: 7F 00 95 CLR L0095 ; err 42A cnt'r
LE9E7: DF 93 STX L0093 ; EST circuit data
LE9E9: 84 F7 ANDA #$F7 ;
LE9EB: 97 00 STAA L0000 ; status word
LE9ED: FC BC 2C LDD LBC2C ;
LE9F0: BD FD 19 JSR LFD19 ; delay, rts only
LE9F3: FD BC 24 STD LBC24 ;
LE9F6: 96 13 LDAA L0013 ; error flag 2
LE9F8: 8A 01 ORAA #1 ;
LE9FA: D6 DE LDAB L00DE ; status word
LE9FC: 2A 09 BPL LEA07 ;
LE9FE: 97 13 STAA L0013 ; error flag 2
LEA00: FC BC 3C LDD LBC3C ; PWM control register
LEA03: C4 EF ANDB #$EF ;
LEA05: 20 05 BRA LEA0C ;
LEA07: FC BC 3C LDD LBC3C ; PWM control register
LEA0A: CA 10 ORAB #16 ;
LEA0C: BD FD 19 JSR LFD19 ; delay, rts only
LEA0F: FD BC 3C STD LBC3C ; PWM control register
LEA12: 20 18 BRA LEA2C ;
LEA14: 86 04 LDAA #4 ;
LEA16: BD FC 4D JSR LFC4D ;
LEA19: CE FF FF LDX #$FFFF ;
LEA1C: DF 18 STX L0018 ; drp count
LEA1E: 96 DE LDAA L00DE ; status word
LEA20: 85 08 BITA #$08 ;
LEA22: 26 03 BNE LEA27 ;
LEA24: 08 INX ;
LEA25: DF EB STX L00EB ; eng run time
LEA27: 86 EF LDAA #239 ;
LEA29: BD FC 42 JSR LFC42 ;
LEA2C: 96 02 LDAA L0002 ; status word
LEA2E: 84 FB ANDA #$FB ;
LEA30: 97 02 STAA L0002 ; status word
LEA32: 7E E3 D4 JMP LE3D4 ; return to rts loop

;-----------------------------------------------
;
; End of Minor Spark Loop
;
;-----------------------------------------------

;*==================================================
;*
;* Real Time Service Routine 0
;*
;*==================================================

LEA35: 86 02 LDAA #$02 ; BatV channel
LEA37: 5F CLRB ; wait for data
LEA38: BD FC 1A JSR LFC1A ; ADC routine
LEA3B: 36 PSHA ;
;
LEA3C: CC 00 01 LDD #$0001 ; PumpV channel & return immed
LEA3F: BD FC 1A JSR LFC1A ; ADC routine
;
LEA42: 32 PULA ; BatV
LEA43: 36 PSHA ; BatV
LEA44: D6 00 LDAB L0000 ; status word
LEA46: 81 5A CMPA #90 ; 9.0v
LEA48: 24 4A BCC LEA94 ; bra if BatV >= 9v
LEA4A: 81 28 CMPA #40 ; 4.0v
LEA4C: 24 7B BCC LEAC9 ; bra if BatV >= 4v
;
LEA4E: 96 40 LDAA L0040 ; Battery Volts, * 10, adc cnts
LEA50: 81 28 CMPA #40 ;
LEA52: 24 75 BCC LEAC9 ; bra if BatV >= 4v
;
;
; BatV < 4.0v
;
LEA54: 4F CLRA ;
LEA55: 97 EB STAA L00EB ; eng run time, msb
LEA57: 97 EC STAA L00EC ; eng run time, lsb
LEA59: 8A 04 ORAA #4 ;
LEA5B: 97 DE STAA L00DE ; status word
LEA5D: 96 01 LDAA L0001 ; status word
LEA5F: 84 7F ANDA #$7F ; Engine is not Running
LEA61: 97 01 STAA L0001 ; status word
LEA63: 96 DF LDAA L00DF ; status word
LEA65: 84 05 ANDA #$05 ;
LEA67: C4 DF ANDB #$DF ;
LEA69: C5 10 BITB #$10 ; engine shutdown in effect
LEA6B: 26 23 BNE LEA90 ; bra if true
;
LEA6D: 85 01 BITA #$01 ;
LEA6F: 27 08 BEQ LEA79 ;
;
LEA71: 96 10 LDAA L0010 ; status word
LEA73: 84 FC ANDA #$FC ;
LEA75: 97 10 STAA L0010 ; status word
LEA77: CA 20 ORAB #$20 ;
LEA79: CA 10 ORAB #$10 ; engine shutdown
LEA7B: D7 00 STAB L0000 ; status word

;
;
;
LEA7D: 96 24 LDAA L0024 ; iat, 1k pu, inverse, adc cnts
LEA7F: F6 D0 05 LDAB LD005 ; option byte: 0010 0011
LEA82: C5 20 BITB #$20 ; tst b5
LEA84: 26 02 BNE LEA88 ; b5 == 1, do bra
LEA86: 96 21 LDAA L0021 ; coolant, defaulted, 1k pu, inverse, adc cnts
;
LEA88: B1 D2 5D CMPA LD25D ; cool/iat threshold, 40c
LEA8B: 86 04 LDAA #4 ;
LEA8D: 25 01 BCS LEA90 ;
LEA8F: 4F CLRA ;
;
LEA90: 97 DF STAA L00DF ; status word
LEA92: 20 35 BRA LEAC9 ;

;
; BatV >= 9.0v
;
LEA94: C5 10 BITB #$10 ;
LEA96: 27 05 BEQ LEA9D ;
LEA98: FE BC 06 LDX LBC06 ; EST Circuit
LEA9B: DF 93 STX L0093 ; EST circuit data
LEA9D: 96 DF LDAA L00DF ; status word
LEA9F: 85 40 BITA #$40 ;
LEAA1: 26 1A BNE LEABD ;
LEAA3: 96 56 LDAA L0056 ;
LEAA5: B1 D4 97 CMPA LD497 ;
LEAA8: 23 0B BLS LEAB5 ;
LEAAA: 96 E3 LDAA L00E3 ;
LEAAC: 8A 04 ORAA #4 ;
LEAAE: 97 E3 STAA L00E3 ;
LEAB0: BD FD 1A JSR LFD1A ; Do CkSum on Error Flags
LEAB3: 97 EA STAA L00EA ; error flag cksum
LEAB5: 7C 00 56 INC L0056 ;
LEAB8: 26 03 BNE LEABD ;
LEABA: 7A 00 56 DEC L0056 ;
LEABD: 96 DE LDAA L00DE ; status word
LEABF: 84 FB ANDA #$FB ;
LEAC1: 97 DE STAA L00DE ; status word
LEAC3: C4 EF ANDB #$EF ;
LEAC5: C4 DF ANDB #$DF ;
LEAC7: D7 00 STAB L0000 ; status word

;
; BatV >= 4v & < 9v
;
LEAC9: 32 PULA ; BatV from ADC
LEACA: 97 40 STAA L0040 ; Battery Volts, * 10, adc cnts
LEACC: BD FC 27 JSR LFC27 ; get val from adc, Pump Volts
LEACF: 97 41 STAA L0041 ; save PmpV adc val
;
LEAD1: D6 01 LDAB L0001 ; status word
LEAD3: 2A 10 BPL LEAE5 ; Engine is not Running
LEAD5: CA 08 ORAB #$08 ;
LEAD7: 96 DF LDAA L00DF ; status word
LEAD9: 8A 01 ORAA #$01 ;
LEADB: 97 DF STAA L00DF ; status word
LEADD: 20 19 BRA LEAF8 ;

;
; eng off time
;
LEADF: 96 DE LDAA L00DE ; status word
LEAE1: 84 FB ANDA #$FB ;
LEAE3: 97 DE STAA L00DE ; status word
LEAE5: 4F CLRA ;
LEAE6: C5 08 BITB #$08 ;
LEAE8: 26 09 BNE LEAF3 ;
LEAEA: 96 52 LDAA L0052 ;
LEAEC: 27 08 BEQ LEAF6 ;
LEAEE: B1 D0 13 CMPA LD013 ; 40, eng off time, (4 sec's)
LEAF1: 22 EC BHI LEADF ;
;
LEAF3: 4C INCA ;
LEAF4: 97 52 STAA L0052 ;
LEAF6: C4 F7 ANDB #$F7 ;
LEAF8: D7 01 STAB L0001 ; status word
LEAFA: 39 RTS ;

;*==================================================
;*
;* Real Time Service Routine 1
;*
;*==================================================

LEAFB: BD FD 27 JSR LFD27 ; Read Coolant Temp & do Diag Tests
LEAFE: BD FC 79 JSR LFC79 ; Psuedo Baro Read
LEB01: 39 RTS ;

;*==================================================
;*
;* Real Time Service Routine 2
;*
;* Ck Diag Mode Status
;*
;* Normal mode (R>=20K ohm)
;* ALDL mode (R==10K ohm)
;* Backup mode (R==3.9 K ohm)
;* Field Service (R<=500 ohm)
;*==================================================

LEB02: 86 0C LDAA #12 ; aldl channel
LEB04: 5F CLRB ; wait for data
LEB05: BD FC 1A JSR LFC1A ; ADC routine
;
LEB08: D6 02 LDAB L0002 ; status word
LEB0A: C4 C7 ANDB #$C7 ; clr b5, b4 & b3: 1100 0111
;
LEB0C: 81 28 CMPA #40 ; 800 mv
LEB0E: 25 0C BCS LEB1C ; bra if diag sw lt 800 mvdc
;
LEB10: 81 64 CMPA #100 ; 2.0 vdc
LEB12: 25 0C BCS LEB20 ; bra if diag sw lt 2 vdc
;
LEB14: 81 99 CMPA #153 ; 3.06 vdc
LEB16: 24 0A BCC LEB22 ; bra if diag sw gt 3.06 vdc
;
LEB18: CA 20 ORAB #$20 ; set b5, diag sw gt 2 vdc & lt 3.06 vdc
LEB1A: 20 06 BRA LEB22 ; backup mode
;
LEB1C: CA 10 ORAB #$10 ; set b4, diag sw lt 800 mvdc, shorted mode
LEB1E: 20 02 BRA LEB22 ;
;
LEB20: CA 08 ORAB #$08 ; set b3, diag sw lt 2 vdc, backup mode
;
LEB22: D7 02 STAB L0002 ; flag wd, diag sw gt 3.06 vdc
LEB24: 7E FD 84 JMP LFD84 ; init iat

;*==================================================
;*
;* Real Time Service Routine 3
;*
;* Do EGR active quals
;*==================================================

LEB27: CE D2 0C LDX #$D20C ; indexed table

;
; Do coolant qual
;
LEB2A: A6 01 LDAA 1,X ; 35c
LEB2C: D6 05 LDAB L0005 ;
LEB2E: C5 04 BITB #$04 ; tst b2
LEB30: 27 02 BEQ LEB34 ;
;
LEB32: A6 00 LDAA 0,X ; 30c
LEB34: 91 21 CMPA L0021 ; coolant, defaulted, 1k pu, inverse, adc cnts
LEB36: 22 04 BHI LEB3C ; bra if coolant > threshold, inv
;
LEB38: C4 FB ANDB #$FB ; 1111 1011, clr b2 of L0005
LEB3A: 20 2E BRA LEB6A ;
;
;
; Do tps qual
;
LEB3C: CA 04 ORAB #$04 ; set b2, coolant ual passed
;
LEB3E: 96 08 LDAA L0008 ; status word
LEB40: 85 24 BITA #$24 ; tps ok bits
LEB42: 26 12 BNE LEB56 ; bra if tps prob
;
LEB44: A6 05 LDAA 5,X ; 9, 3.5% tps
LEB46: C5 20 BITB #$20 ; tst b5 of L0005
LEB48: 27 02 BEQ LEB4C ; bra if == 0
;
LEB4A: A6 04 LDAA 4,X ; 5, 2% tps
LEB4C: 91 43 CMPA L0043 ; tps%, from idle
LEB4E: 25 04 BCS LEB54 ;
;
LEB50: C4 DF ANDB #$DF ; 1101 1111, clr b5 of L0005
LEB52: 20 16 BRA LEB6A ;
;
;
; Do mph qual
;
LEB54: CA 20 ORAB #$20 ; set b5, tps qual passed
;
LEB56: 96 DE LDAA L00DE ; status word
LEB58: 85 40 BITA #$40 ; tst b6, vss ok
LEB5A: 26 12 BNE LEB6E ; bra if == 1
;
LEB5C: A6 03 LDAA 3,X ; 0
LEB5E: C5 40 BITB #$40 ; tst b6 of L0005
LEB60: 27 02 BEQ LEB64 ; bra if == 0
;
LEB62: A6 02 LDAA 2,X ; 0
LEB64: 91 30 CMPA L0030 ; mph / 1, filtered
LEB66: 23 06 BLS LEB6E ;
;
LEB68: C4 BF ANDB #$BF ; 1011 1111, clr b6 of L0005
;
LEB6A: C4 FE ANDB #$FE ; 1111 1110, clr b0 of L0005
LEB6C: 20 27 BRA LEB95 ;
;
;
; Do map qual
;
LEB6E: CA 40 ORAB #40 ; set b6, map qual passed
;
LEB70: A6 07 LDAA 7,X ; 28 Kpa
LEB72: C5 10 BITB #$10 ; tst b4 of L0005
LEB74: 27 02 BEQ LEB78 ;
;
LEB76: A6 06 LDAA 6,X ; 25 Kpa
LEB78: 91 25 CMPA L0025 ; s/d map, KPa = (N * 0.3125) + 20
LEB7A: 23 04 BLS LEB80 ;
;
LEB7C: C4 EF ANDB #$EF ;
LEB7E: 20 EA BRA LEB6A ;
;
;
LEB80: CA 10 ORAB #$10 ; set b4, map qual passed
;
LEB82: A6 08 LDAA 8,X ; 50% tps
LEB84: 91 43 CMPA L0043 ; tps%, from idle
LEB86: 25 E2 BCS LEB6A ;
;
LEB88: C5 01 BITB #$01 ; b0 of L0005
LEB8A: 27 01 BEQ LEB8D ;
;
LEB8C: 08 INX ; from 9,X to 10,X
LEB8D: 96 2E LDAA L002E ; vac
LEB8F: A1 09 CMPA 9,X ; 76% | 80% tps
LEB91: 22 D7 BHI LEB6A ;
;
;
LEB93: CA 01 ORAB #$01 ; final tps qual passed
;
LEB95: D7 05 STAB L0005 ;
;
LEB97: 96 DF LDAA L00DF ; status word
LEB99: 84 FD ANDA #$FD ; 1111 1101, clr b2
LEB9B: 85 20 BITA #$20 ; tst b5
LEB9D: 26 05 BNE LEBA4 ; bra if b5 == 1
;
LEB9F: 57 ASRB ; tst b0
LEBA0: 24 02 BCC LEBA4 ; bra if b0 == 0
;
LEBA2: 8A 02 ORAA #$02 ; set b1, EGR active bit
;
LEBA4: 97 DF STAA L00DF ; status word
LEBA6: 39 RTS ;

;-----------------------------------------------
;
; SubRoutine
;
; Check for BatV overvolts
;
;-----------------------------------------------

LEBA7: D6 E0 LDAB L00E0 ; status word
LEBA9: 96 40 LDAA L0040 ; Battery Volts, * 10, adc cnts
LEBAB: 81 AB CMPA #171 ; 17.1v
LEBAD: 23 06 BLS LEBB5 ; bra if batV <= 17.1v
;
LEBAF: C4 DF ANDB #$DF ; b6, shut down MCU output
LEBB1: C4 FB ANDB #$FB ; IAC enable bit, 1111 1011
LEBB3: 20 74 BRA LEC29 ; shut down IAC
;
LEBB5: 96 14 LDAA L0014 ; error flag 3
LEBB7: 85 10 BITA #$10 ;
LEBB9: 26 17 BNE LEBD2 ;
;
LEBBB: 96 00 LDAA L0000 ; status word
LEBBD: 85 10 BITA #$10 ; engine shutdown
LEBBF: 26 26 BNE LEBE7 ;
;
LEBC1: 96 01 LDAA L0001 ; status word
LEBC3: 2A 17 BPL LEBDC ; Engine is not Running

LEBC5: 96 40 LDAA L0040 ; Battery Volts, * 10, adc cnts
LEBC7: B1 D5 1F CMPA LD51F ; 8.7 volt
LEBCA: 22 0A BHI LEBD6 ; bra if BatV > 8.7v
;
;
; flag an IAC undervolt condition
;
LEBCC: 96 0E LDAA L000E ; status word, a/f mode
LEBCE: 8A 04 ORAA #4 ;
LEBD0: 97 0E STAA L000E ; status word, a/f mode
;
LEBD2: CA 20 ORAB #$20 ;
LEBD4: 20 DB BRA LEBB1 ;
;
;
; BatV ok
;
LEBD6: 96 0E LDAA L000E ; status word, a/f mode
LEBD8: 84 FB ANDA #$FB ;
LEBDA: 97 0E STAA L000E ; status word, a/f mode
;
LEBDC: 96 01 LDAA L0001 ; status word
LEBDE: 2B 07 BMI LEBE7 ; Engine is Running
LEBE0: 96 02 LDAA L0002 ; status word
LEBE2: 0D SEC ;
LEBE3: 85 10 BITA #$10 ;
LEBE5: 26 06 BNE LEBED ;
;
LEBE7: 96 C7 LDAA L00C7 ; IAC steps, A/C, park position
LEBE9: 90 FD SUBA L00FD ; Current IAC position, steps
LEBEB: 27 E5 BEQ LEBD2 ;
;
LEBED: C5 20 BITB #$20 ;
LEBEF: 27 E1 BEQ LEBD2 ;
LEBF1: 24 0B BCC LEBFE ;
;
LEBF3: C4 FA ANDB #$FA ;
LEBF5: 96 FD LDAA L00FD ; Current IAC position, steps
LEBF7: 27 19 BEQ LEC12 ;
;
LEBF9: 4A DECA ;
LEBFA: 97 FD STAA L00FD ; Current IAC position, steps
LEBFC: 20 14 BRA LEC12 ;
;
LEBFE: CA 01 ORAB #1 ;
LEC00: 96 FD LDAA L00FD ; Current IAC position, steps
LEC02: B1 D5 32 CMPA LD532 ; 191
LEC05: 24 CB BCC LEBD2 ;
;
LEC07: 7C 00 FD INC L00FD ; Current IAC position, steps
LEC0A: 96 10 LDAA L0010 ; status word
LEC0C: 85 40 BITA #$40 ;
LEC0E: 26 02 BNE LEC12 ;
LEC10: CA 04 ORAB #$04 ;
LEC12: 17 TBA ;
LEC13: 84 C0 ANDA #$C0 ;
LEC15: 27 0C BEQ LEC23 ;
;
LEC17: 81 C0 CMPA #$C0 ;
LEC19: 27 08 BEQ LEC23 ;
;
LEC1B: C5 01 BITB #$01 ;
LEC1D: 26 08 BNE LEC27 ;
;
LEC1F: C8 80 EORB #$80 ;
LEC21: 20 06 BRA LEC29 ;
;
LEC23: C5 01 BITB #$01 ;
LEC25: 26 F8 BNE LEC1F ;
;
LEC27: C8 40 EORB #$40 ;

;
; Step IAC (or shutdown on undr/ovr volt)
;
; MCU1 I/O:
; b2 iac-enable
; b1 iac-b
; b0 iac-a

LEC29: D7 E0 STAB L00E0 ; status word
LEC2B: B6 08 81 LDAA L0881 ; MCU1 I/O
LEC2E: 84 F8 ANDA #$F8 ; clr iac ctrl bits
LEC30: 58 LSLB ;
LEC31: 2A 02 BPL LEC35 ;
;
LEC33: 8A 02 ORAA #2 ; iac-b
;
LEC35: 24 02 BCC LEC39 ;
;
LEC37: 8A 01 ORAA #1 ; iac-a
;
LEC39: 58 LSLB ;
LEC3A: 2A 02 BPL LEC3E ;
;
LEC3C: 8A 04 ORAA #4 ; iac-enb
;
LEC3E: B7 08 81 STAA L0881 ; MCU1 I/O
LEC41: 39 RTS ;

;*==================================================
;*
;* Real Time Service Routine 4
;*
;*==================================================

LEC42: D6 01 LDAB L0001 ; status word
LEC44: 2B 0E BMI LEC54 ; Engine is Running
;
LEC46: 96 21 LDAA L0021 ; coolant, defaulted, 1k pu, inverse, adc cnts
LEC48: 97 22 STAA L0022 ; startup coolant, adc inverse
LEC4A: 5F CLRB ;
LEC4B: B6 D2 1D LDAA LD21D ; 138, 599mV
LEC4E: DD 3A STD L003A ; O2, minor loop filtered
LEC50: DD 3C STD L003C ; O2, major loop filtered (slow)
LEC52: 97 39 STAA L0039 ; O2, adc, filtered, round up from L003A
;
LEC54: 7E FD FA JMP LFDFA ;

;*==================================================
;*
;* Real Time Service Routine F
;*
;* 5 Hz routine
;*
;*==================================================

LEC57: 96 66 LDAA L0066 ; 160Hz rts counter
LEC59: 85 10 BITA #$10 ;
LEC5B: 27 01 BEQ LEC5E ; bra if b4 == 0, time for this routine
LEC5D: 39 RTS ;

;-----------------------------------------------
;
;
;-----------------------------------------------

LEC5E: 5F CLRB ;
LEC5F: 96 0E LDAA L000E ; status word, a/f mode
LEC61: 2B 22 BMI LEC85 ; bra if closed loop
;
;
LEC63: 96 03 LDAA L0003 ; status word
LEC65: 85 40 BITA #$40 ;
LEC67: 26 19 BNE LEC82 ;
;
LEC69: 96 BD LDAA L00BD ; an afr timer val
LEC6B: 27 03 BEQ LEC70 ;
;
LEC6D: 4A DECA ;
LEC6E: 20 1A BRA LEC8A ;
;
LEC70: 96 66 LDAA L0066 ; 160Hz rts counter
LEC72: 81 8F CMPA #143 ;
LEC74: 26 16 BNE LEC8C ;
;
LEC76: D6 BC LDAB L00BC ; an afr val
LEC78: F0 D2 90 SUBB LD290 ; 13
LEC7B: 24 01 BCC LEC7E ;
;
LEC7D: 5F CLRB ;
LEC7E: D7 BC STAB L00BC ; an afr val
LEC80: 20 0A BRA LEC8C ;
;
LEC82: F6 D2 8E LDAB LD28E ; 25

;
; bra here if closed loop
;
LEC85: D7 BC STAB L00BC ; an afr val
;
LEC87: B6 D2 8F LDAA LD28F ; 2

;
; save timer val & clear status bit
;
LEC8A: 97 BD STAA L00BD ; an afr timer val
;
LEC8C: 96 03 LDAA L0003 ; status word
LEC8E: 84 BF ANDA #$BF ; 1011 1111
LEC90: 97 03 STAA L0003 ; status word

;
; lookup volts correction for bpw
;
LEC92: 96 41 LDAA L0041 ; Pump Volts, * 10, adc cnts
LEC94: CE D3 1B LDX #$D31B ; tbl addr
LEC97: BD FB 95 JSR LFB95 ; 2d lkup
LEC9A: 97 B1 STAA L00B1 ; bpw inj volts correction term

;
; lookup decel coolant factor vs coolant
;
LEC9C: 96 21 LDAA L0021 ; coolant, defaulted, 1k pu, inverse, adc cnts
LEC9E: 43 COMA ; 1's comp
LEC9F: 97 50 STAA L0050 ; tmp storage of inverse coolant val
;
LECA1: CE D3 2C LDX #$D32C ;
LECA4: BD FB 8C JSR LFB8C ; 2d lkup w/line cnt
LECA7: 97 9C STAA L009C ; decel coolant factor vs coolant

;
; lookup accel enrichment vs coolant
;
LECA9: 96 50 LDAA L0050 ; tmp storage of inverse coolant val
LECAB: CE D3 32 LDX #$D332 ;
LECAE: BD FB 95 JSR LFB95 ; 2d lkup
LECB1: 97 99 STAA L0099 ; accel enrichment vs coolant

;
; lookup inverse coolant term for bpw calc
;
LECB3: 96 21 LDAA L0021 ; coolant, defaulted, 1k pu, inverse, adc cnts
LECB5: CE D3 0A LDX #$D30A ;
LECB8: BD FB 95 JSR LFB95 ; 2d lkup
LECBB: 97 A9 STAA L00A9 ; Inverse coolant term for bpw calc

;
;
;
LECBD: D6 01 LDAB L0001 ; status word
LECBF: 2B 54 BMI LED15 ; bra if Engine is Running

;-----------------------------------------------
;
; Engine not running here
;
; Init engine pre-start variables.
; Choke: sa & fuel, iat
;
;
;-----------------------------------------------

LECC1: D6 DE LDAB L00DE ; status word
LECC3: C5 08 BITB #$08 ;
LECC5: 26 38 BNE LECFF ;
LECC7: F6 08 81 LDAB L0881 ; MCU1 I/O
LECCA: C5 20 BITB #$20 ;
LECCC: 26 05 BNE LECD3 ;
LECCE: 96 21 LDAA L0021 ; coolant, defaulted, 1k pu, inverse, adc cnts
LECD0: BD FD E5 JSR LFDE5 ; Test Iat | Cts against 75c threshold

;
; lookup choke AFR
;
LECD3: CE D3 4D LDX #$D34D ;
LECD6: 96 50 LDAA L0050 ; tmp storage of inverse coolant val
LECD8: BD FB 95 JSR LFB95 ; 2d lkup
LECDB: D6 DF LDAB L00DF ; status word
LECDD: C5 04 BITB #$04 ; b2
LECDF: 27 03 BEQ LECE4 ; bra if b2 == 0
LECE1: BB D2 60 ADDA LD260 ; 3.5:1 afr

LECE4: 97 E5 STAA L00E5 ; choke adjustment to AFR

;
;
;
LECE6: B6 D2 5C LDAA LD25C ; 25, inital delay from eng strt to decay choke afr
LECE9: 97 E6 STAA L00E6 ; choke AFR decay timer

;
; lkup choke SA
;
LECEB: CE D1 83 LDX #$D183 ;
LECEE: 96 50 LDAA L0050 ; tmp storage of inverse coolant val
LECF0: BD FB 8C JSR LFB8C ; 2d lkup w/line cnt
LECF3: 97 E7 STAA L00E7 ; choke SA

;
; lkup choke SA decay timer
;
LECF5: CE D1 89 LDX #$D189 ;
LECF8: 96 50 LDAA L0050 ; tmp storage of inverse coolant val
LECFA: BD FB 8C JSR LFB8C ; 2d lkup w/line cnt
LECFD: 97 E8 STAA L00E8 ; choke SA decay timer

;
; lkup choke AFR decay mult
;
LECFF: CE D3 5E LDX #$D35E ;
LED02: 96 50 LDAA L0050 ; tmp storage of inverse coolant val
LED04: BD FB 95 JSR LFB95 ; 2d lkup
LED07: 97 B4 STAA L00B4 ; choke afr decay mult

;
; lkup crank AFR
;
LED09: CE D3 6F LDX #$D36F ;
LED0C: 96 50 LDAA L0050 ; tmp storage of inverse coolant val
LED0E: BD FB 95 JSR LFB95 ; 2d lkup
LED11: 97 B3 STAA L00B3 ; crank afr
;
LED13: 20 3A BRA LED4F ; bra around engine run stuff

;-----------------------------------------------
;
; Engine is running here
;
;-----------------------------------------------

;
; Decay Choke AFR
;
LED15: 96 E6 LDAA L00E6 ; choke AFR decay timer
LED17: 26 0E BNE LED27 ;
;
LED19: B6 D2 5B LDAA LD25B ; 9, delay mult to decay choke afr
LED1C: 97 E6 STAA L00E6 ; choke AFR decay timer
LED1E: 96 E5 LDAA L00E5 ; choke adjustment to AFR
LED20: D6 B4 LDAB L00B4 ; choke afr decay mult
LED22: 3D MUL ;
LED23: 97 E5 STAA L00E5 ; choke adjustment to AFR
LED25: 20 03 BRA LED2A ;
;
LED27: 7A 00 E6 DEC L00E6 ; choke AFR decay timer

;
; Decay Choke SA
;
LED2A: 96 E8 LDAA L00E8 ; choke SA decay timer
LED2C: 27 0B BEQ LED39 ;
;
LED2E: 96 66 LDAA L0066 ; 160Hz rts counter
LED30: 84 F0 ANDA #$F0 ;
LED32: 26 1B BNE LED4F ;
;
LED34: 7A 00 E8 DEC L00E8 ; choke SA decay timer
LED37: 20 16 BRA LED4F ;
;
LED39: 96 65 LDAA L0065 ; choke SA decay delay
LED3B: 27 05 BEQ LED42 ;
;
LED3D: 7A 00 65 DEC L0065 ; choke SA decay delay
LED40: 20 0D BRA LED4F ;
;
LED42: B6 D0 26 LDAA LD026 ; 2, choke SA decay delay mult
LED45: 97 65 STAA L0065 ; choke SA decay delay
;
LED47: 96 E7 LDAA L00E7 ; choke SA
LED49: F6 D0 27 LDAB LD027 ; 241, choke SA decay mult
LED4C: 3D MUL ;
LED4D: 97 E7 STAA L00E7 ; choke SA

;-----------------------------------------------
;
; Continue on, both eng run & eng not run
;
; Lookup Open Loop AFR vs Coolant
;
;-----------------------------------------------

LED4F: CE D3 8B LDX #$D38B ; Open Loop AFR vs Coolant
LED52: 96 50 LDAA L0050 ; tmp storage of inverse coolant val
LED54: BD FB 95 JSR LFB95 ; 2d lkup
LED57: 97 B2 STAA L00B2 ; afr vs coolant, open loop
;
LED59: 96 01 LDAA L0001 ; status word
LED5B: 2A 61 BPL LEDBE ; Engine is not Running

;
; test if O2 ready timed out, go open loop
;
LED5D: 96 0A LDAA L000A ; status word
LED5F: 85 02 BITA #$02 ; b1
LED61: 27 05 BEQ LED68 ;
;
LED63: 7F 00 9B CLR L009B ; O2 ready/clsd lp ok timeout timer
LED66: 20 56 BRA LEDBE ;
;
LED68: D6 DE LDAB L00DE ; status word
LED6A: 96 9B LDAA L009B ; O2 ready/clsd lp ok timeout timer
LED6C: B1 D2 2C CMPA LD22C ; 50, O2 ready timeout
LED6F: 24 05 BCC LED76 ;
;
LED71: 4C INCA ;
LED72: 97 9B STAA L009B ; O2 ready/clsd lp ok timeout timer
LED74: 20 04 BRA LED7A ;
;
LED76: C4 FE ANDB #$FE ; clear O2 ready bit
LED78: D7 DE STAB L00DE ; status word

;
;
;
LED7A: C5 01 BITB #$01 ;
LED7C: 27 40 BEQ LEDBE ;
;
LED7E: 96 02 LDAA L0002 ; status word
LED80: 84 30 ANDA #$30 ;
LED82: 26 22 BNE LEDA6 ;
;
LED84: D6 DE LDAB L00DE ; status word
LED86: C5 02 BITB #$02 ;
LED88: 26 1C BNE LEDA6 ;
;
;
; do closed loop time threshold
;
LED8A: DC EB LDD L00EB ; eng run time
LED8C: 04 LSRD ;
LED8D: 96 22 LDAA L0022 ; startup coolant, adc inverse
LED8F: B1 D2 28 CMPA LD228 ; 199, 20c
LED92: 23 07 BLS LED9B ;
;
LED94: F1 D2 2A CMPB LD22A ; 200, clsd loop eng run cold
LED97: 24 07 BCC LEDA0 ;
;
LED99: 20 23 BRA LEDBE ;
;
LED9B: F1 D2 29 CMPB LD229 ; 15, clsd loop eng run hot
LED9E: 25 1E BCS LEDBE ;
;
;
; set status that enough time has elapsed for closed loop
;
LEDA0: 96 DE LDAA L00DE ; status word
LEDA2: 8A 02 ORAA #2 ; b1
LEDA4: 97 DE STAA L00DE ; status word

;
; check coolant thres for closed loop
;
LEDA6: 96 21 LDAA L0021 ; coolant, defaulted, 1k pu, inverse, adc cnts
LEDA8: B1 D2 2B CMPA LD22B ; closed loop coolant thres, 48c
LEDAB: 24 11 BCC LEDBE ;
;
;
; set closed loop bit
;
LEDAD: D6 0E LDAB L000E ; status word, a/f mode
LEDAF: CA 80 ORAB #$80 ; set in closed loop
;
LEDB1: 96 00 LDAA L0000 ; status word
LEDB3: 85 02 BITA #$02 ;
LEDB5: 27 0B BEQ LEDC2 ;
LEDB7: B6 04 0D LDAA L040D ; HU ram
LEDBA: 84 03 ANDA #$03 ;
LEDBC: 27 04 BEQ LEDC2 ;
;
;
; clear closed loop bit
;
LEDBE: D6 0E LDAB L000E ; status word, a/f mode
LEDC0: C4 7F ANDB #$7F ; clear in closed loop bit
;
;
; Do BLM learn enable quals
;
LEDC2: D7 0E STAB L000E ; status word, a/f mode
LEDC4: 2A 30 BPL LEDF6 ; bra if not in closed loop
;
LEDC6: 96 08 LDAA L0008 ; status word
LEDC8: 84 C0 ANDA #$C0 ;
LEDCA: 26 2A BNE LEDF6 ; bra for no learn
;
LEDCC: 96 21 LDAA L0021 ; coolant, defaulted, 1k pu, inverse, adc cnts
LEDCE: B1 D2 2D CMPA LD22D ; 189, 25c
LEDD1: 24 23 BCC LEDF6 ; bra for no learn
;
LEDD3: B1 D2 2E CMPA LD22E ; 0, 200c
LEDD6: 25 1E BCS LEDF6 ; bra for no learn
;
LEDD8: 96 A3 LDAA L00A3 ; desired AFR
LEDDA: B1 D2 32 CMPA LD232 ; 14.7, stoich
LEDDD: 26 17 BNE LEDF6 ; bra for no learn
;
LEDDF: 96 25 LDAA L0025 ; s/d map, KPa = (N * 0.3125) + 20
LEDE1: B1 D2 30 CMPA LD230 ; 255, 100Kpa
LEDE4: 22 10 BHI LEDF6 ; bra for no learn
;
LEDE6: B1 D2 2F CMPA LD22F ; 20, 26Kpa
LEDE9: 25 0B BCS LEDF6 ; bra for no learn
;
LEDEB: 96 1B LDAA L001B ; rpm / 25
LEDED: B1 D2 31 CMPA LD231 ; 240, 6000 rpm
LEDF0: 24 04 BCC LEDF6 ; bra for no learn
;
;
; learn OK
;
LEDF2: CA 02 ORAB #2 ; set b1
LEDF4: 20 02 BRA LEDF8 ;
;
;
; learn NOT OK
;
LEDF6: C4 FD ANDB #$FD ; clr b1, 1111 1101
LEDF8: D7 0E STAB L000E ; status word, a/f mode
LEDFA: 39 RTS ;

;*==================================================
;*
;* Real Time Service Routine 5
;*
;*==================================================

LEDFB: DE 3C LDX L003C ; O2, major loop filtered (slow)
LEDFD: F6 D4 9A LDAB LD49A ; filt coef, 1
LEE00: 96 39 LDAA L0039 ; O2, adc, filtered, round up from L003A
LEE02: BD FB 40 JSR LFB40 ; Lag Filter
LEE05: DD 3C STD L003C ; O2, major loop filtered (slow)
;
LEE07: 96 22 LDAA L0022 ; startup coolant, adc inverse
LEE09: B1 D4 A2 CMPA LD4A2 ; 199, 20c
LEE0C: 23 04 BLS LEE12 ;
;
LEE0E: 96 0E LDAA L000E ; status word, a/f mode
LEE10: 2A 05 BPL LEE17 ; bra if not closed loop
;
LEE12: 96 0A LDAA L000A ; status word
LEE14: 47 ASRA ; tst b0
LEE15: 24 03 BCC LEE1A ; bra if b0 == 0
;
LEE17: 7E EF 08 JMP LEF08 ;

;-----------------------------------------------
;
;
;-----------------------------------------------

LEE1A: 96 0F LDAA L000F ; status word
LEE1C: 85 10 BITA #$10 ; hiway mode bit
LEE1E: 26 F7 BNE LEE17 ; bra if in hiway fuel
;
LEE20: D6 07 LDAB L0007 ; status word
LEE22: 96 0E LDAA L000E ; status word, a/f mode
LEE24: 2A 0E BPL LEE34 ; bra if not closed loop
LEE26: CA 80 ORAB #128 ;
LEE28: D7 07 STAB L0007 ; status word
LEE2A: 7F 00 77 CLR L0077 ;
LEE2D: B6 D4 A3 LDAA LD4A3 ; 50
LEE30: 97 78 STAA L0078 ;
LEE32: 20 23 BRA LEE57 ;

;
;
;
LEE34: 5D TSTB ;
LEE35: 2A 07 BPL LEE3E ;
LEE37: 96 78 LDAA L0078 ;
LEE39: 27 DC BEQ LEE17 ;
LEE3B: 4A DECA ;
LEE3C: 97 78 STAA L0078 ;
LEE3E: D6 77 LDAB L0077 ;
LEE40: 96 76 LDAA L0076 ;
LEE42: 90 25 SUBA L0025 ; s/d map, KPa = (N * 0.3125) + 20
LEE44: 23 08 BLS LEE4E ;
LEE46: B1 D4 A1 CMPA LD4A1 ; delta map val, 25 Kpa
LEE49: 23 03 BLS LEE4E ;
LEE4B: F6 D4 9F LDAB LD49F ;
LEE4E: 5D TSTB ;
LEE4F: 27 06 BEQ LEE57 ;
LEE51: 5A DECB ;
LEE52: D7 77 STAB L0077 ;
LEE54: 7E EF 02 JMP LEF02 ;

;-----------------------------------------------
;
;
;-----------------------------------------------

LEE57: D6 66 LDAB L0066 ; 160Hz rts counter
LEE59: C4 F0 ANDB #$F0 ;
LEE5B: D7 4E STAB L004E ;
LEE5D: 96 0D LDAA L000D ; status word
LEE5F: 2B 16 BMI LEE77 ; bra if in PE/WOT mode
;
LEE61: 7F 00 79 CLR L0079 ;
LEE64: D6 1A LDAB L001A ; rpm scaled
LEE66: F1 D4 9E CMPB LD49E ; 164
LEE69: 23 1C BLS LEE87 ;
LEE6B: D6 73 LDAB L0073 ;
LEE6D: F1 D4 99 CMPB LD499 ; 2
LEE70: 22 2B BHI LEE9D ;
LEE72: 5C INCB ;
LEE73: 26 13 BNE LEE88 ;
LEE75: 20 13 BRA LEE8A ;

;
;
;
LEE77: D6 79 LDAB L0079 ;
LEE79: F1 D4 A4 CMPB LD4A4 ; 0
LEE7C: 24 1F BCC LEE9D ;
LEE7E: D6 4E LDAB L004E ;
LEE80: 26 03 BNE LEE85 ;
LEE82: 7C 00 79 INC L0079 ;
LEE85: 20 73 BRA LEEFA ;
LEE87: 5F CLRB ;
LEE88: D7 73 STAB L0073 ;

;
;
;
LEE8A: D6 3C LDAB L003C ; O2, major loop filtered (slow)
LEE8C: F1 D4 9B CMPB LD49B ; O2 val, 699mV
LEE8F: 23 0E BLS LEE9F ;
LEE91: D6 74 LDAB L0074 ;
LEE93: F1 D4 9D CMPB LD49D ; 50
LEE96: 5C INCB ;
LEE97: 25 0B BCS LEEA4 ;
LEE99: 8A 01 ORAA #1 ;
LEE9B: 97 0D STAA L000D ; status word
;
LEE9D: 20 69 BRA LEF08 ;
LEE9F: D6 74 LDAB L0074 ;
LEEA1: 27 0A BEQ LEEAD ;
LEEA3: 5A DECB ;
LEEA4: 7D 00 4E TST L004E ;
LEEA7: 26 08 BNE LEEB1 ;
LEEA9: D7 74 STAB L0074 ;
LEEAB: 20 04 BRA LEEB1 ;
LEEAD: 84 FE ANDA #$FE ;
LEEAF: 97 0D STAA L000D ; status word
LEEB1: 84 01 ANDA #$01 ;
LEEB3: 26 53 BNE LEF08 ;
LEEB5: D6 3C LDAB L003C ; O2, major loop filtered (slow)
LEEB7: F1 D4 9C CMPB LD49C ; O2 val, 282mV
LEEBA: 24 10 BCC LEECC ;
LEEBC: D6 0E LDAB L000E ; status word, a/f mode
LEEBE: 2A 0C BPL LEECC ; bra if not closed loop
LEEC0: 96 75 LDAA L0075 ;
LEEC2: B1 D4 9D CMPA LD49D ; 50
LEEC5: 22 41 BHI LEF08 ;
LEEC7: D6 4E LDAB L004E ;
LEEC9: 26 03 BNE LEECE ;
LEECB: 4C INCA ;
LEECC: 97 75 STAA L0075 ;
LEECE: 96 25 LDAA L0025 ; s/d map, KPa = (N * 0.3125) + 20
LEED0: B1 D4 A0 CMPA LD4A0 ; 8, 22.5 Kpa
LEED3: 25 33 BCS LEF08 ;
LEED5: B1 D4 A6 CMPA LD4A6 ; 255
LEED8: 22 1C BHI LEEF6 ;
LEEDA: 96 21 LDAA L0021 ; coolant, defaulted, 1k pu, inverse, adc cnts
LEEDC: B1 D4 A5 CMPA LD4A5 ; 96, coolant thres, 67c
LEEDF: 24 15 BCC LEEF6 ;
LEEE1: 96 30 LDAA L0030 ; mph / 1, filtered
LEEE3: F6 D0 05 LDAB LD005 ; option byte: 0010 0011
LEEE6: C5 01 BITB #$01 ;
LEEE8: 26 02 BNE LEEEC ;
LEEEA: 96 1B LDAA L001B ; rpm / 25
LEEEC: B1 D4 A7 CMPA LD4A7 ; 255, 6375 rpm
LEEEF: 22 05 BHI LEEF6 ;
LEEF1: B1 D4 A8 CMPA LD4A8 ; 38, 950 rpm
LEEF4: 24 12 BCC LEF08 ;
LEEF6: D6 07 LDAB L0007 ; status word
LEEF8: 2B 08 BMI LEF02 ;
LEEFA: D6 07 LDAB L0007 ; status word
LEEFC: C4 FE ANDB #$FE ;
LEEFE: CA 04 ORAB #4 ;
LEF00: 20 0C BRA LEF0E ;
LEF02: D6 07 LDAB L0007 ; status word
LEF04: C4 FA ANDB #$FA ;
LEF06: 20 06 BRA LEF0E ;

;
;
;
LEF08: D6 07 LDAB L0007 ; status word
LEF0A: CA 01 ORAB #1 ;
LEF0C: C4 FB ANDB #$FB ;
LEF0E: D7 07 STAB L0007 ; status word
LEF10: 96 25 LDAA L0025 ; s/d map, KPa = (N * 0.3125) + 20
LEF12: 97 76 STAA L0076 ;
LEF14: 5F CLRB ;
LEF15: 96 40 LDAA L0040 ; Battery Volts, * 10, adc cnts
LEF17: 81 AB CMPA #171 ;
LEF19: 96 02 LDAA L0002 ; status word
LEF1B: 25 08 BCS LEF25 ;
LEF1D: 85 40 BITA #$40 ;
LEF1F: 26 18 BNE LEF39 ;
LEF21: 8A 40 ORAA #64 ;
LEF23: 20 02 BRA LEF27 ;
LEF25: 84 BF ANDA #$BF ;
LEF27: 97 02 STAA L0002 ; status word
LEF29: 96 01 LDAA L0001 ; status word
LEF2B: 2B 0F BMI LEF3C ; Engine is Running
LEF2D: 96 0A LDAA L000A ; status word
LEF2F: 2B 04 BMI LEF35 ;
LEF31: 4F CLRA ;
LEF32: 5A DECB ;
LEF33: 20 32 BRA LEF67 ;
LEF35: 86 FD LDAA #253 ;
LEF37: 20 2E BRA LEF67 ;
LEF39: 37 PSHB ;
LEF3A: 20 32 BRA LEF6E ;

;
; Setup for MCU2 Output
;
LEF3C: 4F CLRA ; pre-clr
LEF3D: D6 05 LDAB L0005 ; status word
LEF3F: 2A 02 BPL LEF43 ; bra if tcc unlocked, shft light off
;
LEF41: 8A 08 ORAA #$08 ; turn on tcc/shift light
;
LEF43: C5 01 BITB #$01 ;
LEF45: 27 08 BEQ LEF4F ;
;
LEF47: D6 0B LDAB L000B ;
LEF49: C5 04 BITB #$04 ;
LEF4B: 26 02 BNE LEF4F ;
;
LEF4D: 8A 01 ORAA #$01 ;
;
LEF4F: D6 07 LDAB L0007 ; status word
LEF51: C5 04 BITB #$04 ;
LEF53: 27 02 BEQ LEF57 ;
;
LEF55: 8A 10 ORAA #$10 ;
;
LEF57: C5 01 BITB #$01 ;
LEF59: 26 02 BNE LEF5D ;
;
LEF5B: 8A 20 ORAA #$20 ;
;
LEF5D: D6 0E LDAB L000E ; status word, a/f mode
LEF5F: C5 08 BITB #$08 ;
LEF61: 27 02 BEQ LEF65 ;
;
LEF63: 84 F7 ANDA #$F7 ;
;
LEF65: D6 7D LDAB L007D ; used in egr test, a clsd lp term
LEF67: 36 PSHA ;
;
;
; Do throttle kicker output
;
LEF68: 7D D0 08 TST LD008 ; 0, throttle kicker flag
LEF6B: 27 01 BEQ LEF6E ;
LEF6D: 53 COMB ; 1's comp
;
LEF6E: 4F CLRA ;
LEF6F: 05 LSLD ;
LEF70: 05 LSLD ;
LEF71: 27 02 BEQ LEF75 ;
LEF73: CA 03 ORAB #$03 ;
;
LEF75: 8A D0 ORAA #$D0 ;
LEF77: FD BC 18 STD LBC18 ; throttle kicker ($D3FF | $D000, on/off)

;
; Do actual MCU2 output
;
; Out:
; b3 TCC/Shift Light
; b2 A/C Drive
; b1 Air Divert
; b0 Air Select

LEF7A: F6 08 01 LDAB L0801 ; MCU2 I/O
LEF7D: C4 F0 ANDB #$F0 ; mask out lower nibble
;
LEF7F: 32 PULA ;
LEF80: 85 04 BITA #$04 ;
LEF82: 27 02 BEQ LEF86 ;
LEF84: CA 04 ORAB #$04 ;
LEF86: 85 08 BITA #$08 ;
LEF88: 27 02 BEQ LEF8C ;
LEF8A: CA 08 ORAB #$08 ;
LEF8C: 85 10 BITA #$10 ;
LEF8E: 27 02 BEQ LEF92 ;
LEF90: CA 01 ORAB #$01 ;
LEF92: 85 20 BITA #$20 ;
LEF94: 27 02 BEQ LEF98 ;
LEF96: CA 02 ORAB #$02 ;
;
LEF98: F7 08 01 STAB L0801 ; MCU2 I/O
;
;
;
; Do EGR output
;
LEF9B: 47 ASRA ;
LEF9C: 24 1D BCC LEFBB ;
LEF9E: FC BC 16 LDD LBC16 ; egr
LEFA1: 7D D0 05 TST LD005 ; option byte: 0010 0011
LEFA4: 2A 09 BPL LEFAF ;
;
LEFA6: B3 D2 17 SUBD LD217 ; 1279, $4FF
LEFA9: 81 D0 CMPA #208 ; $D0
LEFAB: 23 13 BLS LEFC0 ;
LEFAD: 20 14 BRA LEFC3 ;
;
LEFAF: F3 D2 17 ADDD LD217 ; 1279, $4FF
LEFB2: 81 D3 CMPA #211 ;
LEFB4: 23 0D BLS LEFC3 ;
LEFB6: CC D3 FF LDD #$D3FF ;
LEFB9: 20 08 BRA LEFC3 ;
;
LEFBB: 7D D0 05 TST LD005 ; option byte: 0010 0011
LEFBE: 2B F6 BMI LEFB6 ;
;
LEFC0: CC D0 00 LDD #$D000 ;
LEFC3: FD BC 16 STD LBC16 ; egr
LEFC6: 39 RTS ;

;*==================================================
;*
;* Real Time Service Routine B
;*
;*==================================================

LEFC7: 96 00 LDAA L0000 ; status word
LEFC9: 85 10 BITA #$10 ; engine shutdown
LEFCB: 26 06 BNE LEFD3 ;
LEFCD: 86 9F LDAA #159 ;
LEFCF: 91 32 CMPA L0032 ; vss interval counter, 159 | 160
LEFD1: 22 04 BHI LEFD7 ;
LEFD3: 4F CLRA ;
LEFD4: 5F CLRB ;
LEFD5: 20 20 BRA LEFF7 ;
;
;
; calc mph from vss variables
;

LEFD7: DC 35 LDD L0035 ;
LEFD9: 93 33 SUBD L0033 ;
LEFDB: DD 49 STD L0049 ;
LEFDD: DC 37 LDD L0037 ;
LEFDF: 93 35 SUBD L0035 ;
LEFE1: D3 49 ADDD L0049 ;
LEFE3: 46 RORA ;
LEFE4: 56 RORB ;
LEFE5: DD 4B STD L004B ; tmp storage
LEFE7: DD 4F STD L004F ; tmp storage
LEFE9: CC 01 CC LDD #460 ; constant
LEFEC: BD FB DE JSR LFBDE ; vss/rpm calc routine (FDIV)
;
LEFEF: DE 30 LDX L0030 ; mph / 1, filtered
LEFF1: F6 D4 BD LDAB LD4BD ; filt coef, 128
LEFF4: BD FB 40 JSR LFB40 ; Lag Filter
;
LEFF7: DD 30 STD L0030 ; mph / 1, filtered

;
; calc N/V ratio
;

LEFF9: 96 1B LDAA L001B ; rpm / 25
LEFFB: CE 00 4F LDX #$004F ;
LEFFE: BD FC 05 JSR LFC05 ; AB = (A x *X) / 256
LF001: DD 4F STD L004F ; tmp storage
LF003: 86 0E LDAA #14 ;
LF005: BD FC 05 JSR LFC05 ; AB = (A x *X) / 256
LF008: 4D TSTA ;
LF009: 27 02 BEQ LF00D ;
LF00B: C6 FF LDAB #255 ;
;
LF00D: D7 7C STAB L007C ; N/V ratio

;-----------------------------------------------
;
; Decide which: TCC | Shift Light
;
;-----------------------------------------------

LF00F: F6 D0 07 LDAB LD007 ; option byte: 0010 0100
LF012: 2A 03 BPL LF017 ; bra to do tcc
LF014: 7E F1 06 JMP LF106 ; go do shift light

;-----------------------------------------------
;
; Do TCC
;
;-----------------------------------------------

LF017: F8 08 01 EORB L0801 ; MCU2 I/O
LF01A: C4 20 ANDB #$20 ; high gear switch
LF01C: D7 50 STAB L0050 ; save higr stat
LF01E: 96 21 LDAA L0021 ; coolant, defaulted, 1k pu, inverse, adc cnts
LF020: B1 D4 B6 CMPA LD4B6 ; 102
LF023: 23 03 BLS LF028 ; bra if cool > 60c
;
LF025: 7E F0 EB JMP LF0EB ; unock & exit

;-----------------------------------------------
;
; Coolant OK for tcc lock
;
;-----------------------------------------------

LF028: F6 D0 05 LDAB LD005 ; option byte: 0010 0011
LF02B: 96 07 LDAA L0007 ; status word
LF02D: C5 02 BITB #$02 ; b1 of D005
LF02F: 27 04 BEQ LF035 ; b1 == 1, do not bra

;
;
;
LF031: 85 08 BITA #$08 ; b3 of L0007
LF033: 26 F0 BNE LF025 ;
;
LF035: CE D4 B7 LDX #$D4B7 ; indexed tbl
LF038: E6 01 LDAB 1,X ; 40 (mph)
LF03A: 85 10 BITA #$10 ; b4 of L0007
LF03C: 26 04 BNE LF042 ;
;
LF03E: CB 05 ADDB #5 ; add 5 mph
LF040: 25 04 BCS LF046 ;
;
LF042: D1 30 CMPB L0030 ; mph / 1, filtered
LF044: 23 06 BLS LF04C ; bra if mph > 40 | 45 mph
;
LF046: 84 EF ANDA #$EF ;
LF048: E6 02 LDAB 2,X ;
LF04A: 20 04 BRA LF050 ;
;
LF04C: 8A 10 ORAA #$10 ;
LF04E: E6 03 LDAB 3,X ;
;
LF050: 97 07 STAA L0007 ; status word
LF052: 96 05 LDAA L0005 ;
LF054: 2A 05 BPL LF05B ; bra if tcc unlocked
;
LF056: E0 04 SUBB 4,X ;
LF058: 24 01 BCC LF05B ;
LF05A: 5F CLRB ;
;
LF05B: 37 PSHB ;
LF05C: BD FA 7A JSR LFA7A ; get map | vac | tps variable
LF05F: F6 D4 B7 LDAB LD4B7 ;
LF062: C1 03 CMPB #3 ;
LF064: 26 03 BNE LF069 ;
LF066: BD FB 64 JSR LFB64 ; get a baro adjusted tps% value
LF069: 33 PULB ;
LF06A: 11 CBA ;
LF06B: 25 B8 BCS LF025 ;
;
LF06D: CE D4 DB LDX #$D4DB ; tcc relock-unlock tbl, hi gr?
LF070: 96 50 LDAA L0050 ; hi gear stat
LF072: 27 03 BEQ LF077 ;
;
LF074: CE D4 C1 LDX #$D4C1 ; tcc relock-unlock tbl, lo gr?
;
LF077: C6 0E LDAB #14 ;
LF079: 96 05 LDAA L0005 ;
LF07B: 2A 04 BPL LF081 ; bra if tcc unlocked
;
LF07D: 08 INX ;
LF07E: 08 INX ;
LF07F: C6 01 LDAB #1 ;
;
LF081: 96 30 LDAA L0030 ; mph / 1, filtered
LF083: A1 00 CMPA 0,X ;
LF085: 25 64 BCS LF0EB ;
LF087: 08 INX ;
LF088: A1 00 CMPA 0,X ;
LF08A: 24 5F BCC LF0EB ;
LF08C: 3A ABX ; adj tbl index
LF08D: 96 05 LDAA L0005 ;
LF08F: 2A 12 BPL LF0A3 ; bra if tcc unlocked
;
LF091: B6 D0 06 LDAA LD006 ; option byte: 0001 0001
LF094: 85 02 BITA #$02 ;
LF096: 27 0B BEQ LF0A3 ; do bra, use mph
;
LF098: C6 60 LDAB #96 ;
LF09A: 96 1A LDAA L001A ; rpm scaled
LF09C: 48 ASLA ;
LF09D: 24 02 BCC LF0A1 ;
LF09F: 86 FF LDAA #255 ;
LF0A1: 20 10 BRA LF0B3 ;

;
;
;
LF0A3: DC 30 LDD L0030 ; mph / 1, filtered
LF0A5: 05 LSLD ; mph *= 2
LF0A6: 25 07 BCS LF0AF ;
LF0A8: 05 LSLD ; mph *= 2
LF0A9: 25 04 BCS LF0AF ;
;
LF0AB: 81 F0 CMPA #240 ; max of 60 mph
LF0AD: 25 02 BCS LF0B1 ;
LF0AF: 86 F0 LDAA #240 ;
;
LF0B1: C6 50 LDAB #80 ; min of 20 mph

;
;
;
LF0B3: BD FB 91 JSR LFB91 ; 2d lkup w/SBA
LF0B6: 27 33 BEQ LF0EB ; bra if == 0, do unlk
LF0B8: 36 PSHA ; save tps% required
;
LF0B9: BD FB 64 JSR LFB64 ; get a baro adjusted tps% value
LF0BC: 33 PULB ;
LF0BD: 11 CBA ; test tps% val
LF0BE: 22 2B BHI LF0EB ; bra if enough to unlock
;
LF0C0: D6 0E LDAB L000E ; status word, a/f mode
LF0C2: C5 08 BITB #$08 ;
LF0C4: 27 09 BEQ LF0CF ;
LF0C6: 7A 00 7B DEC L007B ; tcc timer, or gear
LF0C9: 26 13 BNE LF0DE ;
LF0CB: C4 F7 ANDB #$F7 ;
LF0CD: 20 0F BRA LF0DE ;
;
LF0CF: 96 50 LDAA L0050 ; hi-gr stat
LF0D1: 27 0B BEQ LF0DE ;
LF0D3: C5 20 BITB #$20 ;
LF0D5: 26 07 BNE LF0DE ;
;
LF0D7: CA 08 ORAB #$08 ;
LF0D9: B6 D4 BE LDAA LD4BE ; 1
LF0DC: 97 7B STAA L007B ; tcc timer, or gear
;
LF0DE: 96 7A LDAA L007A ;
LF0E0: 27 03 BEQ LF0E5 ;
LF0E2: 4A DECA ;
LF0E3: 20 0B BRA LF0F0 ;
;
;
; lock tcc
;
LF0E5: 96 05 LDAA L0005 ;
LF0E7: 8A 80 ORAA #$80 ; cmd tcc to lock
LF0E9: 20 12 BRA LF0FD ;

;
; unlock tcc unless > 80 mph
;
LF0EB: D6 0E LDAB L000E ; status word, a/f mode
LF0ED: B6 D4 BF LDAA LD4BF ; 6, relock delay
;
LF0F0: 97 7A STAA L007A ;
LF0F2: 96 30 LDAA L0030 ; mph / 1, filtered
LF0F4: B1 D4 C0 CMPA LD4C0 ; 80 mph
LF0F7: 24 EC BCC LF0E5 ; bra if mph > 80 mph
;
LF0F9: 96 05 LDAA L0005 ;
LF0FB: 84 7F ANDA #$7F ; 0111 1111, unlk tcc
;
LF0FD: C4 DF ANDB #$DF ; 1101 1111
LF0FF: DA 50 ORAB L0050 ;
LF101: D7 0E STAB L000E ; status word, a/f mode
LF103: 97 05 STAA L0005 ;
LF105: 39 RTS ;

;-----------------------------------------------
;
; Shift Light Here
;
;-----------------------------------------------

LF106: CE D4 F9 LDX #$D4F9 ;
LF109: 96 21 LDAA L0021 ; coolant, defaulted, 1k pu, inverse, adc cnts
LF10B: A1 10 CMPA 16,X ;
LF10D: 24 32 BCC LF141 ;
LF10F: A6 11 LDAA 17,X ;
LF111: D6 7B LDAB L007B ; tcc timer, or gear
LF113: C1 02 CMPB #2 ;
LF115: 23 02 BLS LF119 ;
LF117: A6 12 LDAA 18,X ;
LF119: 91 43 CMPA L0043 ; tps%, from idle
LF11B: 22 24 BHI LF141 ;
LF11D: 96 30 LDAA L0030 ; mph / 1, filtered
LF11F: 81 05 CMPA #5 ;
LF121: 25 1E BCS LF141 ;
LF123: 96 1B LDAA L001B ; rpm / 25
LF125: A1 13 CMPA 19,X ;
LF127: 22 2C BHI LF155 ;
LF129: 81 28 CMPA #40 ;
LF12B: 25 14 BCS LF141 ;
;
;
; figure out which gear tranny is in
;
LF12D: D6 7C LDAB L007C ; N/V ratio
LF12F: 4F CLRA ;
LF130: 4C INCA ; <<<<
LF131: 97 7B STAA L007B ; tcc timer, or gear
LF133: E1 00 CMPB 0,X ;
LF135: 22 04 BHI LF13B ;
LF137: E1 04 CMPB 4,X ;
LF139: 22 20 BHI LF15B ;
LF13B: 08 INX ;
LF13C: 8C D4 FC CPX #$D4FC ; eprom addr
LF13F: 23 EF BLS LF130 ; >>>>
;
LF141: B6 D5 0D LDAA LD50D ; 10
LF144: D6 7B LDAB L007B ; tcc timer, or gear
LF146: C1 02 CMPB #2 ;
LF148: 23 03 BLS LF14D ;
LF14A: B6 D5 0E LDAA LD50E ; 15
LF14D: 97 7A STAA L007A ;
LF14F: 96 05 LDAA L0005 ;
LF151: 84 7F ANDA #$7F ;
LF153: 20 04 BRA LF159 ;
;
LF155: 96 05 LDAA L0005 ;
LF157: 8A 80 ORAA #$80 ; shift light on
LF159: 20 A8 BRA LF103 ;
;
LF15B: 96 1B LDAA L001B ; rpm / 25
LF15D: A1 08 CMPA 8,X ;
LF15F: 23 E0 BLS LF141 ;
LF161: 3C PSHX ;
LF162: BD FB 64 JSR LFB64 ; get a baro adjusted tps% value
LF165: 38 PULX ;
LF166: E6 0C LDAB 12,X ;
LF168: 3D MUL ;
LF169: 05 LSLD ;
LF16A: 25 05 BCS LF171 ;
LF16C: C3 00 80 ADDD #128 ;
LF16F: 24 02 BCC LF173 ;
LF171: 86 FF LDAA #255 ;
LF173: 36 PSHA ;
LF174: CE D4 C5 LDX #$D4C5 ;
LF177: D6 7B LDAB L007B ; tcc timer, or gear
LF179: C1 02 CMPB #2 ;
LF17B: 23 03 BLS LF180 ;
LF17D: CE D4 DF LDX #$D4DF ;
LF180: C6 0B LDAB #11 ;
LF182: 96 05 LDAA L0005 ;
LF184: 2B 01 BMI LF187 ; bra if tcc lk, shft light on
LF186: 3A ABX ;
LF187: C6 28 LDAB #40 ;
LF189: 96 1B LDAA L001B ; rpm / 25
LF18B: 81 C8 CMPA #200 ;
LF18D: 25 02 BCS LF191 ;
LF18F: 86 C8 LDAA #200 ;
LF191: BD FB 91 JSR LFB91 ; 2d lkup w/SBA
LF194: 33 PULB ;
LF195: 11 CBA ;
LF196: 25 A9 BCS LF141 ;
LF198: 96 7A LDAA L007A ;
LF19A: 27 B9 BEQ LF155 ;
LF19C: 4A DECA ;
LF19D: 20 AE BRA LF14D ;

;*==================================================
;*
;* Real Time Service Routine 9
;*
;*==================================================

;
; Egr test
;
LF19F: 96 02 LDAA L0002 ; status word
LF1A1: 85 20 BITA #$20 ; b5
LF1A3: 26 36 BNE LF1DB ;
;
LF1A5: 96 07 LDAA L0007 ; status word
LF1A7: 85 08 BITA #$08 ; b3, dfco
LF1A9: 26 30 BNE LF1DB ; bra if in dfco
;
LF1AB: CE D4 AA LDX #$D4AA ; tbl addr
LF1AE: 96 7D LDAA L007D ; used in egr test, a clsd lp term
LF1B0: 27 03 BEQ LF1B5 ;
;
LF1B2: CE D4 AB LDX #$D4AB ; tbl addr
;
LF1B5: D6 30 LDAB L0030 ; mph / 1, filtered
LF1B7: E1 00 CMPB 0,X ; 2 | 1
LF1B9: 23 17 BLS LF1D2 ;
;
LF1BB: D6 43 LDAB L0043 ; tps%, from idle
LF1BD: E1 02 CMPB 2,X ; 8 | 5
LF1BF: 22 1F BHI LF1E0 ;
;
LF1C1: F6 D0 06 LDAB LD006 ; option byte: 0001 0001
LF1C4: C5 04 BITB #$04 ; b2 == 0
LF1C6: 26 0A BNE LF1D2 ; do not bra
;
LF1C8: D6 DE LDAB L00DE ; status word
LF1CA: C5 40 BITB #$40 ; b6
LF1CC: 26 04 BNE LF1D2 ;
;
LF1CE: C5 10 BITB #$10 ; b4
LF1D0: 26 09 BNE LF1DB ;
;
LF1D2: D6 DE LDAB L00DE ; status word
LF1D4: C4 EF ANDB #$EF ; clr b4, 1110 1111
LF1D6: D7 DE STAB L00DE ; status word
;
LF1D8: 7F 00 7E CLR L007E ;

;
;
;
LF1DB: 4F CLRA ;
LF1DC: 97 7F STAA L007F ;
LF1DE: 20 76 BRA LF256 ;

;
;
;
LF1E0: D6 DE LDAB L00DE ; status word
LF1E2: C5 10 BITB #$10 ;
LF1E4: 27 02 BEQ LF1E8 ;
;
LF1E6: 96 7E LDAA L007E ;
LF1E8: D6 2E LDAB L002E ; vac
LF1EA: F1 D4 AE CMPB LD4AE ;
LF1ED: 22 2C BHI LF21B ;
;
LF1EF: D6 7F LDAB L007F ;
LF1F1: F1 D4 A9 CMPB LD4A9 ; 1
LF1F4: 5C INCB ;
LF1F5: 25 54 BCS LF24B ;
;
LF1F7: D6 A2 LDAB L00A2 ; integrator
LF1F9: F1 D4 AF CMPB LD4AF ; 123
LF1FC: 24 0D BCC LF20B ;
;
LF1FE: F1 D4 B0 CMPB LD4B0 ; 116
LF201: 24 18 BCC LF21B ;
;
LF203: B0 D4 B3 SUBA LD4B3 ; 5
LF206: 22 13 BHI LF21B ;
;
LF208: 4F CLRA ;
LF209: 20 10 BRA LF21B ;
;
;
LF20B: F6 D4 B1 LDAB LD4B1 ; 3
LF20E: 7D 00 B0 TST L00B0 ; closed loop correction term
LF211: 2B 03 BMI LF216 ; bra if >= 128, removing fuel
LF213: F6 D4 B2 LDAB LD4B2 ; 16
;
LF216: 1B ABA ;
LF217: 24 02 BCC LF21B ;
LF219: 86 FF LDAA #255 ;
;
LF21B: D6 0E LDAB L000E ; status word, a/f mode
LF21D: 2B 07 BMI LF226 ; bra if closed loop
LF21F: F6 D0 05 LDAB LD005 ; option byte: 0010 0011
LF222: C5 08 BITB #$08 ;
LF224: 27 B2 BEQ LF1D8 ;
;
LF226: B1 D2 35 CMPA LD235 ; 166
LF229: 23 16 BLS LF241 ;
;
LF22B: D6 30 LDAB L0030 ; mph / 1, filtered
LF22D: F1 D4 B4 CMPB LD4B4 ; 20 mph
LF230: 23 0F BLS LF241 ; bra if mph <= 20 mph
;
LF232: D6 A1 LDAB L00A1 ; BLM, bin val
LF234: F1 D4 B5 CMPB LD4B5 ; 112
LF237: 23 08 BLS LF241 ; bra if blm <= 112
;
LF239: 97 7E STAA L007E ;
LF23B: D6 DE LDAB L00DE ; status word
LF23D: CA 10 ORAB #$10 ;
LF23F: 20 07 BRA LF248 ;
;
LF241: 7F 00 7E CLR L007E ;
LF244: D6 DE LDAB L00DE ; status word
LF246: C4 EF ANDB #$EF ;
LF248: D7 DE STAB L00DE ; status word
LF24A: 5F CLRB ;
LF24B: D7 7F STAB L007F ;
;
LF24D: D6 00 LDAB L0000 ; status word
LF24F: C5 02 BITB #$02 ; b1
LF251: 27 03 BEQ LF256 ;
LF253: BD 58 06 JSR L5806 ; HU

;
;
;
LF256: D6 05 LDAB L0005 ;
LF258: C4 F7 ANDB #$F7 ; 1111 0111
LF25A: 97 7D STAA L007D ; used in egr test, a clsd lp term
LF25C: 27 02 BEQ LF260 ;
;
LF25E: CA 08 ORAB #$08 ; 0000 1000
;
LF260: D1 05 CMPB L0005 ;
LF262: 27 02 BEQ LF266 ;
;
LF264: CA 02 ORAB #$02 ; 0000 0010
LF266: D7 05 STAB L0005 ;
LF268: 39 RTS ;

;*==================================================
;*
;* Real Time Service Routine 7
;*
;* IAC stuff
;*==================================================

;
; check which routine to run
;
LF269: 96 30 LDAA L0030 ; mph / 1, filtered
LF26B: D6 66 LDAB L0066 ; 160Hz rts counter
LF26D: C5 10 BITB #$10 ; chk b4
LF26F: 27 31 BEQ LF2A2 ; bra if b4 == 0
;
;
;
;
LF271: B1 D5 2F CMPA LD52F ; 250
LF274: 22 25 BHI LF29B ; bra if mph > 250 mph
;
LF276: 96 CA LDAA L00CA ; Delay timer for low BatV IAC step changes
LF278: 4C INCA ;
LF279: B1 D5 31 CMPA LD531 ; 16
LF27C: 23 21 BLS LF29F ;
;
;
; Do BatV adj to IAC steps
;
LF27E: D6 CB LDAB L00CB ; BatV idle bump steps
LF280: 96 40 LDAA L0040 ; Battery Volts, * 10, adc cnts
LF282: B1 D5 30 CMPA LD530 ; 12.6 v
LF285: 24 0F BCC LF296 ; bra if BatV >= 12.6v
;
LF287: FB D5 2D ADDB LD52D ; 1, add a step
LF28A: 25 05 BCS LF291 ; bra if ovrflw
;
LF28C: F1 D5 2E CMPB LD52E ; 12, max allowed to add
LF28F: 23 03 BLS LF294 ;
;
LF291: F6 D5 2E LDAB LD52E ; 12, use max
LF294: 20 06 BRA LF29C ;
;
;
LF296: F0 D5 2D SUBB LD52D ; 1, sub a step
LF299: 24 01 BCC LF29C ; bra if no undrflw
;
LF29B: 5F CLRB ; clr undrflw
LF29C: D7 CB STAB L00CB ; IAC steps added for low BatV
;
LF29E: 4F CLRA ;
;
LF29F: 97 CA STAA L00CA ; Delay timer for low BatV IAC step changes
LF2A1: 39 RTS ;

;-----------------------------------------------
;
;
;-----------------------------------------------

;
; IAC stuff
;
LF2A2: B1 D5 46 CMPA LD546 ; 25 mph, reset bias
LF2A5: 25 03 BCS LF2AA ; bra if mph < 25 mph
;
LF2A7: 7F 00 C9 CLR L00C9 ; clear IAC steps, bias
;
;
;
; figure out idle rpm required
;
LF2AA: F6 D5 2B LDAB LD52B ; 80, 1000 rpm
LF2AD: 96 02 LDAA L0002 ; status word
LF2AF: 85 20 BITA #$20 ; b5, b5, aldl mode forced closed loop (10K)
LF2B1: 26 0E BNE LF2C1 ; bra if b5 == 1
;
LF2B3: F6 D5 2C LDAB LD52C ; 44, 550 rpm, desired idle
LF2B6: 96 10 LDAA L0010 ; status word
LF2B8: 85 08 BITA #$08 ;
LF2BA: 27 03 BEQ LF2BF ;
;
LF2BC: F6 D5 2A LDAB LD52A ; 45, +562.5 rpm
LF2BF: DB CB ADDB L00CB ; IAC rpm/12.5 added for low BatV
;
LF2C1: D7 CE STAB L00CE ; desired idle rpm
;
;
; chk if want to lag filter TF steps out
;
LF2C3: 96 10 LDAA L0010 ; status word
LF2C5: 85 40 BITA #$40 ; tst b6, decay out tf steps
LF2C7: 27 62 BEQ LF32B ; bra if == 0, do not decay out TF
;
;
; Lag filter Decay the IAC throttle follower
;
; Decide which filt coef to use based on vehicle speed
;
LF2C9: B6 D5 39 LDAA LD539 ; filt coef, 32
LF2CC: D6 30 LDAB L0030 ; mph / 1, filtered
LF2CE: F1 D5 3E CMPB LD53E ; 5 mph
LF2D1: 25 0B BCS LF2DE ; bra if mph < 5
;
LF2D3: B6 D5 3A LDAA LD53A ; filt coef, 16
LF2D6: F1 D5 3F CMPB LD53F ; 20 mph
LF2D9: 25 03 BCS LF2DE ; bra if mph < 20 mph
;
LF2DB: B6 D5 3B LDAA LD53B ; filt coef, 25
;
LF2DE: 97 4F STAA L004F ; tmp storage
LF2E0: 96 C5 LDAA L00C5 ; throttle follower steps, raw
LF2E2: 91 C3 CMPA L00C3 ; throttle follower steps, filtered
LF2E4: 22 17 BHI LF2FD ;
;
LF2E6: B6 D5 40 LDAA LD540 ; 10, min TF steps if mph > 5
LF2E9: F1 D5 3E CMPB LD53E ; 5 mph
LF2EC: 25 04 BCS LF2F2 ; bra if mph < 5
;
LF2EE: 91 C5 CMPA L00C5 ; throttle follower steps, raw
LF2F0: 24 02 BCC LF2F4 ;
;
LF2F2: 96 C5 LDAA L00C5 ; throttle follower steps, raw
LF2F4: DE C3 LDX L00C3 ; throttle follower steps, filtered
LF2F6: D6 4F LDAB L004F ; filt coef, tmp storage
LF2F8: BD FB 40 JSR LFB40 ; Lag Filter
LF2FB: DD C3 STD L00C3 ; throttle follower steps, filtered
;
;
; Lag filter IAC
;
LF2FD: DE BF LDX L00BF ; IAC steps, lag filtered
LF2FF: F6 D5 3C LDAB LD53C ; filt coef, 64
LF302: 4F CLRA ;
LF303: BD FB 40 JSR LFB40 ; Lag Filter
LF306: DD BF STD L00BF ; IAC steps, lag filtered
;
;
; Lag filter IAC
;
LF308: DE C1 LDX L00C1 ; IAC steps, lag filtered
LF30A: F6 D5 3D LDAB LD53D ; filt coef, 15
LF30D: 4F CLRA ;
LF30E: BD FB 40 JSR LFB40 ; Lag Filter
LF311: DD C1 STD L00C1 ; IAC steps, lag filtered
;
;
; see if time to reset 'do TF decay' bit
;
LF313: 9A C3 ORAA L00C3 ; throttle follower steps, filtered
LF315: 9A BF ORAA L00BF ; IAC steps, lag filtered
LF317: 26 06 BNE LF31F ;
;
LF319: 96 10 LDAA L0010 ; status word
LF31B: 84 BF ANDA #$BF ; clr b6, 1011 1111
LF31D: 97 10 STAA L0010 ; status word
;
;
;
;
LF31F: D6 10 LDAB L0010 ; status word
LF321: C5 20 BITB #$20 ;
LF323: 26 1A BNE LF33F ;
;
LF325: 96 CC LDAA L00CC ;
LF327: 27 1A BEQ LF343 ;
;
LF329: 20 14 BRA LF33F ;
;
;
;
;
LF32B: 96 00 LDAA L0000 ; status word
LF32D: 85 02 BITA #$02 ;
LF32F: 27 0E BEQ LF33F ;
;
LF331: 96 11 LDAA L0011 ;
LF333: 84 F0 ANDA #$F0 ;
LF335: 27 08 BEQ LF33F ;
;
LF337: 81 80 CMPA #$80 ;
LF339: 27 04 BEQ LF33F ;
;
LF33B: 81 90 CMPA #$90 ;
LF33D: 26 04 BNE LF343 ;
;
LF33F: 96 01 LDAA L0001 ; status word
LF341: 2B 06 BMI LF349 ; Engine is Running
;
LF343: B6 D5 18 LDAA LD518 ; large err extend, idle too hi
LF346: 97 C6 STAA L00C6 ; idle control delay timer
LF348: 39 RTS ;

;-----------------------------------------------
;
; Check & decrement counter
; Timer delay for Idle Correction
;
;-----------------------------------------------

LF349: 96 C6 LDAA L00C6 ; idle control delay timer
LF34B: 27 04 BEQ LF351 ;
LF34D: 4A DECA ;
LF34E: 97 C6 STAA L00C6 ; idle control delay timer
LF350: 39 RTS ;

;-----------------------------------------------
;
; Exec Here if L00C6 == 0, time to adjust idle
;
;-----------------------------------------------

LF351: 96 10 LDAA L0010 ; status word
LF353: 2A 0C BPL LF361 ; bra if b7 == 0, P/S stall not in effect
;
;
; P/S Stall Saver in Effect
;
LF355: B6 D5 13 LDAA LD513 ; 52, 650 rpm to exit stall saver
LF358: BB D5 1B ADDA LD51B ; 25 rpm, stall saver hyst?
LF35B: 24 06 BCC LF363 ;
LF35D: 86 FF LDAA #255 ;
LF35F: 20 02 BRA LF363 ;
;
;
; Here for Idle Control Changes
;
LF361: 96 CE LDAA L00CE ; desired idle speed
;
LF363: 97 CF STAA L00CF ; desired idle rpm / 12.5, final

;
; Lookup IAC delay for idle correction steps
;
LF365: CE D5 15 LDX #$D515 ; IAC idle adjust timer table
LF368: 90 1D SUBA L001D ; rpm / 12.5, filtered
LF36A: 22 09 BHI LF375 ; bra if idle < desired
;
;
; Idle RPM too High
;
LF36C: 40 NEGA ;
LF36D: B1 D5 19 CMPA LD519 ; neg err bk pt for large gain wd against Delta
LF370: 23 0B BLS LF37D ; use this tbl entry
;
LF372: 08 INX ; next tbl entry
LF373: 20 08 BRA LF37D ;
;
;
; Idle RPM too Low
;
LF375: 08 INX ; next tbl, idle too low
LF376: 08 INX ;
LF377: B1 D5 1A CMPA LD51A ; pos err bk pt for large gain wd against delta
LF37A: 23 01 BLS LF37D ;
;
LF37C: 08 INX ; next tbl entry

;
; Load Idle Control Delay Value
;
LF37D: E6 00 LDAB 0,X ; Get extend/retract Idle corr timer val
;
;
; load a default iac delay for in gr, rpm > 900
;
LF37F: 96 10 LDAA L0010 ; status word
LF381: 85 10 BITA #$10 ; pk/neut
LF383: 27 0E BEQ LF393 ; bra if not in prk/neut
;
LF385: 96 1D LDAA L001D ; rpm / 12.5, filtered
LF387: B1 D5 36 CMPA LD536 ; 72, rpm / 12.5, 900 rpm
LF38A: 22 07 BHI LF393 ; bra if rpm > 900 rpm
;
LF38C: 96 C8 LDAA L00C8 ;
LF38E: 27 03 BEQ LF393 ;
;
LF390: F6 D5 22 LDAB LD522 ; 1, default delay for in gear, rpm too high
;
;
;
;
LF393: D7 C6 STAB L00C6 ; idle control delay timer
LF395: 96 C8 LDAA L00C8 ;
LF397: 27 03 BEQ LF39C ; bra if L00C8 == 0
;
LF399: 7A 00 C8 DEC L00C8 ;
LF39C: D6 0F LDAB L000F ; status word
LF39E: C4 33 ANDB #$33 ;
LF3A0: 96 20 LDAA L0020 ;
LF3A2: 90 1D SUBA L001D ; rpm / 12.5, filtered
LF3A4: 24 03 BCC LF3A9 ;
LF3A6: CA 04 ORAB #$04 ;
LF3A8: 40 NEGA ;
LF3A9: B1 D5 1C CMPA LD51C ;
LF3AC: 25 02 BCS LF3B0 ;
;
LF3AE: CA 08 ORAB #$08 ;
LF3B0: 96 1D LDAA L001D ; rpm / 12.5, filtered
LF3B2: 97 20 STAA L0020 ;
LF3B4: 96 CF LDAA L00CF ; desired idle rpm / 12.5, final
LF3B6: 90 1D SUBA L001D ; rpm / 12.5, filtered
LF3B8: 24 03 BCC LF3BD ; bra if idle too low
;
LF3BA: CA 80 ORAB #$80 ; flag as idle too high
LF3BC: 40 NEGA ;
;
LF3BD: D7 0F STAB L000F ; status word
LF3BF: B1 D5 1B CMPA LD51B ; 25 rpm, stall saver hyst?
LF3C2: 24 04 BCC LF3C8 ;
;
LF3C4: 7F 00 C8 CLR L00C8 ;
LF3C7: 39 RTS ;

;-----------------------------------------------
;
;
;-----------------------------------------------

LF3C8: CA 40 ORAB #$40 ;
LF3CA: D7 0F STAB L000F ; status word
;
LF3CC: 96 30 LDAA L0030 ; mph / 1, filtered
LF3CE: 27 05 BEQ LF3D5 ; bra if mph == 0!, do idle control
;
LF3D0: 96 10 LDAA L0010 ; status word
LF3D2: 2A 3D BPL LF411 ; bra if b7 == 0, P/S stall not in effect
LF3D4: 39 RTS ;

;-----------------------------------------------
;
; 0 mph comes here
;
; Allowed to Adjust Idle
;
;-----------------------------------------------

LF3D5: 96 43 LDAA L0043 ; tps%, from idle
LF3D7: B1 D5 14 CMPA LD514 ; 5, 2%, max allowed for idle adj
LF3DA: 22 35 BHI LF411 ; bra if tps > thresh
;
LF3DC: 96 10 LDAA L0010 ; status word
LF3DE: 85 20 BITA #$20 ;
LF3E0: 26 47 BNE LF429 ; bra if b5 == 1, idle too low
;
LF3E2: 96 02 LDAA L0002 ; status word
LF3E4: 85 20 BITA #$20 ; b5, aldl mode forced closed loop (10K)
LF3E6: 26 48 BNE LF430 ; bra if on aldl mode
;
LF3E8: B6 D5 36 LDAA LD536 ; 72, rpm / 12.5, 900 rpm
LF3EB: D6 CD LDAB L00CD ;
LF3ED: 27 34 BEQ LF423 ;
;
LF3EF: D6 DF LDAB L00DF ; status word
LF3F1: C5 10 BITB #$10 ;
LF3F3: 27 1B BEQ LF410 ;
;
LF3F5: D6 21 LDAB L0021 ; coolant, defaulted, 1k pu, inverse, adc cnts
LF3F7: F1 D5 45 CMPB LD545 ;
LF3FA: 23 03 BLS LF3FF ;
;
LF3FC: B6 D5 35 LDAA LD535 ; 112, rpm / 12.5, 1400 rpm
LF3FF: D6 10 LDAB L0010 ; status word
LF401: C5 40 BITB #$40 ;
LF403: 26 0B BNE LF410 ;
;
LF405: D6 C9 LDAB L00C9 ;
LF407: 91 1D CMPA L001D ; rpm / 12.5, filtered
LF409: 24 05 BCC LF410 ;
;
LF40B: 5C INCB ;
LF40C: 27 02 BEQ LF410 ;
LF40E: D7 C9 STAB L00C9 ;
LF410: 39 RTS ;

;-----------------------------------------------
;
; Adjust IAC steps in L00CC
;
; idle adjustment
;
;-----------------------------------------------

LF411: 96 CC LDAA L00CC ; either decr | incr, idle control counts
LF413: D6 0F LDAB L000F ; status word
LF415: 2A 06 BPL LF41D ; IAC, whether L00CC inc'd | dec'd (idle spd)
;
;
; L000F, b7 == 1, idle too high
;
LF417: 4D TSTA ;
LF418: 27 06 BEQ LF420 ;
;
LF41A: 4A DECA ;
LF41B: 20 03 BRA LF420 ;
;
;
; L000F, b7 == 0, idle too low
;
LF41D: 4C INCA ;
LF41E: 27 FA BEQ LF41A ;
;
LF420: 97 CC STAA L00CC ;
LF422: 39 RTS ;

;-----------------------------------------------
;
;
;-----------------------------------------------

LF423: D6 10 LDAB L0010 ; status word
LF425: C5 10 BITB #$10 ;
LF427: 26 D6 BNE LF3FF ;
;
LF429: 96 C9 LDAA L00C9 ;
LF42B: B0 D5 37 SUBA LD537 ; 2
LF42E: 24 01 BCC LF431 ;
;
LF430: 4F CLRA ;
LF431: 97 C9 STAA L00C9 ;
LF433: 96 10 LDAA L0010 ; status word
LF435: D6 0F LDAB L000F ; status word
LF437: 2A 2C BPL LF465 ;
;
LF439: D6 CC LDAB L00CC ;
LF43B: 27 05 BEQ LF442 ;
;
LF43D: 5A DECB ;
LF43E: D7 CC STAB L00CC ;
LF440: 20 20 BRA LF462 ;
;
LF442: 85 08 BITA #$08 ;
LF444: 27 15 BEQ LF45B ;
LF446: 96 BE LDAA L00BE ;
LF448: D6 E4 LDAB L00E4 ;
LF44A: 11 CBA ;
LF44B: 22 06 BHI LF453 ;
;
LF44D: 5D TSTB ;
LF44E: 27 01 BEQ LF451 ;
;
LF450: 5A DECB ;
LF451: D7 E4 STAB L00E4 ;
LF453: 4D TSTA ;
LF454: 27 2B BEQ LF481 ;
;
LF456: 4A DECA ;
LF457: 97 BE STAA L00BE ;
LF459: 20 07 BRA LF462 ;
;
LF45B: 96 E4 LDAA L00E4 ;
LF45D: 27 22 BEQ LF481 ;
;
LF45F: 4A DECA ;
LF460: 97 E4 STAA L00E4 ;
LF462: 5F CLRB ;
LF463: 20 32 BRA LF497 ;
;
LF465: 85 08 BITA #$08 ;
LF467: 27 0C BEQ LF475 ;
;
LF469: 96 BE LDAA L00BE ;
LF46B: B1 D5 33 CMPA LD533 ; 90
LF46E: 24 2B BCC LF49B ;
;
LF470: 4C INCA ;
LF471: 97 BE STAA L00BE ;
LF473: 20 2F BRA LF4A4 ;
;
LF475: 96 E4 LDAA L00E4 ;
LF477: B1 D5 34 CMPA LD534 ; 56
LF47A: 24 1F BCC LF49B ;
;
LF47C: 4C INCA ;
LF47D: 97 E4 STAA L00E4 ;
LF47F: 20 23 BRA LF4A4 ;
LF481: 7C 00 FD INC L00FD ; Current IAC position, steps
;
LF484: 96 1D LDAA L001D ; rpm / 12.5, filtered
LF486: 90 CE SUBA L00CE ; desired idle speed
LF488: 25 D8 BCS LF462 ;
;
;
; IAC diag test?
;
LF48A: B0 D4 7F SUBA LD47F ; 6
LF48D: 25 D3 BCS LF462 ;
;
LF48F: D6 D0 LDAB L00D0 ;
LF491: F1 D4 81 CMPB LD481 ; 0
LF494: 24 08 BCC LF49E ;
LF496: 5C INCB ;
LF497: D7 D0 STAB L00D0 ;
LF499: 20 09 BRA LF4A4 ;
;
LF49B: 7A 00 FD DEC L00FD ; Current IAC position, steps
LF49E: 96 10 LDAA L0010 ; status word
LF4A0: 84 FC ANDA #$FC ;
LF4A2: 97 10 STAA L0010 ; status word
LF4A4: B6 D4 3A LDAA LD43A ; Diag mask 1, 1111 1111
LF4A7: 85 01 BITA #$01 ;
LF4A9: 27 24 BEQ LF4CF ;
;
LF4AB: 96 DE LDAA L00DE ; status word
LF4AD: 85 40 BITA #$40 ;
LF4AF: 27 1E BEQ LF4CF ;
;
LF4B1: F6 D5 1E LDAB LD51E ; 22
LF4B4: 96 10 LDAA L0010 ; status word
LF4B6: 85 08 BITA #$08 ;
LF4B8: 26 08 BNE LF4C2 ;
;
LF4BA: D1 E4 CMPB L00E4 ;
LF4BC: 23 02 BLS LF4C0 ;
;
LF4BE: D7 E4 STAB L00E4 ;
LF4C0: 20 0D BRA LF4CF ;
;
LF4C2: FB D5 10 ADDB LD510 ; 18
LF4C5: 24 02 BCC LF4C9 ;
;
LF4C7: C6 FF LDAB #255 ;
LF4C9: D1 BE CMPB L00BE ;
LF4CB: 23 02 BLS LF4CF ;
;
LF4CD: D7 BE STAB L00BE ;
LF4CF: 39 RTS ;

;*==================================================
;*
;* Real Time Service Routine 8
;*
;*==================================================

LF4D0: D6 66 LDAB L0066 ; 160Hz rts counter
LF4D2: C5 10 BITB #$10 ;
LF4D4: 26 29 BNE LF4FF ; bra if not time to decay knock SA
;
;
; decay out knock retard SA
;
LF4D6: D6 0D LDAB L000D ; status word
LF4D8: 2B 09 BMI LF4E3 ; bra if in PE/WOT mode
;
LF4DA: CE D1 C7 LDX #$D1C7 ; non-PE recovery tbl
LF4DD: 96 2E LDAA L002E ; vac
LF4DF: C6 48 LDAB #72 ; lwr tbl limit
LF4E1: 20 07 BRA LF4EA ;
;
LF4E3: CE D1 C2 LDX #$D1C2 ; PE recovery tbl
LF4E6: 96 1B LDAA L001B ; rpm / 25
LF4E8: C6 10 LDAB #16 ; lwr tbl limit
;
LF4EA: 44 LSRA ;
LF4EB: BD FB 83 JSR LFB83 ; 2d lkup w/upr limt in 1st tbl entry, lwr limt in B
;
;
LF4EE: D6 6D LDAB L006D ; knock retard SA
LF4F0: 3D MUL ;
LF4F1: 89 00 ADCA #0 ;
LF4F3: 40 NEGA ;
LF4F4: 26 02 BNE LF4F8 ;
LF4F6: 86 FF LDAA #255 ;
;
LF4F8: 9B 6D ADDA L006D ; knock retard SA
LF4FA: 25 01 BCS LF4FD ;
LF4FC: 4F CLRA ;
LF4FD: 97 6D STAA L006D ; knock retard SA

;
; Knock sensor diag test
;
LF4FF: B6 D4 3C LDAA LD43C ; diag mask 3, 1111 0011
LF502: 2A 24 BPL LF528 ;
LF504: 96 6C LDAA L006C ;
LF506: 4C INCA ;
LF507: 81 27 CMPA #39 ;
LF509: 25 1B BCS LF526 ;
;
LF50B: FC BC 0A LDD LBC0A ; Knock counter (PA3)
LF50E: 97 49 STAA L0049 ;
LF510: D6 09 LDAB L0009 ; status word
;
LF512: 90 6B SUBA L006B ;
LF514: B1 D4 88 CMPA LD488 ; 235, runaway knock cnts
LF517: 25 04 BCS LF51D ;
;
LF519: CA 40 ORAB #$40 ; 0100 0000, esc 43 err
LF51B: 20 02 BRA LF51F ;
;
LF51D: C4 BF ANDB #$BF ; 1011 1111
;
LF51F: D7 09 STAB L0009 ; status word
;
LF521: 96 49 LDAA L0049 ;
LF523: 97 6B STAA L006B ;
LF525: 4F CLRA ;
;
LF526: 97 6C STAA L006C ;
LF528: 39 RTS ;

;*==================================================
;*
;* Real Time Service Routine D
;*
;* Do Error Diagnostics on Sensors
;*==================================================

LF529: D6 66 LDAB L0066 ; 160Hz rts counter
LF52B: 96 08 LDAA L0008 ; status word
LF52D: C4 F0 ANDB #$F0 ;
LF52F: 26 0A BNE LF53B ;
LF531: 8A 08 ORAA #8 ;
LF533: D6 EC LDAB L00EC ; eng run time, lsb
LF535: C5 01 BITB #$01 ;
LF537: 26 02 BNE LF53B ;
LF539: 8A 10 ORAA #$10 ;
LF53B: 97 08 STAA L0008 ; status word
;
LF53D: B6 08 81 LDAA L0881 ; MCU1 I/O
LF540: 85 40 BITA #$40 ; b6, cal12 (netres)
LF542: 26 06 BNE LF54A ; bra if b6, have netres
;
LF544: 96 14 LDAA L0014 ; error flag 3
LF546: 8A 08 ORAA #$08 ; set b3, adu/netres error
LF548: 97 14 STAA L0014 ; error flag 3
;
LF54A: D6 0A LDAB L000A ; status word
LF54C: 96 02 LDAA L0002 ; status word
LF54E: 85 10 BITA #$10 ; test b4, aldl shorted mode
LF550: 27 5D BEQ LF5AF ;
;
LF552: CA 80 ORAB #$80 ;
LF554: D7 0A STAB L000A ; status word
;
LF556: 7F 00 92 CLR L0092 ; error log timer
LF559: 96 01 LDAA L0001 ; status word
LF55B: 2A 6C BPL LF5C9 ; Engine is not Running
LF55D: D6 0E LDAB L000E ; status word, a/f mode
LF55F: 2B 0E BMI LF56F ; bra if closed loop
LF561: 96 06 LDAA L0006 ;
LF563: 84 F7 ANDA #$F7 ;
LF565: 88 40 EORA #64 ;
LF567: 97 06 STAA L0006 ;
LF569: 85 40 BITA #$40 ;
LF56B: 26 37 BNE LF5A4 ;
LF56D: 20 2B BRA LF59A ;
;
;
LF56F: 96 06 LDAA L0006 ;
LF571: 85 08 BITA #$08 ;
LF573: 26 15 BNE LF58A ;
;
LF575: D6 08 LDAB L0008 ; status word
LF577: C5 08 BITB #$08 ;
LF579: 27 E6 BEQ LF561 ;
;
LF57B: 8A 08 ORAA #8 ;
LF57D: 97 06 STAA L0006 ;
LF57F: D6 0E LDAB L000E ; status word, a/f mode
LF581: C5 40 BITB #$40 ;
LF583: 27 1C BEQ LF5A1 ;
;
LF585: BD FC 40 JSR LFC40 ; do SES light on
LF588: 20 1A BRA LF5A4 ;
LF58A: 96 08 LDAA L0008 ; status word
LF58C: 85 08 BITA #$08 ;
LF58E: 27 14 BEQ LF5A4 ;
LF590: 96 06 LDAA L0006 ;
LF592: 85 10 BITA #$10 ;
LF594: 27 E9 BEQ LF57F ;
LF596: 84 EF ANDA #$EF ;
LF598: 97 06 STAA L0006 ;
LF59A: FC BC 3C LDD LBC3C ; PWM control register
LF59D: C5 08 BITB #$08 ;
LF59F: 26 E4 BNE LF585 ;
LF5A1: BD FC 4B JSR LFC4B ;
;
LF5A4: 7F 00 0C CLR L000C ;
LF5A7: 96 06 LDAA L0006 ;
LF5A9: 8A 04 ORAA #$04 ;
LF5AB: 97 06 STAA L0006 ;
LF5AD: 20 30 BRA LF5DF ;
;
;-----------------------------------------------
;
; ADU error comes here
;
;-----------------------------------------------

LF5AF: C4 7F ANDB #$7F ;
LF5B1: D7 0A STAB L000A ; status word
LF5B3: 96 06 LDAA L0006 ;
LF5B5: 84 E3 ANDA #$E3 ;
LF5B7: 97 06 STAA L0006 ;
LF5B9: 7F 00 0C CLR L000C ;
LF5BC: 96 14 LDAA L0014 ; error flag 3
LF5BE: 84 10 ANDA #$10 ;
LF5C0: 27 03 BEQ LF5C5 ;
LF5C2: 7E F9 D6 JMP LF9D6 ;
;
;
LF5C5: 96 01 LDAA L0001 ; status word
LF5C7: 2B 16 BMI LF5DF ; Engine is Running
LF5C9: 96 06 LDAA L0006 ;
LF5CB: 84 E3 ANDA #$E3 ; 1110 0011
LF5CD: 97 06 STAA L0006 ;
LF5CF: 4F CLRA ; clear a bunch of diag timers
LF5D0: 97 85 STAA L0085 ;
LF5D2: 97 91 STAA L0091 ; timer/counter
LF5D4: 97 89 STAA L0089 ;
LF5D6: 97 86 STAA L0086 ; diag timer, O2 lean
LF5D8: 97 87 STAA L0087 ; diag timer, O2 rich
LF5DA: 97 8B STAA L008B ;
LF5DC: 7E F9 22 JMP LF922 ;

;-----------------------------------------------
;
;
;-----------------------------------------------

LF5DF: 96 08 LDAA L0008 ; status word
LF5E1: 85 02 BITA #$02 ;
LF5E3: 26 24 BNE LF609 ;
LF5E5: D6 EC LDAB L00EC ; eng run time, lsb
LF5E7: C1 0A CMPB #10 ;
LF5E9: 25 1E BCS LF609 ;
LF5EB: 8A 02 ORAA #2 ;
LF5ED: 97 08 STAA L0008 ; status word
LF5EF: 7C 00 E9 INC L00E9 ; successful start up's (w/o err)
LF5F2: 96 E9 LDAA L00E9 ; successful start up's (w/o err)
LF5F4: B1 D4 3D CMPA LD43D ;
LF5F7: 23 10 BLS LF609 ;
LF5F9: 4F CLRA ; clear error flags
LF5FA: 97 E1 STAA L00E1 ; error flag 1
LF5FC: 97 E2 STAA L00E2 ; error flag 2
LF5FE: 97 E3 STAA L00E3 ; error flag 3
LF600: 97 E9 STAA L00E9 ; successful start up's (w/o err)
LF602: 97 0C STAA L000C ;
LF604: BD FD 1A JSR LFD1A ; Do CkSum on Error Flags
LF607: 97 EA STAA L00EA ; error flag cksum
LF609: D6 08 LDAB L0008 ; status word
LF60B: C5 24 BITB #$24 ;
LF60D: 26 4A BNE LF659 ;
LF60F: 96 0A LDAA L000A ; status word
LF611: 85 40 BITA #$40 ;
LF613: 26 0E BNE LF623 ;
LF615: DC EB LDD L00EB ; eng run time
LF617: 04 LSRD ;
LF618: F1 D4 42 CMPB LD442 ;
LF61B: 25 3C BCS LF659 ;
LF61D: 96 0A LDAA L000A ; status word
LF61F: 8A 40 ORAA #$40 ;
LF621: 97 0A STAA L000A ; status word

;----------------------------------------------
;
; Test O2 Window
;
;----------------------------------------------

LF623: D6 39 LDAB L0039 ; O2, adc, filtered, round up from L003A
LF625: F1 D4 44 CMPB LD444 ;
LF628: 22 2F BHI LF659 ;
LF62A: F1 D4 43 CMPB LD443 ;
LF62D: 23 2A BLS LF659 ;
LF62F: D6 88 LDAB L0088 ;
LF631: F1 D4 46 CMPB LD446 ;
LF634: 22 28 BHI LF65E ;
LF636: 96 08 LDAA L0008 ; status word
LF638: 85 10 BITA #$10 ;
LF63A: 27 28 BEQ LF664 ;
LF63C: D6 21 LDAB L0021 ; coolant, defaulted, 1k pu, inverse, adc cnts
LF63E: F1 D4 47 CMPB LD447 ;
LF641: 22 21 BHI LF664 ;
LF643: 96 43 LDAA L0043 ; tps%, from idle
LF645: B1 D4 45 CMPA LD445 ;
LF648: 22 0A BHI LF654 ;
LF64A: 7D 00 88 TST L0088 ;
LF64D: 27 15 BEQ LF664 ;
LF64F: 7A 00 88 DEC L0088 ;
LF652: 20 10 BRA LF664 ;
LF654: 7C 00 88 INC L0088 ;
LF657: 20 0B BRA LF664 ;
LF659: 7F 00 88 CLR L0088 ;
LF65C: 20 06 BRA LF664 ;
LF65E: 96 12 LDAA L0012 ; error flag 1
LF660: 8A 40 ORAA #64 ;
LF662: 97 12 STAA L0012 ; error flag 1

;--------------------------------------------------
;
; Err 21 Diag Test, TPS
;
;--------------------------------------------------

LF664: D6 08 LDAB L0008 ; status word
LF666: C4 FB ANDB #$FB ;
LF668: 96 42 LDAA L0042 ; tps, adc cnts, volts = n * .0196
LF66A: B1 D4 4F CMPA LD44F ;
LF66D: 23 13 BLS LF682 ;
LF66F: 96 85 LDAA L0085 ;
LF671: B1 D4 50 CMPA LD450 ;
LF674: 22 11 BHI LF687 ;
LF676: 96 FE LDAA L00FE ; baro pressure, A/D cnts
LF678: B1 D4 51 CMPA LD451 ;
LF67B: 24 05 BCC LF682 ;
LF67D: 7C 00 85 INC L0085 ;
LF680: 20 0D BRA LF68F ;
LF682: 7F 00 85 CLR L0085 ;
LF685: 20 08 BRA LF68F ;
LF687: 96 12 LDAA L0012 ; error flag 1
LF689: 8A 08 ORAA #8 ;
LF68B: 97 12 STAA L0012 ; error flag 1
LF68D: CA 04 ORAB #4 ;
LF68F: D7 08 STAB L0008 ; status word

;--------------------------------------------------
;
; Err 24 Diag Test, VSS
;
;--------------------------------------------------

LF691: 96 08 LDAA L0008 ; status word
LF693: D6 DE LDAB L00DE ; status word
LF695: 85 E4 BITA #$E4 ;
LF697: 26 2E BNE LF6C7 ;
;
LF699: 96 30 LDAA L0030 ; mph / 1, filtered
LF69B: B1 D4 59 CMPA LD459 ; 5
LF69E: 22 27 BHI LF6C7 ; bra if > 5 mph
;
LF6A0: 96 91 LDAA L0091 ; timer/counter
LF6A2: B1 D4 5E CMPA LD45E ; 5
LF6A5: 22 32 BHI LF6D9 ;
;
LF6A7: 96 28 LDAA L0028 ; map adc value, raw
LF6A9: B1 D4 5C CMPA LD45C ; 40
LF6AC: 24 19 BCC LF6C7 ;
;
LF6AE: 96 10 LDAA L0010 ; status word
LF6B0: 85 10 BITA #$10 ;
LF6B2: 26 13 BNE LF6C7 ;
;
LF6B4: 96 43 LDAA L0043 ; tps%, from idle
LF6B6: B1 D4 5D CMPA LD45D ; 8
LF6B9: 24 0C BCC LF6C7 ; bra if tps% > 8
;
LF6BB: 96 1A LDAA L001A ; rpm scaled
LF6BD: B1 D4 5A CMPA LD45A ; 64
LF6C0: 23 05 BLS LF6C7 ;
;
LF6C2: B1 D4 5B CMPA LD45B ; 240
LF6C5: 23 07 BLS LF6CE ;

;
;
;
LF6C7: 7F 00 91 CLR L0091 ; timer/counter
LF6CA: C4 BF ANDB #$BF ; clr b6 of L00DE
LF6CC: 20 13 BRA LF6E1 ;
;
LF6CE: 96 08 LDAA L0008 ; status word
LF6D0: 85 08 BITA #$08 ;
LF6D2: 27 0F BEQ LF6E3 ;
LF6D4: 7C 00 91 INC L0091 ; timer/counter
LF6D7: 20 0A BRA LF6E3 ;
;
;
;
;
LF6D9: 96 12 LDAA L0012 ; error flag 1
LF6DB: 8A 01 ORAA #1 ;
LF6DD: 97 12 STAA L0012 ; error flag 1
LF6DF: CA 40 ORAB #$40 ; b6, 0100 0000
;
LF6E1: D7 DE STAB L00DE ; status word
;
;--------------------------------------------------
;
; Err 32 Diag Test, EGR
;
;--------------------------------------------------

LF6E3: D6 0B LDAB L000B ;
;
LF6E5: CE D4 3B LDX #$D43B ; diag mask 2, 1011 1001
LF6E8: A6 00 LDAA 0,X ;
LF6EA: 85 20 BITA #$20 ;
LF6EC: 27 49 BEQ LF737 ;
;
LF6EE: C5 08 BITB #$08 ;
LF6F0: 26 45 BNE LF737 ;
;
LF6F2: C5 10 BITB #$10 ;
LF6F4: 26 0B BNE LF701 ;
;
LF6F6: 96 8B LDAA L008B ;
LF6F8: A1 25 CMPA 37,X ;
LF6FA: 25 48 BCS LF744 ;
;
LF6FC: CA 10 ORAB #16 ;
LF6FE: 7F 00 8B CLR L008B ;
LF701: 96 05 LDAA L0005 ;
LF703: 47 ASRA ;
LF704: 24 31 BCC LF737 ;
;
LF706: 96 2E LDAA L002E ; vac
LF708: A1 26 CMPA 38,X ;
LF70A: 23 2B BLS LF737 ;
LF70C: A1 27 CMPA 39,X ;
LF70E: 22 27 BHI LF737 ;
;
LF710: 96 43 LDAA L0043 ; tps%, from idle
LF712: A1 28 CMPA 40,X ;
LF714: 23 21 BLS LF737 ;
;
LF716: A1 29 CMPA 41,X ;
LF718: 22 1D BHI LF737 ;
;
LF71A: 90 45 SUBA L0045 ; tps%, slow filtered
LF71C: 24 01 BCC LF71F ;
;
LF71E: 40 NEGA ;
LF71F: A1 2C CMPA 44,X ;
LF721: 22 14 BHI LF737 ;
;
LF723: 96 30 LDAA L0030 ; mph / 1, filtered
LF725: A1 2F CMPA 47,X ;
LF727: 25 0E BCS LF737 ;
;
LF729: B6 D0 07 LDAA LD007 ; option byte: 0010 0100
LF72C: 2B 21 BMI LF74F ;
;
LF72E: B8 08 01 EORA L0801 ; MCU2 I/O
LF731: 84 28 ANDA #$28 ;
LF733: 81 08 CMPA #8 ;
LF735: 27 18 BEQ LF74F ;
;
;
;--------------------------------------------------
;
;
;--------------------------------------------------

LF737: C5 04 BITB #$04 ;
LF739: 27 02 BEQ LF73D ;
;
LF73B: C4 EF ANDB #$EF ;
LF73D: C4 FB ANDB #$FB ;
LF73F: 7F 00 8B CLR L008B ;
LF742: 20 5A BRA LF79E ;
;
;
LF744: 96 08 LDAA L0008 ; status word
LF746: 85 08 BITA #$08 ;
LF748: 27 F8 BEQ LF742 ;
;
LF74A: 7C 00 8B INC L008B ;
LF74D: 20 F3 BRA LF742 ;
;
LF74F: 96 7C LDAA L007C ; N/V ratio
LF751: A1 35 CMPA 53,X ;
LF753: 23 E2 BLS LF737 ;
;
LF755: A1 34 CMPA 52,X ;
LF757: 24 DE BCC LF737 ;
;
LF759: 96 2E LDAA L002E ; vac
LF75B: 40 NEGA ;
LF75C: C5 04 BITB #$04 ;
LF75E: 26 0C BNE LF76C ;
;
LF760: 97 8E STAA L008E ;
LF762: 96 8B LDAA L008B ;
LF764: A1 2A CMPA 42,X ;
LF766: 23 E2 BLS LF74A ;
;
LF768: CA 04 ORAB #4 ;
LF76A: 20 D3 BRA LF73F ;
;
LF76C: 90 8E SUBA L008E ;
LF76E: 25 04 BCS LF774 ;
;
LF770: A1 2E CMPA 46,X ;
LF772: 24 15 BCC LF789 ;
;
LF774: 96 8B LDAA L008B ;
LF776: A1 2D CMPA 45,X ;
LF778: 25 D0 BCS LF74A ;
;
LF77A: 96 8F LDAA L008F ;
LF77C: 4C INCA ;
LF77D: A1 2B CMPA 43,X ;
LF77F: 25 04 BCS LF785 ;
;
LF781: CA 01 ORAB #1 ;
LF783: A6 2B LDAA 43,X ;
LF785: 97 8F STAA L008F ;
LF787: 20 B2 BRA LF73B ;
;
LF789: 96 8F LDAA L008F ;
LF78B: A0 30 SUBA 48,X ;
LF78D: 22 F6 BHI LF785 ;
;
LF78F: 4F CLRA ;
LF790: C4 FE ANDB #$FE ;
LF792: 97 8F STAA L008F ;
LF794: B6 D0 06 LDAA LD006 ; option byte: 0001 0001
LF797: 47 ASRA ;
LF798: 24 A1 BCC LF73B ; do not branch
;
LF79A: CA 08 ORAB #8 ;
LF79C: 20 9D BRA LF73B ;
;
LF79E: D7 0B STAB L000B ;
LF7A0: C5 01 BITB #$01 ;
LF7A2: 27 0C BEQ LF7B0 ;
;
LF7A4: 96 13 LDAA L0013 ; error flag 2
LF7A6: 8A 20 ORAA #$20 ;
LF7A8: 97 13 STAA L0013 ; error flag 2
LF7AA: 96 DF LDAA L00DF ; status word
LF7AC: 8A 20 ORAA #$20 ;
LF7AE: 97 DF STAA L00DF ; status word

;--------------------------------------------------
;
; Err 33 Diag Test, Map Hi
;
;--------------------------------------------------

LF7B0: D6 08 LDAB L0008 ; status word
LF7B2: C4 BF ANDB #$BF ;
LF7B4: C5 24 BITB #$24 ;
LF7B6: 26 20 BNE LF7D8 ;
LF7B8: B6 D4 72 LDAA LD472 ;
LF7BB: 91 FE CMPA L00FE ; baro pressure, A/D cnts
LF7BD: 23 02 BLS LF7C1 ;
LF7BF: 96 FE LDAA L00FE ; baro pressure, A/D cnts
LF7C1: 91 2A CMPA L002A ; adc map val, raw?
LF7C3: 24 13 BCC LF7D8 ;
LF7C5: 96 89 LDAA L0089 ;
LF7C7: B1 D4 73 CMPA LD473 ;
LF7CA: 22 11 BHI LF7DD ;
LF7CC: 96 43 LDAA L0043 ; tps%, from idle
LF7CE: B0 D4 71 SUBA LD471 ;
LF7D1: 24 05 BCC LF7D8 ;
LF7D3: 7C 00 89 INC L0089 ;
LF7D6: 20 0D BRA LF7E5 ;
LF7D8: 7F 00 89 CLR L0089 ;
LF7DB: 20 08 BRA LF7E5 ;
LF7DD: 96 13 LDAA L0013 ; error flag 2
LF7DF: 8A 10 ORAA #$10 ;
LF7E1: 97 13 STAA L0013 ; error flag 2
LF7E3: CA 40 ORAB #$40 ;
LF7E5: D7 08 STAB L0008 ; status word
;
;--------------------------------------------------
;
; Err 42 Diag Test, EST
;
;--------------------------------------------------

LF7E7: 96 02 LDAA L0002 ; status word
LF7E9: 85 08 BITA #$08 ;
LF7EB: 26 36 BNE LF823 ;
LF7ED: 96 66 LDAA L0066 ; 160Hz rts counter
LF7EF: 85 10 BITA #$10 ;
LF7F1: 26 30 BNE LF823 ;
LF7F3: 96 01 LDAA L0001 ; status word
LF7F5: 85 40 BITA #$40 ;
LF7F7: 27 2A BEQ LF823 ;
LF7F9: 5F CLRB ;
LF7FA: FE BC 06 LDX LBC06 ; EST Circuit
LF7FD: B6 08 81 LDAA L0881 ; MCU1 I/O
LF800: 85 20 BITA #$20 ;
LF802: 27 1B BEQ LF81F ;
LF804: 96 1A LDAA L001A ; rpm scaled
LF806: B1 D4 82 CMPA LD482 ;
LF809: 23 14 BLS LF81F ;
LF80B: 9C 93 CPX L0093 ; EST circuit data
LF80D: 26 10 BNE LF81F ;
LF80F: D6 95 LDAB L0095 ; err 42A cnt'r
LF811: F1 D4 85 CMPB LD485 ; 4, Num of EST faults for 42B
LF814: 22 03 BHI LF819 ;
LF816: 5C INCB ;
LF817: 20 06 BRA LF81F ;
LF819: 96 DE LDAA L00DE ; status word
LF81B: 8A 80 ORAA #128 ;
LF81D: 97 DE STAA L00DE ; status word
LF81F: D7 95 STAB L0095 ; err 42A cnt'r
LF821: DF 93 STX L0093 ; EST circuit data
LF823: B6 D4 3C LDAA LD43C ; diag mask 3, 1111 0011
LF826: 2A 6D BPL LF895 ;
;
LF828: DE EB LDX L00EB ; eng run time
LF82A: BC D4 86 CPX LD486 ; 240 sec's
LF82D: 23 66 BLS LF895 ;
;
LF82F: D6 09 LDAB L0009 ; status word
LF831: 2A 04 BPL LF837 ;
;
LF833: C4 DF ANDB #$DF ;
LF835: 20 5C BRA LF893 ;
;
LF837: C5 20 BITB #$20 ;
LF839: 26 5A BNE LF895 ;
;
LF83B: 96 02 LDAA L0002 ; status word
LF83D: 85 38 BITA #$38 ;
LF83F: 26 54 BNE LF895 ;
;
LF841: C5 10 BITB #$10 ;
LF843: 27 0E BEQ LF853 ;
;
LF845: 85 02 BITA #$02 ;
LF847: 26 0A BNE LF853 ;
;
LF849: D6 0D LDAB L000D ; status word
LF84B: 2B 48 BMI LF895 ; bra if in PE/WOT mode
;
LF84D: 8A 02 ORAA #2 ;
LF84F: 97 02 STAA L0002 ; status word
LF851: 20 42 BRA LF895 ;
;
LF853: 96 0D LDAA L000D ; status word
LF855: 2A 3E BPL LF895 ; bra if not in PE/WOT mode
;
LF857: 96 08 LDAA L0008 ; status word
LF859: 85 C0 BITA #$C0 ;
LF85B: 26 38 BNE LF895 ;
;
LF85D: 96 00 LDAA L0000 ; status word
LF85F: 9A DE ORAA L00DE ; status word
LF861: 2B 32 BMI LF895 ;
LF863: 96 0A LDAA L000A ; status word
LF865: 85 08 BITA #$08 ;
LF867: 26 2C BNE LF895 ;
LF869: 96 1B LDAA L001B ; rpm / 25
LF86B: B1 D4 8C CMPA LD48C ; 160, 4000 rpm, max limit
LF86E: 22 25 BHI LF895 ;
;
LF870: 96 25 LDAA L0025 ; s/d map, KPa = (N * 0.3125) + 20
LF872: B1 D4 8D CMPA LD48D ; 196, 81.25 KPa, min limit
LF875: 23 1E BLS LF895 ;
;
LF877: 96 21 LDAA L0021 ; coolant, defaulted, 1k pu, inverse, adc cnts
LF879: B1 D4 8A CMPA LD48A ; 53, ~87c
LF87C: 24 17 BCC LF895 ;
;
LF87E: B1 D4 8B CMPA LD48B ; 12, ~150c
LF881: 23 12 BLS LF895 ;
;
LF883: 96 90 LDAA L0090 ; knock test timer, ESC 43
LF885: 4C INCA ;
LF886: B1 D4 89 CMPA LD489 ; 5, timer val
LF889: 23 0B BLS LF896 ;
LF88B: C5 10 BITB #$10 ;
LF88D: 27 02 BEQ LF891 ;
LF88F: CA 20 ORAB #$20 ;
;
LF891: CA 10 ORAB #$10 ;
LF893: D7 09 STAB L0009 ; status word
;
LF895: 4F CLRA ;
LF896: 97 90 STAA L0090 ; knock test timer, ESC 43
LF898: 96 09 LDAA L0009 ; status word
LF89A: 85 60 BITA #$60 ;
LF89C: 27 06 BEQ LF8A4 ;
LF89E: 96 14 LDAA L0014 ; error flag 3
LF8A0: 8A 80 ORAA #$80 ; set b7, knock cnt'l failure
LF8A2: 97 14 STAA L0014 ; error flag 3

;--------------------------------------------------
;
; Error 44 test, O2 Lean
;
;--------------------------------------------------

LF8A4: D6 0A LDAB L000A ; status word
LF8A6: C4 FD ANDB #$FD ;
LF8A8: B6 D4 91 LDAA LD491 ; 251mV, low limit
LF8AB: 91 3C CMPA L003C ; O2, major loop filtered (slow)
LF8AD: 23 1A BLS LF8C9 ;
LF8AF: 96 86 LDAA L0086 ; diag timer, O2 lean
LF8B1: B1 D4 92 CMPA LD492 ; diag timer val, 50
LF8B4: 22 18 BHI LF8CE ;
LF8B6: 96 0E LDAA L000E ; status word, a/f mode
LF8B8: 2A 0F BPL LF8C9 ; bra if not closed loop
LF8BA: C5 04 BITB #$04 ;
LF8BC: 26 0B BNE LF8C9 ;
LF8BE: 96 08 LDAA L0008 ; status word
LF8C0: 85 08 BITA #$08 ;
LF8C2: 27 12 BEQ LF8D6 ;
LF8C4: 7C 00 86 INC L0086 ; diag timer, O2 lean
LF8C7: 20 0D BRA LF8D6 ;
LF8C9: 7F 00 86 CLR L0086 ; diag timer, O2 lean
LF8CC: 20 08 BRA LF8D6 ;
LF8CE: 96 14 LDAA L0014 ; error flag 3
LF8D0: 8A 40 ORAA #$40 ;
LF8D2: 97 14 STAA L0014 ; error flag 3
LF8D4: CA 02 ORAB #$02 ;

;--------------------------------------------------
;
; Error 45 test, O2 Rich
;
;--------------------------------------------------

LF8D6: 96 3C LDAA L003C ; O2, major loop filtered (slow)
LF8D8: B1 D4 93 CMPA LD493 ; 751 mvdc, O2 sensor hi limit
LF8DB: 23 26 BLS LF903 ;
;
LF8DD: 96 87 LDAA L0087 ; diag timer, O2 rich
LF8DF: B1 D4 94 CMPA LD494 ;
LF8E2: 22 24 BHI LF908 ;
LF8E4: 96 0E LDAA L000E ; status word, a/f mode
LF8E6: 2A 1B BPL LF903 ; bra if not closed loop
LF8E8: C5 04 BITB #$04 ;
LF8EA: 26 17 BNE LF903 ;
LF8EC: 96 43 LDAA L0043 ; tps%, from idle
LF8EE: B1 D4 95 CMPA LD495 ; 20%, tps hi limit
LF8F1: 22 05 BHI LF8F8 ;
LF8F3: B1 D4 96 CMPA LD496 ; 0%, tps hi limit
LF8F6: 24 0B BCC LF903 ;
LF8F8: 96 08 LDAA L0008 ; status word
LF8FA: 85 08 BITA #$08 ;
LF8FC: 27 12 BEQ LF910 ;
LF8FE: 7C 00 87 INC L0087 ; diag timer, O2 rich
LF901: 20 0D BRA LF910 ;
LF903: 7F 00 87 CLR L0087 ; diag timer, O2 rich
LF906: 20 08 BRA LF910 ;
LF908: 96 14 LDAA L0014 ; error flag 3
LF90A: 8A 20 ORAA #32 ;
LF90C: 97 14 STAA L0014 ; error flag 3
LF90E: CA 02 ORAB #2 ;
LF910: C4 FB ANDB #$FB ;
LF912: D7 0A STAB L000A ; status word

;--------------------------------------------------
;
;--------------------------------------------------

LF914: 96 09 LDAA L0009 ; status word
LF916: 84 02 ANDA #$02 ;
LF918: 9A 14 ORAA L0014 ; error flag 3
LF91A: 97 14 STAA L0014 ; error flag 3
LF91C: 96 06 LDAA L0006 ;
LF91E: 85 04 BITA #$04 ;
LF920: 26 0D BNE LF92F ;
LF922: 96 0A LDAA L000A ; status word
LF924: 2A 03 BPL LF929 ;
LF926: 7E F9 EA JMP LF9EA ;

;-----------------------------------------------
;
;
;-----------------------------------------------

LF929: 96 00 LDAA L0000 ; status word
LF92B: 85 10 BITA #$10 ; engine shutdown
LF92D: 27 03 BEQ LF932 ;
LF92F: 7E F9 D9 JMP LF9D9 ;

;-----------------------------------------------
;
; do stuff with error flags
;
;-----------------------------------------------

LF932: BD FC CB JSR LFCCB ; Setup error flag masks into RAM
LF935: 96 15 LDAA L0015 ;
LF937: 9A 16 ORAA L0016 ;
LF939: 9A 17 ORAA L0017 ;
LF93B: 26 1F BNE LF95C ;
LF93D: DC 12 LDD L0012 ; error flag 1
LF93F: 94 49 ANDA L0049 ;
LF941: D4 4A ANDB L004A ;
LF943: DD 15 STD L0015 ;
LF945: 96 14 LDAA L0014 ; error flag 3
LF947: 94 4B ANDA L004B ;
LF949: 97 17 STAA L0017 ;
LF94B: 96 92 LDAA L0092 ; error log timer
LF94D: 27 05 BEQ LF954 ;
LF94F: 7A 00 92 DEC L0092 ; error log timer
LF952: 20 61 BRA LF9B5 ;
LF954: 96 0A LDAA L000A ; status word
LF956: 84 FE ANDA #$FE ;
LF958: 97 0A STAA L000A ; status word
LF95A: 20 59 BRA LF9B5 ;

;--------------------------------------------------
;--------------------------------------------------

LF95C: CE 00 03 LDX #$0003 ;
LF95F: 4F CLRA ;
LF960: E6 11 LDAB 17,X ;
LF962: E4 14 ANDB 20,X ;
LF964: E4 48 ANDB 72,X ;
LF966: E7 14 STAB 20,X ;
LF968: 27 01 BEQ LF96B ;
LF96A: 4C INCA ;
LF96B: 09 DEX ;
LF96C: 26 F2 BNE LF960 ;
LF96E: 7C 00 92 INC L0092 ; error log timer
LF971: D6 0A LDAB L000A ; status word
LF973: 4D TSTA ;
LF974: 26 11 BNE LF987 ;
LF976: 57 ASRB ;
LF977: F6 D4 3E LDAB LD43E ; error log time constant 1, 1 sec
LF97A: 24 03 BCC LF97F ;
LF97C: F6 D4 40 LDAB LD440 ; error log time constant 3, 10 sec
LF97F: D1 92 CMPB L0092 ; error log timer
LF981: 22 32 BHI LF9B5 ;
LF983: D7 92 STAB L0092 ; error log timer
LF985: 20 2E BRA LF9B5 ;
LF987: 57 ASRB ;
LF988: F6 D4 3F LDAB LD43F ; error log time constant 2, 2 sec
LF98B: 24 03 BCC LF990 ;
LF98D: F6 D4 41 LDAB LD441 ; error log time constant 4, 12 sec
LF990: D1 92 CMPB L0092 ; error log timer
LF992: 22 21 BHI LF9B5 ;
LF994: B6 D4 40 LDAA LD440 ; error log time constant 3, 10 sec
LF997: 97 92 STAA L0092 ; error log timer
LF999: 96 0A LDAA L000A ; status word
LF99B: 8A 01 ORAA #1 ;
LF99D: 97 0A STAA L000A ; status word
LF99F: 5F CLRB ;
;
LF9A0: CE 00 03 LDX #$0003 ;
;
LF9A3: A6 E0 LDAA $E0,X ;
LF9A5: AA 14 ORAA $14,X ;
LF9A7: A7 E0 STAA $E0,X ;
LF9A9: E7 14 STAB $14,X ;
LF9AB: 09 DEX ;
LF9AC: 26 F5 BNE LF9A3 ;
;
LF9AE: D7 E9 STAB L00E9 ; successful start up's (w/o err)
LF9B0: BD FD 1A JSR LFD1A ; Do CkSum on Error Flags
LF9B3: 97 EA STAA L00EA ; error flag cksum
LF9B5: 96 01 LDAA L0001 ; status word
LF9B7: 2B 08 BMI LF9C1 ; Engine is Running
LF9B9: 85 02 BITA #$02 ;
LF9BB: 26 19 BNE LF9D6 ;
LF9BD: 8A 02 ORAA #2 ;
LF9BF: 20 02 BRA LF9C3 ;
LF9C1: 84 FD ANDA #$FD ;
LF9C3: 97 01 STAA L0001 ; status word
LF9C5: 96 02 LDAA L0002 ; status word
LF9C7: 85 08 BITA #$08 ;
LF9C9: 26 0B BNE LF9D6 ;
LF9CB: 96 0A LDAA L000A ; status word
LF9CD: 85 01 BITA #$01 ;
LF9CF: 26 05 BNE LF9D6 ;
LF9D1: BD FC 4B JSR LFC4B ; do SES light off
LF9D4: 20 03 BRA LF9D9 ;
;
LF9D6: BD FC 40 JSR LFC40 ; do SES light on
LF9D9: 96 08 LDAA L0008 ; status word
LF9DB: 84 E7 ANDA #$E7 ;
LF9DD: 97 08 STAA L0008 ; status word
LF9DF: 4F CLRA ;
LF9E0: 5F CLRB ;
LF9E1: DD 12 STD L0012 ; error flag 1
LF9E3: 96 14 LDAA L0014 ; error flag 3
LF9E5: 84 10 ANDA #$10 ;
LF9E7: 97 14 STAA L0014 ; error flag 3
LF9E9: 39 RTS ;

;*==================================================
;*
;* Do Blink Out of Error Codes
;*
;*==================================================

LF9EA: 96 0C LDAA L000C ;
LF9EC: 85 40 BITA #$40 ;
LF9EE: 27 4B BEQ LFA3B ;
LF9F0: 7A 00 84 DEC L0084 ;
LF9F3: 26 E4 BNE LF9D9 ;
LF9F5: 85 10 BITA #$10 ;
LF9F7: 27 0A BEQ LFA03 ;
LF9F9: 84 EF ANDA #$EF ;
LF9FB: C6 04 LDAB #4 ;
LF9FD: 97 0C STAA L000C ;
LF9FF: D7 84 STAB L0084 ;
LFA01: 20 CE BRA LF9D1 ;
LFA03: 85 20 BITA #$20 ;
LFA05: 26 0A BNE LFA11 ;
LFA07: D6 80 LDAB L0080 ;
LFA09: 26 0F BNE LFA1A ;
LFA0B: C6 08 LDAB #$08 ;
LFA0D: 8A 20 ORAA #$20 ;
LFA0F: 20 EC BRA LF9FD ;
LFA11: D6 81 LDAB L0081 ;
LFA13: 27 12 BEQ LFA27 ;
LFA15: 7A 00 81 DEC L0081 ;
LFA18: 20 03 BRA LFA1D ;
LFA1A: 7A 00 80 DEC L0080 ;
LFA1D: 8A 10 ORAA #$10 ;
LFA1F: 97 0C STAA L000C ;
LFA21: 86 04 LDAA #4 ;
LFA23: 97 84 STAA L0084 ;
LFA25: 20 AF BRA LF9D6 ;
LFA27: D6 82 LDAB L0082 ;
LFA29: 85 03 BITA #$03 ;
LFA2B: 27 04 BEQ LFA31 ;
LFA2D: 80 21 SUBA #33 ;
LFA2F: 20 37 BRA LFA68 ;
LFA31: 96 83 LDAA L0083 ;
LFA33: 5C INCB ;
LFA34: C1 1A CMPB #26 ;
LFA36: 25 05 BCS LFA3D ;
LFA38: 4F CLRA ;
LFA39: 20 C2 BRA LF9FD ;
LFA3B: C6 02 LDAB #2 ;
LFA3D: C1 02 CMPB #2 ;
LFA3F: 26 08 BNE LFA49 ;
LFA41: 96 E1 LDAA L00E1 ;
LFA43: B4 D4 3A ANDA LD43A ; Diag mask 1, 1111 1111
LFA46: 49 ROLA ;
LFA47: 20 19 BRA LFA62 ;
LFA49: C1 0A CMPB #10 ;
LFA4B: 26 07 BNE LFA54 ;
LFA4D: 96 E2 LDAA L00E2 ;
LFA4F: B4 D4 3B ANDA LD43B ; diag mask 2, 1011 1001
LFA52: 20 0B BRA LFA5F ;
LFA54: C1 12 CMPB #$12 ;
LFA56: 26 07 BNE LFA5F ;
LFA58: B6 D4 3C LDAA LD43C ; diag mask 3, 1111 0011
LFA5B: 8A 10 ORAA #16 ;
LFA5D: 94 E3 ANDA L00E3 ;
LFA5F: 49 ROLA ;
LFA60: 24 D1 BCC LFA33 ;
LFA62: 97 83 STAA L0083 ;
LFA64: D7 82 STAB L0082 ;
LFA66: 86 42 LDAA #66 ;
LFA68: 97 0C STAA L000C ;
LFA6A: 4F CLRA ;
LFA6B: 4C INCA ;
LFA6C: C0 05 SUBB #5 ;
LFA6E: 22 FB BHI LFA6B ;
LFA70: CB 05 ADDB #5 ;
LFA72: 97 80 STAA L0080 ;
LFA74: D7 81 STAB L0081 ;
LFA76: C6 1C LDAB #28 ;
LFA78: 20 85 BRA LF9FF ;

;-----------------------------------------------
;
;-----------------------------------------------

LFA7A: A6 00 LDAA 0,X ;
LFA7C: 81 03 CMPA #3 ;
LFA7E: 26 04 BNE LFA84 ; get map | vac variable
;
LFA80: 96 43 LDAA L0043 ; tps%, from idle
LFA82: 20 0A BRA LFA8E ;

;*==================================================
;*
;* SubRoutine
;*
;* Get s/d map or vac depending upon value
;* pointed to by X
;*
;* *X == 0, use vac
;* *X != 0, use s/d map
;*
;*==================================================

LFA84: A6 00 LDAA 0,X ; get flag val
LFA86: 26 04 BNE LFA8C ; bra if != 0
;
LFA88: 96 2E LDAA L002E ; vac
LFA8A: 20 02 BRA LFA8E ;
;
LFA8C: 96 25 LDAA L0025 ; s/d map, KPa = (N * 0.3125) + 20
;
LFA8E: 08 INX ; inc X to beginning of table
LFA8F: 39 RTS ;

;-----------------------------------------------
;
; Do default map if errors
;
;-----------------------------------------------

LFA90: 96 2A
LDAA L002A ; adc map val, raw
LFA92: D6 08 LDAB L0008 ; status word
LFA94: C5 C0 BITB #$C0 ; map errs?
LFA96: 27 28 BEQ LFAC0 ; bra if map OK
;
;
; map sensor failed, create a map val from tps & rpm
;
LFA98: D6 01 LDAB L0001 ; status word
LFA9A: 2A 21 BPL LFABD ; Engine is not Running
LFA9C: B6 D4 79 LDAA LD479 ; 146
LFA9F: D6 43 LDAB L0043 ; tps%, from idle
LFAA1: 3D MUL ;
LFAA2: 05 LSLD ;
LFAA3: 25 18 BCS LFABD ;
LFAA5: 05 LSLD ;
LFAA6: 25 15 BCS LFABD ;
LFAA8: 36 PSHA ;
LFAA9: 96 1B LDAA L001B ; rpm / 25
LFAAB: 44 LSRA ;
LFAAC: CE D4 7A LDX #$D47A ; Map Bias Default vs Rpm
LFAAF: C6 10 LDAB #16 ;
LFAB1: BD FB 83 JSR LFB83 ; 2d lkup w/upr limt in 1st tbl entry, lwr limt in B
LFAB4: 33 PULB ;
LFAB5: 1B ABA ;
LFAB6: 25 05 BCS LFABD ;
;
LFAB8: B1 D4 78 CMPA LD478 ; 218, max adc map on error
LFABB: 23 03 BLS LFAC0 ;
LFABD: B6 D4 78 LDAA LD478 ; 218
;
LFAC0: F6 D0 0C LDAB LD00C ; filt coef, 240
LFAC3: DE 28 LDX L0028 ; map adc value, raw
LFAC5: 8D 79 BSR LFB40 ; Lag Filter
LFAC7: DD 28 STD L0028 ; map adc value, raw
;
;
; create map term for BPW & gms/sec calc's
;
; L002B = ((MapAdc * 189) / 256) + 21
;
LFAC9: CE 00 28 LDX #$0028 ; map adc value, raw
LFACC: 86 BD LDAA #189 ;
LFACE: BD FC 05 JSR LFC05 ; AB = (A x *X) / 256
LFAD1: C3 15 32 ADDD #5426 ; 21d & 50d
LFAD4: 97 2B STAA L002B ; map term for BPW & gms/sec calc's
;
;
; do aldl stuff
;
LFAD6: CC 01 1F LDD #$11F ;
LFAD9: FD BC 12 STD LBC12 ; ALDL serial data
LFADC: 96 70 LDAA L0070 ;
LFADE: 26 43 BNE LFB23 ;
LFAE0: 86 08 LDAA #8 ;
LFAE2: 97 70 STAA L0070 ;
LFAE4: 96 06 LDAA L0006 ;
LFAE6: 47 ASRA ;
LFAE7: 24 25 BCC LFB0E ;
LFAE9: CE FE 3B LDX #$FE3B ;
LFAEC: C6 0C LDAB #12 ;
LFAEE: 96 1A LDAA L001A ; rpm scaled
LFAF0: 27 47 BEQ LFB39 ;
LFAF2: 3A ABX ;
LFAF3: 80 10 SUBA #16 ;
LFAF5: 22 FB BHI LFAF2 ;
LFAF7: D6 71 LDAB L0071 ; aldl byte count
LFAF9: C1 0B CMPB #11 ;
LFAFB: 24 1E BCC LFB1B ;
LFAFD: 54 LSRB ;
LFAFE: 24 04 BCC LFB04 ;
LFB00: 96 22 LDAA L0022 ; startup coolant, adc inverse
LFB02: 20 30 BRA LFB34 ;
LFB04: 58 LSLB ;
LFB05: 3A ABX ;
LFB06: EE 00 LDX 0,X ;
LFB08: EC 00 LDD 0,X ;
LFB0A: D7 22 STAB L0022 ; startup coolant, adc inverse
LFB0C: 20 26 BRA LFB34 ;
LFB0E: 96 02 LDAA L0002 ; status word
LFB10: D6 71 LDAB L0071 ; aldl byte count
LFB12: 27 20 BEQ LFB34 ;
LFB14: CE D4 14 LDX #$D414 ;
LFB17: C1 14 CMPB #20 ;
LFB19: 25 12 BCS LFB2D ;
LFB1B: 4F CLRA ;
LFB1C: 97 71 STAA L0071 ; aldl byte count
LFB1E: 4A DECA ;
LFB1F: 97 72 STAA L0072 ; aldl data byte
LFB21: 20 1C BRA LFB3F ;
LFB23: 7A 00 70 DEC L0070 ;
LFB26: 78 00 72 LSL L0072 ; aldl data byte
LFB29: 24 0E BCC LFB39 ;
LFB2B: 20 12 BRA LFB3F ;
LFB2D: 5A DECB ;
LFB2E: 58 LSLB ;
LFB2F: 3A ABX ;
LFB30: EE 00 LDX 0,X ;
LFB32: A6 00 LDAA 0,X ;
LFB34: 97 72 STAA L0072 ; aldl data byte
LFB36: 7C 00 71 INC L0071 ; aldl byte count
LFB39: CC 00 17 LDD #23 ;
LFB3C: FD BC 12 STD LBC12 ; ALDL serial data
LFB3F: 39 RTS ;

;*==================================================
;*
;* Lag Filter Routine
;*
;* Lags new value, always between old value and
;* new value by % of filter coef/256
;*
;* AB = X + ((A - X) * B) / 256
;* NEW = Old + ((New - Old) * FCoef) / 256
;*
;* Enter With:
;*
;* X Reg Old Value
;* A Reg New Value
;* B Reg Filt Coef
;*
;* Exit With:
;*
;* A Reg New Filtered Value (msb)
;* B Reg New Filtered Value (lsb)
;*
;*==================================================

LFB40: DF 4B STX L004B ; save old val
LFB42: D7 49 S
TAB L0049 ;
LFB44: 26 04 BNE LFB4A ;
;
LFB46: DC 4B LDD L004B ; filter coef == 0
LFB48: 20 19 BRA LFB63 ; load old val & exit
;
LFB4A: 3D MUL ; do calc
LFB4B: DD 4D STD L004D ;
LFB4D: 96 49 LDAA L0049 ;
LFB4F: 40 NEGA ;
LFB50: D6 4C LDAB L004C ;
LFB52: 3D MUL ;
LFB53: 89 00 ADCA #0 ;
LFB55: 97 4A STAA L004A ;
LFB57: 96 49 LDAA L0049 ;
LFB59: 40 NEGA ;
LFB5A: D6 4B LDAB L004B ;
LFB5C: 3D MUL ;
LFB5D: DB 4A ADDB L004A ;
LFB5F: 89 00 ADCA #0 ;
LFB61: D3 4D ADDD L004D ;
;
LFB63: 39 RTS ; >>>>

;*==================================================
;*
;* get a baro adjusted tps% value
;*
;*==================================================

LFB64: CE D4 F5 LDX #$D4F5 ; tbl of 255's
;
;
; another entry point with own baro comp tbl
;
LFB67: 8D 06 BSR LFB6F ; get baro & do 2d lkup
LFB69: D6 43 LDAB L0043 ; tps%, from idle
LFB6B: 3D MUL ;
LFB6C: 89 00 ADCA #0 ; (tps% * mult) / 256
LFB6E: 39 RTS ;

;*==================================================
;*
;* get baro & do 2d lkup, 4 line tbl
;*
;*==================================================

LFB6F: 96 FE LDAA L00FE ; baro pressure, A/D cnts
LFB71: 80 0D SUBA #13 ;
LFB73: C6 97 LDAB #151 ;
LFB75: 3D MUL ;
LFB76: 89 00 ADCA #0 ;
LFB78: 81 8F CMPA #143 ;
LFB7A: 23 02 BLS LFB7E ;
LFB7C: 86 8F LDAA #143 ;
LFB7E: C6 60 LDAB #96 ;
LFB80: 20 0F BRA LFB91 ; 2d lkup w/SBA

;*==================================================
;*
;* 2d lkup w/upr limt in 1st tbl entry
;*
;*==================================================

LFB82: 5F CLRB ;

;*==================================================
;*
;* 2d lkup w/upr limt in 1st tbl entry, lwr limt in B
;*
;*==================================================

LFB83: A1 00 CMPA 0,X ;
LFB85: 23 02 BLS LFB89 ;
LFB87: A6 00 LDAA 0,X ;
LFB89: 08 INX ;
LFB8A: 20 05 BRA LFB91 ; 2d lkup w/SBA


;*
;* 2d lkup w/line cnt
;*
;*==================================================

LFB8C: E6 00
LDAB 0,X ;
LFB8E: 08 INX ;
LFB8F: 20 06 BRA LFB97 ;

;*==================================================
;*
;* 2d lkup w/SBA
;*
;*==================================================

LFB91: 10 SBA ;
LFB92: 24 01
BCC LFB95 ; 2d lkup
LFB94: 4F CLRA ;

;*==================================================
;*
;* 2d lkup
;*
;*==================================================

LFB95: C6 10
LDAB #16 ;
LFB97: 3D MUL ;
LFB98: 37 PSHB ;
LFB99: 16 TAB ;
LFB9A: 3A ABX ;
LFB9B: EC 00 LDD 0,X ;

;
; entry from 3d routine
;
LFB9D: 97 49 STAA L0049 ;
LFB9F: 10 SBA ;
LFBA0: 33 PULB ;
LFBA1: 25 09 BCS LFBAC ;
LFBA3: 3D MUL ;
LFBA4: 40 NEGA ;
LFBA5: 9B 49 ADDA L0049 ;
LFBA7: 58 LSLB ;
LFBA8: 82 00 SBCA #0 ;
LFBAA: 20 04 BRA LFBB0 ;
LFBAC: 40 NEGA ;
LFBAD: 3D MUL ;
LFBAE: 99 49 ADCA L0049 ;
LFBB0: 97 49 STAA L0049 ;
LFBB2: 39 RTS ;

;*==================================================
;*
;* 3d lkup
;*
;*==================================================

LFBB3: A0 00 SUBA 0,X ;
LFBB5: 24 01
BCC LFBB8 ;
LFBB7: 4F CLRA ;
LFBB8: E0 01 SUBB 1,X ;
LFBBA: 24 01 BCC LFBBD ;
LFBBC: 5F CLRB ;
LFBBD: D7 4B STAB L004B ;
LFBBF: C6 10 LDAB #16 ;
LFBC1: 3D MUL ;
LFBC2: 37 PSHB ;
LFBC3: E6 02 LDAB 2,X ;
LFBC5: 37 PSHB ;
LFBC6: 3D MUL ;
LFBC7: 3A ABX ;
LFBC8: 08 INX ;
LFBC9: 08 INX ;
LFBCA: 08 INX ;
LFBCB: 3C PSHX ;
LFBCC: 96 4B LDAA L004B ;
LFBCE: 8D C5 BSR LFB95 ; 2d lkup
LFBD0: 97 4A STAA L004A ;
LFBD2: 96 4B LDAA L004B ;
LFBD4: 38 PULX ;
LFBD5: 33 PULB ;
LFBD6: 3A ABX ;
LFBD7: 8D BC BSR LFB95 ; 2d lkup
LFBD9: 16 TAB ;
LFBDA: 96 4A LDAA L004A ;
LFBDC: 20 BF BRA LFB9D ;

;*==================================================
;*
;* vss/rpm calc routine (FDIV)
;*
;*==================================================

LFBDE: CE FF FF LDX #$FFFF ;
LFBE1: DF 49 STX L0049 ;
LFBE3: 93 4B SUBD L004B ;
LFBE5: 25 06 BCS LFBED ;
LFBE7: 20 19 BRA LFC02 ;
LFBE9: 93 4B SUBD L004B ;
LFBEB: 24 05 BCC LFBF2 ;
LFBED: D3 4B ADDD L004B ;
LFBEF: 0C CLC ;
LFBF0: 20 01 BRA LFBF3 ;
LFBF2: 0D SEC ;
LFBF3: 79 00 4A ROL L004A ;
LFBF6: 79 00 49 ROL L0049 ;
LFBF9: 24 07 BCC LFC02 ;
LFBFB: 05 LSLD ;
LFBFC: 24 EB BCC LFBE9 ;
LFBFE: 93 4B SUBD L004B ;
LFC00: 20 F0 BRA LFBF2 ;
LFC02: DC 49 LDD L0049 ;
LFC04: 39 RTS ;


;*
;* 8 x 16 Multiply Routine
;*
;* AB = (A * *X) / 256
;*
;* Enter With:
;*
;* A = op1
;* X = address of op2
;*
;* Exit With:
;*
;* AB = result
;*
;*==================================================

LFC05: 97 49
STAA L0049 ;
LFC07: E6 01 LDAB 1,X ;
LFC09: 3D MUL ;
LFC0A: 58 LSLB ;
LFC0B: 89 00 ADCA #0 ;
;
LFC0D: 97 4A STAA L004A ;
LFC0F: A6 00 LDAA 0,X ;
LFC11: D6 49 LDAB L0049 ;
LFC13: 3D MUL ;
LFC14: 97 49 STAA L0049 ;
LFC16: 4F CLRA ;
LFC17: D3 49 ADDD L0049 ;
LFC19: 39 RTS ;

;*==================================================
;*
;* ADC Routine
;*
;* On entry:
;* A = channel to convert
;* B = 0/1, 1 to return immed
;*
;* On exit:
;* A = B = Data
;*
;* $00 pump, fuel
;* $01 self test?
;* $02 bat
;* $03 O2
;* $04 cts
;* $05 map
;* $0A iat
;* $0B tps
;* $0C aldl diag
;* $0D gnd
;* $0E gnd
;* $0F gnd
;*
;*==================================================

LFC1A: 37 PSHB ;
LFC1B: 16
TAB ;
LFC1C: DA 67 ORAB L0067 ; init to $80, bit for ADC hardware
LFC1E: 86 01 LDAA #1 ;
LFC20: FD C0 02 STD LC002 ;
LFC23: 33 PULB ;
LFC24: 5D TSTB ;
LFC25: 26 18 BNE LFC3F ;

;
; entry point to retrieve adc data
;

LFC27: CE 00 19
LDX #$0019 ;
LFC2A: B6 C0 00 LDAA LC000 ;
LFC2D: 2B 0C BMI LFC3B ;
LFC2F: 09 DEX ;
LFC30: 26 F8 BNE LFC2A ;
LFC32: 96 14 LDAA L0014 ; error flag 3
LFC34: 8A 01 ORAA #1 ;
LFC36: 97 14 STAA L0014 ; error flag 3
LFC38: 4F CLRA ;
LFC39: 20 04 BRA LFC3F ;
LFC3B: FC C0 00 LDD LC000 ;
LFC3E: 17 TBA ;
LFC3F: 39 RTS ;

;*==================================================
;*
;* Two inverse PWM control routines
;*
;* CES light & misc PWM control
;*==================================================

LFC40: 86 F7 LDAA #$F7 ; 1111 0111, CES light on
;
LFC42: FE BC 3C LDX LBC3C ; PWM control register
LFC45: DF 4F STX L004F ; tmp storage
LFC47: 94 50 ANDA L0050 ;
LFC49: 20 09 BRA LFC54 ;
;
LFC4B: 86 08 LDAA #$08 ; 0000 1000, CES light off

;
; another entry point
;

LFC4D: FE BC 3C LDX LBC3C ; PWM control register
LFC50: DF 4F STX L004F ; tmp storage
LFC52: 9A 50 ORAA L0050 ;

;
; now do the work. . .
;

LFC54: 84 FE ANDA #$FE ; 1111 1110, clr b0
LFC56: 8A 22 ORAA #$22 ; 0010 0010
LFC58: 97 50 STAA L0050 ;
LFC5A: 96 4F LDAA L004F ; tmp storage
LFC5C: 84 FB ANDA #$FB ;
LFC5E: 8A F9 ORAA #$F9 ;
LFC60: 97 4F STAA L004F ; tmp storage
LFC62: DE 4F LDX L004F ; tmp storage
LFC64: FF BC 3C STX LBC3C ; PWM control register
;
LFC67: 39 RTS ; >>>>


;*==================================================
;*
;* 8 x 8 Multiply
;*
;* A = (A * B) / 128
;*
;* Enter With:
;*
;* A = op1
;* B = op2
;*
;* Exit With:
;*
;* A = result
;*
;*==================================================

LFC68: 24 02 BCC LFC6C ; A = (A * B) / 128
LFC6A: 4F CLRA ;
LFC6B: 39 RTS ;

;
; another entry point
;

LFC6C: 3D MUL ;
LFC6D: 05 LSLD ;
LFC6E: 25 06 BCS LFC76 ;
LFC70: 5D TSTB ;
LFC71: 2A 05 BPL LFC78 ;
LFC73: 4C INCA ;
LFC74: 26 02 BNE LFC78 ;
LFC76: 86 FF LDAA #255 ;
LFC78: 39 RTS ;

;*==================================================
;*
;* Continuation of Real Time Service Routine #1
;*
;* Psuedo Baro Read
;*==================================================

LFC79: 4F CLRA ; A = 0
LFC7A: D6 00 LDAB L0000 ; status word
LFC7C: C5 10 BITB #$10 ; engine shutdown bit
LFC7E: 26 30 BNE LFCB0 ; bra if in shutdown
;
LFC80: D6 28 LDAB L0028 ; map adc value, raw
LFC82: D1 FE CMPB L00FE ; baro pressure, A/D cnts
LFC84: 22 2A BHI LFCB0 ;
;
LFC86: 96 1A LDAA L001A ; rpm scaled
LFC88: B1 D0 1D CMPA LD01D ; 200, ??? rpm
LFC8B: 22 33 BHI LFCC0 ; init baro
;
LFC8D: 96 43 LDAA L0043 ; tps%, from idle
LFC8F: B1 D0 1E CMPA LD01E ; 50%
LFC92: 23 2C BLS LFCC0 ; init baro
;
LFC94: 90 45 SUBA L0045 ; tps%, slow filtered
LFC96: 24 01 BCC LFC99 ;
LFC98: 40 NEGA ;
LFC99: B1 D0 1F CMPA LD01F ; 3.9%
LFC9C: 22 22 BHI LFCC0 ; init baro
;
;--------------------------------------------------
; Pseudo Baro Correction vs Tps
;
; Tbl = N * 2.7 * (256/40)
; Tbl = N * 17.28
;
; KPa/1k Rpm
;
; Baro = (((rpm / 25) - 16) * Corr[tps%]) / 256
;
;--------------------------------------------------

LFC9E: 96 43 LDAA L0043 ; tps%, from idle
LFCA0: CE D2 06 LDX #$D206 ;
LFCA3: BD FB 8C JSR LFB8C ; 2d lkup w/line cnt
LFCA6: D6 1B LDAB L001B ; rpm / 25
LFCA8: C0 10 SUBB #16 ; 400 rpm
LFCAA: 24 01 BCC LFCAD ;
LFCAC: 5F CLRB ;
;
LFCAD: 3D MUL ;
LFCAE: 89 00 ADCA #0 ;
;
;
LFCB0: 9B 28 ADDA L0028 ; map adc value, raw
LFCB2: 24 02 BCC LFCB6 ;
LFCB4: 86 FF LDAA #255 ;
;
LFCB6: F6 D0 20 LDAB LD020 ; filt coef, 192
LFCB9: DE FE LDX L00FE ; baro pressure, A/D cnts
LFCBB: BD FB 40 JSR LFB40 ; Lag Filter
LFCBE: 20 08 BRA LFCC8 ;

;--------------------------------------------------
;
; Set Baro Pressure or Default Value
;
;--------------------------------------------------

LFCC0: 96 FE LDAA L00FE ; baro pressure, A/D cnts
LFCC2: 26 06 BNE LFCCA ;
;
LFCC4: B6 D4 78 LDAA LD478 ; 218
LFCC7: 5F CLRB ;
;
LFCC8: DD FE STD L00FE ; baro pressure, A/D cnts
;
LFCCA: 39 RTS ; >>>>

;*==================================================
;*
;* Setup error flag masks into RAM
;*
;*==================================================

LFCCB: FC D4 3A LDD LD43A ; Diag mask 1, 1111 1111
LFCCE: 8A 80 ORAA #$80 ;
LFCD0: DD 49 STD L0049 ;
LFCD2: B6 D4 3C LDAA LD43C ; diag mask 3, 1111 0011
LFCD5: 8A 10 ORAA #$10 ;
LFCD7: 97 4B STAA L004B ;
LFCD9: 39 RTS ;

;*==================================================
;*
;* SubRoutine
;*
;* Do TPS work: filter and convert adc to %
;*
;*==================================================

LFCDA: 96 43 LDAA L0043 ; tps%, from idle
LFCDC: 97 44 STAA L0044 ; tps%, one delayed from L0043
;
LFCDE: 96 42 LDAA L0042 ; tps, adc cnts, volts = n * .0196
LFCE0: D6 08 LDAB L0008 ; status word
LFCE2: C5 24 BITB #$24 ; 0010 0100, b5 & b2
LFCE4: 27 03 BEQ LFCE9 ; bra if diags OK
;
LFCE6: B6 D4 53 LDAA LD453 ; 80, diag err value
;
;
; lag filter in lower tps value
;
LFCE9: 36 PSHA ;
LFCEA: D6 47 LDAB L0047 ; tps minimum setting, idle position
LFCEC: 11 CBA ;
LFCED: 22 0A BHI LFCF9 ;
LFCEF: DE 47 LDX L0047 ; tps minimum setting, idle position
LFCF1: F6 D2 1B LDAB LD21B ; filt coef, 1
LFCF4: BD FB 40 JSR LFB40 ; Lag Filter
LFCF7: DD 47 STD L0047 ; tps minimum setting, idle position
;
LFCF9: DC 47 LDD L0047 ; tps minimum setting, idle position
LFCFB: 5D TSTB ; round up A
LFCFC: 2A 01 BPL LFCFF ;
LFCFE: 4C INCA ;
;
;
; sub idle setting from current setting
;
LFCFF: 16 TAB ;
LFD00: 32 PULA ;
LFD01: 10 SBA ; now A is tps - idle tps
LFD02: 24 01 BCC LFD05 ;
LFD04: 4F CLRA ;
;
;
; convert from adc to tps%
;
LFD05: F6 D2 19 LDAB LD219 ; 117, scalar for tps conversion
LFD08: 3D MUL ;
LFD09: 05 LSLD ;
LFD0A: 25 09 BCS LFD15 ;
LFD0C: 05 LSLD ;
LFD0D: 25 06 BCS LFD15 ;
LFD0F: 5D TSTB ;
LFD10: 2A 05 BPL LFD17 ;
LFD12: 4C INCA ;
LFD13: 26 02 BNE LFD17 ;
LFD15: 86 FF LDAA #255 ;
;
LFD17: 97 43 STAA L0043 ; tps%, from idle

;*==================================================
;*
;* Real Time Service Routine A & C
;*
;* Common delay location
;*==================================================

LFD19: 39 RTS ;

;-----------------------------------------------
;
; Do CkSum on Error Flags
;
; From L00E1 - L00E3
;-----------------------------------------------

LFD1A: CE 00 03 LDX #$0003 ; offset
LFD1D: 4F CLRA ;
LFD1E: AB E0 ADDA $E0,X ; loc one before first err flg
LFD20: 48 ASLA ;
LFD21: 89 00 ADCA #0 ;
LFD23: 09 DEX ;
LFD24: 26 F8 BNE LFD1E ;
;
LFD26: 39 RTS ; >>>>

;*==================================================
;*
;* SubRoutine
;*
;* Read Coolant Temp & do Diag Tests
;*
;*==================================================

LFD27: 86 04 LDAA #4 ; Coolant channel
LFD29: 5F CLRB ; wait for data
LFD2A: BD FC 1A JSR LFC1A ; ADC routine
LFD2D: 97 23 STAA L0023 ; coolant, adc cnts
;
;
; do high coolant diag test
;
LFD2F: D6 0A LDAB L000A ; status word
LFD31: C4 F7 ANDB #$F7 ; clr b3
LFD33: D7 0A STAB L000A ; status word
;
LFD35: B1 D4 4A CMPA LD44A ; 12, high coolant limit
LFD38: 24 1E BCC LFD58 ; bra if coolant OK
;
LFD3A: DE EB LDX L00EB ; eng run time
LFD3C: BC D4 48 CPX LD448 ; 2 sec's
LFD3F: 22 08 BHI LFD49 ;
;
LFD41: D6 E1 LDAB L00E1 ;
LFD43: C5 20 BITB #$20 ;
LFD45: 27 11 BEQ LFD58 ;
LFD47: 20 06 BRA LFD4F ;
;
LFD49: D6 12 LDAB L0012 ; error flag 1
LFD4B: CA 20 ORAB #$20 ; b5, set
LFD4D: D7 12 STAB L0012 ; error flag 1
LFD4F: D6 0A LDAB L000A ; status word
LFD51: CA 08 ORAB #$08 ; cool diag failed
LFD53: D7 0A STAB L000A ; status word
LFD55: B6 D4 4E LDAA LD44E ; 100, coolant diag default val
;
;
; do low coolant diag test
;
LFD58: B1 D4 4D CMPA LD44D ; 252, low coolant limit
LFD5B: 23 24 BLS LFD81 ;
;
LFD5D: DE EB LDX L00EB ; eng run time
LFD5F: BC D4 4B CPX LD44B ; 30 sec's
LFD62: 22 0E BHI LFD72 ;
LFD64: D6 E1 LDAB L00E1 ;
LFD66: C5 10 BITB #$10 ;
LFD68: 26 0E BNE LFD78 ;
LFD6A: D6 08 LDAB L0008 ; status word
LFD6C: C5 01 BITB #$01 ;
LFD6E: 27 11 BEQ LFD81 ;
LFD70: 20 06 BRA LFD78 ;
;
LFD72: D6 12 LDAB L0012 ; error flag 1
LFD74: CA 10 ORAB #$10 ;
LFD76: D7 12 STAB L0012 ; error flag 1
;
LFD78: D6 0A LDAB L000A ; status word
LFD7A: CA 08 ORAB #$08 ;
LFD7C: D7 0A STAB L000A ; status word
LFD7E: B6 D4 4E LDAA LD44E ; 100, coolant diag default val
;
LFD81: 97 21 STAA L0021 ; coolant, defaulted, 1k pu, inverse, adc cnts
LFD83: 39 RTS ; >>>>

;*==================================================
;*
;* SubRoutine
;*
;* Do IAT ADC fetch & diag limits
;*
;*==================================================

LFD84: 86 0A LDAA #10 ; iat channel
LFD86: 5F CLRB ; wait for data
LFD87: BD FC 1A JSR LFC1A ; ADC routine
LFD8A: 97 24 STAA L0024 ; iat, 1k pu, inverse, adc cnts
;
LFD8C: D6 0B LDAB L000B ;
LFD8E: DE EB LDX L00EB ; eng run time
LFD90: BC D4 55 CPX LD455 ; 301 sec's
LFD93: 23 3F BLS LFDD4 ; bra if not time to run diag
;
;
; do low iat diag test
;
LFD95: B1 D4 54 CMPA LD454 ; 250, min iat val for diag
LFD98: 23 0D BLS LFDA7 ;
LFD9A: C5 20 BITB #$20 ;
LFD9C: 26 2B BNE LFDC9 ;
;
LFD9E: CA 20 ORAB #$20 ;
LFDA0: 96 30 LDAA L0030 ; mph / 1, filtered
LFDA2: B1 D4 57 CMPA LD457 ; 35 mph
LFDA5: 23 02 BLS LFDA9 ; bra if mph <= 35 mph
;
LFDA7: C4 DF ANDB #$DF ;
;
;
; do low coolant diag test
;
LFDA9: 96 24 LDAA L0024 ; iat, 1k pu, inverse, adc cnts
LFDAB: B1 D4 5F CMPA LD45F ; 16, high limit
LFDAE: 22 0D BHI LFDBD ; bra if within limit
;
LFDB0: C5 40 BITB #$40 ; tst b6 of L000B
LFDB2: 26 0D BNE LFDC1 ;
;
LFDB4: CA 40 ORAB #$40 ; set b6
LFDB6: 96 30 LDAA L0030 ; mph / 1, filtered
LFDB8: B1 D4 57 CMPA LD457 ; 35 mph
LFDBB: 22 17 BHI LFDD4 ; bra if > 35 mph
;
LFDBD: C4 BF ANDB #$BF ; clr b6, 1011 1111, of L000B
LFDBF: 20 13 BRA LFDD4 ;
LFDC1: 96 13 LDAA L0013 ; error flag 2
LFDC3: 8A 80 ORAA #$80 ; b7
LFDC5: 97 13 STAA L0013 ; error flag 2
LFDC7: 20 06 BRA LFDCF ;
;
LFDC9: 96 12 LDAA L0012 ; error flag 1
LFDCB: 8A 02 ORAA #$02 ; b1
LFDCD: 97 12 STAA L0012 ; error flag 1
;
LFDCF: B6 D4 58 LDAA LD458 ; 152, 40c, default iat on diag error
LFDD2: 97 24 STAA L0024 ; iat, 1k pu, inverse, adc cnts
;
LFDD4: D7 0B STAB L000B ;
LFDD6: 39 RTS ;

;*==================================================
;*
;* Set all BLM cells to 128
;*
;*==================================================

LFDD7: CE 00 ED LDX #$00ED ; BLM Cells
LFDDA: 86 80 LDAA #128 ; reset val
;
LFDDC: A7 00 STAA 0,X ;
LFDDE: 08 INX ;
LFDDF: 8C 00 FC CPX #$00FC ; last cell
LFDE2: 23 F8 BLS LFDDC ;
;
LFDE4: 39 RTS ;

;*==================================================
;*
;* Test Iat | Cts against 75c threshold
;*
;* Clear b2 of L00DF if IAT < 75c
;* hot restart detection
;*
;*==================================================

LFDE5: F6 D0 05 LDAB LD005 ; option byte: 0010 0011
LFDE8: C5 20 BITB #$20 ; b5, 0010 0000
LFDEA: 27 02 BEQ LFDEE ; do not bra
LFDEC: 96 24 LDAA L0024 ; iat, 1k pu, inverse, adc cnts
;
LFDEE: B1 D2 5E CMPA LD25E ; iat | coolant threshold, 75c
LFDF1: 25 06 BCS LFDF9 ; bra if iat > 75c
;
LFDF3: D6 DF LDAB L00DF ; status word
LFDF5: C4 FB ANDB #$FB ; clr b2, 1111 1011
LFDF7: D7 DF STAB L00DF ; status word
;
LFDF9: 39 RTS ;

;*==================================================
;*
;* Do headsup if online
;*
;*==================================================

LFDFA: 96 00 LDAA L0000 ; status word
LFDFC: 85 02 BITA #$02 ;
LFDFE: 27 03 BEQ LFE03 ;
LFE00: BD 58 09 JSR L5809 ;
LFE03: 39 RTS ;

;*==================================================
;*
;* Real Time Service Routine 6
;*
;*==================================================

LFE04: 8D F4 BSR LFDFA ;
LFE06: 96 D1 LDAA L00D1 ;
LFE08: 27 06 BEQ LFE10 ;
LFE0A: 96 00 LDAA L0000 ; status word
LFE0C: 8A 04 ORAA #4 ;
LFE0E: 97 00 STAA L0000 ; status word
;
LFE10: CE 01 99 LDX #$0199 ;
LFE13: FF BC 0C STX LBC0C ;
LFE16: CE 00 00 LDX #$0000 ;
LFE19: 20 03 BRA LFE1E ; go do ram refresh

;*==================================================
;*
;* Real Time Service Routine E
;*
;* RAM Refresh
;*==================================================

LFE1B: CE 00 80 LDX #$0080 ;

;
; another entry point
;
LFE1E: 86 10 LDAA #16 ;
LFE20: 9F 49 STS L0049 ;
LFE22: 35 TXS ;
LFE23: 38 PULX ;
LFE24: 3C PSHX ;
LFE25: 38 PULX ;
LFE26: 38 PULX ;
LFE27: 3C PSHX ;
LFE28: 38 PULX ;
LFE29: 38 PULX ;
LFE2A: 3C PSHX ;
LFE2B: 38 PULX ;
LFE2C: 38 PULX ;
LFE2D: 3C PSHX ;
LFE2E: 38 PULX ;
LFE2F: 4A DECA ;
LFE30: 26 F1 BNE LFE23 ;
LFE32: 9E 49 LDS L0049 ;
LFE34: 39 RTS ;

;*==================================================
;*
;* 2d TBL Vs. AFR
;*
;* Inverse AFR term for BPW calc
;*
;*==================================================

LFE35: FCB 16 ; line count

;---------------------------------------------
; ~AFR ; afr
;---------------------------------------------
FCB 255 ; 0.0
FCB 255 ; 1.6
FCB 255 ; 3.2
FCB 255 ; 4.8
FCB 255 ; 6.4
FCB 205 ; 8.0
FCB 171 ; 9.6
FCB 146 ; 11.2
FCB 128 ; 12.8
FCB 114 ; 14.4
FCB 102 ; 16.0
FCB 93 ; 17.6
FCB 85 ; 19.2
FCB 79 ; 20.8
FCB 73 ; 22.4
FCB 68 ; 24.0
FCB 64 ; 25.5


;-----------------------------------------------
;
; this is a table!
;
;-----------------------------------------------

LFE47: FDB $0028 ;
LFE49: FDB $002A ;
LFE4B: FDB $0030 ;
LFE4D: FDB $0032 ;
LFE4F: FDB $0034 ;
LFE51: FDB $0026 ;
LFE53: FDB $001C ;
LFE55: FDB $0012 ;
LFE57: FDB $0014 ;
LFE59: FDB $0016 ;
LFE5B: FDB $D002 ;
LFE5D: FDB $0066 ;
LFE5F: FDB $BC00 ;
LFE61: FDB $BC02 ;
LFE63: FDB $BC04 ;
LFE65: FDB $BC06 ;
LFE67: FDB $BC0A ;
LFE69: FDB $0020 ;

;*==================================================
;*
;* Factory Diags
;*
;*==================================================

LFE6B: BD FF 05 JSR LFF05 ;
LFE6E: 24 FE BCC LFE6E ;
LFE70: FE BC 3C LDX LBC3C ;
LFE73: DF 18 STX L0018 ;
LFE75: BD FE FE JSR LFEFE ; read BatV adc channel
LFE78: 5F CLRB ;
LFE79: 81 28 CMPA #40 ;
LFE7B: 23 1D BLS LFE9A ;
LFE7D: D6 23 LDAB L0023 ; coolant, adc cnts
LFE7F: 27 1A BEQ LFE9B ;
LFE81: 81 5A CMPA #90 ;
LFE83: 25 16 BCS LFE9B ;
LFE85: 5F CLRB ;
LFE86: B6 08 81 LDAA L0881 ; MCU1 I/O
LFE89: 84 30 ANDA #$30 ;
LFE8B: 91 1A CMPA L001A ; rpm scaled
LFE8D: 27 0C BEQ LFE9B ;
LFE8F: 97 1A STAA L001A ; rpm scaled
LFE91: D7 70 STAB L0070 ;
LFE93: D7 66 STAB L0066 ; 160Hz rts counter
LFE95: D7 1B STAB L001B ; rpm / 25
LFE97: 5A DECB ;
LFE98: D7 71 STAB L0071 ; aldl byte count
LFE9A: 5C INCB ;
LFE9B: D7 23 STAB L0023 ; coolant, adc cnts
LFE9D: BD FA D6 JSR LFAD6 ;
LFEA0: DC 18 LDD L0018 ; drp count
LFEA2: C8 04 EORB #4 ;
LFEA4: FD BC 3C STD LBC3C ; PWM control register
LFEA7: 96 1A LDAA L001A ; rpm scaled
LFEA9: 27 26 BEQ LFED1 ;
LFEAB: F6 08 81 LDAB L0881 ; MCU1 I/O
LFEAE: C8 08 EORB #8 ;
LFEB0: F7 08 81 STAB L0881 ; MCU1 I/O
LFEB3: 81 20 CMPA #32 ;
LFEB5: 26 5C BNE LFF13 ;
LFEB7: 4F CLRA ;
LFEB8: C6 C5 LDAB #197 ;
LFEBA: FD BC 14 STD LBC14 ; ecu async bpw
LFEBD: CE 01 00 LDX #$0100 ;
LFEC0: DF 4D STX L004D ;
LFEC2: CE 00 DD LDX #$00DD ;
LFEC5: BD E2 89 JSR LE289 ;
LFEC8: DD 1C STD L001C ; rpm / 25 one delayed
LFECA: DC 18 LDD L0018 ; drp count
LFECC: CA 80 ORAB #128 ;
LFECE: FD BC 3C STD LBC3C ; PWM control register
LFED1: DC 18 LDD L0018 ; drp count
LFED3: 84 F7 ANDA #$F7 ;
LFED5: C4 6F ANDB #$6F ;
LFED7: CA 08 ORAB #8 ;
LFED9: 7F 08 81 CLR L0881 ; MCU1 I/O
LFEDC: FD BC 3C STD LBC3C ; PWM control register
LFEDF: 7F 08 01 CLR L0801 ; MCU2 I/O
LFEE2: CE BC 0E LDX #$BC0E ; ecu sync bpw
LFEE5: 4F CLRA ;
LFEE6: 5F CLRB ;
LFEE7: ED 00 STD 0,X ;
LFEE9: 8D 19 BSR LFF04 ;
LFEEB: ED 06 STD 6,X ;
LFEED: 86 F0 LDAA #240 ;
LFEEF: 8D 13 BSR LFF04 ;
LFEF1: ED 08 STD 8,X ;
LFEF3: 8D 0F BSR LFF04 ;
LFEF5: ED 0A STD 10,X ;
LFEF7: 8D 0B BSR LFF04 ;
LFEF9: ED 0C STD 12,X ;
LFEFB: 7E FF C6 JMP LFFC6 ;

;*==================================================
;*
;* Read BatV adc channel
;*
;*==================================================

LFEFE: 86 02 LDAA #2 ;

;*==================================================
;*
;* ADC routine w/wait for data
;*
;*==================================================

LFF00: 5F CLRB ; wait for data
LFF01: BD FC 1A JSR LFC1A ; ADC routine
LFF04: 39 RTS ;

;-----------------------------------------------
;
;
;-----------------------------------------------

LFF05: 86 0C LDAA #12 ; aldl channel
LFF07: 8D F7 BSR LFF00 ; ADC w/wait for data
LFF09: 81 28 CMPA #40 ;
LFF0B: 25 04 BCS LFF11 ;
LFF0D: 81 64 CMPA #100 ;
LFF0F: 25 01 BCS LFF12 ;
LFF11: 0C CLC ;
LFF12: 39 RTS ;

;*==================================================
;*
;* Factory test stuff?
;*
;*==================================================

LFF13: B6 08 01 LDAA L0801 ; MCU2 I/O
LFF16: 54 LSRB ;
LFF17: 54 LSRB ;
LFF18: 54 LSRB ;
LFF19: 54 LSRB ;
LFF1A: 84 F0 ANDA #$F0 ;
LFF1C: 1B ABA ;
LFF1D: 97 20 STAA L0020 ;
LFF1F: 96 66 LDAA L0066 ; 160Hz rts counter
LFF21: 84 0F ANDA #$0F ;
LFF23: 36 PSHA ;
LFF24: 8D DA BSR LFF00 ; ADC w/wait for data
LFF26: CE 00 26 LDX #$0026 ; s/d map, one delayed from L0025
LFF29: 33 PULB ;
LFF2A: 3A ABX ;
LFF2B: A7 00 STAA 0,X ;
LFF2D: 5D TSTB ;
LFF2E: 26 4E BNE LFF7E ;
LFF30: C6 80 LDAB #128 ;
LFF32: 96 1B LDAA L001B ; rpm / 25
LFF34: 26 02 BNE LFF38 ;
LFF36: 86 03 LDAA #3 ;
LFF38: 4A DECA ;
LFF39: 97 1B STAA L001B ; rpm / 25
LFF3B: 27 08 BEQ LFF45 ;
LFF3D: C6 1A LDAB #26 ;
LFF3F: 81 02 CMPA #2 ;
LFF41: 26 02 BNE LFF45 ;
LFF43: C6 E6 LDAB #230 ;
LFF45: CE F0 00 LDX #$F000 ;
LFF48: 3A ABX ;
LFF49: FF BC 16 STX LBC16 ; egr
LFF4C: B6 08 01 LDAA L0801 ; MCU2 I/O
LFF4F: 84 0F ANDA #$0F ;
LFF51: 26 02 BNE LFF55 ;
LFF53: 86 10 LDAA #16 ;
LFF55: 44 LSRA ;
LFF56: FF BC 18 STX LBC18 ; throttle kicker ($D3FF | $D000, on/off)
LFF59: B7 08 01 STAA L0801 ; MCU2 I/O
LFF5C: DC 18 LDD L0018 ; drp count
LFF5E: CA 18 ORAB #24 ;
LFF60: 24 02 BCC LFF64 ;
LFF62: C4 F7 ANDB #$F7 ;
LFF64: FD BC 3C STD LBC3C ; PWM control register
LFF67: 96 21 LDAA L0021 ; coolant, defaulted, 1k pu, inverse, adc cnts
LFF69: 48 ASLA ;
LFF6A: 89 00 ADCA #0 ;
LFF6C: 97 21 STAA L0021 ; coolant, defaulted, 1k pu, inverse, adc cnts
LFF6E: 84 03 ANDA #$03 ;
LFF70: FF BC 1A STX LBC1A ; vats
LFF73: F6 08 81 LDAB L0881 ; MCU1 I/O
LFF76: C4 FC ANDB #$FC ;
LFF78: CA 04 ORAB #4 ;
LFF7A: 1B ABA ;
LFF7B: B7 08 81 STAA L0881 ; MCU1 I/O
LFF7E: FE BC 00 LDX LBC00 ; ecm drp counter
LFF81: BD FF 04 JSR LFF04 ;
LFF84: FC BC 00 LDD LBC00 ; ecm drp counter
LFF87: 04 LSRD ;
LFF88: 04 LSRD ;
LFF89: DD 1E STD L001E ;
LFF8B: CC 02 8F LDD #655 ;
LFF8E: 8C 02 8F CPX #655 ;
LFF91: 22 11 BHI LFFA4 ;
LFF93: 8C 01 48 CPX #328 ;
LFF96: 25 16 BCS LFFAE ;
LFF98: 04 LSRD ;
LFF99: FD BC 0E STD LBC0E ; ecu sync bpw
LFF9C: C6 06 LDAB #6 ;
LFF9E: DD 4B STD L004B ;
LFFA0: 4F CLRA ;
LFFA1: 5F CLRB ;
LFFA2: 20 17 BRA LFFBB ;
LFFA4: FD BC 0E STD LBC0E ; ecu sync bpw
LFFA7: 04 LSRD ;
LFFA8: DD 4B STD L004B ;
LFFAA: DC 1E LDD L001E ;
LFFAC: 20 0D BRA LFFBB ;
LFFAE: 4F CLRA ;
LFFAF: C6 42 LDAB #66 ;
LFFB1: FD BC 0E STD LBC0E ; ecu sync bpw
LFFB4: C6 C5 LDAB #197 ;
LFFB6: DD 4B STD L004B ;
LFFB8: 5F CLRB ;
LFFB9: 93 1E SUBD L001E ;
LFFBB: DE 4B LDX L004B ;
LFFBD: FF BC 1C STX LBC1C ;
LFFC0: BD FD 19 JSR LFD19 ; delay, rts only
LFFC3: FD BC 36 STD LBC36 ;
;
LFFC6: BD FE 10 JSR LFE10 ;
LFFC9: 7E E3 FE JMP LE3FE ;

;-----------------------------------------------
;
;
;-----------------------------------------------

LFFCC: FILL $00, 39 ;

;-----------------------------------------------
;-----------------------------------------------

LFFF3: FCB $7E

;-----------------------------------------------
; vector table
;-----------------------------------------------

LFFF4: FCB $DF2F ;
LFFF6: FCB $E2B4 ; RTI
LFFF8: FCB $E2AD ;
LFFFA: FCB $E2B4 ; RTI
LFFFC: FCB $E107 ; reset
LFFFE: FCB $E107 ; reset


;-----------------------------------------------
;-----------------------------------------------
; eof ;