diff options
author | Clyne Sullivan <clyne@bitgloo.com> | 2023-11-11 09:21:21 -0500 |
---|---|---|
committer | Clyne Sullivan <clyne@bitgloo.com> | 2023-11-11 09:21:21 -0500 |
commit | 957cf676ff1dbf5973b7ad04d843400a647fab14 (patch) | |
tree | 711ca81f12cd2ecf18b3d4bd61acaa4a0b1a4d6e | |
parent | 494bd41b64a6cf9c1404a7716af40d2266771d1e (diff) |
msp430: more dict space; prepare for hal impl
-rw-r--r-- | Makefile | 12 | ||||
-rw-r--r-- | alee-standalone.cpp | 3 | ||||
-rw-r--r-- | alee.cpp | 56 | ||||
-rw-r--r-- | forth/core.fth | 4 | ||||
-rw-r--r-- | forth/msp430.fth | 55 | ||||
-rw-r--r-- | msp430/alee-msp430.cpp | 11 | ||||
-rw-r--r-- | msp430/msp430fr2476.ld | 53 |
7 files changed, 143 insertions, 51 deletions
@@ -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; @@ -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) }
}
|