;                                                                     *

;    Filename:	    EC2CL8.asm    11-28-12  ENGINE TYPES A1 - B4  *
;    Date:         6-08-04          Also uses Thermister temp sensor  *
;				Using MPX4250 2 bar sensor (updated 2-13-02)
;			
;    File Version:   UNIVERSAL EC2 CODE *
;                                                                     *
;    Author:              TRACY CROOK                                 *
;    Company:        REAL WORLD SOLUTIONS                             *
;                                                                     *                                    *
;           CHECKLIST FOR ADDING NEW ENGINE TYPE

;		0. ASSIGN A NEW ENGINE TYPE DESIGNATOR.
;   	1. ASSIGN IGNITION & INJECTION BIT NAMES FOR PORT C  (NOT NEEDED, ALL ENGINES USE SAME DESIGNATORS) FCx , FIx
;		2. ASSIGN MOST APPROPRIATE STAT0
;		3. ASSIGN CRANK & CAM SENSOR
;		4. ASSIGN or WRITE DWELL ROUTINE
;		5. ASSIGN KO ROUT.	(ENABLE APPROPRIATE SENSOR INTS)	
;		5A.  ASSIGN IPWC LOGIC
;		6. ASSIGN TP1 & TP2 Int ROUTS (CHECK POLARITY TOO)			
;		7. ASSIGN OR MODIFY A TM0 ROUT
;		8  WRITE NEW TP2 ROUT. DON'T FORGET TO RE-ENABLE CAM SENSOR INTS IF USED
;		8A CLEAR STRF  (USUALLY DONE IN TP2 LIST ROUTINE NEAR END)
;		9. ASSIGN OR WRITE SPDC ROUT
;		10. ASSIGN OR MODIFY CD ROUT 
;		11. ASSIGN AN APPROPRIATE TM2 ROUT.
;		12. HANDLE DEAD TIME CTR APPROPRIATELY. (RELOAD DTCL W/ MAX T2 INT INTERVAL) (USUALLY DONE IN T2 ROUT)
;		13. HANDLE SYNCL&H INCREMENT IF USED (60-2 & RENESIS TYPE CAS )  (USUALLY DONE IN TM2 ROUT)
;		14. Assign an INITIPW value in that routine. (causes lockup if default val of zero is used)
;    Notes:  All non-interrupt Code is written with the assumption that 
;	INTERRUPTS WILL SAVE AND RESTORE THE STATUS OF BSR, WREG, & 
;	STATUS.
;	             *
;                                                                     *
;  
; 6-10-99  BASIC CODE HAS BEEN DE-BUGGED AND IS FUNCTIONAL.  HAVE NOT YET ADDED CODE FOR 
; FUEL FLOW OR OTHER ENGINE MONITOR FUNCTIONS
; 6-16-99  ADDED SERIAL OUTPUT OF ALL ANALOG VARIABLES & STAGED FLAG (SED, SEND ENGINE DATA)
; DATA OUTPUTED IS:  SYSEX (F0) FOLLOWED BY 2 BYTES EACH FOR O2,MAP,TEMP,PGM,MIX & FF.
;  LSB IS SENT FIRST FOR ALL VARIABLES. NEXT, THE CURRENT MAP TABLE ENTRY IS SENT (2 BYTES)
;  NEXT, THE T2 INTERVAL COUNT IS SENT (TPL & TPH)  (USED FOR ENGINE RPM MEASUREMENT)(ADDED 7-4-99)
; THE LAST DATA BYTE SENT IS THE SFLAG, 00 = NO FLAG, 01 = FLAG SET. LAST BYTE SENT IS THE 
; EOX BYTE (F7) TO signify END OF MESSAGE.
;
; 7-4-99 ADDED TPL & TPH TO SERIAL DATA OUTPUT STREAM. (MOVED MEMORY LOCATION OF TPL & TPH TO DO THIS)
; 7-5-99 RE-WROTE TIMER 2 & 3 INTERRUPT ROUTINES TO JUST SET FLAG & LET EXEC HANDLE THEM.
;	 THIS CAUSED A DELAY IN HANDLING IPW CLOCKS (TMR 2) DURING MATH ROUT & CAUSED ROTOR 2
;IPW TO BE EXTENDED WHEN THIS HAPPENED.  MODIFIED  TO EXECUTE WITH INTERRUPTS ENABLED.
;THIS REQUIRED THE USE OF NEW POP2 & PUSH2 MACROS TO SAVE STATUS SINCE IT ALLOWS NESTED INTS.
; 7-6-99  wrote "A" VERSION OF CODE WHICH ADVANCES IGNITION TIMING IF MAP IS < THRESHOLD SET 
;	  WITH PGM MODE 6. 
; 7-9-99  Did some streamlining of interrupt routines to eliminate unnecessary pushes & pops
;	and used some word writes to clear multiple flags instead of bit instructions.
;	changes are marked with  and (PT) (post test) meaning that these changes have not
;	been tested.
; 8-8-99  Flight tests turned up a problem. There is an intermittent engine miss at very specific rpm 
;	settings.  Two examples are; 4040 and 5070 rpm.  Do not know if problem is on injection
;	or ignition side but we suspect ignition. When the single cycle miss occures, the
;	mixture monitor goes lean momentarily. (more oxygen present) Problem occures on A and B.
; #  Decided that the most likely cause was noise from an injector turn off event happened 
;	during the t2  measurment interval causing a bad t2 value.  Implemented the IOF
;	(injector off flag) (stat3,IOF) which is set whenever we turn injectors off.  TP2 rout.
;	will test for this flag and re-do the measurment if the flag is set.
; 8-10-99 code was dead after some "clean up" changes.  Problem was due to our putting in a
;	disable of tmr 0 interrupts in the TP2INT routine.  Nothing ever re-enabled them.
;	Have now tested all changes marked 8-8-99 and (PT) and they are working (pending flight tests)
; 8-16-99 Have flight tested the STAT3,IOF change to eliminate occasional miss at 5070 rpm &
;	verified that this did fix the problem.  Code approved for EC2.
; 9-19-99 Noticed that Voltage on O2 sensor analog channel affects conversion results of the MAP
;	input conversion which follows.  Will try longer delay in CONVERT routine.  (was 4 , now 8)
; 9-20-99  Had to increase CONVERT acquisition delay to 20 microseconds and put a delay of 
;	8 micros between calls to convert to get rock solid performance from ADC.
; 9-20-99  Noticed that dwell was jitering more than normal after last change.  This is due to
;	dwell routine not being serviced during long Analog & math routines.  Inserted check
;	for dwell flag in these routines.
; EC2 SN #201 - 206 shipped with software up to date as of 9-20-99
; 9-30-99  Added one more check of dwell flag to IPWCalc rout to improve dwell accuracy.
;10-05-99  Same as ec2a.asm but is experimental code to try & eliminate intermittent miss around
;	4500 - 4700 RPM.  Cause of miss is unknown but we think it is ignition or injection
; electrical noise interfearing with either t2 interval measurement or ADC conversion.
; In an attempt to fix the miss, we are moving the point that the TUF flag is set.  Instead
;of having rotor 2 trailing plug time  (TM0.3) do it, TM0.2 will do it 15 degrees sooner
;in order to catch the very next t2 after lead plug (& trail plug) fire.  The object is to get T2
;measured before the rotor 1 injector switches off.  I think that was the source of the problem.
;  10-06-99 The above fix is valid but it does introduce another possible problem.  The sooner 
; that MATH routine completes, the sooner T1 interrupts are enabled.  This leaves a larger time
; window during which noise could falsly trigger T1 int.  May try counting T2 ints in an effort 
; to delay enabling T1 int until just before it is to occure..
;  Implemented T2 count method of T1 enable and deleted IOF logic because I assumed it was not needed.
; Flight tested this configuration and problem was no better (and possibly worse).
;  10-11-99  implemented T2 count method of enabling T1 int and enabled t2 int 50 uS after 
; R2 TPF so that we capture an earlier T2 interval AND we added IOF logic again.  Also set IOF
;flag if the injector is turned on (and plug is fired).  Added IOF logic to every conversion cycle
; Analog routine in case noise was affecting conversion.  (DELETED )
;	Found that our T2 count fix was causing IPW instability due to T2 int rout NOT pushing 
;	& poping status.  INCF instruction was altering status bits causing errors when prog.
;	returned from interrupt.  Added push & pop to T2int.
;10-12-99  fOUND PROBLEM CAUSING 6000 RPM CUT-OFF (and probably the intermittent miss)
; Prog Was making calls to Dwell during analog routine.  Dwell was changing the BSR reg to bank1
; 	which caused a problem in CONVERT rout. which required that bank5 be selected.  This problem
;	was fixed by saving & restoring BSR in Dwell rout.  Also found that a bad eeprom would 
;	lock up the processor if we tried to execute a program function. Changed I2cwr to return
; if eebf is set.  Will flight test this version.
; 10-23-99   The problem may be somewhat less frequent but the same problem noted on 8-8-99
; (engine miss at ~ 4040 & 5070) is still there.  Flight Testing shows that the problem is affected
; by mixture.  Miss is more prevalent when at lean mixture.  Miss at 4010 rpm was completely gone
; when running at very rich setting and would return at lean setting.  This may indicate that 
; problem is caused by injector turnoff event since varying the mixture only changes the turnoff
; time of the injectors.  The other possibility is that something is causing the mixture to go
; lean to the point of missing and having it run rich mearly masks the problem. 
; ****	10-23-99   WAS ABLE TO REPRODUCE PROBLEM ON SIMULATOR!!!  
;      	Analysis is that problem is due to timer 2 int routine (which runns with other interrupts
;	enabled) is being interrupted during the decrementing of IPW counters.  If it has rolled over 
;	the LSB and is interrupted before the msb is checked, the timer 0 routine will reload the
;	msb. When timer 2 int routine resumes, it will then decrement msb past 0 and think it
;	is time to turn off the injectors.
; Implemented a fix using flags (inj1 &2) to enable decrementing ipw count by tmr2.  works OK.
;     PROBLEM:  Ignition timing on rotor 2 goes unstable at threshold of 2500 rpm step in ignition 
;               advance.  Also ignition goes haywire at 6666 rpm point.
; 10-24-99  Both of the above problems appear to be due to an erroneous T2 interval measurment.
;      Error cycle capture shows that T2 measurment interval was close to normal just prior
;	to the error cycle where Tmr0 has bad interval.  Somehow the T2 count is being corrupted.
;  !!!!!  Found out how.  There is a documented problem with reading 16 bit values of timer. 
; The LSB can roll over after reading it but before reading the MSB.  So, the LSB must be tested
;  for roll over and all 16 bits read again if it did roll over.  Using the method in the PIC
;	manual to read & test for rollover fixed the problem.
; 10-28-99  fOUND THAT CONTROLLER WOULD LOCK up when program write sw. pushed intermittiently. 
; 	Seems to be only if rpm is over ~6000.  Will do it on any program function.  IPWs are
;	still running but not right.   Don't get 1 per t1 int,  may be 1 every 3 to 8 T1's.
;  I2C timing looks good on cycles when it happens.  Current theory is that write routine 
;	delays exec responce to some critical function.  Problems:  We made a bad choice to 
;  eliminate VT check in T1int rout. This was put back in.  If VT is not valid, T1 will now BRA 
;  TM0.a which is the error recovery routine to initiate a re-start.  We also eliminated the CLRWDT in
;  T1.int rout.  This was preventing wdt from re-starting system since we were getting t1 interrupts.
;  We are also getting TMR0 ints because ipw counters are getting re-loaded.  There is no turn-on
;  of coils however.  This is somewhat of a mystery because tmr3 ints should still be happening.
;  Logical explanation is that Dwell routine is not being serviced because either 1. EXEC is not
;  running or VRPM is not set causing DWELL to exit without decrementing DWL.  
; !!!!!  PROBLEM was caused by I2CWR getting called on very next engine cycle (switch bounce).  
;   Since EEWF,1 was set, i2cwr would wait for it to clear before going on. EEWF,1 would never clear 
;  because DWELL was not getting serviced by EXEC.  
; CHANGE:  have now made DWELL execute as an peripheral interrupt (timer3).  It still executes with other 
;  interrupts enabled.  Also changed PCK routine to NOT set PGMF if EEWR is set.  We also set 
;  EEWF,1 at start of I2CWR instead of end.
; 10-29-99  Still getting eebf after mode 3 inits.  Think we need to block pgm mode after an init.
;  !!!!  Found flaws in table programming caused by eeprom multi byte writes crossing page boundary.
;  Modified I@CWR to split write into two groups if page boundary is crossed.  This made writes
;  last well over 1 engine cycle which locked out exec for long periods. To compensate for this 
;  we put test in tmr3 int rout to check math & cs flags during periods when EEWF,1 is set.
;      FLIGHT TEST:   All functions checkout 100%
; 11-10-99  This is the non turbo version of the EC2 software.  oNLY DIFFERENCE IS IN ANALOG rout.
;	at AN2.  There is no rrcf to divide the adc conversion by 2. It is saved in un-modified form.
;11-12-99  This is the 20B variant.
;       Added TX2L&H (tpl & H x2) for dwell calculation when using single ended coils which are
;	fired only once per engine rev. (LT1 coil & ignitors)  May add this to 13B ec2 for use with 
;	other coils.
; 1-5-00  Changing dwell to 5 MS for chevy coils.  This version called EC20chev.asm only change
; 	is change of constant in CD routine.  
; Updated to 5.5ms dwell 06-11-00
; 6-11-00  updated temp compensation rout. (IPWC.4a) to use 10K thermistor instead of LM34.
; 6-11-00  Added set staging threshold (mode 7) to programmable functions.
; 12-03-00  uPDATED TO USE SLOW SPEED DWELL SCHEME (T2CNT TRIGGERED DWELL)
; 02-06-01 UPDATING WITH LATEST MODS (TIMING ADJUST MODE 8, DEAD TIME CTR, PGM 
;	MISS FIX IN DWELL & rapid accl fix to tm0int.
;     Also changing name to ec20ax.asm 
; 07-13-01  Optomized slow speed dwell threshold.  Updated Al Gietzens unit (#225)
; 02-13-02 Changed dwell to 5.0 from 5.5 ms. & changed to mpx4250 sensor config. (AN2 & 
;03-13-02 added coil off logic to dead time ctr & timer 0 TO
;   Noticed frequent long dwells during cranking.  Added test for VT in TP2 rout for low speed dwell
;  (LSF set).  This eliminated 90% of long dwells during cranking.

; 05-13-02 Adding the folloing comments and some code from ec2axt
;     Added following logic in order to eliminate long dwells during slo speed cranking
;	1. TP1 int sets t1f
;	2. TM0 timeout clears T1F (ovf during t2 timing interval)
;	3. TP2 tests for T1F and does not increment t2cnt if none found (exits instead)
;	4. tp2 int turns off coils open following int after low speed dwell turned them on
;  Looks very effective on scope when turning cas at low speed.
; 05-13-02   Noticed that we were getting some dropped ignition cycles during engine speedup so
;Added some logic to tp2 to insure that coils get turned on during rapid engine speedup
;when engine is above LSF threshold.  Looks very good on scope.  Except that #3 coil
;stays on sometimes.  We miss the ignition cycle (only on three)

; Now realize that a chain of tmr0 events is not the best way.  Lets re-time after every ignition
; event and restart on a tp2 event.
  
; 5-15-02  REWROTE ALL THE REQUIRED ROUTS & COMPILED OK.
;5-16-02  DEBUGGED & CHANGED DWELL CLOCK TO 252 Us FROM 170
;        REWROTE DTCL&H ROUT IN DWELL TO GIVE ACCURATE RESULTS TO COUNT
;	MOVED SET OF ANF TO END OF MATH , CONDITIONAL ON T2CNT <5 SO ONLY DO ONCE PER REV
; 5-16-02 SAVED FROM EC20.ASM (AS EC2A.ASM) TO DEVELOP 13B VERSION OF THIS VERSION (TP2 TRIGGERED)
;5-17-02 COMPLETED CHANGES & DEBUGGED.  cHECKED OUT OK.
; 05-18-02  Changed WRTBL AND ADDED TBLADJ in programming modes. TBLADJ adjusts the current map
;	table entry up or down by an amount proportionate to the position of the pgm knob.
;  Mode 1 is WRTBL TBLADJ is new mode put in mode 9.
; Saved EC2A.asm as EC2M.asm for Mazda coil version
; Changed CD to reflect coil rep rate difference, Devised new logic in tp2 & tm0 routs to 
; control Trailing coil selection (CS1) instead of EXEC handled delay & switch routs.
; Debugged and verified that dwell on CAS is very similar to what the simulator gives.
;  Will install in RVotter & test.
; Prior to installing in RVotter found a deficiency in the new CS1 select scheme.  
; Went back to the old EXEC controlled method.  It is well proven and the 50us delay 
; is not significant as interrups can prempt this delay.
; 06-12-02  Corrected missing pwr up load of IGNADJ. Reassembled & tested OK
; 06-15-02  Getting ready to install in RVotter but looking at possible other reasons for 
; slow cranking.  May be timing of ignition at low cranking speed.  It requires a total 
; delay of 55 deg. when triggering from t2 #12 to ignition.  May be too long.
; Decided to trigger spark delay on next tp2 (1 & 7) instead of (6 & 12) when LSF set <1200 rpm
; Delaying 15 deg. from t2 #1.

; This also required a mod to other tp2 routs.  Study carefully when updating other versions.

; Added logic to dwell, no decrement of dwell count after reaching 0
; Modified spd.d to give more advance  Advance curve looks very nice now.
; Timing specs are now: Crank speed - 1200 rpm=  ~2 deg ATDC timing.
; 1200-1500 is now ~3 deg BTDC,1500-2499=10.625 BTDC, 2500-3599=18.5 BTDC, >3600=21.875 BTDC
; Low Manifold pressure advance will give an additional 5.625 deg (when above 3600 rpm)
; All timing is with default Mode 8 timing. Mode 8 can give up to + or - 9.375 deg
; Installed in RVotter EC2 (#1) Also changed 2k resister in temp sensor line to 200 ohm.
; fLIGHT TESTED THIS VERSION.  	Looks OK.  Seemed to give rich mixture (lowered w/ mode 3)
; 7-31-02  Adding code for BlueMountain interface.  LINES MARKED WITH "BLUE MOUNTAIN" ARE ADDED CODE
; 03-17-03 Made default program width 1 instead of 3.
; 03-26-03 ELIMINAted hard init of parameters if EEPROM is bad.  Now loops on btg of aux ignition output instead.
; 03-27-03 Changing IPWC.2 routine constant from 20 to 17 to lower bottom of MAP table to 19" 
;   saving EC2MBM as EC2M to clean up excess files
;05-01-03  PUT IN TEST FOR VRPM IN DEAD TIME CHECK IN DW ROUT.
;Installed in SN# 440 F. Ziegler
;07-01-03  Updated CD rout to latest constants to give more consistent dwell times  NOT TESTED! (was later tested OK.)
;07-11-03  (copied code from EC2M.asm.   ADDED new mode to INITBL rout.  If coldstart sw is up when init mode 1 is done,
; 	load MAP table in ram and EEPROM from the table in program memory at MAPTBL ($1200)  This data came from N84TC's
;	EC2 Controller, and was pretty good.  If COLDSTART SW is down, do normal INITBL of all 01,00 (no adj) Not tested yet.
;08-06-03  Major change to the MAP table architecture.  The MAP values are nor 8 bits instead of 9 which cuts the memory
;	& eeprom requirements in half.  This made room for a separate table of MAP values for high & low rpm ranges, i.e., 
;	idle range at low MAP uses different table than inflight low MAP table.  Changes are documented in book 4 of 4 in EC2
;	notebooks.  
;08-10-03  Added accellerator pump function to code.  Increases IPW by 25% when MAP jumps by more than .75" in one cycle 
;	at engine speeds below 2400 rpm.
;08-19-03  UPDATED WITH LATEST T2 LIST PROCESSOR FROM EC2A.ASM  COMPILED BUT NOT TESTED YET.
;;  ???????  WHY DO WE NOT DO ANALOG ROUT AFTER ROTOR 2 MATH CYCLE?  ENABLED R2 ANF CYCLE.  MUST TEST  
;08-20-03  Tested r2 anf cycle enabled and it looks OK.  
;Installed new version in N84TC A controller.  Disabled R2 anf cycle and put in B controller.
;Re-enabled R2 anf cycle & compiled.
;08-20-03  Flight tested this version and results were absolutely Wonderful.  As close to set & forget as possible.
;08-21-03  ASSIGNED ENGINE TYPE A2 TO 2ND GEN 13B W/ MAZDA COILS, 0xA1 SAME EXCEPT FOR LS-1 COILS
; REASSIGND R2DIF TO NEW POSITION AND MODIFIED INITDIF ACCORDINGLY.  MAKES ROOM FOR FUTURE USE OF EEPROM SLOT
;  ADDING CODE FROM EC20AX TO UPDATE FOR 20B ENGINES AS ENG TYPE 0xA3. 
;08-22-03  ADDED REMAINING 20 STUFF.  ALSO ADDED POWERSPORT 60-2 CAS VERSION AS 0xA4
;  ADDED EC2.HEX AS ENG TYPE 0xA5
;ALL TYPES COMPILE OK BUT NOT TESTED
;BRIEFLY CHECKED A4 & A1 TYPES & LOOKED GOOD.  CHANGED DEFAULT STAGGING POINT ON A4 ENGINE TO 19" MAP.
; 08-23-03  CHANGED SPARK DELAY AND COIL ON TIME FOR A4 ENGINE TYPE (PS) FOR THE LS-1 COIL CHANGE.
; DEBUGGED ADVF LOGIC & IMPLEMENTED ON OTHER MAZDA ENGINE TYPES AS WELL.  CHECKED OUT A4 & INSTALLED IN CLYDE ROSENVALLE'S UNIT
; 08-24-03  ADDED ADVF CHANGE TO SDC ROUT ON A5 ENGINE (HEXADYNE)  checked out function of A5 , looks good.
; 09-02-03  ADDED GEO ENGINE AS TYPE 0xA6.  COMPILED OK BUT NOT TESTED.  THINK IT IS READY TO TRY .
;   STILL NO JOY ON CLYDE ROSENVALL'S PS ENGINE (A4 TYPE)  WILL SEND HIM A NEW CONNECTOR TO WIRE AGAIN.
; 09-03-03 DEBUGGED GEO CODE & CHECKED OUT.  LOOKS GOOD EXCEPT FOR SHORT DWELL AT LOW SPEED RANGE . MAY WANT TO START LS DWELL
; SOONER. (adendum, we gave up on Clyde's project & refunded money.  Controller returned)
;09-04-03  ADDED B CONTROLLER LOGIC TO USE 30 DEG EARLIER TIMING ON BACKUP CAS IF PRESENT.  USER MUST GROUND THE DLC SW INPUT
; IF ENGINE IS EQUIPPED WITH BACKUP CAS.  TP2 INPUT IS CONNECTED TO MAIN CAS IF NO BACKUP CAS INSTALLED.
; ALL FUNCTIONS TESTED & OK.  BURNED CONTROLLERS FOR RICH SWIDERSKI'S UNIT # 434
;09-17-03  ADDED ENG TYPE 0xA7 (V6 W/DISTRIBUTOR).  COMPILED OK BUT NOT TESTED YET.  WILL UPDATE PAT OBRIAN'S UNIT WHEN TESTED
;09-18-03  A7 (V6) VERSION DEBUGGED & APPEARS TO BE WORKING OK.  ADDED DWELL CONTROL TO THIS VERSION TO GIVE ABOUT A 3.5 MS 
;DWELL TIME.  UNDER 360 RPM, DWELL IS CONTROLLED BY TP1 HIGH TIME ONLY.  REDUCED DEAD TIMER FUNCTION TO 900 MS/RPM.  READY FOR 
;FINAL TEST.
;09-27-03  V6 Version tested on sim and looks good.   Installing in Pat O'Gradys unit #278
;10-01-03  A1-A3 & A5 VER.  ADDED CLR OF TPH&L IN KO ROUT SO THAT EM2 GETS KNOWN VALUE WHEN ENGINE STOPPED.
;10-06-03  ADDED CALL TO ANALOG & PCK TO DWELL ROUT WHEN ENGINE STOPPED (VRPM =0)
;10-20-03  ADDED OPTION TO USE OLD MPX4115 MAP SENSOR FOR UPDATING OLDER EC2s.
;11-03-03  fOUND AN ERROR IN WRWIT & TBLWRT WHICH CAUSED WRONG TABLE WIDTH TO BE SELECTED.  CORRECTED IT AND COMPLETELY 
;	RE-WROTE THESE ROUTINES.  CHECKED OUT & VERIFIED. WHAT A BITCH.
;11-07-03  Found error in R2DIF rout.  Wrote updated value to old eeprom address.
;	Noticed that in A2 engine we have a max eng rpm of ~7400 when the coil dwell goes away.  Not a problem yet but need to
;resolve for Renesis engine.
;11-08-03  Wondering if dwell problem is underflow in CD rout.
;11-09-03  Found dwell problem. Was in TP2 rout 42 & 48 where it turned off coils assuming they were left on from previous 
;         cycle.  Deleted these instructions in A1 (ls1 coil) & A2 (mazda coil) 13B engine types.
;11-09-03 Found error in dwell rout where DTCL times out we had a MOVLB BANK 1 instruction.  Should have been a BANK1
;   (no space between BANK & 1).  Assembler translated this as a 0 instead of warning.  Caused port B.7 to be set as an
;output with a low on pin.  This made it look as if the coldstart switch is on all the time.  The bank select instruction
;  was redundant anyway so it was removed.
;11-10-03  Perry Casons' chips were burned w/ wrong MAP SENSOR selected.  He has MPX4115 so we burned new chips & sent to him.
;11-14-03  Added more careful range checking to temp adjust in ipwc.4 (for lm34 & thermistor routines)  Noticed that 
;  thermistor gives more compensation than lm34 sensor. LM34 - Measured ipw change from 68F to 140F @ .5 ms w/ 3.2ms nom ipw
;  Updated Bill Eslick unit #206 as EC2ALM
;  Added mpx4115 value to initipw rout for mapsensor=1
;  11-19-03   ADDING RENESIS ENGINE AS 0xA8 ENGINE TYPE
;  MUCH RENESIS COMPLETED , WORKING ON TP2 EVENT LIST.  iMPLEMENTED CONTINUOUS ENGINE SPEED ADVANCE & VAC ADVANCE ON THIS VERSION
;11-20-03  GOT GOOD COMPILE ON 0xA8 RENESIS CODE.  NOT TESTED.
; ADDING SOME PROVISIONS FOR BACKUP SENSOR ON RENESIS ENG.  NOT COMPLETED YET
;WORKING BUT DWELL IS TOO LONG & PGM FUNCTIONS DO NOT WORK
;11-30-03  Moved project to MPLAB-IDE (communicates w/Pickstart+ OK).  MPLAB did not want to work with Picstart + for some reason.
;After correcting a path problem, MPLAB seems to work well
;12-01-03  BURNED FIRMWARE FOR Steve Rosine EC2M (#450)  and Douglas Lomheim EC2A (#451)
;12-13-03 Working on 0Xa8 (Renesis) version.  Found problem with bad dwell & fixed.  Only problem noted now is MAP advance only does one
;step at ~19" MAP.
;  Additional problem noted when crossing LSF threshold when we miss an ignition cycle.  Found logic error in TP2 rout. Was skipping 
;normal cycle when DDF flag set. tp2.1430 rout.
; SPDC for 0xA8 is not computing rpm ignition delay properly.  Always 0 for some reason.
;12-18-03  nO PROGRESS in a full day of effort.   Program functions do not seem to work as noted befor.
;FOUND THAT 0xA8 VERSION DID NOT CLEAR THE STRF FLAG WHICH LOCKS OUT PROGRAM FUNCTIONS.   hAVE TRIED SEVERAL PLACES TO PUT BCF STRF
;BUT ALL TRIED SO FAR FaILS OPERATION OF ALL EFI FUNCTIONS.   DEPRESSING FUCKING DAY.
;12-19-03  Put bcf strf in last tmro cycle on rx8 version and this allows programming function.  Must have been really fucked up yesterday
;Now, why won't rx8 advance routine work?
;AFTER MUCH TROUBLE SHOOTING, FOUND THAT MULT rout returns results in RES0-3, not aargh&l as we thought.  All is wonderful again.
;Vacuum advance now works as expected and we also added turbo boost retard of 10 degrees between 30 - 62" Hg.  
;Working toward replacing all other SPDC routines with the new rx-8 spdc.  Only one not changed over is 0xA7 V6 engine.
;Have briefly tested the a1-a3 controller with a8 spdc but not others.
;   Note that mode 6 is no longer needed or used.  This also eliminates the variable 
;12-29-03  Flight tested latest version of software and found that idle was not as smooth with max vac advance so added an algorithm
;	to reduce vac advance to zero by the time rpm goes down to 1300 rpm.  Full advance returns by 2500 rpm.
;  Have noticed a tendency for the mixture to be somewhat rich in cool weather indicating that the temp compensation is overcompensating
;  Changed the scale factor in the thermistor temp comp rout (IPWC.4) to 4 (25%) instead of 3 (33%) 
;12-30-03
;RX-8 CHANGES  Added inj6 constant to init staging point to 20.1" MAP  and flags ipwc rout to divide mapl&h by 3 instead of 2.
;This is needed because we intend to drive the two sets of secondary injectors with one set of secondary injectors.  This is a quick & 
;dirty methode of doing it.  If it later becomes necessary to control the two sets of injectors separately, we will "stage" them
; by driving both rotor secondary A injectors with one driver and secondary B injectors with the remaining driver.  (batch injection
;on secondaries).   This will probably be keyed on rpm rather than map (if we ever do this)
;******  RPI SAYS THEY ARE USING A 4 PORT ENGINE WITH 4 INJECTORS 295 CC/MIN PRIMARIES/600 CC/MIN SECONDARIES.  THIS IS PERFECT!

;12-30-03  NEED TO MAKE THE INITTBL FUNCTION DO THE DEFAULT INIT ON INITIAL POWERUP WHEN NO INIT CODE IS FOUND.
; 01-07-03  Added conditional statements to ipwc rout to use turbo flag to change map table spread.  Compiled OK but not tested.

;RX8 OIL PUMP INJECTION CHANGES
;01-18-04  Copied ec2.asm to develop oil injection pump version of software for RPI RX8 engine.  OPC.bas (written in PBP)
;  will be the oil pump controller software running in B controller socket.  
;  NOTE!  WE DETERMINED THAT THIS WAS GOING TO BE EASY TO ROLL INTO STANDARD EC2.ASM SO RESAVED IT AS EC2.ASM
;Will save this before any changes
;  as ec2RPI.asm for the A controller version.  OR  we may have it auto-sense the controller and react appropriately.
;Plan to use the following pins as I/O for this version.  J1-8 stepper1, J1-9 stepper2,  J1-12 stepper3,  J1-13 stepper4,
;  J1-4 (t2cas) stepper position sense.
;  Oil pump controller Protocol   On power-up, Oil Controller (OPC) will seek position 0  (reverse for 60 steps, advance to 52 & check for
; position sw on.  OC will then position at step 30 (1/2 full) and await commands from controller A.  OC commands will be command code
; $FD, xx, EOC (end of command $FF) where xx = target step for oil injection pump.
;01-22-04  next step is to decide on how to derive the step number from engine conditions.  I was thinking that we would generate an index
;based on manifold pressure and rpm.  But it just occured to me that rpm is already taken into consideration by 
;the oil pump itself.  Maybe all we need to do is send a step number relative to the manifold pressure (!).  Slightly modify
;TPTR table pointer in use & send it whenever it changes?
;This certainly simplifies things.  Could we just send the lsbs of map table?   we have assigned a new variable (step) which could be used.
;THIS APPEARS TO BE FULLY COMPATIBLE WITH THE EM2 INTERFACE - NO PROBLEM WITH "CLASHING" WITH SERIAL COMMANDS.
;01-29-04  FOUND THAT IN TURBO MODE WE DID NOT CHANGE THE SUBTRACTED CONSTANT IN THE MAP POINTER CALC IN IPWC ROUT.  NO BIG DEAL
;01-31-04  Measured RX-8 coil saturation time at 3ms. and added rx8coil constant to assemble for this dwell time. Looks OK.
;02-02-04  Doc @ RPI called on CAS position.  Turns out that waveforms are shown 180 degrees out of phase in Mazda documentation.
;   We can use the 0xA8 program as-is by reversing  rotor 1 & 2 in the instructions.  
;3-3-04  Adding engine type A9 (EA81-x with 60 - 2 CAS) for Ron @ RAM performance.  Rotor 2 timing will be used for cyl 1 & 2 (front cyls)
;  and rotor 1 timing for cyl 3 & 4 (rear cyls) 
;HAVE ADDED A9 TO ALL CALLOUTS FOR A4.
;MODIFIED TM0 ROUTS FOR 0xA9 ENG.  mAY NEED TO THINK ABOUT NEED FOR 4 INDEPENDANT COUNTERS FOR INJ TIMERS IN CASE THERE IS OVERLAP BETWEEN THE 
;TWO GROUPS OF INJECTORS. 3-6-04  Why did I say this?  Two groups should only need 2 timers.  If they overlap, so what? must have been tired.
;3-6-04  Recieved data from Robert Bollinger (rob@mum.edu)
; regarding the Ford V6 controller he wants.  It uses Crank & Cam sensors.  Crank is 36 - 1 teeth 
;with missing tooth at 60 deg BTDC.  Presumably the tooth after the missing tooth is at 50 deg BTDC.  The cam sensor gives a pulse @
;15 deg ATDC, which he describes as "the beginning of the compression stroke on Cyl. #1."  This is obviously wrong.  He may mean power stroke.
;  YES, DID RECEIVE CONFOMATION THAT HE MEANT POWER STROKE.
;Debugging A9 controller.  Do not get anything on 1st attempt.
;03-07-04  Found an old error in Dwell rout for eng type A4 (and now A9).  Was supposed to reset TOLD & SYNC counters on a dead timeout but
;did not.  
;Found reason for 0xA9 type being dead.  We were leaving T0CKIE enabled in init rout.
;Fixed problem with A9 type not being able to run over 50% IPW duty cycle. Forgot to skip load of inj timer when skiping injection start.
;A9 looks OK now.  
;03-08-04  Adding hysteresis mod to stagging IN IPWC ROUT  
;Hysteresis looks very effective at eliminating jitter but have Debate as to whether we should have more (3) or less (2) as amount to have.  Concern is that 
;the two sides of the hysteresis curve could fall on two different map table entries
;UPDATED THE N84TC MAP TABLE TO LATEST VALUES FROM AIRCRAFT.
;03-11-04  ADDED 4 MS DWELL FOR 0xA9 ENGINE
;03-14,04  ADDED MOD TO INIT STG TO MAKE IT SAME FOR MPX4115 AS MPX4250 (UPDATING BILL WILLSON UNIT #229)
;03-17-04  eliminated +25% boost in A5 ENG IPW. ADDED ESTIMATED INIT MAP TABLE TO HEXADYNE ENGINE AND INCREASED MODE 1 RANGE TO 50%
;03-21-04  Would like to insure that map table does not use same address on both sides of stage point.  IMPLEMENTED THIS BY 
; DECREMENTING MAP POINTER BY 1 IF SFLAG IS SET  (UNDER IPWC.2A)   TESTED!  WORKS GREAT!
;03-22-04  Updated Bill Wilson #229, Cy Williams (450 & 445) and  Al Gietzen's units. 
;03/30/04  Mark Steitle's upgrade chips 20B, turbo
;04-02-04  Hexadyne Unit #446 loaded.
;04-23-04  Initialized port B DDR bits to all inputs to make this compatible with 18F6680 chip jumpers on latest batch of ec2s.
;5-15-04  Started adding engine 0xAA  Ford V6 w/CAS
;  FOUND REASON WHY EA81X WAS NOT WORKING..  WE HAD SENSOR FED TO TP2 INPUT INSTEAD OF TP1.
;  THIS BRINGS UP ANOTHER POINT.  SHOULD WE CHANGE ALL PREVIOUS CONTROLLERS TO THE "CRITICAL SENSOR ON TP1" ARRANGEMENT?
; 5-16-04  finished v6 code but not tested.  (TESTED OK 5-18-04)
; 5-19-04  STARTED ENTERING 0xAB ENGINE TYPE (LS1 V8)  (WROTE TM0.4 ONLY SO FAR, USED 20B & V6 TM0 ROUT)
; ELIMINATION OF VRPM USE IN ALL CONTROLLERS !!!!!  NEED TO CONSOLIDATE SOME STATUS BITS AND IT LOOKS AS IF VRPM IS AN UN-NEEDED ONE.
; 5-22-04  Test elimination of VRPM on A2 engine type. Use VT instead ON ALL ENGINES EXCEPT A7.   SEEMS TO WORK WELL.
; 5-23-04  Programmed EC2A chips for Chris Sargent update(272) & John Gibbons (457)
;  Have noticed that it is very difficult to eliminate engine surge at stagging point.  How to fix?  Need to know the true problem.
;Is it  mixture difference on two sides?  Is it lagging ipw when going across threshold?
;Problem sequence:
;  1. Eng running below threshold, slightly lean. 
;  2. RPM sags due to lean condition.
;  3. MAP changes to higher address due to MAP increase
;  4. Richer mix at higher MAP address causes engine to surge
;  5. Engine surge causes MAP to fall selecting lower MAP table address
;  6. Leaner mixture at this address caused engine to sag
;	jump back to 1 & repeat

;Fix:  richen mixture at lower step or lean the mix at higher step.  
;  5-24-04 Ron reported not enough advance in his engine so we recalibrated advance curve on 0xA9 engine type  May want to do this on 
;  Ford V6 as well.
; 05-31-04  Thinking about how to implement a different stagging scheme.  
;06-04-04  Updated Tommy James (#202) with latest EC2Mlm software


;06-08-04  sTARTED CONVERSION TO 18F6680 CHIP

;Hardware changes needed.

;1.  Since the 18F chip only has 1 USART and we used USART 2 on 17C chip, we will need to jumper TX1 (pin 42) to the old TX2 line (pin 40)    and  
; 2.  RX1 (pin 43) to RX2 (pin 41)      This is on controller A  (U10).

;3.  Controller B (U11)  will need  RX1 (pin 43) to RX2 (pin 41) jumpered.

;4.   There is no interrupt input on 18F chip pin 44  so we will need to jumper pin 44 to pin 59 on both A & B controller chips.
; (U10 & U11)

;So far, these are the only pins we have identified which require changes in order to use the 18F chips.
;All other changes can be handled in software.

;Port C will change to Port D	(ignition & injector control port)
;Port E will change to Port G    (mode switch bits (0-3)
;Port D will change to Port E   (only used on controller B for DTC & DLC)
;Port G bits 4 & 5 will change to Port A bits 4 & 5  for A/B sw detect and controller detect.
;Port B bit 6 (pgm wr) will change to  Port C bit 5

;06-08-04 LINE 1264 COMPLETED
;06-09-04  ADDED SECONDARY INJ DIFFERENTIAL CODE FOR NEW MODE 6
;06-09-04  MUST DETERMINE IF SERIAL BUFFER IS IN BK0 OR ELSEWHERE AND CHANGE SERIAL ROUTINES APPROPRIATELY (MAY NOT MATTER SINCE
;  FSRx REGISTERS ARE 12 BIT NOW
;  LINE 1556 COMPLETED   USING FSR2 INSTEAD OF FSR0 IN ALL ROUTINES
;06-11-04 COMPLETED THROUGH LINE 1578  NEED TO DETERMINE SERIAL BUFFER ASSIGNMENT AND REVIEW SERIAL ROUTINES TO VERIFY ACCURACY
;NEED TO DECIDE WHERE SERIAL STATUS WORD WILL RESIDE  BK0 OR BK1.
;06-13-04  Moved ser status word (AND ALL OTHER GP VARS) to bk1, SIBUF moved to 300 - 3ff,  Made SOBUF 400 - 4FF  (new)
;MAP table (MTAB) is now in BK 1 (200 - 2ff) and has room for expansion.
;  STOPPED RECHECKING AT 1196
;06-14-04  STOPPED AT 1525 WRMTBL WHICH NEEDS RE-WRITE FOR NEW TABLES & SUCH.
;06-15-04 UPDATED WRMTBL,  STOPPED AT 1542
;STOPPED AT 1623
;06-16-04 STOPPED AT  2172
;06-18-04 STOPPED AT 2374
;06-19-04 STOPPED AT 2728
;06-21-04 LINE 2926
;06-22-04 LINE 2958  FIXED ALL MOVFPs
;06-23-04  LINE 3530
;06-27-04 LINE 3684  NEED TO CHECK WRTBL CAREFULLY FOR OLD & NEW ERRORS. USED I2CWR INSTEAD OF I2CWRA IN OLD PGM
;07-11-04  LOOKS LIKE WE ARE USING EEPROM ADDRESSES ABOVE WHAT IS VALID IN EXTERNAL EEPROM.  DO WE INTEND TO USE EXTERNAL EEPROM OR
;ARE WE GOING TO SWITCH TO INTERNAL?  MUST DETERMINE THIS.
;LOOKS LIKE CHIP IS NOT SHUT DOWN DURING EEPROM WRITE SO WE SHOULD BE ABLE TO USE INTERNAL EEPROM.  wILL REQUIRE A COMPLETE RE-WRITE OF I2CRD & I2CWRA.
;WILL HAVE TO LEARN TO USE ON-BOARD EEPROM TOO.
;9-10-04  Have re-written i2cwr, now named EEWR rout
;   I2CRD RE WRITTEN, NOW NAMED EERD
;RE-WROTE RCVMAP & WRMTBL DOWN TO LINE 1566 TO USE NEW EEWR & EERD ROUTS.
;Looking at ULEE and see that the engine data list is not necessarily updated in controller B eeprom!!  look at B routine that recieves data.
;9-27-04 CORRECTING VARIOUS ASSEMBLY ERRORS.  CHECKED ABOVE POSSIBLE PROBLEM AND DID NOT FIND IT.
;10-12-04  Correcting misc errors.  Edited init routs starting at initbl 3748.  Stopped at RDIFL 3896
;10-13-04  dELETED ALL MOVLR INSTRUCTIONS.  stopped at 3942 tp1int
;10-14-04  Will try to update all routines changed after 06-08-04 when this conversion was begun.
;  changes associated with secdif seem to be incorporated  (added correction to secdif function (wroong address)
;REPLACED ALL OF DWELL WITH EC2 CODE.  UPDATED TO 18F CHIP FORMAT.
;10-16-04 Replaced all TP1,TM0,TP2 & TM2 routs with latest code from EC2.asm as of this date.
;Replaced all of SPDC rout with EC2.asm rout.  Now need to re-convert it.  Converted to line 2795 (finished SPDC conversion)
;Replaced or updated IPWC routines.  
;Now starting to rework starting at TP1.int  (line 3861)
;10-17-04  STOPPED AT 5257  REMEMBER THAT ALL CRITICAL EXTERNAL INTS ARE MOVED TO INT0  "DOC" INDICATES PLACES WHERE INT WAS CHANGED.
;11-23-04  STOPPED AT 5926 
;11-24-04  FINISHED!!  NEED TO CHECK SETUP FOR INTERRUPTS AND DETERMINE IF WE NEED TO DISABLE GIE DURING PERIPHERIAL INTS.
;   MAKE SURE PERIPHERIAL INTS ENTRANCE USES PUSH ON STARTUP. 
;  FIXED ERROR IN WRTBL ROUT.  mAY NEED MORE SCRUTINY.
; INITBL @ 3689 NEEDS CHECKING.  INSTRUCTIONS ARE DIFFERENT ON NEW CHIP TABLRD ON OLD AND TBLRD ON NEW 
;STILL NEED TO CHECK FOR ALL TIMER & INTERRUPT SETUP DONE
;11-25-04  NOTE!  A/B detect (selection) is now on an analog input.  Need to have AN4 input analyzed for which is selected.  Bit 7?
;  NEED TO THINK CAREFULLY ABOUT THE INTERRUPT VECTOR ROUTINES IN VIEW OF CONFUSION ABOUT DEFFINITIONS OF INPUTS
;02-12-05 HAVE ADDED KNOCK SENSOR INPUT TO INT2 SO NEED INT HANDLER FOR THAT.  IT WILL BE ASSIGNED AS A LOW PRI INT.
; GOT FIRST GOOD ASSEMBLY.  DOA AS EXPECTED.  SER OUTPUT NOT RESPONDING, NO IGN OR INJ OUTPUTS.
; found missing pullup on MCLR line.  Fixed timer 3 problem.  Now hung in sit N spin eeprom read/write trap
;02-15-05 Much debug & refinement in eewr.  Found very subtle bug in pusha/popa .  MOVF in popa was corrupting status after restoring it
;A1 is working OK now. Mode 3 works OK.  Mode 1 does not work.  Fixed mode 1 & 9 (had lfsr 2,0X200+tptr (logic error)
;02-17-05 MUCH DEBUGGING ON AB V8.  ALSO FOUND MANY INSTANCES WHERE TIMER 0 REGS WERE NOT LOADED OR READ IN PROPER ORDER FOR 16 BIT
;R/W OPERATION.   Major mind fuck here .  Still didn't work, found error in tmr0 load after thorough check, etc.  Screw it 4 now.
;dAMN.......  Had left diagnostic instruction in exec rout from previous debugging (unlabeled!!!) AB works now.
;All but AE types compile OK.
;02-18-05  Adding PRIMER function
;02-25-05 ADDED 0xAE SVX.  dEBUGGING.  FOUND THAT WE ARE KILLING THE RxF FLAG AT 10 DEG BTDC WHICH IS TOO SOON IN SOME CASES.  FIND
; A BETTER SCHEME,
;02-26-05  Changed schemes but that was not the problem.  Turned out to be an improper 'a' field in the clrf tmr0L,1 instruction should
; have been CLRF TMR0L,0.  Aarrrgh.  Now works nice though.
;  NOTE!!!  the High pri. int entrance on tm0ints now stops the timer so it is no longer necessary to stop it later.  Only the svx 
;version has been tested with this change.
;02-27-05  SVX B CONTROLLER DOES NOT WORK.  *******  PCK ROUT CHANGED TO MAKE CONT A THINK IT IS B   ********************
; Problem was that although int0 was not enabled, it still set the int0if and the handler would see it & respond to it when the 
;int1 interrupt occured. Put in a test for int0ie in handler and went to int1 when not enabled.  This fixed the problem.
;Now the fc5 & fc6 coil control outputs do not look right.
;02-28-05  Found that the port bits set up as analog inputs can be used as digital output bits BUT that bit operations on these 
;bits must be carried out on the port LATCH register, not the regular port address.  ie, BSF LATF,2,0 not BSF PORTF,2,0
;This solved the bad fc5 & fc6 outputs mentioned above.   SVX NOW CONSIDERED COMPLETE.
; 03-08-05  Have determined that we need to increase IPW when going to stagged injection when rpm is > 3000 (high rpm range)
;03-10-05  fOUND WRONG ORDER OF LOADING TMR0 IN 0xA8 CODE.  
;03-11-05  Found error in WRTBL rout causing mode 1 to always write to adr 0 in MAP table in low rpm range.  Caused by difference
;  in MAP table addresses compared to old 17C chip version.  BTFSC sb/ BTFSS in this version.  SVX controller NEEDS UPDATE !!!
;  Noticed that we miss ignition cycles every ~ 450 ms when RPM is below LSF rpm.  pROBLEM TURNED OUT TO BE A MISSING ,0 after a 
; CLRF TMR0H instruction in t2str rout causing it to clear some mem location in ram rather than the timer.
;Flight tested the new version with staged boost ipw.  Worked well but had to decrease IPWCR by 16.  Required almost full range of 
;map table adjustment at > 24" Hg map.  I am thinking that we should use Mode 6 to reduce secondary IPW instead of boosting ipw when 
;staged.  But that is not ??  Confusing.....
;  Problem:  When cruising at low throttle (near staging point)  the mixture goes lean at the point where we transition from non-
;staged to staged injection.  This prompted us to increase ipw by 25% when staged AND rpm > 2900 rpm.  But, this gave us a very rich mixture at
; low throttle (overcompensated) and required reduction in IPWCR. to get mixture right at low throttle.
;  This in turn required using almost full rich map table at high throttle.  Think we should reduce ipw boost to 12.5% when staged. Then
;increase IPWCR back to original.
; MADE THIS CHANGE.  I noticed that a 12.5% decrease almost exactly compensates for the 11.26% change in ipw caused by the IPWCR change we 
;made (4 steps (16 total 142 - 126) (Leaving initcr 142)
;03-13-05  Tested 0xA1 and found it did not work.  Found many of the powerup init routines had error where FSR2 was not designated
; as access bank (0) causing errors.  The controller in N84TC and the SVX controller sent to Wayne Owens have this error.  Must 
;update for this and the WRTBL error above.
;03-21-05  ADDING 0xA7 ENGINE.  Stopped after adding tm0 toutine
;03-26-05  During checkout of an A6 controller, noticed that ignition & injection stopped momentarily when changing mode sw
; between mode 7,8&9.  A9 does same thing.
;Problem turned out to be noise induced on adjacent pin to PORT g,3 (mclr) which was reseting processor. Changed config. memory to
;disable mclr since we don't use it anyway.  Doing this caused the program to NOT initialize properly since it would start running
;immediately after programming was finished.  So,  we re-enabled MCLR pin to eliminate this problem.  The noise on MCLR pin was only
; on the test board anyway. ********   THIS CAUSED A PROBLEM ON NEW REV-2 BOARD (HAS MCLR CONNECTION) SO WE NOW DISABLE MCLR  ************
;3-31-05  STARTED DEBUG OF A7.  nO GOOD.  FOUND MISSING BCF T2F IN T2END BUT STILL NO GO.
;4-1-05 dtcl not loaded, dtcl not long enough (added alt bit to extend time), tm0 routs called in wrong order, missing initipw.  (all fixed)
;4-2-05  Added valid timing indicator to PORTF,2 (on J1-9) for use as diagnostic aid.  Tested OK  Programmed Dale Cose unit #474
;DEBUGED 0xAD SUZUKI 4 ENGINE.  MADE CHANGE TO LOAD TM0 SOONER TO GIVE MORE IGNITION ADVANCE RANGE.  LOOKS GOOD.
;4-5-05  mODIFIED SUZUKI TO NOT USE CAN SENSOR.  WILL USE WASTE SPARK SYSTEM.  LONG RANGE PLAN IS TO DETECT CHANGE IN RPM AND SYNCHRONIZE INJECTION
;4-23-05 ADDED SELECT LOWEST OF TWO MAP READINGS FOR 0xA5 ENGINE TO FIX IMBALLANCE IN CYLINDERS AT LOW RPM.
; 4-26-05 Changed basic advance on A5 eng to 30 deg BTDC.  26.25 was too conservative.
; 4-28-05  Found error in ipwcalc rout.  If map table generation goes past end (63) it did not stop but overflowed.  Corrected and 
; refined algorythym.
;  **** EE upload did not work correctly.  Found error in sexecb.  Corrected.  Reloaded #523 sent to J Slade
; loaded Wally Drenan unit.
;5-1-05  UPDATING EC2 #205  (Geir) 4115 MAP SENSOR, LM34 TEMP SENSOR, MAZDA COILS.  fRONT PANEL BROKEN FOILS.
;FOUND THAT THIS NEW FA VERSION DOES NOT WORK WITH MAZDA COILS (A2 VERSION) MUST FIX.
;5-2-05  fOUND MISSING RETURN INSTRUCTION IN 0xA2 TM0.0 TOUT.  WORKS ok. Updated Gier's EC2 SN 205.
;5-31-05 Updated Rich Martin to A1 Turbo
;6-1-05  Updated Don Dunbar's #289 to A8-LS1
;6-2-05 Added mapsensor as bit 1 of enginfo word
;6-3-05 Updated bill Schertz unit #256 to A1-4115 config.
;6-4-05 Pgmed Jason Day (AB) unit #526 Looks OK.
;6-19-05  Updated Bulent Alive's unit
;6-27-05  Updated Dave Staten unit #507  (A1 turbo)
;7-5-05   Updated Robert Tilly unit #510 (A1 Turbo) & replaced wrong choke.
;7-11-05 Found problem whenever mode sw was changed causing PGM3 line to switch.  It is adjacent to MCLR pin on chip.  Noise problem
;is assumed.  Problem goes away when MCLR is disabled in Config bits.  Will leave MCLR disabled.  There is a note on port g about
;MCLR being disabled.  (THIS PROBLEM WAS FOUND & DOCUMENTED ON 3-26-05)
;07-11-05  Found that setstg rout was not writing to eeprom correctly because WSAH was not being set to upper address value (0)
; One of the setdif routines was also missing this step.  These routines were corrected.
;07-12-05  Did tweaking on lgsec conditions.  removed lgsec from 50% map table adjust list.  Added new map table for lgsec &
; changed initipw & initstg for lgsec version.  Still have no answer for disable injector situation. 
;07-13-05  Have Steve Brooks unit in for repair. Reported A controller dead.  Worked OK on bench. Updated it to latest rev software
; and installed jumpers for 18F chip.  Unit failed to run on A at one point but began working before I could determine what was cause.
;  While in malfunctioning condition it was communicating OK with the EM2.  May have seen missing T1 or T2 at controller chip.
;7-17-05  Changing stage point to be a map table address rather than map sensor data based.  This insures that the stage break
;is synchronous with a change in map table address.  Did a quick test but not looking exactly right.  Will debug tomorrow.
;7-25-05  Completed & flight tested stagebreak w/ map table address.  OK.  But, removed hysterisis mod, not needed.  
;8-13-05 Found that the power-up timer was disablewd in configuration table. The staging 
;tied to MAP table introduces some hysteris by itself.  I am beginning to think that a damper in the MAP connection is needed.
;8-17-05  NEW HYSTERISIS MOD TO ELIMINATE STAGE JITTER AND AVOID OPERATIING IN WRONG MAP REGION.  (WHAT IT SHOULD HAVE BEEN :)
;  THIS MOD ELIMINATES THE NEED TO IMPLEMENT THE SECONDARY INJECTOR CONNECTION ON EM2.
;08-23-05  On test of EC2 rev2 production board, found that EEPROM was not initialiazed on first power up..?  
;Fixing initstg errors  (WRONG VALUES FOR TURBO)
;08-26-05  Adding acceleration flag set when going from staged to non staged.  5 - 7 revs only.  Hoping to eliminate hesitation at that point.
;  Testing shows that accf threshold still too low.  Find out why....... Testing wrong version : )
;08-27-05  FOUND ERROR AT 6610 IN ACCF FUNCTION  WAS ACCNT,0,1 INSTEAD OF ACCNT,1,1  FIXED IT
;ELIMINATED TEST OF RPM W/ CLEAR OF ACCF IN ALL TP2.END ROUTINES.  NOT NEEDED. (PENDING FLIGHT TEST)
;08-28-05 	Chips were not initialiazing properly on first power up after programming.  Only first function in eeinit was executed.
;Added long delay after each init function and that appears to have fixed the problem.  
;0xAC EJ25 ENGINE HAS BAD DWELL. MUST DEBUG BEFORE PROGRAMMING
;0xA9 HAD BAD INJECTION ON FI3&4.  Caused by no differential inj on these inj.  Added no dif to tm0 routines.  Looks OK now.
;8-31-05  Rev2 boards used on SN #514,515,519,520,522,525,527,528,534,535,536,541,542,543,  and all units delivered after this date.
;Checkout of 1st A7 (ej-25) version shows error in documentation vs this code.  Firing order is wrong in coil driver outputs.
;9-1-05  CORRECTED CODE FOR EJ-22/25.  PROGRAMMED UNIT #525  
;09-03-05  DEBUGGING TP2 OF 0xAF DIST V6 
;9-04-05  AF STILL SUCKS, MUST REST.
;FOUND MANY ERRORS, NOW WORKING AT LOW SPEED, NO DWELL AT NORMAL SPEED.  
;ELIMINATED SET & CLEAR OF PORTF,2 IN DWELL ROUT, DON'T KNOW WHY I DID THAT
;9-27-05 Completed AF & sent to Pat O'Grady.. 
;09-28-05  Checking Wayne Smith (20B update) and found longer dwell.  Had 42 instead of 43 as constant in CD routine for A3 & AF.
;Corrected & burned 18F chips for #477.  Looks good.
; Pgmd new chips for Wayne Owens unit #484.  Had pgm mode select bits shorted to ground (ESD possible?)
;10-6-05 Added s2flag & s2th for use with dual staging threshold used on LGSEC engines  (other logic not added yet.) This will
;requireS additional rout added to most all rotary engine TM0 routines.(PUT FIRST EXAMPLE IN TM0.0 ROUT @ LINE 4328, MUST ADD MORE)
;Will also require new mode 5 to set stage 2 level (S2TH).  Will delete rotor 2 dif mode from 2 rotor engines.
;10-08-05  Added all needed logic for stage 2 & bench tested.  Looks very good!  Only question is the step at stage 2 too big?
;Ready for flight test.
;10-09-05 Added ENGINFO bit 2 as LGSEC FLAG.  May want to make this user changeable later.
;10-10-05 New stage 2 feature did not work well on first test.  Lots of oddities and difficulties.  Ran very lean on both primary & secondary
;injectors.  Ran very rich when stage 2 came on line at 24" Hg.  Need to evaluate MAP table data and try again.
;Made several changes to stage 2 logic and made it (STAGE2) independent of LGSEC.  LGSEC Must be set if STAGE2 is set however.
;Have not solved the problem of not having fuel flow (OR TACH!) on EM2 when primary injector is not being fired. May have to connect 
;the INJ2 input on EM2.
;10-11-05  Latest stage2 test was a failure.  Now was much too rich at stage 1.  It was too lean on previous test. ????? Why?
;Did find one code error in IPW stepback at stage 2 but that should not have affected stage1 results.  Also increased MAP adjust to
;50% instead of 33% in order to deal with wider mixture swings.  Mixture was too rich at minimum MAP table setting at stage1.
;CONVERTED LGSEC & STAGE2 to user selectable configuration bits.  INITSECDIF (P-U MODE 6) will now set or clr lgsec if cold start sw is on.
;INITSTG(P-U MODE 7) will now set or clr stage2 if cold start sw is on. PGM knob determines set or clr depending on MSB (left or right)
;NEW CONCEPT.  Changing secdif to be defined as stage 1 differential and adding S2DIF as stage 2 differential.  
;MODE 6 will now set stage 1 delta when MAP is <22" Hg and set stage 2 delta when >= 22" Hg (defined by map table addresses)
;This is only the case on controllers with stage2 enginfo bit set.  Others will remain the same.
;Added 2 more bytes to the SED serial cmd to send the new eng config data to EM2. 
;Debugged and all looks pretty good (on the bench)
;10-15-05  Getting sit & spin on 2nd & later power-ups.  Caused by EEBF being detected at init.1.  This may be due to the major reorg
; done for the user selectable features above.  Eliminated EEBF check at init.1.  EEBF may be an obsolete flag on 18F6680 chip.
;10-19-05  Above problem caused by STAT4 byte (with EEBF) not being cleared before using.  Moved clear all user ram to head of init rout.
;Flight test of Stage2 version :  Better but very unstable at stage2 point around 24".  May be due to stagging wobble so may need
;to add hysterisis at stage 2 point.  Study IPWC.0A for how to do.
;10-21-05  Found cause of controller glitch when switching to controller B.  Vcc is glitching down to 4 volts upon energizing relays.
;This caused brownout detect to masterclear the 18F chip since it was set to detect at 4.2V.  Now setting Brownout detect at 2.7V.
;This brings up the question of whether we should enable brownout at all.  ???  Glad to have found this!!!!  See glitch down to 
;13V on Vdd but I guess the 7805s are lousy at transient responce.  
;10-24-05 Made decision to disable brownout detect.  Not doing any good unless we do some research on it.
;Noted some initbl errors on latest batch.  Increased timeout from 20 to 25 in eewr rout & problem went away.
;10-26-05 Looks as if the stage2 changes caused both rotor differentials to get loaded with the rotor 1 delta.  Corrected code
;to load r2 w/ unaltered IPW.  I was not seeing much responce to rotor dif on last setup.  This may have been the cause.
;11-17-05  Testing wayne Owens SVX controller and NDF.  Did find that INITIPW did not have case for 0xAE (svx) so it went to default 134.
;added 0xAE to list and made it same as EJ25.
;11-25-05  Troubleshooting Rodney's EJ25 (0xA7) controller.  Found that installation guide had several errors (Cam/Crank sensors reversed, etc)
;Corrected documentation.
;12-06-05  Increased primer pulse from 10 to 20 ms.
;12-10-05  Added coil and injector diagnostic modes in engine not running condition.  Mode 1 & Store button push enters injector 
;diagnostic mode. Mode 8 and Store button push enters coil diagnostic mode. Fires injectors or coils at ~50 cps rate.Exit is via
;changing mode selection or power off.  Will not exit with attempted engine start.
;12-31-05  Adding 0xB0 20B w/ Renesis CAS.  Complete except for tp2 int handler.
;FOUND MISSING dwell & ignition events at transition to normal vs low speed ignition.  Modified ddf & lsf dwell logic
; FOUND A FATAL ERROR IN THE DDF HANDLING AT LOAD TMR0 EVENT.  wE DID A FINAL LSF DWELL ** BUT DID NOT LOAD TMR0 !!!  *** FIXED THIS
;Checked 0xA8 for this error and found that it was properly handled there.  
;Now need to find a way to increase range of ipws on SVX engine as it appears to need a much larger range (goes lean at high MAP)
;01-07-06  Found that SVX was not in the list of engines that get 25% boost in ipw (as most piston engines are) Added it. This should 
;help with the lean mixture at higher throttle.
;NOTICED THAT ROTOR EGT DIFFERENTIAL WAS DIFFERENT WHEN STAGED THAN UN-STAGED. Added new variables to engine data list for unstagged
;rotor differentials.  Old values will control staged rotor difs, new values (R1DIFA & R2DIFA) will be for unstagged. 
;Works on bench OK.  Must test on 84TC soon.
;01-27-06  Found fatal error on SVX B controller logic.  Was not reseting t2count to 1 on count 73. Was not killing r1f on B
;at sync time as required.  Looks OK now?
;01-28-06  Problem with this theory is that we were having the problem on controller A, not B.  Wayne verified that A is selected when 
;indicated on front panel and that sensors are wired to the appropriate inputs on the conrroller 
;01-29-06  Found that SVX controller had no caps on input circuit open collector outputs.  Should not have had an effect but ?
; Found that two of the input LPF ckts had .01 instead of .001 caps installed.  Unknown results?  
;Changed all the above to current values.  Also changed A controller to 5k input resistor. Left B as 2k.
;02-06-06  Adding logic for o - 200 engine as 0XA9 engine w/ backup crank sensor at 24 deg atdc. Input on int1. NOT TESTED!!!!
;02-07-06  Crap! French corrected the backup sensor position to 18 deg before primary.  Must revamp code again.
;New scheme will have SYNC reset T2CNT to 57, then t2int will intercept t2cnt = 61 and reset it to 1.  Done, not tested.
;Built #602 EC2-AD.  Code was dead, found missing definitions for 0xAD at interupt vector.  Tested OK after adding defs.
;02-08-06 Pgmd #234 EC2-A3 for Robin (update)
;Tested 0XA9 with CONT option.  Looks good!
;02-13-06 Made test version of SVX on new board (prototype) for Wayne Owens.  A controller only and Does not use temp sensor.
;  Seeing significant need for rotor differential mixture on Renesis installation. No proof but this may be due to the different
;length runners on the front (as in car) rotor.  The mixture is requiring almost full range richer on it at cruise rpm (5300)
;At lower rpm the mix differential is almost zero.  The odd thing about this is that the runner is SHORTER on front rotor.
;02-14-06 Reviewing distributor v6 for Pat O'Grady  only possible problem is too short delay between dwells.  Changing to 3 ms dwell.
;02-20-06 BUILT NEW SVX CONTROLLER FOR WAYNE OWENS. Moved SVX SPDC load to 50 BTDC from 40 to give more advance range.
;04-24-06  fOUND ERROR IN PGM MODE 6 HANDLING  (SECDELTA)  THIS ERROR ELIMINATED MODE 6 ON ALL CONTROLLERS SINCE STAGE2 WORK 
; ON OR ABOUT 10-10-06  SHIT!  FIXED IT NOW.  STAGE2 WAS A TOTAL FAILURE, WE SHOULD PURGE IT COMPLETELY.
;05-03-06 Found that AF V6 engine had no init on IPW.  Added it to the A9 handling.
;Found that 0xAF Cold Start worked as expected.  Pat complained of engine stop on cold start on (accidentally hit it)
;Also found that at low rpm, positive edge of ignition pulse is ~37 deg BTDC, similar to the ign advance Pat sait he saw.
;Maybe MSD ignition system Pat has fires on positive edge of signal instead of trailing edge?  This would explain a lot.
;Added BREW flag to improve accuracy of 3rd gen timing.  Set for 3rd gen 13B engines.
;05-30-06  Found problem when burning chips for A5 engine.  IPW goes very unstable at rpm over 3000..
;problem does not show up if programmer is hooked to board?????  Very Strange.  (caused by interim changes that did not take into account
;the Hexadyne engine  (corrected in code)
;Changed initstg to give 16.0" Hg instead of 15.25" on same size inj. 
;07-19-06  Did major overhaul of CONT spdc calculations
;Programmed A controller and verified all timing specs to be in conformance w/ spec.  Now must verify B controller.
;07-20-06 CONT & BUSENSOR option tested OK on B controller also.  All tests OK
;Want to re-visit the rpm & map advance on all engines in view of the elegant fixes on CONT option.
;Changed ENGTYPE to ENGCODE for commonality w/em2 nomenclature
;Found out we have never been putting ENGCODE into engine data frame ram. POOP  Fixed this in initialiazion rout.
;07-22-06  Looking at Al Gietzen's EC2 and noticed that the controller would occasionally fail to power up properly from a quick
;cycling of the power switch.   Sometimes got EEPROM failure flag and sometimes failure to establish com w/ EM2 and other times
;controller would be dead entirely.  This was eliminated by enabling the brown-out detect and setting it to 2.7V.  I will 
;make this the default setting from now on.  I had disabled it some time ago when I found that it would sometimes trigger when switching
;from A to B controller due to noise.  The brown out level was set at 4.2 volts at that time.  2.7V should eliminate the false triggering.
;Noticed an error (forgot to xfer constant to eetmr) in the NORM rout during initialiazation.  Called eedly instead.
;08-03-06 Looking ar Renesis ign timing and it looks funky.
;08-04-06  Fixed that problem by doing all calcs in an EXCEL spreadsheet (EC2constants.xls).   Now we hav a problem with short 
;dwell times when engine is accelerating at rpm from 1000 - 2000.  Will look at doing 
;Found that an ignition timing delay of 15 gives bad dwell results.  14 is OK.  DO NOT KNOW WHY!!
;08-05-06  Found several reasons for the bad dwell.  When retarded, the spark timing would extend into the T2 start timing.  
;Moved t2str & t2end to a later t2 count.  The t2 event testing for tm0 still running was killing the cycle.  Eliminated test 
;for tm0 running.  These things fixed the problem.
;  Changed Mode 8 to + or - 10 one degree steps instead of + or - five 1.875 degree steps.
; Have only changed A8 engine to the new timing scheme.
;08-08-06  Many refinements to new timing scheme and associated spreadsheet.   Approved for all rotary installations. 
;08-10-06  Re-programmed N84TC controller (A&B) to test new schemes.  Also removed most all stage 2 logic.  Refined initstg levels
;and matched to the lgsec map table.  We should do the same for non lgsec map table.
;08-11-06  Planning for closed loop mode / auto program.   Use cold start sw for auto program?  & Mode 2 selected?
;08-18-06  ADDED ALL ROTARY ENGINES TO NEW RPM & MAP ADVANCE SCHEME. Programmed new unit for Al Gietzen. 20B
;08-30-06  Added A9 engine type to new spdc scheme.  Need to update CONT advance constants before programming any more.
;09-03-06  Added independant injection control to A9 engine type instead of batch fire.
;09-06-06  Added VDET option.  Compensates IPW when Bat Voltage changes.  Requires addition of 15K / 5.1K volt divider to pin 26.
;10-02-06  Added list of coil dwell times & referenced then in CD rout for more reliable control of this.
; Planning rev limiter function.
;10-03-06  ADDED REV LIMITER ON ENG A1,4,5, 8 & AB   mUST BE ADDED TO TM0 ROUT FOR EACH ENGINE TYPE 
;10-04-06  increased amount of Boost retard (all engines)
;10-25-06   Reversed secondaty injector relay control on 20B ver.  Secondary injectors turn on when relay energized now.
;10-30-06  FOUND BASIC REASON WHY WE WERE GETTING ODD IGN & INJ ON 0xB0 ENG.  The check for timer 0 still running in T2 low speed ign events 
;handled it by stopping timer 0 because we thought it was a bad event due to engine speedup.  This was causing bad t2
;counts because the tp2 interval was apparently still being timed.  We removed these tests and everything looks good.
;	Main point here is that several other versions use this same logic and it may cause a problem there.  Must look into this.
;	********  LOOK FOR BTFSC T0CON INSTRUCTIONS.  NOTE:  WE HAD PREVIOUSLY REMOVED THIS STUFF FROM A8 ENGINE.
;  We may not have a completely accurate picture of why this malfunction occurs.  It occurs when the count 29 t2 event coincides 
;  with the timer 0 spark timing event, not the t2 interval timing event.  We had incorrectly assumed that the spark event will
;  always have completed by that time (10 deg BTDC).  The actual timing is around 6 degrees BTDC before rpm & vacuum advance takes place.
;  We may want to start the rpm advance sooner on the 20B because we expect to be cruising at a lower rpm with that high pitch prop.
;10-31-06  Updating Gier Andersons EC2 (#205) with 4115 sensors & noticed that timing was much advanced.  Found error on EXCEL
; spreadsheet entry.  Forgot that the sensor value is divided by 2 in the analog routine for this sensor type. 
; Found error in Turbo retard routine of SPDC. Was not transfering constant to BARGL before calling DIV rout. 
;11-09-06  gETTING FALSE DETECTION OF SYNF1 ON B0 VERSION WITH SIG GEN INPUT.  CAN'T FIND PROBLEM.
;Found that input was overloading on prototype ver 2 EC2 board.  Spaced sensor further away to temp fix.  Found wrong val resistor
;for R47 which made B controller worse.
;11-10-06  Added minimum tp2 pulse rate noise detection to rx-8 style sensors, also killed SYNF at tp2.29 for B0 engine.  This 
;appears to have fixed the problem.  May want to implement these features on other engines.
;11-11-06 Programmed #634 (0xAD) after adding it to new spdc method.
;11-17-06  Added VDET feature to N84TC controller for testing.  
;12-06-06  Added bu sensor option for 0xAD engine & tested.  Many changes to INT0/INT1 routs so all controllers must be re-verified.
;12-13-06  Found error in AB ext int handler.  B controller not handled!!  Corrected.
;			Same story on a1 - a3,  fixed.
;12-14-06  Another revamp of interrupt handler.  Check all controllers carefully!
;Found reason why RF causes controller A to go rich.  RF bypass on MAP sensor is too far away from part.  May even cause a resonant 
;condition.  When bypass is added at sensor, problem goes away. !!!  Will now add this part to all controllers.
;12-24-06  *****   Have noticed an occasional miss on 84TC. Not sure if it is the result of controller anomoly but will look at code 
;for possible problems.  Decided there was a high likelyhood that tm2int could be interrupted by tp2 during sync update and that 
;tp2 could then interpret the possible low sync value as noise, causing a system reset!!!  Added disable of tp2 (int0) ints during sync
;update in tm2int rout. ****  NOTE   **** that this will have to be updated to disable int1 on controller B when redundant crank sensor is added.
;12-27-06 Updated N84 TC and found that we needed 166 in mode 3 to get mixture rich enough during staged operation.  Then 
;MODE 1 had to be near minimum when not staged.  OAT was ~44, was that causing the problem?  Controller B worked great on this occasion.
;12-30-06  Have added LS2 AS engine type 0xB1 TO ALL FUNCTIONS used by LS1 (0xAB)  This eng will use the factory sensor which is a 60-2
;tooth type but in a different position.  Have not modified tp2int routine for the new timing yet. 
; Completed changes for LS2 engine (0xB1) 
;01-04-07  Got B1 working on A controller but not B.  Very strange symptoms.  Tracing events through t2 handler but not getting
;anywhere.  Too sleepy. 
;01-08-07  dOH!  We were forgetting that int0 gets set even if it is not enabled in extint rout.  Now B works OK.
;01-11-07  Need to have a more agressive turbo retard function when we get time.
;01-12-07  Working on R. Bolinger V6 controller to make more range in ipw over map range.  Some work has already been done on this.
;  HAVE SIGNIFICANTLY INCREASED DYNAMIC RANGE AND ADDED AA ENGINE TO THE 50% MAP TABLE ADJUSTMENT LIST.
; Noticed slightly more jitter on A controller IPW than on B.  Could be due to Vdet.  (Later determined that jitter not related to Vdet)
;01-13-07  Need to spend some time on closed loop & auto-tune capability.
;01-25-07  Added rev limiter to A2 engine  updating Jim Maher controller#224;
;02-20-07  ELIMINATED SFLAG SENT TO EM2 ON NON-ROTARY ENGINES.
;03-02-07 Started work on new Lynn French version of CONT option A9 eng based on his latest request.  Not good yet.
; Added msb of dwell time to CONT option and NO FUCKING JOY.  (no dwell above lsf speed)
; Modified spdc test of rpm vs onedegl to comprehensive test of msb instead of just testing for zero. (still no joy)
;03-04-07  MAJOR REVAMP OF CONT option DWELL rout, now will start OK at high rpm but we loose dwell if rpm drops below lsf and 	never  recovers.  probably due to a problem in CD?  Still no advance either.
; Corrected errors in 16 bit CD routines & dwell looks OK but now we loose ignition at over 250 rpm (lsf point) MP advance appears to be working well at all rpms.
;Old spdc advance calc still works OK.  New sucks.  Lets try another engine.  A1 still works fine.
;CONT NOT GETTING ANY ADVANCE UNTIL MAX RPM REACHED!
; Found several errors, Main was using over 7 bit divisor in DIV routine.  Added a 16/15 bit div rout (DIV1615) and used it when needed.  all working well except that advance is excessive when at low rpm and low manifold pressure. 
;ADDED MAPRPMSTR MAP ADV RPM THRESHOLD PARAMETER TO SPDC MAP ADV ROUT.
;LOOKING HINKEY THERE MAY BE A PROBLEM W/ DIV1615  WE SUBED 0 FOR LSB IN SOME INSTRUCTIONS.  MAY NOT BE OK.
;3-07-07  Found error , used dec # without D'  '.  much tinkering, fixed rpm threshold.  Working very well. Reprogrammed L. French unit. Installed new snubber (17 ohm rsistor)
;3-07-07  Installed 17 ohm snubber in N84TC controller.  Required that injector flow rate be set much higher (was 178, now 220) Flight test found bad engine miss at high throttle.  Bench test found that the controller lost ignition and injection at around 5500 rpm !!!  Now researching problem.
;03-08-07  NEVER FOUND EXACT CAUSE OF HIGH RPM PROBLEM WITH LARGE IPWCR CONSTANTS BUT HAVE IMPLEMENTED IPWX2 FLAG TO DOUBLE THE 
;GIVEN IPW FOR A GIVEN IPWCR.  rEQUIRES A LOWER INITIPW VALUE IN THAT ROUTINE.  NOTE THAT THIS IS ALL ASSOCIATED WITH THE NEW SNUBBER CIRCUIT IN INJECTOR DRIVER CKT.  WE NEED TO IMPLEMENT THE SNUBBER ON ALL FUTURE UNITS.
;
;03-10-07 The exact cause of the high speed engine miss was found.  In the TP2end routine there was a check for minimum SYNC count
;	that was too high for the low clock rate being used with the snubber fix.  The count check was eliminated because we do not know that it was necessary.  I think it was a precautionary addition because there was never any evidence that false tp2s were being received.  Note that we did later find that we were getting spurious int0s when we cleared the tin0 flag after calling the service routine.  Moving the the clear to before the call fixed the problem.  The reason for this is still not clear.
;
; ******  CHECK FOR SUITABLE IPW O ALL FIRST ENGINE TYPES AFTER THIS DATE.   ********************
;NEED TO EDIT A3, B0 & SIMILAR ENG TYPES FOR 2 BYTE DWELL COUNTS
;ADDING 2 BYTE DWELL TO A8 ENGINE AND ALL SCREWED UP   MUST FIX
;MADE ALL ENGINES AND ALL CASES USE 2 BYTE DWELL SYSTEM
;03-09-07  Strange problem found on A8 engine after 2 byte dwell change.  Was getting false tp2 ints.  Moved clear of int flag
;	to before call to int handler instead of after.  This fixed the problem but don't know why.  All looks good now though.
;Must re-compute all engine EC2 constants using spreadsheet prior to any future programming.  A8 and other rotary engines are done.
;03-10-07  FLIGHT TEST IMPRESSIONS ON SNUBBER FIX.  Controller was 'flyable' with no adjustments at all.  Most MAP corrections were positive indicating that an even lower ipwcr clock speed could be used.  All were well within correction range however. Main anomoly was stagging flag sent to EM2 appeared to be erratic. The fuel flow was also erratic, probably due to the same thing. Functional staging on the EC2 itself was correct and no special programming around the staging point was necessary.  
;  **** FOUND REASON FOR STAGING FLAG ANOMOLY.  HAD S2FLAG STUCK IN STAGING FLAG WORD AND EM2 WAS CONFUSED BY THE RANDOM DATA.  ELIMINATED S2FLAG IN STAGING BYTE.  BIT 0 IS ONLY BIT USED.  This should fix the fuel flow anomoly on the EM2.  EM2 will still require recalibration.
;	There was some indication (slight bucking) at idle stop while inflight that may have indicated too much advance.  Would like to implement something that would reduce MP advance when engine rpm was < 2000(?) rpm.  (CHECKED & IMPLEMENTED ON ALL ENGINES @ SDC.6)
; Moved all old rpm & MP advance routines to end of file and commented out.
;03-19-07  Found a potential problem with new lower LSF rpm where dwell can be lost during acceleration at low rpm.  To fix this we implemented a new flag (DSF, dwell speed flag) that we would use to keep using the hardware triggered dwell (TP2 event) up to a higher rpm until dwell could stabalize.  The problem with this is that in some engines  (RX-8 CAS egines, B0, A3), the low speed dwell event also kicks off the load TMR0 event.  How to fix?  change all of them to only turn on the dwell?  problem is, this could potentially eliminate all the dwell time when the advance gets high.  Damn!
;Eliminated use of DSF in all but AB & B1 engines untill we can insure proper implementation.
;To solve problem on AB / B1 engine, set dsf to 2000 rpm, lsf to 540 rpm and advanced low speed dwell TP2 events by 6 degrees (one count).  Looks good on bench.
;03-20-07  Added new dsf dwell events to B0 20b engine.  Must be checked out.
;03-21-07  Checked out new version of A9 and looks OK.
;03-22-07  Much work on 0xB0 engine.  All good except we get extra inj cycle on r1 & r3 when transitioning through lsf point.
;Very confusing.  Looks like we get delayed inj cycle when going through lsf point.  Can't tell why.

;03-24-07  PROBLEM HISTORY    Problem was what looked like late injection when engine went from <lsf speed to > lsf speed. Problem caused by failing to clear the rotor flags (r1-3f) in the low speed ignition routines.  This was originally done by the timer 0 routines which were formerly called by tp2 routines during LSF speeds.  We changed to similar routines embeded in tp2 but forgot to include the clearing of rotor flags.  Stopped calling the tmr0 routs because they terminated with retfie 1 instead of return.  TP2 routines return to the calling external interrupt which then does a retfie 1.  We were afraid that the premature retfie would cause problems if there were pending interrupts.  With this resolved, B0 is the most stable controller to date in terms of predictable dwell and injection.
; 03-25-07 Working on A1 eng.  Not working on new dsf/lsf scheme so setting both thresholds to 1200 rpm.  Works OK with that setting.  Will work on it more later.
;03-28-07  Checking out A9 version & looks good after much debugging.  Key was to copy the injection routines from tm0 to the lsf ignition routines in tp2. and to use low speed dwell up to the dsf point but do injection & ign timing via tmr0 after lsf goes away. Make sure the btg alt is also done in tp2 lsf routs.   Approved for shipment.  3 units for RAM performance.
;03-30-07  Updated Elden Yates EC2-A1.  Lowered dsf & lsf to 1000 rpm & it looks OK.  Could we simply lower both to the new target and say OK?  Probably.  We do have the 16 bit dwell timers in place.
;04-01-07  Checked out 0xAD version and edited it for proper dwell at all rpms.  Looks good. Updating Vassili box.
;04-03-07  Forgot to document the snubber changes implemented around 3-11-07  In response to some complaints and comments from Steve Boley, he and I found that the injector clamps on the drivers are causing delayed closing of the injectors.  By cutting the connection between the clamps and +12, we could add a single snubber that would fix this problem.  All controllers made or updated after 3-15-07 have included this change.  The history of change is found in the EC2dev file.
;Changed snubber on N84TC from 17 ohm snubber to  51V Transorb and IPW had to be increased 38% (115 to 159) Bottom end od MAP table (around idle) had to be jacked up as well.  This area would see the biggest % change in effective on time so it makes sense.  Updating Lynn French unit to latest request.  Looks pretty good.  I think we see that the DDF logic is no longer needed sinc dwell on time is kept up until dsf and timing generated dwell overlaps it since it starts at LSF rpm.
;04-12-07  Found that A1 needed larger ipwinit value (~150)  We need to check all engines for ~ 75% duty cycle @ full power setting from now on.
;04-13-07    Found that A2 was out of date and not compatible with table driven setup.  Updated it by eliminating the ROF logic and delaying the tp2 time measurement period by 1 tp2 count.  Appears to work well but we need to be alert to possible bad software shipped w' any possible recent A2s (do not recall any though). Will check A1 for later tp2 measure as well.
;04-14-07 A1 CHECKED AND TP2 INTERVAL MOVED IN SAME WAY.
;4-30-07  UPDATED EC2 #537 (SAM HODGES) for snubber, VDET & MAP sensor RFI.  
;05-03-07 CHANGED ORDER AND DEFINITION OF BITS IN ENGINFO BYTE.  USEFUL FOR FUTURE REFERENCE WHEN UPDATING SOFTWARE.
;05-05-07  Altered input circuit of early EC2 for use with RX-8 CAS.  562 ohm & 7.5V zener for Mark S.\
;05-04-07  Added selectable RX-8 / LS1 coil dwell on A1 and A8 engines.  Uses Mode 8 power-up program with cold start on.  Program knob position determines which is set.  Left of 12:00 sets RX-8 dwell (2.6 ms) and right is LS1 dwell (4.8 ms).  Tested OK
;05-07-07  Debuged A7 controller for new version.  Found that the cranking speed of this version was ~245 due to long T2 periods.  Added DTCL load to t1 rout & reduced min rpm to 157.  Acceptable.  Also tested all factors on ignition & advance and added rev limit.  Programmed #655 (Rick Johnson) unit.
;05-09-07  Added 0xB2 CORVAIR type.  Not finished yet.
;05-10-07  Completed b2 & tested.  Pgmed #643 Wm Wynn
;05-11-07  Eliminated all ipw boosts for piston engines due to driver snubber change.  
;Revamped A9 to work as ej25 w/ 60-2 trigger w/ EMT timing   MAY NEED TO UPDATE THE SCHEMATIC TO SHOW THE PROPER COIL / CYLINDER CONNECTIONS.
;06-15-07  Started Eagle 540 development for Marv.  needs lower clock rate for the 90 deg TP2 rate vs 30 on A1 engines.
;Looked simple until I realized we can't use tmr0 for ignition timing.  Will have to use tmr1 for that.  Problem is it does not have same prescaller as tmr0 (/8 is maximum pre scale.)  Willl multiply sdl&h x 4 to compensate.  Should giv min usable rpm of 120.  
;06-15-07  Completed 0XB3 but not tested.  Compiles OK
;   **********  MUST COMPLETE LSF DWELL LOGIC.  HOW DO WE DO LSD?    **************************************
;06-17-07  Do we have to do lsd at all?
;  We are absolutely hung on TM2 rout which appears to be constantly setting it's interrupt flag.  We can't stop cycling on it.
; Problem caused by IPWRC not being initialiazed.  Forgot to put new value under new engine code in initipw rout.
;now getting injectioon but no dwell triggers.  check this tomorrow.
;06-18-07  cHANGED B3 TO 180 DEG DWELL SCHEME.  
;06-21-07  Most working Ok but timer 1 looks like getting random ounts instead of calculated spark delay.
;sEE NOTES ON TROUBLE SHOOTING.  mOVED T1INT TO LOW PRI BUT STILL NO JOY.  fuck.
;06-25-07  Found some wierd interactions between timer3 and timer1.  When we change ccp1 setup from B0 to A0, timer1 can set IF but still can't control tmr1 period from its tmr1H&L registers.  
;07-14-07  Have solved the mystery of timer 1 never setting int.  Now using tmr1 for dwell and tmr3 for spark delay on b3 engine will probably change over to always using timer 1 for dwell on all engines at some point. 
;08-01-07  B3 engine completed.  Works amazingly well considering the factors against it.
;08-09-07  Checking 2 recent A9 controllers thar Ron reported backfiring. Found that the cylinder banks were reversed.  How? Do not remember changing them.  Updating the units and checking that install guide matches current program.
;08-10-07 ADDED 0xB4 HONDA V6 TM0 ROUT. mODIFIED FROM B0 & A3
;08-12-07 Considering addition of an RPM spread of MAP table to give better resolution & tuning of low rpm mixture table.  
;How to make it work and be backward compatible with earlier EM2 code?  Is it really necessary?  Could we fix the need by just lowering the threshold of the rpm threshold on map table?  Or could we simply add one more layer to the map table? i.e. 0 - 1600 rpm map to 0 - 31 1601 - 3000 map to 32 - 63 and 3001 - 9999 map to 64 - 127.  I like it! 
;Saving this code as backup before doing any other updates.
; Added 3 level map table (TRIMAP OPTION BIT) and can't get it to work.  Looks like tph&l is being corrupted at various times.  Loking at it via EM2 on data dump shows it going to zero often.
;DISCOVERED THAT ALL 3 ROTOR ENGINES ARE NOT WORKING CORRECTLY.  THE DWELL IS VERY SCREWY.  MUST FIX BEFORE ANF FURTHER PRODUCTION.
;Found that ROF logic was screwing up A3, looks OK after removing it in tp2 rout.
;in B0, eliminated dsf & lsf in tp2end.  Look at it fresh now & note that some coils & injs look OK.  Dwell is now correct for most of range
;08-16-07  After much work and refinement, the B0 engine is working well and the a3 engine is also close to final checkout.  The main problem with the B0 eng was that the tm0 ignition event was very close to the tp2 event which started one of the 30 degree t2 periods which stopped and zeroed the timer 0. (this was at 10 deg BTDC.)  T2 period was moved out from this to eliminate the conflict.  Also need to standardize on the ddf and dwell scheme used in this version.  it is almost bullitprof.  Only miss occurs when engine speeds up suddenly and sufficiently for the dwell on event to be beyond the ignition time on the ignition event immediately following the speedup.  Only happens above dsf rpm.  This is probably not an issue in real world terms. 
;  The problem is related to the dwl ddf logic.  It is not killing the correct cycle.  
;WHY never have the late dwell problem on rotor 1?  Answer:  we do, so don't chase that rabbit down the hole.
;08-17-07	Found that A3 engine blows up dwell above ~ 4000 rpm Happens when timer0 times out ahead of a t2 event. (HAD OLD TEST CODE IN.  OK AFTER REMOVING THAT.)
;***************  ADDED NEW ACCELERATION COMPENSATION ROUTINE TO TP2.END ROUTINE IN A3 AND B0 ENGINES.  WORKS EXTREAMLY WELL!
;It detects an increase in RPM and adjusts the active dwell counts to compensate for the speedup. Very nice. This is the solution I've been looking for for years.  This eliminates the need for DDF logic.  The added code in the tp2.end routine is significant but it occures at a time when no other critical timing events are taking place so it should have no impact on timing accuracy.  TRIMAP logic has also been debugged and tested on the bench.  Flight tested OK  08-18-07
;08-18-07  Implemented RPMMAP option to map the MAP table from 0 to 31 as a function of RPM when MAP is < 13" Hg AND RPM < LRPMMAP. wILL FLIGHT TEST THIS VERSION TOMORROW
;08-19-07  ADDED ALL ZEROS TO TRIMAP&&RPMMAP MAP TABLES
;Flight tested RPMMAP option with good results. Increased IPWCR to 162.  Anomolies:  rpm map seems to require different setting on ground and in-flight.  Not a big factor but noticible.  Also, range of map table adjustment was not quite enough in rpm range.  The new ignition program seems very smooth. Not a single 'skip' that sometimes occured with earlier program.  Acceleration from idle was flawless.  
;Removed the 12% IPW boost above 2500 rpm in IPWC and increased IPWCR from 162 to 182 and compensated the map table entries for lgsec in the appropriate places.  Flight tested after these changes and forgot to load the MAP table with alternate table so flew with all zeros.  Did not even realize that I had forgotten to load alternate until well after takeoff.  Performance was amazingly good and only anomoly was slight leaness at very low throttle and richness at high end but was usable at all throttle settings with mixture control at 12:00.  
;08-22-07  While updating the 0xA7 engine code for trimap, discovered that the low speed dwell rout had an error which reversed the coils for CYL 2 & 3.  Corrected prior to shipping David Russel unit #659.
;Found that new trimap A9 eng lost ignition & inj.  below LSF speed.  Corrected this prior to shipping any new units with trimap.
;Programmed test unit for B0 version and noticed that it would not begin generating timing until rpm reached a min. of 132 rpm but once running it would work down to 100 rpm.  Need to find the reason for this.  It was not the timing of strf or the fact that dtcl&h timer was not running.  
;Problem was due to no appropriate RxF being set and TM0 clearing status when none found.  looks OK with tm0 just returning without doing anything if no r flag set.
; Somewhere around this date we identified a problem with the ground layout on the PWB around the area of XDCR1.  I think this was the cause of the RFI susceptability of controller A that we compensated for by putting the capacitor across the output of the A MAP sensor.  Will start putting a ground jumper in this area from now on.
;08-26-07  Did TRIMAP mods on 0xA1 engine & bench tested.  Looks very good.  Updated Bob White's unit (sn 423)
;08-27-07  Trimap and TBI changes for B2 put in.
;08-28-07  Raised MP limit for using RPM map table.  N109TC 20B could have MP above 13" at 2000 rpm.
;UPDATED THE 0xAB & 0xB1 ENGINE DATA FOR TRIMAP. MADE LS1 & LS2 SAME MAX RPM ADVANC TIMING PER JASON DAY.
;REWRITE OF IPWC ROUT TO CLEANUP & SIMPLIFY.  IT WAS WAY TOO MESSY.   NEWIPW FLAG ADDED TO TEST NEW CODE (NOT TESTED YET!!!!)
;08-31-07  ADDED INITIPWRNG TO ADJUST THE NEWLY ADDED IPWRNG PARAMETER.  
;This parameter sets the offset between MAPH&L and initial IPW.   The higher this value, the greater the dynamic range of IPW vs MAP
;It should be set to control the min ipw at the expected min MAP.  Typically, piston engines have lower min MAP than rotaries so they require a different value.  In general, set the ipw to about 1.4 ms at min MAP.  8" for piston, 10" for rotary
;Power-up MODE 2 is used to initialize the value of this parameter.  Replacing Mode 2 with ipadj to adjust this parameter.
;Power-up MODE 9 is now used to do the copy A to B function.   (must change all installation guides!!!!!!!!!!!!!!!!!
;Checked out all new functions on AB & B1 engines & looks OK.  Programmed unit 665 & 666 for Jason Day.
;Completed adding TBI version of Corvair (TBINJ) but too tired to test.   updated ign & timing constants list before testing.
;09-02-07  Mark Stietle reported severe electrical disturbance when his 20B was in mis-fire mode.  It ocured to me that the stagging relay opening and closing non-synchronously might be generating noise.   ?.  Can we switch it synchronously?  Staging is detected in the ipwcalc routine which happens 3 times per rev.  What happens if we switch during an injection cycle?  At stagepoint of 19"-20" w/ default values in IPW prior to staging is 10 ms!
;  %%%%%%%%%%%%%%%   CHANGING SPEC ON STAGING RELAY FOR 20b VERSION OF CONTROLLER DUE TO STUDY RESULTS ON SWITCHING CHARACTERISTICS.  T-ON time was 7.5 ms and then contact bounce was another 2.5 ms, very noisy.  Changing to a Crydom SS relay (Digikey PN CC1037-ND) 12A 100 VDC with a 100uS on time and 1ms off time.  Will also require a protection diode across it for the inductive load.  Use a standard diode with cathode tied to NEG terminal and anode tied to ground.  This will suppress the negative spike induced by the collapsing field of the injectors if one or more happen to be on.
;09-28-07  reducing top of turbo version of MAP table to ~45" instead of 55" Hg.  Simply don't need that much range on aircraft application. Should change the EM2 routine to match this new spec.
;09-20-07  Working on TBI CORVAIR controller again.  
;09-29-07  Debugged simulator and 0XB2 code.  Looks OK but do more testing.  Also, Backup sensor not done on Simulator yet. (FINISHED)
;10-05-07  wORKING ON HONDA CONTROLLER (0xB4) ****  B4 COMPLETED & COMPILED BUT NOT TESTED.
;HONDA IS DEAD ON FIRST TEST.  Found missing dwell routine but still nothing.  Need to confirm 240 deg assignment. (CONFIRMED)
;10-12-07  Not getting tp2ints  Something wrong with ISR or setup. INT0IF ALWAYS SET BUT INTOIE IS CLEAR. 
;TOO FUCKING TIRED TO DO MORE TONIGHT.
;10-13-07  Must have been brain dead last night.  FOUND SEVERAL problems, major one being the logic flaw in master sync detection (was not incrementing t2cnt when no synf) so we never got a proper count. 
 
;  20B controller on RV-8 test run.  Now have 2 distinct anomolies to find.  At 3500 rpm (assuming where the map changes page from low to high, this may not be the case, top of mid map is 3800, not 35 so this transition may not be related to this problem) Anyway, the key observation is that the engine initially gets rough (not a hard missfire, more like dropouts) then when throttle opened further, the engine note gets duller and THE FUEL FLOW is seen to about DOUBLE. Engine is not above stage point and turning turning off the s  When throttle opened further, the engine will surge in rpm, engine note gets sharper and fuel flow actually drops.  Engine sounds normal and strong from this point on up until the second anomally is encountered at about 5100 rpm.  At this point there are hard misfires and it gets worse with more throttle.  Only clue we have is that turning off the leading coil reduced the amount of misfires and engine turned faster than previous max rpm.  Think we saw 5400 at one point.
; In looking for a common factor, we wonder if the CAS is overloading the front end and causing problems.  This does not fit with the lead coil disable improvement however but hard to predict.  The fuel flow doubling is hard to figure as well.  Must do some hard thinking on this.
;10-16-07  UPDATING 0xAD ENGINE TO TRIMAP.  Still working on updating of tp2 handler.  Not completed. 
;10-17-07   FOUND AN ERROR IN A8 & AD TP2.END ROUT.   UPDATE OF LSB DELL TIMER WAS INCORRECT COIL NUMBER.  sEE NOTE AROUND LINE 9444. 
;11-06-07  Updated code for Hexadyne.  Updated 4 units.
;
;11-21-07   Started migration to 18F452 chip version
;12-24-07  ADC INIT REQUIRES MORE WORK.  HAS LEFTOVER STUFF FROM 18F4520 STUFF.
;  OOPS, THERE ARE ONLY 1536 BYTES OF RAM AND 256 BYTES OF EEPROM IN THE 18F452.  VS 4K /1K IN 18F6680  
;THIS WILL REQUIRE  MODIFICATION OF EEWR & EERD ROUTINES TO NOT USE THE MSB OF EEPROM ADDRESS.
;WRMTBL NEEDS WORK
;12-25-07  MADE MODS TO EEWR & EERD & WRMTBL FOR 18F452.  MOVED EEPROM MAP TABLE ADDRESS FROM 200 - 27F TO 80 - FF
;THE FOLLOW-ON EC3 GENERATION WILL MIGRATE TO THE 18F4620 CHIP WHICH IS A TQFP PART.  (or maybe not)
;01-12-08  First test of prototype EC3 board.  Programmed OK on A & B.  Get sit & spin error on A&B indicating an eeprom write or read problem.
;FOUND POSSIBLE ERROR IN EEWR ERROR RECOVERY ROUTINE.  WE DID NOT CLEAR WREN WHEN A WRITE TIMEOUT OCCURES!  CHANGED EEWR TO DO THIS.  NOT THE CAUSE OF SIT & SPIN THOUGH.
;
; 01-15-08  GETTING EEPROM ERROR ON INIT ENGTYPE.
;INCREASED DWELL DURING DSF ON 0xA1 ENGINE.  @@@@@@@@@@@@@  need to look at this more.   Use less dwell at dsf? 
;01-17-08  STILL DEBUGING MODE SW PROBLEM (KILLS OPERATION IN SOME MODES)
;THOUGHT IT MIGHT HAVE TO DO WITH CCP STUFF ON TIMER 3 SO MOVED ALL DWELL FUNCTIONS TO TIMER1 AS USED IN 0xB3 ENGINE.
;Problem was with configuration bits.  Had low voltage program enabled.  Now works OK
;01-31-08  No responce on serial channel.  Baud rate was not setup corectly.  Now OK.
;03-04-08  Put in updates from EC2FA program.
;###### NEED TO ASSIGN NEW COIL & INJ DRIVERS ON AA ENGINE
;03-07-08  DWELL LOOKED BAD ON B0 MENG, A1 WAS NOP!?   Dwell on B0 corrected by correcting dwell factor in cd rout.
;Problem was that we had config memory reset option selected in project.  Now OK.
;NOW WORKING ON IPW COMPATIBILITY WITH 40 MHZ CLOCK.
;Compensation for different resistors in voltage comp helped a little.
;Found that R1DIFA & R2DIFA were not being loaded from eeprom on power up.  Increased eeload count to get them all.
;Adjusted all initipw values for 40 mhz clock.   All OK except for CONT option.  Will need to /2 on tmr 2 for it.
;Saw spikes on IPW on EC3, traced to VBAT input.  Installed .1uF cap on chip input and this eliminated them.  May want to install on EC2s as well.
;**********  03-31-08  FOUND THAT PORTA,4  IS AN OPEN DRAIN TYPE (USED FOR FI5) AND WE NEED TO ADD A PULLUP ON IT TO DRIVE THE FET.FAIRLY EASY TO ADD WITH A AXIAL COMPONENT.  mUST ADD ON ALL V6 AND 3 ROTOR ENGINES.  
;04-25-08  IGNORE DOWNLOAD MAP TABLE COMMAND $F2(RCVMAP) WHEN ENGINE RUNNING.
;05-04-08  UPDATED A9 & A9 EMT T2 HANDLER FOR LATER T2 INTERVAL MEASURE.  ADDED AN EVENT TO KILL STRF
;05-05-08  FOUND THAT WE WERE NOT PROCESSING THE DTCL IN DWELL ROUTINE.  ADDED PROCESSING AND CORRECTED DTCL VALUE IN A9 T2 ROUT.  ALSO FOUND ERROR IN SPDC ROUT.  AT SDC.B0, THE OVERFLOW VALUE OD DELAY WAS SET TO NO DELAY INSTEAD OF MAX.  CORRECTED.
;05-20-08 THE DTCL PROCESSING IN DWELL ROUT WAS KILLING PRIME AND PROBABLY DIAGNOSTIC STUFF AS WELL.  WILL DISABLE DTCL PROCESSING WHEN EETMR IS ACTIVE (EEWF SET).
;HAD NOT ADDED DISABLE OF INJ TEST MODE UNLESS COLD START ON.  ADDED IT NOW.
;Changed TMR2 to give double clock period when CONT option used.  Needed for proper duty cycle on slow turning engines.
;programming #710 Sam Hoskins unit.
;05-22-08  refined the IRNG constant for CONT & 0Xa8 engines.  Programmed #737 Rino)
;ADDING 0xAE (STOCK CAS SVX ENGINE, REPLACES OLD CUSTOM CAS VERSION)  
;DURING PGMING, DECIDED TO REMOVE OBSOLETE FLAG DDF AND SOME OTHERS.  RE-WRITE ANY AFFECTED PGMS TO ELIMINATE THEIR USE.
;SVX APPEARS TO BE WORKING AFTER SHORT DEBUG
;05-27-08  PROGRAMMED UNIT SN 736 ALEX B.  CUSTOMER SUPPLIED DATA ON CAS TIMING - TOOTH 1 @ 105 DEG BTDC (MSD SPEC?)
;05-29-08  CHANGING MAX ADVANCE ON 0xA7 TO 31.25 DEG (MORE CONSERVATIVE) WAS 35 DEG.
; CHECKING NEW BATCH ON OxA1 & FOUND THAT ELIMINATING DTALT WAS NOT A GOOD IDEA.  NEED A LONGER TIMEOUT FOR 13B.  HAVE ADDED NEW VARIABLE (DTCPS) DEAD TIME COUNTER PRESCALLER SO WE CAN SLOW DOWN DTC BY ANY FACTOR BETWEEN 1 AND 255.  WILL WORK FOR ENGINES LIKE 0xB3.  FOUND THAT THE LONGEST T2 INTERVAL WE CAN MEASURE IS 52.428 MS.  
;0xA7 WON'T RUN BELOW ~180 RPM.  T2 OVF?  TRIED USING A LOWER TMR0 CLOCK RATE BUT NO JOY.
;05-30-08  FOUND THAT THERE WAS ANOTHER DTC ROUTINE IN THE DWELL ROUT THAT WE HAD MISSED.  NO PROBLEM AFTER ELIMINATING THE ERRANT DTC ROUT.  
;Found an interesting thing while refining the 0xA7 version.  We did the MATH routine in real time at end of t2 timing event which was the same time we do the loading of tmr0 on this version (65 deg BTDC).  This gave us the freshest possible engine speed for math to work on.  It also gave us real time data on when to use lsd dwell so there could be no dropped dwell events.  We compensated for the execution time of MATH by measuring it and then adding an amount to SPD to compensate.  Looks pretty good.
;  CRAP  found that map table is not loading on power-up. 
;******  ERROR IN WRTBL ROUT.  HAD WRONG BASE ADDRESS FOR EEMTAB  NEVER UPDATED THE EEPROM MAP TABLE.  CORRECTED  MUST NOTIFY ALL EC3 USERS SHIPPED TO DATE OF UPDATE REQUIREMENT. (ALL PRIOR TO 6-1-08)
;06-01-08  FOUND THAT THE WRMTBL COMMAND FROM SER CHANNEL  ALSO HAD SIMILAR ERROR.  FIXED IT.
; ADDED TEST FOR MODE 0 ON COLD START FUNCTION ON PISTON VERSION.  ROTARY ALREADY HAD THIS.
;ADDING CSON FOR COLD START STATUS (BIT 7 ENGINFO)  SO THAT FUTURE VERSIONS OF EM3 (not em2) AUTO PROGRAM WILL NOT RUN UNLESS COLD START SWITCH IS UP ON EC3.
;06-03-08  Decreased dwell on A3 & B0, used factor of 53 instead of 55.updated CHIPS FOR R. Bolinger & Greg Ward units.
;PROGRAMMED 6 A9 UPDATE CHIP SETS FOR RON CARR 4 NA AND 2 TURBO 
;PROGRAMMING A7 UNITS FOR RON CARR. 1 TURBO, 1 NON TURBO
;Programming Greg Miley A9-C unit.
;06-10-08	ADDED REV LIMITER TO 0xAE  WHILE WORKING ON 0xAA
;08-04-08	UPDATED B4 TO EC3 SPECS
;08-09-08  HAD THE FOLLOWING PROBLEM ON EC2FA: ;CAN'T SEEM TO GET DTCL TO KILL IGN BELOW DTCL RPM. GIVES LONG DWELL ON GP1 AT STARTUP
;  pROBLEM CAUSED BY T2END RUNNING BEFORE A T2STR CYCLE.  PUT CHECK FOR T2F IN T2END ROUTS.(ADDED IN A3,AB,B0 & B1 VERSIONS) NOT TESTED YET.(TESTED IN EC2FA VERSION)
;08-17-08  Adjusted all loads of DTCL to reflect the use of DTCPS which divides rate of DTCL clocks by 3 (.75 ms rate)
;   *********   must test min rpm of all future controllers    ******************
;  DTCL IS PRETTY CRITICAL IF WE DO NOT TEST FOR OVERFLOW OF THE TMR0 INTERVAL BY CHECKING FOR T2F.  THE TM0 ROUT THINKS IT IS A VALID TIMING POINT FOR IGNITION.  IF WE USE T2F, DTCL BECOMES LESS CRITICAL. 
;   ***********   IMPLEMENTED T2F CHECK IN ALL TP2 END ROUTS.  VERIFY ALL UPDATES & NEW PROGRAMS
;08-19-08   Updated Honda V6 (B4) and SVX (AE) controllers to use grouped injectors instead of independant drivers in order to eliminate the need for relay to switch backup drivers and pullup rework on CPU pin 7s.  Only 20B will need this now.  AE version has not been tested yet.
;10-20-08  Noticed that data dump is not sending the PFUN when controller B selected.
;   This was a result of decision to keep A in Mode 0 if A not selected.  Protect A controller when B selected?
;11-19-08  Increased mix & program pot compensation for Vcc3 diode drop to 10% instead of 5%.  Diode drop was .5V. 
;0xAB IPWCR ADJUSTED TO GIVE 13.7 MS IPW  = 207.  IPWRNG SET TO GIVE 2.2 MS INJ @ 9" Hg. = 26 
;CORRECTING ALEX b. SVX W/ 36-1 TRIGGER
;01-05-09  Re-assigned bit 4 of ENGINFO to RENG (rotary engine, same as ROTARY litteral  so EM2/3 can tell if rotary or piston eng in use for tach calc.
;03-09-09  Adding a timer to verify that we have been out of mode 0 for a long period of time (1 sec?) and kill programming if not.  Filter against false programming.  (MZDLY)
;05-19-09  ADDED NEW RPM MAP COMPUTATION METHOD AT IPWC.LT0 FROM EC2  (NOT TESTERD ON EC3 YET)
;06-16-09  programming J Eastman unit (A1)  2 0xB4 units for Titan AC
;08-04-09  MODIFIED 0xAB & 0xB1 FOR LESS DEWLL AT LSF AND REPLACED COMPUTED IGNITION WITH TDC FIRE BELOW LSF.  TRYING TO ELIMINATE CRANKING PROBLEMS ON STEPHEN BOWLEY UNIT.  This was a full success on both S.B. unit and David Frederickson unit!
;08-14-09  Programmed Brian Winberry unit 0xA8
;08-16-09  STARTED PROGRAMMING 0xB5 FORD V6 W/ 60-2 EMP TIMING  DID SETUU, KO, DWELL ONLY. FINISHED.
;08-26-09  Modified 0xA9 & 0xAB to hardware ignition at LSF (EMT & RAM SPeC) 
;09-18-09  Programmed Ken Millard unit (0xB5 SVX)#786
;programmed Jack Bongberg unit 0xAB #779
;10-23-09	Programmed unit for Clifford Hoyle	#784
;10-26-09	Found error in 0xB5 t2 event list (#2 ls dwell & ign mixed up.  GP2& 3 LS Dwell missing  (Ken Millard unit probably bad. (he said his unit started OK?)
;PUT IN SMALLER MIXTURE CONTROL RANGE ON 20b ENGINES DUE TO EXPERIENCE ON N109TC.  25% INSTEAD OF 33%.
;10-28-09  reduced air temp & voltage mix compensation on a3 & b0 versions (large injectors). 
;11-07-09  CHANGED 0xAE ENGINE TO HW LSI SCHEME.  REPAIRED ALEX BALIC EC3 
;11-10-09  Programmed Jeff Mcnamarra unit # 766  0xB1
;11-19-09  Found a8 eliminated from d360 list.  Put it back in.  High dwell @over 7000 rpm
;Problem:  DLC & DTC are not disabling ignition dwell on rotor 2 on eng 0xA8    
;11-22-09  The Compensation for Vcc3 voltage drop on mix & pgm analog input routs was overly large 10% instead of 4%.  Probably due to using the test PCM which had an LED indicator increasing draw on Vcc3.
;Also added a lower Rrpm threshold for CONT option for the ACCL function.
;12-06-09  Refined & debugged 0XA9 CONT version & updated EC3 # 716 Greeg Miley unit
;12-12-09  Implemented new lsf dwell scheme on 0xA1 & 0xA3 engines.  dWELL looks flawless at low speeds now.  both tested. error!
;12-13-09  REFINED LSF DWELL ON AB & B1 ENGINES --  NOT TESTED
;12-24-08  Working on low speed ignition on Honda V6  0xB4.   DONE BUT NOT TESTED
;12-31-09  Tested 0xA1 new dwell and it was not in right. Fixed it. Also Put new dwell scheme in 0xA2 and tested OK. Reduced the dwell time on RX-7 coil due to limitation on rpm.  Now good to 8200 rpm.  Programmed Shosanski unit #761 with A2 software.
;01-17-10  Updating 0xB5 for lsd fix
;01-22-10  Prog 0xA1 FOR rANDOLF sMITH  #744
;01-22-10  iMPLEMENTED 0xB6 ENGINE LS-2 W/ BACKUP OPTION @ 180MDEG.  ****** OBSOLETE  ********
;01-27-10  Programmed replacement A controller on G milley unit
;01-31-10  Updated 0XAD w/ improved dwell scheme and later load of spdl ctr  (now at 35 deg)  Compiles but not tested yet.
;02-02-10  Programming Rick Russel # 791 0xA8R
;02-04-10  Adding backup sensor option to 0xB1 controller.   THIS ELIMINATES THE NEED FOR THE 0xB6 DESIGNATION.  Tested OK
;02-08-10  Burning chip for A8 phil ashcroft
;02-08-10  Programmed unit for Jason Day, Vesta  0XB1 #793
;03-14-10  Modified 0xA7 to load spdc at 55 deg spec RE: Jon Findly.  gives 7.5 deg advance compared to old spec.  Jon reported good results.
;03-21-10  burning chips for Van Zyle unit#785  A1 type  
;03-27-10  Encountered user error possibility - When at low throttle in rotary types (staging) if the primary injectors are switched off (thus activating Cold Start) and the Mode switch is NOT in mode0, the staging flag is not killed and the engine will not activate the secondary injectors.  To minimize the impact of this, now changing the logic to bypass the cold start kill of sflag ONLY in Mode 7 rather than anything other than Mode 0.  Checked on Bench and it worked OK.  Changed it on EC2 also.
;04-09-10   Finish checking 0xAD for tp2 event list update.   UPDATED LIST & TIMING DIAGRAM   COMPILED OK, NOT TESTED.
;tested not good,  bad dwell at low rpm  looks like periodic reset happening
;05-11-10  Modified 0xA8 for hardware dwell below lsf speed.  Looks good on bench.  Need to add these changes to EC2F code.
;05-12-10  mODIFIED 0xB1 TO USE THE SAME TIMING ON BACKUP CAS AS PRIMARY  THIS IS FOR LS-2-7 ENGINES.  MUST TEST!!!!!
;Found error in B1 tp2 rout & fixed.  Runns OK now.
;06-17-10 Changed tm0 ld time on 0XB1 eng to 42 deg btdc for more math time.
;07-07-10 UPDATED 0xAE FOR LSF DDF DWELL, LOWER LSF SPEED, LESS LSF DWELL
; also reduced lsf dwell on b1 engine.
;07-11-10   New version to program both controllers simultaneously if A is selected.  If B is selected, program ONLY B controller.
; ******  THIS MOD INVOLVES THE CODE FROM PCK.4 TO 	A     Tested and found to work OK  08-15-10 
;08-26-10  Removed delay function in PCK because it caused  copy A to B function not to work!!!  *******
;09-01-10  Updated 0xB5 to 42 deg load time & less low speed dwell    NOT TESTED!!!!
;09-02-10  Changed 0xB5 to 6500 rpm rlimit.
;09-08-10  Made a setup for A3 with oneinj option   for the Kermit 20B project.
;09-13-10  ADDING A72007 FLAG FOR 2007 & LATER 0xA7 EJ25 ENGINES.  USES RX-8 TYPE CAS
;09-14-10  Switched Crank & Cam sensor inputs on 0xA7 engine.  Changed install guide too.
;  TESTED A72007 VERSION, LOOKS OK.
;10-27-10  Got new data on 2007 EJ-25 cam sensor timing.  Previous data was bad.  Changed logic on TP1 interrupt to match the new data.  
;11-05-10  Changed LS1 dwell time to 4 ms  Reprogrammed itec controller for corrected cam sensor timing.
;11-30-10  eDITED 0XAD so test befor ship any more.
;01-04-11  CORRECTED SOME ERRORS ON A3 ONE INJECTOR SETUP AND ELIMINATED SOME TEST CODE FROM N109TC EXPERIMENTS.
;****  THERE IS SOME QUESTION WHETHER THE ROTARY BIT GOT SET PROPERLY ON A3 VERSIONS OF THE EC3.
;01-13-11  Modified A7 w/ A72007 option to use stock coild module w/ built in igniter & waste spark
;03-09-11  aDDED ipw BUMP ABOVE STAGING POINT.  Re: Steve B. research.
;05-12-11 A7   Ron @ Ram performance reports too much advance  65 BTDC MUST BE THE CORRECT NUMBER.  cHANGED PRELOAD DELAY
;05-21-11  Programmed Russ Ks EC3-B0
;05-24-11  Programed Bob Forbes EC3-A8R\
; mODIFIED injector sequence for 0Xa7a  type.
;05-24-11  Programmed 2 EC3-A7s for jesse Saint  (used rx-7 dwell time for stock sube coils)
;07-15-11  Working on experimental version of the code (EXP == 1) to utilize the ideas for improved idle conceived during debug at iTEC of A7 w/ no load.
; SEE ALL ROUTINES WITH  "IF EXP==1'    (THIS IS NOW STANDARD, EXP FLAG REMOVED
;ADDED IPWMINADJ AS MODE 2 W/ CSON.  IPWMINADJ IS NOT WORKING ******  FIXED IN IPWCALC
;ALSO DELETED ALL VAC ADVANCE BELOW 1600 RPM  cONSIDER USING LES MIN ADVANCE IN CONSTANTS.
;07-25-11  deleted ACCF stuff on all rotary & non rotary versions.  Too many doubts about side effects.
;note that this also disables the non-stage transition enrichment. 
;08-09-11  aDDED IPWMIN TO ROTARY.   CHECK IPWC.1B FOR NECESSITY.....  (FOUND IT NOT NEEDED IN EXP VERSION)
;08-10-11 DEFAULT IPWMIN SET AT 1MS, IPWRNG VALUE SET AT 80 (IPW INCREASE STARTS AT 9" Hg)  PROGRAMMED N109TC CONTROLLER WITH EXP VERSION)  Tested GOOD! Increased MODE 3 default to 164
;Noticed a jitter in 0xB0 dwell so reduced constant in TP2END rout for this version.
;08-15-11  thought i had fixed a flaw that caused ipw to increase when turning on CS in Mode 2 but N109TC has the problem. I may have fixed after programming that EC3.
;TEST OF CONTROLLER WITH LAST VERSION SHOWS THAT WE DO GET SECONDARY INJECTORS FIRING BELOW STAGING POINT WHEN IN MODE OTHER THAN ZER0 BUT ONLY IF THE MANIFOLD PRESSURE IS BELOW 9" Hg  AND THE RPM IS ABOVE THE RPM TABLE RANGE !!!!!
;REPLACED MOST INSTANCES OF CLDSW WITH CSON
;BURNED CODE AT THIS POINT AND TESTED CONTROLLER.   COULD NOT REPRODUCE THE PROBLEM.
;08-17-11  NEW MATRIX MAP SCHEME
;MAY WANT TO ADD RPMTHRESH TEST TO LOW TABLE?
;MATRIX CODE TESTED ON BENCH & LOOKS GOOD! 
;   INITIALIZE IPWRNG PARAMETER :  IS THIS NEEDED??   COMED OUT, NOT TESTED
;08-18-11   ADDED RPMTHRESH TEST TO RPM RANGE OF TABLE ADDRESS GENERATOR
;UPDATED & DEBUGGED EC2F MATRIX VERSION.  added tweaks to ipwc.2 from ec2f version. 
;08-19-11 flight tested EC2F IN N84TC AND OTHER THAN REDUCING IPRNG TO 64, NO OTHER CHANGES NEEDED.   APPROVED FOR TEST IN N109TC.
;08-21-11 Noted that new batch of EC3s had much higher Vcc3 drop with activation of PCM switches.  Should change 4.7K SIP pullup to 10K to reduce load or jumper Vcc3 to Vcc.  
;ELIMINATED 5% INCREASE IN PGM & MIX ADC ROUTINES.  PLAN TO ELIMINATE THE VCC3 DROP BY JUMPERING ISOLATION DIODE D18 TO VCC.  DID THIS ON N109TC CONTROLLER.
;During past few days iI have apparently blown 5 chips while trying to program N109TC controller.  I assume it was related to the external program port i added to the board.  It has been removed but I need to be alert for instances of this happening.  May want to program chips in external adapter as I have seen occasional failures on program attempts on EC3 boards.  Possibly due to having two chips in parallel.  Note that the blown chips were apparently functional but could not be reprogrammed.  Another possibility is the warning about program use of the programming clock & data pins before entering program mode.
;08-22-11  TEST RESULTS ON N109TC SHOWED WE NEEDED A LARGE LEAN ADJUSTMENT ON MODE 6 FOR STAGING COMPENSATION.  ENGINE WENT VERY RICH WITH NO ADJUSTMENT.   tHIS IN SPITE OF THE FACT THAT IPW WENT FROM 6.5MS TO 4.0 AT THE TRANSITION WHICH SOUNDED ABOUT RIGHT.   LOOKING AT IT ON THE BENCH WITH TRIAL VALUES FOR POST STAGE IPW VALUE. PROPER STAGE VALUES WERE 6.5MS TO 3.0MS WHICH IS COUNTER TO WHAT WE EXPECTED.  HAVED TWEAKED THINGS TO GIVE US THESE VALUES WITH THE DEFAULT MODE6 SETTING.   mODIFIED IPWC.1-2 ROUTINES
; ****  10-09-11  FOUND ERROR IN 0xA3 & 0xB0 CODE VS DOCUMENTATION.  COIL ASSIGNMENT DID NOT MATCH INSTALLATION GUIDE!!  WORKED OK ON N109TC BECAUSE WE WIRED WITH ADAPTER!!  also.... FOUND WE WERE NOT LOADING ALL COILS WITH LSD (ONLY FC1 - 3, leading coils) IN T2 ROUT. ADDED 4-6. LSD WAS ALSO KEYED TO DSF INSTEAD OF LSF, SO CHANGED THAT AS WELL.  ADDED N109TC FLAG SO THAT WE CAN PROGRAM UNITS MATCHING INSTALL GUIDE AND N109TC.  ALL THE LSI ROUTINES WERE MISSING IN T2 ROUTINE AS WELL.  MISSING IN A3 TOO? FIXED LSF DWELL ON A3 T2 ROUT.  ALSO FOUND LSF LOGIC ERROR IN B0/A3 DWELL ROUT, FIXED.  FOUND THAT COIL ASSIGNMENT WAS WRONG IN T2END ROUT AND FC4-6 (TRAILING COILS) WERE MISSING.  ADDED ASSIGNMENTS AND ADDED MISSING COILS.  ALL COILS WERE ALREADY THERE IN 0xA3 VERSION BUT ASSIGNMENTS WERE WRONG.   UPDATED TURBO CONSTANT 
;10-09-11  NOTICED THAT A9 EMT HAD NOT BEEN UPDATED TO 42 DEG LOAD TIME.  CORRECTED BUT NOT TESTED.    ***************
;MUST REVIEW 0xA9 CONT (NON EMT SPEC) FOR CORRECT LOAD TIMES AND ADVANCE FUNCTIONS. (all looked OK, timing diagram was updated to match pgm.
;10-14-11  added turbo option to initipw for rotary engines. Added new advance curve for A1. Programmed Chad Robinsons EC3 -A1T unit 820.
;10-18-11  Updated A9-C constants then updated Sam Hoskins controller
;10-19-11  Updated A3 constants then updated Tim Holt's controller.
;10-20-11  Found one R3 injector does not fire on injector diag.  (fires at 1 per second instead of normal rate?????
;10-22-11  REVAMPING A7 PROGRAM FOR BETTER CRANKING IGNITION TIMING AND NEW MATRIX STRATEGY.   TESTED OK
;10-23-11  Updated A3/B0 ipwcalc.  removed arbitrary +10 factor above staging and added ipwmin to both stage & unstaged IPWs.  verified against calibrated N109TC controller.   Found (unprogramable chip & replaced.
;10-24-11  fOUND THAT THE INJECTOR BITS ON A3 & B0 CONTROLLERS WERE SCRAMBLED LIKE THE IGNITION BITS WERE.  FIXED THAT THEN FOUND THAT SETTING FI6 IMEDIATELY AFTER SETTING FI5 WOULD CLEAR FI5.  THIS IS DUE TO PULLUP CAUSING SLOW RISETIME OF FI5 MADE THE FOLLOWING RD/MOD/WR OF BIT 6 THINK FI5 (PORTA BIT 4) WAS LOW.  FIXED THIS BY DEFINING FI5&6 AS LATA 5&6 INSTEAD OF PORTA 5&6.   WOW....
;10-31-11  STARTED ADDING TBINJ OPTION TO 0xB3 FOR RAM PERF TBI ENGINE.    NEED TO FINE TUNE DWELL IF IT IS TO BE USED (NOT USED IN PROTOTYPE)
;12-20-11  Sent Manlio the HEX file for A7 software.
;01-18-12  MODIFIED PRIME ROUT. TO CORRECT INJECTOR ASSIGNMENT ON A3 & B0 20B ENGINES.
;UPDATED CONSTANTS FOE 0xAE SVX ENGINE  and programmed Ed Pashel's EC3  looks OK
;01-19-12  Programmed Hank Austin's EC3-A8
;02-10-12  Programmed SN 826 EC3-B1.   First unit with new LS-2 mod installed.   Similar to EJ-25 mod developed for Manlio in Italy.  
;02-13-12  Programming SN 827 EC3-A1 BREW , Modified the CAS inputs with new mod similar to above. Bill, w.?  
;02-26-12  ADDED NEW ROUT IPWC.CL FOR CLOSED LOOP VERSION.
;          ADDED DW.CL TABLE ADJUST TIMER ROUT AT DWELL TIMER (SETS TWF FLAG  TRIM WRITE FLAG)
;		   ADDED EXECR.CL  TO EXEC ROUT.
;          ADDED CL ENTRY POINT TO TBLADJ ROUT FOR CLOSED LOOP VER
;		   ADDED SECOND ENTRY POINT (RICH.CL) IN TBLADJ ROUT 
;		   ANL1 ROUT CHANGED, COMED OUT LOADING OF O2H SO WE COULD USE IT AS TRIM VAR.
;		   ADDED SEVERAL FLAG & VARIABLE DEFINITIONS, CHANGED O2H VAR (NEVER USED) TO TRIM,
;		   MODIFIED TBLADJ ROUT TO SET TBLUDF & TBLOVF FLAGS FOR TABLE OVERFLOW.   TO BE USED BY EXEC TO CALL MODE 3 & 2 ADJUSTMENTS.  
;		   ADDED STAT5 DEFINITION, TBLUDF & TBLOVF AS BITS 0 & 1 OF STAT5
;		   MODIFIED T2ADJ ROUT FOR CLVER.  
;		   ADDED CLLEAN & CLRICH ROUTINES (AFTER EXEC)
;	WORKING ON IGNITION ADVANCE ADJUST.
;	MODIFIED IGNADJ, IPADJ, SECDELTA & T2ADJ
;	MODIFIED PGMR LIST FOR MODE 0 - 3 ON EC3TB   

;03-03-12   EC3TB VERSION DEBUGED AND OPTIMIZED ON BENCH TESTING.
;03-04-12   REMOVED OBSOLETE FLAGS EXP & EC3, MODIFIED SOME INIT ROUT FOR POWER UP PROGRAM 9 JUST BEFORE EXEC.  SAVING AS EC3.CL 
;03-06-12   REFINEMENT STRATEGIES FOR CLOSED LOOP VERSION.  ********************************
;        CONSIDERING BEST RANGE FOR TABLE UPDATE MODE TO AVOID OVER CORRECTION OR RUNAWAY.   THOUGHT ABOUT LIMITING TRIM RANGE BUT THAT WOULD LIMIT IT IN BOTH CL MODES, NOT JUST TABLE UPDATE MODE.  IT WOULD
;ALSO LIMIT THE AUTO PROGRAM SPEED WHEN WORKING PROPERLY.
;03-06-12   UPDATE TRIM AT A FIXED INTERVAL DEFINED BY CLTMR IN DW ROUT SO THAT TRIM MOVES SAME SPEED AT ALL RPM.  EXEC NOW CALLS CL ROUTINES
;************************************        TB VERSION OPERATION MODE DEFINITIONS      ******************************
;   MODE0 - NO CLOSED LOOP OPERATION,  PROGRAM IGNITION TIMING BASED ON POSITION OF MIXTURE CONTROL 
;	MODE1 - CL TRIM OPERATION ONLY,    PROGRAM IPRNG (SEN OFFSET)(CS DN) OR IPMIN (CS UP), ADJUSTMENT DIRECTION BASED ON MIX RICH OR LEAN.
;	MODE2 - NO CL OPERATION			   PROGRAM TABLE ADJUST OR SECDIF BASED ON CS SW, DN = TABLE ADJ, UP = SECDIF, ADJUST DIRECTION BASED ON MIX VALUE (TBLADJ MODE 9)
;	MODE3 - CL TRIM AND TABLE ADJUST WHEN TRIM OUT OF LIMITS
 ;  *******************************************************
;	EC3 VERSION REQUIRED DIFFERENT O2 ADC VALUES IN TRIM ROUT. BECAUSE NO X2 AMP FACTOR ON BUFFER.  wORKS OK  
;03-07-12    FOUND THAT A8 CONSTANTS HAD NOT BEEN UPDATED TO LATEST SPECS.  UPDATED IT AND SEVERAL OTHERS TO NEW SPEC IN SPREADSHEET
;   CHECK VALUES BEFORE PROGRAMING.    PROGRAMMED #828 with a8 software
;05-09-12   UPDATED 0xA9 VALUES, PROGRAMMED DANIEL MACPHERSON UNIT #795, UPDATED CAS CKT WITH NEW CONFIG. INCLUDING 1N4148S ON R69 & 72  
;05-18-12  Corrected error in Mode 3 CL . CHANGED DX.AX2 ROUT TO SLOW DOWN TRIM & TABLE UPDATE IN MODE 3 CL   when in 
;05-19-12  Had wrong value of IRNG in most tables.  Corrected in XL spreadsheet and also optomized MINMAP,IPMIN & IRNG. Set same values in all tables.
;05-22-12  Added test for OLF to EXECR.CL to keep it from programming when not on-line in CL mode.  
;Programmed N109TC controller with this version.
;*****   Closed Loop testing.    Mode 1 works very well except that at low throttle there is some hunting.  Engine wants to be richer at low throttle.
;        The O2 sensor response on N109TC seems to be too slow, may need new O2 sensor.  This causes a little hunting at low throttle and way too much hunting (to the point of MAP table undershoot) in Mode 3.
;06-13-12  Possible reason for slow O2 response is too much capacitance on the sensor line.  With the EM3 installed and the EC3, there is a total of .2uf.  I am changing these values to .001 in an effort to 
;speed up response.
;I have also slowed down the Mode 3 program cycles to once a second.  May reconsider after the above hardware change?  
;Eliminated the auto programming of IRNG & IPW constants when the Map table under or overflows.  Too dangerous.  Also found the reason for EM3 auto program problem (in the EM3) and fixed it.
;  reprogramming N109TC controller and installed the C28 O2 filter cap change.
;06-14-12   Response still seems slow even after changing O2 filter caps.  Hunting, especially at lower rpm but even at higher in some cases. Also noted mix changes at low MP depending on RPM range. May want
; to lower rpm table limits to put the threshold on different sides of the run area.
;07-12-12  MAKING THIS AN 8 RPM TABLE MAP VERSION AND MAJOR OVERHAUL OF CLOSED LOOP MODES.  SEE THE FLOW CHART. 
;07-14-12 started effort on 8 rpm range version, renamed source file EC3CL8.asm.  LEFT OFF AT 5209
;07-17-12  FINISHED FRONT END OF 8 RANGE TABLE FOR ROTARY VERSION, READY TO GO ON TO LATER STAGES OR DEVELOP PISTON VERSION.
;08-11-12  ELIMINATED UN NEEDED TEST/SET OF SFLAG AT IPWC.0E.   SFLAG TEST NOW DONE AT FRONT END.
;08-12-12  STRESH NO LONGER A MAP TABLE ADDRESS SO CHANGED INIT STRESH & SET STRESH
;			CHANGED RPMTHRESH ROUTINES TO USE MAPL INSTEAD OF TABLE ADDRESS
;UNSTABLE IPW WAS DUE TO NOT LOADING FSR2H IN IPWC ROUT.
;  *******  FOUND THAT THE SERIAL INTERRUPT INPUT ROUTINE USES FSR2.  SO DOES NON INTERRUPT CODE.  CHANGING SER INPUT TO USE FSR0 INSTEAD.
;08-13-12  FOUND THAT TDAT WAS NOT BEING LOADED DUE TO ERROR IN INDF2 USAGE, USED wrong register bk 1.  WORKS ok NOW.
;  WAS CONTEMPLATING CHANGES NEEDED FOR PISTON VERSION BUT LOOKS LIKE NONE NEEDED?   WILL TRY TOMORROW.
;08-14-12   working on 0xB3 engine
;08-15-12   aDDED NEW PISTON ENG. IPWCALC.  NOT DEBUGGED YET.   ALSO REVAMPED ROTARY RPM RANGES,  NOT TESTED.
;08-17-12   FOUND THAT ADVANCE CURVE WAS TOO STEEP, MORE THAN OPTIMUM ADVANCE AT MID LEVEL RPMS.  DUE TO LOW VALUE FOR LPTH IN CONSTANT TABLE.  USE VALUE OF ABOUT 1500 FOR THIS PARAMETER.
; COILS STICK ON WHEN CAS SIGNAL LOST.   ADDED CLRF PORTD TO TMR0 TIMEOUT INT, FIXED IT.
;08-25-12  ADDED ALL UPDATES FROM EC4 AND CAUGHT SOME OMMISSIONS.  CHECKED OUT EC3-B3, LOOKS GOOD,  IGN TIMING GOES TOO ADV BELOW 
;;08-26-12  ADDED LSF DWELL METHOD TO 0xB3 ENGINE, NOT TESTED
;08-30-12   First on engine test of EC3-B0 version.  required almost no adjustment of map table.  Closed loop went too rich immediately.  Had wrong value for O2THRESH .  was 225.  Mistakenly
;    thought EC3 needed double the value of EC4 but opposite is true as EC3 does not have X2 amplification and EC4 does.  FUCK!   All else looked very good though.   May have been a bit rich at low throttle.
;ADDING PROGRAMMABLE O2THRESH AS MODE0, CS OFF, ENGINE RUNNING.  HAD TO MODIFY TRIM.CL4 FROM CONSTANT TO MEMORY.  LOOKS GOOD.
;09-01-12  FOUND ERROR AT IPWC.A, RANGE SELECT 6 - 7 REVERSED IN BTFSS INSTRUCTION.  WAS OK IN EC4 VERSION.
;REPROGRAMMED N109TC CONTROLLER
;TESTING FOUND SEVERAL OTHER ERRORS (EDITS NOT CARRIED OVER FROM EC4 WHERE DEBUGGING WAS DONE)  ANOTHER MISSING FOUND IN TRIM.CL8!  LAST ONE?  NOW BURNING N109TC AGAIN.
;09-19-12 *******************  I plan to replace Mode 1 with the function now done on Mode 9.  It's just a more user friendly way to do it.
;09-25-12  FOUND A FEW EDITS FROM EC4 IN IPWCALC NOT CARRIED OVER.  AFFECTED CONT OPTION
;10-04-12  ONE MORE MISSING EDIT AT IPWC.8D   MPPTR INSTEAD OF MAPL
;11-21-12  Updated EC3-A8 #823 (Stalker unit)
;11-25-12   Saved from EC3CL for conversion to 18F6680 used on EC2
;11-28-12   FIXED ERRORS ON 2 ROTOR ROTARY ENGINES AND COMPILED OK.  NOT TESTED ON HARDWARE YET. 
;12-27-12   tested on hardware.  Fixed several bugs due to port differences in programming section.  Looks Good so far but not all functions checked.  Also implemented slower CL mode 1 & 3 when engine < 2300
;02-20-13  Updated Jeff Walley's EC2 (old board, no CL)
;02-22-13  Changed polarity of INT0 int on 0xB1 engine to match sensor.  uPDATED ALL PARAMETERS, REDUCED MAX IGN ADVANCE.  ****  Removed this change,  LS-2 sensor wiring error correvtion 03-20-13
;02-23-13  aDDED CHANGES FOR BU SENSOR ON 0xA8 ENGINE.  CHANGES TO TP2 ROUT.
;03-16-13  Updating Bob Rogers EC2 (old square box)
;03-26-13  Uodating William Hagood EC2-B1 rectangle, #660 w/ CL modes.   SOB!   No ignition between 600 and 1550 rpm   WTF.  UNDO THE TEMP MEM ASSIGNS FOR SDH&L 
;  FOUND MISSING STOP TIMER 0 IN TMR0INT ROUT IN SEVERAL VERSIONS.   THOUGHT THIS HAD TO BE THE PROBLEM BUT NO JOY.    0xB1 STILL BAD  WILL TRY EC3 PGM.  DIFFERENCE IN TMR0?
;03-28-13  FOUND 0xB1 PROBLEM.   TP2 LSI INTS (WITH TP2.STR CALL) WERE OCCURING BEFORE THE PREVIOUS SPDC IN TM0 WAS OVER.  THIS KILLED THE CYCLE AND IGNITION & INJ WAS MISSED. 
; PUT IN A CHECK FOR TM0 STILL ON AND IF SO WE PLUGGED IN A CUSTOMIZED VERSION OF THE TM0 ROUTS THAT WE USE INSTEAD.
;05-14-13  TRYING TO UPDATE 0xAA UNIT FOR rOBERT bOLINGER.  nOT WORKING YET, NO IGNITION  (UPDATED T2 ROUT TO ADD LSI
;  01-26-15  UPDATING JEFF WHALEY UNIT (NDF) COMPLAINED OF NO STAGING

;  ********************   ENGINE CONFIGURATION  ---  SETUP BEFORE COMPILING CODE  ! ! !!!!!!!!!   *****************
;	(PUT DESIRED ENGINE TYPE IN ENG EQU DEFINITION BELOW ENGINE LIST  AND ALL OPTIONS BELOW ENGINE )
;  

;ENG		EQU	0xA1		;2nd (OR 3RD) gen 13B LS1 COIL VERSION 	(Previously known as -A type.
;ENG		EQU	0xA2		;2nd (OR 3RD) gen 13B MAZDA 2ND GEN COIL VERSION
;ENG		EQU	0xA3		;20B 3 ROTOR ENGINE W/ STOCK CRANK SENSOR
;ENG		EQU	0xA4  BAD		;POWERSPORT VER W/ 60 -2 CAS
;ENG		EQU	0xA5		;HEXADYNE 2 CYL
;ENG		EQU	0xA6		;GEO ENGINE W/ 60-2 CAS
;ENG		EQU	0xA7	; *	;EJ-20/22/25  **** SET A72007 FLAG BELOW !!!!!!  (1-2-1-2 on crank =0, RX-8 TYPE = 1 2007 AND LATER)
;ENG		EQU	0xA8	; * RENESIS RX-8 ENGINE  SET LGSEC IF USING RENESIS INJECTORS  SET RX-8 COIL IF USED  !!!!!!!!!
;ENG		EQU	0xA9	; *	;EA81/EJ25/Lyc/Cont EQUIPPED WITH 60-2 CAS (CHECK CONT & EMT VARIABLE FOR SET OR CLEAR !!! )
;ENG		EQU	0xAA		;FORD V6 DIRECT FIRE IGNITION  (36 -1 & CAM SENSOR) 1st tooth at 50 deg btdc #1
;ENG		EQU	0xAB		;CHEVY LS1 V8 w/ 60-2 crank sensor  (early Vesta V8 with external CAS & trigger )
;ENG		EQU	0xAC 	BAD	;EJ-25 varient (We have no idea what the hell this is) (MAY BE THE RARE DOHC SUBE 2.5 ENG?)
;ENG		EQU	0xAD		;SUZUKI/GEO 1998 4 CYL G13bb
;ENG		EQU	0xAE   	*	;SUBE SVX STOCK 36-1 crank trigger  #1 TDC at tooth 12 after gap  (re: ED P.  11-18-12) 
;ENG		EQU	0xAF		;DISTRIBUTOR EQUIPPED V6 (DUAL PICKUPS)
;ENG		EQU	0xB0		;20B EQUIPPED W/ RENESIS CAS
;ENG		EQU	0xB1		;LS2-LS-7 V8 w/ STOCK CAS / HAS BU CAS option at same timing ALSO A HALL EFFECT SENSOR 900 MV PULSE)
;ENG		EQU	0xB2		;CORVAIR W/ 60-2 TOOTH TRIGGER WHEEL  (1st tooth positioned 6 deg ATDC)
;ENG		EQU	0xB3		;EAGLE 540, TURBO V8, 45" MAX MAP  OR  RON CARR TBI INJECTION ONLY
;ENG		EQU 0xB4		;HONDA V6   (REQUIRES PULLUP ON SENSORS) (remove R76 & R79 shunt loads, pu OK) Add 560 to Pin 7s. 
;ENG		EQU	0xB5		;SUBE 2.7/EG-33 6 CYL (60 - 2 TRIGGER WITH emt SPEC / FORD 3.8 V6 3.8L  60-2 emt (manual is only difference)   TDC #1 at 11th tooth after gap.


ENG			EQU	0xA1  	;PUT ENGINE TYPE CODE HERE AND CHECK **** ALL **** FLAGS BELOW!!!!!!!!!!!!!!!!!  

EC3TB		EQU	0x00	;  DO NOT USE WITH EC3,  USE EC3TB (EC4) FOR NEW SINGLE CONTROLLER VERSION USING 18F4620   (EC4)

N109TC		EQU 0x00	;N109TC USES A DIFFERENT assignment of coil drivers  CLEAR for ALL except N109TC !!!!! and KERMIT unit

DIAG		EQU 0x00		;DIAG ==1 ALLOWS DIAGNOSTIC USE OF 02H&L

;  *****************     CHECK ALL FLAGS BEFORE PROGRAM MING CHIPS  !!!!!   **************************************************

;   ***************    DWELL TIME FLAGS   *SET ONLY ONE*      ***********************************************

RX8COIL		EQU	0x00		;1= 2.6MS DWELL TIME  (RX-8 COIL)
RX7COIL		EQU 0x00		;1= 3.5MS DWELL TIME USED   (also used for A7 2007 option) 
LS1COIL		EQU	0x01		;1= 4.3 MS DWELL USED 
HONDACOIL	EQU 0x00		;1= 1.7 MS DWELL			(A REALLY TINY COIL)
LS2COIL		EQU	0x00		;1= 4.0 MS DWELL		

  
TURBO		EQU	0x00		;0 = NA, 1 = TURBO VERSION 	(BIT 0 SET IN ECINFO IF TRUE)
BFACTOR		EQU	D'25'		;BOOST RETARD FOR IGNITION TIMING  lower value = more boost retard (25 IS USED FOR MOST ROTARY 20 on 03-05-09,
LGSEC		EQU	0x00		;0 = PRI & SEC INJECTORS SAME SIZE  1 = LARGER SECONDARY INJECTORS (RENESIS 4 port)
WIDEBAND	EQU 0x00		;0 = NARROWBAND O2 SENSOR IN USE, 1 = WIDEBAND SENSOR IN USE.
TEMPSENSOR	EQU	0x00    	;0 = THERMISTOR, 1 = LM34
MAPSENSOR	EQU	0x00		;0 = MPX4250 SENSOR, 1 = MPX4115 (EARLIER VERSION OF EC2 ONLY)
BUSENSOR	EQU	0x00		;0 = NO BACKUP SENSOR, 1 = BACKUP INSTALLED (0xA9,AB,AD,B1,B2,B4 0-200 ENGINE ONLY)
BREW		EQU	0x00		;0 = SET TO 1 FOR 3RD GEN 13BREW ENGINES :  COMPENSATES FOR 5 DEG EARLIER 3RD GEN TIMING OF CAS
ONEINJ		EQU	0x00		;0 = NORMAL 2 INJECTOR PER ROTOR  1 = 1 INJ PER ROTOR  (NOT RECOMMENDED)
CONT		EQU	0x00		;0 = NORMAL 0xA9 ENGINE, 1 = CONTINENTAL/Lyc VARIENT (also sets bu at 18 geg before primary)
EMT			EQU	0x00		;0 = A9 W/ TRIG @ 6 DEG ATDC   1 = TDC @ TOOTH 11 (ELECTROMOTIVE TIMING SPEC) also sets BU at 180 deg
TGCOIL		EQU	0x00		;3RD GEN COIL OPTION FOR A2 CONTROLLER  (USES 3RD GEN IGNITER)
A72007		EQU	0x00		;0 = PRE 2005 SUBE EJ25   1 = 2005 OR LATER EJ25 W/ RX-8 TYPE CAS  	
			
VDET		EQU	0x01		;1 = VOLTAGE COMPENSATION OF IPW OPTION INSTALLED
TBINJ		EQU	0x00		;1= THROTTLE BODY INJECTION FLAG 
LS2_60_2	EQU	0x00		;1= LS2 ENGINE EQUIPPED W/60-2 TOOTH TRIGGER WHEEL  (USE ENG CODE 0xAB)

NEWBOARD	EQU	0x00		;0=old boards   1=EC2 REV-2/3 board  NEW BOARD HAS DIFFERENT PORT BIT assignments & AIR TEMP ROU.  New has pgm ports on bd.  Old has heatsink on inj drivers & no O2 buffer
OLDVESTA	EQU 0x00		;SET TO 1 WHEN UPDATING OLD EC2 ON ENG W/ LAST TOOTH AT #1 TDC
;  *****************     CHECK ALL FLAGS BEFORE PROGRAMMING CHIPS  !!!!!   **************************************************

 	list      p=18F6680            ; list directive to define processor
	#include <p18F6680.inc>        ; processor specific variable definitions
  

 IF (ENG==0xA5)||(ENG==0xA6)||(ENG==0xAB)||(ENG==0xB1)||(ENG==0xA8); (360 deg dwell calc)   had deleted A8?????  
D360	EQU	0x01
 ELSE
D360	EQU	0x00
 ENDIF

 IF RX8COIL+LS1COIL+RX7COIL+HONDACOIL+LS2COIL ==0
  	ERROR "NO COIL DWELL DEFINED" 
 ENDIF
 
 IF (RX8COIL+LS1COIL+RX7COIL+HONDACOIL+LS2COIL) >1
  	ERROR "MULTIPLE COIL DWELL DEFINED" 
 ENDIF
 
 IF (ENG==0xB2)
  IF (BUSENSOR==1) == 0
 		ERROR "NO BACKUP SENSOR SELECTED FOR B2 ENGINE"
  ENDIF
 ENDIF
 IF (ENG==0xAB)
  IF LS1COIL == 0 
 		ERROR "WRONG COIL SELECTED"
  ENDIF
  IF (BUSENSOR==1) == 0
 		ERROR "NO BACKUP SENSOR SELECTED FOR AB ENGINE"
  ENDIF
 ENDIF
 
 IF (ENG==0xB1)
  IF LS1COIL == 0 
 		ERROR "WRONG COIL SELECTED"
  ENDIF
 	
  IF LS2_60_2 ==1
 		ERROR "ERROR - USE ENG CODE 0xAB FOR LS2 W/ EXTERNAL CRANK SENSOR"
  ENDIF
 ENDIF
 IF ENG==0xB4
  IF BUSENSOR==0
 		ERROR "NO BACKUP SENSOR SELECTED FOR B4 ENGINE"
  ENDIF
 ENDIF
 IF ENG==0xB4
  IF HONDACOIL==0
 		ERROR "WRONG COIL SELECTED FOR B4 ENGINE"
  ENDIF
 ENDIF
 
 IF CONT==1
  IF EMT==1
 		ERROR "EMT SELECTED ON CONT ENGINE"
  ENDIF
  IF LS1COIL==0
 		ERROR "CONT MUST HAVE LS1 COIL SELECTED"
  ENDIF
 ENDIF
 
 IF (ENG < 0xA5)||(ENG==0xA8)||(ENG==0xB0)		;SETS ROTARY = 1 IF CONTROLLER IS ROTARY ENGINE 0 = PISTON ENGINE 
ROTARY 		EQU 01								;ALSO AVAILABLE AS RENG (BIT 4 OF ENGINFO)
 ELSE
ROTARY		EQU	00
 ENDIF     

 IF  (ENG==0xA4)||(ENG==0xA6)||(ENG==0xA8)||(ENG==0xA9)||(ENG==0xAA)||(ENG==0xAB)||(ENG==0xAD)||(ENG==0xAE)||(ENG==0xB0)||(ENG==0xB1)||(ENG==0xB5)||(ENG==0xA7 && A72007==1)
UNISYNC EQU 1			;DENOTES ENGINE WITH SINGLE SENSOR SYNC DETECT 
 ELSE
UNISYNC EQU 0
 ENDIF

;   LIST OF COIL DWELL TIMES 
 IF ENG==0xB3
LS1DWELL	EQU	D'172'		;172 * 6 / CLOCKRATE 258000 = 4.069 MS DWELL TIME
RX8DWELL	EQU	D'100'		;2.6 MS DWELL FOR RX8 COILS.
RX7DWELL	EQU	D'140'		;3.5 MS DWELL  (RX7 COILS CONTROL THEIR OWN DWELL SO OUR DWELL IS NOT CRITICAL)
 ELSE
LS1DWELL	EQU	D'688'		;688 * 6 / CLOCKRATE 1.031250 = 4.003 MS DWELL TIME
RX8DWELL	EQU	D'416'		;2.6 MS DWELL FOR RX8 COILS.
RX7DWELL	EQU	D'560'		;3.5 MS DWELL  (RX7 COILS CONTROL THEIR OWN DWELL SO OUR DWELL IS NOT CRITICAL)
HONDADWELL	EQU	D'256'		;1.7 MS DWELL	(A REALLY TINY COIL)
 ENDIF
  
;	LIST OF REV LIMITS		SETS POINT WHERE REVF IS SET
 IF ROTARY == 1
RLIMIT	EQU	D'688'		;TPH&L VALUE FOR 7500 RPM  (645 = 8000)
 ELSE					;PISTON ENGINE LIMITS
  IF CONT==0
	 IF (ENG==0xB4)||(ENG==0xA5)
RLIMIT EQU D'700'		;HIGHER LIMIT FOR HONDA OR HEXADYNE
	 ELSE
	 	IF ENG==0xB3		;B3 USES /4 CLOCKS FOR 4 TRIGGERS/ REV  
RLIMIT	EQU	(D'980'/D'4')		;5000 LIMIT FOR EAGLE 540
	 	ELSE
RLIMIT	EQU	D'800'		;6600 LIMIT FOR OTHER PISTON ENGINES  781 = 6600
     	ENDIF
	ENDIF			;END OF NON CONT OPTION
  ELSE 			;FOR CONT OPTION
RLIMIT	EQU	D'1562'		;3300 LIMIT FOR AIRCRAFT ENGINES (CONT OPTION)
  ENDIF
 ENDIF

  


;    ENGINE TIMING CONSTANTS   USE EXCEL SPREADSHEET EC2CONSTANTS.XLS  TO COMPUTE THESE VALUES

 IF (ROTARY==1)			;CONSTANTS FOR ROTARY ENGINES

		;THE FOLLOWING VALUES ARE COMPUTED BY SPREADSHEET  EC2CONSTANTS.XLS				
; IF MAPSENSOR == 0  
   IF (ENG==0xA8)||(ENG==0xB0)||(ENG==0xA3)
   
    IF (ENG==0xA3)||(ENG==0xB0)
				;UPDATED ?  							8 TABLE VERSION 08-12
LTPH		EQU	D'4167'   ;FROM SPREADSHEET   D'1031250'/((LRPM/60)*12)		;tph at low rpm adv point 
HTPH		EQU	D'1563'	  ;FROM SPREADSHEET   D'1031250'/((HRPM/60)*12)		;tph at low rpm adv point
RPMCONST	EQU	D'0104'	  ;FROM SPREADSHEET	  (LTPH-HTPH)/RPMADV  (WAS 54 BEFORE 11-04-06)
MAPCONST	EQU	D'0019'	  ;FROM SPREADSHEET (MAP ADV STR - MAP / MAPCONST = MAP ADVANCE DEGREES
ONEDEGL		EQU D'0139'	  ;FROM SPREADSHEET  (1/(LRPM/60)/360)*1031250   ;ONE DEGREE COUNT AT LOW RPM POINT
MAPADV		EQU D'0011'	  ;FROM SPREADSHEET   MAXIMUM MAP ADVANCE IN DEGREES
MAPADVSTR	EQU	D'0308'	  ;FROM SPREADSHEET   ADC @	24" Hg
MAPADVEND	EQU	D'0102'	  ;FROM SPREADSHEET	ADC @   10" Hg  (WAS 14")
RPMADV		EQU	D'0025'	  ;from spreadsheet		TOTAL # DEG OF RPM ADVANCE
MAPRPMSTR  	EQU D'10313'   ;FROM SPREADSHEET	  (TPH where map adv starts)(compare to TPH MSB IN T2END (LSF SET HERE IF USED)
FULLMAPSTR	EQU	D'6944'	  ;FROM SPREADSHEET	   (MAPADV is cut 50% below this TPH&L [RPM])
DWLSPD		EQU	D'5681'	  ;FROM SPREADSHEET		DSF SPEED FLAG ABOVE WHICH DDF IS NOT USED    

RNG5		EQU	D'1250'		;5000	!< = BK5
RNG4		EQU	D'1563'		;4000 	!< = BK4
RNG3		EQU	D'2717'		;2300	!< = BK3
RNG2		EQU	D'3906'		;1600 	!< = BK2

MINMAP		EQU D'73'		;8"Hg
IPMIN		EQU D'31'		;IPWMIN VALUE (AN IPW COUNTER VALUE)
IRNG		EQU D'54'
	 
    ENDIF		;END OF A3/B0
	
	IF ENG==0xA8

;3438				;UPDATED 01-15-13  FOR EC2
;1289
;86
;19
;115
;11
;308
;102
;25
;8509
;5729
;4688

;1031
;1289
;2242
;3223

;73
;31
;54

LTPH		EQU	D'3438'   ;FROM SPREADSHEET   D'1031250'/((LRPM/60)*12)		;tph at low rpm adv point 2000 rpm
HTPH		EQU	D'1289'	  ;FROM SPREADSHEET   D'1031250'/((HRPM/60)*12)		;tph at low rpm adv point 5000 rpm
RPMCONST	EQU	D'0086'	  ;FROM SPREADSHEET	  (LTPH-HTPH)/RPMADV  (WAS 54 BEFORE 11-04-06)
MAPCONST	EQU	D'0019'	  ;FROM SPREADSHEET (MAP ADV STR - MAP / MAPCONST = MAP ADVANCE DEGREES
ONEDEGL		EQU D'0115'	  ;FROM SPREADSHEET  (1/(LRPM/60)/360)*1031250   ;ONE DEGREE COUNT AT LOW RPM POINT
MAPADV		EQU D'0011'	  ;FROM SPREADSHEET   MAXIMUM MAP ADVANCE IN DEGREES
MAPADVSTR	EQU	D'0308'	  ;FROM SPREADSHEET   ADC @	24" Hg
MAPADVEND	EQU	D'0102'	  ;FROM SPREADSHEET	ADC @   10" Hg  (WAS 14")
RPMADV		EQU	D'0025'	  ;from spreadsheet		TOTAL # DEG OF RPM ADVANCE
MAPRPMSTR  	EQU D'8509'   ;FROM SPREADSHEET	  (TPH where map adv starts)(compare to TPH MSB IN T2END (LSF SET HERE IF USED)
FULLMAPSTR	EQU	D'5729'	  ;FROM SPREADSHEET	   (MAPADV is cut 50% below this TPH&L [RPM])
DWLSPD		EQU	D'4688'	  ;FROM SPREADSHEET		DSF SPEED ABOVE WHICH LOW SPEED DWELL IS DROPPED   (N/U)   

RNG5		EQU	D'1031'		;5000	!< = BK5
RNG4		EQU	D'1289'		;4000 	!< = BK4
RNG3		EQU	D'2242'		;2300	!< = BK3
RNG2		EQU	D'3223'		;1600 	!< = BK2

MINMAP		EQU D'73'		;8"Hg
IPMIN		EQU D'31'		;IPWMIN VALUE (AN IPW COUNTER VALUE)
IRNG		EQU D'54'

	ENDIF		;END OF 0xA8

   ELSE	    ;A1  END OF A8/B0/A3 ENGINES, START OF 2ND & 3RD GEN ROTARY (A1, A2)   UPDATED 02-19-13
 

LTPH		EQU	D'3438'   ;FROM SPREADSHEET   D'1031250'/((LRPM/60)*12)		;tph at low rpm adv point 2000 rpm
HTPH		EQU	D'1289'	  ;FROM SPREADSHEET   D'1031250'/((HRPM/60)*12)		;tph at low rpm adv point 5000 rpm
RPMCONST	EQU	D'0086'	  ;FROM SPREADSHEET	  (LTPH-HTPH)/RPMADV  (WAS 54 BEFORE 11-04-06)
MAPCONST	EQU	D'0017'	  ;FROM SPREADSHEET (MAP ADV STR - MAP / MAPCONST = MAP ADVANCE DEGREES
ONEDEGL		EQU D'0115'	  ;FROM SPREADSHEET  (1/(LRPM/60)/360)*1031250   ;ONE DEGREE COUNT AT LOW RPM POINT
MAPADV		EQU D'0012'	  ;FROM SPREADSHEET   MAXIMUM MAP ADVANCE IN DEGREES
MAPADVSTR	EQU	D'0308'	  ;FROM SPREADSHEET   ADC @	24" Hg
MAPADVEND	EQU	D'0102'	  ;FROM SPREADSHEET	ADC @   10" Hg  (WAS 14")
RPMADV		EQU	D'0025'	  ;from spreadsheet		TOTAL # DEG OF RPM ADVANCE
MAPRPMSTR  	EQU D'8509'   ;FROM SPREADSHEET	  (TPH where map adv starts)(compare to TPH MSB IN T2END (LSF SET HERE IF USED)
FULLMAPSTR	EQU	D'5729'	  ;FROM SPREADSHEET	   (MAPADV is cut 50% below this TPH&L [RPM])
DWLSPD		EQU	D'4688'	  ;FROM SPREADSHEET		DSF SPEED ABOVE WHICH LOW SPEED DWELL IS DROPPED   (N/U)   

RNG5		EQU	D'1031'		;5000	!< = BK5
RNG4		EQU	D'1289'		;4000 	!< = BK4
RNG3		EQU	D'2242'		;2300	!< = BK3
RNG2		EQU	D'3223'		;1600 	!< = BK2

MINMAP		EQU D'73'		;8"Hg
IPMIN		EQU D'31'		;IPWMIN VALUE (AN IPW COUNTER VALUE)
IRNG		EQU D'54'

   ENDIF	;END OF ROTARY W/ 4250 MAP SENSOR
 ENDIF			;END OF ROTARY ENG IGNITION TIMING CONSTANTS

 IF (ENG==0xAB)||(ENG ==0xB1)		;ADDED B6 01-22-10
  IF ((LS2_60_2==1)&&(ENG==0xAB))  ;for LS2 engine with external 60-2 sensor in place of internal LS2 60-2 with different timing)
 
LTPH		EQU	D'3437'   ;FROM SPREADSHEET   D'1.25mhz'/((LRPM/60)*12)		;tph at low rpm adv point 1600 rpm
HTPH		EQU	D'1146'	  ;FROM SPREADSHEET   D'1.25'/((HRPM/60)*12)		;tph at HIGH rpm adv point 4800 rpm
RPMCONST	EQU	D'0115'	  ;FROM SPREADSHEET	  (LTPH-HTPH)/RPMADV
MAPCONST	EQU	D'0014'	  ;FROM SPREADSHEET (MAP ADV STR - MAP / MAPCONST = MAP ADVANCE DEGREES
ONEDEGL		EQU D'0115'	  ;FROM SPREADSHEET  (1/(LRPM/60)/360)*1031250   ;ONE DEGREE COUNT AT LOW RPM POINT
MAPADV		EQU D'0015'	  ;FROM SPREADSHEET   MAXIMUM MAP ADVANCE IN DEGREES
MAPADVSTR	EQU	D'0308'	  ;FROM SPREADSHEET   ADC @	start of map advance 
MAPADVEND	EQU	D'0102'	  ;FROM SPREADSHEET		ADC @ end of map advance
RPMADV		EQU	D'0020'	  ;MAX RPM ADVANCE		TOTAL DEGREES OF  RPM ADVANCE 
MAPRPMSTR  	EQU D'9548'  ;FROM SPREADSHEET	  (TPH where map adv starts)(compare to TPH MSB IN T2END (LSF SET HERE)
FULLMAPSTR	EQU	D'3437'	  ;FROM SPREADSHEET	   (MAPADV is cut 50% below this TPH&L [RPM])
DWLSPD		EQU	D'8593'	  ;FROM SPREADSHEET		SPEED ABOVE WHICH LOW SPEED DWELL IS DROPPED

MINMAP		EQU D'80'		;9"Hg
IPMIN		EQU D'23'		;IPWMIN VALUE (AN IPW COUNTER VALUE)
IRNG		EQU D'44'

  ENDIF			;LS2  WITH EXTERNAL CAS  (0xAB & LS2_60_2)LS2 engine with external 60-2 sensor in place of internal LS2 60-2 with different timing) 
  
  IF (ENG==0xB1)					;LS2 W/ INTERNAL (STOCK) CRANK SENSOR

					;UPDATED  03-26-13

;3438
;1289
;107
;11
;115
;18
;308
;102
;20
;8509
;5729
;4688

;1199
;1473
;2242
;3223

;73
;26
;47
LTPH		EQU	D'3438'   ;FROM SPREADSHEET   D'1031250'/((LRPM/60)*12)		;tph at low rpm adv point 1600 rpm
HTPH		EQU	D'1289'	  ;FROM SPREADSHEET   D'1031250'/((HRPM/60)*12)		;tph at HIGH rpm adv point 4800 rpm
RPMCONST	EQU	D'0107'	  ;FROM SPREADSHEET	  (LTPH-HTPH)/RPMADV
MAPCONST	EQU	D'0011'	  ;FROM SPREADSHEET (MAP ADV STR - MAP / MAPCONST = MAP ADVANCE DEGREES
ONEDEGL		EQU D'0115'	  ;FROM SPREADSHEET  (1/(LRPM/60)/360)*1031250   ;ONE DEGREE COUNT AT LOW RPM POINT
MAPADV		EQU D'0018'	  ;FROM SPREADSHEET   MAXIMUM MAP ADVANCE IN DEGREES
MAPADVSTR	EQU	D'0308'	  ;FROM SPREADSHEET   ADC @	start of map advance 
MAPADVEND	EQU	D'0102'	  ;FROM SPREADSHEET		ADC @ end of map advance
RPMADV		EQU	D'0020'	  ;MAX RPM ADVANCE		TOTAL DEGREES OF  RPM ADVANCE 
MAPRPMSTR  	EQU D'8509'  ;FROM SPREADSHEET	  (LSF  map adv starts)(compare to TPH MSB IN T2END (LSF SET HERE)
FULLMAPSTR	EQU	D'5729'	  ;FROM SPREADSHEET	   (MAPADV is cut 50% below this TPH&L [RPM])
DWLSPD		EQU	D'6000'	  ;FROM SPREADSHEET		DSF  SPEED ABOVE WHICH LOW SPEED DWELL IS DROPPED obsolete disc.

RNG5		EQU	D'1199'		;4300	!< = BK5
RNG4		EQU	D'1473'		;3500 	!< = BK4
RNG3		EQU	D'2242'		;2500	!< = BK3
RNG2		EQU	D'3223'		;1600 	!< = BK2     3223

MINMAP		EQU D'73'		;8"Hg
IPMIN		EQU D'26'		;IPWMIN VALUE (AN IPW COUNTER VALUE) w/31
IRNG		EQU D'47'		;MAP SENSOR OFFSET  w/54

   ENDIF						;END OF B1 & AB
  IF ((ENG==0xAB)&&(LS2_60_2==0))		;AB ENG (LS1 WITH EXTERNAL CAS)
  
LTPH		EQU	D'3437'   ;FROM SPREADSHEET   D'1031250'/((LRPM/60)*12)		;tph at low rpm adv point 1600 rpm
HTPH		EQU	D'1145'	  ;FROM SPREADSHEET   D'1031250'/((HRPM/60)*12)		;tph at HIGH rpm adv point 4800 rpm
RPMCONST	EQU	D'0153'	  ;FROM SPREADSHEET	  (LTPH-HTPH)/RPMADV
MAPCONST	EQU	D'0013'	  ;FROM SPREADSHEET (MAP ADV STR - MAP / MAPCONST = MAP ADVANCE DEGREES
ONEDEGL		EQU D'0115'	  ;FROM SPREADSHEET  (1/(LRPM/60)/360)*1031250   ;ONE DEGREE COUNT AT LOW RPM POINT
MAPADV		EQU D'0016'	  ;FROM SPREADSHEET   MAXIMUM MAP ADVANCE IN DEGREES
MAPADVSTR	EQU	D'0308'	  ;FROM SPREADSHEET   ADC @	start of map advance 
MAPADVEND	EQU	D'0102'	  ;FROM SPREADSHEET		ADC @ end of map advance
RPMADV		EQU	D'0015'	  ;MAX RPM ADVANCE		TOTAL DEGREES OF  RPM ADVANCE 
MAPRPMSTR  	EQU D'9375'  ;FROM SPREADSHEET	  (TPH where map adv starts)(compare to TPH MSB IN T2END (LSF SET HERE)
FULLMAPSTR	EQU	D'2062'	  ;FROM SPREADSHEET	   (MAPADV is cut 50% below this TPH&L [RPM])
DWLSPD		EQU	D'4687'	  ;FROM SPREADSHEET		SPEED ABOVE WHICH LOW SPEED DWELL IS DROPPED

MINMAP		EQU D'80'		;9"Hg
IPMIN		EQU D'23'		;IPWMIN VALUE (AN IPW COUNTER VALUE)
IRNG		EQU D'44'
	
  ENDIF		;END OF 0xAB LS1
 ENDIF		;end of b1, ab
  
 IF (ENG==0xAA)				;FORD V6

;3438		05-14-13
;1289
;69
;17
;115
;12
;308
;102
;31
;8509
;5729
;4688

;1146
;1473
;2063
;3223

;73
;26
;54

LTPH		EQU	D'3438'   ;FROM SPREADSHEET   D'1031250'/((LRPM/60)*12)		;tph at low rpm adv point 1600 rpm
HTPH		EQU	D'1289'	  ;FROM SPREADSHEET   D'1031250'/((HRPM/60)*12)		;tph at HIGH rpm adv point 4800 rpm
RPMCONST	EQU	D'0069'	  ;FROM SPREADSHEET	  (LTPH-HTPH)/RPMADV
MAPCONST	EQU	D'0017'	  ;FROM SPREADSHEET (MAP ADV STR - MAP / MAPCONST = MAP ADVANCE DEGREES
ONEDEGL		EQU D'0115'	  ;FROM SPREADSHEET  (1/(LRPM/60)/360)*1031250   ;ONE DEGREE COUNT AT LOW RPM POINT
MAPADV		EQU D'0012'	  ;FROM SPREADSHEET   MAXIMUM MAP ADVANCE IN DEGREES
MAPADVSTR	EQU	D'0308'	  ;FROM SPREADSHEET   ADC @	start of map advance 
MAPADVEND	EQU	D'0102'	  ;FROM SPREADSHEET		ADC @ end of map advance
RPMADV		EQU	D'0031'	  ;MAX RPM ADVANCE		TOTAL DEGREES OF  RPM ADVANCE 
MAPRPMSTR  	EQU D'8509'  ;FROM SPREADSHEET	  (LSF  map adv starts)(compare to TPH MSB IN T2END (LSF SET HERE)
FULLMAPSTR	EQU	D'5729'	  ;FROM SPREADSHEET	   (MAPADV is cut 50% below this TPH&L [RPM])
DWLSPD		EQU	D'4688'	  ;FROM SPREADSHEET		DSF  SPEED ABOVE WHICH LOW SPEED DWELL IS DROPPED obsolete disc.

RNG5		EQU	D'1146'		;4300	!< = BK5
RNG4		EQU	D'1473'		;3500 	!< = BK4
RNG3		EQU	D'2063'		;2500	!< = BK3
RNG2		EQU	D'3223'		;1600 	!< = BK2     3223

MINMAP		EQU D'73'		;8"Hg
IPMIN		EQU D'26'		;IPWMIN VALUE (AN IPW COUNTER VALUE) w/31
IRNG		EQU D'54'		;MAP SENSOR OFFSET  w/54

 ENDIF		;END OF 0xAA V6

 IF (ENG==0xAD)
				;UPDATED         04-09-10
LTPH		EQU	D'4167'   ;FROM SPREADSHEET   D'1031250'/((LRPM/60)*12)		;tph at low rpm adv point 1800 rpm
HTPH		EQU	D'1250'	  ;FROM SPREADSHEET   D'1031250'/((HRPM/60)*12)		;tph at low rpm adv point 4000 rpm
RPMCONST	EQU	D'0117'	  ;FROM SPREADSHEET	  (LTPH-HTPH)/RPMADV
MAPCONST	EQU	D'0021'	  ;FROM SPREADSHEET (MAP ADV STR - MAP / MAPCONST = MAP ADVANCE DEGREES
ONEDEGL		EQU D'0139'	  ;FROM SPREADSHEET  (1/(LRPM/60)/360)*1031250   ;ONE DEGREE COUNT AT LOW RPM POINT
MAPADV		EQU D'0010'	  ;FROM SPREADSHEET   MAXIMUM MAP ADVANCE IN DEGREES
MAPADVSTR	EQU	D'0308'	  ;FROM SPREADSHEET   ADC @	start of map advance 
MAPADVEND	EQU	D'0102'	  ;FROM SPREADSHEET		ADC @ end of map advance
RPMADV		EQU	D'0025'	  ;MAX RPM ADVANCE		TOTAL DEGREES OF  RPM ADVANCE 
MAPRPMSTR  	EQU D'10313'   ;FROM SPREADSHEET	  (TPH where map adv starts)(compare to TPH MSB IN T2END (LSF SET HERE IF USED)
FULLMAPSTR	EQU	D'4167'	  ;FROM SPREADSHEET	   (MAPADV is cut 50% below this TPH&L [RPM])
DWLSPD		EQU	D'5208'	  ;FROM SPREADSHEET		SPEED ABOVE WHICH LOW SPEED DWELL IS DROPPED

MINMAP		EQU D'80'		;9"Hg
IPMIN		EQU D'23'		;IPWMIN VALUE (AN IPW COUNTER VALUE)
IRNG		EQU D'44'

 ENDIF			;END OF 0xAD
 
 IF ENG==0xA7			;ADDED SEPARATE EJ-22/25 11-01-06
  IF A72007==0
  						;   copied from 0xB1 for test     needs updating to A7 type
  						
LTPH		EQU	D'4167'   ;FROM SPREADSHEET   D'1031250'/((LRPM/60)*12)		;tph at low rpm adv point 1600 rpm
HTPH		EQU	D'1563'	  ;FROM SPREADSHEET   D'1031250'/((HRPM/60)*12)		;tph at HIGH rpm adv point 4800 rpm
RPMCONST	EQU	D'0104'	  ;FROM SPREADSHEET	  (LTPH-HTPH)/RPMADV
MAPCONST	EQU	D'0016'	  ;FROM SPREADSHEET (MAP ADV STR - MAP / MAPCONST = MAP ADVANCE DEGREES
ONEDEGL		EQU D'0139'	  ;FROM SPREADSHEET  (1/(LRPM/60)/360)*1031250   ;ONE DEGREE COUNT AT LOW RPM POINT
MAPADV		EQU D'0013'	  ;FROM SPREADSHEET   MAXIMUM MAP ADVANCE IN DEGREES
MAPADVSTR	EQU	D'0308'	  ;FROM SPREADSHEET   ADC @	start of map advance 
MAPADVEND	EQU	D'0102'	  ;FROM SPREADSHEET		ADC @ end of map advance
RPMADV		EQU	D'0025'	  ;MAX RPM ADVANCE		TOTAL DEGREES OF  RPM ADVANCE 
MAPRPMSTR  	EQU D'11364'  ;FROM SPREADSHEET	  (TPH where map adv starts)(compare to TPH MSB IN T2END (LSF SET HERE)
FULLMAPSTR	EQU	D'6944'	  ;FROM SPREADSHEET	   (MAPADV is cut 50% below this TPH&L [RPM])
DWLSPD		EQU	D'5682'	  ;FROM SPREADSHEET		SPEED ABOVE WHICH LOW SPEED DWELL IS DROPPED

RNG5		EQU	D'1453'		;4300	!< = BK5
RNG4		EQU	D'1786'		;3500 	!< = BK4
RNG3		EQU	D'2500'		;2500	!< = BK3
RNG2		EQU	D'3906'		;1600 	!< = BK2

MINMAP		EQU D'73'		;8"Hg
IPMIN		EQU D'31'		;IPWMIN VALUE (AN IPW COUNTER VALUE)
IRNG		EQU D'54'		;MAP SENSOR OFFSET

  ELSE				;2005 & later EJ25
			;new for iTEC  08-29-11
LTPH		EQU	D'5681'   ;FROM SPREADSHEET   D'1031250'/((LRPM/60)*12)		;tph at low rpm adv point 1800 rpm
HTPH		EQU	D'1453'	  ;FROM SPREADSHEET   D'1031250'/((HRPM/60)*12)		;tph at low rpm adv point 4000 rpm
RPMCONST	EQU	D'0141'	  ;FROM SPREADSHEET	  (LTPH-HTPH)/RPMADV
MAPCONST	EQU	D'0022'	  ;FROM SPREADSHEET (MAP ADV STR - MAP / MAPCONST = MAP ADVANCE DEGREES
ONEDEGL		EQU D'0189'	  ;FROM SPREADSHEET  (1/(LRPM/60)/360)*1031250   ;ONE DEGREE COUNT AT LOW RPM POINT
MAPADV		EQU D'0010'	  ;FROM SPREADSHEET   MAXIMUM MAP ADVANCE IN DEGREES
MAPADVSTR	EQU	D'0308'	  ;FROM SPREADSHEET   ADC @	start of map advance 
MAPADVEND	EQU	D'0088'	  ;FROM SPREADSHEET		ADC @ end of map advance
RPMADV		EQU	D'0030'	  ;MAX RPM ADVANCE		TOTAL DEGREES OF  RPM ADVANCE 
MAPRPMSTR  	EQU D'10313'   ;FROM SPREADSHEET	  (TPH where map adv starts) (ALSO LSF POINT)  
FULLMAPSTR	EQU	D'3906'	  ;FROM SPREADSHEET	   (MAPADV is cut 50% below this TPH&L [RPM])
DWLSPD		EQU	D'5681'	  ;FROM SPREADSHEET		SPEED ABOVE WHICH HARDWARE LOW SPEED DWELL IS DROPPED (INSURES NO DROPPED DWELL)

MINMAP		EQU D'80'		;9"Hg
IPMIN		EQU D'23'		;IPWMIN VALUE (AN IPW COUNTER VALUE)   (about 2 ms)   
IRNG		EQU D'44'
  ENDIF   ;END OF 2005 & LATER A7
 ENDIF
 
 IF (ENG==0xA9)			;EA81 / EJ25 W 60-2 EMT TIMING
  IF CONT==0
   IF TURBO ==1		;THIS IS FOR PAUL MESSENGER (ONE OF A KIND ENGINE)  obsolete

			;UPDATED			;NEW 05-09-12
LTPH		EQU	D'8829'   ;FROM SPREADSHEET   D'1031250'/((LRPM/60)*12)		;tph at low rpm adv point 1800 rpm
HTPH		EQU	D'1563'	  ;FROM SPREADSHEET   D'1031250'/((HRPM/60)*12)		;tph at low rpm adv point 4000 rpm
RPMCONST	EQU	D'0230'	  ;FROM SPREADSHEET	  (LTPH-HTPH)/RPMADV
MAPCONST	EQU	D'0017'	  ;FROM SPREADSHEET (MAP ADV STR - MAP / MAPCONST = MAP ADVANCE DEGREES
ONEDEGL		EQU D'0298'	  ;FROM SPREADSHEET  (1/(LRPM/60)/360)*1031250   ;ONE DEGREE COUNT AT LOW RPM POINT
MAPADV		EQU D'0012'	  ;FROM SPREADSHEET   MAXIMUM MAP ADVANCE IN DEGREES
MAPADVSTR	EQU	D'0308'	  ;FROM SPREADSHEET   ADC @	start of map advance 
MAPADVEND	EQU	D'0102'	  ;FROM SPREADSHEET		ADC @ end of map advance
RPMADV		EQU	D'0032'	  ;MAX RPM ADVANCE		TOTAL DEGREES OF  RPM ADVANCE 
MAPRPMSTR  	EQU D'10416'   ;FROM SPREADSHEET	  (TPH where map adv starts) (ALSO LSF POINT)
FULLMAPSTR	EQU	D'3906'	  ;FROM SPREADSHEET	   (MAPADV is cut 50% below this TPH&L [RPM])
DWLSPD		EQU	D'5208'	  ;FROM SPREADSHEET		SPEED ABOVE WHICH LOW SPEED DWELL IS DROPPED  N/U

MINMAP		EQU D'80'		;9"Hg
IPMIN		EQU D'23'		;IPWMIN VALUE (AN IPW COUNTER VALUE)
IRNG		EQU D'44'

   ELSE		;non turbo, non cont A9
				;UPDATED				;09-21-12
LTPH		EQU	D'4167'   ;FROM SPREADSHEET   D'1031250'/((LRPM/60)*12)		;tph at low rpm adv point 800 rpm
HTPH		EQU	D'1389'	  ;FROM SPREADSHEET   D'1031250'/((HRPM/60)*12)		;tph at low rpm adv point 4000 rpm
RPMCONST	EQU	D'0087'	  ;FROM SPREADSHEET	  (LTPH-HTPH)/RPMADV
MAPCONST	EQU	D'0017'	  ;FROM SPREADSHEET (MAP ADV STR - MAP / MAPCONST = MAP ADVANCE DEGREES
ONEDEGL		EQU D'0139'	  ;FROM SPREADSHEET  (1/(LRPM/60)/360)*1031250   ;ONE DEGREE COUNT AT LOW RPM POINT
MAPADV		EQU D'0012'	  ;FROM SPREADSHEET   MAXIMUM MAP ADVANCE IN DEGREES
MAPADVSTR	EQU	D'0308'	  ;FROM SPREADSHEET   ADC @	start of map advance 
MAPADVEND	EQU	D'0102'	  ;FROM SPREADSHEET		ADC @ end of map advance
RPMADV		EQU	D'0032'	  ;MAX RPM ADVANCE		TOTAL DEGREES OF  RPM ADVANCE 
MAPRPMSTR  	EQU D'10313'   ;FROM SPREADSHEET	  (TPH where map adv starts) (ALSO LSF POINT)
FULLMAPSTR	EQU	D'6944'	  ;FROM SPREADSHEET	   (MAPADV is cut 50% below this TPH&L [RPM])
DWLSPD		EQU	D'5208'	  ;FROM SPREADSHEET		SPEED ABOVE WHICH LOW SPEED DWELL IS DROPPED  N/U

RNG5		EQU	D'1330'		;4700	!< = BK5
RNG4		EQU	D'1786'		;3500 	!< = BK4
RNG3		EQU	D'2500'		;2500	!< = BK3
RNG2		EQU	D'3906'		;1600 	!< = BK2

MINMAP		EQU D'73'		;9"Hg
IPMIN		EQU D'31'		;IPWMIN VALUE (AN IPW COUNTER VALUE)
IRNG		EQU D'54'
   ENDIF			;END OF NON TURBO  
   
  ELSE			;CONT   CONTINENTAL VERSION OF A9 ENGINE  
				;UPDATED			;09-23-12
LTPH		EQU	D'8929'   	;FROM SPREADSHEET   D'1031250'/((LRPM/60)*12)		;tph at low rpm adv point
HTPH		EQU	D'2976'	  	;FROM SPREADSHEET   D'1031250'/((HRPM/60)*12)		;tph at high rpm adv point
RPMCONST	EQU	D'0220'	  	;FROM SPREADSHEET	  (LTPH-HTPH)/RPMADV
MAPCONST	EQU	D'0021'	  	;FROM SPREADSHEET (MAP ADV STR - MAP / MAPCONST = MAP ADVANCE DEGREES
ONEDEGL		EQU D'0298'		;FROM SPREADSHEET  (1/(LRPM/60)/360)*1031250   ;ONE DEGREE COUNT AT LOW RPM POINT
MAPADV		EQU D'0010'	  	;FROM SPREADSHEET   MAXIMUM MAP ADVANCE IN DEGREES
MAPADVSTR	EQU	D'0308'	  	;FROM SPREADSHEET   ADC @	start of map advance 
MAPADVEND	EQU	D'0102'	  	;FROM SPREADSHEET	  ADC @ end of map advance
RPMADV		EQU	D'0027'	  	;FROM SPREADSHEET   MAX RPM ADVANCE		TOTAL DEGREES OF  RPM ADVANCE 
MAPRPMSTR  	EQU D'15625'  	;FROM SPREADSHEET	  (TPH where map adv starts)(compare to TPH MSB IN T2END (LSF SET HERE IF USED)
FULLMAPSTR	EQU	D'12500'	;FROM SPREADSHEET	   (MAPADV is cut 50% below this TPH&L [RPM])
DWLSPD		EQU	D'6250'	;FROM SPREADSHEET		SPEED ABOVE WHICH LOW SPEED DWELL IS DROPPED  

RNG5		EQU	D'2604'
RNG4		EQU	D'2976'
RNG3		EQU	D'3472'
RNG2		EQU	D'6944'

MINMAP		EQU D'73'		;9"Hg
IPMIN		EQU D'21'		;IPWMIN VALUE (AN IPW COUNTER VALUE) note that ipw clock is a lot slower in CONT, makes this value proportionaly LOWER
IRNG		EQU D'54'		;

  ENDIF
 ENDIF

 IF ENG == 0xB5	
				;		updated 09-02-10
LTPH		EQU	D'4166'   ;FROM SPREADSHEET   D'1031250'/((LRPM/60)*12)		;tph at low rpm adv point 1800 rpm
HTPH		EQU	D'1388'	  ;FROM SPREADSHEET   D'1031250'/((HRPM/60)*12)		;tph at low rpm adv point 4000 rpm
RPMCONST	EQU	D'0132'	  ;FROM SPREADSHEET	  (LTPH-HTPH)/RPMADV
MAPCONST	EQU	D'0021'	  ;FROM SPREADSHEET (MAP ADV STR - MAP / MAPCONST = MAP ADVANCE DEGREES
ONEDEGL		EQU D'0139'	  ;FROM SPREADSHEET  (1/(LRPM/60)/360)*1031250   ;ONE DEGREE COUNT AT LOW RPM POINT
MAPADV		EQU D'0010'	  ;FROM SPREADSHEET   MAXIMUM MAP ADVANCE IN DEGREES
MAPADVSTR	EQU	D'0308'	  ;FROM SPREADSHEET   ADC @	start of map advance 
MAPADVEND	EQU	D'0102'	  ;FROM SPREADSHEET		ADC @ end of map advance
RPMADV		EQU	D'0021'	  ;MAX RPM ADVANCE		TOTAL DEGREES OF  RPM ADVANCE 
MAPRPMSTR  	EQU D'10313'   ;FROM SPREADSHEET	  (TPH where map adv starts) (ALSO LSF POINT)
FULLMAPSTR	EQU	D'3125'	  ;FROM SPREADSHEET	   (MAPADV is cut 50% below this TPH&L [RPM])
DWLSPD		EQU	D'5681'	  ;FROM SPREADSHEET		SPEED ABOVE WHICH LOW SPEED DWELL IS DROPPED  N/U

MINMAP		EQU D'80'		;9"Hg
IPMIN		EQU D'23'		;IPWMIN VALUE (AN IPW COUNTER VALUE)
IRNG		EQU D'44'

 ENDIF  ;END OF 0xB5  V6, SVX,XT ETC
 
 IF (ENG==0xB2)			;CORVAIR
LTPH		EQU	D'3437'   ;FROM SPREADSHEET   D'1031250'/((LRPM/60)*12)		;tph at low rpm adv point 1800 rpm
HTPH		EQU	D'1145'	  ;FROM SPREADSHEET   D'1031250'/((HRPM/60)*12)		;tph at low rpm adv point 4000 rpm
RPMCONST	EQU	D'0100'	  ;FROM SPREADSHEET	  (LTPH-HTPH)/RPMADV
MAPCONST	EQU	D'0012'	  ;FROM SPREADSHEET (MAP ADV STR - MAP / MAPCONST = MAP ADVANCE DEGREES
ONEDEGL		EQU D'0114'	  ;FROM SPREADSHEET  (1/(LRPM/60)/360)*1031250   ;ONE DEGREE COUNT AT LOW RPM POINT
MAPADV		EQU D'0017'	  ;FROM SPREADSHEET   MAXIMUM MAP ADVANCE IN DEGREES
MAPADVSTR	EQU	D'0308'	  ;FROM SPREADSHEET   ADC @	start of map advance 
MAPADVEND	EQU	D'0102'	  ;FROM SPREADSHEET		ADC @ end of map advance
RPMADV		EQU	D'0023'	  ;MAX RPM ADVANCE		TOTAL DEGREES OF  RPM ADVANCE 
MAPRPMSTR  	EQU D'9375'   ;FROM SPREADSHEET	  (TPH where map adv starts) (ALSO LSF POINT)
FULLMAPSTR	EQU	D'3683'	  ;FROM SPREADSHEET	   (MAPADV is cut 50% below this TPH&L [RPM])
DWLSPD		EQU	D'4688'	  ;FROM SPREADSHEET		SPEED ABOVE WHICH LOW SPEED DWELL IS DROPPED

MINMAP		EQU D'80'		;9"Hg
IPMIN		EQU D'23'		;IPWMIN VALUE (AN IPW COUNTER VALUE)
IRNG		EQU D'44'

 ENDIF		;B2
 
 IF ENG==0xB3
				;UPDATED  08-2012
LTPH		EQU	D'1042'   ;FROM SPREADSHEET   D'1031250'/((LRPM/60)*12)		;tph at low rpm adv point 1800 rpm
HTPH		EQU	D'0313'	  ;FROM SPREADSHEET   D'1031250'/((HRPM/60)*12)		;tph at low rpm adv point 4000 rpm
RPMCONST	EQU	D'0020'	  ;? FROM SPREADSHEET	  (LTPH-HTPH)/RPMADV
MAPCONST	EQU	D'0021'	  ;FROM SPREADSHEET (MAP ADV STR - MAP / MAPCONST = MAP ADVANCE DEGREES
ONEDEGL		EQU D'0035'	  ;FROM SPREADSHEET  (1/(LRPM/60)/360)*1031250   ;ONE DEGREE COUNT AT LOW RPM POINT
MAPADV		EQU D'0010'	  ;FROM SPREADSHEET   MAXIMUM MAP ADVANCE IN DEGREES
MAPADVSTR	EQU	D'0308'	  ;FROM SPREADSHEET   ADC @	start of map advance 
MAPADVEND	EQU	D'0102'	  ;FROM SPREADSHEET		ADC @ end of map advance
RPMADV		EQU	D'0036'	  ;MAX RPM ADVANCE		TOTAL DEGREES OF  RPM ADVANCE 
MAPRPMSTR  	EQU D'2578'   ;FROM SPREADSHEET	  (TPH where map adv starts) (ALSO LSF POINT)
FULLMAPSTR	EQU	D'1736'	  ;FROM SPREADSHEET	   (MAPADV is cut 50% below this TPH&L [RPM])
DWLSPD		EQU	D'1302'	  ;FROM SPREADSHEET		SPEED ABOVE WHICH LOW SPEED DWELL IS DROPPED

RNG5		EQU	D'372'
RNG4		EQU	D'473'
RNG3		EQU	D'679'
RNG2		EQU	D'977'

MINMAP		EQU D'73'		;9"Hg
IPMIN		EQU D'31'		;IPWMIN VALUE (AN IPW COUNTER VALUE)
IRNG		EQU D'54'
 
 ENDIF
 
 IF (ENG==0xB4)			;HONDA
				;	06-16-09
LTPH		EQU	D'4166'   ;FROM SPREADSHEET   D'1031250'/((LRPM/60)*12)		;tph at low rpm adv point 1800 rpm
HTPH		EQU	D'1388'	  ;FROM SPREADSHEET   D'1031250'/((HRPM/60)*12)		;tph at low rpm adv point 4000 rpm
RPMCONST	EQU	D'0185'	  ;? FROM SPREADSHEET	  (LTPH-HTPH)/RPMADV
MAPCONST	EQU	D'0016'	  ;FROM SPREADSHEET (MAP ADV STR - MAP / MAPCONST = MAP ADVANCE DEGREES
ONEDEGL		EQU D'0139'	  ;FROM SPREADSHEET  (1/(LRPM/60)/360)*1031250   ;ONE DEGREE COUNT AT LOW RPM POINT
MAPADV		EQU D'0013'	  ;FROM SPREADSHEET   MAXIMUM MAP ADVANCE IN DEGREES
MAPADVSTR	EQU	D'0308'	  ;FROM SPREADSHEET   ADC @	start of map advance 
MAPADVEND	EQU	D'0102'	  ;FROM SPREADSHEET		ADC @ end of map advance
RPMADV		EQU	D'0015'	  ;MAX RPM ADVANCE		TOTAL DEGREES OF  RPM ADVANCE 
MAPRPMSTR  	EQU D'10313'  ;FROM SPREADSHEET	  (TPH where map adv starts) (ALSO LSF POINT)
FULLMAPSTR	EQU	D'3125'	  ;FROM SPREADSHEET	   (MAPADV is cut 50% below this TPH&L [RPM])
DWLSPD		EQU	D'5681'	  ;FROM SPREADSHEET		SPEED ABOVE WHICH LOW SPEED DWELL IS DROPPED

MINMAP		EQU D'80'		;9"Hg
IPMIN		EQU D'23'		;IPWMIN VALUE (AN IPW COUNTER VALUE)
IRNG		EQU D'44'

 ENDIF				;B4

 IF ENG==0xA5			;HEXADYNE 2 CYLINDER

LTPH		EQU	D'3437'   ;FROM SPREADSHEET   D'1031250'/((LRPM/60)*12)		;tph at low rpm adv point 1800 rpm
HTPH		EQU	D'1145'	  ;FROM SPREADSHEET   D'1031250'/((HRPM/60)*12)		;tph at low rpm adv point 4000 rpm
RPMCONST	EQU	D'0092'	  ;? FROM SPREADSHEET	  (LTPH-HTPH)/RPMADV
MAPCONST	EQU	D'0016'	  ;FROM SPREADSHEET (MAP ADV STR - MAP / MAPCONST = MAP ADVANCE DEGREES
ONEDEGL		EQU D'0115'	  ;FROM SPREADSHEET  (1/(LRPM/60)/360)*1031250   ;ONE DEGREE COUNT AT LOW RPM POINT
MAPADV		EQU D'0013'	  ;FROM SPREADSHEET   MAXIMUM MAP ADVANCE IN DEGREES
MAPADVSTR	EQU	D'0308'	  ;FROM SPREADSHEET   ADC @	start of map advance 
MAPADVEND	EQU	D'0102'	  ;FROM SPREADSHEET		ADC @ end of map advance
RPMADV		EQU	D'0025'	  ;MAX RPM ADVANCE		TOTAL DEGREES OF  RPM ADVANCE 
MAPRPMSTR  	EQU D'9375'   ;FROM SPREADSHEET	  (TPH where map adv starts) (ALSO LSF POINT)
FULLMAPSTR	EQU	D'2578'	  ;FROM SPREADSHEET	   (MAPADV is cut 50% below this TPH&L [RPM])
DWLSPD		EQU	D'7366'	  ;FROM SPREADSHEET		SPEED ABOVE WHICH LOW SPEED DWELL IS DROPPED

MINMAP		EQU D'80'		;9"Hg
IPMIN		EQU D'23'		;IPWMIN VALUE (AN IPW COUNTER VALUE)
IRNG		EQU D'44'

 ENDIF		;END OF HEXADYNE

 IF (ENG==0xAE)			; SVX 
				;				NEW VALUES 12-14-12


LTPH		EQU	D'3438'   ;FROM SPREADSHEET   D'1031250'/((LRPM/60)*12)		;tph at low rpm adv point 1800 rpm
HTPH		EQU	D'1289'	  ;FROM SPREADSHEET   D'1031250'/((HRPM/60)*12)		;tph at low rpm adv point 4000 rpm
RPMCONST	EQU	D'0069'	  ;? FROM SPREADSHEET	  (LTPH-HTPH)/RPMADV
MAPCONST	EQU	D'0017'	  ;FROM SPREADSHEET (MAP ADV STR - MAP / MAPCONST = MAP ADVANCE DEGREES
ONEDEGL		EQU D'0115'	  ;FROM SPREADSHEET  (1/(LRPM/60)/360)*1031250   ;ONE DEGREE COUNT AT LOW RPM POINT
MAPADV		EQU D'0012'	  ;FROM SPREADSHEET   MAXIMUM MAP ADVANCE IN DEGREES
MAPADVSTR	EQU	D'0308'	  ;FROM SPREADSHEET   ADC @	start of map advance 
MAPADVEND	EQU	D'0102'	  ;FROM SPREADSHEET		ADC @ end of map advance
RPMADV		EQU	D'0031'	  ;MAX RPM ADVANCE		TOTAL DEGREES OF  RPM ADVANCE 
MAPRPMSTR  	EQU D'8509'   ;FROM SPREADSHEET	  (TPH where map adv starts) (ALSO LSF POINT)
FULLMAPSTR	EQU	D'5729'	  ;FROM SPREADSHEET	   (MAPADV is cut 50% below this TPH&L [RPM])
DWLSPD		EQU	D'4688'	  ;FROM SPREADSHEET		SPEED ABOVE WHICH LOW SPEED DWELL IS DROPPED

RNG5		EQU	D'1146'
RNG4		EQU	D'1473'
RNG3		EQU	D'2063'
RNG2		EQU	D'3223'

MINMAP		EQU D'73'		;9"Hg
IPMIN		EQU D'31'		;IPWMIN VALUE (AN IPW COUNTER VALUE)
IRNG		EQU D'54'

 ENDIF				;AE

;RPMDELTA	EQU MAPRPMSTR - LRPMMAP			;50= TPH @ 400 RPM (BASE OF RPM MAP TABLE)  VAL=42
;MAPFACTOR	EQU RPMDELTA / D'32'			;VAL = D'11'?

#DEFINE _C	STATUS,C,0	;ALIAS FOR CY BIT



;NEW 18F6680 DEFINITIONS 

	; MISC BIT DEFINITIONS
#DEFINE	DLC		PORTE,1,0	;DISABLE LEAD COIL
#DEFINE	DATC	PORTE,0,0	;DISABLE TRAIL COIL

 ;   ALL ENGINES
#DEFINE	FC1		PORTD,0,0       	;WAS FLC1
#DEFINE	FC2		PORTD,1,0			;WAS FTC1
#DEFINE	FC3		PORTD,2,0			;WAS FLC2
#DEFINE	FC4		PORTD,3,0			;WAS FTC2
 IF (ENG==0xAE)||(ENG==0xAA)
  IF NEWBOARD==1		;USING PORT E BITS 0 & 1 ON NEWBOARD  
#DEFINE FC5 PORTE,0,0		;J1-9
#DEFINE FC6 PORTE,1,0		;JUMPER TO J1-8
  ELSE						;FOR OLD BOARD VERSION
#DEFINE FC5	LATF,2,0				;PORTF,2,0	(J1-9) SVX OUTPUTS FOR COIL DRIVERS (must use latch address, not port !!!!!)
#DEFINE FC6 LATF,3,0				;PORTF,3,0  (J1-8)
  ENDIF
 ENDIF						;END OF SVX FC5&6 DEFS
		
#DEFINE FI1	PORTD,4,0		;FUEL INJECTOR SWITCHES   (ALL ENGINES)
#DEFINE FI2	PORTD,5,0
#DEFINE FI3	PORTD,6,0
#DEFINE FI4	PORTD,7,0

 IF NEWBOARD == 0				;DEFINE COLD START INPUT PORT BIT  DIFFERENT ON NEW REV F BOARD
#DEFINE	CLDSW	PORTB,7,0		;PORT B BIT 7 COLD START SWITCH
 ELSE
#DEFINE	CLDSW	PORTC,2,0		;PORT C BIT 2 COLD START SWITCH
 ENDIF
#DEFINE	MODESW	PORTG,0				;PORT G BITS 0-3 IS MODE BCD SWITCH 
#DEFINE	PGMWR	PORTC,5,0	;PORT C BIT 5 (WAS PORT B,6) (PROGRAM WRITE SW)
ENDASM
;	__________________________________ BANK 0 RAM ASSIGNMENTS  ________________________________________________
;LEAVING ALL RAM IN BK0 AVAILABLE TO PBP IN THE EVENT THAT WE MIGRATE TO PBP

;PBP DEFINITIONS (IF WE MIGRATE TO PBP)
;	MYRAM	CON 	$30				'RAM ASSIGNMENTS IN BANK0 START AT $30 (GIVES ROOM FOR PBP VARS IN 0 - 2F

;	SWREG	VAR BYTE MYRAM + 1    	'save area for interrupts (pop & push)
;	SSTATUS	VAR	BYTE MYRAM + 2
;	SBSR	VAR	BYTE MYRAM + 3
;	STAT0	VAR	BYTE MYRAM + 4 		'STATUS WORD 0 (USER STATUS BITS)
;	STAT1	VAR	BYTE MYRAM + 5
;	STAT2	VAR	BYTE MYRAM + 6
;	STAT3	VAR	BYTE MYRAM + 7
;	STAT4	VAR	BYTE MYRAM + 8
;	SS0		VAR	BYTE MYRAM + 9		'SERIAL STATUS WORD 0

ASM
;	__________________________________ BANK 1 RAM ASSIGNMENTS  ________________________________________________
STAT0	EQU	0x100			;Note that non-banked address would be 100 - 1FF
STAT1	EQU	0x101
STAT2	EQU	0x102
STAT3	EQU	0x103
STAT4	EQU	0x104
SEQFLAG EQU 0x105		;SEQUENCE FLAGS R1F - R8F
STAT5	EQU	0x106		;ADDED IN CLVER

#DEFINE	VT		STAT0,0,1		; VT = VALID TIMING (SET BY MATH)
#DEFINE	STRF	STAT0,2,1		;START FLAG (TELLS EXEC TO DO KO ROUT)
#DEFINE T2F		STAT0,3,1		;TELLS TM0 ROUT THAT T2 INTERVAL BEING MEASURED
#DEFINE	ALT		STAT0,4,1		;PISTON ENGINE INJECTOR ALTERNATE CYCLE BIT   A7 USES TO DOUBLE RANGE OF DTCL
#DEFINE	SYNF	STAT0,5,1
  IF (ENG==0xA8)||(ENG==0xAD)||(ENG==0xB0)||(ENG==0xA7 && A72007==1)
#DEFINE	S2CK	STAT0,6,1		;SYNC 2 CHECK FLAG (SYNC1 FOUND ON LAST TP2 EVENT, NOW CK FOR SYNC2)
#DEFINE	SYNF1	STAT0,7,1		;FLAG TO INDICATE THAT SYNC INTERVAL HAS BEEN FOUND
  ELSE
#DEFINE	S2CK	STAT0,6,1		;
#DEFINE	T1F		STAT0,7,1
  ENDIF

ENDASM
ASM
			;STAT1 BIT ASSIGNMENTS

#DEFINE	REVF	STAT1,0,1	;REV LIMIT FLAG
#DEFINE	MF		STAT1,1,1	;MATH FLAG (DO IGNITION TIMING CALCS)
#DEFINE	CAF		STAT1,2,1	;CONTROLLER A FLAG (SET IF ABDET BIT IS GROUNDED)
#DEFINE IPWX2	STAT1,3,1	; FOR TM2 SLOWDOWN ON UNISYNC ENGINES (SYNC INTERVAL DETECT ON SINGLE CAS)
#DEFINE ACCF	STAT1,4,1	;ACCELERATION FLAG
#DEFINE	SFLAG	STAT1,5,1	;STAGED INJECTION FLAG (SET WHEN STAGGED CONDITION DETECTED (RUNNING ONLY ON PRIMARIES)
#DEFINE	RMAP	STAT1,6,1	;RPM MAP RANGE FLAG (FOR RPMMAP OPTION)  WAS TOOHI
#DEFINE ANF		STAT1,7,1	;ANALOG TIME FLAG (TELL EXEC TO ANALOG)

#DEFINE WRFLAG 	STAT2,0,1	;EEPROM WRITE FLAG
#DEFINE	ASF		STAT2,1,1	;CONTROLLER A SELECTED FLAG
 IF ENG == 0xA2		;MAZDA COIL SELECT LOGIC
#DEFINE CS1SF	STAT2,2,1	;COIL SELECT SET FLAG
#DEFINE CS1CF	STAT2,3,1	;COIL SELECT CLEAR FLAG
 ELSE
#DEFINE DDF		STAT2,2,1	;DWELL DROP FLAG
  IF (ENG==0xA7 && A72007==1)
#DEFINE T1F		STAT2,3,1	;CAM FOUND ON 2007 OR LATER SUBE EJ25 ENG
  ENDIF
 ENDIF			

#DEFINE OLF		STAT2,4,1	 ;ON LINE FLAG (SELECTED)
#DEFINE LSF		STAT2,5,1	;SLOW SPEED DWELL FLAG   12-03-00
#DEFINE	DSF		STAT2,6,1	;DWELL SPEED FLAG  (POINT WERE Low speed (HARDWARE CONTROLLED DWELL) is USED	
#DEFINE	EEWRC	STAT2,7,1	;EE WRITE COMPLETE  (SET BY EEIF INT ROUT,  WAS I2C INTERRUPT FLAG

;STAT3 DEFINITIONS

#DEFINE MTF 	STAT3,0,1		;MAXIMUM TRIM FLAG   MAY BE MAX + (255) OR - (000) VALUE REACHED ON TRIM		
#DEFINE TWF    	STAT3,1,1		;TRIM WRITE FLAG   TELLS EXEC TO UPDATE THE MAP TABLE IN RESPONSE TO MTF TRIM
#DEFINE INJ1	STAT3,2,1		;FLAGS TO TELL TMR 2 TO DECREMENT THE INJECTION TIMERS
#DEFINE INJ2	STAT3,3,1		;
#DEFINE	INJ3	STAT3,4,1		;INJECTOR  FLAG FOR TIMER2 (IPW HAS BEEN LOADED & OK TO DECREMENT)
#DEFINE	INJ4	STAT3,5,1		;INJECTOR  FLAG FOR TIMER2 (IPW HAS BEEN LOADED & OK TO DECREMENT)
#DEFINE	INJ5	STAT3,6,1		;INJECTOR  FLAG FOR TIMER2 (IPW HAS BEEN LOADED & OK TO DECREMENT)
#DEFINE INJ6	STAT3,7,1

;	STAT4 DEFS

#DEFINE CMDEXF	STAT4,0,1		;SER CMD EXECUTE FLAG FOR EXEC	BLUE MOUNTAIN
#DEFINE WRSF	STAT4,1,1		;WRITE SWITCH STATUS FLAG (1 = SW DOWN)
#DEFINE EEWERF	STAT4,2,1		;EEWRITE ERROR FLAG 
#DEFINE SERF	STAT4,3,1		;SERIAL FLAG (TELL EXEC TO OUTPUT ENGINE PARAMETERS TO SER.	
#DEFINE RPTF	STAT4,4,1		;REPEAT FLAG FOR USE WHEN REPEATING A STEP AS IN AN2 RESAMPLE.
#DEFINE PGMF	STAT4,5,1		;PROGRAM MODE ACTIVE FLAG (ONE OR MORE PGM MODE SEL BITS ARE LOW)
#DEFINE EEWF	STAT4,6,1		;EEPROM WRITE ACTIVE FLAG
#DEFINE EEBF	STAT4,7,1		;EE BAD FLAG


#DEFINE R1F		SEQFLAG,0,1		;SEQUENCE FLAGS
#DEFINE R2F		SEQFLAG,1,1		;SEQUENCE FLAGS
#DEFINE R3F		SEQFLAG,2,1		;SEQUENCE FLAGS
#DEFINE R4F		SEQFLAG,3,1		;SEQUENCE FLAGS
#DEFINE R5F		SEQFLAG,4,1		;SEQUENCE FLAGS
#DEFINE R6F		SEQFLAG,5,1		;SEQUENCE FLAGS
#DEFINE R7F		SEQFLAG,6,1		;SEQUENCE FLAGS
#DEFINE R8F		SEQFLAG,7,1		;SEQUENCE FLAGS

#DEFINE TPTRD	STAT5,0,1		;TAble pointer delta tptr changed during past 1 second  ********   CLVER
#DEFINE MPSF	STAT5,1,1		;MANIFOLD PRESSURE STABLE FLAG FLAG   ********   CLVER
#DEFINE CLUF	STAT5,2,1		;CL TRIM UPDATE FLAG (EVERY 15 MS?) AT CLTMR VALUE OF 60
#DEFINE O2F		STAT5,3,1		;NEW STATUS OF 02 SENSOR (<> THRESHOLD)
#DEFINE O2D		STAT5,4,1		;O2 STATUS DELTA (IT CHANGED RECENTLY)
#DEFINE O2OLD	STAT5,5,1		;OLD O2 STATUS

;  NOTE!  107 - 10F  bk1 OPEN FOR USE
						;THESE ARE BK 1 VARS   REMEMBER THE "1" IN FRONT)

EDLIST		EQU 0x110		;ENGINE DATA LIST START ADDRESS

;ROW 1

 If DIAG == 0
O2L			EQU	0x110	;ANALOG VARIABLE STORAGE AREA   O2L&H
TRIM		EQU	0x111
 ELSE
O2L			EQU 0x1AA
TRIM		EQU	0x1AB
 ENDIF
MAPL		EQU	0x112
MAPH		EQU	0x113
TEMPL		EQU	0x114
TEMPH		EQU	0x115
PGMV		EQU	0x116

;ROW 2

MTPTR		EQU	0x117	;MTPTR - MCT POINTER PASED ON MP ALONE, NO RPM
MIXL		EQU	0x118
MIXH		EQU	0x119
IPWL		EQU 0x11A
IPWH		EQU 0x11B
TPTR		EQU	0x11C	;TABLE POINTER in use  0 - 63 CORRESPONDS TO 10 - 34" Hg NA OR 10 - 50" TURBO ALSO USED FORE RPM TABLE
TDAT		EQU	0x11D	;TABLE DATA @ TPTR

;ROW 3

TPL			EQU	0x11E	;TP2 INTERVAL   (30 DEGREES)
TPH			EQU	0x11F
R1DIF		EQU	0x120	;ROTOR 1&2 DIFFERENTIAL FACTORS (USED WHEN STAGING)  (1ST ADDRESS OF ENGine setup data IN EEPROM)
R2DIF		EQU	0x121   ;(20B ONLY)
SECDIF  	EQU	0x122	;SECONDARY INJECTOR DIFFERENTIAL
PFUN		EQU	0x123	;PROGRAM FUNCTION ON MODE SWITCH(BE AWARE THAT PFUN LOADED FROM EEPROM ON P/U) (FOR BACK COMPATIBILITY)
IPWCR		EQU	0x124	;IPW CLOCK RATE

;ROW 4

ENGCODE		EQU	0x125	;ENGINE TYPE CODE 0xA0 - XXX
ENGINFO		EQU	0x126	;ENGINE INFO(0=TURBO),1=LGSEC,2=RX8COIL,3=TEMPSENSOR,4=REng,5=BUSENSOR,6=CONT,7=CSON :4 WAS MAPSENSOR
STHRESH		EQU	0x127	;INJECTOR STAGING THRESHOLD  THIS IS NOT A MAP TABLE ADDRESS, NOW A MAPL VALUE! 
IGNADJ		EQU	0x128	;IGNITION ADVANCE VARIABLE 

;  **** STAGING FLAG IN BIT 0 IS SENT BY ENGINE DATA FRAME HERE  ***  BYTE #26 OF ENG DATA FRAME BIT 0= SFLAG

IPWRNG		EQU	0x129	;NEW ADR FOR THIS 01-25-08 
RPMTHRESH	EQU	0x12A	;MAP TABLE ADDRESS THRESHOLD BELOW WHICH RPM TABLE IS USED.#27 *** LAST BYTE ON EM2 ENG DATA SCREEN 

R1DIFA		EQU	0x12B	;ROTOR 1 DIFFERENTIAL FACTOR WHEN NOT STAGGING  
R2DIFA		EQU 0x12C	;ROTOR 2 DIFFERENTIAL FACTOR WHEN NOT STAGGING  (20B only)	(30TH BYTE OF ENG DATA FRAME)
IPWMIN		EQU	0x12D	;IPW THRESHOLD FOR INJECTOR
O2THRESH	EQU	0x12E	;O2 SENSOR MIDRANGE THRESHOLD
						;LAST ADR CURRENTLY USED OF EEPROM STORAGE FOR VARIABLES.


VBATL		EQU	0x130	;BATTERY VOLTAGE, FOR IPW COMPENSATION W/ BAT VOLTAGE. (! (AD / 2) - FACTOR) = 255 AT Vin = 14.33 VDC  
VBATH		EQU	0x131	;ALTERNATE LOCATION FOR RESEARCH

;				0x12F - 0x138  OPEN FOR EXPANSION OF ENGINE RELATED VARIABLES ONLY

#DEFINE		TRB		ENGINFO,0,1		; TURBO   NEW NAMES FOR THESE BITS IN PROGRAM
#DEFINE		LSEC	ENGINFO,1,1		;LGSEC NAME
#DEFINE 	O2SEN   ENGINFO,2,1	;O2 SENSOR TYPE   O2 SENSOR SELECT  1 = WIDEBAND , 0 =  NARROWBAND
;#DEFINE 	RX8DF   ENGINFO,2,1	;RX8 DWELL FLAG	(SLECTS DWELL TIME OF 2.8MS INSTEAD OF 4.8 MS IF SET)
#DEFINE		BUSIN	ENGINFO,5,1	;MAKING BACKUP SENSOR A USER SELECTABLE BIT  (loaded
#DEFINE		CSON	ENGINFO,7,1	;COLD START SWITCH STATUS	1 = COLDSTART SWITCH ON
#DEFINE		RENG	ENGINFO,4,1	;FLAG FOR ROTARY ENGINE CONTROLLER
;#DEFINE		CONT	ENGINFO,6,1	;  Flag for cont engine (slow turning AC engines)

;NOTE  !!!!!!!!!!  O2L  - IGNADJ MUST BE IN SEQUENTIAL RAM ADDRESSES (EEPROM LOADED)

;   STAGING FLAG IS SENT AFTER THE ABOVE DATA IN ENGINE DATA FRAME  (26 BYTES TOTAL)

IARGL		EQU	0x139	;INTERRUP ARGUMENT  USE ONLY INSIDE INTERRUPT ROUTS
IARGH		EQU	0x13A	;  "

SDL			EQU	0x13B	;SPARK DELAY , TIMER 0 RELOAD VALUE    
SDH			EQU	0x13C

;R1DIF		EQU	0x13B	;ROTOR 1&2 DIFFERENTIAL FACTORS (USED WHEN STAGING)  (1ST ADDRESS OF ENGine setup data IN EEPROM)   TEST FOR SISPLAYING STUFF ON EM3
;R2DIF		EQU	0x13C   ;(20B ONLY)

						;13D,13E OPEN

SINL		EQU	0x13F	;SCALE INPUT VALUE L & H
SINH		EQU	0x140	
DELTAL		EQU	0x141	;DELTA IN SCALE ROUT
DELTAH		EQU	0x142
DMAXL		EQU	0x143	;DELTA MAX IN SCALE ROUT
DMAXH		EQU	0x144
SCAL		EQU	0x145	;SCALE FACTOR IN SCALE ROUT
SCAH		EQU	0x146
OPC			EQU	0x147	;OIL PUMP COUNT  (USED TO TIME OIL PUMP COMMANDS TO CONTROLLER)
T2L			EQU	0x148	;T2 /2, /4, /8
T2H			EQU	0x149
T4L			EQU	0x14A
T4H			EQU	0x14B
T8L			EQU	0x14C
T8H			EQU	0x14D
T16L		EQU	0x14E
T16H		EQU	0x14F

DWL			EQU	0x150	;OFF TIME DWELL COUNT 
DWLH		EQU	0x151	;MSB OF DWELL ON SLOW ENGINES (CONT OPT.)
LP1D		EQU	0x152	;LEAD COIL1 DWELL
LP1DH		EQU	0x153	;LEAD COIL 2 DWELL
LP2D		EQU	0x154	;LEAD COIL 3 DWELL  (FOR 20B VERSION ONLY)
LP2DH		EQU	0x155
LP3D		EQU	0x156
LP3DH		EQU	0x157
LP4D		EQU	0x158
LP4DH		EQU	0x159

ABDET		EQU	0x15A	;A/B DETECTION WORD.  ANALOG CH 4 USED TO DETECT GND OR +5  CHIP==1 ONLY
IPW1L		EQU	0x15B	;IPW COUNTER RELOAD VALUES (IPW SCALED W/ DIFFERENTIALS)
IPW1H		EQU	0x15C
IPW2L		EQU	0x15D
IPW2H		EQU	0x15E
R1ITL		EQU	0x15F	;ROTOR INJECTION TIMERS
R1ITH		EQU	0x160
R2ITL		EQU	0x161	
R2ITH		EQU	0x162	
R3ITL		EQU	0x163	
R3ITH		EQU	0x164 	
R4ITL		EQU	0x165	;20b ONLY
R4ITH		EQU	0x166	;SPARE		EQU	0x15B
R5ITL		EQU	0x167
R5ITH		EQU	0x168
R6ITL		EQU	0x169	;ROTOR INJECTION TIMERS
R6ITH		EQU	0x16A	
R7ITL		EQU	0x16B	
R7ITH		EQU	0x16C 	
R8ITL		EQU	0x16D
R8ITH		EQU	0x16E

TX2L		EQU	0x16F		;TPL X 2 FOR DWELL CALCULATION
TX2H		EQU	0x170		;TPH X 2 FOR DWELL CALC

STEP		EQU	0x171	;STEP RENESIS ONLY     OIL CONTROLLER USE ONLY (CURRENT STEP # THAT OIL INJECTION PUMP IS ON)
T1CNT		EQU	0x172	;T1 COUNTER  
T2CNT		EQU	0x173

EETMR		EQU	0x174	;TIMEOUT TIMER FOR EEPROM FUNCTIONS
DLYCTR		EQU	0x175	;COUNTER USED IN DELAY ROUT
WC			EQU	0x176	;EEPROM WRITE WORD COUNT
CTR			EQU	0x177	;COUNTER USED IN SOME ROUTINES 
WRK			EQU	0x178	;WORK REG USED IN VARIOUS ROUTINES
ACCNT		EQU	0x179    ;ACCELERATION COUNT

AARGL		EQU	0x17A	;MATH ROUTINE ARGUMENT & RESULT REGISTERS
AARGH		EQU	0x17B
BARGL		EQU	0x17C
BARGH		EQU	0x17D
RES0		EQU	0x17E
RES1		EQU	0x17F
RES2		EQU	0x180
RES3		EQU	0x181
REML		EQU	0x182

SYNCL		EQU	0x183  ;USED ON ENG 0xA4,A6,A8,AB,B0 ONLY
SYNCH		EQU	0x184  ;
DTCL		EQU	0x185	;DEAD TIME CTR LSB
DTCH		EQU	0x186

TOLDL		EQU	0x187	;USED ON ENG 0xA4 & A6 & A8 & A9,AB,B0  ONLY
TOLDH		EQU	0x188	;
AUXT		EQU	0x189
SS0			EQU	0x18A	;SERIAL STATUS WORD 0
CMDREG		EQU	0x18B	;COMMAND REGISTER   (LAST COMMAND RECEIVED)

REMH		EQU	0x18C
CMDDL		EQU	0x18D	;COMMAND DATA LSB	
CMDDH		EQU	0x18E 	;MSB
SBL			EQU	0x18F	;SER BYTE LSB FOR SER OUT XFERS
SBH			EQU	0x190	;SER BYTE MSB FOR SER OUT ROUT
CLTMR		EQU	0x191	;NUMBER OF DWELL CLOCKS BETWEEN CL TRIM UPDATES
SWCNT		EQU	0x192	;BYTE COUNT TO OUTPUT FROM SERIAL CHANEL
SAVE1		EQU	0x193	;TEMP STORAGE IN BK1
SDDL		EQU	0x194	;SERIAL DATA REG IN BK1 (USED TO ASSEMBLE 2 7-BYTE XFERS INTO A SINGLE 8 BIT BYTE)

TEMP_WREG   EQU 0x195	;save area for interrupts (popA & pushA)
TEMP_STATUS EQU 0x196
TEMP_BSR    EQU 0x197
SIPTRL		EQU 0x198	;SER INPUT BUFFER PTR   (BK 3 IS NORMAL INPUT BUFFER AREA)
SIPTRH		EQU 0x199
SOPTRL		EQU 0x19A	;SER OUTPUT BUFFER PTR  (USE BK 4 FOR OUTPUT BUFFER)
SOPTRH		EQU 0x19B
WSAL		EQU	0x19C	;WORD START ADDRESS LSB FOR EEPROM READ & WRITE
WSAH		EQU	0x19D
MAPTEMPH	EQU	0x19E	;TEMP STORAGE OF MAP (USED ON 0xA5 ENGINE )
MAPTEMPL	EQU 0x19F
WORKL		EQU	0x1A0	;TEMP WORKING REG
WORKH		EQU 0x1A1
TPLOLD		EQU	0x1A2
TPHOLD		EQU	0x1A3
WRWIT		EQU	0x1A4	;WRITE WIDTH FOR MODE 1 & 9
FFL			EQU	0x1A5	;  FUEL FLOW
FFH			EQU	0x1A6	;
						;N/U?
TPLTEMP		EQU 0x1A8
TPHTEMP		EQU 0x1A9
DTCPS		EQU	0x1AC		;DEAD TIME COUNTER PRESCALLER
TRMDL		EQU 0x1AD		;TRIM DELAY LSB
TRMDH		EQU 0x1AE		;TRIM DELAY MSB
TPTROLD		EQU	0x1AF		;OLD TPTR  FOR -8 VER
ARGLTEMP	EQU 0x1B0		;TEMP STORAGE WHEN WE WANT TO USE DIV IN INT ROUTS.
ARGHTEMP	EQU 0x1B1
BARGLTEMP	EQU 0x1B2		;

;0x1A8 - 0x1FF   available BK1 ram
;   ADDRESS LABLE ASSIGNMENTS FOR EEPROM (VARIABLE NAME W/ 'ADR' SUFFIX 

R1DIFADR		EQU	0x00	;ROTOR 1&2 DIFFERENTIAL FACTORS (USED WHEN STAGING)  (START ADR OF ENGine setup data IN EEPROM)
R2DIFADR		EQU	0x01   ;(20B ONLY)
SECDIFADR  		EQU	0x02	;SECONDARY INJECTOR DIFFERENTIAL
PFUNADR			EQU	0x03	;PFUN STORAGE (NOT USED)
IPWCRADR		EQU	0x04	;IPW CLOCK RATE
;    NOTE THAT ENGCODE IS PROGRAMMED IN 2 PLACES IN EEPROM  0x05 AND 0x10
;ENGCODE		EQU	0x05	;ENG CODE ADDRESS IN EEPROM		NOT USED EXCEPT FOR DISPLAY IN EM3/2
ENGINFOADR		EQU	0x06	;ENGINE INFO BYTE (0=TURBO),1=LGSEC,2=RX8COIL,3=TEMPSENSOR,4=RENG,5=BUSENSOR,6=CONT,7=RPMMAP
STHRESHADR		EQU	0x07	;INJECTOR STAGING THRESHOLD  THIS IS A MAP TABLE ADDRESS!  USED IN 
IGNADJADR		EQU	0x08	;IGNITION ADVANCE VARIABLE
IPWRNGADR		EQU	0x09	;NEW ADR FOR THIS 01-25-08  MOVED!!
RPMTHRESHADR	EQU	0x0A	;MAP TABLE ADDRESS THRESHOLD BELOW WHICH RPM TABLE IS USED.#27 *** LAST BYTE ON EM2 ENG DATA SCREEN 
R1DIFAADR		EQU	0x0B	;ROTOR 1 DIFFERENTIAL FACTOR WHEN NOT STAGGING  
R2DIFAADR		EQU 0x0C	;ROTOR 2 DIFFERENTIAL FACTOR WHEN NOT STAGGING  (20B only)	(BYTE 30 OF ENG DATA FRAME)
IPWMINADR		EQU	0x0D	;MINIMUM INJECTION THRESHOLD VALUE STORAGE ADR IN EEPROM
O2THRESHADR		EQU 0x0E	;O2 THRESHOLD VALUE (USED BY TRIM.CL)

ENGCODEADR		EQU	0x10	;ENGINE TYPE CODE 0xA0 - XXX  (ALSO STORED IN ENGCODE RAM ADR @ 125
;	_______________________________________________	BANK 2 RAM ASSIGNMENTS____________________________________
;	200 - 2FF   reserved for MAP TABLE (200 - 27F used now) 
  

MTAB		EQU	0x200	;DEFINE START OF MAP TABLE (200 - 27F IN RAM)
 
EEMTAB		EQU	0x080	;START ADDRESS OF MAP TABLE IN EEPROM  (0x80 - 0xFF)

;	_______________________________________________	BANK 3 RAM ASSIGNMENTS____________________________________

SIBUF	EQU 	0x300	;SERIAL BUFFER START ADDRESS  (INPUT BUFFER)

;	_______________________________________________	BANK 4 RAM ASSIGNMENTS____________________________________ 

SOBUF	EQU		0x400 	;SERIAL OUTPUT BUFFER 	

;			EEPROM MEMORY MAP
;	0&1		R1DIF   ROTOR 1 & 
;	1		R2DIF	R2 DIFFERENTIAL
;	2		SECDIF 	(SECONDARY INJ DIFFERENTIAL)
;	3		PFUN	(NOT FUNCTIONAL BUT GETS LOADED FROM HERE ON POWER-UP ANYWAY
;	4		IPW CLOCK RATE 
;	5		ENGCODE		(ENGINE TYPE CODE)  
;	6		ENGINFO		(ENGINE INFO BYTE (0=TURBO),1=LGSEC,2=RX8COIL,3=TEMPSENSOR,4=RENG,5=BUSENSOR,6=CONT,7= CSON
;	7		STHRESH		INJECTOR STAGING THRESHOLD
;	8		IGNADJ  	IGNITION TIMING ADJUST  VARIABLE STORAGE
;	9		IPWRNG		IPW OFFSET FOR CONTROLLING MIN IPW AT MIN MAP  (SUBTRACTED FROM MAPL&H FOR BASIC IPW)
;	A		RPMTHRESH	
;	B		R1DIFA      NON STAGED  20b
;	C		R2DIFA		NON STAGED ROTOR DIFFERENTIALS
;	D 		R2DIFA 
;	E		O2THRESH	O2 THRESHOLD FOR TRIM.CL  CLOSED LOOP THRESH
;	F		N/U
;	10		EEPROM INITIALIZED FLAG	(SET TO ENG TYPE WHEN INITIALIZED)
;	11 - 7F 	N/U

;	0x200 - 0x2FF	MAP TABLE   200 - 23F LOW RPM MAP TABLE :  240 - 27F HIGH RPM MAP TABLE  280 - 2FF reserved for expansion  
;	0x80 - 0xFF		MAP TABLE IN EC3 VERSION     (ONLY 256 BYTES IN THIS CHIP

#DEFINE CRF SS0,0,1		;COMMAND RECIEVED FLAG
#DEFINE D2F SS0,1,1		;DATA 2ND BYTE FLAG (TELLS US THAT WE ARE EXPECTING 2ND BYTE OF DATA WORD IN SER INPUT)
#DEFINE SB2F SS0,2,1	;SERIAL BYTE 2 FLAG (TELL SER OUT ROUT TO SEND 2ND BYTE (SBH)
#DEFINE EOBF SS0,3,1	;END OF SER OUT BUFFER FLAG (TELLS SER OUT EXEC TO SEND EOX (FF) AT END OF BUFFER
#DEFINE CMDF SS0,4,1	;CMD FLAG (CMD HAS BEEN RECEIVED ON SER CH)

;*******    MACROS
PUSHA        MACRO                 ;macro for saving registers (PUSH IS A VALID 6680 OPCODE)
            MOVFF   STATUS,TEMP_STATUS    ;MOVFF USED BECAUSE IT DOES NOT USE BK SELECTION
            movFF   BSR,TEMP_BSR
			movFf   WREG,TEMP_WREG
            ENDM

POPA        MACRO                 ;macro for restoring register
            movfF   TEMP_WREG,WREG	; KILLER!! WAS MOVF THIS AFFECTS STATUS!  (HAD THIS *AFTER* RESTORING STATUS)
			movfF   TEMP_BSR,BSR
			movfF   TEMP_STATUS,STATUS
            ENDM

;**********************************************************************
     ORG    0x000
			CLRF PCLATH,0
			CLRF PCLATU,0
        	GOTO HWINIT	

;************   HIGH PRIORITY INT INTERRUPT VECTOR
      ORG    0x008					;TM0, INT0,INT1 INTS (SPARK TIMER EVENT, CRANK/CAM TRIGGER EVENTS.

;  NEW HIGH PRIORITY INT ROUT, ADDES TMR2 TO HI PRI
 		MOVLB 0x01
 		BTFSC PIR1,TMR2IF,0			;THIS IS MOST FREQUENT INT
		GOTO TM2INT
	 	BTFSS INTCON,TMR0IF,0
	 	BRA EXTINT
		GOTO TM0INT

;************ LOW PRIORITY INT VECTOR (LOW PRI HWD & PERIPHERIAL INTERRUPT VECTOR)
     ORG    0x018
		PUSHA			;
		MOVLB 1			;SET BK 1 MEMORY 
		BRA PIV			;GO TEST FOR OTHER PERIF INTS.
				
EXTINT			; INT0 OR INT1 INTS (or tmr3int on b3 eng HI PRI ON THIS ENG)  (CRANK/CAM SENSOR INPUTS)
 IF ENG==0xB3					;EAGLE540 ONLY
 		BTFSC PIR2,TMR3IF,0			;TEST FOR IGNITION DELAY TIMER INTERRUPT ON B3 ENGINE
 		GOTO TM3INT
 		BTFSS INTCON,INT0IF,0		;INT0? 
		BRA EXTINT.A 				;NO, WAS INT1 SO GO SERVICE (cam on most cam sensor equipped engines)
  		BCF INTCON,INT0IF,0 	;MOVED TO FRONT 3-07   KILL THEM
		CALL TP2INT 			;
		BCF INTCON,INT0IF,0 	;MOVED TO FRONT 3-07   kill again (oise?)
		RETFIE 1
EXTINT.A						;INT1
  IF TBINJ==0
		BCF INTCON3,INT1IF,0    ;KILL
		CALL TP1INT		;CAM TRIGGER ON EAGLE 540 
		BCF INTCON3,INT1IF,0    ;KILL AGAIN
		RETFIE 1
  ELSE
  		BCF INTCON3,INT1IF,0    ;KILL AGAIN
		RETFIE 1
  ENDIF							
 ENDIF		;END OF B3
 
 
 ;  ******************   HONDA START    EXTERNAL INTERRUPT
 IF ENG==0xB4			;HONDA V6
 							;ENGINE HAS 2 SENSORS   A IS ON INT0, B IS ON INT1
			BTFSS CAF
			BRA EXTINT.A
  			BCF INTCON,INT0IF,0 	;MOVED TO FRONT 3-07   KILL THEM
			CALL TP2INT 			;HANDLE INT0 ON A CONTROLLER
			BCF INTCON,INT0IF,0 	;MOVED TO FRONT 3-07   kill again (oise?)
			RETFIE 1					
			
EXTINT.A				;INT1 INTERRUPT (B CONTROLLER

			BCF INTCON3,INT1IF,0    ;KILL
			CALL TP2INT	 
			BCF INTCON3,INT1IF,0    ;KILL AGAIN
			RETFIE 1
 ENDIF

;  *******************  HONDA END
 
 IF (ENG<0xA4)||(ENG==0xA5)||(ENG==0xAC)||(ENG==0xAF)	;ENGINES WITH 2 different SENSORS
			BTFSS INTCON,INT0IF,0		;INT0? 
			BRA EXTINT.A 				;NO, WAS INT1 SO GO SERVICE (cam on most cam sensor equipped engines)
			
  IF 	(ENG==0xAC)||(ENG==0xAF)			;WAS 0xAD
   IF ENG==0xAF				;AF always had backup sensor  DON'T SERVICE IF WE ARE B CONTROLLER
			BTFSS CAF
			BRA AF1
			BCF INTCON,INT0IF,0		;MOVED TO FRONT 3-07		
			CALL TP2INT
			BCF INTCON,INT0IF,0		;MOVED TO FRONT 3-07	
			RETFIE 1
AF1		
			BCF INTCON,INT0IE,0			;DISABLE & FILL ON B CONTROLLER		
			BCF INTCON,INT0IF,0
			RETFIE 1
   ENDIF
   IF (ENG==0xAC)	
			BCF INTCON,INT0IF,0 	;MOVED TO FRONT 3-07
			CALL TP2INT		;CRANK TRIGGER ON TP1 (int0) ON EJ25
			BCF INTCON,INT0IF,0 	;MOVED TO FRONT 3-07
			RETFIE 1
   ENDIF
  ELSE	;INT0 FOR OTHER THAN AC,AF ENGINES (A5   HEXADYNE INCLUDED)
			BCF INTCON,INT0IF,0 	;MOVED TO FRONT 3-07
			CALL TP1INT ;GO HANDLE		 TP1 EVENT FROM INT0 INPUT)  CAM ON A7
			BCF INTCON,INT0IF,0 	;MOVED TO FRONT 3-07
			RETFIE 1
  ENDIF

EXTINT.A				;INT1 INTERRUPT  (TP2)FOR 0xA4,0xA5, 0xAC, 0xAF
  IF (ENG==0xAC)				;WAS AD  08-28-05
			BCF INTCON3,INT1IF,0    ;MOVED TO FRONT 3-07
			CALL TP1INT		;CAM TRIGGER ON EJ20-25 ENGINE 
			BCF INTCON3,INT1IF,0    ;MOVED TO FRONT 3-07
			RETFIE 1
  ELSE
   IF ENG==0xAF				;DONT SERVICE IF WE ARE A CONTROLLER
			BTFSS INTCON3,INT1IE,0   ;IS INT1 ENABLED?
			BRA EXTINT.A2		;NO SO JUST CANCEL INT
   ENDIF	
      		BCF INTCON3,INT1IF,0
			CALL TP2INT		;YES, GO HANDLE TP2 INT (FROM INT1 INPUT)  TP2 INT INPUT  (0xA5 Crank sensor handled here)
			BCF INTCON3,INT1IF,0
			RETFIE 1				;OTHER ENG TYPES
EXTINT.A2
			BCF INTCON3,INT1IF,0
			RETFIE 1
  ENDIF
 ENDIF

;EXTINT
 IF (ENG==0xA9)||(ENG==0xA4)||(ENG==0xA6)||(ENG==0xA8)||(ENG==0xAB)||(ENG==0xAD)||(ENG==0xAE)||(ENG==0xB0)||(ENG==0xB1)||(ENG==0xB2)||(ENG==0xB5)||(ENG==0xAA)	;EXTERNAL INT (0 OR 1)
	BTFSC BUSIN			; (WAS) IF BUSENSOR==0		;BOTH A & B USE INT0 IF NO BU SENSOR
	BRA EXTINT.C		;BUSIN SET SO DO OTHER SETUP
	BTFSS INTCON,INT0IF,0			;WAS IT INT0?
	BRA EXTINT.B					;NO SO HANDLE ERROR INT
	BCF INTCON,INT0IF,0			;KILL THE INT MOVED TO FRONT 3-07  THIS FIXED IT!!!!
	CALL TP2INT
	BCF INTCON,INT0IF,0			;ORIGINAL POSITION OF IF CLEAR, RESULTED IN FALSE INT RESPONCES )leaving it in to kill any possible false tp2s resulting from noise sincE There could not be any ligitimate tps this soon after calling the service rout.
	RETFIE 1
EXTINT.B				
	BCF INTCON3,INT1IE,0			;DISABLE INT1,NOT VALID W/ NO BUSENSOR
	BCF INTCON3,INT1IF,0			;KILL FLAG
	RETFIE 1
EXTINT.C				;(WAS)  ELSE ;FOR UNITS WITH BU SENSOR  (PRIMARY ON INT0, backup sensor is on int1 (controller B)
	BTFSS CAF				;ARE WE A?
	BRA EXTINT.A
	BCF INTCON,INT0IF,0			;MOVED TO FRONT 3-07
	CALL TP2INT 				;GO HANDLE TP2 EVENT FROM INT0 INPUT)
	BCF INTCON,INT0IF,0			;MOVED TO FRONT 3-07
	RETFIE 1
EXTINT.A								;WAS INT1 FOR B CONTROLLER
	BTFSS INTCON3,INT1IF,0		;0xA9 HAS BACKUP SENSOR OPTION AVAILABLE 
	BRA EXTINT.A2			;MUST BE INT0 WHICH SHOULD NOT HAPPEN ON B
	BCF INTCON3,INT1IF,0	;MOVED TO FRONT 3-07	
	CALL TP2INT				; WAS B CONTROLLER (FROM INT1)
	BCF INTCON3,INT1IF,0	;MOVED TO FRONT 3-07	
	RETFIE 1
EXTINT.A2
	BCF INTCON,INT0IE,0		;DISABLE INT0 ON B
	BCF INTCON,INT0IF,0		;KILL IT FOR NOW
	RETFIE 1
;						(WAS)  ENDIF						;END OF BUSENSOR OPTION
 ENDIF						;END OF ENG XX INT HANDLER

;EXTINT
; IF (ENG==0xAA)	;EXTERNAL INT (0 OR 1)   A USES INT0, B USES INT1, BUT BOTH INTS ARE CONNECTED TO THE SINGLE SENSOR
;	BTFSS CAF				;ARE WE A?(DECIDED ON THIS SO WE COULD HAVE DUAL SENSORS IN THE FUTURE) changed to single input 05-08
;	BRA EXTINT.B			;HANDLE B CONTROLLER ON INT1
;	BCF INTCON,INT0IF,0     ;MOVED TO FRONT 3-07
;	CALL TP2INT
;	BCF INTCON,INT0IF,0	;DUPLICATE
;	RETFIE 1
;EXTINT.B
;	BCF INTCON3,INT1IF,0	;MOVED TO FRONT 3-07
;	CALL TP2INT				; WAS B CONTROLLER (FROM INT1)
;	BCF INTCON3,INT1IF,0	;DUPLICATE JUST IN CASE
;	RETFIE 1
; ENDIF						;END OF ENG 0xaa INT HANDLER

 IF (ENG==0xA7) ; EJ20/22/25 ENGINEs
 							;ENGINE HAS 2 SENSORS   CRANK IS ON INT0, CAM IS ON INT1
			BTFSS INTCON,INT0IF,0		;INT0? 
			BRA EXTINT.A				;GO HANDLE CAM 
  			BCF INTCON,INT0IF,0 	;MOVED TO FRONT 3-07   KILL THEM
			CALL TP2INT 			;HANDLE INT0 AS CRANK SENSOR
			BCF INTCON,INT0IF,0 	;MOVED TO FRONT 3-07   kill again (oise?)
			RETFIE 1					
			
EXTINT.A				;INT1 INTERRUPT   CAM SENSOR
			BCF INTCON3,INT1IF,0    ;KILL
			CALL TP1INT	 
			BCF INTCON3,INT1IF,0    ;KILL AGAIN
			RETFIE 1
 ENDIF 

PIV
;************   PERIPHERAL INTERRUPT VECTOR    (ASSIGNED TO LOW PRI VECTOR)
		
		BTFSS PIR1,CCP1IF,0				;TEST FOR CCP1 INT (TIMER 1  (DWELL TIMER)
		BRA PIV.1   ;GO HANDLE OTHERS
		BCF PIR1,CCP1IF,0	;CLEAR THE DWELL TIMER INT BIT
		
DWELL		;CALLED EVERY T1 TIMEOUT (252 MICROSECONDS) 3 uS TYP (TOTAL FROM INT.

	BTFSS EEWF	;TEST EEPROM WRITE FLAG
	BRA DW.A		;GO ON IF NOT SET
	DCFSNZ EETMR,1,1		;DECREMENT EEPROM FUNCTION TIMER
	BCF EEWF		;CLEAR EEPROM FUNCTION FLAG (TELLS WHOEVER THAT EE WR IS DONE)
	BRA DW.AY		;SKIP DTC PROCESSING WHEN EETMR ACTIVE
DW.A
 IF (ENG != 0xB3)
 		DECFSZ DTCPS,1		;DECREMENT PRESCALLER
 		BRA DW.AY			;NOT TIME FOR DT CHECK
 		MOVLW D'3'
 		MOVWF DTCPS,1
		DECFSZ DTCL,1		;TEST FOR RPM TOO LOW FOR VALID SYNC
		BRA DW.AY			;NOT 0 SO GO ON
		BCF VT				;ENG TOO SLOW SO KILL VT, ALL COILS & INJECTORS
		BCF FC1
		BCF FC2
		BCF FC3
		BCF FC4
  
		BCF FI1
		BCF FI2
		BCF FI3
		BCF FI4
  
		INCF DTCL,1,1
 ENDIF
DW.AY
	BTFSC VT		;DON'T DO NORMAL DWELL IF ENG NOT TURNING
	BRA DW.AX2		;ENGINE TIMING VALID, GO ON 
DW.AX			;ENGINE NOT RUNNING POINT DO CHECK INPUTS PERIODICALLY
	DECFSZ LP1D,1,1		;USE THIS AS A 64 MS TIMER WHILE ENGINE IS NOT RUNNING
	BRA DW.AX1			;EXIT
	BSF ANF			;TELL EXEC TO EXEC GET INPUTS
	CALL PCK
DW.AX1				
	POPA
	RETFIE
	
DW.AX2
;				****************************    ADDED CLOSED LOOP ROUT TO TEST FOR MAX TRIM FLAG
;   IF MTF SET FOR MORE THAN 1 SEC, SET TABLE WRITE FLAG TO TELL EXEC TO SERVICE THE TABLE ADJUSTMENT 
DW.CL
	BTFSC CSON				;IS CL ENABLED?
	BRA DW.CLD				;GO ON IF YES
	MOVLW 0x80				;NEUTRALIZE TRIM
	MOVWF TRIM,1
	BRA DW.CLX				;EXIT IF NOT
DW.CLD
	DECF CLTMR,1,1			;DEC TRIM UPDATE COUNT
	BNZ DW.CLA				;GO ON IF NOT ZERO
	MOVLW 0x01
	CPFSEQ PFUN,1				;TEST FOR MODE 1
	BRA DW.CLC				;NOT 1 SO ASSUME 3
;****	
	MOVLW 0x30				;TEST FOR RPM < 2300 & LOW MAP
	CPFSLT TPTR,1
	BRA DW.CLF
	MOVLW D'255'			;SLOWER TRIM SPEED WHEN LOW RPM
	BRA DW.CLB
DW.CLF
;****		
	MOVLW D'120'				;RELOAD COUNTER W/ 30 MS RATE IF IN MODE 1 CL
	BRA DW.CLB				;GO ON
DW.CLC
	MOVLW 0x03
	CPFSEQ PFUN,1				;TEST FOR MODE 3
	BRA DW.CLX
;****	
	MOVLW 0x30				;TEST FOR RPM < 2300 & LOW MAP
	CPFSLT TPTR,1
	BRA DW.CLE
	MOVLW D'255'			;SLOWER TRIM SPEED WHEN LOW RPM
	BRA DW.CLB
DW.CLE
;****	
	MOVLW D'160'			;40 MS UPDATES IN MODE 3
DW.CLB
	MOVWF CLTMR,1			;
	BSF CLUF				;SET THE UPDATE FLAG FOR EXEC
DW.CLA
	BTFSS TPTRD				;HAS TPTR CHANGED?
	BRA DW.CLA1				;NO CHANGE SO DEC TMR
	MOVLW 0x30				;TEST FOR RPM < 2300 & LOW MAP
	CPFSLT TPTR,1
	BRA DW.CLA2			;DO FASTER UPDATE
	MOVLW 0x12			;SLOWER TRIM SPEED WHEN LOW RPM   ABOUT 1.5 SEC
	BRA DW.CLA3
DW.CLA2	
	MOVLW 0x09				;LOAD MSB W/2048   (ABOUT .75 SECOND INTERVAL)  (was .5 sec)
DW.CLA3
	MOVWF TRMDH,1
	CLRF TRMDL,1
	BCF TPTRD
	BCF TWF					;CLR TRIM WRITE FLAG   (WAS MISSING IN THIS VER)
	BCF MPSF				;CLR MP STABLE FLAG, MAP TABLE POINTER HAS CHANGED
	BRA DW.CLX				;DONE
DW.CLA1						;NO CHANGE SO DEC TRMDH&L
	DECF TRMDL,1,1			;DEC LSB TRIM DLY 
	BC DW.CLX				;EXIT NO BORROW
	DECF TRMDH,1,1			;DEC MSB
	BC DW.CLX				;EXIT IF NOT TIME UP
	MOVLW 0x30				;TEST FOR RPM < 2300 & LOW MAP
	CPFSLT TPTR,1
	BRA DW.CLA4			;DO FASTER UPDATE
	MOVLW 0x12			;SLOWER TRIM SPEED WHEN LOW RPM   ABOUT 1.5 SEC
	BRA DW.CLA5
DW.CLA4	
	MOVLW 0x09				;LOAD MSB W/2048   (ABOUT .75 SECOND INTERVAL)  (was .5 sec)
DW.CLA5
	MOVWF TRMDH,1
	CLRF TRMDL,1			;CLR LSB
	MOVLW D'3'				;TEST FOR TABLE UPDATE ENABLED IN MODE 3 ONLY
	CPFSEQ PFUN,1
	BRA DW.CLX				;NO TABLE UPDATE IF NOT
	BSF MPSF					;TPTR SAME FOR INTERVAL SO SET MP STABLE FLAG
DW.CLX

;***************  END OF -8 VER
;               *****************************************

 IF ENG==0xB3			;NEED LONGER TIMEOUT ON B3
 	DECFSZ DTCL,1,1		;DEC LSB OF DEAD TIME CTR, GO ON IF NOT ZERO (ADDED 02-05-01)
 	BRA DW.0			;NO CY SO GO ON
 	TSTFSZ DTCH,1		;TEST MSB
 	BRA DTC.A			;NOT ZERO		
 	BRA DTC.B			;TIMED OUT SO RESET ALL
DTC.A
 	DECF DTCH,1,1		;DEC MSB & RESET LSB
 	SETF DTCL,1
 	BRA DW.0
 ELSE
 	BRA DW.0			;NO CY SO GO ON
 ENDIF
DTC.B
	CLRF STAT0,1		;DEAD TIME TIME OUT, INITIATE A RESTART OF ALL SYSTEMS.  
	CLRF PORTD,0		;COILS & INJECTORS OFF
	CLRF SEQFLAG,1
 IF UNISYNC==1
	SETF TOLDL,1		;SET OLD T2INTERVAL TO MAX SO WE DON'T DETECT FALSE SYNC ON 1ST T2 CAPTURE
	SETF TOLDH,1
	CLRF SYNCL,1		;CLEAR SYNC REG
	CLRF SYNCH,1	
 ENDIF	
	POPA		;EXIT NOW
	RETFIE

DW.0
 IF (ENG==0xA2)||(ENG==0xAF)
   	TSTFSZ LP1D,1		;IS LSB COUNT 0?  ADDED (06-15-02)  NEW 2 BYTE DWELL
  	BRA DW.0A			;NOT ZERO, GO DEC LSB
DW.AA
  	TSTFSZ LP1DH,1		;IS MSB 0?
  	BRA DW.Z			;MSB NOT ZERO SO HANDLE
  	BRA DW.X			;MSB 0 TOO SO DO NOTHING & GO CHECK 2
DW.Z
	SETF LP1D,1			;RE-FILL LSB
	DECF LP1DH,1,1		;DECREMENT MSB
  	BRA DW.X			;DONE WITH 1, EXIT
DW.0A
	DECFSZ LP1D,1,1		;DECREMENT LEAD COIL 1 DWELL COUNT
	BRA DW.X		;EXIT, (LEAD & TRAIL COILS ARE TURNED ON AT SAME TIME FOR 2ND GEN MAZDA COILS)
  	TSTFSZ LP1DH	;SEE IF MSB WAS ZERO
  	BRA DW.Z		;HANDLE OVERFLOW IF NOT	
	BTFSC LSF		;TEST FOR SLOW SPEED DWELL FLG	12-03-00      
	BRA DW.X		;EXIT IF SET			12-03-00
	BTFSC CAF		;TEST FOR CONTROLLER A
	BRA DW.0B		;WAS A CONTROLLER SO GO TURN ON		
	BTFSC DLC		;DISABLE LEAD COIL SW ON? (CK STATUS BIT, NOT SW)
	BSF FC1			;TURN ON LEAD COIL ON B
	BTFSC DATC		;DISABLE TRAIL COIL SW ON?
	BSF FC2			;DWELL IS SAME SO TURN BOTH
	BRA DW.X
DW.0B
	BSF FC1		;TURN ON LEAD COIL (WE ARE A)
	BSF FC2		;TURN ON TRAIL COIL
DW.X
	POPA			;WOULD HAVE FALLEN THROUGH TO DW.X BUT IT IS CLEARER IF WE ADD THIS HERE.
	RETFIE
 ENDIF		;ENG TYPE 0xA2,0xAF  MAZDA COIL & CAS 13b OR DIST V6 TYPE

;(DW.0)		(label for this appears above IF statement above)
 IF (ENG==0xA1)||(ENG==0xA4)||(ENG==0xA5)
  	TSTFSZ LP1D,1		;IS LSB COUNT 0?  ADDED (06-15-02)
  	BRA DW.0A			;NOT ZERO, GO DEC LSB
  	TSTFSZ LP1DH,1		;IS MSB 0?
  	BRA DW.Z			;MSB NOT ZERO SO HANDLE
  	BRA DW.2			;MSB 0 TOO SO DO NOTHING & GO CHECK 2
DW.Z
	SETF LP1D,1			;RE-FILL LSB
	DECF LP1DH,1,1		;DECREMENT MSB
  	BRA DW.2			;DONE WITH 1, GO CHECK 2
DW.0A
	DECFSZ LP1D,1,1	;DECREMENT LEAD COIL 1 DWELL COUNT
	BRA DW.2		;GO TEST ROTOR 2 DWELL COUNT
  	TSTFSZ LP1DH,1	;SEE IF MSB WAS ZERO
  	BRA DW.Z		;HANDLE OVERFLOW IF NOT				 ;IT WAS, SO HANDLE DWELL TIME
	BTFSC LSF		;TEST FOR SLOW SPEED DWELL FLG	12-03-00   (WAS LSF  3/07)  BACK TO LSF 4/07 
	BRA DW.2		;EXIT IF SET			12-03-00
	BTFSC CAF		;TEST FOR CONTROLLER A	 
	BRA DW.0B		;WAS A CONTROLLER SO GO TURN ON	
	BTFSC DLC		;DISABLE LEAD COIL SW ON? (CK STATUS BIT, NOT SW)
	BSF FC1			;TURN ON LEAD COIL (WE ARE A)
	BTFSC DATC		;DISABLE TRAIL COIL SW ON?
	BSF FC2			;DWELL IS SAME SO TURN BOTH
	BRA DW.2
DW.0B
	BSF FC1		;TURN ON LEAD COIL (WE ARE A)
	BSF FC2		;TURN ON TRAIL COIL
DW.2
  	TSTFSZ LP2D,1		;IS LSB COUNT 0?  ADDED (06-15-02)
  	BRA DW.2A			;NOT ZERO, GO DEC LSB
DW.2AA
  	TSTFSZ LP2DH,1		;IS MSB 0?   ERROR, WAS LP1DH  06-18-07
  	BRA DW.ZZ			;MSB NOT ZERO SO HANDLE
  	BRA DW.X			;MSB 0 TOO SO DO NOTHING & GO CHECK 2
DW.ZZ
	SETF LP2D,1			;RE-FILL LSB
	DECF LP2DH,1,1		;DECREMENT MSB
  	BRA DW.X			;DONE WITH 1, GO CHECK NEXT ROTOR
DW.2A
	DECFSZ LP2D,1,1		;DECREMENT LEAD COIL 1 DWELL COUNT
	BRA DW.X		;GO TEST ROTOR 2 DWELL COUNT
					;TIME FOR DWELL ON 
  	TSTFSZ LP2DH,1	;SEE IF MSB WAS ZERO
  	BRA DW.ZZ		;HANDLE OVERFLOW IF NOT	
	BTFSC LSF		;HANDLE DWELL,  TEST FOR SLOW SPEED DWELL FLG	12-03-00 (WAS LSF  3/07)
	BRA DW.X		;EXIT IF NOT			12-03-00
	BTFSC CAF		;TEST FOR CONTROLLER 1  
	BRA DW.2B		;WAS A CONTROLLER SO GO TURN ON	
	BTFSC DLC		;DISABLE LEAD COIL SW ON?  (CK STATUS BIT, NOT SW)
	BSF FC3		;TURN ON LEAD COIL (WE ARE A)
	BTFSC DATC		;DISABLE TRAIL COIL SW ON?
	BSF FC4		;DWELL IS SAME SO TURN BOTH
	BRA DW.X
DW.2B
	BSF FC3		;TURN ON LEAD COIL (WE ARE A)
	BSF FC4		;TURN ON TRAIL COIL
DW.X
	POPA 
	RETFIE
 ENDIF		;A1,A4,A5,AF

 IF ENG==0xA8
  	TSTFSZ LP1D,1		;IS LSB COUNT 0?  ADDED (06-15-02)
  	BRA DW.0A			;NOT ZERO, GO DEC LSB
  	TSTFSZ LP1DH,1		;IS MSB 0?
  	BRA DW.Z			;MSB NOT ZERO SO HANDLE
  	BRA DW.2			;MSB 0 TOO SO DO NOTHING & GO CHECK 2
DW.Z
	SETF LP1D,1			;RE-FILL LSB
	DECF LP1DH,1,1		;DECREMENT MSB
  	BRA DW.2			;DONE WITH 1, GO CHECK 2
DW.0A
	DECFSZ LP1D,1,1	;DECREMENT LEAD COIL 1 DWELL COUNT
	BRA DW.2		;GO TEST ROTOR 2 DWELL COUNT
  	TSTFSZ LP1DH,1	;SEE IF MSB WAS ZERO
  	BRA DW.Z		;HANDLE OVERFLOW IF NOT				 ;IT WAS, SO HANDLE DWELL TIME
	BTFSC LSF		;TEST FOR SLOW SPEED DWELL FLG	12-03-00   (WAS LSF  3/07)  BACK TO LSF 4/07 
	BRA DW.2		;EXIT IF SET			12-03-00
	BTFSC CAF		;TEST FOR CONTROLLER A	 
	BRA DW.0B		;WAS A CONTROLLER SO GO TURN ON	
	BTFSC DLC		;DISABLE LEAD COIL SW ON? (CK STATUS BIT, NOT SW)
	BSF FC1			;TURN ON LEAD COIL (WE ARE A)
	BTFSC DATC		;DISABLE TRAIL COIL SW ON?
	BSF FC2			;DWELL IS SAME SO TURN BOTH
	BRA DW.2
DW.0B
	BSF FC1		;TURN ON LEAD COIL (WE ARE A)
	BSF FC2		;TURN ON TRAIL COIL
DW.2
  	TSTFSZ LP2D,1		;IS LSB COUNT 0?  ADDED (06-15-02)
  	BRA DW.2A			;NOT ZERO, GO DEC LSB
DW.2AA
  	TSTFSZ LP2DH,1		;IS MSB 0?   ERROR, WAS LP1DH  06-18-07
  	BRA DW.ZZ			;MSB NOT ZERO SO HANDLE
  	BRA DW.X			;MSB 0 TOO SO DO NOTHING & GO CHECK 2
DW.ZZ
	SETF LP2D,1			;RE-FILL LSB
	DECF LP2DH,1,1		;DECREMENT MSB
  	BRA DW.X			;DONE WITH 1, GO CHECK NEXT ROTOR
DW.2A
	DECFSZ LP2D,1,1		;DECREMENT LEAD COIL 1 DWELL COUNT
	BRA DW.X		;GO TEST ROTOR 2 DWELL COUNT
					;TIME FOR DWELL ON 
  	TSTFSZ LP2DH,1	;SEE IF MSB WAS ZERO
  	BRA DW.ZZ		;HANDLE OVERFLOW IF NOT	
	BTFSC LSF		;HANDLE DWELL,  TEST FOR SLOW SPEED DWELL FLG	12-03-00 (WAS LSF  3/07)
	BRA DW.X		;EXIT IF NOT			12-03-00
	BTFSC CAF		;TEST FOR CONTROLLER 1  
	BRA DW.2B		;WAS A CONTROLLER SO GO TURN ON	
	BTFSC DLC		;DISABLE LEAD COIL SW ON?  (CK STATUS BIT, NOT SW)
	BSF FC3		;TURN ON LEAD COIL (WE ARE A)
	BTFSC DATC		;DISABLE TRAIL COIL SW ON?
	BSF FC4		;DWELL IS SAME SO TURN BOTH
	BRA DW.X
DW.2B
	BSF FC3		;TURN ON LEAD COIL (WE ARE A)
	BSF FC4		;TURN ON TRAIL COIL
DW.X
	POPA 
	RETFIE
 ENDIF		;A8

 
 ;(DW.0)		(label for this appears above IF statement above)
 IF ENG==0xA9
  	TSTFSZ LP1D,1		;IS LSB COUNT 0?  ADDED (06-15-02)
  	BRA DW.0A			;NOT ZERO, GO DEC LSB
  	TSTFSZ LP1DH,1		;IS MSB 0?
  	BRA DW.Z			;MSB NOT ZERO SO HANDLE
  	BRA DW.2			;MSB 0 TOO SO DO NOTHING & GO CHECK 2
DW.Z
	SETF LP1D,1			;RE-FILL LSB
	DECF LP1DH,1,1		;DECREMENT MSB
  	BRA DW.2			;DONE WITH 1, GO CHECK 2
DW.0A
	DECFSZ LP1D,1,1	;DECREMENT LEAD COIL 1 DWELL COUNT
	BRA DW.2		;GO TEST ROTOR 2 DWELL COUNT
  	TSTFSZ LP1DH,1	;SEE IF MSB WAS ZERO
  	BRA DW.Z		;HANDLE OVERFLOW IF NOT				 ;IT WAS, SO HANDLE DWELL TIME
	BTFSC LSF		;TEST FOR SLOW SPEED DWELL FLG	12-03-00   (WAS LSF  3/07)  BACK TO LSF 4/07 
	BRA DW.2		;EXIT IF SET			12-03-00
	BSF FC1		;TURN ON LEAD COIL (WE ARE A)
	BSF FC2		;TURN ON TRAIL COIL
DW.2
  	TSTFSZ LP2D,1		;IS LSB COUNT 0?  ADDED (06-15-02)
  	BRA DW.2A			;NOT ZERO, GO DEC LSB
DW.2AA
  	TSTFSZ LP2DH,1		;IS MSB 0?   ERROR, WAS LP1DH  06-18-07
  	BRA DW.ZZ			;MSB NOT ZERO SO HANDLE
  	BRA DW.X			;MSB 0 TOO SO DO NOTHING & GO CHECK 2
DW.ZZ
	SETF LP2D,1			;RE-FILL LSB
	DECF LP2DH,1,1		;DECREMENT MSB
  	BRA DW.X			;DONE WITH 1, GO CHECK NEXT ROTOR
DW.2A
	DECFSZ LP2D,1,1		;DECREMENT LEAD COIL 1 DWELL COUNT
	BRA DW.X		;GO TEST ROTOR 2 DWELL COUNT
					;TIME FOR DWELL ON 
  	TSTFSZ LP2DH,1	;SEE IF MSB WAS ZERO
  	BRA DW.ZZ		;HANDLE OVERFLOW IF NOT	
	BTFSC LSF		;HANDLE DWELL,  TEST FOR SLOW SPEED DWELL FLG	12-03-00 (WAS LSF  3/07)
	BRA DW.X		;EXIT IF NOT			12-03-00
	BSF FC3		;TURN ON LEAD COIL (WE ARE A)
	BSF FC4		;TURN ON TRAIL COIL
DW.X
	POPA 
	RETFIE
 ENDIF		;END OF A9
 
; DW.0  (Label appears before IF statement at top of dw.0 rout) 
 IF (ENG==0xA3)||(ENG==0xB0)  ;3 ROTOR DWELL ROUT
   	TSTFSZ LP1D,1		;IS LSB COUNT 0?  ADDED (06-15-02)
  	BRA DW.1A			;NOT ZERO, GO DEC LSB
  	TSTFSZ LP1DH,1		;IS MSB 0?
  	BRA DW.1			;MSB NOT ZERO SO HANDLE
  	BRA DW.2			;MSB 0 TOO SO DO NOTHING & GO CHECK 2
DW.1
	SETF LP1D,1			;RE-FILL LSB
	DECF LP1DH,1,1		;DECREMENT MSB
  	BRA DW.2			;DONE WITH 1, GO CHECK 2
DW.1A
	DECFSZ LP1D,1,1		;DECREMENT LEAD COIL 1 DWELL COUNT
	BRA DW.2		;GO TEST ROTOR 2 DWELL COUNT
  	TSTFSZ LP1DH	;SEE IF MSB WAS ZERO
  	BRA DW.1		;HANDLE OVERFLOW IF NOT				 ;IT WAS, SO HANDLE DWELL TIME
 	BTFSC LSF		;  TEST FOR SLOW SPEED DWELL FLG	12-03-00
 	BRA DW.2
 	BTFSS CAF		;ARE WE A?
	BRA DW.1B		;DON'T DISABLE ON A
  IF N109TC == 0x01  ;COIL ASSIGNMENT DIFFERENT ON N109TC
	BSF FC1
	BSF FC4
  ELSE
  	BSF FC1
  	BSF FC2
  ENDIF
	BRA DW.2
DW.1B
  IF N109TC == 0x01	
 	BTFSC DLC
	BSF FC1			;TURN ON ROTOR 1 LEAD COIL IF NOT LSF
	BTFSC DATC
	BSF FC4			;TRAIL COIL TOO
  ELSE
    BTFSC DLC
	BSF FC1			;TURN ON ROTOR 1 LEAD COIL IF NOT LSF
	BTFSC DATC
	BSF FC2			;TRAIL COIL TOO
  ENDIF
DW.2
   	TSTFSZ LP2D,1		;IS LSB COUNT 0?  ADDED (06-15-02)
  	BRA DW.2A			;NOT ZERO, GO DEC LSB
  	TSTFSZ LP2DH,1		;IS MSB 0?
  	BRA DW.2Z			;MSB NOT ZERO SO HANDLE
  	BRA DW.3			;MSB 0 TOO SO DO NOTHING & GO CHECK 2
DW.2Z
	SETF LP2D,1			;RE-FILL LSB
	DECF LP2DH,1,1		;DECREMENT MSB
  	BRA DW.3			;DONE WITH 2, GO CHECK 3
DW.2A
	DECFSZ LP2D,1,1		;DECREMENT LEAD COIL 1 DWELL COUNT
	BRA DW.3		;GO TEST ROTOR 3 DWELL COUNT
  	TSTFSZ LP2DH	;SEE IF MSB WAS ZERO
  	BRA DW.2Z		;HANDLE OVERFLOW IF NOT				 ;IT WAS, SO HANDLE DWELL TIME
 	BTFSC LSF		;TEST FOR SLOW SPEED DWELL FLG	12-03-00
 	BRA DW.3
 	BTFSS CAF		;ARE WE A?
	BRA DW.2B
  IF N109TC == 0x01
	BSF FC2
	BSF FC5
  ELSE
  	BSF FC3
  	BSF FC4
  ENDIF
	BRA DW.3
DW.2B
  IF N109TC == 0x01	
 	BTFSC DLC
	BSF FC2			;TURN ON ROTOR 1 LEAD COIL IF NOT LSF
	BTFSC DATC
	BSF FC5			;TRAIL COIL TOO
  ELSE
    BTFSC DLC
	BSF FC3			;TURN ON ROTOR 2 LEAD COIL IF NOT LSF
	BTFSC DATC
	BSF FC4			;TRAIL COIL TOO
  ENDIF
DW.3
   	TSTFSZ LP3D,1		;IS LSB COUNT 0?  ADDED (06-15-02)
  	BRA DW.3A			;NOT ZERO, GO DEC LSB
  	TSTFSZ LP3DH,1		;IS MSB 0?
  	BRA DW.3Z			;MSB NOT ZERO SO HANDLE
  	BRA DW.X			;MSB 0 TOO SO DO NOTHING &EXIT
DW.3Z
	SETF LP3D,1			;RE-FILL LSB
	DECF LP3DH,1,1		;DECREMENT MSB
  	BRA DW.X			;DONE WITH 1, EXIT
DW.3A
	DECFSZ LP3D,1,1		;DECREMENT LEAD COIL 1 DWELL COUNT
	BRA DW.X		;GO TEST NEXT ROTOR OR EXIT 
  	TSTFSZ LP3DH	;SEE IF MSB WAS ZERO
  	BRA DW.3Z		;HANDLE OVERFLOW IF NOT				 ;IT WAS, SO HANDLE DWELL TIME
 	BTFSC LSF		;  TEST FOR SLOW SPEED DWELL FLG	12-03-00   WAS BTFSS 10-09-11, CHANGED TO BTFSC
 	BRA DW.X		;EXIT IF LSF SET     FOUND MISSING 10-09-11, ADDED.
 	BTFSS CAF		;ARE WE A?
	BRA DW.3B
  IF N109TC == 0x01
	BSF FC3
	BSF FC6
  ELSE
  	BSF FC5
  	BSF FC6
  ENDIF
	BRA DW.X
DW.3B
  IF N109TC == 0x01	
 	BTFSC DLC
	BSF FC3			;TURN ON ROTOR 3 LEAD COIL IF NOT LSF  	
	BTFSC DATC
	BSF FC6
  ELSE
  	BTFSC DLC
	BSF FC5			;TURN ON ROTOR 3 LEAD COIL IF NOT LSF
	BTFSC DATC
	BSF FC6			;TRAIL COIL TOO
  ENDIF
DW.X
	POPA
	RETFIE
 ENDIF  ;END OF B0,A3  (3 ROTOR ENGINES)
 
 IF (ENG==0xAE)  ; SVX DWELL ROUT
   	TSTFSZ LP1D,1		;IS LSB COUNT 0?  ADDED (06-15-02)
  	BRA DW.1A			;NOT ZERO, GO DEC LSB
  	TSTFSZ LP1DH,1		;IS MSB 0?
  	BRA DW.1			;MSB NOT ZERO SO HANDLE
  	BRA DW.2			;MSB 0 TOO SO DO NOTHING & GO CHECK 2
DW.1
	SETF LP1D,1			;RE-FILL LSB
	DECF LP1DH,1,1		;DECREMENT MSB
  	BRA DW.2			;DONE WITH 1, GO CHECK 2
DW.1A
	DECFSZ LP1D,1,1		;DECREMENT LEAD COIL 1 DWELL COUNT
	BRA DW.2		;GO TEST ROTOR 2 DWELL COUNT
  	TSTFSZ LP1DH	;SEE IF MSB WAS ZERO
  	BRA DW.1		;HANDLE OVERFLOW IF NOT				 ;IT WAS, SO HANDLE DWELL TIME
 	BTFSC LSF		;  TEST FOR SLOW SPEED DWELL FLG	12-03-00
 	BRA DW.2
	BSF FC1
	BSF FC2
DW.2
   	TSTFSZ LP2D,1		;IS LSB COUNT 0?  ADDED (06-15-02)
  	BRA DW.2A			;NOT ZERO, GO DEC LSB
  	TSTFSZ LP2DH,1		;IS MSB 0?
  	BRA DW.2Z			;MSB NOT ZERO SO HANDLE
  	BRA DW.3			;MSB 0 TOO SO DO NOTHING & GO CHECK 2
DW.2Z
	SETF LP2D,1			;RE-FILL LSB
	DECF LP2DH,1,1		;DECREMENT MSB
  	BRA DW.3			;DONE WITH 2, GO CHECK 3
DW.2A
	DECFSZ LP2D,1,1		;DECREMENT LEAD COIL 1 DWELL COUNT
	BRA DW.3		;GO TEST ROTOR 3 DWELL COUNT
  	TSTFSZ LP2DH	;SEE IF MSB WAS ZERO
  	BRA DW.2Z		;HANDLE OVERFLOW IF NOT				 ;IT WAS, SO HANDLE DWELL TIME
 	BTFSC LSF		;TEST FOR SLOW SPEED DWELL FLG	12-03-00
 	BRA DW.3
	BSF FC5
	BSF FC6
DW.3
   	TSTFSZ LP3D,1		;IS LSB COUNT 0?  ADDED (06-15-02)
  	BRA DW.3A			;NOT ZERO, GO DEC LSB
  	TSTFSZ LP3DH,1		;IS MSB 0?
  	BRA DW.3Z			;MSB NOT ZERO SO HANDLE
  	BRA DW.X			;MSB 0 TOO SO DO NOTHING &EXIT
DW.3Z
	SETF LP3D,1			;RE-FILL LSB
	DECF LP3DH,1,1		;DECREMENT MSB
  	BRA DW.X			;DONE WITH 1, EXIT
DW.3A
	DECFSZ LP3D,1,1		;DECREMENT LEAD COIL 1 DWELL COUNT
	BRA DW.X		;GO TEST NEXT ROTOR OR EXIT 
  	TSTFSZ LP3DH	;SEE IF MSB WAS ZERO
  	BRA DW.3Z		;HANDLE OVERFLOW IF NOT				 ;IT WAS, SO HANDLE DWELL TIME
 	BTFSC LSF		;  TEST FOR SLOW SPEED DWELL FLG	12-03-00
 	BRA DW.X
	BSF FC3
	BSF FC4
DW.X
	POPA
	RETFIE
 ENDIF  ;END OF 0xAE (SVX) 
 
 IF(ENG==0xA3)||(ENG==0xB0)||(ENG==0xA6)||(ENG==0xA7)||(ENG==0xAA)||(ENG==0xAB)||(ENG==0xAC)||(ENG==0xAD)||(ENG==0xAE)||(ENG==0xB2)||(ENG==0xA6)||(ENG==0xB3)||(ENG==0xB4);  removed 0XB1 07-13
   	TSTFSZ LP1D,1		;IS LSB COUNT 0?  ADDED (06-15-02)
  	BRA DW.1A			;NOT ZERO, GO DEC LSB
  	TSTFSZ LP1DH,1		;IS MSB 0?
  	BRA DW.1			;MSB NOT ZERO SO HANDLE
  	BRA DW.2			;MSB 0 TOO SO DO NOTHING & GO CHECK 2
DW.1
	SETF LP1D,1			;RE-FILL LSB
	DECF LP1DH,1,1		;DECREMENT MSB
  	BRA DW.2			;DONE WITH 1, GO CHECK 2
DW.1A
	DECFSZ LP1D,1,1		;DECREMENT LEAD COIL 1 DWELL COUNT
	BRA DW.2		;GO TEST ROTOR 2 DWELL COUNT
  	TSTFSZ LP1DH	;SEE IF MSB WAS ZERO
  	BRA DW.1		;HANDLE OVERFLOW IF NOT				 ;IT WAS, SO HANDLE DWELL TIME

  IF ENG!=0xA7 		;
 	BTFSC LSF		;  TEST FOR SLOW SPEED DWELL FLG	12-03-00
 	BRA DW.2
  ENDIF
	BSF FC1			;TURN ON ROTOR 1 LEAD COIL IF NOT LSF  GP1
  IF ENG==0xAD
 	BSF FC4			;THIS WAS A FIX FOR AN UNKNOWN PROBLEM ON FC4 DWELL WHICH IS SUPPOSED TO BE SAME AS FC1 DWELL. 10-17-07
  ENDIF
DW.2
   	TSTFSZ LP2D,1		;IS LSB COUNT 0?  ADDED (06-15-02)
  	BRA DW.2A			;NOT ZERO, GO DEC LSB
  	TSTFSZ LP2DH,1		;IS MSB 0?
  	BRA DW.2Z			;MSB NOT ZERO SO HANDLE
  	BRA DW.3			;MSB 0 TOO SO DO NOTHING & GO CHECK 2
DW.2Z
	SETF LP2D,1			;RE-FILL LSB
	DECF LP2DH,1,1		;DECREMENT MSB
  	BRA DW.3			;DONE WITH 2, GO CHECK 3
DW.2A
	DECFSZ LP2D,1,1		;DECREMENT LEAD COIL 1 DWELL COUNT
	BRA DW.3		;GO TEST ROTOR 3 DWELL COUNT
  	TSTFSZ LP2DH	;SEE IF MSB WAS ZERO
  	BRA DW.2Z		;HANDLE OVERFLOW IF NOT				 ;IT WAS, SO HANDLE DWELL TIME
 
  IF ENG!=0xA7
 	BTFSC LSF		;TEST FOR SLOW SPEED DWELL FLG	12-03-00
 	BRA DW.3
  ENDIF
	BSF FC2			;TURN ON ROTOR 1 LEAD COIL IF NOT LSF    GP2
  IF ENG==0xAD
  	BSF FC3
  ENDIF
DW.3
  IF ENG==0xAD
    POPA
 	RETFIE
  ENDIF
  
   	TSTFSZ LP3D,1		;IS LSB COUNT 0?  ADDED (06-15-02)
  	BRA DW.3A			;NOT ZERO, GO DEC LSB
  	TSTFSZ LP3DH,1		;IS MSB 0?
  	BRA DW.3Z			;MSB NOT ZERO SO HANDLE
  	BRA DW.4			;MSB 0 TOO SO DO NOTHING & GO CHECK 4
DW.3Z
	SETF LP3D,1			;RE-FILL LSB
	DECF LP3DH,1,1		;DECREMENT MSB
  	BRA DW.4			;DONE WITH 1, GO CHECK 2
DW.3A
	DECFSZ LP3D,1,1		;DECREMENT LEAD COIL 1 DWELL COUNT
	BRA DW.4		;GO TEST NEXT ROTOR OR EXIT 
  	TSTFSZ LP3DH	;SEE IF MSB WAS ZERO
  	BRA DW.3Z		;HANDLE OVERFLOW IF NOT				 ;IT WAS, SO HANDLE DWELL TIME

  IF ENG!=0xA7
 	BTFSS LSF		;  TEST FOR SLOW SPEED DWELL FLG	12-03-00
  ENDIF
	BSF FC3			;TURN ON ROTOR 1 LEAD COIL IF NOT LSF  	  GP3 
  IF ENG==0xB2			;CORVAIR ONLY HAS 3 GROUPS)
 	POPA
 	RETFIE
  ENDIF
DW.4
 ENDIF
  
 IF (ENG==0xBA)        ;FORD V6 STOCK CAS
   	TSTFSZ LP1D,1		;IS LSB COUNT 0?  ADDED (06-15-02)
  	BRA DW.1A			;NOT ZERO, GO DEC LSB
  	TSTFSZ LP1DH,1		;IS MSB 0?
  	BRA DW.1			;MSB NOT ZERO SO HANDLE
  	BRA DW.2			;MSB 0 TOO SO DO NOTHING & GO CHECK 2
DW.1
	SETF LP1D,1			;RE-FILL LSB
	DECF LP1DH,1,1		;DECREMENT MSB
  	BRA DW.2			;DONE WITH 1, GO CHECK 2
DW.1A
	DECFSZ LP1D,1,1		;DECREMENT LEAD COIL 1 DWELL COUNT
	BRA DW.2		;GO TEST ROTOR 2 DWELL COUNT
  	TSTFSZ LP1DH	;SEE IF MSB WAS ZERO
  	BRA DW.1		;HANDLE OVERFLOW IF NOT				 ;IT WAS, SO HANDLE DWELL TIME
 	BTFSC LSF		;  TEST FOR SLOW SPEED DWELL FLG	12-03-00
 	BRA DW.2
	BSF FC3
	BSF FC4
DW.2
   	TSTFSZ LP2D,1		;IS LSB COUNT 0?  ADDED (06-15-02)
  	BRA DW.2A			;NOT ZERO, GO DEC LSB
  	TSTFSZ LP2DH,1		;IS MSB 0?
  	BRA DW.2Z			;MSB NOT ZERO SO HANDLE
  	BRA DW.3			;MSB 0 TOO SO DO NOTHING & GO CHECK 2
DW.2Z
	SETF LP2D,1			;RE-FILL LSB
	DECF LP2DH,1,1		;DECREMENT MSB
  	BRA DW.3			;DONE WITH 2, GO CHECK 3
DW.2A
	DECFSZ LP2D,1,1		;DECREMENT LEAD COIL 1 DWELL COUNT
	BRA DW.3		;GO TEST ROTOR 3 DWELL COUNT
  	TSTFSZ LP2DH	;SEE IF MSB WAS ZERO
  	BRA DW.2Z		;HANDLE OVERFLOW IF NOT				 ;IT WAS, SO HANDLE DWELL TIME
 	BTFSC LSF		;TEST FOR SLOW SPEED DWELL FLG	12-03-00
 	BRA DW.3
	BSF FC2
	BSF FC6
DW.3
   	TSTFSZ LP3D,1		;IS LSB COUNT 0?  ADDED (06-15-02)
  	BRA DW.3A			;NOT ZERO, GO DEC LSB
  	TSTFSZ LP3DH,1		;IS MSB 0?
  	BRA DW.3Z			;MSB NOT ZERO SO HANDLE
  	BRA DW.X			;MSB 0 TOO SO DO NOTHING &EXIT
DW.3Z
	SETF LP3D,1			;RE-FILL LSB
	DECF LP3DH,1,1		;DECREMENT MSB
  	BRA DW.X			;DONE WITH 1, EXIT
DW.3A
	DECFSZ LP3D,1,1		;DECREMENT LEAD COIL 1 DWELL COUNT
	BRA DW.X		;GO TEST NEXT ROTOR OR EXIT 
  	TSTFSZ LP3DH	;SEE IF MSB WAS ZERO
  	BRA DW.3Z		;HANDLE OVERFLOW IF NOT				 ;IT WAS, SO HANDLE DWELL TIME
 	BTFSC LSF		;  TEST FOR SLOW SPEED DWELL FLG	12-03-00
 	BRA DW.X
	BSF FC1
	BSF FC5
DW.X
	POPA
	RETFIE
 ENDIF  ;END OF 0xAA / (FORD V6 STOCK CAS)  
 
 IF (ENG==0xB5)  ;FORD V6 3.8/SUBE 2.7  DWELL ROUT
 
   	TSTFSZ LP1D,1		;IS LSB COUNT 0?  ADDED (06-15-02)
  	BRA DW.1A			;NOT ZERO, GO DEC LSB
  	TSTFSZ LP1DH,1		;IS MSB 0?
  	BRA DW.1			;MSB NOT ZERO SO HANDLE
  	BRA DW.2			;MSB 0 TOO SO DO NOTHING & GO CHECK 2
DW.1
	SETF LP1D,1			;RE-FILL LSB
	DECF LP1DH,1,1		;DECREMENT MSB
  	BRA DW.2			;DONE WITH 1, GO CHECK 2
DW.1A
	DECFSZ LP1D,1,1		;DECREMENT LEAD COIL 1 DWELL COUNT
	BRA DW.2		;GO TEST ROTOR 2 DWELL COUNT
  	TSTFSZ LP1DH	;SEE IF MSB WAS ZERO
  	BRA DW.1		;HANDLE OVERFLOW IF NOT				 ;IT WAS, SO HANDLE DWELL TIME
 	BTFSC LSF		;  TEST FOR SLOW SPEED DWELL FLG	12-03-00
 	BRA DW.2
	BSF FC1
	BSF FC4
DW.2
   	TSTFSZ LP2D,1		;IS LSB COUNT 0?  ADDED (06-15-02)
  	BRA DW.2A			;NOT ZERO, GO DEC LSB
  	TSTFSZ LP2DH,1		;IS MSB 0?
  	BRA DW.2Z			;MSB NOT ZERO SO HANDLE
  	BRA DW.3			;MSB 0 TOO SO DO NOTHING & GO CHECK 2
DW.2Z
	SETF LP2D,1			;RE-FILL LSB
	DECF LP2DH,1,1		;DECREMENT MSB
  	BRA DW.3			;DONE WITH 2, GO CHECK 3
DW.2A
	DECFSZ LP2D,1,1		;DECREMENT LEAD COIL 1 DWELL COUNT
	BRA DW.3		;GO TEST ROTOR 3 DWELL COUNT
  	TSTFSZ LP2DH	;SEE IF MSB WAS ZERO
  	BRA DW.2Z		;HANDLE OVERFLOW IF NOT				 ;IT WAS, SO HANDLE DWELL TIME
 	BTFSC LSF		;TEST FOR SLOW SPEED DWELL FLG	12-03-00
 	BRA DW.3
	BSF FC2
	BSF FC5
DW.3
   	TSTFSZ LP3D,1		;IS LSB COUNT 0?  ADDED (06-15-02)
  	BRA DW.3A			;NOT ZERO, GO DEC LSB
  	TSTFSZ LP3DH,1		;IS MSB 0?
  	BRA DW.3Z			;MSB NOT ZERO SO HANDLE
  	BRA DW.X			;MSB 0 TOO SO DO NOTHING &EXIT
DW.3Z
	SETF LP3D,1			;RE-FILL LSB
	DECF LP3DH,1,1		;DECREMENT MSB
  	BRA DW.X			;DONE WITH 1, EXIT
DW.3A
	DECFSZ LP3D,1,1		;DECREMENT LEAD COIL 1 DWELL COUNT
	BRA DW.X		;GO TEST NEXT ROTOR OR EXIT 
  	TSTFSZ LP3DH	;SEE IF MSB WAS ZERO
  	BRA DW.3Z		;HANDLE OVERFLOW IF NOT				 ;IT WAS, SO HANDLE DWELL TIME
 	BTFSC LSF		;  TEST FOR SLOW SPEED DWELL FLG	12-03-00
 	BRA DW.X
	BSF FC3
	BSF FC6
DW.X
	POPA
	RETFIE
 ENDIF  ;END OF 0xB5/B6 (SUBE 2.7/FORD 3.8 V6)  

 
 IF ENG==0xA6||(ENG==0xA7)||(ENG==0xAB)||(ENG==0xAC)||(ENG==0xAD)||(ENG==0xB1)||(ENG==0xB2)||ENG==0xA6||ENG==0xB3||ENG==0xB4
   	TSTFSZ LP1D,1		;IS LSB COUNT 0?  ADDED (06-15-02)
  	BRA DW.1A			;NOT ZERO, GO DEC LSB
  	TSTFSZ LP1DH,1		;IS MSB 0?
  	BRA DW.1			;MSB NOT ZERO SO HANDLE
  	BRA DW.2			;MSB 0 TOO SO DO NOTHING & GO CHECK 2
DW.1
	SETF LP1D,1			;RE-FILL LSB
	DECF LP1DH,1,1		;DECREMENT MSB
  	BRA DW.2			;DONE WITH 1, GO CHECK 2
DW.1A
	DECFSZ LP1D,1,1		;DECREMENT LEAD COIL 1 DWELL COUNT
	BRA DW.2		;GO TEST ROTOR 2 DWELL COUNT
  	TSTFSZ LP1DH	;SEE IF MSB WAS ZERO
  	BRA DW.1		;HANDLE OVERFLOW IF NOT				 ;IT WAS, SO HANDLE DWELL TIME
  IF ENG==0xB3
  		BSF ANF			;SAFE TIME TO DO ANALOG AT HIGH SPEED
  ENDIF
 	BTFSC LSF		;  TEST FOR SLOW SPEED DWELL FLG	12-03-00  
 	BRA DW.2
	BSF FC1			;TURN ON ROTOR 1 LEAD COIL IF NOT LSF
  IF (ENG==0xAD)||(ENG==0xB4)
 	  	BSF FC4			;HONDA + SUZI 4
  ENDIF
DW.2
   	TSTFSZ LP2D,1		;IS LSB COUNT 0?  ADDED (06-15-02)
  	BRA DW.2A			;NOT ZERO, GO DEC LSB
  	TSTFSZ LP2DH,1		;IS MSB 0?
  	BRA DW.2Z			;MSB NOT ZERO SO HANDLE
  	BRA DW.3			;MSB 0 TOO SO DO NOTHING & GO CHECK 2
DW.2Z
	SETF LP2D,1			;RE-FILL LSB
	DECF LP2DH,1,1		;DECREMENT MSB
  	BRA DW.3			;DONE WITH 2, GO CHECK 3
DW.2A
	DECFSZ LP2D,1,1		;DECREMENT LEAD COIL 1 DWELL COUNT
	BRA DW.3		;GO TEST ROTOR 3 DWELL COUNT
  	TSTFSZ LP2DH	;SEE IF MSB WAS ZERO
  	BRA DW.2Z		;HANDLE OVERFLOW IF NOT				 ;IT WAS, SO HANDLE DWELL TIME
  IF ENG==0xB3
    	BSF ANF			;SAFE TIME TO DO ANALOG AT HIGH SPEED
  ENDIF
    BTFSC LSF		;TEST FOR SLOW SPEED DWELL FLG	12-03-00
 	BRA DW.3

	BSF FC2			;TURN ON ROTOR 1 LEAD COIL IF NOT LSF
  IF ENG==0xB4      ;HONDA V6
    	BSF FC5
  ENDIF
  IF ENG==0xAD
    	BSF FC3
  ENDIF
DW.3
  IF ENG==0xAD
    	POPA
 	    RETFIE
  ENDIF

   	TSTFSZ LP3D,1		;IS LSB COUNT 0?  ADDED (06-15-02)
  	BRA DW.3A			;NOT ZERO, GO DEC LSB
  	TSTFSZ LP3DH,1		;IS MSB 0?
  	BRA DW.3Z			;MSB NOT ZERO SO HANDLE
  	BRA DW.4			;MSB 0 TOO SO DO NOTHING & GO CHECK 4
DW.3Z
	SETF LP3D,1			;RE-FILL LSB
	DECF LP3DH,1,1		;DECREMENT MSB
  	BRA DW.4			;DONE WITH 1, GO CHECK 2
DW.3A
	DECFSZ LP3D,1,1		;DECREMENT LEAD COIL 3 DWELL COUNT
	BRA DW.4		;GO TEST NEXT ROTOR OR EXIT 
  	TSTFSZ LP3DH	;SEE IF MSB WAS ZERO
  	BRA DW.3Z		;HANDLE OVERFLOW IF NOT				 ;IT WAS, SO HANDLE DWELL TIME
  IF ENG==0xB3
 		BSF ANF			;SAFE TIME TO DO ANALOG AT HIGH SPEED
  ENDIF
    BTFSC LSF		;  TEST FOR SLOW SPEED DWELL FLG	12-03-00
 	BRA DW.4
	BSF FC3			;TURN ON ROTOR 1 LEAD COIL IF NOT LSF  	
  IF ENG==0xB4      ;HONDA V6
  		BSF FC6
  ENDIF
  IF (ENG==0xB2)			;CORVAIR & HONDA V6 HAVE ONLY 3 GROUPS)
 		POPA
 		RETFIE
  ENDIF
DW.4
  IF(ENG==0xAB)||(ENG==0xAC)||(ENG==0xB1)||(ENG==0xB3)||(ENG==0xA7)	;EJ25X, V8, EAGLE540 & SVX
   		TSTFSZ LP4D,1		;IS LSB COUNT 0?  ADDED (06-15-02)
  		BRA DW.4A			;NOT ZERO, GO DEC LSB
  		TSTFSZ LP4DH,1		;IS MSB 0?
  		BRA DW.4Z			;MSB NOT ZERO SO HANDLE
  		BRA DW.5			;MSB 0 TOO SO DO NOTHING & GO CHECK 4
DW.4Z
		SETF LP4D,1			;RE-FILL LSB
		DECF LP4DH,1,1		;DECREMENT MSB
  		BRA DW.5			;DONE WITH 1, GO CHECK 2
DW.4A
		DECFSZ LP4D,1,1		;DECREMENT LEAD COIL 1 DWELL COUNT
		BRA DW.5		;GO TEST NEXT ROTOR OR EXIT 
  		TSTFSZ LP4DH,1	;SEE IF MSB WAS ZERO
  		BRA DW.4Z		;HANDLE OVERFLOW IF NOT				 ;IT WAS, SO HANDLE DWELL TIME
   IF ENG==0xB3
 		BSF ANF			;SAFE TIME TO DO ANALOG AT HIGH SPEED
   ENDIF
 		BTFSS LSF		;TEST FOR SLOW SPEED DWELL FLG	12-03-00
		BSF FC4			;TURN ON ROTOR 4 LEAD COIL IF NOT LSF  	
DW.5 
  ENDIF     ;20B  OR GEO VER  A3 || A6 || AB || AC,B4,B3  (EJ25 & V8 ADDED 7-16-04)
DW.X
	POPA			;@@@@@@@@@@@@@@@
	RETFIE
 ENDIF     ; GEO VER  || A6, A7, AA, AB, AC, AD, AE, B4  (EJ25 & V8 ADDED 7-16-04) SUZUKI ADDED 01-23-05 SVX ADDED 1-28-05   

PIV.1			; MORE PER. INT HANDLER EE WRITE COMPLETE INT, SETS EEWRC.  	
	BTFSS PIR2,EEIF,0		;TEST FOR EE WRITE COMPLETE INT
	BRA PIV.1A				;NOT EE INT SO GO TEST FOR SER INT
	BCF EECON1,WREN,0		;CLEAR EE WRITE ENABLE
	BSF EEWRC				;SET EE WRITE COMPLETE FLAG
PIV.1B
	BCF PIR2,EEIF,0			;CLR INT
	POPA
	RETFIE
	;THIS ROUTINE PROCESSES BOTH A & B SER INTS  
	;WHEN CMDEXF FLAG IS SET, EXEC WILL PROCESS THE CMD AND DECIDE HOW TO PROCESS IT BASED ON WHETHER IT IS A OR B
PIV.1A
	BTFSS PIR1,RCIF,0		;TEST FOR SER INPUT INT.
	BRA PIV.1X				;NOT SER INT SO EXIT   BAD INT   ??????????????????????
	BTFSC RCSTA,OERR,0		;CK FOR OVER RUN ERROR
	BRA ORHAND			;HANDLE OVERRUN	
	MOVF RCREG,0,0		;GET SER INPUT WORD
	BTFSC SERF			;IS THERE A COMMAND IN PROCESS? (SERF IS IN BK1)
	BRA NCMDX			;EXIT IF LAST CMD STILL IN PROCESS
	BTFSC EEWF			;SEE IF EEPROM IS BUSY
	BRA NCMDX			;IGNORE CMD IF BSY
	BTFSS CMDF			;test for command RCVD
	BRA NCMD			;GO TO NEW COMMAND ROUT
	BTFSC WREG,7,0			;IS THIS DATA?	MSB CLR?
	BRA EOCT			;GO TO END OF CMD TEST
	BTFSC D2F			;IS THIS 1ST DATA BYTE?
	BRA D2FR			;BRA 2ND DATA BYTE ROUT
	MOVWF SDDL,1			;SAVE BYTE IN LSB OF DATA WORD
	BSF D2F				;SET 2ND DATA BYTE FLAG FOR NEXT BYTE.
PIV.1X
	POPA			; ALL PERIPHERAL INTS MUST USE POPA
	RETFIE

D2FR				;DATA WORD 2 RECIEVE & STORE ROUT (BK1 SEL ON ENTRY)
	BTFSC WREG,0			;IS BIT 0 SET?
	BSF SDDL,7,1			;SET msb IN LSB OF DATA WORD IF YES
	MOVLW 0x04
	CPFSEQ SIPTRH,1			;HAS PTR OVERFLOWED?
	BRA D2FR.1
	BCF CMDF			;ERROR SO CLR CMD FLAG
	BCF D2F				;CLEAR THIS TOO
	BRA D2FR.X			;EXIT W/ NO ACTION IF OVERFLOWED
D2FR.1
	MOVFF SIPTRL,FSR0L			;LOAD IT WITH SER BUF POINTER
	MOVFF SIPTRH,FSR0H
	MOVFF SDDL,POSTINC0		;STORE ASSEMBLED DATA BYTE TO RAM AT SPTRl&h
	MOVFF FSR0L,SIPTRL			;SAVE THE INC SERIAL BUFFER POINTER
	MOVFF FSR0H,SIPTRH
	BCF D2F				;CLR THE 2ND BYTE FLAG
D2FR.X	
	POPA
	RETFIE
	
ORHAND				;RESET RCVR, KILL ANY CMD & EXIT IF OVERUN DETECTED
	BCF RCSTA,SPEN,0		
	BCF PIR1,RCIF,0			;CLR RCVR INT FLAG
	BCF CMDF
	BCF D2F
	BCF CMDEXF
	BSF RCSTA,SPEN,1		;RE-ENABLE RECEPTION ON SERIAL
	POPA
;	BSF INTCON,PEIE,0		;RE-ENABLE PERIPHERAL INTS
	RETFIE

NCMD				;NEW CMD PROCESSOR
	BTFSS WREG,7,0			;TEST FOR COMMAND
	BRA NCMDX			;EXIT, IT IS DATA WORD WITH NO CMD ACTIVE.
	MOVWF CMDREG,1			;SAVE THE NEW COMMAND
	BSF CMDF			;SET CMD RCVD FLAG
	BCF D2F				;CLR D2F
					;LOAD SER BUF POINTER WITH STARTING ADDRESS OF SER INPUT BUFFER (0x300)
	CLRF SIPTRL,1
	MOVLW 0x03
	MOVWF SIPTRH,1
NCMDX	
	POPA
;	BSF INTCON,PEIE,0		;RE-ENABLE PERIPHERAL INTS
	RETFIE

EOCT				;END OF CMD TEST (FF) (BK1 SELECTED ON ENTRY)
	INCFSZ WREG,0,0			;WAS BYTE EOC (FF)?
	BRA EOCT.1			;NEW CMD RECIEVED, ABORT OLD AND START NEW
	BCF CMDF			;CLR THE CMD RCVD FLAG
	BSF CMDEXF			;SET CMD EXECUTE FLAG
	POPA
	RETFIE
EOCT.1					;DIDN'T GET EXPECTED EOC
	DECF WREG,0,0			;SET CMD BACK TO WHAT IT WAS WHEN RECIEVED
	BCF CMDF
	BRA NCMD			;GO PROCESS NEW CMD

SEXEC				;SERIAL EXEC, CALLED BY EXEC WHEN CMDEXF IS FOUND SET
	BTFSS CAF			;ARE WE A?
	BRA SEXECB			;GO TO B CONTROLLER ROUT IF NOT
	MOVLW 0xF0			;TEST FOR SEND ENGINE DATA 
	CPFSEQ CMDREG,1		;?  WHAT BANK IS CMDREG IN? (BK 1)
	BRA SE.1			;GO ON
	BRA SED			;GO TO SEND ENGINE DATA
SE.1
	INCF WREG,0,0			;INC TO NEXT CMD  F1
	CPFSEQ CMDREG,1			
	BRA SE.2			;GO ON
	BRA SMAP			;GO TO SEND MAP TABLE
SE.2
	INCF WREG,0,0			;INC TO NEXT CMD  F2
	CPFSEQ CMDREG,1			
	BRA SE.3			;GO ON
	BRA RCVMAP			;GO TO RCV MAP DATA
SE.3
	INCF WREG,0,0			;INC TO NEXT CMD  F3
	CPFSEQ CMDREG,1			
	BRA SE.4			;GO ON
	BRA INCIF			;GO TO INC INJ FLOW
SE.4
	INCF WREG,0,0			;INC TO NEXT CMD  F4
	CPFSEQ CMDREG,1			
	BRA SE.5			;GO ON
	BRA DECIF.0			;GO TO DEC INJ FLOW
SE.5
	INCF WREG,0,0			;INC TO NEXT CMD  F5
	CPFSEQ CMDREG,1			
	BRA SE.6			;GO ON
	BRA ADVIT.0			;GO TO ADVANCE IGN TIMING
SE.6
	INCF WREG,0,0			;INC TO NEXT CMD   F6
	CPFSEQ CMDREG,1			
	BRA SE.7			;GO ON
	BRA RETIT			;GO TO RETARD IGN TIMING
SE.7
	INCF WREG,0,0			;INC TO NEXT CMD   F7
	CPFSEQ CMDREG,1			
	BRA SE.8			;GO ON
	BRA SETIS.0			;GO TO SET INJECTOR STAGING (RAM & EEPROM)
SE.8
	INCF WREG,0,0			;INC TO NEXT CMD  F8
	CPFSEQ CMDREG,1			
	BRA SE.9			;GO ON
	BRA WRMTBL			;GO TO WRITE MAP TABLE ENTRY X WITH DATA Y (X =DATA BYTES IN 70,71 Y= 72,73)
SE.9
	INCF WREG,0,0			;INC TO NEXT CMD  F9
	CPFSEQ CMDREG,1			
	BRA SE.A			;GO ON
	BRA NOCMD			; Mode 2   Inc dynamic range
SE.A
	INCF WREG,0,0			;INC TO NEXT CMD  FA
	CPFSEQ CMDREG,1			
	BRA SE.B			;GO ON
	BRA NOCMD			;Mode 2  dec dyn rng
SE.B
	INCF WREG,0,0			;INC TO NEXT CMD  FB
	CPFSEQ CMDREG,1			
	BRA SE.C			;GO ON
	BRA NOCMD			;set Mode 4 (rotor 1 differential)
SE.C
	INCF WREG,0,0			;INC TO NEXT CMD  FC
	CPFSEQ CMDREG,1			
	BRA SE.D			;GO ON
	BRA NOCMD			;set rotor 2 differential
SE.D
	INCF WREG,0,0			;INC TO NEXT CMD  FD
	CPFSEQ CMDREG,1			
	BRA SE.E			;GO ON
	BRA NOCMD			;set mode 6
SE.E
	INCF WREG,0,0			;INC TO NEXT CMD  FE
	CPFSEQ CMDREG,1			
	BRA SE.F			;GO ON
	BRA NOCMD			;N/U
SE.F
	INCF WREG,0,0			;INC TO NEXT CMD  FF
	CPFSEQ CMDREG,1			
	BRA SE.X			;GO ON TO EXIT
	BRA NOCMD			;N/U
SE.X
	BCF CMDEXF
	RETURN
	
NOCMD			;NO COMMAND
;	MOVLR 0
	BCF CMDEXF
	RETURN

RETIT			;RETARD IGNITION TIMING
	CALL IGNA.0	;DO IT
	BCF CMDEXF
	RETURN

SETIS.0			;SET INJECTOR STAGING TO DATA BYTE IN BK1 ADR 0x100 (SEND IN WREG)
 IF ROTARY==1
	MOVFF SIBUF,WREG		;GET MAP VALUE FROM FIRST BUFFER ADR
	CALL SETIS
	BCF CMDEXF
	RETURN
 ELSE
	RETURN
 ENDIF

DECIF.0			;DECREMENT INJECTOR FLOW
	MOVFF PR2,IPWCR		;GET CURRENT PR2
	CALL DECIF
	BCF CMDEXF
	RETURN

ADVIT.0			;ADVANCE IGNITION TIMING
;	MOVLR 0
	CALL ADVIT
	BCF CMDEXF
	RETURN

INCIF			;INCREMENT INJECTOR FLOW

	MOVFF PR2,IPWCR		;GET CURRENT PR2
	CALL T2ADJ.1
	BCF CMDEXF
	RETURN

SED			;SEND ENGINE DATA OUT SER CHANNEL (F0 CMD ON A CONTROLLER) (BK1 RAM SEL ON ENTRY)
	BTFSS TXSTA,TRMT,0	;SEE IF XMITER BUFFER IS EMPTY
	BRA SED.X		;RETURN IF NO (W/O CLEARING CMDEXF)
			;MOVE 1ST  ENGINE DATA LIST TO TO SBUF
	LFSR 2,EDLIST		;POINT TO START OF ENGINE DATA LIST	
	LFSR 1,SOBUF		;POINT TO START OF SERIAL OUTPUT BUFFER
	MOVLW D'25'
	MOVWF CTR,1		;LOAD WORD COUNT
SED.1	
	MOVFF POSTINC2,POSTINC1
	DECFSZ CTR,1,1
	BRA SED.1
			;setup sflag byte in buffer (staging flag)
 IF ROTARY==1        ;now send sflag byte for byte 26
	CLRF WREG,0
	BTFSC SFLAG
	BSF WREG,0,0
 ELSE					;DONT SET SFLAG IF NOT AN ENGINE USING STAGING (PISTON ENGINES)
 	CLRF WREG,0
 ENDIF
	MOVWF POSTINC1,0		;WRITE SFLAG BYTE TO S BUFFER

	MOVFF POSTINC2,POSTINC1		;MOVE IPWRNG TO BUF        (ADDED AFTER STAGGING FLAG FOR BACKWARD COMPATIBILITY)
	MOVFF POSTINC2,POSTINC1		;MOVE RPMTHRESH TO BUF
	MOVFF POSTINC2,POSTINC1		;MOVE R1DIFA TO BUFFER  ROTOR 1 DIFFERENTIAL, NOT STAGING 
	MOVFF POSTINC2,POSTINC1	;MOVE R2DIFA TO BUFFER  ROTOR 2 DIF,NOT STAGING 
	
	MOVLW 0xF0		;SEND SYSEX (F0) FOR SEND ENGINE DATA ON SER CH
	MOVWF TXREG,0
	MOVLW LOW SOBUF		;LOAD SER OUT PTR W/ START ADDRESS OF SER OUT BUFFER
	MOVWF SOPTRL,1		;SETUP START ADDRESS ($400) OF SOBUF IN SERPTR
	MOVLW HIGH SOBUF
	MOVWF SOPTRH,1
	MOVLW D'30'		;NUMBER OF BYTES TO SEND (SBUF-SBUF +26) UP FROM 26 TO 28 (10-11-05) UP TO 30 ON 01-25-08 FOR IPWRNG/RPMTHRESH
	MOVWF SWCNT,1
	BCF SB2F		;CLEAR BYTE 2 FLAG
	BSF SERF		;SET THE SERIAL FLAG
	BCF CMDEXF		;CLR THE CMD EXECUTE FLAG
	RETURN
SED.X
	RETURN

SMAP				;SEND MAP TABLE (OUT OF RAM) BK1 SEL ON ENTRY 
	BTFSS TXSTA,TRMT,0	;SEE IF XMITER BUFFER IS EMPTY
	RETURN			;RETURN IF NO (W/O CLEARING CMDEXF)
	MOVLW 0xF1		;SEND SYSEX (F1) FOR SEND MAP DATA ON SER CH
	MOVWF TXREG,0
	MOVLW LOW MTAB		;SETUP START ADDRESS AT MAP TABLE START ($200) (gets lsb only)
	MOVWF SOPTRL,1
	MOVLW HIGH MTAB
	MOVWF SOPTRH,1
	MOVLW D'128'		;LOAD NUMBER OF BYTES TO SEND
	MOVWF SWCNT,1
	BCF SB2F		;CLEAR BYTE 2 FLAG
	BSF SERF		;SET THE SERIAL FLAG
	BCF CMDEXF
	RETURN

RCVMAP				;RECEIVE MAP DATA & UPDATE EEPROM  (RECEIPT OF THIS CMD MEANS THAT CONTROLLER A 
				;HAS ALREADY RECEIVED MAP DATA IN SIBUF
	BCF CMDEXF
	BTFSC VT		;ENGINE RUNNING?
	RETURN			;NO LOADING OF MAP TABLE WHILE ENGINE RUNNING, IGNORE COMMAND
	LFSR 2,SIBUF		;SETUP ADDRESS IN FSR2 (WHERE TO FIND NEW MAP DATA
	LFSR 1,MTAB		;WHERE TO STORE NEW DATA		;TO POINTER FSR1 0x80 - FF IS MTAB RANGE
	MOVLW D'128'	;# BYTES TO COPY
	MOVWF CTR,1			
RMAP.A			;          XFER DATA FROM SBUF TO MTAB
	MOVFF POSTINC2,POSTINC1	;GET DATA BYTE FROM BK1 SBUFFER	;STORE IN MAP TABLE (BK 0)
	DECFSZ CTR,1,1		;TEST FOR LAST BYTE DONE
	BRA RMAP.A		;GO FOR NEXT BYTE IF NOT
	MOVLW EEMTAB			;LOAD WORD STR ADR IN EE (WHERE TO WRITE IN EEPROM)  (EEMTAB = $80  MAP TABLE IS 200 - 27F IN RAM 
	MOVWF WSAL,1			;MOVE TO WORD START ADDRESS (WHERE TO STORE DATA IN EEPROM)
 IF EC3TB==1				;NO MSB FOR EEPROM IN 452 CHIP
	MOVLW 0
	MOVWF WSAH,1
 ENDIF
	LFSR 1,MTAB			;LOAD ADDRESS IN RAM TO GET DATA FROM (USED IN I2CWR) (WSA WILL BE ZERO IN THIS CASE?  !!!!!
RMAP.1
	MOVLW D'128'			;LOAD BYTE COUNT (MAX 16 AT A TIME)
	MOVWF WC,1
	CALL EEWR			;CALL WRITE IT (16 BYTES AT A TIME) (80 - FF)
	RETURN


WRMTBL			;UPDATE MAP TABLE ADDRESS IN 1st ser buf adr WITH DATA IN 2nd  (DATA ALREADY ASSEMBLED INTO 8 BIT BYTES)
			;ENTERED WITH RAM BK1 SELECTED.
			; (WILL ALSO UPDATE BK2 RAM TABLE ADDRESS)
;This rout was updated to reflect 1 byte table DATA and an error (bank sel 1 missing) was corrected.  8-03

	LFSR 2,SIBUF		;POINT TO BUFFER START (WHERE TO GET DATA) 1ST SERIAL INPUT IS ADR TO WRITE DATA AT 2ND SER BUFFER LOCATION.
	MOVLW D'128'	;TEST FOR VALID OFFSET ADDRESS (VALID ADDRESSES ARE 0 - 127)
	CPFSLT INDF2,0		;IS OFFSET ADDRESS > 0x7F?   (SBUF = TABLE ADR, SBUF +1 = DATA   ???????????????  ERROR?
	BRA WRMTBL.X		;EXIT IF OUT OF LIMITS
	MOVFF POSTINC2,FSR1L		;GET TABLE ADDRESS OFFSET TO LSB OF POINTER (WHERE TO PUT DATA)& INC FSR2 POINTER TO DATA
	
	MOVLW HIGH MTAB			;BK OF MTAB (msb) (MSB RAM ADDRESS TO STORE DATA) (CURRENTLY $200)     
	MOVWF FSR1H,0			;(FSR1 NOW CONTAINS THE ADDRESS OF MTAB WHERE NEW DATA IS TO BE STORED(EEWR USES THIS TOO!)
	MOVFF INDF2,INDF1	; store new data IN RAM (INDF1 POINTS TO RAM ADDRESS IN MAP TABLE) (BK 2 + OFFSET RECIEVED IN SERBUF 
						;INDF2 POINTS TO THE DATA BYTE TO BE WRITTEN  NOW, INDF1 ALSO POINTS TO SAME DATA

					;EEWR EXPECTS POINTER TO DATA TO WRITE IN FSR1, EEPROM ADDRESS TO WRITE IN WSAL+H
	MOVFF FSR1L,WSAL	;move adr offset to EEPROM ADDRESS TO WRITE
	MOVLW EEMTAB		;GET BASE ADDRESS OF EE MAP TABLE  (CURRENTLY $80)
	ADDWF WSAL,1,1
 IF EC3TB==1
	CLRF WSAH
	CLRF FSR1H,0
 ENDIF					;
	MOVLW D'1'			;LOAD BYTE COUNT  8-03 CHANGE
	MOVWF WC,1			;HOW MANY WORDS TO XFER TO EEPROM
	CALL EEWR			;CALL WRITE IT TO EEPROM (1 BYTES)   (EXPECTS FSR1 TO POINT TO DATA TO BE WRITTEN
	BCF CMDEXF			;CLEAR THE FLAG
WRMTBL.X
	RETURN

ULEE				;UPLOAD ALL EEPROM CONTENTS TO CONTROLLER B 
				;CONTROLLER A COMMAND CALLED BY POWER-UP PGM FUNCTION 2
	MOVLW D'250'		;LOAD EEPROM FUNCTION TIMER
	MOVWF EETMR,1		;THIS WILL BE ~53 MILLISECONDS
	BSF EEWF
ULEE.0
	BTFSC EEWF	;WAIT FOR DELAY TIME (SO B WILL BE GOOD & READY)
	BRA ULEE.0
				;COPY R1DIF & FOLLOWING 15 BYTES TO SOBUF @ $400 - 40F RAM  (WE ARE MOVING A FEW EXTRA BYTES HERE)
	LFSR 2,SOBUF		;POINT TO START OF BUFFER $400
	LFSR 1,R1DIF		;POINT TO START OF ENGINE VARIABLE LIST IN RAM BK1 

ULEE.1
	MOVFF POSTINC1,POSTINC2	;GET DATA BYTE FROM ENG DATA LIST & STORE IN SER OUTPUT BUFFER AT $400
	MOVLW 0x0F		;LAST BYTE DONE?
	CPFSGT FSR2L,0
	BRA ULEE.1		;GO FOR NEXT BYTE IF NOT	
			;NOW MOVE  200 - 27F TO BK1 410 - 48F?
	LFSR 1,MTAB		;POINT TO START OF MAP TABLE ($200)  (FSR2 IS NOW POINTING TO $410)
ULEE.2    
	MOVFF POSTINC1,POSTINC2	;GET DATA BYTE FROM MAP TABLE IN RAM & COPY TO SER BUFFER @ 410 - 48F
	MOVLW 0x7F		;LAST BYTE DONE?
	CPFSGT FSR1L,0		;HAD ERROR HERE, WAS CPFSLT CORRECTED 4-28-05 
	BRA ULEE.2		;GO FOR NEXT BYTE IF NOT	
				;SEND CMD TO B CONTROLLER
ULEE.3
	BTFSS TXSTA,TRMT,0	;SEE IF XMITER BUFFER IS EMPTY
	BRA ULEE.3		;GO CK AGAIN IF NOT
	MOVLW 0xFE
	MOVWF TXREG,0		;SEND IT OUT	
		;SEND ADDRESS 400 - 48F IN BK1 TO SER OUTPUT ( IS NOT NEEDED BUT DOES NOT CAUSE A PROBLEM
	CLRF SOPTRL,1		;SET START ADDRESS ($400) IN SER OUTPUT PTR
	MOVLW 0x04
	MOVWF SOPTRH,1
	MOVLW D'144'		;SET BYTE COUNT
	MOVWF SWCNT,1
	BCF SB2F		;CLR SEL BYTE 2 FLAG
	BSF SERF
	BCF CMDEXF
ULEE.4			;THIS IS A MINI EXEC BECAUSE EXEC IS NOT RUNNING NOW
	BTFSS SERF		;IS SERF STILL SET?
	BRA ULEE.X		;EXIT IF NOT	BRA ULEE.4
	CALL SERX		;CALL SERIAL EXEC IF FLAG SET
	CLRWDT		;ADDED 08-26-10
	BRA ULEE.4
ULEE.X	
	RETURN			;DONE SO EXIT  (TO EXEC)

SSTEP				;SEND OIL INJECTION PUMP STEP COMMAND  (0xFD XX  FF)  XX = STEP #
	BCF CMDEXF
	RETURN

SEXECB				;CONTROLLER B SERIAL CMD EXEC (CALLED BY EXEC WHEN CMDEXF IS FOUND SET
				;(only one cmd (download all EEPROM DATA (DATA NOW IN SER IN BUF RAM AT 300 - 38F))
				;DATA TO BE WRITTEN TO EEPROM 0 - F AND 80 - FF AND COPIED TO BK1 R1DIF - +8 & 200 - 27F
	MOVLW 0xFE			;TEST FOR DOWNLOAD EEPROM CMD (WRITE SER BUFFER RAM TO EEPROM)
	CPFSEQ CMDREG,1
	BRA SEXB.XX			;INVALID CMD FOR B SO CLEAR IT & EXIT
					;      (COPY serinbuf 300 - 38f TO    200 - 27f IN RAM (MTAB))
	LFSR 2,SIBUF	;		$300 	
	LFSR 1,R1DIF	;		$120		
	MOVLW D'16'		;LAST ADR TEST VALUE
SEXB.0					;MOVE 1ST 16 BYTES OF SER IN BUF TO ENGINE DATA AREA STARTING AT R1DIF
	MOVFF POSTINC2,POSTINC1		;GET DATA BYTE FROM SIBUF TO ENG DATA RAM
	DECFSZ WREG,0,0				;LAST ENG DATA ADR DONE?  4-28-05 found error here .  thought lsb started at zero, it didn't
	BRA SEXB.0		;GO FOR NEXT BYTE IF NOT

					;NOW (COPY SIBUF 310 - 38F TO MTAB 200 - 27F
	LFSR 1,MTAB		;POINT TO START MTAB
	MOVLW D'128'		;SET BYTE COUNT
SEXB.1
	MOVFF POSTINC2,POSTINC1		;GET DATA BYTE FROM SIBUF TO MTAB RAM
	DECFSZ WREG,0,0		;DEC BYTE COUNT
	BRA SEXB.1		;GO FOR NEXT BYTE IF NOT	
			
	MOVFF IPWCR,PR2		;PUT NEW IPWCR IN PR2

			;;NOW PUT ENG DATA RAM IN EEPROM

	LFSR 1,R1DIF		;;MOVE TO WORD START ADDRESS WHERE TO GET DATA FROM RAM			
						;LOAD RAM START ADDRESS TO GET DATA FROM (MAP TABLE IN RAM)
	CLRF WSAL,1			;SETUP FOR I2CWR (WRITE EEPROM STARTING AT ADR 0)
	CLRF WSAH,1
	MOVLW D'16'			;LOAD BYTE COUNT (MAX 16 AT A TIME)
	MOVWF WC,1		
	CALL EEWR			;CALL WRITE IT (16 BYTES) (0 - F)		
			;NOW COPY RAM 200 - 27F (MTAB) TO EEPROM 80 - FF
	MOVLW LOW EEMTAB
	MOVWF WSAL,1
 IF EC3TB==1
	MOVLW 0x00			;LOAD WORD START ADR IN EEPROM
	MOVWF WSAH,1			;MOVE TO WORD START ADDRESS (IN EEPROM)
 ENDIF						;LOAD RAM START ADDRESS TO GET DATA FROM (MAP TABLE IN RAM)
	LFSR 1,MTAB			;SETUP FOR EEWR (WHERE TO GET DATA IN RAM)
SEXB.2
	MOVLW D'128'			;LOAD BYTE COUNT
	MOVWF WC,1
	CALL EEWR			;CALL WRITE IT	
SEXB.X
	MOVLW D'150'		;LOAD EEPROM FUNCTION TIMER
	MOVWF EETMR,1		;THIS WILL BE ~33 MILLISECONDS
	BSF EEWF
SEXB.3
	BTFSC EEWF	;WAIT FOR DELAY TIME (SO B WILL BE GOOD & READY)
	BRA SEXB.3
SEXB.XX
	BCF CMDEXF
	RETURN
				
SERX	; SERIAL OUTPUT EXEC ROUTINE  (OUTPUT BUFFER IS AT RAM $400
;		;NOTE!  serial output buffers are handled in poled mode, not interrupt driven.
			;SERX is called by EXEC only when SERF is found to be set (indicates ser out buffer active)

		;CALLER MUST LOAD SOPTR W/ START ADDRESS AND SWCNT (serial word cnt) WITH # of 8 bit BYTE COUNT & 
		;CLEAR THE SB2F (Serial byte # 2) FLAG And set SERF. 
		;
		;Serial words are sent as 7 bit values in two bytes
		;SERX WILL SEND EOX (FF) and clear SERF WHEN BUFFER IS COMPLETE
			
	BTFSS TXSTA,TRMT,0	;SEE IF XMITER BUFFER IS EMPTY
	RETURN			;RETURN IF NOT
	BTFSC EOBF		;END OF BUFFER FLAG SET?
	BRA SERX.EOB	;GO SEND END OF XFER (fF)
	BTFSC SB2F		;SEND BYTE 2 FLAG SET?
	BRA SERX.C		;YES SO SEND 2ND BYTE 
SERX.0					;new byte entry point (no sb2f set)
	BSF SB2F		;SET THE 2ND BYTE FLAG FOR NEXT PASS
	MOVFF SOPTRL,FSR2L		;POINT TO SERIAL BUFFER WORD
	MOVFF SOPTRH,FSR2H

	MOVF POSTINC2,0,0	;GET NEXT DATA WORD
	BTFSS WREG,7,0		;MSB SET?
	BRA SERX.B		;GO CLEAR SBH & SEND BYTE
	ANDLW 0x7F		;MSB SET SO MASK OFF 7 LWR BITS (MSB SET SO SET MSB TO ONE & SEND LWR 7 BITS
	CLRF SBH,1		;MAKE IT 0
	INCF SBH,1,1		;MAKE IT 1
SERX.A
	MOVWF TXREG,0		;SEND IT OUT
	MOVFF FSR2L,SOPTRL		;INCREMENTED POINTER TO SPTR 
	MOVFF FSR2H,SOPTRH
	RETURN
SERX.B
	CLRF SBH,1		;CLEAR THE HIGH BYTE CAUSE MSB WAS CLEAR
	BRA SERX.A		;GO SEND LSB 

SERX.C			;send 2nd byte routine (when s2bf set)
	MOVF SBH,0,1		;GET THE HIGH BYTE
	MOVWF TXREG,0		;SEND IT OUT
	DCFSNZ SWCNT,1,1	;DECREMENT SERIAL WORD COUNT (ONLY DO ON 2ND HALF)
	BSF EOBF		;IF SER WD CNT 0 THEN SET END OF BUFFER FLAG
	BCF SB2F		;CLEAR THE 2ND BYTE FLAG	
	RETURN
SERX.EOB
	MOVLW 0xFF		;SEND END OF CMD (FF)
	MOVWF TXREG,0	;SEND IT OUT
	BCF EOBF		;CLEAR THE END OF BUFFER FLAG
	BCF SB2F		;CLEAR IT (BYTE 2 FLAG)
	BCF SERF		;CLR SERF (IS IN BK 0)
	BCF CMDEXF		;CLR THE CMD EXECUTE FLAG
	RETURN

HWINIT		;INITIALIZE HARDWARE     FIRST SECTION IS BASIC HARDWARE SETUP
;FINDIT 
	BCF INTCON,GIE,0	;DISABLE ALL INTS
	BSF RCON,IPEN,0	;ENABLE INTERRUPT PRIORITY
	BSF INTCON3,INT1IP,0		;INT0 ALWAYS HI PRI
	MOVLB 0x01			;SEL BANK 1  (ALL USER VARIABLES ARE ASSIGNED TO BK 1 ($100 - 1FF)

	CLRF PORTA,0
	MOVLW 0xFF		;INIT PORT A (NEW)
	MOVWF TRISA,0	;ALL INPUTS (ANALOG INPUTS)

	CLRF PORTB,0
	MOVLW 0xFF		;INIT PORT B INT INPUTS, ALL IN  (was E0, CHANGED FOR COMPATIBILITY W/ 18F6680 CHIP & JUMPERS ON EC2 BD  4-23-04)
	MOVWF TRISB,0		;PORT B.6 WAS INPUT FOR PGMW CHANGED TO PORT C.5
	MOVWF PORTB,0
						;INITIALIAZE PORTC (WAS PORTA)   
	CLRF PORTC,0
	MOVLW 0xFF
	MOVWF TRISC,0		;MAKE ALL INPUTS

	CLRF PORTD,0		;INIT PORT D (WAS PORT C) IGN & INJ DRIVERS
	MOVLW 0			;ALL OUTPUTS
	MOVWF TRISD,0

	CLRF PORTE,0	;INIT PORT E (WAS PORT D)
	BTFSS PORTA,4,0	;ARE WE THE A CONTROLLER?
	BRA START.0		;WE ARE A SO GO SET PORT E FOR ALL OUTPUTS
 IF ENG==0xAE
	MOVLW 00		;SVX CONTROLLER DOES NOT USE DLC/DTC AND USES THESE AS COIL DRIVER OUTPUTS
 ELSE
	MOVLW 03		;BITS 0 & 1 AS INPUTS (DISABLE LEAD & TRAIL COIL FUNC) 
 ENDIF
	MOVWF TRISE,0
	BRA START.1
START.0
	CLRF WREG,0		;PORT E 2-7 OUTPUTS FOR DIAGNOSTIC PORT 
	MOVWF TRISE,0
START.1
	CLRF PORTF,0	;INIT PORT F  NOTE THAT ANALOG INPUTS MAY BE USED FOR DIGITAL OUTPUTS BUT BIT OPS MUST BE DONE ON LATCH REG
 IF ENG==0xAE		;PORT F BITS 2&3 USED FOR IGNITION DRIVERS ON SVX 6 CYL ENGINES (OLD BOARDS, PORTE 0&1 ON NEWBOARD)
	MOVLW 0xF3
 ELSE
	MOVLW 0xFF		; 0,1,4-7 ANALOG INPUTS 2&3 N/U
 ENDIF
	MOVWF TRISF,0	;INIT PORT F (NEW)  (ANALOG INPUTS)

	MOVLW 0x00		;INIT PORT G (WAS PORT E)
	MOVWF PORTG,0		
	MOVLW 0x3F		;0-5 mode INPUTS(PGM MODE SWITCHES) 4&5 not used but made inputs, MCLR is disabled on 5
	MOVWF TRISG,0
	
					;ADC INIT
	
	MOVLW 0x03		;12 ANALOG CHANNELS / AVdd/AVss inputs ANALOG REFS
	MOVWF ADCON1,0
	MOVLW 0x9E		;SETUP ACQUISITION TIME & CLOCK
	MOVWF ADCON2,0	
	BSF ADCON0,ADON,0	;TURN AD CONVERTER ON

	LFSR 2,0x100		;CLEAR USER VAR RAM and status bytes FROM 100 - 1FF HERE !!!!!!!!!!!!!!!!!!!
NORM.1
	CLRF POSTINC2,0
	CPFSEQ FSR2L,0
	BRA NORM.1			;LOOP UNTIL ALL RAM CLEARED
	
						;TIMER 3 INIT   (DWELL TIMER)
						
 IF ENG != 0xB3			;  ALL EXCEPT 540
	MOVLW 0x01		;SETUP CCP1 & TIMER 3 INT CLK, PRESCALE /8
	MOVWF CCPR1H,0	;SET 259 (252 * 1.03125 MHZ) TO GIVE 252 MS INTERVAL
	MOVLW 0x03
	MOVWF CCPR1L,0
	MOVLW 0xF0		;TIMER 3 16 BIT READ, CCP1&2 CL SOURCE, /8 PRESCALE, EXTERNAL CL FOR T3,TIMER OFF  
	MOVWF T3CON,0	;16BIT R/W,T3 CLK FOR CCP1&2,1:8 PRESCALE FOR TMR3
	MOVLW 0x0B		;SETUP CCP1 MODULE COMPARE MODE, TRIGGER SPECIAL EVENT, RESET TMR3 TO ZERO WHEN CNT = TO CCPR1H&L
	MOVWF CCP1CON,0
	BCF IPR1,CCP1IP,0		;SET CCP1 (DWELL) TO LOW PRI
	BSF PIE1,CCP1IE,0		;ENABLE CCP1/TIMER 3 (DWELL CTR) INTS
	BSF T3CON,TMR3ON,0	;TURN TIMER 3 ON  (DWELL CLOCK 252 US)
	
 ELSE
 				;0xB3  ENGINE   TMR1 USED FOR DWELL, (TMR3 USED FOR SPARK DELAY)
 				
 	MOVLW 0x01		;SETUP CCP1 & TIMER 1 INT CLK, PRESCALE /8
	MOVWF CCPR1H,0	;SET 259 (252 * 1.03125 MHZ) TO GIVE 252 MS INTERVAL
	MOVLW 0x03
	MOVWF CCPR1L,0
	MOVLW 0xBC		;TIMER 3 16 BIT READ, CCP1 -> TMR1 & CCP2 -> TMR3 CL SOURCE, /8 PRESCALE, EXTERNAL CL FOR T3,TMR3 OFF  
	MOVWF T3CON,0	;1:8 PRESCALE FOR TMR3  1.031250 MHZ
	MOVLW 0xB4		;SET UP TMR1 FO6 16 BIT RD, /8 CLOCK
	MOVWF T1CON,0
	MOVLW 0x0B		;SETUP CCP1 MODULE COMPARE MODE, TRIGGER SPECIAL EVENT, RESET TMR1 TO ZERO WHEN CNT = TO CCPR1H&L    
	MOVWF CCP1CON,0
	BCF IPR1,CCP1IP,0		;SET CCP1 (DWELL) TO LOW PRI
	BSF PIE1,CCP1IE,0		;ENABLE CCP1/TIMER 1 (DWELL CTR) INTS
	BSF T1CON,TMR1ON,0	;TURN TIMER 1 ON  (DWELL CLOCK 252 US)
 
 					;TIMER 3 INIT   (SPARK DELAY TMR ON 0xB3 ENGINE)
	
  	BSF IPR2,TMR3IP,0	;SET HI PRI
	;T3CON ALREADY SETUP IN TIMER 1 SETUP ROUTINE DUE TO INTERMIXED FUNCTION
 	BSF PIE2,TMR3IE,0	;ENABLE IGNITION TIME INTS.
 	MOVLW 0x00		;SETUP CCP1 MODULE (DISABLE)   
	MOVWF CCP2CON,0	;don't WANT ANY CCP MODE ASSOCIATED WITH TIMER 3
 ENDIF
							;TIMER 0 INIT
							
 IF (ENG==0xAF)||(ENG==0xB3)   ; FOR EAGLE 540 V8  (90 DEG INTERVAL FOR TP2 TRIGGERS) MIN RPM REQ IS 
	MOVLW 04					;PRESCALE OF 32 FOR 120 DEG TIME ON V6 (257.8125 KHZ)
 ELSE	
	MOVLW 02		;SET TIMER 0 INTERNAL CLK (OSC/4, /8 PRESCALE, 16 BIT, TIMER OFF    1.03125 MHZ FOR OTHERS
 ENDIF
	MOVWF T0CON,0
	BSF INTCON2,TMR0IP,0	;HI PRI FOR TMR0 
	
	BSF INTCON,PEIE,0		;ENABLE PERIPHERIAL INTERRUPTS
	BRA NORMAL		;NO EEPROM TIMEOUT SO GO DO NORMAL SETUP


;*************************************
; hwinit

	
	
;  bra normal	
;*************************	
	

INIT.ER				;IF EEPROM HAS A PROBLEM, KILL OPERATION OF CONTROLLER
	BTG FC4		;SIGNAL TO OUTSIDE WORLD THAT WE ARE HUNG
	MOVLW 0x40
	CALL DELAY
	CLRWDT
	BSF EEBF
	BRA INIT.ER

EEDLY
	SETF EETMR,1	;LONG DELAY
	BSF EEWF	; EEPROM WRITE wait FLAG (FOR A DELAY)
EEDLY.1 	
	BTFSC EEWF
	BRA EEDLY.1
	RETURN

EEINIT				;ONLY DONE ON FIRST POWER-UP
	
	CALL EEDLY			;LONG DELAY
	CALL INITENGCODE		;INIT ENGINE TYPE IN EEPROM & DO EEPROM VALIDITY TEST  

	CALL EEDLY			;LONG DELAY
	CALL INITENGINFO	;INIT ENGINE INFO BYTE IN RAM & EEPROM

	CALL EEDLY			;LONG DELAY
	CALL INITIPW		;INIT IPW PARAMETER IN EEPROM & DO VALIDATION TEST
	
	CALL EEDLY			;LONG DELAY
	CALL INITIPWMIN		;SETUP IPW THRESHOLD FOR INJECTORS
  
	CALL EEDLY			;LONG DELAY
	CALL INITBL

	CALL EEDLY			;LONG DELAY
	CALL INITDIF

	CALL EEDLY			;LONG DELAY
	CALL INITSECDIF

	CALL EEDLY			;LONG DELAY
	CALL INITSTG		;INIT INJECTOR STAGGING  XXXX

	CALL EEDLY			;LONG DELAY
	CALL INITADJ	;init ignition advance setting

	CALL EEDLY			;LONG DELAY
	CALL INITRPMTH		;init RPMTHRESH

	CALL EEDLY
	CALL INITIPWRNG		;INIT IPW OFFSET FROM MAPH&L FOR BASIC IPW (SETS DYNAMIC RANGE OF IPW VS MAP)
	
	CALL EEDLY			;LONG DELAY
	CALL INITBUSIN		;init BACKUP SENSOR INFO BIT
	
	CALL EEDLY
	CALL INITO2THRESH	;INIT THE O2 THRESHOLD VALUE

	BCF PGMF		;CLEAR PGM FLAG
	CALL EEDLY			;LONG DELAY
	RETURN

NORMAL
 	BCF IPR2,BCLIP,0
	BCF IPR2,EEIP,0		;LOW PRI FOR EEPROM/FLASH WRITE INTS
	BCF IPR2,BCLIP,0	;LOW PRI FOR BIT COLLISION 
	BSF PIE2,EEIE,0		;ENABLE EE WRITE COMPLETE INTS
	BSF EEWRC			;INITIALIZE EE WRITE COMPLETE
	BSF INTCON,GIE,0	;TIME TO ENABLE ALL SELECTED INTERRUPTS.	

	CALL EEDLY		;WAIT FOR THINGS TO STABALIZE (ADDED THIS WHEN I NOTICED THE ABOVE ERROR)
	MOVLW 01		;SEE IF EEPROM HAS EVER BEEN INITIALIZED	(FIRST ATTEMPT TO READ EEPROM)
	MOVWF WC,1		;SET WORD COUNT
	MOVLW ENGCODEADR		;POINT TO EEPROM INITIALIAZED FLAG (ENG) IN EEPROM
	MOVWF WSAL,1	;SET WORD START ADDRESS TO 10
	CLRF WSAH,1
	CLRF WRK,1		;USE WRK REG FOR TEST
	LFSR 1,WRK		;SET RAM STORAGE ADDRESS 
	CALL EERD		;GET IT FROM EEPROM 10 TO RAM WRK
	MOVLW ENG		;SEE IF FLAG WAS FOUND
	CPFSEQ WRK,1
	CALL EEINIT			;INITIALIZE EEPROM IF FLAG NOT FOUND

;				INITIALIAZE ENGINE SETUP DATA IN RAM
	MOVLW D'16'		;LD IPW CLOCK RATE, ROTOR IPW DIFS, IGNADJ, ETC FROM EE (6-12-02) (9 TO 10 10-11-05) (11 TO 16 ON 03-07-08)
	MOVWF WC,1		;SET WORD COUNT
	CLRF WSAL,1		;SET WORD START ADDRESS TO 0
	CLRF WSAH,1
	LFSR 1,R1DIF		;SET RAM START ADDRESS
	CALL EERD		;GET IT FROM EEPROM

	MOVLW 01	;SEE IF EEDATA IS GOOD BY CHECKING ENGINE TYPE (6-12-02)
	MOVWF WC,1		;SET WORD COUNT
	MOVLW ENGCODEADR		;INIT FLAG (ENGINE TYPE) ADR
	MOVWF WSAL,1		;SET WORD START ADDRESS TO INIT FLAG
	CLRF WSAH,1
	LFSR 1,ENGCODE		;SET RAM ADDRESS TO STORE IN  (IN ENGINE DATA FRAME)
	CLRF ENGCODE,1
	CALL EERD		;GET IT FROM EEPROM
	MOVLW ENG		;MAKE SURE WE GOT GOOD DATA FROM EEPROM  (note! it was previously tested OK in initengcode rout.)
	CPFSEQ ENGCODE,1	;
	BRA INIT.ER		;IF ERROR, EEPROM IS SUSPECT, GO SIT & SPIN
	
	MOVLW D'128'    ;INITIALIZE TRIM VARIABLE
	MOVWF TRIM,1
	CALL ANALOG		;NEEDED SO WE CAN GET STATUS OF ABSEL SW WHICH IS SENSED USING AN ANALOG CHANNEL INPUT 
	CALL PCK		;CK STATUS OF ALL USER INPUT SWITCHES
				;INIT CAF,ASF,OLF & PFUN & PGMF (WR SWITCH PUSHED)	
					;LOOK FOR POWER-UP PROGRAM FUNCTIONS
	BTFSS OLF		;TEST FOR ON LINE FLAG
	BRA INIT.1		;NOT ON LINE SO DONT DO PROGRAMING
	BTFSS PGMF	;TEST FOR PGMF (SET BY PCK)
	BRA INIT.1		;NOT PUSHED SO GO ON
	BCF PGMF		;KILL THE FLAG 
	BTFSC PGMWR		;REAL TIME TEST (WE WERE GETTING NOISE)
	BRA INIT.1		;MUST HAVE BEEN NOISE, SO GO ON
					;CKECK FOR PGM MODE
	MOVF MODESW,0	;GET PGM SWITCHES
	ANDLW 0x0F		;MASK OFF ALL BUT LWR 4 BITS
	XORLW 0x0F		;CHECK FOR ANY BITS SET
  IF EC3TB==0
	BTFSC STATUS,Z,0		;IF Z (NO PGM)  GO ON
	BRA INIT.1
  ENDIF
  IF EC3TB==1
    BNZ INIT.A0		;TEST FOR MODE ZERO
 	CALL INITADJ	;SET DEFAULT IGNITION TIMING
 	BRA INIT.1
  ENDIF
INIT.A0
	MOVWF PFUN,1		;SAVE THE PGM FUNC # BECAUSE A FUNCTION IS SELECTED
	MOVLW 01		;LOOK FOR TABLE INIT MODE
	CPFSEQ PFUN,1
	BRA INIT.A		;WAS NOT FUNC1 SO GO ON
 IF EC3TB==1
 	CALL INITIPWRNG	;MP SENSOR OFFSET ON EC4
 ELSE
	CALL INITBL		;GO INITIALIZE THE TABLE
 ENDIF
	BRA INIT.1

INIT.A				;IPWRNG & IPWMIN INIT FUNCS
	MOVLW 02		;LOOK FOR TABLE INIT MODE
	CPFSEQ PFUN,1	
	BRA INIT.0		;WAS NOT FUNC1 SO GO ON
	BTFSC CSON		;COLD SW ON = INITIPWMIN  OFF = INITIPWRNG
	BRA INIT.A1
 IF EC3TB==1
 	CALL INITBL		;MODE 2 = mct ADJUST ON EC4
 ELSE
	CALL INITIPWRNG		;GO INITIALIZE INJ DYNAMIC RANGE  MAP SENSOR OFFSET
 ENDIF
	BRA INIT.1
INIT.A1
 IF EC3TB==1
 	CALL INITSECDIF		;DO THIS ON EC4 VERSION   (WE DON'T NEED IPWMIN ON EC4)
 ELSE
	CALL INITIPWMIN
 ENDIF
	BRA INIT.1	
	
INIT.0
	MOVLW 03		;TEST FOR INIT IPW CLOCK TIMING MODE
	CPFSEQ PFUN,1
	BRA INIT.0A		;WAS NOT FUNC 3 SO GO ON WITH INIT ROUT.
	CALL INITIPW		;GO INIT IPW CLOCK RATE TO DEFAULT VALUE   (SAME ON EC4)
	BRA INIT.1
INIT.0A
	MOVLW 04		;TEST FOR ROTOR DIFFERENTIAL INIT FUNC.
	CPFSEQ PFUN,1
	BRA INIT.0E		;NOT INIT DIFFS SO GO ON W/ INIT ROUT.
	CALL INITDIF		;GO INITIALIZE ROTOR DIFFERENTIALS (ROTOR 1 OR 1 & 2 ON 3 ROTOR )
	BRA INIT.1	
INIT.0E				;SET/CLR O2SEN   (SELECT NARROW OR WIDEBAND SENSOR IN USE.) 	
	MOVLW 05		;TEST FOR SET/CLR O2SEN BIT IN ENGINFO (CLD SW)
	CPFSEQ PFUN,1
	BRA INIT.0B		;NOT INIT O2SEN SO GO ON W/ INIT ROUT.
	CALL SETO2SEN		;GO SET / CLR O2SEN
	BRA INIT.1
INIT.0B	
	MOVLW 06		;TEST FOR INITSECDIF INIT FUNC. OR SET/CLR LGSEC BIT IN ENGINFO (CLD SW)
	CPFSEQ PFUN,1
	BRA INIT.0B1		;NOT INIT INITSECDIF SO GO ON W/ INIT ROUT.
	CALL INITSECDIF		;GO INITIALIZE SECONDARY INJECTOR DIFFERENTIAL
	BRA INIT.1
INIT.0B1
	MOVLW 07		;TEST FOR STAGING INIT FUNC
	CPFSEQ PFUN,1
	BRA INIT.0C		;NOT INIT staging SO GO ON W/ INIT ROUT.
	CALL INITSTG		;GO INITIALIZE
	BRA INIT.1
INIT.0C
	MOVLW 08		;TEST FOR IGNITION TIMING INIT FUNC (SET TO 0) OR SET DWELL TO RX-8 OR LS1 ON A1 & A8 ENGINES W/ COLD START ON
	CPFSEQ PFUN,1		; XXXX
	BRA INIT.1		;NOT INIT TIMING ADJ SO GO ON W/ INIT ROUT.  XXXX
	CALL INITADJ		;GO INITIALIZE TIMING ADJUSTMENT XXXX

INIT.1
	MOVFF IPWCR,PR2	;MOVE IWP CLOCK RATE TO TIMER 2 PERIOD REG 
	MOVLW D'128'		;LOAD MAP TABLE FROM EEPROM
	MOVWF WC,1		;SET WORD COUNT
	MOVLW EEMTAB	;SET EEPROM START ADDRESS
	MOVWF WSAL,1
	CLRF WSAH,1
	LFSR 1,MTAB		;set ram start address WHERE TO PUT EEPROM DATA
	CALL EERD		;GET IT FROM EEPROM
	
;					serial init	
	
INIT.3B	
	MOVLW D'26'		;  26 = 19200 (19,097.2 ACTUAL)
	MOVWF SPBRG,0
	BCF TXSTA,SYNC,0		;SET ASYNC MODE
	BSF RCSTA,SPEN,0		;ENABLE SERIAL PORT I/O PINS  
	BSF TXSTA,TXEN,0		;ENABLE XMITR

	BSF RCSTA,CREN,0	;ENABLE RECIEVE  (A & B CONTROLLERS) 
	BCF IPR1,RCIP,0		;LOW PRI INT
	BCF IPR1,TXIP,0		;LOW PRI
	BSF PIE1,RCIE,0		;ENABLE RCVR INT   

	MOVLW D'1'		;INIT WRWIT VAR  (changed from 3 to 1  3-17-03)
	MOVWF WRWIT,1		;THIS IS DEFAULT VALUE 1
	
;*********************	
;old ser init from EC3

;**********************

	MOVLW D'1'		;INIT WRWIT VAR  (changed from 3 to 1  3-17-03)
	MOVWF WRWIT,1		;THIS IS DEFAULT VALUE 1
 
					;INT0 INIT, INT1 INIT    FALLING EDGE FOR T1 & T2 INTS
					
 IF (ENG==0xB3  && TBINJ==0)
 	BTFSS CAF				;ARE WE A?
 	BRA INITEDGE.A
 	BSF INTCON2,INTEDG0,0		;POS EDGE ON A 
 	BCF INTCON2,INTEDG1,0		;NEG FOR TP1 
 	BRA INITEDGE.X
INITEDGE.A					;CONTROLLER B INT EDGE SETUP  (controller B is ~ 6 degrees advanced compared to A)				
 	BCF INTCON2,INTEDG0,0		;NEG EDGE ON B				(and CAS & CAM triggers are inverted.
 	BSF INTCON2,INTEDG1,0		;POS edge on B
 	BRA INITEDGE.X
 ELSE
	BCF INTCON2,INTEDG0,0		;MAKE ALL OF THEM FALLING EDGE TRIGGERED (TP1 INPUT)
  IF (ENG==0xAC)
	BSF INTCON2,INTEDG1,0		;POSITIVE EDGE ON EJ25 CAM SENSOR ONLY (TP2 INPUT)
  ELSE 
	BCF INTCON2,INTEDG1,0		;MAKE ALL OTHERS FALLING EDGE TRIGGERED
  ENDIF
 ENDIF
INITEDGE.X
					;TIMER 2 INIT

	BSF INTCON3,INT1IP,0		;T2 INPUT HI PRI. (INT0 IS ALWAYS HI PRI)
	BSF IPR1,TMR2IP,0		;HI PRI FOR TIMER 2  03-08-07
 IF CONT==0
	MOVLW 0x00				;SET OUTPUT SCALE /1
 ELSE
 	MOVLW 0x08				;SLOWER INT INTERVAL FOR SLOW TURNING CONT OR LYC ENGINES
 ENDIF 
	MOVWF T2CON,0
	BSF INTCON,TMR0IE,0		;ENABLE TIMER 0 INTS
	BSF PIE1,TMR2IE,0		;ENABLE TIMER 2 (IPW COUNTER) INTS
	BSF T2CON,TMR2ON,0		;TURN ON TIMER 2  (IPWC TIMER)	;TURN TIMER 2 ON
	BSF PIE2,EEIE,0			;ENABLE EE INTERRUPTS
	
	BCF PGMF		;CLEAR THE FLAG
	CALL PCK		;GET SWITCH DATA
	BTFSS CAF		;ARE WE A?
	BRA EXEC		;NO UPLOAD EE ON B SO GO ON
 	
	BTFSS OLF		;TEST FOR ON LINE FLAG  , LOOK FOR UPLOAD EE CMD (A ONLY)
	BRA EXEC		;NOT ON LINE SO DONT DO PROGRAMING
	BTFSS PGMF		;TEST FOR PGMF (SET BY PCK)
	BRA EXEC		;NOT PUSHED SO GO ON
	BCF PGMF		;KILL THE FLAG 
	BTFSC PGMWR		;REAL TIME TEST ( WERE WE GETTING NOISE?) PGM SW
	BRA EXEC		;MUST HAVE BEEN NOISE, SO GO ON
	MOVF MODESW,0	;GET PGM MODE SWITCHES

	ANDLW 0x0F		;MASK OFF ALL BUT LWR 4 BITS
	XORLW 0x0F		;CHECK FOR ANY BITS SET
	BTFSC STATUS,Z,0		;IF Z (NO PGM)  GO ON
	BRA EXEC
	MOVWF PFUN,1		;SAVE THE PGM FUNC # BECAUSE A FUNCTION IS SELECTED
	MOVLW D'9'			;IS THIS PWR UP PGM FUNCTION 9?  (copy all programming from A to B)
	CPFSEQ PFUN,1
	BRA EXEC		;GO ON IF NOT
	CALL ULEE		;CALL THE UPLOAD EE CMD

;***** EXEC*	MAIN PROGRAM *****

EXEC	
	CALL EXECROUT
	BRA EXEC
	
EXECROUT
	BTFSS VT		;TEST FOR VALID RPM (T0 OVF & DTCL TIME OUT CLEARS VRPM)
	CALL EXEC.1		;VT NOT set so TRY STARTING	& OTHER OFF-LINE FUNCTION
	BTFSC MF		;CALL MATH IF MF SET
 IF (ENG==0xA7 && A72007==0)
	CALL PCK
 ELSE
	CALL MATH		;DO MATH IF MF SET (MATH WILL CLEAR FLAG)
 ENDIF
	BTFSC ANF		;GO GET ANALOG DATA & DO IPW CALC IF A T2START EVENT TRIGGERS THIS FLAG SET
	CALL ANALOG		;ANF IS SET AT T2.STR TIME 
		;NEW PRIME CODE
	BTFSC EEWF		;DONT DO ANY PGM FUNC WHILE EE BUSY
	BRA EXECR.A
	BTFSS VT		;DONT HANDLE NORMAL EC2 PGM FUNCS IF NOT RUNNING  PRIME
	BRA EXECR.B		;PRIME
	
EXECR.CL    ;*********************   NEW -8 VERSION
	BTFSS OLF			;ARE WE ON LINE?
	BRA EXECR.CLX		;EXIT IF NOT
	BTFSS CSON			;CLOSED LOOP ENABLED?
	BRA EXECR.CLX		;NOT CL SO SKIP	
	BTFSS CLUF			;IS UPDATE FLAG SET?  cluf is set at constant intervals by DWell rout, 30ms in mode 1, 40 ms in Mode 3
	BRA EXECR.CLX		;EXIT IF NOT
	CALL TRIM.CL		;DO IT IF SET   (TRIM.CL MAY SET TWF IF MODE 1 OR 3
	BTFSC EEWF			;IS EE BUSY?
	BRA EXECR.CLX		;DON'T TRY UPDATE TABLE DURING BUSY					
	BTFSS TWF		;TEST FOR TABLE WRITE FLAG  
	BRA EXECR.CLX		;NOT SET SO EXIT
	BCF TWF
	BTFSS TRIM,7,1		;IS TRIM RICH OR LEAN?
	BRA EXECR.CL1		;GO LEAN TABLE IF LEAN TRIM VALUE
;RICH					;INCREMENT MAP TABLE ENTRY BY 1
	BCF MPSF			;CLEAR SO WE DON'T UPDATE TABLE TOO OFTEN
	BTFSC O2F			;TEST FOR MIXTURE LEAN (OF O2THRESH)
	BRA EXECR.CLX		;SKIP TABLE ADJUST IF MIX IS ALREADY RICH  (TRIM MAY BE TOO DELAYED)
	LFSR 2,MTAB			;MOVE TABLE POINTER + RAM PAGE TO POINTER REG
	MOVFF TPTR,FSR2L	;TPTR TO LSB
	MOVFF INDF2,AARGL	;GET CURRENT TABLE ENTRY
	MOVLW D'3'
	ADDWF AARGL,1,1		;ADD ADJUSTMENT TO TABLE VALUE
	BTFSC _C		;HAVE CY? (OVF?)
	BRA EXECR.CL2		;HANDLE OVERFLOW, SET MAX	
	CALL WRTBL.0		;GO COMPLETE OPERATION IF NOT
	BRA EXECR.CLX		;DONE
EXECR.CL2	
	SETF AARGL,1		;SET MAX IF OVF MSB ZERO?
	CALL WRTBL.0	 	;COMPLETE THE WRITE OPERATION ON UPDATED VALUE
	BRA EXECR.CLX
;LEAN
EXECR.CL1				;;LEAN
	BCF MPSF			;CLEAR SO WE DON'T UPDATE TABLE TOO OFTEN
	BTFSS O2F			;TEST FOR MIXTURE RICH   (DAMN, THIS WAS BTFSC IN THIS VER)
	BRA EXECR.CLX		;SKIP TABLE ADJUST IF MIX IS ALREADY LEAN  (TRIM MAY BE TOO DELAYED)
	LFSR 2,MTAB			;MOVE TABLE POINTER + RAM PAGE TO POINTER REG
	MOVFF TPTR,FSR2L	;TPTR TO LSB
	MOVFF INDF2,AARGL	;GET CURRENT TABLE ENTRY
	MOVLW D'3'
	SUBWF AARGL,1,1		;SUB ADJUSTMENT TO TABLE VALUE
	BTFSS _C		;HAVE CY? (OVF?)
	BRA EXECR.CL3		;HANDLE OVERFLOW, SET MAX	
	CALL WRTBL.0		;GO COMPLETE OPERATION IF NOT
	BRA EXECR.CLX		;DONE
EXECR.CL3	
	CLRF AARGL,1		;SET MIN IF OVF MSB ZERO?
	CALL WRTBL.0	 	;COMPLETE THE WRITE OPERATION ON UPDATED VALUE
;	BRA EXECR.CLX
EXECR.CLX	
	
;*********  END OF NEW-8 VER OF EXECR.CL

	BTFSS PGMF		;ENG RUNNING, TEST FOR PROGRAM FLAG SET
	BRA EXECR.B
	CALL PGMR		;GO DO IT IF FLAG SET	
EXECR.B				;PRIME
	BTFSC CMDEXF		;CK CMD EXECUTE FLAG (SET BY COMMAND RECEIVED ON SER INPUT)
	CALL SEXEC
EXECR.A
 IF ENG == 0xA2
	BTFSC CS1SF		;CK FO SELECT TRAIL COIL SET
	CALL CS1.SET
	BTFSC CS1CF		;CK CS1 SELECT CLEAR FLAG
	CALL CS1.CLR		;GO CLEAR CS1 BIT
 ENDIF
	BTFSC SERF
	CALL SERX		;CALL SERIAL OUTPUT EXEC IF FLAG SET
	RETURN			;MADE EXEC A CALLABLE ROUTINE  2-13-05 
			; DO WHEN VT IS GONE
EXEC.1
	CLRWDT			;CLEAR WDT WHILE WAITING FOR START  (VT NOT SET)
	BTFSS STRF		;skip KO if START flag already set (by KO)
	CALL KO			;go do start routine, SETUP INTERRUPTS, ETC
	BTFSC EEWF			;RET IF ee operation BUSY  PRIME ****
	RETURN
	BTFSS INTCON,GIE,0	;MAKE SURE INTS ARE ENABLED
	BSF INTCON,GIE,0	;ENABLE THEM IF NOT
	BTFSC PGMF			;PRIME  TEST FOR PGM  (PCK SETS THIS)
	CALL PRIME			; CK FOR PRIME FUNC PRIME
	RETURN


TRIM.CL   ;******************  ;NEW -8 VERSION  CLUF IS SET  INC OR DEC TRIM & TEST FOR <> TRHESHOLDS, SET TWF IS SO.
	BCF CLUF			;CLEAR THE FLAG
	MOVLW D'1'			;mode 1 or 3?  (cl modes)?
	CPFSEQ PFUN,1
	BRA TRIM.CL5		;TEST FOR 3
	BRA TRIM.CL4			;GO DO CL
TRIM.CL5			
    MOVLW D'3'			;MODE 3?
    CPFSEQ PFUN,1
    BRA TRIM.CLX		;NOT A CL MODE SO EXIT
TRIM.CL4				;MODE 1 OR 3 GETS US HERE
	MOVF O2THRESH,0,1		;LOAD O2 SENSOR THRESHOLD , NOW PROGRAMMABLE IN MODE 0, CS OFF
	BTFSS O2SEN
	BRA TRIM.CL11
	CPFSGT O2L,1		;IF O2L > THRESH IT MEANS WE ARE LEAN  (WIDEBAND IN USE)
	BRA TRIM.CL6		;We were rich, SO GO REDUCE TRIM    
	BRA TRIM.CL12 		;WE WERE LEAN, SO INC TRIM 
	
TRIM.CL11
	CPFSLT O2L,1		;COMPARE  F/A WITH THRESH
	BRA TRIM.CL6		;O2L WAS RICHER THAN THRESH SO GO REDUCE TRIM
	
TRIM.CL12			
	BCF O2F				;O2L WAS LEANER SO O2F = 0
	BTFSS O2OLD			;OLD O2 ALSO 0?
	BRA TRIM.CL7		;YES, SO JUST INC TRIM
	BSF O2D				;SET O2 DELTA FLAG
	BCF O2OLD			;CLEAR O2 OLD FLAG
TRIM.CL7
	INCF TRIM,1,1
	BTFSC _C		;TEST FOR OVF
	SETF TRIM,1		;TRIM ROLLED OVER TO ZERO SO SET TO FF
	BRA TRIM.CL8	;GO COMPARE TRIM TO MODE3 THRESHOLD
	
TRIM.CL6				;02L WAS RICH SO DEC TRIM
	BSF O2F				;02L WAS RICH SO O2F = 1
	BTFSC O2OLD			;OLD O2 ALSO 1?
	BRA TRIM.CL9		;YES, SO JUST DEC TRIM
	BSF O2D				;WAS CHANGED SO SET O2 DELTA FLAG
	BSF O2OLD			;SET O2 OLD FLAG TOO
TRIM.CL9
	DECF TRIM,1,1
	BTFSS _C			;TEST FOR OVF
	CLRF TRIM,1			;ROLLED OVER SO SET TO 0 
TRIM.CL8
	MOVLW D'192'		; (TBD)  ;ABOUT 50%?,  DEPENDS ON TRIM RANGE.
	CPFSGT TRIM,1
	BRA TRIM.CL10			;NOT HI, GO TEST FOR LOW
	MOVLW D'3'
	CPFSEQ PFUN,1
	BRA TRIM.CLX		;exit if not mode 3
	BTFSC MPSF			;dAMN!  ALSO MISSING!
	BSF TWF					;SET TRIM WRITE FLAG FOR EXEC
	BRA TRIM.CLX			;GO ON
TRIM.CL10
	MOVLW D'64'			;(TBD)
	CPFSLT TRIM,1
	RETURN			;NOT TOO LOW SO GO ON
	MOVLW D'3'				;TEST FOR MODE 3
	CPFSEQ PFUN,1
	RETURN
	BTFSS MPSF				;WAS MISSING THIS VER
	RETURN
	BSF TWF
TRIM.CLX					;READY FOR EXEC TO ACT ON TWF IF SET
	RETURN

;********* END OF NEW -8 VER

	;  *********************************************    ADDED FOR CLVER
	
PRIME				;HANDLE ON & OFF RIGHT HERE IN REAL TIME
	BTFSS WRFLAG	;DO PGM IF WRFLAG (EXECUTE FLAG) NOT SET YET
	BRA PRIME.1		;FLAG CLEAR SO GO CK FOR SW STILL DN
					;FLAG SET (DONE) SO CK FOR SW UP
	BTFSC WRSF		;WAS WR SW UP AWHILE AGO? DE-BOUNCE
	RETURN			;NO, SW WAS DOWN SO DON'T CLEAR FLAG YET
	BTFSS PGMWR		;JUST RETURN IF SW STILL DOWN
	RETURN
	BCF PGMF		;CLR THIS IF SET
	RETURN			;
PRIME.1
	BSF WRFLAG	;NOT ACTED ON YET SO SET EXECUTE FLAG & DO FUNC.
				;FLAG NOT SET SO GO ON IF SW STILL DN
	BTFSC PGMWR	;MAKE SURE PGMF WAS NOT SET BY NOISE (SW STILL DN?)
	RETURN		;NO, SO RETURN
	MOVF PFUN,1,1		;TEST FUNCTION FOR ZERO
	BNZ DIAG.A		;CK FOR OTHER DIAGNOSTIC MODES IF NOT ZERO

  IF ENG==0xA3||(ENG==0xB0)
    MOVLW D'250'		;LONG SQUIRT ON PRIMARIES ONLY FOR 3 ROTOR
  ELSE
	MOVLW D'100'		;IT WAS 0 (PRIME) SO SETUP FOR 20 MS  increased from 10 to 20 ms on 12-06-05 upped to 40ms 08-04-07
  ENDIF
	MOVWF EETMR,1
	BSF EEWF
 IF ENG==0xA3||(ENG==0xB0)     ;changed 20B stagging logic to staging relay activated for enabling secondaries. 10-28-06
	MOVLW 0x70		;DON'T SET STAGE BIT ON 20B  (NO CLICK OF SECONDARY RELAY)
 ELSE
	MOVLW 0xF0		;START SQUIRT
 ENDIF
	MOVWF PORTD,0	;
PRIME.A
	BTFSC EEWF
	BRA PRIME.A		;WAIT HERE UNTIL EEWF IS CLEARED BY -
PRIMEOFF
	CLRF PORTD,0
	BCF PGMF
	RETURN
	
DIAG.A
	CLRWDT			;DON'T INTERRUPT THIS
	MOVLW 0x08		;TEST FOR SPARK TEST (FIRE ALL COILS)
	CPFSEQ PFUN,1 
	BRA DIAG.B		;NOT SPARK TEST SO TEST FOR INJ TEST
	BCF FI1
	BCF FI2
	BCF FI3
	BCF FI4
	MOVLW D'45'		;IT WAS 8 (SPARK) SO SETUP FOR 10 MS 
	MOVWF EETMR,1
	BSF EEWF
SPARK.A
	BTFSC EEWF
	BRA SPARK.A
	BSF FC1			;CHARGE COIL 1 & 2
	BSF FC2
	MOVLW D'15'		;SETUP FOR 5 MS 
	MOVWF EETMR,1
	BSF EEWF
SPARK.B
	BTFSC EEWF
	BRA SPARK.B
  IF ENG==0xA2 && TGCOIL == 0
	BCF FC1
	BCF FC2
	MOVLW D'100'
	CALL DELAY
	BTG FC3			;ON 2ND GEN MAZDA COILS TOGGLE COIL SELECT PIN
	MOVLW D'15'		;SETUP FOR 5 MS 
	MOVWF EETMR,1
	BSF EEWF
SPARK.C
	BTFSC EEWF
	BRA SPARK.C
  ELSE
	BSF FC3			;SPARK 1&2 & CHARGE 3&4
	BSF FC4
	BCF FC1
	BCF FC2
	MOVLW D'15'		;SETUP FOR 3.75 MS 
	MOVWF EETMR,1
	BSF EEWF
SPARK.C
	BTFSC EEWF
	BRA SPARK.C
	BCF FC3		;SPARK 3&4
	BCF FC4
  ENDIF
  IF ENG==0xAE		;ONLY ON SVX CONTROLLERS
	BSF FC5			;CHARGE COILS 5&6
	BSF FC6
	MOVLW D'20'		;SETUP FOR 6.3 MS 
	MOVWF EETMR,1
	BSF EEWF
SPARK.D
	BTFSC EEWF
	BRA SPARK.D
	BCF FC5			;SPARK 5&6
	BCF FC6
  ENDIF
	BRA DIAG.A		;REPEAT UNTIL MODE IS CHANGED

DIAG.B				;TEST FOR INJECTOR TEST
	MOVLW 0x01		;TEST FOR INJECTOR TEST
	CPFSEQ PFUN,1 
	BRA DIAG.B1		;NOT ANY DIAGNOSTIC TEST SO EXIT
	BTFSS CSON		;TEST FOR COLD START SWITCH (SAFTY TO AVOID ACCEDENTAL FLOODING)
	BRA DIAG.B1		;EXIT IF CLD START SW NOT ON
	MOVLW D'40'		;IT WAS 1 (INJECTOR TEST) SO SETUP FOR 10 MS 
	MOVWF EETMR,1
	BSF EEWF
INJECTOR.A
	BTFSC EEWF
	BRA INJECTOR.A
 IF (ENG==0xA3)||(ENG==0xB0)
	MOVLW 0xB0		;ACTIVATE SECONDARY RELAY ON 20B & 1&2
 ELSE
	MOVLW 0x30		;CHARGE INJ 1 & 2
 ENDIF
	MOVWF PORTD,0
	MOVLW D'30'		;SETUP FOR 7.5 MS 
	MOVWF EETMR,1
	BSF EEWF
INJECTOR.B
	BTFSC EEWF
	BRA INJECTOR.B
	MOVLW 0xC0		;KEEPS SECONDARY RELAY ENERGIZED ON 20B		
	MOVWF PORTD,0	;START SQUIRT
	MOVLW D'30'		;SETUP FOR 7.5 MS 
	MOVWF EETMR,1
	BSF EEWF
INJECTOR.C
	BTFSC EEWF
	BRA INJECTOR.C
 IF (ENG==0xA3)||(ENG==0xB0)
	MOVLW 0x80	;LEAVE STAGGING RELAY ON FOR 20b  (WAS 0x08 ERROR!!!  CORRECTED 05-12-07
 ELSE
	MOVLW 0x00		;CLOSE 3&4
 ENDIF
	MOVWF PORTD,0
	BRA DIAG.A		;REPEAT UNTIL MODE IS CHANGED OR POWER IS OFF.
DIAG.B1
	CLRF PORTD,0	;STOP ALL
	RETURN
	
KO
 IF ENG==0xB4		;HONDA V6				INT0 IA A CONTROLLER, INT1 IS B
	bcf T0CON,TMR0ON,0		;select external to stop t0
	CLRF STAT0,1		;clear ALL ENGINE RUN FLAGS
	CLRF SEQFLAG,1
	clrf TMR0H,0
	clrf TMR0L,0		;set timer 0 to 0
	bcf INTCON,INT0IF,0		;CLEAR T1 INT FLAG
	BCF INTCON3,INT1IF,0	;CLR THE T2 INT FLAG
	BTFSC CAF		;ARE WE CONTROLLER A?
	BRA KO.1
	bsf INTCON3,INT1IE,0	;enable t2 ints IF WE ARE B
	BCF INTCON,INT0IE,0		;DISABLE T1 INT IF WE ARE B
	BRA KO.2		;GO ON 
KO.1	
	BSF INTCON,INT0IE,0		;CONTROLLER A - ENABLE T1 INTS ON T1 INPUT FOR A CONTROLLER, WE ARE A  
	BCF INTCON3,INT1IE,0	;DISABLE T2 INPUT ON A CONTROLLER
KO.2  
	CLRF T2CNT,1		;INITIALIAZE T2 COUNT
	BSF STRF			;set START flag (TELLS EXEC THAT KO WAS CALLED ALREADY
	BSF LSF			;SET DWELL TIME FLAG FOR SLOW DWELL
	BSF DSF			;SET DWELL SPEED FLAG FOR SLOW DWELL
	RETURN			;ret to exec w/ STRF set T1 OR t2 ints enabled (DEPENDS IF WE ARE A OR B)
 ENDIF				;HONDA V6
 
 IF (ENG<0xA6)||(ENG==0xA8)||(ENG==0xA9)||(ENG==0xAA)||(ENG==0xAC)||(ENG==0xAD)||(ENG==0xAE)||(ENG==0xAF)||(ENG==0xB0)||(ENG==0xB1)||(ENG==0xB5)||(ENG==0xB2)
	BCF T0CON,TMR0ON,0		;STOP TMR0
	CLRF STAT0,1		;CLEAR ALL RUN FLAGS
	CLRF SEQFLAG,1
	CLRF TMR0H,0
	CLRF TMR0L,0		;set timer 0 to 0
	SETF TOLDL,1
	SETF TOLDH,1
	BCF INTCON,INT0IF,0		;CLEAR T1 & T2 INT FLAG
	BCF INTCON3,INT1IF,0
  IF (ENG==0xA8)||(ENG==0xB0)||(ENG==0xA9)||(ENG==0xAA)||(ENG==0xB5)||(ENG==0xAD)||(ENG==0xAE)||(ENG==0xB2)||(ENG==0xB1)||(ENG==0xAB)   ;ENGINES THAT MAY HAVE BU SENSORS
		BTFSC BUSIN		;(WAS)	IF BUSENSOR==0	\
		BRA KO.D		;WAS SET SO HANDLE AS BUSENSOR TYPE 
		BCF INTCON3,INT1IE,0		;DON'T ENABLE T2 UNLESS BACKUP SENSOR USED  (T1 USED ON A) T0CK INTS NOT USED ON 0xA9 ENG)
		BSF INTCON,INT0IE,0			;BUT DO ENABLE TP1 INTS  (THIS IS TP2 ON 0xA9 ENG.  WHAT THE HELL DOES THIS MEAN?????)
		BRA KO.B					;FINISH UP 
KO.D					;(WAS)	ELSE						;ENGINE EQUIPPED W/ BACKUP SENSOR
		BTFSS CAF			;ARE WE A?
		BRA KO.0			;GO HANDLE B SETUP
		BSF INTCON,INT0IE,0	;SETUP FOR A					
		BCF INTCON3,INT1IE,0	;IGNORE BACKUP SENSOR ON A     
		BRA KO.B			;GO ON
KO.0
		BCF INTCON,INT0IE,0	;SETUP FOR B ON ENG W/ BU SENSOR					
		BSF INTCON3,INT1IE,0	;USE BACKUP SENSOR ON B
;		BRA KO.B			;GO ON		
KO.B
	CLRF T2CNT,1		;INITIALIAZE T2 COUNT  
	BSF STRF			;set START flag (TELLS EXEC THAT KO WAS CALLED ALREADY
	BSF LSF			;SET DWELL TIME FLAG FOR SLOW DWELL
	BSF DSF			;SET DWELL SPEED FLAG FOR SLOW DWELL
	CLRF TPL,1		;SET TO ZERO FOR ENGINE STOPPED CONDITION
	CLRF TPH,1
	RETURN			;ret to exec w/ STRF set T1 &/or t2 ints enabled
;					(WAS) 	ENDIF
  ENDIF
  IF (ENG==0xAF)&&(BUSENSOR==1)			;
	BTFSS CAF			;ARE WE A?
	BRA KO.A			;NO OS GO HANDLE
	BSF INTCON,INT0IE,0		;ENABLE INT0  (TP1 INPUT)  USED FOR A CONTROLLER
	BCF INTCON3,INT1IE,0	;DISABLE INT1 (TP2 INPUT) 		
	BRA KO.B				;GO ON
KO.A		
	BCF INTCON,INT0IE,0		;DISABLE INT0  (T1 INPUT)  USED FOR A CONTROLLER
	BSF INTCON3,INT1IE,0	;ENABLE INT1 (T2 INPUT) 	USED FOR B CONTROLLER
	BRA KO.B
  ENDIF
  
  IF (ENG==0xBA)
	BSF INTCON3,INT1IE,0	;enable t2 ints   (CRANK ON 0xAA)
	BSF INTCON,INT0IE,0		;MAKE SURE TP1S ENABLED ON OTHERS  (CAM ON 0xAA) (CRANK ON A72007 ENGINES)
;	BRA KO.B	
KO.B
	CLRF T2CNT,1		;INITIALIAZE T2 COUNT  
	BSF STRF			;set START flag (TELLS EXEC THAT KO WAS CALLED ALREADY
	BSF LSF			;SET DWELL TIME FLAG FOR SLOW DWELL
	BSF DSF			;SET DWELL SPEED FLAG FOR SLOW DWELL
	CLRF TPL,1		;SET TO ZERO FOR ENGINE STOPPED CONDITION
	CLRF TPH,1
	RETURN			;ret to exec w/ STRF set T1 &/or t2 ints enabled
  ENDIF
 ENDIF

 IF (ENG<0xA4)||(ENG==0xA5)	;2ND GEN MAZDA ROTARY TYPES,HEXADYNE, (NO BACKUP SENSOR USED, BOTH SENSOR INPUTS USED ON BOTH CONTROLLERS)
;KO  						;B3 HAS BU SENSOR BUT HANDLED EXTERNALLY VIA RELAY OR SWITCH
	CLRF T2CNT,1		;INITIALIAZE T2 COUNT  
	BSF STRF			;set START flag (TELLS EXEC THAT KO WAS CALLED ALREADY
	BSF LSF			;SET DWELL TIME FLAG FOR SLOW DWELL
	BSF DSF			;SET DWELL SPEED FLAG FOR SLOW DWELL
	CLRF TPL,1		;SET TO ZERO FOR ENGINE STOPPED CONDITION
	CLRF TPH,1		
	BSF INTCON,INT0IE,0		;ENABLE INT0  (TP1 INPUT) (TP2 ON HEXADYNE)   
	BSF INTCON3,INT1IE,0	;ENABLE INT1  (TP2 INPUT)  (tp1 ON HEXADYNE)   
	RETURN 		;ret to exec w/ STRF set T1 &/or t2 ints enabled
 ENDIF			;END OF  2 SENSOR TYPES

 IF (ENG==0xB3)	;
;KO  						;B3 HAS BU SENSOR BUT HANDLED EXTERNALLY VIA RELAY OR SWITCH
	CLRF T2CNT,1		;INITIALIAZE T2 COUNT  
	BSF STRF			;set START flag (TELLS EXEC THAT KO WAS CALLED ALREADY
	BSF LSF			;SET DWELL TIME FLAG FOR SLOW DWELL
	BSF DSF			;SET DWELL SPEED FLAG FOR SLOW DWELL
	CLRF TPL,1		;SET TO ZERO FOR ENGINE STOPPED CONDITION
	CLRF TPH,1		
	BSF INTCON,INT0IE,0		;ENABLE INT0  (TP1 INPUT) (TP2 ON HEXADYNE)   
  IF (ENG==0xB3 && TBINJ==0)
	BSF INTCON3,INT1IE,0	;ENABLE INT1  (TP2 INPUT)  (tp1 ON HEXADYNE)   
  ELSE
   	BCF INTCON3,INT1IE,0	;B3 WITH TBINJ HAS NO CAM SENSOR
  ENDIF
	RETURN 		;ret to exec w/ STRF set T1 &/or t2 ints enabled
 ENDIF			;END OF  2 SENSOR TYPES

 IF ENG==0xA7
;KO
	BCF T0CON,TMR0ON,0		;STOP TMR0
	CLRF STAT0,1		;CLEAR ALL RUN FLAGS
	CLRF SEQFLAG,1
	CLRF TMR0H,0
	CLRF TMR0L,0		;set timer 0 to 0
	SETF TOLDL,1
	SETF TOLDH,1
	BCF INTCON,INT0IF,0		;CLEAR T1 & T2 INT FLAG
	BCF INTCON3,INT1IF,0
	CLRF T2CNT,1		;INITIALIAZE T2 COUNT
	BSF STRF			;set START flag (TELLS EXEC THAT KO WAS CALLED ALREADY
	BSF LSF			;SET DWELL TIME FLAG FOR SLOW DWELL
	BSF DSF			;SET DWELL SPEED FLAG FOR SLOW DWELL
	CLRF TPL,1		;SET TO ZERO FOR ENGINE STOPPED CONDITION
	CLRF TPH,1
	BSF INTCON3,INT1IE,0	;enable t2 ints   (CAM    WAS CRANK ON A7
	BSF INTCON,INT0IE,0		;MAKE SURE TP1S ENABLED ON OTHERS  (CRANK ON A72007 ENGINES)
	RETURN			;ret to exec w/ STRF set T1 &/or t2 ints enabled
 ENDIF


;KO   for other engines
 IF (ENG==0xA4)||(ENG==0xA6)		;POWERSPORT, GEO, A9, & other engines w/ BU sensors
	bcf T0CON,TMR0ON,0		;select external to stop t0
	CLRF STAT0,1		;clear ALL ENGINE RUN FLAGS
	CLRF SEQFLAG,1
	clrf TMR0H,0
	clrf TMR0L,0		;set timer 0 to 0
	bcf INTCON,INT0IF,0		;CLEAR T1 INT FLAG		;PS VERSION CHANGES
	BCF INTCON3,INT1IF,0	;CLR THE T2 INT FLAG
	BTFSC CAF		;ARE WE CONTROLLER A?
	BRA KO.1
	bsf INTCON3,INT1IE,0	;enable t2 ints IF WE ARE B
	BCF INTCON,INT0IE,0		;DISABLE T1 INT IF WE ARE B
	BRA KO.2		;GO ON 
KO.1	
	BSF INTCON,INT0IE,0		;ENABLE T1 INTS ON T1 INPUT FOR A CONTROLLER, WE ARE A  
	BCF INTCON3,INT1IE,0	;DISABLE T2 INPUT ON A CONTROLLER
KO.2				;PS VERSION CHANGES  
	CLRF T2CNT,1		;INITIALIAZE T2 COUNT
	bsf STRF			;set START flag (TELLS EXEC THAT KO WAS CALLED ALREADY
	BSF LSF			;SET DWELL TIME FLAG FOR SLOW DWELL
	BSF DSF			;SET DWELL TIME FLAG FOR SLOW DWELL
	RETURN			;ret to exec w/ STRF set T1 OR t2 ints enabled (DEPENDS IF WE ARE A OR B)
 ENDIF		;A4 & A6 & A7,E

 IF ENG==0xA2	;MAZDA COIL 13b
CS1.SET	
	MOVLW D'50'	;DELAY 50 uS
	CALL DELAY
	BSF FC3	;SELECT THE #2 TRAIL COIL
	BCF CS1SF
	RETURN

CS1.CLR
	MOVLW D'50'	;DELAY 50 uS
	CALL DELAY
	BCF FC3	;SELECT THE #1 TRAIL COIL
	BCF CS1CF
	RETURN
 ENDIF		;MAZDA COIL ONLY CODE

;	ANALOG ROUTINE USES THE CONVERT ROUTINE TO INPUT THE ANALOG PARAMETERS AND STORE THEM
;	IN THE APPROPRIATE RAM LOCATIONS.  ALL VALUES ARE DIVIDED BY TWO BEFORE BEING STORED
;	EXCEPT FOR FUEL FLOW VARIABLE.  ANALOG SELECTS REGISTER BANK 5 WHICH IS REQUIRED BEFORE
;	CALLING CONVERT.  IT ALSO SENDS THE REQUESTED ANALOG CHANNEL IN WREG WHEN CALLING CONVERT.


ANALOG		;ANALOG TAKES 255 uS TO CONVERT INPUTS + 120 uS TO COMPUTE IPWS (375 TOTAL)
		;DUE TO THE TIME LOST TO INTERRUPTS, THE TOTAL TIME TO EXECUTE COULD BE UP TO
		; 450 MICROSECONDS.  THIS IS 16.07 DEGREES OF ROTATION AT 6000 RPM

ANALOG		;ANALOG TAKES 255 uS TO CONVERT INPUTS + 120 uS TO COMPUTE IPWS (375 TOTAL)
		;DUE TO THE TIME LOST TO INTERRUPTS, THE TOTAL TIME TO EXECUTE COULD BE UP TO
		; 450 MICROSECONDS.  THIS IS 16.07 DEGREES OF ROTATION AT 6000 RPM

	BCF ANF			;CLEAR THE FLAG	BLUE MOUNT
	BTFSS PGMWR		;TEST PGM WR SW
	BSF WRSF		;SW WAS DOWN SO SET FLAG
	BTFSC PGMWR
	BCF WRSF		;SW WAS UP SO CLEAR FLAG
ANL1					;L ADDED TO LABEL BECAUSE ANx IS USED AS CHIP PIN DEFINITION
	MOVLW 0x0C		;SELECT CH 3 FOR INPUT	(O2 SENSOR)
	CALL CONVERT	;GO GET IT
	MOVFF ADRESH,AARGH
	MOVFF ADRESL,WREG
	BTFSS O2SEN		;TEST FOR WIDEBAND
	BRA ANL1.A
	BCF _C	
	RRCF AARGH,1,1	;DIVIDE BY 2 ,GET LSB (BIT 0) IN CY
	RRCF WREG,0,0	;DIVIDE LSB BY 2 & SHIFT IN MSB BIT FROM CY TO WREG
	BCF _C
	RRCF AARGH,1,1	;GET OLD BIT 1 IN CY
	RRCF WREG,0,0	;DIVIDE LSB BY 2 & SHIFT IN MSB BIT FROM CY
ANL1.A
	MOVWF O2L,1		;STORE VAR
	TSTFSZ AARGH,1 	;TEST FOR >255
	SETF O2L,1		;SET MAX IF OVF

ANL2			; using MPX4250 sensor
 IF NEWBOARD==0
	MOVLW 0x08		;SELECT CH 2 FOR MAP SENSOR
 ELSE
	MOVLW 0x04		;SELECT CH 1 FOR MAP SENSOR (NEW BOARD)
 ENDIF
	CALL CONVERT		;GO GET IT
 IF MAPSENSOR == 1		;IF MPX4115 SENSOR USED, DIVIDE RESULT BY 2
	BCF _C
	RRCF ADRESH,1,0
	RRCF ADRESL,1,0
 ENDIF
	
;  ADD DOUBLE SAMPLE HERE  TEST FOR DELTA  > 7.  rESAMPLE UNTIL DELTA <= 7.  (~1/2" Hg) (THIS IS TO FILTER ELECTRICAL IMPULSE NOISE)
	MOVFF ADRESH,AARGH	;SAVE 1ST SAMPLE
	MOVFF ADRESL,AARGL
 IF NEWBOARD==0
	MOVLW 0x08		;SELECT CH 2 FOR MAP SENSOR
 ELSE
	MOVLW 0x04		;SELECT CH 1 FOR MAP SENSOR (NEW BOARD)
 ENDIF
	CALL CONVERT		;GO GET IT A SECOND TIME
 IF MAPSENSOR == 1		;IF MPX4115 SENSOR USED, DIVIDE RESULT BY 2
	BCF _C
	RRCF ADRESH,1,0
	RRCF ADRESL,1,0
 ENDIF
						;ELIMINATED ALL THE AVERAGING STUFF HERE
	MOVFF ADRESH,MAPH	;UPDATE MAP W/LATEST SAMPLE
	MOVFF ADRESL,MAPL

ANL3
 IF NEWBOARD==0
	MOVLW 0x04		;SELECT CH 1 FOR TEMP SENSOR
 ELSE
	MOVLW 0x00		;SELECT CH 0 TEMP SENSOR  (NEW BOARD)
 ENDIF
	CALL CONVERT		;GO GET IT
	RRCF ADRESH,0,0		;DIVIDE BY 2
	MOVWF TEMPH,1		;SAVE IN VARIABLE
	RRCF ADRESL,0,0		;DIVIDE LSB BY 2 & SHIFT IN BIT FROM MSB
	MOVWF TEMPL,1		;STORE LSB OF VAR

ANL4
 IF NEWBOARD==0
	MOVLW 0x24		;SELECT CH 9 FOR PGM POT
 ELSE
	MOVLW 0x14		;SEL CH 5 FOR PGM POT (NEW BOARD)
 ENDIF
	CALL CONVERT		;GO GET IT
	RRCF ADRESH,1,0		;DIVIDE BY 4  TO MAKE 1 BYTE VALUE        (CY CLEARED BY CONVERT)
	RRCF ADRESL,1,0
	RRCF ADRESH,1,0
	RRCF ADRESL,0,0
	MOVWF PGMV,1		;SAVE IN PROGRAM VARIABLE
 IF NEWBOARD==1			;INCREASE RESULT BY 5% DUE TO Vcc3 DROP
	MOVWF AARGL
	CLRF AARGH
	MOVLW D'32'
	MOVWF BARGL,1
	CALL DIV
	MOVF AARGL,0,1	
	ADDWF PGMV,1,1
	BTFSC _C			;TEST FOR OVF
	SETF PGMV,1			;SET MAX IF OVF
 ENDIF

ANL5
 IF NEWBOARD==0
	MOVLW 0x28		;SELECT CH AN10 (A) FOR MIXTURE POT
 ELSE
	MOVLW 0x08		;SELECT CH AN2 FOR MIXTURE POT (NEW BOARD)
 ENDIF
	CALL CONVERT		;GO GET IT
	RRCF ADRESH,0,0		;DIVIDE BY 2
	MOVWF MIXH,1		;SAVE IN VARIABLE
	RRCF ADRESL,0,0		;DIVIDE LSB BY 2 & SHIFT IN BIT FROM MSB
	MOVWF MIXL,1		;STORE LSB OF VAR

 IF NEWBOARD==1			;INCREASE RESULT BY 5% DUE TO Vcc3 DROP
	MOVWF AARGL
	MOVFF MIXH,AARGH
	MOVLW D'32'
	MOVWF BARGL,1
	CALL DIV
	MOVF AARGL,0,1	
	ADDWF MIXL,1,1
	MOVF AARGH,0,1
	ADDWFC MIXH,1,1
	MOVLW D'1'
	CPFSGT MIXH,1
	BRA ANL5A
	SETF MIXL,1			;SET MAX IF OVF
	MOVLW 0x01
	MOVWF MIXH,1	
ANL5A
 ENDIF


ANL6
 IF NEWBOARD==0
	MOVLW 0x2C		;SELECT CH 11 FOR FUEL FLOW VOLTAGE
 ELSE
	MOVLW 0x18		;SELECT CH 6 FOR FF (NEW BOARD)
 ENDIF
	CALL CONVERT		;GO GET IT
	MOVFF ADRESH,FFH		;;SAVE IN VARIABLE BUT DO NOT DIVIDE BY 2		
	MOVFF ADRESL,FFL		;

ANL7
	MOVLW 0x10		;SELECT CH 4 FOR A/B DETECT
	CALL CONVERT		;GO GET IT
	MOVFF ADRESH,ABDET		;

 IF (VDET==1)			;BATTERY VOLTAGE DETECT OPTION
	MOVLW 0x1C		;SELECT CH7  FOR VBAT DETECT
	CALL CONVERT		;GO GET IT

	RRCF ADRESH,0,0		;DIVIDE BY 2
	MOVWF VBATH,1		;SAVE IN VARIABLE
	RRCF ADRESL,0,0		;DIVIDE LSB BY 2 & SHIFT IN BIT FROM MSB
	MOVWF VBATL,1		;STORE LSB OF VAR
	MOVLW D'111'		;OFFSET TO CENTER THE ADC VALUE FOR SCALE (256=0) (WAS 129)
	SUBWF VBATL,1,1		;value chosen to make answer 255 when Vin = 14.3V
	CLRF WREG,0
	SUBWFB VBATH,1,1

	COMF VBATL,1,1		;NEGATE VALUE FOR SCALE 
	COMF VBATH,0,1
	ANDLW 0x01			;SCREEN ALL OTHER BITS OFF
	MOVWF VBATH,1
	MOVLW 0x01			;comp & add 1 for negative val
	ADDWF VBATL,1,1
	MOVLW 0
	ADDWFC VBATH,1,1
 ENDIF

	CALL IPWCALC		;COMPUTE NEW IPW VALUES.
						;FLAG END OF MATH & ANALOG FOR TIMING STUDY
	RETURN

;	CONVERT INPUTS:    WREG  CONTAINS AD CHANNEL IN UPPER FOUR BITS (LOWER = 0)

CONVERT			; (TAKES ~ 45 uS)   
 IF EC3TB==0
	BSF WREG,7,0		;SET CONV CLOCK
 ENDIF
	BSF WREG,0,0		;SET ADON BIT IN ADCON0
	MOVWF ADCON0,0		;SEND CHANNEL TO CONVERT TO UPPER BITS OF ADCON0
	MOVLW D'5'			;GET ERRORS WHEN MADE TOO LARGE?????
	CALL DELAY			;LET IT SETTLE
	BSF ADCON0,GO,0		;SET GO/DONE BIT TO START CONVERSION
CONV.A	
	BTFSC ADCON0,GO,0		;WAIT FOR CONVERSION TO COMPLETE
	BRA CONV.A
	BCF STATUS,C,0		;CLR CY FLAG FO AN ROUTS
	RETURN			;RETURN WITH RESULT IN ADRESH & L

;     NEW MATRIX IPWCALC

;****   new 8 level map table routines
; Basic table pointer generation AND SET/CLR SFLAG

IPWCALC
 IF ROTARY == 1
	TSTFSZ MAPH,1			;MAP < STAGE POINT?
	BRA IPWC.8C			;MSB > 0 SO NOT STAGED 
	MOVLW D'234'		;MAP < STAGE POINT? ~19.5" Hg
	CPFSLT MAPL,1		;LSB > THRESH?
	BRA IPWC.8C			;MAPL NOT < SO NOT STAGED (4 INJECTORS TO FIRE)
; < 20" Hg 
	BSF SFLAG			;2 INJECTORS TO FIRE SO SET FLAG
	MOVLW D'69' 		;CALC LOW RANGE MTPTR  MAP ADC - MINMAP ADC (8" Hg)/ LRC (10) = MTPTR
	SUBWF MAPL,0,1
	BTFSS _C			;TEST FOR MP , MIN
	CLRF WREG			;SET 0 IF MP < MIN
	MOVWF AARGL,1
	CLRF AARGH,1
	MOVLW D'10'			;10 IS LOW RANGE CONSTANT LRC
	MOVWF BARGL,1
	CALL DIV		
	MOVFF AARGL,MTPTR		;RESULT TO MTPTR  (0 - 15) (CAN'T BE > 15)
	BRA IPWC.8D				;GO ON

IPWC.8C					; MP > STAGE,  NOT STAGED   CALC HIGH RANGE (19.5 - 36" Hg) MTPTR  16.5" RANGE, ~ 1 ADR PER " Hg
	BCF SFLAG			;NOT STAGING SO CLR IT
	MOVLW D'234'		;MAP - ADC @ 19.5 / 14 HRC = HRA HIGH RANGE ADDRESS
	SUBWF MAPL,0,1
	MOVWF AARGL,1
	CLRF WREG,0
	SUBWFB MAPH,0,1
	MOVWF AARGH,1
	MOVLW D'14'			;HRC TO BARGL
	MOVWF BARGL,1
	CALL DIV
	MOVLW D'16'			;CK FOR OVF (>15)
	CPFSLT AARGL,1
	BRA IPWC.8C1
	MOVFF AARGL,MTPTR	;LOAD MTPTR
	BRA IPWC.8A
IPWC.8C1				;HAD OVERFLO 
	MOVLW D'15'			;MAX ADR TO MTPTR
	MOVWF MTPTR,1

IPWC.8A					;RPM > 5000?
	MOVLW HIGH RNG5
	MOVWF AARGH,1
	MOVLW LOW RNG5
	MOVWF AARGL,1
	CALL RPMLT				;TEST FOR  RPM > RANGE 5  4000 RPM   RETURNS CY SET IF RPM TPH&L < RPM IN AARGH&L, CLR IF FALSE
	BTFSC _C				;CY SET = ENG RPM < RNG
	BRA IPWC.8F				;RPM < 4000 SO SET GP 6 & ADD 
IPWC.8E
	MOVLW 0x70				;  >= 4000 SO SET GP7 & ADD HRA (MTPTR)
	ADDWF MTPTR,0,1
	MOVWF TPTR				;MAKE FINAL POINTER
	LFSR 2,MTAB
	MOVWF FSR2L,0		;MOVE TO POINTER  LSB
	MOVFF INDF2,TDAT	;GET TABLE ENTRY & MOVE TO ENGINE DATA TABLE
	BRA IPWC.8X				;EXIT POINT FOR MAKE POINTER ROUT
IPWC.8F
	MOVLW 0x60				;  < 4000 SO SET GP6 & ADD HRA (MTPTR)
	ADDWF MTPTR,0,1
	MOVWF TPTR				;MAKE FINAL POINTER
	LFSR 2,MTAB
	MOVWF FSR2L,0		;MOVE TO POINTER  LSB
	MOVFF INDF2,TDAT	;GET TABLE ENTRY & MOVE TO ENGINE DATA TABLE
	BRA IPWC.8X				;EXIT POINT FOR MAKE POINTER ROUT

IPWC.8D					;RPM < 1600?
	MOVLW HIGH RNG2
	MOVWF AARGH,1
	MOVLW LOW RNG2
	MOVWF AARGL,1
	CALL RPMLT				;TEST FOR  RPM BELOW RANGE 0  1600 RPM   RETURNS CY SET IF RPM TPH&L < RPM IN AARGH&L, CLR IF FALSE
	BTFSS _C				;GO CK FOR MP RANGE TO RPM TABLE COMPUTE 
	BRA IPWC.8B				;   NOT LT 1600 SO GO FIND RNG # (RPM) AND ADD IN LRA
	TSTFSZ MAPH,1			;TEST MSB FOR 0
	BRA IPWC.8D1
	MOVF RPMTHRESH,0,1		;RPM LT RNG0 , TEST FOR MP < THRESHOLD , GET RPM MP THRESH (BASIC MAP PTR ADDRESS)
	CPFSGT MAPL,1			;MAPL > THRESHOLD MP?  10-04-12  ERROR FOUND, WAS MPTR
	BRA IPWC.8G				;NO, SO GO CALC RPM PTR
IPWC.8D1
	MOVLW 0x10				;YES, SET RANGE 1 FOR > MIN MP FOR RPM RANGE
	ADDWF MTPTR,0,1
	MOVWF TPTR				;FINAL POINTER
	LFSR 2,MTAB
	MOVWF FSR2L,0		;MOVE TO POINTER  LSB
	MOVFF INDF2,TDAT	;GET TABLE ENTRY & MOVE TO ENGINE DATA TABLE
	BRA IPWC.8X				;DONE

IPWC.8B					;  FIND RANGE #, ADD LRA
	MOVLW HIGH RNG5
	MOVWF AARGH,1
	MOVLW LOW RNG5
	MOVWF AARGL,1
	CALL RPMLT				;TEST FOR  RPM BELOW RANGE 5 (5000 RPM - 7500)    RETURNS CY SET IF RPM TPH&L < RPM IN RNGx (AARGH&L), CLR IF FALSE
	BTFSS _C				;GO T
	BRA IPWC.8H				;   NOT LT RNG 5 SO GO SET BK5 & ADD LRA
	MOVLW HIGH RNG4
	MOVWF AARGH,1
	MOVLW LOW RNG4
	MOVWF AARGL,1
	CALL RPMLT				;TEST FOR  RPM BELOW RANGE X (4001 - 5000)  RETURNS CY SET IF RPM TPH&L < RPM IN AARGH&L, CLR IF FALSE
	BTFSS _C				;GO 
	BRA IPWC.8J				;   NOT LT RNG4 SO GO SET BK4 AND ADD IN LRA
	MOVLW HIGH RNG3
	MOVWF AARGH,1
	MOVLW LOW RNG3
	MOVWF AARGL,1
	CALL RPMLT				;TEST FOR  RPM BELOW RANGE X  (2301 - 4000) RETURNS CY SET IF RPM TPH&L < RPM IN AARGH&L, CLR IF FALSE
	BTFSS _C				;GO
	BRA IPWC.8K				;   NOT LT RNG3 SO GO SET BK3 AND ADD IN LRA
	MOVLW HIGH RNG2
	MOVWF AARGH,1
	MOVLW LOW RNG2
	MOVWF AARGL,1
	CALL RPMLT				;TEST FOR  RPM BELOW RANGE X (1601 -  2300  RETURNS CY SET IF RPM TPH&L < RPM IN AARGH&L, CLR IF FALSE
	BTFSS _C				;GO
	BRA IPWC.8L				;   NOT LT RNG2 SO GO SET BK2 AND ADD IN LRA
	MOVLW 0x10				;YES, SET RANGE 1 FOR > MIN MP FOR RPM RANGE
IPWC.8B1
	ADDWF MTPTR,0,1
	MOVWF TPTR				;FINAL POINTER
	LFSR 2,MTAB			;$200 TO PTR
	MOVWF FSR2L,0		;MOVE TO POINTER  LSB
	MOVFF INDF2,TDAT	;GET TABLE ENTRY & MOVE TO ENGINE DATA TABLE
	BRA IPWC.8X				;DONE

IPWC.8H					;RNG5
	MOVLW 0x50				;YES, SET RANGE 
	BRA IPWC.8B1
IPWC.8J					;RNG4
	MOVLW 0x40				;YES, SET RANGE 
	BRA IPWC.8B1
IPWC.8K					;RNG3
	MOVLW 0x30				;YES, SET RANGE 
	BRA IPWC.8B1
IPWC.8L					;RNG2
	MOVLW 0x20				;YES, SET RANGE 
	BRA IPWC.8B1

IPWC.8G						;CALC RPM PTR
	MOVFF TPH,AARGH			;DIVIDE TPH&L BY CONSTANT 24 TO SCALE DOWN TPH TO SOMETHING WE CAN HANDLE IN 16 BITS (RPM CONSTANT WILL BE 65535)  (65535 / (TPH&L / 95)) = RPM
	MOVFF TPL,AARGL			;low limit of 606 rpm  (500 ON CONT)
  	MOVLW 0x28
	CPFSGT AARGH,1
	BRA IPWC.R4				;MSB IS OK SO GO ON
	BRA IPWC.R5				;TOO HIGH SO SET 0 ADR
IPWC.R4
	CPFSEQ AARGH,1
	BRA IPWC.R6				;MSB < SO IN RANGE
  	MOVLW 0x49
	CPFSLT AARGL,1
	BRA IPWC.R5				;RPM WAS TOO LOW SO SET ADR 0
IPWC.R6
  	MOVLW D'95'
	MOVWF BARGL
	CALL DIV			;DIVIDE BY CONSTANT, RESULT IN AARGH&L  WILL BE SOMETHING BETWEEN 108 AND 21 (606 AND 3200 RPM)
	MOVFF AARGL,BARGL		;8 BIT RESULT TO BARG
	SETF AARGH,1			;65535 TO AARG
	SETF AARGL,1				
	CALL DIV				;RESULT IS RPM 606 - 3200
	MOVLW D'94'				;SUBTRACT 606 (500 FOR CONT) RPM OFFSET TO MAKE RPM <= 606 = ADR 0
	SUBWF AARGL,1,1
	MOVLW D'2'
	SUBWFB AARGH,1,1		;OFFSET RPM IN AARG  GIVES RESULT OF 0 - 992  (0 - 204 ON CONT)
	BTFSC _C				;HAVE BORROW?  	
	BRA IPWC.R1			;C SET SO NO BORROW, SO RPM OK
IPWC.R5
	CLRF AARGL,1		;CY CLR SO HAD OVF, SET ZERO PTR
	CLRF AARGH,1
	BRA IPWC.R2			;GO STORE FINAL PTR 
IPWC.R1
	MOVLW D'48'				;DIVIDE BY CONSTANT '64' TO COMPUTE THE RPM ADDRESS IN TABLE BETWEEN 0 - 15  CHANGED TO 48 TO GET CLOSER SPACING ON LOW END, GIVES UP RANGE AT HIGH END
	MOVWF BARGL,1
	CALL DIV				;SHOULD BE A VALUE BETWEEN 0 AND 15
	MOVLW D'15'		;TEST FOR TOO HIGH
	CPFSLT AARGL,1	
	MOVWF AARGL,1	;SET TO MAX IF TOO HI
IPWC.R2
	LFSR 2,MTAB			;$200 TO PTR	
	MOVFF AARGL,FSR2L	;MOVE TO POINTER  LSB
	MOVFF FSR2L,TPTR	;SAVE POINTER FOR WRTBL
	MOVFF INDF2,TDAT	;GET TABLE ENTRY & MOVE TO ENGINE DATA TABLE
;	BRA IPWC.8X

IPWC.8X
	MOVF TPTROLD,0,1
	CPFSEQ TPTR,1
	BSF TPTRD			;TPTR CHANGED SO SET TPTR DELTA
	MOVFF TPTR,TPTROLD	;UPDATE OLD TPTR
;	BRA IPWC.A			;GO ON			;

;*******
 ELSE   				;END OF ROTARY MAP ADR GENERATION / START OF PISTON VER   *********************************************************
 	BCF SFLAG			;ALWAYS CLEARED ON PISTON 
 	TSTFSZ MAPH,1		;MAP < HIGH RANGE?  TEST MSB
	BRA IPWC.8C			;MSB > 0 SO NOT LRA
	MOVLW D'234'		;MAP < STAGE POINT? ~19.5" Hg
	CPFSLT MAPL,1		;LSB > THRESH?
	BRA IPWC.8C			;MAPL NOT < SO MP > 19.5  GO GEN HRA

	MOVLW HIGH RNG2		;RPM < 1600?
	MOVWF AARGH,1
	MOVLW LOW RNG2
	MOVWF AARGL,1
	CALL RPMLT				;TEST FOR  RPM BELOW RANGE 0  1600 RPM   RETURNS CY SET IF RPM TPH&L < RPM IN AARGH&L, SET IF TRUE, CLR IF FALSE, 
	BTFSS _C				;GO TO RPM TABLE COMPUTE 
	BRA IPWC.8D1				; NOT LT 1600 SO GO CALC LRA THEN FIND RNG # (RPM) AND ADD IN LRA
	
	TSTFSZ MAPH,1			; RPM < 1600 SO TEST MP   IS MP > RPM THRESHOLD?   TEST MSB FOR 0
	BRA IPWC.8D1			;MP > THRESH MAKE TPTR BASED ON MP IN TABLE 1
	MOVF RPMTHRESH,0,1		;ENG RPM LT RNG0 , TEST FOR MP < THRESHOLD , GET RPM MP THRESH (BASIC MAP PTR ADDRESS)
	CPFSGT MAPL,1			;MAPL > THRESHOLD MP?  IF SO, CALC LRA 
	BRA IPWC.8G				;NO, SO GO CALC RPM PTR
	
IPWC.8D1					;CALC LRA
	MOVLW D'69' 		;CALC  LRA - LOW RANGE ADR MTPTR  MAP ADC - MINMAP ADC (8" Hg)/ LRC (10) = MTPTR
	SUBWF MAPL,0,1
	BTFSS _C			;TEST FOR MP , MIN
	CLRF WREG			;SET 0 IF MP < MIN
	MOVWF AARGL,1
	CLRF AARGH,1
	MOVLW D'10'			;10 IS LOW RANGE CONSTANT LRC
	MOVWF BARGL,1
	CALL DIV		
	MOVFF AARGL,MTPTR		;RESULT TO MTPTR  (0 - 15) (CAN'T BE > 15)
	BRA IPWC.8B				;GO ON   TO FIND RPM RANGE
	
IPWC.8C					; MP > 19.5"   CALC HIGH RANGE (19.5 - 36" Hg) MTPTR
	BCF SFLAG			;NOT STAGING SO CLR IT
	MOVLW D'234'		;MAP - ADC @ 19.5 / 14 HRC = HRA HIGH RANGE ADDRESS
	SUBWF MAPL,0,1
	MOVWF AARGL,1
	CLRF WREG,0
	SUBWFB MAPH,0,1
	MOVWF AARGH,1
	MOVLW D'14'			;HRC TO BARGL
	MOVWF BARGL,1
	CALL DIV
	MOVLW D'16'			;CK FOR OVF (>15)
	CPFSLT AARGL,1
	BRA IPWC.8C1
	MOVFF AARGL,MTPTR	;LOAD MTPTR
	BRA IPWC.8C2
IPWC.8C1				;HAD OVERFLO 
	MOVLW D'15'			;MAX ADR TO MTPTR
	MOVWF MTPTR,1
;	BRA IPWC.8C2
IPWC.8C2
	MOVLW HIGH RNG5			; RNG5 RPM
	MOVWF AARGH,1
	MOVLW LOW RNG5
	MOVWF AARGL,1
	CALL RPMLT				;TEST FOR  RPM BELOW RANGE 6    RETURNS CY SET IF RPM TPH&L < RPM IN RNGx (AARGH&L), CLR IF FALSE
	BTFSS _C				;GO TO 
	BRA IPWC.8P				;   NOT LT RNG 5 SO GO SET BK7 & ADD LRA/HRA
	BRA IPWC.8N				;   LT RNG5  SO GO SET BK6 AND ADD IN LRA
	
IPWC.8B					;   FIND RPM RANGE 1 - 5 ,   FIND RANGE #, ADD LRA
	MOVLW HIGH RNG5
	MOVWF AARGH,1
	MOVLW LOW RNG5
	MOVWF AARGL,1
	CALL RPMLT				;TEST FOR  RPM BELOW RANGE 5    RETURNS CY SET IF RPM TPH&L < RPM IN RNGx (AARGH&L), CLR IF FALSE
	BTFSS _C				;GO T
	BRA IPWC.8H				;   NOT LT RNG 5 SO GO SET BK5 & ADD LRA/HRA
	MOVLW HIGH RNG4
	MOVWF AARGH,1
	MOVLW LOW RNG4
	MOVWF AARGL,1
	CALL RPMLT				;TEST FOR  RPM BELOW RANGE 4   RETURNS CY SET IF RPM TPH&L < RPM IN AARGH&L, CLR IF FALSE
	BTFSS _C				;GO 
	BRA IPWC.8J				;   NOT LT RNG4 SO GO SET BK4 AND ADD IN LRA
	MOVLW HIGH RNG3
	MOVWF AARGH,1
	MOVLW LOW RNG3
	MOVWF AARGL,1
	CALL RPMLT				;TEST FOR  RPM BELOW RANGE 3   RETURNS CY SET IF RPM TPH&L < RPM IN AARGH&L, CLR IF FALSE
	BTFSS _C				;GO
	BRA IPWC.8K				;   NOT LT RNG3 SO GO SET BK3 AND ADD IN LRA
	MOVLW HIGH RNG2
	MOVWF AARGH,1
	MOVLW LOW RNG2
	MOVWF AARGL,1
	CALL RPMLT				;TEST FOR  RPM BELOW RANGE 2   RETURNS CY SET IF RPM TPH&L < RPM IN AARGH&L, CLR IF FALSE
	BTFSS _C				;GO
	BRA IPWC.8L				;   NOT LT RNG2 SO GO SET BK2 AND ADD IN LRA	
	MOVLW 0x10				; SET RANGE 1 

IPWC.8B1
	ADDWF MTPTR,0,1
	MOVWF TPTR				;FINAL POINTER
	LFSR 2,MTAB			;$200 TO PTR
	MOVWF FSR2L,0		;MOVE TO POINTER  LSB
	MOVFF INDF2,TDAT	;GET TABLE ENTRY & MOVE TO ENGINE DATA TABLE
	BRA IPWC.8X				;DONE

IPWC.8H					;BK5
	MOVLW 0x50				;YES, SET RANGE 
	BRA IPWC.8B1
IPWC.8J					;BK4
	MOVLW 0x40				;YES, SET RANGE 
	BRA IPWC.8B1
IPWC.8K					;BK3
	MOVLW 0x30				;YES, SET RANGE 
	BRA IPWC.8B1
IPWC.8L					;BK2
	MOVLW 0x20				;YES, SET RANGE 
	BRA IPWC.8B1
IPWC.8M					;BK1
	MOVLW 0x10				;YES, SET RANGE 
	BRA IPWC.8B1
IPWC.8N					;BK6
	MOVLW 0x60				;YES, SET RANGE 
	BRA IPWC.8B1
IPWC.8P					;BK7
	MOVLW 0x70				;YES, SET RANGE 
	BRA IPWC.8B1

	
IPWC.8G						;CALC RPM PTR
	MOVFF TPH,AARGH			;DIVIDE TPH&L BY CONSTANT 95 TO SCALE DOWN TPH TO SOMETHING WE CAN HANDLE IN 16 BITS (RPM CONSTANT WILL BE 65535)  C / (TPH&L / 95) = RPM
	MOVFF TPL,AARGL			;low limit of 606 rpm
  IF ENG==0xB3				;B3 HAS 4X SLOWER TMR0
	MOVLW 0x0A				;IS TPH OUT OF RANGE 
  ELSE
    IF CONT ==1
      MOVLW 0x30
    ELSE
  	  MOVLW 0x28
  	ENDIF
  ENDIF
	CPFSGT AARGH,1
	BRA IPWC.R4				;IS OK SO GO ON
	BRA IPWC.R5				;TOO HIGH SO SET 0 ADR
IPWC.R4
	CPFSEQ AARGH,1
	BRA IPWC.R6	
	IF ENG==0xB3
	MOVLW 0x12
  ELSE
    IF CONT==1
  	  MOVLW 0x44			;WAS D4
    ELSE
      MOVLW 0x49
    ENDIF
  ENDIF
	CPFSLT AARGL,1
	BRA IPWC.R5
IPWC.R6

  IF ENG==0xB3			;WAS 24 FOR ALL?  09-25-12
	MOVLW D'24'
  ELSE
  	MOVLW D'95'				;95
  ENDIF
	MOVWF BARGL
	CALL DIV				;DIVIDE BY CONSTANT, RESULT IN AARGH&L  WILL BE SOMETHING BETWEEN 110 AND 21 (606 AND 3200 RPM)
	MOVFF AARGL,BARGL		;8 BIT RESULT TO BARG
	SETF AARGH,1			;65535 TO AARG
	SETF AARGL,1				
	CALL DIV				;RESULT IS RPM 606 - 3200
  IF CONT ==1				;WAS 94 FO ALL
    MOVLW D'244'
  ELSE
	MOVLW D'94'				;SUBTRACT 606 (500 FOR CONT) RPM OFFSET TO MAKE RPM <= 606 = ADR 0
  ENDIF
	SUBWF AARGL,1,1
  IF CONT == 1
    MOVLW D'1'
  ELSE
	MOVLW D'2'
  ENDIF
	SUBWFB AARGH,1,1		;OFFSET RPM IN AARG  GIVES RESULT OF 0 - 992  
	BTFSC _C				;HAVE BORROW?  	
	BRA IPWC.R1			;C SET SO NO BORROW, SO RPM OK
IPWC.R5
	CLRF AARGL,1		;CY CLR SO HAD OVF, SET ZERO PTR
	CLRF AARGH,1
	BRA IPWC.R2			;GO STORE FINAL PTR 
IPWC.R1
  IF CONT==1
    MOVLW D'20'
  ELSE
	MOVLW D'48'				;DIVIDE BY CONSTANT '64' TO COMPUTE THE RPM ADDRESS IN TABLE BETWEEN 0 - 15  CHANGED TO 48 TO GET CLOSER SPACING ON LOW END, GIVES UP RANGE AT HIGH END
  ENDIF
	MOVWF BARGL,1
	CALL DIV				;SHOULD BE A VALUE BETWEEN 0 AND 15
	MOVLW D'15'		;TEST FOR TOO HIGH
	CPFSLT AARGL,1	
	MOVWF AARGL,1	;SET TO MAX IF TOO HI
IPWC.R2
	LFSR 2,MTAB			;$200 TO PTR	
	MOVFF AARGL,FSR2L	;MOVE TO POINTER  LSB
	MOVFF FSR2L,TPTR	;SAVE POINTER FOR WRTBL
	MOVFF INDF2,TDAT	;GET TABLE ENTRY & MOVE TO ENGINE DATA TABLE
;	BRA IPWC.8X
	
IPWC.8X
	MOVF TPTROLD,0,1
	CPFSEQ TPTR,1
	BSF TPTRD			;TPTR CHANGED SO SET TPTR DELTA
	MOVFF TPTR,TPTROLD	;UPDATE OLD TPTR
;	BRA IPWC.A			;GO ON  NOT NEEDED, FALLS THROUGH	
 
 ENDIF					;END OF PISTON VERSION MAP ADR GENERATION
 
;  END OF NEW IPWCALC VER   ************ 

;*************************************   NEW PISTON VERSION BASIC IPW CALC START
IPWC.A
  IF ROTARY==0
 	BCF SFLAG				;ALWAYS CLEARED IN PISTON ENGINE
	MOVF IPWRNG,0,1			;WAS 44  THIS CONSTANT CONTROLS THE DYNAMIC RANGE OF THE IPW. LARGER VALUE = LARGER DYN. RANGE
						;SET FOR MIN IPW AT MINIMUM MAP
	SUBWF MAPL,0,1	
	MOVWF WORKL,1
	CLRF WREG,0
	SUBWFB MAPH,0,1
	MOVWF WORKH,1			;END 12-26-04  
	BTFSC _C		;TEST FOR OVERFLOW
	BRA IPWC.0E		;NO OVF
	MOVLW D'1'
	MOVWF WORKL,1	;LOAD A MINIMUM VALUE IF OVF
	CLRF WORKH,1
IPWC.0E
	TSTFSZ PFUN,1			;ARE WE IN MODE 0?
	BRA IPWC.2			;DON'T TEST FOR COLD START UNLESS IN MODE 0
	BTFSS CSON			;COLD START SW ON?  (1 = ON)
	BRA IPWC.2			;NOT ON SO GO DO MODS TO BASIC IPW
	BCF _C			;DOUBLE IPW FOR COLD START
	RLCF WORKL,1,1		;cld str SW WAS ON SO MOVE 2 * MAP TO IPW	
	RLCF WORKH,1,1	
	
;ACCL START
IPWC.2              ;ADJUSTMENTS TO IPW BASED ON ENGINE TYPE AND OTHER SPECIAL CONDITIONS (ACCELERATOR PUMP FUNCTION)
  	MOVF IPWMIN,0,1	;ADD IPWMINL TO PRELIMINARY IPW  IN WORK
  	ADDWF WORKL,1,1
  	CLRF WREG,0
  	ADDWFC WORKH,1,1

IPWC.2A
	MOVFF WORKL,SINL		;PUT IPW IN SCALE INPUT REG
	MOVFF WORKH,SINH
  ENDIF					;END OF PISTON ENG BASIC IPW CALC
 
;FALLS THROUGH TO IPWC.2F
;  **********************************  END OF PISTON NEW VERSION

; *******************************  START OF ROTARY NEW VERSION 
  IF ROTARY==1
		;ROTARY BASIC IPW CALC 
		
	MOVF IPWRNG,0,1		;CONTROLS THE DYNAMIC RANGE OF THE IPW. LARGER VALUE = LARGER DYN. RANGE (ie, ipw is smaller at low MP)
						;SET FOR MIN MS IPW AT MINIMUM MAP   SET WITH MINIPW IN EXP VER.  
	SUBWF MAPL,0,1		;CALC THE BASIC IPW 
	MOVWF WORKL,1
	CLRF WREG,0
	SUBWFB MAPH,0,1
	MOVWF WORKH,1			;WORKL&H NOW CONTAIN BASIC IPW
	BTFSC _C		;TEST FOR OVERFLOW
	BRA IPWC.0E		;NO OVF
	MOVLW D'1'
	MOVWF WORKL,1	;LOAD A MINIMUM VALUE IF OVF
	CLRF WORKH,1
IPWC.0E
   IF ONEINJ==1    ;IF ONE INJECTOR PER ROTOR FLAG SET, SKIP STAGGING LOGIC.
	BRA IPWC.1	;GO IPWC = DIVIDE MAP BY TWO , NO COLD START, NO STAGE CKECK, CLR SFLAG
   ENDIF
  
; *************   NEW STHRESH BASED ON MTPTR INSTEAD OF MAPH&L  (NOTE, STHRESH IS COMPARED W/ TPTR WITH UPPER 2 BITS MASKED)
;	MOVF MTPTR,0,1		;GET CURRENT TABLE POINTER    WAS TPTR IN NON MATRIX  
;	ANDLW 0x1F			;MASK OFF UPPER BITS  ( CHANGED FROM 3F TO 1F IN MATRIX VER
;	CPFSGT STHRESH,1	;COMPARE current MAP adr TO STHRESH (stage point,  TEST SFLAG FOR CHANGE IF STHRESH GT CURRENT TABLE POINTER
;	BRA IPWC.0C				;stresh >= MAP (no stage, running on both) SO GO TEST FOR SFLAG CHANGE FROM SET TO CLEAR  
	
	;  ADDED IN MATRIX TO ELIMINATE HYSTERYSIS BELOW
;	BSF SFLAG
;	BRA IPWC.00
	;  MATRIX 
	
IPWC.0C				;HAD NON STAGE TPTR,(WE ARE NOT STAGING) TEST FOR CHANGE OF STAGED TO NO STAGE
;	BCF SFLAG
;	BRA IPWC.1
	;     MATRIX

	BTFSS SFLAG		;TEST FOR STAGING
	BRA IPWC.1		;NOT STAGING SO GO DIV /2

IPWC.00				;STAGGED, ONLY PRIMARY INJECTORS FIRING (NO DIVIDE BY 2 OF MAP)
	MOVF PFUN,0,1	;TEST FOR CSON FOR DOUBLE FUE UNLESS NOT IN MODE 0
	BNZ IPWC.2		;NOT MODE ZERO SO SKIP TEST FOR DOUBLING FUEL
IPWC.00A
	BTFSS CSON		;COLD START SW ON?
	BRA IPWC.2	;NO COLD START SO GO ON 
	BCF SFLAG		;COLD START ON, KILL THE SFLAG TO ENABLE ALL 4 INJECTORS IN TMR0 INT (TO DOUBLE FUEL DELIVERY)
	BRA IPWC.2
	
IPWC.1				; NON-STAGED, ALL INJECTORS FIRING, CLEAR SFLAG, DIVIDE IPW BY 2 UNLESS CLDSTR SW ACTIVE  
	BCF SFLAG		;CALC NORMAL IPW (NOT COLD START OR LOW MAP STAGING)
	MOVF PFUN,0,1		;TEST FOR MODE 0
	BNZ IPWC.1B		;SKIP TEST FOR COLD START IF NOT IN MODE 0
	BTFSC CSON		;TEST FOR COLD START  (1 = ON)   WAS CLDSW 
	BRA IPWC.2		;SKIP DIV BY 2 IF COLD START ON TO DOUBLE FUEL DELIVERY WHEN NON STAGED 
IPWC.1B
	BCF _C			;DIVIDE BASIC IPW BY 2 FOR IPW  (not staged & NOT COLD START)	
	RRCF WORKH,1,1	
	RRCF WORKL,1,1

IPWC.2              ; STAGE & NON STAGE GO HERE,   ADJUSTMENTS TO IPW BASED ON ENGINE TYPE AND OTHER SPECIAL CONDITIONS
IPWC.2C
  	MOVF IPWMIN,0,1	;ADD IPWMINL TO MAP IPW  IN WORK
  	ADDWF WORKL,1,1
  	CLRF WREG,0
  	ADDWFC WORKH,1,1
IPWC.2D
	BTFSC SFLAG		;ARE WE STAGED?
  	BRA IPWC.2B		;DON'T COMPENSATE FOR SECONDARIES IF NOT
   	BTFSC LSEC
    BRA IPWC.2A		;DEC IPW IF LG SECONDARIES IN USE	
	BRA IPWC.2B
IPWC.2A
	MOVLW D'10'		;		DEC IPW IF LGSEC		THIS IS JUST A GUESS BUT WORKING IN N84TC
	SUBWF WORKL,1
	CLRF WREG
	SUBWFB WORKH,1
	BTFSC _C
	BRA IPWC.2B
	CLRF WORKL,1
	CLRF WORKH,1

IPWC.2B
	MOVFF WORKL,SINL		;PUT IPW IN SCALE INPUT REG
	MOVFF WORKH,SINH
	
	; 06-09-04   ADDING SECONDARY INJECTOR FLOW RATE DIFFERENTIAL HERE (THIS IS A 2 INJ/CHAMBER ENGINE) 
   IF ONEINJ != 1		;NO SECDIF IF ONLY ONE INJECTOR/CHAMBER
IPWC.SD
	BTFSC SFLAG		;ARE WE STAGGING?
	BRA IPWC.SDX	;SKIP IF YES
IPWC.SD4			;stage 1 dif
	BCF _C
	RLCF SECDIF,0,1
IPWC.SD3	
	MOVWF SCAL,1		;MOVE SECDIF TO SCALE FACTOR
	CLRF SCAH,1
	RLCF SCAH,1,1
IPWC.SD1
	MOVLW 3		;SELECT 33% SCALE RANGE FOR equal (& all) injectors
IPWC.SD2
	CALL SCALE		;SCALE FACTORS VALUE IN SINL&H BY SCAL&H (RESULT IS IN SINL&H)
IPWC.SDX
   ENDIF			;  END SECDIF CODE	
  ENDIF  			;END OF ROTARY IPW 
      
;************************************  NEW VERSION OF ROTARY IPWC END 

;  ***********   TRIM ADJUST CALC			CLVER

IPWC.CL
	BTFSS CSON			;CLOSED LOOP ENABLED?
	BRA IPWC.CLX		;NOT CL SO SKIP				
	MOVLW D'1'			;mode 1 or 3?  (cl modes)?
	CPFSEQ PFUN,1
	BRA IPWC.CL1		;TEST FOR 3
	BRA IPWC.CL2			;GO DO CL TRIM
IPWC.CL1
    MOVLW D'3'
    CPFSEQ PFUN,1
    BRA IPWC.CLX		;NOT A CL MODE SO EXIT
IPWC.CL2
    MOVF TRIM,0,1		;GET THE TABLE DATA FROM current MAP address   (7-17-05)
	BCF _C			;CLR CY
	RLCF WREG,0,0
	MOVWF SCAL,1
	CLRF SCAH,1
	RLCF SCAH,1,1		;SHIFT IN HIGH BIT IF SET (CONVERT THIS 8 BIT TO 9 BIT FOR SCALE
  	MOVLW D'6'		;SELECT 20% RANGE 
	CALL SCALE		;SCALE IPW USING TRIM FOR SCALE FACTOR
IPWC.CLX			;END OF TRIM ADJ

;****************************


; ********************************    NEW TRIM ROUT.
	
IPWC.2F
	MOVF MIXL,0,1		;PUT MANUAL MIXTURE POT IN SCALE REGISTER
	MOVWF SCAL,1
	MOVF MIXH,0,1
	MOVWF SCAH,1
 	MOVLW 4			;SMALLER CORRECTION ON 20B WITH BIG INJECTORS (RE: EXPERIENCE ON n109tc)
	CALL SCALE		;SCALE THE IPW USING MANUAL MIXTURE CONTROL

			;NEXT WE SCALE IPW USING MAP TABLE ENTRY 
;    NEW START OF SCALE IPW WITH MAP TABLE ENTRY  (7-17-05)
    MOVF TDAT,0,1		;GET THE TABLE DATA FROM current MAP address   (7-17-05)
	BCF _C			;CLR CY
	RLCF WREG,0,0
	MOVWF SCAL,1
	CLRF SCAH,1
	RLCF SCAH,1,1		;SHIFT IN HIGH BIT IF SET (CONVERT THIS 8 BIT TO 9 BIT FOR SCALE

;  *******************   END HIGH - LOW RPM MAP TABLE CHANGE   ***************************
;IPWC.3
  	MOVLW D'3'		;SELECT 33% RANGE 
	CALL SCALE		;SCALE IPW USING MAP TABLE ENTRY FOR SCALE FACTOR
				;SINL&H ALREADY CONTAIN INTERIM IPW 
		
		; NEXT WE SCALE IPW WITH TEMP IF THIS IS CONTROLLER A
 IF TEMPSENSOR == 0 
		;This is the version for use with a thermistor instead of the LM34 sensor.
IPWC.4A		;TEMP RANGE OF 5 - 140 DEG F GIVES SCALE INPUT OF +183 TO -145  (on SCALE RANGE OF 33%)
	BTFSS CAF		;IS THIS CONTROLLER A?
	BRA IPWC.5		;NO, SO DONT DO TEMP ROUT

;             TEST NEW OPEN SENSOR ROUT FOR NEWBOARD HERE   **********************************************

 					      ;OPEN SENSOR DETECT 
	MOVLW 0x01
	CPFSEQ TEMPH,1
	BRA IPWC.4B1		;GO TEST FOR SHORTED, MSB WAS 0
	MOVLW D'245'
	CPFSLT TEMPL,1
	BRA IPWC.5		;TEMP SENSOR OPEN SO DON'T USE IT
	BRA IPWC.4B		;IN RANGE SO GO ON
IPWC.4B1
	MOVLW D'12'		;TEST FOR SHORT TO GROUND
	CPFSGT TEMPL,1
	BRA IPWC.5		;SHORTED SO SKIP IT
				;FALLS THROUGH TO 4B, DO IT

IPWC.4B
	MOVFF TEMPL,SCAL
	MOVFF TEMPH,SCAH
	
    MOVLW 4
	CALL SCALE
 ENDIF			;THERMISTOR TEMP SENSOR

IPWC.5				
;  IF (VDET==1)			;BAT VOLTAGE COMPENSATION IF EQUIPPED (REQUIRES V DIVIDER ON PIN 26 OF 6680 CHIP)
	BTFSS CAF			;ARE WE 'A' CONTROLLER?
	BRA IPWC.51			;SKIP IF NOT CONTROLLER A
	MOVFF VBATL,SCAL
	MOVFF VBATH,SCAH
   IF (ENG==0xA3)||(ENG==0xB0)  ;LESS COMP FOR BIG INJECTORS
   	MOVLW 3
   ELSE
    MOVLW 2
   ENDIF
	CALL SCALE
;  ENDIF
IPWC.51
	MOVFF SINL,IPWL		;SAVE IPW
	MOVFF SINH,IPWH

			;NEXT WE WILL SCALE IPW WITH ROTOR DIFFERENTIALS TO GET IPW COUNTS
			;UNLESS EEPROM BAD FLAG IS SET

 IF  ROTARY==0			;SKIP DIFFERENTIALS IF PISTON ENGINE
	MOVFF IPWL,IPW1L		;LOAD IPW 1 W/ IPWS IPW2 NOT USED?
	MOVFF IPWH,IPW1H
	MOVFF IPWL,IPW2L		;LOAD IPW 2 W/ IPWS IPW2 NOT USED
	MOVFF IPWH,IPW2H
	RETURN					;PISTON ENGINE DONE
	
 ELSE				;CALCULATE DIFFERENTIAL IPWS
	BCF STATUS,C,0
;  **** NEW NON STAGGED DIF FACTORS  **** 01-07-06
	BTFSC SFLAG		;ARE WE STAGGING?
	BRA IPWC.5A
	RLCF R1DIFA,0,1		;NON-STAGGING - ROTOR 1-2 DIFFERENTIAL
	BRA IPWC.5B
IPWC.5A		
	RLCF R1DIF,0,1		;STAGGING - ROTOR 1-2 DIFFERENTIAL
IPWC.5B	
;  **** END
	MOVWF SCAL,1		;MOVE R1 DIF TO SCALE FACTOR
	CLRF SCAH,1
	RLCF SCAH,1,1
	MOVLW 05		;SELECT 20% SCALE RANGE
	CALL SCALE
	MOVF SINL,0,1		;LOAD IPW1 W/ SCALED IPW
	MOVWF IPW1L,1
	MOVF SINH,0,1		;LOAD IPW 1 W/ SCALED IPW
	MOVWF IPW1H,1
	MOVF IPWL,0,1		;LOAD SINP W/ IPW
	MOVWF SINL,1
	MOVF IPWH,0,1
	MOVWF SINH,1
  IF (ENG==0xA3)||(ENG==0xB0)		;ONLY DO R2DIF ON 3 ROTOR ENGINE
;  **** NEW NON STAGGED DIF FACTORS  **** 01-07-06
	BTFSC SFLAG		;ARE WE STAGGING?
	BRA IPWC.5C
	RLCF R2DIFA,0,1		;NON-STAGGING - ROTOR 1-2 DIFFERENTIAL
	BRA IPWC.5D
IPWC.5C		
	RLCF R2DIF,0,1		;STAGGING - ROTOR 1-2 DIFFERENTIAL
IPWC.5D	
;  **** END
	MOVWF SCAL,1		;MOVE R2 DIF TO SCALE FACTOR
	CLRF SCAH,1
	RLCF SCAH,1
	MOVLW 05		;SELECT 20% SCALE RANGE
	CALL SCALE
	MOVFF SINL,IPW2L		;LOAD IPW2 WITH IPW OR W/ SCALED IPW (3 ROTOR ONLY)
	MOVFF SINH,IPW2H		;LOAD IPW 2 W/ SCALED IPW
  ELSE
	MOVFF IPWL,IPW2L		;LOAD IPW 2 W/ NON DIF IPW ON 2 ROTOR ENGINES
	MOVFF IPWH,IPW2H
  ENDIF					;END OF 20B 			
 ENDIF					;END OF ELSE ROTARY==0  (ROTARY =1)
IPWC.7
	RETURN

RPMLT					;GENERIC TEST FOR RPM (IN TPH&L) LESS THAN CONSTANT PRELOADED IN AARGH&L.  RETURNS CY SET IF RPM TPH&L < RPM IN AARGH&L, CLR IF FALSE
	MOVF AARGH,0,1
	CPFSGT TPH,1
	BRA RPMLT.A			;TEST FOR MSB =
	BRA RPMLT.X			;RPM WAS LT SO EXIT W/ CY SET
RPMLT.A
	CPFSEQ TPH,1		;MSB EQ?
	BRA RPMNLT			;BRA RPM NOT LT (IT WAS >)
	MOVF AARGL,0,1		;GET LSB
	CPFSGT TPL,1
	BRA RPMNLT			;NOT LT SO EXIT FALSE
RPMLT.X
	BSF _C				;SET CY FOR RPM < AARGH&L TARGET
	RETURN
RPMNLT
	BCF _C				;CLR CY FOR RPM NOT LT
	RETURN

SCALE	;     22 MICROSECONDS

	;SCALES VALUE IN SINL & SINH BY RANGE IN WREG AND FACTOR IN SCAL &H SCALED VALUE 
	;IS RETURNED IN SINL AND SINH.   RANGE 1 = 100% 2 = 50% 3 = 33% 4 = 25% 5 = 20%

	MOVWF BARGL,1		;LOAD SCALE RANGE TO BARG
	CLRF BARGH,1
	MOVF SINL,0,1		;DIVIDE INPUT VALUE BY RANGE
	MOVWF AARGL,1
	MOVF SINH,0,1
	MOVWF AARGH,1
	CALL DIV
S.0
	MOVF AARGL,0,1
	MOVWF DMAXL,1		;SAVE DELTA MAX
	MOVF AARGH,0,1
	MOVWF DMAXH,1
	MOVF SCAL,0,1		;LOAD BARG W/ SCALE FACTOR
	MOVWF BARGL,1
	MOVF SCAH,0,1
	MOVWF BARGH,1
	CALL MULT		;MULTIPLY TO GIVE FACTORED DELTA
			;RES2 & RES1 NOW CONTAIN FACTORED DELTA / 256
			;SUBTRACT DMAX FROM FACTORED DELTA TO GIVE FINAL DELTA
S.1
	MOVF DMAXL,0,1
	SUBWF RES1,0,1
	MOVWF DELTAL,1	;SAVE DELTA
	MOVF DMAXH,0,1
	SUBWFB RES2,0,1
	MOVWF DELTAH,1
	BTFSC STATUS,C,0	;IF CY CLEAR WE NEED TO SUBTRACT DELTA FROM SIN
	BRA SCALE.1		;CY SET (NO BORROW) SO GO ADD DELTA TO INPUT VAL
	COMF DELTAH,1,1
	MOVF DELTAL,0,1	;MAKE 2s COMPLEMENT  (WHY DID WE DO THIS?) GOOD REASON
	NEGF WREG,0
	MOVWF DELTAL,1
	BTFSC STATUS,C,0		;TEST FOR CY    
	INCF DELTAH,1,1		;INC IF CY
	SUBWF SINL,1,1		;SUBTRACT FROM INPUT LSB
	MOVF DELTAH,0,1
	SUBWFB SINH,1,1		;SUB FROM INPUT MSB
S.3
	RETURN 			;SINL&H HAS SCALED INPUT
SCALE.1
	MOVF DELTAL,0,1	;ADD DELTA TO SIN
	ADDWF SINL,1,1
	MOVF DELTAH,0,1
	ADDWFC SINH,1,1
S.2
	RETURN			;RETURN WITH SCALED INPUT IN SINL&H

MATH				; Math assumes TPL & TPH are NOT complemented
	
 IF ENG==0xB3	;B3 ENG HAS 90 DEG T2 INTERVAL SO WE HAVE TO DIV BY 3 AND CALCULATE VARIOUS OTHER THINGS HERE INSTEAD OF IN T2
 	MOVFF TPLTEMP,AARGL			;DIVIDE 90 DEG COUNT IN TEMP REGS BY 3 TO GET 30 DEG COUNT
 	MOVFF TPHTEMP,AARGH
  IF TBINJ==1
  	MOVLW D'6'					;THIS IS FOR 4 CYL ENG, 180 DEG PER INTERVAL
  ELSE
 	MOVLW D'3'					;V8 ONLY, 90 DEG INTERVAL
  ENDIF	
 	MOVWF BARGL
 	CALL DIV
 	BCF _C
 	MOVFF AARGL,TPL		;MOVE 30 DEG COUNT TO TPL&H
	MOVFF AARGH,TPH
MATH.0
 ENDIF			;END OF 0xB3 PRE-PROCESSING
 
	BCF MF			;CLEAR THE MATH FLAG
 IF (ENG==0xA7 && A72007==0)  ;EARLY A7 IS ACTUALLY A 32 DEG INTERVAL INSTEAD OF 30.  THIS COMPENSATES FOR THIS BY SUBTRACTING 1/16TH (2 DEG)
	MOVF TPL,0,1
	ANDLW 0xF0
	MOVWF AARGL
	BCF _C
	RRCF TPH,0,1
	MOVWF AARGH
	RRCF AARGL,1,1
	RRCF AARGH,1,1
	RRCF AARGL,1,1
	RRCF AARGH,1,1
	RRCF AARGL,1,1
	RRCF AARGH,1,1
	RRCF AARGL,0,1
	SUBWF TPL,1,1
	MOVF AARGH,0,1
	SUBWFB TPH,1,1
 ENDIF

			; ******* REV LIMITER ADDITION    **************
	MOVLW LOW RLIMIT	;COMPARE REV LIMIT TO TPH&L
	SUBWF TPL,0,1	
	MOVLW HIGH RLIMIT
	SUBWFB TPH,0,1
	BTFSS _C			;BORROW = CY CLEAR,  IF SET, MEANS RPM OK SO DON'T SET REV FLAG 
	BSF REVF			;SET REV FLAG
	BTFSC _C			;CLEAR IT IF NO BORROW (CY SET)
	BCF REVF
		;  ************  END OF REV LIMIT TEST

 IF (ENG==0xAF)			;TPH&L ALREADY DIVIDED BY 4 TO GIVE 30 DEG ON V6 DIST) (DIV BY 3 ON EAGLE540, 90 DEG V8)
	BRA MATH.B			;NO NEED OF X2 ON V6 DIST ENG
 ENDIF
	BCF _C
	RLCF TPL,0,1		;X2 T2 FOR SOME ENGINES
	MOVWF TX2L,1		;STORE t2*2 interval LOW byte
	RLCF TPH,0,1
	BTFSS _C		;GO ON IF NO CY
	BRA MATH.A
	SETF TX2L,1		;SET TO MAX IF OVF
	SETF TX2H,1	
	BRA MATH.B
MATH.A
	MOVWF TX2H,1		;STORE X 2 VALUE FOR DWELL CALC
MATH.B
	MOVF TPH,0,1
	movwf T8H,1		;load /8 w/ t2 interval
	movf TPL,0,1		;get t2 low byte
	movwf T8L,1		;ld /8 w/ t2 lsb
	bcf STATUS,C,0		;clr cy flag
	rrcf T8H,1,1		;/ t2 by 2 & ld f
	MOVF T8H,0,1		;MOVE IT TO WREG TOO
	movwf T2H,1		;load t2/2 hi byte
	rrcf T8L,1,1		;rotate low byte rt & ld wreg
	MOVF T8L,0,1
	movwf T2L,1		;set t2/2 low byte
	bcf STATUS,C,0		;clr cy
	rrcf T8H,1,1		;div by 2 again to t2/4
	MOVF T8H,0,1
	movwf T4H,1		;ld t4 high byte
	rrcf T8L,1,1		;do it to low byte too
	MOVF T8L,0,1
	movwf T4L,1
	bcf STATUS,C,0		;clr cy
	rrcf T8H,1,1		;final rotate for /8
	rrcf T8L,1,1
	bcf STATUS,C,0		;ADDED FOR VARIABLE TIMING 
	RRCF T8H,0,1	
	MOVWF T16H,1		
	RRCF T8L,0,1
	MOVWF T16L,1		;T16 HAS 1.875 DEG COUNT
  
	; RENESIS, 2ND & 3RD GEN & 60-2 SENSOR EQUIPPED ENGINES SPDC ROUT 
	;  This is a continuous advance scheme similar to centrifugal advance
		;proceedure is as follows:
	;calc 1 degree count tpL&H / 30 = 1 deg count
	;1 deg @1000 rpm =  171.8 @ 1.031mhz
	;1 deg @ 5000 = 34  (USE A LOWER NUMBER FOR RPM IF WANTING FULL ADVANCE AT LOWER RPM.)
	;171-34=137  one degree delta (BETWEEN 1 DEG AT  (result of calc @1000 rpm)
	;137 / 9 = 15   (total amount in deg of cent retard)  USE LOWER DIVISER FOR MORE ADVANCE RANGE
	;34-34=0	(result of this calc at 5000 rpm)
	;0 / 9 = 0	degrees to retard at 5000
	;05-24-04  RECURVED PISTON ENGINE ADVANCE CURVES TO GIVE MAX ADVANCE AT 3400
SPDC					;SPDC ALL
	MOVFF TPL,AARGL		;CALCULATE 1 DEGREE COUNT AT CURRENT ENGINE SPEED
	MOVFF TPH,AARGH
	MOVLW D'30'		;DIVIDE 30 DEG CNT TO GET 1 DEG
	MOVWF BARGL,1
	CLRF BARGH,1
	CALL DIV
	MOVFF AARGL,WORKL	;1 DEG CNT AT CURRENT RPM IN AARG,  SAVE 1 DEG COUNT IN WORKH&L  (WAS SCAH&L) 
	MOVFF AARGH,WORKH  	;THIS IS FOR VAC ADV & MANUAL ADVANCE ROUT
 IF ENG==0xAF
		CLRF RES0,1			;CLEAR ANY RPM ADVANCE
		CLRF RES1,1
		BRA SDC.B			;RPM ADVANCE IS HANDLED BY MECHANICAL CENTRIFUGAL IN DIST V6
 ENDIF

;  *******  NEW TABLE DRIVEN RPM RETARD ROUT    **************  USED WITH ALL ENGINES AFTER 03-11-07

;            AARGH&L NOW CONTAINS 1 DEG COUNT AT CURRENT RPM
 	
 	MOVLW HIGH ONEDEGL	;GET MSB OF LOW RPM THRESHOLD (ONE DEG COUNT)
 	CPFSLT AARGH,1
 	BRA SPDC.Y			;AARGH WAS >= SO TEST FURTHER	
 	BRA SPDC.Z			;AARGH WAS < MIN RPM ADV POINT  RPM > LOW RPM ADV THRESH SO GO COMPUTE PROPER ADVANCE 
SPDC.Y
 	CPFSEQ AARGH,1		;MSB EQUAL? GO TEST LSB IF YES.
 	BRA SPDC.A			;MSB WAS > THRESH (ENG SLOW) SO GO COMPUTE FIXED ADVANCE (ADV BETWEEN LSF POINT & RPM ADVANCE)
	MOVLW LOW ONEDEGL 	;1 DEG COUNT +1 FOR ENGINE AT RPM ADVANCE THRESHOLD)
	CPFSLT AARGL,1	;TEST LSB FOR THRESH
	BRA SPDC.A		;TOO LOW RPM SO GO LOAD MAX DELAY & CONTINUE
					;RPM WAS > RPM ADV THRESHOLD, SUBTRACT MAX RPM ADVANCE THRESHOLD TPH COUNT FROM CURRENT TPH
					
SPDC.Z				;COMPUTE SPARK DELAY  (Note!  we can only delay with this routine, not advance more that the trigger - basic ;											delay allows.  If more rpm advance is wanted, basic delay must be changed.
	MOVLW LOW HTPH		;HIGH RPM THRESHOLD (RPM AT MAX ADVANCE POINT)
	SUBWF TPL,0,1	;SUB FROM CURRENT TPH&L
	MOVWF AARGL,1	;SAVE IN AARG
	MOVLW HIGH HTPH		;
	SUBWFB TPH,0,1
	MOVWF AARGH,1		;TPH - MAX ADV RPM TPH -> AARG
	BTFSS _C		;DID WE HAVE BORROW?  (RPM > MAX ADV POINT?)
	BRA SPDC.B		;RPM>MAX SO SET MAX RPM ADVANCE & GO ON
 IF RPMCONST > 0x7F	;IF RPMCONST IS > 7 bit VAL, use div1615 instead of div (1607)		
	MOVLW LOW RPMCONST	;COMPUTED CONSTANT (LOW RPM THRESHOLD TPH&L / MAX RPM ADVANCE AMOUNT  IN DEG)
	MOVWF BARGL,1
  	MOVLW HIGH RPMCONST
  	MOVWF BARGH,1
  	CALL DIV1615	;TPH - MAX ADV RPM TPH / RPMCONST ->  AARGH&L  (RESULT = # OF DEGREES FOR SPARK DELAY
  	BRA SDC.A2		;GO CALC DELAY COUNT  (#DEG * ONE DEG COUNT @ CURRENT SPEED)
 ELSE
  	MOVLW LOW RPMCONST
  	MOVWF BARGL,1	
	CALL DIV		;COMPUTE DEGREES OF DELAY AT CURRENT RPM  IN AARGL
	BRA SDC.A2
 ENDIF
  
SPDC.A				;COMPUTE MAX DELAY FOR RPM ADVANCE  (MOST RETARDED CONDITION)
	MOVLW RPMADV   	;MAX RPM ADV IN DEGREES (TOTAL RPM ADVANCE RANGE)
	MOVWF AARGL,1	;MOVE TO EXPECTED REG
	CLRF AARGH,1
	BRA SDC.A2		;GO COMPUTE RPM DELAY

SPDC.B				;SET 0 DEG DELAY (MAX ADVANCE) & CONTINUE
	CLRF AARGL,1	
	CLRF AARGH,1
			;END OF NEW AUTOMATED RPM ADVANCE CALCULATION
 
SDC.A2				;AARG CONTAINS # OF DEGREES TO RETARD SPARK AT THIS POINT

	MOVFF WORKH,BARGH		;PUT 1 DEG COUNT (AT current rpm)IN BARG
	MOVFF WORKL,BARGL
	CALL MULT		;MULTIPLY # DEG TO RETARD * COUNT/DEG AT CURRENT RPM (RPM DELAY COUNT NOW IN RES0&1)
 
; *****************   END OF RPM ADVANCE ROUT   ********************************

SDC.B				;ADD BASIC DELAY VALUE  (T2 TRIG TO MAX RPM ADVANCE) TMR0 COUNT TO MAX ADV.
 IF (ENG==0xA8)||(ENG==0xB0)	;RENESIS RX8 OR 20B W/ RENESIS CAS (dwell loaded at 40 deg BTDC)
  	BTFSS BUSIN
  	BRA SDC.BA
  	MOVF T2L,0,1		;  A8 BUSIN GET 3.5 ADD TO AARGH&L (computed delay for rpm)  2-23-13
	ADDWF T8L,0,1					;WAS 		(T2 + T4) = 18.5 DEG 45- 18.5  = 26.5
	MOVWF AARGL,1
	MOVF T2H,0,1
	ADDWFC T8H,0,1
	MOVWF AARGH,1
	BRA SDC.BB
SDC.BA  	
	MOVFF T2L,AARGL				;15 DEG   40 - 15 = 25 MAX RPM DEG BTDC
	MOVFF T2H,AARGH
SDC.BB
 ENDIF

 IF (ENG < 0xA5)	  ;(2ND GEN ROTARY ENGINES INCLUDING 20B )  SPARK TIMING GETS LOADED AT 50 (OR 48 ON 60-2 TYPES 0xA4 ) DEG BTDC
						;ADDED BREW FLAG 5-9-06. 13BREW IS TRIGGERED 5 DEGREES EARLIER SO DEFAULT TIMING IS 25 DEG BTDC
	MOVF T2L,0,1		;GET 24.375 DEG & ADD TO AARGH&L (computed delay for rpm)  (T2 + T4 + T16) = 25.625 DEG BTDC
	ADDWF T4L,0,1		;
	MOVWF AARGL,1
	MOVF T2H,0,1
	ADDWFC T4H,0,1
	MOVWF AARGH,1
  IF BREW==1
		MOVF T4L,0,1
  ELSE
		MOVF T16L,0,1
  ENDIF
	ADDWF AARGL,1,1
  IF BREW==1
		MOVF T4H,0,1
  ELSE
		MOVF T16H,0,1
  ENDIF
	ADDWFC AARGH,1,1
 ENDIF					;END OF ENG < A5

 IF (ENG==0xA6)||(ENG==0xA9)||(ENG==0xB2)  ;SPARK TIMING GETS LOADED AT 42 DEG BTDC  NOW LOAD 13.125 DEG DELAY FOR A BASIC TIMING OF 33 DEG BTDC    ******  changing to 42 deg load time 09-01-10  
  IF (ENG==0xA9 && (CONT==1))		;CONT O - 200 ENGINE 27 DEG FULL RPM ADVANCE OR EA81 TURBO
	MOVFF T2L,AARGL		;GET 15 DEG  TO AARGH&L (computed delay for rpm)  2-08-06
	MOVFF T2H,AARGH

  ELSE		
	MOVF T4L,0,1		;  A9 EA81 GET 11.25 ADD TO AARGH&L (computed delay for rpm)  7-25-04
	ADDWF T16L,0,1					;WAS 		(T4 + T16) = 9.375 DEG 42- 9.375  = (NOW 32.625 DEG)
	MOVWF AARGL,1
	MOVF T4H,0,1
	ADDWFC T16H,0,1
	MOVWF AARGH,1
  ENDIF				;END OF A9 
 ENDIF			;END OF A9 ENGINE / cont

 IF (ENG==0xAF)  ;SPARK TIMING GETS LOADED AT 42 DEG BTDC  NOW LOAD 9.375 DEG DELAY FOR A BASIC TIMING OF 32.625 DEG BTDC
	MOVF T4L,0,1		;GET 7.5 DEG + 1.875  TO AARGH&L (computed delay for rpm)  7-25-04
	ADDWF T16L,0,1
	MOVWF AARGL,1			;		(T4 + T16 ) = 9.375 DEG (42 - 9.375 = 32.625  
	MOVF T4H,0,1			; FOR DIST V6 (0xAF), THERE IS NO RPM ADVANCE, SPARK DELAY LOADED 20 DEG BTDC BY DISTRIBUTOR
	ADDWFC T16H,0,1			; THIS 9.375 DEG DELAY GIVES US AN INITIAL TIMING OF 11.625 DEG BTDC. THIS GIVES ROOM FOR 
	MOVWF AARGH,1			;MANIFOLD PRESSURE ADVANCE.
 ENDIF

 IF (ENG==0xB5)  ;SPARK TIMING GETS LOADED AT 42 DEG BTDC  NOW LOAD 11.25 DEG DELAY FOR A BASIC TIMING OF 30.75 DEG BTDC
	MOVF T4L,0,1		;GET 7.5 DEG + 3.75  TO AARGH&L (computed delay for rpm)  7-25-04
	ADDWF T8L,0,1
	MOVWF AARGL,1			;		(T4 + T8 ) = 11.25 DEG (42 - 11.25 = 30.75  
	MOVF T4H,0,1			; 		
	ADDWFC T8H,0,1			; 
	MOVWF AARGH,1			;
 ENDIF
 
 IF (ENG==0xAB)		;LS1
 	MOVF T2L,0,1		; 15 + 7.5 =  22.5 TO AARGH&L			;ON JASON DAY'S INSTRUCTION WE MADE LS1 SAME AS LS2.
	ADDWF T4L,0,1		
	MOVWF AARGL,1			;		(T2 + T4 ) = 22.5 DEG (48 - 22.5 = 25.5 DEG TOTAL ADVANCE
	MOVF T2H,0,1			;
	ADDWFC T4H,0,1			;
	MOVWF AARGH,1			;
 ENDIF
 
 IF ENG==0xB1				;LS-2 ENGINE   02-20-13
 	MOVF T2L,0,1		; 15 + 7.5 =  22.5 TO AARGH&L
	ADDWF T4L,0,1		
	MOVWF AARGL,1			;		(T2 + T4 ) = 22.5 DEG (42 - 22.5 = 19.5 DEG TOTAL ADVANCE
	MOVF T2H,0,1			;
	ADDWFC T4H,0,1			;
	MOVWF AARGH,1			;
 ENDIF
 
 IF (ENG==0xAE)  ;SPARK TIMING GETS LOADED AT 40 DEG BTDC  NOW LOAD 1.85 DEG DELAY FOR A BASIC TIMING OF 32.5 DEG BTDC
	MOVF T4L,0,1		;GET 1.875 DEG   TO AARGH&L (computed delay for rpm)  01-18-12
	MOVWF AARGL,1
	MOVF T4H,0,1
	MOVWF AARGH,1
 ENDIF

  IF (ENG==0xAC)	;HEXADYNE OR EJ25 W/ 60 DEG BTDC LOAD TIME   (60-33.75 = 26.25 BTDC BASIC TIMING)
	MOVF TPL,0,1		;GET ~35 (33.75) DEG & ADD TO AARGH&L (computed delay for rpm)  (TP + T8) = 26.25 BTDC
	ADDWF T8L,0,1
	MOVWF AARGL,1
	MOVF TPH,0,1
	ADDWFC T8H,0,1
	MOVWF AARGH,1
  ENDIF

  IF (ENG==0xA5)	;HEXADYNE W/ 60 DEG BTDC LOAD TIME   (60-30 = 30.00 BTDC BASIC TIMING)
	MOVFF TPL,AARGL		;GET 30 DEG & ADD TO AARGH&L (computed delay for rpm)  (TP + T8) = 30.00 BTDC
	MOVFF TPH,AARGH
  ENDIF

  IF (ENG==0xA7)			;EJ22  55 DEG BTDC LOAD TIME  (65 BTDC  05-12-11)
   IF  (A72007==0)
	MOVF TPL,0,1		;GET ~31.875  DEG & ADD TO AARGH&L (computed delay @ rpm) GIVES MAX 33 BTDC + VAC ADV +- MODE 8
	ADDWF T16L,0,1		;changed to 22.5 deg in responce to J Findley data showing 55 deg load time instead of 65
						;05-12-11 Ron @ Ram performance reports too much advance  65 BTDC MUST BE THE CORRECT NUMBER
	MOVWF AARGL,1
	MOVF TPH,0,1
	ADDWFC T16H,0,1
 	MOVWF AARGH,1
 	BTFSS _C
 	BRA A7.NOF			;NO OVF SO GO ON
 	SETF AARGL,1
 	SETF AARGH,1		;SET MAX IF OVF
  	
;	MOVF T2L,0,1		;GET ~33.75  DEG & ADD TO AARGH&L (computed delay @ rpm) GIVES MAX 32 BTDC + VAC ADV +- MODE 8
;	ADDWF T4L,0,1		;changed to 22.5 deg in responce to J Findley data showing 55 deg load time instead of 65
						;05-12-11 Ron @ Ram performance reports too much advance
;	MOVWF AARGL,1
;	MOVF T2H,0,1
;	ADDWFC T4H,0,1
 ;	MOVWF AARGH,1
 ;	BTFSS _C
 ;	BRA A7.NOF			;NO OVF SO GO ON
 ;	SETF AARGL,1
 ;	SETF AARGH,1		;SET MAX IF OVF

   ELSE				;2005 & later EJ-25 engines  A72007 = 1 
    MOVF T4L,0,1		;GET 9.375  DEG & ADD TO AARGH&L (computed delay @ rpm) GIVES MAX 31.625 BTDC + VAC ADV +- MODE 8
	ADDWF T16L,0,1		;TMR0 LOAD TIME IS 40  BTDC
	MOVWF AARGL,1
	MOVF T4H,0,1
	ADDWFC T16H,0,1
 	MOVWF AARGH,1
 	BTFSS _C
 	BRA A7.NOF			;NO OVF SO GO ON
 	SETF AARGL,1
 	SETF AARGH,1		;SET MAX IF OVF 
   ENDIF
A7.NOF   
  ENDIF

  IF (ENG==0xAA)		;FORD V6 SPARK TIMING GETS LOADED AT 50 DEG BTDC
	MOVF T2L,0,1		;GET  18.75 DEG & ADD TO AARGH&L (computed delay for rpm)  (T2 + T8) GIVES 31.25 BTDC
	ADDWF T8L,0,1
	MOVWF AARGL,1
	MOVF T2H,0,1
	ADDWFC T8H,0,1
	MOVWF AARGH,1
  ENDIF
  
  IF ENG==0xAD	;SUZUKI 31.25 DEG  LOADED TM0 @ 35 DEG BTDC    NEW SCHEME.
	MOVFF T8L,AARGL		;GET 3.75 DEG & ADD TO AARGH&L (computed delay for rpm)  (T4) 4-2-05  CHANGED TO SOONER LD SPDL
	MOVFF T8H,AARGH
  ENDIF					;END OF BASIC SPARK DELAY LOAD TO AARG (TIMER LOAD TO MAX RPM ADVANCE TIME)
 

  IF (ENG==0xB3)		;B3 LOADED AT(A) 42 (B) 48 DEG BTDC     MAKE  ~36 DEG BTDC MAX SPARK TIME)  THIS IS A TURBO ENGINE.
   	BTFSS CAF			;CONTROLLER B IS 6 DEG ADVANCED COMPARED TO A
   	BRA SDC.BAS			;GO SETUP FOR B BASIC DELAY			
	MOVFF T4L,AARGL		;7.5 DEG 
   	MOVFF T4H,AARGH
	BRA SDC.B0
	
SDC.BAS						;BASIC TIMING FOR b CONTROLLER (~6 DEG MORE ADVANCED) 
	MOVF T4L,0,1		;GET  7.5 + 3.75  TO AARGH&L (computed delay for rpm)  2-08-06
	ADDWF T8L,0,1
	MOVWF AARGL,1		;(T4 + T8 ) = 11.25 DEG (48 - 11.25 = 36.75 DEG  
	MOVF T4H,0,1
	ADDWFC T8H,0,1
	MOVWF AARGH,1
  ENDIF
 
  IF ENG==0xB4			;HONDA V6  60 DEG BTDC LOAD TIME
  	MOVFF TPL,AARGL		;MAX RPM ADV TO 30 DEG btdc 
  	MOVFF TPH,AARGH
  	BTFSC CAF			;THIS MAKES UP FOR 7.5 DEGREES OF THE 22.5 DEG RETARDED POSITION OF BACKUP SENSOR
  	BRA SDC.B0			;SKIP THE B ADJUST ON A
  	MOVF T4L,0,1		;SUBTRACT 7.5 DEG FROM BASIC DELAY IF WE ARE B  THE OTHER 15 DEG DELTA IS COMP FOR IN TP2 ROUT
  	SUBWF AARGL,1,1
  	MOVF T4H,0,1
  	SUBWFB AARGH,1,1
  ENDIF
  
SDC.B0		
	MOVF RES0,0,1		;GET RPM COMPUTED DELAY FROM RES0&1 & ADD TO BASIC RETARD (15 DEG) (40 DEG - 15 = 25 DEG ADV (0xA8)
	ADDWF AARGL,0,1			;add rpm delay (IN RES0 & RES1) to BASIC delay (IN AARG) 
	MOVWF SDL,1		;SAVE BASIC DELAY IN SDL&H
	MOVF RES1,0,1
	ADDWFC AARGH,0,1		
	MOVWF SDH,1		;SDH&L NOW CONTAIN BASIC SPARK DELAY  (COUNTER PRELOAD VALUE)
	BTFSS _C
	BRA SDC.B2
	SETF SDL,1			;SET MAX DELAY IF OVF   WAS CLRF  05-05-08
	SETF SDH,1

SDC.B2					;VACUUM ADVANCE/RETARD ROUTINE  (ADJUST THE VALUE IN SDH&L) WORKH&L = ONE DEG AT CURRENT RPM
 
 IF ENG==0xB3		;ENGINES USING 312.5 KHZ TMR0 CLOCK
 
 	MOVLW HIGH MAPRPMSTR	;TEST FOR RPM  > START OF MAP ADV RPM THRESHOLDMSB CONST	< CONSTANT
 	CPFSLT TPH,1		;COMPARE TO MSB VAR
 	BRA	SDC.CEQ				;MSB NOT LT SO CK FOR EQ
 	BRA SDC.B2A			;.VLT TRUE EXIT, VAR IS LT CONSTANT  .B2A
SDC.CEQ 	
 	CPFSEQ TPH,1		;COMP VAR MSB FOR = CONST MSB
 	BRA SDC.VB  ;.NLT				;FALSE EXIT, VAR !LT CONST   .VB
 	MOVLW LOW MAPRPMSTR 			;LOAD LSB CONSTANT
 	CPFSLT TPL,1			;COMPARE LSB CONST TO LSB VAR
 	BRA SDC.VB	;.NLT				;FALSE EXIT VAR !LT CONST
 	BRA SDC.B2A		;.VLT				;TRUE EXIT, VAR LT CONSTANT
 	
 ELSE				;OTHER THAN B3 ENGINES

 	MOVLW HIGH MAPRPMSTR	;TEST FOR RPM > START OF MAP ADV RPM THRESHOLD (TPH&L < CONSTANT)
 	CPFSLT TPH,1			;COMPUTE MP ADVANCE IF RPM > MAP ADV START RPM  (LSF POINT)
 	BRA SDC.VB				;RPM TOO LOW SO GO DO MANUAL TIMING ADJUST  (TPH !< CONSTANT)
 ENDIF
SDC.B2A
	MOVLW HIGH MAPADVSTR	;IS MAP > START MAP (TYPICAL 24" Hg) ? 
	CPFSGT MAPH,1
	BRA SDC.B3			;MSB NOT HIGHER, GO ON
	BRA SDC.B9			;IS TOO HIGH SO TEST FOR RETARD FOR BOOST
SDC.B3
	CPFSEQ MAPH,1		;IS IT EQ?
	BRA SDC.B4			;NO, IT IS LT SO GO CK FOR LOWER LIM					
	MOVLW LOW MAPADVSTR	;TEST FOR LSB MAP < LSB MAPADVEND  (LOW END, MAX ADV)
	CPFSGT MAPL,1
	BRA SDC.B4			;NOT LOWER SO GO CK 
	BRA SDC.B9			;IS > MAPADVSTR SO TEST FOR RETARD ON BOOST
	
SDC.B4					;   MAP ADVANCE ROUTINE    TEST FOR MAP < MAX MAP ADV POINT (10" TYP)
	MOVLW HIGH MAPADVEND	;
	CPFSLT MAPH,1
	BRA SDC.B4A			;MAP MSB NOT <, GO TEST FOR EQ
	BRA SDC.B4X			;MSB IS LESS SO SO SET MAX MAP ADV
SDC.B4A
	CPFSEQ MAPH,1		;IS IT EQ?
	BRA SDC.B5			;NO, IT IS GT SO GO DO CALC
SDC.B4C					
	MOVLW LOW MAPADVEND	;TEST FOR LSB MAP < LSB MAPADVEND  (LOW END, MAX ADV)
	CPFSLT MAPL,1
	BRA SDC.B5			;NOT LOWER SO GO CALC MAP ADV
SDC.B4X
	MOVLW LOW MAPADV	;MAP AT MINIMUM, GET MAX MAP ADVANCE DEGREES IN AARG
	MOVWF AARGL,1
	CLRF AARGH,1
	BRA SDC.B6			;GO COMPUTE COUNT FOR  MAX MAP ADV DEG * ONE DEG COUNT
SDC.B5
	MOVLW LOW MAPADVSTR		;CALC MAP ADV BASED ON CURRENT MAP	
	MOVWF AARGL,1
	MOVLW HIGH MAPADVSTR
	MOVWF AARGH,1
	MOVF MAPL,0,1
	SUBWF AARGL,1,1
	MOVF MAPH,0,1
	SUBWFB AARGH,1,1		;MAP DELTA NOW IN AARG
	MOVLW LOW MAPCONST		;DIVIDE MAP DELTA BY MAPCONST TO GET MAP ADV/RETARD
	MOVWF BARGL,1
	CALL DIV	
SDC.B6						;ALL ENGINES CHECKED FOR MAP ADV CUT					
	MOVFF WORKL,BARGL		;GET 1 DEG COUNT AT CURRENT RPM & MOVE TO BAARG  (compute vac advance)
	MOVFF WORKH,BARGH		;AARG CONTAINS # DEGREES FOR MAP ADV/RETARD
	CALL MULT			;COMPUTE VAC ADVANCE  (SPDC VALUE)
	
	
;	TRUE = SDC.B6B
;	FALSE = SDC.B6A
	
	MOVLW HIGH FULLMAPSTR			;LOAD MSB CONSTANT   LOOK FOR VAR < CONSTANT 
 	CPFSGT TPH,1		;COMPARE TO MSB VAR
 	BRA	SDC.BCEQ				;MSB NOT LT SO CK FOR EQ
 	BRA SDC.B6B				;TRUE EXIT, VAR IS GT CONSTANT
SDC.BCEQ
 	CPFSEQ TPH,1		;COMP VAR MSB FOR = CONST MSB
 	BRA SDC.B6A				;FALSE EXIT, VAR !GT CONST
 	MOVLW LOW FULLMAPSTR			;LOAD LSB CONSTANT
 	CPFSGT TPL,1			;COMPARE LSB CONST TO LSB VAR
 	BRA SDC.B6A				;FALSE EXIT VAR !GT CONST
SDC.B6B			;NO ADVANCE BELOW FULMAPSTR
  	BRA SDC.VB
  
;	BCF _C					;rpm <= fullmapstr, reduce map advance by 50%  NO LONGER USED
;	RRCF RES1,1,1			;DIVIDE BY 2 IF RPM BELOW FULLMAPSTR RPM
;	RRCF RES0,1,1
SDC.B6A	
	MOVF RES0,0,1	;GET VAC ADV LSB AND SUBTRACT FROM SDL&H
	SUBWF SDL,1,1
	MOVF RES1,0,1
	SUBWFB SDH,1,1		;SDH&L NOW CONTAINS RPM SPARK DELAY ADJUSTED W/ VAC ADVANCE
	BTFSC _C		;TEST FOR OVF
	BRA SDC.VB		;PROCEED, NO OVF
	MOVLW D'28'		;HAD OVF, SET 1 DEG DELAY (AT 6000) 
	MOVWF SDL,1
	CLRF SDH,1
	BRA SDC.VB		;MAP ADJ COMPLETE, GO DO MANUAL ADJUST

SDC.B9				;MAP > MAPADVSTR, CHECK FOR BOOST RETARD
	MOVFF MAPL,AARGL
	MOVFF MAPH,AARGH
	MOVLW D'126'	;ADC @ 30"  MAP = 382
	SUBWF AARGL,1,1
	MOVLW 1			
	SUBWFB AARGH,1,1
	BTFSS _C		;TEST FOR UNDERFLOW (MAP TOO LOW FOR TURBO RETARD)	
	BRA SDC.VB		;HAD BORROW SO SKIP TURBO RETARD & GO CK FOR MAN TIMING ADJUST
	MOVLW D'88'		;TEST FOR BOOST OVER 55"  (SUB 344 FROM MAP - 382 (30" COUNT)
	SUBWF AARGL,0,1
	MOVLW D'1'			;SUBTRACTING EQUIV OF 55" hG FROM MAP iF NO BORROW, IT MEANS MAP > 55"
	SUBWFB AARGH,0,1
	BTFSS _C		; IF NO BORROW (MAP > 55"), USE BIG RETARD INSTEAD OF BFACTOR
	BRA SDC.B10				
	MOVLW D'16'     ;USE MORE AGRESSIVE RETARD ABOBE 55" HG
	BRA SDC.B10A
SDC.B10
	MOVLW BFACTOR			;NO BORROW   CALC TURBO RETARD DIVIDE (MAP - MAP @30") BY BOOST FACTOR TO GET # OF DEGREES TO RETARD
SDC.B10A					;the smaller BFACTOR is, the more turbo retard there will be.  (default is 25)
	MOVWF BARGL,1			;ADDED THIS 10-31-06
	CALL DIV			;AARGL&H = # DEG TO RETARD
	MOVFF WORKL,BARGL	;MOVE 1 DEG COUNT TO BARG   WORKL HAVE SDL VALUE?  
	MOVFF WORKH,BARGH
	CALL MULT		;DEG TO RETARD * 1 DEG AT CURRENT SPEED = DELAY COUNT IN RES0&1
	TSTFSZ RES2,1		;TEST FOR >16 BITS
	CALL SDC.B9A			;HANDLE OVF IF YES
	MOVF RES0,0,1		;GET RPM COMPUTED DELAY FROM RES0&1 & ADD TO BASIC RETARD (9.375 DEG) (35 DEG - 9.375 = 25.625 DEG ADV)
	ADDWF SDL,1,1			;add boost retard to fixed delay
	MOVF RES1,0,1
	ADDWFC SDH,1,1		;SPDH&L NOW CONTAIN BASIC SPARK DELAY
	BTFSC _C			;TEST FOR OVF
	CALL SDC.B9B		;SET MAX SDL&H
	BRA SDC.VB			;MOVE ON
		
SDC.B9A			;HANDLE MULT OVF
	SETF RES0,1		;SET MAX FOR OVF  
	SETF RES1,1
	RETURN
SDC.B9B
	SETF SDL,1
	SETF SDH,1
	RETURN
; 						;END OF NEW MAP ADV/RET

SDC.VB
	CALL SDC.ADJ		;DO MANUAL TIMING ADJUST IF SET
  IF ENG==0xB3
  	BCF _C				;X4 FOR 1/4 CLOCK SPEED ON TMR0 VS TMR3  
  	RLCF SDL,1,1
  	RLCF SDH,1,1
  	BCF _C
  	RLCF SDL,1,1
  	RLCF SDH,1,1
  ENDIF	
	COMF SDL,1,1		;COMPLEMENT FOR TIMER VALUE
	COMF SDH,1,1
	BRA CD			;END OF SPDC,   GO COMPUTE DWELL

			; CODE FOR INFLIGHT  ADJUSTABLE TIMING     (CHANGED STEP TO 1 DEG INSTEAD OF 1.875  08-05-06
SDC.ADJ				;THIS IS WHERE WE ADD OR SUBTRACT ADJUSTABLE TIMING 
	TSTFSZ IGNADJ,1		;ANY MANUAL TIMING ADJUSTMENT? (NOT 0)
	BRA SDC.C0		;NOT 0 SO COMPUTE TIMING CHANGE
	RETURN
SDC.C0
	BTFSC IGNADJ,7,1		;IS IT A RETARD VALUE?
	BRA SDC.DA		;IS SET SO GO RETARD TIMING
	MOVFF IGNADJ,WRK	;SAVE COUNT    THIS IS ADVANCE ROUT.
						;SAVE COUNTER VAL
	MOVLW D'11'
	CPFSLT WRK,1		;TEST FOR OUT OF RANGE (10 IS MAX)
	RETURN			;RETURN IF TOO HIGH	
SDC.C1
	MOVF WORKL,0,1		;SUBTRACT 1 DEGREE FROM SPARK DELAY
	SUBWF SDL,1,1		
	MOVF WORKH,0,1
	SUBWFB SDH,1,1
	BTFSS _C		;TEST FOR OVERFLOW 
	BRA SDC.UND		;WE HAD OVF SO GO CK FOR EXTEND AND DO WHATS NECESSARY
SDC.C1A
	DECFSZ WRK,1,1		;DEC REPEAT COUNT
	BRA SDC.C1		;NOT ZERO YET SO DO IT AGAIN
	RETURN			;ADJUSTMENT DONE SO GO ON

SDC.UND			;WE ARE HERE BECAUSE DELAY COUNT UNDERFLOWED
	movlw 0x05		;set min value
	movwf SDL,1
	CLRF SDH,1		;SET MIN VALUE
	RETURN

SDC.DA
	MOVF IGNADJ,0,1	;SAVE # OF STEPS TO RETARD
	ANDLW 0x0F
	MOVWF WRK,1
	MOVLW D'11'
	CPFSLT WRK,1		;TEST FOR OUT OF RANGE (10 IS MAX)
	RETURN			;RETURN IF TOO HIGH	
SDC.D1
	MOVF WORKL,0,1		;ADD 1 MORE DEG
	ADDWF SDL,1,1		
	MOVF WORKH,0,1
	ADDWFC SDH,1,1
	BTFSC _C		;CK FOR OVF
	BRA SDC.D2		;GO SET MAX
	DECFSZ WRK,1,1		;DEC RETARD COUNT
	BRA SDC.D1		;DO IT AGAIN IF NOT DONE
	RETURN			;DONE SO CONTINUE.
SDC.D2
	SETF SDL,1
	SETF SDH,1
	RETURN				;   END OF ADJUSTABLE TIMING ROUT 	
			;END OF  SPDC ROUT
 
;	CD rout computes the dwell delay.  THIS ROUT USES THE FACT THAT T2 INTERVAL (30 DEG)IS 1/6TH
;OF THE TIME (in uS)  BEFORE NEXT SPARK IS TO OCCURE (180 DEG LATER ON ROTARY).  SO, T2 INTERVAL - DWELL TIME = TURNON DELAY
; (IN MICROSECONDS / 6).  NOTE IS 1/6 IN uSec only because basic t2 clock is running at 1.031250  when we move to 1.25 mhz clock in the EC3 (w/ 40 mhz clock), it is no longer very close to 1 mhz.  Can we fix this by modifying the 42 constant?
;On the B3 engine, the t2 interval clock is running at 1/4 the speed as others so the t2 interval count is only 1/4th the number of microseconds as on other controllers.  We might be able to use this routine as-is by multiplying the t2 count by 4 or by dividing the dwell constant 43 by 4 (11?)
;  WE USE DWELL CLOCK INTERVAL OF 252 uS WHICH WHEN / 6 = 42 SO:
; (DELAY IN uS/6) / 42 GIVES US THE NUMBER OF DWELL CLOCKS TO WAIT (DWL VALUE)
; In 20B version wer use t2 interval * 2 because the coils are only fired once per rev.
; 1-5-99  changing dwell to 5 MS for Chevy coils (4 MS = 02 99 hex) 5 ms = 03 40
; 6-11-00  installed CD routine from ec20bt.asm (1-10-00) for 5.5ms dwell.
;  Changed to 5.0 ms dwell on 02-13-02, THEN 4.8 AT A LATER DATE
;Reduced dwell from 615 (02 67) to 566 (02 36) to give 3.5 uS dwell on Mazda coils)

 IF (ENG==0xA1)||(ENG==0xA2)||(ENG==0xA4)||(ENG==0xA5)||(ENG==0xA6)||(ENG==0xA8)||(ENG==0xA9)||(ENG==0xAB)||(ENG==0xB1)||(ENG==0xAD)||(ENG==0xB3)
CD		  
  IF RX8COIL==1											;  ENGINES OTHER THAN A1 & A8
	MOVLW LOW RX8DWELL	;2.6 MS LSB DWELL FOR RX8 COIL
  ENDIF
  IF LS1COIL==1
	MOVLW LOW LS1DWELL		;SUBTRACT DWELL IN uS / 6 FROM T2 INTERVAL (180 DEG) OR T2 * 2 (360) = TIME TO WAIT (DWL)
  ENDIF 
  IF (ENG==0xA2)||(RX7COIL==1)	
	MOVLW LOW RX7DWELL
  ENDIF
  
CD.LSB
  IF (D360==1);  (ENG==0xA8)||(ENG==0xAB)||(ENG==0xB1)		
		SUBWF TX2L,0,1		;RENESIS IS A 360 DEG INTERVAL ENGINE & V6 CAS & SUZU 4 
  ELSE
		SUBWF TPL,0,1			;ALL OTHERS ARE 180 DEG ENGINES EXCEPT 6 CYL & 20b (HANDLED IN SEPARATE CD ROUT)
  ENDIF
	MOVWF AARGL,1		;PUT IN AARG
	
   
  IF RX8COIL==1											;  ENGINES OTHER THAN A1 & A8
	MOVLW HIGH RX8DWELL	;2.6 MS LSB DWELL FOR RX8 COIL
  ENDIF
  IF LS1COIL==1
	MOVLW HIGH LS1DWELL		;SUBTRACT DWELL IN uS / 6 FROM T2 INTERVAL (180 DEG) OR T2 * 2 (360) = TIME TO WAIT (DWL)
  ENDIF 
  IF (ENG==0xA2)||(RX7COIL==1)	
	MOVLW HIGH RX7DWELL
  ENDIF
      
CD.MSB  
  IF (D360==1);   (ENG==0xA8)||(ENG==0xAB)||(ENG==0xB1)			;FORD V6 IS 360 DEG ENGINE
	SUBWFB TX2H,0,1		;RENESIS & OTHER 360 INTERVAL ENGINES
  ELSE
	SUBWFB TPH,0,1		;ALL 180 DEG ENGINES
  ENDIF
	BTFSC _C		;TEST FOR UNDERFLOW, C= NO
	BRA CD.10A		;GO ON IF NOT
CD.A
	MOVLW 0x02		; SET MIN DELAY IF UNDERFLOW
	MOVWF DWL,1
	CLRF DWLH,1
	BRA CD.1
CD.10A				;COMPUTE DWELL DELAY
	MOVWF AARGH,1		;MOVE MSB TO ARG
   IF ENG==0xB3
   	MOVLW D'11'		;TMR0 RUNNING AT 1/4TH NORMAL SPEED ON THIS ENGINE  OR 1/8TH SPEED IF TBINJ SET  7 ON TBI?
   ELSE
	MOVLW D'43'		;SET BARG TO DWELL CLOCK / 6 (252 / 6 = 42) (new spec is 43 07-01-03)   53 for EC3 40 mhz clock
   ENDIF
	MOVWF BARGL,1
  	CLRF BARGH,1
  	CALL DIV	;1615		; 1615 NEEDED?   16/7 WOULD SEEM TO BE OK
	TSTFSZ AARGL,1		;TEST LSB FOR 0
	BRA CD.00
	TSTFSZ AARGH,1		;TEST MSB TOO IF USED
	BRA CD.00
	INCF AARGL,1,1		;INC TO 2 IF YES
	INCF AARGL,1,1
CD.00
	MOVFF AARGL,DWL
	MOVFF AARGH,DWLH
	MOVFF TPL,TPLOLD	;SAVE OLD TPH&L
	MOVFF TPH,TPHOLD
					;DONE SO EXIT
CD.1	
	BSF VT			;set valid timing flag             
	CLRWDT			;CLEAR WATCH DOG TIMER  (NORMAL OPS)
	CALL PCK		;GO UPDATE STATUS OF PROGRAM SWITCHES
	RETURN
 ENDIF  ;(A1,A2,A4,A5,A6,A8,A9,AB,AD,B1,B3)

 IF (ENG == 0xA3)||(ENG==0xB0)||(ENG==0xAE)||(ENG==0xAF)||(ENG==0xB4)||(ENG==0xAA)||(ENG==0xB5)
     ; REQUIREs 240 DEG DELAY CALC - 6 CYL, 20B, ETC
CD	
  IF ENG==0xAF
	MOVFF TX2H,AARGH
	MOVFF TX2L,AARGL
	MOVLW 3
	MOVWF BARGL,1
	CALL DIV
	MOVFF AARGL,BARGL		;SAVE (TPH&L X 4) / 3
	MOVFF AARGH,BARGH
	MOVFF TX2H,AARGH		;GET TPH X 4 AGAIN
	MOVFF TX2L,AARGL
	MOVF BARGL,0,1			;NOW SUBTRACT 1/3 OF IT
	SUBWF AARGL,1,1
	MOVF BARGH,0,1
	SUBWFB AARGH,1,1
  ELSE	
	MOVF TPL,0,1		;CALC 240 DEG BY ADDING TPL&H TO (TPL&H/3)  40 DEGREES FACTOR OF 6 = 240
	MOVWF AARGL,1
	MOVF TPH,0,1
	MOVWF AARGH,1
	MOVLW 3
	MOVWF BARGL,1
	CALL DIV			;1615 NOT NEEDED			;ARRGH&L NOW HAVE TPL/3   
	MOVF TPL,0,1
	ADDWF AARGL,1,1
	MOVF TPH,0,1
	ADDWFC AARGH,1,1
	BTFSS _C		;GO ON IF NO CY
	BRA CD.10
	SETF AARGL,1		;SET TO MAX IF OVF
	SETF AARGH,1
  ENDIF
  
CD.10
  IF RX8COIL==1
	MOVLW LOW RX8DWELL		;SUBTRACT DWELL IN uS / 6 FROM 120 DEG INTERVAL x 2 (240) = TIME TO WAIT (DWL) WHY X 2? NO NEED TO SUBTRACT NOTHING.  To set or clr borrow I think)
  ENDIF
  IF LS1COIL==1
	MOVLW LOW LS1DWELL		;WAS D'226'
  ENDIF
  IF HONDACOIL==1
	MOVLW LOW HONDADWELL		;
  ENDIF
  IF LS2COIL==1
	MOVLW LOW LS2DWELL		;
  ENDIF
	SUBWF AARGL,1,1		;LSB
  IF RX8COIL==1
		MOVLW HIGH RX8DWELL     ;WAS 0x02		;2.6 MS DWELL, RENESIS COILS 
  ENDIF
  IF LS1COIL==1
		MOVLW HIGH LS1DWELL		;4.3 MS DWELL MSB,  LS1 COILS
  ENDIF
  IF HONDACOIL==1
	MOVLW HIGH HONDADWELL		;
  ENDIF
  IF LS2COIL==1
	MOVLW HIGH LS2DWELL		;
  ENDIF
  
	SUBWFB AARGH,1,1
	BTFSC _C		;TEST FOR UNDERFLOW, C= NO
	BRA CD.10A		;GO ON IF NOT
	MOVLW 0x02		; SET MIN DELAY IF UNDERFLOW
	MOVWF DWL,1
	CLRF DWLH,1
	BRA CD.1
CD.10A
	MOVLW D'43'		;SET BARG TO DWELL CLOCK / 6 (252 / 6 = 42) (43 gives better empiracle results)55 FOR 40 MHZ CLOCK
	MOVWF BARGL,1
  	CLRF BARGH,1
  	CALL DIV		;1615  NOT NEEDED
	TSTFSZ AARGL,1		;TEST LSB FOR 0
	BRA CD.00
	TSTFSZ AARGH,1		;TEST MSB TOO IF USED
	BRA CD.00
	INCF AARGL,1,1		;INC TO 2 IF YES
	INCF AARGL,1,1
CD.00
	MOVFF AARGL,DWL
	MOVFF AARGH,DWLH
	MOVFF TPL,TPLOLD	;SAVE OLD TPH&L
	MOVFF TPH,TPHOLD
CD.1	
	BSF VT			;set valid timing flag
	CLRWDT			;CLEAR WATCH DOG TIMER  (NORMAL OPS)
	CALL PCK		;GO UPDATE STATUS OF PROGRAM SWITCHES
CD.2
  	BCF STRF					;DONE WITH THIS SO KILL IT
  	RETURN
 ENDIF		; A3,AF (20B & DIST V6),CORVAIR

 IF (ENG==0xB2)
     ;  (120 DEG DELAY CALC, DIST V6,CORVAIR  240/6=40  120/6=20
CD	
	MOVFF TPL,AARGL
	MOVFF TPH,AARGH
	MOVLW 3
	MOVWF BARGL,1
	CALL DIV		;1615			;ARRGH&L NOW HAVE TPL/3 (10 DEG) 
	MOVF AARGL,0,1		;TPH&L - 1/3 = 20 DEG,  20 DEG *6 = 120 DEG
	SUBWF TPL,0,1
	MOVWF AARGL,1
	MOVF AARGH,0,1
	SUBWFB TPH,0,1
	MOVWF AARGH,1
CD.10
  IF RX8COIL==1
	MOVLW LOW RX8DWELL		;SUBTRACT DWELL IN uS / 6 FROM 120 DEG INTERVAL x 2 (240) = TIME TO WAIT (DWL) WHY X 2? NO NEED TO SUBTRACT NOTHING.  To set or clr borrow I think)
  ELSE
	MOVLW LOW LS1DWELL		;WAS D'226'
  ENDIF
	SUBWF AARGL,1,1		;LSB
   IF RX8COIL==1
		MOVLW HIGH RX8DWELL     ;WAS 0x02		;2.6 MS DWELL, RENESIS COILS 
   ELSE
		MOVLW HIGH LS1DWELL		;4.3 MS DWELL MSB,  LS1 COILS
   ENDIF
	SUBWFB AARGH,1,1
	BTFSC _C		;TEST FOR UNDERFLOW, C= NO
	BRA CD.10A		;GO ON IF NOT
	MOVLW 0x02		; SET MIN DELAY IF UNDERFLOW
	MOVWF DWL,1
	CLRF DWLH,1
	BRA CD.1
CD.10A
	MOVLW D'43'		;SET BARG TO DWELL CLOCK / 6 (252 / 6 = 42) (43 gives better empiracle results)
	MOVWF BARGL,1
  	CLRF BARGH,1
  	CALL DIV		;1615
	TSTFSZ AARGL,1		;TEST LSB FOR 0
	BRA CD.00
	TSTFSZ AARGH,1		;TEST MSB TOO IF USED
	BRA CD.00
	INCF AARGL,1,1		;INC TO 2 IF YES
	INCF AARGL,1,1
CD.00
	MOVFF AARGL,DWL
	MOVFF AARGH,DWLH
CD.1	
	BSF VT			;set valid timing flag
	CLRWDT			;CLEAR WATCH DOG TIMER  (NORMAL OPS)
	CALL PCK		;GO UPDATE STATUS OF PROGRAM SWITCHES
CD.2
  	RETURN			;NO SET ANF, SET BY T2 EVENT
 ENDIF		; A3,AF (20B & DIST V6),CORVAIR
 

 IF(ENG==0xA7)||(ENG==0xAC)			;EJ22/EJ25
CD	
  IF A72007 == 1
  	MOVLW LOW RX7DWELL		;3.5 MS DWELL FOR STOCK EJ25 COIL
  ELSE
	MOVLW LOW LS1DWELL		;WAS 0x00		;SUBTRACT DWELL IN uS / 6 FROM T2 INTERVAL = TIME TO WAIT (DWL)
  ENDIF
	SUBWF TPL,0,1		;LSB
	MOVWF AARGL,1		;PUT IN AARG
  IF A72007 == 1
  	MOVLW HIGH RX7DWELL
  ELSE
	MOVLW HIGH LS1DWELL	;WAS 0x03		;MSB NOTE! 		4.8 MS
  ENDIF
	SUBWFB TPH,0,1
	BTFSC _C		;TEST FOR UNDERFLOW, C= NO
	BRA CD.Y
	
	CLRF DWLH,1		; SET MIN DELAY IF UNDERFLOW
	MOVLW D'2'
	MOVWF DWL,1
	BRA CD.1		;GO ON
CD.Y
	MOVWF AARGH,1
	MOVLW D'43'		;SET BARG TO DWELL CLOCK / 6 (252 / 6 = 42)  2B (43) GIVES MORE CONSISTENT DWELL TIMES (USE IT) 
	MOVWF BARGL,1
  	CLRF BARGH,1
  	CALL DIV		;1615
	TSTFSZ AARGL,1		;TEST LSB FOR 0
	BRA CD.00
	TSTFSZ AARGH,1		;TEST MSB TOO IF USED
	BRA CD.00
	INCF AARGL,1,1		;INC TO 2 IF YES
	INCF AARGL,1,1
CD.00
	MOVFF AARGL,DWL
	MOVFF AARGH,DWLH
CD.1	
	BSF VT			;set VALID TIMING FLAG
	CLRWDT			;CLEAR WATCH DOG TIMER  (NORMAL OPS)
  IF A72007==1
		CALL PCK		;GO UPDATE STATUS OF PROGRAM SWITCHES  DO THIS FROM EXEC, TRIGGERED BY MF 05-30-08
		BCF STRF
  ENDIF
	RETURN
 ENDIF 				;END OF EJ25/22 (0xAC)/0xA7 DWELL ROUT

PCK		;UPDATE STATUS OF CONTROLLER SELECTION AND PROGRAM SWITCHS (~3uS)
 IF EC3TB==1
 	BSF CAF
 	BSF OLF
 ELSE
 	BTFSS PORTA,4,0		;A/B SEL
	BSF CAF				;SET CONT A FLAG
	BTFSC PORTA,4,0		;WAS PORT G
	BCF CAF		;CLR CONT A FLAG
	BTFSC ABDET,1,1		; 2 MSB BITS OF AN7 IN BITS 0 & 1 OF ABDET   TEST A/B SELECT (MSB H = A SELECTED)
	BSF ASF		;SET A SELECTED FLAG
	BTFSS ABDET,1,1		; 	OFF (A SELECTED)
	BCF ASF
	BTFSS CAF		;ARE WE A?        ON LINE TEST
	BRA PCK.3		;NO , GO DO B
	BTFSC ASF		;YES, ARE WE SELECTED?
	BSF OLF			;YES, SO SET ON LINE FLAG
	BTFSS ASF		;NO SO CLEAR OLF
	BCF OLF
	BRA PCK.4
PCK.3			;WE ARE B
	BTFSS ASF		; ARE WE SELECTED?
	BSF OLF			;YES, SO SET ON LINE FLAG
	BTFSC ASF		;NO SO CLEAR OLF
	BCF OLF
 ENDIF			;END IF NOT EC3TB
 
PCK.4			;*****  BLINK MOD TO PROGRAM BOTH A & B   WE DECIDE WHETHER TO DO PROGRAMMING OR NOT HERE.
	BTFSS CAF		;ARE WE A?
	BRA PCK.4A		;WE ARE B SO GO CHECK FOR PROGRAMMING ALWAYS (EVEN IF B IS NOT ONLINE)
	BTFSS OLF		;IS A ON LINE?  GO CK FOR PROGRAMMING IF YES
	BRA PCK.5		;SKIP PROGRAM CHECK OF A CONTROLLER IF B IS SELECTED NOW
PCK.4A
				;***** END OF BLINK MODIFICATION

 	BTFSS CLDSW		;SET/CLR CSON STATUS
 	BSF CSON		;SW ON SO SET CSON
 	BTFSC CLDSW
 	BCF CSON		;SW OFF SO CLR CSON
 	BTFSC CSON		;SET NEUTRAL TRIM IF CS OFF
 	BRA PCK.4B
	MOVLW 0x80
	MOVWF TRIM,1
PCK.4B				 	
 	MOVF PORTG,0,0	;GET PGM SWITCHES
	ANDLW 0x0F		;MASK OFF ALL BUT UPR 4 BITS
	XORLW 0x0F		;CHECK FOR ANY BITS SET (COMPLEMENT)	
 	MOVWF PFUN,1	;SAVE IT NOW  PGM FUNC
PCK.X				;CK STATUS OF STORE SWITCH
	BTFSS PGMWR		;READ PGM WR SW REAL TIME CHECK OF SWITCH FOR DE-BOUNCE
	BRA PCK.6		;SW IS PUSHED SO SET FLAG IF ALL ELSE ok  WAS CALL
PCK.Z
	BTFSC WRSF		;WAS SWITCH UP SHORTLY AGO? (WRSF SET & CLEARED BY ANALOG (BEGINNING), 1 = SW DOWN, 0 = SW UP)
	RETURN			;SW WAS DOWN SHORTLY AGO, SO EXIT
	BTFSS PGMWR		;SW WAS UP SHORTLY AGO, IS WR SW CURRENTLY PUSHED RIGHT NOW? 
	RETURN			;EXIT IF IT IS PUSHED
	BRA PCK.5A		;SW IS DEFINITELY UP SO CLEAR FLAGS
	
	
PCK.5				;NOT ON LINE,  SO MAKE SURE WE ARE IN NO PROGRAM MODER, NO PGM MODE SELECTED
	CLRF PFUN,1		;MAKE SURE VAR IS EMPTY IF SW AT 0
PCK.5A
	BCF PGMF		;CLEAR PGMF
	BTFSC EEWF	;DON'T CLEAR WRFLAG UNTIL TIMEOUT OF EEPROM WRITE FLAG
	RETURN			
	BCF WRFLAG	;CLEAR WRFLAG TOO, WRFLAG INDICATES THAT PGM FUNCTION WAS INITIATED	
	RETURN
PCK.6
	BTFSC PGMF
	RETURN			;ALREADY DONE SO DON'T REPEAT
	BTFSC EEWF	;IF EEPROM IS BUSY, DON'T SET PGM FLAG PGMF
	RETURN
	BSF PGMF		;NOT BUSY SO DO IT
	RETURN

PGMR			;PROGRAM FUNCTIONS ARE DONE HERE
	BTFSS VT		;DON'T DO PGM IF NOT RUNNING
	RETURN			;NOT RUNNING SO RETURN
	BTFSS WRFLAG	;DO PGM IF WRFLAG NOT SET YET
	BRA PGM.1		;FLAG CLEAR SO GO CK FOR SW STILL DN
					;FLAG SET (DONE) SO CK FOR SW UP
	BTFSC WRSF		;WAS WR SW UP AWHILE AGO? DE-BOUNCE
	RETURN			;NO, SW WAS DOWN SO DON'T CLEAR FLAG YET
	BTFSS PGMWR		;JUST RETURN IF SW STILL DOWN
	RETURN
	BCF WRFLAG	;SW WAS UP SO CLEAR WR FLAG, PGMF & RET
	BCF PGMF		;CLR THIS IF SET
	RETURN			;
	
PGM.1
	BSF WRFLAG	;NOT ACTED ON YET SO SET FLAG & DO FUNC.
				;FLAG NOT SET SO GO ON IF SW STILL DN
	BTFSC PGMWR	;MAKE SURE PGMF WAS NOT SET BY NOISE (SW STILL DN?)
	BRA FUNC10			;NO SW DOWN SO RETURN
	MOVF PFUN,0,1		;SW IS STILL DN CK FOR FUNC
	BNZ PGM.1C
 	BRA SETO2THRESH			;SET O2 THRESHOLD IF MODE ZERO AND RUNNING
PGM.1C   
	DCFSNZ WREG,0,0		;DEC FUNC UNTIL WE GET TO 0
	BRA WRTBL		;FUNC 1 (SET TABLE ENTRY TO CURRENT PGM KNOB SETTING)
	DCFSNZ WREG,0,0		;DEC FUNC UNTIL WE GET TO 0
	BRA IPADJ		;FUNC 2  REPLACED TBLWTH WITH IPRNG/IPWMIN ON 08-31-07  CSON = IPWMIN ADJ (DIVERTED IN IPRNG, NOT HERE) 
	DCFSNZ WREG,0,0		;DEC FUNC UNTIL WE GET TO 0
	BRA T2ADJ		;FUNC 3  ADJUST IPWCR (TIMER 2 RATE)    SAME ON EC3 & TB VER.
	DCFSNZ WREG,0,0		;DEC FUNC UNTIL WE GET TO 0
	BRA RDIF1		;FUNC 4
	DECFSZ WREG,0,0		;DEC FUNC UNTIL WE GET TO 0
	BRA PGM.1A		;GO ON IF NOT FUNC5
	BRA RDIF2		;FUNC 5  SET ROTOR 2 DIFFERENTIAL  (used on 20B engines only)
PGM.1A
	DCFSNZ WREG,0,0		;DEC FUNC UNTIL WE GET TO 0
	BRA SECDELTA	;FUNC 6  SET SECONDARY INJ DELTA (STAGE/NOT_STAGE DELTA)  (automatic selection depending on STAGE STATUS
					;ALSO USED TO TOGGLE ALT ON PISTON ENGINES.
	DECFSZ WREG,0,0		;DEC FUNC UNTIL WE GET TO 0
	BRA PGM.1B
 IF ROTARY==1			;FUNC 7
 	BTFSC CSON			;COLD START SW ON?  (SELECT SECOND FUNCTION ON ROTARY)
 	BRA SETRPMTHRESH	;ALTERNATE FUNC 7 COLD START ON SO DO ALTERNATE FUNCTION.
	BRA SETSTG			;FUNC 7  SET STAGING THRESHOLD  (ALSO USED TO SET RPMTHRESH ON PISTON ENGINES)
 ELSE
 	BRA SETRPMTHRESH	;SET RPM MCT TABLE THRESHOLD TO CURRENT MAP (DIFFERENT FUNCTION ON PISTON ENGINES - NO STAGING)
 ENDIF
PGM.1B 
	DCFSNZ WREG,0,0		;DEC FUNC UNTIL WE GET TO 0
	BRA IGNADV		;FUNC 8 (ADJUST IGNITION ADVANCE)
	DCFSNZ WREG,0,0		;DEC FUNC UNTIL WE GET TO 0
	BRA TBLADJ		;FUNC 9 (ADJUST TABLE ENTRY BY AMT PROPOR. TO PGM KNOB SETTING)
	DCFSNZ WREG,0,0		;DEC FUNC UNTIL WE GET TO 0
	BRA FUNC10		;FUNC 10 
		;DUMMY RETURNS FOR UNUSED FUNCTIONS
FUNC10
	BCF WRFLAG
	RETURN
	
PGM.2E
	BTFSS CSON
	BRA TBLADJ		;  FUNC 2 CS OFF FOR PISTON
	BRA SETRPMTHRESH ;FUNC 2 CSON FOR PISTON VER.
	
PGM.2D				;FUNC 2 FOR ROTARY
	BTFSS CSON
	BRA TBLADJ		;  FUNC 2 CS OFF FOR PISTON
	BRA SECDELTA	;FUNC 2 = SEC. DIFFERENTIAL IF ROTARY
	
SECDELTA
 IF ROTARY==1		;ONLY ON ROTARY ENGINES
  IF EC3TB==1			;***********************************   CLVER
  	BTFSS CSON
  	BRA SECDELTA.DN		;CS NOT ON, GO REDUCE SECDIF
  	MOVLW 0xD0			;LESS THAN MAX?
  	CPFSLT SECDIF,1
  	RETURN				;EXIT IF NOT
  	MOVLW D'4'			;inc by 4
  	ADDWF SECDIF,1		;UPDATE IN RAM
  	BRA SECDELTA.A		;UPDATE EEPROM
SECDELTA.DN
	MOVLW 0x30			;MORE THAN MIN?
  	CPFSGT SECDIF,1
  	RETURN				;EXIT IF NOT
  	MOVLW D'4'			;inc by 4
  	SUBWF SECDIF,1		;UPDATE IN RAM
  	BRA SECDELTA.A		;UPDATE EEPROM
  ENDIF					;*************************************  CLVER
			;NON-TB VER ENTRANCE  (MODE 6 TO ADJUST SECDIFFERENTIAL)     
	MOVF PGMV,0,1
	MOVWF SECDIF,1	;UPDATE RAM
SECDELTA.A				; **********************   ADDED ENTRY POINT FOR CLVER
	MOVLW 01		;SET WORD COUNT
	MOVWF WC,1
	MOVLW SECDIFADR			;SET WSA (SECDIF STORAGE ADDRESS IN EEPROM)
	MOVWF WSAL,1
	CLRF  WSAH,1
	LFSR 1,SECDIF	;LOAD FSR W/ RAM DATA ADDR
	CALL EEWR		;WAS NOT A ENTRY WRITE IT TO EEPROM
	RETURN
 ELSE
  
	BTG ALT
	RETURN
 ENDIF
	RETURN		

IGNADV
 IF EC3TB==0			
	BTFSS PGMV,7,1		;TEST MSB OF PGM VARIABLE (IF HIGH, ADVANCE TIMING VARIABLE)
 ELSE
 	BTFSS MIXH,0,1		;USE MIX MSB AS THE UP /DOWN FLAG
 ENDIF
	BRA IGNA.0		;GO RETARD IGNITION VARIABLE
ADVIT
	BTFSC IGNADJ,7,1		;THIS IS ADVANCE ADJUSTMENT, SEE IF CURRENT VALUE IS RETARD RANGE (LABEL FOR BLUE MOUNTAIN)
	BRA IGNA.1		;IT IS IN RETARD RANGE SO HANDLE THIS CASE
	MOVLW D'10'		;TEST FOR MAX VALUE
	CPFSLT IGNADJ,1		
	RETURN			;IT WAS ALREADY AT MAX VALUE SO IGNORE
	INCF IGNADJ,1,1		;INCREMENT IT
IGNA.2	
	MOVLW 01		;SET WORD COUNT
	MOVWF WC,1
	MOVLW IGNADJADR			;SET WSA (IGNADJ STORAGE ADDRESS IN EEPROM)
	MOVWF WSAL,1
	CLRF WSAH,1
	LFSR 1,IGNADJ		;LOAD FSR W/ RAM DATA ADDR
	CALL EEWR		;WAS !A ENTRY WRITE IT TO EEPROM
	RETURN
IGNA.1	
	DECF IGNADJ,1,1		;DECREMENT THE RETARD VALUE (ADVANCE TIMING)
	MOVLW 0X80		;TEST FOR ZERO	WITH MSB SET
	CPFSGT IGNADJ,1		;GO ON IF NOT NEG 0
	CLRF IGNADJ,1		;SET TO 0 IF IT WAS NEG 0
	BRA IGNA.2		;GO STORE IN EEPROM
IGNA.0								;RETARD THE TIMING
	BTFSS IGNADJ,7,1		;ARE WE IN RETARD RANGE?  (THIS IS THE RETARD ROUT)
	BRA IGNA.3		;IS IS NOT SO GO RETARD FROM ADVANCE (OR ZERO) RANGE
	MOVLW 0x8A		;TEST FOR MAX RETARD
	CPFSLT IGNADJ,1
	RETURN			;ALREADY AT MAX SO RETURN WITH NO ACTION
	INCF IGNADJ,1,1		;INCREMENT THE RETARD VALUE
	BRA IGNA.2		; GO STOR IN EEPROM
IGNA.3	
	TSTFSZ IGNADJ,1		;TEST FOR ZERO
	BRA IGNA.3A		;NOT ZERO SO GO ON
	MOVLW 0x81		;SET RETARD 1 STEP
	MOVWF IGNADJ,1		;SET THE VARIABLE
	BRA IGNA.2		;GO STOR IN EEPROM
IGNA.3A	
	DECF IGNADJ,1,1		;DECREMENT THE (ADVANCE) VALUE
	BTFSC _C		;SEE IF IT UNDERFLOWED (IT MIGHT HAVE BEEN 0)
	BRA IGNA.2		;GOOD VALUE SO GO STORE IT
	MOVLW 0x81		;SET TO NEGATIVE 1
	MOVWF IGNADJ,1		;STORE IN VARIABLE
	BRA IGNA.2		; GO STORE IT

T2ADJ			;ADJUST THE TIMER 2 INTERVAL FOR IPW CLOCK  (FUNC 3)
;	MOVFF PR2,IPWCR		;GET CURRENT PR2		*********   MOVED TO INDIVIDUAL ROUTS FOR CLVER
 IF EC3TB==0
	BTFSC PGMV,7,1		;TEST FOR MSB OF PGM VARIABLE SET
 ELSE
 	BTFSC MIXH,0,1
 ENDIF
	BRA T2ADJ.1		;IT WAS SET SO ADJUST T2 UP BY 1
DECIF
	MOVFF PR2,IPWCR		;GET CURRENT PR2	*************		ADDEDHERE from first inst FOR CLVER
	MOVLW D'100'		;TEST FOR MINIMUM VALUE   ********** WAS 67, CHANGED FOR CLVER
	CPFSGT IPWCR,1
	RETURN			;RETURN WITH NO ACTION IF NOT GT 66 (~8 uS) 
	MOVLW 1			;IT WAS MORE SO DECREMENT BY 2
	SUBWF IPWCR,1,1
T2ADJ.0
	MOVFF IPWCR,PR2		;SET IT UP IN PR2 	*******************  ADDEDHERE from first inst FOR CLVER
				;NOW SAVE IT IN EEPROM
	MOVLW IPWCRADR			;SET WSA (IPWCR STORAGE ADDRESS IN EEPROM)
	MOVWF WSAL,1
	CLRF WSAH,1	
	LFSR 1,IPWCR	;LOAD FSR W/ RAM DATA ADDR TO GET DATA FROM
	MOVLW 01		;SET WORD COUNT
	MOVWF WC,1
	CALL EEWR		;WRITE IT TO EEPROM
	RETURN

T2ADJ.1
	MOVFF PR2,IPWCR		;GET CURRENT PR2
	MOVLW D'254'		;TEST FOR MAX VALUE -3
	CPFSGT IPWCR,1
	BRA T2ADJ.2			;
	SETF IPWCR,1		;SET MAX VALUE
	BRA T2ADJ.0
T2ADJ.2
	MOVLW 1			;IT WAS LESS SO INCREMENT BY 4
	ADDWF IPWCR,1,1
	BRA T2ADJ.0		;GO UPDATE PR2 & EEPROM
	
IPADJ			;ADJUST THE ipwrng parameter (SETS DYNAMIC RANGE OD IPW VS MAP)  (MODE 2, CS OFF)
 IF EC3TB==0	
	BTFSC CSON
	BRA IPWMINADJ	;ADJ MIN IPW    why not iprng?
	BTFSS PGMV,7,1		;TEST FOR MSB OF PGM VARIABLE SET    (CHANGED THE DIRECTION TO BE INTUITIVE, CW MAKE IT RICHER, CCW = LEANER
	BRA INCIP		;IT WAS SET SO ADJUST IT UP BY 1
 ELSE				;IF EC3TB VER   MODE 1 ON THIS VER
 	BTFSC CSON		;IF CSON, GO DO IPMIN ADJUST
 	BRA IPWMINADJ	;CS WAS ON SO GO DO IPWMIN      (WHAT ABOUT THE FACT THAT CSON GIVES CLOSED LOOP?  JUST HAVE TO BE CAREFULL?  FACTORY USE ONLY ....
 	BTFSC MIXH,0,1		; MSB OF MIX HIGH OR LOW?  IF LOW WE ASSUME WE WANT TO LEAN THE MIXTURE BY INCREASING IPWRNG
 	BRA DECIP			;MSB WAS HIGH,IF MSB HIGH WE ASSUME WE WANT TO RICHEN THE MIXTURE BY DECREASING IPWRNG 
 	BRA INCIP
 ENDIF
	
	
DECIP				;decrease IPRNJ (MAP SENSOR OFFSET) BY FIXED AMOUNT
	MOVLW D'6'		;TEST FOR MINIMUM VALUE	
	CPFSGT IPWRNG,1
	RETURN			;RETURN WITH NO ACTION IF NOT GT 66 (~8 uS) 
	MOVLW 2			;IT WAS MORE SO DECREMENT BY 2
	SUBWF IPWRNG,1,1
IPADJ.0					;NOW SAVE IT IN EEPROM
	MOVLW IPWRNGADR			;SET WSA (IPWRNG STORAGE ADDRESS IN EEPROM)
	MOVWF WSAL,1
	CLRF WSAH,1	
	LFSR 1,IPWRNG	;LOAD FSR W/ RAM DATA ADDR TO GET DATA FROM
	MOVLW 01		;SET WORD COUNT
	MOVWF WC,1
	CALL EEWR		;WRITE IT TO EEPROM
	RETURN
	
INCIP				;increase IPRNJ (MAP SENSOR OFFSET) BY FIXED AMOUNT
	MOVLW D'120'		;TEST FOR MAX VALUE  (120)
	CPFSLT IPWRNG,1
	RETURN			;ALREADY AT MAX SO RETURN W/ NO ACTION
	MOVLW 2			;IT WAS LESS SO INCREMENT BY 2
	ADDWF IPWRNG,1,1
	BRA IPADJ.0		;GO UPDATE EEPROM

IPWMINADJ			;ADJUST THE INJECTOR THRESHOLD IPW (minimum ipw value) (MODE 2 W/ CS ON)
 IF EC3TB==1		;MODE 1 W/ CSON = 1 IS IPWMIN ADJ
    BTFSC MIXH,0,1	;IF MIX IS CW, RICHEN IPWMIN (INCREASE)
 ELSE
	BTFSC PGMV,7,1		;TEST FOR MSB OF PGM VARIABLE SET
 ENDIF
	BRA IPWMINADJ.1		;IT WAS SET SO ADJUST IPWMIN UP
	MOVLW D'6'		;TEST FOR MINIMUM VALUE
	CPFSGT IPWMIN,1
	RETURN			;RETURN WITH NO ACTION IF NOT GT 6 
	MOVLW 1			;IT WAS MORE SO DECREMENT BY 1
	SUBWF IPWMIN,1,1
IPWMINADJ.0					;NOW SAVE IT IN EEPROM
	MOVLW IPWMINADR			;SET WSA (IPWMIN STORAGE ADDRESS IN EEPROM)
	MOVWF WSAL,1
	CLRF WSAH,1	
	LFSR 1,IPWMIN	;LOAD FSR W/ RAM DATA ADDR TO GET DATA FROM
	MOVLW 01		;SET WORD COUNT
	MOVWF WC,1
	CALL EEWR		;WRITE IT TO EEPROM
	RETURN
IPWMINADJ.1
	MOVLW D'100'		;TEST FOR MAX VALUE
	CPFSLT IPWMIN,1
	RETURN			;ALREADY AT MAX SO RETURN W/ NO ACTION
	MOVLW 1			;IT WAS LESS SO INCREMENT BY 1
	ADDWF IPWMIN,1,1
	BRA IPWMINADJ.0		;GO UPDATE EEPROM

TBLADJ
	BTFSC PGMV,7,1		;IS IT RICH OR LEAN?
	BRA RICH		; WAS  > 0 SO GO RICHEN
;LEAN
	COMF PGMV,0,1		;COMPLEMENT IT AND PUT IN WREG
	
TBLADJ.A			;******************************* ENTRY POINT FOR CLOSED LOOP MODE (CALLER MUST DO ABOVE 3 INSTRUCT. USING "TRIM" VAR. INSTEAD OF PGMV	
	ANDLW 0x7C		;DIVIDE BY 4 CLR LOWER 2 BITS  (BY 8 ON TB VER.)
	RRNCF WREG,0,0
	RRNCF WREG,0,0 
	TSTFSZ WREG,0		;WAS IT 0?  (MIN VALUE = 1
	BRA LEAN.1
	INCF WREG,0,0		;MAKE MIN
LEAN.1
	LFSR 2,MTAB		;MOVE TABLE POINTER TO POINTER REG
	MOVFF TPTR,FSR2L	;GET CURRENT TABLE POINTER
	MOVFF INDF2,AARGL	;GET CURRENT TABLE DATA
	SUBWF AARGL,1,1		; SUBTRACT THE ADJUSTMENT FROM TABLE VALUE
	BTFSC _C		;DID IT UNDERFLOW?
	BRA WRTBL.0		;NO UNDERFLOW SO GO COMPLETE OPERATION
	CLRF AARGL,1		;HAD UNDERFLOW SO SET MIN VALUE
	BRA WRTBL.0
RICH
 IF EC3TB==1
 	MOVF MIXL,0,1
 ELSE
	MOVF PGMV,0,1
 ENDIF
RICH.CL					;NEW ENTRY POINT FOR CLVER (CALLER LOADS TRIM IN WREG)
 IF EC3TB==1
 	ANDLW 0xF8		;DIV BY 8 ON EC4
 ELSE
	ANDLW 0x7C		;DIVIDE BY 4 ON EC3
 ENDIF
	RRNCF WREG,0,0
	RRNCF WREG,0,0
 IF EC3TB==1
 	RRNCF WREG,0,0
 ENDIF
	TSTFSZ WREG,0			;WAS RESULT 0?
	BRA RICH.1
	INCF WREG,0,0		;SET MIN VALUE IF SO
RICH.1
	LFSR 2,MTAB			;MOVE TABLE POINTER + RAM PAGE TO POINTER REG
	MOVFF TPTR,FSR2L	;TPTR TO LSB
	MOVFF INDF2,AARGL	;GET CURRENT TABLE ENTRY
	ADDWF AARGL,1,1		;ADD ADJUSTMENT TO TABLE VALUE
	BTFSS _C		;HAVE CY? (OVF?)
	BRA WRTBL.0		;GO COMPLETE OPERATION IF NOT	
	SETF AARGL,1		;SET MAX IF OVF MSB ZERO?
	BRA WRTBL.0	 
	
;  ****  NEW WRTBL  05-30-08		CORRECTION FOR ERROR --  NO CONVERSION FOR 18F452
;WRTBL			;write new correction table entry to eeprom & RAM  (CMD FROM USER TO WRITE PGM KNOB TO EEPROM & RAM TABLE)
			;REMEMBER THAT MAP TABLE *STARTS* AT $80, NOT 0
			;ERROR ON EC3 VERSION FORGOT TO CHANGE BASE ADR OF EEPROM MAP TABLE TO 80 FROM 200
			
			;ENTRY AT WRTBL WRITES VALUE AT PGMV TO EEPROM TABLE ADDRESS AT TPTR 
WRTBL
	MOVF PGMV,0,1		;MOVE PGM KNOB DATA TO AARGL
	MOVWF AARGL,1
WRTBL.0		
	LFSR 1,MTAB		;GET TABLE POINTER MADE BY IPWCALC (TPTR)+ RAM PAGE OFFSET (STARTING ADR OF MAP TABLE) $200
	MOVF TPTR,0,1		;ADD TPTR TO FSR2 (RAM POINTER)
	ADDWF FSR1L,1,0		;ADD TABLE POINTER TO RAM BASE ADDRESS
						;CALCULATE EEPROM ADDRESS
	MOVFF TPTR,WSAL		;SAVE THE TPTR FOR USE IN EEPROM UPDATE (WSAL POINTS TO EEPROM ADDRESS FOR UPDATE)
	CLRF WSAH,1
	MOVLW EEMTAB		;ADD BASE ADDRESS OF EE MAP TABLE TO TPTR
	ADDWF WSAL,1,1			
	
	MOVLW D'1'			;SETUP WORD COUNT
	MOVWF WC,1
WRTBL.1
	MOVFF AARGL,INDF1	;UPDATE TABLE IN RAM W/ NEW VALUE
	CALL EEWR		;WRITE IT TO EEPROM (PARAMETERS SET UP ABOVE) 
	BTFSS EEWERF	;WRITE ERROR?
	RETURN			;RETURN IF NOT
	BSF EEBF		;SET EEPROM BAD FLAG
	RETURN

;  *******  END OF NEW WRTBL

INITBUSIN
 IF BUSENSOR == 0
	BCF BUSIN
 ELSE
 	BSF BUSIN
 ENDIF
 	BRA SUB.C    ;GO PGM EEPROM
	
SETO2SEN			;  (mode 5)  SET/CLR O2SEN VALUE IN ENGINFO.2 
	BSF WRFLAG	;SET TO MAKE SURE PGM WAITS FOR SWITCH UP BEFORE DOING MORE
	SETF EETMR,1
	BSF EEWF		;DELAY LONG
SUB.A
	BTFSC EEWF
	BRA SUB.A		;WAIT FOR TMR3 INT TO CLEAR THIS	
	BTFSC CSON		;TEST COLDSTART SW	TEST FOR ALTERNATE FUNCTION 
	BRA SUB.B		;COLD START ON SO DO SET WB BIT
	BCF O2SEN		;NOT ON SO CLR WB 
	BRA SUB.C		;GO WRITE IT TO EEPROM
SUB.B
	BSF O2SEN
SUB.C					;write new value to eeprom
	MOVLW 01		;SET WORD COUNT (16 is max)
	MOVWF WC,1
	MOVLW ENGINFOADR			;SET EEPROM ADDRESS FOR ENGINFO  (O6)
	MOVWF WSAL,1
	CLRF WSAH,1
	MOVLW LOW ENGINFO	;WHERE TO GET DATA FROM   (LSB ONLY)
	MOVWF FSR1L,0		;WHERE TO READ DATA FROM RAM
	MOVLW HIGH ENGINFO
	MOVWF FSR1H,0		;ALL VARS ARE IN BK 1
	CALL EEWR		;WRITE IT TO EEPROM 
	BTFSC EEWERF	;TEST FOR WRITE ERROR
	GOTO INIT.ER		;S&S
	RETURN
	
;SETBUSIN			;  (mode 5)  SET/CLR BUSIN VALUE  **************************  replaced by SETO2SEN
;	BSF WRFLAG	;SET TO MAKE SURE PGM WAITS FOR SWITCH UP BEFORE DOING MORE
;	SETF EETMR,1
;	BSF EEWF		;DELAY LONG
;SUB.A
;	BTFSC EEWF
;	BRA SUB.A		;WAIT FOR TMR3 INT TO CLEAR THIS	
;	BTFSC CSON		;TEST COLDSTART SW	TEST FOR ALTERNATE FUNCTION (SET/CLR BUSIN)
;	BRA SUB.B		;COLD START ON SO DO SET BUSIN BIT
;	BCF BUSIN		;NOT ON SO CLR BUSIN  BUSIN = ENGINFO,5,1
;	BRA SUB.C		;GO WRITE IT TO EEPROM
;SUB.B
;	BSF BUSIN
;SUB.C					;write new value to eeprom
;	MOVLW 01		;SET WORD COUNT (16 is max)
;	MOVWF WC,1
;	MOVLW ENGINFOADR			;SET EEPROM ADDRESS FOR ENGINFO  (O6)
;	MOVWF WSAL,1
;	CLRF WSAH,1
;	MOVLW LOW ENGINFO	;WHERE TO GET DATA FROM   (LSB ONLY)
;	MOVWF FSR1L,0		;WHERE TO READ DATA FROM RAM
;	MOVLW HIGH ENGINFO
;	MOVWF FSR1H,0		;ALL VARS ARE IN BK 1
;	CALL EEWR		;WRITE IT TO EEPROM 
;	BTFSC EEWERF	;TEST FOR WRITE ERROR
;	GOTO INIT.ER		;S&S
;	RETURN


INITSECDIF			;  (mode 6?)  SET DEFAULT SECDIF VALUE  (SETS BOTH STAGE 1 AND STAGE 2 DIFFERENTIALS
	BSF WRFLAG	;SET TO MAKE SURE PGM WAITS FOR SWITCH UP BEFORE DOING MORE
	SETF EETMR,1
	BSF EEWF		;DELAY LONG
ISD.A
	BTFSC EEWF
	BRA ISD.A		;WAIT FOR TMR3 INT TO CLEAR THIS	
	BTFSC CSON		;TEST COLDSTART SW	TEST FOR ALTERNATE FUNCTION (SET/CLR LGSEC)
	BRA ISD.B		;COLD START ON SO DO SET/CLR LGSEC BIT
	BTFSS LSEC		;TEST ENGINFO FOR LGSEC FLAG
	BRA ISD.F		;SET NO ADJ IF NOT
	MOVLW 0x33		;SET EMPIRICAL VALUE FOUND ON N84TC,
	BRA ISD.E		;GO SET IT	
ISD.F
 IF (ENG==0xA3)||(ENG==0xB0)
 	MOVLW 0x40		;DETERMINED FROM LOOKING AT N109TC 
 ELSE
	MOVLW 0x80		;NO ADJUST VALUE
 ENDIF
ISD.E
	MOVWF SECDIF,1	;SET RAM
	MOVLW 01		;SET WORD COUNT (16 is max)
	MOVWF WC,1
	MOVLW SECDIFADR			;SET EEPROM ADDRESS FOR SECDIF
	MOVWF WSAL,1
	CLRF WSAH,1
	MOVLW LOW SECDIF	;WHERE TO GET DATA FROM   (LSB ONLY)
	MOVWF FSR1L,0		;WHERE TO READ DATA FROM RAM
	MOVLW HIGH SECDIF
	MOVWF FSR1H,0		;ALL VARS ARE IN BK 1
	CALL EEWR		;WRITE IT TO EEPROM 
	BTFSC EEWERF	;TEST FOR WRITE ERROR
	GOTO INIT.ER		;S&S
	RETURN
ISD.B
	BTFSS PGMV,7,1	;TEST MSB FOR SET OR CLEAR FUNCTION
	BRA ISD.C		;GO CLEAR THE LGSEC ENGINFO BIT
	BSF LSEC		;SET IT
	BRA ISD.D
ISD.C
	BCF LSEC
ISD.D				;UPDATE BIT IN EEPROM
	MOVLW 01		;SET WORD COUNT (16 is max)
	MOVWF WC,1
	MOVLW ENGINFOADR		;SET EEPROM ADDRESS FOR ENGINFO
	MOVWF WSAL,1
	CLRF WSAH,1
	MOVLW LOW ENGINFO	;WHERE TO GET DATA FROM   (LSB ONLY)
	MOVWF FSR1L,0	;WHERE TO READ DATA FROM RAM
	MOVLW HIGH ENGINFO
	MOVWF FSR1H,0	;ALL VARS ARE IN BK 1
	CALL EEWR		;WRITE IT TO EEPROM 
	BTFSC EEWERF	;TEST FOR WRITE ERROR
	GOTO INIT.ER		;S&S
	RETURN
	
	
	
INITIPW		;INIT IPW CLOCK RATE (POWER UP INIT ONLY, NEVER IN RUN MODE)
	BSF WRFLAG	;SET TO MAKE SURE PGM WAITS FOR SWITCH UP BEFORE DOING MORE
	MOVLW 01		;SET WORD COUNT
	MOVWF WC,1
	MOVLW IPWCRADR		;SET WSA (WORD START ADDRESS IN EEPROM)
	MOVWF WSAL,1
	CLRF WSAH,1
	MOVLW D'170'		;w/170 IN CASE WE FORGET TO LOAD ANYTHING ELSE WHEN SETING UP A NEW ENGINE
 IF MAPSENSOR == 0		;MPX4250 VALUE
  IF ROTARY == 0		  ;MOST PISTON ENGINES
   IF (ENG==0xA9)||(ENG==0xB5)
   	IF CONT==1	
		MOVLW D'160'	;TP 2 RUNS SLOWER ON CONT OPTION, LONGER IPW FOR A/C ENGINE
    ELSE
     	IF (TURBO ==1)
    		MOVLW D'220'
    	ELSE
			MOVLW D'208'		;172 (ALL 0xA9s ARE 4250 MAP SENSORS)
		ENDIF
    ENDIF
   ENDIF
   IF ENG==0xAD
   		MOVLW D'206'		;w/115 GIVES 15 MS IPW @ 30" hG
   ENDIF
   IF ENG==0xB2
   	IF TBINJ==1
   		MOVLW D'206'		;w/170 LOWER VALUE FOR TBI VERSION, WE DON'T KNOW INJECTOR FLOW RATE
   	ELSE
   		MOVLW D'211'		;w/174 MUST VERIFY 05-11-07
   	ENDIF
   ENDIF
   IF ENG==0xB3
   		MOVLW D'206'		;w 170
   ENDIF
   IF ENG==0xB4
   		MOVLW D'182'	;w/ 150 HONDA MAY BE HIGHER REVING ENGINE
   ENDIF
   IF ENG==0xAF
   		MOVLW D'182'	;w/150
   ENDIF				
   IF (ENG==0xAB)||(ENG==0xAA)
		MOVLW D'175'		;w/194
   ENDIF
   IF (ENG==0xB1)
   		MOVLW D'175'		;w/
   ENDIF
   IF (ENG==0xA6)||(ENG==0xA7)||(ENG==0xAC)||(ENG==0xAE)  ;,EJ25,SVX   ****** needs updated IPW w/ snubber  *********
   	IF A72007 == 1
   		MOVLW D'220'		;BASED ON TEST RESULTS
   	ELSE 
		MOVLW D'200'		;w/180 15 MS IPWC @ 30" Hg
	ENDIF
   ENDIF
   IF (ENG==0xA5)   ;HEXADYNE VALUE
		MOVLW D'206'		;w/170
   ENDIF					
  ELSE			;ROTARIES  (OTHER THAN PISTON ENGINES)
   IF ONEINJ == 0		;0 = 2 INJECTOR / CHAMBER (ROTARY) ENGINES,  1 = SINGLE INJECTOR VERSION
	BTFSS LSEC			;2 INJECTOR TYPE : TEST ENGINFO BIT
	BRA II.A			;STANDARD ENG W/ SIMILAR PRI & SEC INJECTORS
II.B
		MOVLW D'220'		;182 LGSEC ENGINE W/RED RENESIS PRIMARIES 8-20-07  
		BRA II.Z
II.A					;ROTARY BUT NOT LGSEC ENGINES
	IF (ENG==0xA3)||(ENG==0xB0)
		MOVLW D'164'	;w/160 (was 118) 20B ENGINES HAVE TURBO INJECTORS  (550 CC/MIN) increased 08-10-11 
	ELSE
	 IF BREW==1
	   	MOVLW D'164'	;w/ BREW ENG HAVE LARGER INJECTORS.
	 ELSE
	  IF TURBO == 1
	    MOVLW D'160'
	  ELSE
		MOVLW D'162'	;  was 162  460 CC/MIN INJECTORS  Transorb snubber value for equal injectors
	  ENDIF
	 ENDIF
	ENDIF
		BRA II.Z							;ec2 bo
								;12-29-04  changed to 142 after changing IPWCalc rout to decrease map by 22.  Back to 134 3/20/05
   ELSE					;FOR ONE INJECTOR ROTARIES W/ BIG SINGLE INJECTORS
		MOVLW D'170'	;
   ENDIF					;END OF ONE INJ TEST
  ENDIF					;END OF ENGINES OTHER THAN MOST PISTONS (ROTARIES)
 ELSE     ;ELSE CASE FOR IF MAPSENSOR != 0  ;MPX4115 VALUE
		MOVLW D'194'		;w/ 160 ALL ENGINES USING OLD MAP SENSOR (NOT MANY)   
 ENDIF						;END OF MAP SENSOR IF
;*****************
II.Z
	MOVWF PR2,0		;LOAD TIMER 2 PERIOD REG
	MOVWF IPWCR,1		;PUT IN RAM LOCATION TOO
	LFSR 1,IPWCR		;LOAD FSR W/ RAM DATA ADDR (WHERE TO GET DATA TO WRITE)
	CALL EEWR		;WRITE IPW RATE TO EEPROM (ADR 4)
	RETURN

INITIPWRNG		;INIT MAPL&H OFFSET FOR MIN IPW AT MIN MAP RATE (CONTROLLS DYNAMIC RANGE OF IPW VS MAP)
	BSF WRFLAG	;SET TO MAKE SURE PGM WAITS FOR SWITCH UP BEFORE DOING MORE
	MOVLW 01		;SET WORD COUNT
	MOVWF WC,1
	MOVLW IPWRNGADR		;SET WSA (WORD START ADDRESS IN EEPROM)
	MOVWF WSAL,1
	CLRF WSAH,1
 	MOVLW IRNG			;CONSTANT FROM ENGINE PARAMETER TABLE			 	
	MOVWF IPWRNG,1		;LOAD RAM LOCATION
	LFSR 1,IPWRNG		;LOAD FSR W/ RAM DATA ADDR (WHERE TO GET DATA TO WRITE)
	CALL EEWR		;WRITE IPW RATE TO EEPROM
	RETURN

INITIPWMIN		;INIT MAPL&H OFFSET FOR MIN IPW AT MIN MAP RATE (CONTROLLS DYNAMIC RANGE OF IPW VS MAP)
	BSF WRFLAG	;SET TO MAKE SURE PGM WAITS FOR SWITCH UP BEFORE DOING MORE
	MOVLW 01		;SET WORD COUNT
	MOVWF WC,1
	MOVLW IPWMINADR		;SET WSA (WORD START ADDRESS IN EEPROM)
	MOVWF WSAL,1
	CLRF WSAH,1
 	MOVLW IPMIN			;CONSTANT FROM ENGINE PARAMETER TABLE			 	
	MOVWF IPWMIN,1		;LOAD RAM LOCATION
	LFSR 1,IPWMIN		;LOAD FSR W/ RAM DATA ADDR (WHERE TO GET DATA TO WRITE)
	CALL EEWR		;WRITE IPW RATE TO EEPROM
	RETURN

INITENGCODE
	MOVLW ENG		;WRITE ENGINE TYPE SO INIT CAN TELL THIS HAS BEEN DONE BEFORE
	MOVWF WRK,1		;LOAD FLAG IN RAM
	MOVLW 01		;SET WORD COUNT (16 is max)
	MOVWF WC,1
	MOVLW ENGCODEADR		;SET WSA WHERE TO WRITE IN EEPROM (INIT FLAG)
	MOVWF WSAL,1		;LOAD FSR W/ RAM START DATA ADDR
	CLRF WSAH,1
	LFSR 1,WRK		;WHERE TO READ DATA FROM RAM  (ADR OF WRK)	
	CALL EEWR		;WRITE IT TO EEPROM 
	BTFSC EEWERF	;TEST FOR WRITE ERROR  
	GOTO INIT.ER		;S & Spin	
	CLRF WRK,1		;CLEAR WRK SO WE CAN SEE IF READ WORKED
			;NOW READ IT BACK & VERIFY FLAG AS ENG TYPE
	MOVLW 01		;SET WORD COUNT (16 is max)
	MOVWF WC,1
	MOVLW ENGCODEADR		;SET WSA (INIT FLAG)
	MOVWF WSAL,1		;LOAD FSR W/ EEPRRROM READ ADDRESS
	CLRF WSAH,1
	LFSR 1,WRK		;WHERE TO STORE DATA READ FROM EEPROM
	CALL EERD		;READ EEPROM 
	MOVLW ENG		;SEE IF IT IS SUCCESSFULY WRITTEN
	CPFSEQ WRK,1    ;
	GOTO INIT.ER		;DO ERROR ROUT IF BAD  S&S
	BCF EEBF		;CLR EE BAD FLAG
	RETURN	

INITBL			;INIT MAP TABLE 
	BSF WRFLAG	;SET TO MAKE SURE PGM WAITS FOR SWITCH UP BEFORE DOING MORE
	SETF EETMR,1
	BSF EEWF		;DELAY LONG ENOUGH FOR CLDSW TO GO HIGH
IT.A
	BTFSC EEWF
	BRA IT.A		;WAIT FOR TMR3 INT TO CLEAR THIS	
	LFSR 1,MTAB		;INIT RAM MAP TABLE 200 - 280 WITH 80 (128 DEC)
	MOVLW 0x80		;COUNTER FOR BYTE COUNT
	MOVWF CTR,1
	BTFSS CLDSW		;IF COLD START ON, do N84TC table setup
	BRA IT.0A
IT.0				;IF NOT, LOAD WITH DEFAULT VALUE
	MOVLW 0x80
	MOVWF POSTINC1,0
	DECFSZ CTR,1,1
	BRA IT.0
IT.00			;NOW SAVE IT IN EEPROM

IT.1
	MOVLW 0x80		;SET WORD COUNT 
	MOVWF WC,1
	CLRF WSAH,1
	MOVLW EEMTAB		;LOAD EEPROM START ADDRESS
	MOVWF WSAL,1
	LFSR 1,MTAB			;SET RAM MAP TABLE START ADDRESS
	CALL EEWR		;WRITE IT TO EEPROM & CK EEWR FIRST 
	BTFSC EEWERF	;TEST FOR WRITE ERROR
	GOTO INIT.ER		;S&S
	RETURN

IT.0A
	BCF INTCON,GIE,0	;DISABLE ALL INTERRUPTS
	MOVLW 0x00		;LOAD TBLPTRL W/TABLE ADDRESS
	MOVWF TBLPTRL,0
	MOVLW 0x20		;MSB		(moved from $950 to $2000 to give more room for program expansion room)
	MOVWF TBLPTRH,0
	CLRF TBLPTRU,0
	MOVLW 0x80		;NUMBER OF 8 BIT PGM MEMORY ADDRESSES TO READ
	MOVWF CTR,1
IT.0B
	TBLRD *+		;READ BYTE AT TBLPTR TO TABLAT
	MOVFF TABLAT,POSTINC1	; BYTE IN TABLAT TO RAM MAP TABLE 
	DECFSZ CTR,1,1		;REPEAT UNTIL DONE
	BRA IT.0B
	BSF INTCON,GIE,0	;ENABLE INTERRUPTS
	BRA IT.00		;COPY MAP RAM TO EEPROM WHEN DONE

INITDIF 		;MODE 4 INIT
	BSF WRFLAG	;SET TO MAKE SURE PGM WAITS FOR SWITCH UP BEFORE DOING MORE
	MOVLW 0x80
	MOVWF R1DIF,1
	MOVWF R2DIF,1
	MOVLW 02		;SET WORD COUNT
	MOVWF WC,1
	MOVLW R1DIFADR		;SET WSA (WORD START ADDRESS IN EEPROM)
	MOVWF WSAL,1
	CLRF WSAH,1
	MOVLW LOW R1DIF		;LOAD FSR W/ RAM DATA ADDR   (GETS LSB ONLY) (ALL MAIN VARS ARE IN BK 1)
	MOVWF FSR1L,0
	MOVLW HIGH R1DIF
	MOVWF FSR1H,0
	CALL EEWR		;WRITE IT TO EEPROM
	BTFSC EEWERF	;TEST FOR WRITE ERROR
	GOTO INIT.ER		;S&S
	BSF EEWF	; EEPROM WRITE FLAG (FOR A DELAY)
	SETF EETMR,1	;LONG DELAY
INITDIF.1			
	BTFSC EEWF
	BRA INITDIF.1
	MOVLW 0x80
	MOVWF R1DIFA,1
	MOVWF R2DIFA,1
	MOVLW 02		;SET WORD COUNT
	MOVWF WC,1
	MOVLW R1DIFAADR		;SET WSA (WORD START ADDRESS IN EEPROM)
	MOVWF WSAL,1
	CLRF WSAH,1
	MOVLW LOW R1DIFA		;LOAD FSR W/ RAM DATA ADDR   (GETS LSB ONLY) (ALL MAIN VARS ARE IN BK 1)
	MOVWF FSR1L,0
	MOVLW HIGH R1DIFA
	MOVWF FSR1H,0
	CALL EEWR		;WRITE IT TO EEPROM
	BTFSC EEWERF	;TEST FOR WRITE ERROR
	GOTO INIT.ER		;S&S
	RETURN

INITENGINFO		;CALLED BY EEINIT ON 1ST POWER-UP  (CONTAINS EC2 CONFIGURATION DATA FOR FUTURE REFERENCE WHEN UPDATING SOFTWARE)
	BSF WRFLAG	;SET TO MAKE SURE PGM WAITS FOR SWITCH UP BEFORE DOING MORE
 	MOVLW ENGINFOADR	;GET THE EEPROM ENGINFO WORD
 	MOVWF WSAL,1
 	CLRF WSAH,1
 	MOVLW 0x01
 	MOVWF WC,1
 	LFSR 1,WRK
 	CALL EERD			;READ EEPROM FOR ENGINFO  (NOW IN WRK)
 IF TURBO==1				;SETUP ENGINFO BITS EARLY-ON SO THESE WORK CORRECTLY
	BSF ENGINFO,0,1		;SET TURBO BIT IN ENGINFO BYTE IF TURBO
 ELSE
	BCF ENGINFO,0,1
 ENDIF
 IF LGSEC==1
	BSF ENGINFO,1,1		;SET LGSEC BIT IN ENGINFO IF LGSEC CONSTANT SET
 ELSE 
	BCF ENGINFO,1,1		;CLR IF CLEAR
 ENDIF
 IF WIDEBAND==1
	BSF ENGINFO,2,1		;SET O2SEN BIT IN ENGINFO IF WIDEBAND CONSTANT SET  01-21-13
 ELSE 
	BCF ENGINFO,2,1		;CLR IF CLEAR
 ENDIF
 IF TEMPSENSOR==1
	BSF ENGINFO,3,1		;SET TEMPSENSOR BIT IN ENGINFO IF TEMPSENSOR CONSTANT SET
 ELSE 
	BCF ENGINFO,3,1		;CLR IF CLEAR
 ENDIF
 IF ROTARY==1		;SET OR CLR ROTARY ENGINE IN USE  (WAS MAP SENSOR (1-5-09)
	BSF ENGINFO,4,1
 ELSE
	BCF ENGINFO,4,1
 ENDIF
 IF BUSENSOR==1			;INITIAL SETUP DESIGNATION
	BSF ENGINFO,5,1		;SET BUSENSOR BIT IN ENGINFO IF BUSENSOR CONSTANT SET
 ELSE 
	BCF ENGINFO,5,1		;CLR IF CLEAR
 ENDIF 
 IF CONT==1
	BSF ENGINFO,6,1		;SET CONT BIT IN ENGINFO IF CONT CONSTANT SET
 ELSE 
	BCF ENGINFO,6,1		;CLR IF CLEAR
 ENDIF
;	BSF ENGINFO,7,1		;NOW USED FOR REAL TIME CSON  (all are rpm map type now)

	MOVLW 01		;SET WORD COUNT
	MOVWF WC,1
	MOVLW ENGINFOADR		;SET WSA (ADDRESS OF ENGINFO IN EEPROM)
	MOVWF WSAL,1
	CLRF WSAH,1
	MOVLW LOW ENGINFO		;LOAD FSR W/ RAM DATA ADDR (WHERE TO GET DATA TO STORE IN EEPROM)  (GETS LSB ONLY) 
	MOVWF FSR1L,0
	MOVLW HIGH ENGINFO
	MOVWF FSR1H,0
	CALL EEWR		;WRITE IT TO EEPROM
	BTFSC EEWERF	;TEST FOR WRITE ERROR
	GOTO INIT.ER		;S&S
	RETURN
	
INITRPMTH		;INIT RPM MCT THRESHOLD  (NOT A MAP TABLE ADDRESS)
 	MOVLW D'131'		; made it the same     MATRIX CHANGE FROM 0B TO 05
	MOVWF RPMTHRESH,1	; FOR STAGE THRESHOLD BELOW WHICH STAGING WILL OCCURE
	MOVLW 01		;SET WORD COUNT
	MOVWF WC,1
	MOVLW RPMTHRESHADR		;SET WSA (WORD ADDRESS IN EEPROM FOR RPMTHRESH)
	MOVWF WSAL,1
	CLRF WSAH,1
	MOVLW LOW RPMTHRESH		;LOAD FSR W/ RAM DATA ADDR  (GETS LSB ONLY)
	MOVWF FSR1L,0
	MOVLW HIGH RPMTHRESH
	MOVWF FSR1H,0		;ALL VARS ARE IN BK1
	CALL EEWR		;WRITE IT TO EEPROM
	BTFSC EEWERF	;TEST FOR WRITE ERROR
	GOTO INIT.ER		;S&S
	RETURN
	
INITSTG 			;FUNC 7 INIT STAGing point
 IF ROTARY == 0		;NO FUNC ON NON ROTARY
	RETURN
 ELSE	
	BSF WRFLAG	;SET TO MAKE SURE PGM WAITS FOR SWITCH UP BEFORE DOING MORE
  
	MOVLW D'234'		;NA & LGSEC INJ SO 20" STAGE 

	MOVWF STHRESH,1	; FOR STAGE THRESHOLD BELOW WHICH STAGING WILL OCCURE
	MOVLW 01		;SET WORD COUNT
	MOVWF WC,1
	MOVLW STHRESHADR		;SET WSA (WORD ADDRESS IN EEPROM FOR STHRESH)
	MOVWF WSAL,1
	CLRF WSAH,1
	MOVLW LOW STHRESH		;LOAD FSR W/ RAM DATA ADDR  (GETS LSB ONLY)
	MOVWF FSR1L,0
	MOVLW HIGH STHRESH
	MOVWF FSR1H,0		;ALL VARS ARE IN BK1
	CALL EEWR		;WRITE IT TO EEPROM
	BTFSC EEWERF	;TEST FOR WRITE ERROR
	GOTO INIT.ER		;S&S
	RETURN

IS2.D				;UPDATE BIT IN EEPROM
	MOVLW 01		;SET WORD COUNT (16 is max)
	MOVWF WC,1
	MOVLW ENGINFOADR		;SET EEPROM ADDRESS FOR ENGINFO
	MOVWF WSAL,1
	CLRF WSAH,1
	MOVLW LOW ENGINFO	;WHERE TO GET DATA FROM   (LSB ONLY)
	MOVWF FSR1L,0	;WHERE TO READ DATA FROM RAM
	MOVLW HIGH ENGINFO
	MOVWF FSR1H,0	;ALL VARS ARE IN BK 1
	CALL EEWR		;WRITE IT TO EEPROM 
	BTFSC EEWERF	;TEST FOR WRITE ERROR
	GOTO INIT.ER		;S&S
	RETURN
 ENDIF
 
INITO2THRESH		;INIT RPM MCT THRESHOLD  (NOT A MAP TABLE ADDRESS)
 	MOVLW D'20'		; ~55% FOUND THAT A LOWER SETTING GAVE BETTER RESULTS ON 109TC, THIS IS USER SETABLE. 
	MOVWF O2THRESH,1	; CENTER OF CLOSED LOOP O2 THRESHOLD
	MOVLW 01		;SET WORD COUNT
	MOVWF WC,1
	MOVLW O2THRESHADR		;SET WSA (WORD ADDRESS IN EEPROM FOR O2THRESH)
	MOVWF WSAL,1
	CLRF WSAH,1
	MOVLW LOW O2THRESH		;LOAD FSR W/ RAM DATA ADDR  (GETS LSB ONLY)
	MOVWF FSR1L,0
	MOVLW HIGH O2THRESH
	MOVWF FSR1H,0		;ALL VARS ARE IN BK1
	CALL EEWR		;WRITE IT TO EEPROM
	BTFSC EEWERF	;TEST FOR WRITE ERROR
	GOTO INIT.ER		;S&S
	RETURN

SETO2THRESH 
	MOVF O2L,0,1		;GET CURRENT O2 READING
	MOVWF O2THRESH,1		;STORE 		(LABEL ADDED FOR BLUE MOUNTAIN)
	MOVLW 01			;SET WORD COUNT
	MOVWF WC,1
	MOVLW O2THRESHADR			;SET WSA (STHRESH STORAGE ADDRESS IN EEPROM)
	MOVWF WSAL,1
	CLRF WSAH,1
	MOVLW LOW O2THRESH		;LOAD FSR W/ RAM DATA ADDR  (GETS LSB ONLY)
	MOVWF FSR1L,0
	MOVLW HIGH O2THRESH
	MOVWF FSR1H,0		;ALL VARS IN BK1
	CALL EEWR		;WRITE IT TO EEPROM
	RETURN
 
SETSTG				;set stage 1 address to the current map pointer + 1.
  IF ROTARY==1
  	TSTFSZ MAPH		;TEST FOR MAP TOO HIGH (MSN OF MAP SET)
  	RETURN			;RET IF TOO HIGH
  	MOVLW D'174'			;CK FOR MIN ALLOWED MP  (16")
  	CPFSGT MAPL,1
  	RETURN				;EXIT IF TOO LOW
	MOVF MAPL,0,1		;GET MAPL
	MOVWF AARGL,1		;SAVE IN AARGL
SETIS
	MOVWF STHRESH,1		;STORE 		(LABEL ADDED FOR BLUE MOUNTAIN)
	MOVLW 01			;SET WORD COUNT
	MOVWF WC,1
	MOVLW STHRESHADR			;SET WSA (STHRESH STORAGE ADDRESS IN EEPROM)
	MOVWF WSAL,1
	CLRF WSAH,1
	MOVLW LOW STHRESH		;LOAD FSR W/ RAM DATA ADDR  (GETS LSB ONLY)
	MOVWF FSR1L,0
	MOVLW HIGH STHRESH
	MOVWF FSR1H,0		;ALL VARS IN BK1
	CALL EEWR		;WRITE IT TO EEPROM
	RETURN
  ELSE
	RETURN			;NOT A ROTARY, SO EXIT
  ENDIF 

SETRPMTHRESH		;SETS THE MAX MANIFOLD PRESSURE AT WHICH THE MAP POINTER WILL BE BASED ON RPM .  aBOVE THIS MP, THE POINTER WILL USE MP AND RPM TO GENERATE MAP ADR.
;					set RPM MCT THRESHOLD to the current map pointer + 1.  (EC4 mode 2, cs on, Mode 7 on ec3, ALT 7 (cldstr) on rotary) 
	TSTFSZ MAPH,1
	RETURN			;EXIT IF TOO HIGH
	MOVFF MAPL,RPMTHRESH		;load MAPL in ram 	
	MOVLW 01			;SET WORD COUNT
	MOVWF WC,1
	MOVLW RPMTHRESHADR			;SET WSA (RPMTHRESH STORAGE ADDRESS IN EEPROM)
	MOVWF WSAL,1
	CLRF WSAH,1
	MOVLW LOW RPMTHRESH		;LOAD FSR W/ RAM DATA ADDR  (GETS LSB ONLY)
	MOVWF FSR1L,0
	MOVLW HIGH RPMTHRESH
	MOVWF FSR1H,0		;ALL VARS IN BK1
	CALL EEWR		;WRITE IT TO EEPROM
	RETURN  

RDIF1			;ADJUST ROTOR 1 DIF.
 IF (ROTARY==1)		;WE DO THIS FOR ROTARIES ONLY)

;  **** NEW STAGE ROTOR DIFFERENTIALS 01-07-06
  	BTFSS SFLAG	
	BRA RDIF1A		;GO DO NON STAGGED DIF ADJ
	MOVF PGMV,0,1
	MOVWF R1DIF,1
	MOVLW 01		;SET WORD COUNT
	MOVWF WC,1
	MOVLW R1DIFADR		;SET WSA (WORD START ADDRESS IN EEPROM)
	MOVWF WSAL,1
	CLRF WSAH,1		
	MOVLW LOW R1DIF		;LOAD FSR W/ RAM DATA ADDR   (GETS LSB ONLY)
	MOVWF FSR1L,0
	MOVLW HIGH R1DIF
	MOVWF FSR1H,0
	CALL EEWR		;WRITE IT TO EEPROM
	RETURN
RDIF1A				;NON STAGGED ROTOR DIF ROUT
	MOVF PGMV,0,1
	MOVWF R1DIFA,1
	MOVLW 01		;SET WORD COUNT
	MOVWF WC,1
	MOVLW R1DIFAADR		;SET WSA (WORD START ADDRESS IN EEPROM)
	MOVWF WSAL,1
	CLRF WSAH,1		
	MOVLW LOW R1DIFA		;LOAD FSR W/ RAM DATA ADDR   (GETS LSB ONLY)
	MOVWF FSR1L,0
	MOVLW HIGH R1DIFA
	MOVWF FSR1H,0
	CALL EEWR		;WRITE IT TO EEPROM
	RETURN
 ELSE
	RETURN
 ENDIF
RDIF2				;ADJUST ROTOR 2 DIF. (3 rotor engines only)
 IF (ROTARY==1)		;WE DO THIS FOR ROTARIES ONLY)
  	BTFSS SFLAG		;TEST FOR STAGGING
	BRA RDIF2A		;DO NON STAGGED IF NOT 
	MOVF PGMV,0,1
	MOVWF R2DIF,1
	MOVLW 01		;SET WORD COUNT
	MOVWF WC,1
	MOVLW R2DIFADR		;SET WSA (WORD START ADDRESS IN EEPROM) (was 02, error fixed 11-07-03) 
	MOVWF WSAL,1
	CLRF WSAH,1
	MOVLW LOW R2DIF		;LOAD FSR W/ RAM DATA ADDR   (GETS LSB ONLY)
	MOVWF FSR1L,0
	MOVLW HIGH R2DIF
	MOVWF FSR1H,0	;VARS ARE IN BK1
	CALL EEWR		;WRITE IT TO EEPROM
	RETURN
RDIF2A
	MOVF PGMV,0,1
	MOVWF R2DIFA,1
	MOVLW 01		;SET WORD COUNT
	MOVWF WC,1
	MOVLW R2DIFAADR		;SET WSA (WORD START ADDRESS IN EEPROM)
	MOVWF WSAL,1
	CLRF WSAH,1
	MOVLW LOW R2DIFA	;LOAD FSR W/ RAM DATA ADDR   (GETS LSB ONLY)
	MOVWF FSR1L,0
	MOVLW HIGH R2DIFA
	MOVWF FSR1H,0	;VARS ARE IN BK1
	CALL EEWR		;WRITE IT TO EEPROM
	RETURN
 ELSE
	RETURN
 ENDIF
 
INITADJ 		;INITIALIAZE IGNITION TIMING ADJUSTMENT TO ZERO (OR SET DWELL TO RX8 OR LS1 ON A1 & A8 ENGINES W/ COLD START ON
	BSF WRFLAG	;SET TO MAKE SURE PGM WAITS FOR SWITCH UP BEFORE DOING MORE

; IF (ENG==0xA8)||(ENG==0xA1)   (decided not to do this)
;	BTFSS CLDSW		;IF COLD START ON, do RX8 / LS1 DWELL SELECTION
;	BRA INITRX8DF	;COLD SW ON SO GO SELECT DWELL
 ;ENDIF
	MOVLW 0x00		;SETUP DEFAULT TO 0
	MOVWF IGNADJ,1		; (NO CHANGE TO COMPUTED TIMING)
	MOVLW 01		;SET WORD COUNT
	MOVWF WC,1
	MOVLW IGNADJADR		;SET WSA (WORD ADDRESS IN EEPROM FOR IGNADJ)
	MOVWF WSAL,1
	CLRF WSAH,1
	MOVLW LOW IGNADJ		;LOAD FSR W/ RAM DATA ADDR   (GETS LSB ONLY)
	MOVWF FSR1L,0
	MOVLW HIGH IGNADJ
	MOVWF FSR1H,0		;VARS ARE IN BK1
	CALL EEWR		;WRITE IT TO EEPROM
	BTFSC EEWERF	;TEST FOR WRITE ERROR
	GOTO INIT.ER		;S&S
	RETURN

;INITRX8DF
; IF (ENG==0xA8)||(ENG==0xA1)
;	BTFSS PGMV,7,1		;TEST MSB OF PGM KNOB  IF KNOB IS CW FROM 12:00, CLEAR RX8COIL FLAG; GIVES 4.8 MS DWELL TIME FOR LS1 COIL
;	BRA IRX8F.0
;	BCF ENGINFO,2,1		;CLEAR THE RX8COIL BIT IN ENGINFO RAM ADDRESS (MAKES DWELL 4.8 MS FOR LS1 COIL)
;IRX8F.1
						;UPDATE IT IN EEPROM
;	MOVLW 01		;SET WORD COUNT
;	MOVWF WC,1
;	MOVLW 0x06		;SET WSA (WORD START ADDRESS IN EEPROM)
;	MOVWF WSAL,1
;	CLRF WSAH,1
;	MOVLW LOW ENGINFO	;LOAD FSR W/ RAM DATA ADDR   (GETS LSB ONLY)
;	MOVWF FSR1L,0
;	MOVLW HIGH ENGINFO
;	MOVWF FSR1H,0	;VARS ARE IN BK1
;	CALL EEWR		;WRITE IT TO EEPROM
;	BTFSC EEWERF	;TEST FOR WRITE ERROR
;	GOTO INIT.ER		;S&S
;	RETURN
;IRX8F.0
;	BSF ENGINFO,2,1		;SETS THE RX8COIL BIT IN ENGINFO RAM ADDRESS  (MAKES DWELL 2.6 MS FOR RX-8 COILS)
;	BRA IRX8F.1
; ENDIF


; int0 pin_isr_handler	;TP1INT  timing pulse 1   2 uS SERVICE TIME)

 IF (ENG<0xA4)||(ENG==0xA5)||(ENG==0xA8)||(ENG==0xB0)  
TP1INT			; 35 DEG BTDC ON 2ND GEN ROTARIES
  IF (ENG==0xA8)||(ENG==0xB0)		;why is this here?  cas should always be directed to tp2 on Renesis
		RETURN				;
;		GOTO TP2INT			;REMED OUT 11-09-06
  ELSE
		BSF T1F		;SET T1 RECIEVED FLAG
		BCF R2F		;KILL OTHER TWO ROTOR FLAGS, R1F CYCLE IS CURRENTLY RUNNING!!
		BCF R3F
		CLRF T2CNT,1
	IF ENG!= 0xA5
		BCF INTCON,INT0IE,0	;DISABLE TP1 INTS  (TWELVE T2 INTS WILL RE-ENABLE T1 INTS)
	ENDIF
		RETURN		;return from interrupt	
  ENDIF
 ENDIF   		;ENG 1-3 & 5,8

 IF ENG==0xAC		;EJ25 CAM INT ROUT
TP1INT			;  (POSITIVE EDGE OF CAM SENSOR PULSE)
	BTFSS SYNF	;ARE WE IN SYNC?
	BRA TP1.1	;NOT IN SYNC SO GO TEST FOR FIRST TP1 
	BTFSC T1F	;IS THIS THE SECOND T1F?
	BRA TP1.0	;GO HANDLE SECOND TP1
	MOVLW D'20'	;THIS IS FIRST TP1 SO TEST TP2 COUNT FOR >20
	CPFSGT T2CNT,1
	BRA TP1.A 	;T2 COUNT IS LOW SO CLEAR SYNC1 
	BCF R2F		;aLL IS WELL, CONTINUE
	BCF R3F		;KILL OTHER ROTOR FLAGS, R1F CYCLE IS CURRENTLY RUNNING!!
	BCF R4F
	CLRF T2CNT,1	;RESET T2 COUNT
	BSF T1F		;SET T1F FOR 2ND T1 HANDLER
	RETURN		;return from interrupt

TP1.0			;TP1 # 2 HANDLER
	MOVLW D'17'	;CHECK FOR EXPECTED T2 COUNT  (8-14-03  CAM SENSOR ERROR)
	CPFSLT T2CNT,1	;IF CORRECT, GO ON		(8-14-03  CAM SENSOR ERROR)
	BRA TP1.A	;GOT TOO MANY T2s SO GO KILL SYNC1 AND START LOOKING FOR SYNC
	BCF T1F		;KILL T1 FLAG
	BCF INTCON3,INT1IE,0	;DISABLE INTS UNTIL TP2 COUNT =60 RE-ENABLES THEM CLR THE T2 INT FLAG
			;EXIT WITHOUT CLEARING T2CNT
	RETURN

TP1.A			;ERROR CONDITION, WE THINK THIS IS 2ND T1 BUT T2 CNT IS HIGH.  RESET & SEARCH FOR SYNC
	BCF T0CON,TMR0ON,0	;STOP TIMER
	CLRF STAT0,1	;KILL ALL RUN FLAGS
	CLRF SEQFLAG,1	;CLR SEQUENCE FLAGS
	CLRF STAT1,1	;WAS STAT4
	CLRF T2CNT,1
	BCF INTCON3,INT1IF,0	;CLR THE CAM SENSOR (TP2) INT FLAG
	bsf INTCON3,INT1IE,0	;enable CAM ints
;	BCF INTSTA,INTF	;KILL ANY PENDING T1 INT   (OLD, WE SWITCHED INPUTS AROUND)
;	BSF INTSTA,INTE	;ENABLE TP1 INT
	RETURN

TP1.1			;NOT IN SYNC BUT SEE IF THIS IS TP1 #1
	MOVLW D'17'	;TEST TP2 COUNT FOR > 17
	CPFSGT T2CNT,1
	BRA TP1.A	;T2CNT < = 17 SO THIS IS #2 TP1 SO GO SETUP FOR FINDING #1
	BSF SYNF	;FIRST T1 FOUND, SET SYNC1
	BSF T1F		;SET T1 FLAG
	CLRF T2CNT,1	;CLEAR COUNT
	RETURN
 ENDIF			;END OF AC EJ25 CAM SENSOR INT
 
 IF ENG==0xA7			;EJ22/	EJ25 JSPEC ENGINE (1-2-1-3 CAM, 1-2-1-2 CRANK) (most common we think)
TP1INT
  IF A72007==0					;This is CAM sensor
	INCF T1CNT,1,1
	SETF DTCL,1			;FILL DEAD TIME CTR
	MOVLW 3
	CPFSEQ T1CNT,1
	RETURN	
	BSF SYNF		;SET SYNC FLAG, 3 CAM TRIGGERS FOUND (SINCE LAST TP2)
	CLRF T2CNT,1	;CLEAR T2 COUNT
	CLRF SEQFLAG,1		;CLEAR SEQUENCE COUNT
	RETURN
  ELSE				;IF THIS IS A 2007 OR LATER ENGINE
  	MOVLW D'27'
  	CPFSLT T2CNT,1
  	BSF T1F			;SET CAM FLAG FOUND
  	RETURN
  ENDIF
 ENDIF

 IF ENG==0xAD		;SUZUKI CAM SENSOR (TRAILING/(NEGATIVE) EDGE OF PULSE, CAM SENSOR IS POSITIVE OUTPUT WHEN SENSING TRIGGER
TP1INT	
;	BSF ALT			;SET ALT FLAG TO SYNC COIL & INJECTOR CYCLE			 NEW ALT STRATEGY 4-5-05
	RETURN			;CAM SENSOR NO LONGER USED ON SUZI
 ENDIF
 
 IF (ENG==0xB3  && TBINJ==0) 
TP1INT
	BSF T1F
	CLRF T2CNT,1     ;RESET T2 COUNT
	BSF SYNF			;SET SO WE KNOW WE HAD ONE (GETS CLEARED BY DTC TIMEOUT)
	RETURN
 ENDIF
 	
;****** TIMER0 INTERRUPT SERVICE HANDLER

 IF (ENG==0xA1)||(ENG==0xA2)||(ENG==0xA4)||(ENG==0xA5)||(ENG==0xA8)||(ENG==0xA9)||(ENG==0xAD)
TM0INT
	BCF T0CON,TMR0ON,0	;STOP IT
	BCF INTCON,TMR0IF,0
	BTFSC T2F	;TEST FOR OVERFLOW OF T2 INTERVAL
	BRA TM0.ER	; EXIT IF OVF
	btfsc R1F	;TEST for rot. 1 lead plug fire flag
	BRA TM0.0		;go fire it if flag set
	btfsc R2F	;Rotor 2 lead flag set?
	BRA TM0.1		;do it if set
	RETFIE 1
	
TM0.ER
	CLRF STAT0,1
	RETFIE 1

  IF (ENG == 0xAD)  ;SUZUKI 4
TM0.0 				; (R1F set)
	BCF R1F			;CLEAR THE FLAG
	BTG ALT
	BTFSS ALT		;TEST FOR CYL 1 OR 4
	BRA TM0.0A
	BTFSC LSF
	BRA TM0.00		;skip spark if lsf used
	BCF FC1		;fire 1
	BCF FC4		; NEW ALT STRATEGY 4-5-05
TM0.00
	BTFSC REVF	;TEST FOR REV LIMITER FLAG, SKIP INJ IF SET
	BRA TM0.0Z
	BSF FI4			;SQUIRT 4							NO
	MOVFF IPWL,R4ITL	;LOAD ROTOR 4 IPW TIMER WITH IPW
	MOVFF IPWH,R4ITH 
	BSF INJ4		;SET DECREMENT FLAG FOR TIMER 2 ROUT
TM0.0Z
	MOVFF DWL,LP2D		;load lead plug 2&3 dwell count;SUZ IS A 180 DEG  ENG
	MOVFF DWLH,LP2DH
	RETFIE 1

TM0.0A
	BTFSC LSF
	BRA TM0.00A		;skip spark if lsf used
	BCF FC4		;FIRE 4
	BCF FC1		; NEW ALT STRATEGY 4-5-05
TM0.00A
	BTFSC REVF	;TEST FOR REV LIMITER FLAG, SKIP INJ IF SET
	BRA TM0.0Y
	BSF FI1			;SQUIRT 1								YES
	MOVFF IPWL,R1ITL	;LOAD CYL 1 IPW TIMER WITH IPW
	MOVFF IPWH,R1ITH 
	BSF INJ1		;SET DECREMENT FLAG FOR TIMER 2 ROUT
TM0.0Y	
	MOVFF DWL,LP2D		;load lead plug 2&3 dwell count SUZ IS A 180 ENGINE 180 DEG BETWEEN DELAY START & SPARK
	MOVFF DWLH,LP2DH
	RETFIE 1
 
TM0.1 				; (R2F set)   CYL 3 OR 2
	bcf R2F			;CLEAR THE FLAG  
	BTFSS ALT		;TEST FOR CYL 1 OR 4
	BRA TM0.1A
	BTFSC LSF
	BRA TM0.01		;skip spark if lsf used
	bcf FC2		;fire 2
	BCF FC3		; NEW ALT STRATEGY 4-5-05
TM0.01
	BTFSC REVF	;TEST FOR REV LIMITER FLAG, SKIP INJ IF SET
	BRA TM0.1Z
	BSF FI3			;SQUIRT 3								YES
	MOVFF IPWL,R3ITL	;LOAD CYL 3 IPW TIMER WITH IPW
	MOVFF IPWH,R3ITH
	BSF INJ3		;SET DECREMENT FLAG FOR TIMER 2 ROUT
TM0.1Z
	MOVFF DWL,LP1D		;load l&4 DWL
	MOVFF DWLH,LP1DH
	RETFIE 1
TM0.1A
	BTFSC LSF
	BRA TM0.01A		;skip spark if lsf used
	BCF FC3		;FIRE 3
	BCF FC2		; NEW ALT STRATEGY 4-5-05
TM0.01A
	BTFSC REVF	;TEST FOR REV LIMITER FLAG, SKIP INJ IF SET
	BRA TM0.1Y
	BSF FI2			;SQUIRT 2								NO
	MOVFF IPWL,R2ITL	;LOAD CYL 1 IPW TIMER WITH IPW
	MOVFF IPWH,R2ITH
	BSF INJ2		;SET DECREMENT FLAG FOR TIMER 2 ROUT
TM0.1Y
	MOVFF DWL,LP1D		;load lead plug 1&4 dwell count ;180 DEG ENGINE?
	MOVFF DWLH,LP1DH
	RETFIE 1
  ENDIF		;0xAD

  IF ENG==0xA2		;MAZDA COIL 13b
TM0.0
	bcf FC1			;fire lead coil 1 (& TRAIL COIL)
	bcf R1F			;CLEAR THE FLAG   
	movfF DWL,LP1D		;load lead plug 1 dwell count
	MOVFF DWLH,LP1DH
	BTFSC REVF	;TEST FOR REV LIMITER FLAG, SKIP INJ IF SET
	BRA S2.0C	;SKIP IF REV LIMIT	
	BSF FI3		;FIRE ROTOR 2 PRIMARY INJECTORS
	BTFSS SFLAG		;TEST FOR STAGED INJECTION FLAG
S2.0B
	BSF FI4		;FIRE SECONDARY IF STAGGED FLAG SET
	MOVFF IPW2L,R2ITL	;LOAD ROTOR 2 IPW TIMER WITH IPW
	MOVFF IPW2H,R2ITH
	BSF INJ2		;SET DECREMENT FLAG FOR TIMER 2 ROUT
S2.0C	
	BCF FC2			;FIRE TRAILING COIL TOO	
	BSF CS1SF		;TELL EXEC TO SELECT TRAIL COIL 2 
	RETFIE 1
  ENDIF             ;A2

  IF (ENG==0xA1)||(ENG==0xA4)||(ENG==0xA5)  ;(OLD A OR PS VER or hexadyne )
TM0.0 			;EVENT 
	BTFSS LSF	;LET T2 EVENT DO IT  < LSF
	bcf FC1		;fire lead coil 1
	bcf R1F			;CLEAR THE FLAG   
   IF D360==1
    IF ENG==0xA5			;A5 IS 2 CYL ENG WITH CAM SENSOR, NO WASTE SPARK.
    	MOVFF DWL,LP2D		
		MOVFF DWLH,LP2DH
	ELSE
		MOVFF DWL,LP1D		
		MOVFF DWLH,LP1DH
	ENDIF
   ELSE
	MOVFF DWL,LP2D		;LEAD PLUG 2 DWELL COUNT - OTHER ENGINES ARE 180 DEG BETWEEN TIMING DELAY START & SPARK
	MOVFF DWLH,LP2DH
   ENDIF

;   **** REV LIMIT  ****
	BTFSC REVF		;TEST REV LIMIT FLAG
	BRA TM0.0A		;SKIP INJECTION CYCLE  (LABLE WILL VARY WITH ENGINE)
;	**** REV LIMIT  ****

	BSF FI3		;FIRE ROTOR 2 PRIMARY INJECTORS (CYL #1? ON EA81)
   IF ROTARY==1 			;DON'T STAGE ON HEXADYNE OR EA81X
	BTFSS SFLAG		;TEST FOR STAGED INJECTION FLAG, SKIP SEC. INJ IF SET
   ENDIF
	BSF FI4		;FIRE SECONDARY IF STAGGED FLAG SET (CYL #X ON EA81)
   IF (ENG==0xA5)    ;			;REMOVED DIFFERENTIAL ADJ ON A5  4-23-05  ADDED A9 8-28-05, REMOVED A9 9-03-06
	MOVFF IPW1L,R2ITL	;LOAD ROTOR 2 IPW TIMER WITH IPW
	MOVFF IPW1H,R2ITH 
   ELSE
	MOVFF IPW2L,R2ITL	;LOAD ROTOR 2 IPW TIMER WITH IPW
	MOVFF IPW2H,R2ITH
   ENDIF
	BSF INJ2		;SET DECREMENT FLAG FOR TIMER 2 ROUT
TM0.0A
	BTFSS LSF	;LET T2 EVENT DO IT  < LSF
	BCF FC2		;FIRE TRAILING / CYL 4 COIL TOO
	RETFIE 1			;done so return & RE-ENABLE INTS
  ENDIF		;TM0.0  A1,4,5

  IF ENG==0xA2	;MAZDA COIL 13B
TM0.1
	bcf FC1			;fire leading plug ROTOR 2
	BCF R2F			;CLEAR THE FLAG
	MOVFF DWL,LP1D		;load lead plug dwell count
	MOVFF DWLH,LP1DH
	BTFSC REVF	;TEST FOR REV LIMITER FLAG, SKIP INJ IF SET
	BRA S2.1C
	BSF FI1			;FIRE ROTOR 1 PRIMARY INJECTORS
	BTFSS SFLAG		;TEST FOR STAGED INJECTION FLAG
S2.1B
	BSF FI2		;TURN ON SECONDARY INJECTORS IF NOT STAGED
	MOVFF IPW1L,R1ITL	;LOAD ROTOR 1 IPW TIMER WITH IPW		;
	MOVFF IPW1H,R1ITH
	BSF INJ1		;SET DECREMENT FLAG FOR TIMER 2 ROUTINE
S2.1C
	BCF FC2			;FIRE TRAIL COIL TOO	
	BSF CS1CF		;TELL EXEC TO SELECT TRAIL COIL 1
	RETFIE 1
  ENDIF		;TM0.1  A2

  IF (ENG==0xA1)||(ENG==0xA4)||(ENG==0xA5) ;(OLD A OR PS VER )
TM0.1
	BTFSS LSF	;LET T2 EVENT DO IT  < LSF
	bcf FC3		;fire leading plug ROTOR 2
	BCF R2F			;CLEAR THE FLAG
   IF D360==1
   	IF ENG==0xA5	;A5 IS 2 CYL ENG WITH CAM SENSOR, NO WASTE SPARK.
   		MOVFF DWL,LP1D		
		MOVFF DWLH,LP1DH
	ELSE
		MOVFF DWL,LP2D		;360 DEG DWELL LOAD FOR RENESIS
		MOVFF DWLH,LP2DH
	ENDIF
   ELSE
	MOVFF DWL,LP1D		;180 DEG LOAD
	MOVFF DWLH,LP1DH
   ENDIF
;   **** REV LIMIT  *********
	BTFSC REVF		;TEST REV LIMIT FLAG
	BRA TM0.1A		;SKIP INJECTION CYCLE  (LABLE WILL VARY WITH ENGINE)
;	**** REV LIMIT  ****
	BSF FI1		;FIRE ROTOR 1 PRIMARY INJECTORS
   IF ROTARY == 1			;DON'T STAGE ON HEXADYNE OR EA81X
	BTFSS SFLAG		;TEST FOR STAGED INJECTION FLAG (RUNNING ON PRIMARIES ONLY)
   ENDIF
	BSF FI2		;TURN ON SECONDARY INJECTORS IF NOT STAGED
	MOVFF IPW1L,R1ITL	;LOAD ROTOR 1 IPW TIMER WITH IPW
	MOVFF IPW1H,R1ITH
	BSF INJ1		;SET DECREMENT FLAG FOR TIMER 2 ROUTINE
TM0.1A
	BTFSS LSF	;LET T2 EVENT DO IT  < LSF
	BCF FC4		;FIRE TRAIL COIL TOO 
	RETFIE 1			;done so return & ENABLE INTS	
  ENDIF			;TM0.1 A1,4,5, END
  
  IF ENG==0xA8
TM0.0 			;EVENT
	BTFSS LSF
	bcf FC1		;fire lead coil 1
	bcf R1F			;CLEAR THE FLAG   
   IF D360==1
		MOVFF DWL,LP1D		
		MOVFF DWLH,LP1DH
   ELSE
		MOVFF DWL,LP2D		;LEAD PLUG 2 DWELL COUNT - OTHER ENGINES ARE 180 DEG BETWEEN TIMING DELAY START & SPARK
		MOVFF DWLH,LP2DH
   ENDIF

;   **** REV LIMIT  ****
	BTFSC REVF		;TEST REV LIMIT FLAG
	BRA TM0.0A		;SKIP INJECTION CYCLE  (LABLE WILL VARY WITH ENGINE)
;	**** REV LIMIT  ****

	BSF FI3		;FIRE ROTOR 2 PRIMARY INJECTORS (CYL #1? ON EA81)
   IF ROTARY==1 			;DON'T STAGE ON HEXADYNE OR EA81X
	BTFSS SFLAG		;TEST FOR STAGED INJECTION FLAG, SKIP SEC. INJ IF SET
   ENDIF
	BSF FI4		;FIRE SECONDARY IF STAGGED FLAG SET (CYL #X ON EA81)
	MOVFF IPW2L,R2ITL	;LOAD ROTOR 2 IPW TIMER WITH IPW
	MOVFF IPW2H,R2ITH
	BSF INJ2		;SET DECREMENT FLAG FOR TIMER 2 ROUT
TM0.0A
	BTFSS LSF
	BCF FC2		;FIRE TRAILING COIL TOO
	RETFIE 1			;done so return & RE-ENABLE INTS 
 
TM0.1
	BTFSS LSF
	bcf FC3		;fire leading plug ROTOR 2
	BCF R2F			;CLEAR THE FLAG
   IF D360==1
		MOVFF DWL,LP2D		;360 DEG DWELL LOAD FOR RENESIS
		MOVFF DWLH,LP2DH
   ELSE
		MOVFF DWL,LP1D		;180 DEG LOAD
		MOVFF DWLH,LP1DH
   ENDIF
;   **** REV LIMIT  *********
	BTFSC REVF		;TEST REV LIMIT FLAG
	BRA TM0.1A		;SKIP INJECTION CYCLE  (LABLE WILL VARY WITH ENGINE)
;	**** REV LIMIT  ****
	BSF FI1		;FIRE ROTOR 1 PRIMARY INJECTORS
	BTFSS SFLAG		;TEST FOR STAGED INJECTION FLAG (RUNNING ON PRIMARIES ONLY)
	BSF FI2		;TURN ON SECONDARY INJECTORS IF NOT STAGED
	MOVFF IPW1L,R1ITL	;LOAD ROTOR 1 IPW TIMER WITH IPW
	MOVFF IPW1H,R1ITH
	BSF INJ1		;SET DECREMENT FLAG FOR TIMER 2 ROUTINE
TM0.1A
	BTFSS LSF
	BCF FC4		;FIRE TRAIL COIL TOO 
	RETFIE 1			;done so return & ENABLE INTS
  ENDIF     ;END OF A8  
 

  IF (ENG==0xA9)  ;EA81 /EJ25 /60-2
TM0.0 			;EVENT
	BTG ALT
	BTFSC LSF
	BRA TM0.00
	BCF FC1		;fire coil 1 (CYL # 1 ON A9 ENG)
	BCF FC2		;fire coil 2 (CYL # 2 ON A9 ENG)
TM0.00
	BCF R1F			;CLEAR THE FLAG   
	MOVFF DWL,LP2D		;LEAD PLUG 2 DWELL COUNT - OTHER ENGINES ARE 180 DEG BETWEEN TIMING DELAY START & SPARK
	MOVFF DWLH,LP2DH
	BTFSC REVF		;TEST FOR REV LIMIT
	RETFIE 1		;SKIP INJ
	BTFSS ALT
	BRA TM0.0A		;do alt inj
	BSF FI4			;FIRE CYL #4 INJECTOR
	MOVFF IPW1L,R4ITL	;LOAD #4 IPW TIMER WITH IPW
	MOVFF IPW1H,R4ITH
	BSF INJ4
	RETFIE 1			;done so return & RE-ENABLE INTS
TM0.0A
	BSF FI3			;FIRE CYL #3 INJECTOR
	MOVFF IPW1L,R3ITL	;LOAD #3 IPW TIMER WITH IPW
	MOVFF IPW1H,R3ITH
	BSF INJ3
	RETFIE 1			;done so return & RE-ENABLE INTS
					;TM0.0  A9
					
TM0.1
	BTFSC LSF
	BRA TM0.10	;NO FIRE NOW IF LSF
	BCF FC3		;fire coil 3  (CYL # 3 ON A9 ENG)
	BCF FC4		;fire coil 4  (CYL # 4 ON A9 ENG)
TM0.10
	BCF R2F			;CLEAR THE FLAG   
	MOVFF DWL,LP1D		;LEAD PLUG 2 DWELL COUNT - OTHER ENGINES ARE 180 DEG BETWEEN TIMING DELAY START & SPARK
	MOVFF DWLH,LP1DH
	BTFSC REVF		;TEST FOR REV LIMIT
	RETFIE 1		;SKIP INJ
	BTFSS ALT
	BRA TM0.1A		;do alt inj
	BSF FI2			;FIRE CYL #2 INJECTOR
	MOVFF IPW1L,R2ITL	;LOAD #2 IPW TIMER WITH IPW
	MOVFF IPW1H,R2ITH
	BSF INJ2
	RETFIE 1			;done so return & RE-ENABLE INTS
TM0.1A
	BSF FI1			;FIRE CYL #1 INJECTOR
	MOVFF IPW1L,R1ITL	;LOAD #1 IPW TIMER WITH IPW
	MOVFF IPW1H,R1ITH
	BSF INJ1
	RETFIE 1			;done so return & RE-ENABLE INTS
  ENDIF				;END OF A9 TM0.0 & TM0.1  
 ENDIF		;TM0INT A1,A2,A4,A5,A8,A9,AD ENG TYPE
 
 IF (ENG==0xA3)||(ENG==0xB0)		;20B
TM0INT
	BCF T0CON,TMR0ON,0	;STOP IT
	BCF INTCON,TMR0IF,0
	BTFSC T2F	;TEST FOR T2 OVF, T2STR IN PROGRESS
	BRA TM0.ER	;EXIT IF OVF
	BTFSC R1F	;TEST for rot. 1 lead plug fire flag
	BRA TM0.0		;go fire it if flag set
	BTFSC R2F	;Rotor 2 lead flag set?
	BRA TM0.1		;do it if set
	BTFSC R3F	;ROTOR 3 flag set?
	BRA TM0.2		;do that if set
	RETFIE 1
 
TM0.ER
	CLRF STAT0,1
	RETFIE 1 
	
TM0.A
	CLRF STAT0,1		;CLEAR ALL FLAGS FOR FRESH START
	CLRF SEQFLAG,1
	CLRF PORTD,0		;TURN OFF COILS & INJECTORS
	CLRF TMR0H,0
	CLRF TMR0L,0		;SETUP FOR
	BCF T0CON,TMR0ON,0
	RETFIE 1			;TP2 & TIMER 0 ints are still enabled AT THIS POINT. 

TM0.0
  IF N109TC == 0x01		;DIFFERENT COIL DRIVER ASSIGNMENT ON N109TC
	BCF FC1		;fire lead coil 1 (& TRAIL COIL)
	BCF FC4		;TRAIL COIL ROTOR 1
  ELSE
    BCF FC1		;fire lead coil 1 (& TRAIL COIL)
	BCF FC2		;TRAIL COIL ROTOR 1
  ENDIF
	BCF R1F			;CLEAR THE FLAG  
	MOVFF DWL,LP3D		;LEAD PLUG 3 DWELL COUNT
	MOVFF DWLH,LP3DH
	BTFSC REVF	;TEST REV LIMITER FLAG
	BRA TM0.0C
  IF N109TC == 0x01
	BSF FI3		; 10-23-11    FIRE ROTOR 3 PRI INJECTOR ON N109TC
  ELSE
  	BSF FI5		; R3 PRI ON ALL OTHERS
  ENDIF		
	BTFSS SFLAG
	BSF FI6			;R3 SEC INJ TOO IF NOT STAGING  (THIS ONE SAME ON BOTH VERSIONS)
	MOVFF IPWL,R3ITL		;LOAD ROTOR 3 IPW TIMER WITH IPW (USE UN-ADJUSTED IPWL&H)
							; BECAUSE ROTOR 3 DOES NOT USE DIFFERENTIAL ADJUSTMENTS
	MOVFF IPWH,R3ITH
	BSF INJ3		;SET DECREMENT FLAG FOR TIMER 2 ROUT
TM0.0C
	RETFIE 1			;done so return & RE-ENABLE INTS

TM0.1
  IF N109TC == 0x01		;DIFFERENT COIL DRIVER ASSIGNMENT ON N109TC
	BCF FC2			;fire leading plug
	BCF FC5			;FIRE TRAIL
  ELSE
	BCF FC3			;fire leading plug
	BCF FC4			;FIRE TRAIL
  ENDIF
	BCF R2F			;CLEAR THE FLAG
	MOVFF DWL,LP1D		;LEAD PLUG 1 DWELL COUNT
	MOVFF DWLH,LP1DH
	BTFSC REVF	;TEST REV LIMITER FLAG
	BRA TM0.1C
	BSF FI1		;FIRE ROTOR 1 PRIMARY INJECTOR    (SAME ON BOTH)
	BTFSS SFLAG
  IF N109TC == 0x01
	BSF FI4		;FIRE R1 SEC INJ ON N109TC
  ELSE
  	BSF FI2		;R1 SECONDARY ON ALL OTHERS
  ENDIF
	MOVFF IPW1L,R1ITL	;LOAD ROTOR 1 IPW TIMER WITH IPW
	MOVFF IPW1H,R1ITH
	BSF INJ1		;SET DECREMENT FLAG FOR TIMER 2 ROUTINE
TM0.1C
	RETFIE 1			;done so return & ENABLE INTS

TM0.2
  IF N109TC == 0x01		;DIFFERENT COIL DRIVER ASSIGNMENT ON N109TC
	BCF FC3		;fire leading plugs R3
	BCF FC6
  ELSE
  	BCF FC5		;fire leading plugs R3
	BCF FC6
  ENDIF
	BCF R3F			;CLEAR THE FLAG
	MOVFF DWL,LP2D		;LEAD PLUG 1 DWELL COUNT
	MOVFF DWLH,LP2DH
	
	BTFSC REVF	;TEST REV LIMITER FLAG
	BRA TM0.2C
  IF N109TC == 0x01
	BSF FI2		;FIRE ROTOR 2 PRIMARY INJECTOR
  ELSE
    BSF FI3
  ENDIF  
	BTFSS SFLAG
  IF N109TC == 0x01
	BSF FI5		;FIRE R2 SEC INJ ON N109TC
  ELSE
    BSF FI4		;ALL OTHERS
  ENDIF 
	MOVFF IPW2L,R2ITL	;LOAD ROTOR 2 IPW TIMER WITH IPW
	MOVFF IPW2H,R2ITH
	BSF INJ2		;SET DECREMENT FLAG FOR TIMER 2 ROUTINE	
TM0.2C
	RETFIE 1
 ENDIF        ;20B
 
  IF ENG==0xB2		;CORVAIR
TM0INT
	BCF T0CON,TMR0ON,0	;STOP IT
	BCF INTCON,TMR0IF,0
	BTFSC T2F		;WAS THIS A T2 INTERVAL OVERFLOW?
	BRA TM0.A		;EXIT IF NOT
  IF TBINJ==0		;NOT TOGGLED HERE IF TB INJECTION
	BTG ALT			;TOGGLE THE ALT BIT
  ENDIF
	BTFSC R1F	;TEST for R1F plug fire flag
	BRA TM0.0		;go fire it if flag set
	BTFSC R2F	;R2F flag set?
	BRA TM0.1		;do it if set
	BTFSC R3F	;R3F flag set?
	BRA TM0.2		;do that if set
 	RETFIE 1
 	
TM0.A
	CLRF STAT0,1		;CLEAR ALL FLAGS FOR FRESH START
	CLRF SEQFLAG,1
	CLRF PORTD,0		;TURN OFF COILS & INJECTORS
	CLRF TMR0H,0
	CLRF TMR0L,0		;SETUP FOR
	BCF T0CON,TMR0ON,0
	RETFIE 1			;TP2 & TIMER 0 ints are still enabled AT THIS POINT. 

TM0.0
	bcf FC1		;fire GP1, DWELL GP2, INJ GP2 	;CORVAIR IS 120 DEG ENG
	bcf R1F			;CLEAR THE FLAG   
	MOVFF DWL,LP2D		;COIL 2 DWELL COUNT
	MOVFF DWLH,LP2DH
  IF TBINJ==0
	BTFSS ALT		;TEST FOR GROUP
	RETFIE 1
  ENDIF
	BTFSC REVF	;TEST REV LIMITER FLAG
	RETFIE 1
  IF TBINJ==1			;IS THIS A TB ENGINE?
  	BTFSC ALT 			;;ON ALT=0 THIS IS CYL 2 SO INJ 5 (GP 1 ODD (FI 1&2)) / ON ALT = 1 THIS IS CYL 1 SO INJ 6 (GP2 EVEN FI 3&4))
  	BRA TM0.0A			;GO DO ALT=1  (ALT 1 = GP 1-2-1), ALT 0 = GP 2-1-2
  	BSF FI1				;FIRE PRI GP 1
  	BSF FI2				;FIRE BU GP 1
  	MOVFF IPWL,R1ITL		;LOAD ROTOR 1 IPW TIMER WITH IPW (USE UN-ADJUSTED IPWL&H)
	MOVFF IPWH,R1ITH
	BSF INJ1		;SET DECREMENT FLAG FOR TIMER 2 ROUT
  	RETFIE 1
TM0.0A
	BSF FI3				;FIRE PRI GP 2
  	BSF FI4				;FIRE BU  GP 2
	MOVFF IPWL,R2ITL		;LOAD ROTOR 1 IPW TIMER WITH IPW (USE UN-ADJUSTED IPWL&H)
	MOVFF IPWH,R2ITH
	BSF INJ2		;SET DECREMENT FLAG FOR TIMER 2 ROUT
	RETFIE 1
TM0.0B
  ELSE	
	BSF FI2		;FIRE GP 2 (C3&4) INJECTORS 
	MOVFF IPWL,R2ITL		;LOAD ROTOR 1 IPW TIMER WITH IPW (USE UN-ADJUSTED IPWL&H)
	MOVFF IPWH,R2ITH
	BSF INJ2		;SET DECREMENT FLAG FOR TIMER 2 ROUT
TM0.0C
	RETFIE 1			;done so return & RE-ENABLE INTS
  ENDIF
  
TM0.1				;fire GP2, DWELL GP3, INJ GP3     R2F TIME  (CYL 3&4) IGN, C5&6 INJ 
	BCF FC2			;fire plugs GP 2
	BCF R2F			;CLEAR THE FLAG
	MOVFF DWL,LP3D		;GP 3 DWELL COUNT (CYL 5&6)
	MOVFF DWLH,LP3DH
  IF TBINJ==0
	BTFSS ALT			;TEST FOR CYL #6 TIME (VS CYL #2)
				;ON ALT=0 THIS IS CYL 4 SO INJ 1 (GP 1 ODD (FI 1&2)) / ON ALT = 1 THIS IS CYL 5 SO INJ 4 (GP2 EVEN FI 3&4))	
	RETFIE 1		;SKIP INJECTION IF NOT 
  ENDIF
	BTFSC REVF	;TEST REV LIMITER FLAG
	RETFIE 1
  IF TBINJ==1			;IS THIS A TB ENGINE?
  	BTFSC ALT 			;ON ALT=0 THIS IS CYL 4 SO INJ 1 (GP 1 ODD (FI 1&2)) / ON ALT = 1 THIS IS CYL 5 SO INJ 4 (GP2 EVEN FI 3&4))
  	BRA TM0.1A			;GO DO ALT=1  (ALT 1 = GP 1-2-1), ALT 0 = GP 2-1-2
  	BSF FI1				;FIRE PRI GP 1
  	BSF FI2				;FIRE BU GP 1
	MOVFF IPWL,R1ITL		;LOAD ROTOR 1 IPW TIMER WITH IPW (USE UN-ADJUSTED IPWL&H)
	MOVFF IPWH,R1ITH
	BSF INJ1		;SET DECREMENT FLAG FOR TIMER 2 ROUT
  	RETFIE 1
TM0.1A
	BSF FI3				;FIRE PRI GP 2
  	BSF FI4				;FIRE BU  GP 2
	MOVFF IPWL,R2ITL		;LOAD ROTOR 1 IPW TIMER WITH IPW (USE UN-ADJUSTED IPWL&H)
	MOVFF IPWH,R2ITH
	BSF INJ2		;SET DECREMENT FLAG FOR TIMER 2 ROUT
	RETFIE 1
TM0.1B
  ELSE	
	BSF FI3		;FIRE GP 3 INJECTORS (CYL 5&6)
	MOVFF IPWL,R3ITL	;LOAD GP1 IPW TIMER WITH IPW
	MOVFF IPWH,R3ITH
	BSF INJ3		;SET DECREMENT FLAG FOR TIMER 2 ROUTINE
TM0.1C
	RETFIE 1			;done so return & ENABLE INTS
  ENDIF
  
TM0.2	
	bcf FC3		;fire GP3, DWELL GP2, INJ GP1 
	BCF R3F			;CLEAR THE FLAG
	MOVFF DWL,LP1D		;LEAD PLUG 1 DWELL COUNT
	MOVFF DWLH,LP1DH
  IF TBINJ==0
	BTFSS ALT		;TEST FOR #5 CYL TIME
	BRA TM0.2C		;SKIP INJECTION IF NOT 
  ENDIF
	BTFSC REVF	;TEST REV LIMITER FLAG
	RETFIE 1
  IF TBINJ==1			;IS THIS A TB ENGINE?
  	BTFSC ALT 			;ON ALT=0 THIS IS CYL 5 SO INJ 4 (GP 2 EVEN (FI 3&4)) / ON ALT = 1 THIS IS CYL 6 SO INJ 3 (GP1 0DD FI 1&2))
  	BRA TM0.2A			;GO DO ALT=1  (ALT 1 = GP 1-2-1), ALT 0 = GP 2-1-2
  	BSF FI3				;FIRE PRI GP 2
  	BSF FI4				;FIRE BU GP 2
	MOVFF IPWL,R2ITL		;LOAD GP2 IPW TIMER WITH IPW (USE UN-ADJUSTED IPWL&H)
	MOVFF IPWH,R2ITH
	BSF INJ2		;SET DECREMENT FLAG FOR TIMER 2 ROUT
  	RETFIE 1
TM0.2A
	BSF FI1				;FIRE PRI GP 1
  	BSF FI2				;FIRE BU  GP 1
	MOVFF IPWL,R1ITL		;LOAD GP1 IPW TIMER WITH IPW (USE UN-ADJUSTED IPWL&H)
	MOVFF IPWH,R1ITH
	BSF INJ1		;SET DECREMENT FLAG FOR TIMER 2 ROUT
	RETFIE 1
TM0.2B
  ELSE	
	BSF FI1		;FIRE ROTOR 2 PRIMARY INJECTOR  (1&4 ON V6)
	MOVFF IPWL,R1ITL	;LOAD ROTOR 2 IPW TIMER WITH IPW
	MOVFF IPWH,R1ITH
	BSF INJ1		;SET DECREMENT FLAG FOR TIMER 2 ROUTINE	
TM0.2C
	RETFIE 1
  ENDIF
 ENDIF        ;CORVAIR  0xB2
 
 IF ENG==0xA6
TM0INT
	BCF T0CON,TMR0ON,0	;STOP IT
	BCF INTCON,TMR0IF,0
	BTFSC T2F		;WAS THIS A T2 INTERVAL OVERFLOW?
	BRA TM0.A		;EXIT IF NOT
	btfsc R1F	;TEST for rot. 1 flag
	BRA TM0.0		;go fire it if flag set
	btfsc R2F	;Rotor 2  flag set?
	BRA TM0.1		;do it if set
	btfsc R3F	;Rotor 3  flag set?
	BRA TM0.2		;do it if set

TM0.A			;GET HERE IF NOT A R1 OR R2 TIMING INTERVAL SO MUST BE A OVF T2 INTERVAL
	CLRF STAT0,1		;CLEAR ALL FLAGS FOR FRESH START
	CLRF SEQFLAG,1
	BCF FC1		;TURN OFF COILS
	BCF FC2
	BCF FC3
	CLRF TMR0H,0
	CLRF TMR0L,0		;SETUP FOR
	RETFIE 1			;TP2 & TIMER 0 ints are still enabled AT THIS POINT. 
TM0.0
	bcf FC1		;fire lead coil 1 (& TRAIL COIL)
	bcf R1F			;CLEAR THE FLAG   
	movfF DWL,LP1D		;load lead plug 1 dwell count
	MOVFF DWLH,LP1DH					;LEAD PLUG 1 DWELL COUNT
	BTG ALT			;TOGGLE THE ALTERNATE FLAG FOR INJECTION TIME CHECK
	BTFSS ALT
	BRA TM0.0A		;SKIP INJECTION
	
	BTFSC REVF	;TEST REV LIMITER FLAG
	BRA TM0.0A	
	BSF FI1			;FIRE #1 INJECTOR
	MOVFF IPWL,R1ITL		;LOAD ROTOR 1 IPW TIMER WITH IPW
	MOVFF IPWH,R1ITH
	BSF INJ1		;SET DECREMENT FLAG FOR TIMER 3 ROUT
TM0.0A
	RETFIE 1			;done so return & RE-ENABLE INTS
TM0.1
	bcf FC2		;fire leading plug # 2
	BCF R2F			;CLEAR THE FLAG
	movfF DWL,LP2D		;load lead plug dwell count
	MOVFF DWLH,LP2DH
	BTFSS ALT
	BRA TM0.1A		;SKIP INJECTION
	
	BTFSC REVF	;TEST REV LIMITER FLAG
	BRA TM0.1A
	BSF FI2			;FIRE #2 INJECTOR
	MOVFF IPW1L,R2ITL	;LOAD ROTOR 2 IPW TIMER WITH IPW
	MOVFF IPW1H,R2ITH
	BSF INJ2		;SET DECREMENT FLAG FOR TIMER 2 ROUTINE
TM0.1A
	RETFIE 1			;done so return & ENABLE INTS
TM0.2
	bcf FC3		;fire leading plug # 3
	BCF R3F			;CLEAR THE FLAG
	movfF DWL,LP3D		;load lead plug dwell count
	MOVFF DWLH,LP3DH
	BTFSS ALT
	BRA TM0.2A		;SKIP INJECTION
	
	BTFSC REVF	;TEST REV LIMITER FLAG
	BRA TM0.2A
	BSF FI3			;FIRE #3 INJECTOR
	MOVFF IPW1L,R3ITL	;LOAD ROTOR 3 IPW TIMER WITH IPW
	MOVFF IPW1H,R3ITH
	BSF INJ3		;SET DECREMENT FLAG FOR TIMER 2 ROUTINE
TM0.2A
	RETFIE 1			;done so return & ENABLE INTS
 ENDIF 		;0xA6 GEO

 IF ENG==0xB3	;EAGLE 540
TM0INT					;IF TMR0 OVERFLOWS IT MEANS ENGINE IS TURNING TOO SLOW, TMR0 USED ONLY TO TIME T2 INTERVALS.
 	BCF INTCON,TMR0IF,0
 	BCF T0CON,TMR0ON,0	;STOP IT
 	CLRF STAT0,1	;KILL VALID TIMING  (REDUNDANT)	
 	CLRF PORTD,0	;KILL INJ & COIL DRIVE
 	RETFIE 1

TM3INT				;USED ONLY ON B3 EAGLE 540 ENGINE  (TIMER 3 USED TO DO SPARK DELAY ON THIS ENGINE, TMR1 USED FOR DWELL TIMER
	BCF T3CON,TMR3ON,0	;STOP CNTR
	BCF PIR2,TMR3IF,0		;KILL IT
	BTFSS VT			;VALID TIMING?
	RETFIE 1
  IF TBINJ==1
    BRA TM3.TBI
  ENDIF
  	BTFSS T2F			;IS THIS END OF AN LSF 30 DEG DELAY CYCLE?  nEED TO TURN ON DWELL IF SO.
  	BRA TM3INT.A		;DO FIRE COIL IF NOT
  	BCF T2F				;KILL THIS SO WE DO NORMAL IGNITION CYCLE NEXT TIME
    BTFSC CAF			;TEST FOR A CONTROLLER
  	BRA TM3.A
 	MOVFF T2H,IARGH		;LOAD TMR3 W/ 18.75 DEG  
  	MOVFF T2L,IARGL
  	MOVF T4L,0,1
  	ADDWF IARGL,1
  	MOVF T4H,0,1
  	ADDWFC IARGH,1
  	BRA TM3.B			;GO ON W/ B DELAY
TM3.A  
  	MOVFF T2H,IARGH		;LOAD TMR3 W/ 15 DEG  
  	MOVFF T2L,IARGL
TM3.B	
  	BCF _C
  	RLCF IARGL,1
  	RLCF IARGH,1
  	RLCF IARGL,1
  	RLCF IARGH,1
  	COMF IARGL,1
  	COMF IARGH,1
  	MOVFF IARGH,TMR3H
  	MOVFF IARGL,TMR3L
  	BSF T3CON,TMR3ON,0		;START IT	
  	
  	BTFSC R1F
	BSF FC2			;TCNT OF 1 HANDLER  Cyl #8
	BTFSC R2F
	BSF FC3			;TCNT OF 2 HANDLER	Cyl #7
	BTFSC R3F
	BSF FC4			;TCNT OF 3 HANDLER	Cyl #3
	BTFSC R4F
	BSF FC1			;TCNT OF 4 HANDLER	Cyl #6
	BTFSC R5F
	BSF FC2			;TCNT OF 5 HANDLER	Cyl #5
	BTFSC R6F
	BSF FC3			;TCNT OF 6 HANDLER	Cyl #4
	BTFSC R7F
	BSF FC4			;TCNT OF 7 HANDLER	Cyl #2
	BTFSC R8F
	BSF FC1			;TCNT OF 8 HANDLER	Cyl #1
    RETFIE 1
TM3INT.A
	BTFSC R1F
	BRA TM3.1			;TCNT OF 1 HANDLER  Cyl #8
	BTFSC R2F
	BRA TM3.2			;TCNT OF 2 HANDLER	Cyl #7
	BTFSC R3F
	BRA TM3.3			;TCNT OF 3 HANDLER	Cyl #3
	BTFSC R4F
	BRA TM3.4			;TCNT OF 4 HANDLER	Cyl #6
	BTFSC R5F
	BRA TM3.5			;TCNT OF 5 HANDLER	Cyl #5
	BTFSC R6F
	BRA TM3.6			;TCNT OF 6 HANDLER	Cyl #4
	BTFSC R7F
	BRA TM3.7			;TCNT OF 7 HANDLER	Cyl #2
	BTFSC R8F
	BRA TM3.8			;TCNT OF 8 HANDLER	Cyl #1
  IF TBINJ==0
	CLRF STAT0,1			;ERROR  
  ENDIF
TM3INT.X
	BCF PIR2,TMR3IF,0	;KILL AGAIN
	RETFIE 1

  IF TBINJ==1
TM3.TBI
	RETFIE 1
  ENDIF
	
TM3.1
	BCF FC2				;FIRE GP 2 COILS.   cyl #8
	MOVFF DWL,LP4D		;180 degree scheme used.
	MOVFF DWLH,LP4DH
	RETFIE 1
TM3.2
	BCF FC3				;FIRE GP 3 COILS.	Cyl #7
	MOVFF DWL,LP1D
	MOVFF DWLH,LP1DH
	RETFIE 1
TM3.3
	BCF FC4				;FIRE GP 4 COILS.	Cyl #3
	MOVFF DWL,LP2D
	MOVFF DWLH,LP2DH
	RETFIE 1
TM3.4
	BCF FC1				;FIRE GP 1 COILS.	Cyl #6
	MOVFF DWL,LP3D
	MOVFF DWLH,LP3DH
	RETFIE 1
TM3.5
	BCF FC2				;FIRE GP 2 COILS.	Cyl #5
	MOVFF DWL,LP4D
	MOVFF DWLH,LP4DH
	RETFIE 1
TM3.6
	BCF FC3				;FIRE GP 3 COILS.	Cyl #4
	MOVFF DWL,LP1D
	MOVFF DWLH,LP1DH
	RETFIE 1
TM3.7
	BCF FC4				;FIRE GP 4 COILS.	Cyl #2
	MOVFF DWL,LP2D
	MOVFF DWLH,LP2DH
	RETFIE 1
TM3.8
	BCF FC1				;FIRE GP 1 COILS.	Cyl #1
	MOVFF DWL,LP3D
	MOVFF DWLH,LP3DH
	RETFIE 1
 ENDIF					;END OF 0xB3 TM1 ROUT

 IF (ENG==0xAB)||(ENG==0xB1)	;LS1 V8 VER
TM0INT
	BCF T0CON,TMR0ON,0	;STOP IT
	BCF INTCON,TMR0IF,0
	BTFSC T2F		;TEST FOR A T2 OVF (T2STR IN PROGRESS)
	BRA TM0.ER		;EXIT IF OVF
	BTFSS VT
	RETFIE 1
	btfsc R1F	;TEST for rot. 1 lead plug fire flag
	BRA TM0.1		;go fire it if flag set
	btfsc R2F	;Rotor 2 lead flag set?
	BRA TM0.2		;do it if set
	btfsc R3F	;ROTOR 3 flag set?
	BRA TM0.3		;do that if set
	BTFSC R4F	;GP 4 FLAG SET?
	BRA TM0.4
TM0.ER
	CLRF STAT0,1
	RETFIE 1

TM0.1
	BTFSS LSF	;NO FIRE ON LSF
	bcf FC1		;fire GP 1 COILS   (V8 1 & 6) 
	bcf R1F			;CLEAR THE FLAG   
	MOVFF DWL,LP1D		;load lead plug 1 dwell count
	MOVFF DWLH,LP1DH
	BTG ALT
	BTFSC ALT		;ALTERNATE BANK FLAG
	BRA TM0.1C		;FIR ALT FI GP (3) IF ALT SET 

;   **** REV LIMIT  ****
	BTFSC REVF		;TEST REV LIMIT FLAG
	RETFIE 1		;SKIP INJECTION CYCLE  (LABLE WILL VARY WITH ENGINE)

;	**** REV LIMIT  ****

	BSF FI1		;FIRE GP1 INJECTORS  (INJ 5 & 6 ON V8)
	MOVFF IPW1L,R1ITL		;LOAD GP1 IPW TIMER WITH IPW (USE UN-ADJUSTED IPWL&H)BECAUSE NOT USE DIFFERENTIAL ADJUSTMENTS 
	MOVFF IPW1H,R1ITH
	BSF INJ1		;SET DECREMENT FLAG FOR TIMER 2 ROUT
	RETFIE 1
TM0.1C
;   **** REV LIMIT  ****
	BTFSC REVF		;TEST REV LIMIT FLAG
	RETFIE 1		;SKIP INJECTION CYCLE  (LABLE WILL VARY WITH ENGINE)
;	**** REV LIMIT  ****
	BSF FI3		;FIRE GP 3 INJECTOR  (1 & 8 ON V8)
	MOVFF IPW1L,R3ITL	;LOAD ROTOR 2 IPW TIMER WITH IPW
	MOVFF IPW1H,R3ITH
	BSF INJ3		;SET DECREMENT FLAG FOR TIMER 2 ROUTINE	
	RETFIE 1			;done so return & RE-ENABLE INTS

TM0.2
	BTFSS LSF	;NO FIRE ON LSF
	bcf FC2		;fire GP 2 PLUGS  5 & 8 ON V8
	BCF R2F			;CLEAR THE FLAG
	movfF DWL,LP2D		;load lead plug dwell count
	MOVFF DWLH,LP2DH				;GP 2 ON V8  (5 & 8)
	RETFIE 1			;done so return & ENABLE INTS

TM0.3	
	BTFSS LSF	;NO FIRE ON LSF
	BCF FC3		;fire GP 3 plugs  (4 & 7 ON V8)
	BCF R3F			;CLEAR THE FLAG
	MOVFF DWL,LP3D		;load lead plug dwell count
	MOVFF DWLH,LP3DH					;GP 3 ON V6  (4 & 7)
	BTFSC ALT
	BRA TM0.3C		;ALT GP 4 IF SET
;   **** REV LIMIT  ****
	BTFSC REVF		;TEST REV LIMIT FLAG
	RETFIE 1		;SKIP INJECTION CYCLE  (LABLE WILL VARY WITH ENGINE)
;	**** REV LIMIT  **** 
	BSF FI2		;FIRE GP 2 INJECTOR  (1 & 8 ON V8)
	MOVFF IPW1L,R2ITL	;LOAD ROTOR 2 IPW TIMER WITH IPW
	MOVFF IPW1H,R2ITH
	BSF INJ2		;SET DECREMENT FLAG FOR TIMER 2 ROUTINE	
	RETFIE 1
TM0.3C
;   **** REV LIMIT  ****
	BTFSC REVF		;TEST REV LIMIT FLAG
	RETFIE 1		;SKIP INJECTION CYCLE  (LABLE WILL VARY WITH ENGINE)
;	**** REV LIMIT  ****
	BSF FI4			; INJ GP 4 ON V8 CYL 3 & 4
	MOVFF IPW1L,R4ITL		;LOAD # 4 IPW TIMER WITH IPW (USE UN-ADJUSTED IPWL&H)		
	MOVFF IPW1H,R4ITH
	BSF INJ4		;SET DECREMENT FLAG FOR TIMER 2 ROUT
	RETFIE 1

TM0.4		;GP 4 ROUTINE
	BTFSS LSF	;NO FIRE ON LSF
	bcf FC4			;fire GP 4 COILS )   (GP 4 2 & 3 ON V8) 
	bcf R4F			;CLEAR THE FLAG   
	movfF DWL,LP4D		;load lead plug 1 dwell count  180 DEGREE DWELL SCHEME
	MOVFF DWLH,LP4DH
	RETFIE 1			;done so return & RE-ENABLE INTS
 ENDIF		;END OF AB\B1 ROUTS

 IF (ENG==0xB5)		;SUBE 2.7 / FORD 3.8 V6 60-2 EMT
TM0INT
	BCF T0CON,TMR0ON,0	;STOP IT
	BCF INTCON,TMR0IF,0
	BTFSC T2F		;TEST FOR A T2 OVF (T2STR IN PROGRESS)
	BRA TM0.ER		;EXIT IF OVF
	BTFSS VT
	RETFIE 1
	btfsc R1F	;TEST for rot. 1 lead plug fire flag
	BRA TM0.1		;go fire it if flag set
	btfsc R2F	;Rotor 2 lead flag set?
	BRA TM0.2		;do it if set
	btfsc R3F	;ROTOR 3 flag set?
	BRA TM0.3		;do that if set
	RETFIE 1		;none set yet?
	
TM0.ER
	CLRF STAT0,1
	RETFIE 1

TM0.1
	BTFSC LSF	;NO FIRE ON LSF  (HW LSF FIRE MOD)
	BRA TM0.1A
	BCF FC1		;fire GP 1 COILS
	BCF FC4
TM0.1A	    
	bcf R1F			;CLEAR THE FLAG   
	MOVFF DWL,LP3D		;load GP3 dwell count  (240 DEG DWELL)
	MOVFF DWLH,LP3DH
	BTG ALT
	BTFSC ALT		;ALTERNATE  FLAG TO INJECT EVERY OTHER REV
	BRA TM0.1C		;JUST AN EXIT
;   **** REV LIMIT  ****
	BTFSC REVF		;TEST REV LIMIT FLAG
	RETFIE 1		;SKIP INJECTION CYCLE  (LABLE WILL VARY WITH ENGINE)
;	**** REV LIMIT  ****
	BSF FI1		;FIRE GP1 INJECTORS  (INJ 1 &
	BSF FI4		;JUST IN CASE WE WANT TO DO INDEPENDANT 
	MOVFF IPW1L,R1ITL		;LOAD GP1 IPW TIMER WITH IPW (USE UN-ADJUSTED IPWL&H)BECAUSE NOT USE DIFFERENTIAL ADJUSTMENTS 
	MOVFF IPW1H,R1ITH
	BSF INJ1		;SET DECREMENT FLAG FOR TIMER 2 ROUT
	RETFIE 1
TM0.1C				;LEGACY CODE ONLY, NOT REALLY USED
	RETFIE 1

TM0.2
	BTFSC LSF	;NO FIRE ON LSF
	BRA TM0.2A
	bcf FC2		;fire GP 2 PLUGS 
	BCF FC5
TM0.2A
	BCF R2F			;CLEAR THE FLAG
	MOVFF DWL,LP1D		;load lead plug dwell count
	MOVFF DWLH,LP1DH				;GP 1  240 DEG DWELL
	BTG ALT
	BTFSC ALT		;ALTERNATE  FLAG TO INJECT EVERY OTHER REV
	BRA TM0.2C		;JUST AN EXIT
;	**** REV LIMIT  ****
	BTFSC REVF		;TEST REV LIMIT FLAG
	RETFIE 1		;SKIP INJECTION CYCLE  (LABLE WILL VARY WITH ENGINE)
;	**** REV LIMIT  ****
	BSF FI2		;FIRE GP2 INJECTORS  (INJ 1 &
	BSF FI5		;JUST IN CASE WE WANT TO DO INDEPENDANT 
	MOVFF IPW1L,R2ITL		;LOAD GP1 IPW TIMER WITH IPW (USE UN-ADJUSTED IPWL&H)BECAUSE NOT USE DIFFERENTIAL ADJUSTMENTS 
	MOVFF IPW1H,R2ITH
	BSF INJ2		;SET DECREMENT FLAG FOR TIMER 2 ROUT
	RETFIE 1
TM0.2C
	RETFIE 1

TM0.3	
	BTFSC LSF	;NO FIRE ON LSF
	BRA TM0.3A
	BCF FC3		;fire GP 3 plugs
	BCF FC6
TM0.3A
	BCF R3F			;CLEAR THE FLAG
	MOVFF DWL,LP2D		;load GP2 DWELL
	MOVFF DWLH,LP2DH
	BTG ALT
	BTFSC ALT
	BRA TM0.3C		;ALT GP 4 IF SET
;   **** REV LIMIT  ****
	BTFSC REVF		;TEST REV LIMIT FLAG
	RETFIE 1		;SKIP INJECTION CYCLE  (LABLE WILL VARY WITH ENGINE)
;	**** REV LIMIT  **** 
	BSF FI3		;FIRE GP 2 INJECTOR  (1 & 8 ON V8)
	BSF FI6
	MOVFF IPW1L,R3ITL	;LOAD ROTOR 2 IPW TIMER WITH IPW
	MOVFF IPW1H,R3ITH
	BSF INJ3		;SET DECREMENT FLAG FOR TIMER 2 ROUTINE	
	RETFIE 1
TM0.3C
	RETFIE 1 		;NOT USED
 ENDIF		;END OF B5/B6  ROUTS

 IF ENG==0xAE		;START OF SVX ROUTS  (NOTE!   CYLINDERS ARE PHYSICALLY ARRANGED, NOT NUMERIC  1=1,2=6,3=3,4=2,5=5,6=4
TM0INT
	BCF T0CON,TMR0ON,0	;STOP IT
	BCF INTCON,TMR0IF,0
	BTG ALT		;SCATTER THE INJECTION OVER TWO REVS
	btfsc R1F	;TEST for rot. 1 lead plug fire flag
	BRA TM0.1		;go fire it if flag set
	btfsc R2F	;Rotor 2 lead flag set?
	BRA TM0.2		;do it if set
	btfsc R3F	;ROTOR 3 flag set?
	BRA TM0.3		;do that if set
	RETFIE 1		;none set yet?
TM0.1
	BTFSS LSF	;NO FIRE ON LSF
	BCF FC1		;fire CYL 1 & 2 (GP 1)  (fires gp 3 INJ C5 & C6)  (FI3)
	BTFSS LSF	;NO FIRE ON LSF
	BCF FC2		;FIRE 2
TM0.1A
	MOVFF DWL,LP3D		;load lead plug dwell count240 DEG LATER CYL3 FIRES
	MOVFF DWLH,LP3DH
	BCF R1F				;KILL THE FLAG
	BTFSC ALT			;TEST FOR WHICH INJ TO FIRE
	RETFIE 1			;WAS SET SO GO 
	BTFSS REVF			;TEST FOR REV LIMITER 
	BSF FI3				;FIRE INJ GP 3
	MOVFF IPW1L,R3ITL	;LOAD IPW TIMER 1 WITH IPW
	MOVFF IPW1H,R3ITH
	BSF INJ3		;SET DECREMENT FLAG FOR TIMER 2 ROUTINE	
	RETFIE 1

TM0.2
	BTFSS LSF	;NO FIRE ON LSF
	bcf FC5		;fire CYL 5 & 6  (GP 2) (FIRES GP 2 INJ C3 & C4 (FI2)
	BTFSS LSF	;NO FIRE ON LSF
	BCF FC6
	MOVFF DWL,LP1D		;load dwell count 240 DEG [GP1]
	MOVFF DWLH,LP1DH
	BCF R2F				;KILL THE FLAG
	BTFSC ALT			;TEST FOR WHICH INJ TO FIRE
	RETFIE 1
	BTFSS REVF			;TEST FOR REV LIMITER  
	BSF FI2				;FIRE INJ GP 2 CYL 3&4
	MOVFF IPW1L,R2ITL	;LOAD IPW TIMER 1 WITH IPW
	MOVFF IPW1H,R2ITH
	BSF INJ2		;SET DECREMENT FLAG FOR TIMER 2 ROUTINE	
	RETFIE 1
	
TM0.3
	BTFSS LSF	;NO FIRE ON LSF
	bcf FC3		;fire CYL 3&4  [GP3]  FIRES GP 1 (INJ C1 & C2) FI1
	BTFSS LSF	;NO FIRE ON LSF
	BCF FC4
	MOVFF DWL,LP2D		;load lead plug dwell count		; 240 DEG LATER   GP 2 FIRES
	MOVFF DWLH,LP2DH
	BCF R3F				;KILL THE FLAG
	BTFSC ALT			;TEST FOR WHICH INJ TO FIRE
	RETFIE 1			;EXIT
	BTFSS REVF			;TEST FOR REV LIMITER  
	BSF FI1				;FIRE INJ GP 1
	MOVFF IPW1L,R1ITL	;LOAD IPW TIMER 1 WITH IPW
	MOVFF IPW1H,R1ITH
	BSF INJ1		;SET DECREMENT FLAG FOR TIMER 2 ROUTINE	
	RETFIE 1
	
 ENDIF				;END OF SVX TM0 ROUTS
  
 IF (ENG==0xA3)||(ENG==0xB0)||(ENG==0xAA)		;20B OR FORD V6
 
 ;  NOTE!!!  ON EC3 MAKE NEW GROUPING FOR INJECTORS  (FC1/GP1 FIRES INJ 2&6, FC2/GP2 FIRESINJ 1&5, FC3/GP3 FIRES INJ 3&4
 ; LEAVING IT AS-IS ON ec2 FOR COMPATIBILUITY W/ OLDER UNITS
TM0INT

	BCF T0CON,TMR0ON,0	;STOP IT
	BCF INTCON,TMR0IF,0
	BTFSC T2F		;TEST FOR TIMEOUT
	BRA TM0.ER
	BTFSC R1F	;TEST for rot. 1 lead plug fire flag
	BRA TM0.0		;go fire it if flag set
	BTFSC R2F	;Rotor 2 lead flag set?
	BRA TM0.1		;do it if set
	BTFSC R3F	;ROTOR 3 flag set?
	BRA TM0.2		;do that if set
;	RETFIE 1
 
TM0.ER
	CLRF STAT0,1		;CLEAR ALL FLAGS FOR FRESH START
	CLRF SEQFLAG,1
	CLRF PORTD,0		;TURN OFF COILS & INJECTORS
	CLRF TMR0H,0
	CLRF TMR0L,0		;SETUP FOR
	BCF T0CON,TMR0ON,0
	RETFIE 1			;TP2 & TIMER 0 ints are still enabled AT THIS POINT. 

TM0.0
	bcf FC1		;fire lead coil 1 (& TRAIL COIL)   (GP 1 ON V6 4&3) 
	bcf R1F			;CLEAR THE FLAG  
;
  IF (ENG==0xA3)||(ENG==0xB0)	;20B IS 240 DEG ENG
	MOVFF DWL,LP3D		;LEAD PLUG 3 DWELL COUNT
	MOVFF DWLH,LP3DH
  ELSE					
	MOVFF DWL,LP3D	;
	MOVFF DWLH,LP3DH
	BTFSS ALT		;TEST FOR GROUP
	BRA TM0.0C		;SKIP INJECTION IF NOT 4
  ENDIF
  
  IF (ENG==0xA3)||(ENG==0xB0)
	BTFSS SFLAG	;TEST FOR STAGED INJECTION FLAG
	BRA TM0.0A
	BCF FI4		; DISABLE SEC. INJS. (REVERSED FUNCTION 10-24-06)
	BRA TM0.0B		;GO ON 
TM0.0A
 	BSF FI4		;ENABLE SECONDARY INJECTORS  (REVERSED FUNCTION 10-24-06)
  ENDIF
TM0.0B   
	BTFSC REVF	;TEST REV LIMITER FLAG
	BRA TM0.0C
	BSF FI3		;FIRE ROTOR 3 INJECTORS  (INJ 3 & 6 ON V6)
	MOVFF IPWL,R3ITL		;LOAD ROTOR 3 IPW TIMER WITH IPW (USE UN-ADJUSTED IPWL&H)
							; BECAUSE ROTOR 3 DOES NOT USE DIFFERENTIAL ADJUSTMENTS
	MOVFF IPWH,R3ITH
	BSF INJ3		;SET DECREMENT FLAG FOR TIMER 2 ROUT
TM0.0C
	RETFIE 1			;done so return & RE-ENABLE INTS

TM0.1
	BCF FC2			;fire leading plugs (GP 2 ON V6)
	BCF R2F			;CLEAR THE FLAG
  IF (ENG==0xA3)||(ENG==0xB0)  
	MOVFF DWL,LP1D		;LEAD PLUG 1 DWELL COUNT
	MOVFF DWLH,LP1DH
  ELSE
	MOVFF DWL,LP1D		;GP 2 ON V6  (2 & 6)
	MOVFF DWLH,LP1DH
	BTFSC ALT			;TEST FOR CYL #6 TIME (VS CYL #2)	
	BRA TM0.1C		;SKIP INJECTION IF NOT 
  ENDIF
  IF (ENG==0xA3)||(ENG==0xB0)
	BTFSS SFLAG	;TEST FOR STAGED INJECTION FLAG
	BRA TM0.1A
	BCF FI4		; DISABLE SEC. INJS. (REVERSED FUNCTION 10-24-06)
	BRA TM0.1B		;GO ON 
TM0.1A
 	BSF FI4		;ENABLE SECONDARY INJECTORS  (REVERSED FUNCTION 10-24-06)
  ENDIF
TM0.1B  
	BTFSC REVF	;TEST REV LIMITER FLAG
	BRA TM0.1C
	BSF FI1		;FIRE ROTOR 1 PRIMARY INJECTORS (INJECTORS 2&5 ON V6)
	MOVFF IPW1L,R1ITL	;LOAD ROTOR 1 IPW TIMER WITH IPW
	MOVFF IPW1H,R1ITH
	BSF INJ1		;SET DECREMENT FLAG FOR TIMER 2 ROUTINE
TM0.1C
	RETFIE 1			;done so return & ENABLE INTS

TM0.2	
	bcf FC3		;fire leading plugs  (GP 3  5&1 ON V6)
	BCF R3F			;CLEAR THE FLAG
  IF (ENG==0xA3)||(ENG==0xB0)
	MOVFF DWL,LP2D		;LEAD PLUG 1 DWELL COUNT
	MOVFF DWLH,LP2DH
  ELSE					;0xAA FORD V6
	MOVFF DWL,LP2D		;GP 3 ON V6  (5 & 1)
	MOVFF DWLH,LP2DH
	BTFSC ALT		;TEST FOR #5 CYL TIME
	BRA TM0.2C		;SKIP INJECTION IF NOT 
  ENDIF
  
  IF (ENG==0xA3)||(ENG==0xB0)
	BTFSS SFLAG	;TEST FOR STAGED INJECTION FLAG
	BRA TM0.2A
	BCF FI4		; ENSABLE SEC. INJS.  (REVERSED FUNCTION 10-24-06)
	BRA TM0.2B		;GO ON 
TM0.2A
 	BSF FI4		;DISABLE SECONDARY INJECTORS  (REVERSED FUNCTION 10-24-06)
  ENDIF
TM0.2B  
	
	BTFSC REVF	;TEST REV LIMITER FLAG
	BRA TM0.2C
	BSF FI2		;FIRE ROTOR 2 PRIMARY INJECTOR  (1&4 ON V6)
	MOVFF IPW2L,R2ITL	;LOAD ROTOR 2 IPW TIMER WITH IPW
	MOVFF IPW2H,R2ITH
	BSF INJ2		;SET DECREMENT FLAG FOR TIMER 2 ROUTINE	
TM0.2C
	RETFIE 1
 ENDIF        ;20B OR 0xAA V6 CAS

  
 IF (ENG == 0xBA)		;START FORD V6 ROUTS (EC3) (NOTE!   CYLINDERS ARE PHYSICALLY ARRANGED, NOT NUMERIC  1=1,2=6,3=3,4=2,5=5,6=4
TM0INT
	BCF T0CON,TMR0ON,0	;STOP IT
	BCF INTCON,TMR0IF,0
	btfsc R1F	;TEST for GP 1  (IGN)3 & 4 
	BRA TM0.1		;go fire it if flag set
	btfsc R2F	;GP 2?  IGN 2 & 6
	BRA TM0.2		;do it if set
	btfsc R3F	;GP 3 flag set?  (IGN 1 & 5)
	BRA TM0.3		;do that if set
	RETFIE 1		;none set yet?
TM0.1
	bcf FC3		;fire CYL 3 & 4 (GP 1)
	BCF FC4		;FIRE GP 1
	movfF DWL,LP3D		;load lead plug dwell count240 DEG LATER
	MOVFF DWLH,LP3DH
	BCF R1F				;KILL THE FLAG
	BTFSC ALT			;TEST FOR WHICH INJ TO FIRE
	BRA TM0.1A			;WAS SET SO GO
	BTFSS REVF			;TEST FOR REV LIMITER 
	BSF FI1				;FIRE INJ 1
	MOVFF IPW1L,R1ITL	;LOAD IPW TIMER 1 WITH IPW
	MOVFF IPW1H,R1ITH
	BSF INJ1		;SET DECREMENT FLAG FOR TIMER 2 ROUTINE	
	RETFIE 1
TM0.1A
	BTFSS REVF			;TEST FOR REV LIMITER 
	BSF FI5			;FIRE 5
	MOVFF IPW1L,R5ITL	;LOAD IPW TIMER 2 WITH IPW
	MOVFF IPW1H,R5ITH
	BSF INJ5		;SET DECREMENT FLAG FOR TIMER 2 ROUTINE	
	RETFIE 1			;done so return & ENABLE INTS	

TM0.2				
	bcf FC2		;fire CYL 2 & 6  (GP 2)
	BCF FC6
	movfF DWL,LP1D		;load dwell count 240 DEG [GP1]
	MOVFF DWLH,LP1DH
	BCF R2F				;KILL THE FLAG
	BTFSC ALT			;TEST FOR WHICH INJ TO FIRE
	BRA TM0.2A			;WAS SET SO GO 
	BTFSS REVF			;TEST FOR REV LIMITER 
	BSF FI3				;FIRE INJ 5
	MOVFF IPW1L,R3ITL	;LOAD IPW TIMER 1 WITH IPW
	MOVFF IPW1H,R3ITH
	BSF INJ3		;SET DECREMENT FLAG FOR TIMER 2 ROUTINE	
	RETFIE 1
TM0.2A
	BTFSS REVF			;TEST FOR REV LIMITER 
	BSF FI4			;FIRE 2
	MOVFF IPW1L,R4ITL	;LOAD IPW TIMER 2 WITH IPW
	MOVFF IPW1H,R4ITH
	BSF INJ4		;SET DECREMENT FLAG FOR TIMER 2 ROUTINE
	RETFIE 1			;done so return & ENABLE INTS	
	
TM0.3
	bcf FC1		;fire CYL 1&5  [GP3]
	BCF FC5
	movfF DWL,LP2D		;load lead plug dwell count		; 240 DEG LATER   GP 2 FIRES
	MOVFF DWLH,LP2DH
	BCF R3F				;KILL THE FLAG
	BTFSC ALT			;TEST FOR WHICH INJ TO FIRE
	BRA TM0.3A			;WAS SET SO GO
	BTFSS REVF			;TEST FOR REV LIMITER  
	BSF FI2				;FIRE INJ 3
	MOVFF IPW1L,R2ITL	;LOAD IPW TIMER 1 WITH IPW
	MOVFF IPW1H,R2ITH
	BSF INJ2		;SET DECREMENT FLAG FOR TIMER 2 ROUTINE	
	RETFIE 1
TM0.3A
	BTFSS REVF			;TEST FOR REV LIMITER 
	BSF FI6			;FIRE 4
	MOVFF IPW1L,R6ITL	;LOAD IPW TIMER 2 WITH IPW
	MOVFF IPW1H,R6ITH
	BSF INJ6		;SET DECREMENT FLAG FOR TIMER 2 ROUTINE	
	RETFIE 1			;done so return & ENABLE INTS	
 ENDIF				;END OF FORD V6 TM0 ROUTS  
  
				;EJ25 ADDITION
 IF ENG==0xAC
TM0INT
	BCF INTCON,TMR0IF,0
	bcf T0CON,TMR0ON,0		;select ext clk [stop timer]
	BTFSC T2F		;WAS THIS A T2 INTERVAL OVERFLOW?
	BRA TM0.A		;EXIT IF yes
	btfsc R1F		;TEST for rot. 1 lead plug fire flag
	BRA TM0.1		;go fire it if flag set
	btfsc R2F		;Rotor 2 lead flag set?
	BRA TM0.2		;do it if set
	btfsc R3F		;TEST for rot. 1 lead plug fire flag
	BRA TM0.3		;go fire it if flag set
	btfsc R4F		;Rotor 2 lead flag set?
	BRA TM0.4		;do it if set
TM0.A
	CLRF STAT0,1		;CLEAR ALL FLAGS FOR FRESH START
	CLRF SEQFLAG,1
	CLRF PORTD,0 		;TURN OFF COILS & INJECTORS
	CLRF TMR0H,0
	CLRF TMR0L,0		;SETUP FOR
	CLRF STAT1,1
	BSF INTCON3,INT1IE,0		;ENABLE CAM SENSOR TP1 INTS
TM0.X
	RETFIE 1			;TP2 & TIMER 0 ints are still enabled AT THIS POINT. 
 ENDIF				;0xAC

 IF (ENG==0xA7)
  IF (A72007==0) 		;PRE 2007 EJ-22 / EJ-25
TM0INT
	BCF T0CON,TMR0ON,0		;[stop timer]
	BCF INTCON,TMR0IF,0
	BTFSC T2F		;OVF ON T2 INTERVAL?
	BRA TM0.A		;RESTART IF YES
										;FIRING ORDER IS 1-3-2-4  SEQ1 STARTS AT CYL 3 SO ORDER IS 3-2-4-1
	DCFSNZ SEQFLAG,0,1	;DEC SEQ CNT  (SEQFLAG IS CLEARED BY SYNC DET AND INCREMENTED BY T2STR
	BRA TM0.1		;SEQ 1,  CYL 3  (COIL 3)      CHANGED TO MATCH INSTALLATION GUIDE   (NOW NORMAL SEQ FOR EC3) 
	DCFSNZ WREG,0,0 
	BRA TM0.2		;SEQ 2, CYL 2  (COIL 2)
	DCFSNZ WREG,0,0
	BRA TM0.3		;SEQ 3, CYL 4  (COIL 4)  FC1=CYL1, FC2=CYL2, FC3=CYL3, FC4= CYL4
	DCFSNZ WREG,0,0
	BRA TM0.4		;SEQ 4, CYL 1  (COIL 1)
TM0.A
	CLRF STAT0,1		;CLR ALL RUN FAGS
	CLRF PORTD,0		;CLR INJ & IGN PORT
	CLRF SEQFLAG,1		;CLR SEQUENCE #
	RETFIE 1
TM0.OVF
	
	BCF T2F			;ENG NOT FAST ENOUGH FOR START  CLEAR TIMING FLAG TO TELL T2END NOT TO TIME & SET MF
	BCF VT			;CLR VALID TIMING FLAG
	RETFIE 1
  ELSE	      	;A72007 CAS
TM0INT
	BCF T0CON,TMR0ON,0		;[stop timer]
	BCF INTCON,TMR0IF,0
	BTFSC T2F		;OVF ON T2 INTERVAL?
	BRA TM0.A		;RESTART IF YES
										;FIRING ORDER IS 1-3-2-4  SEQ1 STARTS AT CYL 3 SO ORDER IS 3-2-4-1
	BTFSC R3F		;(SEQFLAG IS CLEARED BY SYNC DET AND INCREMENTED BY T2STR
	BRA TM0.1		;SEQ 1,  CYL 3  (COIL 3)      CHANGED TO MATCH INSTALLATION GUIDE   (NOW NORMAL SEQ FOR EC3) 
	BTFSC R2F 
	BRA TM0.2		;SEQ 2, CYL 2  (COIL 2)
	BTFSC R4F
	BRA TM0.3		;SEQ 3, CYL 4  (COIL 4)  FC1=CYL1, FC2=CYL2, FC3=CYL3, FC4= CYL4
	BTFSC R1F
	BRA TM0.4		;SEQ 4, CYL 1  (COIL 1)
TM0.A
	CLRF STAT0,1		;CLR ALL RUN FAGS
	CLRF PORTD,0		;CLR INJ & IGN PORT
	CLRF SEQFLAG,1		;CLR ALL R1-4F
	RETFIE 1
	
TM0.OVF
	BCF T2F			;ENG NOT FAST ENOUGH FOR START  CLEAR TIMING FLAG TO TELL T2END NOT TO TIME & SET MF
	BCF VT			;CLR VALID TIMING FLAG
	RETFIE 1
  ENDIF				;END OF A72007 RxF HANDLER
					
			;COMMON TO BOTH		 
TM0.1			;CALLED FOR SEQ 1 FOR CYL #3 (CONNECTED TO COIL 3)
	BCF FC3			;fire lead coil 3  CYL 3)			 FC1=CYL1, FC2=CYL2, FC3=CYL3, FC4= CYL4
  IF A72007 == 1
	BCF FC4			;2005 & LATER USE WASTE SPARK FOR CYL 3&4  /  1&2)
	MOVFF DWL,LP1D		;load lead plug 1 dwell count (180 DEG DWELL TIMING) 
	MOVFF DWLH,LP1DH
  ENDIF
	MOVFF DWL,LP2D		;load lead plug 2 dwell count (180 DEG DWELL TIMING) 
	MOVFF DWLH,LP2DH
	BTFSS REVF	;TEST FOR REV LIMITER FLAG, SKIP INJ IF SET
	BSF FI1		;FIRE CYL 2 INJECTOR
	MOVFF IPWL,R1ITL		;LOAD CYL 2 IPW TIMER WITH IPW
	MOVFF IPWH,R1ITH
	BSF INJ1		;SET DECREMENT FLAG FOR TIMER 2 ROUT
	RETFIE 1			;done so return & RE-ENABLE INTS

TM0.2				;CALLED FOR SEQ 1 FOR CYL #3 (CONNECTED TO COIL 3)
	bcf FC2			;fire CYL #2 (FC2)
  IF A72007 == 1
	BCF FC1			;2005 & LATER USE WASTE SPARK FOR CYL 3&4 / 1&2)
	MOVFF DWL,LP3D		;load lead plug 1 dwell count (180 DEG DWELL TIMING) 
	MOVFF DWLH,LP3DH
  ENDIF  
	movfF DWL,LP4D		;load lead plug dwell count  
	MOVFF DWLH,LP4DH
	BTFSS REVF	;TEST FOR REV LIMITER FLAG, SKIP INJ IF SET
	BSF FI3			;FIRE CYL 3 PRIMARY INJECTORS
	MOVFF IPWL,R3ITL		;LOAD cyl 3 IPW TIMER WITH IPW
	MOVFF IPWH,R3ITH
	BSF INJ3		;SET DECREMENT FLAG FOR TIMER 2 ROUTINE
	RETFIE 1			;done so return & ENABLE ints

TM0.3				;CALLED FOR SEQ 3 FOR CYL #4   
	bcf FC4			;fire lead coil 4 
  IF A72007 == 1
	BCF FC3			;2005 & LATER USE WASTE SPARK FOR CYL 3&4  /  1&2)
	MOVFF DWL,LP2D		;load lead plug 1 dwell count (180 DEG DWELL TIMING) 
	MOVFF DWLH,LP2DH
  ENDIF
	movfF DWL,LP1D		;load lead plug 1 dwell count  
	MOVFF DWLH,LP1DH
	BTFSS REVF	;TEST FOR REV LIMITER FLAG, SKIP INJ IF SET
	BSF FI2			;FIRE CYL 2 PRIMARY INJECTORS
	MOVFF IPWL,R2ITL		;LOAD ROTOR 2 IPW TIMER WITH IPW
	MOVFF IPWH,R2ITH
	BSF INJ2		;SET DECREMENT FLAG FOR TIMER 2 ROUT
	RETFIE 1			;done so return & RE-ENABLE INTS

TM0.4				;CALLED FOR SEQ 4 FOR CYL # 1 (CONNECTED TO COIL 1)
	bcf FC1			;fire coil 1   
  IF A72007 == 1
	BCF FC2			;2005 & LATER USE WASTE SPARK FOR CYL 3&4 / 1&2)
	MOVFF DWL,LP4D		;load lead plug 1 dwell count (180 DEG DWELL TIMING) 
	MOVFF DWLH,LP4DH
  ENDIF
	movfF DWL,LP3D		;load lead plug 3 dwell count 
	MOVFF DWLH,LP3DH
	BTFSS REVF	;TEST FOR REV LIMITER FLAG, SKIP INJ IF SET
	BSF FI4				;FIRE CYL 3 PRIMARY INJECTORS
	MOVFF IPWL,R4ITL		;LOAD cyl 3 IPW TIMER WITH IPW
	MOVFF IPWH,R4ITH
	BSF INJ4		;SET DECREMENT FLAG FOR TIMER 2 ROUT
	RETFIE 1			;done so return & RE-ENABLE INTS
 ENDIF  			;END OF 0xA7 TM0 COMMON ROUTS


 IF (ENG==0xAC)
TM0.1			;CALLED FOR SEQ 4 FOR CYL #1 (CONNECTED TO COIL 1)
	bcf FC1			;fire lead coil 1  CYL 1) 
  IF ENG==0xAC
	bcf R1F			;CLEAR THE FLAG   
  ENDIF
	movfF DWL,LP2D		;load lead plug 3 dwell count 
	MOVFF DWLH,LP2DH
					;LEAD PLUG 3 DWELL COUNT
	BTFSS REVF	;TEST FOR REV LIMITER FLAG, SKIP INJ IF SET
	BSF FI4		;FIRE CYL 2 INJECTOR
	MOVFF IPWL,R4ITL		;LOAD CYL 2 IPW TIMER WITH IPW
	MOVFF IPWH,R4ITH
	BSF INJ4		;SET DECREMENT FLAG FOR TIMER 2 ROUT
	RETFIE 1			;done so return & RE-ENABLE INTS

TM0.2				;CALLED FOR SEQ 1 FOR CYL #3 (CONNECTED TO COIL 2)
	bcf FC2			;fire CYL #3 (FC2)    FC1=CYL1, FC2=CYL3, FC3=CYL2, FC4= CYL4
  IF ENG==0xAC
	bcf R2F			;CLEAR THE FLAG   
  ENDIF
	movfF DWL,LP3D		;load lead plug dwell count  FC1=CYL1, FC2=CYL3, FC3=CYL2, FC4= CYL4
	MOVFF DWLH,LP3DH
	BTFSS REVF	;TEST FOR REV LIMITER FLAG, SKIP INJ IF SET
	BSF FI1			;FIRE CYL 1 PRIMARY INJECTORS
	MOVFF IPWL,R1ITL		;LOAD ROTOR 1 IPW TIMER WITH IPW
	MOVFF IPWH,R1ITH
	BSF INJ1		;SET DECREMENT FLAG FOR TIMER 2 ROUTINE
	RETFIE 1			;done so return & ENABLE INTS

TM0.3				;CALLED FOR SEQ 2 FOR CYL #2 (COIL 3)  FC1=CYL1, FC2=CYL3, FC3=CYL2, FC4= CYL4
	bcf FC3			;fire lead coil 3 
  IF ENG==0xAC
	bcf R3F			;CLEAR THE FLAG   
  ENDIF
	movfF DWL,LP4D		;load lead plug 1 dwell count  FC1=CYL1, FC2=CYL3, FC3=CYL2, FC4= CYL4
	MOVFF DWLH,LP4DH
						;LEAD PLUG 2 DWELL COUNT
	BTFSS REVF	;TEST FOR REV LIMITER FLAG, SKIP INJ IF SET
	BSF FI3			;FIRE CYL 4 PRIMARY INJECTORS
	MOVFF IPWL,R3ITL		;LOAD ROTOR 4 IPW TIMER WITH IPW
	MOVFF IPWH,R3ITH
	BSF INJ3		;SET DECREMENT FLAG FOR TIMER 2 ROUT
	RETFIE 1			;done so return & RE-ENABLE INTS

TM0.4				;CALLED FOR SEQ 3 FOR CYL # 4 (CONNECTED TO COIL 4)
	bcf FC4			;fire lead coil 4   FC1=CYL1, FC2=CYL3, FC3=CYL2, FC4= CYL4
  IF ENG==0xAC
	bcf R4F			;CLEAR THE FLAG   
  ENDIF
	movfF DWL,LP1D		;load lead plug 1 dwell count  FC1=CYL1, FC2=CYL3, FC3=CYL2, FC4= CYL4
	MOVFF DWLH,LP1DH
						;LEAD PLUG 1 DWELL COUNT
	BTFSS REVF	;TEST FOR REV LIMITER FLAG, SKIP INJ IF SET
	BSF FI2				;FIRE CYL 3 PRIMARY INJECTORS
	MOVFF IPWL,R2ITL		;LOAD ROTOR 3 IPW TIMER WITH IPW
	MOVFF IPWH,R2ITH
	BSF INJ2		;SET DECREMENT FLAG FOR TIMER 2 ROUT
	RETFIE 1			;done so return & RE-ENABLE INTS
 ENDIF  			;END OF AC TM0 COMMON ROUTS

 IF ENG==0xAF		;DIST V6
TM0INT
	BCF T0CON,TMR0ON,0	;STOP IT
	BCF INTCON,TMR0IF,0				;INT VECTOR HAS ALREADY STOPPED TM0 FOR US  HAS IT?   I DON'T SEE IT!
	BTFSC T2F
	BRA TM0.A		;ERROR EXIT, T0 OVF
	BTFSS VT		;VALID TIMING?
	BRA TM0.B		;NO ACTION EXIT, WAIT FOR VT
	BTFSS LSF		;TEST FOR LOW SPEED FLAG
	BRA TM0.C		;GO ON IF NOT
	MOVF T4L,0,1 			;LOAD TMR0 W/11.25 DEG (USED FOR LOW SPEED DWELL
	ADDWF T8L,0,1
	MOVWF IARGL
	MOVF T4H,0,1
	ADDWFC T8H,0,1
	MOVWF TMR0H,0
	MOVFF IARGL,TMR0L
	BRA TM0.D	
TM0.C
	COMF SDH,0,1	;GET SPARK DELAY & MAKE POSITIVE COUNT
	MOVWF TMR0H,0	;PRELOAD W/SPARK DELAY CONVERTED TO POSITIVE
	COMF SDL,0,1
	MOVWF TMR0L,0
TM0.D
	BSF T0CON,TMR0ON,0	;RESTART TIMER
	BSF T2F			;TELL ALL THAT T2 BEING TIMED NOW
	BCF FC1			;FIRE THE COIL
	BCF FC2			;A SPARE IF USED\
	BTFSC LSF		;NO DWELL LOAD IF LOW SPEED CYCLE
	RETFIE 1
	MOVFF DWL,LP1D	;LOAD DWELL
	MOVFF DWLH,LP1DH
	RETFIE 1
TM0.A
	CLRF STAT0,1		;CLR MAIN FLAGS
	CLRF PORTD,0		;CLR ALL COILS & INJECTORS
	BSF TOOHI				;SET OVERFLOW FLAG
TM0.B
	RETFIE 1
 ENDIF			;0xAF
  
; *******************   HONDA V6  START

 IF ENG==0xB4		;HONDA V6
TM0INT
	BCF T0CON,TMR0ON,0
	BCF INTCON,TMR0IF,0
	BTFSC T2F		;WAS THIS A T2 INTERVAL OVERFLOW?
	BRA TM0.A		;EXIT IF NOT
	BTFSC R1F	;TEST for rot. 1 lead plug fire flag
	BRA TM0.0		;go fire it if flag set
	BTFSC R2F	;Rotor 2 lead flag set?
	BRA TM0.1		;do it if set
	BTFSC R3F	;ROTOR 3 flag set?
	BRA TM0.2		;do that if set
 	RETFIE 1
 	
TM0.A
	CLRF STAT0,1		;CLEAR ALL FLAGS FOR FRESH START
	CLRF SEQFLAG,1
	CLRF PORTD,0		;TURN OFF COILS & INJECTORS
	CLRF TMR0H,0
	CLRF TMR0L,0		;SETUP FOR
	BCF T0CON,TMR0ON,0
	RETFIE 1			;TP2 & TIMER 0 ints are still enabled AT THIS POINT. 

TM0.0
	BTFSC LSF	;TEST FOR LSI
	BRA TM0.0A
	BCF FC1		;fire coil 1    (IGN GP 1 ON V6 = CYL 3 & 4)  FIRES INJ GP 1  CYL 2 & 5 
	BCF FC4		;fire coil 4
TM0.0A
	bcf R1F			;CLEAR THE FLAG   
	MOVFF DWL,LP3D		;DWL GP 3 V6 IS A 240 DEG ENGINE
	MOVFF DWLH,LP3DH
	BTFSS ALT		;TEST FOR GROUP
	BRA TM0.0C		;SKIP INJECTION IF NOT alt
TM0.0B  
	BTFSC REVF	;TEST REV LIMITER FLAG
	BRA TM0.0C
	BSF FI1		;FIRE INJECTORS  (INJ 2 & 5 ON V6)
	BSF FI4
	MOVFF IPWL,R1ITL		;LOAD IPW TIMER WITH IPW (USE UN-ADJUSTED IPWL&H)
	MOVFF IPWH,R1ITH
	BSF INJ1	;SET DECREMENT FLAG FOR TIMER 2 ROUT
TM0.0C
	RETFIE 1			;done so return & RE-ENABLE INTS

TM0.1
	BTFSC LSF	;TEST FOR LSI
	BRA TM0.1A
	BCF FC2			;fire leading plugs (GP 2 ON V6 = CYL 2 & 6)
	BCF FC5
TM0.1A
	BCF R2F			;CLEAR THE FLAG
	MOVFF DWL,LP1D		;DWL GP 1 ON V6  (4 & 3) 
	MOVFF DWLH,LP1DH
	BTFSC ALT			;TEST FOR CYL #6 TIME (VS CYL #2)	
	BRA TM0.1C		;SKIP INJECTION IF NOT 
TM0.1B  
	BTFSC REVF	;TEST REV LIMITER FLAG
	BRA TM0.1C
	BSF FI2		;FIRE GP 2 INJECTORS (INJECTORS 1 & 4 ON HONDA V6)
	BSF FI5
	MOVFF IPWL,R2ITL	;LOAD ROTOR 2 IPW TIMER WITH IPW
	MOVFF IPWH,R2ITH
	BSF INJ2		;SET DECREMENT FLAG FOR TIMER 2 ROUTINE
TM0.1C
	RETFIE 1			;done so return & ENABLE INTS

TM0.2
	BTFSC LSF	;TEST FOR LSI
	BRA TM0.2A	
	bcf FC3		;fire leading plugs  (GP 3   CYL 1 & 5 ON HONDA V6)
	BCF FC6
TM0.2A
	BCF R3F			;CLEAR THE FLAG
	MOVFF DWL,LP2D		;GP 2 ON V6  (2 & 6)
	MOVFF DWLH,LP2DH
	BTFSC ALT		;TEST FOR #5 CYL TIME
	BRA TM0.2C		;SKIP INJECTION IF NOT 
TM0.2B  
	BTFSC REVF	;TEST REV LIMITER FLAG
	BRA TM0.2C
	BSF FI3		;FIRE GP 3 INJECTOR S (3 & 6 ON HONDA V6)
	BSF FI6
	MOVFF IPWL,R3ITL	;LOAD ROTOR 3 IPW TIMER WITH IPW
	MOVFF IPWH,R3ITH
	BSF INJ3		;SET DECREMENT FLAG FOR TIMER 2 ROUTINE	
TM0.2C
	RETFIE 1
 ENDIF        ;0xB4 

;  *******************  HONDA V6 END
 
;******  INTERRUPT SERVICE HANDLER  TP2INT  (MAY BE FROM INT0 OR INT1) INT1 IS THE USUAL SOURCE

;  TIMING PULSE 2 FROM CAS.

 IF (ENG==0xA2) 		;MAZDA COIL 13B
TP2INT	
	MOVLW D'86'		;LOAD DEAD TIME CTR (63.75 ms)	02-05-01
	MOVWF DTCL,1
	BTFSS T1F		; DID WE GET T1?    
	RETURN			; TP2.X		;EXIT IF NOT   

	INCF T2CNT,1,1		;INC T2 COUNT
	MOVF T2CNT,0,1	;PUT CNT INTO WREG
	DCFSNZ WREG,0		;TEST FOR 1
	BRA TP2.41		;WAS X SO TURN ON COIL 1 IF LSF SET & 15 DEG DELAY
	DCFSNZ WREG,0		;TEST FOR 2
	BRA TP2.42		;WAS X SO KILL IGN @ 10 DEG ATDC
	DCFSNZ WREG,0		;TEST FOR 3
	RETURN			;WAS X SO  (NO ACTION)
	DCFSNZ WREG,0		;TEST FOR 4 
	BRA TP2.STR		;WAS X  START T2 
	DCFSNZ WREG,0		;TEST FOR 5 
	BRA TP2.END		;WAS X END T2F CYC. CAPTURE TPL&H, SET MF, CLR T2F
	DCFSNZ WREG,0		;TEST FOR 6 
	GOTO TP2.46		;WAS 6 SO RETRIGGER  [START TMR0 W SDL&H & SET R2F & CLR R1F]
	DCFSNZ WREG,0		;TEST FOR 7
	GOTO TP2.47		;WAS X SO TURN ON COIL 2 If LSF SET
	DCFSNZ WREG,0		;TEST FOR 8
	BRA TP2.42		;WAS 8, SAME AS 42 
	DCFSNZ WREG,0		;TEST FOR 9
	RETURN			;WAS X SO   
	DCFSNZ WREG,0		;TEST FOR 10
	BRA TP2.STR		;WAS X SO  T2 START  
	DCFSNZ WREG,0		;TEST FOR 11
	BRA TP2.END		;WAS X SO    NO ACTIONTP2 CAPTURE END
	DCFSNZ WREG,0		;TEST FOR 12
	GOTO TP2.12		;WAS X SO RETRIGGER START TMR0 W SDL&H & SET R1F & CLR R2, 

	CLRF T2CNT,1		;INVALID # SO CLEAR & START OVER
	BCF T1F
	CLRF STAT0,1		;FRESH START
	CLRF SEQFLAG,1
	BCF INTCON,INT0IF,0		;kill any existing t1 ints
	BSF INTCON,INT0IE,0		;ENABLE TP1S
TP2.X	
	RETURN

TP2.42				;10 DEG atdc R1 & r2
	BCF FC1
	BCF FC2
	RETURN

TP2.41			;TEST FOR LOW SPEED DWELL      (rpm < 606) NEW
	BTFSS VT			;VRPM	;TEST FOR VALID TIMING  
	RETURN		;  "
	BTFSS LSF		;TEST FOR LOW SPEED DWELL FLAG (rpm < LSF)
	RETURN		;NO, SO EXIT
	BTFSS CAF		;TEST FOR DISABLE SWITCHES
	BTFSC DLC		;(CK STATUS BIT, NOT SW)
	BSF FC1			;TURN LEADING COIL ON
	BTFSS CAF
	BTFSC DATC
	BSF FC2
	BCF T0CON,TMR0ON,0		; RUN TMR0 FOR 15 DEG.
	COMF T2H,0,1
	MOVWF TMR0H,0
	COMF T2L,0,1
	MOVWF TMR0L,0
	BSF T0CON,TMR0ON,0
	RETURN		;DONE SO EXIT

;TP2.41			; LOW SPEED DWELL EVENT      (rpm < 1000)
;	BTFSS VT		;VRPM		;TEST FOR VALID TIMING   
;	RETURN		;  "
;	BTFSS DSF		;TEST FOR LOW SPEED DWELL FLAG (rpm < 1000)
;	RETURN		;NO, SO EXIT							; NORMAL DSF DWELL & TIMER EVENT
;	BTFSS CAF		;TEST FOR DISABLE SWITCHES
;	BTFSC DLC		;(CK STATUS BIT, NOT SW)
;	BSF FC1			;TURN LEADING COIL ON
;	BTFSS CAF
;	BTFSC DATC
;	BSF FC2
;	RETURN

TP2.46
	MOVFF SDH,TMR0H
	MOVFF SDL,TMR0L		;LOAD TMR0 WITH SPARK DELAY
	BSF T0CON,TMR0ON,0
	BSF R2F			;SET ROTOR 2 FLAG FOR TIMER 0 INT ROUT.
	BCF R1F			; CLEAR THE OTHER ON JUST TO BE SURE
TP2.46X
	RETURN

TP2.47			; LOW SPEED DWELL EVENT      (rpm < 1000)
	BTFSS VT		;VRPM		;TEST FOR VALID TIMING   
	RETURN		;  "
	BTFSS LSF		;TEST FOR LOW SPEED DWELL FLAG (rpm < 606)
	RETURN		;NO, SO EXIT							; NORMAL DSF DWELL & TIMER EVENT
	BTFSS CAF		;TEST FOR DISABLE SWITCHES
	BTFSC DLC		;(CK STATUS BIT, NOT SW)
	BSF FC1			;TURN LEADING COIL ON
	BTFSS CAF
	BTFSC DATC
	BSF FC2
	BCF T0CON,TMR0ON,0		; RUN TMR0 FOR 15 DEG.
	COMF T2H,0,1
	MOVWF TMR0H,0
	COMF T2L,0,1
	MOVWF TMR0L,0
	BSF T0CON,TMR0ON,0
	RETURN

TP2.12
	MOVFF SDH,TMR0H
	MOVFF SDL,TMR0L		;LOAD TMR0 WITH SPARK DELAY
	BSF T0CON,TMR0ON,0
	BSF R1F			;SET ROTOR 1 FLAG FOR TIMER 0 INT ROUT.
	BCF R2F			;CLEAR ROTOR 2 FLAG
TP2.12X
	BCF T1F			;CLEAR T1F FOR NEXT GO
	BCF STRF			;CLEAR THE START FLAG 
	BCF INTCON3,INT1IF,0		;kill any existing t1 ints  THESE ARE NOW LOW PRI INTS ON TP2 INPUT, WAS TP1 INPUT DOC DELTA
	BSF INTCON3,INT1IE,0		;ENABLE TP1 INTS  (TWELVE T2 INTS WILL RE-ENABLE T1 INTS)
	RETURN
	
TP2.STR			;START T2 CYCLE
	CLRF TMR0H,0
	CLRF TMR0L,0
	BSF T0CON,TMR0ON,0
	BSF T2F
	BSF ANF
	RETURN

TP2.END		;  T2 INTERVAL TIME CAPTURE  PSV  *******
	BCF T0CON,TMR0ON,0		;stop timer 0 by selecting external clock
	BSF MF		;SET MATH FLAG FOR EXEC
	BTFSS T2F	;TEST FOR IT
	RETURN		;EXIT IF NOT
	BCF T2F			;CLR FLAG SO TMR0 DOES NOT FIND ERROR
	MOVFF TMR0L,TPL		;save timer 0 count (T2 interval) 16BIT LOAD
	MOVFF TMR0H,TPH

;ACCL START		ADD THIS IMMEDIATELY AFTER T2 CAPTURE IN TPL&H
TP2.END0
	BTFSS ACCF		;IS ACCF FLAG NOT SET, GO ON
	BRA TP2.ENDC
	DCFSNZ ACCNT,1,1		;DECREMENT ACCELERATION CTR (GIVES 1/2 SEC OF ACCL TIME @ 2000 RPM)
	BCF ACCF		;CLR IT IF TIME UP
TP2.ENDC
;ACCL END
TP2.ACL											;  *********  NEW ACL START
	MOVLW HIGH DWLSPD	;GET DWELL TRANSITION SPEED DSF
	CPFSLT TPH,1		;ENG SPEED LT?
	BRA TP2.0E			;GO SET DSF  & TEST FOR LSF
	BCF DSF
	BCF LSF				;ENG RPM > DSF SPEED				
TP2.0D				;TEST FOR ACCELERATION 
	MOVFF TPLOLD,IARGL
	MOVFF TPHOLD,IARGH
	MOVF TPL,0,1
	SUBWF IARGL,1,1
	MOVF TPH,0,1
	SUBWFB IARGH,1,1
	BNC TP2.0X	;NEW RPM WAS < OLD SO EXIT,   IS NEW RPM > OLD?  IF CY SET, NEW TPH < OLD SO TEST FOR ACCL
	
 	TSTFSZ IARGH,1		;TEST MSB OF DELTA 
 	BRA TP2.AC1			;MSB NOT ZERO SO PROCESS
 	MOVLW D'32'		;LOW ACTHRESH 			;MSB WAS 0 SO TEST LSB CONSTANT
 	CPFSLT IARGL,1			;COMPARE LSB CONST TO LSB VAR
 	BRA TP2.AC1				;TRUE EXIT DELTA >= THRESH
TP2.0X
 	RETURN					;FALSE EXIT,  DELTA < THRESH
TP2.AC1
	MOVLW 0x1F
	ANDWF IARGL,1
   	BCF _C
   	RRCF IARGH,1,1			;DIV DELTA BY 32
   	RRCF IARGL,1,1
   	RRCF IARGH,1,1
   	RRCF IARGL,1,1
   	RRCF IARGH,1,1
   	RRCF IARGL,1,1
   	RRCF IARGH,1,1
   	RRCF IARGL,1,1
   	RRCF IARGH,1,1
   	RRCF IARGL,1,1
 	
  	MOVLW D'6'			;BUMP IT FOR EMPIRICAL VALUE 
   	ADDWF IARGL,1,1
 
   	MOVF IARGL,0,1		;GET DWL DELTA IN WREG
   	MOVF LP1DH,1,1		;TEST MSB FOR ACTIVE
   	BNZ TP2.ACA			;ACTIVE, SO GO HANDLE
   	MOVF LP1D,1,1		;TEST LPD1 FOR ACTIVE
   	BZ TP2.AC2			;GO TO NEXT DWELL IF NOT ACTIVE	
TP2.ACA
   	SUBWF LP1D,0,1		;SUB DELTA FROM COUNT
   	BNC TP2.AC1A			;IF NEGATIVE, TIME TO TURN IT ON IF NO MSB
	BTFSC STATUS,Z,0	;NOT NEGATIVE SO test for zero
	BRA TP2.AC1C		;HANDLE ZERO CASE , TEST FOR POSSIBLE MSB
   	MOVWF LP1D,1		;UPDATE LPD1
   	BRA TP2.AC2			;GO CK ROTOR 2
TP2.AC1A
	MOVF LP1DH,1,1		;TEST MSB
	BZ TP2.AC1B			;HANDLE 0 TIME OUT
	DECF LP1DH,1,1		;UPDATE MSB
	MOVWF LP1D,1			;UPDATE LSB
	BRA TP2.AC2			;NO TIMEOUT SO GO CK ROTOR 2
TP2.AC1B
   	BSF FC1				;HAD BORROW OR WAS ZERO SO TURN ON NOW
   	BSF FC2
   	CLRF LP1D
   	CLRF LP1DH
   	BRA TP2.AC2
TP2.AC1C				;ZERO LSB COUNT
	MOVF LP1DH,1,1		;TEST MSB
	BZ TP2.AC1B			;IF TOTAL COUNT = 0 THEN TIME FOR DWELL OTHERWISE GO ON WITH NEXT ROTOR
	
TP2.AC2												;TEST DWELL FOR ROTOR 2
    MOVF IARGL,0,1		;GET DWL DELTA IN WREG
   	MOVF LP2DH,1,1		;TEST MSB FOR ACTIVE
   	BNZ TP2.ACA2			;ACTIVE, SO GO HANDLE
   	MOVF LP2D,1,1		;MSB IS 0,  TEST LPD1 FOR ACTIVE
   	BZ TP2.AC3			;GO TO NEXT DWELL IF NOT ACTIVE	
TP2.ACA2
   	SUBWF LP2D,0,1		;SUB DELTA FROM COUNT
   	BNC TP2.AC1A2			;IF NEGATIVE, TIME TO TURN IT ON IF NO MSB
	BTFSC STATUS,Z,0	;NOT NEGATIVE SO test for zero
	BRA TP2.AC1C2		;HANDLE ZERO CASE , TEST FOR POSSIBLE MSB
   	MOVWF LP2D,1		;UPDATE LPD1
   	BRA TP2.AC3			;GO CK NEXT ROTOR
TP2.AC1A2
	MOVF LP2DH,1,1		;TEST MSB
	BZ TP2.AC1B2			;HANDLE 0 TIME OUT
	DECF LP2DH,1,1		;UPDATE MSB
	MOVWF LP2D,1		;UPDATE LSB
	BRA TP2.AC3			;NO TIMEOUT SO GO CK ROTOR 2
TP2.AC1B2
   	BSF FC3				;HAD BORROW OR WAS ZERO SO TURN ON NOW
   	BSF FC4
   	CLRF LP2D
   	CLRF LP2DH
   	BRA TP2.AC3			;GO CK NEXT ROTOR
TP2.AC1C2				;ZERO LSB COUNT
	MOVF LP2DH,1,1		;TEST MSB
	BZ TP2.AC1B2			;IF TOTAL COUNT = 0 THEN TIME FOR DWELL OTHERWISE GO ON WITH NEXT ROTOR  	
TP2.AC3
	RETURN			;END OF ACL HANDLER OR START OF NEXT ROTOR IF ANY
TP2.0E					;RPM WAS < DSF SPEED
	BSF DSF	
	MOVLW HIGH MAPRPMSTR		;THE LSF CONSTANT
	CPFSLT TPH,1
	BRA TP2.0F		;GO SET LSF
	BCF LSF
	BRA TP2.0D		;RPM BETWEEN LSF ANF DSF POINT.  GO TEST FOR RPM ACCELERATION
TP2.0F
	BSF LSF
	RETURN	;EXIT
;  *********  NEW ACCL END

 ENDIF     ;END OF MAZ CAS - MAZ COIL (0xA2) EVENTS

 IF ENG == 0xA1  ;13B   LS-1 COIL VERSION 
TP2INT	
	MOVLW D'86'		;LOAD DEAD TIME CTR (63.75 ms)	02-05-01
	MOVWF DTCL,1
	BTFSS T1F		; DID WE GET T1?    
	RETURN		; TP2.X		;EXIT IF NOT 
TP2.4  
	INCF T2CNT,1,1		;INC T2 COUNT
	MOVF T2CNT,0,1	;PUT CNT INTO WREG
	DCFSNZ WREG,0,0		;TEST FOR 1
	BRA TP2.41		;WAS X SO START 15 DEG CNT & DWELL IF LSF SET
	DCFSNZ WREG,0,0		;TEST FOR 2
	BRA TP2.42			;
	DCFSNZ WREG,0,0		;TEST FOR 3
	RETURN			;NO ACTION
	DCFSNZ WREG,0,0		;TEST FOR 4 
	BRA TP2.STR		;30 DEG STR
	DCFSNZ WREG,0,0		;TEST FOR 5 
	BRA TP2.END		;WAS 5 TP2 END
	DCFSNZ WREG,0,0		;TEST FOR 6 
	BRA TP2.46		;WAS 6 SO START TMR0 W SDL&H & SET R2F & CLR R1F
	DCFSNZ WREG,0,0		;TEST FOR 7
	BRA TP2.47		;WAS X SO TURN ON COIL 2 IF DSF SET
	DCFSNZ WREG,0,0		;TEST FOR 8
	BRA TP2.48			;WAS X EXIT
	DCFSNZ WREG,0,0		;TEST FOR 9
	RETURN			;NO ACTION
	DCFSNZ WREG,0,0		;TEST FOR 10
	BRA TP2.STR		;WAS X SO  TP2 START
	DCFSNZ WREG,0,0		;TEST FOR 11
	BRA TP2.END		;WAS X SO    TP2 END
	DCFSNZ WREG,0,0		;TEST FOR 12
	GOTO TP2.12		;WAS X SO RETRIGGER START TMR0 W SDL&H & SET R1F & CLR R2, 

	CLRF T2CNT,1		;INVALID # SO CLEAR & START OVER
	BCF T1F
	CLRF STAT0,1		;FRESH START
	CLRF SEQFLAG,1
	BCF INTCON3,INT1IF,0		;kill any existing t1 ints  DOC CHANGE!
	BSF INTCON3,INT1IE,0		;ENABLE TP1S
TP2.X	
	RETURN

TP2.42				;10 DEG atdc R1  (5 DEG ON BREW)
	BCF FC1
	BCF FC2
	RETURN

TP2.48				;10 DEG ATDC R2  (5 DEG ON BREW)
	BCF FC3
	BCF FC4
	RETURN

TP2.41			;TEST FOR LOW SPEED DWELL      (rpm < 606)
	BTFSS VT			;VRPM	;TEST FOR VALID TIMING  
	RETURN		;  "
	BTFSS LSF		;TEST FOR LOW SPEED DWELL FLAG (rpm < DSF)
	RETURN		;NO, SO EXIT
	BTFSS CAF		;TEST FOR DISABLE SWITCHES
	BTFSC DLC		;(CK STATUS BIT, NOT SW)
	BSF FC1			;TURN LEADING COIL ON, BETTER LATE THAN NEVER
	BTFSS CAF
	BTFSC DATC
	BSF FC2
	BCF T0CON,TMR0ON,0		; TO RUN TMR0 FOR 15 DEG.
	COMF T2H,0,1
	MOVWF TMR0H,0
	COMF T2L,0,1
	MOVWF TMR0L,0
	BSF T0CON,TMR0ON,0
	RETURN		;DONE SO EXIT

TP2.46	
	BTFSS VT
	RETURN
	MOVFF SDH,TMR0H
	MOVFF SDL,TMR0L		;LOAD TMR0 WITH SPARK DELAY
	BSF T0CON,TMR0ON,0
	BSF R2F			;SET ROTOR 2 FLAG FOR TIMER 0 INT ROUT.
	BCF R1F			; CLEAR THE OTHER ON JUST TO BE SURE
	RETURN

TP2.47			;TEST FOR LOW SPEED DWELL      (rpm < 1000)
	BTFSS VT     ;VRPM	;TEST FOR VALID TIMING  
	RETURN		;  EXIT IF NOT"
	BTFSS LSF		;TEST FOR  DWELL SPEED FLAG (rpm < 1000)
	RETURN		;NO, SO EXIT
	BTFSS CAF		;TEST FOR DISABLE SWITCHES
	BTFSC DLC		;(CK STATUS BIT, NOT SW)
	BSF FC3			;TURN LEADING COIL ON, BETTER LATE THAN NEVER
	BTFSS CAF
	BTFSC DATC
	BSF FC4			;TRAILING COIL ON
	BCF T0CON,TMR0ON,0
	COMF T2H,0,1
	MOVWF TMR0H,0
	COMF T2L,0,1
	MOVWF TMR0L,0
	BSF T0CON,TMR0ON,0
	RETURN		;DONE SO EXIT

TP2.12
	BTFSS VT
	RETURN
	MOVFF SDH,TMR0H
	MOVFF SDL,TMR0L		;LOAD TMR0 WITH SPARK DELAY
	BSF T0CON,TMR0ON,0
	BSF R1F			;SET ROTOR 1 FLAG FOR TIMER 0 INT ROUT.
	BCF R2F			;CLEAR ROTOR 2 FLAG
	BCF T1F			;CLEAR T1F FOR NEXT GO
	BCF STRF			;CLEAR THE START FLAG 
	BCF INTCON,INT0IF,0		;kill any existing t1 ints  DOC CHANGE
	BSF INTCON,INT0IE,0		;ENABLE TP1 INTS  (TWELVE T2 INTS WILL RE-ENABLE T1 INTS)
	RETURN

TP2.STR			;START T2 CYCLE
	CLRF TMR0H,0
	CLRF TMR0L,0
	BSF T0CON,TMR0ON,0
	BSF T2F
	BSF ANF
	RETURN

TP2.END		;  T2 INTERVAL TIME CAPTURE  PSV  *******
	BCF T0CON,TMR0ON,0		;stop timer 0 by selecting external clock
	BSF MF		;SET MATH FLAG FOR EXEC
	BTFSS T2F	;TEST FOR IT
	RETURN		;EXIT IF NOT
	BCF T2F			;CLR FLAG SO TMR0 DOES NOT FIND ERROR
	movFF TMR0L,TPL		;save timer 0 count (T2 interval)
	movFF TMR0H,TPH
;ACCL START		ADD THIS IMMEDIATELY AFTER T2 CAPTURE IN TPL&H
TP2.END0
	BTFSS ACCF		;IS ACCF FLAG NOT SET, GO ON
	BRA TP2.ENDC
	DCFSNZ ACCNT,1,1		;DECREMENT ACCELERATION CTR (GIVES 1/2 SEC OF ACCL TIME @ 2000 RPM)
	BCF ACCF		;CLR IT IF TIME UP
TP2.ENDC
;ACCL END

TP2.ACL											;  *********  NEW ACL START
	MOVLW HIGH DWLSPD	;GET DWELL TRANSITION SPEED DSF
	CPFSLT TPH,1		;ENG SPEED LT?
	BRA TP2.0E			;GO SET DSF  & TEST FOR LSF
	BCF DSF
	BCF LSF				;ENG RPM > DSF SPEED				
TP2.0D				;TEST FOR ACCELERATION 
	MOVFF TPLOLD,IARGL
	MOVFF TPHOLD,IARGH
	MOVF TPL,0,1
	SUBWF IARGL,1,1
	MOVF TPH,0,1
	SUBWFB IARGH,1,1
	BNC TP2.0X	;NEW RPM WAS < OLD SO EXIT,   IS NEW RPM > OLD?  IF CY SET, NEW TPH < OLD SO TEST FOR ACCL
	
 	TSTFSZ IARGH,1		;TEST MSB OF DELTA 
 	BRA TP2.AC1			;MSB NOT ZERO SO PROCESS
 	MOVLW D'32'		;LOW ACTHRESH 			;MSB WAS 0 SO TEST LSB CONSTANT
 	CPFSLT IARGL,1			;COMPARE LSB CONST TO LSB VAR
 	BRA TP2.AC1				;TRUE EXIT DELTA >= THRESH
TP2.0X
 	RETURN					;FALSE EXIT,  DELTA < THRESH
TP2.AC1
	MOVLW 0x1F
	ANDWF IARGL,1
   	BCF _C
   	RRCF IARGH,1,1			;DIV DELTA BY 32
   	RRCF IARGL,1,1
   	RRCF IARGH,1,1
   	RRCF IARGL,1,1
   	RRCF IARGH,1,1
   	RRCF IARGL,1,1
   	RRCF IARGH,1,1
   	RRCF IARGL,1,1
   	RRCF IARGH,1,1
   	RRCF IARGL,1,1
 	
  	MOVLW D'6'			;BUMP IT FOR EMPIRICAL VALUE 
   	ADDWF IARGL,1,1
 
   	MOVF IARGL,0,1		;GET DWL DELTA IN WREG
   	MOVF LP1DH,1,1		;TEST MSB FOR ACTIVE
   	BNZ TP2.ACA			;ACTIVE, SO GO HANDLE
   	MOVF LP1D,1,1		;TEST LPD1 FOR ACTIVE
   	BZ TP2.AC2			;GO TO NEXT DWELL IF NOT ACTIVE	
TP2.ACA
   	SUBWF LP1D,0,1		;SUB DELTA FROM COUNT
   	BNC TP2.AC1A			;IF NEGATIVE, TIME TO TURN IT ON IF NO MSB
	BTFSC STATUS,Z,0	;NOT NEGATIVE SO test for zero
	BRA TP2.AC1C		;HANDLE ZERO CASE , TEST FOR POSSIBLE MSB
   	MOVWF LP1D,1		;UPDATE LPD1
   	BRA TP2.AC2			;GO CK ROTOR 2
TP2.AC1A
	MOVF LP1DH,1,1		;TEST MSB
	BZ TP2.AC1B			;HANDLE 0 TIME OUT
	DECF LP1DH,1,1		;UPDATE MSB
	MOVWF LP1D,1			;UPDATE LSB
	BRA TP2.AC2			;NO TIMEOUT SO GO CK ROTOR 2
TP2.AC1B
   	BSF FC1				;HAD BORROW OR WAS ZERO SO TURN ON NOW
   	BSF FC2
   	CLRF LP1D
   	CLRF LP1DH
   	BRA TP2.AC2
TP2.AC1C				;ZERO LSB COUNT
	MOVF LP1DH,1,1		;TEST MSB
	BZ TP2.AC1B			;IF TOTAL COUNT = 0 THEN TIME FOR DWELL OTHERWISE GO ON WITH NEXT ROTOR
	
TP2.AC2												;TEST DWELL FOR ROTOR 2
    MOVF IARGL,0,1		;GET DWL DELTA IN WREG
   	MOVF LP2DH,1,1		;TEST MSB FOR ACTIVE
   	BNZ TP2.ACA2			;ACTIVE, SO GO HANDLE
   	MOVF LP2D,1,1		;MSB IS 0,  TEST LPD1 FOR ACTIVE
   	BZ TP2.AC3			;GO TO NEXT DWELL IF NOT ACTIVE	
TP2.ACA2
   	SUBWF LP2D,0,1		;SUB DELTA FROM COUNT
   	BNC TP2.AC1A2			;IF NEGATIVE, TIME TO TURN IT ON IF NO MSB
	BTFSC STATUS,Z,0	;NOT NEGATIVE SO test for zero
	BRA TP2.AC1C2		;HANDLE ZERO CASE , TEST FOR POSSIBLE MSB
   	MOVWF LP2D,1		;UPDATE LPD1
   	BRA TP2.AC3			;GO CK NEXT ROTOR
TP2.AC1A2
	MOVF LP2DH,1,1		;TEST MSB
	BZ TP2.AC1B2			;HANDLE 0 TIME OUT
	DECF LP2DH,1,1		;UPDATE MSB
	MOVWF LP2D,1		;UPDATE LSB
	BRA TP2.AC3			;NO TIMEOUT SO GO CK ROTOR 2
TP2.AC1B2
   	BSF FC3				;HAD BORROW OR WAS ZERO SO TURN ON NOW
   	BSF FC4
   	CLRF LP2D
   	CLRF LP2DH
   	BRA TP2.AC3			;GO CK NEXT ROTOR
TP2.AC1C2				;ZERO LSB COUNT
	MOVF LP2DH,1,1		;TEST MSB
	BZ TP2.AC1B2			;IF TOTAL COUNT = 0 THEN TIME FOR DWELL OTHERWISE GO ON WITH NEXT ROTOR  	
TP2.AC3
	RETURN			;END OF ACL HANDLER OR START OF NEXT ROTOR IF ANY
TP2.0E					;RPM WAS < DSF SPEED
	BSF DSF	
	MOVLW HIGH MAPRPMSTR		;THE LSF CONSTANT
	CPFSLT TPH,1
	BRA TP2.0F		;GO SET LSF
	BCF LSF
	BRA TP2.0D		;RPM BETWEEN LSF ANF DSF POINT.  GO TEST FOR RPM ACCELERATION
TP2.0F
	BSF LSF
	RETURN	;EXIT
;  *********  NEW ACCL END

 ENDIF		;END OF TYPE 0xA1 EVENT LIST

 IF ENG==0xA9;	; EA81 / EJ25 VER W/ 60-2 CAS
TP2INT
	BCF _C			;DIVIDE SYNCL&H BY 2;TEST FOR SYNC INTERVAL
	RRCF SYNCH,0,1		; 
	MOVWF IARGH,1	;SAVE IT
	RRCF SYNCL,0,1		;GET LSB OF NEW/2 TO WREG
	SUBWF TOLDL,0,1		;SUB LSB
	MOVF IARGH,0,1		;GET NEW T2 MSB/2
	SUBWFB TOLDH,0,1		;SUB MSB
	BTFSC _C		;TEST FOR BORROW  IF NEW/2 >TOLD THEN WE HAVE SYNC DETECT
	BRA TP2.00		;NO BORROW SO NO SYNC DET, GO ON
	BSF SYNF		;HAD BORROW SO GO SET SYNC DET (SYNF) 
	BTFSS CAF		;ARE WE A?
	BRA TP2.B1		;GO TO B ROUT IF NOT
	CLRF T2CNT,1		;WE ARE A SO CLR T2CNT
	BRA TP2.00		;CONTINUE
TP2.B1			;B CONTROLLER ROUT
	BTFSS BUSIN		;HAVE BACKUP SENSOR INSTALLED?  (WAS)   IF BUSENSOR==1
	BRA TP2.C		;NO BU SO GO
  IF (CONT==1)			;CONTINTENTAL OR EMT  TIMING FLAG 
		MOVLW D'57'		;BACKUP SENSOR ON CONT O - 200 ENGINE IS AT 12 DEG BTDC FIRST TOOTH AFTER GAP, 18 DEGREES BEFORE PRIMARY
  ELSE
		MOVLW D'30'		;BACKUP SENSOR ON A9 OR EMT IS 180 DEG FROM PRIMARY
  ENDIF
	MOVWF T2CNT,1
	BRA	TP2.00
TP2.C			;(WAS)	   ELSE				;WE ARE B BUT THERE IS NO BACKUP SENSOR (BOTH A&B USE INT0)
	CLRF T2CNT,1		;SET T2CNT TO 0
;						;(WAS)   ENDIF
  
TP2.00
	MOVFF SYNCL,TOLDL	; save LATEST SYNC counT IN TOLDL&H
	MOVFF SYNCH,TOLDH
	CLRF SYNCL,1		;CLEAR SYNC REG FOR NEXT CAPTURE CYCLE
	CLRF SYNCH,1
 IF (CONT ==1)
	MOVLW D'50'		;LOAD DEAD TIME CTR (38.25 ms)   25.2 MS IS T2 SYNC GAP @ 120 RPM   *********	
 ELSE
 	MOVLW D'35'
 ENDIF
	MOVWF DTCL,1
	BTFSS SYNF		; DO WE HAVE SYNC?    04-27-02  PSV ****  WAS T1F NOW SYNF
	RETURN			;EXIT IF NOT

;0xA9 ENGINE EVENT LIST  EA81X
  IF EMT==0		;NOT EMT OPTION (60-2 w/ tooth 1 at 6 deg atdc (EA81 / Cont)
TP2.4			;T2 EVENT HANDLER FOR A CONTROLLER
	INCF T2CNT,1,1		;INC T2 COUNT  WE HAVE SYNC SO START COUNTING T2
	MOVLW D'30'		;SEPARATE TESTS INTO TWO GROUPS, LOW & HIGH
	CPFSGT T2CNT,1		;T2 <29?
	BRA T2LOW		;GO TEST LOW GP 1 - 29
	MOVLW D'44'		;;START TP2, SET ANF              
	CPFSGT T2CNT,1		;GO ON IF > 44
	GOTO TP2.STR	;GO HANDLE IT
	MOVLW D'49'			;END T2 INTERVAL EVENT          
	CPFSGT T2CNT,1		;GO ON IF > 49
	GOTO TP2.END	;GO HANDLE IT
 	MOVLW D'53'			;LD TMR0, SET R1F (31)             
	CPFSGT T2CNT,1		;GO ON IF > 39
	GOTO TP2.3		;GO HANDLE IT
	MOVLW D'58'			;LOOK FOR LSD GP 1 EVENT (was 55)
	CPFSGT T2CNT,1		;GO ON IF > 58
	GOTO TP2.6		;GO HANDLE
   IF CONT==1		
    MOVLW D'60'		;TEST FOR LSI ON CONT B CONTROLLERS
    CPFSGT T2CNT,1 
	GOTO TP2.1		;HANDLE LSI IF TIME
   ENDIF
	MOVLW D'61'		;LOOK FOR LAST T2 on B  
	CPFSEQ T2CNT,1		;HANDLE SPECIAL CASE ON B CONTROLLER
	RETURN
	BTFSC CAF		;ARE WE A?
	RETURN			;WE ARE A SO IGNORE HIGH COUNTS
	MOVLW D'01'		;WE ARE B SO SET TO T2 = 1.  (EJ25/EA81 W/ 60-2)
	MOVWF T2CNT,1
	RETURN

T2LOW					;1 - 29
	MOVLW D'01'		;LOOK FOR LOW SPEED ign GP 1 EVENT
	CPFSGT T2CNT,1		;GO ON IF >1
	GOTO TP2.1		;GO HANDLE IT
	MOVLW D'14'			;LOOK FOR START T2, SET ANF EVENT        
	CPFSGT T2CNT,1		;GO ON IF > 12
	GOTO TP2.STR	;GO HANDLE IT
	MOVLW D'19'			;TP2 END?                    
	CPFSGT T2CNT,1		;GO ON IF > 17
	GOTO TP2.END	;GO HANDLE IT
	MOVLW D'23'			;LOOK FOR LD TM0 W/ SD EVENT GP2          
	CPFSGT T2CNT,1		;GO ON IF > 22
	GOTO TP2.33		;GO HANDLE IT
    MOVLW D'28'		;gp2 lsd
	CPFSGT T2CNT,1		;GO ON IF >26
	GOTO TP2.36		;GO HANDLE IT
	MOVLW D'30'		;LOOK FOR LOW SPEED ign GP 2 EVENT
	CPFSGT T2CNT,1		;GO ON IF >30
	GOTO TP2.30		;GO HANDLE IT
	RETURN				;NO ACTION T2 CNT SO EXIT
	
  ELSE				;A9 W/ EMT == 1  OPTION (EMT EJ25 W/60-2 SENSOR, tooth 11 at tdc cyl 1)

TP2.4			;T2 EVENT HANDLER FOR A CONTROLLER   EMT OPTION
	INCF T2CNT,1,1		;INC T2 COUNT  WE HAVE SYNC SO START COUNTING T2
	MOVLW D'32'		;SEPARATE TESTS INTO TWO GROUPS, LOW & HIGH
	CPFSGT T2CNT,1		;T2 <29?
	BRA T2LOW		;GO TEST LOW GP 1 - 29
	MOVLW D'34'			;LD TMR0, SET R2F (31)
	CPFSGT T2CNT,1		;GO ON IF > 31
	GOTO TP2.33		;GO HANDLE IT
	MOVLW D'38'			;LOOK FOR LSD GP 2 EVENT (WAS 36)
	CPFSGT T2CNT,1		;GO ON IF > 38
	GOTO TP2.36		;GO HANDLE IT
	MOVLW D'41'		;LOOK FOR LOW SPEED IGN GP 2 EVENT
	CPFSGT T2CNT,1		;GO ON IF > 41
	GOTO TP2.41		;GO HANDLE IT
	MOVLW D'53'			;START TP2, SET ANF
	CPFSGT T2CNT,1		;GO ON IF > 53
	GOTO TP2.STR	;GO HANDLE
;	MOVLW D'57'			;END STRF TIME?
;	CPFSGT T2CNT,1		;GO ON IF > 57
;	GOTO TP2.STRF	;GO HANDLE IT   
	MOVLW D'58'			;END T2 INTERVAL EVENT
	CPFSGT T2CNT,1		;GO ON IF > 58
	GOTO TP2.END	;GO HANDLE IT
	MOVLW D'61'			;LOOK FOR LAST T2 on A  
	CPFSEQ T2CNT,1		;HANDLE SPECIAL CASE ON B CONTROLLER
	RETURN
;	BCF STRF			;NOW DONE AT END OF MATH WHEN SETTING VT
	BTFSC CAF		;ARE WE A?
	RETURN			;WE ARE A SO IGNORE HIGH COUNTS
	MOVLW D'01'		;WE ARE B SO SET TO T2 = 1.  (EJ25/A9 W/ EMT 60-2)
	MOVWF T2CNT,1
	RETURN

T2LOW					;1 - 29
	MOVLW D'4'		;LOOK FOR LD TM0 W/ SD EVENT  
	CPFSGT T2CNT,1		;GO ON IF > 1
	GOTO TP2.3		;GO HANDLE IT
	MOVLW D'8'			;LOOK FOR LOW SPEED DWELL GP 1 EVENT
	CPFSGT T2CNT,1		;GO ON IF > 8
	GOTO TP2.6		;GO HANDLE IT
	MOVLW D'11'		;LOOK FOR LOW SPEED IGN GP 1 EVENT
	CPFSGT T2CNT,1		;GO ON IF > 11
	GOTO TP2.11		;GO HANDLE IT
 	MOVLW D'23'			;LOOK FOR START T2, SET ANF EVENT 
	CPFSGT T2CNT,1		;GO ON IF >23
	GOTO TP2.STR	;GO HANDLE IT
	MOVLW D'28'			; END T2
	CPFSGT T2CNT,1		;GO ON IF > 28
	GOTO TP2.END	;GO HANDLE IT
	RETURN				;NO ACTION T2 CNT SO EXIT
  ENDIF		;END OF EMT OPTION
			;END OF 0xA9 EVENT HANDLER

TP2.STRF
	CPFSEQ T2CNT,1
	RETURN
	BCF STRF			;KILL THE START FLAG
	RETURN

TP2.1				;RAM SPEC #
TP2.11 	 			;EMT  LOW SPEED IGN EVENT GP 1
	CPFSEQ T2CNT,1		;COMPARE THE EVENT IN WREG TO T2CNT AND EXIT IF NOT EQUAL
	RETURN			;WAS NOT EQUAL SO EXIT
;	BTFSS VT		;TEST FOR ENG TURNING >120 RPM  
;	RETURN			;  "
	BCF FC1			;FIRE COIL 1&2 ON
	BCF FC2
	RETURN

TP2.30				;RAM SPEC #
TP2.41 	 			;LOW SPEED IGN EVENT GP 2
	CPFSEQ T2CNT,1		;COMPARE THE EVENT IN WREG TO T2CNT AND EXIT IF NOT EQUAL
	RETURN			;WAS NOT EQUAL SO EXIT
;	BTFSS VT		;TEST FOR ENG TURNING >120 RPM  
;	RETURN			;  "
	BCF FC3			;FIRE COIL 3&4
	BCF FC4
	RETURN

TP2.STR	
	CPFSEQ T2CNT,1		;COMPARE THE EVENT IN WREG TO T2CNT AND EXIT IF NOT EQUAL
	RETURN		;WAS NOT EQUAL SO EXIT
	BCF T0CON,TMR0ON,0	;TURN TIMER OFF (IF IT WAS ON)  NOT NECESSARY
	CLRF TMR0H,0
	CLRF TMR0L,0
	BSF T0CON,TMR0ON,0
	BSF T2F		;JUST FOR ERROR CHECKING IN TM0
	BSF ANF
	RETURN

TP2.END		;  T2 INTERVAL TIME CAPTURE  *******
	CPFSEQ T2CNT,1		;COMPARE THE EVENT IN WREG TO T2CNT AND EXIT IF NOT EQUAL
	RETURN		;WAS NOT EQUAL SO EXIT
	BCF T0CON,TMR0ON,0		;stop timer 0 by selecting external clock
	BTFSS T2F	;VALID STR?
	RETURN
	BSF MF		;SET MATH FLAG FOR EXEC
	MOVFF TMR0L,TPL		;save timer 0 count (T2 interval)
	MOVFF TMR0H,TPH
;ACCL START
TP2.0
	BCF T2F			;KILL IT FOR TM0
	BTFSS ACCF		;IS ACCF FLAG NOT SET, GO ON
	BRA TP2.0C
	DCFSNZ ACCNT,1,1		;DECREMENT ACCELERATION CTR (GIVES 1/2 SEC OF ACCL TIME @ 2000 RPM)
	BCF ACCF		;CLR IT IF TIME UP
TP2.0C
;ACCL END

TP2.ACL											;  *********  NEW ACL START
	MOVLW HIGH DWLSPD	;GET DWELL TRANSITION SPEED DSF
	CPFSLT TPH,1		;ENG SPEED LT?
	BRA TP2.0E			;GO SET DSF  & TEST FOR LSF
	BCF DSF
	BCF LSF				;ENG RPM > DSF SPEED				
	
TP2.0D				;TEST FOR ACCELERATION 
	MOVFF TPLOLD,IARGL
	MOVFF TPHOLD,IARGH
	MOVF TPL,0,1
	SUBWF IARGL,1,1
	MOVF TPH,0,1
	SUBWFB IARGH,1,1
	BNC TP2.0X	;NEW RPM WAS < OLD SO EXIT,   IS NEW RPM > OLD?  IF CY SET, NEW TPH < OLD SO TEST FOR ACCL
	
 	TSTFSZ IARGH,1		;TEST MSB OF DELTA 
 	BRA TP2.AC1			;MSB NOT ZERO SO PROCESS
 	MOVLW D'32'		;LOW ACTHRESH 			;MSB WAS 0 SO TEST LSB CONSTANT
 	CPFSLT IARGL,1			;COMPARE LSB CONST TO LSB VAR
 	BRA TP2.AC1				;TRUE EXIT DELTA >= THRESH
TP2.0X
 	RETURN					;FALSE EXIT,  DELTA < THRESH
TP2.AC1
	MOVLW 0x1F
	ANDWF IARGL,1
   	BCF _C
   	RRCF IARGH,1,1			;DIV DELTA BY 32
   	RRCF IARGL,1,1
   	RRCF IARGH,1,1
   	RRCF IARGL,1,1
   	RRCF IARGH,1,1
   	RRCF IARGL,1,1
   	RRCF IARGH,1,1
   	RRCF IARGL,1,1
   	RRCF IARGH,1,1
   	RRCF IARGL,1,1
 	
  	MOVLW D'6'			;BUMP IT FOR EMPIRICAL VALUE 
   	ADDWF IARGL,1,1
 
   	MOVF IARGL,0,1		;GET DWL DELTA IN WREG
   	MOVF LP1DH,1,1		;TEST MSB FOR ACTIVE
   	BNZ TP2.ACA			;ACTIVE, SO GO HANDLE
   	MOVF LP1D,1,1		;TEST LPD1 FOR ACTIVE
   	BZ TP2.AC2			;GO TO NEXT DWELL IF NOT ACTIVE	
TP2.ACA
   	SUBWF LP1D,0,1		;SUB DELTA FROM COUNT
   	BNC TP2.AC1A			;IF NEGATIVE, TIME TO TURN IT ON IF NO MSB
	BTFSC STATUS,Z,0	;NOT NEGATIVE SO test for zero
	BRA TP2.AC1C		;HANDLE ZERO CASE , TEST FOR POSSIBLE MSB
   	MOVWF LP1D,1		;UPDATE LPD1
   	BRA TP2.AC2			;GO CK ROTOR 2
TP2.AC1A
	MOVF LP1DH,1,1		;TEST MSB
	BZ TP2.AC1B			;HANDLE 0 TIME OUT
	DECF LP1DH,1,1		;UPDATE MSB
	MOVWF LP1D,1			;UPDATE LSB
	BRA TP2.AC2			;NO TIMEOUT SO GO CK ROTOR 2
TP2.AC1B
   	BSF FC1				;HAD BORROW OR WAS ZERO SO TURN ON NOW
   	BSF FC2
   	CLRF LP1D
   	CLRF LP1DH
   	BRA TP2.AC2
TP2.AC1C				;ZERO LSB COUNT
	MOVF LP1DH,1,1		;TEST MSB
	BZ TP2.AC1B			;IF TOTAL COUNT = 0 THEN TIME FOR DWELL OTHERWISE GO ON WITH NEXT ROTOR
	
TP2.AC2												;TEST DWELL FOR ROTOR 2
    MOVF IARGL,0,1		;GET DWL DELTA IN WREG
   	MOVF LP2DH,1,1		;TEST MSB FOR ACTIVE
   	BNZ TP2.ACA2			;ACTIVE, SO GO HANDLE
   	MOVF LP2D,1,1		;MSB IS 0,  TEST LPD1 FOR ACTIVE
   	BZ TP2.AC3			;GO TO NEXT DWELL IF NOT ACTIVE	
TP2.ACA2
   	SUBWF LP2D,0,1		;SUB DELTA FROM COUNT
   	BNC TP2.AC1A2			;IF NEGATIVE, TIME TO TURN IT ON IF NO MSB
	BTFSC STATUS,Z,0	;NOT NEGATIVE SO test for zero
	BRA TP2.AC1C2		;HANDLE ZERO CASE , TEST FOR POSSIBLE MSB
   	MOVWF LP2D,1		;UPDATE LPD1
   	BRA TP2.AC3			;GO CK NEXT ROTOR
TP2.AC1A2
	MOVF LP2DH,1,1		;TEST MSB
	BZ TP2.AC1B2			;HANDLE 0 TIME OUT
	DECF LP2DH,1,1		;UPDATE MSB
	MOVWF LP2D,1		;UPDATE LSB
	BRA TP2.AC3			;NO TIMEOUT SO GO CK ROTOR 2
TP2.AC1B2
   	BSF FC3				;HAD BORROW OR WAS ZERO SO TURN ON NOW
   	BSF FC4
   	CLRF LP2D
   	CLRF LP2DH
   	BRA TP2.AC3			;GO CK NEXT ROTOR
TP2.AC1C2				;ZERO LSB COUNT
	MOVF LP2DH,1,1		;TEST MSB
	BZ TP2.AC1B2			;IF TOTAL COUNT = 0 THEN TIME FOR DWELL OTHERWISE GO ON WITH NEXT ROTOR  	
TP2.AC3
	BRA TP2.0X			;GO SAVE OLD TP2 FOR NEXT PASS;END OF ACL HANDLER
	
TP2.0E					;RPM WAS < DSF SPEED
	BSF DSF	
	MOVLW HIGH MAPRPMSTR		;THE LSF CONSTANT
	CPFSLT TPH,1
	BRA TP2.0F		;GO SET LSF
	BCF LSF
	BRA TP2.0D		;RPM BETWEEN LSF ANF DSF POINT.  GO TEST FOR RPM ACCELERATION
TP2.0F
	BSF LSF
	BRA TP2.0X	;GO SAVE OLD TPH FOR NEXT PASS
	
;  *********  NEW ACCL END

TP2.3				;GP 1  TMR0 LOAD @ 48 DEG BTDC
	CPFSEQ T2CNT,1		;COMPARE THE EVENT IN WREG TO T2CNT AND EXIT IF NOT EQUAL
	RETURN		;WAS NOT EQUAL SO EXIT
	MOVFF SDH,TMR0H
	MOVFF SDL,TMR0L		;LOAD TMR0 WITH SPARK DELAY
	BSF T0CON,TMR0ON,0
	BSF R1F			;SET ROTOR 2 FLAG FOR TIMER 0 INT ROUT.  (these are group selects on A9 engine)
	BCF R2F			; CLEAR THE OTHER ONe JUST TO BE SURE
;	BCF STRF			;KILL IT HERE
	RETURN

TP2.6 	 			;LOW SPEED DWELL EVENT GP 1
	CPFSEQ T2CNT,1		;COMPARE THE EVENT IN WREG TO T2CNT AND EXIT IF NOT EQUAL
	RETURN			;WAS NOT EQUAL SO EXIT
	BTFSS VT		;TEST FOR ENG TURNING >120 RPM  
	RETURN
  IF EMT== 0
	BCF STRF
  ENDIF
	BTFSS LSF		;COIL ON HERE IF LSF SET
	RETURN
	BSF FC1			;TURN COIL 1&2 ON
	BSF FC2
	RETURN

TP2.33			;TMR0 LD GP 2 @ 48 DEG BTDC  FOR CYL 3/4
	CPFSEQ T2CNT,1		;COMPARE THE EVENT IN WREG TO T2CNT AND EXIT IF NOT EQUAL
	RETURN		;WAS NOT EQUAL SO EXIT
	MOVFF SDH,TMR0H
	MOVFF SDL,TMR0L		;LOAD TMR0 WITH SPARK DELAY
	BSF T0CON,TMR0ON,0
	BSF R2F			;SET ROTOR 2 FLAG FOR TIMER 0 INT ROUT.  (these are group selects on A9 engine)
	BCF R1F			; CLEAR THE OTHER ONe JUST TO BE SURE  (WAS R3F)
	RETURN

TP2.36 	 			;LOW SPEED DWELL EVENT GP 2
	CPFSEQ T2CNT,1		;COMPARE THE EVENT IN WREG TO T2CNT AND EXIT IF NOT EQUAL
	RETURN			;WAS NOT EQUAL SO EXIT
	BTFSS VT		;TEST FOR ENG TURNING >120 RPM  
	RETURN			;  "
	BTFSS LSF		;COIL ON HERE IF LSF SET
	RETURN
	BSF FC3			;TURN COIL 1&2 ON
	BSF FC4
	RETURN
 ENDIF		;END OF NEW A9 / EJ25  VERSION 05-11-07

 IF ENG==0xAE		;0xAE EVENT HANDLER (SVX W/ STOCK 36 - 1)
TP2INT
	BCF _C				;DIVIDE TOLDL&H BY 2			;TEST FOR SYNC INTERVAL
	RRCF TOLDH,0,1		;ADD TO TOLDL&H, SAVE IN IARG
	MOVWF IARGH,1		;SAVE IT
	RRCF TOLDL,0,1		;GET LSB OF NEW/2 TO WREG
	ADDWF TOLDL,0,1		;
	MOVWF IARGL,1		;
	MOVF IARGH,0,1		;GET MSB
	ADDWFC TOLDH,0,1	;DO MSB
	MOVWF IARGH,1		;SAVE MSB
	MOVF IARGL,0,1		;GET LSB OF TOLD * 1.5	

	SUBWF SYNCL,0,1		;SUBTRACT  (OLD*1.5) FROM NEW SYNC, IF NO BORROW (CY SET) THEN WE HAVE DETECTED SYNC INTERVAL 
	MOVF IARGH,0,1		;GET  MSB
	SUBWFB SYNCH,0,1	;SUB MSB
	BTFSS _C			;TEST FOR BORROW.  IF NEW SYNC - (OLD+1/2 OLD) DOES NOT GENERATE BORROW (CY SET) THEN WE HAVE SYNC DETECT
	BRA TP2.00			;NO BORROW SO NO SYNC DET, GO ON
	BSF SYNF			;HAD BORROW SO GO SET SYNC DET (SYNF)
;	BTG ALT				;TOGGLE BANK FLAG
	CLRF T2CNT,1
TP2.00
	MOVFF SYNCL,TOLDL	; save LATEST SYNC counT IN TOLDL&H
	MOVFF SYNCH,TOLDH
	CLRF SYNCL,1		;CLEAR SYNC REG FOR NEXT CAPTURE CYCLE
	CLRF SYNCH,1
	MOVLW D'100'	;RESET DEAD TIMER ~ 30 MS
	MOVWF DTCL,1		
  
TP2.4			;T2 EVENT HANDLER  SVX  
	INCF T2CNT,1,1		;INC T2 COUNT  WE HAVE SYNC SO START COUNTING T2
TP2.4A				;ENTRY POINT FOR BACKUP CONTROLLER
	MOVLW D'12'		;SEPARATE TESTS INTO THREE GROUPS, LOW, MID & HIGH
	CPFSGT T2CNT,1		;T2 <36?
	BRA T2LOW		;GO TEST LOW GP 1 - 20
	MOVLW D'24'		;TEST FOR MID
	CPFSGT T2CNT,1
	BRA T2MID
	MOVLW D'26'		; HI - 25-35  TP2.END?LOOK FOR TP2.START
	CPFSGT T2CNT,1		;GO ON IF >
	BRA TP2.END		;GO HANDLE IT
	MOVLW D'29'		;LOOK FOR LD TM0 GP3
	CPFSGT T2CNT,1		;GO ON IF >
	BRA TP2.31		;GO HANDLE IT
	MOVLW D'32'		;LSD GP 3?
	CPFSGT T2CNT,1		;GO ON IF PAST END
	BRA TP2.32		;GO HANDLE IT
	MOVLW D'33'		;LSI GP 3?  CYL 3&4 
	CPFSGT T2CNT,1		;GO ON IF PAST END
	BRA TP2.33		;GO HANDLE IT
	MOVLW D'35'		;T2 START ?
	CPFSGT T2CNT,1
	BRA TP2.STR		;
	RETURN			;COUNT TOO HI (ignore)

T2LOW					;1 - 11 SVX
	MOVLW D'2'		;LOOK FOR T2 END
	CPFSGT T2CNT,1		;GO ON IF > 
	BRA TP2.END		;GO HANDLE IT
	MOVLW D'5'		;LD TM0 GP1
	CPFSGT T2CNT,1		;GO ON IF > 
	BRA TP2.7		;GO HANDLE IT
	MOVLW D'8'		;LSD GP1?
	CPFSGT T2CNT,1
	BRA TP2.8		;
	MOVLW D'9'		;LSI GP1?
	CPFSGT T2CNT,1
	BRA TP2.9		;
 	MOVLW D'11'		;T2 START?
	CPFSGT T2CNT,1		;GO ON IF >10
	BRA TP2.STR		;GO HANDLE IT
	RETURN

T2MID				;13- 23
	MOVLW D'14'		;LOOK FOR T2 END
	CPFSGT T2CNT,1		;GO ON IF > 
	BRA TP2.END		;GO HANDLE IT
	MOVLW D'17'		; LOOK FOR LD TM0 GP2
	CPFSGT T2CNT,1		;GO ON IF >
	BRA TP2.19		;GO HANDLE IT
	MOVLW D'20'		;LSD GP2?
	CPFSGT T2CNT,1	;GO ON IF PAST
	BRA TP2.20		;GO HANDLE IT
	MOVLW D'21'		;LSI GP2? CYL 5&6 (FC 3&4)
	CPFSGT T2CNT,1	;GO ON IF PAST 
	BRA TP2.21		;GO HANDLE IT
	MOVLW D'23'		;START T2?
	CPFSGT T2CNT,1
	BRA TP2.STR		;
	RETURN

TP2.9				;FIRE GP1 1&2  (FC 1&2)
	CPFSEQ T2CNT,1
	RETURN
	BCF FC1		;FIRE IT NOW EVEN IF LSF NOT SET
	BCF FC2
	RETURN
	
TP2.21				;FIRE GP2 CYL 5&6  (FC 3&4)
	CPFSEQ T2CNT,1
	RETURN
	BCF FC5		;FIRE IT NOW EVEN IF LSF NOT SET
	BCF FC6
	RETURN
	
TP2.33				;FIRE GP3 CYL 3&4 (FC5&6)
	CPFSEQ T2CNT,1
	RETURN
	BCF FC3		;FIRE IT NOW EVEN IF LSF NOT SET
	BCF FC4
	RETURN
	
TP2.8			;LSF DWELL  GP1
	CPFSEQ T2CNT,1	;COMPARE THE EVENT IN WREG TO T2CNT AND EXIT IF NOT EQUAL
	RETURN		;WAS NOT EQUAL SO EXIT
	BTFSS VT     ;VRPM	;TEST FOR VALID TIMING  
	RETURN		;  "
	BTFSC LSF		;TEST FOR LOW SPEED DWELL FLAG 
	BRA TP2.8A
	BTFSS DDF
	RETURN
TP2.8A
	BCF DDF
	BSF FC1			;TURN ON GP 1 COILS
	BSF FC2
	RETURN

TP2.20			;LSF GP2
	CPFSEQ T2CNT,1	;COMPARE THE EVENT IN WREG TO T2CNT AND EXIT IF NOT EQUAL
	RETURN		;WAS NOT EQUAL SO EXIT
	BTFSS VT     ;VRPM	;TEST FOR VALID TIMING  
	RETURN
	BTFSC LSF		;TEST FOR LOW SPEED DWELL FLAG 
	BRA TP2.20A
	BTFSS DDF
	RETURN
TP2.20A
	BCF DDF
	BSF FC5			;GP 2 COILS ON
	BSF FC6
	RETURN			

TP2.32			;LSF GP3
	CPFSEQ T2CNT,1	;COMPARE THE EVENT IN WREG TO T2CNT AND EXIT IF NOT EQUAL
	RETURN		;WAS NOT EQUAL SO EXIT
	BTFSS VT     ;VRPM	;TEST FOR VALID TIMING  
	RETURN		;  "
	BCF STRF	;KILL STRF
	BTFSC LSF		;TEST FOR LOW SPEED DWELL FLAG 
	BRA TP2.32A
	BTFSS DDF
	RETURN
TP2.32A
	BCF DDF
	BSF FC3			;GP 3 COILS ON
	BSF FC4
	RETURN

TP2.STR
	CPFSEQ T2CNT,1		;COMPARE THE EVENT IN WREG TO T2CNT AND EXIT IF NOT EQUAL
	RETURN		;WAS NOT EQUAL SO EXIT
	CLRF TMR0H,0
	CLRF TMR0L,0
	BSF T0CON,TMR0ON,0
	BSF T2F		;JUST FOR ERROR CHECKING IN TM0
	BSF ANF
	RETURN
	
TP2.END			;TP2 END
			;  T2 INTERVAL TIME CAPTURE RENESIS CAS 20B  *******
	CPFSEQ T2CNT,1		;COMPARE THE EVENT IN WREG TO T2CNT AND EXIT IF NOT EQUAL
	RETURN			;WAS NOT EQUAL SO EXIT
	BCF T0CON,TMR0ON,0		;stop timer 0
	BTFSS T2F	;TEST FOR IT
	RETURN		;EXIT IF NOT
	BCF T2F
	MOVFF TMR0L,TPL		;save timer 0 count (T2 interval)  READ lsb first,  (write msb first)
	MOVFF TMR0H,TPH
	BSF MF		;SET MATH FLAG FOR EXEC
		
;ACCL START
TP2.END2
	BTFSS ACCF		;IS ACCF FLAG NOT SET, GO ON  
	BRA TP2.END3
	DCFSNZ ACCNT,1,1		;DECREMENT ACCELERATION CTR (GIVES 1/2 SEC OF ACCL TIME @ 2000 RPM)
	BCF ACCF		;CLR IT IF TIME UP
TP2.END3
;ACCL END

;NEW TRIMAP ADDITION FOR DWELL SPEEDUP PROBLEM
	MOVLW HIGH DWLSPD	;GET DWELL TRANSITION SPEED DSF  ~1100
	CPFSLT TPH,1		;ENG SPEED LT?
	
	BRA TP2.0E			;GO SET DSF  & TEST FOR LSF
	BCF DSF
	BTFSC LSF
	BSF DDF
	BCF LSF				;ENG RPM > DSF SPEED	
				
TP2.0D				;TEST FOR ACCELERATION
	MOVFF TPLOLD,IARGL
	MOVFF TPHOLD,IARGH
	MOVF TPL,0,1
	SUBWF IARGL,1,1
	MOVF TPH,0,1
	SUBWFB IARGH,1,1
	BTFSS _C			;IS NEW RPM > OLD?  IF CY SET, NEW TPH < OLD SO TEST FOR ACCL
	BRA TP2.0X			;NO ACCL SO EXIT
	
 	MOVLW 0	;HIGH ACTHRESH	;TEST FOR RPM  > START OF MAP ADV RPM THRESHOLDMSB CONST	< CONSTANT
 	CPFSLT IARGH,1		;COMPARE DELTA TO THRESH
 	BRA	TP2.CEQ				;MSB NOT LT SO CK FOR EQ
 	BRA TP2.0X			;FALSE EXIT, DELTA < THRESH
TP2.CEQ 	
 	CPFSEQ IARGH,1		;COMP VAR MSB FOR = CONST MSB
 	BRA TP2.AC1  		;TRUE EXIT, DELTA IS > THRESHVAR !LT CONST   .VB
 	MOVLW D'32'		;LOW ACTHRESH 			;MSB WAS = SO TEST LSB CONSTANT
 	CPFSLT IARGL,1			;COMPARE LSB CONST TO LSB VAR
 	BRA TP2.AC1				;TRUE EXIT DELTA >= THRESH
TP2.0X
 	RETURN					;FALSE EXIT,  DELTA < THRESH
TP2.AC1
	MOVLW 0x1F
	ANDWF IARGL,1
   	BCF _C
   	RRCF IARGH,1,1			;DIV DELTA BY 32
   	RRCF IARGL,1,1
   	RRCF IARGH,1,1
   	RRCF IARGL,1,1
   	RRCF IARGH,1,1
   	RRCF IARGL,1,1
   	RRCF IARGH,1,1
   	RRCF IARGL,1,1
   	RRCF IARGH,1,1
   	RRCF IARGL,1,1
 
  	MOVLW D'6'			;BUMP IT FOR EMPIRICAL VALUE  (THIS IS ABOUT 2 MS
   	ADDWF IARGL,1,1
   	
   	MOVF IARGL,0,1		;GET DWL DELTA IN WREG
   	MOVF LP1D,1,1		;TEST LPD1 FOR ACTIVE
   	BZ TP2.AC2			;GO TO NEXT DWELL IF NOT ACTIVE	
   	SUBWF LP1D,0,1		;SUB DELTA FROM COUNT
   	BC TP2.AC3				;IF NO BORROW GO ON
TP2.AC1A
	BSF FC1				;HAD BORROW OR WAS ZERO SO TURN GP1 ON NOW
	BSF FC2
   	CLRF LP1D			;SET INACTIVE
   	BRA TP2.AC2
TP2.AC3
	BTFSC STATUS,Z,0	;test for zero
	BRA TP2.AC1A		;HANDLE ZERO CASE   	
   	MOVWF LP1D,1		;UPDATE LPD1
TP2.AC2					;TEST LPD2
   	
   	MOVF IARGL,0,1		;GET DWL DELTA IN WREG
   	MOVF LP2D,1,1		;TEST LPD1 FOR ACTIVE
   	BZ TP2.AC22			;GO TO NEXT DWELL IF NOT ACTIVE	
   	SUBWF LP2D,0,1		;SUB DELTA FROM COUNT
   	BC TP2.AC32				;IF NO BORROW GO ON
TP2.AC1A2
   	BSF FC5				;HAD BORROW OR WAS ZERO SO TURN ON GP2 NOW
   	BSF FC6
   	CLRF LP2D			;SET INACTIVE
   	BRA TP2.AC22
TP2.AC32
	BTFSC STATUS,Z,0	;test for zero
	BRA TP2.AC1A2		;HANDLE ZERO CASE   	
   	MOVWF LP2D,1		;UPDATE LPD1
TP2.AC22					;TEST LPD2
   	
   	MOVF IARGL,0,1		;GET DWL DELTA IN WREG
   	MOVF LP3D,1,1		;TEST LPD1 FOR ACTIVE
   	BZ TP2.AC23			;GO TO NEXT DWELL IF NOT ACTIVE	
   	SUBWF LP3D,0,1		;SUB DELTA FROM COUNT
   	BC TP2.AC33				;IF NO BORROW GO ON
TP2.AC1A3
   	BSF FC3				;HAD BORROW OR WAS ZERO SO TURN ON GP 3 NOW
   	BSF FC4
   	CLRF LP3D			;SET INACTIVE
   	BRA TP2.AC23
TP2.AC33
	BTFSC STATUS,Z,0	;test for zero
	BRA TP2.AC1A3		;HANDLE ZERO CASE   	
   	MOVWF LP3D,1		;UPDATE LPD1
TP2.AC23					;TEST LPD2
	RETURN									;END OF ACCELERATION HANDLER
	
TP2.0E
	BSF DSF
	MOVLW HIGH MAPRPMSTR		;THE LSF CONSTANT
	CPFSLT TPH,1
	BRA TP2.0F		;GO SET LSF
	BTFSC LSF		;TEST FOR DWELL DROP
	BSF DDF
	BCF LSF
	BRA TP2.0D		;RPM BETWEEN LSF ANF DSF POINT.  GO TEST FOR RPM ACCELERATION
TP2.0F
	BSF LSF
	RETURN			;hardware dwell takes care of it below lsf

TP2.7	;LD TM0 W/ SPARK DELAY
	CPFSEQ T2CNT,1
	RETURN
	BTFSS VT		;DON'T TURN ON COIL HERE UNLESS LSF SET
	RETURN
	MOVFF SDH,TMR0H
	MOVFF SDL,TMR0L		;LOAD TMR0 WITH SPARK DELAY
	BSF T0CON,TMR0ON,0
	BSF R1F
	BCF R2F
	BCF R3F
	RETURN
	
TP2.19	;LD TM0 W/ SPARK DELAY
	CPFSEQ T2CNT,1
	RETURN
	BTFSS VT		;DON'T TURN ON COIL HERE UNLESS LSF SET
	RETURN
	MOVFF SDH,TMR0H
	MOVFF SDL,TMR0L		;LOAD TMR0 WITH SPARK DELAY
	BSF T0CON,TMR0ON,0
	BCF R1F
	BSF R2F
	BCF R3F
	RETURN	
	
TP2.31	;LD TM0 W/ SPARK DELAY
	CPFSEQ T2CNT,1
	RETURN
	BTFSS VT		;DON'T TURN ON COIL HERE UNLESS LSF SET
	RETURN
	MOVFF SDH,TMR0H
	MOVFF SDL,TMR0L		;LOAD TMR0 WITH SPARK DELAY
	BSF T0CON,TMR0ON,0
	BCF R1F
	BCF R2F
	BSF R3F
	RETURN
 ENDIF			;END OF SVX EVENT LIST & HANDLERS
 
;CORVAIR TP2
 IF (ENG==0xB2);
TP2INT
	BCF _C			;DIVIDE SYNCL&H BY 2;TEST FOR SYNC INTERVAL
	RRCF SYNCH,0,1		; 
	MOVWF IARGH,1	;SAVE IT
	RRCF SYNCL,0,1		;GET LSB OF NEW/2 TO WREG
	SUBWF TOLDL,0,1		;SUB LSB
	MOVF IARGH,0,1		;GET NEW T2 MSB/2
	SUBWFB TOLDH,0,1		;SUB MSB
	BTFSC _C		;TEST FOR BORROW  IF NEW/2 >TOLD THEN WE HAVE SYNC DETECT
	BRA TP2.00		;NO BORROW SO NO SYNC DET, GO ON
	BSF SYNF		;HAD BORROW SO GO SET SYNC DET (SYNF)
  IF TBINJ==1 		;  TBINJ SYNC HANDLER - SYNCHRONIZE INJECTION CYCLES TO TDC COMPRESSION ON CYL #1
  	CLRF T2CNT,1	;CLEAR T2 COUNT
  	BTFSS CAF		;TEST FOR A CONTROLLER
  	BRA TP2.B1
	BCF ALT
	BRA TP2.00		;GO ON, controller A handler on 1st pulse after sync gap
TP2.B1
	BSF ALT			;B IS ON OPPOSITE PHASE
	;FALLS THROUGH TO TP2.00
  ENDIF				;END OF TBI TYPR SYNC HANDLER
  IF TBINJ==0		;
	BTFSS CAF		;ARE WE A?
	BRA TP2.B1		;GO TO B ROUT IF NOT
	CLRF T2CNT,1		;WE ARE A SO CLR T2CNT
	BRA TP2.00		;CONTINUE
TP2.B1			;B CONTROLLER ROUT
	BTFSS BUSIN		(WAS)   IF BUSENSOR==1
	BRA TP2.B1A
	MOVLW D'30'		;BACKUP SENSOR ON CORVAIR IS 180 DEGREES OUT
	MOVWF T2CNT,1
	BRA TP2.00
TP2.B1A 					;(WAS)  ELSE				;WE ARE B BUT THERE IS NO BACKUP SENSOR (BOTH A&B USE INT0)
	CLRF T2CNT,1		;SET T2CNT TO 0
 						;(WAS)  ENDIF
  ENDIF				;END OF NON TBI TYPE 
TP2.00
	MOVFF SYNCL,TOLDL	; save LATEST SYNC counT IN TOLDL&H
	MOVFF SYNCH,TOLDH
	CLRF SYNCL,1		;CLEAR SYNC REG FOR NEXT CAPTURE CYCLE
	CLRF SYNCH,1
	MOVLW D'35'		;LOAD DEAD TIME CTR (38.25 ms)   25.2 MS IS T2 SYNC GAP @ 120 RPM PSV  *********
	MOVWF DTCL,1
	BTFSS SYNF		; DO WE HAVE SYNC?    04-27-02  PSV ****  WAS T1F NOW SYNF
	RETURN			;EXIT IF NOT

;0xB2 ENGINE EVENT LIST  
  
TP2.4			;T2 EVENT HANDLER FOR A & B CONTROLLER
	INCF T2CNT,1,1		;INC T2 COUNT  WE HAVE SYNC SO START COUNTING T2
	MOVLW D'29'		;SEPARATE TESTS INTO TWO GROUPS, LOW & HIGH
	CPFSGT T2CNT,1		;T2 <29?
	BRA T2LOW		;GO TEST LOW GP 1 - 29
	MOVLW D'32'		;LOOK FOR LD TM0 W/ SD EVENT (gp 3, cyl 5&6) 
	CPFSGT T2CNT,1
	GOTO TP2.32		;GO HANDLE IT
	MOVLW D'35'		;LOOK FOR GP3 LOW SPEED DWELL EVENT        
	CPFSGT T2CNT,1
	GOTO TP2.35		;GO HANDLE IT
	MOVLW D'41'		;LOOK FOR START T2 INTERVAL EVENT
	CPFSGT T2CNT,1
	GOTO TP2.STR		;GO HANDLE IT
	MOVLW D'46'		;LOOK FOR END T2 INTERVAL EVENT (40)
	CPFSGT T2CNT,1		;GO ON IF > 55
	GOTO TP2.END		;GO HANDLE IT
	MOVLW D'52'		;LOOK FOR LD TM0 W/ SD EVENT (gp 1, cyl 1&2) 
	CPFSGT T2CNT,1					
	GOTO TP2.52		;GO HANDLE IT	
	MOVLW D'55'		;LOOK FOR GP1 LOW SPEED DWELL EVENT 
	CPFSGT T2CNT,1		;GO ON IF > 58					
	GOTO TP2.55		;GO HANDLE IT
;	MOVLW D'58'		;LOOK FOR CLR STRF EVENT
;	CPFSGT T2CNT,1				
;	GOTO TP2.58		;GO HANDLE IT
  IF TBINJ==0
	MOVLW D'61'		;LOOK FOR LAST T2 on B
	CPFSEQ T2CNT,1		;HANDLE SPECIAL CASE ON B CONTROLLER
	RETURN
	BTFSC CAF		;ARE WE A?
	RETURN			;WE ARE A SO IGNORE HIGH COUNTS
	MOVLW D'01'		;WE ARE B SO SET TO T2 = 1 AND EXECUTE THAT ROUTINE.
	MOVWF T2CNT,1
	BRA TP2.STR		;START T2 INTERVAL EVENT
  ENDIF
  IF TBINJ==1		;TBI VERSION HAS A 120-2 TOOTH SENSOR ON DISTRIBUTOR
  	MOVLW D'60'		;LOOK FOR PSEUDO GAP COUNT
	CPFSEQ T2CNT,1		;HANDLE SPECIAL CASE ON B CONTROLLER
	RETURN
	CLRF T2CNT,1	;SIMULATE A SYNC GAP RESET OF T2CNT AT 180 DEG (360 CRANK DEGREES) ON 120-2 TOOTH CAM SENSOR
	BTG ALT			;TIME TO TOGGLE ALT ON TBI ENGINES
	RETURN
  ENDIF
	
	
T2LOW					;5 - 29
	MOVLW 0x01		;LOOK FOR START T2 INTERVAL EVENT
	CPFSGT T2CNT,1		;GO ON IF > 1
	BRA TP2.STR			;START T2 INTERVAL EVENT
	MOVLW 0x06		;LOOK FOR END T2 INTERVAL EVENT (10)
	CPFSGT T2CNT,1
	GOTO TP2.END		;END T2 INTERVAL EVENT
 	MOVLW D'12'		;LOOK FOR LD TMRO W/SD EVENT  (GP2)
	CPFSGT T2CNT,1
	GOTO TP2.12		;GO HANDLE IT
	MOVLW D'15'		;LOOK FOR GP2 LOW SPEED DWELL EVENT 
	CPFSGT T2CNT,1
	GOTO TP2.15		;GO HANDLE IT
;	MOVLW D'18'		;LOOK FOR GP2 LOW SPEED IGN EVENT
;	CPFSGT T2CNT,1				
;	GOTO TP2.18		;GO HANDLE IT
	MOVLW D'21'		; LOOK FOR START T2 INTERVAL
	CPFSGT T2CNT,1					
	GOTO TP2.STR		;GO HANDLE IT
	MOVLW D'26'		;LOOK FOR END T2 INTERVAL 
	CPFSGT T2CNT,1				
	BRA TP2.END		;END T2 INTERVAL
	RETURN				;NO ACTION T2 CNT SO EXIT
 				;END OF 0xB2 EVENT HANDLER

TP2.STR		;START TP2 30 DEGREE TIMING INTERVAL	
	CPFSEQ T2CNT,1		;COMPARE THE EVENT IN WREG TO T2CNT AND EXIT IF NOT EQUAL
	RETURN		;WAS NOT EQUAL SO EXIT
	BCF T0CON,TMR0ON,0	;TURN TIMER OFF (IF IT WAS ON)  NOT NECESSARY
	CLRF TMR0H,0
	CLRF TMR0L,0
	BSF T0CON,TMR0ON,0
	BSF T2F		;JUST FOR ERROR CHECKING IN TM0
	BSF ANF		;KICK OFF ANALOG CYCLE WHILE ALL IS QUIET!  **** GOOD IDEA!
	RETURN

TP2.END		;  T2 INTERVAL TIME CAPTURE  *******
	CPFSEQ T2CNT,1		;COMPARE THE EVENT IN WREG TO T2CNT AND EXIT IF NOT EQUAL
	RETURN		;WAS NOT EQUAL SO EXIT
	BCF T0CON,TMR0ON,0		;stop timer 0 by selecting external clock
	BTFSS T2F	;TEST FOR IT
	RETURN		;EXIT IF NOT
	BCF T2F
	BSF MF		;SET MATH FLAG FOR EXEC
	MOVFF TMR0L,TPL		;save timer 0 count (T2 interval)
	MOVFF TMR0H,TPH

;ACCL START
TP2.0
	BTFSS ACCF		;IS ACCF FLAG NOT SET, GO ON
	BRA TP2.0C
	DCFSNZ ACCNT,1,1		;DECREMENT ACCELERATION CTR (GIVES 1/2 SEC OF ACCL TIME @ 2000 RPM)
	BCF ACCF		;CLR IT IF TIME UP
TP2.0C
;ACCL END
;NEW TRIMAP ADDITION FOR DWELL SPEEDUP PROBLEM
	MOVLW HIGH DWLSPD	;GET DWELL TRANSITION SPEED DSF  ~1100
	CPFSLT TPH,1		;ENG SPEED LT?
	BRA TP2.0E			;GO SET DSF  & TEST FOR LSF
	BCF DSF
	BCF LSF				;ENG RPM > DSF SPEED				
TP2.0D				;TEST FOR ACCELERATION
	MOVFF TPLOLD,IARGL
	MOVFF TPHOLD,IARGH
	MOVF TPL,0,1
	SUBWF IARGL,1,1
	MOVF TPH,0,1
	SUBWFB IARGH,1,1
	BTFSS _C			;IS NEW RPM > OLD?  IF CY SET, NEW TPH < OLD SO TEST FOR ACCL
	BRA TP2.0X			;NO ACCL SO EXIT
	
 	MOVLW 0	;HIGH ACTHRESH	;TEST FOR RPM  > START OF MAP ADV RPM THRESHOLDMSB CONST	< CONSTANT
 	CPFSLT IARGH,1		;COMPARE DELTA TO THRESH
 	BRA	TP2.CEQ				;MSB NOT LT SO CK FOR EQ
 	BRA TP2.0X			;FALSE EXIT, DELTA < THRESH
TP2.CEQ 	
 	CPFSEQ IARGH,1		;COMP VAR MSB FOR = CONST MSB
 	BRA TP2.AC1  		;TRUE EXIT, DELTA IS > THRESHVAR !LT CONST   .VB
 	MOVLW D'32'		;LOW ACTHRESH 			;MSB WAS = SO TEST LSB CONSTANT
 	CPFSLT IARGL,1			;COMPARE LSB CONST TO LSB VAR
 	BRA TP2.AC1				;TRUE EXIT DELTA >= THRESH
TP2.0X
 	RETURN					;FALSE EXIT,  DELTA < THRESH
TP2.AC1
	MOVLW 0x1F
	ANDWF IARGL,1
   	BCF _C
   	RRCF IARGH,1,1			;DIV DELTA BY 32
   	RRCF IARGL,1,1
   	RRCF IARGH,1,1
   	RRCF IARGL,1,1
   	RRCF IARGH,1,1
   	RRCF IARGL,1,1
   	RRCF IARGH,1,1
   	RRCF IARGL,1,1
   	RRCF IARGH,1,1
   	RRCF IARGL,1,1
 
  	MOVLW D'6'			;BUMP IT FOR EMPIRICAL VALUE  (THIS IS ABOUT 2 MS
   	ADDWF IARGL,1,1
   	
   	MOVF IARGL,0,1		;GET DWL DELTA IN WREG
   	MOVF LP1D,1,1		;TEST LPD1 FOR ACTIVE
   	BZ TP2.AC2			;GO TO NEXT DWELL IF NOT ACTIVE	
   	SUBWF LP1D,0,1		;SUB DELTA FROM COUNT
   	BC TP2.AC3				;IF NO BORROW GO ON
TP2.AC1A
   	BSF FC1				;HAD BORROW OR WAS ZERO SO TURN ON NOW
   	CLRF LP1D			;SET INACTIVE
   	BRA TP2.AC2
TP2.AC3
	BTFSC STATUS,Z,0	;test for zero
	BRA TP2.AC1A		;HANDLE ZERO CASE   	
   	MOVWF LP1D,1		;UPDATE LPD1
TP2.AC2					;TEST LPD2
   	
   	MOVF IARGL,0,1		;GET DWL DELTA IN WREG
   	MOVF LP2D,1,1		;TEST LPD1 FOR ACTIVE
   	BZ TP2.AC22			;GO TO NEXT DWELL IF NOT ACTIVE	
   	SUBWF LP2D,0,1		;SUB DELTA FROM COUNT
   	BC TP2.AC32				;IF NO BORROW GO ON
TP2.AC1A2
   	BSF FC2				;HAD BORROW OR WAS ZERO SO TURN ON NOW
   	CLRF LP2D			;SET INACTIVE
   	BRA TP2.AC22
TP2.AC32
	BTFSC STATUS,Z,0	;test for zero
	BRA TP2.AC1A2		;HANDLE ZERO CASE   	
   	MOVWF LP2D,1		;UPDATE LPD1
TP2.AC22					;TEST LPD2
   	
   	MOVF IARGL,0,1		;GET DWL DELTA IN WREG
   	MOVF LP3D,1,1		;TEST LPD1 FOR ACTIVE
   	BZ TP2.AC23			;GO TO NEXT DWELL IF NOT ACTIVE	
   	SUBWF LP3D,0,1		;SUB DELTA FROM COUNT
   	BC TP2.AC33				;IF NO BORROW GO ON
TP2.AC1A3
   	BSF FC3				;HAD BORROW OR WAS ZERO SO TURN ON NOW
   	CLRF LP3D			;SET INACTIVE
   	BRA TP2.AC23
TP2.AC33
	BTFSC STATUS,Z,0	;test for zero
	BRA TP2.AC1A3		;HANDLE ZERO CASE   	
   	MOVWF LP3D,1		;UPDATE LPD1
TP2.AC23					;TEST LPD2
	RETURN									;END OF ACCELERATION HANDLER
	
TP2.0E
	BSF DSF
	MOVLW HIGH MAPRPMSTR		;THE LSF CONSTANT
	CPFSLT TPH,1
	BRA TP2.0F		;GO SET LSF
	BCF LSF
	BRA TP2.0D		;RPM BETWEEN LSF ANF DSF POINT.  GO TEST FOR RPM ACCELERATION
TP2.0F
	BSF LSF
	RETURN			;hardware dwell takes care of it below lsf

TP2.12				;LD TMR0, GP2, SET R2F
	CPFSEQ T2CNT,1		;COMPARE THE EVENT IN WREG TO T2CNT AND EXIT IF NOT EQUAL
	RETURN		;WAS NOT EQUAL SO EXIT
	BSF R2F			;SET R2 FLAG FOR TIMER 0 INT ROUT.  (these are group selects on B2 engine)
	MOVFF SDH,TMR0H
	MOVFF SDL,TMR0L		;LOAD TMR0 WITH SPARK DELAY
	BSF T0CON,TMR0ON,0
	BCF R1F			; CLEAR THE OTHER ONe JUST TO BE SURE
	BCF R3F
;	BCF STRF			;KILL IT HERE
	RETURN

TP2.15  			;LOW SPEED DWELL EVENT : GP2
	CPFSEQ T2CNT,1		;COMPARE THE EVENT IN WREG TO T2CNT AND EXIT IF NOT EQUAL
	RETURN			;WAS NOT EQUAL SO EXIT
	BTFSS VT		;TEST FOR ENG TURNING >120 RPM  
	RETURN			;  "
	BTFSS DSF		;TEST FOR LOW SPEED DWELL FLAG (rpm < dsf point)
	RETURN
	BSF FC2			;TURN GP2 COILS ON
	RETURN

TP2.32				;LD TMR0, GP3, SET R3F
	CPFSEQ T2CNT,1		;COMPARE THE EVENT IN WREG TO T2CNT AND EXIT IF NOT EQUAL
	RETURN		;WAS NOT EQUAL SO EXIT
	BSF R3F			;SET R2 FLAG FOR TIMER 0 INT ROUT.  (these are group selects on B2 engine)
	MOVFF SDH,TMR0H
	MOVFF SDL,TMR0L		;LOAD TMR0 WITH SPARK DELAY
	BSF T0CON,TMR0ON,0
	BCF R1F			; CLEAR THE OTHER ONe JUST TO BE SURE
	BCF R2F
	RETURN

TP2.35  			;LOW SPEED DWELL EVENT : GP3
	CPFSEQ T2CNT,1		;COMPARE THE EVENT IN WREG TO T2CNT AND EXIT IF NOT EQUAL
	RETURN			;WAS NOT EQUAL SO EXIT
	BTFSS VT		;TEST FOR ENG TURNING >120 RPM  
	RETURN			;  "
	BTFSS DSF		;TEST FOR LOW SPEED DWELL FLAG (rpm < dsf point)
	RETURN
	BSF FC3			;TURN GP3 COILS ON
	RETURN

TP2.52				;LD TMR0, GP1, SET R1F
	CPFSEQ T2CNT,1		;COMPARE THE EVENT IN WREG TO T2CNT AND EXIT IF NOT EQUAL
	RETURN		;WAS NOT EQUAL SO EXIT
	BSF R1F			;SET R2 FLAG FOR TIMER 0 INT ROUT.  (these are group selects on B2 engine)
	MOVFF SDH,TMR0H
	MOVFF SDL,TMR0L		;LOAD TMR0 WITH SPARK DELAY
	BSF T0CON,TMR0ON,0
	BCF R2F			; CLEAR THE OTHER ONe JUST TO BE SURE
	BCF R3F
	BCF STRF			;KILL IT HERE
	RETURN

TP2.55  			;LOW SPEED DWELL EVENT : GP1
	CPFSEQ T2CNT,1		;COMPARE THE EVENT IN WREG TO T2CNT AND EXIT IF NOT EQUAL
	RETURN			;WAS NOT EQUAL SO EXIT
	BTFSS VT		;TEST FOR ENG TURNING >120 RPM  
	RETURN			; 
	BTFSS DSF		;TEST FOR LOW SPEED DWELL FLAG (rpm < dsf point)
	RETURN
	BSF FC1			;TURN GP1 COILS ON
	RETURN	
	
 ENDIF    ;END OF 0xB2;END OF CORVAIR

 IF (ENG==0xA8)||(ENG==0xAD)  ;tp2int rx8  RENESIS RX-8  (Note that R1 & R2 are inverted in the comments due to the Mazda documentation errors.
TP2INT
	BTFSS S2CK		;WAS LAST T2 A SYNC1 INTERVAL?
	BRA TP2.A		;GO TEST FOR SYNC1 IF NOT
	BCF S2CK		;CLEAR THE CK FOR 2ND SYNC FLAG
	BCF _C		;CK FOR 2ND SYNC INTERVAL BY SUBTRACTING SYNCH&L*2 FROM TOLDH&L (20 0R 60 DEG FROM 30)
	RLCF SYNCL,0,1		;IF NO BORROR, THEN THIS IS A SECOND SYNC
	MOVWF IARGL,1	;SAVE IT
	RLCF SYNCH,0,1
	MOVWF IARGH,1
	MOVF IARGL,0,1
	SUBWF TOLDL,1,1
	MOVF IARGH,0,1
	SUBWFB TOLDH,1,1
	BTFSC _C		;IF BORROW (NO CY)THEN THIS IS 2ND SYNC
	BRA TP2.00		;DO NORMAL TP2 HANDLE
	BSF SYNF		;SET ENGINE SYNC FOUND FLAG
	CLRF T2CNT,1	;CLR T2 COUNT (WILL BE INCREMENTED TO 1 DOWNSTREAM)
	BRA TP2.00		;GO HANDLE T2 EVENT
TP2.A			;TEST FOR SYNC1 INTERVAL  BY SUBTRACTING NEW/2 FROM OLD.A BORROW (CY CLR) INDICATES THAT NEW IS WAY BIGGER (SYNC)
	BCF _C			;DIVIDE SYNCL&H BY 2  (DIVIDE CURRENT SYNC COUNT BY 2)
	RRCF SYNCH,0,1		; 
	MOVWF IARGH,1	;SAVE IT
	RRCF SYNCL,0,1		;GET LSB OF NEW/2 TO WREG
	SUBWF TOLDL,0,1		;SUB LSB
	MOVF IARGH,0,1	;GET NEW SYNC/2 MSB
	SUBWFB TOLDH,0,1		;SUB OLD MSB  
	BTFSC _C		;TEST FOR BORROW (CY CLR) IF NEW/2 >TOLD THEN WE HAVE 1ST SYNC INTERVAL AFTER A 10 DEG COUNT
	BRA TP2.00		;NO BORROW SO NO SYNC 1 DET,SO GO CHECK FOR SYNC 2
	BSF SYNF1		;HAD BORROW SO GO SET SYNC 1 DET FLAG (TELL LATER ROUT THAT THIS IS A LOAD TMR0 EVENT) 
	BSF S2CK		;SET CHECK FOR SYNC 2 ON NEXT TP2 EVENT (SECOND 30 DEG INTERVAL)		
TP2.00
	MOVFF SYNCL,TOLDL	; save LATEST SYNC counT IN TOLDL&H
	MOVFF SYNCH,TOLDH
	CLRF SYNCL,1		;CLEAR SYNC REG FOR NEXT CAPTURE CYCLE
	CLRF SYNCH,1
TP2.01		
	MOVLW D'57'		;LOAD DEAD TIME CTR (50 ms)   42 MS IS SYNC GAP @ 120 RPM (RENESIS)  *********
	MOVWF DTCL,1
	BTFSS SYNF		; DO WE HAVE SYNC?    04-27-02   SYNF ONLY CLR BY DTC TIMEOUT
	RETURN			;EXIT IF NOT
   IF BUSENSOR ==1	
	BTFSS BUSIN		;(WAS)  IF BUSENSOR==1
	BRA TP2.L		
	BTFSS CAF		;ARE WE A?    have decided not to implement an offset sensor.  Backup will be on same axix as A 2-4-04
	GOTO TP2.4B		;NO SO GO TO B CONTROLLER T2 EVENT HANDLER (POSITION OF BACKUP SENSOR 115 DEG BEFORE PRIMARY)!!!!!!!!
;					;(WAS)  ENDIF
   ENDIF
           ;(ALL HANDLER LIST & HANDLERS FOR 0xA8 & AD GOES HERE)

TP2.L			;T2 EVENT HANDLER FOR A CONTROLLER  VT SHOULD BE OK IF WE GOT HERE
	INCF T2CNT,1,1		;INC T2 COUNT  WE HAVE SYNC SO START COUNTING T2  (last t2 pulse of sync2 interval is called t2 #1)
  IF ENG==0xA8
    BTFSS BUSIN		;DO WE HAVE A BACKUP SENSOR?
    BRA TP2.L1		;GO HANDLE A CONTROLLER.
    BTFSS CAF		;WE BAVE A BACKUP BUT ARE WE B?
    BRA TP2.4B		;HANDLE BACKUP CONTROLLER WITH BU SENSOR TIMING
TP2.L1 
	BTFSC SYNF1		;IS THIS A LOAD TIMER0
	BRA TP2.1430		;YES, SO GO LOAD TMR0, ACL CK, TEST FOR DSF DWELL    14 & 30 HANDLED DISCRETELY ON G13bb
  ENDIF
			;T2 EVENT HANDLER
  IF ENG==0xA8
  	MOVLW D'1'		;LSF DWELL
  	CPFSGT T2CNT,1
  	BRA TP2.1
  	MOVLW D'2'		;LSF IGN R2
  	CPFSGT T2CNT,1
  	BRA TP2.2
 	MOVLW D'10'		;LOOK FOR START T2 INTERVAL EVENT 5  (was 5 changed 08-10-06)
	CPFSGT T2CNT,1		;GO ON IF >10
	BRA TP2.STR		;GO HANDLE IT
	MOVLW D'13'		;LOOK FOR END T2 INTERVAL EVENT  (WAS 21 changed 08-10-06)
	CPFSGT T2CNT,1		;GO ON IF > 13
	BRA TP2.END		;GO HANDLE IT
	MOVLW D'17'		;LSF DWELL
  	CPFSGT T2CNT,1
  	BRA TP2.17
  	MOVLW D'18'		;LSF IGN R1
  	CPFSGT T2CNT,1
  	BRA TP2.18
	MOVLW D'26'		;LOOK FOR START T2 INTERVAL EVENT 5  (was 5 changed 08-10-06)
	CPFSGT T2CNT,1		;GO ON IF >26
	BRA TP2.STR		;GO HANDLE IT
	MOVLW D'29'		;LOOK FOR END T2 INTERVAL EVENT  (WAS 21 changed 08-10-06)
	CPFSGT T2CNT,1		;GO ON IF > 29
	BRA TP2.END		;GO HANDLE IT	
	RETURN		;NO ACTION T2 CNT SO EXIT

				;T2 EVENT HANDLER FOR B CONTROLLER  (FOR BACKUP SENSOR @ 115 DEG BEFORE PRIMARY)
TP2.4B			;T2 EVENT HANDLER FOR B CONTROLLER  VT SHOULD BE OK IF WE GOT HERE
		
			;T2 EVENT HANDLER
	MOVLW D'3'		;LOOK FOR START T2 INTERVAL EVENT 
	CPFSGT T2CNT,1		;GO ON IF > 3
	BRA TP2.STR		;GO HANDLE IT  
 	MOVLW D'6'		;LOOK FOR END T2 INTERVAL EVENT 5  
	CPFSGT T2CNT,1		;GO ON IF >6
	BRA TP2.END		;GO HANDLE IT
	MOVLW D'9'		;LOOK FOR LD SPDC AT 45 DEG BTDC  
	CPFSGT T2CNT,1		;GO ON IF >9
	BRA TP2.9B		;GO HANDLE IT
 	MOVLW D'12'		;LOOK FOR LSD R2
	CPFSGT T2CNT,1		;GO ON IF >12
	BRA TP2.1		;GO HANDLE IT
	MOVLW D'13'		;LOOK FOR LSI R2 
	CPFSGT T2CNT,1		;GO ON IF > 13
	BRA TP2.2		;GO HANDLE IT	
	MOVLW D'19'		;LOOK FOR START T2 INTERVAL EVENT  
	CPFSGT T2CNT,1		;GO ON IF > 19
	BRA TP2.STR		;GO HANDLE IT 
	MOVLW D'22'		;LOOK FOR END T2 INTERVAL EVENT  
	CPFSGT T2CNT,1		;GO ON IF > 22
	BRA TP2.END		;GO HANDLE IT
	MOVLW D'25'		;LOOK FOR TMR0 LD 
	CPFSGT T2CNT,1		;GO ON IF > 25
	BRA TP2.25B		;GO HANDLE IT
	MOVLW D'28'		;LOOK FOR LSD R1
	CPFSGT T2CNT,1		;GO ON IF >28
	BRA TP2.17		;GO HANDLE IT
	MOVLW D'29'		;LOOK FOR LSI R1
	CPFSGT T2CNT,1		;GO ON IF > 29
	BRA TP2.18		;GO HANDLE IT	
	RETURN		;NO ACTION T2 CNT SO EXIT	
	
  ENDIF		;END    0xA8 HANDLERS

  IF ENG == 0xAD	;SUZUKI 4 T2 EVENT LIST HANDLER
  	MOVLW D'1'		;LOOK FOR LSD GP 2   (CYL 2&3)
	CPFSGT T2CNT,1		;GO ON IF >1
	BRA TP2.1		;GO HANDLE IT
	MOVLW D'2'		;LOOK FOR LSI GP 2   (CYL 2&3)
	CPFSGT T2CNT,1		;GO ON IF >2
	BRA TP2.2		;GO HANDLE IT
	MOVLW D'10'		;LOOK FOR START T2 INTERVAL EVENT 
	CPFSGT T2CNT,1		;GO ON IF > 7
	BRA TP2.STR		;GO HANDLE IT 
 	MOVLW D'13'		;LOOK FOR END T2 INTERVAL EVENT 5
	CPFSGT T2CNT,1		;GO ON IF >5
	BRA TP2.END		;GO HANDLE IT
	MOVLW D'14'		;LOOK FOR 14 (LD SPDL)  (WAS 13)
	CPFSGT T2CNT,1		;GO ON IF > 
	BRA	TP2.14		;01-31-10  35 deg POSITION FOR LD SPARK DELAY
	MOVLW D'16'		;LOOK FOR LSD GP 1  was 15  (CYL 1&4)
	CPFSGT T2CNT,1		;GO ON IF >16
	BRA TP2.15		;GO HANDLE IT
	MOVLW D'17'		;LOOK FOR LSI GP 1   (CYL 1&4)
	CPFSGT T2CNT,1		;GO ON IF >17
	BRA TP2.17		;GO HANDLE IT
	MOVLW D'26'		;LOOK FOR START T2 INTERVAL EVENT  (18)
	CPFSGT T2CNT,1		;GO ON IF > 18
	BRA TP2.STR		;GO HANDLE IT  
	MOVLW D'29'		;LOOK FOR END T2 INTERVAL EVENT  (21)
	CPFSGT T2CNT,1		;GO ON IF > 21
	BRA TP2.END		;GO HANDLE IT
	MOVLW D'28'		;LOOK FOR 12
	CPFSGT T2CNT,1		;GO ON IF > 
	BRA TP2.28		;KILL STRF FLAG
	MOVLW D'30'		;LOOK FOR 30 (LD 35 deg SPARK DELAY position)  (WAS 29)
	CPFSGT T2CNT,1		;GO ON IF > 
	BRA TP2.30		;LD SPARK DELAY
TP2.X
	RETURN
	
TP2.28
	CPFSEQ T2CNT,1	;=?
	RETURN		;EXIT IF NOT
	BCF STRF
	RETURN
  ENDIF				;END OF 0xAD SUZUKI T2 EVENT LIST HANDLER

  IF ENG==0xA8
  
TP2.1				;LSD R2
	CPFSEQ T2CNT,1	;=?
	RETURN		;EXIT IF NOT
	BTFSC LSF
	BRA TP2.1A
	BTFSS DDF
	RETURN
	BCF DDF
TP2.1A
	BSF FC3
	BSF FC4
	RETURN
	
TP2.17				;LSD R1
	CPFSEQ T2CNT,1	;=?
	RETURN		;EXIT IF NOT
	BTFSC LSF
	BRA TP2.17A
	BTFSS DDF
	RETURN
	BCF DDF
TP2.17A
	BSF FC1
	BSF FC2
	RETURN

TP2.2				;LSI R2
	CPFSEQ T2CNT,1	;=?
	RETURN		;EXIT IF NOT
	BCF FC3
	BCF FC4
	RETURN

TP2.18				;LSI R1
	CPFSEQ T2CNT,1	;=?
	RETURN		;EXIT IF NOT
	BCF FC1
	BCF FC2
	RETURN

TP2.1430			;SYNC1 EVENT HANDLER, START TMR0 FOR IGNITION EVENT  (14 OR 30), ACL CK, LOW SPEED DWELL
;	BTFSS BUSIN		;(WAS)   IF BUSENSOR==1
;	BRA TP2.1430B	;NO BU SO GO	
;    BTFSC CAF
;    BRA TP2.1430B	;NO TEST FOR T2COUNT MATCH IF A
;   	CPFSEQ T2CNT,1		;COMPARE THE EVENT IN WREG TO T2CNT AND EXIT IF NOT EQUAL
;	RETURN		;WAS NOT EQUAL SO EXIT
 ;   BTFSC CAF 	;DON'T CLEAR SYNF1 ON 7 OR 23 IF B
;				(WAS)   ENDIF
TP2.1430B
	BCF SYNF1		;KILL THE SYNF1 FLAG FOR NEXT SYNF1 (14/30) DETECTION
	BTFSS VT		;VALID CYCLE SO LOAD SPARK DELAY
	RETURN		;EXIT IF NO VT
	BCF T0CON,TMR0ON,0	;STOP TIMER
	MOVFF TMR0L,TPL		;LOAD NEW
	MOVFF TMR0H,TPH
	MOVFF SDH,TMR0H		;MUST LOAD MSB FIRST
	MOVFF SDL,TMR0L		;LOAD TMR0 WITH SPARK DELAY
	BSF T0CON,TMR0ON,0	

; ********   ACL CK START
;	CALL TP2.ACL				;ALSO SETS/CLRS DSF & LSF  NOT SURE Y THIS IS HERE
; *********  ACL CK END

TP2.1430A		;14/30 DSF DWELL

;TP2.723  	
	MOVLW D'14'
	CPFSEQ T2CNT,1		;TEST FOR 14 OR 30
	BRA TP2.30		;WAS NOT 14 SO GO DO 30
TP2.23				;MARKER FOR B W/ BUSENSOR
	BSF R1F			;START OF TP2-14 PROCESSING
	BCF R2F
;	BTFSS DSF		;TEST FOR DSF SPEED
	RETURN			;NO T2 DWELL > DSF SPEED 	
;	BTFSS CAF		;TEST FOR DISABLE SWITCHES
;	BTFSC DLC		;(CK STATUS BIT, NOT SW)	
;	BSF FC1			;TURN LEADING COIL ON
;	BTFSS CAF
;	BTFSC DATC
;	BSF FC2
;	RETURN
TP2.30
TP2.7
	BCF STRF
	BSF R2F
	BCF R1F
;	BTFSS DSF
	RETURN	
;	BTFSS CAF		;TEST FOR DISABLE SWITCHES
;	BTFSC DLC		;(CK STATUS BIT, NOT SW)	
;	BSF FC3			;TURN LEADING COIL ON
;	BTFSS CAF
;	BTFSC DATC
;	BSF FC4
;	RETURN

TP2.25B
	CPFSEQ T2CNT,1
	RETURN		;EXIT IF NOT
;	BCF SYNF1		;KILL THE SYNF1 FLAG 
	BTFSS VT		;  (moved to front)
	RETURN		;EXIT IF NO VT	
	MOVFF SDH,TMR0H		;MUST LOAD MSB FIRST
	MOVFF SDL,TMR0L		;LOAD TMR0 WITH SPARK DELAY
	BSF T0CON,TMR0ON,0
	BSF R1F
	BCF R2F
	BCF STRF
	RETURN

TP2.9B
	CPFSEQ T2CNT,1
	RETURN		;EXIT IF NOT
;	BCF SYNF1		;KILL THE SYNF1 FLAG 
	BTFSS VT		;  (moved to front)
	RETURN		;EXIT IF NO VT	
	MOVFF SDH,TMR0H		;MUST LOAD MSB FIRST
	MOVFF SDL,TMR0L		;LOAD TMR0 WITH SPARK DELAY
	BSF T0CON,TMR0ON,0
	BSF R2F
	BCF R1F
	RETURN	

  ENDIF			;END A8 1430 SECTION

  IF ENG==0xAD	;SUZI 4
  
TP2.1			;LOW SPEED DWELL EVENT # 2/3 GP 2  G13bb
	CPFSEQ T2CNT,1		;COMPARE THE EVENT IN WREG TO T2CNT AND EXIT IF NOT EQUAL
	RETURN		;WAS NOT EQUAL SO EXIT
	BTFSS VT		;TEST FOR VALID TIMING  
	RETURN
	BTFSS LSF		;TEST FOR LOW SPEED DWELL FLAG
	BRA TP2.1A
	BSF FC2			;TURN GP 2 COIL ON
	BSF FC3
	RETURN
TP2.1A
	BTFSS DDF
	RETURN
	BSF FC2
	BSF FC3
	BCF DDF
	RETURN  
	
TP2.15			;LOW SPEED DWELL EVENT # 1/4 GP 1  G13bb
	CPFSEQ T2CNT,1		;COMPARE THE EVENT IN WREG TO T2CNT AND EXIT IF NOT EQUAL
	RETURN		;WAS NOT EQUAL SO EXIT
	BTFSS VT		;TEST FOR VALID TIMING  
	RETURN
	BTFSS LSF		;TEST FOR LOW SPEED DWELL FLAG
	BRA TP2.15A
	BSF FC1			;TURN GP 1 COILS ON
	BSF FC4
	RETURN
TP2.15A
	BTFSS DDF
	RETURN
	BSF FC1
	BSF FC4
	BCF DDF
	RETURN  	
  
TP2.17						;LSI GP 1
	CPFSEQ T2CNT,1
	RETURN
	BCF FC1
	BCF FC4
	RETURN
	
TP2.2						;LSI GP2
	CPFSEQ T2CNT,1
	RETURN
	BCF FC2
	BCF FC3
	RETURN	  
  
TP2.14
	CPFSEQ T2CNT,1
	RETURN		;EXIT IF NOT
	BCF SYNF1		;KILL THE SYNF1 FLAG 
	BTFSS VT		;  (moved to front)
	RETURN		;EXIT IF NO VT	
	MOVFF SDH,TMR0H		;MUST LOAD MSB FIRST
	MOVFF SDL,TMR0L		;LOAD TMR0 WITH SPARK DELAY
	BSF T0CON,TMR0ON,0
	BSF R1F
	BCF R2F
	RETURN

TP2.30
	CPFSEQ T2CNT,1
	RETURN		;EXIT IF NOT
	BCF SYNF1		;KILL THE SYNF1 FLAG 
	BTFSS VT		;  (moved to front)
	RETURN		;EXIT IF NO VT	
	MOVFF SDH,TMR0H		;MUST LOAD MSB FIRST
	MOVFF SDL,TMR0L		;LOAD TMR0 WITH SPARK DELAY
	BSF T0CON,TMR0ON,0
	BSF R2F
	BCF R1F
	RETURN	
  ENDIF		;0xAD END

		; A8 & AD  START TP2 30 DEGREE TIMING INTERVAL    RENESIS RX-8
TP2.STR	
	CPFSEQ T2CNT,1		;COMPARE THE EVENT IN WREG TO T2CNT AND EXIT IF NOT EQUAL
	RETURN		;WAS NOT EQUAL SO EXIT
	BTFSS BUSIN		;(WAS) IF BUSENSOR==1
	BRA TP2.STA		;NO BU SO GO
  	BTFSS CAF
  	BCF SYNF1	;CLR IT IF B
				;(WAS) ENDIF
TP2.STA
	BCF T0CON,TMR0ON,0
	CLRF TMR0H,0
	CLRF TMR0L,0
	BSF T0CON,TMR0ON,0
	BSF T2F			;SET THE FLAG FOR T0
	BSF ANF
	RETURN

   IF ENG==0xA8
TP2.END		;  T2 INTERVAL TIME CAPTURE RENESIS RX-8  *******
	CPFSEQ T2CNT,1		;COMPARE THE EVENT IN WREG TO T2CNT AND EXIT IF NOT EQUAL
	RETURN				;WAS NOT EQUAL SO EXIT
	BCF T0CON,TMR0ON,0	;stop timer 0
	BSF MF				;SET MATH FLAG FOR EXEC
	BCF T2F
	MOVFF TMR0L,TPL		;save NEW timer 0 count (T2 interval)  READ lsb first,  (write msb first)
	MOVFF TMR0H,TPH		
	
;ACCL START
TP2.END2
	BTFSS ACCF		;IS ACCF FLAG NOT SET, GO ON  
	BRA TP2.END3
	DCFSNZ ACCNT,1,1		;DECREMENT ACCELERATION CTR (GIVES 1/2 SEC OF ACCL TIME @ 2000 RPM)
	BCF ACCF		;CLR IT IF TIME UP
TP2.END3
;ACCL END

TP2.ACL											;  *********  NEW ACL START
	MOVLW HIGH DWLSPD	;GET DWELL TRANSITION SPEED DSF
	CPFSLT TPH,1		;ENG SPEED LT?
	BRA TP2.0E			;GO SET DSF  & TEST FOR LSF
	BCF DSF
	BTFSC LSF
	BSF DDF
	BCF LSF				;ENG RPM > DSF SPEED	
TP2.0D				;TEST FOR ACCELERATION 
	MOVFF TPLOLD,IARGL
	MOVFF TPHOLD,IARGH
	MOVF TPL,0,1
	SUBWF IARGL,1,1
	MOVF TPH,0,1
	SUBWFB IARGH,1,1
	BNC TP2.0X	;NEW RPM WAS < OLD SO EXIT,   IS NEW RPM > OLD?  IF CY SET, NEW TPH < OLD SO TEST FOR ACCL
	
 	TSTFSZ IARGH,1		;TEST MSB OF DELTA 
 	BRA TP2.AC1			;MSB NOT ZERO SO PROCESS
 	MOVLW D'32'		;LOW ACTHRESH 			;MSB WAS 0 SO TEST LSB CONSTANT
 	CPFSLT IARGL,1			;COMPARE LSB CONST TO LSB VAR
 	BRA TP2.AC1				;TRUE EXIT DELTA >= THRESH
TP2.0X
 	RETURN					;FALSE EXIT,  DELTA < THRESH
TP2.AC1
	MOVLW 0x1F
	ANDWF IARGL,1
   	BCF _C
   	RRCF IARGH,1,1			;DIV DELTA BY 32
   	RRCF IARGL,1,1
   	RRCF IARGH,1,1
   	RRCF IARGL,1,1
   	RRCF IARGH,1,1
   	RRCF IARGL,1,1
   	RRCF IARGH,1,1
   	RRCF IARGL,1,1
   	RRCF IARGH,1,1
   	RRCF IARGL,1,1
 	
  	MOVLW D'6'			;BUMP IT FOR EMPIRICAL VALUE 
   	ADDWF IARGL,1,1
 
   	MOVF IARGL,0,1		;GET DWL DELTA IN WREG
   	MOVF LP1DH,1,1		;TEST MSB FOR ACTIVE
   	BNZ TP2.ACA			;ACTIVE, SO GO HANDLE
   	MOVF LP1D,1,1		;TEST LPD1 FOR ACTIVE
   	BZ TP2.AC2			;GO TO NEXT DWELL IF NOT ACTIVE	
TP2.ACA
   	SUBWF LP1D,0,1		;SUB DELTA FROM COUNT
   	BNC TP2.AC1A			;IF NEGATIVE, TIME TO TURN IT ON IF NO MSB
	BTFSC STATUS,Z,0	;NOT NEGATIVE SO test for zero
	BRA TP2.AC1C		;HANDLE ZERO CASE , TEST FOR POSSIBLE MSB
   	MOVWF LP1D,1		;UPDATE LPD1
   	BRA TP2.AC2			;GO CK ROTOR 2
TP2.AC1A
	MOVF LP1DH,1,1		;TEST MSB
	BZ TP2.AC1B			;HANDLE 0 TIME OUT
	DECF LP1DH,1,1		;UPDATE MSB
	MOVWF LP1D,1			;UPDATE LSB
	BRA TP2.AC2			;NO TIMEOUT SO GO CK ROTOR 2
TP2.AC1B
   	BSF FC1				;HAD BORROW OR WAS ZERO SO TURN ON NOW
   	BSF FC2
   	CLRF LP1D
   	CLRF LP1DH
   	BRA TP2.AC2
TP2.AC1C				;ZERO LSB COUNT
	MOVF LP1DH,1,1		;TEST MSB
	BZ TP2.AC1B			;IF TOTAL COUNT = 0 THEN TIME FOR DWELL OTHERWISE GO ON WITH NEXT ROTOR
	
TP2.AC2												;TEST DWELL FOR ROTOR 2
    MOVF IARGL,0,1		;GET DWL DELTA IN WREG
   	MOVF LP2DH,1,1		;TEST MSB FOR ACTIVE
   	BNZ TP2.ACA2			;ACTIVE, SO GO HANDLE
   	MOVF LP2D,1,1		;MSB IS 0,  TEST LPD1 FOR ACTIVE
   	BZ TP2.AC3			;GO TO NEXT DWELL IF NOT ACTIVE	
TP2.ACA2
   	SUBWF LP2D,0,1		;SUB DELTA FROM COUNT
   	BNC TP2.AC1A2			;IF NEGATIVE, TIME TO TURN IT ON IF NO MSB
	BTFSC STATUS,Z,0	;NOT NEGATIVE SO test for zero
	BRA TP2.AC1C2		;HANDLE ZERO CASE , TEST FOR POSSIBLE MSB
   	MOVWF LP2D,1		;UPDATE LPD1
   	BRA TP2.AC3			;GO CK NEXT ROTOR
TP2.AC1A2
	MOVF LP2DH,1,1		;TEST MSB
	BZ TP2.AC1B2			;HANDLE 0 TIME OUT
	DECF LP2DH,1,1		;UPDATE MSB
	MOVWF LP2D,1		;UPDATE LSB
	BRA TP2.AC3			;NO TIMEOUT SO GO CK ROTOR 2
TP2.AC1B2
   	BSF FC3				;HAD BORROW OR WAS ZERO SO TURN ON NOW
   	BSF FC4
   	CLRF LP2D
   	CLRF LP2DH
   	BRA TP2.AC3			;GO CK NEXT ROTOR
TP2.AC1C2				;ZERO LSB COUNT
	MOVF LP2DH,1,1		;TEST MSB
	BZ TP2.AC1B2			;IF TOTAL COUNT = 0 THEN TIME FOR DWELL OTHERWISE GO ON WITH NEXT ROTOR  	
TP2.AC3
	BRA TP2.0X			;GO SAVE OLD TP2 FOR NEXT PASS;END OF ACL HANDLER
	
TP2.0E					;RPM WAS < DSF SPEED
	BSF DSF	
	MOVLW HIGH MAPRPMSTR		;THE LSF CONSTANT
	CPFSLT TPH,1
	BRA TP2.0F		;GO SET LSF
	BTFSC LSF
	BSF DDF
	BCF LSF
	BRA TP2.0D		;RPM BETWEEN LSF ANF DSF POINT.  GO TEST FOR RPM ACCELERATION
TP2.0F
	BSF LSF
	BRA TP2.0X	;GO SAVE OLD TPH FOR NEXT PASS
	
;  *********  NEW ACCL END
  ENDIF    ;END OF 0xA8 RENESIS TP2.END
 
; ***********************
  IF ENG==0xAD
TP2.END		;  T2 INTERVAL TIME CAPTURE RENESIS RX-8  *******
	CPFSEQ T2CNT,1		;COMPARE THE EVENT IN WREG TO T2CNT AND EXIT IF NOT EQUAL
	RETURN				;WAS NOT EQUAL SO EXIT
	BCF T0CON,TMR0ON,0	;stop timer 0
	BSF MF				;SET MATH FLAG FOR EXEC
	BCF T2F
	MOVFF TMR0L,TPL		;save NEW timer 0 count (T2 interval)  READ lsb first,  (write msb first)
	MOVFF TMR0H,TPH		
	
;ACCL START
TP2.END2
	BTFSS ACCF		;IS ACCF FLAG NOT SET, GO ON  
	BRA TP2.END3
	DCFSNZ ACCNT,1,1		;DECREMENT ACCELERATION CTR (GIVES 1/2 SEC OF ACCL TIME @ 2000 RPM)
	BCF ACCF		;CLR IT IF TIME UP
TP2.END3
;ACCL END

TP2.ACL											;  *********  NEW ACL START
	MOVLW HIGH DWLSPD	;GET DWELL TRANSITION SPEED DSF
	CPFSLT TPH,1		;ENG SPEED LT?
	BRA TP2.0E			;GO SET DSF  & TEST FOR LSF
	BCF DSF
	BTFSC LSF
	BSF DDF
	BCF LSF				;ENG RPM > DSF SPEED		
TP2.0D				;TEST FOR ACCELERATION 
	MOVFF TPLOLD,IARGL
	MOVFF TPHOLD,IARGH
	MOVF TPL,0,1
	SUBWF IARGL,1,1
	MOVF TPH,0,1
	SUBWFB IARGH,1,1
	BNC TP2.0X	;NEW RPM WAS < OLD SO EXIT,   IS NEW RPM > OLD?  IF CY SET, NEW TPH < OLD SO TEST FOR ACCL
	
 	TSTFSZ IARGH,1		;TEST MSB OF DELTA 
 	BRA TP2.AC1			;MSB NOT ZERO SO PROCESS
 	MOVLW D'32'		;LOW ACTHRESH 			;MSB WAS 0 SO TEST LSB CONSTANT
 	CPFSLT IARGL,1			;COMPARE LSB CONST TO LSB VAR
 	BRA TP2.AC1				;TRUE EXIT DELTA >= THRESH
TP2.0X
 	RETURN					;FALSE EXIT,  DELTA < THRESH
TP2.AC1
	MOVLW 0x1F
	ANDWF IARGL,1
   	BCF _C
   	RRCF IARGH,1,1			;DIV DELTA BY 32
   	RRCF IARGL,1,1
   	RRCF IARGH,1,1
   	RRCF IARGL,1,1
   	RRCF IARGH,1,1
   	RRCF IARGL,1,1
   	RRCF IARGH,1,1
   	RRCF IARGL,1,1
   	RRCF IARGH,1,1
   	RRCF IARGL,1,1
 	
  	MOVLW D'6'			;BUMP IT FOR EMPIRICAL VALUE 
   	ADDWF IARGL,1,1
 
   	MOVF IARGL,0,1		;GET DWL DELTA IN WREG
   	MOVF LP1DH,1,1		;TEST MSB FOR ACTIVE
   	BNZ TP2.ACA			;ACTIVE, SO GO HANDLE
   	MOVF LP1D,1,1		;TEST LPD1 FOR ACTIVE
   	BZ TP2.AC2			;GO TO NEXT DWELL IF NOT ACTIVE	
TP2.ACA
   	SUBWF LP1D,0,1		;SUB DELTA FROM COUNT
   	BNC TP2.AC1A			;IF NEGATIVE, TIME TO TURN IT ON IF NO MSB
	BTFSC STATUS,Z,0	;NOT NEGATIVE SO test for zero
	BRA TP2.AC1C		;HANDLE ZERO CASE , TEST FOR POSSIBLE MSB
   	MOVWF LP1D,1		;UPDATE LPD1
   	BRA TP2.AC2			;GO CK ROTOR 2
TP2.AC1A
	MOVF LP1DH,1,1		;TEST MSB
	BZ TP2.AC1B			;HANDLE 0 TIME OUT
	DECF LP1DH,1,1		;UPDATE MSB
	MOVWF LP1D,1			;UPDATE LSB
	BRA TP2.AC2			;NO TIMEOUT SO GO CK ROTOR 2
TP2.AC1B
   	BSF FC1				;HAD BORROW OR WAS ZERO SO TURN ON NOW
   	BSF FC4
   	CLRF LP1D
   	CLRF LP1DH
   	BRA TP2.AC2
TP2.AC1C				;ZERO LSB COUNT
	MOVF LP1DH,1,1		;TEST MSB
	BZ TP2.AC1B			;IF TOTAL COUNT = 0 THEN TIME FOR DWELL OTHERWISE GO ON WITH NEXT ROTOR
	
TP2.AC2												;TEST DWELL FOR ROTOR 2
    MOVF IARGL,0,1		;GET DWL DELTA IN WREG
   	MOVF LP2DH,1,1		;TEST MSB FOR ACTIVE
   	BNZ TP2.ACA2			;ACTIVE, SO GO HANDLE
   	MOVF LP2D,1,1		;MSB IS 0,  TEST LPD1 FOR ACTIVE
   	BZ TP2.AC3			;GO TO NEXT DWELL IF NOT ACTIVE	
TP2.ACA2
   	SUBWF LP2D,0,1		;SUB DELTA FROM COUNT
   	BNC TP2.AC1A2			;IF NEGATIVE, TIME TO TURN IT ON IF NO MSB
	BTFSC STATUS,Z,0	;NOT NEGATIVE SO test for zero
	BRA TP2.AC1C2		;HANDLE ZERO CASE , TEST FOR POSSIBLE MSB
   	MOVWF LP2D,1		;UPDATE LPD1
   	BRA TP2.AC3			;GO CK NEXT ROTOR
TP2.AC1A2
	MOVF LP2DH,1,1		;TEST MSB
	BZ TP2.AC1B2			;HANDLE 0 TIME OUT
	DECF LP2DH,1,1		;UPDATE MSB
	MOVWF LP2D,1		;UPDATE LSB  (ERROR!!  WAS LP1D   10-17-07
	BRA TP2.AC3			;NO TIMEOUT SO GO CK ROTOR 2
TP2.AC1B2
   	BSF FC2				;HAD BORROW OR WAS ZERO SO TURN ON NOW
   	BSF FC3
   	CLRF LP2D
   	CLRF LP2DH
   	BRA TP2.AC3			;GO CK NEXT ROTOR
TP2.AC1C2				;ZERO LSB COUNT
	MOVF LP2DH,1,1		;TEST MSB
	BZ TP2.AC1B2			;IF TOTAL COUNT = 0 THEN TIME FOR DWELL OTHERWISE GO ON WITH NEXT ROTOR  	
TP2.AC3
	RETURN			;GO SAVE OLD TP2 FOR NEXT PASS;END OF ACL HANDLER
	
TP2.0E					;RPM WAS < DSF SPEED
	BSF DSF	
	MOVLW HIGH MAPRPMSTR		;THE LSF CONSTANT
	CPFSLT TPH,1
	BRA TP2.0F		;GO SET LSF	
	BTFSC LSF
	BSF DDF
	BCF LSF				;ENG RPM > DSF SPEED		
	BRA TP2.0D		;RPM BETWEEN LSF ANF DSF POINT.  GO TEST FOR RPM ACCELERATION
TP2.0F
	BSF LSF
	RETURN	;
	
;  *********  NEW ACCL END
  ENDIF		;END OF 0xAD TP2.END 
 ENDIF    ;END OF 0xA8 RENESIS / 0xAD SUZI 4 VER

; ***********************
 
  IF (ENG==0xB0)		;20B W/ RX-8 CAS
TP2INT
	BTFSS S2CK		;WAS LAST T2 A SYNC1 INTERVAL?
	BRA TP2.A		;GO TEST FOR SYNC1 IF NOT
	BCF S2CK		;CLEAR THE CK FOR 2ND SYNC FLAG
	BCF _C		;CK FOR 2ND SYNC INTERVAL BY SUBTRACTING SYNCH&L*2 FROM TOLDH&L (20 0R 60 DEG FROM 30)
	RLCF SYNCL,0,1		;IF NO BORROR, THEN THIS IS A SECOND SYNC
	MOVWF IARGL,1	;SAVE IT
	RLCF SYNCH,0,1
	MOVWF IARGH,1
	MOVF IARGL,0,1
	SUBWF TOLDL,1,1
	MOVF IARGH,0,1
	SUBWFB TOLDH,1,1
	BTFSC _C		;IF BORROW (NO CY)THEN THIS IS 2ND SYNC
	BRA TP2.00		;DO NORMAL TP2 HANDLE
	BSF SYNF		;SET ENGINE SYNC FOUND FLAG
	CLRF T2CNT,1	;CLR T2 COUNT (WILL BE INCREMENTED TO 1 DOWNSTREAM)
	BRA TP2.00		;GO HANDLE T2 EVENT
TP2.A		;TEST FOR SYNC1 INTERVAL  BY SUBTRACTING NEW/2 FROM OLD.  A BORROW (CY CLR) INDICATES THAT NEW IS WAY BIGGER (SYNC)
	BCF _C			;DIVIDE SYNCL&H BY 2  (DIVIDE CURRENT SYNC COUNT BY 2)
	RRCF SYNCH,0,1		;DIV NEW SYNC BY 2 
	MOVWF IARGH,1	;SAVE IT
	RRCF SYNCL,0,1		;GET LSB OF NEW/2 TO WREG
	SUBWF TOLDL,0,1		;SUB LSB
	MOVF IARGH,0,1	;GET NEW SYNC/2 MSB
	SUBWFB TOLDH,0,1		;SUB OLD MSB  
	BTFSS _C		;TEST FOR BORROW (CY CLR) IF NEW/2 >TOLD THEN WE HAVE 1ST SYNC INTERVAL AFTER A 10 DEG COUNT
	BSF S2CK		;NEW/2 > OLD SO HAVE 1ST SYNC, SET CHECK FOR SYNC 2 ON NEXT TP2 EVENT (SECOND 30 DEG INTERVAL)
;	BSF SYNC1		;NOT NEEDED?  NOT USED 
TP2.00
	MOVFF SYNCL,TOLDL	; save LATEST SYNC counT IN TOLDL&H
	MOVFF SYNCH,TOLDH
	CLRF SYNCL,1		;CLEAR SYNC REG FOR NEXT CAPTURE CYCLE
	CLRF SYNCH,1
TP2.01		
	MOVLW D'67'		;LOAD DEAD TIME CTR (50 ms, 100 RPM)   42 MS IS SYNC GAP @ 120 RPM (RENESIS)  *********
	MOVWF DTCL,1
	BTFSS SYNF		; DO WE HAVE SYNC F?    04-27-02   SYNF
	RETURN			;EXIT IF NOT
;	BTFSS CAF		;ARE WE A?    have decided not to implement an offset sensor.  Backup will be on same axix as A 2-4-04
;	GOTO TP2.4B		;NO SO GO TO B CONTROLLER T2 EVENT HANDLER (POSITION OF BACKUP SENSOR NOT DEFINED YET)

TP2.L				;WE HAVE SYNC SO PROCESS EVENT LIST
	INCF T2CNT,1,1		;INC T2 COUNT  WE HAVE SYNC SO START COUNTING T2  (last t2 pulse of sync2 interval is called t2 #1)
	MOVLW D'16'		;SEPARATE INTO TWO LISTS
	CPFSLT T2CNT
	BRA TP2.HI
	MOVLW D'1'		;LOOK FOR END T2 INTERVAL EVENT   
	CPFSGT T2CNT,1		;GO ON IF > 1
	BRA TP2.END		;GO HANDLE IT
	MOVLW 0x04		;LOOK FOR LD TMR0 FOR R3 EVENT 
	CPFSGT T2CNT,1		;GO ON IF > 4
	BRA TP2.4		;GO HANDLE IT
	MOVLW D'6'		;LOOK FOR LSD,  WAS 5  10-09-11 
	CPFSGT T2CNT,1		;GO ON IF > 4
	BRA TP2.5		;GO HANDLE IT
	MOVLW D'8'		;LOOK FOR LSI,  ADDED  10-09-11 
	CPFSGT T2CNT,1		;GO ON IF > 8
	BRA TP2.8		;GO HANDLE IT
	MOVLW D'9'		;LOOK FOR START T2 INTERVAL EVENT      WAS 8)
	CPFSGT T2CNT,1		;GO ON IF > 9
	BRA TP2.STR		;GO HANDLE IT
	MOVLW D'12'		;LOOK FOR END T2 INTERVAL EVENT         (was 11)
	CPFSGT T2CNT,1		;GO ON IF > 11
	BRA TP2.END		;GO HANDLE IT
	MOVLW D'14'		;LOOK FOR LD TMR0 FOR R1 EVENT 
	CPFSGT T2CNT,1		;GO ON IF > 14
	BRA TP2.14		;GO HANDLE IT	
	RETURN			;SHOULD NEVER GET HERE
	
TP2.HI	
;	MOVLW D'16'		;LOOK FOR LSD   (16 ALREADY LOADED IN WREG)  WAS 15 BEFORE 10-09-11 
	CPFSGT T2CNT,1		;GO ON IF > 16
	BRA TP2.15		;GO HANDLE IT
	MOVLW D'18'		;LOOK FOR LSI, ADDED  10-09-11 
	CPFSGT T2CNT,1		;GO ON IF > 18
	BRA TP2.18		;GO HANDLE IT
	MOVLW D'19'		;LOOK FOR START T2 INTERVAL EVENT     (WAS 18)
	CPFSGT T2CNT,1		;GO ON IF > 18
	BRA TP2.STR		;GO HANDLE IT
	MOVLW D'22'		;LOOK FOR END T2 INTERVAL EVENT			(WAS 21)
	CPFSGT T2CNT,1		;GO ON IF > 21
	BRA TP2.END		;GO HANDLE IT
	MOVLW D'26'		;LOOK FOR LD TMR0 FOR R2 EVENT
	CPFSGT T2CNT,1		;GO ON IF > 26
	BRA TP2.26		;GO HANDLE IT
	MOVLW  D'27'		;LOOK FOR LSD  
	CPFSGT T2CNT,1		;GO ON IF > 27
	BRA TP2.27		;GO HANDLE IT
	MOVLW D'29'		;LOOK FOR LSI,  ADDED  10-09-11 
	CPFSGT T2CNT,1		;GO ON IF > 29
	BRA TP2.29		;GO HANDLE IT
	
	MOVLW D'30'		;LOOK FOR TP2 START 
	CPFSGT T2CNT,1		;GO ON IF > 30
	BRA TP2.30		;KILL SYNF THEN DO TP2 START 
	RETURN		;NO ACTION T2 CNT SO EXIT

TP2.4				;40 DEG BTDC ROTOR 3
	CPFSEQ T2CNT,1		;COMPARE THE EVENT IN WREG TO T2CNT AND EXIT IF NOT EQUAL
	RETURN		;WAS NOT EQUAL SO EXIT
	BSF R3F			
	BCF R2F
	BCF R1F
	BTFSS VT
	RETURN		;EXIT IF NO VT	
	MOVFF SDH,TMR0H		;MUST LOAD MSB FIRST
	MOVFF SDL,TMR0L		;LOAD TMR0 WITH SPARK DELAY
	BSF T0CON,TMR0ON,0
	RETURN
	
TP2.5				;LSF DWELL ROTOR 3  
	CPFSEQ T2CNT,1		;COMPARE THE EVENT IN WREG TO T2CNT AND EXIT IF NOT EQUAL
	RETURN		;WAS NOT EQUAL SO EXIT
	BTFSS LSF		;ONLY DO DWELL IF LSF SET  
	RETURN
TP2.5A					; LSF SET
  IF N109TC == 0x01
	BSF FC3			;TURN R3 COILS ON
	BSF FC6
  ELSE
  	BSF FC5
  	BSF FC6
  ENDIF
	RETURN
	
TP2.8			;LSI R3
	CPFSEQ T2CNT,1		;COMPARE THE EVENT IN WREG TO T2CNT AND EXIT IF NOT EQUAL
	RETURN		;WAS NOT EQUAL SO EXIT
  IF N109TC == 0x01
	BCF FC3			;TURN R3 COILS ON
	BCF FC6
  ELSE
  	BCF FC5
  	BCF FC6
  ENDIF
	RETURN
	
TP2.30				;SAME AS TP2.STR BUT HAS CLEAR OF STRF
	CPFSEQ T2CNT,1
	RETURN
	CLRF TMR0H,0
	CLRF TMR0L,0
	BSF T0CON,TMR0ON,0
	BSF T2F		;JUST FOR ERROR CHECKING IN TM0
	BSF ANF
	RETURN
	
TP2.STR
	CPFSEQ T2CNT,1		;COMPARE THE EVENT IN WREG TO T2CNT AND EXIT IF NOT EQUAL
	RETURN		;WAS NOT EQUAL SO EXIT	
	CLRF TMR0H,0
	CLRF TMR0L,0
	BSF T0CON,TMR0ON,0
	BSF T2F		;JUST FOR ERROR CHECKING IN TM0
	BSF ANF
	RETURN
	
TP2.END			;TP2 END
			;  T2 INTERVAL TIME CAPTURE RENESIS CAS 20B  *******
	CPFSEQ T2CNT,1		;COMPARE THE EVENT IN WREG TO T2CNT AND EXIT IF NOT EQUAL
	RETURN			;WAS NOT EQUAL SO EXIT
	BCF T0CON,TMR0ON,0		;stop timer 0
	BTFSS T2F	;TEST FOR IT
	RETURN		;EXIT IF NOT
	BCF T2F
	MOVFF TMR0L,TPL		;save timer 0 count (T2 interval)  READ lsb first,  (write msb first)
	MOVFF TMR0H,TPH
	BSF MF		;SET MATH FLAG FOR EXEC  	
	
;ACCL START
TP2.END2
	BTFSS ACCF		;IS ACCF FLAG NOT SET, GO ON  
	BRA TP2.END3
	DCFSNZ ACCNT,1,1		;DECREMENT ACCELERATION CTR (GIVES 1/2 SEC OF ACCL TIME @ 2000 RPM)
	BCF ACCF		;CLR IT IF TIME UP
TP2.END3
;ACCL END

;NEW TRIMAP ADDITION FOR DWELL SPEEDUP PROBLEM
	MOVLW HIGH DWLSPD	;GET DWELL TRANSITION SPEED DSF  ~1100
	CPFSLT TPH,1		;ENG SPEED LT?
	BRA TP2.0E			;GO SET DSF  & TEST FOR LSF
	BCF DSF
	BCF LSF				;ENG RPM > DSF SPEED				
TP2.0D				;TEST FOR ACCELERATION
	MOVFF TPLOLD,IARGL
	MOVFF TPHOLD,IARGH
	MOVF TPL,0,1
	SUBWF IARGL,1,1
	MOVF TPH,0,1
	SUBWFB IARGH,1,1
	BTFSS _C			;IS NEW RPM > OLD?  IF CY SET, NEW TPH < OLD SO TEST FOR ACCL
	BRA TP2.0X			;NO ACCL SO EXIT
	
 	MOVLW 0	;HIGH ACTHRESH	;TEST FOR RPM  > START OF MAP ADV RPM THRESHOLDMSB CONST	< CONSTANT
 	CPFSLT IARGH,1		;COMPARE DELTA TO THRESH
 	BRA	TP2.CEQ				;MSB NOT LT SO CK FOR EQ
 	BRA TP2.0X			;FALSE EXIT, DELTA < THRESH
TP2.CEQ 	
 	CPFSEQ IARGH,1		;COMP VAR MSB FOR = CONST MSB
 	BRA TP2.AC1  		;TRUE EXIT, DELTA IS > THRESHVAR !LT CONST   .VB
 	MOVLW D'32'		;LOW ACTHRESH 			;MSB WAS = SO TEST LSB CONSTANT
 	CPFSLT IARGL,1			;COMPARE LSB CONST TO LSB VAR
 	BRA TP2.AC1				;TRUE EXIT DELTA >= THRESH
TP2.0X
 	RETURN					;FALSE EXIT,  DELTA < THRESH
TP2.AC1
	MOVLW 0x1F
	ANDWF IARGL,1
   	BCF _C
   	RRCF IARGH,1,1			;DIV DELTA BY 32
   	RRCF IARGL,1,1
   	RRCF IARGH,1,1
   	RRCF IARGL,1,1
   	RRCF IARGH,1,1
   	RRCF IARGL,1,1
   	RRCF IARGH,1,1
   	RRCF IARGL,1,1
   	RRCF IARGH,1,1
   	RRCF IARGL,1,1
 
  	MOVLW D'1'			;BUMP IT FOR EMPIRICAL VALUE  (THIS IS ABOUT 2 MS
   	ADDWF IARGL,1,1
   	
   	MOVF IARGL,0,1		;GET DWL DELTA IN WREG
   	MOVF LP1D,1,1		;TEST LPD1 FOR ACTIVE
   	BZ TP2.AC2			;GO TO NEXT DWELL IF NOT ACTIVE	
   	SUBWF LP1D,0,1		;SUB DELTA FROM COUNT
   	BC TP2.AC3				;IF NO BORROW GO ON
TP2.AC1A
  IF N109TC == 0x01
   	BSF FC1				;HAD BORROW OR WAS ZERO SO TURN ON NOW
   	BSF FC4
  ELSE
  	BSF FC1
  	BSF FC2
  ENDIF
   	CLRF LP1D			;SET INACTIVE
   	BRA TP2.AC2
TP2.AC3
	BTFSC STATUS,Z,0	;test for zero
	BRA TP2.AC1A		;HANDLE ZERO CASE   	
   	MOVWF LP1D,1		;UPDATE LPD1
TP2.AC2					;TEST LPD2
   	
   	MOVF IARGL,0,1		;GET DWL DELTA IN WREG
   	MOVF LP2D,1,1		;TEST LPD1 FOR ACTIVE
   	BZ TP2.AC22			;GO TO NEXT DWELL IF NOT ACTIVE	
   	SUBWF LP2D,0,1		;SUB DELTA FROM COUNT
   	BC TP2.AC32				;IF NO BORROW GO ON
TP2.AC1A2
  IF N109TC == 0x01
   	BSF FC2				;HAD BORROW OR WAS ZERO SO TURN ON NOW
   	BSF FC5
  ELSE
  	BSF FC3
  	BSF FC4
  ENDIF
   	CLRF LP2D			;SET INACTIVE
   	BRA TP2.AC22
TP2.AC32
	BTFSC STATUS,Z,0	;test for zero
	BRA TP2.AC1A2		;HANDLE ZERO CASE   	
   	MOVWF LP2D,1		;UPDATE LPD1
TP2.AC22					;TEST LPD2
   	
   	MOVF IARGL,0,1		;GET DWL DELTA IN WREG
   	MOVF LP3D,1,1		;TEST LPD1 FOR ACTIVE
   	BZ TP2.AC23			;GO TO NEXT DWELL IF NOT ACTIVE	
   	SUBWF LP3D,0,1		;SUB DELTA FROM COUNT
   	BC TP2.AC33				;IF NO BORROW GO ON
TP2.AC1A3
  IF N109TC == 0x01
   	BSF FC3				;HAD BORROW OR WAS ZERO SO TURN ON NOW
   	BSF FC6
  ELSE
  	BSF FC5
  	BSF FC6
  ENDIF
   	CLRF LP3D			;SET INACTIVE
   	BRA TP2.AC23
TP2.AC33
	BTFSC STATUS,Z,0	;test for zero
	BRA TP2.AC1A3		;HANDLE ZERO CASE   	
   	MOVWF LP3D,1		;UPDATE LPD1
TP2.AC23					;TEST LPD2
	RETURN									;END OF ACCELERATION HANDLER
	
TP2.0E
	BSF DSF
	MOVLW HIGH MAPRPMSTR		;THE LSF CONSTANT
	CPFSLT TPH,1
	BRA TP2.0F		;GO SET LSF
	BCF LSF
	BRA TP2.0D		;RPM BETWEEN LSF ANF DSF POINT.  GO TEST FOR RPM ACCELERATION
TP2.0F
	BSF LSF
	RETURN			;hardware dwell takes care of it below lsf

TP2.14					;;40 DEG BTDC ROTOR 1,  SPDC LOAD FOR R1
	CPFSEQ T2CNT,1		;COMPARE THE EVENT IN WREG TO T2CNT AND EXIT IF NOT EQUAL
	RETURN		;WAS NOT EQUAL SO EXIT
	BSF R1F			;SET R1 FLAG
	BCF R2F
	BCF R3F
	BTFSS VT		;NOT A LSF CYCLE SO LOAD SPARK DELAY
	RETURN		;EXIT IF NO VT	
	MOVFF SDH,TMR0H		;MUST LOAD MSB FIRST
	MOVFF SDL,TMR0L		;LOAD TMR0 WITH SPARK DELAY
	BSF T0CON,TMR0ON,0
	RETURN

TP2.15
	CPFSEQ T2CNT,1		;COMPARE THE EVENT IN WREG TO T2CNT AND EXIT IF NOT EQUAL
	RETURN		;WAS NOT EQUAL SO EXIT
	BTFSS LSF		;ONLY DO DWELL IF RPM < LSF
	RETURN
TP2.15A					; LSF SET
  IF N109TC == 0x01
	BSF FC1			;TURN R1 COILS ON
	BSF FC4
  ELSE
 	BSF FC1
 	BSF FC2
  ENDIF
	RETURN

TP2.18
	CPFSEQ T2CNT,1		;COMPARE THE EVENT IN WREG TO T2CNT AND EXIT IF NOT EQUAL
	RETURN		;WAS NOT EQUAL SO EXIT
  IF N109TC == 0x01
	BCF FC1			;TURN R1 COILS OFF
	BCF FC4
  ELSE
 	BCF FC1
 	BCF FC2
  ENDIF
	RETURN

TP2.26				;SPDC LOAD FOR R2
	CPFSEQ T2CNT,1		;COMPARE THE EVENT IN WREG TO T2CNT AND EXIT IF NOT EQUAL
	RETURN		;WAS NOT EQUAL SO EXIT
	BSF R2F			;SET R2 FLAG
	BCF R1F
	BCF R3F
	BTFSS VT		;vt?
	RETURN		;EXIT IF NO VT	
					
	MOVFF SDH,TMR0H		;MUST LOAD MSB FIRST
	MOVFF SDL,TMR0L		;LOAD TMR0 WITH SPARK DELAY
	BSF T0CON,TMR0ON,0
	RETURN

TP2.27
	CPFSEQ T2CNT,1		;COMPARE THE EVENT IN WREG TO T2CNT AND EXIT IF NOT EQUAL
	RETURN		;WAS NOT EQUAL SO EXIT
	BTFSS LSF		;ONLY DO DWELL IS LSF SET
	RETURN
TP2.27A					; LSF SET
  IF N109TC == 0x01
	BSF FC2			;TURN R2 COILS ON
	BSF FC5
  ELSE
  	BSF FC3
  	BSF FC4
  ENDIF
	RETURN
	
TP2.29					;LSI BELOW 606RPM ONLY, THIS IS 10 DEG BTDC, NO TDC TRIG AVAILABLE.
	CPFSEQ T2CNT,1		;COMPARE THE EVENT IN WREG TO T2CNT AND EXIT IF NOT EQUAL
	RETURN		;WAS NOT EQUAL SO EXIT
	BTFSS LSF	;NO HARDWARE TRIGGER AT TDC 
	RETURN
  IF N109TC == 0x01
	BCF FC2			;TURN R2 COILS OFF
	BCF FC5
  ELSE
  	BCF FC3
  	BCF FC4
  ENDIF
	RETURN	

   ENDIF     ;END OF 0xB0

   
 IF ENG == 0xA3		;20B VER
TP2INT
TP2.4	
	MOVLW D'50'		;LOAD DEAD TIME CTR (63.75 ms)	02-05-01
	MOVWF DTCL,1
	BTFSS T1F		; DID WE GET T1?   
	RETURN		;EXIT IF NOT  
	INCF T2CNT,1,1		;INC T2 COUNT
	MOVF T2CNT,0,1	;PUT CNT INTO WREG
	DCFSNZ WREG,0,0		;TEST FOR 1
	BRA TP2.41		;WAS X SO TURN ON COIL 1 IF LSF SET  ;20 DEG BTDC WHEN CAS ADJUSTED FOR 35 BTDC ON TP1
	DCFSNZ WREG,0,0		;TEST FOR 2
	BRA TP2.42		;WAS X SO START TMR0 @ 0 & TURN OFF COIL 1 IF LSF SET (10 DEG ATDC)
	DCFSNZ WREG,0,0		;TEST FOR 3
	BRA TP2.43		;WAS X SO END T2F CYC. CAPTURE TPL&H, SET MF, CLR T2F (40 DEG ATDC)
	DCFSNZ WREG,0,0		;TEST FOR 4
	BRA TP2.44		;WAS X SO START TMR0 W SDL&H & SET R2F & CLR R1&3F (70 ATDC )
	DCFSNZ WREG,0,0		;TEST FOR 5
	BRA TP2.45		;WAS X SO TURN ON COIL 2 IF LSF SET ;20 DEG BTDC #2 WHEN CAS ADJUSTED FOR 35 BTDC ON TP1
	DCFSNZ WREG,0,0		;TEST FOR 6
	BRA TP2.46			;WAS X SO START TMR0 @ 0 & TURN OFF COIL 2 IF LSF SET
	DCFSNZ WREG,0,0		;TEST FOR 7
	BRA TP2.END		;WAS X SO END T2F CYC. CAPTURE TPL&H, SET MF, CLR T2F
	DCFSNZ WREG,0,0		;TEST FOR 8
	BRA TP2.48			;WAS X SO START TMR0 W SDL&H & SET R3F & CLR R1&2F
	DCFSNZ WREG,0,0		;TEST FOR 9
	BRA TP2.49			;WAS X SO TURN ON COIL 3 IF LSF SET ;20 DEG BTDC WHEN CAS ADJUSTED FOR 35 BTDC ON TP1
	DCFSNZ WREG,0,0		;TEST FOR 10
	BRA TP2.410		;WAS X SO START TMR0 @ 0 & TURN OFF COIL 3 IF LSF SET
	DCFSNZ WREG,0,0		;TEST FOR 11
	BRA TP2.END		;WAS X SO END T2F CYC. CAPTURE TPL&H, SET MF, CLR T2F
	DCFSNZ WREG,0,0		;TEST FOR 12
	BRA TP2.412		;WAS X SO START TMR0 W SDL&H & SET R1F & CLR R2&3F, CLR TP1F
	
	CLRF T2CNT,1		;INVALID # SO CLEAR & START OVER
	BCF T1F
	BSF INTCON3,INT1IE,0		;ENABLE TP1S
TP2.4X	
	RETURN
	
TP2.41				;20 DEG BTDC WHEN CAS ADJUSTED FOR 35 BTDC ON TP1
	BTFSS VT		;		;TEST FOR VALID TIMING  
	RETURN		;  "
	BTFSS LSF		;
	RETURN
TP2.41A
	BTFSC DLC
	BSF FC1		;TURN LEADING COIL ON
	BTFSC DATC
	BSF FC2
	BCF T0CON,TMR0ON,0
	COMF T2H,0,1
	MOVWF TMR0H,0
	COMF T2L,0,1
	MOVWF TMR0L,0
	BSF T0CON,TMR0ON,0
	RETURN

TP2.42
	BCF T0CON,TMR0ON,0	;TURN TIMER OFF (IF IT WAS ON)
	CLRF TMR0H,0
	CLRF TMR0L,0
	BSF T0CON,TMR0ON,0
	BSF T2F
	BSF ANF
	BCF FC1
	BCF FC2
	RETURN

TP2.43

TP2.END		;  T2 INTERVAL TIME CAPTURE  PSV  *******
	BCF T0CON,TMR0ON,0		;stop timer 0 by selecting external clock

;	MOVFF TPL,TPLOLD		;MOVED TO CD ROUT
;	MOVFF TPH,TPHOLD
	MOVFF TMR0L,TPL		;save timer 0 count (T2 interval)
	MOVFF TMR0H,TPH
	BTFSS T2F		;TEST FOR VALID T2STR
	RETURN			;EXIT IF NOT
	BCF T2F			;CLR FLAG SO TMR0 DOES NOT FIND ERROR
	BSF MF		;SET MATH FLAG FOR EXEC		
;ACCL START		ADD THIS IMMEDIATELY AFTER T2 CAPTURE IN TPL&H
TP2.END0
	BTFSS ACCF		;IS ACCF FLAG NOT SET, GO ON
	BRA TP2.ENDC
	DCFSNZ ACCNT,1,1		;DECREMENT ACCELERATION CTR (GIVES 1/2 SEC OF ACCL TIME @ 2000 RPM)
	BCF ACCF		;CLR IT IF TIME UP
TP2.ENDC
;ACCL END
	MOVLW HIGH DWLSPD	;GET DWELL TRANSITION SPEED DSF  2578.13
	CPFSLT TPH,1		;ENG SPEED LT?
	BRA TP2.0E				;GO SET DSF & TEST FOR LSF
	BCF DSF
	BCF LSF			;ENGINE RPM IS > DSF SPEED
	
TP2.0D				;TEST FOR ACCELERATION 
	MOVFF TPLOLD,IARGL
	MOVFF TPHOLD,IARGH
	MOVF TPL,0,1
	SUBWF IARGL,1,1
	MOVF TPH,0,1
	SUBWFB IARGH,1,1
	BTFSS _C			;IS NEW RPM > OLD?  IF CY SET, NEW TPH < OLD SO TEST FOR ACCL
	BRA TP2.0X			;NO ACCL SO EXIT
	
 	MOVLW 0	;HIGH ACTHRESH	;TEST FOR RPM  > START OF MAP ADV RPM THRESHOLDMSB CONST	< CONSTANT
 	CPFSLT IARGH,1		;COMPARE DELTA TO THRESH
 	BRA	TP2.CEQ				;MSB NOT LT SO CK FOR EQ
 	BRA TP2.0X			;FALSE EXIT, DELTA < THRESH
TP2.CEQ 	
 	CPFSEQ IARGH,1		;COMP VAR MSB FOR = CONST MSB
 	BRA TP2.AC1  		;TRUE EXIT, DELTA IS > THRESHVAR !LT CONST   .VB
 	MOVLW D'32'		;LOW ACTHRESH 			;MSB WAS = SO TEST LSB CONSTANT
 	CPFSLT IARGL,1			;COMPARE LSB CONST TO LSB VAR
 	BRA TP2.AC1				;TRUE EXIT DELTA >= THRESH
TP2.0X
 	RETURN					;FALSE EXIT,  DELTA < THRESH
TP2.AC1
	MOVLW 0x1F
	ANDWF IARGL,1
   	BCF _C
   	RRCF IARGH,1,1			;DIV DELTA BY 32
   	RRCF IARGL,1,1
   	RRCF IARGH,1,1
   	RRCF IARGL,1,1
   	RRCF IARGH,1,1
   	RRCF IARGL,1,1
   	RRCF IARGH,1,1
   	RRCF IARGL,1,1
	RRCF IARGH,1,1
   	RRCF IARGL,1,1
   	
   	MOVLW D'8'			;BUMP IT FOR EMPIRICAL VALUE
   	ADDWF IARGL,1,1
   	
   	MOVF IARGL,0,1		;GET DWL DELTA IN WREG
   	MOVF LP1D,1,1		;TEST LPD1 FOR ACTIVE
   	BZ TP2.AC2			;GO TO NEXT DWELL IF NOT ACTIVE	
   	SUBWF LP1D,0,1		;SUB DELTA FROM COUNT
   	BC TP2.AC3				;IF NO BORROW GO ON
TP2.AC1A
   	BSF FC1				;HAD BORROW OR WAS ZERO SO TURN ON NOW
   	BSF FC2
   	CLRF LP1D			;SET INACTIVE
   	BRA TP2.AC2
TP2.AC3
	BTFSC STATUS,Z,0	;test for zero
	BRA TP2.AC1A		;HANDLE ZERO CASE   	
   	MOVWF LP1D,1		;UPDATE LPD1
TP2.AC2					;TEST LPD2
   	
   	MOVF IARGL,0,1		;GET DWL DELTA IN WREG
   	MOVF LP2D,1,1		;TEST LPD1 FOR ACTIVE
   	BZ TP2.AC22			;GO TO NEXT DWELL IF NOT ACTIVE	
   	SUBWF LP2D,0,1		;SUB DELTA FROM COUNT
   	BC TP2.AC32				;IF NO BORROW GO ON
TP2.AC1A2
   	BSF FC3				;HAD BORROW OR WAS ZERO SO TURN ON NOW
   	BSF FC4
   	CLRF LP2D			;SET INACTIVE
   	BRA TP2.AC22
TP2.AC32
	BTFSC STATUS,Z,0	;test for zero
	BRA TP2.AC1A2		;HANDLE ZERO CASE   	
   	MOVWF LP2D,1		;UPDATE LPD1
TP2.AC22					;TEST LPD2
   	
   	MOVF IARGL,0,1		;GET DWL DELTA IN WREG
   	MOVF LP3D,1,1		;TEST LPD1 FOR ACTIVE
   	BZ TP2.AC23			;GO TO NEXT DWELL IF NOT ACTIVE	
   	SUBWF LP3D,0,1		;SUB DELTA FROM COUNT
   	BC TP2.AC33				;IF NO BORROW GO ON
TP2.AC1A3
   	BSF FC5				;HAD BORROW OR WAS ZERO SO TURN ON NOW
   	BSF FC6
   	CLRF LP3D			;SET INACTIVE
   	BRA TP2.AC23
TP2.AC33
	BTFSC STATUS,Z,0	;test for zero
	BRA TP2.AC1A3		;HANDLE ZERO CASE   	
   	MOVWF LP3D,1		;UPDATE LPD1
TP2.AC23					;TEST LPD2
	RETURN									;END OF ACCELERATION HANDLER
	
TP2.0E
	BSF DSF
	MOVLW HIGH MAPRPMSTR		;THE LSF CONSTANT
	CPFSLT TPH,1
	BRA TP2.0F		;GO SET LSF
	BCF LSF
	BRA TP2.0D		;ENGINE IS BETWEEN DSF AND LSF RPM,  GO TEST FOR RPM ACCELERATION
TP2.0F
	BSF LSF
	RETURN
		
TP2.44
;	BTFSS LSF		;GIVES BETTER DWELL AT CRITICAL RPM AND GIVES ONLY 3.75 DEG BTDC TIMING BELOW LSF
;	BRA TP2.44A
;	MOVF T4L,0,1
;	SUBWF SDL,1,1
;	MOVF T4H,0,1
;	SUBWFB SDH,1,1	
TP2.44A	
	MOVFF SDH,TMR0H   ;WRITE MSB FIRST!
	MOVFF SDL,TMR0L		;LOAD TMR0 WITH SPARK DELAY
	BSF T0CON,TMR0ON,0
	BSF R2F			;SET ROTOR 2 FLAG FOR TIMER 0 INT ROUT.
	BCF R1F			; CLEAR THE OTHER ON JUST TO BE SURE
	BCF R3F			; THIS ONE TOO
	RETURN

TP2.45				;20 DEG BTDC WHEN CAS ADJUSTED FOR 35 BTDC ON TP1
	BTFSS VT		;		;TEST FOR VALID TIMING  
	RETURN		;  "
	BTFSC LSF
	BRA TP2.45A		;DO DWELL
	RETURN
TP2.45A
	BTFSC DLC
	BSF FC3		;TURN R2 LEADING COIL ON
	BTFSC DATC
	BSF FC4		;TRAILING COIL R2
	BCF T0CON,TMR0ON,0
	COMF T2H,0,1
	MOVWF TMR0H,0
	COMF T2L,0,1
	MOVWF TMR0L,0
	BSF T0CON,TMR0ON,0
	RETURN

TP2.46
	BCF T0CON,TMR0ON,0	;TURN TIMER OFF (IF IT WAS ON)
	CLRF TMR0H,0		;WRITE MSB 1ST!!
	CLRF TMR0L,0
	BSF T0CON,TMR0ON,0
	BSF T2F
	BSF ANF
	BCF FC3			;TURN R2 COILS OFF
	BCF FC4
	RETURN

TP2.48		
	MOVFF SDH,TMR0H		;MSB FIRST
	MOVFF SDL,TMR0L		;LOAD TMR0 WITH SPARK DELAY
	BSF T0CON,TMR0ON,0
	BSF R3F			;SET ROTOR 3 FLAG FOR TIMER 0 INT ROUT.
	BCF R1F			; CLEAR THE OTHER ON JUST TO BE SURE
	BCF R2F			; THIS ONE TOO
	RETURN

TP2.49				;20 DEG BTDC WHEN CAS ADJUSTED FOR 35 BTDC ON TP1
	BTFSS VT		;		;TEST FOR VALID TIMING  
	RETURN		;  "
	BTFSC LSF
	BRA TP2.49A		;DO DWELL
	RETURN
TP2.49A
	BTFSC DLC
	BSF FC5		;TURN R3 LEADING COIL ON   CHANGED 10-09-11
	BTFSC DATC
	BSF FC6		;TRAILING R3
	BCF T0CON,TMR0ON,0
	COMF T2H,0,1
	MOVWF TMR0H,0
	COMF T2L,0,1
	MOVWF TMR0L,0
	BSF T0CON,TMR0ON,0
	RETURN

TP2.410				;T2 INTERVAL START
	BCF T0CON,TMR0ON,0	;TURN TIMER OFF (IF IT WAS ON)
	CLRF TMR0H,0
	CLRF TMR0L,0
	BSF T0CON,TMR0ON,0
	BSF T2F
	BSF ANF
	BCF FC3
	BCF FC6
	RETURN

TP2.412
	MOVFF SDH,TMR0H
	MOVFF SDL,TMR0L		;LOAD TMR0 WITH SPARK DELAY
	BSF T0CON,TMR0ON,0
	BSF R1F			;SET ROTOR 1 FLAG FOR TIMER 0 INT ROUT.
	BCF R2F			;CLEAR ROTOR 2 FLAG
	BCF R3F
TP2.412X
	BCF T1F			;CLEAR T1F FOR NEXT GO
	BCF STRF			;CLEAR THE START FLAG 
	BCF INTCON3,INT1IF,0		;kill any existing t1 ints
	BSF INTCON3,INT1IE,0		;ENABLE TP1 INTS  (TWELVE T2 INTS WILL RE-ENABLE T1 INTS)
	RETURN
 ENDIF		;0xA3  20B VER

 IF ENG == 0xA5		;HEXADYNE TP2 INT HANDLER  :  NORM. IGNITION TIMING STARTS @ 60 DEG. BTDC
TP2INT
TP2.4
	MOVLW D'67'			
	MOVWF DTCL,1		;LOAD DEAD TIME CTR (63.75 ms)	02-05-01
	BTFSS T1F		; DID WE GET T1?    04-27-02
	RETURN
	
;*****************************
;REPLACEMENT FOR OLD TP2 ROUT
	INCF T2CNT,1,1		;INC T2 COUNT  WE HAVE SYNC SO START COUNTING T2  (last t2 pulse of sync2 interval is called t2 #1)
	MOVLW D'13'		;SEPARATE INTO TWO LISTS
	CPFSLT T2CNT
	BRA TP2.HI
	MOVLW D'1'		;LOOK FOR END T2 INTERVAL EVENT   
	CPFSGT T2CNT,1		;GO ON IF > 1
	BRA TP2.1		;GO HANDLE IT
	MOVLW D'3'		;LOOK FOR END T2 INTERVAL EVENT   
	CPFSGT T2CNT,1		;GO ON IF > 1
	BRA TP2.3		;GO HANDLE IT
	MOVLW 0x05		;LOOK FOR T2STR 
	CPFSGT T2CNT,1		;GO ON IF > 4
	BRA TP2.STR		;GO HANDLE IT
	MOVLW 0x06		;LOOK FOR T2END 
	CPFSGT T2CNT,1		;GO ON IF > 4
	BRA TP2.END		;GO HANDLE IT
	MOVLW D'10'		;LOOK FOR T2STR 
	CPFSGT T2CNT,1		;GO ON IF > 4
	BRA TP2.STR1		;GO HANDLE IT
	MOVLW D'11'		;LOOK FOR T2STR 
	CPFSGT T2CNT,1		;GO ON IF > 4
	BRA TP2.END		;GO HANDLE IT
	MOVLW D'12'		;LOOK FOR START T2 INTERVAL EVENT      WAS 8)
	CPFSGT T2CNT,1		;GO ON IF > 8
	BRA TP2.12		;GO HANDLE IT
	RETURN			;SHOULD NEVER GET HERE
	
TP2.HI	
;	MOVLW D'13'		;LOOK FOR LSD OR DSF   (13 ALREADY LOADED IN WREG) 
	CPFSGT T2CNT,1		;GO ON IF > 13
	BRA TP2.13		;LSD, GO HANDLE IT
	MOVLW D'15'		;LOOK FOR END T2 INTERVAL EVENT   
	CPFSGT T2CNT,1		;GO ON IF > 1
	BRA TP2.15		;GO HANDLE IT
	MOVLW D'17'		;LOOK FOR START T2 INTERVAL EVENT     (WAS 18)
	CPFSGT T2CNT,1		;GO ON IF > 17
	BRA TP2.STR		;GO HANDLE IT
	MOVLW D'18'		;LOOK FOR END T2 INTERVAL EVENT			(WAS 21)
	CPFSGT T2CNT,1		;GO ON IF > 18
	BRA TP2.END		;GO HANDLE IT
	MOVLW D'22'		;LOOK FOR T2STR 
	CPFSGT T2CNT,1		;GO ON IF > 22
	BRA TP2.STR1		;GO HANDLE IT
	MOVLW D'23'		;LOOK FOR T2STR 
	CPFSGT T2CNT,1		;GO ON IF > 23
	BRA TP2.END		;GO HANDLE IT
	MOVLW D'24'		;LOOK FOR LD TMR0 FOR R2 EVENT
	CPFSGT T2CNT,1		;GO ON IF > 26
	BRA TP2.24		;LD TM0 CYL1  GO HANDLE IT
	RETURN		;NO ACTION T2 CNT SO EXIT

TP2.1	
	CPFSEQ T2CNT,1	;IS IT US?
	RETURN
	BTFSS VT			;		;TEST FOR VALID TIMING  
	RETURN		;  "
	BTFSS DSF			;TEST FOR LOW SPEED DWELL FLAG (rpm < 1200)
	RETURN				
	BSF FC1			;TURN CYL 1 COILS ON
	BSF FC2
	RETURN

TP2.13		
	CPFSEQ T2CNT,1	;IS IT US?
	RETURN
	BTFSS VT			;		;TEST FOR VALID TIMING  
	RETURN		;  "
	BTFSS DSF			;TEST FOR LOW SPEED DWELL FLAG (rpm < 1200)
	RETURN				
	BSF FC3			;TURN CYL 2 COILS ON
	BSF FC4
	RETURN

TP2.3
	CPFSEQ T2CNT,1	;IS IT US?
	RETURN
	BCF FC1			;SHOULD BE OFF NOW
	BCF FC2
	RETURN

TP2.15
	CPFSEQ T2CNT,1	;IS IT US?
	RETURN
	BCF FC3			;SHOULD BE OFF NOW
	BCF FC4
	RETURN

TP2.STR1			;START T2 CYCLE W/ NO ANF
	CPFSEQ T2CNT,1	;IS IT US?
	RETURN
	CLRF TMR0H,0
	CLRF TMR0L,0
	BSF T0CON,TMR0ON,0
	BSF T2F
	RETURN

TP2.STR			;START T2 CYCLE
	CPFSEQ T2CNT,1	;IS IT US?
	RETURN
	BSF ANF
	CLRF TMR0H,0
	CLRF TMR0L,0
	BSF T0CON,TMR0ON,0
	BSF T2F
	RETURN

TP2.END		;  T2 INTERVAL TIME CAPTURE  PSV  *******
	CPFSEQ T2CNT,1	;IS IT US?
	RETURN
	BCF T0CON,TMR0ON,0		;stop timer 0 by selecting external clock
	BTFSS T2F			;TST FOR GOOD START
	RETURN
	BCF T2F
	BSF MF		;SET MATH FLAG FOR EXEC
	movFF TMR0L,TPL		;save timer 0 count (T2 interval)
	movFF TMR0H,TPH
;ACCL START		ADD THIS IMMEDIATELY AFTER T2 CAPTURE IN TPL&H
TP2.END0
	BTFSS ACCF		;IS ACCF FLAG NOT SET, GO ON
	BRA TP2.ENDC
	DCFSNZ ACCNT,1,1		;DECREMENT ACCELERATION CTR (GIVES 1/2 SEC OF ACCL TIME @ 2000 RPM)
	BCF ACCF		;CLR IT IF TIME UP
TP2.ENDC
;ACCL END

TP2.ACL											;  *********  NEW ACL START
	MOVLW HIGH DWLSPD	;GET DWELL TRANSITION SPEED DSF
	CPFSLT TPH,1		;ENG SPEED LT?
	BRA TP2.0E			;GO SET DSF  & TEST FOR LSF   (JUMPS BACK TO TP2.0D)
	BCF DSF
	BCF LSF				;ENG RPM > DSF SPEED				
TP2.0D				;TEST FOR ACCELERATION 
	MOVFF TPLOLD,IARGL
	MOVFF TPHOLD,IARGH
	MOVF TPL,0,1
	SUBWF IARGL,1,1
	MOVF TPH,0,1
	SUBWFB IARGH,1,1
	BNC TP2.0X	;NEW RPM WAS < OLD SO EXIT,   IS NEW RPM > OLD?  IF CY SET, NEW TPH < OLD SO TEST FOR ACCL
	
 	TSTFSZ IARGH,1		;TEST MSB OF DELTA 
 	BRA TP2.AC1			;MSB NOT ZERO SO PROCESS
 	MOVLW D'32'		;LOW ACTHRESH 			;MSB WAS 0 SO TEST LSB CONSTANT
 	CPFSLT IARGL,1			;COMPARE LSB CONST TO LSB VAR
 	BRA TP2.AC1				;TRUE EXIT DELTA >= THRESH
TP2.0X
 	RETURN					;FALSE EXIT,  DELTA < THRESH
TP2.AC1
	MOVLW 0x1F
	ANDWF IARGL,1
   	BCF _C
   	RRCF IARGH,1,1			;DIV DELTA BY 32
   	RRCF IARGL,1,1
   	RRCF IARGH,1,1
   	RRCF IARGL,1,1
   	RRCF IARGH,1,1
   	RRCF IARGL,1,1
   	RRCF IARGH,1,1
   	RRCF IARGL,1,1
   	RRCF IARGH,1,1
   	RRCF IARGL,1,1
 	
  	MOVLW D'6'			;BUMP IT FOR EMPIRICAL VALUE 
   	ADDWF IARGL,1,1
 
   	MOVF IARGL,0,1		;GET DWL DELTA IN WREG
   	MOVF LP1DH,1,1		;TEST MSB FOR ACTIVE
   	BNZ TP2.ACA			;ACTIVE, SO GO HANDLE
   	MOVF LP1D,1,1		;TEST LPD1 FOR ACTIVE
   	BZ TP2.AC2			;GO TO NEXT DWELL IF NOT ACTIVE	
TP2.ACA
   	SUBWF LP1D,0,1		;SUB DELTA FROM COUNT
   	BNC TP2.AC1A			;IF NEGATIVE, TIME TO TURN IT ON IF NO MSB
	BTFSC STATUS,Z,0	;NOT NEGATIVE SO test for zero
	BRA TP2.AC1C		;HANDLE ZERO CASE , TEST FOR POSSIBLE MSB
   	MOVWF LP1D,1		;UPDATE LPD1
   	BRA TP2.AC2			;GO CK ROTOR 2
TP2.AC1A
	MOVF LP1DH,1,1		;TEST MSB
	BZ TP2.AC1B			;HANDLE 0 TIME OUT
	DECF LP1DH,1,1		;UPDATE MSB
	MOVWF LP1D,1			;UPDATE LSB
	BRA TP2.AC2			;NO TIMEOUT SO GO CK ROTOR 2
TP2.AC1B
   	BSF FC1				;HAD BORROW OR WAS ZERO SO TURN ON NOW
   	BSF FC2
   	CLRF LP1D
   	CLRF LP1DH
   	BRA TP2.AC2
TP2.AC1C				;ZERO LSB COUNT
	MOVF LP1DH,1,1		;TEST MSB
	BZ TP2.AC1B			;IF TOTAL COUNT = 0 THEN TIME FOR DWELL OTHERWISE GO ON WITH NEXT ROTOR
	
TP2.AC2												;TEST DWELL FOR ROTOR 2
    MOVF IARGL,0,1		;GET DWL DELTA IN WREG
   	MOVF LP2DH,1,1		;TEST MSB FOR ACTIVE
   	BNZ TP2.ACA2			;ACTIVE, SO GO HANDLE
   	MOVF LP2D,1,1		;MSB IS 0,  TEST LPD1 FOR ACTIVE
   	BZ TP2.AC3			;GO TO NEXT DWELL IF NOT ACTIVE	
TP2.ACA2
   	SUBWF LP2D,0,1		;SUB DELTA FROM COUNT
   	BNC TP2.AC1A2			;IF NEGATIVE, TIME TO TURN IT ON IF NO MSB
	BTFSC STATUS,Z,0	;NOT NEGATIVE SO test for zero
	BRA TP2.AC1C2		;HANDLE ZERO CASE , TEST FOR POSSIBLE MSB
   	MOVWF LP2D,1		;UPDATE LPD1
   	BRA TP2.AC3			;GO CK NEXT ROTOR
TP2.AC1A2
	MOVF LP2DH,1,1		;TEST MSB
	BZ TP2.AC1B2			;HANDLE 0 TIME OUT
	DECF LP2DH,1,1		;UPDATE MSB
	MOVWF LP2D,1		;UPDATE LSB
	BRA TP2.AC3			;NO TIMEOUT SO GO CK ROTOR 2
TP2.AC1B2
   	BSF FC3				;HAD BORROW OR WAS ZERO SO TURN ON NOW
   	BSF FC4
   	CLRF LP2D
   	CLRF LP2DH
   	BRA TP2.AC3			;GO CK NEXT ROTOR
TP2.AC1C2				;ZERO LSB COUNT
	MOVF LP2DH,1,1		;TEST MSB
	BZ TP2.AC1B2			;IF TOTAL COUNT = 0 THEN TIME FOR DWELL OTHERWISE GO ON WITH NEXT ROTOR  	
TP2.AC3
	RETURN			;END OF ACL HANDLER OR START OF NEXT ROTOR IF ANY
TP2.0E					;RPM WAS < DSF SPEED
	BSF DSF	
	MOVLW HIGH MAPRPMSTR		;THE LSF CONSTANT
	CPFSLT TPH,1
	BRA TP2.0F		;GO SET LSF
	BCF LSF
	BRA TP2.0D		;RPM BETWEEN LSF ANF DSF POINT.  GO TEST FOR RPM ACCELERATION
TP2.0F
	BSF LSF
	RETURN	;EXIT
;  *********  NEW ACCL END

TP2.12
	CPFSEQ T2CNT,1	;IS IT US?
	RETURN
	BTFSS VT
	RETURN	
	MOVFF SDH,TMR0H
	MOVFF SDL,TMR0L		;LOAD TMR0 WITH SPARK DELAY
	BSF T0CON,TMR0ON,0
	BSF R2F			;SET ROTOR 2 FLAG FOR TIMER 0 INT ROUT.
	BCF R1F			; CLEAR THE OTHER ON JUST TO BE SURE
	RETURN
	
TP2.24
	CPFSEQ T2CNT,1	;IS IT US?
	RETURN
	BTFSS VT
	RETURN
	MOVFF SDH,TMR0H
	MOVFF SDL,TMR0L		;LOAD TMR0 WITH SPARK DELAY
	BSF T0CON,TMR0ON,0
	BSF R1F			;SET ROTOR 1 FLAG FOR TIMER 0 INT ROUT.
	BCF R2F			;CLEAR ROTOR 2 FLAG
	BCF T1F			;CLEAR T1F FOR NEXT GO
	BCF STRF			;CLEAR THE START FLAG 
	RETURN
 ENDIF			;END OF ENG TYPE 0xA5 HEXADYNE TP2 INT HANDLER

 IF ENG == 0xAA				;V6 W/36-1 CAS 
TP2INT					;alias tp2int)	(ON INT0 SO NAME OF ROUT WAS REVERSED)
	BCF _C				;DIVIDE TOLDL&H BY 2			;TEST FOR SYNC INTERVAL
	RRCF TOLDH,0,1		;ADD TO TOLDL&H, SAVE IN IARG
	MOVWF IARGH,1		;SAVE IT
	RRCF TOLDL,0,1		;GET LSB OF NEW/2 TO WREG
	ADDWF TOLDL,0,1		;
	MOVWF IARGL,1		;
	MOVF IARGH,0,1		;GET MSB
	ADDWFC TOLDH,0,1	;DO MSB
	MOVWF IARGH,1		;SAVE MSB
	MOVF IARGL,0,1		;GET LSB OF TOLD * 1.5	

	SUBWF SYNCL,0,1		;SUBTRACT  (OLD*1.5) FROM NEW SYNC, IF NO BORROW (CY SET) THEN WE HAVE DETECTED SYNC INTERVAL 
	MOVF IARGH,0,1		;GET  MSB
	SUBWFB SYNCH,0,1	;SUB MSB
	BTFSS _C			;TEST FOR BORROW.  IF NEW SYNC - (OLD+1/2 OLD) DOES NOT GENERATE BORROW (CY SET) THEN WE HAVE SYNC DETECT
	BRA TP2.00			;NO BORROW SO NO SYNC DET, GO ON
	BSF SYNF			;HAD BORROW SO GO SET SYNC DET (SYNF)
	BTG ALT				;TOGGLE BANK FLAG
	CLRF T2CNT,1
	
;				*********    end of added sync
TP2.00
	MOVFF SYNCL,TOLDL	; save LATEST SYNC counT IN TOLDL&H
	MOVFF SYNCH,TOLDH
	CLRF SYNCL,1		;CLEAR SYNC REG FOR NEXT CAPTURE CYCLE
	CLRF SYNCH,1
	MOVLW D'125'	;RESET DEAD TIMER ~ 30 MS
	MOVWF DTCL,1		
	
TP2.A			;new    T2 EVENT HANDLER FOR A CONTROLLER
	BTFSS SYNF		;MAKE SURE WE RECEIVED A TIMING PULSE
	RETURN			;EXIT IF NOT
	INCF T2CNT,1,1		;INC T2 COUNT  WE HAVE SYNC SO START COUNTING T2

	MOVLW D'1'		;		;LOOK FOR LD TM0 W/ SD EVENT CYL 1 GP 3
	CPFSGT T2CNT,1		;GO ON IF > 64
	BRA TP2.1		;GO HANDLE IT
	MOVLW D'4'		;LOOK FOR LOW SPEED DWELL EVENT GP 3
	CPFSGT T2CNT,1		;GO ON IF > 66
	BRA TP2.3		;GO HANDLE IT
	MOVLW D'6'		;LOOK FOR LOW SPEED IGN EVENT GP 3
	CPFSGT T2CNT,1		;GO ON IF > 66
	BRA TP2.6		;GO HANDLE IT
	MOVLW D'7'		;D'69'		;LOOK FOR START T2
	CPFSGT T2CNT,1		;GO ON IF > 69
	BRA TP2.STR		;GO HANDLE IT
	MOVLW D'10'		;0x02		;LOOK FOR END OF TP2 INTERVAL
	CPFSGT T2CNT,1		;GO ON IF > 2
	BRA TP2.END		;GO HANDLE IT
	MOVLW D'13'		;		;LOOK FOR LD TMRO W/SD EVENT #4 GP1
	CPFSGT T2CNT,1		;GO ON IF > 6
	BRA TP2.13		;GO HANDLE IT
	MOVLW D'16'		;		;LOOK FOR LOW SPEED DWELL EVENT GP1
	CPFSGT T2CNT,1		;GO ON IF > 16
	BRA TP2.15		;GO HANDLE IT
	MOVLW D'18'		;LOOK FOR LOW SPEED IGN EVENT GP 1
	CPFSGT T2CNT,1		;GO ON IF > 18
	BRA TP2.18		;GO HANDLE IT
	MOVLW D'19'		;		;LOOK FOR START T2 INTERVAL EVENT
	CPFSGT T2CNT,1		;GO ON IF > 11
	BRA TP2.STR		;GO HANDLE IT
 	MOVLW D'22'		;D'14'		;LOOK FOR END T2 INTERVAL EVENT
	CPFSGT T2CNT,1		;GO ON IF >14
	BRA TP2.END		;GO HANDLE IT
	MOVLW D'25'		;D'18'		;LOOK FOR LD TMRO W/SD EVENT #2 GP2
	CPFSGT T2CNT,1		;GO ON IF > 18
	BRA TP2.25		;GO HANDLE IT
	MOVLW D'28'		;D'20'		;LOOK FOR LOW SPEED DWELL EVENT #2 GP2
	CPFSGT T2CNT,1		;GO ON IF > 20
	BRA TP2.27		;GO HANDLE IT
	MOVLW D'30'		;LOOK FOR LOW SPEED IGN EVENT GP 2
	CPFSGT T2CNT,1		;GO ON IF > 30
	BRA TP2.30		;GO HANDLE IT
	MOVLW D'31'		;D'32'		;START T2 TIMING
	CPFSGT T2CNT,1		;
	BRA TP2.STR		;START A T2 CYCLE
	MOVLW D'34'		;D'34'		;LOOK FOR END T2 INTERVAL EVENT (26)
	CPFSGT T2CNT,1		;
	BRA TP2.END		;END T2 CYCLE
	RETURN
TP2.X
			;NO ACTION T2 CNT SO EXIT
	RETURN

TP2.1
						;LOAD TIMER 0 W/ SPARK DELAY FOR GP 3 (# 1-5)	  v6 OK
	CPFSEQ T2CNT,1		;COMPARE THE EVENT IN WREG TO T2CNT AND EXIT IF NOT EQUAL
	RETURN			;WAS NOT EQUAL SO EXIT
	BTFSS VT
	RETURN
	MOVFF SDH,TMR0H
	MOVFF SDL,TMR0L		;LOAD TMR0 WITH SPARK DELAY
	BSF T0CON,TMR0ON,0
	BCF R1F			;SET GP3 FLAG FOR TIMER 0 INT ROUT.
	BCF R2F			; CLEAR THE OTHER ON JUST TO BE SURE
	BSF R3F
	RETURN
	
TP2.STR		;START 30 DEG TIMING INTERVAL V6 OK
	CPFSEQ T2CNT,1		;COMPARE THE EVENT IN WREG TO T2CNT AND EXIT IF NOT EQUAL
	RETURN		;WAS NOT EQUAL SO EXIT
	BCF T0CON,TMR0ON,0	;TURN TIMER OFF (IF IT WAS ON)  NOT NECESSARY
	CLRF TMR0H,0
	CLRF TMR0L,0
	BSF T0CON,TMR0ON,0
	BSF T2F		;SO TMR0 ROUT CAN TELL IF TO WAS AN ERROR
	BSF ANF		;KICK OFF ANALOG ROUT
	RETURN

TP2.13				;LOAD TIMER 0 W/ SPARK DELAY FOR GP 1 (# 4-3)	  v6 OK
	CPFSEQ T2CNT,1		;COMPARE THE EVENT IN WREG TO T2CNT AND EXIT IF NOT EQUAL
	RETURN			;WAS NOT EQUAL SO EXIT
	BTFSS VT
	RETURN
	MOVFF SDH,TMR0H
	MOVFF SDL,TMR0L		;LOAD TMR0 WITH SPARK DELAY
	BSF T0CON,TMR0ON,0
	BSF R1F			;SET ROTOR 1 (GP1) FLAG FOR TIMER 0 INT ROUT.
	BCF R2F			; CLEAR THE OTHER ON JUST TO BE SURE
	BCF R3F
	RETURN


TP2.25				;LOAD TIMER 0 W/ SPARK DELAY FOR GP 2 (# 2-6)	  v6 OK
	CPFSEQ T2CNT,1		;COMPARE THE EVENT IN WREG TO T2CNT AND EXIT IF NOT EQUAL
	RETURN			;WAS NOT EQUAL SO EXIT
	BTFSS VT
	RETURN
	MOVFF SDH,TMR0H
	MOVFF SDL,TMR0L		;LOAD TMR0 WITH SPARK DELAY
	BSF T0CON,TMR0ON,0
	BCF R1F			;SET  (GP2) FLAG FOR TIMER 0 INT ROUT.
	BSF R2F			; CLEAR THE OTHER ON JUST TO BE SURE
	BCF R3F
	RETURN

TP2.15			; LOW SPEED DWELL EVENT : #3/4 GP 1   V6 OK
	CPFSEQ T2CNT,1		;COMPARE THE EVENT IN WREG TO T2CNT AND EXIT IF NOT EQUAL
	RETURN		;WAS NOT EQUAL SO EXIT
	BTFSS VT		;TEST FOR VALID TIMING  
	RETURN		;  "
	BTFSC LSF		;TEST FOR LOW SPEED DWELL FLAG
	BSF FC1		;TURN COIL GP1 ON
	RETURN
	
TP2.18				; LOW SPEED IGN EVENT : #3/4 GP 1   V6 OK
	CPFSEQ T2CNT,1		;COMPARE THE EVENT IN WREG TO T2CNT AND EXIT IF NOT EQUAL
	RETURN		;WAS NOT EQUAL SO EXIT
	BTFSS VT	;TEST FOR VALID TIMING  
	RETURN		;  "
	BCF FC1		;TURN COIL GP1 OFF
	RETURN

TP2.27			;LOW SPEED DWELL EVENT # 2/6 GP 2   V6 OK WAS 57
	CPFSEQ T2CNT,1		;COMPARE THE EVENT IN WREG TO T2CNT AND EXIT IF NOT EQUAL
	RETURN		;WAS NOT EQUAL SO EXIT
	BTFSS VT		;TEST FOR VALID TIMING  
	RETURN		;  "
	BTFSC LSF		;TEST FOR LOW SPEED DWELL FLAG
	BSF FC2			;TURN GP 2 COIL ON
	RETURN

TP2.30				; LOW SPEED IGN EVENT : #3/4 GP 1   V6 OK
	CPFSEQ T2CNT,1		;COMPARE THE EVENT IN WREG TO T2CNT AND EXIT IF NOT EQUAL
	RETURN		;WAS NOT EQUAL SO EXIT
	BTFSS VT	;TEST FOR VALID TIMING  
	RETURN		;  "
	BCF FC2		;TURN COIL GP2 OFF
	RETURN

TP2.3		;LOW SPEED DWELL EVENT # 1/5 GP 3   V6 OK
	CPFSEQ T2CNT,1		;COMPARE THE EVENT IN WREG TO T2CNT AND EXIT IF NOT EQUAL
	RETURN		;WAS NOT EQUAL SO EXIT
	BTFSS VT		;TEST FOR VALID TIMING  
	RETURN		;  "
	BTFSC LSF		;TEST FOR LOW SPEED DWELL FLAG
	BSF FC3			;TURN GP 3 COIL ON
	RETURN

TP2.6				; LOW SPEED IGN EVENT : GP3   V6 OK
	CPFSEQ T2CNT,1		;COMPARE THE EVENT IN WREG TO T2CNT AND EXIT IF NOT EQUAL
	RETURN		;WAS NOT EQUAL SO EXIT
	BTFSS VT	;TEST FOR VALID TIMING  
	RETURN		;  "
	BCF FC3		;TURN COIL GP3 OFF
	RETURN

TP2.END		;  T2 INTERVAL TIME CAPTURE  PSV  *******
	CPFSEQ T2CNT,1
	RETURN
	BCF T0CON,TMR0ON,0		;stop timer 0 by selecting external clock
	BSF MF		;SET MATH FLAG FOR EXEC
	BCF T2F			;CLR FLAG SO TMR0 DOES NOT FIND ERROR
;	MOVFF TPL,TPLOLD		;MOVED TO CD ROUT
;	MOVFF TPH,TPHOLD
	MOVFF TMR0L,TPL		;save timer 0 count (T2 interval)
	MOVFF TMR0H,TPH
;ACCL START		ADD THIS IMMEDIATELY AFTER T2 CAPTURE IN TPL&H
TP2.END0
	BTFSS ACCF		;IS ACCF FLAG NOT SET, GO ON
	BRA TP2.ENDC
	DCFSNZ ACCNT,1,1		;DECREMENT ACCELERATION CTR (GIVES 1/2 SEC OF ACCL TIME @ 2000 RPM)
	BCF ACCF		;CLR IT IF TIME UP
TP2.ENDC
;ACCL END
	MOVLW HIGH DWLSPD	;GET DWELL TRANSITION SPEED DSF  2578.13
	CPFSLT TPH,1		;ENG SPEED LT?
	BRA TP2.0E				;GO SET DSF & TEST FOR LSF
	BCF DSF
	BCF LSF			;ENGINE RPM IS > DSF SPEED
	
TP2.0D				;TEST FOR ACCELERATION 
	MOVFF TPLOLD,IARGL
	MOVFF TPHOLD,IARGH
	MOVF TPL,0,1
	SUBWF IARGL,1,1
	MOVF TPH,0,1
	SUBWFB IARGH,1,1
	BTFSS _C			;IS NEW RPM > OLD?  IF CY SET, NEW TPH < OLD SO TEST FOR ACCL
	BRA TP2.0X			;NO ACCL SO EXIT
	
 	MOVLW 0	;HIGH ACTHRESH	;TEST FOR RPM  > START OF MAP ADV RPM THRESHOLDMSB CONST	< CONSTANT
 	CPFSLT IARGH,1		;COMPARE DELTA TO THRESH
 	BRA	TP2.CEQ				;MSB NOT LT SO CK FOR EQ
 	BRA TP2.0X			;FALSE EXIT, DELTA < THRESH
TP2.CEQ 	
 	CPFSEQ IARGH,1		;COMP VAR MSB FOR = CONST MSB
 	BRA TP2.AC1  		;TRUE EXIT, DELTA IS > THRESHVAR !LT CONST   .VB
 	MOVLW D'32'		;LOW ACTHRESH 			;MSB WAS = SO TEST LSB CONSTANT
 	CPFSLT IARGL,1			;COMPARE LSB CONST TO LSB VAR
 	BRA TP2.AC1				;TRUE EXIT DELTA >= THRESH
TP2.0X
 	RETURN					;FALSE EXIT,  DELTA < THRESH
TP2.AC1
	MOVLW 0x1F
	ANDWF IARGL,1
   	BCF _C
   	RRCF IARGH,1,1			;DIV DELTA BY 32
   	RRCF IARGL,1,1
   	RRCF IARGH,1,1
   	RRCF IARGL,1,1
   	RRCF IARGH,1,1
   	RRCF IARGL,1,1
   	RRCF IARGH,1,1
   	RRCF IARGL,1,1
	RRCF IARGH,1,1
   	RRCF IARGL,1,1
   	
   	MOVLW D'8'			;BUMP IT FOR EMPIRICAL VALUE
   	ADDWF IARGL,1,1
   	
   	MOVF IARGL,0,1		;GET DWL DELTA IN WREG
   	MOVF LP1D,1,1		;TEST LPD1 FOR ACTIVE
   	BZ TP2.AC2			;GO TO NEXT DWELL IF NOT ACTIVE	
   	SUBWF LP1D,0,1		;SUB DELTA FROM COUNT
   	BC TP2.AC3				;IF NO BORROW GO ON
TP2.AC1A
   	BSF FC1				;HAD BORROW OR WAS ZERO SO TURN ON NOW
   	CLRF LP1D			;SET INACTIVE
   	BRA TP2.AC2
TP2.AC3
	BTFSC STATUS,Z,0	;test for zero
	BRA TP2.AC1A		;HANDLE ZERO CASE   	
   	MOVWF LP1D,1		;UPDATE LPD1
TP2.AC2					;TEST LPD2
   	
   	MOVF IARGL,0,1		;GET DWL DELTA IN WREG
   	MOVF LP2D,1,1		;TEST LPD1 FOR ACTIVE
   	BZ TP2.AC22			;GO TO NEXT DWELL IF NOT ACTIVE	
   	SUBWF LP2D,0,1		;SUB DELTA FROM COUNT
   	BC TP2.AC32				;IF NO BORROW GO ON
TP2.AC1A2
   	BSF FC2				;HAD BORROW OR WAS ZERO SO TURN ON NOW
   	CLRF LP2D			;SET INACTIVE
   	BRA TP2.AC22
TP2.AC32
	BTFSC STATUS,Z,0	;test for zero
	BRA TP2.AC1A2		;HANDLE ZERO CASE   	
   	MOVWF LP2D,1		;UPDATE LPD1
TP2.AC22					;TEST LPD2
   	
   	MOVF IARGL,0,1		;GET DWL DELTA IN WREG
   	MOVF LP3D,1,1		;TEST LPD1 FOR ACTIVE
   	BZ TP2.AC23			;GO TO NEXT DWELL IF NOT ACTIVE	
   	SUBWF LP3D,0,1		;SUB DELTA FROM COUNT
   	BC TP2.AC33				;IF NO BORROW GO ON
TP2.AC1A3
   	BSF FC3				;HAD BORROW OR WAS ZERO SO TURN ON NOW
   	CLRF LP3D			;SET INACTIVE
   	BRA TP2.AC23
TP2.AC33
	BTFSC STATUS,Z,0	;test for zero
	BRA TP2.AC1A3		;HANDLE ZERO CASE   	
   	MOVWF LP3D,1		;UPDATE LPD1
TP2.AC23					;TEST LPD2
	RETURN									;END OF ACCELERATION HANDLER
	
TP2.0E
	BSF DSF
	MOVLW HIGH MAPRPMSTR		;THE LSF CONSTANT
	CPFSLT TPH,1
	BRA TP2.0F		;GO SET LSF
	BCF LSF
	BRA TP2.0D		;ENGINE IS BETWEEN DSF AND LSF RPM,  GO TEST FOR RPM ACCELERATION
TP2.0F
	BSF LSF
	RETURN


 ENDIF		;END OF 0xAA V6


 IF ENG == 0xBA				;V6 W/36-1 CAS & CAM SENSOR 
			;   *******  11-21-05  Changing ford V6 to a tp2 sync detect scheme. 
TP2INT				
	BCF _C				;DIVIDE TOLDL&H BY 2			;TEST FOR SYNC INTERVAL
	RRCF TOLDH,0,1		;ADD TO TOLDL&H, SAVE IN IARG
	MOVWF IARGH,1		;SAVE IT
	RRCF TOLDL,0,1		;GET LSB OF NEW/2 TO WREG
	ADDWF TOLDL,0,1		;
	MOVWF IARGL,1		;
	MOVF IARGH,0,1		;GET MSB
	ADDWFC TOLDH,0,1	;DO MSB
	MOVWF IARGH,1		;SAVE MSB
	MOVF IARGL,0,1		;GET LSB OF TOLD * 1.5	

	SUBWF SYNCL,0,1		;SUBTRACT  (OLD*1.5) FROM NEW SYNC, IF NO BORROW (CY SET) THEN WE HAVE DETECTED SYNC INTERVAL 
	MOVF IARGH,0,1		;GET  MSB
	SUBWFB SYNCH,0,1	;SUB MSB
	BTFSS _C			;TEST FOR BORROW.  IF NEW SYNC - (OLD+1/2 OLD) DOES NOT GENERATE BORROW (CY SET) THEN WE HAVE SYNC DETECT
	BRA TP2.00			;NO BORROW SO NO SYNC DET, GO ON
	BSF SYNF			;HAD BORROW SO GO SET SYNC DET (SYNF)
	BTG ALT				;TOGGLE BANK FLAG
	CLRF T2CNT,1
	
;				*********    end of added sync
TP2.00
	MOVFF SYNCL,TOLDL	; save LATEST SYNC counT IN TOLDL&H
	MOVFF SYNCH,TOLDH
	CLRF SYNCL,1		;CLEAR SYNC REG FOR NEXT CAPTURE CYCLE
	CLRF SYNCH,1
	MOVLW D'125'	;RESET DEAD TIMER ~ 30 MS
	MOVWF DTCL,1
;	MOVLW D'42'	;RESET DEAD TIMER ~ 30 MS
;	MOVWF DTCL,1		
;	MOVLW D'1'
;	MOVWF DTCH,1
TP2.A			;new    T2 EVENT HANDLER FOR A CONTROLLER
	BTFSS SYNF		;MAKE SURE WE RECEIVED A TIMING PULSE
	RETURN			;EXIT IF NOT
	INCF T2CNT,1,1		;INC T2 COUNT  WE HAVE SYNC SO START COUNTING T2

	MOVLW D'1'		;		;LOOK FOR LD TM0 W/ SD EVENT CYL 1 GP 3
	CPFSGT T2CNT,1		;GO ON IF > 64
	BRA TP2.1		;GO HANDLE IT
	MOVLW D'4'		;LOOK FOR LOW SPEED DWELL EVENT GP 3
	CPFSGT T2CNT,1		;GO ON IF > 66
	BRA TP2.3		;GO HANDLE IT
	MOVLW D'6'		;LOOK FOR LOW SPEED IGN EVENT GP 3
	CPFSGT T2CNT,1		;GO ON IF > 66
	BRA TP2.6		;GO HANDLE IT
	MOVLW D'7'		;D'69'		;LOOK FOR START T2
	CPFSGT T2CNT,1		;GO ON IF > 69
	BRA TP2.STR		;GO HANDLE IT
	MOVLW D'10'		;0x02		;LOOK FOR END OF TP2 INTERVAL
	CPFSGT T2CNT,1		;GO ON IF > 2
	BRA TP2.END		;GO HANDLE IT
	MOVLW D'13'		;		;LOOK FOR LD TMRO W/SD EVENT #4 GP1
	CPFSGT T2CNT,1		;GO ON IF > 6
	BRA TP2.13		;GO HANDLE IT
	MOVLW D'16'		;		;LOOK FOR LOW SPEED DWELL EVENT GP1
	CPFSGT T2CNT,1		;GO ON IF > 16
	BRA TP2.15		;GO HANDLE IT
	MOVLW D'18'		;LOOK FOR LOW SPEED IGN EVENT GP 1
	CPFSGT T2CNT,1		;GO ON IF > 18
	BRA TP2.18		;GO HANDLE IT
	MOVLW D'19'		;		;LOOK FOR START T2 INTERVAL EVENT
	CPFSGT T2CNT,1		;GO ON IF > 11
	BRA TP2.STR		;GO HANDLE IT
 	MOVLW D'22'		;D'14'		;LOOK FOR END T2 INTERVAL EVENT
	CPFSGT T2CNT,1		;GO ON IF >14
	BRA TP2.END		;GO HANDLE IT
	MOVLW D'25'		;D'18'		;LOOK FOR LD TMRO W/SD EVENT #2 GP2
	CPFSGT T2CNT,1		;GO ON IF > 18
	BRA TP2.25		;GO HANDLE IT
	MOVLW D'28'		;D'20'		;LOOK FOR LOW SPEED DWELL EVENT #2 GP2
	CPFSGT T2CNT,1		;GO ON IF > 20
	BRA TP2.27		;GO HANDLE IT
	MOVLW D'30'		;LOOK FOR LOW SPEED IGN EVENT GP 2
	CPFSGT T2CNT,1		;GO ON IF > 30
	BRA TP2.30		;GO HANDLE IT
	MOVLW D'31'		;D'32'		;START T2 TIMING
	CPFSGT T2CNT,1		;
	BRA TP2.STR		;START A T2 CYCLE
	MOVLW D'34'		;D'34'		;LOOK FOR END T2 INTERVAL EVENT (26)
	CPFSGT T2CNT,1		;
	BRA TP2.ENDA		;END T2 CYCLE
	RETURN
TP2.X
			;NO ACTION T2 CNT SO EXIT
	RETURN

TP2.STR		;START 30 DEG TIMING INTERVAL V6 OK
	CPFSEQ T2CNT,1		;COMPARE THE EVENT IN WREG TO T2CNT AND EXIT IF NOT EQUAL
	RETURN		;WAS NOT EQUAL SO EXIT
	BSF ANF		;KICK ANALOG OFF
	BCF T0CON,TMR0ON,0	;TURN TIMER OFF (IF IT WAS ON)  NOT NECESSARY
	CLRF TMR0H,0
	CLRF TMR0L,0
	BSF T0CON,TMR0ON,0
	BSF T2F		;SO TMR0 ROUT CAN TELL IF TO WAS AN ERROR
	RETURN

TP2.13				;LOAD TIMER 0 W/ SPARK DELAY FOR GP 1 (# 4-3)	  v6 OK
	CPFSEQ T2CNT,1		;COMPARE THE EVENT IN WREG TO T2CNT AND EXIT IF NOT EQUAL
	RETURN			;WAS NOT EQUAL SO EXIT
	MOVFF SDH,TMR0H
	MOVFF SDL,TMR0L		;LOAD TMR0 WITH SPARK DELAY
	BSF T0CON,TMR0ON,0
	BSF R1F			;SET ROTOR 1 (GP1) FLAG FOR TIMER 0 INT ROUT.
	BCF R2F			; CLEAR THE OTHER ON JUST TO BE SURE
	BCF R3F
	RETURN

TP2.25				;LOAD TIMER 0 W/ SPARK DELAY FOR GP 2 (# 2-6)	  v6 OK
	CPFSEQ T2CNT,1		;COMPARE THE EVENT IN WREG TO T2CNT AND EXIT IF NOT EQUAL
	RETURN			;WAS NOT EQUAL SO EXIT
	MOVFF SDH,TMR0H
	MOVFF SDL,TMR0L		;LOAD TMR0 WITH SPARK DELAY
	BSF T0CON,TMR0ON,0
	BCF R1F			;SET  (GP2) FLAG FOR TIMER 0 INT ROUT.
	BSF R2F			; CLEAR THE OTHER ON JUST TO BE SURE
	BCF R3F
	RETURN

TP2.1				;LOAD TIMER 0 W/ SPARK DELAY FOR GP 3 (# 1-5)	  v6 OK
	CPFSEQ T2CNT,1		;COMPARE THE EVENT IN WREG TO T2CNT AND EXIT IF NOT EQUAL
	RETURN			;WAS NOT EQUAL SO EXIT
	MOVFF SDH,TMR0H
	MOVFF SDL,TMR0L		;LOAD TMR0 WITH SPARK DELAY
	BSF T0CON,TMR0ON,0
	BCF R1F			;SET GP3 FLAG FOR TIMER 0 INT ROUT.
	BCF R2F			; CLEAR THE OTHER ON JUST TO BE SURE
	BSF R3F
	RETURN

TP2.15
			; LOW SPEED DWELL EVENT : #3/4 GP 1   V6 OK
	CPFSEQ T2CNT,1		;COMPARE THE EVENT IN WREG TO T2CNT AND EXIT IF NOT EQUAL
	RETURN		;WAS NOT EQUAL SO EXIT
	BTFSS VT	;TEST FOR VALID TIMING  
	RETURN		;  "
	BTFSS LSF		;TEST FOR LOW SPEED DWELL FLAG
	RETURN		;GO SEE IF DDF IS SET
	BSF FC3		;TURN COIL GP1 ON
	BSF FC4
TP2.43X
	RETURN
	
TP2.18
			; LOW SPEED IGN EVENT : #3/4 GP 1   V6 OK
	CPFSEQ T2CNT,1		;COMPARE THE EVENT IN WREG TO T2CNT AND EXIT IF NOT EQUAL
	RETURN		;WAS NOT EQUAL SO EXIT
	BTFSS VT	;TEST FOR VALID TIMING  
	RETURN		;  "
	BCF FC3		;TURN COIL GP1 OFF
	BCF FC4
	RETURN

TP2.27
					;LOW SPEED DWELL EVENT 27   GP 2   (2 & 6) V6 
	CPFSEQ T2CNT,1		;COMPARE THE EVENT IN WREG TO T2CNT AND EXIT IF NOT EQUAL
	RETURN		;WAS NOT EQUAL SO EXIT
	BTFSS VT		;TEST FOR VALID TIMING  
	RETURN		;  "
	BTFSS LSF		;TEST FOR LOW SPEED DWELL FLAG
	RETURN
	BSF FC2			;TURN GP 2 COIL ON
	BSF FC6
	RETURN

TP2.30
			; LOW SPEED IGN EVENT : #2/6 GP 2   V6 OK
	CPFSEQ T2CNT,1		;COMPARE THE EVENT IN WREG TO T2CNT AND EXIT IF NOT EQUAL
	RETURN		;WAS NOT EQUAL SO EXIT
	BTFSS VT	;TEST FOR VALID TIMING  
	RETURN		;  "
	BCF FC2		;TURN COIL GP2 OFF
	BCF FC6
	RETURN

TP2.3			;LOW SPEED DWELL EVENT # 1/5 GP 3   V6 OK
	CPFSEQ T2CNT,1		;COMPARE THE EVENT IN WREG TO T2CNT AND EXIT IF NOT EQUAL
	RETURN		;WAS NOT EQUAL SO EXIT
	BTFSS VT		;TEST FOR VALID TIMING  
	RETURN		;  "
	BTFSS LSF		;TEST FOR LOW SPEED DWELL FLAG
	RETURN
	BSF FC1			;TURN GP 3 COIL ON
	BSF FC5
	RETURN

TP2.6
			; LOW SPEED IGN EVENT : #1/5 GP 3   V6 OK
	CPFSEQ T2CNT,1		;COMPARE THE EVENT IN WREG TO T2CNT AND EXIT IF NOT EQUAL
	RETURN		;WAS NOT EQUAL SO EXIT
	BTFSS VT	;TEST FOR VALID TIMING  
	RETURN		;  "
	BCF FC1		;TURN COIL GP3 OFF
	BCF FC5
	RETURN
	
TP2.ENDA
	BCF STRF
TP2.END			;TP2 END
			;  T2 INTERVAL TIME CAPTURE RENESIS CAS 20B  *******
	CPFSEQ T2CNT,1		;COMPARE THE EVENT IN WREG TO T2CNT AND EXIT IF NOT EQUAL
	RETURN			;WAS NOT EQUAL SO EXIT
	BCF T0CON,TMR0ON,0		;stop timer 0
	MOVFF TMR0L,TPL		;save timer 0 count (T2 interval)  READ lsb first,  (write msb first)
	MOVFF TMR0H,TPH
	BSF MF		;SET MATH FLAG FOR EXEC  	
	
;ACCL START
TP2.END2
	BTFSS ACCF		;IS ACCF FLAG NOT SET, GO ON  
	BRA TP2.END3
	DCFSNZ ACCNT,1,1		;DECREMENT ACCELERATION CTR (GIVES 1/2 SEC OF ACCL TIME @ 2000 RPM)
	BCF ACCF		;CLR IT IF TIME UP
TP2.END3
;ACCL END

;NEW TRIMAP ADDITION FOR DWELL SPEEDUP PROBLEM
	MOVLW HIGH DWLSPD	;GET DWELL TRANSITION SPEED DSF  ~1100
	CPFSLT TPH,1		;ENG SPEED LT?
	BRA TP2.0E			;GO SET DSF  & TEST FOR LSF
	BCF DSF
	BCF LSF				;ENG RPM > DSF SPEED				
TP2.0D				;TEST FOR ACCELERATION
	MOVFF TPLOLD,IARGL
	MOVFF TPHOLD,IARGH
	MOVF TPL,0,1
	SUBWF IARGL,1,1
	MOVF TPH,0,1
	SUBWFB IARGH,1,1
	BTFSS _C			;IS NEW RPM > OLD?  IF CY SET, NEW TPH < OLD SO TEST FOR ACCL
	BRA TP2.0X			;NO ACCL SO EXIT
	
 	MOVLW 0	;HIGH ACTHRESH	;TEST FOR RPM  > START OF MAP ADV RPM THRESHOLDMSB CONST	< CONSTANT
 	CPFSLT IARGH,1		;COMPARE DELTA TO THRESH
 	BRA	TP2.CEQ				;MSB NOT LT SO CK FOR EQ
 	BRA TP2.0X			;FALSE EXIT, DELTA < THRESH
TP2.CEQ 	
 	CPFSEQ IARGH,1		;COMP VAR MSB FOR = CONST MSB
 	BRA TP2.AC1  		;TRUE EXIT, DELTA IS > THRESHVAR !LT CONST   .VB
 	MOVLW D'32'		;LOW ACTHRESH 			;MSB WAS = SO TEST LSB CONSTANT
 	CPFSLT IARGL,1			;COMPARE LSB CONST TO LSB VAR
 	BRA TP2.AC1				;TRUE EXIT DELTA >= THRESH
TP2.0X
 	RETURN					;FALSE EXIT,  DELTA < THRESH
TP2.AC1
	MOVLW 0x1F
	ANDWF IARGL,1
   	BCF _C
   	RRCF IARGH,1,1			;DIV DELTA BY 32
   	RRCF IARGL,1,1
   	RRCF IARGH,1,1
   	RRCF IARGL,1,1
   	RRCF IARGH,1,1
   	RRCF IARGL,1,1
   	RRCF IARGH,1,1
   	RRCF IARGL,1,1
   	RRCF IARGH,1,1
   	RRCF IARGL,1,1
 
  	MOVLW D'6'			;BUMP IT FOR EMPIRICAL VALUE  (THIS IS ABOUT 2 MS
   	ADDWF IARGL,1,1
   	
   	MOVF IARGL,0,1		;GET DWL DELTA IN WREG
   	MOVF LP1D,1,1		;TEST LPD1 FOR ACTIVE
   	BZ TP2.AC2			;GO TO NEXT DWELL IF NOT ACTIVE	
   	SUBWF LP1D,0,1		;SUB DELTA FROM COUNT
   	BC TP2.AC3				;IF NO BORROW GO ON
TP2.AC1A
	BSF FC3				;HAD BORROW OR WAS ZERO SO TURN GP1 ON NOW
	BSF FC4
   	CLRF LP1D			;SET INACTIVE
   	BRA TP2.AC2
TP2.AC3
	BTFSC STATUS,Z,0	;test for zero
	BRA TP2.AC1A		;HANDLE ZERO CASE   	
   	MOVWF LP1D,1		;UPDATE LPD1
TP2.AC2					;TEST LPD2
   	
   	MOVF IARGL,0,1		;GET DWL DELTA IN WREG
   	MOVF LP2D,1,1		;TEST LPD1 FOR ACTIVE
   	BZ TP2.AC22			;GO TO NEXT DWELL IF NOT ACTIVE	
   	SUBWF LP2D,0,1		;SUB DELTA FROM COUNT
   	BC TP2.AC32				;IF NO BORROW GO ON
TP2.AC1A2
   	BSF FC2				;HAD BORROW OR WAS ZERO SO TURN ON GP2 NOW
   	BSF FC6
   	CLRF LP2D			;SET INACTIVE
   	BRA TP2.AC22
TP2.AC32
	BTFSC STATUS,Z,0	;test for zero
	BRA TP2.AC1A2		;HANDLE ZERO CASE   	
   	MOVWF LP2D,1		;UPDATE LPD1
TP2.AC22					;TEST LPD2
   	
   	MOVF IARGL,0,1		;GET DWL DELTA IN WREG
   	MOVF LP3D,1,1		;TEST LPD1 FOR ACTIVE
   	BZ TP2.AC23			;GO TO NEXT DWELL IF NOT ACTIVE	
   	SUBWF LP3D,0,1		;SUB DELTA FROM COUNT
   	BC TP2.AC33				;IF NO BORROW GO ON
TP2.AC1A3
   	BSF FC1				;HAD BORROW OR WAS ZERO SO TURN ON GP 3 NOW
   	BSF FC5
   	CLRF LP3D			;SET INACTIVE
   	BRA TP2.AC23
TP2.AC33
	BTFSC STATUS,Z,0	;test for zero
	BRA TP2.AC1A3		;HANDLE ZERO CASE   	
   	MOVWF LP3D,1		;UPDATE LPD1
TP2.AC23					;TEST LPD2
	RETURN									;END OF ACCELERATION HANDLER
	
TP2.0E
	BSF DSF
	MOVLW HIGH MAPRPMSTR		;THE LSF CONSTANT
	CPFSLT TPH,1
	BRA TP2.0F		;GO SET LSF
	BCF LSF
	BRA TP2.0D		;RPM BETWEEN LSF ANF DSF POINT.  GO TEST FOR RPM ACCELERATION
TP2.0F
	BSF LSF
	RETURN			;hardware dwell takes care of it below lsf

 ENDIF		;END OF 0xAA V6

			
 IF ENG == 0xA6	;GEO W/60-2 CAS
TP2INT
			;TEST FOR SYNC INTERVAL
	BCF _C			;DIVIDE SYNCL&H BY 2
	RRCF SYNCH,0,1		; 
	MOVWF IARGH,1	;SAVE IT
	RRCF SYNCL,0,1		;GET LSB OF NEW/2 TO WREG
	SUBWF TOLDL,0,1		;SUB LSB
	MOVF IARGH,0,1	;GET NEW T2 MSB/2
	SUBWFB TOLDH,0,1		;SUB MSB
	BTFSC _C		;TEST FOR BORROW  IF NEW/2 >TOLD THEN WE HAVE SYNC DETECT
	BRA TP2.00		;NO BORROW SO NO SYNC DET, GO ON
	BSF SYNF		;HAD BORROW SO GO SET SYNC DET (SYNF)
	CLRF T2CNT,1		;SET T2CNT TO 0	
TP2.00
	MOVF SYNCL,0,1	; save LATEST SYNC counT IN TOLDL&H
	MOVWF TOLDL,1
	movF SYNCH,0,1
	MOVWF TOLDH,1
	CLRF SYNCL,1		;CLEAR SYNC REG FOR NEXT CAPTURE CYCLE
	CLRF SYNCH,1		
	MOVLW D'35'		;LOAD DEAD TIME CTR (38.25 ms)   25.2 MS IS T2 SYNC GAP @ 120 RPM PSV  *********
	MOVWF DTCL,1
	BTFSS SYNF		; DO WE HAVE SYNC?    04-27-02  PSV ****  WAS T1F NOW SYNF
	RETURN		;EXIT IF NOT   

TP2.4			;new    T2 EVENT HANDLER FOR A CONTROLLER
	INCF T2CNT,1,1		;INC T2 COUNT  WE HAVE SYNC SO START COUNTING T2
	MOVLW D'29'		;SEPARATE TESTS INTO TWO GROUPS, LOW & HIGH
	CPFSGT T2CNT,1		;T2 <29?
	BRA T2LOW		;GO TEST LOW GP 1 - 29
	MOVLW D'32'		;LOOK FOR LD TM0 W/ SD EVENT CYL 3 (31)
	CPFSGT T2CNT,1		;GO ON IF > 32
	BRA TP2.32		;GO HANDLE IT
	MOVLW D'36'		;LOOK FOR LOW SPEED DWELL EVENT (37)  * 36  9-19-04
	CPFSGT T2CNT,1		;GO ON IF > 37
	BRA TP2.37		;GO HANDLE IT
	MOVLW D'41'		;LOOK FOR LATE R3 IGNITION (41) 
	CPFSGT T2CNT,1		;GO ON IF > 31
	BRA TP2.41		;GO HANDLE IT
	MOVLW D'42'		;LOOK FOR START T2 INTERVAL EVENT (42)
	CPFSGT T2CNT,1		;GO ON IF > 42
	BRA TP2.42		;GO HANDLE IT
 	MOVLW D'47'		;LOOK FOR END T2 INTERVAL EVENT (47)
	CPFSGT T2CNT,1		;GO ON IF > 47
	BRA TP2.END		;GO HANDLE IT
	MOVLW D'52'		;LOOK FOR LD TM0 W/ SD EVENT #1 (52)
	CPFSGT T2CNT,1		;GO ON IF > 52
	BRA TP2.52		;GO HANDLE IT
	MOVLW D'56'		;LOOK FOR LOW SPEED DWELL EVENT (57)  * 56 TO INC DWELL 9-19-04
	CPFSGT T2CNT,1		;GO ON IF > 57
	BRA TP2.57		;GO HANDLE IT
	MOVLW D'58'		;TEST FOR PAST END
	CPFSGT T2CNT,1
	RETURN		;LAST COUNT BEFORE SYNC SO JUST EXIT
	CLRF STAT0,1		;ERROR - CLEAR ALL RUN FLAGS
	CLRF SEQFLAG,1
	RETURN

T2LOW			;new
	MOVLW 0x01		;LOOK FOR LATE #1 IGNITION EVENT
	CPFSGT T2CNT,1		;GO ON IF > 1
	BRA TP2.01		;GO HANDLE IT
	MOVLW 0x02		;LOOK FOR START T2 INTERVAL EVENT
	CPFSGT T2CNT,1		;GO ON IF > 2
	BRA TP2.2		;GO HANDLE IT
 	MOVLW D'7'		;LOOK FOR END T2 INTERVAL EVENT (7)
	CPFSGT T2CNT,1		;GO ON IF >7
	BRA TP2.END		;GO HANDLE IT
	MOVLW D'12'		;LOOK FOR LD TMRO W/SD EVENT
	CPFSGT T2CNT,1		;GO ON IF > 12
	BRA TP2.12		;GO HANDLE IT
	MOVLW D'16'		;LOOK FOR LOW SPEED DWELL EVENT (6) (was 27)   *  16 ON 9-19-04 INC DWELL
	CPFSGT T2CNT,1		;GO ON IF > 17
	BRA TP2.17		;GO HANDLE IT		(WAS TP2.27
	MOVLW D'21'		;TEST FOR LATE CYL 2 FIRE
	CPFSGT T2CNT,1		;
	BRA TP2.21		;TEST FOR LATE #2 FIRE  (WAS .31)
	MOVLW D'22'		;START T2 TIMING
	CPFSGT T2CNT,1		;
	BRA TP2.22		;START A T2 CYCLE
	MOVLW D'27'		;LOOK FOR END T2 INTERVAL EVENT (27)
	CPFSGT T2CNT,1		;
	BRA TP2.END		;END T2 CYCLE
TP2.4X			;NO ACTION T2 CNT SO EXIT
	RETURN
	
TP2.01			;#1 late ignition event  GEO OK
	CPFSEQ T2CNT,1		;COMPARE THE EVENT IN WREG TO T2CNT AND EXIT IF NOT EQUAL
	RETURN		;WAS NOT EQUAL SO EXIT
	BTFSS T0CON,TMR0ON,0	;IS IT STILL RUNNING?
	BRA TP2.01X	;EXIT IF NOT RUNNING	
	BCF T0CON,TMR0ON,0	;TURN TIMER OFF (IF IT WAS ON)
	GOTO TM0.0	;GO COMPLETE THE CYCLE THAT WAS MISSED
TP2.01X
	BCF FC1	;THESE SHOULD BE OFF NOW NO MATTER WHAT IT IS NOW 6 DEG atdc	
	RETURN

TP2.21			;TEST FOR LATE CYL 2 FIRE IGNITION EVENT
	CPFSEQ T2CNT,1		;COMPARE THE EVENT IN WREG TO T2CNT AND EXIT IF NOT EQUAL
	RETURN		;WAS NOT EQUAL SO EXIT
	BTFSS T0CON,TMR0ON,0	;IS IT STILL RUNNING?  THIS MEANS THAT WE GOT A T2 EVENT AT A TIME WE EXPECTED IGNITION TO HAVE 
			;ALREADY OCCURED.  THIS IS HANDLED BY STOPPING THE TIMER AND EXECUTING THE TM0 ROUT THAT NORMALLY
			;WOULD HAVE HANDLED THE TM0 INTERRUPT.  I.E.  THE ENGINE SPEEDED UP.
	BRA TP2.21X	;EXIT IF STOPPED ALREADY
	BCF T0CON,TMR0ON,0	;TURN TIMER OFF (IF IT WAS ON)
	GOTO TM0.1	;GO COMPLETE THE CYCLE THAT WAS MISSED
TP2.21X	
	BCF FC2	;COILS SHOULD BE OFF NO MATTER WHAT AT THIS TIME 6 DEG atdc
	RETURN

TP2.41			;TEST FOR LATE R3 IGNITION EVENT  GEO OK
	CPFSEQ T2CNT,1		;COMPARE THE EVENT IN WREG TO T2CNT AND EXIT IF NOT EQUAL
	RETURN		;WAS NOT EQUAL SO EXIT
	BTFSS T0CON,TMR0ON,0	;IS IT STILL RUNNING?  THIS MEANS THAT WE GOT A T2 EVENT AT A TIME WE EXPECTED IGNITION TO HAVE 
			;ALREADY OCCURED.  THIS IS HANDLED BY STOPPING THE TIMER AND EXECUTING THE TM0 ROUT THAT NORMALLY
			;WOULD HAVE HANDLED THE TM0 INTERRUPT.  I.E.  THE ENGINE SPEEDED UP.
	BRA TP2.41X	;EXIT IF STOPPED ALREADY
	BCF T0CON,TMR0ON,0	;TURN TIMER OFF (IF IT WAS ON)
	GOTO TM0.2	;GO COMPLETE THE CYCLE THAT WAS MISSED
TP2.41X	
	BCF FC3	;COILS SHOULD BE OFF NO MATTER WHAT AT THIS TIME 6 DEG atdc
	RETURN

TP2.END		;  T2 INTERVAL TIME CAPTURE  GEO  *******  7,27,47
	CPFSEQ T2CNT,1		;COMPARE THE EVENT IN WREG TO T2CNT AND EXIT IF NOT EQUAL
	RETURN		;WAS NOT EQUAL SO EXIT
	BCF T0CON,TMR0ON,0		;stop timer 0 by selecting external clock
	BTFSS T2F			;TEST FOR GOOD START
	RETURN
	BCF T2F
	BSF MF		;SET MATH FLAG FOR EXEC
	movFf TMR0L,TPL		;save timer 0 count (T2 interval)
	movFf TMR0H,TPH
	MOVF TPL,0,1

;ACCL START
TP2.0
	BTFSS ACCF		;IS ACCF FLAG NOT SET, GO ON
	BRA TP2.0C
	DCFSNZ ACCNT,1,1		;DECREMENT ACCELERATION CTR (GIVES 1/2 SEC OF ACCL TIME @ 2000 RPM)
	BCF ACCF		;CLR IT IF TIME UP
TP2.0C
;ACCL END
	MOVLW HIGH DWLSPD	;GET DWELL TRANSITION SPEED DSF
	CPFSLT TPH,1		;ENG SPEED LT?
	BRA TP2.0E				;GO SET DSF
	BCF DSF
	BRA TP2.0D
TP2.0E
	BSF DSF
TP2.0D
  IF MAPRPMSTR > 0
    MOVLW HIGH MAPRPMSTR
  ELSE
	MOVLW 0x12		;TEST FOR SLOW SPEED THRESH 14 = 1000, 0D = 1500  changed to 1500 6-19-03
  ENDIF
	CPFSLT TPH,1		;TEST FOR 1000 RPM THRESH	07-13-01
	BRA TP2.0A		;GO SET LSF
	BTFSC LSF		;WAS LSF ALREADY CLEAR?
	BSF DDF			;SET DWELL DROP FLAG IF LSF JUST CLEARED TO PREVENT DRY FIRE AFTER CLEARING LSF 6-19-03
	BCF LSF		 	;CLR LSF FOR  SPEED >1000
	RETURN
TP2.0A	
	BSF LSF		;SET THE SLOW FLAG
TP2.0B	
	RETURN

TP2.17	;WAS TP2.27
  		;LOW SPEED DWELL EVENT : CYL 2   GEO OK
	CPFSEQ T2CNT,1		;COMPARE THE EVENT IN WREG TO T2CNT AND EXIT IF NOT EQUAL
	RETURN		;WAS NOT EQUAL SO EXIT
	BTFSS VT		;TEST FOR ENG TURNING >120 RPM  
	RETURN		;  "
	BTFSS LSF		;TEST FOR LOW SPEED DWELL FLAG (rpm < 1000)
	BRA TP2.17A		;GO TEST FOR DDF 
	BSF FC2			;TURN LEADING COIL ON	
	MOVF T2L,0,1		;LOAD TMR0 WITH SPARK DELAY ( 06-15-02 change)
	ADDWF T8L,0,1			;ADD 3.75 DEG  * 9-19-04
	COMF WREG,0,0

	MOVWF IARGL,1			;SAVE LSB OF SD
	MOVF T2H,0,1		;LOAD TMR0 WITH 18.75 DEG SPARK DELAY ( 22.5 IN EC2A)
	ADDWFC T8H,0,1		
	COMF WREG,0,0
	MOVWF TMR0H,0
	MOVFF IARGL,TMR0L	;16 BIT LOAD HAPPENS HERE

	BSF T0CON,TMR0ON,0		;START RUNNING
	BSF R2F			;SET ROTOR 1 FLAG FOR TIMER 0 INT ROUT.
	BCF R1F			; CLEAR THE OTHER ON JUST TO BE SURE
	BCF R3F
TP2.17X
	RETURN
TP2.17A
	BTFSS DDF		;DWELL DROP FLAG SET?
	RETURN		;EXIT IF NOT
	BCF DDF			;CLEAR IT
	BSF FC2		;TURN COILS ON ONE MORE TIME
	CLRF LP2D,1		;CLR DWELL CNT SO WE WON'T GET FALSE DWELL START
	RETURN

TP2.2
TP2.22
TP2.42		;START TP2 30 DEGREE TIMING INTERVAL ,GEO OK
	CPFSEQ T2CNT,1		;COMPARE THE EVENT IN WREG TO T2CNT AND EXIT IF NOT EQUAL
	RETURN		;WAS NOT EQUAL SO EXIT
	BCF T0CON,TMR0ON,0	;TURN TIMER OFF (IF IT WAS ON)  NOT NECESSARY
	CLRF TMR0H,0
	CLRF TMR0L,0
	BSF T0CON,TMR0ON,0
	BSF T2F		;SO TMR0 ROUT CAN TELL IF TO WAS AN ERROR
	RETURN

TP2.32			;WAS TP2.52		GEO OK
	CPFSEQ T2CNT,1		;COMPARE THE EVENT IN WREG TO T2CNT AND EXIT IF NOT EQUAL
	RETURN		;WAS NOT EQUAL SO EXIT
	BTFSC LSF		;DON'T LOAD HERE IF LSF SET
	RETURN		;EXIT IF SET
	MOVFF SDH,TMR0H
	MOVFF SDL,TMR0L		;16 BIT LOAD TMR0 WITH SPARK DELAY
	BSF T0CON,TMR0ON,0
	BSF R3F			;SET ROTOR 2 FLAG FOR TIMER 0 INT ROUT.
	BCF R1F			; CLEAR THE OTHER ON JUST TO BE SURE
	BCF R2F
;	BCF STRF			;KILL IT HERE
	RETURN

TP2.37			;LOW SPEED DWELL EVENT : #3   GEO OK
	CPFSEQ T2CNT,1		;COMPARE THE EVENT IN WREG TO T2CNT AND EXIT IF NOT EQUAL
	RETURN		;WAS NOT EQUAL SO EXIT
	BTFSS VT		;TEST FOR VALID TIMING  
	RETURN		;  "
	BTFSS LSF		;TEST FOR LOW SPEED DWELL FLAG
	BRA TP2.37A		;GO SEE IF DDF IS SET
	BSF FC3		;TURN LEADING COIL 3 ON
	MOVF T2L,0,1		;LOAD TMR0 WITH SPARK DELAY (06-15-02 change)
	ADDWF T8L,0,1			;ADD 3.75 DEG  * 9-19-04
	COMF WREG,0,0
	MOVWF IARGL,1		;SAVE LSB
	MOVF T2H,0,1		;LOAD TMR0 WITH 15.00 DEG SPARK DELAY
	ADDWFC T8H,0,1			;ADD 3.75 DEG  * 9-19-04
	COMF WREG,0,0
	MOVWF TMR0H,0
	MOVFF IARGL,TMR0L	;16 BIT LOAD
	BSF T0CON,TMR0ON,0
	BSF R3F			;SET ROTOR 3 FLAG FOR TIMER 0 INT ROUT.
	BCF R1F			; CLEAR THE OTHER ON JUST TO BE SURE
	BCF R2F
	BCF STRF			;CLEAR THIS SO WE ARE ABLE TO PGM AT LOW RPM
TP2.37X
	RETURN
TP2.37A
	BTFSS DDF		;IS DWELL DROP FLAG SET?
	RETURN		;EXIT IF NOT
	BCF DDF			;CLEAR IT
	BSF FC3		;TURN COILS ON ONE MORE TIME
	CLRF LP3D,1		;CLR DWELL COUNTER SO WE WON'T GET A LATE DWELL START
	RETURN

TP2.52				;NORMAL SD LOAD #1 EVENT		GEO OK
	CPFSEQ T2CNT,1		;COMPARE THE EVENT IN WREG TO T2CNT AND EXIT IF NOT EQUAL
	RETURN		;WAS NOT EQUAL SO EXIT
	BTFSC LSF		;DON'T LOAD HERE IF LSF SET
	RETURN		;EXIT IF SET
	MOVFF SDH,TMR0H	
	MOVFF SDL,TMR0L		;LOAD TMR0 WITH SPARK DELAY  16 BIT
	BSF T0CON,TMR0ON,0
	BSF R1F			;SET ROTOR 2 FLAG FOR TIMER 0 INT ROUT.
	BCF R2F			; CLEAR THE OTHER ON JUST TO BE SURE
	BCF R3F
	BCF STRF			;KILL IT HERE
	RETURN

TP2.57			;LOW SPEED DWELL EVENT : #1   GEO OK
	CPFSEQ T2CNT,1		;COMPARE THE EVENT IN WREG TO T2CNT AND EXIT IF NOT EQUAL
	RETURN		;WAS NOT EQUAL SO EXIT
	BTFSS VT		;TEST FOR VALID TIMING  
	RETURN		;  "
	BTFSS LSF		;TEST FOR LOW SPEED DWELL FLAG
	BRA TP2.57A		;GO SEE IF DDF IS SET
	BSF FC1			;TURN LEADING COIL ON
	MOVF T2L,0,1		;LOAD TMR0 WITH SPARK DELAY (06-15-02 change)
	ADDWF T8L,0,1			;ADD 3.75 DEG  * 9-19-04
	COMF WREG,0,0

	MOVWF IARGL,1		;SAVE LSB FOR 16 BIT LOAD
	MOVF T2H,0,1		;LOAD TMR0 WITH 15.00 DEG SPARK DELAY
	ADDWFC T8H,0,1			;ADD 3.75 DEG  * 9-19-04
	COMF WREG,0,0
	MOVWF TMR0H,0
	MOVFF IARGL,TMR0L	;16 BIT LOAD
	BSF T0CON,TMR0ON,0
	BSF R1F			;SET ROTOR 3 FLAG FOR TIMER 0 INT ROUT.
	BCF R2F			; CLEAR THE OTHER ON JUST TO BE SURE
	BCF R3F
	BCF STRF			;CLEAR THIS SO WE ARE ABLE TO PGM AT LOW RPM
TP2.57X
	RETURN
TP2.57A
	BTFSS DDF		;IS DWELL DROP FLAG SET?
	RETURN		;EXIT IF NOT
	BCF DDF			;CLEAR IT
	BSF FC1		;TURN COILS ON ONE MORE TIME
	CLRF LP1D,1		;CLR DWELL COUNTER SO WE WON'T GET A LATE DWELL START
	BCF STRF			;CLEAR HERE TOO
	RETURN

TP2.12
	CPFSEQ T2CNT,1		;COMPARE THE EVENT IN WREG TO T2CNT AND EXIT IF NOT EQUAL
	RETURN		;WAS NOT EQUAL SO EXIT
	BTFSC LSF		;LOW SPEED FLAG SET?
	RETURN
	MOVFF SDH,TMR0H
	MOVFF SDL,TMR0L		;LOAD TMR0 WITH SPARK DELAY
	BSF T0CON,TMR0ON,0
	BSF R2F			;SET ROTOR 2 FLAG FOR TIMER 0 INT ROUT.
	BCF R1F			;CLEAR ROTOR 2 FLAG
	BCF R3F			;KILL'EM ALL 
	RETURN
 ENDIF		;END OF AA V6

 IF (ENG==0xAB)||(ENG==0xB1)		;LS1 V8 VER W/ 60-2 CAS  (Backup sensor same timing as primary on 0xB1)
TP2INT
	BCF _C			;DIVIDE SYNCL&H BY 2;TEST FOR SYNC INTERVAL
	RRCF SYNCH,0,1		; 
	MOVWF IARGH,1	;SAVE IT
	RRCF SYNCL,0,1		;GET LSB OF NEW/2 TO WREG
	SUBWF TOLDL,0,1		;SUB LSB
	MOVF IARGH,0,1		;GET NEW T2 MSB/2
	SUBWFB TOLDH,0,1		;SUB MSB
	BTFSC _C		;TEST FOR BORROW  IF NEW/2 >TOLD THEN WE HAVE SYNC DETECT
	BRA TP2.00		;NO BORROW SO NO SYNC DET, GO ON WITHOUT SETTING SYNC & NO PROCESS OF T2 LIST
	BSF SYNF		;HAD BORROW SO GO SET SYNC DET (SYNF) NOW PROCESS T2 EVENT

 ;REMOVED THE B1 CLR OF T2CNT AND BRA TO TP2.00 FOR B1 BACKUP CHANGE.  AB & B1 HANDLED SAME WAY NOW
  IF ENG==0xAB
    BTFSC CAF   	;ARE WE A OR B?
	BRA TP2.0B
TP2.BU				;WE ARE B,  OFFSET T2 CNT FOR B CONTROLLER
	BTFSS BUSIN		;USING BU SENSOR?
	BRA TP2.0B		;NOT BU SENSOR SO HANDLE 
	MOVLW D'30'			;LOAD 180 DEG OFFSET
	MOVWF T2CNT,1
	BRA TP2.00
  ENDIF
TP2.0B
	CLRF T2CNT,1		;SET T2CNT TO 0
TP2.00
	MOVFF SYNCL,TOLDL	; save LATEST SYNC counT IN TOLDL&H
	MOVFF SYNCH,TOLDH
	CLRF SYNCL,1		;CLEAR SYNC REG FOR NEXT CAPTURE CYCLE
	CLRF SYNCH,1
		
	MOVLW D'33'		;LOAD DEAD TIME CTR (38.25 ms)   25.2 MS IS T2 SYNC GAP @ 120 RPM   *********
	MOVWF DTCL,1
	BTFSS SYNF		; DO WE HAVE SYNC?
	RETURN		;EXIT IF NOT
TP2.A			;new   A CONTROLLER T2 EVENT HANDLER
	INCF T2CNT,1,1		;INC T2 COUNT  WE HAVE SYNC SO START COUNTING T2
    MOVFF T2CNT,IARGL	;T2CNT TO IARGL
    
  IF (ENG==0xAB)			;REMOVED 0xB1 , SAME TIMING AS PRI ON LS2-7   AB IS OLD VESTA SPEC CAS
	BTFSS BUSIN
	BRA TP2.A0		;IF NO BU SENSOR, NO ADJUSTMENT OF T2 COUNT NEEDED.	
	BTFSC CAF
	BRA TP2.A0		;A CONTROLLER SO SKIP T2CNT OFFSET
	MOVLW D'59'		;WE WILL ALLOW COUNTS OF UP TO 60 IN TP2 PROCESSOR SO THAT BACKUP WILL WORK
	CPFSGT IARGL,1
	BRA TP2.A0		;NOT PAST 60 SO GO ON
					;SUBTRACT OFFSET FROM COUNT 
	CLRF T2CNT,1	; WAS SUBWF IARGL,1,1
	RETURN
  ENDIF

TP2.A0
	MOVLW D'19'		;SEPARATE TESTS INTO THREE GROUPS, LOW, MID & HIGH
	CPFSGT IARGL,1		;T2 <20?
	BRA T2LOW		;GO TEST LOW GP 1 - 19
	MOVLW D'40'		;TEST FOR MIDRANGE 20 - 40
	CPFSGT IARGL,1
	BRA T2MID

  IF ENG==0xAB								;TRIMAP CHANGED LS IGNITION TO T2.STR
;High list processing 41 - 58   0xAB
	MOVLW D'42'		;LOOK FOR T2 START TIME
	CPFSGT IARGL,1		;GO ON IF > 42
	BRA TP2.STR		;GO HANDLE IT
	MOVLW D'43'		;LOOK FOR LS IGN GP 4
	CPFSGT IARGL,1		;GO ON IF > 43
	BRA TP2.GP4		;GO HANDLE IT
	MOVLW D'47'		;LOOK FOR END OF T2 INTERVAL 
	CPFSGT IARGL,1		;GO ON IF > 47
	BRA TP2.END		;GO HANDLE IT
	MOVLW D'50'		;LOOK FOR LD TM0 W/ SD EVENT CYL 1 OR 6 GP 1   (CHANGED TO 50 10-03-06)
	CPFSGT IARGL,1		;GO ON IF > 51
	BRA TP2.51		;GO HANDLE IT
	MOVLW D'55'		;LOOK FOR LOW SPEED DWELL EVENT GP 1    WAS 54
	CPFSGT IARGL,1		;GO ON IF > 55
	BRA TP2.54		;GO HANDLE IT
 	MOVLW D'57'		;LOOK FOR T2 START TIME
	CPFSGT IARGL,1		;GO ON IF > 57
	BRA TP2.STR		;GO HANDLE IT
	MOVLW D'58'		;LAST VALID T2 CNT & LS IGN GP1
	CPFSGT IARGL,1
	BRA TP2.GP1		; IGN GP1JUST KILL STRF?
	RETURN
	
T2MID				;T2 = 20 - 40
	MOVLW D'20'		;LOOK FOR LD TM0 W/ SD EVENT CYL 4/7 GP 3 (CHANGED TO 20 10-03-06)
	CPFSGT IARGL,1		;GO ON IF > 21
	BRA TP2.21		;GO HANDLE IT
	MOVLW D'25'		; LOOK FOR LOW SPD DWELL GP3 4/7      WAS 24
	CPFSGT IARGL,1		;GO ON IF > 25
	BRA TP2.24		;GO HANDLE IT
	MOVLW D'27'		;LOOK FOR T2 START TIME GP 3
	CPFSGT IARGL,1		;GO ON IF > 27
	BRA TP2.STR		;GO HANDLE IT
	MOVLW D'28'		;LAST VALID T2 CNT & LS IGN GP1
	CPFSGT IARGL,1
	BRA TP2.GP3		; IGN GP3
	MOVLW D'32'		;LOOK FOR END T2
	CPFSGT IARGL,1		;GO ON IF > 32
	BRA TP2.END		;GO HANDLE IT
	MOVLW D'35'		;LOOK FOR LD TM0 W/ SD EVENT GP 4 2/3  (41);LOOK FOR END T2 INTERVAL EVENT (CHANGED TO 35 10-03-06)
	CPFSGT IARGL,1		;GO ON IF > 36
	BRA TP2.36		;GO HANDLE IT
	MOVLW D'40'		;LOOK FOR LOW SPEED DWELL EVENT   WAS 39
	CPFSGT IARGL,1		;GO ON IF > 39
	BRA TP2.39		;GO HANDLE IT
	RETURN			;40 IS NO ACTION , OFF THE END

T2LOW			;1 - 20
	MOVLW 0x02		;LOOK FOR END OF TP2 INTERVAL
	CPFSGT IARGL,1		;GO ON IF > 2
	BRA TP2.END		;GO HANDLE IT
	MOVLW D'5'		;LOOK FOR LD TMRO W/SD EVENT GP2 5/8 (CHANGED TO 5 10-03-06)
	CPFSGT IARGL,1		;GO ON IF > 6
	BRA TP2.6		;GO HANDLE IT
	MOVLW D'10'		;LOOK FOR LOW SPEED DWELL EVENT GP2 5/8    WAS 9
	CPFSGT IARGL,1		;GO ON IF > 10
	BRA TP2.9		;GO HANDLE IT
	MOVLW D'12'		;LOOK FOR T2 START TIME GP 2 
	CPFSGT IARGL,1		;GO ON IF > 12
	BRA TP2.STR		;GO HANDLE IT
	MOVLW D'13'		;LAST VALID T2 CNT & LS IGN GP2
	CPFSGT IARGL,1
	BRA TP2.GP2		; IGN GP2
	MOVLW D'17'		;LOOK FOR END T2 INTERVAL EVENT
	CPFSGT IARGL,1		;GO ON IF > 17
	BRA TP2.END		;GO HANDLE IT
TP2.X
			;NO ACTION T2 CNT SO EXIT
	RETURN
  ENDIF			;END OF 0xAB EVENT HANDLER


  IF (ENG==0xB1)	
;High list processing 41 - 58   

	MOVLW D'41'		;LOOK FOR LOW SPEED DWELL EVENT 39
	CPFSGT IARGL,1		;GO ON IF > 40
	BRA TP2.24		;GO HANDLE IT
	MOVLW D'43'		;LOOK FOR GP3 LS IGN 
	CPFSGT IARGL,1		;GO ON IF > 43
	BRA TP2.GP3		;GO HANDLE IT
	MOVLW D'48'		;LOOK FOR END OF T2 INTERVAL 
	CPFSGT IARGL,1		;GO ON IF > 47
	BRA TP2.END		;GO HANDLE IT
	MOVLW D'51'		;LOOK FOR LD TM0 W/ SD EVENT CYL 1 OR 6 GP 1   (CHANGED TO 50 10-03-06)
	CPFSGT IARGL,1		;GO ON IF > 51
	BRA TP2.36		;GO HANDLE IT
	MOVLW D'56'		;LOOK FOR LOW SPEED DWELL EVENT GP 1  
	CPFSGT IARGL,1		;GO ON IF > 55
	BRA TP2.39		;GO HANDLE IT
	MOVLW D'58'		;LOOK FOR GP4 LS IGN  & KILL STRF 
	CPFSGT IARGL,1		;GO ON IF > 58
	BRA TP2.GP4		;GO HANDLE IT
	RETURN
	
T2MID				;T2 = 20 - 40
	MOVLW D'21'		;LOOK FOR LD TM0 W/ SD EVENT CYL 4/7 GP 3 (CHANGED TO 21 06-17-10)
	CPFSGT IARGL,1		;GO ON IF > 21
	BRA TP2.6		;GO HANDLE IT
	MOVLW D'26'		; LOOK FOR LOW SPD DWELL GP3 4/7
	CPFSGT IARGL,1		;GO ON IF > 25
	BRA TP2.9		;GO HANDLE IT
	MOVLW D'28'		; & LS IGN GP2
	CPFSGT IARGL,1
	BRA TP2.GP2		; IGN GP2
	MOVLW D'33'		;LOOK FOR END T2
	CPFSGT IARGL,1		;GO ON IF > 32
	BRA TP2.END		;GO HANDLE IT
	MOVLW D'36'		;LOOK FOR LD TM0 W/ SD EVENT GP 4 2/3  (41);LOOK FOR END T2 INTERVAL EVENT (CHANGED TO 36 06-17-10)
	CPFSGT IARGL,1		;GO ON IF > 36
	BRA TP2.21		;GO HANDLE IT
	
	RETURN			;40 IS NO ACTION , OFF THE END

T2LOW			;1 - 20
	MOVLW 0x03		;LOOK FOR END OF TP2 INTERVAL
	CPFSGT IARGL,1		;GO ON IF > 2
	BRA TP2.END		;GO HANDLE IT
	MOVLW D'6'		;LOOK FOR LD TMRO W/SD EVENT GP2 5/8 (CHANGED TO 6 06-17-10) 
	CPFSGT IARGL,1		;GO ON IF > 6
	BRA TP2.51		;GO HANDLE IT
	MOVLW D'11'		;LOOK FOR LOW SPEED DWELL EVENT GP2 5/8
	CPFSGT IARGL,1		;GO ON IF > 10
	BRA TP2.54		;GO HANDLE IT
	MOVLW D'13'		;  LS IGN GP1
	CPFSGT IARGL,1
	BRA TP2.GP1		; IGN GP1
	MOVLW D'18'		;LOOK FOR END T2 INTERVAL EVENT
	CPFSGT IARGL,1		;GO ON IF > 17
	BRA TP2.END		;GO HANDLE IT
TP2.X
			;NO ACTION T2 CNT SO EXIT
	RETURN
  ENDIF   ;END OF 0xB1 EVENT HANDLER

;      ENG 0xAB & 0xB1  LS1 & LS2 V8 TP2 SUBROUTINES


TP2.STR		;START 30 DEG TIMING INTERVAL V8 
;	CPFSEQ IARGL,1		;COMPARE THE EVENT IN WREG TO T2CNT AND EXIT IF NOT EQUAL    TP2.STR NOW CALLED BY LS IGN ROUT WHICH CHECKED THIS ALREADY.  NOT NEEDED HERE. 03-27-13
;	RETURN		;WAS NOT EQUAL SO EXIT
	BCF T0CON,TMR0ON,0	;TURN TIMER OFF (IF IT WAS ON)  NOT NECESSARY
	BCF INTCON,TMR0IF,0	;CLR INT FLAG
	CLRF TMR0H,0
	CLRF TMR0L,0
	BSF T0CON,TMR0ON,0
	BSF ANF					;ADDED FOR TRIMAP OPTION
	BSF T2F				;TELL T2END WE HAD A VALID START
	RETURN 		;callable routine, regular return, no update of registers

TP2.51				;LOAD TIMER 0 W/ SPARK DELAY FOR GP 1 (# 4-3)	 AB v8 OK
	CPFSEQ IARGL,1		;COMPARE THE EVENT IN WREG TO T2CNT AND EXIT IF NOT EQUAL
	RETURN		;WAS NOT EQUAL SO EXIT
	BTFSS VT		;VALID TIMING?
	RETURN		;EXIT IF NOT

	MOVFF SDH,TMR0H
	MOVFF SDL,TMR0L		;LOAD TMR0 WITH SPARK DELAY 16 BIT

	BSF R1F			;SET ROTOR 1 (GP1) FLAG FOR TIMER 0 INT ROUT.
	BCF R2F			; CLEAR THE OTHER ON JUST TO BE SURE
	BCF R3F
	BCF R4F
	BSF T0CON,TMR0ON,0
	RETURN

TP2.6			;LOAD TIMER 0 W/ SPARK DELAY FOR GP 2 (# 5 & 8)	AB  v8 OK
	CPFSEQ IARGL,1		;COMPARE THE EVENT IN WREG TO T2CNT AND EXIT IF NOT EQUAL
	RETURN		;WAS NOT EQUAL TO TARGET SO EXIT
	BTFSS VT		;VALID TIMING?
	RETURN		;EXIT IF NOT
	MOVFF SDH,TMR0H
	MOVFF SDL,TMR0L		;LOAD TMR0 WITH SPARK DELAY
	BSF T0CON,TMR0ON,0
	BCF R1F			;SET R2F (GP2) FLAG FOR TIMER 0 INT ROUT.
	BSF R2F			; CLEAR THE OTHERS JUST TO BE SURE
	BCF R3F
	BCF R4F
	RETURN

TP2.21					;LOAD TIMER 0 W/ SPARK DELAY FOR GP 3 (# 4-7)	AB  v8 OK
	CPFSEQ IARGL,1		;COMPARE THE EVENT IN WREG TO T2CNT AND EXIT IF NOT EQUAL
	RETURN		;WAS NOT EQUAL SO EXIT
	BTFSS VT		;VALID TIMING?
	RETURN		;EXIT IF NOT
	MOVFF SDH,TMR0H
	MOVFF SDL,TMR0L		;LOAD TMR0 WITH SPARK DELAY 16 BIT
	BSF T0CON,TMR0ON,0
	BCF R1F			;SET ROTOR 1 (GP1) FLAG FOR TIMER 0 INT ROUT.
	BCF R2F			; CLEAR THE OTHER ON JUST TO BE SURE
	BSF R3F
	BCF R4F
	RETURN

TP2.36					;LOAD TIMER 0 W/ SPARK DELAY FOR GP 4 (# 2-3)	AB  v8 OK
	CPFSEQ IARGL,1		;COMPARE THE EVENT IN WREG TO T2CNT AND EXIT IF NOT EQUAL
	RETURN		;WAS NOT EQUAL SO EXIT
	BTFSS VT		;VALID TIMING?
	RETURN		;EXIT IF NOT
	MOVFF SDH,TMR0H
	MOVFF SDL,TMR0L		;LOAD TMR0 WITH SPARK DELAY
	BSF T0CON,TMR0ON,0
	BCF R1F			;SET ROTOR 1 (GP1) FLAG FOR TIMER 0 INT ROUT.
	BCF R2F			; CLEAR THE OTHER ON JUST TO BE SURE
	BCF R3F
	BSF R4F
	RETURN
	
TP2.54				; LOW SPEED DWELL EVENT : #1/6 GP 1   V8 OK
	CPFSEQ IARGL,1		;COMPARE THE EVENT IN WREG TO T2CNT AND EXIT IF NOT EQUAL
	RETURN		;WAS NOT EQUAL SO EXIT
	BTFSS VT		;TEST FOR VALID TIMING  
	RETURN		;
	BTFSC LSF		;TEST FOR LOW SPEED DWELL FLAG
	BSF FC1		;TURN COIL GP1 ON
	BTFSS DDF
	RETURN
	BSF FC1
	BCF DDF
	RETURN

TP2.9			;LOW SPEED DWELL EVENT # 5/8 GP 2  LS1 V8 WAS 57
	CPFSEQ IARGL,1		;COMPARE THE EVENT IN WREG TO T2CNT AND EXIT IF NOT EQUAL
	RETURN		;WAS NOT EQUAL SO EXIT
	BTFSS VT		;TEST FOR VALID TIMING  
	RETURN
	BTFSC LSF		;TEST FOR LOW SPEED DWELL FLAG
	BSF FC2			;TURN GP 2 COIL ON
	BTFSS DDF
	RETURN
	BSF FC2
	BCF DDF
	RETURN

TP2.24			;LOW SPEED DWELL EVENT # 4/7 GP 3   LS1 V8 OK
	CPFSEQ IARGL,1		;COMPARE THE EVENT IN WREG TO T2CNT AND EXIT IF NOT EQUAL
	RETURN		;WAS NOT EQUAL SO EXIT
	BTFSS VT		;TEST FOR VALID TIMING  
	RETURN		;  "
	BTFSC LSF		;TEST FOR LOW SPEED DWELL FLAG
	BSF FC3			;TURN GP 2 COIL ON
	BTFSS DDF
	RETURN
	BSF FC3
	BCF DDF
	RETURN

TP2.39			;LOW SPEED DWELL EVENT # 2/3 GP 4   LS1 V8 OK
	CPFSEQ IARGL,1		;COMPARE THE EVENT IN WREG TO T2CNT AND EXIT IF NOT EQUAL
	RETURN		;WAS NOT EQUAL SO EXIT
	BTFSS VT		;TEST FOR VALID TIMING  
	RETURN		;  "
	BTFSC LSF		;TEST FOR LOW SPEED DWELL FLAG
	BSF FC4			;TURN GP 2 COIL ON
	BTFSS DDF
	RETURN
	BSF FC4
	BCF DDF
	RETURN

TP2.GP1				;LOW SPEED IGN GP1
	CPFSEQ IARGL,1		;COMPARE THE EVENT IN WREG TO T2CNT AND EXIT IF NOT EQUAL
	RETURN		;WAS NOT EQUAL SO EXIT
  IF ENG == 0xAB       ;
  	BCF STRF
  ENDIF	
	BTFSC T0CON,TMR0ON,0		;THIS T2 EVENT MAY HAPPEN BEFORE PREVIOUS TMR0 SPDC IS COMPLETED SO WE NEED TO CHECK FOR THIS.  DO THE ROUT THAT TMROINT WOULD NORMALLY HANDLE
	BRA TM02.1
	BCF FC1				;T0 EVENT WAS COMPLETED SO HANDLE NORMALLY
  	BRA TP2.STR			;
	RETURN
TM02.1
	CALL TP2.STR
	bcf FC1		;fire GP 1 COILS   (V8 1 & 6) 
	bcf R1F			;CLEAR THE FLAG   
	MOVFF DWL,LP1D		;load lead plug 1 dwell count
	MOVFF DWLH,LP1DH
	BTG ALT
	BTFSC ALT		;ALTERNATE BANK FLAG
	BRA TM02.1C		;FIR ALT FI GP (3) IF ALT SET 

;   **** REV LIMIT  ****
	BTFSC REVF		;TEST REV LIMIT FLAG
	RETURN		;SKIP INJECTION CYCLE  (LABLE WILL VARY WITH ENGINE)

;	**** REV LIMIT  ****

	BSF FI1		;FIRE GP1 INJECTORS  (INJ 5 & 6 ON V8)
	MOVFF IPW1L,R1ITL		;LOAD GP1 IPW TIMER WITH IPW (USE UN-ADJUSTED IPWL&H)BECAUSE NOT USE DIFFERENTIAL ADJUSTMENTS 
	MOVFF IPW1H,R1ITH
	BSF INJ1		;SET DECREMENT FLAG FOR TIMER 2 ROUT
	RETURN
TM02.1C
;   **** REV LIMIT  ****
	BTFSC REVF		;TEST REV LIMIT FLAG
	RETURN		;SKIP INJECTION CYCLE  (LABLE WILL VARY WITH ENGINE)
;	**** REV LIMIT  ****
	BSF FI3		;FIRE GP 3 INJECTOR  (1 & 8 ON V8)
	MOVFF IPW1L,R3ITL	;LOAD ROTOR 2 IPW TIMER WITH IPW
	MOVFF IPW1H,R3ITH
	BSF INJ3		;SET DECREMENT FLAG FOR TIMER 2 ROUTINE	
	RETURN			;done so return & RE-ENABLE INTS

TP2.GP2				;LOW SPEED IGN GP2
	CPFSEQ IARGL,1		;COMPARE THE EVENT IN WREG TO T2CNT AND EXIT IF NOT EQUAL
	RETURN		;WAS NOT EQUAL SO EXIT
	BTFSC T0CON,TMR0ON,0
	BRA TM02.2
	BCF FC2
	BRA TP2.STR
	RETURN
TM02.2
	CALL TP2.STR	
	bcf FC2		;fire GP 2 PLUGS  5 & 8 ON V8
	BCF R2F			;CLEAR THE FLAG
	movfF DWL,LP2D		;load lead plug dwell count
	MOVFF DWLH,LP2DH				;GP 2 ON V8  (5 & 8)
	RETURN			;done so return & ENABLE INTS


TP2.GP3				;LOW SPEED IGN GP3
	CPFSEQ IARGL,1		;COMPARE THE EVENT IN WREG TO T2CNT AND EXIT IF NOT EQUAL
	RETURN		;WAS NOT EQUAL SO EXIT
	BTFSC T0CON,TMR0ON,0
	BRA TM02.3
	BCF FC3
	BRA TP2.STR
	RETURN
TM02.3
	CALL TP2.STR	
	BCF FC3		;fire GP 3 plugs  (4 & 7 ON V8)
	BCF R3F			;CLEAR THE FLAG
	MOVFF DWL,LP3D		;load lead plug dwell count
	MOVFF DWLH,LP3DH					;GP 3 ON V6  (4 & 7)
	BTFSC ALT
	BRA TM02.3C		;ALT GP 4 IF SET
;   **** REV LIMIT  ****
	BTFSC REVF		;TEST REV LIMIT FLAG
	RETURN		;SKIP INJECTION CYCLE  (LABLE WILL VARY WITH ENGINE)
;	**** REV LIMIT  **** 
	BSF FI2		;FIRE GP 2 INJECTOR  (1 & 8 ON V8)
	MOVFF IPW1L,R2ITL	;LOAD ROTOR 2 IPW TIMER WITH IPW
	MOVFF IPW1H,R2ITH
	BSF INJ2		;SET DECREMENT FLAG FOR TIMER 2 ROUTINE	
	RETURN
TM02.3C
;   **** REV LIMIT  ****
	BTFSC REVF		;TEST REV LIMIT FLAG
	RETURN		;SKIP INJECTION CYCLE  (LABLE WILL VARY WITH ENGINE)
;	**** REV LIMIT  ****
	BSF FI4			; INJ GP 4 ON V8 CYL 3 & 4
	MOVFF IPW1L,R4ITL		;LOAD # 4 IPW TIMER WITH IPW (USE UN-ADJUSTED IPWL&H)		
	MOVFF IPW1H,R4ITH
	BSF INJ4		;SET DECREMENT FLAG FOR TIMER 2 ROUT
	RETURN
	
TP2.GP4				;LOW SPEED IGN GP4
	CPFSEQ IARGL,1		;COMPARE THE EVENT IN WREG TO T2CNT AND EXIT IF NOT EQUAL
	RETURN		;WAS NOT EQUAL SO EXIT
  IF (ENG == 0xB1)
  	BCF STRF
  ENDIF
  	BTFSC T0CON,TMR0ON,0
	BRA TM02.4	
	BCF FC4
	BRA TP2.STR
	RETURN
TM02.4		;GP 4 ROUTINE
	CALL TP2.STR
	bcf FC4			;fire GP 4 COILS )   (GP 4 2 & 3 ON V8) 
	bcf R4F			;CLEAR THE FLAG   
	movfF DWL,LP4D		;load lead plug 1 dwell count  180 DEGREE DWELL SCHEME
	MOVFF DWLH,LP4DH
	RETURN			;done so return & RE-ENABLE INTS

TP2.END		;  T2 INTERVAL TIME CAPTURE   ******* 
	CPFSEQ IARGL,1		;COMPARE THE EVENT IN WREG TO T2CNT AND EXIT IF NOT EQUAL
	RETURN		;WAS NOT EQUAL SO EXIT
	BCF T0CON,TMR0ON,0		;stop timer 0 by selecting external clock
	movFf TMR0L,TPL		;save timer 0 count (T2 interval)  mind barf?
	movFf TMR0H,TPH
	BTFSS T2F			;TEST FOR VALID T2STR
	RETURN
	BSF MF				
;ACCL START
TP2.0
	BCF T2F			;CLR IT SO TMR0 WILL NOT SEE IT
	BTFSS ACCF		;IS ACCF FLAG NOT SET, GO ON
	BRA TP2.0C
	DCFSNZ ACCNT,1,1		;DECREMENT ACCELERATION CTR (GIVES 1/2 SEC OF ACCL TIME @ 2000 RPM)
	BCF ACCF		;CLR IT IF TIME UP
TP2.0C
;ACCL END

;  *****************  ACL START
;NEW TRIMAP ADDITION FOR DWELL SPEEDUP PROBLEM

	MOVLW HIGH DWLSPD	;GET DWELL TRANSITION SPEED DSF
	CPFSLT TPH,1		;ENG SPEED LT?
	BRA TP2.0E			;GO SET DSF  & TEST FOR LSF
	BCF DSF
	BTFSC LSF
	BSF DDF
	BCF LSF				;ENG RPM > DSF SPEED
					
	
TP2.0D				;TEST FOR ACCELERATION
	MOVFF TPLOLD,IARGL
	MOVFF TPHOLD,IARGH
	MOVF TPL,0,1
	SUBWF IARGL,1,1
	MOVF TPH,0,1
	SUBWFB IARGH,1,1
	BTFSS _C			;IS NEW RPM > OLD?  IF CY SET, NEW TPH < OLD SO TEST FOR ACCL
	BRA TP2.0X			;NO ACCL SO EXIT
	
 	MOVLW 0	;HIGH ACTHRESH	;TEST FOR RPM  > START OF MAP ADV RPM THRESHOLDMSB CONST	< CONSTANT
 	CPFSLT IARGH,1		;COMPARE DELTA TO THRESH
 	BRA	TP2.CEQ				;MSB NOT LT SO CK FOR EQ
 	BRA TP2.0X			;FALSE EXIT, DELTA < THRESH
TP2.CEQ 	
 	CPFSEQ IARGH,1		;COMP VAR MSB FOR = CONST MSB
 	BRA TP2.AC1  		;TRUE EXIT, DELTA IS > THRESHVAR !LT CONST   .VB
 	MOVLW D'32'		;LOW ACTHRESH 			;MSB WAS = SO TEST LSB CONSTANT
 	CPFSLT IARGL,1			;COMPARE LSB CONST TO LSB VAR
 	BRA TP2.AC1				;TRUE EXIT DELTA >= THRESH
TP2.0X
 	RETURN					;FALSE EXIT,  DELTA < THRESH
TP2.AC1
	MOVLW 0x1F
	ANDWF IARGL,1
   	BCF _C
   	RRCF IARGH,1,1			;DIV DELTA BY 32
   	RRCF IARGL,1,1
   	RRCF IARGH,1,1
   	RRCF IARGL,1,1
   	RRCF IARGH,1,1
   	RRCF IARGL,1,1
   	RRCF IARGH,1,1
   	RRCF IARGL,1,1
   	RRCF IARGH,1,1
   	RRCF IARGL,1,1
 
  	MOVLW D'6'			;BUMP IT FOR EMPIRICAL VALUE  (THIS IS ABOUT 2 MS
   	ADDWF IARGL,1,1
   	   	
;************  16 BIT DWELL START
   	MOVF IARGL,0,1		;GET DWL DELTA IN WREG
   	MOVF LP1DH,1,1		;TEST MSB FOR ACTIVE
   	BNZ TP2.ACA			;ACTIVE, SO GO HANDLE
   	MOVF LP1D,1,1		;TEST LPD1 FOR ACTIVE
   	BZ TP2.AC2			;GO TO NEXT DWELL IF NOT ACTIVE	
TP2.ACA
   	SUBWF LP1D,0,1		;SUB DELTA FROM COUNT
   	BNC TP2.AC1A			;IF NEGATIVE, TIME TO TURN IT ON IF NO MSB
	BTFSC STATUS,Z,0	;NOT NEGATIVE SO test for zero
	BRA TP2.AC1C		;HANDLE ZERO CASE , TEST FOR POSSIBLE MSB
   	MOVWF LP1D,1		;UPDATE LPD1
   	BRA TP2.AC2			;GO CK ROTOR 2
TP2.AC1A
	MOVF LP1DH,1,1		;TEST MSB
	BZ TP2.AC1B			;HANDLE 0 TIME OUT
	DECF LP1DH,1,1		;UPDATE MSB
	MOVWF LP1D,1			;UPDATE LSB
	BRA TP2.AC2			;NO TIMEOUT SO GO CK ROTOR 2
TP2.AC1B
   	BSF FC1				;HAD BORROW OR WAS ZERO SO TURN ON NOW
   	CLRF LP1D
   	CLRF LP1DH
   	BRA TP2.AC2
TP2.AC1C				;ZERO LSB COUNT
	MOVF LP1DH,1,1		;TEST MSB
	BZ TP2.AC1B			;IF TOTAL COUNT = 0 THEN TIME FOR DWELL OTHERWISE GO ON WITH NEXT ROTOR
	
TP2.AC2												;TEST DWELL FOR ROTOR 2
   	MOVF IARGL,0,1		;GET DWL DELTA IN WREG
   	MOVF LP2DH,1,1		;TEST MSB FOR ACTIVE
   	BNZ TP2.ACA2			;ACTIVE, SO GO HANDLE
   	MOVF LP2D,1,1		;TEST LPD1 FOR ACTIVE
   	BZ TP2.AC22			;GO TO NEXT DWELL IF NOT ACTIVE	
TP2.ACA2
   	SUBWF LP2D,0,1		;SUB DELTA FROM COUNT
   	BNC TP2.AC1A2			;IF NEGATIVE, TIME TO TURN IT ON IF NO MSB
	BTFSC STATUS,Z,0	;NOT NEGATIVE SO test for zero
	BRA TP2.AC1C2		;HANDLE ZERO CASE , TEST FOR POSSIBLE MSB
   	MOVWF LP2D,1		;UPDATE LPD1
   	BRA TP2.AC22			;GO CK ROTOR 2
TP2.AC1A2
	MOVF LP2DH,1,1		;TEST MSB
	BZ TP2.AC1B2			;HANDLE 0 TIME OUT
	DECF LP2DH,1,1		;UPDATE MSB
	MOVWF LP2D,1			;UPDATE LSB
	BRA TP2.AC22			;NO TIMEOUT SO GO CK ROTOR 3
TP2.AC1B2
   	BSF FC2				;HAD BORROW OR WAS ZERO SO TURN ON NOW
   	CLRF LP2D
   	CLRF LP2DH
   	BRA TP2.AC22
TP2.AC1C2				;ZERO LSB COUNT
	MOVF LP2DH,1,1		;TEST MSB
	BZ TP2.AC1B2			;IF TOTAL COUNT = 0 THEN TIME FOR DWELL OTHERWISE GO ON WITH NEXT ROTOR
	
TP2.AC22												;TEST DWELL FOR ROTOR 2
   	MOVF IARGL,0,1		;GET DWL DELTA IN WREG
   	MOVF LP3DH,1,1		;TEST MSB FOR ACTIVE
   	BNZ TP2.ACA3			;ACTIVE, SO GO HANDLE
   	MOVF LP3D,1,1		;TEST LPD1 FOR ACTIVE
   	BZ TP2.AC23			;GO TO NEXT DWELL IF NOT ACTIVE	
TP2.ACA3
   	SUBWF LP3D,0,1		;SUB DELTA FROM COUNT
   	BNC TP2.AC1A3			;IF NEGATIVE, TIME TO TURN IT ON IF NO MSB
	BTFSC STATUS,Z,0	;NOT NEGATIVE SO test for zero
	BRA TP2.AC1C3		;HANDLE ZERO CASE , TEST FOR POSSIBLE MSB
   	MOVWF LP3D,1		;UPDATE LPD1
   	BRA TP2.AC23			;GO CK ROTOR 2
TP2.AC1A3
	MOVF LP3DH,1,1		;TEST MSB
	BZ TP2.AC1B3			;HANDLE 0 TIME OUT
	DECF LP3DH,1,1		;UPDATE MSB
	MOVWF LP3D,1			;UPDATE LSB
	BRA TP2.AC23			;NO TIMEOUT SO GO CK ROTOR 2
TP2.AC1B3
   	BSF FC3				;HAD BORROW OR WAS ZERO SO TURN ON NOW
   	CLRF LP3D
   	CLRF LP3DH
   	BRA TP2.AC23
TP2.AC1C3				;ZERO LSB COUNT
	MOVF LP3DH,1,1		;TEST MSB
	BZ TP2.AC1B3			;IF TOTAL COUNT = 0 THEN TIME FOR DWELL OTHERWISE GO ON WITH NEXT ROTOR
	
TP2.AC23												;TEST DWELL FOR ROTOR 4
   	MOVF IARGL,0,1		;GET DWL DELTA IN WREG
   	MOVF LP4DH,1,1		;TEST MSB FOR ACTIVE
   	BNZ TP2.ACA4			;ACTIVE, SO GO HANDLE
   	MOVF LP4D,1,1		;TEST LPD1 FOR ACTIVE
   	BZ TP2.AC24			;GO TO NEXT DWELL IF NOT ACTIVE	
TP2.ACA4
   	SUBWF LP4D,0,1		;SUB DELTA FROM COUNT
   	BNC TP2.AC1A4			;IF NEGATIVE, TIME TO TURN IT ON IF NO MSB
	BTFSC STATUS,Z,0	;NOT NEGATIVE SO test for zero
	BRA TP2.AC1C4		;HANDLE ZERO CASE , TEST FOR POSSIBLE MSB
   	MOVWF LP4D,1		;UPDATE LPD1
   	BRA TP2.AC24			;GO CK ROTOR 2
TP2.AC1A4
	MOVF LP4DH,1,1		;TEST MSB
	BZ TP2.AC1B4			;HANDLE 0 TIME OUT
	DECF LP4DH,1,1		;UPDATE MSB
	MOVWF LP4D,1			;UPDATE LSB
	BRA TP2.AC24			;NO TIMEOUT SO GO CK ROTOR 2
TP2.AC1B4
   	BSF FC4				;HAD BORROW OR WAS ZERO SO TURN ON NOW
   	CLRF LP4D
   	CLRF LP4DH
   	BRA TP2.AC24
TP2.AC1C4				;ZERO LSB COUNT
	MOVF LP4DH,1,1		;TEST MSB
	BZ TP2.AC1B4			;IF TOTAL COUNT = 0 THEN TIME FOR DWELL OTHERWISE GO ON WITH NEXT ROTOR
TP2.AC24												;DONE
	RETURN	
;*************  16 BIT DWELL END	
TP2.0E
	BSF DSF
	MOVLW HIGH MAPRPMSTR		;THE LSF CONSTANT
	CPFSLT TPH,1
	BRA TP2.0F		;GO SET LSF
	BTFSC LSF
	BSF DDF
	BTFSC LSF
	BSF DDF
	BCF LSF
	BRA TP2.0D		;RPM BETWEEN LSF ANF DSF POINT.  GO TEST FOR RPM ACCELERATION
TP2.0F
	BSF LSF			;RPM < LSF POINT, HARDWARE DWELL SO NO CK FOR ACL NEEDED
	RETURN

; ***************  ACL END

 ENDIF    ;END OF 0xAB/B1  LS1/LS2 V8

;*****************
 IF (ENG==0xB5)		;FORD 3.8 V6 / SUBE 2.7  (Backup sensor at 180 degrees)
TP2INT
	BCF _C			;DIVIDE SYNCL&H BY 2;TEST FOR SYNC INTERVAL
	RRCF SYNCH,0,1		; 
	MOVWF IARGH,1	;SAVE IT
	RRCF SYNCL,0,1		;GET LSB OF NEW/2 TO WREG
	SUBWF TOLDL,0,1		;SUB LSB
	MOVF IARGH,0,1		;GET NEW T2 MSB/2
	SUBWFB TOLDH,0,1		;SUB MSB
	BTFSC _C		;TEST FOR BORROW  IF NEW/2 >TOLD THEN WE HAVE SYNC DETECT
	BRA TP2.00		;NO BORROW SO NO SYNC DET, GO ON WITHOUT SETTING SYNC & NO PROCESS OF T2 LIST
	BSF SYNF		;HAD BORROW SO GO SET SYNC DET (SYNF) NOW PROCESS T2 EVENT
    BTFSC CAF   	;ARE WE A OR B?
	BRA TP2.0B
	BTFSS BUSIN		;BACKUP SENSOR?
	BRA TP2.0B
TP2.BU				;WE ARE B,  OFFSET T2 CNT FOR B CONTROLLER WITH BU SENSOR
	MOVLW D'30'			;LOAD 180 DEG OFFSET
	MOVWF T2CNT,1
	BRA TP2.00
TP2.0B
	CLRF T2CNT,1		;SET T2CNT TO 0
TP2.00
	MOVFF SYNCL,TOLDL	; save LATEST SYNC counT IN TOLDL&H
	MOVFF SYNCH,TOLDH
	CLRF SYNCL,1		;CLEAR SYNC REG FOR NEXT CAPTURE CYCLE
	CLRF SYNCH,1
		
	MOVLW D'33'		;LOAD DEAD TIME CTR (38.25 ms)   25.2 MS IS T2 SYNC GAP @ 120 RPM PSV  *********
	MOVWF DTCL,1
	BTFSS SYNF		; DO WE HAVE SYNC?
	RETURN		;EXIT IF NOT

TP2.A			;new   A CONTROLLER T2 EVENT HANDLER
	INCF T2CNT,1,1		;INC T2 COUNT  WE HAVE SYNC SO START COUNTING T2	
	MOVFF T2CNT,IARGL
	BTFSC CAF
	BRA TP2.A0		;A CONTROLLER SO SKIP T2CNT OFFSET
	MOVLW D'59'		;WE WILL ALLOW COUNTS OF UP TO 60 IN TP2 PROCESSOR SO THAT BACKUP WILL WORK
	CPFSGT IARGL,1
	BRA TP2.A0		;NOT PAST 60 SO GO ON
					;SUBTRACT OFFSET FROM COUNT 
	CLRF T2CNT,1	; ON COUNT 60, RESET TO 0 SO BACKUP WILL WORK.   
	RETURN
TP2.A0
	MOVLW D'20'		;SEPARATE TESTS INTO THREE GROUPS, LOW, MID & HIGH
	CPFSGT IARGL,1		;T2 <20?
	BRA T2LOW		;GO TEST LOW GP 1 - 19
	MOVLW D'40'		;TEST FOR MIDRANGE 20 - 40
	CPFSGT IARGL,1
	BRA T2MID

;High list processing 41 - 58  
	MOVLW D'44'		;LOOK FOR LD TM0 W/ SD EVENT GP 3      LOOK FOR T2 START TIME
	CPFSGT IARGL,1		;GO ON IF > 43
	BRA TP2.43		;GO HANDLE IT
	MOVLW D'49'		;LOOK FOR LOW SPEED DWELL EVENT GP3  was 47
	CPFSGT IARGL,1		;GO ON IF > 47
	BRA TP2.47		;GO HANDLE IT
	MOVLW D'51'		;LOOK FOR LS IGN GP 3                  
	CPFSGT IARGL,1		;GO ON IF > 47
	BRA TP2.GP3		;GO HANDLE IT
	MOVLW D'55'		;KILL STRF TIME   now 55 09-01-10
	CPFSGT IARGL,1		;GO ON IF > 57
	BRA TP2.57		;KILL IT	
	MOVLW D'56'		;   (CHANGED TO 56 09-01-10)
	CPFSGT IARGL,1		;GO ON IF > 51
	BRA TP2.STR		;LOOK FOR T2 START TIME     GO HANDLE IT
;	MOVLW D'58'		;LOOK FOR END OF T2 INTERVAL       WAS 54  moved to 01
;	CPFSGT IARGL,1		;GO ON IF > 58
;	BRA TP2.END		;GO HANDLE IT
	RETURN
	
T2MID				;T2 = 21 - 40
	MOVLW D'24'		;LOOK FOR LD TM0 W/ SD EVENT GP 2
	CPFSGT IARGL,1		;GO ON IF > 23
	BRA TP2.23		;GO HANDLE IT
	MOVLW D'29'		;LOOK FOR LOW SPEED DWELL EVENT GP2  was 27
	CPFSGT IARGL,1		;GO ON IF > 27
	BRA TP2.27		;GO HANDLE IT
	MOVLW D'31'		; LOOK FOR LOW SPD ign GP2
	CPFSGT IARGL,1		;GO ON IF > 31
	BRA TP2.GP2		;GO HANDLE IT
	MOVLW D'35'		;LOOK FOR T2 START TIME GP 1   was 33
	CPFSGT IARGL,1		;GO ON IF > 35
	BRA TP2.STR		;GO HANDLE IT
	MOVLW D'40'		;T2 END TIME?
	CPFSGT IARGL,1
	BRA TP2.END		; IGN GP3
	RETURN			; IS NO ACTION , OFF THE END

T2LOW			;1 - 20
	MOVLW D'01'		;LOOK FOR END OF T2 INTERVAL       WAS 54  moved to 01
	CPFSGT IARGL,1		;GO ON IF > 58
	BRA TP2.END		;GO HANDLE IT
	MOVLW D'4'		;LOOK FOR LD TMRO W/SD EVENT GP1  was 3
	CPFSGT IARGL,1		;GO ON IF > 3
	BRA TP2.3		;GO HANDLE IT
	MOVLW D'9'		;LOOK FOR LOW SPEED DWELL EVENT GP1
	CPFSGT IARGL,1		;GO ON IF > 7
	BRA TP2.7		;GO HANDLE IT
	MOVLW D'11'		; LS IGN GP1
	CPFSGT IARGL,1
	BRA TP2.GP1		; LS IGN GP1
	MOVLW D'15'		;LOOK FOR T2 START TIME GP 2 
	CPFSGT IARGL,1		;GO ON IF > 12
	BRA TP2.STR		;GO HANDLE IT
	MOVLW D'20'		;LOOK FOR END T2 INTERVAL EVENT
	CPFSGT IARGL,1		;GO ON IF > 17
	BRA TP2.END		;GO HANDLE IT
TP2.X
			;NO ACTION T2 CNT SO EXIT
	RETURN
				;END OF 0xb5/b6 EVENT HANDLER 

TP2.END		;  T2 INTERVAL TIME CAPTURE   ******* 
	CPFSEQ IARGL,1		;COMPARE THE EVENT IN WREG TO T2CNT AND EXIT IF NOT EQUAL
	RETURN		;WAS NOT EQUAL SO EXIT
	BCF T0CON,TMR0ON,0		;stop timer 0 by selecting external clock
	movFf TMR0L,TPL		;save timer 0 count (T2 interval)  mind barf?
	movFf TMR0H,TPH
	BTFSS T2F			;TEST FOR VALID T2STR
	RETURN
	BSF MF				
;ACCL START
TP2.0
	BCF T2F			;CLR IT SO TMR0 WILL NOT SEE IT
	BTFSS ACCF		;IS ACCF FLAG NOT SET, GO ON
	BRA TP2.0C
	DCFSNZ ACCNT,1,1		;DECREMENT ACCELERATION CTR (GIVES 1/2 SEC OF ACCL TIME @ 2000 RPM)
	BCF ACCF		;CLR IT IF TIME UP
TP2.0C
;ACCL END

;  *****************  ACL START
;NEW TRIMAP ADDITION FOR DWELL SPEEDUP PROBLEM
	MOVLW HIGH DWLSPD	;GET DWELL TRANSITION SPEED DSF
	CPFSLT TPH,1		;ENG SPEED LT?
	BRA TP2.0E			;GO SET DSF  & TEST FOR LSF
	BCF DSF
	BTFSC LSF
	BSF DDF
	BCF LSF				;ENG RPM > DSF SPEED				
	
TP2.0D				;TEST FOR ACCELERATION
	MOVFF TPLOLD,IARGL
	MOVFF TPHOLD,IARGH
	MOVF TPL,0,1
	SUBWF IARGL,1,1
	MOVF TPH,0,1
	SUBWFB IARGH,1,1
	BTFSS _C			;IS NEW RPM > OLD?  IF CY SET, NEW TPH < OLD SO TEST FOR ACCL
	BRA TP2.0X			;NO ACCL SO EXIT
	
 	MOVLW 0	;HIGH ACTHRESH	;TEST FOR RPM  > START OF MAP ADV RPM THRESHOLDMSB CONST	< CONSTANT
 	CPFSLT IARGH,1		;COMPARE DELTA TO THRESH
 	BRA	TP2.CEQ				;MSB NOT LT SO CK FOR EQ
 	BRA TP2.0X			;FALSE EXIT, DELTA < THRESH
TP2.CEQ 	
 	CPFSEQ IARGH,1		;COMP VAR MSB FOR = CONST MSB
 	BRA TP2.AC1  		;TRUE EXIT, DELTA IS > THRESHVAR !LT CONST   .VB
 	MOVLW D'32'		;LOW ACTHRESH 			;MSB WAS = SO TEST LSB CONSTANT
 	CPFSLT IARGL,1			;COMPARE LSB CONST TO LSB VAR
 	BRA TP2.AC1				;TRUE EXIT DELTA >= THRESH
TP2.0X
 	RETURN					;FALSE EXIT,  DELTA < THRESH
TP2.AC1
	MOVLW 0x1F
	ANDWF IARGL,1
   	BCF _C
   	RRCF IARGH,1,1			;DIV DELTA BY 32
   	RRCF IARGL,1,1
   	RRCF IARGH,1,1
   	RRCF IARGL,1,1
   	RRCF IARGH,1,1
   	RRCF IARGL,1,1
   	RRCF IARGH,1,1
   	RRCF IARGL,1,1
   	RRCF IARGH,1,1
   	RRCF IARGL,1,1
 
  	MOVLW D'6'			;BUMP IT FOR EMPIRICAL VALUE  (THIS IS ABOUT 2 MS
   	ADDWF IARGL,1,1
   	   	
;************  16 BIT DWELL START
   	MOVF IARGL,0,1		;GET DWL DELTA IN WREG
   	MOVF LP1DH,1,1		;TEST MSB FOR ACTIVE
   	BNZ TP2.ACA			;ACTIVE, SO GO HANDLE
   	MOVF LP1D,1,1		;TEST LPD1 FOR ACTIVE
   	BZ TP2.AC2			;GO TO NEXT DWELL IF NOT ACTIVE	
TP2.ACA
   	SUBWF LP1D,0,1		;SUB DELTA FROM COUNT
   	BNC TP2.AC1A			;IF NEGATIVE, TIME TO TURN IT ON IF NO MSB
	BTFSC STATUS,Z,0	;NOT NEGATIVE SO test for zero
	BRA TP2.AC1C		;HANDLE ZERO CASE , TEST FOR POSSIBLE MSB
   	MOVWF LP1D,1		;UPDATE LPD1
   	BRA TP2.AC2			;GO CK ROTOR 2
TP2.AC1A
	MOVF LP1DH,1,1		;TEST MSB
	BZ TP2.AC1B			;HANDLE 0 TIME OUT
	DECF LP1DH,1,1		;UPDATE MSB
	MOVWF LP1D,1			;UPDATE LSB
	BRA TP2.AC2			;NO TIMEOUT SO GO CK ROTOR 2
TP2.AC1B
   	BSF FC1				;HAD BORROW OR WAS ZERO SO TURN ON NOW
   	BSF FC4
   	CLRF LP1D
   	CLRF LP1DH
   	BRA TP2.AC2
TP2.AC1C				;ZERO LSB COUNT
	MOVF LP1DH,1,1		;TEST MSB
	BZ TP2.AC1B			;IF TOTAL COUNT = 0 THEN TIME FOR DWELL OTHERWISE GO ON WITH NEXT ROTOR
	
TP2.AC2												;TEST DWELL FOR ROTOR 2
   	MOVF IARGL,0,1		;GET DWL DELTA IN WREG
   	MOVF LP2DH,1,1		;TEST MSB FOR ACTIVE
   	BNZ TP2.ACA2			;ACTIVE, SO GO HANDLE
   	MOVF LP2D,1,1		;TEST LPD1 FOR ACTIVE
   	BZ TP2.AC22			;GO TO NEXT DWELL IF NOT ACTIVE	
TP2.ACA2
   	SUBWF LP2D,0,1		;SUB DELTA FROM COUNT
   	BNC TP2.AC1A2			;IF NEGATIVE, TIME TO TURN IT ON IF NO MSB
	BTFSC STATUS,Z,0	;NOT NEGATIVE SO test for zero
	BRA TP2.AC1C2		;HANDLE ZERO CASE , TEST FOR POSSIBLE MSB
   	MOVWF LP2D,1		;UPDATE LPD1
   	BRA TP2.AC22			;GO CK ROTOR 2
TP2.AC1A2
	MOVF LP2DH,1,1		;TEST MSB
	BZ TP2.AC1B2			;HANDLE 0 TIME OUT
	DECF LP2DH,1,1		;UPDATE MSB
	MOVWF LP2D,1			;UPDATE LSB
	BRA TP2.AC22			;NO TIMEOUT SO GO CK ROTOR 3
TP2.AC1B2
   	BSF FC2				;HAD BORROW OR WAS ZERO SO TURN ON NOW
   	BSF FC5
   	CLRF LP2D
   	CLRF LP2DH
   	BRA TP2.AC22
TP2.AC1C2				;ZERO LSB COUNT
	MOVF LP2DH,1,1		;TEST MSB
	BZ TP2.AC1B2			;IF TOTAL COUNT = 0 THEN TIME FOR DWELL OTHERWISE GO ON WITH NEXT ROTOR
	
TP2.AC22												;TEST DWELL FOR ROTOR 2
   	MOVF IARGL,0,1		;GET DWL DELTA IN WREG
   	MOVF LP3DH,1,1		;TEST MSB FOR ACTIVE
   	BNZ TP2.ACA3			;ACTIVE, SO GO HANDLE
   	MOVF LP3D,1,1		;TEST LPD1 FOR ACTIVE
   	BNZ TP2.ACA3			;HANDLE  DWELL IF ACTIVE, ELSE, EXIT	
   	RETURN
TP2.ACA3
   	SUBWF LP3D,0,1		;SUB DELTA FROM COUNT
   	BNC TP2.AC1A3			;IF NEGATIVE, TIME TO TURN IT ON IF NO MSB
	BTFSC STATUS,Z,0	;NOT NEGATIVE SO test for zero
	BRA TP2.AC1C3		;HANDLE ZERO CASE , TEST FOR POSSIBLE MSB
   	MOVWF LP3D,1		;UPDATE LPD1
   	RETURN				;DONEBRA TP2.AC23			;GO CK ROTOR 2
TP2.AC1A3
	MOVF LP3DH,1,1		;TEST MSB
	BZ TP2.AC1B3			;HANDLE 0 TIME OUT
	DECF LP3DH,1,1		;UPDATE MSB
	MOVWF LP3D,1			;UPDATE LSB
	RETURN				;WE ARE DONE NOW  BRA TP2.AC23			;NO TIMEOUT SO GO CK ROTOR 2
TP2.AC1B3
   	BSF FC3				;HAD BORROW OR WAS ZERO SO TURN ON NOW
   	BSF FC6
   	CLRF LP3D
   	CLRF LP3DH
   	RETURN				;DONE BRA TP2.AC23
TP2.AC1C3				;ZERO LSB COUNT
	MOVF LP3DH,1,1		;TEST MSB
	BZ TP2.AC1B3			;IF TOTAL COUNT = 0 THEN TIME FOR DWELL OTHERWISE GO ON WITH NEXT ROTOR
	RETURN				;DONE
	
;  TP2.AC23												;TEST DWELL FOR ROTOR 4
	
TP2.0E
	BSF DSF
	MOVLW HIGH MAPRPMSTR		;THE LSF CONSTANT
	CPFSLT TPH,1
	BRA TP2.0F		;GO SET LSF
	BTFSC LSF
	BSF DDF
	BCF LSF
	BRA TP2.0D		;RPM BETWEEN LSF ANF DSF POINT.  GO TEST FOR RPM ACCELERATION
TP2.0F
	BSF LSF			;RPM < LSF POINT, HARDWARE DWELL SO NO CK FOR ACL NEEDED
	RETURN

; ***************  ACL END

TP2.STR		;START 30 DEG TIMING INTERVAL V8 
	CPFSEQ IARGL,1		;COMPARE THE EVENT IN WREG TO T2CNT AND EXIT IF NOT EQUAL
	RETURN		;WAS NOT EQUAL SO EXIT
	BCF T0CON,TMR0ON,0	;TURN TIMER OFF (IF IT WAS ON)  NOT NECESSARY
	CLRF TMR0H,0
	CLRF TMR0L,0
	BSF T0CON,TMR0ON,0
	BSF ANF					;ADDED FOR TRIMAP OPTION
	BSF T2F				;TELL T2END WE HAD A VALID START
	RETURN 		;callable routine, regular return, no update of registers

TP2.3				;LOAD TIMER 0 W/ SPARK DELAY FOR GP 1
	CPFSEQ IARGL,1		;COMPARE THE EVENT IN WREG TO T2CNT AND EXIT IF NOT EQUAL
	RETURN		;WAS NOT EQUAL SO EXIT
	BTFSS VT		;VALID TIMING?
	RETURN		;EXIT IF NOT
	MOVFF SDH,TMR0H
	MOVFF SDL,TMR0L		;LOAD TMR0 WITH SPARK DELAY 16 BIT
	BSF T0CON,TMR0ON,0
	BSF R1F			;SET ROTOR 1 (GP1) FLAG FOR TIMER 0 INT ROUT.
	BCF R2F			; CLEAR THE OTHER ON JUST TO BE SURE
	BCF R3F
	RETURN

TP2.23			;LOAD TIMER 0 W/ SPARK DELAY FOR GP 2
	CPFSEQ IARGL,1		;COMPARE THE EVENT IN WREG TO T2CNT AND EXIT IF NOT EQUAL
	RETURN		;WAS NOT EQUAL TO TARGET SO EXIT
	BTFSS VT		;VALID TIMING?
	RETURN		;EXIT IF NOT
	MOVFF SDH,TMR0H
	MOVFF SDL,TMR0L		;LOAD TMR0 WITH SPARK DELAY
	BSF T0CON,TMR0ON,0
	BCF R1F			;SET R2F (GP2) FLAG FOR TIMER 0 INT ROUT.
	BSF R2F			; CLEAR THE OTHERS JUST TO BE SURE
	BCF R3F
	RETURN

TP2.43					;LOAD TIMER 0 W/ SPARK DELAY FOR GP 3
	CPFSEQ IARGL,1		;COMPARE THE EVENT IN WREG TO T2CNT AND EXIT IF NOT EQUAL
	RETURN		;WAS NOT EQUAL SO EXIT
	BTFSS VT		;VALID TIMING?
	RETURN		;EXIT IF NOT
	MOVFF SDH,TMR0H
	MOVFF SDL,TMR0L		;LOAD TMR0 WITH SPARK DELAY 16 BIT
	BSF T0CON,TMR0ON,0
	BCF R1F			;SET ROTOR 1 (GP1) FLAG FOR TIMER 0 INT ROUT.
	BCF R2F			; CLEAR THE OTHER ON JUST TO BE SURE
	BSF R3F
	RETURN
	
TP2.7				; LOW SPEED DWELL EVENT : GP 1
	CPFSEQ IARGL,1		;COMPARE THE EVENT IN WREG TO T2CNT AND EXIT IF NOT EQUAL
	RETURN		;WAS NOT EQUAL SO EXIT
	BTFSS VT		;TEST FOR VALID TIMING  
	RETURN		;  "

	BTFSC LSF
	BRA TP2.7A
	BTFSS DDF
	RETURN
	BCF DDF
TP2.7A
	BSF FC1
	BSF FC4
	BCF DDF
	RETURN	
	
;	BTFSS LSF		;TEST FOR LOW SPEED DWELL FLAG
;	RETURN
;	BSF FC1		;TURN COIL GP1 ON
;	BSF FC4
;	RETURN

TP2.27			;LOW SPEED DWELL EVENT GP 2
	CPFSEQ IARGL,1		;COMPARE THE EVENT IN WREG TO T2CNT AND EXIT IF NOT EQUAL
	RETURN		;WAS NOT EQUAL SO EXIT
	BTFSS VT		;TEST FOR VALID TIMING  
	RETURN
	
	BTFSC LSF
	BRA TP2.27A
	BTFSS DDF
	RETURN
	BCF DDF
TP2.27A
	BSF FC2
	BSF FC5
	BCF DDF
	RETURN	
	
	
;	BTFSS LSF		;TEST FOR LOW SPEED DWELL FLAG
;	RETURN
;	BSF FC2			;TURN GP 2 COIL ON
;	BSF FC5
;	RETURN
	

TP2.47			;LOW SPEED DWELL EVENT #  GP 3
	CPFSEQ IARGL,1		;COMPARE THE EVENT IN WREG TO T2CNT AND EXIT IF NOT EQUAL
	RETURN		;WAS NOT EQUAL SO EXIT
	BTFSS VT		;TEST FOR VALID TIMING  
	RETURN		;  "
	
	BTFSC LSF
	BRA TP2.47A
	BTFSS DDF
	RETURN
	BCF DDF
TP2.47A
	BSF FC3
	BSF FC6
	BCF DDF
	RETURN	
	
	
;	BTFSS LSF		;TEST FOR LOW SPEED DWELL FLAG
;	RETURN
;	BSF FC3			;TURN GP 3 COIL ON
;	BSF FC6
;	RETURN

TP2.GP1				;LOW SPEED IGN GP1
	CPFSEQ IARGL,1		;COMPARE THE EVENT IN WREG TO T2CNT AND EXIT IF NOT EQUAL
	RETURN		;WAS NOT EQUAL SO EXIT
	BCF FC1
	BCF FC4
	RETURN

TP2.GP2				;LOW SPEED IGN GP2
	CPFSEQ IARGL,1		;COMPARE THE EVENT IN WREG TO T2CNT AND EXIT IF NOT EQUAL
	RETURN		;WAS NOT EQUAL SO EXIT
	BCF FC2
	BCF FC5
	RETURN

TP2.GP3				;LOW SPEED IGN GP3
	CPFSEQ IARGL,1		;COMPARE THE EVENT IN WREG TO T2CNT AND EXIT IF NOT EQUAL
	RETURN		;WAS NOT EQUAL SO EXIT
	BCF FC3
	BCF FC6
	RETURN
	
TP2.57
	BCF STRF
	RETURN
 ENDIF  ;**************    0xB5/6

 IF ENG==0xAC		;STRANGE EJ25 OF UNKNOWN VINTAGE * NOT USED!
TP2INT
	BTFSS SYNF		;TP1 #1 FOUND YET?
	BRA TP2.0B		;JUST EXIT & INC T2CNT IF NOT
	BRA TP2.T2		;T2 EVENT HANDLER
TP2.0B
	INCF T2CNT,1,1
	MOVLW D'55'		;LOAD DEAD TIME CTR (63.75 ms)	02-05-01
	MOVWF DTCL,1
	RETURN
TP2.T2	
	MOVLW D'55'		;LOAD DEAD TIME CTR (63.75 ms)	02-05-01
	MOVWF DTCL,1
			;T2 EVENT HANDLER FOR A & B CONTROLLER

	INCF T2CNT,1,1	;NEW	;INC T2 COUNT  WE HAVE SYNC SO START COUNTING T2
	MOVLW D'30'		;SEPARATE TESTS INTO TWO GROUPS, LOW & HIGH
	CPFSGT T2CNT,1		;T2 <31?
	BRA T2LOW		;GO TEST LOW GP 1 - 30
	MOVLW D'32'		;LOOK FOR #2 LOW SPEED DWELL EVENT     	OK
	CPFSGT T2CNT,1		;GO ON IF > 32
	BRA TP2.32		;GO HANDLE IT
	MOVLW D'34'		;LOOK FOR LATE #2 IGNITION       	OK
	CPFSGT T2CNT,1		;GO ON IF > 34
	BRA TP2.34		;GO HANDLE IT				
 	MOVLW D'35'		;LOOK FOR START T2 INTERVAL EVENT (35)	OK
	CPFSGT T2CNT,1		;GO ON IF > 35
	BRA TP2.START		;GO HANDLE IT
	MOVLW D'38'		;LOOK FOR END T2 EVENT			OK           
	CPFSGT T2CNT,1		;GO ON IF > 38
	BRA TP2.END		;GO HANDLE IT
	MOVLW D'46'		;LOOK FOR LD TM0 W/ SD EVENT #4 	OK
	CPFSGT T2CNT,1		;GO ON IF > 57
	BRA TP2.46		;GO HANDLE IT
	MOVLW D'47'		;LOW SPEED DWELL EVENT			OK
	CPFSGT T2CNT,1
	BRA TP2.47
	MOVLW D'48'		;LATE #4 FIRE     			OK
	CPFSGT T2CNT,1
	BRA TP2.48
	MOVLW D'49'		;START T2       			OK
	CPFSGT T2CNT,1
	BRA TP2.START
	MOVLW D'52'		;END T2         			OK
	CPFSGT T2CNT,1
	BRA TP2.END
	MOVLW D'60'		;LD TM0 W/ SD EVENT #1			OK
	CPFSGT T2CNT,1
	BRA TP2.60
	CLRF STAT0,1		;ERROR - CLEAR ALL RUN FLAGS
	CLRF SEQFLAG,1
	CLRF STAT1,1		;
	RETURN

T2LOW			;NEW	;EVENTS 1 - 30
	MOVLW 0x02		;LOOK FOR #1 LSD EVENT			OK
	CPFSGT T2CNT,1		;GO ON IF > 2
	BRA TP2.2		;GO HANDLE IT
	MOVLW 0x04		;LOOK FOR LATE #1 FIRE EVENT            OK
	CPFSGT T2CNT,1		;GO ON IF > 4
	BRA TP2.4		;GO HANDLE IT
 	MOVLW D'5'		;LOOK FOR START T2 INTERVAL EVENT (10)   OK
	CPFSGT T2CNT,1		;GO ON IF >5
	BRA TP2.START		;GO HANDLE IT
	MOVLW D'8'		;LOOK FOR END T2 EVENT			OK
	CPFSGT T2CNT,1		;GO ON IF > 8
	BRA TP2.END		;GO HANDLE IT
	MOVLW D'16'		;LOOK FOR LD TMRO W/SD #3 EVENT 	OK
	CPFSGT T2CNT,1		;GO ON IF > 16
	BRA TP2.16		;GO HANDLE IT
	MOVLW D'17'		;LOOK FOR #3 LOW SPEED DWELL EVENT      OK
	CPFSGT T2CNT,1		;GO ON IF > 17
	BRA TP2.17		;GO HANDLE IT
	MOVLW D'18'		;LOOK FOR #3 LATE FIRE 			OK
	CPFSGT T2CNT,1		;GO ON IF > 18
	BRA TP2.18		;GO HANDLE IT
	MOVLW D'19'		;LOOK FOR START T2			OK
	CPFSGT T2CNT,1		;GO ON IF > 19
	BRA TP2.START		;GO HANDLE IT
	MOVLW D'22'		;LOOK FOR END T2 			OK
	CPFSGT T2CNT,1		;GO ON IF > 22
	BRA TP2.END		;GO HANDLE IT
	MOVLW D'30'		;LOOK FOR #2 LD TMRO W/SD EVENT		OK
	CPFSGT T2CNT,1		;GO ON IF > 30
	BRA TP2.30		;GO HANDLE IT
			;NO ACTION T2 CNT SO EXIT
	RETURN


TP2.2  		;LOW SPEED DWELL EVENT : # 1
	CPFSEQ T2CNT,1		;COMPARE THE EVENT IN WREG TO T2CNT AND EXIT IF NOT EQUAL
	RETURN		;WAS NOT EQUAL SO EXIT
	BTFSS VT		;TEST FOR ENG TURNING >120 RPM  
	RETURN		;  "
	BTFSS LSF		;TEST FOR LOW SPEED DWELL FLAG (rpm < 1000)
	BRA TP2.2A		;GO TEST FOR DDF 	
	BSF FC1			;TURN LEADING COIL ON
	CLRF LP1D,1
TP2.2X
	RETURN
TP2.2A
	BTFSS DDF		;DWELL DROP FLAG SET?
	RETURN		;EXIT IF NOT
	BCF DDF			;CLEAR IT
	BSF FC1		;TURN COILS ON ONE MORE TIME
	CLRF LP1D,1		;CLR DWELL CNT SO WE WON'T GET FALSE DWELL START
	RETURN

TP2.4			;TEST FOR LATE OR LOW SPEED #1 IGNITION EVENT
	CPFSEQ T2CNT,1		;COMPARE THE EVENT IN WREG TO T2CNT AND EXIT IF NOT EQUAL
	RETURN		;WAS NOT EQUAL SO EXIT
	BTFSS T0CON,TMR0ON,0	;IS IT STILL RUNNING?  THIS MEANS THAT WE GOT A T2 EVENT AT A TIME WE EXPECTED IGNITION TO HAVE 
			;ALREADY OCCURED.  THIS IS HANDLED BY STOPPING THE TIMER AND EXECUTING THE TM0 ROUT THAT NORMALLY
			;WOULD HAVE HANDLED THE TM0 INTERRUPT.  I.E.  THE ENGINE SPEEDED UP.
	BRA TP2.4X		;EXIT IF STOPPED ALREADY BUT TEST FOR LSF?????  
	BCF T0CON,TMR0ON,0	;TURN TIMER OFF (IF IT WAS ON)
	GOTO TM0.1	;GO COMPLETE THE CYCLE THAT WAS MISSED
TP2.4X	
	BCF FC1	;COILS SHOULD BE OFF NO MATTER WHAT AT THIS TIME tdc
	BTFSC LSF	;IS LOW SPEED FLAG SET?
	GOTO TM0.1	;GO DO IT FOR LOW SPEED RUNNING
	RETURN

			;START TP2 30 DEGREE TIMING INTERVAL
TP2.START	
	CPFSEQ T2CNT		;COMPARE THE EVENT IN WREG TO T2CNT AND EXIT IF NOT EQUAL
	RETURN		;WAS NOT EQUAL SO EXIT
	BCF T0CON,TMR0ON,0	;TURN TIMER OFF (IF IT WAS ON)  NOT NECESSARY
	CLRF TMR0H,0
	CLRF TMR0L,0
	BSF T0CON,TMR0ON,0
TP2.STX
	RETURN

TP2.END		;  T2 INTERVAL TIME CAPTURE  PSV  *******

	CPFSEQ T2CNT,1		;COMPARE THE EVENT IN WREG TO T2CNT AND EXIT IF NOT EQUAL
	RETURN		;WAS NOT EQUAL SO EXIT
	BCF T0CON,TMR0ON,0		;stop timer 0 by selecting external clock
	BSF MF		;SET MATH FLAG FOR EXEC
	movFf TMR0L,TPL		;save timer 0 count (T2 interval) (LATCHED MSB WHEN LSB IS READ)
	movFf TMR0H,TPH		;always do high LAST ON READS - 16 bit operation when lsb is operated on

;ACCL START
TP2.END0
	BTFSS ACCF		;IS ACCF FLAG NOT SET, GO ON
	BRA TP2.END1
	DCFSNZ ACCNT,1,1		;DECREMENT ACCELERATION CTR (GIVES 1/2 SEC OF ACCL TIME @ 2000 RPM)
	BCF ACCF		;CLR IT IF TIME UP
TP2.END1
;ACCL END
	MOVLW HIGH DWLSPD	;GET DWELL TRANSITION SPEED DSF
	CPFSLT TPH,1		;ENG SPEED LT?
	BRA TP2.0E				;GO SET DSF
	BCF DSF
	BRA TP2.0D
TP2.0E
	BSF DSF
TP2.0D
  IF MAPRPMSTR > 0
    MOVLW HIGH MAPRPMSTR
  ELSE
	MOVLW 0x14		;TEST FOR SLOW SPEED THRESH 14 = 1000, 10 = 1200, 0D = 1500  changed to 1000 8-17-03
  ENDIF
	CPFSLT TPH,1		;TEST FOR 1200 RPM THRESH	08-14-03
	BRA TP2.END2		;GO SET LSF
	BTFSC LSF		;WAS LSF ALREADY CLEAR?
	BSF DDF			;SET DWELL DROP FLAG IF LSF JUST CLEARED TO PREVENT DRY FIRE AFTER CLEARING LSF 6-19-03
	BCF LSF		 	;CLR LSF FOR  SPEED >1000
	MOVLW 03
	CPFSLT TPH,1
	RETURN		;IF RPM < 6666 THEN EXIT
	BSF LSF			;SETTING LSF AT RPM > 6666 WILL LIMIT COIL DWELL AND HENCE LIMIT RPM
	RETURN
TP2.END2	
	BSF LSF		;SET THE SLOW FLAG
TP2.ENDX	
	RETURN

TP2.16				; #3 LOAD SPARK DELAY  
	CPFSEQ T2CNT,1		;COMPARE THE EVENT IN WREG TO T2CNT AND EXIT IF NOT EQUAL
	RETURN		;WAS NOT EQUAL SO EXIT
	BTFSS VT		;VALID TIMING?
	RETURN		;EXIT IF NOT
	BTFSC LSF		;DON'T LOAD HERE IF LSF SET
	RETURN		;EXIT IF SET
	MOVFF SDH,TMR0H
	MOVFF SDL,TMR0L		;LOAD TMR0 WITH SPARK DELAY 16 BIT
	BSF T0CON,TMR0ON,0
	BSF R3F			;SET ROTOR 2 FLAG FOR TIMER 0 INT ROUT.
	BCF R1F			; CLEAR THE OTHER ON JUST TO BE SURE
	BCF R2F			; CLEAR THE OTHER ON JUST TO BE SURE
	BCF R4F			; CLEAR THE OTHER ON JUST TO BE SURE
;	BCF STF			;KILL IT HERE  (DO ON #1 ONLY)
TP2.16X
	RETURN

TP2.17  		;LOW SPEED DWELL EVENT : # 3
	CPFSEQ T2CNT,1		;COMPARE THE EVENT IN WREG TO T2CNT AND EXIT IF NOT EQUAL
	RETURN		;WAS NOT EQUAL SO EXIT
;	BTFSS VT		;TEST FOR ENG TURNING >120 RPM  
;	BRA TP2.17X		;  "
	BTFSS LSF		;TEST FOR LOW SPEED DWELL FLAG (rpm < 1000)
	BRA TP2.17A		;GO TEST FOR DDF 	
	BSF FC3			;TURN LEADING COIL ON
	CLRF LP3D,1
TP2.17X	
	RETURN
TP2.17A
	BTFSS DDF		;DWELL DROP FLAG SET?
	RETURN		;EXIT IF NOT
	BCF DDF			;CLEAR IT
	BSF FC3		;TURN COILS ON ONE MORE TIME
	CLRF LP3D,1		;CLR DWELL CNT SO WE WON'T GET FALSE DWELL START
	RETURN

TP2.18			;TEST FOR LATE #3 IGNITION EVENT
	CPFSEQ T2CNT,1		;COMPARE THE EVENT IN WREG TO T2CNT AND EXIT IF NOT EQUAL
	RETURN		;WAS NOT EQUAL SO EXIT
	BTFSS T0CON,TMR0ON,0	;IS IT STILL RUNNING?  THIS MEANS THAT WE GOT A T2 EVENT AT A TIME WE EXPECTED IGNITION TO HAVE 
			;ALREADY OCCURED.  THIS IS HANDLED BY STOPPING THE TIMER AND EXECUTING THE TM0 ROUT THAT NORMALLY
			;WOULD HAVE HANDLED THE TM0 INTERRUPT.  I.E.  THE ENGINE SPEEDED UP.
	BRA TP2.18X	;EXIT IF STOPPED ALREADY
	BCF T0CON,TMR0ON,0	;TURN TIMER OFF (IF IT WAS ON)
	GOTO TM0.3	;GO COMPLETE THE CYCLE THAT WAS MISSED
TP2.18X	
	BCF FC3		;COILS SHOULD BE OFF NO MATTER WHAT AT THIS TIME 6 DEG atdc
	BTFSC LSF	;IS LOW SPEED FLAG SET?
	GOTO TM0.3	;GO DO IT FOR LOW SPEED RUNNING
	RETURN

TP2.30				; #2 LOAD SPARK DELAY  
	CPFSEQ T2CNT,1		;COMPARE THE EVENT IN WREG TO T2CNT AND EXIT IF NOT EQUAL
	RETURN		;WAS NOT EQUAL SO EXIT
	BTFSS VT		;VALID TIMING?
	RETURN		;EXIT IF NOT
	BTFSC LSF		;DON'T LOAD HERE IF LSF SET
	RETURN		;EXIT IF SET
	MOVFF SDH,TMR0H
	MOVFF SDL,TMR0L		;LOAD TMR0 WITH SPARK DELAY
	BSF T0CON,TMR0ON,0
	BSF R2F			;SET ROTOR 2 FLAG FOR TIMER 0 INT ROUT.
	BCF R1F			; CLEAR THE OTHER ON JUST TO BE SURE
	BCF R3F			; CLEAR THE OTHER ON JUST TO BE SURE
	BCF R4F			; CLEAR THE OTHER ON JUST TO BE SURE
;	BCF STF			;KILL IT HERE  (DO ON #1 ONLY)
TP2.30X
	RETURN

TP2.32  		;LOW SPEED DWELL EVENT : # 2
	CPFSEQ T2CNT,1		;COMPARE THE EVENT IN WREG TO T2CNT AND EXIT IF NOT EQUAL
	RETURN		;WAS NOT EQUAL SO EXIT
;	BTFSS VT		;TEST FOR ENG TURNING >120 RPM  
;	BRA TP2.32X		;  "
	BTFSS LSF		;TEST FOR LOW SPEED DWELL FLAG (rpm < 1000)
	BRA TP2.32A		;GO TEST FOR DDF 	
	BSF FC2			;TURN LEADING COIL ON
	CLRF LP2D,1
TP2.32X
	RETURN
TP2.32A
	BTFSS DDF		;DWELL DROP FLAG SET?
	RETURN		;EXIT IF NOT
	BCF DDF			;CLEAR IT
	BSF FC2		;TURN COILS ON ONE MORE TIME
	CLRF LP2D,1		;CLR DWELL CNT SO WE WON'T GET FALSE DWELL START
	RETURN

TP2.34			;#2 late ignition event
	CPFSEQ T2CNT,1			;COMPARE THE EVENT IN WREG TO T2CNT AND EXIT IF NOT EQUAL
	RETURN				;WAS NOT EQUAL SO EXIT
	BTFSS T0CON,TMR0ON,0	;IS IT STILL RUNNING?
	BRA TP2.34X				;TEST & EXIT IF NOT RUNNING	
	BCF T0CON,TMR0ON,0		;TURN TIMER OFF (IF IT WAS ON)
	GOTO TM0.2				;GO COMPLETE THE CYCLE THAT WAS MISSED
TP2.34X
	BCF FC2		;THESE SHOULD BE OFF NOW NO MATTER WHAT IT IS NOW tdc	
	BTFSC LSF	;IS LOW SPEED FLAG SET?
	GOTO TM0.2	;GO DO IT FOR LOW SPEED RUNNING
	RETURN

TP2.46				; #4 LOAD SPARK DELAY  
	CPFSEQ T2CNT,1		;COMPARE THE EVENT IN WREG TO T2CNT AND EXIT IF NOT EQUAL
	RETURN		;WAS NOT EQUAL SO EXIT
	BTFSS VT		;VALID TIMING?
	RETURN		;EXIT IF NOT
	BTFSC LSF		;DON'T LOAD HERE IF LSF SET
	RETURN		;EXIT IF SET
	MOVFF SDH,TMR0H
	MOVFF SDL,TMR0L		;LOAD TMR0 WITH SPARK DELAY 16 BIT
	BSF T0CON,TMR0ON,0
	BSF R4F			;SET ROTOR 2 FLAG FOR TIMER 0 INT ROUT.
	BCF R1F			; CLEAR THE OTHER ON JUST TO BE SURE
	BCF R3F			; CLEAR THE OTHER ON JUST TO BE SURE
	BCF R2F			; CLEAR THE OTHER ON JUST TO BE SURE
;	BCF STF			;KILL IT HERE  (DO ON #1 ONLY)
TP2.46X
	RETURN

TP2.47  		;LOW SPEED DWELL EVENT : # 4
	CPFSEQ T2CNT,1		;COMPARE THE EVENT IN WREG TO T2CNT AND EXIT IF NOT EQUAL
	RETURN		;WAS NOT EQUAL SO EXIT
;	BTFSS VT		;TEST FOR ENG TURNING >120 RPM  
;	BRA TP2.47X		;  "
	BTFSS LSF		;TEST FOR LOW SPEED DWELL FLAG (rpm < 1000)
	BRA TP2.47A		;GO TEST FOR DDF 	
	CLRF LP4D,1
	BSF FC4			;TURN LEADING COIL ON
TP2.47X
	RETURN
TP2.47A
	BTFSS DDF		;DWELL DROP FLAG SET?
	RETURN		;EXIT IF NOT
	BCF DDF			;CLEAR IT
	BSF FC4		;TURN COILS ON ONE MORE TIME
	CLRF LP4D,1		;CLR DWELL CNT SO WE WON'T GET FALSE DWELL START
	RETURN

TP2.48			;#4 late ignition event
	CPFSEQ T2CNT,1		;COMPARE THE EVENT IN WREG TO T2CNT AND EXIT IF NOT EQUAL
	RETURN		;WAS NOT EQUAL SO EXIT
	BTFSS T0CON,TMR0ON,0	;IS IT STILL RUNNING?
	BRA TP2.48X	;TEST & EXIT IF NOT RUNNING	
	BCF T0CON,TMR0ON,0	;TURN TIMER OFF (IF IT WAS ON)
	GOTO TM0.4	;GO COMPLETE THE CYCLE THAT WAS MISSED
TP2.48X
	BCF FC4 	;THESE SHOULD BE OFF NOW NO MATTER WHAT IT IS NOW tdc	
	BTFSC LSF	;IS LOW SPEED FLAG SET?
	GOTO TM0.4	;GO DO IT FOR LOW SPEED RUNNING 
	RETURN

TP2.60				; #1 LOAD SPARK DELAY  
	CPFSEQ T2CNT,1		;COMPARE THE EVENT IN WREG TO T2CNT AND EXIT IF NOT EQUAL
	RETURN		;WAS NOT EQUAL SO EXIT
	BTFSS VT		;VALID TIMING?
	BRA TP2.60X		;TEST & EXIT IF NOT
	BTFSC LSF		;DON'T LOAD HERE IF LSF SET
	BRA TP2.60X		;EXIT IF SET BUT STILL DO END OF CHAIN HOUSKEEPING
	MOVFF SDH,TMR0H
	MOVFF SDL,TMR0L		;LOAD TMR0 WITH SPARK DELAY 16 BIT

	BSF T0CON,TMR0ON,0
	BSF R1F			;SET # 1 FLAG FOR TIMER 0 INT ROUT.
TP2.60X
	BCF R4F			; CLEAR THE OTHER ON JUST TO BE SURE
	BCF R3F			; CLEAR THE OTHER ON JUST TO BE SURE
	BCF R2F			; CLEAR THE OTHER ON JUST TO BE SURE
	BCF STRF			;KILL IT HERE  (DO ON #1 ONLY)
	BCF INTCON,INT0IF,0		;CLEAR ANY PENDING CAM INTS
	BSF INTCON,INT0IE,0		;ENABLE THE NEXT CAM T1 INT
	BCF T1F			;CLR 1ST T1 FLAG
	RETURN
TP2.X			;EXIT W/ NO ACTION FOR TP2 ROUTS
	RETURN
 ENDIF  			;END OF 0xAC EJ25 Tp2 handler ROUT

 IF ENG==0xA7		;EJ22 T2 EVENT HANDLER   (CRANK SENSOR 1-2-1-2, CAM = 1-2-1-3)  
  IF A72007 == 0	;TEST FOR LATE OR EARLY MODEL EJ25 ENG.  1 = 2007 OR LATER TYPE
TP2INT				;This is CRANK sensor interrupt   FOR PRE 2007 ENGINE
	CLRF T1CNT,1		;CLEAR T1 COUNT FOR SYNC DETECT
	MOVLW D'100'
	MOVWF DTCL,1			;LOAD DEAD TIME CTR
	BTFSS SYNF		;SYNC DETECTED?
	RETURN			;EXIT IF NOT
	INCF T2CNT,1,1
	DCFSNZ T2CNT,0,1
	BRA T2.STR		;WAS 1 SO GO START T2 TIMING SEQUENCE
	DCFSNZ WREG,0,0	;TEST FOR 2
	BRA T2END		;GO END T2 TIMING SEQUENCE, KICK OFF TIMING CHAIN IF NOT LSF
	DCFSNZ WREG,0,0	;3?
	BRA T2LSD		;TEST FOR LOW SPEED ign
	DCFSNZ WREG,0,0	;4?
	BRA T2.STR
	DCFSNZ WREG,0,0	;5?
	BRA T2END
	DCFSNZ WREG,0,0 ;6?
	BRA T2LSD
	DCFSNZ WREG,0,0 ;7?
	BRA T2.STR
	DCFSNZ WREG,0,0 ;8?
	BRA T2END
	DCFSNZ WREG,0,0 ;9?
	BRA T2LSD
	DCFSNZ WREG,0,0 ;10?
	BRA T2.STR
	DCFSNZ WREG,0,0 ;11?
	BRA T2END
	DCFSNZ WREG,0,0 ;12?
	BRA T2LSD.S
	CLRF STAT0,1		;ILLEGAL T2 COUNT
	CLRF SEQFLAG,1
	RETURN
	
T2LSD.S
	BCF STRF			;CLEAR START FLAG
T2LSD
	BTFSS LSF			;LSF SET?
	RETURN
	MOVF SEQFLAG,0,1	;FIND OUT WHO NEEDS FIRING
	DCFSNZ WREG,0,0
	BRA T2.I3			;SEQ 1 ls ign CYL 3 (FC3)  
	DCFSNZ WREG,0,0
	BRA T2.I2				;SEQ 2 LS IGN CYL 2 (FC2)
	DCFSNZ WREG,0,0
	BRA T2.I4				;SEQ 3 LS IGN CYL 4 (FC4)
	DCFSNZ WREG,0,0
	BRA T2.I1				;SEQ 4 LS IGN CYL 1 (FC1)
	RETURN 			
	
T2.I3
	BSF FC3
T2.ISU
	BCF T0CON,TMR0ON,0		;STOP TIMER
	MOVF T4L,0,1			;SETUP 11.25 DEG DELAY
	ADDWF T8L,0,1
	COMF WREG,0
	MOVWF IARGL,1			;SAVE
	MOVF T4H,0,1
	ADDWFC T8H,0,1
	COMF WREG,0
	MOVWF TMR0H,0
	MOVFF IARGL,TMR0L
	BSF T0CON,TMR0ON,0		;START TMR0 FOR FIRE AT 1.25 DEG ATDC
	RETURN 		

T2.I2
	BSF FC2				;DWELL 2
	BRA T2.ISU			;GO SETUP IGN DELAY
T2.I4
	BSF FC4
	BRA T2.ISU
T2.I1
	BSF FC1
	BRA T2.ISU

T2END				;PRE 2005 TYPE
  	BCF T0CON,TMR0ON,0		;STOP TIMER
	BTFSS T2F				;SEE IF TMR0 OVERFLOWED (CLEARED T2F)
	RETURN				;OVF EXIT TM0 INF DID ALL NECESSARY HOUSEKEEPING
	MOVFF TPL,TPLOLD	;SAVE OLD TPH&L
	MOVFF TPH,TPHOLD
	MOVFF TMR0L,TPL			;CAPTURE PERIOD COUNT
	MOVFF TMR0H,TPH
	CALL MATH			; (DO IT IN REAL TIME NOW
	BSF MF					;SET MF FOR EXEC THIS TRIGGERS CALL TO PCK, NOT MATH ON THIS ENGINE  
	BCF T2F					;CLR T2 FLAG
	BTFSS VT
	RETURN
	MOVLW D'67'			;COMPENSATE FOR MATH EXECUTION TIME (~46 uS * 1.25MHz ClK = 57)
	ADDWF SDL,1,1
	CLRF WREG,0
	ADDWFC SDH,1,1
	BNC TP2.END2			;CK FOR OVF, GO ON IF NOT
	MOVLW D'200'			;SET MIN DELAY 
	MOVWF SDL,1
	SETF SDH,1
TP2.END2
	
;  *****************  ACL START
;NEW ADDITION FOR DWELL SPEEDUP PROBLEM
	MOVLW HIGH DWLSPD	;GET DWELL TRANSITION SPEED DSF
	CPFSLT TPH,1		;ENG SPEED LT?
	BRA TP2.0E			;GO SET DSF  & TEST FOR LSF
	BCF DSF
	BCF LSF				;ENG RPM > DSF SPEED			
TP2.0D				;TP2.OE RETURNS HERE AFTER UPDATE OF LSF.     TEST FOR ACCELERATION
	BTFSC LSF			;DON'T LOAD TM0 BELOW LSF, IGN HANDLED BY LSD LOAD OF TM0   10-22-11
	BRA T2LSD.B		
	MOVFF SDH,TMR0H		;START TIMING SEQUENCE
	MOVFF SDL,TMR0L
	BSF T0CON,TMR0ON,0	
T2LSD.B
	MOVFF TPLOLD,IARGL
	MOVFF TPHOLD,IARGH
	MOVF TPL,0,1
	SUBWF IARGL,1,1
	MOVF TPH,0,1
	SUBWFB IARGH,1,1
	BTFSS _C			;IS NEW RPM > OLD?  IF CY SET, NEW TPH < OLD SO TEST FOR ACCL
	BRA TP2.0X			;NO ACCL SO EXIT
	
 	MOVLW 0	;HIGH ACTHRESH	;TEST FOR RPM  > START OF MAP ADV RPM THRESHOLDMSB CONST	< CONSTANT
 	CPFSLT IARGH,1		;COMPARE DELTA TO THRESH
 	BRA	TP2.CEQ				;MSB NOT LT SO CK FOR EQ
 	BRA TP2.0X			;FALSE EXIT, DELTA < THRESH
TP2.CEQ 	
 	CPFSEQ IARGH,1		;COMP VAR MSB FOR = CONST MSB
 	BRA TP2.AC1  		;TRUE EXIT, DELTA IS > THRESHVAR !LT CONST   .VB
 	MOVLW D'32'		;LOW ACTHRESH 			;MSB WAS = SO TEST LSB CONSTANT
 	CPFSLT IARGL,1			;COMPARE LSB CONST TO LSB VAR
 	BRA TP2.AC1				;TRUE EXIT DELTA >= THRESH
TP2.0X
 	RETURN					;FALSE EXIT,  DELTA < THRESH
TP2.AC1
	MOVLW 0x1F
	ANDWF IARGL,1
   	BCF _C
   	RRCF IARGH,1,1			;DIV DELTA BY 32
   	RRCF IARGL,1,1
   	RRCF IARGH,1,1
   	RRCF IARGL,1,1
   	RRCF IARGH,1,1
   	RRCF IARGL,1,1
   	RRCF IARGH,1,1
   	RRCF IARGL,1,1
   	RRCF IARGH,1,1
   	RRCF IARGL,1,1 
  	MOVLW D'8'			;BUMP IT FOR EMPIRICAL VALUE  (THIS IS ABOUT 2 MS  (WAS 6)
   	ADDWF IARGL,1,1
   	   	
;************  16 BIT DWELL START
   	MOVF IARGL,0,1		;GET DWL DELTA IN WREG
   	MOVF LP1DH,1,1		;TEST MSB FOR ACTIVE
   	BNZ TP2.ACA			;ACTIVE, SO GO HANDLE
   	MOVF LP1D,1,1		;TEST LPD1 FOR ACTIVE
   	BZ TP2.AC2			;GO TO NEXT DWELL IF NOT ACTIVE	
TP2.ACA
   	SUBWF LP1D,0,1		;SUB DELTA FROM COUNT
   	BNC TP2.AC1A			;IF NEGATIVE, TIME TO TURN IT ON IF NO MSB
	BTFSC STATUS,Z,0	;NOT NEGATIVE SO test for zero
	BRA TP2.AC1C		;HANDLE ZERO CASE , TEST FOR POSSIBLE MSB
   	MOVWF LP1D,1		;UPDATE LPD1
   	BRA TP2.AC2			;GO CK ROTOR 2
TP2.AC1A
	MOVF LP1DH,1,1		;TEST MSB
	BZ TP2.AC1B			;HANDLE 0 TIME OUT
	DECF LP1DH,1,1		;UPDATE MSB
	MOVWF LP1D,1			;UPDATE LSB
	BRA TP2.AC2			;NO TIMEOUT SO GO CK ROTOR 2
TP2.AC1B
   	BSF FC1				;HAD BORROW OR WAS ZERO SO TURN ON NOW
   	CLRF LP1D
   	CLRF LP1DH
   	BRA TP2.AC2
TP2.AC1C				;ZERO LSB COUNT
	MOVF LP1DH,1,1		;TEST MSB
	BZ TP2.AC1B			;IF TOTAL COUNT = 0 THEN TIME FOR DWELL OTHERWISE GO ON WITH NEXT ROTOR
	
TP2.AC2												;TEST DWELL FOR ROTOR 2
   	MOVF IARGL,0,1		;GET DWL DELTA IN WREG
   	MOVF LP2DH,1,1		;TEST MSB FOR ACTIVE
   	BNZ TP2.ACA2			;ACTIVE, SO GO HANDLE
   	MOVF LP2D,1,1		;TEST LPD1 FOR ACTIVE
   	BZ TP2.AC22			;GO TO NEXT DWELL IF NOT ACTIVE	
TP2.ACA2
   	SUBWF LP2D,0,1		;SUB DELTA FROM COUNT
   	BNC TP2.AC1A2			;IF NEGATIVE, TIME TO TURN IT ON IF NO MSB
	BTFSC STATUS,Z,0	;NOT NEGATIVE SO test for zero
	BRA TP2.AC1C2		;HANDLE ZERO CASE , TEST FOR POSSIBLE MSB
   	MOVWF LP2D,1		;UPDATE LPD1
   	BRA TP2.AC22			;GO CK ROTOR 2
TP2.AC1A2
	MOVF LP2DH,1,1		;TEST MSB
	BZ TP2.AC1B2			;HANDLE 0 TIME OUT
	DECF LP2DH,1,1		;UPDATE MSB
	MOVWF LP2D,1			;UPDATE LSB
	BRA TP2.AC22			;NO TIMEOUT SO GO CK ROTOR 3
TP2.AC1B2
   	BSF FC2				;HAD BORROW OR WAS ZERO SO TURN ON NOW
   	CLRF LP2D
   	CLRF LP2DH
   	BRA TP2.AC22
TP2.AC1C2				;ZERO LSB COUNT
	MOVF LP2DH,1,1		;TEST MSB
	BZ TP2.AC1B2			;IF TOTAL COUNT = 0 THEN TIME FOR DWELL OTHERWISE GO ON WITH NEXT ROTOR
	
TP2.AC22												;TEST DWELL FOR ROTOR 2
   	MOVF IARGL,0,1		;GET DWL DELTA IN WREG
   	MOVF LP3DH,1,1		;TEST MSB FOR ACTIVE
   	BNZ TP2.ACA3			;ACTIVE, SO GO HANDLE
   	MOVF LP3D,1,1		;TEST LPD1 FOR ACTIVE
   	BZ TP2.AC23			;GO TO NEXT DWELL IF NOT ACTIVE	
TP2.ACA3
   	SUBWF LP3D,0,1		;SUB DELTA FROM COUNT
   	BNC TP2.AC1A3			;IF NEGATIVE, TIME TO TURN IT ON IF NO MSB
	BTFSC STATUS,Z,0	;NOT NEGATIVE SO test for zero
	BRA TP2.AC1C3		;HANDLE ZERO CASE , TEST FOR POSSIBLE MSB
   	MOVWF LP3D,1		;UPDATE LPD1
   	BRA TP2.AC23			;GO CK ROTOR 2
TP2.AC1A3
	MOVF LP3DH,1,1		;TEST MSB
	BZ TP2.AC1B3			;HANDLE 0 TIME OUT
	DECF LP3DH,1,1		;UPDATE MSB
	MOVWF LP3D,1			;UPDATE LSB
	BRA TP2.AC23			;NO TIMEOUT SO GO CK ROTOR 2
TP2.AC1B3
   	BSF FC3				;HAD BORROW OR WAS ZERO SO TURN ON NOW
   	CLRF LP3D
   	CLRF LP3DH
   	BRA TP2.AC23
TP2.AC1C3				;ZERO LSB COUNT
	MOVF LP3DH,1,1		;TEST MSB
	BZ TP2.AC1B3			;IF TOTAL COUNT = 0 THEN TIME FOR DWELL OTHERWISE GO ON WITH NEXT ROTOR
	
TP2.AC23												;TEST DWELL FOR ROTOR 4
   	MOVF IARGL,0,1		;GET DWL DELTA IN WREG
   	MOVF LP4DH,1,1		;TEST MSB FOR ACTIVE
   	BNZ TP2.ACA4			;ACTIVE, SO GO HANDLE
   	MOVF LP4D,1,1		;TEST LPD1 FOR ACTIVE
   	BZ TP2.AC24			;GO TO NEXT DWELL IF NOT ACTIVE	
TP2.ACA4
   	SUBWF LP4D,0,1		;SUB DELTA FROM COUNT
   	BNC TP2.AC1A4			;IF NEGATIVE, TIME TO TURN IT ON IF NO MSB
	BTFSC STATUS,Z,0	;NOT NEGATIVE SO test for zero
	BRA TP2.AC1C4		;HANDLE ZERO CASE , TEST FOR POSSIBLE MSB
   	MOVWF LP4D,1		;UPDATE LPD1
   	BRA TP2.AC24			;GO CK ROTOR 2
TP2.AC1A4
	MOVF LP4DH,1,1		;TEST MSB
	BZ TP2.AC1B4			;HANDLE 0 TIME OUT
	DECF LP4DH,1,1		;UPDATE MSB
	MOVWF LP4D,1			;UPDATE LSB
	BRA TP2.AC24			;NO TIMEOUT SO GO CK ROTOR 2
TP2.AC1B4
   	BSF FC4				;HAD BORROW OR WAS ZERO SO TURN ON NOW
   	CLRF LP4D
   	CLRF LP4DH
   	BRA TP2.AC24
TP2.AC1C4				;ZERO LSB COUNT
	MOVF LP4DH,1,1		;TEST MSB
	BZ TP2.AC1B4			;IF TOTAL COUNT = 0 THEN TIME FOR DWELL OTHERWISE GO ON WITH NEXT ROTOR
TP2.AC24												;DONE
	RETURN	
	
TP2.0E					;RPM WAS < DSF SPEED
	BSF DSF	
	MOVLW HIGH MAPRPMSTR		;THE LSF CONSTANT
	CPFSLT TPH,1
	BRA TP2.0F		;GO SET LSF
	BCF LSF
	BRA TP2.0D		;RPM BETWEEN LSF ANF DSF POINT.  GO TEST FOR RPM ACCELERATION
TP2.0F
	BSF LSF
	BRA TP2.0D
;  *********  NEW ACCL END

T2.STR
	CLRF TMR0H,0
	CLRF TMR0L,0
	BSF T0CON,TMR0ON,0			;START TIMER 0
	BSF T2F
	INCF SEQFLAG,1,1
	BSF ANF
	RETURN
  ENDIF ;TP2.END & TP2.STR  FOR  EARLY EJ25
  
  IF A72007 ==1
TP2INT
	BTFSS S2CK		;WAS LAST T2 A SYNC1 INTERVAL?
	BRA TP2.A		;GO TEST FOR SYNC1 IF NOT
	BCF S2CK		;CLEAR THE CK FOR 2ND SYNC FLAG
	BCF _C		;CK FOR 2ND SYNC INTERVAL BY SUBTRACTING SYNCH&L*2 FROM TOLDH&L (20 0R 60 DEG FROM 30)
	RLCF SYNCL,0,1		;IF NO BORROR, THEN THIS IS A SECOND SYNC
	MOVWF IARGL,1	;SAVE IT
	RLCF SYNCH,0,1
	MOVWF IARGH,1
	MOVF IARGL,0,1
	SUBWF TOLDL,1,1
	MOVF IARGH,0,1
	SUBWFB TOLDH,1,1
	BTFSC _C		;IF BORROW (NO CY)THEN THIS IS 2ND SYNC
	BRA TP2.00		;DO NORMAL TP2 HANDLE
	BSF SYNF		;SET ENGINE SYNC FOUND FLAG
	CLRF T2CNT,1	;CLR T2 COUNT (WILL BE INCREMENTED TO 1 DOWNSTREAM)
	BRA TP2.00		;GO HANDLE T2 EVENT
TP2.A			;TEST FOR SYNC1 INTERVAL  BY SUBTRACTING NEW/2 FROM OLD.A BORROW (CY CLR) INDICATES THAT NEW IS WAY BIGGER (SYNC)
	BCF _C			;DIVIDE SYNCL&H BY 2  (DIVIDE CURRENT SYNC COUNT BY 2)
	RRCF SYNCH,0,1		; 
	MOVWF IARGH,1	;SAVE IT
	RRCF SYNCL,0,1		;GET LSB OF NEW/2 TO WREG
	SUBWF TOLDL,0,1		;SUB LSB
	MOVF IARGH,0,1	;GET NEW SYNC/2 MSB
	SUBWFB TOLDH,0,1		;SUB OLD MSB  
	BTFSC _C		;TEST FOR BORROW (CY CLR) IF NEW/2 >TOLD THEN WE HAVE 1ST SYNC INTERVAL AFTER A 10 DEG COUNT
	BRA TP2.00		;NO BORROW SO NO SYNC 1 DET,SO GO CHECK FOR SYNC 2
	BSF SYNF1		;HAD BORROW SO GO SET SYNC 1 DET FLAG 
	BSF S2CK		;SET CHECK FOR SYNC 2 ON NEXT TP2 EVENT (SECOND 30 DEG INTERVAL)		
TP2.00
	MOVFF SYNCL,TOLDL	; save LATEST SYNC counT IN TOLDL&H
	MOVFF SYNCH,TOLDH
	CLRF SYNCL,1		;CLEAR SYNC REG FOR NEXT CAPTURE CYCLE
	CLRF SYNCH,1
TP2.01		
	MOVLW D'57'		;LOAD DEAD TIME CTR (50 ms)   42 MS IS SYNC GAP @ 120 RPM (RENESIS)  *********
	MOVWF DTCL,1
	BTFSS SYNF		; DO WE HAVE SYNC?    04-27-02   SYNF ONLY CLR BY DTC TIMEOUT
	RETURN			;EXIT IF NOT 
	
;					******   A72007 EVENT LIST
	INCF T2CNT,1,1
;	MOVFF T2CNT,IARGL
	MOVLW D'10'		;SEPARATE TESTS INTO THREE GROUPS, LOW, MID & HIGH
	CPFSGT T2CNT,1		;T2 <11?
	BRA T2LOW		;GO TEST LOW GP 1 - 10
	MOVLW D'17'		;TEST FOR MIDRANGE 18 - 30
	CPFSGT T2CNT,1
	BRA T2MID

;High list processing 21 - 30   A7 2007

	MOVLW D'18'		;LOOK FOR LD C1 TIME
	CPFSGT T2CNT,1		;GO ON IF > 18
	BRA TP2.LSI1		;GO HANDLE IT
	MOVLW D'26'		;LOOK FOR T2 STR
	CPFSGT T2CNT,1		;GO ON IF > 
	BRA TP2.STR		;GO HANDLE IT
	MOVLW D'29'		;LOOK FOR END OF T2 INTERVAL 
	CPFSGT T2CNT,1		;GO ON IF > 
	BRA TP2.END		;GO HANDLE IT
	MOVLW D'30'		;LOOK FOR LD TM0 W/ SD EVENT CYL 
	CPFSGT T2CNT,1		;GO ON IF > 51
	BRA TP2.LT3		;GO HANDLE IT
	RETURN
	
T2MID				;T2 = 11 - 17
;	MOVLW D'10'		;LOOK FOR T2 START
;	CPFSGT T2CNT,1		;GO ON IF > 21
;	BRA TP2.STR		;GO HANDLE IT
	MOVLW D'13'		; LOOK FOR T2END
	CPFSGT T2CNT,1		;GO ON IF > 25
	BRA TP2.END		;GO HANDLE IT
	MOVLW D'14'		;LOOK FOR LOAD C 1 OR 2
	CPFSGT T2CNT,1		;GO ON IF > 27
	BRA TP2.LT1		;GO HANDLE IT  
	MOVLW D'17'		;LOOK FOR LOW SPEED DWELL  
	CPFSGT T2CNT,1
	BRA TP2.LSD1		; DWELL 1/2
	RETURN			;40 IS NO ACTION , OFF THE END

T2LOW			;1 - 10
	MOVLW 0x01		;LOOK FOR LSD 3/4
	CPFSGT T2CNT,1		;GO ON IF > 1
	BRA TP2.LSD3		;GO HANDLE IT
	MOVLW D'2'		;LOOK FOR LSI # 3
	CPFSGT T2CNT,1		;GO ON IF > 6
	BRA TP2.LSI3		;GO HANDLE IT
	MOVLW D'3'		;LOOK FOR T1F STATUS & SET ALT IF TRUE
	CPFSGT T2CNT,1		;GO ON IF > 3
	BRA TP2.3		;GO HANDLE IT
	MOVLW D'10'		;LOOK FOR T2 START
	CPFSGT T2CNT,1		;GO ON IF > 10
	BRA TP2.STR		;GO HANDLE IT
TP2.X
			;NO ACTION T2 CNT SO EXIT
	RETURN
  			;END OF 0xA7 2007 EVENT HANDLER	
  ENDIF			;END OF 2007 OR LATER EJ25 FRONT END & LIST HANDLER

  
  IF A72007 == 1	;FOR 2007 & LATER EJ25
TP2.END		;  T2 INTERVAL TIME CAPTURE   ******* 
	CPFSEQ T2CNT,1		;COMPARE THE EVENT IN WREG TO T2CNT AND EXIT IF NOT EQUAL
	RETURN		;WAS NOT EQUAL SO EXIT
	BCF T0CON,TMR0ON,0		;stop timer 0 by selecting external clock
	movFf TMR0L,TPL		;save timer 0 count (T2 interval)  mind barf?
	movFf TMR0H,TPH
	BTFSS T2F			;TEST FOR VALID T2STR
	RETURN
	BSF MF				
;ACCL START
TP2.0
	BCF T2F			;CLR IT SO TMR0 WILL NOT SEE IT
	BTFSS ACCF		;IS ACCF FLAG NOT SET, GO ON
	BRA TP2.0C
	DCFSNZ ACCNT,1,1		;DECREMENT ACCELERATION CTR (GIVES 1/2 SEC OF ACCL TIME @ 2000 RPM)
	BCF ACCF		;CLR IT IF TIME UP
TP2.0C
;ACCL END

;  *****************  ACL START
;NEW TRIMAP ADDITION FOR DWELL SPEEDUP PROBLEM
	MOVLW HIGH DWLSPD	;GET DWELL TRANSITION SPEED DSF
	CPFSLT TPH,1		;ENG SPEED LT?
	BRA TP2.0E			;GO SET DSF  & TEST FOR LSF
	BCF DSF
	BTFSC LSF
	BSF DDF
	BCF LSF				;ENG RPM > DSF SPEED				
	
TP2.0D				;TEST FOR ACCELERATION
	MOVFF TPLOLD,IARGL
	MOVFF TPHOLD,IARGH
	MOVF TPL,0,1
	SUBWF IARGL,1,1
	MOVF TPH,0,1
	SUBWFB IARGH,1,1
	BTFSS _C			;IS NEW RPM > OLD?  IF CY SET, NEW TPH < OLD SO TEST FOR ACCL
	BRA TP2.0X			;NO ACCL SO EXIT
	
 	MOVLW 0	;HIGH ACTHRESH	;TEST FOR RPM  > START OF MAP ADV RPM THRESHOLDMSB CONST	< CONSTANT
 	CPFSLT IARGH,1		;COMPARE DELTA TO THRESH
 	BRA	TP2.CEQ				;MSB NOT LT SO CK FOR EQ
 	BRA TP2.0X			;FALSE EXIT, DELTA < THRESH
TP2.CEQ 	
 	CPFSEQ IARGH,1		;COMP VAR MSB FOR = CONST MSB
 	BRA TP2.AC1  		;TRUE EXIT, DELTA IS > THRESHVAR !LT CONST   .VB
 	MOVLW D'32'		;LOW ACTHRESH 			;MSB WAS = SO TEST LSB CONSTANT
 	CPFSLT IARGL,1			;COMPARE LSB CONST TO LSB VAR
 	BRA TP2.AC1				;TRUE EXIT DELTA >= THRESH
TP2.0X
 	RETURN					;FALSE EXIT,  DELTA < THRESH
TP2.AC1
	MOVLW 0x1F
	ANDWF IARGL,1
   	BCF _C
   	RRCF IARGH,1,1			;DIV DELTA BY 32
   	RRCF IARGL,1,1
   	RRCF IARGH,1,1
   	RRCF IARGL,1,1
   	RRCF IARGH,1,1
   	RRCF IARGL,1,1
   	RRCF IARGH,1,1
   	RRCF IARGL,1,1
   	RRCF IARGH,1,1
   	RRCF IARGL,1,1
 
  	MOVLW D'6'			;BUMP IT FOR EMPIRICAL VALUE  (THIS IS ABOUT 2 MS
   	ADDWF IARGL,1,1
   	   	
;************  16 BIT DWELL START
   	MOVF IARGL,0,1		;GET DWL DELTA IN WREG
   	MOVF LP1DH,1,1		;TEST MSB FOR ACTIVE
   	BNZ TP2.ACA			;ACTIVE, SO GO HANDLE
   	MOVF LP1D,1,1		;TEST LPD1 FOR ACTIVE
   	BZ TP2.AC2			;GO TO NEXT DWELL IF NOT ACTIVE	
TP2.ACA
   	SUBWF LP1D,0,1		;SUB DELTA FROM COUNT
   	BNC TP2.AC1A			;IF NEGATIVE, TIME TO TURN IT ON IF NO MSB
	BTFSC STATUS,Z,0	;NOT NEGATIVE SO test for zero
	BRA TP2.AC1C		;HANDLE ZERO CASE , TEST FOR POSSIBLE MSB
   	MOVWF LP1D,1		;UPDATE LPD1
   	BRA TP2.AC2			;GO CK ROTOR 2
TP2.AC1A
	MOVF LP1DH,1,1		;TEST MSB
	BZ TP2.AC1B			;HANDLE 0 TIME OUT
	DECF LP1DH,1,1		;UPDATE MSB
	MOVWF LP1D,1			;UPDATE LSB
	BRA TP2.AC2			;NO TIMEOUT SO GO CK ROTOR 2
TP2.AC1B
   	BSF FC1				;HAD BORROW OR WAS ZERO SO TURN ON NOW
   	CLRF LP1D
   	CLRF LP1DH
   	BRA TP2.AC2
TP2.AC1C				;ZERO LSB COUNT
	MOVF LP1DH,1,1		;TEST MSB
	BZ TP2.AC1B			;IF TOTAL COUNT = 0 THEN TIME FOR DWELL OTHERWISE GO ON WITH NEXT ROTOR
	
TP2.AC2												;TEST DWELL FOR ROTOR 2
   	MOVF IARGL,0,1		;GET DWL DELTA IN WREG
   	MOVF LP2DH,1,1		;TEST MSB FOR ACTIVE
   	BNZ TP2.ACA2			;ACTIVE, SO GO HANDLE
   	MOVF LP2D,1,1		;TEST LPD1 FOR ACTIVE
   	BZ TP2.AC22			;GO TO NEXT DWELL IF NOT ACTIVE	
TP2.ACA2
   	SUBWF LP2D,0,1		;SUB DELTA FROM COUNT
   	BNC TP2.AC1A2			;IF NEGATIVE, TIME TO TURN IT ON IF NO MSB
	BTFSC STATUS,Z,0	;NOT NEGATIVE SO test for zero
	BRA TP2.AC1C2		;HANDLE ZERO CASE , TEST FOR POSSIBLE MSB
   	MOVWF LP2D,1		;UPDATE LPD1
   	BRA TP2.AC22			;GO CK ROTOR 2
TP2.AC1A2
	MOVF LP2DH,1,1		;TEST MSB
	BZ TP2.AC1B2			;HANDLE 0 TIME OUT
	DECF LP2DH,1,1		;UPDATE MSB
	MOVWF LP2D,1			;UPDATE LSB
	BRA TP2.AC22			;NO TIMEOUT SO GO CK ROTOR 3
TP2.AC1B2
   	BSF FC2				;HAD BORROW OR WAS ZERO SO TURN ON NOW
   	CLRF LP2D
   	CLRF LP2DH
   	BRA TP2.AC22
TP2.AC1C2				;ZERO LSB COUNT
	MOVF LP2DH,1,1		;TEST MSB
	BZ TP2.AC1B2			;IF TOTAL COUNT = 0 THEN TIME FOR DWELL OTHERWISE GO ON WITH NEXT ROTOR
	
TP2.AC22												;TEST DWELL FOR ROTOR 2
   	MOVF IARGL,0,1		;GET DWL DELTA IN WREG
   	MOVF LP3DH,1,1		;TEST MSB FOR ACTIVE
   	BNZ TP2.ACA3			;ACTIVE, SO GO HANDLE
   	MOVF LP3D,1,1		;TEST LPD1 FOR ACTIVE
   	BZ TP2.AC23			;GO TO NEXT DWELL IF NOT ACTIVE	
TP2.ACA3
   	SUBWF LP3D,0,1		;SUB DELTA FROM COUNT
   	BNC TP2.AC1A3			;IF NEGATIVE, TIME TO TURN IT ON IF NO MSB
	BTFSC STATUS,Z,0	;NOT NEGATIVE SO test for zero
	BRA TP2.AC1C3		;HANDLE ZERO CASE , TEST FOR POSSIBLE MSB
   	MOVWF LP3D,1		;UPDATE LPD1
   	BRA TP2.AC23			;GO CK ROTOR 2
TP2.AC1A3
	MOVF LP3DH,1,1		;TEST MSB
	BZ TP2.AC1B3			;HANDLE 0 TIME OUT
	DECF LP3DH,1,1		;UPDATE MSB
	MOVWF LP3D,1			;UPDATE LSB
	BRA TP2.AC23			;NO TIMEOUT SO GO CK ROTOR 2
TP2.AC1B3
   	BSF FC3				;HAD BORROW OR WAS ZERO SO TURN ON NOW
   	CLRF LP3D
   	CLRF LP3DH
   	BRA TP2.AC23
TP2.AC1C3				;ZERO LSB COUNT
	MOVF LP3DH,1,1		;TEST MSB
	BZ TP2.AC1B3			;IF TOTAL COUNT = 0 THEN TIME FOR DWELL OTHERWISE GO ON WITH NEXT ROTOR
	
TP2.AC23												;TEST DWELL FOR ROTOR 4
   	MOVF IARGL,0,1		;GET DWL DELTA IN WREG
   	MOVF LP4DH,1,1		;TEST MSB FOR ACTIVE
   	BNZ TP2.ACA4			;ACTIVE, SO GO HANDLE
   	MOVF LP4D,1,1		;TEST LPD1 FOR ACTIVE
   	BZ TP2.AC24			;GO TO NEXT DWELL IF NOT ACTIVE	
TP2.ACA4
   	SUBWF LP4D,0,1		;SUB DELTA FROM COUNT
   	BNC TP2.AC1A4			;IF NEGATIVE, TIME TO TURN IT ON IF NO MSB
	BTFSC STATUS,Z,0	;NOT NEGATIVE SO test for zero
	BRA TP2.AC1C4		;HANDLE ZERO CASE , TEST FOR POSSIBLE MSB
   	MOVWF LP4D,1		;UPDATE LPD1
   	BRA TP2.AC24			;GO CK ROTOR 2
TP2.AC1A4
	MOVF LP4DH,1,1		;TEST MSB
	BZ TP2.AC1B4			;HANDLE 0 TIME OUT
	DECF LP4DH,1,1		;UPDATE MSB
	MOVWF LP4D,1			;UPDATE LSB
	BRA TP2.AC24			;NO TIMEOUT SO GO CK ROTOR 2
TP2.AC1B4
   	BSF FC4				;HAD BORROW OR WAS ZERO SO TURN ON NOW
   	CLRF LP4D
   	CLRF LP4DH
   	BRA TP2.AC24
TP2.AC1C4				;ZERO LSB COUNT
	MOVF LP4DH,1,1		;TEST MSB
	BZ TP2.AC1B4			;IF TOTAL COUNT = 0 THEN TIME FOR DWELL OTHERWISE GO ON WITH NEXT ROTOR
TP2.AC24												;DONE
	RETURN	
;*************  16 BIT DWELL END	
TP2.0E
	BSF DSF
	MOVLW HIGH MAPRPMSTR		;THE LSF CONSTANT
	CPFSLT TPH,1
	BRA TP2.0F		;GO SET LSF
	BTFSC LSF
	BSF DDF
	BTFSC LSF
	BSF DDF
	BCF LSF
	BRA TP2.0D		;RPM BETWEEN LSF ANF DSF POINT.  GO TEST FOR RPM ACCELERATION
TP2.0F
	BSF LSF			;RPM < LSF POINT, HARDWARE DWELL SO NO CK FOR ACL NEEDED
	RETURN
; ***************  ACL END
    ;T2END  2007 OR LATER END ROUT
	
;					******  ADDED FOR A72007
 
TP2.STR		;START 30 DEG TIMING INTERVAL V8 
	CPFSEQ T2CNT,1		;COMPARE THE EVENT IN WREG TO T2CNT AND EXIT IF NOT EQUAL
	RETURN		;WAS NOT EQUAL SO EXIT
	BCF T0CON,TMR0ON,0	;TURN TIMER OFF (IF IT WAS ON)  NOT NECESSARY
	CLRF TMR0H,0
	CLRF TMR0L,0
	BSF T0CON,TMR0ON,0
	BSF ANF					;ADDED FOR TRIMAP OPTION
	BSF T2F				;TELL T2END WE HAD A VALID START
	RETURN 		;callable routine, regular return, no update of registers

TP2.3					;T2CNT = 3
	CPFSEQ T2CNT,1		;COMPARE THE EVENT IN WREG TO T2CNT AND EXIT IF NOT EQUAL
	RETURN		;WAS NOT EQUAL SO EXIT	
	BTFSS T1F		;SEE CAM TRIGGER?
	BRA TP2.3A
	BSF ALT
	BCF T1F
	RETURN
TP2.3A
	BCF ALT			;NO T1F SO CLR ALT   
	RETURN
	
TP2.LT1			;T2CNT 14   LOAD TIMER 0 W/ SPARK DELAY FOR GP 1
	CPFSEQ T2CNT,1		;COMPARE THE EVENT IN WREG TO T2CNT AND EXIT IF NOT EQUAL
	RETURN		;WAS NOT EQUAL SO EXIT
	BTFSS VT		;VALID TIMING?
	RETURN		;EXIT IF NOT
	MOVFF SDH,TMR0H
	MOVFF SDL,TMR0L		;LOAD TMR0 WITH SPARK DELAY 16 BIT
	BSF T0CON,TMR0ON,0
	BTFSC ALT
	BRA TP2.LT2
	BSF R1F			;SET ROTOR 1 (GP1) FLAG FOR TIMER 0 INT ROUT.
	BCF R2F			; CLEAR THE OTHER ON JUST TO BE SURE
	BCF R3F
	BCF R4F
	RETURN

TP2.LT2			;LOAD TIMER 0 W/ SPARK DELAY FOR GP 2
	BCF R1F			;SET R2F (GP2) FLAG FOR TIMER 0 INT ROUT.
	BSF R2F			; CLEAR THE OTHERS JUST TO BE SURE
	BCF R3F
	BCF R4F
	RETURN

TP2.LT3				;T2CNT = 30  LOAD TIMER 0 W/ SPARK DELAY FOR C 3  
	CPFSEQ T2CNT,1		;COMPARE THE EVENT IN WREG TO T2CNT AND EXIT IF NOT EQUAL
	RETURN		;WAS NOT EQUAL SO EXIT
	BTFSS VT		;VALID TIMING?
	RETURN		;EXIT IF NOT
	MOVFF SDH,TMR0H
	MOVFF SDL,TMR0L		;LOAD TMR0 WITH SPARK DELAY 16 BIT
	BSF T0CON,TMR0ON,0
	BTFSC ALT
	BRA TP2.LT4
	BCF R1F	
	BCF R2F			; CLEAR THE OTHER ON JUST TO BE SURE
	BSF R3F			;SET R3F
	BCF R4F			
	RETURN

TP2.LT4					;LOAD TIMER 0 W/ SPARK DELAY FOR GP 4
	BCF R1F
	BCF R2F			; CLEAR THE OTHER ON JUST TO BE SURE
	BCF R3F
	BSF R4F
;	BCF ALT			;*****  TEST
	RETURN
	
TP2.LSD1				; T2CNT = LOW SPEED DWELL EVENT : GP 1  
	CPFSEQ T2CNT,1		;COMPARE THE EVENT IN WREG TO T2CNT AND EXIT IF NOT EQUAL
	RETURN		;WAS NOT EQUAL SO EXIT
	BTFSS VT		;TEST FOR VALID TIMING  
	RETURN
	BTFSC ALT		;  "
	BRA TP2.LSD2	;GO FOR C 2 IF NO ALT
	BTFSS LSF		;TEST FOR LOW SPEED DWELL FLAG
	BRA TP2.LSD1A
	BSF FC1		;TURN COIL GP1 ON
	BSF FC2
TP2.LSD1A
	BTFSS DDF
	RETURN
	BSF FC1
	BSF FC2
	BCF DDF
	RETURN

TP2.LSD2			;LOW SPEED DWELL EVENT GP 2 
	BTFSS LSF		;TEST FOR LOW SPEED DWELL FLAG
	BRA TP2.LSD2A
	BSF FC1
	BSF FC2			;TURN GP 2 COIL ON
TP2.LSD2A
	BTFSS DDF
	RETURN
	BSF FC1
	BSF FC2
	BCF DDF
	RETURN

TP2.LSD3			;T2CNT = 1   LOW SPEED DWELL EVENT  GP 3
	CPFSEQ T2CNT,1		;COMPARE THE EVENT IN WREG TO T2CNT AND EXIT IF NOT EQUAL
	RETURN		;WAS NOT EQUAL SO EXIT
	BTFSS VT		;TEST FOR VALID TIMING  
	RETURN
	BTFSC ALT		;  "
	BRA TP2.LSD4
	BTFSS LSF		;TEST FOR LOW SPEED DWELL FLAG
	BRA TP2.LSD3A
	BSF FC3		;TURN COIL GP1 ON
	BSF FC4
TP2.LSD3A
	BTFSS DDF
	RETURN
	BSF FC3
	BSF FC4
	BCF DDF
	RETURN

TP2.LSD4			;LOW SPEED DWELL EVENT  GP 4
	BTFSS LSF		;TEST FOR LOW SPEED DWELL FLAG
	BRA TP2.LSD4A
	BSF FC3
	BSF FC4			;TURN GP 2 COIL ON
TP2.LSD4A
	BTFSS DDF
	RETURN
	BSF FC3
	BSF FC4
	BCF DDF
	RETURN

TP2.LSI1				;T2CNT 18   LOW SPEED IGN GP1
	CPFSEQ T2CNT,1		;COMPARE THE EVENT IN WREG TO T2CNT AND EXIT IF NOT EQUAL
	RETURN		;WAS NOT EQUAL SO EXIT
	BTFSC ALT
	BRA TP2.LSI2
	BCF FC1
	BCF FC2
	RETURN

TP2.LSI2				;LOW SPEED IGN GP2
	BCF FC2
	BCF FC1
	RETURN
	
TP2.LSI3				;LOW SPEED IGN GP3
	CPFSEQ T2CNT,1		;COMPARE THE EVENT IN WREG TO T2CNT AND EXIT IF NOT EQUAL
	RETURN		;WAS NOT EQUAL SO EXIT
	BTFSC ALT
	BRA TP2.LSI4
	BCF FC3
	BCF FC4
	RETURN
	
TP2.LSI4				;LOW SPEED IGN GP4
	BCF FC3
	BCF FC4
	RETURN
  ENDIF    ;END OF A72007 ROUTS
;******* END OF ADDED FOR A72007	
 ENDIF				;END OF 0xA7 TP2INT

 IF ENG==0xAF		;DIST V6 ENGINE
TP2INT
	BCF T0CON,TMR0ON,0	;STOP TIMER
	MOVLW D'200'
	MOVLW DTCL,1
	BTFSS T2F			;T2 INTERVAL END?
	BRA TP2.F			;NO FLAG SO INITIATE FIRST CYCLE
	BTFSC TOOHI		;TEST FOR TM0 OVERFLOW
	BRA TP2.F		;START NEW CYCLY FROM 0
	MOVFF TMR0L,TPL	;CAPTURE 120 DEG PERIOD
	MOVFF TMR0H,TPH
	MOVFF TPH,TX2H	;CD NEEDS THIS COUNT BECAUSE IT IS BASED ON EXPECTED COUNT ON ROTARY CLOCK RATE (X4)
	MOVFF TPL,TX2L
	MOVFF SDH,TMR0H	;LOAD SPARK DELAY DO THIS HERE IN CASE IT IS A NORMAL CYCLE
	MOVFF SDL,TMR0L
	BCF T2F			;jic AGAIN
	DECF T1CNT,1,1
	BTFSC _C		;TEST FOR ROLL OVER (CLEARED IF ROLL OVER HAPPENED)
	BRA TP2.C		;GO ON, NO ROLLOVER
	MOVLW 2			;THIS MAKES A 3 COUNT SEQUENCE 2-1-0-2-1-0..........  WILL INJECT ALTERNATE BANKS ON 0 AND 1
	MOVWF T1CNT,1
	BTG ALT			;TOGGLE THE INJECTOR BANK SELECT
TP2.C	
	BTFSS VT		;VALID TIMING GENERATED?
	BRA TP2.C2 		;NO, BUT WE DO HAVE A VALID SAMPLE TO WORK ON, GO SET MF
	BTFSS LSF		;TEST FOR LOW SPEED FLAG
	BRA TP2.C1		;GO HANDLE NORMAL  (DELAY 10 DEG & FIRE)
TP2.G				;LSF CYCLE
					;LOW SPEED IGNITION  WHEN LSF IS SET
	MOVF T4L,0,1 			;LOAD TMR0 W/11.25 DEG
	ADDWF T8L,0,1
	COMF WREG,0,0		;MAKE IT A TIMER VALUE
	MOVWF IARGL
	MOVF T4H,0,1
	ADDWFC T8H,0,1
	COMF WREG,0,0
	MOVWF TMR0H,0
	MOVFF IARGL,TMR0L
	BSF FC1				;DWELL FOR LSF
	BSF FC2
TP2.C1					;NORMAL CYCLE
	BSF T0CON,TMR0ON,0	;START SPARK DELAY COUNT FOR EITHER LSF OR NORMAL
TP2.C2					;TEST FOR LS AFTER STARTING A LS CYCLE SO WE DON'T DROP A DWELL?
	MOVLW 0x28			;test for low speed threshold at 500 rpm
	CPFSGT TPH,1		;ABOUT 10320
	BRA TP2.B			;WAS <= SO GO CLEAR LOW SPEED FLAG
	BSF LSF				;WAS > SO SET THE FLAG	
	BRA TP2.A			;GO ON
TP2.B
	BCF LSF
TP2.A
;ACCL START
	BTFSS ACCF		;IS ACCF FLAG NOT SET, GO ON
	BRA TP2.ACC
	DCFSNZ ACCNT,1,1		;DECREMENT ACCELERATION CTR (GIVES 1/2 SEC OF ACCL TIME @ 2000 RPM)
	BCF ACCF		;CLR IT IF TIME UP
;ACCL END
TP2.ACC
	BCF _C				;DIVIDE BY 4 TO MAKE IT 30 DEG COUNT
	RRCF TPH,1,1
	RRCF TPL,1,1
	BCF _C
	RRCF TPH,1,1
	RRCF TPL,1,1
	BSF MF				;TELL EXEC TO DO THE MATH
	BTFSS VT			;VALID TIMING? (IF WE GOT HERE FROM A T2F BUT NO VT) 
	BRA TP2.F			;START A NEW CYCLE
TP2.D				;HANDLE FUEL INJECTION
	BCF STRF		;KILL THE START FLAG
	BTFSS ALT		;ALTERNATE THE INJECTION BANKS
	BRA TP2.E		;DO BANK ONE WHEN SET
	MOVLW 0		;TIME FOR INJ?
	CPFSEQ T1CNT,1
	BRA TP2.E
	BSF FI1	;FIRE BK1 INJECTORS
	BSF FI2
	MOVFF IPWL,R1ITL
	MOVFF IPWH,R1ITH
	BSF INJ1
	RETURN
TP2.E
	BTFSC ALT
	RETURN
	MOVLW 0		;TIME FOR INJ?
	CPFSEQ T1CNT,1
	RETURN
	BSF FI3	;FIRE BK2 INJECTORS
	BSF FI4
	MOVFF IPWL,R2ITL
	MOVFF IPWH,R2ITH
	BSF INJ2
	RETURN
TP2.F	
	BCF T0CON,TMR0ON,0	;STOP IT
	CLRF TMR0H,0
	CLRF TMR0L,0
	BSF T0CON,TMR0ON,0		;START TIMER
	BSF T2F
	BCF TOOHI
	BCF VT
	RETURN
 ENDIF   		;0xAF DIST V6 
 
 IF ENG==0xB3
TP2INT
	BCF T0CON,TMR0ON,0		;STOP TMR 0   (ALWAYS TIMING 90 DEG T2 INTERVAL)
	MOVFF TMR0L,TPLTEMP		;save timer 0 count (T2 interval 90 DEG)  READ lsb first,  (write msb first)
	MOVFF TMR0H,TPHTEMP
	CLRF TMR0H,0			;CLR THE TIMER
	CLRF TMR0L,0
	BSF T0CON,TMR0ON,0		;RESTART IT
	INCF T2CNT,1,1			;INC T2 COUNT
;************				;NEW LSF DWELL SCHEME
T2LT					;GENERIC TEST FOR RPM (IN TPH&LTEMP) LESS THAN CONSTANT (606 RPM 90 DEG COUNT) IN THIS ROUT  RETURNS LSF SET IF TRUE, CLR IF FALSE
	MOVLW 0x1E			;AARGH,0,1
	CPFSGT TPHTEMP,1
	BRA T2LT.A			;TEST FOR MSB =
	BRA T2LT.X			;RPM WAS LT SO EXIT W/ CY SET
T2LT.A
	CPFSEQ TPHTEMP,1		;MSB EQ?
	BRA T2NLT			;BRA RPM NOT LT (IT WAS >)
	MOVLW 0x36				;F AARGL,0,1		;GET LSB
	CPFSGT TPLTEMP,1
	BRA T2NLT			;NOT LT SO EXIT FALSE
T2LT.X
	BSF LSF				;SET LSF FOR RPM < AARGH&L TARGET
	BRA TP2INT.B
T2NLT
	BCF LSF				;CLR LSF FOR RPM NOT LT
TP2INT.B	
	BTFSS LSF			;NEED AN LSF DELAY CYCLE?
	BRA TP2INT.A
 	MOVLW D'3'			;WAS LSF
	MOVWF DTCH,1
	MOVLW D'255'
	CLRF DTCL,1
	CLRWDT				; KEEP?
	BTFSS SYNF				;GOT T1 CAM INT FOR SYNC?
	RETURN
  	BCF T3CON,TMR3ON,0		;STOP IT JUST IN CASE IT WAS RUNNING
	BSF T2F			;SET T2F TO LET T0INT KNOW THIS IS AN LSF 30 DEG DELAY CYCLE
	MOVFF AARGL,ARGLTEMP	;SAVE FOR THIS INT
	MOVFF AARGH,ARGHTEMP
	MOVFF BARGL,BARGLTEMP
  	MOVFF TPHTEMP,AARGH		;LOAD TMR3 W/ 90 DEG
  	MOVFF TPLTEMP,AARGL
  	MOVLW D'3'				;FIND 30 DEG.
  	MOVWF BARGL,1
  	CALL DIV				
  	BCF _C					;NOW X4 FOR TMR 3 RUNNING 4X FASTER
  	RLCF AARGL,1
  	RLCF AARGH,1
  	RLCF AARGL,1
  	RLCF AARGH,1
  	COMF AARGL,1			;COMP FOR TIMER
  	COMF AARGH,1
  	MOVFF AARGH,TMR3H
  	MOVFF AARGL,TMR3L
  	BSF T3CON,TMR3ON,0		;START IT		
	MOVFF ARGLTEMP,AARGL	;RESTORE AFTER INT
	MOVFF ARGHTEMP,AARGH
	MOVFF BARGLTEMP,BARGL
	BSF MF					;TELL EXEC TO DO MATH SO TMR3 ROUT WILL HAVE VALID NUMBERS.
	BRA TP2.0A
	
TP2INT.A
  IF TBINJ==0
	BTFSC SYNF				;NOT USED ON TBI VER
  ENDIF
	BSF MF		;SET MATH FLAG FOR EXEC  
TP2.0
	MOVLW D'3'			;WAS 01
	MOVWF DTCH,1
	MOVLW D'255'
	CLRF DTCL,1
	CLRWDT				; KEEP?
TP2.0A
  IF TBINJ==0
	BTFSS SYNF				;GOT T1 CAM INT FOR SYNC?
	RETURN
	BTFSS VT				;  VALID TIMING?
	RETURN
  ENDIF
  
  IF TBINJ==1
    BRA TP2.TBI  
  ENDIF	
	MOVF T2CNT,0,1			;PUT IN WREG
	DCFSNZ WREG,0,0	
	BRA TP2.1				;HANDLE T2CNT X
	DCFSNZ WREG,0,0	
	BRA TP2.2	
	DCFSNZ WREG,0,0	
	BRA TP2.3
	DCFSNZ WREG,0,0	
	BRA TP2.4	
	DCFSNZ WREG,0,0	
	BRA TP2.5
	DCFSNZ WREG,0,0	
	BRA TP2.6
	DCFSNZ WREG,0,0	
	BRA TP2.7	
	DCFSNZ WREG,0,0	
	BRA TP2.8
	CLRF STAT0,1			;ERROR
	RETURN

  IF TBINJ==1			;TBI VERSION FOR SINGLE CONTROLLER
TP2.TBI	
    BCF FC1				;FIRE GP 1 COILS.	Cyl # ALL  (DISTRIBUTOR ENGINE)
	MOVFF DWL,LP1D
	MOVFF DWLH,LP1DH
	BTFSC ALT
	BRA TP2.TBI1
	MOVFF IPWL,R1ITL
	MOVFF IPWH,R1ITH
	BSF INJ1
	BTFSS REVF			;TEST FOR REV LIMITER
	BSF FI1
	BTG ALT
	RETURN

TP2.TBI1
	MOVFF IPWL,R2ITL
	MOVFF IPWH,R2ITH
	BSF INJ2
	BTFSS REVF
	BSF FI2
	BTG ALT
	BCF STRF
	RETURN
  ENDIF
  		
TP2.1
	CLRF SEQFLAG
	BSF R1F				;SET FOR TMR3 ROUT
	BTFSC LSF			;TEST FOR LSF
	RETURN				;DOING A 30 DEG DELAY SO EXIT
	MOVFF SDH,TMR3H
	MOVFF SDL,TMR3L		;LOAD TMR3 WITH SPARK DELAY 16 BIT
	BSF T3CON,TMR3ON,0
	RETURN
	
TP2.2
	CLRF SEQFLAG
	BSF R2F
	BTFSC LSF			;TEST FOR LSF
	BRA TP2.2A				;DOING A 30 DEG DELAY SO EXIT
	MOVFF SDH,TMR3H
	MOVFF SDL,TMR3L		;LOAD TMR3 WITH SPARK DELAY 16 BIT
	BSF T3CON,TMR3ON,0
TP2.2A
	MOVFF IPWL,R1ITL
	MOVFF IPWH,R1ITH
	BSF INJ1
	BTFSS REVF			;TEST FOR REV LIMITER
	BSF FI1
	RETURN
	
TP2.3
	CLRF SEQFLAG
	BSF R3F
	BTFSC LSF			;TEST FOR LSF
	RETURN				;DOING A 30 DEG DELAY SO EXIT
	MOVFF SDH,TMR3H
	MOVFF SDL,TMR3L		;LOAD TMR3 WITH SPARK DELAY 16 BIT
	BSF T3CON,TMR3ON,0
	RETURN
	
TP2.4
	CLRF SEQFLAG
	BSF R4F
	BTFSC LSF			;TEST FOR LSF
	BRA TP2.4A				;DOING A 30 DEG DELAY SO EXIT
	MOVFF SDH,TMR3H
	MOVFF SDL,TMR3L		;LOAD TMR3 WITH SPARK DELAY 16 BIT
	BSF T3CON,TMR3ON,0
TP2.4A	
	MOVFF IPWL,R2ITL
	MOVFF IPWH,R2ITH
	BSF INJ2
	BTFSS REVF
	BSF FI2
	RETURN
	
TP2.5
	CLRF SEQFLAG
	BSF R5F
	BTFSC LSF			;TEST FOR LSF
	RETURN				;DOING A 30 DEG DELAY SO EXIT
	MOVFF SDH,TMR3H
	MOVFF SDL,TMR3L		;LOAD TMR3 WITH SPARK DELAY 16 BIT
	BSF T3CON,TMR3ON,0
	RETURN
	
TP2.6
	CLRF SEQFLAG
	BSF R6F
	BTFSC LSF			;TEST FOR LSF
	BRA TP2.6A				;DOING A 30 DEG DELAY SO EXIT
	MOVFF SDH,TMR3H
	MOVFF SDL,TMR3L		;LOAD TMR3 WITH SPARK DELAY 16 BIT
	BSF T3CON,TMR3ON,0
TP2.6A
	MOVFF IPWL,R3ITL
	MOVFF IPWH,R3ITH
	BSF INJ3
	BTFSS REVF
	BSF FI3
	RETURN
	
TP2.7
	CLRF SEQFLAG
	BSF R7F
	BTFSC LSF			;TEST FOR LSF
	RETURN				;DOING A 30 DEG DELAY SO EXIT
	MOVFF SDH,TMR3H
	MOVFF SDL,TMR3L		;LOAD TMR3 WITH SPARK DELAY 16 BIT
	BSF T3CON,TMR3ON,0
	RETURN
	
TP2.8
	CLRF SEQFLAG
	BSF R8F
	BTFSC LSF			;TEST FOR LSF
	BRA TP2.8A				;DOING A 30 DEG DELAY SO EXIT
	MOVFF SDH,TMR3H
	MOVFF SDL,TMR3L		;LOAD TMR3 WITH SPARK DELAY 16 BIT
	BSF T3CON,TMR3ON,0
TP2.8A
	MOVFF IPWL,R4ITL
	MOVFF IPWH,R4ITH
	BSF INJ4
	BTFSS REVF
	BSF FI4	
	BCF STRF			;CLEAR START FLAG
	RETURN
 ENDIF					;END OF 0xB3

 IF ENG==0xB4
TP2INT
	BCF _C				;DIVIDE TOLDL&H BY 2			;TEST FOR SYNC INTERVAL
	RRCF TOLDH,0,1		;ADD TO TOLDL&H, SAVE IN IARG
	MOVWF IARGH,1		;SAVE IT
	RRCF TOLDL,0,1		;GET LSB OF NEW/2 TO WREG
	ADDWF TOLDL,0,1		;
	MOVWF IARGL,1		;
	MOVF IARGH,0,1		;GET MSB
	ADDWFC TOLDH,0,1	;DO MSB
	MOVWF IARGH,1		;SAVE MSB
	MOVF IARGL,0,1		;GET LSB OF TOLD * 1.5	

	SUBWF SYNCL,0,1		;SUBTRACT  (OLD*1.5) FROM NEW SYNC, IF NO BORROW (CY SET) THEN WE HAVE DETECTED SYNC INTERVAL 
	MOVF IARGH,0,1		;GET  MSB
	SUBWFB SYNCH,0,1	;SUB MSB
	BTFSS _C			;TEST FOR BORROW.  IF NEW SYNC - (OLD+1/2 OLD) DOES NOT GENERATE BORROW (CY SET) THEN WE HAVE SYNC DETECT
	BRA TP2.00			;NO BORROW SO NO SYNC DET, GO ON
	MOVLW D'8'
	CPFSGT T2CNT,1
	BRA TP2.00		;WAS A SYNC BUT NOT MASTER SYNC SO JUST HANDLE AS STANDARD T2 EVENT
	BSF SYNF		;SET ENGINE SYNC FOUND FLAG
	BTG ALT			;TOGGLE ALT FLAG	
	CLRF T2CNT,1	;CLR T2 COUNT (WILL BE INCREMENTED TO 1 DOWNSTREAM)
	BTFSS CAF		;BACKUP SENSOR IS 22.5 DEG AFTER PRIMARY SO WE ARE BUMPING T2CNT BY ONE TO COMPENSATE FOR 15 DEG OF DELTA
	INCF T2CNT,1,1	;THE OTHER 7.5 DEG DIFFERENCE IS MADE UP FOR BY SPDC ROUT WHICH REDUCES THE BASIC DELAY BY 7.5 DEG

TP2.00
	MOVFF SYNCL,TOLDL	; save LATEST SYNC counT IN TOLDL&H
	MOVFF SYNCH,TOLDH
	CLRF SYNCL,1		;CLEAR SYNC REG FOR NEXT CAPTURE CYCLE
	CLRF SYNCH,1
TP2.01		
	MOVLW D'255'		;LOAD DEAD TIME CTR (50 ms)   42 MS IS SYNC GAP @ 120 RPM (RENESIS)  *********
	MOVWF DTCL,1

           ;(ALL HANDLER LIST & HANDLERS FOR 0xA8 & AD GOES HERE)

TP2.L			;T2 EVENT HANDLER FOR A CONTROLLER  VT SHOULD BE OK IF WE GOT HERE
	INCF T2CNT,1,1		;INC T2 COUNT  WE HAVE SYNC SO START COUNTING T2  (last t2 pulse of sync2 interval is called t2 #1)
	BTFSS SYNF		; DO WE HAVE SYNC?    04-27-02   SYNF ONLY CLR BY DTC TIMEOUT
	RETURN			;EXIT IF NOT	
			;T2 EVENT HANDLER
	MOVLW D'2'		; LOW SPEED DWELL GP2 EVENT (IF LSF SET) WAS 01
	CPFSGT T2CNT,1		;GO ON IF >
	BRA TP2.1		;GO HANDLE IT
	MOVLW D'3'		;LOOK FOR START T2 INTERVAL EVENT
	CPFSGT T2CNT,1		;GO ON IF > 
	BRA TP2.4		;GO HANDLE IT  
 	MOVLW D'5'		;LOOK FOR END T2 INTERVAL EVENT
	CPFSGT T2CNT,1		;GO ON IF >
	BRA TP2.END		;GO HANDLE IT
 	MOVLW D'7'		; 7 LD GP3 TMR0 
	CPFSGT T2CNT,1		;GO ON IF >
	BRA TP2.7		;GO HANDLE IT
	MOVLW D'9'		;LSD GP3 EVENT    WAS 08
	CPFSGT T2CNT,1		;GO ON IF > 
	BRA TP2.8		;GO HANDLE IT
	MOVLW D'10'		;LOOK FOR STR T2 INTERVAL EVENT  
	CPFSGT T2CNT,1		;GO ON IF > 
	BRA TP2.11		;GO HANDLE IT	
	MOVLW D'12'		;LOOK FOR END T2 INTERVAL EVENT  
	CPFSGT T2CNT,1		;GO ON IF >
	BRA TP2.END		;GO HANDLE IT
	MOVLW D'14'		; 14 LD GP1 TMR0 
	CPFSGT T2CNT,1		;GO ON IF >
	BRA TP2.14		;GO HANDLE IT
	MOVLW D'17'		;LSD GP1 EVENT  WAS 16
	CPFSGT T2CNT,1		;GO ON IF > 
	BRA TP2.16		;GO HANDLE IT
	MOVLW D'18'		;LOOK FOR STR T2 INTERVAL EVENT  
	CPFSGT T2CNT,1		;GO ON IF >
	BRA TP2.19		;GO HANDLE IT	
	MOVLW D'20'		;LOOK FOR END T2 INTERVAL EVENT  
	CPFSGT T2CNT,1		;GO ON IF > 
	BRA TP2.END
	MOVLW D'22'		;GP2 LD TMR0
	CPFSGT T2CNT,1		;GO ON IF > 22
	BRA TP2.22
	RETURN		;NO ACTION T2 CNT SO EXIT

TP2.4             ;LSI GP2 & STR T2
	CPFSEQ T2CNT,1		;COMPARE THE EVENT IN WREG TO T2CNT AND EXIT IF NOT EQUAL
	RETURN		;WAS NOT EQUAL SO EXIT
	BCF FC2				;CYL #2
	BCF FC5				;CYL #6
	BRA TP2.STR
	
TP2.11             ;LSI GP3 & STR T2
	CPFSEQ T2CNT,1		;COMPARE THE EVENT IN WREG TO T2CNT AND EXIT IF NOT EQUAL
	RETURN		;WAS NOT EQUAL SO EXIT
	BCF FC3				;CYL #1
	BCF FC6				;CYL #5
	BRA TP2.STR
	
TP2.19             ;LSI GP1 & STR T2
	CPFSEQ T2CNT,1		;COMPARE THE EVENT IN WREG TO T2CNT AND EXIT IF NOT EQUAL
	RETURN		;WAS NOT EQUAL SO EXIT
	BCF FC1				;CYL #3	
	BCF FC4				;CYL #4
	BRA TP2.STR
	
TP2.7				;60 DEG BTDC GP3
	CPFSEQ T2CNT,1		;COMPARE THE EVENT IN WREG TO T2CNT AND EXIT IF NOT EQUAL
	RETURN		;WAS NOT EQUAL SO EXIT
	BSF R3F			
	BCF R2F
	BCF R1F
	BTFSS VT
	RETURN		;EXIT IF NO VT	
	MOVFF SDH,TMR0H		;MUST LOAD MSB FIRST
	MOVFF SDL,TMR0L		;LOAD TMR0 WITH SPARK DELAY
	BSF T0CON,TMR0ON,0
	RETURN

TP2.14				;60 DEG BTDC GP1
	CPFSEQ T2CNT,1		;COMPARE THE EVENT IN WREG TO T2CNT AND EXIT IF NOT EQUAL
	RETURN		;WAS NOT EQUAL SO EXIT
	BSF R1F			
	BCF R2F
	BCF R3F
	BTFSS VT
	RETURN		;EXIT IF NO VT	
	MOVFF SDH,TMR0H		;MUST LOAD MSB FIRST
	MOVFF SDL,TMR0L		;LOAD TMR0 WITH SPARK DELAY
	BSF T0CON,TMR0ON,0
	RETURN

TP2.22				;60 DEG BTDC GP2
	CPFSEQ T2CNT,1		;COMPARE THE EVENT IN WREG TO T2CNT AND EXIT IF NOT EQUAL
	RETURN		;WAS NOT EQUAL SO EXIT
	BSF R2F			
	BCF R3F
	BCF R1F
	BTFSS VT
	RETURN		;EXIT IF NO VT	
	MOVFF SDH,TMR0H		;MUST LOAD MSB FIRST
	MOVFF SDL,TMR0L		;LOAD TMR0 WITH SPARK DELAY
	BSF T0CON,TMR0ON,0
	RETURN

		;START TP2 30 DEGREE TIMING INTERVAL 
TP2.STR	
;	CPFSEQ T2CNT,1		;COMPARE THE EVENT IN WREG TO T2CNT AND EXIT IF NOT EQUAL   ALREADY DONE IN CALLING ROUT.
;	RETURN		;WAS NOT EQUAL SO EXIT
	BCF T0CON,TMR0ON,0
	CLRF TMR0H,0
	CLRF TMR0L,0
	BSF T0CON,TMR0ON,0
	BSF ANF
	BSF T2F			
	RETURN

TP2.END		;  T2 INTERVAL TIME CAPTURE RENESIS RX-8  *******
	CPFSEQ T2CNT,1		;COMPARE THE EVENT IN WREG TO T2CNT AND EXIT IF NOT EQUAL
	RETURN				;WAS NOT EQUAL SO EXIT
	BCF T0CON,TMR0ON,0	;stop timer 0
	BSF MF				;SET MATH FLAG FOR EXEC
	BCF T2F				;CLEAR IT FOR TMOINT ROUT
	MOVFF TMR0L,TPL		;save NEW timer 0 count (T2 interval)  READ lsb first,  (write msb first)
	MOVFF TMR0H,TPH		
	
;ACCL START
TP2.END2
	BTFSS ACCF		;IS ACCF FLAG NOT SET, GO ON  
	BRA TP2.END3
	DCFSNZ ACCNT,1,1		;DECREMENT ACCELERATION CTR (GIVES 1/2 SEC OF ACCL TIME @ 2000 RPM)
	BCF ACCF		;CLR IT IF TIME UP
TP2.END3
;ACCL END

TP2.ACL											;  *********  NEW ACL START
	MOVLW HIGH DWLSPD	;GET DWELL TRANSITION SPEED DSF
	CPFSLT TPH,1		;ENG SPEED LT?
	BRA TP2.0E			;GO SET DSF  & TEST FOR LSF
	BCF DSF
	BTFSC LSF
	BSF DDF
	BCF LSF				;ENG RPM > DSF SPEED				
	
TP2.0D				;TEST FOR ACCELERATION 
	MOVFF TPLOLD,IARGL
	MOVFF TPHOLD,IARGH
	MOVF TPL,0,1
	SUBWF IARGL,1,1
	MOVF TPH,0,1
	SUBWFB IARGH,1,1
	BNC TP2.0X	;NEW RPM WAS < OLD SO EXIT,   IS NEW RPM > OLD?  IF CY SET, NEW TPH < OLD SO TEST FOR ACCL
	
 	TSTFSZ IARGH,1		;TEST MSB OF DELTA 
 	BRA TP2.AC1			;MSB NOT ZERO SO PROCESS
 	MOVLW D'32'		;LOW ACTHRESH 			;MSB WAS 0 SO TEST LSB CONSTANT
 	CPFSLT IARGL,1			;COMPARE LSB CONST TO LSB VAR
 	BRA TP2.AC1				;TRUE EXIT DELTA >= THRESH
TP2.0X
 	RETURN					;FALSE EXIT,  DELTA < THRESH
TP2.AC1
	MOVLW 0x1F
	ANDWF IARGL,1
   	BCF _C
   	RRCF IARGH,1,1			;DIV DELTA BY 32
   	RRCF IARGL,1,1
   	RRCF IARGH,1,1
   	RRCF IARGL,1,1
   	RRCF IARGH,1,1
   	RRCF IARGL,1,1
   	RRCF IARGH,1,1
   	RRCF IARGL,1,1
   	RRCF IARGH,1,1
   	RRCF IARGL,1,1
 	
  	MOVLW D'6'			;BUMP IT FOR EMPIRICAL VALUE 
   	ADDWF IARGL,1,1
    MOVF IARGL,0,1		;GET DWL DELTA IN WREG
   	MOVF LP1D,1,1		;TEST LPD1 FOR ACTIVE
   	BZ TP2.AC2			;GO TO NEXT DWELL IF NOT ACTIVE	
   	SUBWF LP1D,0,1		;SUB DELTA FROM COUNT
   	BC TP2.AC3				;IF NO BORROW GO ON
TP2.AC1A
   	BSF FC1				;HAD BORROW OR WAS ZERO SO TURN ON NOW
   	BSF FC4
   	CLRF LP1D			;SET INACTIVE
   	BRA TP2.AC2
TP2.AC3
	BTFSC STATUS,Z,0	;test for zero
	BRA TP2.AC1A		;HANDLE ZERO CASE   	
   	MOVWF LP1D,1		;UPDATE LPD1
TP2.AC2					;TEST LPD2
   	
   	MOVF IARGL,0,1		;GET DWL DELTA IN WREG
   	MOVF LP2D,1,1		;TEST LPD1 FOR ACTIVE
   	BZ TP2.AC22			;GO TO NEXT DWELL IF NOT ACTIVE	
   	SUBWF LP2D,0,1		;SUB DELTA FROM COUNT
   	BC TP2.AC32				;IF NO BORROW GO ON
TP2.AC1A2
   	BSF FC2				;HAD BORROW OR WAS ZERO SO TURN ON NOW
   	BSF FC5
   	CLRF LP2D			;SET INACTIVE
   	BRA TP2.AC22
TP2.AC32
	BTFSC STATUS,Z,0	;test for zero
	BRA TP2.AC1A2		;HANDLE ZERO CASE   	
   	MOVWF LP2D,1		;UPDATE LPD1
TP2.AC22					;TEST LPD2
   	
   	MOVF IARGL,0,1		;GET DWL DELTA IN WREG
   	MOVF LP3D,1,1		;TEST LPD1 FOR ACTIVE
   	BZ TP2.AC23			;GO TO NEXT DWELL IF NOT ACTIVE	
   	SUBWF LP3D,0,1		;SUB DELTA FROM COUNT
   	BC TP2.AC33				;IF NO BORROW GO ON
TP2.AC1A3
   	BSF FC3				;HAD BORROW OR WAS ZERO SO TURN ON NOW
   	BSF FC6
   	CLRF LP3D			;SET INACTIVE
   	BRA TP2.AC23
TP2.AC33
	BTFSC STATUS,Z,0	;test for zero
	BRA TP2.AC1A3		;HANDLE ZERO CASE   	
   	MOVWF LP3D,1		;UPDATE LPD3
TP2.AC23					;
 	RETURN
	
TP2.0E					;RPM WAS < DSF SPEED
	BSF DSF	
	MOVLW HIGH MAPRPMSTR		;THE LSF CONSTANT
	CPFSLT TPH,1
	BRA TP2.0F		;GO SET LSF
	BTFSC LSF
	BSF DDF
	BCF LSF
	BRA TP2.0D		;RPM BETWEEN LSF ANF DSF POINT.  GO TEST FOR RPM ACCELERATION
TP2.0F
	BSF LSF
	BRA TP2.0X	;GO SAVE OLD TPH FOR NEXT PASS
;  *********  NEW ACCL END
	
TP2.1			;TEST FOR LOW SPEED GP2 DWELL EVENT
	CPFSEQ T2CNT,1		;COMPARE THE EVENT IN WREG TO T2CNT AND EXIT IF NOT EQUAL
	RETURN		;WAS NOT EQUAL SO EXIT
	BTFSC LSF
	BRA TP2.1A
	BTFSS DDF
	RETURN
	BCF DDF
TP2.1A
	BSF FC2
	BSF FC5
	BCF DDF
	RETURN	
	
TP2.8			;TEST FOR LOW SPEED GP3 DWELL EVENT
	CPFSEQ T2CNT,1		;COMPARE THE EVENT IN WREG TO T2CNT AND EXIT IF NOT EQUAL
	RETURN		;WAS NOT EQUAL SO EXIT
	BTFSC LSF
	BRA TP2.8A
	BTFSS DDF
	RETURN
	BCF DDF
TP2.8A
	BSF FC3
	BSF FC6
	BCF DDF
	RETURN	
	
TP2.16			;TEST FOR LOW SPEED GP1 DWELL EVENT
	CPFSEQ T2CNT,1		;COMPARE THE EVENT IN WREG TO T2CNT AND EXIT IF NOT EQUAL
	RETURN		;WAS NOT EQUAL SO EXIT
	BTFSC LSF
	BRA TP2.16A
	BTFSS DDF
	RETURN
	BCF DDF
TP2.16A
	BSF FC1
	BSF FC4
	RETURN	
	
 ENDIF    ;END OF 0xB4  (USED 0xA8 FOR UPDATE)

TM2INT	;TIMER 2 (18 US INTERRUPT FOR IPW COUNTERS) 3.0 - 4.0 US ~ 20% OF CPU CYCLES

 IF(ENG==0xA1)||(ENG==0xA2)||(ENG==0xA5)||(ENG==0xAF)
 	BCF PIR1,TMR2IF,0		;CLEAR TIMER 2 INT. FLAG SO WE DON'T LOOP ON THIS INT
	BTG IPWX2
	BTFSC IPWX2
	RETFIE 1				;EXIT ON ALTERNATE CYCLES (DOUBLES EFFECTIVE IPW)
	
	BTFSS INJ1		;DECREMENT IPW COUNT IF FLAG SET
	BRA TM2.1		;GO TEST ROTOR 2 IF NOT
	DECF R1ITL,1,1		;DEC LSB OF ROTOR 1 INJECTION TIMER
	BTFSC _C		;SKIP IF CARRY  C IS BORROW NOT?
	BRA TM2.1		;NO CY SO GO DO ROTOR 2
	DECF R1ITH,1,1		;DEC MSB OF ROTOR 1 INJ TIMER
	BTFSC _C		;GO ON TO ROTOR 2 IF NO CY  (C IS BORROW NOT)
	BRA TM2.1		;NO CY SO DO ROTOR 2
	BCF FI1			;STOP INJ 1 (ROTOR 1 INJECTORS)
	BCF FI2
	BCF INJ1		;CLEAR THE DEC FLAG
TM2.1
	BTFSS INJ2	;DECREMENT IPW COUNTER IF FLAG SET
	BRA TM2.2		;EXIT IF NOT
	DECF R2ITL,1,1		;DEC LSB OF ROTOR 2 INJECTION TIMER
	BTFSC _C		;SKIP IF CARRY  C IS BORROW NOT?
	BRA TM2.2		;NO CY SO GO DO ROTOR 3 (if there)
	DECF R2ITH,1,1		;DEC MSB OF ROTOR 2 INJ TIMER
	BTFSC _C		;GO ON TO ROTOR 2 IF NO CY
	BRA TM2.2		;NO CY SO EXIT.   IF THERE, JUMP TO ROTOR 3 ON 20B VER
	BCF FI3			;CLEAR  (ROTOR 2 INJECTORS)
	BCF FI4
	BCF INJ2		;CLEAR THE DEC FLAG
TM2.2
TM2.X
	RETFIE 1			;RETURN & ENABLE 
 ENDIF		;A1,A2,A5,AF


 IF (ENG==0xA3)||(ENG==0xB0) 	;20B
;TM2INT
	BCF PIR1,TMR2IF,0		;CLEAR TIMER 2 INT. FLAG SO WE DON'T LOOP ON THIS INT
  IF (ENG==0xB0)		;ALL OTHERS USE UNISYNC
	INCF SYNCL,1,1		;INC LSB OF SYNC REG
	BTFSS _C		;OVF?
	BRA TM2.0		;NO OVF SO CONTINUE WITH TM2 ROUT
	INCF SYNCH,1,1		;INC MSB IF LSB OVF
	BTFSS _C		;MSB OVF?
	BRA TM2.0		;GO ON IF NOT
	SETF SYNCL,1
	SETF SYNCH,1		;SET MAX VALUE
TM2.0
  ENDIF			;END OF SYNC ROUT IN B0  VER
  
	BTG IPWX2	
	BTFSC IPWX2
	RETFIE 1				;EXIT ON ALTERNATE CYCLES (DOUBLES EFFECTIVE IPW)
	BTFSS INJ1	;DECREMENT IPW COUNT IF FLAG SET
	BRA TM2.1		;GO TEST ROTOR 2 IF NOT
	DECF R1ITL,1,1		;DEC LSB OF ROTOR 1 INJECTION TIMER
	BTFSC _C		;SKIP IF CARRY  C IS BORROW NOT?
	BRA TM2.1		;NO CY SO GO DO ROTOR 2
	DECF R1ITH,1,1		;DEC MSB OF ROTOR 1 INJ TIMER
	BTFSC _C		;GO ON TO ROTOR 2 IF NO CY  (C IS BORROW NOT)
	BRA TM2.1		;NO CY SO DO ROTOR 2
	BCF FI1		;R1 PRI INJECTORS  OFF)
  IF N109TC == 0x01
	BCF FI4		;SECS TOO
  ELSE
  	BCF FI2		;R1 SEC OFF ON ALL OTHERS
  ENDIF
	BCF INJ1		;CLEAR THE DEC FLAG

TM2.1
	BTFSS INJ2	;DECREMENT IPW COUNTER IF FLAG SET
	BRA TM2.1A		;CK ROTOR 3 IF NOT
	DECF R2ITL,1,1		;DEC LSB OF ROTOR 2 INJECTION TIMER
	BTFSC _C		;SKIP IF CARRY  C IS BORROW NOT?
	BRA TM2.1A		;NO CY SO GO DO ROTOR 3 (if there)
	DECF R2ITH,1,1		;DEC MSB OF ROTOR 2 INJ TIMER
	BTFSC _C		;GO ON TO ROTOR 2 IF NO CY
	BRA TM2.1A		;NO CY SO DO ROTOR 3 (IF THERE) mAKE JUMP TO ROTOR 3 ON 20B VER
  IF N109TC == 0x01
	BCF FI2			;R2 PRI INJECTOR ON N109TC
  ELSE
  	BCF FI3			;R2 PRI OFF ON ALL OTHERS
  ENDIF
  IF N109TC == 0x01
	BCF FI5			;R2 SEC ON N109TC
  ELSE
  	BCF FI4			;R2 SEC ON ALL OTHERS
  ENDIF
	BCF INJ2		;CLEAR THE DEC FLAG

TM2.1A
	BTFSS INJ3	;DECREMENT IPW COUNTER IF FLAG SET
	BRA TM2.2		;EXIT IF NOT
	DECF R3ITL,1,1		;DEC LSB OF ROTOR 3 INJECTION TIMER
	BTFSC _C		;SKIP IF CARRY  C IS BORROW NOT?
	BRA TM2.2		;EXIT 
	DECF R3ITH,1,1		;DEC MSB OF ROTOR 3 INJ TIMER
	BTFSC _C		;GO ON TO ROTOR 2 IF NO CY
	BRA TM2.2		;EXIT
  IF N109TC == 0x01
	BCF FI3		;N109TC R3 PRI INJECTOR OFF
  ELSE
  	BCF FI5		;R3 PRI ALL OTHERS
  ENDIF
	BCF FI6		;R3 SEC (SAME ON N109TC AS ALL OTHERS)
	BCF INJ3		;CLEAR THE DEC FLAG
TM2.2
TM2.X
	RETFIE 1			;RETURN & ENABLE 
 ENDIF		;A3,B0

 IF (ENG==0xA6)||(ENG==0xB4) 	;GEO ,HONDA V6
;TM2INT
	BCF PIR1,TMR2IF,0		;CLEAR TIMER 2 INT. FLAG SO WE DON'T LOOP ON THIS INT
	INCF SYNCL,1,1		;INC LSB OF SYNC REG
	BTFSS _C		;OVF?
	BRA TM2.0		;NO OVF SO CONTINUE WITH TM2 ROUT
	INCF SYNCH,1,1		;INC MSB IF LSB OVF
	BTFSS _C		;MSB OVF?
	BRA TM2.0		;GO ON IF NOT
	SETF SYNCL,1
	SETF SYNCH,1		;SET MAX VALUE
TM2.0
	BTG IPWX2	
	BTFSC IPWX2
	RETFIE 1				;EXIT ON ALTERNATE CYCLES (DOUBLES EFFECTIVE IPW)
	
	BTFSS INJ1	;DECREMENT IPW COUNT IF FLAG SET
	BRA TM2.1		;GO TEST ROTOR 2 IF NOT
	DECF R1ITL,1,1		;DEC LSB OF ROTOR 1 INJECTION TIMER
	BTFSC _C		;SKIP IF CARRY  C IS BORROW NOT?
	BRA TM2.1		;NO CY SO GO DO ROTOR 2
	DECF R1ITH,1,1		;DEC MSB OF ROTOR 1 INJ TIMER
	BTFSC _C		;GO ON TO ROTOR 2 IF NO CY  (C IS BORROW NOT)
	BRA TM2.1		;NO CY SO DO ROTOR 2
	BCF FI1		;CLEAR BIT 4 OF PORT D (ROTOR 1 INJECTORS)
	BCF FI4
	BCF INJ1		;CLEAR THE DEC FLAG

TM2.1
	BTFSS INJ2	;DECREMENT IPW COUNTER IF FLAG SET
	BRA TM2.1A		;CK ROTOR 3 IF NOT
	DECF R2ITL,1,1		;DEC LSB OF ROTOR 2 INJECTION TIMER
	BTFSC _C		;SKIP IF CARRY  C IS BORROW NOT?
	BRA TM2.1A		;NO CY SO GO DO ROTOR 3 (if there)
	DECF R2ITH,1,1		;DEC MSB OF ROTOR 2 INJ TIMER
	BTFSC _C		;GO ON TO ROTOR 2 IF NO CY
	BRA TM2.1A		;NO CY SO DO ROTOR 3 (IF THERE) mAKE JUMP TO ROTOR 3 ON 20B VER
	BCF FI2			;CLEAR BITS 5 OF PORT D (ROT 2 INJECTORS)
	BCF FI5
	BCF INJ2		;CLEAR THE DEC FLAG

TM2.1A
	BTFSS INJ3	;DECREMENT IPW COUNTER IF FLAG SET
	BRA TM2.2		;EXIT IF NOT
	DECF R3ITL,1,1		;DEC LSB OF ROTOR 3 INJECTION TIMER
	BTFSC _C		;SKIP IF CARRY  C IS BORROW NOT?
	BRA TM2.2		;EXIT 
	DECF R3ITH,1,1		;DEC MSB OF ROTOR 3 INJ TIMER
	BTFSC _C		;GO ON TO ROTOR 2 IF NO CY
	BRA TM2.2		;EXIT
	BCF FI3		;CLEAR BITS 6 OF PORT D (ROTOR 3 INJECTORS)
	BCF FI6
	BCF INJ3		;CLEAR THE DEC FLAG
TM2.2
TM2.X
	RETFIE 1			;RETURN & ENABLE 
 ENDIF		; A6,B4 & GEO

;*****************
 IF (ENG==0xB5) 	;6 CYL, 60-2 EMT
;TM2INT
	BCF PIR1,TMR2IF,0		;CLEAR TIMER 2 INT. FLAG SO WE DON'T LOOP ON THIS INT
	INCF SYNCL,1,1		;INC LSB OF SYNC REG
	BTFSS _C		;OVF?
	BRA TM2.0		;NO OVF SO CONTINUE WITH TM2 ROUT
	INCF SYNCH,1,1		;INC MSB IF LSB OVF
	BTFSS _C		;MSB OVF?
	BRA TM2.0		;GO ON IF NOT
	SETF SYNCL,1
	SETF SYNCH,1		;SET MAX VALUE
TM2.0
	BTG IPWX2	
	BTFSC IPWX2
	RETFIE 1				;EXIT ON ALTERNATE CYCLES (DOUBLES EFFECTIVE IPW)
	
	BTFSS INJ1	;DECREMENT IPW COUNT IF FLAG SET
	BRA TM2.1		;GO TEST ROTOR 2 IF NOT
	DECF R1ITL,1,1		;DEC LSB OF ROTOR 1 INJECTION TIMER
	BTFSC _C		;SKIP IF CARRY  C IS BORROW NOT?
	BRA TM2.1		;NO CY SO GO DO ROTOR 2
	DECF R1ITH,1,1		;DEC MSB OF ROTOR 1 INJ TIMER
	BTFSC _C		;GO ON TO ROTOR 2 IF NO CY  (C IS BORROW NOT)
	BRA TM2.1		;NO CY SO DO ROTOR 2
	BCF FI1		;CLEAR BIT 4 OF PORT D (GP 1 INJECTORS)
	BCF FI4
	BCF INJ1		;CLEAR THE DEC FLAG

TM2.1
	BTFSS INJ2	;DECREMENT IPW COUNTER IF FLAG SET
	BRA TM2.1A		;CK ROTOR 3 IF NOT
	DECF R2ITL,1,1		;DEC LSB OF ROTOR 2 INJECTION TIMER
	BTFSC _C		;SKIP IF CARRY  C IS BORROW NOT?
	BRA TM2.1A		;NO CY SO GO DO ROTOR 3 (if there)
	DECF R2ITH,1,1		;DEC MSB OF ROTOR 2 INJ TIMER
	BTFSC _C		;GO ON TO ROTOR 2 IF NO CY
	BRA TM2.1A		;NO CY SO DO ROTOR 3 (IF THERE) mAKE JUMP TO ROTOR 3 ON 20B VER
	BCF FI2			;CLEAR BITS 5 OF PORT D (GP 2 INJECTORS)
	BCF FI5
	BCF INJ2		;CLEAR THE DEC FLAG

TM2.1A
	BTFSS INJ3	;DECREMENT IPW COUNTER IF FLAG SET
	BRA TM2.2		;EXIT IF NOT
	DECF R3ITL,1,1		;DEC LSB OF ROTOR 3 INJECTION TIMER
	BTFSC _C		;SKIP IF CARRY  C IS BORROW NOT?
	BRA TM2.2		;EXIT 
	DECF R3ITH,1,1		;DEC MSB OF ROTOR 3 INJ TIMER
	BTFSC _C		;GO ON TO ROTOR 2 IF NO CY
	BRA TM2.2		;EXIT
	BCF FI3		;CLEAR BITS 6 OF PORT D (GP 3 INJECTORS)
	BCF FI6
	BCF INJ3		;CLEAR THE DEC FLAG
TM2.2
TM2.X
	RETFIE 1			;RETURN & ENABLE 
 ENDIF		; B5,B6

;**************
 IF (ENG==0xB2)
;TM2INT
	BCF PIR1,TMR2IF,0		;CLEAR TIMER 2 INT. FLAG SO WE DON'T LOOP ON THIS INT
	INCF SYNCL,1,1		;INC LSB OF SYNC REG
	BTFSS _C		;OVF?
	BRA TM2.0		;NO OVF SO CONTINUE WITH TM2 ROUT
	INCF SYNCH,1,1		;INC MSB IF LSB OVF
	BTFSS _C		;MSB OVF?
	BRA TM2.0		;GO ON IF NOT
	SETF SYNCL,1
	SETF SYNCH,1		;SET MAX VALUE
TM2.0
  IF TBINJ==0			;DON'T NEED LONGER IPWS ON TBI TYPE
	BTG IPWX2			;WANT TO MAKE LONGER INJECTION CYCLES FOR AA V6 12-28-06
	BTFSC IPWX2
	RETFIE 1				;EXIT ON ALTERNATE CYCLES (DOUBLES EFFECTIVE IPW)
  ENDIF
	BTFSS INJ1	;DECREMENT IPW COUNT IF FLAG SET
	BRA TM2.1		;GO TEST ROTOR 2 IF NOT
	DECF R1ITL,1,1		;DEC LSB OF ROTOR 1 INJECTION TIMER
	BTFSC _C		;SKIP IF CARRY  C IS BORROW NOT?
	BRA TM2.1		;NO CY SO GO DO ROTOR 2
	DECF R1ITH,1,1		;DEC MSB OF ROTOR 1 INJ TIMER
	BTFSC _C		;GO ON TO ROTOR 2 IF NO CY  (C IS BORROW NOT)
	BRA TM2.1		;NO CY SO DO ROTOR 2
  IF TBINJ==1
   	BCF FI1		;GP 1 INJ ON TBI TYPE
    BCF FI2		;BU ON GP 1 OF TBI TYPE
  ELSE
    BCF FI1		;INJ 1 ON PORT INJ
  ENDIF
	BCF INJ1		;CLEAR THE ACTIVE FLAG

TM2.1
	BTFSS INJ2	;DECREMENT IPW COUNTER IF FLAG SET
	BRA TM2.1A		;CK ROTOR 3 IF NOT
	DECF R2ITL,1,1		;DEC LSB OF ROTOR 2 INJECTION TIMER
	BTFSC _C		;SKIP IF CARRY  C IS BORROW NOT?
	BRA TM2.1A		;NO CY SO GO DO ROTOR 3 (if there)
	DECF R2ITH,1,1		;DEC MSB OF ROTOR 2 INJ TIMER
	BTFSC _C		;GO ON TO ROTOR 2 IF NO CY
	BRA TM2.1A		;NO CY SO DO ROTOR 3 (IF THERE) mAKE JUMP TO ROTOR 3 ON 20B VER
  IF TBINJ==1
  	BCF FI3			;GP 2 PRI & BU ON TBI TYPE
  	BCF FI4
  ELSE	
	BCF FI2			;CLEAR BITS 5 OF PORT D (ROT 2 INJECTORS)
  ENDIF
	BCF INJ2		;CLEAR THE DEC FLAG
	
TM2.1A
  IF TBINJ==1
  	RETFIE 1
  ELSE			;PORT INJ TYPE
	BTFSS INJ3	;DECREMENT IPW COUNTER IF FLAG SET
	BRA TM2.2		;EXIT IF NOT
	DECF R3ITL,1,1		;DEC LSB OF ROTOR 3 INJECTION TIMER
	BTFSC _C		;SKIP IF CARRY  C IS BORROW NOT?
	BRA TM2.2		;EXIT 
	DECF R3ITH,1,1		;DEC MSB OF ROTOR 3 INJ TIMER
	BTFSC _C		;GO ON TO ROTOR 2 IF NO CY
	BRA TM2.2		;EXIT
	BCF FI3		;CLEAR BITS 6 OF PORT D (ROTOR 3 INJECTORS)
	BCF INJ3		;CLEAR THE DEC FLAG
TM2.2
TM2.X
	RETFIE 1			;RETURN & ENABLE 
  ENDIF
 ENDIF		; B2

 IF (ENG == 0xA4) || (ENG==0xA8) || (ENG == 0xA9)		;RENESIS OR PS VER W/ 60-2 CAS 
;TM2INT
;TIMER 2 (17 US INTERRUPT FOR IPW COUNTERS) 3.75 - 4.75 US ~ 25% OF CPU CYCLES
	;Also used as clock for sync det register (SYNCL&H)
	BCF PIR1,TMR2IF,0		;CLEAR TIMER 2 INT. FLAG SO WE DON'T LOOP ON THIS INT
	INCF SYNCL,1,1		;INC LSB OF SYNC REG
	BTFSS _C		;OVF?
	BRA TM2.0		;NO OVF SO CONTINUE WITH TM2 ROUT
	INCF SYNCH,1,1		;INC MSB IF LSB OVF
	BTFSS _C		;MSB OVF?
	BRA TM2.0		;GO ON IF NOT
	SETF SYNCL,1
	SETF SYNCH,1		;SET MAX VALUE
TM2.0
	BTG IPWX2			;USED TO SLOW TM2 CLOCK TO MAKE LONGER INJECTION CYCLES
	BTFSC IPWX2
	RETFIE 1				;EXIT ON ALTERNATE CYCLES (DOUBLES EFFECTIVE IPW)
	
	BTFSS INJ1	;DECREMENT IPW COUNT IF FLAG SET
	BRA TM2.1		;GO TEST ROTOR 2 IF NOT
	DECF R1ITL,1,1		;DEC LSB OF ROTOR 1 INJECTION TIMER
	BTFSC _C		;SKIP IF CARRY  C IS BORROW NOT?
	BRA TM2.1		;NO CY SO GO DO ROTOR 2
	DECF R1ITH,1,1		;DEC MSB OF ROTOR 1 INJ TIMER
	BTFSC _C		;GO ON TO ROTOR 2 IF NO CY  (C IS BORROW NOT)
	BRA TM2.1		;NO CY SO DO ROTOR 2
	BCF FI1			;CLEAR BIT 4 OF PORT D (ROTOR 1 INJECTORS)
  IF ROTARY==1		
	BCF FI2
  ENDIF
	BCF INJ1		;CLEAR THE DEC FLAG
TM2.1
	BTFSS INJ2	;DECREMENT IPW COUNTER IF FLAG SET
	BRA TM2.2		;CK ROTOR 3 IF NOT
	DECF R2ITL,1,1		;DEC LSB OF ROTOR 2 INJECTION TIMER
	BTFSC _C		;SKIP IF CARRY  C IS BORROW NOT?
	BRA TM2.2		;NO CY SO GO DO ROTOR 3 (if there)
	DECF R2ITH,1,1		;DEC MSB OF ROTOR 2 INJ TIMER
	BTFSC _C		;GO ON TO ROTOR 2 IF NO CY
	BRA TM2.2		;NO CY SO DO ROTOR 3 (IF THERE) mAKE JUMP TO ROTOR 3 ON 20B VER
  IF ROTARY==1
	BCF FI3			;CLEAR BITS 6&7 OF PORT D (ROTOR 2 INJECTORS)
	BCF FI4
  ELSE
	BCF FI2
  ENDIF
	BCF INJ2		;CLEAR THE DEC FLAG
TM2.2
  IF ENG==0xA9		;ADDED INDEPENDANT INJECTOR LOGIC TO A9 ON 09-03-06
	BTFSS INJ3	;DECREMENT IPW COUNTER IF FLAG SET
	BRA TM2.3		;CK # 4 IF NOT
	DECF R3ITL,1,1		;DEC LSB OF #3 INJECTION TIMER
	BTFSC _C		;SKIP IF CARRY  C IS BORROW NOT?
	BRA TM2.3		;NO CY SO GO DO NEXT (if there)
	DECF R3ITH,1,1		;DEC MSB OF ROTOR 2 INJ TIMER
	BTFSC _C		;GO ON TO ROTOR 2 IF NO CY
	BRA TM2.3		;NO CY SO DO NEXT
	BCF FI3			;CLEAR BITS 6 OF PORT D (ROTOR 3 INJECTORS)
	BCF INJ3		;CLEAR THE DEC FLAG
TM2.3
	BTFSS INJ4	;DECREMENT IPW COUNTER IF FLAG SET
	BRA TM2.X		;EXIT IF NOT
	DECF R4ITL,1,1		;DEC LSB OF ROTOR 2 INJECTION TIMER
	BTFSC _C		;SKIP IF CARRY  C IS BORROW NOT?
	BRA TM2.X		;NO CY SO GO DO ROTOR 3 (if there)
	DECF R4ITH,1,1		;DEC MSB OF ROTOR 2 INJ TIMER
	BTFSC _C		;GO ON TO ROTOR 2 IF NO CY
	BRA TM2.X		;NO CY SO EXIT
	BCF FI4		;CLEAR BITS 7 OF PORT D
	BCF INJ4		;CLEAR THE DEC FLAG
  ENDIF	
TM2.X
	RETFIE 1		;RETURN & ENABLE 
 ENDIF		;A4,A8,A9  VER

 IF (ENG==0xA3)||(ENG==0xB0)||(ENG==0xA6)||(ENG==0xAA)||(ENG==0xB4) 	;20B,GEO OR FORD V6,HONDA V6
;TM2INT
	BCF PIR1,TMR2IF,0		;CLEAR TIMER 2 INT. FLAG SO WE DON'T LOOP ON THIS INT
  IF (ENG!=0xA3)		;ALL OTHERS USE UNISYNC
	INCF SYNCL,1,1		;INC LSB OF SYNC REG
	BTFSS _C		;OVF?
	BRA TM2.0		;NO OVF SO CONTINUE WITH TM2 ROUT
	INCF SYNCH,1,1		;INC MSB IF LSB OVF
	BTFSS _C		;MSB OVF?
	BRA TM2.0		;GO ON IF NOT
	SETF SYNCL,1
	SETF SYNCH,1		;SET MAX VALUE
TM2.0
  ENDIF			;END OF SYNC ROUT IN GEO & FORD V6 & B0  VER
  
	BTG IPWX2	
	BTFSC IPWX2
	RETFIE 1				;EXIT ON ALTERNATE CYCLES (DOUBLES EFFECTIVE IPW)
	
	BTFSS INJ1	;DECREMENT IPW COUNT IF FLAG SET
	BRA TM2.1		;GO TEST ROTOR 2 IF NOT
	DECF R1ITL,1,1		;DEC LSB OF ROTOR 1 INJECTION TIMER
	BTFSC _C		;SKIP IF CARRY  C IS BORROW NOT?
	BRA TM2.1		;NO CY SO GO DO ROTOR 2
	DECF R1ITH,1,1		;DEC MSB OF ROTOR 1 INJ TIMER
	BTFSC _C		;GO ON TO ROTOR 2 IF NO CY  (C IS BORROW NOT)
	BRA TM2.1		;NO CY SO DO ROTOR 2
	BCF FI1		;CLEAR BIT 4 OF PORT D (ROTOR 1 INJECTORS)
	BCF INJ1		;CLEAR THE DEC FLAG

TM2.1
	BTFSS INJ2	;DECREMENT IPW COUNTER IF FLAG SET
	BRA TM2.1A		;CK ROTOR 3 IF NOT
	DECF R2ITL,1,1		;DEC LSB OF ROTOR 2 INJECTION TIMER
	BTFSC _C		;SKIP IF CARRY  C IS BORROW NOT?
	BRA TM2.1A		;NO CY SO GO DO ROTOR 3 (if there)
	DECF R2ITH,1,1		;DEC MSB OF ROTOR 2 INJ TIMER
	BTFSC _C		;GO ON TO ROTOR 2 IF NO CY
	BRA TM2.1A		;NO CY SO DO ROTOR 3 (IF THERE) mAKE JUMP TO ROTOR 3 ON 20B VER
	BCF FI2			;CLEAR BITS 5 OF PORT D (ROT 2 INJECTORS)
	BCF INJ2		;CLEAR THE DEC FLAG

TM2.1A
	BTFSS INJ3	;DECREMENT IPW COUNTER IF FLAG SET
	BRA TM2.2		;EXIT IF NOT
	DECF R3ITL,1,1		;DEC LSB OF ROTOR 3 INJECTION TIMER
	BTFSC _C		;SKIP IF CARRY  C IS BORROW NOT?
	BRA TM2.2		;EXIT 
	DECF R3ITH,1,1		;DEC MSB OF ROTOR 3 INJ TIMER
	BTFSC _C		;GO ON TO ROTOR 2 IF NO CY
	BRA TM2.2		;EXIT
	BCF FI3		;CLEAR BITS 6 OF PORT D (ROTOR 3 INJECTORS)
	BCF INJ3		;CLEAR THE DEC FLAG
TM2.2
TM2.X
	RETFIE 1			;RETURN & ENABLE 
 ENDIF		;A3, AA, A6, B0 , V6 & GEO

 

 IF (ENG==0xA7)||(ENG==0xBA)||(ENG==0xAC)||(ENG==0xAB)||(ENG==0xB1)||(ENG==0xAD)||(ENG==0xAE)||(ENG==0xB3)	;EJ25/EJ22 OR LS1 V8
 ;TM2INT
	BCF PIR1,TMR2IF,0		;CLEAR TIMER 2 INT. FLAG SO WE DON'T LOOP ON THIS INT
  IF (ENG==0xAB)||(ENG==0xB1)||(ENG==0xAD)||(ENG==0xAE)||(ENG==0xAA)||(ENG==0xA7 && A72007==1) ;SYNC REG INC IF ENG W/ SYNC GAP CAS	
	INCF SYNCL,1,1		;INC LSB OF SYNC REG
	BTFSS _C		;OVF?
	BRA TM2.0		;NO OVF SO CONTINUE WITH TM2 ROUT
	INCF SYNCH,1,1		;INC MSB IF LSB OVF
	BTFSS _C		;MSB OVF?
	BRA TM2.0		;GO ON IF NOT
	SETF SYNCL,1
	SETF SYNCH,1		;SET MAX VALUE
TM2.0
  ENDIF
  
  IF (ENG==0xB3 && TBINJ == 1)
 	BTFSS VT
 	BRA EXEC.3
 	BTFSC PORTB,0,0		;TEST T1 INPUT FOR POSITIVE
 	BSF FC1				;MAKE SURE WE HAVE SOME DWELL TIME
EXEC.3
 ENDIF
  
	BTG IPWX2			; WANT TO MAKE LONGER INJECTION CYCLES BASED ON DRIVER SNUBBER RESULTS.
	BTFSC IPWX2
	RETFIE 1
	BTFSS INJ1	;DECREMENT IPW COUNT IF FLAG SET
	BRA TM2.1		;GO TEST # 2 IF NOT
	DECF R1ITL,1,1		;DEC LSB OF ROTOR 1 INJECTION TIMER
	BTFSC _C		;SKIP IF CARRY  C IS BORROW NOT?
	BRA TM2.1		;NO CY SO GO DO ROTOR 2
	DECF R1ITH,1,1		;DEC MSB OF ROTOR 1 INJ TIMER
	BTFSC _C		;GO ON TO ROTOR 2 IF NO CY  (C IS BORROW NOT)
	BRA TM2.1		;NO CY SO DO ROTOR 2
	BCF FI1		;CLEAR BIT 4 OF PORT D (ROTOR 1 INJECTORS)
	BCF INJ1		;CLEAR THE DEC FLAG
TM2.1
	BTFSS INJ2	;DECREMENT IPW COUNTER IF FLAG SET
	BRA TM2.2		;CK # 3 IF NOT
	DECF R2ITL,1,1		;DEC LSB OF ROTOR 2 INJECTION TIMER
	BTFSC _C		;SKIP IF CARRY  C IS BORROW NOT?
	BRA TM2.2		;NO CY SO GO DO ROTOR 3 (if there)
	DECF R2ITH,1,1		;DEC MSB OF ROTOR 2 INJ TIMER
	BTFSC _C		;GO ON TO ROTOR 2 IF NO CY
	BRA TM2.2		;NO CY SO DO ROTOR 3 (IF THERE) mAKE JUMP TO ROTOR 3 ON 20B VER
	BCF FI2		;CLEAR BITS 5 OF PORT D (ROTOR 2 INJECTORS)
	BCF INJ2		;CLEAR THE DEC FLAG
TM2.2
  IF (ENG==0xB3 && TBINJ==1)
 	BRA TM2.X
  ENDIF
	BTFSS INJ3	;DECREMENT IPW COUNTER IF FLAG SET
	BRA TM2.3		;CK # 4 IF NOT
	DECF R3ITL,1,1		;DEC LSB OF ROTOR 2 INJECTION TIMER
	BTFSC _C		;SKIP IF CARRY  C IS BORROW NOT?
	BRA TM2.3		;NO CY SO GO DO ROTOR 3 (if there)
	DECF R3ITH,1,1		;DEC MSB OF ROTOR 2 INJ TIMER
	BTFSC _C		;GO ON TO ROTOR 2 IF NO CY
	BRA TM2.3		;NO CY SO DO ROTOR 3 (IF THERE) mAKE JUMP TO ROTOR 3 ON 20B VER
	BCF FI3			;CLEAR BITS 6 OF PORT D (ROTOR 3 INJECTORS)
	BCF INJ3		;CLEAR THE DEC FLAG
TM2.3
	BTFSS INJ4	;DECREMENT IPW COUNTER IF FLAG SET
	BRA TM2.4		;EXIT IF NOT
	DECF R4ITL,1,1		;DEC LSB OF ROTOR 2 INJECTION TIMER
	BTFSC _C		;SKIP IF CARRY  C IS BORROW NOT?
	BRA TM2.4		;NO CY SO GO DO ROTOR 3 (if there)
	DECF R4ITH,1,1		;DEC MSB OF ROTOR 2 INJ TIMER
	BTFSC _C		;GO ON TO ROTOR 2 IF NO CY
	BRA TM2.4		;NO CY SO DO ROTOR 3 (IF THERE) mAKE JUMP TO ROTOR 3 ON 20B VER
	BCF FI4		;CLEAR BITS 7 OF PORT D (ROTOR 4 INJECTORS)
	BCF INJ4		;CLEAR THE DEC FLAG
TM2.4
  IF (ENG==0xAE)||(ENG==0xAA)		;ONLY SVX & V6)
	BTFSS INJ5	;DECREMENT IPW COUNTER IF FLAG SET
	BRA TM2.5		;EXIT IF NOT
	DECF R5ITL,1,1		;DEC LSB OF ROTOR 2 INJECTION TIMER
	BTFSC _C		;SKIP IF CARRY  C IS BORROW NOT?
	BRA TM2.5		;NO CY SO GO DO ROTOR 3 (if there)
	DECF R5ITH,1,1		;DEC MSB OF ROTOR 2 INJ TIMER
	BTFSC _C		;GO ON TO ROTOR 2 IF NO CY
	BRA TM2.5		;NO CY SO DO ROTOR 3 (IF THERE) mAKE JUMP TO ROTOR 3 ON 20B VER
	BCF FI5		;CLEAR BITS 7 OF PORT D (ROTOR 4 INJECTORS)
	BCF INJ5		;CLEAR THE DEC FLAG
TM2.5
	BTFSS INJ6	;DECREMENT IPW COUNTER IF FLAG SET
	BRA TM2.X		;EXIT IF NOT
	DECF R6ITL,1,1		;DEC LSB OF ROTOR 2 INJECTION TIMER
	BTFSC _C		;SKIP IF CARRY  C IS BORROW NOT?
	BRA TM2.X		;NO CY SO GO DO ROTOR 3 (if there)
	DECF R6ITH,1,1		;DEC MSB OF ROTOR 2 INJ TIMER
	BTFSC _C		;GO ON TO ROTOR 2 IF NO CY
	BRA TM2.X		;NO CY SO DO ROTOR 3 (IF THERE) mAKE JUMP TO ROTOR 3 ON 20B VER
	BCF FI6		;CLEAR BITS 7 OF PORT D (ROTOR 4 INJECTORS)
	BCF INJ6		;CLEAR THE DEC FLAG
  ENDIF 			;END OF EXTRA 2 INJS FOR 6 CYL SVX
TM2.X	
	BCF PIR1,TMR2IF,0		;CLEAR TIMER 2 INT. FLAG SO WE DON'T LOOP ON THIS INT
	RETFIE 1			;RETURN & ENABLE 
 ENDIF 	;END OF EJ25 OR V8 TM2 ROUT  A7,AB,B3,AA,AE

;EEWR			;THIS ENTRY TO I2CWR CHECKS STATUS OF EEWF,1 BEFOR PROCEEDING WITH I2CWR AND CKS FOR EXEC FUNCS
			; WHILE WAITING
;	EEWR     THIS ROUTINE WRITES 1 - 256 BYTES TO THE ONBOARD EEPROM.
;	INPUTS:
;		WC = 	WORD COUNT, # OF BYTES TO WRITE 256 MAX (0)
;		WSAL & H = 	WORD START ADDRESS  (EEPROM BYTE ADDRESS TO START WRITING
;		FSR1 = 	POINTER TO RAM CONTAINING DATA TO WRITE (SET UP BY CALLER)
;		INDF1 = USED TO ACCESS FSR1

;Data for converting to internal eeprom on 6680 chip.

;	EEADRH & EEADR ARE THE ADDRESS REGISTERS FOR EEPROM READ OR WRITE.
;	EEDATA IS USED TO HOLD THE DATA TO BE WRITTEN OR READ TO/FROM THE EEPROM
;	EECON1 & EECON2 ARE THE CONTROL REGISTERS 

EEWR
	BTFSC EEWF		;BUSY?
	BRA EEWR		;WAIT IF YES
EEWR.A
	BTFSS EEWRC		;TEST FOR EE WRITE COMPLETE  (SET BY EEIF INT)
	CALL EEWAIT		; BUSY SO POLL FOR EXEC TASKS
	BSF EEWF		;SET EEPROM WRITING FLAG
	MOVLW D'25'		;LOAD EEPROM FUNCTION TIMER  (Increased from 20 to 25 due to initbl errors  noted on 10-24-05)
	MOVWF EETMR,1	;THIS WILL BE 5 MILLISECONDS  (AVERAGE REQUIREMENT IS 4 MS.
	BCF EEWERF		;EE WRITE ERROR FLAG
EEWR.0
	BCF EEWRC				;CLEAR EE WRITE COMPLETE FLAG (WILL BE SET BY EEIF INT)
 IF EC3TB==1
 	MOVFF WSAH,EEADRH
 ENDIF	
	MOVFF WSAL,EEADR		;LOAD EE ADR TO WRITE
	MOVFF POSTINC1,EEDATA	;GET DATA TO WRITE
	BCF EECON1,EEPGD,0
	BCF EECON1,CFGS,0
	BSF EECON1,WREN,0
	BCF INTCON,GIE,0
	MOVLW 0x55
	MOVWF EECON2,0
	MOVLW 0xAA
	MOVWF EECON2,0
	BSF EECON1,WR,0
	BSF INTCON,GIE,0
	DECF WC,1,1				;DEC WORD COUNT
	BTFSS STATUS,Z,0
	BRA EEWR.B				;GO FOR NEXT BYTE
	MOVLW D'25'				;ABOUT 5 MS (inc from 20 to 25 10-24-05)
	BSF EEWF				;SET UP A DELAY FOR EE SETTLING TIME BEFORE STARTING ANOTHER EEWR COMMAND
	RETURN					
EEWR.B
	INCF WSAL,1,1
	BTFSC STATUS,Z,0			;CK FOR OVF
	BRA EEBAD						;RET IF ADR OVF
	BRA EEWR.A					;GO DO IT
	
EEWAIT
	BTFSC EEWRC	;TEST FOR END OF WRITE COMPLETE  (SET BY INT OF EEIF) 
	RETURN			;WRITE FINISHED SO GO DO REMAINING BYTES
					;WAIT FOR END OF WRITE & TEST FOR EXEC FUNCTIONS
	CALL EXECROUT   ;CALL MAIN EXEC
	BTFSC EEWF		;TEST FOR TIMEOUT
	BRA EEWAIT		;CONTINUE TO WAIT IF NOT
EEBAD
	BSF EEWERF		;HAD TIMEOUT, SET EE WRITE ERROR FLAG 
	BSF EEWRC		;WE HAVE TO DO THIS SO IT WILL WORK NEXT TIME
	BCF EECON1,WREN,0		;DON'T LEAVE IT SET, CLEAR EE WRITE ENABLE
	RETURN

;	EERD	   THIS ROUTINE READS FROM 1 TO 256 BYTES FROM THE EEPROM AND STORES IT IN 
;	SEQUENTIAL RAM ADDRESS POINTED TO BY FSR1.  
;	INPUTS:
;		WC = WORD COUNT
;		WSAL = WORD START ADDRESS  (EEPROM ADDRESS TO START READ FROM)
;		WSAH	MSB  n/u on 18f452  USED ON 18F4620
;		FSR1 = POINTER TO RAM ADDRESS TO STORE DATA

EERD
	BTFSC EEWF	;SEE IF EEPROM IS STILL WRITING
	BRA EERD		;WAIT FOR IT TO CLEAR IF SET 
EERD.A
 IF EC3TB==1
	MOVFF WSAH,EEADRH	 ;MOD TO WORK ON 18F4620  
 ENDIF
	MOVFF WSAL,EEADR		;LOAD EE ADR TO READ
	BCF EECON1,EEPGD,0
	BCF EECON1,CFGS,0
	BSF EECON1,RD,0
	MOVFF EEDATA,POSTINC1		;STORE DATA
	DECF WC,1,1				;DEC WORD COUNT
	BTFSC STATUS,Z,0
	RETURN					;IF WORD COUNT ZERO, RETURN
	INCF WSAL,1,1
	BTFSS _C				;OVF?	
	BRA EERD.A				;GO ON FOR NEXT BYTE
; IF EC3TB==1
; 	INCF WSAH,1				;INC MSB
; 	MOVLW D'3'				;ck for overflow
; 	CPFSGT WSAH,1
; 	BRA EERD.A
; ENDIF
	RETURN					;OVF SO RETURN
	

;**********************************************************************************************
; 16/15 Bit Unsigned Fixed Point Divide 16/15 -> 16.15
;
; Input: 16 bit unsigned fixed point dividend in AARGB0, AARGB1
; 15 bit unsigned fixed point divisor in BARGB0, BARGB1
;
; Use: CALL FXD1615U
;
; Output: 16 bit unsigned fixed point quotient in AARGB0, AARGB1
; 15 bit unsigned fixed point remainder in REMB0, REMB1
; Result: AARG, REM <-- AARG / BARG
; Max Timing: 2+193+2 = 197 clks
; Min Timing: 2+178+2 = 182 clks
; PM: 2+213+1 = 216 DM: 6
;
;FXD1615U
;CLRF REMB0, F
;CLRF REMB1, F
;UDIV1615
;RETLW 0x00

DIV1615 		;			aargh&l / bargh&l ->  aargh&l

	variable i
	CLRF REML,1
	CLRF REMH,1
	RLCF AARGH,0,1
	RLCF REML,1,1
	MOVF BARGL,0,1
	SUBWF REML,1,1
	MOVF BARGH,0,1
	SUBWFB REMH,1,1
	RLCF AARGH,1,1
	variable i = D'1'
	while i < D'8'
	RLCF AARGH,0,1
	RLCF REML,1,1
	RLCF REMH,1,1
	MOVF BARGL,0,1
	BTFSS AARGH,0,1		;bit 0 was lsb
	BRA UADD65#v(i)
	SUBWF REML,1,1
	MOVF BARGH,0,1
	SUBWFB REMH,1,1
	BRA UOK65#v(i)
UADD65#v(i)
	 ADDWF REML,1,1
	MOVF BARGH,0,1
	ADDWFC REMH,1,1
UOK65#v(i) 
	RLCF AARGH,1,1
	variable i = i + 1
	endw
	RLCF AARGL,0,1
	RLCF REML,1,1
	RLCF REMH,1,1
	MOVF BARGL,0,1
	BTFSS AARGH,0,1		;bit 0 was lsb
	BRA UADD658
	SUBWF REML,1,1
	MOVF BARGH,0,1
	SUBWFB REMH,1,1
	BRA UOK658
UADD658
	ADDWF REML,1,1
	MOVF BARGH,0,1
	ADDWFC REMH,1,1
UOK658 
	RLCF AARGL,1,1
	variable i = D'9'
	while i < D'16'
	RLCF AARGL,0,1
	RLCF REML,1,1
	RLCF REMH,1,1
	MOVF BARGL,0,1
	BTFSS AARGL,0,1			;bit 0 was lsb
	BRA UADD65#v(i)
	SUBWF REML,1,1
	MOVF BARGH,0,1
	SUBWFB REMH,1,1
	BRA UOK65#v(i)
UADD65#v(i)
	 ADDWF REML,1,1
	MOVF BARGH,0,1
	ADDWFC REMH,1,1
UOK65#v(i)
	 RLCF AARGL,1,1
	variable i = i + 1
	endw
	BTFSC AARGL,0,1			;bit 0 was lsb
	BRA UOK65
	MOVF BARGL,0,1
	ADDWF REML,1,1
	MOVF BARGH,0,1
	ADDWFC REMH,1,1
UOK65
	RETURN
		
	
DIV
; UDIV1607     AARGH&L / BARGL ->  AARGH&L
;       Max Timing:     5+15*8+2 = 127 clks
;       Min Timing:     5+15*8+2 = 127 clks
;       PM: 5+15*8+2 = 127              DM: 4
 
                variable i

				CLRF	REML,1		;CLR REMAINDER
                RLCF	AARGH,W,1
                RLCF	REML,1,1	
                MOVF    BARGL,0,1
                SUBWF   REML,1,1
                RLCF    AARGH,1,1						;AARGH LEFT SHIFT 1

                variable i = D'1'
                while i < D'8'

                RLCF            AARGH,0,1
                RLCF            REML,1,1
                MOVF            BARGL,0,1
                BTFSC           AARGH,0,1
                SUBWF           REML,1,1
                BTFSS           AARGH,0,1
                ADDWF           REML,1,1
                RLCF            AARGH,1,1				;8 MORE

                variable i=i+1
                endw

                RLCF            AARGL,0,1
                RLCF            REML,1,1
                MOVF            BARGL,0,1
                BTFSC           AARGH,0,1
                SUBWF           REML,1,1
                BTFSS           AARGH,0,1
                ADDWF           REML,1,1
                RLCF            AARGL,1,1

                variable i = D'9'
                while i < D'16'

                RLCF            AARGL,0,1
                RLCF            REML,1,1
                MOVF           BARGL,0,1
                BTFSC           AARGL,0,1
                SUBWF           REML,1,1
                BTFSS           AARGL,0,1
                ADDWF           REML,1,1
                RLCF            AARGL,1,1
                variable i=i+1
                endw
                BTFSS           AARGH,0,1
                ADDWF           REML,1,1
				RETURN


MULT		; RES0:RES3 = AARGH:AARGL X BARGH:BARGL (16 X 16 MULTIPLY) (3 uS)
	MOVF	AARGL,0,1
	MULWF	BARGL,1		;ARGiL *  BARGL
				;PRQDH PRODL
	MOVFF	PRODH,RES1
	MOVFF	PRODL,RES0
	MOVF	AARGH,0,1
	MULWF	BARGH,1		;ARCiW   BARGH ->
		  		;PROCH: PRGDL
	MOVFF	PRODH,RES3
	MOVFF	PRODL,RES2
	MOVF	AARGL,0,1
	MULWF	BARGH,1		;	AARGL * BARGH
		  		;	PRODH: PRODL
	MOVF	PRODL,0,0
	ADDWF	RES1,1,1		;	Add cras~
	MOVF	PRODH,0,0	;	   praduc~s
	ADDWFC 	RES2,1,1
	CLRF	WREG,0
	ADDWFC  RES3,1,1
	MOVF	AARGH,0,1
	MULWF	BARGL,1		;AARGH * BARGL
		  		;PRODH:PRODL
	MOVF	PRODL,0,0
	ADDWF	RES1,1,1		;Add crass
	MOVF	PRODH,0,0	  ;products
	ADDWFC  RES2,1,1
	CLRF	WREG,0
	ADDWFC  RES3,1,1
	RETURN

DELAY				;DELAY BY THE NUMBER OF MICROSECONDS IN WREG (0 - 64)	
	MOVWF	DLYCTR,1		;MOVE TO DELAY CTR
	RLNCF	DLYCTR,1,1		;MULTIPLY BY 2 (.5 US PER LOOP)
DLY.A	
	NOP			;10-28-99
	NOP			;10-28-99
	NOP
DLY.0	
	DECFSZ	DLYCTR,1,1	;DEC DELAY COUNT UNTIL IT IS 0
	BRA DLY.A
	RETURN

SIG
TOGGLE0
	BTG PORTE,0,0
	RETURN
TOGGLE1
	BTG PORTE,1,0
	RETURN
TOGGLE2
	BTG PORTE,2,0
	RETURN
TOGGLE3
	BTG PORTE,3,0
	RETURN
TOGGLE4
	BTG PORTE,4,0
	RETURN
TOGGLE5
	BTG PORTE,5,0
	RETURN
TOGGLE6
	BTG PORTE,6,0
	RETURN
TOGGLE7
	BTG PORTE,7,0
	RETURN

;     16BIT COMPARE ROUTINES

						;LOOK FOR VARIABLE  < CONSTANT   16 BIT 
; 	MOVLW MSB CONST			;LOAD MSB CONSTANT   LOOK FOR VAR < CONSTANT
; 	CPFSLT MSB VAR,1		;COMPARE TO MSB VAR
; 	BRA	X.CEQ				;MSB NOT LT SO CK FOR EQ
; 	BRA .VLT				;TRUE EXIT, VAR IS LT CONSTANT
;X.CEQ
; 	CPFSEQ MSB VAR,1		;COMP VAR MSB FOR = CONST MSB
; 	BRA .NLT				;FALSE EXIT, VAR !LT CONST
; 	MOVLW LSB CONST			;LOAD LSB CONSTANT
; 	CPFSLT LSB VAR			;COMPARE LSB CONST TO LSB VAR
; 	BRA .NLT				;FALSE EXIT VAR !LT CONST
; 	BRA .VLT				;TRUE EXIT, VAR LT CONSTANT

						;LOOK FOR VARIABLE  > CONSTANT   16 BIT 
; 	MOVLW MSB CONST			;LOAD MSB CONSTANT   LOOK FOR VAR < CONSTANT
; 	CPFSGT MSB VAR,1		;COMPARE TO MSB VAR
; 	BRA	Y.CEQ				;MSB NOT LT SO CK FOR EQ
; 	BRA .VGT				;TRUE EXIT, VAR IS GT CONSTANT
;Y.CEQ
; 	CPFSEQ MSB VAR,1		;COMP VAR MSB FOR = CONST MSB
; 	BRA .NGT				;FALSE EXIT, VAR !GT CONST
; 	MOVLW LSB CONST			;LOAD LSB CONSTANT
; 	CPFSGT LSB VAR			;COMPARE LSB CONST TO LSB VAR
; 	BRA .NGT				;FALSE EXIT VAR !GT CONST
; 	BRA .VGT				;TRUE EXIT, VAR GT CONSTANT


	ORG 0x2000
MAPTBL				;LOW RPM MAP TABLE  80 - BF    (COMMENTS OBSOLETE)   (staging @ 15.5 map)   between 12th & 13th entry
					;map table also based on 3.1 ms IPW @ 30" Hg.  which is what N84TC was set-up with.
					;MAP table last updated on 3-8-04

;	********   HAVE COMMENTED OUT EVERYTHING EXCEPT THE 84TC MAP TABLE WITH & WITHOUT TRIMAP ALTHOUGH I EXPECT ALL CONTROLLERS TO BE TRIMAP FROM NOW ON.   IT IS BASED ON A 20.5" STAGE POINT ON N84TC
 
 IF (ENG==0xB0)||(ENG==0xA3)   ;20B MAP (COPIED FROM N109TC ON 10-03-07)
	
    DB 0x80 + D'00',0x80 + D'00',0x80 +D'00',0x80 +D'00',0x80 + D'00',0x80 + D'00',0x80 +D'00',0x80 + D'00'			;0 - 7
	DB 0x80 + D'00',0x80 + D'00',0x80 +D'00',0x80 +D'00',0x80 + D'00',0x80 + D'00',0x80 +D'00',0x80 + D'00'			;8 - 15
   	DB 0x80 + D'00',0x80 - D'35',0x80 -D'15',0x80 +D'04',0x80 + D'16',0x80 + D'4',0x80 -D'8',0x80 - D'9'			;16 - 23
   	DB 0x80 - D'31',0x80 - D'33',0x80 -D'49',0x80 -D'52',0x80 - D'53',0x80 - D'53',0x80 -D'40',0x80 - D'30'			;24 - 31
    
    DB 0x80 - D'10',0x80 + D'00',0x80 +D'00',0x80 +D'04',0x80 + D'11',0x80 + D'12',0x80 -D'20',0x80 - D'43'			;32 - 39
	DB 0x80 - D'55',0x80 - D'50',0x80 -D'54',0x80 -D'53',0x80 - D'55',0x80 - D'56',0x80 -D'49',0x80 - D'55'			;40 - 47
	DB 0x80 - D'46',0x80 - D'21',0x80 -D'22',0x80 -D'21',0x80 - D'17',0x80 + D'36',0x80 +D'32',0x80 +D'36'			;48 - 55
	DB 0x80 + D'50',0x80 + D'50',0x80 +D'50',0x80 +D'50',0x80 + D'50',0x80 + D'50',0x80 +D'50',0x80 + D'50'			;56 - 63
     
    DB 0x80 - D'50',0x80 - D'55',0x80 -D'41',0x80 -D'26',0x80 - D'26',0x80 - D'26',0x80 -D'24',0x80 - D'26'			;64 - 71
	DB 0x80 - D'26',0x80 - D'22',0x80 +D'06',0x80 +D'06',0x80 - D'00',0x80 - D'03',0x80 -D'07',0x80 - D'17'			;72 - 79
	DB 0x80 - D'17',0x80 - D'21',0x80 -D'19',0x80 -D'23',0x80 - D'29',0x80 - D'26',0x80 -D'12',0x80 - D'24'			;80 - 87
	DB 0x80 - D'32',0x80 - D'32',0x80 -D'36',0x80 -D'36',0x80 - D'34',0x80 - D'22',0x80 -D'25',0x80 - D'37'			;88 - 95
	DB 0x80 - D'41',0x80 - D'40',0x80 -D'06',0x80 +D'06',0x80 - D'06',0x80 + D'03',0x80 +D'00',0x80 + D'03'			;96 - 103
	DB 0x80 + D'06',0x80 + D'06',0x80 +D'00',0x80 +D'02',0x80 + D'34',0x80 + D'34',0x80 +D'34',0x80 + D'34'			;104 - 111
	DB 0x80 + D'34',0x80 + D'36',0x80 +D'36',0x80 +D'36',0x80 + D'36',0x80 + D'36',0x80 +D'36',0x80 + D'36'			;112 - 119
	DB 0x80 + D'50',0x80 + D'50',0x80 +D'50',0x80 +D'50',0x80 + D'50',0x80 + D'50',0x80 +D'50',0x80 + D'50'			;120 - 127
	
 ELSE ;     N84TC MAP
         
   	DB 0x80 + D'00',0x80 + D'00',0x80 +D'00',0x80 +D'00',0x80 + D'00',0x80 + D'00',0x80 +D'00',0x80 + D'00'			;0 - 7
	DB 0x80 + D'00',0x80 + D'00',0x80 +D'00',0x80 +D'00',0x80 + D'00',0x80 + D'00',0x80 +D'00',0x80 + D'00'			;8 - 15
   	DB 0x80 + D'04',0x80 + D'04',0x80 +D'4',0x80 +D'04',0x80 + D'16',0x80 + D'4',0x80 +D'0',0x80 + D'8'			;16 - 23
   	DB 0x80 + D'0',0x80 + D'0',0x80 +D'14',0x80 +D'34',0x80 + D'64',0x80 + D'77',0x80 +D'80',0x80 + D'80'			;24 - 31
 ;				;NON RPM MAP TABLES
 	DB 0x80 + D'38',0x80 - D'0',0x80 - D'19',0x80 - D'39',0x80 - D'11',0x80 - D'0',0x80 -D'0',0x80 - D'0' 	 	 	;0 - 7
	DB 0x80 - D'0',0x80 - D'0',0x80 - D'0',0x80 -D'0',0x80 - D'0',0x80 - D'0',0x80 -D'0',0x80 - D'0'				;8 - 15
	DB 0x80 + D'36',0x80 + D'32',0x80 +D'32',0x80 +D'36',0x80 + D'28',0x80 + D'24',0x80 +D'36',0x80 + D'32'			;16 - 23
	DB 0x80 + D'34',0x80 + D'38',0x80 +D'54',0x80 +D'52',0x80 + D'58',0x80 + D'60',0x80 +D'61',0x80 + D'53'			;24 - 31
  		
	DB 0x80 + D'25',0x80 - D'00',0x80 - D'00',0x80 + D'04',0x80 + D'11',0x80 + D'12',0x80 +D'15',0x80 + D'20' 	 	 	;32 - 39
	DB 0x80 + D'20',0x80 + D'24',0x80 + D'24',0x80 +D'24',0x80 + D'24',0x80 + D'25',0x80 +D'25',0x80 + D'25'			;40 - 47

	DB 0x80 + D'34',0x80 + D'38',0x80 +D'36',0x80 +D'32',0x80 + D'36',0x80 + D'36',0x80 +D'32',0x80 +D'36'			;48 - 55
	DB 0x80 + D'50',0x80 + D'50',0x80 +D'50',0x80 +D'50',0x80 + D'50',0x80 + D'50',0x80 +D'50',0x80 + D'50'			;56 - 63

 ENDIF

									;HIGH RPM TABLE
;N84TC W/ RENESIS INJECTORS, STAGING @ 20.4" hG  (map adr 84)  WITH SNUBBER CKT. 03-11-07
		;WHEN IPWCR WAS INCREASED TO 182 FROM 162, THESE VALUES WERE ALL REDUCED BY 50 TO COMPENSATE.  THE INCREASE IN IPWCR WAS TO COMPENSATE FOR THE REMOVAL OF THE 12% INCREASE IN IPW.  64 - 73 LOWERED BY 50 (IPWCR COMP, WAS NOT BOOSTED BY >2500 RPM 12% BOOST).  74 - 84 WAS NOT CHANGED BECAUSE THIS NO LONGER GETS >2500 RPM 12% INCREASE BUT IPWCR INCREASE COMPENSATES FOR THIS. IT GOT THE 12% BECAUSE THEY WERE STAGED AND THE RPM WAS > 2500 RPM.
; 85 - 127  WAS REDUCED BY 50 (FROM RECORDED FLIGHT TEST DATA) BECAUSE THIS RANGE WAS NOT BUMPED 12% (NOT STAGED) EVEN THOUGH RPM WAS > 2500.
								;HIGH RPM LGSEC TABLE
		 
	DB 0x80 - D'50',0x80 - D'56',0x80 -D'42',0x80 -D'26',0x80 - D'26',0x80 - D'26',0x80 -D'24',0x80 - D'26'			;64 - 71
	DB 0x80 - D'26',0x80 - D'22',0x80 +D'06',0x80 +D'06',0x80 - D'00',0x80 - D'03',0x80 -D'07',0x80 - D'17'			;72 - 79
	DB 0x80 - D'17',0x80 - D'21',0x80 -D'19',0x80 -D'23',0x80 - D'29',0x80 - D'26',0x80 -D'12',0x80 - D'24'			;80 - 87
	DB 0x80 - D'32',0x80 - D'32',0x80 -D'36',0x80 -D'36',0x80 - D'34',0x80 - D'22',0x80 -D'25',0x80 - D'37'			;88 - 95
	DB 0x80 - D'41',0x80 - D'40',0x80 -D'06',0x80 +D'06',0x80 + D'17',0x80 + D'19',0x80 +D'24',0x80 + D'27'			;96 - 103
	DB 0x80 + D'30',0x80 + D'30',0x80 +D'30',0x80 +D'34',0x80 + D'34',0x80 + D'34',0x80 +D'34',0x80 + D'34'			;104 - 111
	DB 0x80 + D'34',0x80 + D'36',0x80 +D'36',0x80 +D'36',0x80 + D'36',0x80 + D'36',0x80 +D'36',0x80 + D'36'			;112 - 119
	DB 0x80 + D'50',0x80 + D'50',0x80 +D'50',0x80 +D'50',0x80 + D'50',0x80 + D'50',0x80 +D'50',0x80 + D'50'			;120 - 127

	END	              ;required directive

