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