Here is code used to service frame receive with the DLC in cases where the code waits for the frame to become available. Service of asynchronous / background frames uses other code. This is the code used when sending data to the PCM for programming. It was lucky that I was able to find the data sheet for the MC68HC58 because while the operation isn't complex, it is hard to decipher with out the bit definitions.
-Tom
Code:
************************************************
* LOOP WHILE MONITORING DLC RETURN WHEN
* FRAME IS AVAILABLE, ON TIME OUT, ON ERROR
************************************************
DDDB 37 PSHB ; SAVE REGISTERS
DDDC 18 3C PSHY ;
DDDE 18 CE 0D 3A LDY #$0D3A ; SET TIME OUT CONSTANT 3386
DDE2 7F 1C 10 CLR $1C10 ; SET LOOP COUNTER
DDE5 BD 4E 7F JSR $4E7F ; RESET THE COP
DDE8 BD 4E 8A JSR $4E8A ; RESET THE PORT EXPANDER WATCHDOG
DDEB 7A 1C 10 DEC $1C10 ; DECREMENT LOOP COUNT AND RESET
DDEE 26 0A BNE $DDFA ; WATCHDOGS EVERY 256 LOOPS
DDF0 BD 4E 7F JSR $4E7F ; RESET THE COP
DDF3 BD 4E 8A JSR $4E8A ; RESET THE PORT EXPANDER WATCHDOG
DDF6 18 09 DEY ; DECREMENT TIME OUT COUNT
DDF8 27 2B BEQ $DE25 ; BRANCH TIME OUT EXPIRED
DDFA B6 10 60 LDAA $1060 ; READ DATA LINK CONTROLLER STATUS
DDFD 85 E0 BITA #$E0 ; TEST RECEIVE FIFO STATUS FIELD
DDFF 27 EA BEQ $DDEB ; LOOP ON BUFFER INVALID/EMPTY
DE01 B7 1C 07 STAA $1C07 ; SAVE RFS FIELD OF STATUS WORD
DE04 FC 10 60 LDD $1060 ; READ STATUS & DATA
DE07 B1 1C 07 CMPA $1C07 ; TEST FOR STATUS CHANGE
DE0A 23 03 BLS $DE0F ;
DE0C B6 1C 07 LDAA $1C07 ; GET ORIGNIAL STATUS RFS FIELD
DE0F 18 38 PULY ; RESTORE IY
DE11 81 A0 CMPA #$A0 ; TEST FOR COMPLETION CODE AT HEAD OF BUFFER
DE13 24 03 BCC $DE18 ; BRANCH ON COMPLETION CODE AT HEAD
DE15 0C CLC ; INDICATE NOT LAST BYTE (COMPLETION)
DE16 20 1C BRA $DE34 ; PASS DATA BACK TO CALLING ROUTINE
* PROCESS COMPLETEION CODE
DE18 C5 40 BITB #$40 ; TEST RECEIVE FIFO OVER RUN
DE1A 26 09 BNE $DE25 ; BRANCH ON OVER RUN
DE1C 5D TSTB ; TEST ERROR INDICATION
DE1D 2A 14 BPL $DE33 ; BRANCH NO ERROR
* ERROR CODE FIELD
* 00 CRC error
* 01 Incomplete byte
* 10 Bit timing error
* 11 Break
DE1F C4 03 ANDB #$03 ;
DE21 C1 03 CMPB #$03 ;
DE23 27 02 BEQ $DE27 ; BRANCH BREAK DETECTED
* TIME OUT
DE25 20 FE BRA $DE25 ; LOOP TILL WATCHDOG
DE27 8E 1C 2A LDS #$1C2A ; RESET STACK
DE2A CC F8 0A LDD #$F80A ; ABORT TRANSMISSION
DE2D FD 10 60 STD $1060 ; RE-CONFIGURE DLC
; FOR INTERRUPT OPERATION
DE30 7E DC 5F JMP $DC5F ; GET FRAME
DE33 0D SEC ; CARRY INDICATES COMPLETION CODE
; FRAME READY
DE34 17 TBA ; TRANSFER DATA TO ACCA
DE35 33 PULB ; RESTORE REGISTER
DE36 39 RTS ; DONE
Bookmarks