21 ; ----------------------------------------------
22 ; MACROS FOR assembly instructions
23 ; ----------------------------------------------
24 NOP .macro ; 1 word, 1 cycle
25 .word 4303h ; mov #0, r3
28 NOP2 .macro ; 1 Word, 2 cycles
32 NOP3 .macro ; 1 Word, 3 cycles
33 .word 4000h ; MOV PC,PC
36 ; SR(11:0) bits are saved by interrupts and restored by the instruction RETI
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
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 ;----------------------------------------------------------------------------
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
59 ; ----------------------------------------------
60 ; INIT VOCABULARY POINTERS and MACROS FOR HEADER
61 ; ----------------------------------------------
62 voclink .set 0 ; init vocabulary links
71 .byte STRLEN(name)*2,name
75 FORTHWORDIMM .MACRO name
78 .byte STRLEN(name)*2+1,name ; bit 0 is the immediate flag
85 .byte STRLEN(name)*2,name
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
257 .byte STRLEN(name)*2,name
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
363 .byte STRLEN(name)*2+1,name ; bit 0 is the immediate flag
366 ;-------------------------------------------
367 ; (THREADS-1)*2 = AND mask to define CURRENT offset in vocabulary
368 ;-------------------------------------------
370 CONTEXTofst .set (charfromstr(name,0) & (THREADS-1))*2
469 .byte STRLEN(name)*2,name
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!
481 ; --------------------------
482 ; COMPUTE ASSEMBLY SWITCHES
483 ; --------------------------
484 .IFDEF CORE_COMPLEMENT
494 .IFDEF SD_CARD_LOADER
505 .IFNDEF MSP430ASSEMBLER
514 .IFNDEF FIXPOINT_INPUT
515 FIXPOINT_INPUT ; to interpret fixpoint numbers
518 .IFDEF FIXPOINT_INPUT
519 .IFNDEF DOUBLE_NUMBERS
520 DOUBLE_NUMBERS ; to process double numbers
524 .IFNDEF DOUBLE_NUMBERS
525 DOUBLE_NUMBERS ; to process double numbers
529 ; --------------------------
530 ; COMPUTE BAUDRATE registers = fn(FREQUENCY,BAUDS)
531 ; --------------------------
533 .include "TERMINALBAUDRATE.inc"
535 ;-----------------------------------------------------------------------
536 ; DEVICE I/O, MEMORY, SFR, vectors and minimum FORTH I/O declarations
537 ;-----------------------------------------------------------------------
538 .IFDEF MSP_EXP430FR5739
540 .IFNDEF UART_TERMINAL
545 .include "MSP430FR5739.inc"
547 .IFDEF MSP_EXP430FR5969
550 .IFNDEF UART_TERMINAL
556 .include "MSP430FR5969.inc"
558 .IFDEF MSP_EXP430FR5994
561 .IFNDEF UART_TERMINAL
567 .include "MSP430FR5994.inc"
569 .IFDEF MSP_EXP430FR6989
572 .IFNDEF UART_TERMINAL
578 .INCLUDE "MSP430FR6989.inc"
580 .IFDEF MSP_EXP430FR5972
583 .IFNDEF UART_TERMINAL
589 .INCLUDE "MSP430FR5972.inc"
591 .IFDEF MSP_EXP430FR4133
593 .IFNDEF UART_TERMINAL
600 .INCLUDE "MSP430FR4133.inc"
602 .IFDEF MSP_EXP430FR2433
604 .IFNDEF UART_TERMINAL
610 .include "MSP430FR2433.inc"
612 .IFDEF CHIPSTICK_FR2433
613 ; no LF_XTAL to select ACLK = REFOCLK
614 .IFNDEF UART_TERMINAL
621 .include "MSP430FR2433.inc"
623 .IFDEF MSP_EXP430FR2355
625 .IFNDEF UART_TERMINAL
631 .include "MSP430FR2355.inc"
633 .IFDEF LP_MSP430FR2476
635 ; LF_XTAL ; connect resistors R2=0k, R3=0k before uncomment this line
636 .IFNDEF UART_TERMINAL
642 .include "MSP430FR2476.inc"
645 ; vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv
646 ; add here your device.inc item:
647 ;^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
650 ; ---------------------------
651 ; compute value of FORTHADDON
652 ; ---------------------------
655 ; .IFDEF FLOORED_DIVISION
656 ;FADDON .SET FADDON | BIT15 ; FLOORED_DIVISION
659 FADDON .SET FADDON | BIT14 ; LFXTAL = 32768 Hz
661 .IFDEF UART_TERMINAL ; if TERMINAL UART...
662 .IFDEF TERMINAL5WIRES
663 FADDON .SET FADDON | BIT13 ; UART CTS
665 .IFDEF TERMINAL4WIRES
666 FADDON .SET FADDON | BIT12 ; UART RTS
668 .IFDEF TERMINAL3WIRES
669 FADDON .SET FADDON | BIT11 ; UART XON/XOFF
672 FADDON .SET FADDON | BIT10 ; UART Half Duplex
674 .ENDIF ; TERMINAL UART
675 ; ---------------------------
676 .IFNDEF UART_TERMINAL
677 FADDON .SET FADDON | BIT9 ; I2C TERMINAL
679 .IFDEF FIXPOINT_INPUT
680 FADDON .SET FADDON | BIT8 ; Q15.16 INPUT
683 FADDON .SET FADDON | BIT7 ; DOUBLE INPUT
685 ; ---------------------------
686 .IFDEF LARGE_DATA ; Assembler 20 bits
687 FADDON .SET FADDON | BIT6
691 FADDON .SET FADDON | BIT5 ; Assembler 16 bits with Address access beyond $FFFF
695 FADDON .SET FADDON | BIT4 ; hardware MPY
697 .IFDEF SD_CARD_LOADER
698 FADDON .SET FADDON | BIT3
700 .IFDEF SD_CARD_READ_WRITE
701 FADDON .SET FADDON | BIT2
703 ; ---------------------------
704 ; BIT2 to BIT0 are free
705 ; ---------------------------
708 ;-------------------------------------------------------------------------------
709 ; DTCforthMSP430FR5xxx RAM memory map:
710 ;-------------------------------------------------------------------------------
712 ;---------------------------;---------
713 ; name words ; comment
714 ;------------------=====----;---------
715 ;LSTACK = L0 = LEAVEPTR ; ----- RAM_ORG
717 LSTACK_LEN .equ 16 ; | grows up
720 PSTACK_LEN .equ 48 ; | grows down
722 ;PSTACK=S0 ; ----- RAM_ORG + $80
724 RSTACK_LEN .equ 48 ; | grows down
726 ;RSTACK=R0 ; ----- RAM_ORG + $E0
728 ;---------------------------;---------
729 ; names bytes ; comments
730 ;------------------=====----;---------
731 ; PAD_I2CADR ; ----- RAM_ORG + $E0
733 ; PAD < ----- RAM_ORG + $E4
735 PAD_LEN .equ 84 ; | grows up (ans spec. : PAD >= 84 chars)
737 ; TIB_I2CADR ; ----- RAM_ORG + $138
739 ; TIB < ----- RAM_ORG + $13C
741 CIB_LEN .equ 84 ; | grows up Current Input Buffer (ans spec. : TIB >= 80 chars)
743 ; HOLDS_ORG < ------RAM_ORG + $190
745 HOLD_LEN .equ 34 ; | grows down (ans spec. : HOLD_LEN >= (2*n) + 2 char, with n = 16 bits/cell
747 ; HOLD_BASE < ----- RAM_ORG + $1B2
751 ; LAST_NFA ; ----- RAM_ORG + $1D8 : Forth compiler variables
755 ; SD_BUF_I2CADR < ----- RAM_ORG + $1FC
757 ; SD_BUF < ----- RAM_ORG + $200
759 SD_BUF_LEN .equ 200h ; 512 bytes buffer
761 ; SD_BUF_END < ----- RAM_ORG + $400
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
775 HOLD_BASE .equ HOLDS_ORG+HOLD_LEN
777 ; ----------------------------------------------------
778 ; RAM_ORG + $1B2 : RAM VARIABLES
779 ; ----------------------------------------------------
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 ; ----------------------------------------------------
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 ; ----------------------------------------------------
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 ; ----------------------------------------------------
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 ; --------------------------------------------------
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 !)
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 ; ---------------------------------------
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 ; ---------------------------------------
861 ; ---------------------------------------
862 BufferPtr .equ SD_LOW_LEVEL+10
863 BufferLen .equ SD_LOW_LEVEL+12
864 ; ---------------------------------------
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 ; ---------------------------------------
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 ; ---------------------------------------
890 ; ---------------------------------------
891 FirstHandle .equ SD_FAT_LEVEL+22
892 ; three handle tokens :
893 ; HDLB_Token= 0 : free handle
895 ; = 2 : file updated (write)
896 ; =-1 : LOAD"ed file (source file)
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
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)
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
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
936 SD_LEN .equ SD_END-SD_ORG
937 .ENDIF ; SD_CARD_LOADER
939 .cpu MSP430X ; define CPU
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
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
954 R .reg r4 ; rDOCOL alias
955 Q .reg r5 ; rDODOES alias
956 P .reg r6 ; rDOCON alias
957 M .reg R7 ; rDOVAR alias
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)
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
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.
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)
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.
999 mDOCOL .MACRO ; compiled by : and by COLON
1001 CALL rDOCOL ; 10 [rDOCOL] = EXIT
1002 .ENDM ; 2 words, 13 cycles (ITC+3). COLON + SEMI = 3 words, 19 cycles (ITC+1)
1004 .CASE 3 ; inlined DOCOL
1005 mASM2FORTH .MACRO ; compiled by LO2HI
1008 MOV @IP+,PC ; 4 NEXT
1009 .ENDM ; 3 words, 6 cycles. LO2HI + HI2LO = 4 words, 6 cycles.
1011 mDOCOL .MACRO ; compiled by : and by COLON
1015 MOV @IP+,PC ; 4 NEXT
1016 .ENDM ; 4 words, 9 cycles (ITC-1). COLON + SEMI = 5 words, 15 cycles (ITC-3)
1025 ;-------------------------------------------------------------------------------
1026 ; INFO(DCBA) >= 256 bytes memory map (FRAM) :
1027 ;-------------------------------------------------------------------------------
1028 ; FRAM INFO: KERNEL INIT CONSTANTS and VARIABLES
1029 ; ----------------------------------------------
1031 FREQ_KHZ .word FREQUENCY ; used to stabilize MCLK before start, see MSP430FRxxxx.asm
1033 FREQ_KHZ .word FREQUENCY*1000 ; used to stabilize MCLK before start, see MSP430FRxxxx.asm
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
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
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
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)
1083 INIT_DOCOL .word xDOCOL ; MOV @X+,rDOCOL ; INIT_DOCOL --> rDOCOL (R4)
1085 INIT_DOCOL .word EXIT ; MOV @X+,rDOCOL ; INIT_DOCOL --> rDOCOL (R4)
1087 INIT_DOCOL .word 0 ; MOV @X+,R4 ; useless rDOCOL
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
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
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)
1124 ; --------------------------------------;
1125 .word 0 ; NULL_WORD, always 0
1126 ; --------------------------------------;
1128 ; --------------------------;
1129 ; INFO_ORG + $60 : free use ;
1130 ; --------------------------;