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
- ips-02.tgz - ips for linux/unix
- ipsdoc.zip - document
- https://bitbucket.org/va009039/ips/
main.cpp@4:b62b40563944, 2015-05-24 (annotated)
- 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?
User | Revision | Line number | New 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 |