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