******************************************************************************************************
* Studienarbeit Christopher Odenbach *
* *
* WS98/99 *
* *
* mit Dank an Willi *
******************************************************************************************************
******************************************************************************************************
* MOTOROLA MC68HC705X32 *
* *
* MCAN Interrupt service routines *
* *
* *
* *
* *
* *
******************************************************************************************************
******************************************************************************************************
******************************************************************************************************
* Transfer data from MCAN interface to RAM-buffer
******************************************************************************************************
MCAN_INT EQU *
DATA_2_RAM LDA RX_RAM_ACC ; RAM free?
BEQ STOP_HELP ; No - sodd off
CLRA
STA RX_RAM_ACC ; now it is not free any more
LDA RRTDL ; get length of sent data
AND #$0F
STA RAM_SIZE ; store length of sent data in RAM_SIZE i.e. X-Reg.
LDA RBI ; get the recipient's address
AND #$1F
STA REC_ADR
LDA RBI ; get the sender's address
AND #$E0
STA SND_ADR_BUF_1
LSRA
LSRA
LSRA
STA SND_ADR
LDA RRTDL
AND #$C0
STA SND_ADR_BUF_2
ROLA
ROLA
ROLA
ORA SND_ADR
STA SND_ADR
BRCLR 0,CINT,STOP_HELP ; only proceed if this was a CAN-Interrupt
******************************************************************************************************
* select MCAN service routine
******************************************************************************************************
LDA RRTDL
AND #$20 ; ID0 mask
CMP SCI
BEQ DATA_2_SCI ; received message's destination is SCI
JSR ENTER_TABLE ; enter sender into table of robots
LDA MODE
CMP #$01
BEQ LOGGING
BRA NO_LOGGING
******************************************************************************************************
* Transfer data from MCAN interface to SCI
******************************************************************************************************
DATA_2_SCI EQU *
CLRX
RAM_2_SCI_LOOP INCX
LDA RDS1-1,X
JSR PRINT_CHAR
TXA
CMP RAM_SIZE
BNE RAM_2_SCI_LOOP
BRA EO_MCAN_HELP
STOP_HELP JMP STOP_MCAN_INT
******************************************************************************************************
* Log received data to SCI
******************************************************************************************************
LOGGING JSR PRINT_FROM
LDA SND_ADR
ADD #$41 ; Sender-ID + 65 (A, B, C...)
JSR PRINT_CHAR
JSR PRINT_CR
JSR PRINT_TO
LDA REC_ADR
ADD #$41 ; Recipient-ID + 65
JSR PRINT_CHAR
JSR PRINT_CR
JSR PRINT_DATA
LDA RAM_SIZE
BEQ NO_DATA
CLRX
LOGGING_LOOP INCX
LDA RDS1-1,X
JSR PRINT_CHAR
TXA
CMP RAM_SIZE
BNE LOGGING_LOOP
NO_DATA JSR PRINT_CR
JSR PRINT_CR
NO_LOGGING LDA REC_ADR
CMP MASTER
BEQ MESSAGE_FOR_MASTER
EO_MCAN_HELP BRA EO_MCAN_INT
******************************************************************************************************
* React to message for master
******************************************************************************************************
MESSAGE_FOR_MASTER EQU *
LDA RAM_SIZE ; how long is the sent data
BNE EO_MCAN_INT ; nothing? go ahead.
LDA RDS1 ; get instruction
CMP #$4C ; 4C = 'L' = login
BEQ LOGIN_NEW_ROBOT
* BEQ other_commands...
* ...
BRA EO_MCAN_INT
LOGIN_NEW_ROBOT LDX ROBNR
BEQ EO_MCAN_INT
LOGIN_LOOP LDA ROBOTS-1,X
AND #$1F
CMP SND_ADR
BEQ SKIP_LOGIN
STA ROB_ID
LDA MODE
CMP #$01
BNE SKIP_LOGGING
JSR PRINT_FROM ; 'FROM: '
LDA ROB_ID
ADD #$41
JSR PRINT_CHAR
LDA #$28
JSR PRINT_CHAR
LDA MASTER
ADD #$41
JSR PRINT_CHAR
LDA #$29
JSR PRINT_CHAR
JSR PRINT_CR
JSR PRINT_TO ; 'TO: '
LDA SND_ADR
ADD #$41
JSR PRINT_CHAR
JSR PRINT_CR
JSR PRINT_DATA ; 'DATA: '
LDA #$4C
JSR PRINT_CHAR
JSR PRINT_CR
JSR PRINT_CR
SKIP_LOGGING LDA ROB_ID
ORA SND_ADR_BUF_1
STA TBI
LDA SND_ADR_BUF_2
ORA K_BUS
ORA #$01 ; 1 byte message
STA TRTDL
LDA #$4C ; $4C = 'L' = login
STA TDS1
LDA #$81
STA CCOM ; send message
SKIP_LOGIN DECX
BNE LOGIN_LOOP
BRA EO_MCAN_INT
******************************************************************************************************
* End of MCAN interrupt subroutine
******************************************************************************************************
EO_MCAN_INT EQU *
LDA #$01
STA RX_RAM_ACC ; allow ram access again
LDA #$84
STA CCOM ; release receive buffer
STOP_MCAN_INT RTI
******************************************************************************************************