; You should have received a copy of the GNU General Public License
; along with this program. If not, see <http://www.gnu.org/licenses/>.
-; for I2C_Slave init, see in /inc/TARGET.asm file
; ----------------------------------;
; ACCEPT part I prepare TERMINAL_INT; a START can be match here, with START ifg flag
ADD TOS,W ;1 -- org ptr W=buf_end )
MOV #0Ah,T ;2 T = 'LF' to speed up char loop in part II > prepare stack and registers for TERMINAL_INT use
MOV #20h,S ;2 S = 'BL' to speed up char loop in part II )
- PUSHM #4,IP ;6 PUSH IP,S,T,W r-- IP, 'BL', 'LF', buf_end )
-ACCEPT1 BIC #IE_TERM,&TERM_IFG ; clear UCSTTIFG before use during SLEEP
-; ----------------------------------;
-;; -test-v-test-v-test-v-test-v-test-;
-; BIC.B #LED1,&LED1_DIR ; Red led OFF, end of Slave TX
-; BIC.B #LED1,&LED1_OUT ; Red led OFF, end of Slave TX
-;; -test-^-test-^-test-^-test-^-test-;
-; ----------------------------------;
- BIT #10h,&TERM_CTLW0 ;4 test UCTR
- JZ SLEEP ;2 UCTR=0, IC2_Slave RX mode or I2C_Slave unplugged, 16~
-ACCEPT2 BIT #TX_TERM,&TERM_IFG ;3 UCTR=1, IC2_Slave TX mode
- JZ ACCEPT2 ;2 wait complete send of char
+ PUSHM #4,IP ;6 PUSH IP,S,T,W r-- IP, 'BL', 'LF', buf_end )
+; ----------------------------------;
+; -test-v-test-v-test-v-test-v-test-;
+ BIC.B #LED1,&LED1_DIR ; Red led OFF, end of Slave TX
+ BIC.B #LED1,&LED1_OUT ; Red led OFF, end of Slave TX
+; -test-^-test-^-test-^-test-^-test-;
+; ----------------------------------;
+ACCEPT1
+; ----------------------------------;
+; send ctrl_char $00 (ACCEPT request) ;
+; ----------------------------------;
+ BIT #TX_TERM,&TERM_IFG ;3 UCTR=1, IC2_Slave TX mode
+ JZ ACCEPT1 ;2 wait complete send of char
MOV.B #0,&TERM_TXBUF ; send ctrl_char $00
+ PUSH #SLEEP ; the return of WAITCHAREND
+; ----------------------------------;
+WAITCHAREND BIT #40h,&TERM_STATW ; wait the end of ctrl_char TX
+ JZ WAITCHAREND ; wait SCL held low, i.e. I2C_Master RX waits a char from I2C_Slave
; ----------------------------------;
- JMP SLEEP ;2 which calls RXON before shut down to LPMx mode
+RXON ; <======= SLEEP
+; ----------------------------------;
+RXOFF MOV @RSP+,PC ;
; ----------------------------------;
; **********************************;
; (ACCEPT) part II under interrupt ; Org Ptr --
; ----------------------------------;
ADD #4,RSP ;1 remove SR and PC from stack, SR flags are lost (unused by FORTH interpreter)
+ BIC #IE_TERM,&TERM_IFG ; clear UCSTTIFG before return to SLEEP
BIT #10h,&TERM_CTLW0 ;4 test UCTR
JNZ ACCEPT1 ; if I2C_Master RX, send $00 then return to SLEEP
POPM #4,IP ;6 POPM IP=ret_IP,W=src_end,T=0Ah,S=20h
-;; -test-v-test-v-test-v-test-v-test-;
-; BIS.B #LED2,&LED2_OUT ; green led ON, start of Slave RX
-; BIS.B #LED2,&LED2_DIR ; green led ON, start of Slave RX
-;; -test-^-test-^-test-^-test-^-test-;
+; -test-v-test-v-test-v-test-v-test-;
+ BIS.B #LED2,&LED2_OUT ; green led ON, start of Slave RX
+ BIS.B #LED2,&LED2_DIR ; green led ON, start of Slave RX
+; -test-^-test-^-test-^-test-^-test-;
QNEWCHAR BIT #RX_TERM,&TERM_IFG ;3 test RX BUF IFG
JZ QNEWCHAR ;2 wait RX BUF full
AREADCHAR MOV.B &TERM_RXBUF,Y ;3 read char into Y, RX_IFG is cleared, bus unstalled by I2C_Slave
JMP QNEWCHAR
; ----------------------------------;
ENDACCEPT ; here, after char 'LF' TXed, I2C_Master reSTARTs in RX mode
-;; -test-v-test-v-test-v-test-v-test-;
-; BIC.B #LED2,&LED2_DIR ; green led OFF, end of Slave RX
-; BIC.B #LED2,&LED2_OUT ; green led OFF, end of Slave RX
-; BIS.B #LED1,&LED1_DIR ; Red led ON, start of Slave TX
-; BIS.B #LED1,&LED1_OUT ; Red led ON, start of Slave TX
-;; -test-^-test-^-test-^-test-^-test-;
+; -test-v-test-v-test-v-test-v-test-;
+ BIC.B #LED2,&LED2_DIR ; green led OFF, end of Slave RX
+ BIC.B #LED2,&LED2_OUT ; green led OFF, end of Slave RX
+ BIS.B #LED1,&LED1_DIR ; Red led ON, start of Slave TX
+ BIS.B #LED1,&LED1_OUT ; Red led ON, start of Slave TX
+; -test-^-test-^-test-^-test-^-test-;
; ----------------------------------; -- Org Ptr
CMP #0,&LINE ;
JZ ACCEPTEND ; if LINE <> 0 increment LINE
ADD #1,&LINE ;
ACCEPTEND SUB @PSP+,TOS ; -- len'
-AWAITTX BIT #40h,&TERM_STATW ; wait SCL held low, i.e. I2C_Master RX waits a char from I2C_Slave
- JZ AWAITTX ;
; ----------------------------------;
-; MOV #CPUOFF+GIE,&LPM_MODE ; reset LPM_MODE to default mode LPM0 for next line of input stream
- MOV #LPM4+GIE,&LPM_MODE ; reset LPM_MODE to default mode LPM4 for next line of input stream
+; MOV #LPM4+GIE,&LPM_MODE ; reset LPM_MODE to default mode LPM4 for next line of input stream
; ----------------------------------;
- MOV @IP+,PC ; ...until next falling down to LPMx mode of (ACCEPT) part1,
-; **********************************; i.e. when the FORTH interpreter has no more to do.
+ CALL #WAITCHAREND ; wait SCL held low, i.e. I2C_Master RX waits a char from I2C_Slave
+ MOV @IP+,PC ; ...until next falling down to LPMx mode of (ACCEPT) part1,
+; **********************************; i.e. when the FORTH interpreter has no more to do.
-; ----------------------------------;
-RXOFF ;
-; ----------------------------------;
-RXON MOV @RSP+,PC ; <======= SLEEP
-; ----------------------------------;
; ----------------------------------;
-COLD ;
+COLD MOV #5A4Fh,&WDTCTL ; start Watchdog Reset : XDTPW, WDTSSEL=VLOCLK, WDTCNTCL=1, WDTIS=2^6 (8ms)
; ----------------------------------;
- MOV #5A4Dh,&WDTCTL ; start Watchdog Reset : XDTPW, WDTSSEL=VLOCLK, WDTCNTCL=1, WDTIS=2^13 (1s)
-; ----------------------------------; WDT_RST time = 1s because the ABORT loop time on I2C_Master side.
-; send $02 (ABORT request) ;
+COLD_TERM BIT #TX_TERM,&TERM_IFG ;3
+ JZ COLD_TERM ;2 wait complete send of previous char
; ----------------------------------;
- BIT #10h,&TERM_CTLW0 ;4 test UCTR
- JZ COLDI2CEND2 ;2 UCTR=0, IC2_Slave RX mode or I2C_Slave unplugged, 16~
-COLDI2C BIT #TX_TERM,&TERM_IFG ;3 UCTR=1, IC2_Slave TX mode
- JZ COLDI2C ;2 wait complete send of previous char
- MOV.B #2,&TERM_TXBUF ; send ctrl_char $02 to I2C_Master which will execute QABORT_TERM
+; send ctrl_char $03 (COLD request) ;
; ----------------------------------;
-; wait STOP from Master ;
-; ----------------------------------;
-COLDI2CEND BIC #8,&TERM_IFG ; clear STOP ifg before test
-COLDI2CEND1 BIT #8,&TERM_IFG ; test STOP occurring
- JZ COLDI2CEND1 ;
-; ----------------------------------;
-COLDI2CEND2 MOV #0A504h,&PMMCTL0 ; performs BOR
+ MOV.B #3,&TERM_TXBUF ; send ctrl_char $03 to I2C_Master which will execute QABORT_TERM
+ CALL #WAITCHAREND ;
+ MOV #0A504h,&PMMCTL0 ; performs BOR
; ----------------------------------;
; ------------------------------------------------------------------------------
PFAKEY .word BODYKEY ; Param Field Address (PFA) of KEY, with its default value
BODYKEY SUB #2,PSP ; push old TOS..
MOV TOS,0(PSP) ; ..onto stack
- MOV #0,TOS ; -- 0 aborted KEY value
-; ----------------------------------;
- BIT #10h,&TERM_CTLW0 ; test UCTR
- JZ BKEYEND ; when UCTR=0, IC2_Slave is in (RX|SWRST) mode, KEY can't work.
-; ----------------------------------;
KEYQEMIT BIT #TX_TERM,&TERM_IFG ; TX buffer empty ?
JZ KEYQEMIT ; wait TX buffer empty
MOV.B #1,&TERM_TXBUF ; send $01 to I2C_Master RX as KEY request
BKEYLOOP BIT #RX_TERM,&TERM_IFG ; received char ?
JZ BKEYLOOP ; wait char received
MOV &TERM_RXBUF,TOS ; -- char
-; ----------------------------------;
-BKEYEND MOV @IP+,PC ; -- char|0 Z=aborted KEY
+BKEYEND MOV @IP+,PC ; -- char
; ------------------------------------------------------------------------------
; TERMINAL I/O, output part
PFAEMIT .word BODYEMIT ; Parameter Field Address (PFA) of EMIT, with its default value
BODYEMIT MOV TOS,Y ;1 sends character to the default output TERMINAL
MOV @PSP+,TOS ;2
-; ----------------------------------;
-YEMIT2 BIT #10h,&TERM_CTLW0 ;4 test UCTR
- JZ YEMITEND ;2 UCTR=0, IC2_Slave RX mode or I2C_Slave unplugged, 16~
-; ----------------------------------;
-YEMIT1 BIT #TX_TERM,&TERM_IFG ;3 UCTR=1, IC2_Slave TX mode
- JZ YEMIT1 ;2 wait complete send of previous char
+YEMIT1
+YEMIT2 BIT #TX_TERM,&TERM_IFG ;3 UCTR=1, IC2_Slave TX mode
+ JZ YEMIT2 ;2 wait complete send of previous char
YEMIT .word 4882h ; 4882h = MOV Y,&<next_adr>
.word TERM_TXBUF ; 3
-; ----------------------------------;
YEMITEND MOV @IP+,PC ;4 14 words
FORTHWORD "ECHO"