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?
Big session today. Full breakdown below. Files attached as zip at the bottom.
---
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 CORRUPTION START — stall triggered the same ALDL frame dropout as before. 1,312 consecutive corrupt frames (RPM=5100, MAP=204, BLM=204 overflow values). Not real data.
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.
Code 43 ESC/Knock — NOT real knock:
All Code 43 readings are inside the ALDL corruption block (samples 205–1990). Zero knock detected in any clean driving data. Not a timing concern.
Code 24 VSS:
Hardware ruled out — VSS connector inspected, speedometer works normally. 0x024C confirmed 0xFF in bin. Hypothesis: standalone VSS diagnostic at 0x024D (stock value 32d = 32 MPH), separate from the EGR min vehicle speed at 0x024C. A 32 MPH threshold explains why the code only triggers under hard acceleration. Proposed fix: set 0x024D to 0xFF.
Does anyone know if 0x024D is a standalone VSS diagnostic minimum speed on the $1F? Is 0x024E (stock value 9d) a failure counter threshold?
---
IV. ZIP CONTENTS
• 1985Corvette_24lb_EGR_DELETE_v7_15percen t_reduction.bin — current running bin
• 1F_updated_fixed.xdf — corrected XDF (wrong injector scalar at 0x0E removed per tequilaboy's correction)
• 1985Corvette.adx — datalog definition
• gas_run.csv — full road test datalog (34.9 minutes)
---
Next steps:
1. Set 0x024D to 0xFF — verify Code 24 fix with a hard acceleration test
2. Controlled throttle blip session — diagnose the stall
3. Cold start tuning session
4. Find the correct narrowband O2 sensor for this ECM
Last edited by veiloctane; Today at 02:39 AM. Reason: spelling









