Subject: EGR & 9th Injector Delete – Spark Table Advice for EM6870 BIN?
I’m working on a calibration overhaul for my 1985 Corvette (EM6870 ECM, stock 24 lb/hr injectors). I’ve already deleted the 9th cold start injector and plan to block off the EGR physically and in the BIN. I’m using TunerPro with a Red Devil cable, and I’ve got a G2 adapter from Moates on the way.
To complete my chip tuning setup, I’m planning to use a TL866II Plus programmer and 27SF512 EEPROMs. My goal is to clean up the fueling logic and refine idle/warm-up behavior, but I’m especially focused on how spark tables should be adjusted after removing EGR. Since the EM6870 doesn’t support knock sensing, I want to be cautious about detonation risk—especially in the 30–60 kPa MAP range during cruise.
Here’s what I’m looking for:
• Sample BINs or spark tables from other EGR-delete setups on EM6870
• Advice on how much timing to pull in mid-load zones
• Any known issues with ping after EGR delete on stock compression
• Tips for verifying changes without AFR or knock sensor (I’m using ALDL logs and plug reads)
If anyone has calibration notes, screenshots, or even partial BINs to compare, I’d really appreciate it. I’m trying to build a reliable baseline before I start flashing and road testing.
Thanks in advance!
Billy
Calgary, AB
1985 Corvette C4 – EM6870, TunerPro, Red Devil cable, G2 adapter, TL866II Plus programmer, 27SF512 EEPROMs, EGR delete, 9th cold start injector delete
I'm new to TunerPro and currently using TunerPro RT v5.00. This calibration is untested and theoretical, built with help from Copilot AI. Once validated, I’ll share results and refine the BIN based on real-world feedback.
After removing the EGR and cold start injector hardware, I revised my BIN to support smooth, reliable cold starts with minimal cranking — aiming for factory-style one-click ignition. Calibration is complete and ready for testing.
Calibration Goals:
- Disable EGR logic across all conditions
- Soften cold start fueling
- Raise cold idle RPM targets
- Accelerate closed loop transition
- EGR On (TPS): ~3.12% → 100% (blocks activation)
- EGR Off (TPS): ~1.95% → 100% (ensures full disablement)
- Minimum MAT To Enable EGR: -17.5°C → 150°C (prevents triggering)
- EGR Diagnostic: Enabled → Disabled (suppresses fault codes)
- EGR Duty Cycle Vs. RPM/Load: 99.61% → 0% (zeroed)
- EGR Multiplier Vs. Coolant Temp: 0.00–1.00 → 0.00 (blocked)
- EGR Multiplier Vs. Load: 1.00 → 0.00 (blocked)
- Crank Fuel Pulse Width: 0.90ms @ -40°C → 0.60ms (softened)
- Crank Fuel Multiplier vs. TPS: Up to 1.80 → 0.00 @ 100% TPS (tapered)
- Closed Loop Fuel Enable Temp: 40.25°C → 25°C (faster transition)
- Closed Loop DelayTimer: Cold 300s → 5s, Warm 206s → 2s, Hot 50s → 0s
- Integrator Min/Max: 90/180 → 70/160 (faster correction)
- Target Idle RPM: 1050–550 → 1050–700 (raised cold targets)
- IAC Offset for Fan/A/C: 0 → 5 steps (airflow buffer)
- Coolant Spark Compensation: Temp/load dependent → uniform +8.44° (advance)
- Spark Advance Vs. RPM/Load: Stock → 20.04° to 45.3° (stable timing)
- Sensor bung welded after collector, angled to prevent condensation
- Stock narrowband retained for ECM closed-loop control
- Analog output routed to external logger or ADC interface
- ADX math: AFR = (Volts × 2) + 10
- Purpose: Real-time AFR tracking during startup, idle, and closed-loop transitions
Datalogging Setup:
- ECM: 1226870 running $1F mask
- Cable: Red Devil River USB ALDL (160 baud)
- ADX: $1F definition loaded in TunerPro RT
- COM port matched, baud rate set to 160
- Logging: RPM, TPS, MAP, IAC, integrator, BLM, spark, injector pulse width, closed loop status
- TL866II Plus — supports SST27SF512 and AT29C256
- GQ-4X4 — broader chip support, voltage tuning
- XGecu T56 — advanced, future-proof Programmer must support 5V parallel EEPROMs and offer verify + blank-check functions.
- Cold start testing
- Log IAC, RPM flare, integrator, O2 response
- Adjust airflow/spark if unstable
- Document final BIN once validated
- Share results on forums and Facebook for feedback
Shouldn't have any ping issues with an EGR delete on L98 cars. It doesn't change the AFR enough to effect it, especially at Calgary elevation. I'd go slow with all those changes, take them in steps. I wouldn't bother with injector pulse width and spark advance/compensation especially without a wideband hooked up. Most of those EGR lines can be simply maxed out. Shortening the closed loop time might cause cold start issues since the O2 requires adequate time to warm up in order to report correctly. Test for O2 response.
Hey everyone,
I’m moving into the final "pre-flight" stage of my '85 Z51 project. This has been a true labor of love over the last few months. Before I even touched the calibration, I ensured the mechanical foundation was bulletproof with a new double roller timing chain, gearset, and a full engine gasket refresh. The goal is a reliable machine optimized for Calgary’s elevation on 87 Octane pump gas.
I. The Hardware Mod List
- Fuel Pump: Upgraded to a MOTOALL 340LPH High Performance unit (F20000169 replacement) to ensure zero pressure drop-off at high RPM.
- Fuel Pressure Regulator: Installed a Southbay Adjustable Fuel Pressure Regulator to fine-tune the rail pressure.
- Injectors: Upgraded to Southbay Bosch Generation III 24lb units.
- Deletes: Full physical removal of the 9th injector, EGR, and Cold Start systems using the Eckler's L98 TPI Delete Kit.
- Smog Pump Delete: Removed the smog pump and associated plumbing using a Smog Pump Delete Pulley for a cleaner engine bay.
- Cooling: Installed a 180° Thermostat to combat heat-soak.
- Wideband O2: Integrated a Performance Electronics Wideband Controller directly into the data stream.
II. Calibration Logic & Math (Verified in Bin)
- Fuel Pressure Baseline: Dialed in exactly 43.5 psi static (vacuum disconnected) to match ECM constants.
- XDF Customization ($1F_updated.xdf): Since the standard $1F mask lacked a dedicated flow parameter, I updated my XDF to allow for hard-coding the injector constants.
- Injector Scaling: Set to 24.11 lb/hr (Hex 0x3D at address 0x0E) to match the Bosch III physical rating.
- EGR Logic: Disabled Code 32 (Address 0x1F5) and zeroed out the EGR Spark Advance table (Address 0x24F).
- Cooling Fan Sync: Fan On set to 186°F (85°C) to synchronize with the 180° thermostat.
III. The "Idiot-Proof" Dashboard (1985Corvette.adx)
I’ve overhauled my data definition file (now saved as 1985Corvette.adx) to use a strict Green = Safe / Red = Alarm color protocol:- Wideband Configuration: Pulling data specifically from APU1 Channel 1.
- Safety Alerts: Gauge backgrounds flip to RED for dangerous lean (>17.0) or rich (<11.0) conditions.
- The "LEARN" Flag: Renamed BLM Enable to LEARN (Green) for active updates and HOLD (Red) when learning is frozen.
- Coolant Temp: RED if under 160°F or over 225°F. GREEN is the 180°–205°F target.
- 12-Channel Trace: The "Imported Mon" tab overlays Wideband AFR against RPM, TPS, and MAF for real-time analysis.
IV. Tuning & Data Acquisition Strategy
To handle the communication and tuning, I am using the following Moates hardware:- Emulation & Logging: Moates AutoProm APU1 for real-time emulation and high-speed data logging.
- ECM Interface: Moates G2 Memory Adapter soldered into the '870 ECM to allow the APU1 to "talk" to the car.
The Next Step: First Fire
The "First Start" ritual is next: stabbing the distributor and locking in base timing at 6° BTDC (EST wire disconnected), and using the APU1 to verify 87-octane stability.I'm attaching my .bin, the $1F_updated.xdf, and the 1985Corvette.adx files for the community!
Cheers,
Billy
Last edited by veiloctane; Feb 13, 2026 at 06:39 PM.
The triple blip test (tripple_blip_no_stall.csv):
The big win here is right in the filename — three throttle blips, zero stalls. This was the main gremlin from my last update and it’s sorted. Here’s what the log shows:
• Idle RPM: Holding steady at 975–1000 RPM throughout
• Coolant Temp: 161–166°F and climbing normally — engine warming up as expected
• Fuel Pressure: Set to 43.5 PSI (vacuum disconnected/prime), dropping to ~38 PSI at idle with vacuum connected — matches 24lb Bosch injector spec
• IAC Position: 80–81 steps at idle, bumping to 84–115 on the blips and recovering cleanly
• BLM/INT: Both sitting at 108–128 range, in LEARN mode for most of the log — ECM is actively trimming
• Wideband AFR: Starting at 14.3–14.6 at idle, then richening to 11.4–12.8 on the blips as the accel enrichment kicks in — exactly what you want to see
• Loop Status: Closed loop throughout — O2 is live and the ECM is correcting
• No fault codes flagged across the entire log
Calibration Notes:
The bin modifications are straightforward:
• Accel Enrichment table (0x1A4-0x1B3): Reduced by ~20% from stock to match 24lb injector flow at 43.5 PSI
• Warmup Enrichment (0x1D5-0x1E4): Set to 48 (stock was 50) to compensate for deleted 9th injector cold-start system
• EGR System: Completely disabled — duty cycle table zeroed and diagnostic flag turned off in TunerPro
• MAF Table #1: Calibrated for 24lb injector scaling (already baked into the table values; no separate “injector size” byte required)
The 24lb injectors are accounted for through the MAF table calibration — the bin’s fuel constants and table values are already scaled for this injector size and pressure.
What’s next:
Loading up for a driving datalog — highway cruise data is the next piece of the puzzle to verify the tune under load. Will post that log once I have it.
Files attached: 1985Corvette_24lb_TUNED.bin, 1985Corvette.adx, $1F_updated.xdf
Cheers
Last edited by veiloctane; Jun 1, 2026 at 11:44 AM.
- Injector Scaling: Set to 24.11 lb/hr (Hex 0x3D at address 0x0E) to match the Bosch III physical rating.
- EGR Logic: Disabled Code 32 (Address 0x1F5) and zeroed out the EGR Spark Advance table (Address 0x24F).
The Best of Corvette for Corvette Enthusiasts
thanks for this correction.
General scanning issues when in 160 baud ALDL mode: The idle is set to 1,000 rpm which seems to be consistent with the data. Note: There may be 8 degrees added to the spark advance (as is typical for 86-89 bins) so beware of the extra advance. Try and verify the timing (while scanning) to see if it is idling at 28 degrees (instead of 20 degrees) by using a dial back timing light or a damper that is indexed all around (assuming correct initial advance). The additional 8 degrees (if present) may skew any conclusions that you may draw from timing and/or knock from the scan data.
Tuning related: I would suggest that you undo the coolant compensation spark changes described and revert to factory settings. It sounds like you're adding another 8.44 degrees advance across the board, so you may be idling at 36+ degrees now. I would be very careful with any spark advance changes since they cannot be verified by logging the standard ALDL data.
If a good $1F disassembly could be found (or created), it would be useful to customize the ALDL datastream to include some more relevant signals for the task at hand (such as spark advance). 25 bytes of data is pretty limited, so it could be worth optimizing. Years ago when I was trying to disassemble $1F, I had difficulty separating the code from the data. I never really cared enough about $1F to pursue it much further.
Here's an old log from that one time that I adapted a Blowerworks maf to work with an 870 ecm: https://datazap.me/u/tequilaboy/logs...ed&solo=0-1-55
Turns out that it is not very lucrative to sell MAFs and/or tuning services for 1985 cars (very limited market).
Last edited by tequilaboy; Jun 3, 2026 at 06:39 PM.
After several weeks of datalogging, bin revisions, and chasing what turned out to be the wrong problems, we finally have a clean running car. Here’s the full breakdown of what happened, what went wrong, and what actually fixed it.
Hardware Recap
• Southbay Bosch D3 24lb injectors
• Performance Electronics wideband O2
• Moates APU1 emulator with G2 adapter
• Adjustable FPR at 43.5 PSI static / 38 PSI at hot idle
• 180° thermostat
• EGR, 9th injector, AIR pump physically deleted
• ECM: GM $1F calibration — 1227870 (1985 Corvette L98 TPI 700R4)
The Problem
After deleting the EGR system and flashing a modified bin, the car was throwing Code 24 (VSS) and Code 32 (EGR) during every drive. BLM was sitting at 108 in closed loop and the car had a rich smell and smoke after reaching operating temp.
What We Thought Was Wrong
We spent considerable time chasing BLM at 108 through fuel table changes — adjusting the injector scalar, open loop fuel tables, and IPW tables across five bin versions. None of it moved BLM significantly. We also went back and forth on whether BLM below 128 adds or removes fuel on the $1F ECM — a question that caused several incorrect corrections.
The short answer — we were treating symptoms instead of fixing the root cause.
What Was Actually Wrong
Two separate issues:
Issue 1 — Missing EGR delete parameter
A complete EGR delete on the $1F ECM requires more than just zeroing the duty cycle table. The critical missing parameter was EGR Diagnostic Minimum Vehicle Speed at address 0x024C. Stock value is 0 MPH. This parameter controls when the ECM runs its EGR system health check. With it at 0 MPH the diagnostic routine ran every time the car was moving, interrogated the VSS signal as part of its enable conditions, and threw Code 24 when it didn’t get a clean VSS response.
Setting this to 255 MPH prevents the diagnostic from ever running — no diagnostic, no VSS check, no Code 24.
Worth noting — this parameter is not defined in the standard 1F_updated.xdf. Credit to Clowny on YouTube for identifying it in his EGR delete video. If you’re doing an EGR delete on a $1F and still getting Code 24 after the standard delete procedure, this is why.
Issue 2 — Active fault codes interfering with closed loop
With Code 24 and Code 32 active the ECM’s diagnostic monitor was modifying closed loop behavior — restricting BLM learning and potentially forcing fallback operating modes. This made every datalog unreliable for tuning purposes because the ECM wasn’t operating normally. We were tuning against corrupted data the entire time.
The Complete EGR Delete Parameter List for $1F
|Parameter |Address |Stock Value|Delete Value|
|-------------------------|-------------|-----------|------------|
|EGR Off TPS threshold |0x0249 |1.95% |0.00% |
|EGR On TPS threshold |0x024A |3.12% |99.61% |
|Minimum MAT to Enable EGR|0x024B |−17.5°C |151.25°C |
|EGR Min Vehicle Speed |0x024C |0 MPH |255 MPH |
|EGR Duty Cycle table |0x024F-0x02F0|Active |All zeros |
|EGR CLT multiplier table |0x02A4-0x02AD|Active |All zeros |
|EGR Load multiplier table|0x02A7-0x02BE|Active |All zeros |
|EGR Diagnostic flag |0x1F5 bit 5 |Enabled |Disabled |
The Fix — v6 bin
Built from the original factory EPROM read directly from the chip with only the above EGR delete changes applied. All fuel tables, injector scalar, spark tables, IAC — completely stock. No other modifications.
Results after running v6:
• No Code 24 ✅
• No Code 32 ✅
• No smoke ✅
• No fuel smell ✅
• Clean idle at 14.6 AFR wideband ✅
• Engine running well ✅
BLM at 108 — Is it a problem?
Short answer — no.
After extensive testing including live injector scalar changes from 21.00 to 23.50 lb/hr with no effect on BLM whatsoever, we confirmed that BLM on the $1F is driven purely by the narrowband O2 sensor feedback — not the injector scalar calculation. Changing the scalar affects pulse width but has zero effect on where BLM learns.
The Bosch 12014 narrowband sensor appears to have a slight rich bias — it switches at a higher voltage than the ECM’s 450mV threshold expects. The ECM interprets the consistently elevated mV readings as rich and holds BLM at 108 as a learned correction. The wideband confirms actual AFR at 14.57-14.65 — essentially perfect stoich. The engine runs correctly regardless of the BLM number.
Also worth noting — during throttle holds at 2000-2500 RPM BLM rises to 116-120, which confirms the scalar is very close to correct under load where fuel pressure rises toward 43.5 PSI. The 22.27 lb/hr stock scalar is appropriate for the Southbay Bosch D3 24lb injectors at our actual operating pressure of 38 PSI at idle.
Key Lessons Learned
1. A complete EGR delete requires disabling the diagnostic monitor, not just the operational tables
2. The EGR min vehicle speed parameter at 0x024C is not in the standard XDF — you have to set it via hex editor or a more complete XDF
3. Fix fault codes before chasing tuning parameters — active codes corrupt your datalog data and make the ECM behave abnormally
4. BLM alone is not a complete picture of fueling accuracy — always evaluate alongside wideband AFR
5. The stock $1F fuel calibration is well engineered — when the ECM operates cleanly the base tune is very close to correct for stock equivalent injectors
6. Read your own chip — the HLH community bin is a different calibration variant with 127 byte differences from the Z51 factory bin. Always start from your own EPROM
Next Steps
• Highway cruise datalog on v6 for load-based tuning
• Spark advance optimization for torque in the 1600-2800 RPM range
• Accel enrichment table cleanup for throttle blip smoke
Tools: TunerPro RT v5, Moates APU1 with G2 adapter, Performance Electronics wideband, ALDL 160 baud
Sorry, I can’t access my pc right now (due to unexpected hardware failure).
Great question — here's exactly what INT is doing when BLM is pegged at 108:
At warm idle (165–183°F, closed loop):
• INT mean: 120–125, ranging from 110–144
• BLM: locked at 108
• Wideband AFR: 14.41–14.67 — essentially stoich
• O2 Sensor: 700–815mV — rich biased
Your observation about the reduced INT lower limit (70) is spot on. With the stock lower limit of 90, the ECM would have had less authority to compensate for the base pulse width, and the combination of BLM=108 + limited INT correction would have made the car run noticeably rich. With INT floor at 70 there's more room for the integrator to pull fuel down.
We did try the 25% BPW reduction as you suggested. Results:
• Applied in 5% increments live via APU1 emulation
• At 15% reduction: injector BPW dropped from 1.144ms to ~0.93ms at idle
• BLM still pegged at 108 at idle — no movement
• INT climbed to 122–127 and held
• Wideband AFR drifted slightly leaner to 14.81–14.91
• Rich/Lean indicator briefly switched to LEAN then back to RICH
At 2000–2600 RPM holds with 15% reduction applied:
• BLM climbed to 126–128 ✅
• AFR 14.4–14.6 ✅
Conclusion: The idle BLM=108 appears to be a narrowband O2 sensor bias issue rather than a base pulse width issue. The sensor (NTK 21002, also tested Bosch 12014) consistently reads rich to the ECM at idle regardless of actual AFR. Your log from the 870/Blowerworks MAF test shows BLM sitting naturally at 128–134 at idle — what narrowband sensor were you running in that test? That may be the clue to solving the idle BLM issue.
We also got a Code 24 VSS after a WOT pull on a recent road test. The 0x024C is confirmed at 0xFF in the bin. Do you know if there's a second standalone VSS diagnostic enable parameter in the $1F separate from the EGR min vehicle speed? Addresses 0x024D (32d) and 0x024E (9d) are directly adjacent and unchanged from stock — could either of these be a VSS diagnostic threshold?
I. BPW TABLE REDUCTION — LIVE VIA APU1
Following tequilaboy’s recommendation to reduce the BPW table, I tuned it live with the engine running using the APU1 emulator. Applied in 5% increments (Divide 1.0526, Execute, Send to Emulator) while monitoring BLM, INT, and wideband AFR in real time. Stopped at 15% total reduction.
Results:
• Idle BPW: 1.144ms → 0.972ms — reduction confirmed hitting the ECM
• BLM at idle: still 108 — more on this below
• BLM at 2000 RPM hold: 126
• BLM at 2600 RPM hold: 128 — dead neutral, perfect
• Wideband AFR throughout: 14.41–14.91 — correct stoich
v7 bin has 17 bytes changed from v6 — 16 BPW table cells and 1 checksum. Everything else is completely stock.
II. BLM=108 AT IDLE — NARROWBAND SENSOR BIAS CONFIRMED
Swapped the Bosch 12014 for an NTK 21002 to see if the sensor was the issue. Both sensors exhibit the same rich bias on the $1F ECM at idle:
• Bosch 12014: O2 mV sitting at 750–815mV at idle
• NTK 21002: O2 mV sitting at 511–708mV at idle (slightly better)
• ECM threshold: 450mV — neither sensor crosses it consistently enough at idle
I pulled tequilaboy’s 870/Blowerworks MAF datalog from Datazap and analyzed it. His log shows BLM sitting naturally at 128–134 at idle with O2 mV averaging 608mV — much closer to the 450mV threshold. This confirms BLM=128 at idle IS achievable on the 870 ECM with the right narrowband sensor — I just haven’t found it yet.
For now BLM=108 at idle is accepted as a sensor artifact. Wideband confirms 14.4–14.7 AFR actual throughout. BLM rises to 126–128 at any real driving RPM where it matters.
III. FIRST ROAD TEST — gas_run.csv (34.9 minutes)
Full datalog timestamps:
4:56 (sample 201) — STALL — RPM dropped to 0 on throttle blip/deceleration. IAC climbed to 144 steps but couldn’t catch it. Controlled blip session planned to diagnose IAC park position vs AE cutoff.
5:01 (sample 205) — ALDL COMMUNICATION ARTIFACT — stall triggered a known ALDL frame dropout at 160 baud. 1,312 consecutive frames showing overflow values (RPM=5100, MAP=204, BLM=204). This is a serial bus artifact, not real ECM data. Disconnecting the ALDL cable clears it.
5:07 (sample 210) — ALDL RECOVERY — clean data resumes, engine restarted.
Hard acceleration events (TPS 3.5–4.6V) throughout the drive:
8:01 (sample 328) — RPM 2550, AFR 10.68, BLM 128, ESC OK
9:50 (sample 402) — RPM 2875, AFR 10.69, BLM 128, ESC OK
13:22 (sample 546) — RPM 2950, AFR 10.33, BLM 128, ESC OK
14:06 (sample 576) — RPM 2475, AFR 11.07, BLM 128, ESC OK
14:48 (sample 605) — RPM 2950, AFR 11.12, BLM 128, ESC OK
17:39 (sample 999) — KEY OFF — gas station stop.
21:30 (sample 2026) — RESTART — drive home begins.
21:38 (sample 2031) — RPM 1950, AFR 10.34, BLM 128, ESC OK
22:01 (sample 2047) — RPM 2975, AFR 10.65, BLM 128, ESC OK
22:28 (sample 2065) — RPM 1525, AFR 10.62, BLM 110, ESC OK
24:11 (sample 2135) — RPM 2725, AFR 10.54, BLM 128, ESC OK
24:58 (sample 2167) — RPM 3300, AFR 11.00, BLM 128, ESC OK
25:45 (sample 2199) — RPM 2900, AFR 11.13, BLM 128, ESC OK
30:44 (sample 2402) — RPM 2950, AFR 9.56, BLM 128, ESC OK
BLM=128 and AFR 9.56–11.13 throughout all hard acceleration events — correct enrichment under load, ESC=OK on every one.
After the second post-gas acceleration pull — CHECK ENGINE LIGHT. Paperclip read: Code 24 VSS and Code 43 ESC.
Code 43 ESC/Knock — NOT real knock:
All Code 43 readings are inside the ALDL communication artifact block (samples 205–1990). Zero knock detected in any clean driving data. Not a timing concern.
Code 24 VSS — ALDL Communication Artifact:
Code 24 (VSS) appeared during ALDL datalogging but cleared when the ALDL cable was disconnected and the car was restarted. Hardware has been verified — VSS connector is good, speedometer works normally. This suggests Code 24 appearing during datalogging is a serial communication artifact rather than a real VSS fault.
For other builders: If Code 24 appears only during ALDL datalogging sessions, disconnect the ALDL cable, clear codes, and retest. The code may not return.
Instant Fuel Trip Gauge Issue:
The instant fuel consumption display also showed anomalies during ALDL datalogging (impossible MPG values). This cleared along with Code 24 when the ALDL cable was disconnected. Like Code 24, this appears to be a datalogging communication artifact, not a tune or hardware problem.
Regarding 0x024D VSS Diagnostic:
Does anyone have information on 0x024D (stock value 32d = 32 MPH) on the $1F ECM? Is this a separate VSS diagnostic minimum speed threshold? If so, setting it to 0xFF may prevent false Code 24 triggers.
Last edited by veiloctane; Jun 7, 2026 at 10:59 AM. Reason: spelling
For those following along — this is a full recap of everything done since the EGR delete thread started. Files in zip at the bottom.
---
I. THE BUILD
1985 C4 Z51, L98 TPI, 700R4 automatic | 3.07 rear axle (G44)
$1F ECM (GM 1227870)
Moates APU1 emulator with G2 adapter — live tune changes without burning chips, instant bin swap, real-time parameter editing while engine runs
TunerPro RT v5 | Red Devil ALDL cable at 160 baud
Performance Electronics wideband controller
NTK 21002 narrowband O2 sensor (replaced Bosch 12014)
ENGINE:
• Full engine gasket refresh
• Double roller timing chain
• 180°F thermostat
• Bosch D3 24lb/hr injectors (Southbay)
• MOTOALL 340LPH high flow fuel pump — Walbro clone, confirmed no fuel starvation at any RPM or load across all datalog sessions
• Adjustable FPR @ 43.5 PSI static / 38 PSI idle with vacuum
DELETES:
• EGR delete (Eckler's kit)
• AIR pump delete
• Smog pump delete
• 9th cold start injector delete
FUEL: 87 octane regular — entire tune developed and confirmed on 87 octane
Base timing verified: 6° BTDC (EST wire disconnected, dial-back timing light)
---
II. WHAT WAS WRONG WITH STOCK CALIBRATION
The factory $1F calibration had several issues once the deletes were done:
• BLM stuck at 108 — narrowband O2 sensor rich bias reads above 450mV ECM threshold at idle, ECM permanently commands lean correction via long term fuel trim
• Over-rich WOT — stock BPW calibrated for 9th injector present, deleting it left base fueling 15-20% too rich
• Heavy white smoke on throttle blips — AE tables calibrated for stock hardware, massive over-enrichment on every blip without 9th injector
• Cold start 4-6 seconds cranking — crank fuel table drops off too aggressively above 0°C without 9th injector pre-charge
• IAC hunting — idle speed control oscillating 30-145 steps, occasional stall on throttle blips
• Code 24 VSS during datalogging — see Section IX below
---
III. DEVELOPMENT HISTORY — HOW WE GOT TO v7n
Every change was confirmed by datalog before moving to the next step. Total of 15+ drive sessions and 8,380+ valid datalog samples across the development. All testing on 87 octane regular fuel.
v6 — EGR delete baseline
• Complete EGR delete, all parameters
• 0x024C = 0xFF to eliminate Code 24 caused by EGR VSS diagnostic
• All fuel and spark tables stock
• Result: No smoke, no CEL, BLM=108 at idle confirmed as O2 sensor bias not fueling error
v7 — BPW 15% reduction (tequilaboy recommendation)
• BPW table reduced 15% across all 17 load cells
• Result: BLM moved from 108 stuck → 126-128 at cruise, confirmed correct fueling at 2600 RPM
v7c — Crank fuel cold start fix
• Crank fuel table cells doubled at -4°C to 32°C
• Result: Cold start crank time 4-6 seconds → 2 seconds confirmed
v7d through v7g — Accel enrichment iterative reduction
• AE TPS multiplier and LV8 MAF tables reduced in stages from stock → 15% → 25% → 30% → 35%
• AE pulse count reduced from 20-31 pulses → 4-10 pulses at warm temps
• Result: Blip AFR min improved from ~10.5 → 12.2, smoke significantly reduced
v7h — IAC warm park raised
• IAC warm park 0x05AC-0x05B2 raised from 90 → 120 steps
• Result: Post-blip stall resistance improved, IAC floor raised
v7i — Idle RPM target + further AE reduction
• Idle RPM target reduced 964 → 950 RPM
• AE reduction to 45% total from stock
• Result: Idle settled at 952 RPM confirmed in log
v7j — BPW 20% total + AE 50% total
• Additional 5% BPW reduction (20% total from stock)
• AE to 50% total from stock
• Result: Car noticeably stronger, more power confirmed by feel. BLM 129-133 at cruise
v7k — WOT AFR targeting 12.5
• BPW further adjusted for 12.5 WOT AFR target
• AE to 55% total from stock
• Result: WOT AFR 12.09-12.51 mean 12.30 confirmed in datalog
v7l — WOT AFR targeting 12.8 + IAC warm park adjusted
• BPW adjusted for 12.8 WOT AFR target
• IAC warm park lowered from 120 → 100 steps
• Result: WOT AFR 12.22-13.19 mean 12.67, BLM never below 126 in 25 min log, zero stalls during drive
v7m — Spark advance + IAC refinement
• +2.11° spark advance at 1600-2600 RPM, loads 32-96 (87 octane safe zone)
• IAC warm park further refined
• Result: Best log of entire project — 49 minutes, 2004 samples, 0% corrupt, BLM 126-144 never touching 108, idle AFR 14.39, zero knock, one stall (cold idle only)
v7n — Current bin
• +2.11° spark advance added at 1000-1400 RPM
• WOT BPW corrected for 12.8 AFR with BLM=140 (8.9% reduction at loads 128-256)
• Math: 12.8 target x 1.09375 BLM correction = 14.0 base AFR needed from BPW table
• Result: Pending first WOT datalog
---
IV. WHAT IS IN v7n — COMPLETE CHANGE LIST vs STOCK
217 bytes changed out of 4096 total (5.3% of ROM). 94.7% identical to factory.
All changes developed and confirmed on 87 octane regular fuel.
EGR DELETE (152 bytes) — complete system disable
BPW TABLE — 26.7% reduction from stock across all 17 cells
WOT BPW — loads 128-256 reduced additional 8.9% for 12.8 AFR target
ACCEL ENRICHMENT — 55% reduction from stock, pulse count 20-31 → 4-10 pulses
CRANK FUEL — doubled at -4°C to 32°C
IAC WARM PARK — 100 steps at idle temp (0x05AC-0x05B2)
IDLE RPM — 964 → 950 RPM (32-56°C cells)
SPARK ADVANCE — +2.11° at 1000-2600 RPM, loads 32-96 (87 octane safe limit respected throughout)
Unchanged from stock: spark table above 2600 RPM (already at 87 octane ceiling 43-47°), warmup enrichment, power enrichment, MAF calibration, TCC lockup tables, closed loop parameters, base timing
---
V. CONFIRMED RESULTS FROM DATALOGS
Best session (v7m, 49 minutes, 2004 samples, 0% corrupt):
• BLM: never below 126, mean 131.2, most time at 130-134 ✅
• Idle AFR: 14.39 mean — dead stoich ✅
• Idle RPM: 987 ✅
• Zero knock events across 2004 valid samples ✅
• One stall (cold idle at startup only) ✅
• ESC: OK on every sample ✅
Best WOT session (v7l, Stoney Trail):
• AFR: 12.09-13.19, mean 12.67 ✅
• BLM at WOT: 128-132 ✅
• RPM max: 4175 ✅
• ESC: OK throughout ✅
Blip AFR across all sessions:
• v7 stock AE: ~10.5 min
• v7n current: 13.4 mean, 10.15 min (hard blip) ✅
Total datalog sessions: 15+
Total valid samples analysed: 8,380+
Total knock events in valid data: 0
---
VI. ESTIMATED POWER — Calgary altitude corrected (~1048m / 3440ft)
All figures based on 87 octane regular fuel:
Stock L98: 230 HP / 330 lb-ft crank
v7n estimated: ~264 HP / ~372 lb-ft crank
Calgary corrected (~10% altitude loss): ~237 HP / ~333 lb-ft
At wheels (700R4 ~18% drivetrain loss): ~194 RWHP
Remaining potential on 87 octane (O2 sensor fix): +3-6 HP / +5-10 lb-ft
Additional potential switching to 91 octane + spark advance: +8-15 HP / +12-20 lb-ft
Full optimised estimate (91 octane + correct O2 sensor): ~276-288 HP / ~389-402 lb-ft crank
---
VII. WHAT'S STILL OPEN
1. Narrowband O2 sensor — biggest remaining item
BLM running at 130-134 instead of 128 means ~2-5% over-fueling
Need a sensor that switches cleanly at 450mV on the $1F ECM
tequilaboy — what sensor were you running in the Blowerworks MAF log
where BLM sat at 128-134 at idle?
2. IAC PID gain/damping parameters
IAC still hunting 36-145 steps at warm idle
Occasional stall on aggressive throttle blips
Does anyone have the IAC proportional/integral gain addresses for $1F?
3. 91 octane spark advance bin — +8-15 HP potential
On 87 octane the spark table is essentially maximised at 2800+ RPM (43-47°)
Switching to 91 would allow +2-3° in the 2800-3200 RPM zone safely
Will build a dedicated 91 octane bin when ready to test
4. Warmup enrichment — still stock
Calibrated for 9th injector present, may be slightly over-rich first 2-3 minutes
Requires cold start datalogs at 0-10°C — Calgary winter session needed
---
VIII. KEY TECHNICAL FINDINGS FOR $1F TUNERS
• 0x0E in the XDF is a SPARK ADVANCE cell (400 RPM / 96 load = 20.04°), NOT injector scalar — corrected XDF included
• BPW table at 0x4D8, 17 cells, scale = 76.2939 µsec/raw
• Crank fuel table at 0x0421, 14 cells, scale = 0.003922 ms/raw
• IAC Warm Park table at 0x05AA, 8-bit values = direct steps, no scaling
• Spark table at 0x000A, scale = 0.3516°/raw
• Safe spark limit on 87 octane at Calgary altitude: ~45° in torque band, ~49° on 91 octane
• EGR delete requires 0x024C = 0xFF — setting to 0 triggers Code 24 via EGR VSS diagnostic
• ALDL corruption blocks (RPM=5100, MAP=204, BLM=204) during stalls and hard acceleration — known 160 baud limitation, not real data
• Checksum at 0x0000: complement = (0x100 - (sum(data[1:]) & 0xFF)) & 0xFF
---
IX. ALDL KNOWN LIMITATIONS ON 1984-1989 C4
Two things worth flagging for anyone datalogging on a first-gen digital dash C4:
1. LIVE FUEL ECONOMY DISPLAY GOES BLANK WHEN ALDL IS CONNECTED
The C4 digital dash fuel rate/economy display stops working whenever the ALDL cable is plugged in. The CCM (Cluster Control Module) and the ALDL diagnostic port share the same single-wire serial bus. When TunerPro takes control of the bus at 160 baud the CCM can no longer receive fuel consumption data from the ECM. The display returns to normal the moment the ALDL cable is unplugged. Not a fault — hardware limitation of the shared bus architecture.
2. CODE 24 VSS DURING DATALOGGING IS NORMAL — NOT A HARDWARE FAULT
Every datalogging session showed Code 24 VSS ERROR on 100% of samples including at idle with the car stationary. Not a failing VSS sensor or calibration problem.
On 1984-1989 C4 the VSS signal routes: VSS sensor → CCM → ECM. The ECM receives vehicle speed as a processed signal from the CCM over the serial bus. When TunerPro is polling the ECM the CCM cannot transmit VSS data — the ECM sees no speed signal and logs Code 24 for the entire connected session.
Confirmation: speedometer accurate at all times, VSS connector clean, Code 24 never appeared without ALDL connected. Hardware is fine.
For $1F tuners on first-gen digital dash C4s — Code 24 in your datalogs is expected. Ignore it.
---
X. ZIP CONTENTS
• 1985Corvette_24lb_EGR_DELETE_v7n.bin — current running bin (87 octane)
• 1F_updated_fixed.xdf — corrected XDF (wrong injector scalar at 0x0E removed)
• 1985Corvette.adx — datalog definition with wideband echo enabled
• stoney_to_home.csv — best idle/cruise datalog (49 min, 2004 samples, 0% corrupt)
• Drive_V7J_WOT_Stoney_2nd_Run.csv — best WOT datalog
Cheers,
Billy
Calgary, AB
1985 C4 Z51 — $1F ECM | Moates APU1 emulator | MOTOALL 340LPH (Walbro clone) | v7n bin | 87 octane | PE wideband | NTK 21002 narrowband | 6° base timing verified
Last edited by veiloctane; Jun 7, 2026 at 11:45 AM. Reason: Spelling
---
I. THE FIX THAT CHANGED EVERYTHING — IDLE STOP SCREW
After 15+ bin versions, IAC warm park adjustments, AE pulse count reductions, and idle RPM changes none of it fixed the stall on throttle blips. The root cause turned out to be mechanical, not calibration.
The idle stop screw on the throttle body was incorrectly set. With the screw too low the engine could not sustain idle without the IAC — the IAC was compensating by staying at 87–95 steps just to hold 1025 RPM. At that position the IAC had virtually no authority to catch a RPM drop after a throttle blip. Any downward overshoot went straight through the stall threshold.
The fix:
1. Ground terminals A and B on the ALDL connector
2. Key ON engine OFF — wait 60 seconds for IAC to fully close
3. Unplug IAC connector — key stays ON
4. Remove ALDL ground
5. Start engine — runs on idle stop screw only
6. Adjust idle stop screw to 500 RPM
7. Turn engine off — reconnect IAC
8. Reset TPS to 0.47V
Result: IAC dropped from 87–95 steps → 22–29 steps at fully warm idle. IAC swing dropped from 80–115 steps → 7–14 steps. Zero stalls on the first road test after the adjustment.
One free mechanical adjustment fixed what no bin change could fix.
---
II. CURRENT BIN — v7q
217 bytes changed from stock (5.3% of ROM). 94.7% identical to factory.
EGR DELETE — complete, Code 32 gone permanently
BPW TABLE — 26.7% reduction from stock
Compensates for deleted 9th injector and O2 sensor rich bias
BLM moved from 108 stuck → 124–136 range
WOT BPW CORRECTION — loads 128–256 reduced 8.9%
Calculated from confirmed BLM=136 at WOT
Math: 12.8 target x 1.09375 BLM correction = 14.0 base AFR needed
WOT AFR confirmed 12.85–13.34 on road test
ACCEL ENRICHMENT — 60% reduction from stock
AE TPS multiplier and LV8 MAF both at 40% of stock
AE pulse count reduced from 20–31 pulses → 2–6 pulses at warm temps
Blip AFR mean 13.48, min 10.56 — smoke essentially eliminated
CRANK FUEL — doubled at 0–32°C
Cold start 4–6 seconds → 2 seconds confirmed
IAC WARM PARK — 95 steps at idle temperature
Combined with correct idle stop screw setting
IAC now operating at 22–29 steps warm idle
IDLE RPM TARGET — 964 → 1000 RPM
50 RPM additional buffer above stall threshold
SPARK ADVANCE — +2.11° at 1000–2600 RPM, loads 32–96
87 octane safe limit observed throughout
2800+ RPM cells left unchanged — already at 43–47° ceiling
Zero knock confirmed across 8,380+ valid datalog samples
VSS DIAGNOSTIC — 0x024D = 0xFF
Code 24 from ALDL datalogging eliminated
Root cause: ALDL cable monopolises CCM-ECM serial bus
VSS routes through CCM on 1984–1989 C4 — ALDL disrupts signal
Not a hardware fault — see previous updates for full explanation
---
III. CONFIRMED RESULTS — BEST LOGS
Warm idle (driveway, IAC relearn complete):
BLM: 128 on every single sample — dead neutral ✅
Idle AFR: 14.55 mean — dead stoich ✅
IAC: mean 25 steps, swing 0–7 steps ✅
RPM: 1025 stable ✅
Exhaust: confirmed clean by white towel test ✅
Smoke: exhaust condensation only — confirmed not fuel
Road test (20.9 minutes, 852 samples, 0% corrupt):
Zero stalls ✅
Zero knock — ESC OK on every sample ✅
WOT AFR: 12.85–13.34 ✅
BLM at WOT: 128–136 ✅
RPM max: 4375 ✅
Blip AFR mean: 13.48, min 10.56 ✅
Total across all sessions:
Datalog sessions: 20+
Valid samples analysed: 9,200+
Knock events in valid data: 0
---
IV. ESTIMATED POWER — Calgary altitude corrected (~1048m / 3440ft)
All on 87 octane regular fuel:
Stock L98: 230 HP / 330 lb-ft crank
v7q current: ~271 HP / ~385 lb-ft crank
Calgary corrected: ~242 HP / ~344 lb-ft
At wheels (700R4): ~198 RWHP
Gain vs stock: +28–55 HP / +39–71 lb-ft
Biggest contributors:
WOT AFR correction 10.5 → 12.85: +5–9 HP / +6–12 lb-ft
Spark advance +2.11° torque band: +4–6 HP / +8–12 lb-ft
EGR + AIR + smog pump deletes: +9–17 HP / +10–19 lb-ft
Gaskets + timing chain + thermostat: +6–13 HP / +9–16 lb-ft
Remaining potential:
91 octane + spark advance: +8–15 HP / +12–20 lb-ft
Correct O2 sensor: +2–4 HP / +3–6 lb-ft
Full optimised estimate: ~283–290 HP crank / ~252–259 HP Calgary
---
V. STILL OPEN
1. IAC PID gain/damping parameters
IAC hunting 6–121 steps under real driving conditions
Driveway idle is rock solid at 22–29 steps
Under load, deceleration, and gear changes IAC still oscillates
tequilaboy — do you have the IAC proportional/integral gain
addresses for the $1F? This is the last remaining drivability issue.
2. 91 octane spark advance bin
On 87 octane the spark table is maxed at 2800+ RPM (43–47°)
Ready to build a 91 octane bin with +2–3° in the 2800–3200 RPM zone
Will post when ready to test
3. Narrowband O2 sensor
NTK 21002 running rich bias — BLM operating at 124–136 instead of 128
Looking for a sensor that switches cleanly at 450mV on the $1F ECM
Delphi ES10966 is the candidate — has anyone confirmed fitment and
correct switching voltage on an 85 Corvette $1F?
---
VI. KEY LESSON FROM THIS BUILD
Before changing any calibration parameters on a $1F with idle or stall issues — set the idle stop screw correctly first.
The correct procedure:
ALDL terminals A+B jumped → key ON 60 seconds → unplug IAC
Remove ALDL ground → start engine → adjust to 500 RPM
Reconnect IAC → verify TPS at 0.47–0.52V
With IAC operating at 22–29 steps there is authority in both directions to catch RPM swings. With IAC at 87–95 steps there is no recovery possible from a downward overshoot. Get the base right before tuning anything else.
---
VII. ZIP CONTENTS
1985Corvette_24lb_EGR_DELETE_v7q.bin — current running bin (87 octane)
1F_updated_fixed.xdf — corrected XDF
1985Corvette.adx — datalog definition with wideband echo enabled
v7q_roadtest.csv — road test datalog (20.9 min, 852 samples, 0% corrupt)
idle_screw_iac_setup.csv — IAC relearn result (BLM=128 every sample)
Cheers,
Billy
Calgary, AB
1985 C4 Z51 — $1F ECM | Moates APU1 | MOTOALL 340LPH (Walbro clone) | v7q bin
87 octane | 6° base timing | TPS 0.47V | IAC base 500 RPM | PE wideband | NTK 21002
Here's an old example where we tried a 400 mv rich lean threshold: https://datazap.me/u/tequilaboy/logs...29&axes=shared
Note: This car was running a 30% ethanol/gasoline blend (E30) at the time and the target AFR and WBO2 signals were corrected for 13:1 Lambda.
This car has pretty tight fuel control but always runs with about a 2.5% (average) rich bias (relative to target) despite trying different rich/lean thresholds. My conclusion is that if you have a bias between the WB and NB, live with it. There is really nothing you can do about it. When in doubt, trust the NB and focus your efforts elsewhere.
Here's a short segment (zoomed-in) from the same log (8192 baud) showing the action of the Integrator and the effect on both the NB and WBO2 sensors: https://datazap.me/u/tequilaboy/logs...29&axes=shared
Note that the NB and WBO2 signals are 180 degrees out of phase, are well correlated and are being driven by the Integrator.
Target AFR and WBO2 displayed on the same axis (to better illustrate the rich bias -- which is largely academic): https://datazap.me/u/tequilaboy/logs...shared&solo=21
I believe this is simply a WBO2 calibration error/instrumentation issue and nothing more. Nothing is perfect.
Last edited by tequilaboy; Jun 8, 2026 at 06:53 AM.
Good to know the 2.5% rich bias between WB and NB is a known instrumentation characteristic rather than a tune problem. Will trust the NB and stop chasing it.
v7r is loaded but not yet datalogged — will post results when I have a cold start idle log to share. The WOT BPW recalibration in v7r is still the main change worth confirming.
Still interested in the IAC idle speed control gain parameters if you have any insight. IAC is rock solid at 22–29 steps at driveway idle after the relearn but hunts 55–108 steps under real driving load. Candidate addresses identified in the 0x0350–0x037F region — specifically 0x0357 (value 12, dead band candidate) and 0x036F (value 2, integral step candidate) — but these are educated guesses. Any confirmation or correction appreciated.
Cheers
Billy












