next up previous contents
Next: 9.2.8 int_tab.asm Up: 9.2 Master Previous: 9.2.6 mcan_int.asm

9.2.7 sci_int.asm

******************************************************************************************************
* Studienarbeit      Christopher Odenbach                                                            *
*                                                                                                    *
* WS98/99                                                                                            *
*                                                                                                    *
* mit Dank an Willi                                                                                  *
******************************************************************************************************

******************************************************************************************************
*   MOTOROLA  MC68HC705X32                                                                           *
*                                                                                                    *
*    SCI Interrupt service routines                                                                  *
*                                                                                                    *
*                                                                                                    *
*                                                                                                    *
*                                                                                                    *
*                                                                                                    *
******************************************************************************************************


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

******************************************************************************************************
* select SCI service routine
******************************************************************************************************

SCI_INT                 EQU     *
                        LDA     SCSR
                        STA     SCSR_BUF
                        BRSET   5,SCSR_BUF,REC_INT      ;receiver interrupt
                        BRSET   4,SCSR_BUF,IDLE_INT     ;idle interrupt
                        JMP     EO_SCI_INT



******************************************************************************************************
* Idle interrupt service routine
******************************************************************************************************
IDLE_INT                BCLR    4,SCCR2                 ;disable more idle line Interrupts

******************************************************************************************************
* Send data to SCI
******************************************************************************************************

                        LDA     BC_IN                   ;any more bytes to send?
                        BEQ     EO_SCI_INT_HELP_2

SEND_SCI                CLRX

TBA_WAIT_LOOP           NOP
                        BRCLR   2,CSTAT,TBA_WAIT_LOOP

SEND_SCI_LOOP           INCX
                        LDA     SCI_TX_RAM-1,X
                        STA     TDS1-1,X                ;transfer data byte to CAN transmit buffer

                        TXA
                        CMP     BC_IN
                        BEQ     INSERT_HEADER
                        BRA     SEND_SCI_LOOP

INSERT_HEADER           ORA     SENDER_ID_2             ;rest of my ID
                        ORA     SCI
                        STA     TRTDL

                        LDA     SCI_ID                  ;recipient is the chosen khepera
                        ORA     SENDER_ID_1             ;sender is me
                        STA     TBI

                        LDA     #$81                    ;set transmission request
                        STA     CCOM

                        CLRA
                        STA     BC_IN

                        JMP     EO_SCI_INT


******************************************************************************************************
* Receiver interrupt service routine
******************************************************************************************************
REC_INT                 LDA     SCDR

                        CMP     #$1B                    ; read character is ESC?
                        BEQ     ENTER_COMMAND_MODE      ; enter command mode
                        LDX     COMM_MODE               ; already in command mode?
                        BNE     ENTER_COMMAND           ; then continue with command

                        INC     BC_IN                   ; otherwise prepare for sending
                        LDX     BC_IN
                        STA     SCI_TX_RAM-1,X
                        LDA     BC_IN
                        CMP     #$08
                        BEQ     SEND_SCI
                        BSET    4,SCCR2                 ; enable one idle line interrupt

EO_SCI_INT_HELP_2       JMP     EO_SCI_INT


ENTER_COMMAND_MODE      LDA     #$01
                        STA     COMM_MODE
                        CLR     CMD_IDX
                        LDA     MODE
                        CMP     #$01
                        BEQ     PRINT_COMMAND_MODE
                        JMP     EO_SCI_INT

PRINT_COMMAND_MODE      JSR     PRINT_COM_MODE
                        JMP     EO_SCI_INT

ENTER_COMMAND           LDX     CMD_IDX
                        STA     CMD_LINE,X
                        INC     CMD_IDX
                        CMP     #$0D                    ; read character is CR
                        BEQ     END_COMMAND
                        LDA     CMD_IDX
                        CMP     #$10
                        BEQ     LINE_TOO_LONG
                        JMP     EO_SCI_INT

LINE_TOO_LONG           DEC     CMD_IDX
                        JMP     EO_SCI_INT

END_COMMAND             CLR     COMM_MODE
                        JSR     PRINT_CR
                        LDA     CMD_LINE
                        CMP     #$53                    ; 'S' = send CAN telegram
                        BEQ     COM_SEND
                        CMP     #$52                    ; 'R' = robot
                        BEQ     COM_ROBOT_HELP
                        CMP     #$4C                    ; 'L' = list of robots
                        BEQ     COM_LIST_HELP
*
*               place for new commands
*
                        LDA     MODE
                        CMP     #$01
                        BNE     EO_SCI_INT_HELP
                        JSR     PRINT_HELP_TEXT
                        JSR     PRINT_CR
EO_SCI_INT_HELP         JMP     EO_SCI_INT

****************
* command: SEND
****************

COM_SEND                LDA     CMD_IDX
                        SUB     #$04
                        STA     CMD_IDX

                        LDA     CMD_LINE+2
                        SUB     #$41
                        STA     REC_ADR
                        LDA     CMD_LINE+1
                        SUB     #$41
                        STA     SND_ADR
                        AND     #$1C
                        LSLA
                        LSLA
                        LSLA
                        ORA     REC_ADR
                        STA     TBI
                        LDA     SND_ADR
                        AND     #$03
                        RORA
                        RORA
                        RORA
                        ORA     K_BUS
                        ORA     CMD_IDX
                        STA     TRTDL
                        CLRX
COM_SEND_LOOP           LDA     CMD_LINE+3,X
                        CMP     #$0D
                        BEQ     COM_SEND_EO_LOOP
                        STA     TDS1,X
                        INCX
                        BRA     COM_SEND_LOOP
COM_SEND_EO_LOOP        LDA     #$81
                        STA     CCOM
                        LDA     MODE
                        CMP     #$01
                        BEQ     COM_SEND_INFO
                        BRA     EO_SCI_INT
***
COM_ROBOT_HELP          BRA     COM_ROBOT
COM_LIST_HELP           BRA     COM_LIST
***

COM_SEND_INFO           JSR     PRINT_FROM
                        LDA     CMD_LINE+1              ; Sender-ID + 65 (A, B, C...)
                        JSR     PRINT_CHAR
                        JSR     PRINT_CR
                        JSR     PRINT_TO
                        LDA     CMD_LINE+2              ; Recipient-ID + 65
                        JSR     PRINT_CHAR
                        JSR     PRINT_CR
                        JSR     PRINT_DATA
                        CLRX
INFO_LOOP               INCX
                        LDA     CMD_LINE+2,X
                        CMP     #$0D
                        BEQ     EO_INFO_LOOP
                        JSR     PRINT_CHAR
                        BRA     INFO_LOOP
EO_INFO_LOOP            JSR     PRINT_CR
                        JSR     PRINT_CR
                        BRA     EO_SCI_INT

******************
* comand: ROBOT
******************

COM_ROBOT               LDA     CMD_LINE+1
                        SUB     #$41
                        STA     SCI_ID
                        LDA     MODE
                        CMP     #$01
                        BEQ     COM_ROBOT_INFO
                        BRA     EO_SCI_INT

COM_ROBOT_INFO          JSR     PRINT_ROB_INFO
                        BRA     EO_SCI_INT

******************
* command: LIST
******************

COM_LIST                JSR     PRINT_AVAIL
                        LDA     ROBNR
                        BEQ     NO_AVAIL
                        CLRX
COM_LIST_LOOP           LDA     ROBOTS,X
                        AND     #$1F
                        ADD     #$41
                        JSR     PRINT_CHAR
                        INCX
                        TXA
                        CMP     ROBNR
                        BEQ     EO_COM_LIST_LOOP
                        BRA     COM_LIST_LOOP
NO_AVAIL                LDA     #$2D
                        JSR     PRINT_CHAR
EO_COM_LIST_LOOP        JSR     PRINT_CR
                        JSR     PRINT_CR
                        BRA     EO_SCI_INT

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



******************************************************************************************************
* End of SCI interrupt subroutine
******************************************************************************************************
EO_SCI_INT              EQU     *
                        RTI


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



Christopher Odenbach
1999-06-01