OSDN Git Service

v 3.4 newcommer: FastForth I2C TERMINAL
[fast-forth/master.git] / forthMSP430FR_TERM_I2C.asm
index 8425a57..2e5b860 100644 (file)
@@ -16,7 +16,6 @@
 ; 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            ;
 ; ----------------------------------;
 
 ; **********************************;
@@ -49,13 +55,14 @@ TERMINAL_INT                        ; <--- START interrupt vector, bus stalled,
 ; (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
@@ -81,52 +88,36 @@ ASTORETEST  CMP W,TOS               ; 1     end of buffer is reached ?
             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
 ; ----------------------------------;
 
 ; ------------------------------------------------------------------------------
@@ -140,19 +131,13 @@ KEY         MOV @PC+,PC             ; Code Field Address (CFA) of KEY
 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
@@ -165,15 +150,11 @@ EMIT        MOV @PC+,PC             ;3 Code Field Address (CFA) of EMIT
 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"