1 ; ------------------------------------------------
2 ; BASIC TOOLS for SD Card : DIR FAT SECTOR CLUSTER
3 ; ------------------------------------------------
6 \ MSP_EXP430FR5739 MSP_EXP430FR5969 MSP_EXP430FR5994 MSP_EXP430FR6989
7 \ MSP_EXP430FR4133 CHIPSTICK_FR2433 MSP_EXP430FR2433 MSP_EXP430FR2355
10 \ R4 to R7 must be saved before use and restored after
11 \ scratch registers Y to S are free for use
12 \ under interrupt, IP is free for use
14 \ PUSHM order : PSP,TOS, IP, S, T, W, X, Y, rEXIT,rDOVAR,rDOCON, rDODOES, R3, SR,RSP, PC
15 \ PUSHM order : R15,R14,R13,R12,R11,R10, R9, R8, R7 , R6 , R5 , R4 , R3, R2, R1, R0
17 \ example : PUSHM #6,IP pushes IP,S,T,W,X,Y registers to return stack
19 \ POPM order : PC,RSP, SR, R3, rDODOES,rDOCON,rDOVAR,rEXIT, Y, X, W, T, S, IP,TOS,PSP
20 \ POPM order : R0, R1, R2, R3, R4 , R5 , R6 , R7 , R8, R9,R10,R11,R12,R13,R14,R15
22 \ example : POPM #6,IP pop Y,X,W,T,S,IP registers from return stack
25 \ FORTH conditionnals: unary{ 0= 0< 0> }, binary{ = < > U< }
27 \ ASSEMBLER conditionnal usage with IF UNTIL WHILE S< S>= U< U>= 0= 0<> 0>=
29 \ ASSEMBLER conditionnal usage with ?JMP ?GOTO S< S>= U< U>= 0= 0<> <0
34 [DEFINED] {SD_TOOLS} [IF] {SD_TOOLS} [THEN] \ remove {SD_TOOLS} if outside core
36 [UNDEFINED] {SD_TOOLS} [IF] \
40 [UNDEFINED] MAX [IF] \ MAX and MIN are defined in {UTILITY}
42 CODE MAX \ n1 n2 -- n3 signed maximum
50 CODE MIN \ n1 n2 -- n3 signed minimum
60 [UNDEFINED] U.R [IF] \ defined in {UTILITY}
61 : U.R \ u n -- display u unsigned in n width (n >= 2)
63 R> OVER - 0 MAX SPACES TYPE
70 \ https://forth-standard.org/standard/core/AND
71 \ C AND x1 x2 -- x3 logical AND
80 [UNDEFINED] DUMP [IF] \ defined in {UTILITY}
81 : DUMP \ adr n -- dump memory
86 I 7 U.R SPACE \ generate address
87 I $10 + I \ display 16 bytes
90 I $10 + I \ display 16 chars
91 DO I C@ $7E MIN BL MAX EMIT LOOP
99 \ display content of a sector
100 \ ----------------------------------\
101 CODE SECTOR \ sector. -- don't forget to add decimal point to your sector number
102 \ ----------------------------------\
103 MOV TOS,X \ X = SectorH
104 MOV @PSP,W \ W = sectorL
105 CALL &ReadSectorWX \ W = SectorLO X = SectorHI
107 <# #S #> TYPE SPACE \ ud -- display the double number
108 SD_BUF $200 DUMP CR ; \ then dump the sector
109 \ ----------------------------------\
112 \ ----------------------------------\
113 CODE FAT \ Display CurFATsector
114 \ ----------------------------------\
117 MOV &OrgFAT1,0(PSP) \
118 MOV #0,TOS \ FATsectorHI = 0
119 JMP SECTOR \ jump to a defined word
121 \ ----------------------------------\
124 \ display first sector of a Cluster
125 \ ----------------------------------\
126 CODE CLUSTER \ cluster. -- don't forget to add decimal point to your cluster number
127 \ ----------------------------------\
128 MOV.B &SecPerClus,W \ SecPerClus(54321) = multiplicator
129 MOV @PSP,X \ X = ClusterL
131 U< IF \ case of SecPerClus>1
133 ADD X,X \ (RLA) shift one left MULTIPLICANDlo16
134 ADDC TOS,TOS \ (RLC) shift one left MULTIPLICANDhi8
135 RRA W \ shift one right multiplicator
136 U>= UNTIL \ carry set
138 ADD &OrgClusters,X \ add OrgClusters = sector of virtual cluster 0 (word size)
140 ADDC #0,TOS \ don't forget carry
141 JMP SECTOR \ jump to a defined word
143 \ ----------------------------------\
146 \ ----------------------------------\
147 CODE DIR \ Display CurrentDir first sector
148 \ ----------------------------------\
150 MOV TOS,2(PSP) \ save TOS
151 MOV &DIRclusterL,0(PSP) \
152 MOV &DIRclusterH,TOS \
155 \ ----------------------------------\
160 ; added : FAT to DUMP first sector of FAT1 and DIR for that of current DIRectory.
161 ; added : SECTOR to DUMP a sector and CLUSTER for first sector of a cluster:
162 ; include a decimal point to force 32 bits number, example : .2 CLUSTER