OSDN Git Service

la der de der
[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     .ENDIF
499     .IFDEF EXTENDED_ASM
500         .IFNDEF DOUBLE_INPUT
501 DOUBLE_INPUT
502         .ENDIF
503     .ELSE
504         .IFDEF EXTENDED_MEM
505             .IFNDEF MSP430ASSEMBLER
506 MSP430ASSEMBLER
507             .ENDIF
508             .IFNDEF DOUBLE_INPUT
509 DOUBLE_INPUT
510             .ENDIF
511         .ENDIF
512     .ENDIF
513     .IFDEF FIXPOINT
514         .IFNDEF FIXPOINT_INPUT
515 FIXPOINT_INPUT              ; to interpret fixpoint numbers
516         .ENDIF
517     .ENDIF
518     .IFDEF FIXPOINT_INPUT
519         .IFNDEF DOUBLE_NUMBERS
520 DOUBLE_NUMBERS              ; to process double numbers
521         .ENDIF
522     .ENDIF
523     .IFDEF DOUBLE_INPUT
524         .IFNDEF DOUBLE_NUMBERS
525 DOUBLE_NUMBERS              ; to process double numbers
526         .ENDIF
527     .ENDIF
528
529 ; --------------------------
530 ; COMPUTE BAUDRATE registers = fn(FREQUENCY,BAUDS)
531 ; --------------------------
532     .IFDEF UART_TERMINAL
533         .include "TERMINALBAUDRATE.inc"
534     .ENDIF
535 ;-----------------------------------------------------------------------
536 ; DEVICE I/O, MEMORY, SFR, vectors and minimum FORTH I/O declarations
537 ;-----------------------------------------------------------------------
538     .IFDEF MSP_EXP430FR5739
539 LF_XTAL
540         .IFNDEF UART_TERMINAL
541 UCB0_TERM
542         .ELSE
543 UCA0_TERM
544         .ENDIF
545         .include "MSP430FR5739.inc"
546     .ENDIF
547     .IFDEF MSP_EXP430FR5969
548 ;EXTENDED_MEM
549 LF_XTAL
550         .IFNDEF UART_TERMINAL
551 UCB0_TERM
552         .ELSE
553 UCA0_TERM
554         .ENDIF
555 UCA1_SD
556         .include "MSP430FR5969.inc"
557     .ENDIF
558     .IFDEF MSP_EXP430FR5994
559 ;EXTENDED_MEM
560 LF_XTAL
561         .IFNDEF UART_TERMINAL
562 UCB2_TERM
563         .ELSE
564 UCA0_TERM
565         .ENDIF
566 UCB0_SD
567         .include "MSP430FR5994.inc"
568     .ENDIF
569     .IFDEF MSP_EXP430FR6989
570 ;EXTENDED_MEM
571 LF_XTAL
572         .IFNDEF UART_TERMINAL
573 UCB0_TERM
574         .ELSE
575 UCA1_TERM
576         .ENDIF
577 UCA0_SD
578         .INCLUDE "MSP430FR6989.inc"
579     .ENDIF
580     .IFDEF MSP_EXP430FR5972
581 ;EXTENDED_MEM
582 LF_XTAL
583         .IFNDEF UART_TERMINAL
584 UCB0_TERM
585         .ELSE
586 UCA1_TERM
587         .ENDIF
588 UCA0_SD
589         .INCLUDE "MSP430FR5972.inc"
590     .ENDIF
591     .IFDEF MSP_EXP430FR4133
592 LF_XTAL
593         .IFNDEF UART_TERMINAL
594 UCB0_TERM
595 UCA0_SD
596         .ELSE
597 UCA0_TERM
598 UCB0_SD
599         .ENDIF
600         .INCLUDE "MSP430FR4133.inc"
601     .ENDIF
602     .IFDEF MSP_EXP430FR2433
603 LF_XTAL
604         .IFNDEF UART_TERMINAL
605 UCB0_TERM
606         .ELSE
607 UCA0_TERM
608         .ENDIF
609 UCA1_SD
610         .include "MSP430FR2433.inc"
611     .ENDIF
612     .IFDEF CHIPSTICK_FR2433
613 ; no LF_XTAL to select ACLK = REFOCLK
614         .IFNDEF UART_TERMINAL
615 UCB0_TERM
616 UCA0_SD
617         .ELSE
618 UCA0_TERM
619 UCB0_SD
620         .ENDIF
621         .include "MSP430FR2433.inc"
622     .ENDIF
623     .IFDEF MSP_EXP430FR2355
624 LF_XTAL
625         .IFNDEF UART_TERMINAL
626 UCB0_TERM
627         .ELSE
628 UCA1_TERM
629         .ENDIF
630 UCB1_SD
631         .include "MSP430FR2355.inc"
632     .ENDIF
633     .IFDEF LP_MSP430FR2476
634 ;EXTENDED_MEM
635 ; LF_XTAL       ; connect resistors R2=0k, R3=0k before uncomment this line
636         .IFNDEF UART_TERMINAL
637 UCB1_TERM
638         .ELSE
639 UCA0_TERM
640         .ENDIF
641 UCA1_SD
642         .include "MSP430FR2476.inc"
643     .ENDIF
644     .IFDEF YOUR_TARGET
645 ; vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv
646 ; add here your device.inc item:
647 ;^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
648     .ENDIF
649     .restore
650 ; ---------------------------
651 ; compute value of FORTHADDON
652 ; ---------------------------
653 FADDON .set 0
654
655 ;    .IFDEF FLOORED_DIVISION
656 ;FADDON .SET FADDON | BIT15  ; FLOORED_DIVISION
657 ;    .ENDIF
658     .IFDEF LF_XTAL
659 FADDON .SET FADDON | BIT14  ; LFXTAL = 32768 Hz
660     .ENDIF
661     .IFDEF UART_TERMINAL    ; if TERMINAL UART...
662         .IFDEF TERMINAL5WIRES
663 FADDON .SET FADDON | BIT13  ; UART CTS
664         .ENDIF
665         .IFDEF TERMINAL4WIRES
666 FADDON .SET FADDON | BIT12  ; UART RTS
667         .ENDIF
668         .IFDEF TERMINAL3WIRES
669 FADDON .SET FADDON | BIT11  ; UART XON/XOFF
670         .ENDIF
671         .IFDEF HALFDUPLEX
672 FADDON .SET FADDON | BIT10  ; UART Half Duplex
673         .ENDIF
674     .ENDIF ; TERMINAL UART
675 ; ---------------------------
676         .IFNDEF UART_TERMINAL
677 FADDON .SET FADDON | BIT9   ; I2C TERMINAL
678         .ENDIF
679     .IFDEF FIXPOINT_INPUT
680 FADDON .SET FADDON | BIT8   ; Q15.16 INPUT
681     .ENDIF
682     .IFDEF DOUBLE_INPUT
683 FADDON .SET FADDON | BIT7   ; DOUBLE INPUT
684     .ENDIF
685 ; ---------------------------
686     .IFDEF LARGE_DATA       ; Assembler 20 bits
687 FADDON .SET FADDON | BIT6
688     .ENDIF
689     .IFDEF LARGE_CODE
690         .IFNDEF LARGE_DATA
691 FADDON .SET FADDON | BIT5   ; Assembler 16 bits with Address access beyond $FFFF
692         .ENDIF
693     .ENDIF
694     .IFDEF HMPY             ;
695 FADDON .SET FADDON | BIT4   ; hardware MPY
696     .ENDIF
697     .IFDEF SD_CARD_LOADER
698 FADDON .SET FADDON | BIT3
699     .ENDIF
700     .IFDEF SD_CARD_READ_WRITE
701 FADDON .SET FADDON | BIT2
702     .ENDIF
703 ; ---------------------------
704 ; BIT2 to BIT0 are free
705 ; ---------------------------
706
707
708 ;-------------------------------------------------------------------------------
709 ; DTCforthMSP430FR5xxx RAM memory map:
710 ;-------------------------------------------------------------------------------
711
712 ;---------------------------;---------
713 ; name             words    ; comment
714 ;------------------=====----;---------
715 ;LSTACK = L0 = LEAVEPTR     ; ----- RAM_ORG
716                             ; |
717 LSTACK_LEN .equ     16      ; | grows up
718                             ; V
719                             ; ^
720 PSTACK_LEN .equ     48      ; | grows down
721                             ; |
722 ;PSTACK=S0                  ; ----- RAM_ORG + $80
723                             ; ^
724 RSTACK_LEN .equ     48      ; | grows down
725                             ; |
726 ;RSTACK=R0                  ; ----- RAM_ORG + $E0
727
728 ;---------------------------;---------
729 ; names            bytes    ; comments
730 ;------------------=====----;---------
731 ; PAD_I2CADR                ; ----- RAM_ORG + $E0
732 ; PAD_I2CCNT                ;
733 ; PAD                       < ----- RAM_ORG + $E4
734                             ; |
735 PAD_LEN     .equ    84      ; | grows up    (ans spec. : PAD >= 84 chars)
736                             ; v
737 ; TIB_I2CADR                ; ----- RAM_ORG + $138
738 ; TIB_I2CCNT                ;
739 ; TIB                       < ----- RAM_ORG + $13C
740                             ; |
741 CIB_LEN     .equ    84      ; | grows up    Current Input Buffer (ans spec. : TIB >= 80 chars)
742                             ; v
743 ; HOLDS_ORG                 < ------RAM_ORG + $190
744                             ; ^
745 HOLD_LEN   .equ     34      ; | grows down  (ans spec. : HOLD_LEN >= (2*n) + 2 char, with n = 16 bits/cell
746                             ; |
747 ; HOLD_BASE                 < ----- RAM_ORG + $1B2
748                             ;
749                             ;       system variables
750                             ;
751 ; LAST_NFA                  ; ----- RAM_ORG + $1D8 : Forth compiler variables
752                             ;
753                             ;       36 free bytes
754                             ;
755 ; SD_BUF_I2CADR             < ----- RAM_ORG + $1FC
756 ; SD_BUF_I2CCNT             ;
757 ; SD_BUF                    < ----- RAM_ORG + $200
758                             ;
759 SD_BUF_LEN   .equ   200h    ;       512 bytes buffer
760                             ;
761 ; SD_BUF_END                < ----- RAM_ORG + $400
762
763 LSTACK          .equ RAM_ORG
764 LEAVEPTR        .equ LSTACK             ; Leave-stack pointer
765 PSTACK          .equ LSTACK+(LSTACK_LEN*2)+(PSTACK_LEN*2)
766 RSTACK          .equ PSTACK+(RSTACK_LEN*2)
767 PAD_I2CADR      .equ PAD_ORG-4
768 PAD_I2CCNT      .equ PAD_ORG-2
769 PAD_ORG         .equ RSTACK+4
770 TIB_I2CADR      .equ TIB_ORG-4
771 TIB_I2CCNT      .equ TIB_ORG-2
772 TIB_ORG         .equ PAD_ORG+PAD_LEN+4
773 HOLDS_ORG       .equ TIB_ORG+CIB_LEN
774
775 HOLD_BASE       .equ HOLDS_ORG+HOLD_LEN
776
777 ; ----------------------------------------------------
778 ; RAM_ORG + $1B2 : RAM VARIABLES
779 ; ----------------------------------------------------
780 ; FORTH interpreter
781 ; ----------------------------------------------------
782 HP              .equ HOLD_BASE      ; HOLD ptr,                 init by <#
783 STATE           .equ HOLD_BASE+2    ; Interpreter state         init by INIT_FORTH
784 BASEADR         .equ HOLD_BASE+4    ; BASE                      init by INIT_FORTH
785 SOURCE          .equ HOLD_BASE+6    ; len, org of input stream  init by REFILL
786 SOURCE_LEN      .equ HOLD_BASE+6    ;                           init by REFILL
787 SOURCE_ORG      .equ HOLD_BASE+8    ;                           init by REFILL
788 TOIN            .equ HOLD_BASE+10   ; CurrentInputBuffer ptr    init by REFILL
789 ; ----------------------------------------------------
790 ; FORTH environment
791 ; ----------------------------------------------------
792 DP              .equ HOLD_BASE+12   ; dictionnary pointer       init by INIT_FORTH and RST_RET
793 LASTVOC         .equ HOLD_BASE+14   ;                           init by INIT_FORTH and RST_RET
794 CURRENT         .equ HOLD_BASE+16   ;                           init by INIT_FORTH and RST_RET
795 CONTEXT         .equ HOLD_BASE+18   ; 8 words of depth ending   init by INIT_FORTH and RST_RET
796 NULL_WORD       .equ HOLD_BASE+34   ; + null word               init by INIT_FORTH and RST_RET
797 ; ----------------------------------------------------
798 ; FORTH compiler 
799 ; ----------------------------------------------------
800 ; RAM_ORG + $1D8 : can be shared with APPLICATION needs
801 ; ----------------------------------------------------
802 LAST_NFA        .equ HOLD_BASE+36   ; used by REVEAL, IMMEDIATE
803 LAST_THREAD     .equ HOLD_BASE+38   ;    "    REVEAL
804 LAST_CFA        .equ HOLD_BASE+40   ;    "    DOES>, RECURSE
805 LAST_PSP        .equ HOLD_BASE+42   ;    "    REVEAL
806 ASMBW1          .equ HOLD_BASE+44   ;
807 ASMBW2          .equ HOLD_BASE+46   ;
808 ASMBW3          .equ HOLD_BASE+48   ;
809 ASMFW1          .equ HOLD_BASE+50   ;
810 ASMFW2          .equ HOLD_BASE+52   ;
811 ASMFW3          .equ HOLD_BASE+54   ;
812 ; ----------------------------------------------------
813 ; RAM_ORG + $1EA : free RAM area
814 ; ----------------------------------------------------
815
816     .IFDEF SD_CARD_LOADER
817 ; --------------------------------------------------
818 ; RAM_ORG + $1FC : RAM SD_CARD SD_BUF 4 + 512 bytes
819 ; --------------------------------------------------
820 SD_BUF_I2CADR   .equ SD_BUF-4
821 SD_BUF_I2CCNT   .equ SD_BUF-2
822 SD_BUF          .equ HOLD_BASE+78
823 SD_BUF_END      .equ SD_BUF+200h        ; 512bytes
824 ; --------------------------------------------------
825 ; RAM_ORG + $400 : free RAM
826 ; --------------------------------------------------
827     .ENDIF
828
829     .IFDEF SD_CARD_LOADER
830 ; ---------------------------------------
831 ; VARIABLES that should be in RAM
832 ; ---------------------------------------
833         .IF RAM_LEN < 2048              ; if RAM < 2K (FR57xx) the variables below are in INFO space (FRAM)
834 SD_ORG     .equ INFO_ORG+5Ah            ;
835         .ELSE                           ; if RAM >= 2k the variables below are in RAM
836 SD_ORG     .equ SD_BUF_END+2            ; 1 word guard (for CRC16bits !)
837         .ENDIF
838
839     .org SD_ORG
840 ; ---------------------------------------
841 ; FAT FileSystemInfos
842 ; ---------------------------------------
843 FATtype         .equ SD_ORG+0
844 BS_FirstSectorL .equ SD_ORG+2           ; init by SD_Init, used by RW_Sector_CMD
845 BS_FirstSectorH .equ SD_ORG+4           ; init by SD_Init, used by RW_Sector_CMD
846 OrgFAT1         .equ SD_ORG+6           ; init by SD_Init,
847 FATSize         .equ SD_ORG+8           ; init by SD_Init,
848 OrgFAT2         .equ SD_ORG+10          ; init by SD_Init,
849 OrgRootDIR      .equ SD_ORG+12          ; init by SD_Init, Org Sector of RootDIR
850 OrgClusters     .equ SD_ORG+14          ; init by SD_Init, Org Sector of Cluster 0
851 SecPerClus      .equ SD_ORG+16          ; init by SD_Init, byte size
852 ; ---------------------------------------
853 ; SD command
854 ; ---------------------------------------
855 SD_LOW_LEVEL    .equ SD_ORG+18
856 SD_CMD_FRM      .equ SD_LOW_LEVEL       ; SD_CMDx inverted frame ${CRC7,ll,LL,hh,HH,CMD}
857 SectorL         .equ SD_LOW_LEVEL+6
858 SectorH         .equ SD_LOW_LEVEL+8
859 ; ---------------------------------------
860 ; SD_BUF management
861 ; ---------------------------------------
862 BufferPtr       .equ SD_LOW_LEVEL+10
863 BufferLen       .equ SD_LOW_LEVEL+12
864 ; ---------------------------------------
865 ; FAT entry
866 ; ---------------------------------------
867 SD_FAT_LEVEL    .equ SD_LOW_LEVEL+14
868 ClusterL        .equ SD_FAT_LEVEL       ;
869 ClusterH        .equ SD_FAT_LEVEL+2     ;
870 LastFATsector   .equ SD_FAT_LEVEL+4     ;
871 LastFAToffset   .equ SD_FAT_LEVEL+6     ;
872 FATsector       .equ SD_FAT_LEVEL+8     ; not used
873 ; ---------------------------------------
874 ; DIR entry (RootDIR excluded)
875 ; ---------------------------------------
876 DIRClusterL     .equ SD_FAT_LEVEL+10    ; contains the Cluster of current directory ; = 0 for root directory
877 DIRClusterH     .equ SD_FAT_LEVEL+12    ; contains the Cluster of current directory ; = 0 for root directory
878 DIREntryOfst    .equ SD_FAT_LEVEL+14
879 ; ---------------------------------------
880 ; Handle Pointer
881 ; ---------------------------------------
882 CurrentHdl      .equ SD_FAT_LEVEL+16    ; contains the address of the last opened file structure, or 0
883 ; ---------------------------------------
884 ; Load file operation
885 ; ---------------------------------------
886 PathName_PTR    .equ SD_FAT_LEVEL+18    ;
887 PathName_END    .equ SD_FAT_LEVEL+20    ;
888 ; ---------------------------------------
889 ; Handle structure
890 ; ---------------------------------------
891 FirstHandle     .equ SD_FAT_LEVEL+22
892 ; three handle tokens :
893 ; HDLB_Token= 0 : free handle
894 ;           = 1 : file to read
895 ;           = 2 : file updated (write)
896 ;           =-1 : LOAD"ed file (source file)
897
898 ; offset values
899 HDLW_PrevHDL    .equ 0  ; previous handle
900 HDLB_Token      .equ 2  ; token
901 HDLB_ClustOfst  .equ 3  ; Current sector offset in current cluster (Byte)
902 HDLL_DIRsect    .equ 4  ; Dir SectorL
903 HDLH_DIRsect    .equ 6  ; Dir SectorH
904 HDLW_DIRofst    .equ 8  ; SD_BUF offset of Dir entry
905 HDLL_FirstClus  .equ 10 ; File First ClusterLo (identify the file)
906 HDLH_FirstClus  .equ 12 ; File First ClusterHi (identify the file)
907 HDLL_CurClust   .equ 14 ; Current ClusterLo
908 HDLH_CurClust   .equ 16 ; Current ClusterHi
909 HDLL_CurSize    .equ 18 ; written size / not yet read size (Long)
910 HDLH_CurSize    .equ 20 ; written size / not yet read size (Long)
911 HDLW_BUFofst    .equ 22 ; SD_BUF offset ; used by LOAD"
912 HDLW_PrevLEN    .equ 24 ; interpret_buffer_LEN of previous handle
913 HDLW_PrevORG    .equ 26 ; interpret_buffer_ORG of previous handle
914 HDLW_PrevTOIN   .equ 28 ; interpret_buffer_PTR of previous handle
915 HDLW_PrevQYEMIT .equ 30 ; echo state of previous handle
916
917     .IF RAM_LEN < 2048     ; due to the lack of RAM, only 4 handles and PAD replaces SDIB
918 HandleMax       .equ 4 ; and not 8 to respect INFO size (FRAM)
919 HandleLenght    .equ 32
920 HandlesLen      .equ handleMax*HandleLenght
921 HandleEnd       .equ FirstHandle+handleMax*HandleLenght
922 SD_END          .equ HandleEnd
923 SDIB_I2CADR     .equ PAD_ORG-4
924 SDIB_I2CCNT     .equ PAD_ORG-2
925 SDIB_ORG        .equ PAD_ORG
926     .ELSE      ; RAM_Size >= 2k all is in RAM
927 HandleMax       .equ 8
928 HandleLenght    .equ 32
929 HandlesLen      .equ handleMax*HandleLenght
930 HandleEnd       .equ FirstHandle+handleMax*HandleLenght
931 SDIB_I2CADR     .equ SDIB_ORG-4
932 SDIB_I2CCNT     .equ SDIB_ORG-2
933 SDIB_ORG        .equ HandleEnd+4
934 SD_END          .equ SDIB_ORG+CIB_LEN
935     .ENDIF ; RAM_Size
936 SD_LEN          .equ SD_END-SD_ORG
937     .ENDIF ; SD_CARD_LOADER
938
939     .cpu MSP430X    ; define CPU
940
941
942 ;-------------------------------------------------------------------------------
943 ; DEFINING FORTH REGISTERS - DTC model
944 ;-------------------------------------------------------------------------------
945 RSP         .reg    R1      ; RSP = Return Stack Pointer (return stack)
946 ;                   R2      ; not to be used
947 ;                   R3      ; not to be used
948 ; DOxxx registers           ; must be saved before use and restored after use
949 rDOCOL      .reg    R4
950 rDODOES     .reg    r5      ; to restore: MOV #XDODOES,rDODOES
951 rDOCON      .reg    r6      ; to restore: MOV #XDOCON,rDOCON
952 rDOVAR      .reg    r7      ; to restore: MOV #R>,rDOVAR
953 ; rDOxxx alias
954 R           .reg    r4      ; rDOCOL alias
955 Q           .reg    r5      ; rDODOES alias
956 P           .reg    r6      ; rDOCON alias
957 M           .reg    R7      ; rDOVAR alias
958 ; Scratch registers
959 Y           .reg    R8
960 X           .reg    R9
961 W           .reg    R10
962 T           .reg    R11
963 S           .reg    R12
964 ; Forth virtual machine
965 IP          .reg    R13     ; interpretative pointer
966 TOS         .reg    R14     ; first PSP cell
967 PSP         .reg    R15     ; PSP = Parameters Stack Pointer (stack data)
968
969 ; ----------------------------------------------
970 ; EXECUTIVE WORDS FOR Direct-Threaded Code (DTC)
971 ; ----------------------------------------------
972 ;-------------------------------------------------------------------------------
973 ; very nice FAST FORTH feature:
974 ; as IP is always computed from the PC value, we can place low to high level
975 ; "ASMtoFORTH" or "mDOCOL" switches anywhere in a word, i.e. not only at its
976 ; beginning as ITC competitors.
977 ;-------------------------------------------------------------------------------
978 DOCOL       .equ 1284h              ; 1284h = CALL rDOCOL instruction
979 DODOES      .equ 1285h              ; 1285h = CALL rDODOES instruction
980 DOCON       .equ 1286h              ; 1286h = CALL rDOCON instruction
981 DOVAR       .equ 1287h              ; 1287h = CALL rDOVAR instruction
982
983     .SWITCH DTC
984
985     .CASE 1 ; DOCOL = CALL rDOCOL, [rDOCOL] = XDOCOL
986 mASM2FORTH  .MACRO                  ; compiled by LO2HI
987             CALL #EXIT              ; 10 cycles
988             .ENDM                   ; 2 words, 10 cycles. LO2HI + HI2LO = 3 words, 10 cycles.
989
990 mDOCOL      .MACRO                  ; compiled by : and by colon
991             CALL rDOCOL             ; 10 [rDOCOL] = XDOCOL
992             .ENDM                   ; 1 word, 14 cycles (CALL included) (ITC+4). COLON + SEMI = 2 words, 20 cycles (ITC+2)
993
994     .CASE 2 ; DOCOL = PUSH IP + CALL rDOCOL, [rDOCOL] = EXIT
995 mASM2FORTH  .MACRO                  ; compiled by LO2HI
996             CALL rDOCOL             ; 10 [rDOCOL] = EXIT
997             .ENDM                   ; 1 word, 10 cycles. LO2HI + HI2LO = 2 words, 10 cycles.
998
999 mDOCOL      .MACRO                  ; compiled by : and by COLON
1000             PUSH IP                 ; 3
1001             CALL rDOCOL             ; 10 [rDOCOL] = EXIT
1002             .ENDM                   ; 2 words, 13 cycles (ITC+3). COLON + SEMI = 3 words, 19 cycles (ITC+1)
1003
1004     .CASE 3 ; inlined DOCOL
1005 mASM2FORTH  .MACRO                  ; compiled by LO2HI
1006             MOV PC,IP               ; 1
1007             ADD #4,IP               ; 1
1008             MOV @IP+,PC             ; 4 NEXT
1009             .ENDM                   ; 3 words, 6 cycles. LO2HI + HI2LO = 4 words, 6 cycles.
1010
1011 mDOCOL      .MACRO                  ; compiled by : and by COLON
1012             PUSH IP                 ; 3
1013             MOV PC,IP               ; 1
1014             ADD #4,IP               ; 1
1015             MOV @IP+,PC             ; 4 NEXT
1016             .ENDM                   ; 4 words, 9 cycles (ITC-1). COLON + SEMI = 5 words, 15 cycles (ITC-3)
1017
1018     .ENDCASE ; DTC
1019
1020 mNEXTADR    .MACRO
1021             .word   $+2
1022             .ENDM
1023
1024     .org    INFO_ORG
1025 ;-------------------------------------------------------------------------------
1026 ; INFO(DCBA) >= 256 bytes memory map (FRAM) :
1027 ;-------------------------------------------------------------------------------
1028 ; FRAM INFO: KERNEL INIT CONSTANTS and VARIABLES
1029 ; ----------------------------------------------
1030     .IF FREQUENCY > 24
1031 FREQ_KHZ        .word FREQUENCY         ; used to stabilize MCLK before start, see MSP430FRxxxx.asm
1032     .ELSE
1033 FREQ_KHZ        .word FREQUENCY*1000    ; used to stabilize MCLK before start, see MSP430FRxxxx.asm
1034     .ENDIF
1035     .IFNDEF UART_TERMINAL
1036 I2CSLAVEADR     .word I2C_TERM_ADR      ; on MSP430FR2xxx devices with BSL I2C, Slave address is FFA0h
1037 I2CSLAVEADR1    .word 0
1038 LPM_MODE        .word GIE+LPM4          ; LPM4 is the default mode for I2C TERMINAL
1039     .ELSE ; TERMINAL_UART
1040 TERMBRW_RST     .word TERMBRW_INI       ; set by UART_TERMINAL.inc
1041 TERMMCTLW_RST   .word TERMMCTLW_INI     ; set by UART_TERMINAL.inc
1042 LPM_MODE        .word GIE+LPM0          ; LPM0 is the default mode for UART TERMINAL
1043     .ENDIF
1044 USERSYS         .word -3                ; RESET use, value = -3 when compiling new kernel
1045 FORTHVERSION  .word VAL(SUBSTR(VER,1,0)); used by WARM
1046 INI_THREAD      .word THREADS           ; used by WORDS definition
1047 FORTHADDON      .word FADDON            ; used by FF_SPECS.f and to secure downloading of any source.f files.
1048 ; --------------------------------------;
1049 DEEP_ORG                                ; MOV #DEEP_ORG,X     see "PUC 7" in forthMSP430FR.ASM
1050 ; --------------------------------------;
1051 DEEP_TERM_VEC   .word TERMINAL_INT      ; MOV @X+,&TERM_VEC     ; TERMINAL_INT      --> FRAM TERM_VEC
1052     .IFNDEF SD_CARD_LOADER
1053 DEEP_STOP       .word INIT_STOP         ; MOV @X+,&STOP_APP     ; INIT_STOP         --> FRAM STOP_APP
1054 DEEP_ABORT      .word ABORT_TERM        ; MOV @X+,&ABORT_APP    ; INIT_ABORT        --> FRAM ABORT_APP
1055 DEEP_SOFT       .word INIT_SOFT         ; MOV @X+,&SOFT_APP     ; INIT_SOFT_TERM    --> FRAM SOFT_APP
1056 DEEP_HARD       .word INIT_TERM         ; MOV @X+,&HARD_APP     ; INIT_TERM         --> FRAM HARD_APP
1057 DEEP_SLEEP      .word INIT_BACKGRND     ; MOV @X+,&BACKGRND_APP ; INIT_BACKGRND     --> FRAM BACKGRND_APP
1058     .ELSE
1059 DEEP_STOP       .word INIT_STOP         ; MOV @X+,&STOP_APP     ; INIT_STOP         --> FRAM STOP_APP
1060 DEEP_ABORT      .word ABORT_TERM        ; MOV @X+,&ABORT_APP    ; INIT_ABORT        --> FRAM ABORT_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 INIT_BACKGRND     ; MOV @X+,&BACKGRND_APP ; INIT_BACKGRND     --> FRAM BACKGRND_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                 .word 0                 ; to do FORTH ONLY
1070 ; --------------------------------------;
1071 PUC_ABORT_ORG                           ; MOV #PUC_ABORT_ORG,X
1072 ; --------------------------------------;
1073 INIT_ACCEPT    .word ACCEPT+4           ; MOV @X+,&ACCEPT+2     ; INIT_ACCEPT       --> FRAM PFA_ACCEPT
1074 INIT_EMIT      .word EMIT+4             ; MOV @X+,&EMIT+2       ; INIT_EMIT         --> FRAM PFA_EMIT
1075 INIT_KEY       .word KEY+4              ; MOV @X+,&KEY+2        ; INIT_KEY          --> FRAM PFA_KEY
1076 INIT_CIB       .word TIB_ORG            ; MOV @X+,&CIB_ORG      ; INIT_CIB          --> FRAM CIB_ORG
1077 ; --------------------------------------;
1078 FORTH_ORG                               ; MOV #FORTH_ORG,X
1079 ; --------------------------------------;
1080 INIT_RSP        .word RSTACK            ; MOV @X+,RSP           ; INIT_RSP          --> RSP     (R1)
1081     .SWITCH DTC
1082         .CASE 1
1083 INIT_DOCOL      .word xDOCOL            ; MOV @X+,rDOCOL        ; INIT_DOCOL        --> rDOCOL  (R4)
1084         .CASE 2
1085 INIT_DOCOL      .word EXIT              ; MOV @X+,rDOCOL        ; INIT_DOCOL        --> rDOCOL  (R4)
1086         .CASE 3
1087 INIT_DOCOL      .word 0                 ; MOV @X+,R4            ; useless rDOCOL
1088     .ENDCASE
1089 INIT_DODOES     .word xDODOES           ; MOV @X+,rDODOES       ; INIT_DODOES       --> rDODOES (R5)
1090 INIT_DOCON      .word xDOCON            ; MOV @X+,rDOCON        ; INIT_DOCON        --> rDOCON  (R6)
1091 INIT_DOVAR      .word RFROM             ; MOV @X+,rDOVAR        ; INIT_DOVAR        --> rDOVAR  (R7)
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 ; from DEEP_ORG+2
1096 ; --------------------------------------;
1097 RST_ORG                                 ; make room for RST values of:
1098 RST_LEN        .equ 20                  ; 10 words, 20 bytes (with only one trailing 0)
1099 ; --------------------------------------;
1100     .IFNDEF SD_CARD_LOADER
1101 STOP_APP        .word INIT_STOP         ; STOP_APP
1102 ABORT_APP       .word ABORT_TERM        ; ABORT_APP 
1103 SOFT_APP        .word INIT_SOFT         ; SOFT_APP
1104 HARD_APP        .word INIT_TERM         ; HARD_APP
1105 BACKGRND_APP    .word INIT_BACKGRND     ; BACKGRND_APP
1106     .ELSE
1107 STOP_APP        .word INIT_STOP         ; STOP_APP
1108 ABORT_APP       .word ABORT_TERM        ; ABORT_APP 
1109 SOFT_APP        .word INIT_SOFT_SD      ; SOFT_APP
1110 HARD_APP        .word INIT_HARD_SD      ; HARD_APP
1111 BACKGRND_APP    .word INIT_BACKGRND     ; BACKGRND_APP
1112     .ENDIF
1113 RST_DP          .word ROMDICT           ; program memory pointer
1114 RST_LASTVOC     .word lastvoclink       ; last vocabulary link
1115 RST_CURRENT     .word BODYFORTH         ; CURRENT word-set ptr
1116 RST_CONTEXT     .word BODYFORTH         ; CONTEXT space (8 CELLS)
1117                 .word 0
1118                 .word 0
1119                 .word 0
1120                 .word 0
1121                 .word 0
1122                 .word 0
1123                 .word 0
1124 ; --------------------------------------;
1125                 .word 0                 ; NULL_WORD, always 0
1126 ; --------------------------------------;
1127                 .word 0
1128 ; --------------------------;
1129 ; INFO_ORG + $60 : free use ;
1130 ; --------------------------;