OSDN Git Service

V309
[fast-forth/master.git] / inc / ThingsInFirst.inc
1 ; ThingsInFirst.inc
2
3     .cpu MSP430X    ; define CPU
4
5 BIT0        .equ 1
6 BIT1        .equ 2
7 BIT2        .equ 4
8 BIT3        .equ 8
9 BIT4        .equ 16
10 BIT5        .equ 32
11 BIT6        .equ 64
12 BIT7        .equ 128
13 BIT8        .equ 256
14 BIT9        .equ 512
15 BIT10       .equ 1024
16 BIT11       .equ 2048
17 BIT12       .equ 4096
18 BIT13       .equ 8192
19 BIT14       .equ 16384
20 BIT15       .equ 32768
21
22 ; ----------------------------------------------
23 ; MACROS FOR assembly instructions
24 ; ----------------------------------------------
25 NOP         .macro      ; 1 word, 1 cycle
26             .word 4303h ; mov #0, r3
27             .endm
28
29 NOP2        .macro      ; 1 Word, 2 cycles
30             .word 3C00h ; jmp $+2
31             .endm
32
33 NOP3        .macro      ; 1 Word, 3 cycles
34             .word 4000h ; MOV PC,PC
35             .endm
36
37 ; SR(11:0) bits are saved by interrupts and restored by the instruction RETI
38 C           .equ 0001h
39 Z           .equ 0002h
40 N           .equ 0004h
41 GIE         .equ 0008h
42 CPUOFF      .equ 0010h ; CPU Off.                  1=turn_off_CPU
43 OSCOFF      .equ 0020h ; Oscillator Off.           1=turn_off_LFXT1CLK
44 SCG0        .equ 0040h ; System Clock Generator 0. 1=turn_off_DCO
45 SCG1        .equ 0080h ; System Clock Generator 1. 1=turn_off_SMCLK
46 V           .equ 0100h
47 UF9         .equ 0200h ; = SR(9) User Flag 9
48 UF10        .equ 0400h ; = SR(10) User Flag 10
49 UF11        .equ 0800h ; = SR(11) User Flag 11
50 ;----------------------------------------------------------------------------
51 LPM0        .equ CPUOFF
52 LPM1        .equ SCG0 + CPUOFF  ; for devices with FLL: LPM1 = LPM0 + FLL disabled
53 LPM2        .equ SCG1 + CPUOFF
54 LPM3        .equ SCG1 + SCG0 + CPUOFF
55 LPM4        .equ SCG1 + SCG0 + OSCOFF + CPUOFF
56
57 ;-------------------------------------------------------------------------------
58 ; DEFINING FORTH REGISTERS - DTC model
59 ;-------------------------------------------------------------------------------
60 RSP         .reg    R1      ; RSP = Return Stack Pointer (return stack)
61 ;                   R2      ; not to be used
62 ;                   R3      ; not to be used
63 ; DOxxx registers           ; must be saved before use and restored after use
64 rDOCOL      .reg    R4
65 rDODOES     .reg    r5      ; to restore: MOV #XDODOES,rDODOES
66 rDOCON      .reg    r6      ; to restore: MOV #XDOCON,rDOCON
67 rDOVAR      .reg    r7      ; to restore: MOV #R>,rDOVAR
68 ; rDOxxx alias
69 R           .reg    r4      ; rDOCOL alias
70 Q           .reg    r5      ; rDODOES alias
71 P           .reg    r6      ; rDOCON alias
72 M           .reg    R7      ; rDOVAR alias
73 ; Scratch registers
74 Y           .reg    R8
75 X           .reg    R9
76 W           .reg    R10
77 T           .reg    R11
78 S           .reg    R12
79 ; Forth virtual machine
80 IP          .reg    R13     ; interpretative pointer
81 TOS         .reg    R14     ; first PSP cell
82 PSP         .reg    R15     ; PSP = Parameters Stack Pointer (stack data)
83
84 ; ----------------------------------------------
85 ; EXECUTIVE WORDS FOR Direct-Threaded Code (DTC)
86 ; ----------------------------------------------
87 ;-------------------------------------------------------------------------------
88 ; very nice FAST FORTH feature:
89 ; as IP is always computed from the PC value, we can place low to high level
90 ; "ASMtoFORTH" or "mDOCOL" switches anywhere in a word, i.e. not only at its
91 ; beginning as ITC competitors.
92 ;-------------------------------------------------------------------------------
93 DOCOL       .equ 1284h              ; 1284h = CALL rDOCOL instruction
94 DODOES      .equ 1285h              ; 1285h = CALL rDODOES instruction
95 DOCON       .equ 1286h              ; 1286h = CALL rDOCON instruction
96 DOVAR       .equ 1287h              ; 1287h = CALL rDOVAR instruction
97
98
99
100     .SWITCH DTC
101
102     .CASE 1 ; DOCOL = CALL rDOCOL, [rDOCOL] = XDOCOL
103 mASM2FORTH  .MACRO                  ; compiled by LO2HI
104             CALL #EXIT              ; 10 cycles
105             .ENDM                   ; 2 words, 10 cycles
106                                     ; LO2HI + HI2LO = 3 words, 10 cycles.
107
108 mDOCOL      .MACRO                  ; compiled by : and by colon
109             CALL rDOCOL             ; 10 [rDOCOL] = XDOCOL
110             .ENDM                   ; 1 word, 14 cycles (CALL included) (ITC+4)
111                                     ; COLON + SEMI = 2 words, 20 cycles (ITC+2)
112     .CASE 2 ; DOCOL = PUSH IP + CALL rDOCOL, [rDOCOL] = EXIT
113 mASM2FORTH  .MACRO                  ; compiled by LO2HI
114             CALL rDOCOL             ; 10 [rDOCOL] = EXIT
115             .ENDM                   ; 1 word, 10 cycles.
116                                     ; LO2HI + HI2LO = 2 words, 10 cycles.
117
118 mDOCOL      .MACRO                  ; compiled by : and by COLON
119             PUSH IP                 ; 3
120             CALL rDOCOL             ; 10 [rDOCOL] = EXIT
121             .ENDM                   ; 2 words, 13 cycles (ITC+3)
122                                     ; COLON + SEMI = 3 words, 19 cycles (ITC+1)
123     .CASE 3 ; inlined DOCOL
124 mASM2FORTH  .MACRO                  ; compiled by LO2HI
125             MOV PC,IP               ; 1
126             ADD #4,IP               ; 1
127             MOV @IP+,PC             ; 4 NEXT
128             .ENDM                   ; 6 cycles, 3 words
129                                     ; LO2HI + HI2LO = 4 words, 6 cycles.
130
131 mDOCOL      .MACRO                  ; compiled by : and by COLON
132             PUSH IP                 ; 3
133             MOV PC,IP               ; 1
134             ADD #4,IP               ; 1
135             MOV @IP+,PC             ; 4 NEXT
136             .ENDM                   ; 4 words, 9 cycles (ITC-1)
137                                     ; COLON + SEMI = 5 words, 15 cycles (ITC-3)
138     .ENDCASE ; DTC
139
140 mNEXTADR    .MACRO
141             .word   $+2
142             .ENDM
143
144     .save
145     .listing off
146 ; ----------------------------------------------
147 ; INIT VOCABULARY POINTERS and MACROS FOR HEADER
148 ; ----------------------------------------------
149 voclink     .set 0  ; init vocabulary links
150 forthlink   .set 0
151 asmlink     .set 0
152
153     .IF THREADS = 1
154
155 FORTHWORD   .MACRO  name
156             .word   forthlink
157 forthlink   .set    $
158             .byte   STRLEN(name)*2,name
159 ;            .align  2
160             .ENDM
161
162 FORTHWORDIMM .MACRO  name
163             .word   forthlink
164 forthlink   .set    $
165             .byte   STRLEN(name)*2+1,name ; bit 0 is the immediate flag
166 ;            .align  2
167             .ENDM
168
169 asmword     .MACRO  name
170             .word   asmlink
171 asmlink     .set    $
172             .byte   STRLEN(name)*2,name
173 ;            .align  2
174             .ENDM
175
176     .ELSE
177 forthlink1  .set 0
178 forthlink2  .set 0
179 forthlink3  .set 0
180 forthlink4  .set 0
181 forthlink5  .set 0
182 forthlink6  .set 0
183 forthlink7  .set 0
184 forthlink8  .set 0
185 forthlink9  .set 0
186 forthlink10 .set 0
187 forthlink11 .set 0
188 forthlink12 .set 0
189 forthlink13 .set 0
190 forthlink14 .set 0
191 forthlink15 .set 0
192 forthlink16 .set 0
193 forthlink17 .set 0
194 forthlink18 .set 0
195 forthlink19 .set 0
196 forthlink20 .set 0
197 forthlink21 .set 0
198 forthlink22 .set 0
199 forthlink23 .set 0
200 forthlink24 .set 0
201 forthlink25 .set 0
202 forthlink26 .set 0
203 forthlink27 .set 0
204 forthlink28 .set 0
205 forthlink29 .set 0
206 forthlink30 .set 0
207 forthlink31 .set 0
208
209 asmlink1    .set 0
210 asmlink2    .set 0
211 asmlink3    .set 0
212 asmlink4    .set 0
213 asmlink5    .set 0
214 asmlink6    .set 0
215 asmlink7    .set 0
216 asmlink8    .set 0
217 asmlink9    .set 0
218 asmlink10   .set 0
219 asmlink11   .set 0
220 asmlink12   .set 0
221 asmlink13   .set 0
222 asmlink14   .set 0
223 asmlink15   .set 0
224 asmlink16   .set 0
225 asmlink17   .set 0
226 asmlink18   .set 0
227 asmlink19   .set 0
228 asmlink20   .set 0
229 asmlink21   .set 0
230 asmlink22   .set 0
231 asmlink23   .set 0
232 asmlink24   .set 0
233 asmlink25   .set 0
234 asmlink26   .set 0
235 asmlink27   .set 0
236 asmlink28   .set 0
237 asmlink29   .set 0
238 asmlink30   .set 0
239 asmlink31   .set 0
240
241 ;-------------------------------------------
242 ; (THREADS-1)*2 = AND mask to define CURRENT offset in vocabulary
243 ;-------------------------------------------
244 FORTHWORD   .MACRO  name
245 CONTEXTofst .set    (charfromstr(name,0) & (THREADS-1))*2
246     .SWITCH CONTEXTofst
247     .case 0
248             .word   forthlink
249 forthlink   .set    $
250     .case 2
251             .word   forthlink1
252 forthlink1  .set    $
253     .case 4
254             .word   forthlink2
255 forthlink2  .set    $
256     .case 6
257             .word   forthlink3
258 forthlink3  .set    $
259     .case 8
260             .word   forthlink4
261 forthlink4  .set    $
262     .case 10
263             .word   forthlink5
264 forthlink5  .set    $
265     .case 12
266             .word   forthlink6
267 forthlink6  .set    $
268     .case 14
269             .word   forthlink7
270 forthlink7  .set    $
271     .case 16
272             .word   forthlink8
273 forthlink8  .set    $
274     .case 18
275             .word   forthlink9
276 forthlink9  .set    $
277     .case 20
278             .word   forthlink10
279 forthlink10 .set    $
280     .case 22
281             .word   forthlink11
282 forthlink11 .set    $
283     .case 24
284             .word   forthlink12
285 forthlink12 .set    $
286     .case 26
287             .word   forthlink13
288 forthlink13 .set    $
289     .case 28
290             .word   forthlink14
291 forthlink14 .set    $
292     .case 30
293             .word   forthlink15
294 forthlink15 .set    $
295     .case 32
296             .word   forthlink16
297 forthlink16 .set    $
298     .case 34
299             .word   forthlink17
300 forthlink17 .set    $
301     .case 36
302             .word   forthlink18
303 forthlink18 .set    $
304     .case 38
305             .word   forthlink19
306 forthlink19 .set    $
307     .case 40
308             .word   forthlink20
309 forthlink20 .set    $
310     .case 42
311             .word   forthlink21
312 forthlink21 .set    $
313     .case 44
314             .word   forthlink22
315 forthlink22 .set    $
316     .case 46
317             .word   forthlink23
318 forthlink23 .set    $
319     .case 48
320             .word   forthlink24
321 forthlink24 .set    $
322     .case 50
323             .word   forthlink25
324 forthlink25 .set    $
325     .case 52
326             .word   forthlink26
327 forthlink26 .set    $
328     .case 54
329             .word   forthlink27
330 forthlink27 .set    $
331     .case 56
332             .word   forthlink28
333 forthlink28 .set    $
334     .case 58
335             .word   forthlink29
336 forthlink29 .set    $
337     .case 60
338             .word   forthlink30
339 forthlink30 .set    $
340     .case 62
341             .word   forthlink31
342 forthlink31 .set    $
343     .endcase
344             .byte   STRLEN(name)*2,name
345             .ENDM
346
347 ;-------------------------------------------
348 ; (THREADS-1)*2 = AND mask to define CURRENT offset in vocabulary
349 ;-------------------------------------------
350 FORTHWORDIMM .MACRO  name
351 CONTEXTofst .set    (charfromstr(name,0) & (THREADS-1))*2
352     .SWITCH CONTEXTofst
353     .case 0
354             .word   forthlink
355 forthlink   .set    $
356     .case 2
357             .word   forthlink1
358 forthlink1  .set    $
359     .case 4
360             .word   forthlink2
361 forthlink2  .set    $
362     .case 6
363             .word   forthlink3
364 forthlink3  .set    $
365     .case 8
366             .word   forthlink4
367 forthlink4  .set    $
368     .case 10
369             .word   forthlink5
370 forthlink5  .set    $
371     .case 12
372             .word   forthlink6
373 forthlink6  .set    $
374     .case 14
375             .word   forthlink7
376 forthlink7  .set    $
377     .case 16
378             .word   forthlink8
379 forthlink8  .set    $
380     .case 18
381             .word   forthlink9
382 forthlink9  .set    $
383     .case 20
384             .word   forthlink10
385 forthlink10 .set    $
386     .case 22
387             .word   forthlink11
388 forthlink11 .set    $
389     .case 24
390             .word   forthlink12
391 forthlink12 .set    $
392     .case 26
393             .word   forthlink13
394 forthlink13 .set    $
395     .case 28
396             .word   forthlink14
397 forthlink14 .set    $
398     .case 30
399             .word   forthlink15
400 forthlink15 .set    $
401     .case 32
402             .word   forthlink16
403 forthlink16 .set    $
404     .case 34
405             .word   forthlink17
406 forthlink17 .set    $
407     .case 36
408             .word   forthlink18
409 forthlink18 .set    $
410     .case 38
411             .word   forthlink19
412 forthlink19 .set    $
413     .case 40
414             .word   forthlink20
415 forthlink20 .set    $
416     .case 42
417             .word   forthlink21
418 forthlink21 .set    $
419     .case 44
420             .word   forthlink22
421 forthlink22 .set    $
422     .case 46
423             .word   forthlink23
424 forthlink23 .set    $
425     .case 48
426             .word   forthlink24
427 forthlink24 .set    $
428     .case 50
429             .word   forthlink25
430 forthlink25 .set    $
431     .case 52
432             .word   forthlink26
433 forthlink26 .set    $
434     .case 54
435             .word   forthlink27
436 forthlink27 .set    $
437     .case 56
438             .word   forthlink28
439 forthlink28 .set    $
440     .case 58
441             .word   forthlink29
442 forthlink29 .set    $
443     .case 60
444             .word   forthlink30
445 forthlink30 .set    $
446     .case 62
447             .word   forthlink31
448 forthlink31 .set    $
449     .endcase
450             .byte   STRLEN(name)*2+1,name ; bit 0 is the immediate flag
451             .ENDM
452
453 ;-------------------------------------------
454 ; (THREADS-1)*2 = AND mask to define CURRENT offset in vocabulary
455 ;-------------------------------------------
456 asmword     .MACRO  name
457 CONTEXTofst .set    (charfromstr(name,0) & (THREADS-1))*2
458     .SWITCH CONTEXTofst
459     .case 0
460             .word   asmlink
461 asmlink   .set    $
462     .case 2
463             .word   asmlink1
464 asmlink1  .set    $
465     .case 4
466             .word   asmlink2
467 asmlink2  .set    $
468     .case 6
469             .word   asmlink3
470 asmlink3  .set    $
471     .case 8
472             .word   asmlink4
473 asmlink4  .set    $
474     .case 10
475             .word   asmlink5
476 asmlink5  .set    $
477     .case 12
478             .word   asmlink6
479 asmlink6  .set    $
480     .case 14
481             .word   asmlink7
482 asmlink7  .set    $
483     .case 16
484             .word   asmlink8
485 asmlink8  .set    $
486     .case 18
487             .word   asmlink9
488 asmlink9  .set    $
489     .case 20
490             .word   asmlink10
491 asmlink10 .set    $
492     .case 22
493             .word   asmlink11
494 asmlink11 .set    $
495     .case 24
496             .word   asmlink12
497 asmlink12 .set    $
498     .case 26
499             .word   asmlink13
500 asmlink13 .set    $
501     .case 28
502             .word   asmlink14
503 asmlink14 .set    $
504     .case 30
505             .word   asmlink15
506 asmlink15 .set    $
507     .case 32
508             .word   asmlink16
509 asmlink16 .set    $
510     .case 34
511             .word   asmlink17
512 asmlink17 .set    $
513     .case 36
514             .word   asmlink18
515 asmlink18 .set    $
516     .case 38
517             .word   asmlink19
518 asmlink19 .set    $
519     .case 40
520             .word   asmlink20
521 asmlink20 .set    $
522     .case 42
523             .word   asmlink21
524 asmlink21 .set    $
525     .case 44
526             .word   asmlink22
527 asmlink22 .set    $
528     .case 46
529             .word   asmlink23
530 asmlink23 .set    $
531     .case 48
532             .word   asmlink24
533 asmlink24 .set    $
534     .case 50
535             .word   asmlink25
536 asmlink25 .set    $
537     .case 52
538             .word   asmlink26
539 asmlink26 .set    $
540     .case 54
541             .word   asmlink27
542 asmlink27 .set    $
543     .case 56
544             .word   asmlink28
545 asmlink28 .set    $
546     .case 58
547             .word   asmlink29
548 asmlink29 .set    $
549     .case 60
550             .word   asmlink30
551 asmlink30 .set    $
552     .case 62
553             .word   asmlink31
554 asmlink31 .set    $
555     .endcase ; asmlink
556             .byte   STRLEN(name)*2,name
557             .ENDM
558
559     .endif ; thread case
560
561 ; -------------------------------------
562 ; define MAIN max bound
563 ; -------------------------------------
564 FRAM_FULL   .equ SIGNATURES-40h ; set to protect JTAG and BSL signatures against overwrite.
565                                 ; 64 bytes are sufficient considering what can be compiled in one line + WORD use.
566                                 ; take care with ALLOT : don't ALLOT more than 32 words by line!
567     .restore
568 ; --------------------------
569 ; COMPUTE ASSEMBLY SWITCHES
570 ; --------------------------
571     .IFDEF CORE_COMPLEMENT
572         .IFNDEF USE_MOVE
573 USE_MOVE
574         .ENDIF
575     .ENDIF
576     .IFDEF UTILITY
577         .IFNDEF USE_MOVE
578 USE_MOVE
579         .ENDIF
580     .ENDIF
581     .IFDEF SD_CARD_LOADER
582         .IFNDEF DOUBLE_INPUT
583 DOUBLE_INPUT
584         .ENDIF
585         .IFDEF BOOTLOADER
586             .IFNDEF CONDCOMP
587 CONDCOMP                    ; mandatory for Bootstrap
588             .ENDIF
589         .ENDIF
590     .ENDIF
591     .IFDEF EXTENDED_ASM
592         .IFNDEF DOUBLE_INPUT
593 DOUBLE_INPUT
594         .ENDIF
595     .ELSE
596         .IFDEF EXTENDED_MEM
597             .IFNDEF MSP430ASSEMBLER
598 MSP430ASSEMBLER
599             .ENDIF
600             .IFNDEF DOUBLE_INPUT
601 DOUBLE_INPUT
602             .ENDIF
603         .ENDIF
604     .ENDIF
605     .IFDEF FIXPOINT
606         .IFNDEF FIXPOINT_INPUT
607 FIXPOINT_INPUT              ; to interpret fixpoint numbers
608         .ENDIF
609     .ENDIF
610     .IFDEF FIXPOINT_INPUT
611         .IFNDEF DOUBLE_NUMBERS
612 DOUBLE_NUMBERS              ; to process double numbers
613         .ENDIF
614     .ENDIF
615     .IFDEF DOUBLE_INPUT
616         .IFNDEF DOUBLE_NUMBERS
617 DOUBLE_NUMBERS              ; to process double numbers
618         .ENDIF
619     .ENDIF
620
621 ; --------------------------
622 ; COMPUTE BAUDRATE registers = fn(FREQUENCY,BAUDS)
623 ; --------------------------
624     .IFNDEF TERMINAL_I2C
625         .include "TERMINALBAUDRATE.inc"
626     .ENDIF
627 ;-----------------------------------------------------------------------
628 ; DEVICE I/O, MEMORY, SFR, vectors and minimum FORTH I/O declarations
629 ;-----------------------------------------------------------------------
630 FADDON .set 0
631
632     .IFDEF MSP_EXP430FR5739
633 FADDON .SET FADDON | BIT0   ; hardware MPY
634 LF_XTAL
635         .IFDEF TERMINAL_I2C
636 UCB0_TERM
637         .ELSE
638 UCA0_TERM
639         .ENDIF
640 UCA1_SD
641         .include "MSP430FR5739.inc"
642     .ENDIF
643     .IFDEF MSP_EXP430FR5969
644 FADDON .SET FADDON | BIT0   ; hardware MPY
645 ;EXTENDED_MEM
646 LF_XTAL
647         .IFDEF TERMINAL_I2C
648 UCB0_TERM
649         .ELSE
650 UCA0_TERM
651         .ENDIF
652 UCA1_SD
653         .include "MSP430FR5969.inc"
654     .ENDIF
655     .IFDEF MSP_EXP430FR5994
656 FADDON .SET FADDON | BIT0   ; hardware MPY
657 ;EXTENDED_MEM
658 LF_XTAL
659         .IFDEF TERMINAL_I2C
660 UCB2_TERM
661         .ELSE
662 UCA0_TERM
663         .ENDIF
664 UCB0_SD
665         .include "MSP430FR5994.inc"
666     .ENDIF
667     .IFDEF MSP_EXP430FR6989
668 FADDON .SET FADDON | BIT0   ; hardware MPY
669 ;EXTENDED_MEM
670 LF_XTAL
671         .IFDEF TERMINAL_I2C
672 UCB0_TERM
673         .ELSE
674 UCA1_TERM
675         .ENDIF
676 UCA0_SD
677         .INCLUDE "MSP430FR6989.inc"
678     .ENDIF
679     .IFDEF MSP_EXP430FR5972
680 FADDON .SET FADDON | BIT0   ; hardware MPY
681 ;EXTENDED_MEM
682 LF_XTAL
683         .IFDEF TERMINAL_I2C
684 UCB0_TERM
685         .ELSE
686 UCA1_TERM
687         .ENDIF
688 UCA0_SD
689         .INCLUDE "MSP430FR5972.inc"
690     .ENDIF
691     .IFDEF MSP_EXP430FR4133
692 FLL
693 LF_XTAL
694         .IFDEF TERMINAL_I2C
695 UCB0_TERM
696         .ELSE
697 UCA0_TERM
698 UCB0_SD
699         .ENDIF
700         .INCLUDE "MSP430FR4133.inc"
701     .ENDIF
702     .IFDEF MSP_EXP430FR2433
703 FLL
704 LF_XTAL
705         .IFDEF TERMINAL_I2C
706 UCB0_TERM
707         .ELSE
708 UCA0_TERM
709         .ENDIF
710 UCA1_SD
711         .include "MSP430FR2433.inc"
712     .ENDIF
713     .IFDEF CHIPSTICK_FR2433
714 FLL
715 ; no LF_XTAL to select ACLK = REFOCLK
716         .IFDEF TERMINAL_I2C
717 UCB0_TERM
718 UCA0_SD
719         .ELSE
720 UCA0_TERM
721 UCB0_SD
722         .ENDIF
723         .include "MSP430FR2433.inc"
724     .ENDIF
725     .IFDEF MSP_EXP430FR2355
726 FADDON .SET FADDON | BIT0   ; hardware MPY
727 FLL
728 LF_XTAL
729         .IFDEF TERMINAL_I2C
730 UCB0_TERM
731         .ELSE
732 UCA1_TERM
733         .ENDIF
734 UCB1_SD
735         .include "MSP430FR2355.inc"
736     .ENDIF
737     .IFDEF LP_MSP430FR2476
738 FADDON .SET FADDON | BIT0   ; hardware MPY
739 FLL
740 ;EXTENDED_MEM
741 ; LF_XTAL       ; connect resistors R2=0k, R3=0k before uncomment this line
742         .IFDEF TERMINAL_I2C
743 UCB1_TERM
744         .ELSE
745 UCA0_TERM
746         .ENDIF
747 UCA1_SD
748         .include "MSP430FR2476.inc"
749     .ENDIF
750     .IFDEF YOUR_TARGET
751 ; vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv
752 ; add here your device.inc item:
753 ;^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
754     .ENDIF
755     .restore
756 ; ---------------------------
757 ; compute value of FORTHADDON
758 ; ---------------------------
759     .IFDEF FLOORED_DIVISION
760 FADDON .SET FADDON | BIT15  ; FLOORED_DIVISION
761     .ENDIF
762     .IFDEF LF_XTAL
763 FADDON .SET FADDON | BIT14  ; LFXTAL = 32768 Hz
764     .ENDIF
765     .IFNDEF TERMINAL_I2C ; if TERMINAL UART...
766         .IFDEF TERMINAL5WIRES
767 FADDON .SET FADDON | BIT13  ; UART CTS
768         .ENDIF
769         .IFDEF TERMINAL4WIRES
770 FADDON .SET FADDON | BIT12  ; UART RTS
771         .ENDIF
772         .IFDEF TERMINAL3WIRES
773 FADDON .SET FADDON | BIT11  ; UART XON/XOFF
774         .ENDIF
775         .IFDEF HALFDUPLEX
776 FADDON .SET FADDON | BIT10  ; UART Half Duplex
777         .ENDIF
778     .ENDIF ; TERMINAL UART
779 ; ---------------------------
780         .IFDEF TERMINAL_I2C
781 FADDON .SET FADDON | BIT9   ;I2C TERMINAL
782         .ENDIF
783     .IFDEF FIXPOINT_INPUT
784 FADDON .SET FADDON | BIT8   ; Q15.16 INPUT
785     .ENDIF
786     .IFDEF DOUBLE_INPUT
787 FADDON .SET FADDON | BIT7   ; DOUBLE INPUT
788     .ENDIF
789 ; ---------------------------
790     .IFDEF EXTENDED_ASM     ; Assembler 20 bits
791 FADDON .SET FADDON | BIT6
792     .ENDIF
793 ;    .IFDEF MSP430ASSEMBLER
794 FADDON .SET FADDON | BIT5   ; Assembler 16 bits
795 ;    .ENDIF
796     .IFDEF EXTENDED_MEM
797         .IFNDEF EXTENDED_ASM
798 FADDON .SET FADDON | BIT4   ; Assembler 16 bits with Address access beyond $FFFF
799         .ENDIF
800     .ENDIF
801 ; ---------------------------
802 ;    .IFDEF VOCABULARY_SET   ;
803 ;FADDON .SET FADDON | BIT3   ; vocabulary set
804 ;    .ENDIF                  ; BIT2 to BIT0 are free
805
806
807
808 ;-------------------------------------------------------------------------------
809 ; DTCforthMSP430FR5xxx RAM memory map:
810 ;-------------------------------------------------------------------------------
811
812 ;---------------------------;---------
813 ; name             words    ; comment
814 ;---------------------------;---------
815 ;LSTACK = L0 = LEAVEPTR     ; ----- RAM_ORG
816                             ; |
817 LSTACK_LEN .equ     16      ; | grows up
818                             ; V
819                             ; ^
820 PSTACK_LEN .equ     48      ; | grows down
821                             ; |
822 ;PSTACK=S0                  ; ----- RAM_ORG + $80
823                             ; ^
824 RSTACK_LEN .equ     48      ; | grows down
825                             ; |
826 ;RSTACK=R0                  ; ----- RAM_ORG + $E0
827
828 ;---------------------------;---------
829 ; names            bytes    ; comments
830 ;---------------------------;---------
831 ; PAD_I2CADR                ; ----- RAM_ORG + $E0
832 ; PAD_I2CCNT                ;
833 ; PAD                       < ----- RAM_ORG + $E4
834                             ; |
835 PAD_LEN     .equ    84      ; | grows up    (ans spec. : PAD >= 84 chars)
836                             ; v
837 ; TIB_I2CADR                ; ----- RAM_ORG + $138
838 ; TIB_I2CCNT                ;
839 ; TIB                       < ----- RAM_ORG + $13C
840                             ; |
841 CIB_LEN     .equ    84      ; | grows up    Current Input Buffer (ans spec. : TIB >= 80 chars)
842                             ; v
843 ; HOLDS_ORG                 < ------RAM_ORG + $190
844                             ; ^
845 HOLD_LEN   .equ     34      ; | grows down  (ans spec. : HOLD_LEN >= (2*n) + 2 char, with n = 16 bits/cell
846                             ; |
847 ; HOLD_BASE                 < ----- RAM_ORG + $1B2
848                             ;
849                             ;       system variables
850                             ;
851                             ; ----- RAM_ORG + $1E0
852                             ;
853                             ;       28 bytes free
854                             ;
855 ; SD_BUF_I2CADR             < ----- RAM_ORG + $1FC
856 ; SD_BUF_I2CCNT             ;
857 ; SD_BUF                    < ----- RAM_ORG + $200
858                             ;
859 SD_BUF_LEN   .equ   200h    ;       512 bytes buffer
860                             ;
861 ; SD_BUF_END                < ----- RAM_ORG + $400
862
863 LSTACK          .equ RAM_ORG
864 LEAVEPTR        .equ LSTACK             ; Leave-stack pointer
865 PSTACK          .equ LSTACK+(LSTACK_LEN*2)+(PSTACK_LEN*2)
866 RSTACK          .equ PSTACK+(RSTACK_LEN*2)
867 PAD_I2CADR      .equ PAD_ORG-4
868 PAD_I2CCNT      .equ PAD_ORG-2
869 PAD_ORG         .equ RSTACK+4
870 TIB_I2CADR      .equ TIB_ORG-4
871 TIB_I2CCNT      .equ TIB_ORG-2
872 TIB_ORG         .equ PAD_ORG+PAD_LEN+4
873 HOLDS_ORG       .equ TIB_ORG+CIB_LEN
874
875 HOLD_BASE       .equ HOLDS_ORG+HOLD_LEN
876
877 ; ----------------------------------------------------
878 ; RAM_ORG + $1B2 : RAM VARIABLES
879 ; ----------------------------------------------------
880 HP              .equ HOLD_BASE      ; HOLD ptr
881 ; ----------------------------------------------------
882 ; new definition pointers, generated by HEADER
883 ; ----------------------------------------------------
884 LAST_NFA        .equ HOLD_BASE+2    ; used by REVEAL, IMMEDIATE
885 LAST_THREAD     .equ HOLD_BASE+4    ;    "    REVEAL
886 LAST_CFA        .equ HOLD_BASE+6    ;    "    DOES>, RECURSE
887 LAST_PSP        .equ HOLD_BASE+8    ;    "    REVEAL
888 ; ----------------------------------------------------
889 ; FORTH interpreter variables
890 ; ----------------------------------------------------
891 STATE           .equ HOLD_BASE+10   ; Interpreter state
892 BASEADR         .equ HOLD_BASE+12   ; BASE
893 CAPS            .equ HOLD_BASE+14   ; CAPS
894 ; ----------------------------------------------------
895 SOURCE          .equ HOLD_BASE+16   ; len, org of input stream
896 SOURCE_LEN      .equ HOLD_BASE+16   ;
897 SOURCE_ORG      .equ HOLD_BASE+18   ;
898 TOIN            .equ HOLD_BASE+20   ; CurrentInputBuffer pointer
899 ; ----------------------------------------------------
900 ; FORTH environment
901 ; ----------------------------------------------------
902 DP              .equ HOLD_BASE+22   ; dictionnary pointer
903 LASTVOC         .equ HOLD_BASE+24   ;
904 CURRENT         .equ HOLD_BASE+26   ;
905 CONTEXT         .equ HOLD_BASE+28   ; 8 words of depth ending
906 NULL_WORD       .equ HOLD_BASE+44   ; with a null word in addition
907 ; ----------------------------------;
908
909     .IFDEF SD_CARD_LOADER
910 ; --------------------------------------------------
911 ; RAM_ORG + $1FC : RAM SD_CARD SD_BUF 4 + 512 bytes
912 ; --------------------------------------------------
913 SD_BUF_I2CADR   .equ SD_BUF-4
914 SD_BUF_I2CCNT   .equ SD_BUF-2
915 SD_BUF          .equ HOLD_BASE+78
916 SD_BUF_END      .equ SD_BUF+200h        ; 512bytes
917 ; --------------------------------------------------
918 ; RAM_ORG + $400 : free RAM
919 ; --------------------------------------------------
920     .ENDIF
921
922     .IFDEF SD_CARD_LOADER
923 ; ---------------------------------------
924 ; VARIABLES that should be in RAM
925 ; ---------------------------------------
926         .IF RAM_LEN < 2048              ; if RAM < 2K (FR57xx) the variables below are in INFO space (FRAM)
927 SD_ORG     .equ INFO_ORG+5Ah            ;
928         .ELSE                           ; if RAM >= 2k the variables below are in RAM
929 SD_ORG     .equ SD_BUF_END+2            ; 1 word guard
930         .ENDIF
931
932     .org SD_ORG
933 ; ---------------------------------------
934 ; FAT FileSystemInfos
935 ; ---------------------------------------
936 ;FATtype         .equ SD_ORG+0
937 BS_FirstSectorL .equ SD_ORG+2           ; init by SD_Init, used by RW_Sector_CMD
938 BS_FirstSectorH .equ SD_ORG+4           ; init by SD_Init, used by RW_Sector_CMD
939 OrgFAT1         .equ SD_ORG+6           ; init by SD_Init,
940 FATSize         .equ SD_ORG+8           ; init by SD_Init,
941 OrgFAT2         .equ SD_ORG+10          ; init by SD_Init,
942 ;OrgRootDIR      .equ SD_ORG+12          ; init by SD_Init,
943 OrgClusters     .equ SD_ORG+14          ; init by SD_Init, Sector of Cluster 0
944 SecPerClus      .equ SD_ORG+16          ; init by SD_Init, byte size
945 ; ---------------------------------------
946 ; SD command
947 ; ---------------------------------------
948 SD_LOW_LEVEL    .equ SD_ORG+18
949 SD_CMD_FRM      .equ SD_LOW_LEVEL       ; SD_CMDx inverted frame ${CRC7,ll,LL,hh,HH,CMD}
950 SectorL         .equ SD_LOW_LEVEL+6
951 SectorH         .equ SD_LOW_LEVEL+8
952 ; ---------------------------------------
953 ; SD_BUF management
954 ; ---------------------------------------
955 BufferPtr       .equ SD_LOW_LEVEL+10
956 BufferLen       .equ SD_LOW_LEVEL+12
957 ; ---------------------------------------
958 ; FAT entry
959 ; ---------------------------------------
960 SD_FAT_LEVEL    .equ SD_LOW_LEVEL+14
961 ClusterL        .equ SD_FAT_LEVEL       ;
962 ClusterH        .equ SD_FAT_LEVEL+2     ;
963 LastFATsector   .equ SD_FAT_LEVEL+4     ;
964 LastFAToffset   .equ SD_FAT_LEVEL+6     ;
965 FATsector       .equ SD_FAT_LEVEL+8     ; not used
966 ; ---------------------------------------
967 ; DIR entry
968 ; ---------------------------------------
969 DIRClusterL     .equ SD_FAT_LEVEL+10    ; contains the Cluster of current directory ; = 1 as FAT16 root directory
970 DIRClusterH     .equ SD_FAT_LEVEL+12    ; contains the Cluster of current directory ; = 1 as FAT16 root directory
971 DIREntryOfst    .equ SD_FAT_LEVEL+14
972 ; ---------------------------------------
973 ; Handle Pointer
974 ; ---------------------------------------
975 CurrentHdl      .equ SD_FAT_LEVEL+16    ; contains the address of the last opened file structure, or 0
976 ; ---------------------------------------
977 ; Load file operation
978 ; ---------------------------------------
979 PathName_PTR    .equ SD_FAT_LEVEL+18    ;
980 PathName_END    .equ SD_FAT_LEVEL+20    ;
981 ; ---------------------------------------
982 ; Handle structure
983 ; ---------------------------------------
984 FirstHandle     .equ SD_FAT_LEVEL+22
985 ; three handle tokens :
986 ; HDLB_Token= 0 : free handle
987 ;           = 1 : file to read
988 ;           = 2 : file updated (write)
989 ;           =-1 : LOAD"ed file (source file)
990
991 ; offset values
992 HDLW_PrevHDL    .equ 0  ; previous handle
993 HDLB_Token      .equ 2  ; token
994 HDLB_ClustOfst  .equ 3  ; Current sector offset in current cluster (Byte)
995 HDLL_DIRsect    .equ 4  ; Dir SectorL
996 HDLH_DIRsect    .equ 6  ; Dir SectorH
997 HDLW_DIRofst    .equ 8  ; SD_BUF offset of Dir entry
998 HDLL_FirstClus  .equ 10 ; File First ClusterLo (identify the file)
999 HDLH_FirstClus  .equ 12 ; File First ClusterHi (identify the file)
1000 HDLL_CurClust   .equ 14 ; Current ClusterLo
1001 HDLH_CurClust   .equ 16 ; Current ClusterHi
1002 HDLL_CurSize    .equ 18 ; written size / not yet read size (Long)
1003 HDLH_CurSize    .equ 20 ; written size / not yet read size (Long)
1004 HDLW_BUFofst    .equ 22 ; SD_BUF offset ; used by LOAD"
1005 HDLW_PrevLEN    .equ 24 ; previous LEN
1006 HDLW_PrevORG    .equ 26 ; previous ORG
1007
1008     .IF RAM_LEN < 2048     ; due to the lack of RAM, only 4 handles and PAD replaces SDIB
1009 HandleMax       .equ 4 ; and not 8 to respect INFO size (FRAM)
1010 HandleLenght    .equ 28
1011 HandlesLen      .equ handleMax*HandleLenght
1012 HandleEnd       .equ FirstHandle+handleMax*HandleLenght
1013 SD_END          .equ HandleEnd
1014 SDIB_I2CADR     .equ PAD_ORG-4
1015 SDIB_I2CCNT     .equ PAD_ORG-2
1016 SDIB_ORG        .equ PAD_ORG
1017     .ELSE      ; RAM_Size >= 2k all is in RAM
1018 HandleMax       .equ 8
1019 HandleLenght    .equ 28
1020 HandlesLen      .equ handleMax*HandleLenght
1021 HandleEnd       .equ FirstHandle+handleMax*HandleLenght
1022 SDIB_I2CADR     .equ SDIB_ORG-4
1023 SDIB_I2CCNT     .equ SDIB_ORG-2
1024 SDIB_ORG        .equ HandleEnd+4
1025 SD_END          .equ SDIB_ORG+CIB_LEN
1026     .ENDIF ; RAM_Size
1027 SD_LEN          .equ SD_END-SD_ORG
1028     .ENDIF ; SD_CARD_LOADER
1029
1030     .org    INFO_ORG
1031 ;-------------------------------------------------------------------------------
1032 ; INFO(DCBA) >= 256 bytes memory map (FRAM) :
1033 ;-------------------------------------------------------------------------------
1034 ; FRAM INFO: KERNEL INIT CONSTANTS and VARIABLES
1035 ; ----------------------------------------------
1036 FREQ_KHZ        .word FREQUENCY*1000    ; used to stabilize MCLK before start, see MSP430FRxxxx.asm
1037     .IFDEF TERMINAL_I2C
1038 I2CSLAVEADR     .word MYSLAVEADR        ; on MSP430FR2xxx devices with BSL I2C, Slave address is FFA0h
1039 I2CSLAVEADR1    .word 0
1040 LPM_MODE        .word GIE+LPM4          ; LPM4 is the default mode for I2C TERMINAL
1041     .ELSE ; TERMINAL_UART
1042 TERMBRW_RST     .word TERMBRW_INI       ; set by TERMINALBAUDRATE.inc
1043 TERMMCTLW_RST   .word TERMMCTLW_INI     ; set by TERMINALBAUDRATE.inc
1044 LPM_MODE        .word GIE+LPM0          ; LPM0 is the default mode for UART TERMINAL
1045     .ENDIF
1046 USERSYS         .word -3                ; RESET use, value = -3 when compiling new kernel
1047 FORTHVERSION  .word VAL(SUBSTR(VER,1,0)); used by WARM
1048 INI_THREAD      .word THREADS           ; used by WORDS definition
1049 FORTHADDON      .word FADDON            ; used by FF_SPECS.f and to secure downloading of any source.f files.
1050 ; --------------------------------------;
1051 DEEP_ORG                                ; MOV #DEEP_ORG,X     see "PUC 7" in forthMSP430FR.ASM
1052 ; --------------------------------------;
1053 DEEP_TERM_VEC   .word TERMINAL_INT      ; MOV @X+,&TERM_VEC     ; TERMINAL_INT      --> FRAM TERM_VEC
1054     .IFNDEF SD_CARD_LOADER
1055 DEEP_COLD       .word COLD_TERM         ; MOV @X+,&COLD_APP     ; COLD_TERM         --> FRAM COLD_APP
1056 DEEP_SOFT       .word INIT_SOFT_TERM    ; MOV @X+,&SOFT_APP     ; INIT_SOFT_TERM    --> FRAM SOFT_APP
1057 DEEP_HARD       .word INIT_TERM         ; MOV @X+,&HARD_APP     ; INIT_TERM         --> FRAM HARD_APP
1058 DEEP_SLEEP      .word RXON              ; MOV @X+,&SLEEP_APP    ; RXON              --> FRAM SLEEP_APP
1059     .ELSE
1060 DEEP_COLD       .word COLD_TERM         ; MOV @X+,&COLD_APP     ; COLD_TERM         --> FRAM COLD_APP
1061 DEEP_SOFT       .word INIT_SOFT_SD      ; MOV @X+,&SOFT_APP     ; INIT_SOFT_SD      --> FRAM SOFT_APP
1062 DEEP_HARD       .word INIT_HARD_SD      ; MOV @X+,&HARD_APP     ; INIT_HARD_SD      --> FRAM HARD_APP
1063 DEEP_SLEEP      .word RXON              ; MOV @X+,&SLEEP_APP    ; RXON              --> FRAM SLEEP_APP
1064     .ENDIF
1065 DEEP_DP         .word ROMDICT           ; MOV @X+,&RST_DP       ; DEEP_DP           --> FRAM RST_DP
1066 DEEP_LASTVOC    .word lastvoclink       ; MOV @X+,&RST_LASTVOC  ; DEEP_LASTVOC      --> FRAM RST_LASTVOC
1067 DEEP_CURRENT    .word BODYFORTH         ; MOV @X+,&CURRENT      ; DEEP_CONTEXT      --> FRAM RST_CURRENT
1068 DEEP_CONTEXT    .word BODYFORTH         ; MOV @X+,&CONTEXT      ; DEEP_CONTEXT      --> FRAM RST_CONTEXT
1069 ; --------------------------------------;
1070 PUC_ABORT_ORG                           ; MOV #PUC_ABORT_ORG,X
1071 ; --------------------------------------;
1072 INIT_ACCEPT    .word ACCEPT+4           ; MOV @X+,&ACCEPT+2     ; INIT_ACCEPT       --> FRAM PFA_ACCEPT
1073 INIT_EMIT      .word EMIT+4             ; MOV @X+,&EMIT+2       ; INIT_EMIT         --> FRAM PFA_EMIT
1074 INIT_KEY       .word KEY+4              ; MOV @X+,&KEY+2        ; INIT_KEY          --> FRAM PFA_KEY
1075 INIT_CIB       .word TIB_ORG            ; MOV @X+,&CIB_ORG      ; INIT_CIB          --> FRAM CIB_ORG
1076 ; --------------------------------------;
1077 FORTH_ORG                               ; MOV #FORTH_ORG,X
1078 ; --------------------------------------;
1079 INIT_RSP        .word RSTACK            ; MOV @X+,RSP           ; INIT_RSP          --> RSP     (R1)
1080     .SWITCH DTC
1081         .CASE 1
1082 INIT_DOCOL      .word xDOCOL            ; MOV @X+,rDOCOL        ; INIT_DOCOL        --> rDOCOL  (R4)
1083         .CASE 2
1084 INIT_DOCOL      .word EXIT              ; MOV @X+,rDOCOL        ; INIT_DOCOL        --> rDOCOL  (R4)
1085         .CASE 3
1086 INIT_DOCOL      .word 0                 ; MOV @X+,R4            ; useless rDOCOL
1087     .ENDCASE
1088 INIT_DODOES     .word xDODOES           ; MOV @X+,rDODOES       ; INIT_DODOES       --> rDODOES (R5)
1089 INIT_DOCON      .word xDOCON            ; MOV @X+,rDOCON        ; INIT_DOCON        --> rDOCON  (R6)
1090 INIT_DOVAR      .word RFROM             ; MOV @X+,rDOVAR        ; INIT_DOVAR        --> rDOVAR  (R7)
1091 INIT_CAPS       .word 32                ; MOV @X+,&CAPS         ; INIT_CAPS         --> RAM CAPS
1092 INIT_BASE       .word 10                ; MOV @X+,&BASE         ; INIT_BASE         --> RAM BASE
1093 INIT_LEAVE      .word LSTACK            ; MOV @X+,&LEAVEPTR     ; INIT_LEAVE        --> RAM LEAVEPTR
1094 ; --------------------------------------;
1095 ; FRAM RST values initialised by -1 SYS ;
1096 ; --------------------------------------;
1097 RST_ORG                                 ; make room for RST values of:
1098 RST_LEN        .equ 16                  ; 16 bytes
1099 ; --------------------------------------;
1100     .IFNDEF SD_CARD_LOADER
1101 COLD_APP        .word COLD_TERM         ; COLD_APP
1102 SOFT_APP        .word INIT_SOFT_TERM    ; SOFT_APP
1103 HARD_APP        .word INIT_TERM         ; HARD_APP
1104 SLEEP_APP       .word RXON              ; SLEEP_APP
1105     .ELSE
1106 COLD_APP        .word COLD_TERM         ; COLD_APP
1107 SOFT_APP        .word INIT_SOFT_SD      ; SOFT_APP
1108 HARD_APP        .word INIT_HARD_SD      ; HARD_APP
1109 SLEEP_APP       .word RXON              ; SLEEP_APP
1110     .ENDIF
1111 ; --------------------------------------;
1112 RST_DP          .word ROMDICT           ; program memory pointer
1113 ; --------------------------------------;
1114 RST_LASTVOC     .word lastvoclink       ; last vocabulary link
1115 ; --------------------------------------;
1116 RST_CURRENT     .word BODYFORTH         ; CURRENT word-set ptr
1117 ; --------------------------------------;
1118 RST_CONTEXT     .word BODYFORTH         ; CONTEXT space (8 CELLS)
1119                 .word 0
1120                 .word 0
1121                 .word 0
1122                 .word 0
1123                 .word 0
1124                 .word 0
1125                 .word 0
1126 ; --------------------------------------;
1127                 .word 0                 ; NULL_WORD, always 0
1128 ; --------------------------------------;
1129
1130 ; --------------------------;
1131 ; INFO_ORG + $5A : free use ;
1132 ; --------------------------;