#include "config.h" #include "uvm32.h" #include "common/uvm32_common_custom.h" uint8_t rom[] = { // mandel.bin 0x23, 0x26, 0x11, 0x00, 0xef, 0x00, 0xc0, 0x00, 0xb7, 0x08, 0x00, 0x01, 0x73, 0x00, 0x00, 0x00, 0x13, 0x01, 0x01, 0xff, 0x23, 0x26, 0x81, 0x00, 0x37, 0xf5, 0xff, 0xff, 0xb7, 0x15, 0x00, 0x00, 0x37, 0xe6, 0xff, 0xff, 0x13, 0x07, 0xf0, 0x01, 0xb7, 0x47, 0x00, 0x00, 0xb7, 0x06, 0x00, 0x01, 0x13, 0x08, 0xd5, 0xcc, 0x93, 0x82, 0x35, 0x33, 0x13, 0x03, 0x76, 0xe6, 0x93, 0x83, 0x35, 0xb3, 0x13, 0x86, 0x16, 0x00, 0x63, 0xce, 0x02, 0x09, 0x13, 0x0e, 0x03, 0x00, 0x63, 0xce, 0x63, 0x06, 0x93, 0x0f, 0x00, 0x00, 0x13, 0x0f, 0x00, 0x00, 0x13, 0x04, 0x00, 0x00, 0x93, 0x0e, 0x00, 0x00, 0x93, 0x06, 0x00, 0x02, 0x13, 0x85, 0x06, 0xfe, 0x63, 0x64, 0xa7, 0x04, 0x33, 0x05, 0xff, 0x01, 0x63, 0xe0, 0xa7, 0x04, 0x13, 0x05, 0x00, 0x00, 0x93, 0x05, 0x00, 0x00, 0x93, 0x08, 0x06, 0x00, 0xb3, 0x8e, 0x8e, 0x02, 0x33, 0x0f, 0xff, 0x41, 0x13, 0xd4, 0xbe, 0x40, 0xb3, 0x0e, 0xcf, 0x01, 0x73, 0x00, 0x00, 0x00, 0x33, 0x04, 0x04, 0x01, 0x33, 0x85, 0xde, 0x03, 0x13, 0x5f, 0xc5, 0x00, 0x33, 0x05, 0x84, 0x02, 0x93, 0x5f, 0xc5, 0x00, 0x93, 0x86, 0x16, 0x00, 0x6f, 0xf0, 0x9f, 0xfb, 0x13, 0x85, 0x06, 0x00, 0x93, 0x05, 0x00, 0x00, 0x93, 0x08, 0x00, 0x00, 0x73, 0x00, 0x00, 0x00, 0x13, 0x0e, 0x1e, 0x09, 0xe3, 0xd6, 0xc3, 0xf9, 0x13, 0x05, 0xa0, 0x00, 0x93, 0x05, 0x00, 0x00, 0x93, 0x08, 0x00, 0x00, 0x73, 0x00, 0x00, 0x00, 0x13, 0x08, 0x98, 0x19, 0xe3, 0xd6, 0x02, 0xf7, 0x37, 0x05, 0x00, 0x80, 0x13, 0x05, 0x05, 0x10, 0x93, 0x08, 0x30, 0x00, 0x93, 0x05, 0x00, 0x00, 0x73, 0x00, 0x00, 0x00, 0x03, 0x24, 0xc1, 0x00, 0x13, 0x01, 0x01, 0x01, 0x67, 0x80, 0x00, 0x00, 0x48, 0x65, 0x6c, 0x6c, 0x6f, 0x20, 0x77, 0x6f, 0x72, 0x6c, 0x64, 0x00 }; uvm32_state_t vmst; uvm32_evt_t evt; bool isrunning = false; uint32_t led_time = 0; bool led_state = false; void setup(void) { Serial.begin(115200); pinMode(LED_BUILTIN, OUTPUT); isrunning = false; } void loop(void) { // flash LED rapidly to show main loop is still running if (millis() > led_time + 50) { digitalWrite(LED_BUILTIN, led_state); led_state = !led_state; led_time = millis(); } if (isrunning) { uvm32_run(&vmst, &evt, 0xFFFFFFFF); // num instructions before vm considered hung switch(evt.typ) { case UVM32_EVT_END: isrunning = false; break; case UVM32_EVT_SYSCALL: // vm has paused to handle UVM32_SYSCALL switch(evt.data.syscall.code) { case UVM32_SYSCALL_PUTC: Serial.print((char)uvm32_getval(&vmst, &evt, ARG0)); break; case UVM32_SYSCALL_PRINTLN: { const char *str = uvm32_getcstr(&vmst, &evt, ARG0); Serial.print(str); Serial.println(""); } break; case UVM32_SYSCALL_PRINT: { const char *str = uvm32_getcstr(&vmst, &evt, ARG0); Serial.print(str); } break; case UVM32_SYSCALL_MILLIS: { uvm32_setval(&vmst, &evt, RET, millis()); } break; default: Serial.print("Unhandled syscall: "); Serial.print(evt.data.syscall.code); Serial.println(""); break; } break; case UVM32_EVT_ERR: Serial.print("Error: "); Serial.println(evt.data.err.errstr); isrunning = false; break; case UVM32_EVT_YIELD: break; } } else { Serial.println("Starting VM"); // setup vm uvm32_init(&vmst); uvm32_load(&vmst, rom, sizeof(rom)); isrunning = true; delay(2000); } return; }