OBD receive code

Tom Hussey thussey at idirect.com
Sun Apr 4 03:31:09 GMT 1999


Here is a section of code I have been working on that relates to the
service of class 2/OBD frames. I find this interesting because this is
used during programming of all the '96 and later ECMs. The chip GM uses
is MC68HC58 or GM 20686 in a 28pin plcc. All info is on the mot.com if
you are interested. I have enclosed the receive section. Sorry for the
long message for those not interested. 

-Tom Hussey


************************************************
* RECEIVE SERVICE FOR DATA LINK CONTROLLER
************************************************
C4D5  FE 18 B4    	LDX    $18B4           ; GET POINTER TO RX DATA
BUFFER

C4D8  B6 10 60    	LDAA   $1060           ; READ LINK CNTROLLER STATUS
C4DB  81 20       	CMPA   #$20            ; TEST IF BUFFER CONTAINS A
BYTE
C4DD  25 50       	BCS    $C52F           ; BRANCH IF BUFFER IS EMPTY

C4DF  B7 18 C2    	STAA   $18C2           ; SAVE STATUS WORD
C4E2  FC 10 60    	LDD    $1060           ; READ LINK CONTROLLER STATUS
AND DATA
C4E5  B1 18 C2    	CMPA   $18C2           ; HAS STATUS CHANAGED
C4E8  23 03       	BLS    $C4ED           ; 

C4EA  B6 18 C2    	LDAA   $18C2           ; GET STATUS WORD

C4ED  81 A0       	CMPA   #$A0            ; TEST COMPLETION CODE AT
BUFFER HEAD
C4EF  24 20       	BCC    $C511           ; BRANCH COMPLETION CODE
AVAILABLE

C4F1  E7 00       	STAB   $00,X           ; SAVE DATA IN BUFFER
C4F3  08          	INX                    ; 
C4F4  8C 18 79    	CPX    #$1879          ; TEST FOR BUFFER OVERRUN
C4F7  25 DF       	BCS    $C4D8           ; BRANCH NOT AT END OF BUFFER

C4F9  F6 18 BA    	LDAB   $18BA           ; INCREMENT OBD RX OVER RUN
COUNT
C4FC  CB 01       	ADDB   #$01            ; 
C4FE  C2 00       	SBCB   #$00            ; 
C500  F7 18 BA    	STAB   $18BA           ;
 
C503  C1 02       	CMPB   #$02            ; IF TWO OVER RUN ERRORS
DETECTED
C505  24 2E       	BCC    $C535           ; DONE. EXIT TO PREVENT
DEADLOCK

C507  C6 10       	LDAB   #$10            ; INDICATION OF FAILED FRAME 
C509  F7 18 6D    	STAB   $186D           ; SAVE IN 1ST FRAME LOC

C50C  CE 18 6E    	LDX    #$186E          ; INITIALIZE TO NEXT OF DATA
BUFFER
C50F  20 C7       	BRA    $C4D8           ; COMPLETE THE FRAME


* COMPLETION CODE AVAILABLE
C511  7F 18 BA    	CLR    $18BA           ; VALID FRAME: CLEAR RX OVER
RUN COUNT

C514  B7 18 C2    	STAA   $18C2           ; SAVE STATUS BYTE
C517  3C          	PSHX                   ; SAVE BUFFER DATA POINTER
C518  37          	PSHB                   ; SAVE COMPLETION CODE

C519  5F          	CLRB                   ; CLEAR THROUGH TO END OF
BUFFER
C51A  8C 18 78    	CPX    #$1878          ; TEST FOR 10 BYTE FRAME
C51D  24 05       	BCC    $C524           ; BRANCH ZERO FILL THRU END OF
BUF

C51F  E7 00       	STAB   $00,X           ; CLEAR BUFFER FROM END OF
FRAME
C521  08          	INX                    ; INCREMENT DATA POINTER
C522  20 F6       	BRA    $C51A           ; LOOP THROUGH TO END OF
BUFFER

C524  33          	PULB                   ; RESTORE COMPLETION CODE
C525  38          	PULX                   ; RESTORE NEXT BYTE POINTER
C526  BD C5 36    	JSR    $C536           ; PROCESS COMPLETION CODE

C529  CE 18 6D    	LDX    #$186D          ; INITIALIZE FOR NEXT FRAME
C52C  7E C4 D8    	JMP    $C4D8           ; RECEIVE NEXT FRAME


*NO RECEIVE DATA AVAILABLE
C52F  FF 18 B4    	STX    $18B4           ; UPDATE DATA BUFFER POINTER
C532  B7 18 C0    	STAA   $18C0           ; SAVE STATUS
C535  39          	RTS                    ; DONE


************************************************
* PROCESS COMPLETION CODE
************************************************
C536  C5 D8       	BITB   #$D8            ; TEST COMPLETION FOR ERROR,
IFR, TX
C538  27 1F       	BEQ    $C559           ; BRANCH COMPLETION CODE OK

C53A  C5 C0       	BITB   #$C0            ; TEST OVERRUN AND FRAME ERROR
C53C  26 06       	BNE    $C544           ; BRANCH ON FAULT: OVERRUN OR
ERROR

C53E  B6 18 C2    	LDAA   $18C2           ; GET STATUS WORD
C541  B7 18 C3    	STAA   $18C3           ; COMPLETION CODE STATUS WORD


C544  13 0B 10 0E 	BRCLR  @$0B,$10,$C556  ; BRANCH RESPONSE IN PROGRESS

C548  C4 83       	ANDB   #$83            ; MASK COMPLETION CODE 
C54A  C1 83       	CMPB   #$83            ; TEST FOR RX SUCCESS
C54C  26 08       	BNE    $C556           ; NOT RX SUCCESS COMPLETION
CODE

* RX NO ERROR DETECTED
C54E  15 0B 10    	BCLR   @$0B,$10        ; RESPONSE IN PROGRESS

C551  86 50       	LDAA   #$50            ; INITIALIZE 1S TIMEOUT
C553  B7 18 BF    	STAA   $18BF           ; UPDATE
C556  7E C5 F2    	JMP    $C5F2           ; DONE


*
C559  B6 18 C2    	LDAA   $18C2           ; GET LAST STATUS WORD
C55C  B7 18 C3    	STAA   $18C3           ; COMPLETION CODE STATUS WORD

C55F  B6 18 BF    	LDAA   $18BF           ; CHECK 1S TIMER
C562  26 1D       	BNE    $C581           ; BRANCH NOT EXPIRED, DONE



C564  8F          	XGDX                   ; GET POINTER
C565  83 18 70    	SUBD   #$1870          ; TEST FOR LENGTH OF FRAME
C568  22 03       	BHI    $C56D           ; FRAME > 4 BYTES

C56A  7E C5 F2    	JMP    $C5F2           ; DONE

C56D  B6 18 6D    	LDAA   $186D           ; READ 1ST HEADER BYTE FROM
BUFFER
C570  88 08       	EORA   #$08            ; INVERT IFR BIT
C572  85 18       	BITA   #$18            ; CHECK FOR 3 BYTE HEADER W
IFR
C574  26 0B       	BNE    $C581           ; BRANCH NOT 3 BYTE HEADER,
IFR

C576  85 04       	BITA   #$04            ; CHECK ADDRESSING MODE
C578  26 09       	BNE    $C583           ; BRANCH PHYSICAL ADDRESSING

* FUNCTIONAL ADDRESSING
C57A  B6 18 6E    	LDAA   $186E           ; READ 2ND HEADER BYTE: TARGET
C57D  81 6A       	CMPA   #$6A            ; TEST TARGET TYPE
C57F  27 18       	BEQ    $C599           ; BRANCH TRANSFER FRAME

C581  20 6F       	BRA    $C5F2           ; DONE

* PHYSICAL ADDRESSING
C583  B6 18 6F    	LDAA   $186F           ; READ 3RD HEADER BYTE: SOURCE
C586  81 10       	CMPA   #$10            ; OBD SOURCE
C588  27 68       	BEQ    $C5F2           ; DONE

C58A  B6 18 6E    	LDAA   $186E           ; READ 2ND HEADER BYTE: TARGET
C58D  81 FE       	CMPA   #$FE            ; OBD TARGET
C58F  27 08       	BEQ    $C599           ; TRASNSFER FRAME

C591  81 10       	CMPA   #$10            ; OBD TARGET
C593  27 04       	BEQ    $C599           ; TRANSFER FRAME

C595  81 18       	CMPA   #$18            ; OBD TARGET
C597  26 59       	BNE    $C5F2           ; DONE

*
C599  CE 18 78    	LDX    #$1878          ; POINTER TO START OF RECEIVE
BUFFER
C59C  13 0B 02 05 	BRCLR  @$0B,$02,$C5A5  ; 

C5A0  FE 18 B6    	LDX    $18B6           ; GET BUFFER POINTER
C5A3  27 4D       	BEQ    $C5F2           ; DONE

C5A5  B6 18 77    	LDAA   $1877           ; MOVE FRAME
C5A8  ED 0A       	STD    $0A,X           ; LAST BYTE:LENGTH OF DATA
C5AA  FC 18 75    	LDD    $1875           ; 
C5AD  ED 08       	STD    $08,X           ; 
C5AF  FC 18 73    	LDD    $1873           ; 
C5B2  ED 06       	STD    $06,X           ; 
C5B4  FC 18 71    	LDD    $1871           ; 
C5B7  ED 04       	STD    $04,X           ; 
C5B9  FC 18 6F    	LDD    $186F           ; 
C5BC  ED 02       	STD    $02,X           ; 
C5BE  FC 18 6D    	LDD    $186D           ; 
C5C1  ED 00       	STD    $00,X           ; 

C5C3  8C 18 78    	CPX    #$1878          ; POINTER TO HEADER 0
C5C6  26 0B       	BNE    $C5D3           ; 

C5C8  14 0B 02    	BSET   @$0B,$02        ; 

C5CB  CC 00 00    	LDD    #$0000          ; 
C5CE  FD 18 BB    	STD    $18BB           ; 
C5D1  20 1F       	BRA    $C5F2           ; DONE


*
C5D3  FC 18 B8    	LDD    $18B8           ; BUFFER HEAD POINTER
C5D6  26 03       	BNE    $C5DB           ; BRANCH BUFFER NOT EMPTY

C5D8  FF 18 B8    	STX    $18B8           ; INITIALIZE HEAD POINTER

C5DB  8C 18 A8    	CPX    #$18A8          ; TEST FOR END OF BUFFER
C5DE  26 05       	BNE    $C5E5           ; NEXT FRAME POSITION

C5E0  CE 18 84    	LDX    #$1884          ; WRAP CIRCULAR BUFFER
C5E3  20 03       	BRA    $C5E8           ; CHECK FOR OVERFLOW

C5E5  C6 0C       	LDAB   #$0C            ; POINT TO NEXT FRAME SLOT
C5E7  3A          	ABX                    ; ADJUST POINTER

C5E8  A6 0B       	LDAA   $0B,X           ; CHECK IF FRAME POSITION IS
EMPTY
C5EA  27 03       	BEQ    $C5EF           ; BRANCH BUFFER FRAME POSITION
NOT USED

C5EC  CE 00 00    	LDX    #$0000          ; FLAG BUFFER OVER RUN
C5EF  FF 18 B6    	STX    $18B6           ; UPDATE HEAD POINTER
C5F2  39          	RTS                    ; DONE



More information about the Gmecm mailing list