diff engine.c @ 9:cb7aa75418b8

mmu and io
author Shinji KONO <kono@ie.u-ryukyu.ac.jp>
date Thu, 05 Jul 2018 16:00:19 +0900
parents a6db579d8c11
children 2a1338b218bf
line wrap: on
line diff
--- a/engine.c	Thu Jul 05 12:07:06 2018 +0900
+++ b/engine.c	Thu Jul 05 16:00:19 2018 +0900
@@ -37,19 +37,30 @@
 Byte aca,acb;
 Byte *breg=&aca,*areg=&acb;
 static int tracetrick=0;
-extern int romstart;
+extern long romstart;
 
 #ifdef USE_MMU
-static inline Byte * mem0(Byte *iphymem, Word adr, Byte *immu) { return & iphymem[ ( immu[ (adr) >> 13 ] <<13 ) + ((adr) & 0x1fff )]; };
+static inline Byte * mem0(Byte *iphymem, Word adr, Byte *immu) { 
+    if (adr>=0xff00) return iphymem + memsize - 0x10000 + adr; // fixed area
+    return & iphymem[ ( immu[ (adr) >> 13 ] <<13 ) + ((adr) & 0x1fff )]; 
+};
 #define mem(adr) (*mem0(iphymem, adr,immu))
+#define GETWORD(a) ({Byte *phy = mem0(iphymem, a,immu); phy[0]<<8|phy[1];})
+#define SETBYTE(a,n) {Byte *phy = mem0(iphymem, a,immu); if(!(phy-iphymem>=romstart)) phy[0]=n;}
+#define SETWORD(a,n) {Byte *phy = mem0(iphymem, a,immu); if(!(phy-iphymem>=romstart)){phy[0]=(n)>>8;phy[1]=n;}}
+
+Byte * mem1(Byte *iphymem, Word adr, Byte *immu) { return mem0(iphymem,adr,immu); }
+
 #else
+
 #define mem(adr) mem[adr]
-#endif
-
 
 #define GETWORD(a) (mem(a)<<8|mem((a)+1))
 #define SETBYTE(a,n) {if(!(a>=romstart))mem(a)=n;}
 #define SETWORD(a,n) if(!(a>=romstart)){mem(a)=(n)>>8;mem((a)+1)=n;}
+
+#endif
+
 /* Two bytes of a word are fetched separately because of
    the possible wrap-around at address $ffff and alignment
 */
@@ -170,6 +181,8 @@
   /*F*/      0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
             };
 
+extern char *prog ;
+
 void interpr(void)
 {
  Word ixreg,iyreg,iureg,isreg,ipcreg;
@@ -189,8 +202,14 @@
  LOADREGS
  for(;;){
   if(attention) {
-   if(tracing && ipcreg>=tracelo && ipcreg<=tracehi)
-              {SAVEREGS do_trace(tracefile); }
+   if(tracing && ipcreg>=tracelo && ipcreg<=tracehi) {
+        SAVEREGS 
+#ifdef USE_MMU
+        Byte *phyadr = &mem(pcreg);
+        prog = (char *)(phyadr - pcreg);
+#endif
+        do_trace(tracefile); 
+   }
    if(escape){ SAVEREGS do_escape(); LOADREGS }
    if(irq) {
     if(irq==1&&!(iccreg&0x10)) { /* standard IRQ */