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 #include #include #include #include -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 #include +#ifdef ALEE_MSP430 +#include +#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 dict (alee_dat, 0x10000); +static SplitMemDictRW 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) } }