mbed LPC1114 emulator pre-alpha version

Dependencies:   BaseV6M mbed F12RFileSystem F32RFileSystem ROMSLOT SDStorage

Fork of emu812 by Norimasa Okamoto

480
TOYOSHIKI TINY BASIC mbed Edition TTB_mbed_LPC1114.bin save as "LPC1114.IMG" .

Revision:
3:5df725af50e0
Parent:
2:b8b4f07d4691
Child:
4:6629544a482e
--- a/EMU111x.cpp	Tue Aug 11 06:49:07 2015 +0900
+++ b/EMU111x.cpp	Thu Aug 13 07:39:24 2015 +0900
@@ -1,4 +1,4 @@
-// EMU111x.cpp 2015/8/8
+// EMU111x.cpp 2015/8/12
 #include "mbed.h"
 #include "EMU111x.h"
 #define V6M_LOG_LEVEL 2
@@ -20,42 +20,20 @@
 
 void EMU111x_SYSCON::poke32(uint32_t a, uint32_t d) {
     switch(a&0xfff) {
-        case 0x000:
-            V6M_INFO("P: LPC_SYSCON->SYSMEMREMAP << %08x", d);
-            break;
-        case 0x004:
-            V6M_INFO("P: LPC_SYSCON->PRESETCTRL << %08x", d);
-            break;
-        case 0x008:
-            V6M_INFO("P: LPC_SYSCON->SYSPLLCTRL << %08x", d);
-            break;
-        case 0x040:
-            V6M_INFO("P: LPC_SYSCON->SYSPLLCLKSEL << %08x", d);
-            break;
-        case 0x044:
-            V6M_INFO("P: LPC_SYSCON->SYSPLLCLKUEN << %08x", d);
-            break;
-        case 0x070:
-            V6M_INFO("P: LPC_SYSCON->MAINCLKSEL << %08x", d);
-            break;
-        case 0x074:
-            V6M_INFO("P: LPC_SYSCON->MAINCLKUEN << %08x", d);
-            break;
-        case 0x078:
-            V6M_INFO("P: LPC_SYSCON->SYSAHBCLKDIV << %08x", d);
-            break;
-        case 0x080:
-            V6M_INFO("P: LPC_SYSCON->SYSAHBCLKCTRL << %08x", d);
-            break;
-        case 0x094:
-            V6M_INFO("P: LPC_SYSCON->SSP0CLKDIV << %08x", d);
-            break;
-        case 0x098:
-            V6M_INFO("P: LPC_SYSCON->UARTCLKDIV << %08x", d);
-            break;
-        case 0x238:
-            V6M_INFO("P: LPC_SYSCON->PDRUNCFG << %08x", d);
-            break;
+        #define c(OFFSET,NAME) case OFFSET: V6M_INFO("P: LPC_SYSCON->%s << %08x", #NAME, d); break;
+        c(0x000, SYSMEMREMAP);
+        c(0x004, PRESETCTRL);
+        c(0x008, SYSPLLCTRL);
+        c(0x040, SYSPLLCLKSEL);
+        c(0x044, SYSPLLCLKUEN);
+        c(0x070, MAINCLKSEL);
+        c(0x074, MAINCLKUEN);
+        c(0x078, SYSAHBCLKDIV);
+        c(0x080, SYSAHBCLKCTRL);
+        c(0x094, SSP0CLKDIV);
+        c(0x098, UARTCLKDIV);
+        c(0x238, PDRUNCFG);
+        #undef c
         default:
             V6M_WARN("P: LPC_SYSCON %08x << %08x", a, d);
             break;
@@ -65,12 +43,9 @@
 uint32_t EMU111x_SYSCON::peek32(uint32_t a) {
     uint32_t d = 0x00;
     switch(a&0xfff) {
-        case 0x000:
-            V6M_INFO("P: LPC_SYSCON->SYSMEMREMAP >> %08x", a, d);
-            break;
-        case 0x004:
-            V6M_INFO("P: LPC_SYSCON->PRESETCTRL >> %08x", a, d);
-            break;
+        #define c(OFFSET,NAME) case OFFSET: V6M_INFO("P: LPC_SYSCON->%s >> %08x", #NAME, d); break;
+        c(0x000, SYSMEMREMAP);
+        c(0x004, PRESETCTRL);
         case 0x00c:
             d = 0x01;
             V6M_INFO("P: LPC_SYSCON->SYSPLLSTAT >> %08x", a, d);
@@ -83,12 +58,9 @@
             d = 0x01;
             V6M_INFO("P: LPC_SYSCON->MAINCLKUEN >> %08x", a, d);
             break;
-        case 0x080:
-            V6M_INFO("P: LPC_SYSCON->SYSAHBCLKCTRL >> %08x", a, d);
-            break;
-        case 0x238:
-            V6M_INFO("P: LPC_SYSCON->PDRUNCFG >> %08x", d);
-            break;
+        c(0x080, SYSAHBCLKCTRL);
+        c(0x238, PDRUNCFG);
+        #undef c
         default:
             V6M_WARN("P: LPC_SYSCON %08x >> %08x", a, d);
             break;
@@ -100,6 +72,7 @@
     PIO0_4 = 0xd0;
     PIO0_5 = 0xd0;
     PIO0_6 = 0xd0;
+    PIO0_7 = 0xd0;
     PIO0_8 = 0xd0;
     PIO0_9 = 0xd0;
     R_PIO0_11 = 0xd0;
@@ -112,6 +85,7 @@
         c(0x30, PIO0_4);
         c(0x34, PIO0_5);
         c(0x4c, PIO0_6);
+        c(0x50, PIO0_7);
         c(0x60, PIO0_8);
         c(0x64, PIO0_9);
         c(0x74, R_PIO0_11);
@@ -131,6 +105,7 @@
         c(0x30, PIO0_4);
         c(0x34, PIO0_5);
         c(0x4c, PIO0_6);
+        c(0x50, PIO0_7);
         c(0x60, PIO0_8);
         c(0x64, PIO0_9);
         c(0x74, R_PIO0_11);
@@ -182,21 +157,20 @@
 
 uint32_t EMU111x_GPIO::peek32(uint32_t a) {
     uint32_t d = 0x00;
-    uint32_t mask;
-    int pin;
+    if ((a&0xffff) < 0x3ffc) {
+        uint32_t mask = (a>>2)&0xfff;
+        int pin = pinpos(mask);
+        if (dir & mask) { // output
+            d = data & mask;
+        } else { // input
+            if (mcu.DigitalRead_Callback(port, pin)) {
+                d = mask;
+            }
+        }
+        V6M_INFO("P: LPC_GPIO%d->MASKED_ACCESS[%03x] >> %08x", port, mask, d);
+        return d;
+    }
     switch(a&0xffff) {
-        case 0x0080:
-            mask = (a>>2)&0xfff;
-            pin = pinpos(mask);
-            if (dir & mask) { // output
-                d = data & mask;
-             } else { // input
-                if (mcu.DigitalRead_Callback(port, pin)) {
-                    d = mask;
-                }
-            }
-            V6M_WARN("P: LPC_GPIO%d->MASKED_ACCESS[%03x] >> %08x", port, mask, d);
-            break;
         case 0x3ffc:
             d = data;
             V6M_INFO("P: LPC_GPIO%d->DATA >> %08x", port, d);
@@ -332,7 +306,7 @@
                 i2c_addr = d & 0xff;
                 i2c_pos = 0;
                 if (i2c_addr & 0x01) {
-                    i2c_size = mcu.I2CRead_Callback(i2c_addr, i2c_data, sizeof(i2c_data));
+                    mcu.I2CRead_Callback(i2c_addr, i2c_data, sizeof(i2c_data));
                     stat = 0x40;
                     i2c_pos = 0;
                 } else {
@@ -373,10 +347,10 @@
             V6M_INFO("P: LPC_I2C->STAT >> %08x", d);
             break;
         case 0x08:
-            if (i2c_pos < i2c_size) {
+            if (i2c_pos < sizeof(i2c_data)) {
                 d = i2c_data[i2c_pos++];
             }
-            if (i2c_pos < i2c_size) {
+            if (i2c_pos < sizeof(i2c_data)) {
                 stat = 0x50;
             } else {
                 stat = 0x58;
@@ -456,7 +430,7 @@
     }
 }
 
-EMU111x::EMU111x():tmr32b1(1),uart(*this),i2c(*this),spi0(*this,0),spi1(*this,1),gpio0(*this,0),gpio1(*this,1) {
+EMU111x::EMU111x():tmr32b1(1),_uart(*this),_i2c(*this),_spi0(*this,0),_spi1(*this,1),gpio0(*this,0),gpio1(*this,1) {
     flash = NULL;
     rom = NULL;
     ram = new uint8_t[EMU111x_RAM_SIZE];
@@ -474,13 +448,13 @@
             break;
         case EMU111x_APB_BASE>>24:
             switch((a>>12)&0xff) {
-                case 0x00: i2c.poke32(a, d); break;
-                case 0x08: uart.poke32(a, d); break;
+                case 0x00: _i2c.poke32(a, d); break;
+                case 0x08: _uart.poke32(a, d); break;
                 case 0x18: tmr32b1.poke32(a, d); break;
-                case 0x40: spi0.poke32(a, d); break;
+                case 0x40: _spi0.poke32(a, d); break;
                 case 0x44: iocon.poke32(a, d); break;
                 case 0x48: syscon.poke32(a, d); break;
-                case 0x58: spi1.poke32(a, d); break;
+                case 0x58: _spi1.poke32(a, d); break;
                 default:
                     V6M_WARN("P: %08x << %08x", a, d);
                     break;
@@ -540,13 +514,13 @@
             break;
         case EMU111x_APB_BASE>>24:
             switch((a>>12)&0xff) {
-                case 0x00: d = i2c.peek32(a); break;
-                case 0x08: d = uart.peek32(a); break;
+                case 0x00: d = _i2c.peek32(a); break;
+                case 0x08: d = _uart.peek32(a); break;
                 case 0x18: d = tmr32b1.peek32(a); break;
-                case 0x40: d = spi0.peek32(a); break;
+                case 0x40: d = _spi0.peek32(a); break;
                 case 0x44: d = iocon.peek32(a); break;
                 case 0x48: d = syscon.peek32(a); break;
-                case 0x58: d = spi1.peek32(a); break;
+                case 0x58: d = _spi1.peek32(a); break;
                 default:
                     V6M_WARN("P: %08x >> %08x", a, d);
                     break;