OSDN Git Service

V4.0
[fast-forth/master.git] / forthMSP430FR_TERM_UART.asm
index 647a8dc..43149c8 100644 (file)
 ; LP_MSP430FR2476    P1.4 P1.5 P6.1
 ;
 ;-------------------------------------------------------------------------------
-; UART TERMINAL: QABORT INIT_TERM COLD_TERM
+; UART TERMINAL: QABORT ABORT_TERM INIT_BACKGRND RXON INIT_FORTH INIT_TERM INIT_COLD INIT_SOFT
 ;-------------------------------------------------------------------------------
+;
+;-----------------------------------;
+; modifying TOs is forbidden here ! ;
+;-----------------------------------;
+INIT_FORTH                          ; common ABORT_TERM|WARM subroutine, to init DEFERed definitions + INIT_FORTH
+;-----------------------------------;
+            MOV @RSP+,IP            ; init IP with CALLER next address
+;                                   ;
+            MOV #PUC_ABORT_ORG,X    ; FRAM INFO         FRAM MAIN
+;                                   ; ---------         ---------
+            MOV @X+,&PFAACCEPT      ; BODYACCEPT    --> PFAACCEPT
+            MOV @X+,&PFAEMIT        ; BODYEMIT      --> PFAEMIT
+            MOV @X+,&PFAKEY         ; BODYKEY       --> PFAKEY
+            MOV @X+,&CIB_ORG        ; TIB_ORG       --> CIB_ORG             TIB = Terminal Input Buffer, CIB = Current Input Buffer
+;                                   ;
+;                                   ; FRAM INFO         REG|RAM
+;                                   ; ---------         -------
+            MOV @X+,RSP             ; INIT_RSTACK   --> R1=RSP              PSP is initialised with ABORT
+            MOV @X+,rDOCOL          ; EXIT          --> R4=rDOCOL           (if DTC=2)
+            MOV @X+,rDODOES         ; XDODOES       --> R5=rDODOES
+            MOV @X+,rDOCON          ; XDOCON        --> R6=rDOCON
+            MOV @X+,rDOVAR          ; RFROM         --> R7=rDOVAR
+            MOV @X+,&CAPS           ; INIT_CAPS     --> RAM CAPS            init CAPS ON
+            MOV @X+,&BASEADR        ; INIT_BASE     --> RAM BASE            init decimal base
+            MOV @X+,&LEAVEPTR       ; INIT_LEAVE    --> RAM LEAVEPTR
+            MOV #0,&STATE           ; 0             --> RAM STATE
+            CALL &SOFT_APP          ; default SOFT_APP = INIT_SOFT = RET_ADR, value set by DEEP_RESET.
+            MOV #SEL_RST,PC         ; goto PUC 7 to select the user's choice from TOS value: RST_RET|DEEP_RESET
+;-----------------------------------;
 
-; this define run-time part of ABORT"    if f is true display msg. then abort current process
-QABORT      CMP #0,2(PSP)           ; -- f addr cnt         test flag f
-            JNZ ABORT_TERM          ;               see forthMSP430FR_TERM_xxxx.asm below
+; ?ABORT defines the run-time part of ABORT"
+;-----------------------------------;
+QABORT      CMP #0,2(PSP)           ; -- f addr cnt     if f is true abort current process then display ABORT" msg.
+            JNZ ABORT_TERM          ;
 THREEDROP   ADD #4,PSP              ; -- cnt
             JMP DROP                ;
+ABORT_TERM  PUSH #ABORT_INIT        ; ABORT_TERM is called by INTERPRET, QREVEAL, TYPE2DOES
 ; ----------------------------------;
-UART_ABORT_TERM                     ; exit from downloading, execute INIT_FORTH then display message if any
+UART_ABORT  CALL #UART_RXON         ;
 ; ----------------------------------;
-ABORT_TERM  CALL #RXON              ; resume downloading source file if any
 A_UART_LOOP BIC #RX_TERM,&TERM_IFG  ; clear RX_TERM
             MOV &FREQ_KHZ,Y         ; 1000, 2000, 4000, 8000, 16000, 24000
-A_USB_LOOPJ MOV #65,X               ; 2~           <----+ linux with minicom seems very very slow...
-A_USB_LOOPI SUB #1,X                ; 1~         <--+   | to refill its USB buffer
-            JNZ A_USB_LOOPI         ; 2~ 3~ loop ---+   |
+A_USB_LOOPJ MOV #65,X               ; 2~        <-------+ linux with minicom seems very very slow...
+A_USB_LOOPI SUB #1,X                ; 1~        <---+   | ...to refill its USB buffer
+            JNZ A_USB_LOOPI         ; 2~ 3~ loop ---+   |  ==> ((65*3)+5)*1000 = 200ms delay
             SUB #1,Y                ; 1~                |
-            JNZ A_USB_LOOPJ         ; 2~ 200~ loop -----+  ((65*3)+5)*1000 = 200ms delay
+            JNZ A_USB_LOOPJ         ; 2~ 200~ loop -----+
             BIT #RX_TERM,&TERM_IFG  ; 4 new char in TERMRXBUF after 200ms delay ?
             JNZ A_UART_LOOP         ; 2 yes, the input stream is still active: loop back
-            CALL #INIT_FORTH        ;                   common ?ABORT|PUC subroutine
-                                    ;                   TOS = cnt (byte), always positive. No RST_RET if cnt = 0.
+            MOV @RSP+,PC
+; ----------------------------------;
+ABORT_INIT  CALL #INIT_FORTH        ;                   common ?ABORT|PUC subroutine
             .word   DUP             ; -- f addr cnt cnt
-            .word   QFBRAN,ABORT_END; -- f addr 0       don't force ECHO if ABORT" is an empty string
+            .word   QFBRAN,ABORT_END; -- f addr 0       don't force ECHO, no display if ABORT" is an empty string
             .word   ECHO            ; -- f addr cnt     force ECHO
             .word   XSQUOTE         ;
             .byte   4,27,"[7m"      ;
             .word   TYPE            ;                   ESC [7m = set reverse video
 ; ----------------------------------;
-; Display QABORT|WARM message       ; <== WARM jumps here
+; Display QABORT|WARM message       ; -- addr cnt       <== WARM jumps here
 ; ----------------------------------;
 ABORT_TYPE  .word   TYPE            ; -- f              type QABORT|WARM message
-            .word   XSQUOTE         ;
+SDABORT_END .word   XSQUOTE         ;                   set normal video Display then goto ABORT
             .byte   4,27,"[0m"      ;
             .word   TYPE            ;                   ESC [0m = set normal video
 ABORT_END   .word   ABORT           ; -- f              no return
 ; ----------------------------------;
 
 ;-------------------------------------------------------------------------------
-; INIT TERMinal then enable I/O
+; INIT TERMinal then enable I/O     ;
 ;-------------------------------------------------------------------------------
-
+INIT_HARD                           ;
 ; ----------------------------------;
-UART_INIT_TERM                      ;
+INIT_TERM                           ; default content of HARD_APP called by WARM
 ; ----------------------------------;
-INIT_TERM
-    CALL #WAIT_UART_IDLE            ; wait while TERM_UART is busy
-    MOV #0081h,&TERM_CTLW0          ; 8 bits, UC SWRST + UCLK = SMCLK, max 6MBds
-;    MOV #1081h,&TERM_CTLW0          ; 7 bits, UC SWRST + UCLK = SMCLK, max 4MBds
+    MOV #0081h,&TERM_CTLW0          ; 8 bits, UC SWRST + UCLK = SMCLK, max 6MBds @24MHz
     MOV &TERMBRW_RST,&TERM_BRW      ; init value in FRAM INFO
     MOV &TERMMCTLW_RST,&TERM_MCTLW  ; init value in FRAM INFO
     BIS.B #BUS_TERM,&TERM_SEL       ; Configure pins TERM_UART|TERM_I2C
@@ -81,73 +109,69 @@ INIT_TERM
 ; ----------------------------------;
 
 ; ----------------------------------;
-UART_COLD_TERM                      ; default STOP_APP: wait TERMINAL idle
+INIT_STOP                           ; default STOP_APP, called by SYS: wait end of TX to TERMINAL
 ; ----------------------------------;
-WAIT_UART_IDLE
-COLD_TERM   BIT #1,&TERM_STATW      ;3 uart busy ?
-            JNZ COLD_TERM           ;2 loop back while TERM_UART is busy
+TX_IDLE     BIT #1,&TERM_STATW      ;3 uart busy ?
+            JNZ TX_IDLE             ;2 loop back while TERM_UART is busy
 ; ----------------------------------;
-UART_INIT_SOFT                      ;
-; ----------------------------------;
-INIT_SOFT_TERM
-            MOV @RSP+,PC            ; does nothing
+INIT_SOFT   MOV @RSP+,PC            ;
 ; ----------------------------------;
 
 ;-------------------------------------------------------------------------------
-; UART TERMINAL : WARM SYS COLD RESET
+; UART TERMINAL : SYS COLD RESET WARM
 ;-------------------------------------------------------------------------------
 
 ;-----------------------------------;
-;           FORTHWORD "WARM"        ; (n) --
-;-----------------------------------; thanks to INIT_FORTH, WARM implements the choice
-UART_WARM                           ; made by the user with SYS|hardwareRST|DEEP_reset
-;-----------------------------------; regarding the state of the software.
-WARM        CALL &HARD_APP          ;
-            mASM2FORTH              ;
-    .word   ECHO                    ;
-    .word   XSQUOTE
-    .byte   7,13,10,27,"[7m#"       ; CR + cmd "reverse video" + #
-    .word   TYPE
-    .word   DOT                     ; display TOS = USERSYS value
-    .word   XSQUOTE
-    .byte   25,"FastForth ",169,"J.M.Thoorens, "
-    .word   TYPE
-    .word   LIT,FRAM_FULL
-    .word   HEREXEC,MINUS,UDOT
-    .word   XSQUOTE
-    .byte   10,"bytes free"
-    .word   BRAN,ABORT_TYPE         ; without return
+UART_WARM                           ; (n) --
+;-----------------------------------;
+WARM    CALL &HARD_APP              ; default HARD_APP = INIT_TERM, value set by DEEP_RESET.
+        mASM2FORTH                  ;
+        .word   ECHO                ;
+        .word   XSQUOTE             ;
+        .byte   7,13,10,27,"[7m#"   ; CR + cmd "reverse video" + #
+        .word   TYPE                ;
+        .word   DOT                 ; display TOS = USERSYS value
+        .word   XSQUOTE             ;
+        .byte   25,"FastForth ",169 ;
+        .byte   "J.M.Thoorens, "    ;
+        .word   TYPE                ;
+        .word   LIT,FRAM_FULL       ;
+        .word   HERE,MINUS,UDOT     ;
+        .word   XSQUOTE             ;
+        .byte   10,"bytes free"     ;
+        .word   BRAN,ABORT_TYPE     ; no return
 ;-----------------------------------;
 
 ;-----------------------------------;
-            FORTHWORD "SYS"         ; n --      software RST, DEEP_RST, COLD, WARM
+            FORTHWORD "SYS"         ; n --      select COLD, DEEP_COLD, WARM (as software RST,DEEP_RST,WARM)
 ;-----------------------------------;
+SYS         CALL &STOP_APP          ; default STOP_APP = INIT_STOP, set by DEEP_RESET.
             CMP #0,TOS              ;
-            JL SYSEND               ; if -n SYS  ==> COLD + DEEP_RESET
-            JZ NOPUC                ; if [0] SYS ==> INIT_FORTH --> WARM -->  WARM display
+            JL TOS2COLD             ; if -n SYS  --> COLD --> PUC --> INIT_FORTH --> DEEP_RESET --> WARM
+            JZ TOS2WARM             ; if [0] SYS --> INIT_FORTH --> WARM
             BIT #1,TOS              ;
-            JNC SYSEND              ; if +n SYS (+n even)
-NOPUC       PUSH #WARM              ;
-            PUSH RSP                ; Push address of WARM address
-            JMP INIT_FORTH          ; if +n SYS (+n odd)  ==> INIT_FORTH --> WARM -->  WARM display
-SYSEND      MOV TOS,&USERSYS        ; ==> COLD --> PUC --> INIT_FORTH --> WARM -->  WARM display
-;===============================================================================
-COLD        ; <--- USER_NMI vector <--- <RESET> and <RESET> + <SW1> (DEEP_RESET)
-;===============================================================================
-; as pin RST is replaced by pin NMI, RESET by pin activation is redirected here via USER NMI vector
+            JZ TOS2COLD             ; if +n SYS (+n even)--> COLD --> PUC --> INIT_FORTH --> WARM
+TOS2WARM    CALL #INIT_FORTH        ; if +n SYS (+n odd) --> INIT_FORTH --> WARM
+FWARM       .word WARM              ; no return
+TOS2COLD    MOV TOS,&USERSYS        ;
+;*******************************************************************************
+COLD                                ; <--- USER_NMI vector <------------------------ <RESET> | <RESET+SW1>
+;*******************************************************************************
+; as pin RST is replaced by pin NMI, hardware RESET is redirected here via USER NMI vector
 ; that allows actions to be performed before executing software BOR.
-            CALL &COLD_APP          ; to stop APPlication before reset
             BIT.B #SW1,&SW1_IN      ; <SW1> pressed ?
-            JNZ COLDEXE             ; no
+            JNZ DO_BOR              ; no
             MOV #-1,&USERSYS        ; yes, set negative value to force DEEP_RESET
-COLDEXE     MOV #0A504h,&PMMCTL0    ; performs software_BOR ------------------------+
-;===============================================================================    |
-RESET                               ; <-- RST vect. <-- SYS_failures PUC POR BOR <--+
-;===============================================================================
+DO_BOR      MOV #0A504h,&PMMCTL0    ; ---------------------------> software_BOR --->+
+;*******************************************************************************    |
+;*******************************************************************************    v
+RESET                               ; <--- RST vector <----------- PUC <--- POR <---+<--- BOR <--- SYS_failures 
+;*******************************************************************************
+;*******************************************************************************
 ; PUC 1: replace pin RESET by pin NMI, stops WDT_RESET
 ;-------------------------------------------------------------------------------
-            BIS #3,&SFRRPCR         ; pin NMI with falling edge replaces pin RST, so SYSRSTIV = 4
-            BIS #10h,&SFRIE1        ; enable NMI pin interrupt ==> hardware RESET is redirected to COLD.
+            BIS #1,&SFRRPCR         ; pin RST becomes pin NMI with rising edge, SYSRSTIV = 6, hardware RESET is redirected to COLD
+            BIS #10h,&SFRIE1        ; enable NMI pin interrupt.
             MOV #5A80h,&WDTCTL      ; disable WDT RESET
 ;-------------------------------------------------------------------------------
 ; PUC 2: INIT STACK
@@ -162,24 +186,24 @@ RESET                               ; <-- RST vect. <-- SYS_failures PUC POR BOR
 ;-------------------------------------------------------------------------------
 ; PUC 4: init RAM to 0
 ;-------------------------------------------------------------------------------
-            MOV #RAM_LEN,X          ; 2 RAM_LEN must be even and > 1, obviously.
+            MOV #RAM_LEN,X          ; 2 RAM_LEN must be even and > 0, obviously.
 INITRAMLOOP SUB #2,X                ; 1
             MOV #0,RAM_ORG(X)       ; 3
             JNZ INITRAMLOOP         ; 2 6 cycles loop !
 ;-------------------------------------------------------------------------------
-; PUC 5: GET SYSRSTIV and SYS_USER
+; PUC 5: GET SYSRSTIV and USERSYS
 ;-------------------------------------------------------------------------------
             MOV &SYSRSTIV,X         ; X <-- SYSRSTIV <-- 0
-            MOV &USERSYS,TOS        ; TOS = USERSYS
-            MOV #0,&USERSYS         ; clear USERSYS
-            AND #-1,TOS             ;
+            MOV &USERSYS,TOS        ; TOS = FRAM USERSYS
+            MOV #0,&USERSYS         ; clear FRAM USERSYS
+            BIT #-1,TOS             ;
             JNZ PUC6                ; if TOS <> 0, keep USERSYS value
-            MOV X,TOS               ; TOS <-- SYSRSTIV
+            MOV X,TOS               ; else TOS <-- SYSRSTIV
 ;-------------------------------------------------------------------------------
-; PUC 6: START FORTH engine
+; PUC 6: START FORTH engine: WARM (BOOT)
 ;-------------------------------------------------------------------------------
 PUC6        CALL #INIT_FORTH        ; common part of QABORT|PUC
-PUCNEXT     .WORD WARM              ; no return. May be redirected by BOOT.
+PUCNEXT     .word WARM              ; no return. May be redirected by BOOT.
 ;-----------------------------------;
 
 ;-------------------------------------------------------------------------------
@@ -199,27 +223,22 @@ BODYACCEPT  MOV TOS,Y               ;1 -- org len   Y = len
             ADD TOS,Y               ;1 -- org ptr   Y = buf_end
             MOV #0Dh,X              ;2              X = 'CR' to speed up char loop in part II
             MOV #20h,W              ;2              W = 'BL' to speed up char loop in part II
-            MOV #YEMIT_NEXT,T       ;2              T = return for QYEMIT
-            MOV #CR_NEXT,S          ;2              S = CR_NEXT
-            PUSHM #6,IP             ;8              PUSHM IP,S,T,W,X,Y       r-- ACCEPT_ret CR_NEXT YEMIT_NEXT BL CR buf_end
-            JMP SLEEP               ;2              send RXON then shut down to LPM0 sleeping mode
-; ----------------------------------;
+            MOV #YEMIT_NEXT,T       ;2              T = YEMIT_ret
+            MOV #CR_NEXT,S          ;2              S = XOFF_ret
+            PUSHM #6,IP             ;8              PUSHM IP,S,T,W,X,Y       r-- ACCEPT_ret XOFF_ret YEMIT_ret BL CR buf_end
+
+;###################################################################################
+BACKGRND    CALL &BACKGRND_APP      ;   default BACKGRND_APP = UART_INIT_BACKGRND = UART_RXON, value set by DEEP_RESET.
+            BIS &LPM_MODE,SR        ;2  enter in LPM0 mode with GIE=1
+; here, FAST FORTH sleeps, awaiting any interrupt.
+; IP,S,T,W,X,Y registers (R13 to R8) are free...
+; ...and also TOS, PSP and RSP stacks within their rules of use.
+            JMP BACKGRND            ;2  return for all interrupts.
+;###################################################################################
 
-; **********************************;
-TERMINAL_INT                        ; <--- TERM RX buffer full interrupt vector, delayed by the LPM0 wake up time
-; **********************************;      if wake up time increases, max bauds rate decreases...
-; ACCEPT part II under interrupt    ; Org Ptr -- len'       all SR flags are cleared
-; ----------------------------------;
-            ADD #4,RSP              ;1  remove SR and PC from stack
-            POPM #4,IP              ;6  POPM W=buffer_bound, T=0Dh, S=20h, IP=YEMIT_NEXT    r-- ACCEPT_ret CR_NEXT
-; ----------------------------------;
-AKEYREAD    MOV.B &TERM_RXBUF,Y     ;3  read character into Y, RX_TERM is cleared
-; ----------------------------------;
-            CMP.B T,Y               ;1      CR ?
-            JNZ AKEYRDNNEXT         ;2      no
-; ----------------------------------;
-RXOFF                               ; Software|hardware flow control to stop RX UART    r-- ACCEPT_ret CR_NEXT
 ; ----------------------------------;
+UART_RXOFF                          ; Software|hardware flow control to stop RX UART
+; ----------------------------------; RXOFF is sent while LF char is received...
     .IFDEF TERMINAL3WIRES           ;   first software flow control
 RXOFF_LOOP  BIT #TX_TERM,&TERM_IFG  ;3      wait the sending of last char
             JZ RXOFF_LOOP           ;2
@@ -229,51 +248,67 @@ RXOFF_LOOP  BIT #TX_TERM,&TERM_IFG  ;3      wait the sending of last char
             BIS.B #RTS,&HANDSHAKOUT ;3  set RTS high
     .ENDIF                          ;
             MOV @RSP+,PC            ;4 to CR_NEXT
+; ----------------------------------; RXOFF is sent while LF char is received...
+
+; **********************************;
+TERMINAL_INT                        ; <--- TERM RX interrupt vector, delayed by the LPM0 wake up time
+; **********************************;      if wake up time increases, max baudrate decreases...
+; ACCEPT part II under interrupt    ; Org Ptr -- len'       all SR flags are cleared
 ; ----------------------------------;
-AKEYRDNNEXT CMP.B S,Y               ;1      printable char ?
+            ADD #4,RSP              ;1  remove SR and PC from stack
+            POPM #4,IP              ;6  POPM W=BUF_end, T='CR', S='BL', IP=YEMIT_ret    r-- ACCEPT_ret XOFF_ret
+; ----------------------------------;
+AKEYREAD    MOV.B &TERM_RXBUF,Y     ;3  read character into Y, RX_TERM is cleared
+; ----------------------------------;
+            CMP.B S,Y               ;1      printable char ?
             JC ASTORETEST           ;2      yes
 ; ----------------------------------;
+            CMP.B T,Y               ;1      CR ?
+            JZ UART_RXOFF           ;2      yes
+; ----------------------------------;
             CMP.B #8,Y              ;1      char = BS ?
-            JNE WAITaKEY            ;2      case of other control chars
+            JNZ WAITaKEY            ;2      case of other control chars
 ; ----------------------------------;
 ; start of backspace                ;       made only by an human
 ; ----------------------------------;
             CMP @PSP,TOS            ;       Ptr = Org ?
             JZ WAITaKEY             ;       yes: do nothing
             SUB #1,TOS              ;       no : dec Ptr
-            JMP YEMIT               ;       don't store BS, return to YEMIT_NEXT
+            JMP QYEMIT              ;       don't store BS, return to YEMIT_NEXT
+; ----------------------------------;
+; end of backspace                  ;
 ; ----------------------------------;
 ASTORETEST  CMP W,TOS               ; 1 Bound is reached ?
-            JC YEMIT                ; 2 yes: don't store char @ Ptr, don't increment TOS
+            JC QYEMIT               ; 2 yes: don't store char @ Ptr, don't increment TOS
             MOV.B Y,0(TOS)          ; 3 no: store char @ Ptr
             ADD #1,TOS              ; 1     increment Ptr
 ; ----------------------------------;
-YEMIT       BIT #TX_TERM,&TERM_IFG  ; 3 wait the sending end of previous char, useless at high baudrates,
-            JZ YEMIT                ; 2 but there's no point in wanting to save time here:
-        .IFDEF  TERMINAL5WIRES      ;
-YEMIT1      BIT.B #CTS,&HANDSHAKIN  ; 3 CTS is pulled low if unwired.
-            JNZ YEMIT1              ; 2
+QYEMIT      BIT #TX_TERM,&TERM_IFG  ; 3 NOECHO stores here : MOV @IP+,PC, ECHO store here the first word of: BIT #TX_TERM,&TERM_IFG
+            JZ QYEMIT               ; 2 but there's no point in wanting to save time here:
+        .IFDEF  TERMINAL5WIRES      ; then decrease BAUDRATE !
+QYEMIT1     BIT.B #CTS,&HANDSHAKIN  ; 3 CTS is pulled low if unwired.
+            JNZ QYEMIT1             ; 2
         .ENDIF                      ;
-QYEMIT      MOV.B Y,&TERM_TXBUF     ; 3 may be replaced by MOV @IP+,PC with NOECHO
+            MOV.B Y,&TERM_TXBUF     ; 3
             MOV @IP+,PC             ; 4
 ; ----------------------------------;
-YEMIT_NEXT  .word $+2               ; 0 YEMII NEXT address
+YEMIT_NEXT  .word $+2               ; 0 YEMIT NEXT address
             SUB #2,IP               ; 1 restore YEMIT_NEXT
 ; ----------------------------------;
 WAITaKEY    BIT #RX_TERM,&TERM_IFG  ; 3 new char in TERMRXBUF ?
-            JNZ AKEYREAD            ; 2 yes, loop = 34~/31~ by char (with/without echo) ==> 294/322 kBds/MHz
+            JNZ AKEYREAD            ; 2 yes, loop = 34~/26~ by char (with/without echo) ==> 294/384 kBds/MHz
             JMP WAITaKEY            ; 2 no
 ; ----------------------------------;
-; return of RXOFF                   ; --- Org Ptr   R-- ACCEPT_NEXT
+; return of RXOFF                   ; --- Org Ptr
 ; ----------------------------------;
-CR_NEXT     SUB @PSP+,TOS           ; -- len'
-            MOV @RSP+,IP            ;               R--
-WAITLF      BIT #RX_TERM,&TERM_IFG  ;               char 'LF' is received ?
-            JZ WAITLF               ;               no
+CR_NEXT     BIT #RX_TERM,&TERM_IFG  ;               char 'LF' is received ?
+            JZ CR_NEXT              ;               no
             MOV.B &TERM_RXBUF,Y     ;               yes, clear RX_IFG flag after LF received
 ; ----------------------------------;
-ACCEPT_EOL  MOV S,Y                 ;               output a BL on TERMINAL (for the case of error occuring)
-            JMP YEMIT               ;               before return to QUIT to interpret line
+            SUB @PSP+,TOS           ; -- len'       R-- ACCEPT_NEXT
+            MOV @RSP+,IP            ;               R--
+ACCEPT_EOL  MOV.B S,Y               ;               output a BL on TERMINAL (for the case of error occuring)
+            JMP QYEMIT              ;               before return to QUIT to interpret line
 ; **********************************;               UF9 to UF11 will be resetted.
 
 ;-----------------------------------;
@@ -285,48 +320,51 @@ KEY         MOV @PC+,PC             ;4  Code Field Address (CFA) of KEY
 PFAKEY      .word   BODYKEY         ;   Parameter Field Address (PFA) of KEY, with default value
 BODYKEY     PUSH #KEYNEXT           ;
 ; ----------------------------------;
-RXON                                ; default BACKGND_APP
+INIT_BACKGRND                       ; default content of BACKGRND_APP called by BACKGRND
+; ----------------------------------;
+UART_RXON                           ;
 ; ----------------------------------;
     .IFDEF TERMINAL3WIRES           ;   first software flow control
-RXON_LOOP   BIT #TX_TERM,&TERM_IFG  ;3      wait the sending of last char, useless at high baudrates
-            JZ RXON_LOOP            ;2
+            BIT #TX_TERM,&TERM_IFG  ;3      wait the sending of last char, useless at high baudrates
+            JZ UART_RXON            ;2
             MOV #17,&TERM_TXBUF     ;4  move char XON into TX_buf
     .ENDIF                          ;
     .IFDEF TERMINAL4WIRES           ;   and hardware flow control after
             BIC.B #RTS,&HANDSHAKOUT ;3      set RTS low
     .ENDIF                          ;
-            MOV @RSP+,PC            ;4  to BACKGND (End of file download or quiet input) or AKEYREAD...
-; ----------------------------------;   ... (get next line of file downloading), or user defined
+            MOV @RSP+,PC            ;4
+; ----------------------------------;
 KEYNEXT     SUB #2,PSP              ;1  push old TOS..
             MOV TOS,0(PSP)          ;3  ..onto stack
 KEYLOOP     BIT #RX_TERM,&TERM_IFG  ; loop if bit0 = 0 in interupt flag register
             JZ KEYLOOP              ;
-            CALL #RXOFF             ;
+            CALL #UART_RXOFF        ;
             MOV &TERM_RXBUF,TOS     ;
             MOV @IP+,PC
+;-----------------------------------;
 
 ;-----------------------------------;
-            FORTHWORD "EMIT"
+            FORTHWORD "EMIT"        ;       save X before use if used
 ;-----------------------------------;
 ; https://forth-standard.org/standard/core/EMIT
 ; EMIT     c --    output character to the selected output device ; primary DEFERred word
-EMIT        MOV @PC+,PC             ;4 Code Field Address (CFA) of EMIT
+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 output character to the default output: TERMINAL
             MOV @PSP+,TOS           ;2
-            JMP YEMIT               ;2 + 12~
+            JMP QYEMIT              ;2 + 12~
+;-----------------------------------;
 
 ;-----------------------------------;
-            FORTHWORD "ECHO"
+            FORTHWORD "ECHO"        ; --    connect ACCEPT and EMIT to TERMINAL input (default)
+;-----------------------------------;
+ECHO        MOV #0B3A2h,&QYEMIT     ;       MOV #'BIT #TX_TERM,0(PC)',&QYEMIT
+            MOV @IP+,PC             ;
 ;-----------------------------------;
-;Z ECHO     --      connect terminal output (default)
-ECHO        MOV #48C2h,&QYEMIT      ; 48C2h = MOV.B Y,&<next_adr>
-            MOV @IP+,PC
 
 ;-----------------------------------;
-            FORTHWORD "NOECHO"
+            FORTHWORD "NOECHO"      ; --    disconnect ACCEPT and EMIT from TERMINAL input
+;-----------------------------------;
+NOECHO      MOV #4D30h,&QYEMIT      ;       MOV #'MOV @IP+,PC',&QYEMIT
+            MOV @IP+,PC             ;
 ;-----------------------------------;
-;Z NOECHO   --      disconnect terminal output
-NOECHO      MOV #4D30h,&QYEMIT      ;  NEXT = 4D30h = MOV @IP+,PC
-            MOV @IP+,PC
-