aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorClyne Sullivan <clyne@bitgloo.com>2023-11-11 09:21:21 -0500
committerClyne Sullivan <clyne@bitgloo.com>2023-11-11 09:21:21 -0500
commit957cf676ff1dbf5973b7ad04d843400a647fab14 (patch)
tree711ca81f12cd2ecf18b3d4bd61acaa4a0b1a4d6e
parent494bd41b64a6cf9c1404a7716af40d2266771d1e (diff)
msp430: more dict space; prepare for hal impl
-rw-r--r--Makefile12
-rw-r--r--alee-standalone.cpp3
-rw-r--r--alee.cpp56
-rw-r--r--forth/core.fth4
-rw-r--r--forth/msp430.fth55
-rw-r--r--msp430/alee-msp430.cpp11
-rw-r--r--msp430/msp430fr2476.ld53
7 files changed, 143 insertions, 51 deletions
diff --git a/Makefile b/Makefile
index 442b73c..b1237b6 100644
--- a/Makefile
+++ b/Makefile
@@ -15,9 +15,11 @@ msp430: AR := msp430-elf-gcc-ar
msp430: CXXFLAGS += -I. -I/usr/msp430-elf/usr/include
msp430: CXXFLAGS += -Os -mmcu=msp430fr2476 -ffunction-sections -fdata-sections
msp430: CXXFLAGS += -flto -fno-asynchronous-unwind-tables -fno-threadsafe-statics -fno-stack-protector
-msp430: LDFLAGS += -L msp430 -T msp430fr2476.ld -Wl,-gc-sections
+msp430: LDFLAGS += -L msp430 -T msp430fr2476.ld -Wl,-gc-sections -Wl,--no-warn-rwx-segments
msp430: msp430/alee-msp430
+msp430-prep: CXXFLAGS += -DALEE_MSP430 -Imsp430
+msp430-prep: msp430/msp430fr2476_all.h
msp430-prep: STANDALONE += forth/core-ext.fth forth/tools.fth forth/msp430.fth
msp430-prep: core.fth.h
msp430-prep: clean-lib
@@ -28,11 +30,12 @@ small: alee
fast: CXXFLAGS += -O3 -march=native -mtune=native -flto
fast: alee
+standalone: core.fth.h
standalone: alee-standalone
alee: $(LIBFILE)
msp430/alee-msp430: $(LIBFILE)
-alee-standalone: core.fth.h $(LIBFILE)
+alee-standalone: $(LIBFILE)
cppcheck:
cppcheck --enable=warning,style,information --disable=missingInclude \
@@ -46,11 +49,14 @@ $(LIBFILE): $(OBJFILES)
core.fth.h: alee.dat
xxd -i $< > $@
- sed -i "s/unsigned /static &/" $@
+ sed -i "s/\[\]/\[ALEE_RODICTSIZE\]/" $@
alee.dat: alee $(STANDALONE)
echo "3 sys" | ./alee $(STANDALONE)
+msp430/msp430fr2476_all.h:
+ $(MAKE) -C msp430
+
clean: clean-lib
rm -f alee alee-standalone msp430/alee-msp430
rm -f alee.dat core.fth.h
diff --git a/alee-standalone.cpp b/alee-standalone.cpp
index 5681dbf..2ab9b71 100644
--- a/alee-standalone.cpp
+++ b/alee-standalone.cpp
@@ -19,12 +19,13 @@
#include "alee.hpp"
#include "splitmemdict.hpp"
+#include <array>
#include <charconv>
#include <fstream>
#include <iostream>
#include <vector>
-alignas(sizeof(Cell))
+#define ALEE_RODICTSIZE
#include "core.fth.h"
static bool okay = false;
diff --git a/alee.cpp b/alee.cpp
index 55cae57..a154017 100644
--- a/alee.cpp
+++ b/alee.cpp
@@ -24,6 +24,14 @@
#include <iostream>
#include <vector>
+#ifdef ALEE_MSP430
+#include <cstring>
+#include "lzss.h"
+static const
+#include "msp430fr2476_all.h"
+static Error findword(State&, Word);
+#endif // ALEE_MSP430
+
static bool okay = false;
static void readchar(State&);
@@ -34,6 +42,9 @@ int main(int argc, char *argv[])
{
MemDict dict;
State state (dict, readchar);
+#ifdef ALEE_MSP430
+ Parser::customParse = findword;
+#endif // ALEE_MSP430
dict.initialize();
@@ -153,3 +164,48 @@ void parseFile(State& state, std::istream& file)
}
}
+#ifdef ALEE_MSP430
+#define LZSS_MAGIC_SEPARATOR (0xFB)
+
+static char lzword[32];
+static int lzwlen;
+static char lzbuf[32];
+static char *lzptr;
+
+Error findword(State& state, Word word)
+{
+ char *ptr = lzword;
+ for (auto it = word.begin(&state.dict); it != word.end(&state.dict); ++it) {
+ *ptr = *it;
+ if (islower(*ptr))
+ *ptr -= 32;
+ ++ptr;
+ }
+ lzwlen = (int)(ptr - lzword);
+
+ lzptr = lzbuf;
+ lzssinit(msp430fr2476_all_lzss, msp430fr2476_all_lzss_len);
+
+ auto ret = decode([](int c) {
+ if (c != LZSS_MAGIC_SEPARATOR) {
+ *lzptr++ = (char)c;
+ } else {
+ if (lzwlen == lzptr - lzbuf - 2 && strncmp(lzword, lzbuf, lzptr - lzbuf - 2) == 0) {
+ lzwlen = (*(lzptr - 2) << 8) | *(lzptr - 1);
+ return 1;
+ } else {
+ lzptr = lzbuf;
+ }
+ }
+ return 0;
+ });
+
+ if (ret == EOF) {
+ return Error::noword;
+ } else {
+ Parser::processLiteral(state, (Cell)lzwlen);
+ return Error::none;
+ }
+}
+#endif // ALEE_MSP430
+
diff --git a/forth/core.fth b/forth/core.fth
index 64007c0..4ab6721 100644
--- a/forth/core.fth
+++ b/forth/core.fth
@@ -151,7 +151,9 @@
: ( begin [char] ) key <> while repeat ; imm
-: type begin dup 0 > while swap dup c@ emit char+ swap 1- repeat 2drop ;
+: _type >r begin dup 0 > while
+ swap dup c@ r@ execute char+ swap 1- repeat 2drop r> drop ;
+: type [ ' emit ] literal _type ;
: s" state @ if ['] _jmp , here 0 , then
[char] " word count
state @ 0= if exit then
diff --git a/forth/msp430.fth b/forth/msp430.fth
index ef8bf60..f415b2a 100644
--- a/forth/msp430.fth
+++ b/forth/msp430.fth
@@ -17,3 +17,58 @@
: toggle ( b r reg/byte -- )
>r over r> execute >r rot r> ^ -rot execute ;
+create _outs p1out , p2out , p3out , p4out , p5out , p6out ,
+create _ins p1in , p2in , p3in , p4in , p5in , p6in ,
+create _dirs p1dir , p2dir , p3dir , p4dir , p5dir , p6dir ,
+create _sel0 p1sel0 , p2sel0 , p3sel0 , p4sel0 , p5sel0 , p6sel0 ,
+create _sel1 p1sel1 , p2sel1 , p3sel1 , p4sel1 , p5sel1 , p6sel1 ,
+
+1 constant output
+0 constant input
+
+: pin-mode ( output? pin port -- )
+ rot >r cells _dirs + @ byte r> if set else clear then ;
+
+: pin-set ( high? pin port -- )
+ rot >r cells _outs + @ byte r> if set else clear then ;
+
+: pin-get ( pin port -- high? )
+ cells _ins + @ byte@ swap and 0 > ;
+
+: analog-init
+ adcon adcsht_2 or adcctl0 reg set
+ adcshp adcctl1 reg set
+ adcres adcctl2 reg clear
+ adcres_2 adcctl2 reg set
+ adcie0 adcie reg set ;
+
+: D0 bit5 1 ;
+: D1 bit6 1 ;
+: D2 bit1 2 ;
+: D3 bit4 1 ;
+: D4 bit7 2 ;
+: D5 bit0 3 ;
+: D6 bit1 3 ;
+: D7 bit7 3 ;
+: D8 bit6 3 ;
+: D9 bit5 3 ;
+: D10 bit4 4 ;
+: D11 bit2 2 ;
+: D12 bit6 2 ;
+: D13 bit5 2 ;
+
+: A0 bit0 0 ;
+: A1 bit1 0 ;
+: A2 bit5 0 ;
+: A3 bit6 0 ;
+: A4 bit2 0 ;
+: A5 bit3 0 ;
+: AREF bit4 0 ;
+
+: LED1R bit1 5 ;
+: LED1G bit0 5 ;
+: LED1B bit2 5 ;
+
+: LED2R bit6 4 ;
+: LED2G bit5 4 ;
+: LED2B bit7 4 ;
diff --git a/msp430/alee-msp430.cpp b/msp430/alee-msp430.cpp
index 06960b5..48a806e 100644
--- a/msp430/alee-msp430.cpp
+++ b/msp430/alee-msp430.cpp
@@ -27,10 +27,6 @@ static const
#include "splitmemdictrw.hpp"
-alignas(sizeof(Cell))
-__attribute__((section(".lodict")))
-#include "core.fth.h"
-
static char strbuf[80];
static void readchar(State& state);
@@ -46,12 +42,13 @@ static void initUART();
static void Software_Trim();
#define MCLK_FREQ_MHZ (8) // MCLK = 8MHz
-//__attribute__((section(".hidict")))
-//static uint8_t hidict[32767];
+#define ALEE_RODICTSIZE (7000)
+__attribute__((section(".lodict")))
+#include "core.fth.h"
static bool exitLpm;
static Addr isr_list[24] = {};
-static SplitMemDictRW<sizeof(alee_dat), 32767> dict (alee_dat, 0x10000);
+static SplitMemDictRW<ALEE_RODICTSIZE, 32767> dict (alee_dat, 0x10000);
int main()
{
diff --git a/msp430/msp430fr2476.ld b/msp430/msp430fr2476.ld
index fce197c..9a2b089 100644
--- a/msp430/msp430fr2476.ld
+++ b/msp430/msp430fr2476.ld
@@ -46,9 +46,8 @@ MEMORY {
BSL1 : ORIGIN = 0xFFC00, LENGTH = 0x0400 /* END=0xFFFFF, size 1024 */
RAM : ORIGIN = 0x2000, LENGTH = 0x2000 /* END=0x3FFF, size 8192 */
INFOMEM : ORIGIN = 0x1800, LENGTH = 0x0200 /* END=0x19FF, size 512 */
- FRAM (rx) : ORIGIN = 0x8000, LENGTH = 0x6600 /* END=0xAFFF, size 9216 */
- LOFRAM (rxw) : ORIGIN = 0xE600, LENGTH = 0x1980 /* END=0xFF7F, size 23424 */
- HIFRAM (rxw) : ORIGIN = 0x00010000, LENGTH = 0x00007FFF
+ FRAM (rwx) : ORIGIN = 0x8000, LENGTH = 0x7F80 /* END=0xFF7F, size 32640 */
+ HIFRAM (rxw) : ORIGIN = 0x10000, LENGTH = 0x00007FFF
JTAGSIGNATURE : ORIGIN = 0xFF80, LENGTH = 0x0004
BSLSIGNATURE : ORIGIN = 0xFF84, LENGTH = 0x0004
BSLCONFIGURATIONSIGNATURE : ORIGIN = 0xFF88, LENGTH = 0x0002
@@ -164,12 +163,6 @@ SECTIONS
KEEP (*(.resetvec))
} > RESETVEC
- .lower.rodata :
- {
- . = ALIGN(2);
- *(.lower.rodata.* .lower.rodata)
- } > FRAM
-
.rodata :
{
. = ALIGN(2);
@@ -238,16 +231,10 @@ SECTIONS
.tinyram : {} > TINYRAM
- .lower.data :
- {
- . = ALIGN(2);
- PROVIDE (__datastart = .);
- *(.lower.data.* .lower.data)
- } > RAM AT> FRAM
-
.data :
{
. = ALIGN(2);
+ PROVIDE (__datastart = .);
KEEP (*(.jcr))
*(.data.rel.ro.local) *(.data.rel.ro*)
@@ -274,19 +261,13 @@ SECTIONS
/* Note that crt0 assumes this is a multiple of two; all the
start/stop symbols are also assumed word-aligned. */
- PROVIDE(__romdatastart = LOADADDR(.lower.data));
- PROVIDE (__romdatacopysize = SIZEOF(.lower.data) + SIZEOF(.data));
-
- .lower.bss :
- {
- . = ALIGN(2);
- PROVIDE (__bssstart = .);
- *(.lower.bss.* .lower.bss)
- } > RAM
+ PROVIDE(__romdatastart = LOADADDR(.data));
+ PROVIDE (__romdatacopysize = SIZEOF(.data));
.bss :
{
. = ALIGN(2);
+ PROVIDE (__bssstart = .);
*(.dynbss)
*(.sbss .sbss.*)
*(.bss .bss.* .gnu.linkonce.b.*)
@@ -294,7 +275,7 @@ SECTIONS
*(COMMON)
PROVIDE (__bssend = .);
} > RAM
- PROVIDE (__bsssize = SIZEOF(.lower.bss) + SIZEOF(.bss));
+ PROVIDE (__bsssize = SIZEOF(.bss));
/* This section contains data that is not initialised during load
or application reset. */
@@ -336,18 +317,6 @@ SECTIONS
*(.stack)
}
- .lower.text :
- {
- . = ALIGN(2);
- *(.lower.text.* .lower.text)
- } > FRAM
-
- .lodict :
- {
- . = ALIGN(2);
- *(.lodict)
- } > LOFRAM
-
.hidict :
{
. = ALIGN(2);
@@ -380,6 +349,12 @@ SECTIONS
KEEP (*(.tm_clone_table))
} > FRAM
+ .lodict :
+ {
+ . = ALIGN(2);
+ *(.lodict)
+ } > FRAM
+
.info (NOLOAD) : {} > INFOMEM /* MSP430 INFO FLASH MEMORY SEGMENTS */
/* The rest are all not normally part of the runtime image. */
@@ -430,7 +405,7 @@ SECTIONS
/* DWARF Extension. */
.debug_macro 0 : { *(.debug_macro) }
- /DISCARD/ : { *(.note.GNU-stack) }
+ /DISCARD/ : { *(.note.GNU-stack .debug_loclists) }
}