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