****************************************************************************************************** * 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 ******************************************************************************************************