IPS(Interpreter for Process Structures) for mbed

Dependencies:   ConfigFile FATFileSystem mbed

IPS port from linux/unix version.

mbed_blinky.ips

0 VAR led1
" LED1 " DigitalOut led1 !
: main
    ANFANG
    1 JA?
      1 led1 @ write
      200 wait_ms
      0 led1 @ write
      200 wait_ms
    DANN/NOCHMAL
;
main
Committer:
va009039
Date:
Sun May 24 21:29:48 2015 +0900
Revision:
4:b62b40563944
Parent:
3:9f526f0d9720
fix I2C

Who changed what in which revision?

UserRevisionLine numberNew contents of line
va009039 2:908338b1151a 1 // main.cpp 2015/5/23
va009039 2:908338b1151a 2 #include <new>
va009039 1:e74530ad6b9e 3 #include "mbed.h"
va009039 1:e74530ad6b9e 4 #include "BaseIPS.h"
va009039 1:e74530ad6b9e 5 #include "VideoRAM.h"
va009039 1:e74530ad6b9e 6 #include "VirtualRAM.h"
va009039 2:908338b1151a 7 #include "IPS-Mmbed_bin.h"
va009039 2:908338b1151a 8 #include "mbedAPI.h"
va009039 1:e74530ad6b9e 9 #include "ConfigFile.h"
va009039 4:b62b40563944 10 #include "SDFileSystem.h"
va009039 1:e74530ad6b9e 11
va009039 2:908338b1151a 12 const char* CFG_FILE = "/local/ips.cfg";
va009039 1:e74530ad6b9e 13
va009039 3:9f526f0d9720 14 #if defined(TARGET_MBED_LPC1768)
va009039 4:b62b40563944 15 #if defined(TOOLCHAIN_GCC)||defined(TOOLCHAIN_GCC_ARM)
va009039 4:b62b40563944 16 SDFileSystem local(MBED_SPI0, "local"); // mosi, miso, sclk, cs, name
va009039 3:9f526f0d9720 17 #else
va009039 4:b62b40563944 18 LocalFileSystem local("local");
va009039 4:b62b40563944 19 #endif
va009039 4:b62b40563944 20 #else
va009039 3:9f526f0d9720 21 SDFileSystem local(D11, D12, D13, D4, "local"); // mosi, miso, sclk, cs, name
va009039 1:e74530ad6b9e 22 #endif
va009039 1:e74530ad6b9e 23
va009039 1:e74530ad6b9e 24 RawSerial pc(USBTX,USBRX);
va009039 1:e74530ad6b9e 25
va009039 2:908338b1151a 26 template<class SERIAL_T>
va009039 1:e74530ad6b9e 27 class myips : public BaseIPS {
va009039 2:908338b1151a 28 VideoRAM<SERIAL_T> vram;
va009039 1:e74530ad6b9e 29 VirtualRAM mem;
va009039 2:908338b1151a 30 SERIAL_T& _pc;
va009039 2:908338b1151a 31 mbedAPI mbedapi;
va009039 1:e74530ad6b9e 32 Timer t20ms;
va009039 1:e74530ad6b9e 33 public:
va009039 2:908338b1151a 34 myips(SERIAL_T& pc): vram(pc),_pc(pc),mbedapi(*this) {
va009039 1:e74530ad6b9e 35 t20ms.reset();
va009039 1:e74530ad6b9e 36 t20ms.start();
va009039 1:e74530ad6b9e 37 }
va009039 2:908338b1151a 38 virtual uint8_t mem_peek(uint16_t a) {
va009039 1:e74530ad6b9e 39 return mem.peek(a);
va009039 1:e74530ad6b9e 40 }
va009039 2:908338b1151a 41 virtual void mem_poke(uint16_t a, uint8_t b) {
va009039 1:e74530ad6b9e 42 mem.poke(a, b);
va009039 1:e74530ad6b9e 43 vram.vpoke(a, b);
va009039 1:e74530ad6b9e 44 }
va009039 1:e74530ad6b9e 45 virtual void* file_open(const char* filename, const char* mode) {
va009039 2:908338b1151a 46 if (filename[0] == '/') {
va009039 2:908338b1151a 47 return fopen(filename, mode);
va009039 2:908338b1151a 48 }
va009039 2:908338b1151a 49 char path[128];
va009039 2:908338b1151a 50 snprintf(path, sizeof(path), "/local/%s", filename);
va009039 2:908338b1151a 51 return fopen(path, mode);
va009039 1:e74530ad6b9e 52 }
va009039 1:e74530ad6b9e 53 virtual int file_getc(void* handle) {
va009039 1:e74530ad6b9e 54 int c = fgetc((FILE*)handle);
va009039 1:e74530ad6b9e 55 return c == EOF ? (-1) : c;
va009039 1:e74530ad6b9e 56 }
va009039 1:e74530ad6b9e 57 virtual void file_putc(int c, void* handle) {
va009039 1:e74530ad6b9e 58 fputc(c, (FILE*)handle);
va009039 1:e74530ad6b9e 59 }
va009039 1:e74530ad6b9e 60 virtual bool file_close(void* handle) {
va009039 2:908338b1151a 61 return fclose((FILE*)handle) == 0 ? true : false;
va009039 1:e74530ad6b9e 62 }
va009039 1:e74530ad6b9e 63 virtual bool test_20ms() {
va009039 1:e74530ad6b9e 64 if (t20ms.read_ms() >= 20) {
va009039 1:e74530ad6b9e 65 t20ms.reset();
va009039 1:e74530ad6b9e 66 return true;
va009039 1:e74530ad6b9e 67 }
va009039 1:e74530ad6b9e 68 return false;
va009039 1:e74530ad6b9e 69 }
va009039 1:e74530ad6b9e 70
va009039 1:e74530ad6b9e 71 virtual void do_io() {
va009039 1:e74530ad6b9e 72 if (_pc.readable()) {
va009039 1:e74530ad6b9e 73 int c = _pc.getc();
va009039 1:e74530ad6b9e 74 if (c == '\n' || c == '\r') {
va009039 1:e74530ad6b9e 75 if (input_ptr != peek(a_PI)) {
va009039 1:e74530ad6b9e 76 pokeB(READYFLAG, 1);
va009039 1:e74530ad6b9e 77 poke(a_PE, input_ptr - 1);
va009039 1:e74530ad6b9e 78 }
va009039 1:e74530ad6b9e 79 else if (c == 0x08) // BS
va009039 1:e74530ad6b9e 80 if (input_ptr > 0) {
va009039 1:e74530ad6b9e 81 input_ptr--;
va009039 1:e74530ad6b9e 82 }
va009039 1:e74530ad6b9e 83 } else {
va009039 1:e74530ad6b9e 84 if (input_ptr <= TVE) {
va009039 1:e74530ad6b9e 85 pokeB(input_ptr++, c);
va009039 1:e74530ad6b9e 86 }
va009039 1:e74530ad6b9e 87 }
va009039 1:e74530ad6b9e 88 }
va009039 1:e74530ad6b9e 89 }
va009039 2:908338b1151a 90 virtual void usercode(uint16_t cpc) {
va009039 2:908338b1151a 91 switch(cpc) {
va009039 2:908338b1151a 92 case 80: break; // c_sleepifidle(void)
va009039 2:908338b1151a 93 case 96: mbedapi.code(); break;
va009039 2:908338b1151a 94 default: error("code(#%x) not implemented!", cpc);
va009039 2:908338b1151a 95 }
va009039 2:908338b1151a 96 }
va009039 1:e74530ad6b9e 97 };
va009039 1:e74530ad6b9e 98
va009039 2:908338b1151a 99 void no_memory () {
va009039 2:908338b1151a 100 perror("Failed to allocate memory!");
va009039 2:908338b1151a 101 }
va009039 2:908338b1151a 102
va009039 1:e74530ad6b9e 103 int main() {
va009039 2:908338b1151a 104 std::set_new_handler(no_memory);
va009039 2:908338b1151a 105
va009039 2:908338b1151a 106 char* image = NULL;
va009039 2:908338b1151a 107 char* cmd = NULL;
va009039 2:908338b1151a 108 if (CFG_FILE) {
va009039 2:908338b1151a 109 ConfigFile cfg;
va009039 2:908338b1151a 110 if(cfg.read(const_cast<char*>(CFG_FILE))) {
va009039 2:908338b1151a 111 char buf[128];
va009039 2:908338b1151a 112 if (cfg.getValue(const_cast<char*>("image"), buf, sizeof(buf))) {
va009039 2:908338b1151a 113 static char buf2[128];
va009039 2:908338b1151a 114 snprintf(buf2, sizeof(buf2), "%s", buf);
va009039 2:908338b1151a 115 image = buf2;
va009039 2:908338b1151a 116 }
va009039 2:908338b1151a 117 if (cfg.getValue(const_cast<char*>("file"), buf, sizeof(buf))) {
va009039 2:908338b1151a 118 static char buf2[128];
va009039 2:908338b1151a 119 snprintf(buf2, sizeof(buf2), "\" %s \" READ", buf);
va009039 2:908338b1151a 120 cmd = buf2;
va009039 2:908338b1151a 121 }
va009039 2:908338b1151a 122 if (cfg.getValue(const_cast<char*>("cmd"), buf, sizeof(buf))) {
va009039 2:908338b1151a 123 cmd = buf;
va009039 2:908338b1151a 124 }
va009039 1:e74530ad6b9e 125 }
va009039 1:e74530ad6b9e 126 }
va009039 1:e74530ad6b9e 127
va009039 2:908338b1151a 128 myips<RawSerial> ips(pc);
va009039 2:908338b1151a 129 if (image != NULL) {
va009039 2:908338b1151a 130 void* fh = ips.file_open(image, "rb");
va009039 2:908338b1151a 131 if (fh == NULL) {
va009039 2:908338b1151a 132 pc.printf("file open error [%s]\n", image);
va009039 2:908338b1151a 133 image = NULL;
va009039 2:908338b1151a 134 } else {
va009039 2:908338b1151a 135 for(int i = 0; i <= 65535; i++) {
va009039 2:908338b1151a 136 int c = ips.file_getc(fh);
va009039 2:908338b1151a 137 if (c == (-1)) {
va009039 2:908338b1151a 138 break;
va009039 2:908338b1151a 139 }
va009039 2:908338b1151a 140 ips.pokeB(i, c);
va009039 1:e74530ad6b9e 141 }
va009039 2:908338b1151a 142 ips.file_close(fh);
va009039 1:e74530ad6b9e 143 }
va009039 1:e74530ad6b9e 144 }
va009039 2:908338b1151a 145 if (image == NULL) {
va009039 2:908338b1151a 146 for(size_t i = 0; i < sizeof(IPS_Mmbed_bin); i++) {
va009039 2:908338b1151a 147 ips.pokeB(i, IPS_Mmbed_bin[i]);
va009039 2:908338b1151a 148 }
va009039 1:e74530ad6b9e 149 }
va009039 2:908338b1151a 150 if (cmd) {
va009039 2:908338b1151a 151 ips.command(cmd);
va009039 2:908338b1151a 152 }
va009039 2:908338b1151a 153 ips.emulator();
va009039 2:908338b1151a 154 std::exit(1);
va009039 1:e74530ad6b9e 155 }
va009039 1:e74530ad6b9e 156