OSDN Git Service

V300, la Der de Der
[fast-forth/master.git] / MSP430-FORTH / SD_TOOLS.f
index 146a242..c2bb40d 100644 (file)
-; ------------------------------------------------------------------------
-; BASIC TOOLS for SD Card : {DIR FAT SECTOR CLUSER} DUMP ; include UTILITY
-; ------------------------------------------------------------------------
+\ -*- coding: utf-8 -*-
 
-\ Fast Forth For Texas Instrument MSP430FRxxxx FRAM devices
-\ Copyright (C) <2017>  <J.M. THOORENS>
+; ---------------------------------------------------------------
+; SD_TOOLS.f : BASIC TOOLS for SD Card : DIR FAT SECTOR CLUSTER
+; ---------------------------------------------------------------
 \
-\ This program is free software: you can redistribute it and/or modify
-\ it under the terms of the GNU General Public License as published by
-\ the Free Software Foundation, either version 3 of the License, or
-\ (at your option) any later version.
+\ to see kernel options, download FastForthSpecs.f
+\ FastForth kernel options: MSP430ASSEMBLER, CONDCOMP, DOUBLE_INPUT, SD_CARD_LOADER
 \
-\ This program is distributed in the hope that it will be useful,
-\ but WITHOUT ANY WARRANTY; without even the implied warranty of
-\ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-\ GNU General Public License for more details.
+\ TARGET SELECTION
+\ MSP_EXP430FR5739  MSP_EXP430FR5969    MSP_EXP430FR5994    MSP_EXP430FR6989
+\ MSP_EXP430FR4133  CHIPSTICK_FR2433    MSP_EXP430FR2433    MSP_EXP430FR2355
 \
-\ You should have received a copy of the GNU General Public License
-\ along with this program.  If not, see <http://www.gnu.org/licenses/>.
-
 \ REGISTERS USAGE
 \ R4 to R7 must be saved before use and restored after
 \ scratch registers Y to S are free for use
 \ under interrupt, IP is free for use
-
-\ PUSHM order : PSP,TOS, IP,  S,  T,  W,  X,  Y, R7, R6, R5, R4
-\ example : PUSHM IP,Y
 \
-\ POPM  order :  R4, R5, R6, R7,  Y,  X,  W,  T,  S, IP,TOS,PSP
-\ example : POPM Y,IP
-
-\ ASSEMBLER conditionnal usage after IF UNTIL WHILE : S< S>= U< U>= 0= 0<> 0>=
-\ ASSEMBLER conditionnal usage before GOTO ?GOTO     : S< S>= U< U>= 0= 0<> <0 
-
-\ FORTH conditionnal usage after IF UNTIL WHILE : 0= 0< = < > U<
+\ PUSHM order : PSP,TOS, IP,  S,  T,  W,  X,  Y, rEXIT,rDOVAR,rDOCON, rDODOES, R3, SR,RSP, PC
+\ PUSHM order : R15,R14,R13,R12,R11,R10, R9, R8,  R7  ,  R6  ,  R5  ,   R4   , R3, R2, R1, R0
+\
+\ example : PUSHM #6,IP pushes IP,S,T,W,X,Y registers to return stack
+\
+\ POPM  order :  PC,RSP, SR, R3, rDODOES,rDOCON,rDOVAR,rEXIT,  Y,  X,  W,  T,  S, IP,TOS,PSP
+\ POPM  order :  R0, R1, R2, R3,   R4   ,  R5  ,  R6  ,  R7 , R8, R9,R10,R11,R12,R13,R14,R15
+\
+\ example : POPM #6,IP   pop Y,X,W,T,S,IP registers from return stack
+\
+\
+\ FORTH conditionnals:  unary{ 0= 0< 0> }, binary{ = < > U< }
+\
+\ ASSEMBLER conditionnal usage with IF UNTIL WHILE  S<  S>=  U<   U>=  0=  0<>  0>=
+\ ASSEMBLER conditionnal usage with ?JMP ?GOTO      S<  S>=  U<   U>=  0=  0<>  0<
 
+: DEFINED! ECHO 1 ABORT" already loaded!" ;
 
+[DEFINED] {SD_TOOLS} [IF] DEFINED!
 
+[ELSE]
 
-\ ECHO      ; if an error occurs, uncomment this line before new download to find it.
+PWR_STATE
 
-    \
+MARKER {SD_TOOLS}
 
-CODE ?          \ adr --            display the content of adr
-    MOV @TOS,TOS
-    MOV #U.,PC  \ goto U.
-ENDCODE
-    \
-
-CODE SP@        \ -- SP
-    SUB #2,PSP
-    MOV TOS,0(PSP)
-    MOV PSP,TOS
-    MOV @IP+,PC
-ENDCODE
-
-: .S                \ --            print <number> of cells and stack contents if not empty
-$3C EMIT           \ --            char "<"
-DEPTH .
-8 EMIT              \               backspace
-$3E EMIT SPACE     \               char ">"
-SP@  PSTACK OVER OVER U<    \
-IF  2 -
-    DO I @ U.
-    -2 +LOOP
-ELSE
-    DROP DROP
-THEN
-;
-    \
-
-: WORDS                             \ --            list all words in all dicts in CONTEXT.
-
-\ vvvvvvvv   may be skipped    vvvvvvvv
-BASE @                              \ -- BASE
-#10 BASE !
-CR ."    "
-INI_THREAD @ DUP
-1 = IF DROP ." monothread"
-    ELSE . ." threads"
-    THEN ."  vocabularies"
-BASE !                              \ --
-\ ^^^^^^^^   may be skipped    ^^^^^^^^
-
-CONTEXT                             \ -- CONTEXT
-BEGIN                               \                                       search dictionnary
-    DUP 
-    2 + SWAP                        \ -- CONTEXT+2 CONTEXT
-    @ ?DUP                          \ -- CONTEXT+2 (VOC_BODY VOC_BODY or 0)
-WHILE                               \ -- CONTEXT+2 VOC_BODY                  dictionnary found
-CR ."    "                          \
-\   MOVE all threads of VOC_BODY in PAD
-    DUP PAD INI_THREAD @ DUP +      \ -- CONTEXT+2 VOC_BODY  VOC_BODY PAD THREAD*2
-    MOVE                            \         char MOVE
-
-    BEGIN                           \ -- CONTEXT+2 VOC_BODY
-        0 DUP                       \ -- CONTEXT+2 VOC_BODY ptr MAX
-\   select the MAX of NFA in threads
-        INI_THREAD @ DUP + 0 DO     \         ptr = threads*2
-        DUP I PAD + @               \ -- CONTEXT+2 VOC_BODY ptr MAX MAX NFAx
-        U< IF 
-            DROP DROP I DUP PAD + @ \ -- CONTEXT+2 VOC_BODY ptr MAX          if MAX U< NFAx replace adr and MAX
-        THEN                        \ 
-        2 +LOOP                     \ -- CONTEXT+2 VOC_BODY ptr MAX
-        ?DUP                        \ -- CONTEXT+2 VOC_BODY ptr MAX          max NFA = 0 ? end of vocabulary ?
-    WHILE                           \ -- CONTEXT+2 VOC_BODY ptr MAX
-\   replace it by its LFA
-        DUP                         \ -- CONTEXT+2 VOC_BODY ptr MAX MAX
-        2 - @                       \ -- CONTEXT+2 VOC_BODY ptr MAX [LFA]
-        ROT                         \ -- CONTEXT+2 VOC_BODY MAX [LFA] ptr
-        PAD +                       \ -- CONTEXT+2 VOC_BODY MAX [LFA] thread
-        !                           \ -- CONTEXT+2 VOC_BODY MAX
-\   type it in 16 chars format
-                DUP                 \ -- CONTEXT+2 VOC_BODY MAX MAX
-            COUNT $7F AND TYPE      \ -- CONTEXT+2 VOC_BODY MAX
-                C@ $0F AND          \ -- 
-                $10 SWAP - SPACES   \ -- CONTEXT+2 VOC_BODY 
-\   search next MAX of NFA 
-    REPEAT
-                                    \ -- CONTEXT+2 VOC_BODY 0
-    DROP DROP                       \ -- CONTEXT+2
-    CR         
-\   repeat for each CONTEXT vocabulary
-
-REPEAT                              \ -- 0
-DROP                                \ --
-;
-    \
+[UNDEFINED] MAX [IF]    \ MAX and MIN are defined in {UTILITY}
 
 CODE MAX    \    n1 n2 -- n3       signed maximum
     CMP @PSP,TOS    \ n2-n1
@@ -133,7 +50,6 @@ CODE MAX    \    n1 n2 -- n3       signed maximum
 BW1 ADD #2,PSP
     MOV @IP+,PC
 ENDCODE
-    \
 
 CODE MIN    \    n1 n2 -- n3       signed minimum
     CMP @PSP,TOS     \ n2-n1
@@ -141,18 +57,38 @@ CODE MIN    \    n1 n2 -- n3       signed minimum
 FW1 MOV @PSP+,TOS
     MOV @IP+,PC
 ENDCODE
-    \
 
+[THEN]
+
+[UNDEFINED] U.R [IF]        \ defined in {UTILITY}
 : U.R                       \ u n --           display u unsigned in n width (n >= 2)
   >R  <# 0 # #S #>  
   R> OVER - 0 MAX SPACES TYPE
 ;
-    \
+[THEN]
 
-: DUMP                      \ adr n  --   dump memory
-  BASE @ >R $10 BASE !
-  SWAP $FFF0 AND SWAP
-  OVER + SWAP
+[UNDEFINED] AND [IF]
+
+\ https://forth-standard.org/standard/core/AND
+\ C AND    x1 x2 -- x3           logical AND
+CODE AND
+AND @PSP+,TOS
+MOV @IP+,PC
+ENDCODE
+
+[THEN]
+
+[UNDEFINED] DUMP [IF]       \ defined in {UTILITY}
+\ https://forth-standard.org/standard/tools/DUMP
+CODE DUMP                   \ adr n  --   dump memory
+PUSH IP
+PUSH &BASE                  \ save current base
+MOV #$10,&BASE              \ HEX base
+ADD @PSP,TOS                \ -- ORG END
+LO2HI
+  SWAP OVER OVER            \ -- END ORG END ORG 
+  U. U.                     \ -- END ORG        display org end 
+  $FFF0 AND                 \ -- END ORG_modulo_16
   DO  CR                    \ generate line
     I 7 U.R SPACE           \ generate address
       I $10 + I             \ display 16 bytes
@@ -161,75 +97,71 @@ ENDCODE
       I $10 + I             \ display 16 chars
       DO I C@ $7E MIN BL MAX EMIT LOOP
   $10 +LOOP
-  R> BASE !
+  R> BASE !                 \ restore current base
 ;
-    \
+[THEN]
 
 \ display content of a sector
 \ ----------------------------------\
-CODE SECT_D                         \ sector. --     don't forget to add decimal point to your sector number
+CODE SECTOR                         \ sector. --     don't forget to add decimal point to your sector number
 \ ----------------------------------\
     MOV     TOS,X                   \ X = SectorH
     MOV     @PSP,W                  \ W = sectorL
     CALL    &ReadSectorWX           \ W = SectorLO  X = SectorHI
 COLON                               \
-    UD.                             \ display the sector number
-    BUFFER $200 DUMP CR ;           \ then dump the sector
+    <# #S #> TYPE SPACE             \ ud --            display the double number
+    SD_BUF $200 DUMP CR ;           \ then dump the sector
 \ ----------------------------------\
-    \
 
 \ ----------------------------------\
-CODE FAT_D                          \ Display CurFATsector
+CODE FAT                            \ Display CurFATsector
 \ ----------------------------------\
     SUB     #4,PSP                  \
     MOV     TOS,2(PSP)              \
-    MOV     &CurFATsector,0(PSP)    \ FATsectorLO
-    ADD     &OrgFAT1,0(PSP)         \
+    MOV     &OrgFAT1,0(PSP)         \
     MOV     #0,TOS                  \ FATsectorHI = 0
-    JMP     SECT_D                  \ jump to a defined word
+    JMP     SECTOR                  \ jump to a defined word
 ENDCODE
 \ ----------------------------------\
-    \
 
 \ display first sector of a Cluster
 \ ----------------------------------\
-CODE CLUST_D                        \ cluster.  --        don't forget to add decimal point to your cluster number
+CODE CLUSTER                        \ cluster.  --        don't forget to add decimal point to your cluster number
 \ ----------------------------------\
-    MOV.B &SecPerClus,W             \ 3 SecPerClus(5-1) = multiplicator
-    MOV @PSP,X
-    RRA W                           \ 1
+    MOV.B &SecPerClus,W             \ SecPerClus(54321) = multiplicator
+    MOV @PSP,X                      \ X = ClusterL
+    RRA W                           \
     U< IF                           \ case of SecPerClus>1
         BEGIN
-            ADD X,X                 \ (RLA) shift one left MULTIPLICANDlo16
-            ADDC TOS,TOS            \ (RLC) shift one left MULTIPLICANDhi8
-            RRA W                   \ shift one right multiplicator
-        U>= UNTIL
+            ADD X,X                 \ (RLA) shift one left MULTIPLICANDlo16
+            ADDC TOS,TOS            \ (RLC) shift one left MULTIPLICANDhi8
+            RRA W                   \ shift one right multiplicator
+        U>= UNTIL                   \ carry set
     THEN                            \
     ADD     &OrgClusters,X          \ add OrgClusters = sector of virtual cluster 0 (word size)
     MOV     X,0(PSP)      
     ADDC    #0,TOS                  \ don't forget carry
-    JMP     SECT_D                  \ jump to a defined word
+    JMP     SECTOR                  \ jump to a defined word
 ENDCODE
 \ ----------------------------------\
-    \
 
 \ ----------------------------------\
-CODE DIR_D                          \ Display CurrentDir first sector
+CODE DIR                            \ Display CurrentDir first sector
 \ ----------------------------------\
     SUB     #4,PSP                  \
     MOV     TOS,2(PSP)              \           save TOS
     MOV     &DIRclusterL,0(PSP)     \
     MOV     &DIRclusterH,TOS        \
-    JMP     CLUST_D                 \
+    JMP     CLUSTER                 \
 ENDCODE
 \ ----------------------------------\
-    \
 
+
+RST_HERE
+
+[THEN]
 ECHO
-            ; added : UTILITY : ? SP@ .S WORDS MAX MIN U.R DUMP 
-            ; added : FAT_D to DUMP first sector of FAT1 and DIR_D for that of current DIRectory.
-            ; added : SECT_D to DUMP a sector and CLUST_D for first sector of a cluster
-            ;         include a decimal point to force 32 bits number, example : 2. CLUST_D
-    \
-PWR_HERE    ; to protect this app against a RESET, type: RST_HERE
+; added : FAT to DUMP first sector of FAT1 and DIR for that of current DIRectory.
+; added : SECTOR to DUMP a sector and CLUSTER for first sector of a cluster:
+;         include a decimal point to force 32 bits number, example : .2 CLUSTER