1 \ -*- coding: utf-8 -*-
2 \ http://patorjk.com/software/taag/#p=display&f=Banner&t=Fast Forth
5 \ MSP_EXP430FR5739 MSP_EXP430FR5969 MSP_EXP430FR5994 MSP_EXP430FR6989
6 \ MSP_EXP430FR4133 MSP_EXP430FR2433 MSP_EXP430FR2355 CHIPSTICK_FR2433
7 \ MY_MSP430FR5738_1 MY_MSP430FR5738 MY_MSP430FR5948 MY_MSP430FR5948_1
10 \ Fast Forth For Texas Instrument MSP430FRxxxx FRAM devices
11 \ Copyright (C) <2015> <J.M. THOORENS>
13 \ This program is free software: you can redistribute it and/or modify
14 \ it under the terms of the GNU General Public License as published by
15 \ the Free Software Foundation, either version 3 of the License, or
16 \ (at your option) any later version.
18 \ This program is distributed in the hope that it will be useful,
19 \ but WITHOUT ANY WARRANTY; without even the implied warranty of
20 \ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
21 \ GNU General Public License for more details.
23 \ You should have received a copy of the GNU General Public License
24 \ along with this program. If not, see <http://www.gnu.org/licenses/>.
27 \ rDODOES to rEXIT must be saved before use and restored after
28 \ scratch registers Y to S are free for use
29 \ under interrupt, IP is free for use
31 \ PUSHM order : PSP,TOS, IP, S, T, W, X, Y, rEXIT, rDOVAR, rDOCON, rDODOES
32 \ example : PUSHM IP,Y
34 \ POPM order : rDODOES, rDOCON, rDOVAR, rEXIT, Y, X, W, T, S, IP,TOS,PSP
37 \ FORTH conditionnals: unary{ 0= 0< 0> }, binary{ = < > U< }
39 \ ASSEMBLER conditionnal usage with IF UNTIL WHILE S< S>= U< U>= 0= 0<> 0>=
41 \ ASSEMBLER conditionnal usage with ?JMP ?GOTO S< S>= U< U>= 0= 0<> 0<
46 CODE DSM/REM \ D1 / D2 --> DREM DQUOT
48 MOV @PSP+,W \ 2 W=DVRlo
49 MOV @PSP+,X \ 2 X=DVDhi
50 MOV @PSP,T \ 2 T=DVDlo
51 PUSHM #5,X \ 7 PUSHM DVDhi,DVRhi, M, P, Q
52 AND #-1,Y \ 1 Y=DVRhi < 0 ?
53 S< IF XOR #-1,W \ 1 W=INV(DVRlo)
54 XOR #-1,Y \ 1 Y=INV(DVRhi)
55 ADD #1,W \ 1 W=INV(DVRlo)+1
56 ADDC #0,Y \ 1 Y=INV(DVRhi)+C
58 AND #-1,X \ 1 X=DVDhi < 0 ?
59 S< IF XOR #-1,T \ 1 T=INV(DVDlo)
60 XOR #-1,X \ 1 X=INV(DVDhi)
61 ADD #1,T \ 1 T=INV(DVDlo)+1
62 ADDC #0,X \ 1 X=INV(DVDhi)+C
64 \ ------------------------------------------------------------------------
65 \ don't uncomment lines below, don't rub out, please !
66 \ ------------------------------------------------------------------------
67 \ UD/MOD DVDlo DVDhi DVRlo DVRhi -- REMlo REMhi QUOTlo QUOThi
68 \ ------------------------------------------------------------------------
69 \ MOV TOS,Y \ 1 Y=DVRhi
70 \ MOV @PSP+,W \ 2 W=DVRlo
71 \ MOV @PSP+,X \ 2 X=DVDhi
72 \ MOV @PSP,T \ 2 T=DVDlo
73 \ PUSHM #5,X \ 7 PUSHM DVDhi,DVRhi, M, P, Q
74 MOV #0,M \ 1 M=REMlo = 0
75 MOV #0,P \ 1 P=REMhi = 0
77 BW1 CMP Y,P \ 1 REMhi = DVRhi ?
78 0= IF CMP W,M \ 1 REMlo U< DVRlo ?
80 U>= IF SUB W,M \ 1 no: REMlo - DVRlo (carry is set)
81 SUBC Y,P \ 1 REMhi - DVRhi
83 BEGIN ADDC S,S \ 1 RLC quotLO
84 ADDC TOS,TOS \ 1 RLC quotHI
85 SUB #1,Q \ 1 Decrement loop counter
86 U>= WHILE \ 2 out of loop if count<0
88 ADDC X,X \ 1 RLC DVDhi
89 ADDC M,M \ 1 RLC REMlo
90 ADDC P,P \ 1 RLC REMhi
91 U< ?GOTO BW1 \ 2 19~ loop
92 SUB W,M \ 1 REMlo - DVRlo
93 SUBC Y,P \ 1 REMhi - DVRhi
98 POPM #5,X \ 7 X=DVDhi, Y=DVRhi, restore M, P, Q, as system regs
99 CMP #0,X \ 1 sign of Rem ?
100 S< IF XOR #-1,T \ 1 INV(REMlo)
101 XOR #-1,W \ 1 INV(REMhi)
102 ADD #1,T \ 1 INV(REMlo)+1
103 ADDC #0,W \ 1 INV(REMhi)+C
109 CMP #0,Y \ sign of Quot ?
110 S< IF XOR #-1,S \ 1 INV(QUOTlo)
111 XOR #-1,TOS \ 1 INV(QUOThi)
112 ADD #1,S \ 1 INV(QUOTlo)+1
113 ADDC #0,TOS \ 1 INV(QUOThi)+C
115 MOV S,0(PSP) \ 3 QUOTlo
121 [UNDEFINED] DROP [IF]
122 \ https://forth-standard.org/standard/core/DROP
123 \ DROP x -- drop top of stack
130 : UD. \ u -- display ud (unsigned)
131 <# #S #> TYPE $20 EMIT
134 \ https://forth-standard.org/standard/double/Dd
135 \ D. dlo dhi -- display d (signed)
137 MOV #U.,W \ U. + 10 = D.
145 .0 .0 UD/MOD D. D. ; inf 0 -->
146 .0 .1 UD/MOD D. D. ; 0 0 -->
147 .1 .0 UD/MOD D. D. ; inf dvd -->
148 .1 .1 UD/MOD D. D. ; 1 0 -->
149 .1 .2 UD/MOD D. D. ; 0 1 -->
150 .0 .2 UD/MOD D. D. ; 0 0 -->
151 .2 .0 UD/MOD D. D. ; inf dvd -->
152 .2 .1 UD/MOD D. D. ; 2 0 -->
153 .2 .2 UD/MOD D. D. ; 1 0 -->
154 .2 .3 UD/MOD D. D. ; 0 2 -->
155 .0 .3 UD/MOD D. D. ; 0 0 -->
156 .3 .0 UD/MOD D. D. ; inf dvd -->
157 .3 .1 UD/MOD D. D. ; 3 0 -->
158 .3 .2 UD/MOD D. D. ; 1 1 -->
159 .3 .3 UD/MOD D. D. ; 1 0 -->
160 .3 .4 UD/MOD D. D. ; 0 3 -->
161 .4 .1 UD/MOD D. D. ; 4 0 -->
164 .0 -.1 UD/MOD D. D. ; 0 0 -->
165 -.1 .0 UD/MOD D. D. ; inf dvd -->
166 -.1 .1 UD/MOD D. D. ; dvd 0 -->
167 -.1 -.1 UD/MOD D. D. ; 1 0 -->
168 -.1 -.2 UD/MOD D. D. ; 1 1 -->
169 -.1 -.3 UD/MOD D. D. ; 1 2 -->
170 -.2 .0 UD/MOD D. D. ; inf dvd -->
171 -.2 -.1 UD/MOD D. D. ; 0 dvd -->
172 -.2 -.2 UD/MOD D. D. ; 1 0 -->
173 -.2 -.3 UD/MOD D. D. ; 1 1 -->
174 -.2 -.4 UD/MOD D. D. ; 1 2 -->