]> git.sur5r.net Git - cc65/commitdiff
Working
authorcuz <cuz@b7a2c559-68d2-44c3-8de9-860c34a00d81>
Mon, 1 Apr 2002 17:42:24 +0000 (17:42 +0000)
committercuz <cuz@b7a2c559-68d2-44c3-8de9-860c34a00d81>
Mon, 1 Apr 2002 17:42:24 +0000 (17:42 +0000)
git-svn-id: svn://svn.cc65.org/cc65/trunk@1212 b7a2c559-68d2-44c3-8de9-860c34a00d81

src/sim65/cpucore.c
src/sim65/cpucore.h
src/sim65/main.c
src/sim65/memory.c
src/sim65/memory.h

index b469b95c9ce44505168d6873fcebfd8067b921c2..2058ebda6cbd8a388192316cbc07ba2de3326f96 100644 (file)
@@ -2470,13 +2470,42 @@ static OPCFunc OPCTable[256] = {
 
 
 
-void RunCPU (void)
+void CPUInit (void)
+/* Initialize the CPU */
+{
+    PC = MemReadWord (0xFFFC);
+}
+
+
+
+void Reset (void)
+/* Reset the CPU */
+{
+}
+
+
+
+void IRQ (void)
+/* Generate an IRQ */
+{
+}
+
+
+
+void NMI (void)
+/* Generate an NMI */
+{
+}
+
+
+
+void CPURun (void)
 /* Run the CPU */
 {
     while (!CPUHalted) {
 
        /* Get the next opcode */
-       unsigned char B = 0x00;
+       unsigned char B = MemReadByte (PC);
 
        /* Execute it */
        OPCTable[B] ();
index c3da896542206f85e60e2b3dc2eea758558d22e1..09867fd28b2101234d9353565f293f49d3922bab 100644 (file)
@@ -63,6 +63,29 @@ extern unsigned              PC;             /* Program counter */
 
 
 
+/*****************************************************************************/
+/*                                  Code                                    */
+/*****************************************************************************/
+
+
+
+void CPUInit (void);
+/* Initialize the CPU */
+
+void Reset (void);
+/* Reset the CPU */
+
+void IRQ (void);
+/* Generate an IRQ */
+
+void NMI (void);
+/* Generate an NMI */
+
+void CPURun (void);
+/* Run the CPU */
+
+
+
 /* End of cpucore.h */
 
 #endif
index 20ac09d829d9f2ad9d839db5428c6ae7d7f02d15..89f48148d482cc8131c0bfc8fe08cd679ffb6613 100644 (file)
@@ -47,7 +47,7 @@
 /* sim65 */
 #include "cputype.h"
 #include "global.h"
-
+#include "memory.h"
 
 
 /*****************************************************************************/
@@ -203,6 +203,10 @@ int main (int argc, char* argv[])
        AbEnd ("No input files");
     }
 
+    /* Initialize modules */
+    MemInit ();
+
+
     /* Return an apropriate exit code */
     return EXIT_SUCCESS;
 }
index c433d41f36d12a69a37dbad27d010d32cac7ab5a..3bf85f6db9e9ed972a8533adfed21850188d650a 100644 (file)
 
 
 
+/* common */
+#include "coll.h"
+
 /* sim65 */
 #include "memory.h"
 
 
 
 /*****************************************************************************/
-/*                                  Data                                    */
+/*                                   Forwards                                */
+/*****************************************************************************/
+
+
+
+static void MemWrite (unsigned Addr, unsigned char Val);
+/* Write one byte to the memory cell */
+
+static unsigned char MemRead (unsigned Attr);
+/* Read one memory cell */
+
+
+
+/*****************************************************************************/
+/*                                  Data                                    */
+/*****************************************************************************/
+
+
+
+/* RAM attributes */
+#define RA_READFUNC_MASK        0x000F  /* Up to 16 read functions */
+#define RA_WRITEFUNC_MASK       0x00F0  /* Up to 16 write functions */
+#define RA_INITIALIZED          0x0100  /* Memory cell is initialized */
+#define RA_WPROT                0x0200  /* Memory cell is write protected */
+
+/* Defines reader and writer functions */
+#define RA_READFUNC_SHIFT       0
+#define RA_WRITEFUNC_SHIFT      4
+#define RA_READFUNC_MAX         16
+#define RA_WRITEFUNC_MAX        16
+
+/* Read/write function declarations */
+typedef unsigned char (*ReadFunc) (unsigned Addr);
+typedef void (*WriteFunc) (unsigned Addr, unsigned char Val);
+static Collection ReadFuncs  = STATIC_COLLECTION_INITIALIZER;
+static Collection WriteFuncs = STATIC_COLLECTION_INITIALIZER;
+
+/* Memory attributes and the memory */
+static unsigned short MemAttr[0x10000];
+static unsigned char Mem[0x10000];
+
+
+
+/*****************************************************************************/
+/*                              Internal functions                           */
 /*****************************************************************************/
 
 
 
-static unsigned char RAM[0x10000];
+static void MemWrite (unsigned Addr, unsigned char Val)
+/* Write one byte to the memory cell */
+{
+    if (MemAttr[Addr] & RA_WPROT) {
+        /* ### */
+    }
+    Mem[Addr] = Val;
+    MemAttr[Addr] |= RA_INITIALIZED;
+}
+
+
+
+static unsigned char MemRead (unsigned Addr)
+/* Read one memory cell */
+{
+    if ((MemAttr[Addr] & RA_INITIALIZED) == 0) {
+        /* We're reading a memory cell that was never written */
+        /* ### */
+    }
+    return Mem[Addr];
+}
 
 
 
 /*****************************************************************************/
-/*                                  Code                                    */
+/*                                  Code                                    */
 /*****************************************************************************/
 
 
@@ -57,7 +124,12 @@ static unsigned char RAM[0x10000];
 void MemWriteByte (unsigned Addr, unsigned char Val)
 /* Write a byte to a memory location */
 {
-    RAM[Addr] = Val;
+    /* Get the writer function */
+    unsigned  WI = (MemAttr[Addr] & RA_WRITEFUNC_MASK) >> RA_WRITEFUNC_SHIFT;
+    WriteFunc WF = CollAt (&WriteFuncs, WI);
+
+    /* Call the writer function */
+    WF (Addr, Val);
 }
 
 
@@ -65,7 +137,12 @@ void MemWriteByte (unsigned Addr, unsigned char Val)
 unsigned char MemReadByte (unsigned Addr)
 /* Read a byte from a memory location */
 {
-    return RAM[Addr];
+    /* Get the reader function */
+    unsigned  RI = (MemAttr[Addr] & RA_READFUNC_MASK) >> RA_READFUNC_SHIFT;
+    ReadFunc RF = CollAt (&WriteFuncs, RI);
+
+    /* Call the reader function */
+    return RF (Addr);
 }
 
 
@@ -91,3 +168,23 @@ unsigned MemReadZPWord (unsigned char Addr)
 
 
 
+void MemInit (void)
+/* Initialize the memory subsystem */
+{
+    unsigned I;
+
+    /* Clear the memory and it's attributes. Writing zeroes to the
+     * attribute array will cause any special flags to be reset and
+     * the default read and write functions to be used.
+     */
+    for (I = 0; I < sizeof (Mem) / sizeof (Mem[0]); ++I) {
+        Mem[I] = 0;
+    }
+    for (I = 0; I < sizeof (MemAttr) / sizeof (MemAttr[0]); ++I) {
+        MemAttr[I] = 0;
+    }
+
+    /* Add the default reader and writer functions to the collection */
+    CollAppend (&ReadFuncs, MemRead);
+    CollAppend (&WriteFuncs, MemWrite);
+}
index 201a2723761e88097f8ed6511b9fc330020b4738..d080c9a8f64fcc6e19ee671b60834390b50ffc98 100644 (file)
@@ -65,6 +65,9 @@ unsigned MemReadZPWord (unsigned char Addr);
  * overflow.
  */
 
+void MemInit (void);
+/* Initialize the memory subsystem */
+
 
 
 /* End of memory.h */