OSDN Git Service

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