]> localhost Git - WindEmu.git/commitdiff
flesh out Etna skeleton a bit more
authorAsh Wolf <ninji@wuffs.org>
Sat, 21 Dec 2019 11:09:58 +0000 (11:09 +0000)
committerAsh Wolf <ninji@wuffs.org>
Sat, 21 Dec 2019 11:09:58 +0000 (11:09 +0000)
WindCore/emu.cpp
WindCore/emu.h
WindCore/etna.cpp
WindCore/etna.h
WindCore/wind_hw.h

index a37fb1448f91b93157f7c326631aecdae1b242f9..d8152242536f23bcc6790ab86265da18a684cd76 100644 (file)
@@ -6,7 +6,7 @@
 
 #define INCLUDE_BANK1
 
-Emu::Emu() {
+Emu::Emu() : etna(this) {
 }
 
 
index 0962fc7f6874b5bb15b88bba4753883742d34bb8..3a97c4c4d8bb2e73637a6b5964255a58b597e879 100644 (file)
@@ -5,6 +5,7 @@
 #include <unordered_set>
 
 class Emu {
+public:
     uint8_t ROM[0x1000000];
     uint8_t MemoryBlockC0[0x800000];
     uint8_t MemoryBlockC1[0x800000];
@@ -12,6 +13,7 @@ class Emu {
     uint8_t MemoryBlockD1[0x800000];
     enum { MemoryBlockMask = 0x7FFFFF };
 
+private:
     uint32_t controlReg;
     uint32_t translationTableBase;
     uint32_t domainAccessControl;
index 5e15d2f1b98faa6f2425c52651ca8c4a97f53356..0356d52f5cd65ab763e40063579426bebdcd66c5 100644 (file)
@@ -1,4 +1,5 @@
 #include "etna.h"
+#include "emu.h"
 #include <stdio.h>
 #include <string.h>
 
@@ -44,7 +45,9 @@ static const char *nameReg(uint32_t reg) {
 }
 
 
-Etna::Etna() {
+Etna::Etna(Emu *owner) {
+    this->owner = owner;
+
     for (int i = 0; i < 0x80; i++)
         prom[i] = 0;
 
@@ -77,9 +80,10 @@ Etna::Etna() {
 uint32_t Etna::readReg8(uint32_t reg)
 {
     if (!promReadActive)
-        printf("ETNA readReg8: reg=%s\n", nameReg(reg));
+        printf("ETNA readReg8: reg=%s @ pc=%08x,lr=%08x\n", nameReg(reg), owner->getGPR(15) - 4, owner->getGPR(14));
     switch (reg) {
-    case regSktVarA0: return 0; // will store some status flags
+    case regIntClear: return 0;
+    case regSktVarA0: return 1; // will store some status flags
     case regSktVarA1: return 0; // will store some more status flags
     case regWake1: return wake1;
     case regWake2: return wake2;
@@ -97,8 +101,9 @@ uint32_t Etna::readReg32(uint32_t reg)
 void Etna::writeReg8(uint32_t reg, uint8_t value)
 {
     if (!promReadActive)
-        printf("ETNA writeReg8: reg=%s value=%02x\n", nameReg(reg), value);
+        printf("ETNA writeReg8: reg=%s value=%02x @ pc=%08x,lr=%08x\n", nameReg(reg), value, owner->getGPR(15) - 4, owner->getGPR(14));
     switch (reg) {
+    case regIntClear: pendingInterrupts &= ~value; break;
     case regWake1: wake1 = value; break;
     case regWake2: wake2 = value; break;
     }
index 7e83a4fa25af2d9c547c6bc1d1ee4c8f4e7f09fd..ae63b022029c3a1c9a14a0fc847701d78c57415a 100644 (file)
@@ -1,16 +1,21 @@
 #pragma once
 #include <stdint.h>
 
+class Emu;
+
 class Etna {
     uint8_t prom[0x80] = {};
     uint16_t promReadAddress = 0, promReadValue = 0;
     bool promReadActive = false;
     int promAddressBitsReceived = 0;
 
+    uint8_t pendingInterrupts = 0, interruptMask = 0;
     uint8_t wake1 = 0, wake2 = 0;
 
+    Emu *owner;
+
 public:
-    Etna();
+    Etna(Emu *owner);
 
     uint32_t readReg8(uint32_t reg);
     uint32_t readReg32(uint32_t reg);
index ed4c9a30751636f6ccf3d2701aef5fb4265389d8..6ff4624f8b539c6de02b2201f2024183a5b4fc3f 100644 (file)
@@ -1,5 +1,6 @@
 #pragma once
 #include "wind.h"
+#include "arm.h"
 #include <stdio.h>
 
 struct Timer {
@@ -113,6 +114,9 @@ struct UART {
                if (reg == (UART0FCR & 0xFF)) {
                        return frameControl;
                // UART0LCR
+               } else if (reg == (UART0FLG & 0xFF)) {
+                       // we pretend we are never busy, never have full fifo
+                       return FlagReceiveFifoEmpty;
                } else {
                        printf("unhandled 32bit uart read %x at pc=%08x lr=%08x\n", reg, cpu->gprs[ARM_PC], cpu->gprs[ARM_LR]);
                        return 0xFFFFFFFF;