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
500 CONDCOMP ; mandatory for Bootstrap
510 .IFNDEF MSP430ASSEMBLER
519 .IFNDEF FIXPOINT_INPUT
520 FIXPOINT_INPUT ; to interpret fixpoint numbers
523 .IFDEF FIXPOINT_INPUT
524 .IFNDEF DOUBLE_NUMBERS
525 DOUBLE_NUMBERS ; to process double numbers
529 .IFNDEF DOUBLE_NUMBERS
530 DOUBLE_NUMBERS ; to process double numbers
534 ; --------------------------
535 ; COMPUTE BAUDRATE registers = fn(FREQUENCY,BAUDS)
536 ; --------------------------
538 .include "TERMINALBAUDRATE.inc"
540 ;-----------------------------------------------------------------------
541 ; DEVICE I/O, MEMORY, SFR, vectors and minimum FORTH I/O declarations
542 ;-----------------------------------------------------------------------
545 .IFDEF MSP_EXP430FR5739
547 .IFNDEF UART_TERMINAL
552 .include "MSP430FR5739.inc"
554 .IFDEF MSP_EXP430FR5969
557 .IFNDEF UART_TERMINAL
563 .include "MSP430FR5969.inc"
565 .IFDEF MSP_EXP430FR5994
568 .IFNDEF UART_TERMINAL
574 .include "MSP430FR5994.inc"
576 .IFDEF MSP_EXP430FR6989
579 .IFNDEF UART_TERMINAL
585 .INCLUDE "MSP430FR6989.inc"
587 .IFDEF MSP_EXP430FR5972
590 .IFNDEF UART_TERMINAL
596 .INCLUDE "MSP430FR5972.inc"
598 .IFDEF MSP_EXP430FR4133
600 .IFNDEF UART_TERMINAL
607 .INCLUDE "MSP430FR4133.inc"
609 .IFDEF MSP_EXP430FR2433
611 .IFNDEF UART_TERMINAL
617 .include "MSP430FR2433.inc"
619 .IFDEF CHIPSTICK_FR2433
620 ; no LF_XTAL to select ACLK = REFOCLK
621 .IFNDEF UART_TERMINAL
628 .include "MSP430FR2433.inc"
630 .IFDEF MSP_EXP430FR2355
632 .IFNDEF UART_TERMINAL
638 .include "MSP430FR2355.inc"
640 .IFDEF LP_MSP430FR2476
642 ; LF_XTAL ; connect resistors R2=0k, R3=0k before uncomment this line
643 .IFNDEF UART_TERMINAL
649 .include "MSP430FR2476.inc"
652 ; vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv
653 ; add here your device.inc item:
654 ;^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
657 ; ---------------------------
658 ; compute value of FORTHADDON
659 ; ---------------------------
660 ; .IFDEF FLOORED_DIVISION
661 ;FADDON .SET FADDON | BIT15 ; FLOORED_DIVISION
664 FADDON .SET FADDON | BIT14 ; LFXTAL = 32768 Hz
666 .IFDEF UART_TERMINAL ; if TERMINAL UART...
667 .IFDEF TERMINAL5WIRES
668 FADDON .SET FADDON | BIT13 ; UART CTS
670 .IFDEF TERMINAL4WIRES
671 FADDON .SET FADDON | BIT12 ; UART RTS
673 .IFDEF TERMINAL3WIRES
674 FADDON .SET FADDON | BIT11 ; UART XON/XOFF
677 FADDON .SET FADDON | BIT10 ; UART Half Duplex
679 .ENDIF ; TERMINAL UART
680 ; ---------------------------
681 .IFNDEF UART_TERMINAL
682 FADDON .SET FADDON | BIT9 ; I2C TERMINAL
684 .IFDEF FIXPOINT_INPUT
685 FADDON .SET FADDON | BIT8 ; Q15.16 INPUT
688 FADDON .SET FADDON | BIT7 ; DOUBLE INPUT
690 ; ---------------------------
691 .IFDEF EXTENDED_ASM ; Assembler 20 bits
692 FADDON .SET FADDON | BIT6
694 ; .IFDEF MSP430ASSEMBLER
695 FADDON .SET FADDON | BIT5 ; Assembler 16 bits
699 FADDON .SET FADDON | BIT4 ; Assembler 16 bits with Address access beyond $FFFF
702 .IFDEF HMPY ; see device.inc
703 FADDON .SET FADDON | BIT3 ; hardware MPY
705 ; ---------------------------
706 ; BIT2 to BIT0 are free
707 ; ---------------------------
710 ;-------------------------------------------------------------------------------
711 ; DTCforthMSP430FR5xxx RAM memory map:
712 ;-------------------------------------------------------------------------------
714 ;---------------------------;---------
715 ; name words ; comment
716 ;------------------=====----;---------
717 ;LSTACK = L0 = LEAVEPTR ; ----- RAM_ORG
719 LSTACK_LEN .equ 16 ; | grows up
722 PSTACK_LEN .equ 48 ; | grows down
724 ;PSTACK=S0 ; ----- RAM_ORG + $80
726 RSTACK_LEN .equ 48 ; | grows down
728 ;RSTACK=R0 ; ----- RAM_ORG + $E0
730 ;---------------------------;---------
731 ; names bytes ; comments
732 ;------------------=====----;---------
733 ; PAD_I2CADR ; ----- RAM_ORG + $E0
735 ; PAD < ----- RAM_ORG + $E4
737 PAD_LEN .equ 84 ; | grows up (ans spec. : PAD >= 84 chars)
739 ; TIB_I2CADR ; ----- RAM_ORG + $138
741 ; TIB < ----- RAM_ORG + $13C
743 CIB_LEN .equ 84 ; | grows up Current Input Buffer (ans spec. : TIB >= 80 chars)
745 ; HOLDS_ORG < ------RAM_ORG + $190
747 HOLD_LEN .equ 34 ; | grows down (ans spec. : HOLD_LEN >= (2*n) + 2 char, with n = 16 bits/cell
749 ; HOLD_BASE < ----- RAM_ORG + $1B2
753 ; LAST_NFA ; ----- RAM_ORG + $1D8 : Forth compiler variables
757 ; SD_BUF_I2CADR < ----- RAM_ORG + $1FC
759 ; SD_BUF < ----- RAM_ORG + $200
761 SD_BUF_LEN .equ 200h ; 512 bytes buffer
763 ; SD_BUF_END < ----- RAM_ORG + $400
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
777 HOLD_BASE .equ HOLDS_ORG+HOLD_LEN
779 ; ----------------------------------------------------
780 ; RAM_ORG + $1B2 : RAM VARIABLES
781 ; ----------------------------------------------------
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 ; ----------------------------------------------------
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 ; ----------------------------------------------------
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 ; ----------------------------------------------------
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 ; --------------------------------------------------
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
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 ; ---------------------------------------
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 ; ---------------------------------------
864 ; ---------------------------------------
865 BufferPtr .equ SD_LOW_LEVEL+10
866 BufferLen .equ SD_LOW_LEVEL+12
867 ; ---------------------------------------
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 ; ---------------------------------------
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 ; ---------------------------------------
893 ; ---------------------------------------
894 FirstHandle .equ SD_FAT_LEVEL+22
895 ; three handle tokens :
896 ; HDLB_Token= 0 : free handle
898 ; = 2 : file updated (write)
899 ; =-1 : LOAD"ed file (source file)
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
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)
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
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
937 SD_LEN .equ SD_END-SD_ORG
938 .ENDIF ; SD_CARD_LOADER
940 .cpu MSP430X ; define CPU
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
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
955 R .reg r4 ; rDOCOL alias
956 Q .reg r5 ; rDODOES alias
957 P .reg r6 ; rDOCON alias
958 M .reg R7 ; rDOVAR alias
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)
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
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.
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)
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.
1000 mDOCOL .MACRO ; compiled by : and by COLON
1002 CALL rDOCOL ; 10 [rDOCOL] = EXIT
1003 .ENDM ; 2 words, 13 cycles (ITC+3). COLON + SEMI = 3 words, 19 cycles (ITC+1)
1005 .CASE 3 ; inlined DOCOL
1006 mASM2FORTH .MACRO ; compiled by LO2HI
1009 MOV @IP+,PC ; 4 NEXT
1010 .ENDM ; 3 words, 6 cycles. LO2HI + HI2LO = 4 words, 6 cycles.
1012 mDOCOL .MACRO ; compiled by : and by COLON
1016 MOV @IP+,PC ; 4 NEXT
1017 .ENDM ; 4 words, 9 cycles (ITC-1). COLON + SEMI = 5 words, 15 cycles (ITC-3)
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
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
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
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)
1077 INIT_DOCOL .word xDOCOL ; MOV @X+,rDOCOL ; INIT_DOCOL --> rDOCOL (R4)
1079 INIT_DOCOL .word EXIT ; MOV @X+,rDOCOL ; INIT_DOCOL --> rDOCOL (R4)
1081 INIT_DOCOL .word 0 ; MOV @X+,R4 ; useless rDOCOL
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
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
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)
1117 ; --------------------------------------;
1118 .word 0 ; NULL_WORD, always 0
1119 ; --------------------------------------;
1121 ; --------------------------;
1122 ; INFO_ORG + $5A : free use ;
1123 ; --------------------------;