next up previous contents
Next: 9.2.7 sci_int.asm Up: 9.2 Master Previous: 9.2.5 print.asm

9.2.6 mcan_int.asm

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

******************************************************************************************************



Christopher Odenbach
1999-06-01