OSDN Git Service

V300 beautified
[fast-forth/master.git] / forthMSP430FR_ASM.asm
index f96051a..e0f35a3 100644 (file)
 
 ; example : POPM #6,IP   pop Y,X,W,T,S,IP registers from return stack
 
-; ----------------------------------------------------------------------
-; DTCforthMSP430FR5xxx ASSEMBLER : STRUCTURE
-; ----------------------------------------------------------------------
-
-;X  ASSEMBLER       --              ; set ASSEMBLER the first context vocabulary
-    .IFDEF VOCABULARY_SET
-            FORTHWORD "ASSEMBLER"
-    .ENDIF ; VOCABULARY_SET
-ASSEMBLER       mDODOES             ; leave BODYASSEMBLER on the stack and run VOCDOES
-                .word   VOCDOES
-BODYASSEMBLER   .word   lastasmword ; here is the structure created by VOCABULARY
-    .SWITCH THREADS
-    .CASE   2
-                .word   lastasmword1
-    .CASE   4
-                .word   lastasmword1
-                .word   lastasmword2
-                .word   lastasmword3
-    .CASE   8
-                .word   lastasmword1
-                .word   lastasmword2
-                .word   lastasmword3
-                .word   lastasmword4
-                .word   lastasmword5
-                .word   lastasmword6
-                .word   lastasmword7
-    .CASE   16
-                .word   lastasmword1
-                .word   lastasmword2
-                .word   lastasmword3
-                .word   lastasmword4
-                .word   lastasmword5
-                .word   lastasmword6
-                .word   lastasmword7
-                .word   lastasmword8
-                .word   lastasmword9
-                .word   lastasmword10
-                .word   lastasmword11
-                .word   lastasmword12
-                .word   lastasmword13
-                .word   lastasmword14
-                .word   lastasmword15
-    .CASE   32
-                .word   lastasmword1
-                .word   lastasmword2
-                .word   lastasmword3
-                .word   lastasmword4
-                .word   lastasmword5
-                .word   lastasmword6
-                .word   lastasmword7
-                .word   lastasmword8
-                .word   lastasmword9
-                .word   lastasmword10
-                .word   lastasmword11
-                .word   lastasmword12
-                .word   lastasmword13
-                .word   lastasmword14
-                .word   lastasmword15
-                .word   lastasmword16
-                .word   lastasmword17
-                .word   lastasmword18
-                .word   lastasmword19
-                .word   lastasmword20
-                .word   lastasmword21
-                .word   lastasmword22
-                .word   lastasmword23
-                .word   lastasmword24
-                .word   lastasmword25
-                .word   lastasmword26
-                .word   lastasmword27
-                .word   lastasmword28
-                .word   lastasmword29
-                .word   lastasmword30
-                .word   lastasmword31
-    .ELSECASE
-    .ENDCASE
-                .word   voclink
-voclink         .set    $-2
-
-             FORTHWORDIMM "HI2LO"   ; immediate, switch to low level, add ASSEMBLER context, set interpretation state
-            mDOCOL
-HI2LO       .word   HERE,CELLPLUS,COMMA
-            .word   LEFTBRACKET
-HI2LONEXT   .word   ALSO,ASSEMBLER
-            .word   EXIT
-
-;             FORTHWORDIMM "SEMIC"   ; same as HI2LO, plus restore IP; counterpart of COLON
-;            mDOCOL
-;            .word   HI2LO
-;            .word   LIT,413Dh,COMMA ; compile MOV @RSP+,IP
-;            .word   EXIT
-
-           FORTHWORD "CODE"     ; a CODE word must be finished with ENDCODE
-ASMCODE     CALL #HEADER        ;
-            SUB #4,&DDP         ;
-ASMCODE1    mDOCOL
-            .word   SAVE_PSP
-            .word   BRAN,HI2LONEXT
-
-
-            asmword "ENDCODE"   ; restore previous context and test PSP balancing
-ENDCODE     mDOCOL
-            .word   PREVIOUS,QREVEAL
-            .word   EXIT
-
-            FORTHWORD "ASM"     ; used to define an assembler word which is not executable by FORTH interpreter
-                                ; i.e. typically an assembler word called by CALL and ended by RET
-                                ; ASM words are only usable in another ASSEMBLER words
-                                ; an ASM word must be finished with ENDASM
-            MOV     &CURRENT,&SAV_CURRENT
-            MOV     #BODYASSEMBLER,&CURRENT
-            JMP     ASMCODE
-
-            asmword "ENDASM"    ; end of an ASM word
-            MOV     &SAV_CURRENT,&CURRENT
-            JMP     ENDCODE
-
-
-            asmword "COLON"     ; compile DOCOL, remove ASSEMBLER from CONTEXT, switch to compilation state
-            MOV &DDP,W
-
-    .SWITCH DTC
-    .CASE 1
-            MOV #DOCOL1,0(W)    ; compile CALL xDOCOL
-            ADD #2,&DDP
-
-    .CASE 2
-            MOV #DOCOL1,0(W)    ; compile PUSH IP
-COLON1      MOV #DOCOL2,2(W)    ; compile CALL rEXIT
-            ADD #4,&DDP
-
-    .CASE 3 ; inlined DOCOL
-            MOV #DOCOL1,0(W)    ; compile PUSH IP
-COLON1      MOV #DOCOL2,2(W)    ; compile MOV PC,IP
-            MOV #DOCOL3,4(W)    ; compile ADD #4,IP
-            MOV #NEXT,6(W)      ; compile MOV @IP+,PC
-            ADD #8,&DDP         ;
-    .ENDCASE ; DTC
-
-COLON2      MOV #-1,&STATE      ; enter in compile state
-            MOV #PREVIOUS,PC    ; restore previous state of CONTEXT
-
-
-            asmword "LO2HI"     ; same as COLON but without saving IP
-    .SWITCH DTC
-    .CASE 1                     ; compile 2 words
-            MOV &DDP,W
-            MOV #12B0h,0(W)     ; compile CALL #EXIT, 2 words  4+6=10~
-            MOV #EXIT,2(W)
-            ADD #4,&DDP
-            JMP COLON2
-    .ELSECASE                   ; CASE 2 : compile 1 word, CASE 3 : compile 3 words
-            SUB #2,&DDP         ; to skip PUSH IP
-            MOV &DDP,W
-            JMP COLON1
-    .ENDCASE
-
-            .IFDEF NONAME
-
-            FORTHWORD "CODENNM"  ; CODENoNaMe is the assembly counterpart of :NONAME
-CODENNM     mDOCOL
-            .word COLONNONAME,LEFTBRACKET
-            FORTHtoASM
-            MOV @RSP+,IP
-            SUB #4,W            ; to remove DEFER snippet
-            MOV W,&DDP
-            JMP ASMCODE1
-
-            .ENDIF ; NONAME
-
-
-
 ;;Z SKIP      char -- addr               ; skip all occurring character 'char' in input stream
 ;            FORTHWORD "SKIP"            ; used by assembler to parse input stream
 SKIP:       MOV     #SOURCE_LEN,Y       ;
@@ -236,18 +64,20 @@ SKIPEND:    MOV     W,TOS               ; -- addr
 ; DTCforthMSP430FR5xxx ASSEMBLER : search argument "xxxx", IP is free
 ; ----------------------------------------------------------------------
 
+SearchARG                               ; separator -- n|d or abort" not found"
+; ----------------------------------------------------------------------
 ; Search ARG of "#xxxx,"                ; <== PARAM10
 ; Search ARG of "&xxxx,"                ; <== PARAM111
 ; Search ARG of "xxxx(REG),"            ; <== PARAM130
 ; Search ARG of ",&xxxx"                ; <== PARAM111 <== PARAM20
 ; Search ARG of ",xxxx(REG)"            ; <== PARAM210
-SearchARG   PUSHM #2,S                ;                   PUSHM S,T
+            PUSHM #2,S                  ;                   PUSHM S,T
             ASMtoFORTH                  ; -- separator      search word first
             .word   WORDD,FIND          ; -- c-addr
-            .word   QZBRAN,SearchARGW   ; -- c-addr         if found
+            .word   QTBRAN,SearchARGW   ; -- c-addr         if found
             .word   QNUMBER             ;
-            .word   QBRAN,NotFound      ; -- c-addr         ABORT
-            .word   SearchEnd           ; -- value          goto end if number found
+            .word   QFBRAN,NotFound     ; -- c-addr         ABORT if not found
+FsearchEnd  .word   SearchEnd           ; -- value          goto end if number found
 SearchARGW  FORTHtoASM                  ; -- xt             xt = CFA
             MOV     @TOS,X
 QDOVAR      CMP     #DOVAR,X
@@ -290,7 +120,7 @@ SearchREG   PUSHM #2,S          ;               PUSHM S,T
             ADD #1,&TOIN        ;               skip "R"
             ASMtoFORTH          ;               search xx of Rxx
             .word WORDD,QNUMBER ;
-            .word QBRAN,NOTaREG ; -- xxxx       if Not a Number
+            .word QFBRAN,NOTaREG; -- xxxx       if Not a Number
             FORTHtoASM          ; -- c-addr     number is found
             ADD #2,RSP          ;               remove >IN
             CMP #16,TOS         ; -- 000R       register > 15 ?
@@ -313,11 +143,11 @@ PARAM1      mDOCOL                          ; -- sep
             .word   FBLANK,SKIP             ; -- sep c-addr
             FORTHtoASM                      ; -- sep c-addr
             MOV     #0,S                    ; -- sep c-addr        reset ASMTYPE
-            MOV     &DDP,T                  ; -- sep c-addr        HERE --> OPCODEADR (opcode is preset to its address !)
+            MOV     &DDP,T                  ; -- sep c-addr        T=OPCODEADR (opcode is preset to its address !)
             ADD     #2,&DDP                 ; -- sep c-addr        cell allot for opcode
-            MOV     TOS,W                   ; -- sep c-addr        W=c-addr
+            MOV.B   @TOS,W                  ; -- sep c-addr        W=first char of instruction code
             MOV     @PSP+,TOS               ; -- sep               W=c-addr
-            CMP.B   #'#',0(W)               ; -- sep               W=c-addr
+            CMP.B   #'#',W                  ; -- sep               W=first char
             JNE     PARAM11
 
 ; "#" found : case of "#xxxx,"
@@ -363,13 +193,14 @@ PARAM10M1   CMP #-1,TOS                     ; -- xxxx       = -1 ?
 ; case of all others "#xxxx,"               ; -- xxxx
 PARAM1000   MOV #0030h,S                    ; -- xxxx       add immediate code type : @PC+,
 
+; case of all others "#xxxx,"               ; -- xxxx
 ; case of "&xxxx,"                          ; <== PARAM110
 ; case of ",&xxxx"                          ; <== PARAM20
-StoreArg    MOV &DDP,X                      ; -- xxxx
+StoreArg    MOV &DDP,X                      ; -- xxxx       don't use T=OPCODEADR
             ADD #2,&DDP                     ;               cell allot for arg
 
 StoreTOS                                    ; <== TYPE1DOES
-   MOV TOS,0(X)                             ;               compile arg
+            MOV TOS,0(X)                    ;               compile arg
 ; endcase of all "&xxxx"                    ;
 ; endcase of all "#xxxx"                    ; <== PARAM101,102,104,108,10M1
 ; endcase of all "REG"|"@REG"|"@REG+"       ; <== PARAM124
@@ -378,7 +209,7 @@ PARAMENDOF  MOV @PSP+,TOS                   ; --
             mNEXT                           ; --
 ; ------------------------------------------
 
-PARAM11     CMP.B   #'&',0(W)               ; -- sep
+PARAM11     CMP.B   #'&',W                  ; -- sep
             JNE     PARAM12
 
 ; case of "&xxxx,"                          ; -- sep        search for "&xxxx,"
@@ -391,7 +222,7 @@ PARAM111    ADD     #1,&TOIN                ; -- sep        skip "&" prefix
             JMP     StoreArg                ; --            then ret
 ; ------------------------------------------
 
-PARAM12     CMP.B   #'@',0(W)               ; -- sep
+PARAM12     CMP.B   #'@',W                  ; -- sep
             JNE     PARAM13
 
 ; case of "@REG,"|"@REG+,"
@@ -422,13 +253,10 @@ PARAM123    SWPB    TOS                     ; 000R -- 0R00  swap bytes because i
 ; case of "xxxx(REG),"                      ; -- 0R00                   (src REG typeI or dst REG typeII)
 ; case of "@REG,"                           ; -- 0R00                   (src REG typeI)
 ; case of "REG,"                            ; -- 0R00                   (src REG typeI or dst REG typeII)
-
-
-
 ; case of ",REG"                            ; -- 000R   <== PARAM21     (dst REG typeI)
 ; case of ",xxxx(REG)"                      ; -- 000R   <== PARAM210    (dst REG typeI)
 PARAM124    ADD     TOS,S                   ; -- 0R00|000R
-            JMP     PARAMENDOF
+            JMP     PARAMENDOF              ;
 ; ------------------------------------------
 
 ; case of "REG,"|"xxxx(REG),"               ;               first, searg REG of "REG,"
@@ -444,6 +272,11 @@ PARAM130    ADD     #0010h,S         ;               AS=0b01 for indexing addres
 ; DTCforthMSP430FR5xxx ASSEMBLER : INTERPRET 2th OPERAND
 ; ----------------------------------------------------------------------
 
+INITPARAM2                                  ; for OPCODES TYPE III
+            MOV     #0,S                    ;                       init ASMTYPE=0
+            MOV     &DDP,T                  ;                       T=OPCODEADR
+            ADD     #2,&DDP                 ;                       make room for opcode
+
 ; PARAM2     --                             ; parse input buffer until BL and compute this 2th operand
 PARAM2      mDOCOL                          ;
             .word   FBLANK,SKIP             ;               skip space(s) between "arg1," and "arg2" if any; use not S,T.
@@ -504,7 +337,7 @@ TYPE1DOES                                   ; -- PFADOES
             FORTHtoASM                      ; -- PFADOES
 MAKEOPCODE  MOV     @TOS,TOS                ; -- opcode             part of instruction
             BIS     S,TOS                   ; -- opcode             opcode is complete
-            MOV     T,X                     ; -- opcode             X= OPCODEADR to compile opcode
+            MOV     T,X                     ; -- opcode             X=T= OPCODEADR to compile opcode
             JMP     StoreTOS                ;                       then EXIT
 
             asmword "MOV"
@@ -700,19 +533,12 @@ BOUNDERROR                                  ; <== REG number error
 TYPE3DOES                                   ; -- PFADOES
             .word   FBLANK,SKIP             ;                       skip spaces if any
             FORTHtoASM                      ; -- PFADOES c-addr
-            MOV     #0,S                    ;                       init ASMTYPE=0
-            MOV     &DDP,T                  ;                       init OPCODEADR=DP
-            ADD     #2,&DDP                 ;                       make room for opcode
             ADD     #1,&TOIN                ;                       skip "#"
             MOV     #',',TOS                ; -- PFADOES ","
-            PUSHM   #2,S                    ;               PUSHM S,T
             ASMtoFORTH
             .word   WORDD,QNUMBER
-            .word   QBRAN,NotFound          ;                       ABORT
-            FORTHtoASM
-            POPM  #2,S                    ;               POPM T,S
-            ASMtoFORTH
-            .word   PARAM2                  ; -- PFADOES 0x000N     S=ASMTYPE = 0x000R
+            .word   QFBRAN,NotFound         ;                       ABORT
+            .word   INITPARAM2              ; -- PFADOES 0x000N     S=ASMTYPE = 0x000R
             FORTHtoASM
             MOV     TOS,W                   ; -- PFADOES n          W = n
             MOV     @PSP+,TOS               ; -- PFADOES
@@ -724,16 +550,16 @@ TYPE3DOES                                   ; -- PFADOES
 PxxxINSTRU  MOV     S,Y                     ;                       S=REG, Y=REG to test
             RLAM    #3,X                    ;                       OPCODE bit 0200h --> C                  
             JNC     PUSHMINSTRU             ;                       W=n-1 Y=REG
-POPMINSTRU  SUB     W,S                     ;                       to make POPM opcode, keep first REG to POP; TI is complicated....
+POPMINSTRU  SUB     W,S                     ;                       to make POPM opcode, compute first REG to POP; TI is complicated....
 PUSHMINSTRU SUB     W,Y                     ;                       Y=REG-(n-1)
             CMP     #16,Y
             JHS     BOUNDERRWM1             ;                       JC=JHS    (U>=)
-            RLAM.W  #4,W                    ;                       W = n << 4      
+            RLAM    #4,W                    ;                       W = n << 4      
             JMP     BIS_ASMTYPE             ; PFADOES --            
 RxxMINSTRU  CMP     #4,W                    ;
             JHS     BOUNDERRWM1             ;                       JC=JHS    (U>=)
             SWPB    W                       ; -- PFADOES            W = n << 8
-            RLAM.W  #2,W                    ; RLAM #2,R10           W = N << 10
+            RLAM    #2,W                    ;                       W = N << 10
             JMP     BIS_ASMTYPE             ; PFADOES --
 
             asmword "RRCM"
@@ -776,7 +602,7 @@ RxxMINSTRU  CMP     #4,W                    ;
 CODE_JMP    mDOCON                      ; branch always
             .word   3C00h
 
-            asmword "S>="               ; if >= assertion
+            asmword "S>="               ; if >= assertion (opposite of jump if < )
             mDOCON
             .word   3800h
 
@@ -895,31 +721,30 @@ BACKWARDDOES        ;
     MOV @PSP+,TOS   ; 
     MOV @Y,W        ;               W = [ASMBWx]
     CMP #0,W        ;               W = 0 ?
-    MOV #0,0(Y)     ;               preset [ASMBWx] = 0 for next use
+    MOV #0,0(Y)     ;               clear [ASMBWx] for next use
 BACKWUSE            ; -- OPCODE
     JNZ ASM_UNTIL1
 BACKWSET            ; --
     MOV &DDP,0(Y)   ;               [ASMBWx] = DDP
     mNEXT
-;    JMP ASM_UNTIL1  ;               resolve backward branch with W
 
 ; backward label 1
             asmword "BW1"
             mdodoes
             .word BACKWARDDOES
-            .word ASMBW1
+            .word ASMBW1    ; in RAM
 
 ; backward label 2
             asmword "BW2"
             mdodoes
             .word BACKWARDDOES
-            .word ASMBW2
+            .word ASMBW2    ; in RAM
 
 ; backward label 3
             asmword "BW3"
             mdodoes
             .word BACKWARDDOES
-            .word ASMBW3
+            .word ASMBW3    ; in RAM
 
 FORWARDDOES
     FORTHtoASM
@@ -927,36 +752,35 @@ FORWARDDOES
     MOV &DDP,W      ;
     MOV @TOS,TOS
     MOV @TOS,Y      ;               Y=[ASMFWx]
-    MOV #0,0(TOS)   ;               preset [ASMFWx] for next use
     CMP #0,Y        ;               ASMFWx = 0 ? (FWx is free?)
+    MOV #0,0(TOS)   ;               clear [ASMFWx] for next use
 FORWUSE             ; PFA -- @OPCODE
-    JNZ ASM_THEN1     ;               no
+    JNZ ASM_THEN1   ;               no
 FORWSET             ; OPCODE PFA -- 
     MOV @PSP+,0(W)  ; -- PFA        compile incomplete opcode
     ADD #2,&DDP     ;               increment DDP
     MOV W,0(TOS)    ;               store @OPCODE into ASMFWx
     MOV @PSP+,TOS   ;   --
     mNEXT
-;    JMP ASM_THEN1   ;               resolve forward branch with Y
 
 
 ; forward label 1
             asmword "FW1"
             mdodoes
             .word FORWARDDOES
-            .word ASMFW1
+            .word ASMFW1    ; in RAM
 
 ; forward label 2
             asmword "FW2"
             mdodoes
             .word FORWARDDOES
-            .word ASMFW2
+            .word ASMFW2    ; in RAM
 
 ; forward label 3
             asmword "FW3"
             mdodoes
             .word FORWARDDOES
-            .word ASMFW3
+            .word ASMFW3    ; in RAM
 
 
 ; invert FORTH conditionnal branch      FORTH_JMP_OPCODE -- LABEL_JMP_OPCODE
@@ -998,4 +822,3 @@ JUMP        mDOCOL
             .word   ASM_UNTIL,EXIT
 
 
-