changeset 11:ce7323f9b937

fix
author Shinji KONO <kono@ie.u-ryukyu.ac.jp>
date Fri, 06 Jul 2018 18:31:38 +0900
parents 2a1338b218bf
children 111e5defb8ab
files a09.c engine.c io.c os9/Makefile os9/level2/Makefile os9/level2/clock.asm os9/level2/d0.asm os9/level2/d1.asm os9/level2/init.asm os9/level2/pty-dd.asm os9/makerom.c v09.c
diffstat 12 files changed, 162 insertions(+), 72 deletions(-) [+]
line wrap: on
line diff
--- a/a09.c	Thu Jul 05 18:37:11 2018 +0900
+++ b/a09.c	Fri Jul 06 18:31:38 2018 +0900
@@ -451,8 +451,8 @@
  if(isalpha(c))return scanlabel();
  else if(isdigit(c))return scandecimal();
  else switch(c) {
-  case '.' :
-  case '*' : srcptr++;exprcat|=2;return loccounter;
+  case '*' : if(prevloc) { srcptr++;exprcat|=2;return prevloc-1; }
+  case '.' : srcptr++;exprcat|=2;return loccounter;
   case '$' : return scanhex();
   case '%' : return scanbin();
   case '&' : /* compatibility */
--- a/engine.c	Thu Jul 05 18:37:11 2018 +0900
+++ b/engine.c	Fri Jul 06 18:31:38 2018 +0900
@@ -41,32 +41,58 @@
 
 #ifdef USE_MMU
 
-Byte dummy;
-static Byte * mem0(Byte *iphymem, Word adr, Byte *immu) { 
-    if (adr>=0xff00) return iphymem + memsize - 0x10000 + adr; // fixed area
+Byte * mem0(Byte *iphymem, Word adr, Byte *immu) { 
     int addr = (immu[ (adr) >> 13 ] <<13 ) + ((adr) & 0x1fff ); 
-    if ( addr >= memsize ) {
-        dummy = 0;
-        return &dummy;
-    }
     return & iphymem[ addr ];
 };
-#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;}}
+
+static Byte mem1(Byte *iphymem, Word adr, Byte *immu) {
+    if ((adr&0xff00)==(IOPAGE&0xff00)) return do_input(adr&0xff);
+    Byte *p = mem0(iphymem, adr, immu);
+    if(!(p-phymem>=memsize)) {
+        return *p;
+    } else {
+        return 0xff;
+    }
+}
 
-Byte * mem1(Byte *iphymem, Word adr, Byte *immu) { return mem0(iphymem,adr,immu); }
+#define mem(a) mem1(iphymem,a,immu)
+
+static void SETBYTE1(Byte n,Byte *iphymem, Word adr, Byte *immu) {
+    if ((adr&0xff00)==(IOPAGE&0xff00)) do_output(adr&0xff,n);
+    Byte *p = mem0(iphymem, adr, immu);
+    if(!(p-phymem>=romstart)) {
+        *p=n;
+    }
+}
+
+#define SETBYTE(a,n) SETBYTE1(n,iphymem,a,immu);
 
 #else
 
-#define mem(adr) mem[adr]
+static Byte mem1(Word adr) {
+    if ((adr&0xff00)==(IOPAGE&0xff00)) return do_input(adr&0xff);
+    return mem[adr];
+}
+
+static void SETBYTE1(Word a,Byte n) {
+    if ((a&0xff00)==(IOPAGE&0xff00)) do_output(a&0xff,n);
+    if(!(a>=romstart))mem[a]=n;
+}
+#define mem(a) mem1(a)
+#define SETBYTE(a,n) SETBYTE1(a,n);
+
+#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;}
+#define SETWORD(a,n) {Word a1=a;SETBYTE(a1,n>>8);SETBYTE(a1+1,n);}
 
-#endif
+/* Macros for load and store of accumulators. Can be modified to check
+   for port addresses */
+// #define LOADAC(reg) if((eaddr&0xff00)!=(IOPAGE&0xff00))reg=mem(eaddr);else\
+//            reg=do_input(eaddr&0xff);
+// #define STOREAC(reg) if((eaddr&0xff00)!=(IOPAGE&0xff00))SETBYTE(eaddr,reg)else\
+// 	   do_output(eaddr&0xff,reg);
 
 /* Two bytes of a word are fetched separately because of
    the possible wrap-around at address $ffff and alignment
@@ -149,12 +175,9 @@
 			 case 10: iccreg=val;break;\
 			 case 11: idpreg=val;break;}
 
-/* Macros for load and store of accumulators. Can be modified to check
-   for port addresses */
-#define LOADAC(reg) if((eaddr&0xff00)!=(IOPAGE&0xff00))reg=mem(eaddr);else\
-           reg=do_input(eaddr&0xff);
-#define STOREAC(reg) if((eaddr&0xff00)!=(IOPAGE&0xff00))SETBYTE(eaddr,reg)else\
-	   do_output(eaddr&0xff,reg);
+
+#define LOADAC(reg) reg=mem(eaddr);
+#define STOREAC(reg) SETBYTE(eaddr,reg);
 
 #define LOADREGS ixreg=xreg;iyreg=yreg;\
  iureg=ureg;isreg=sreg;\
@@ -212,7 +235,7 @@
    if(tracing && ipcreg>=tracelo && ipcreg<=tracehi) {
         SAVEREGS 
 #ifdef USE_MMU
-        Byte *phyadr = &mem(pcreg);
+        Byte *phyadr = mem0(phymem,pcreg,immu);
         prog = (char *)(phyadr - pcreg);
 #endif
         do_trace(tracefile); 
@@ -1105,7 +1128,12 @@
    			         CLV SETDREG(tw) break;
    case 0xDD: /*STD direct  */ DIRECT
    				 tw=GETDREG; SETNZ16(tw) CLV
+#ifdef USE_MMU
+                                  STOREAC((tw>>8)&0x0ff); eaddr++;
+                                  STOREAC(tw&0x0ff); break;
+#else
    				 SETWORD(eaddr,tw) break;
+#endif
    case 0xDE: /* LDU (LDS) direct */ DIRECT tw=GETWORD(eaddr);
                                   CLV SETNZ16(tw) if(!iflag)iureg=tw; else
                                   isreg=tw;break;
@@ -1151,7 +1179,7 @@
    case 0xED: /*STD indexed  */
    				 tw=GETDREG; SETNZ16(tw) CLV
 #ifdef USE_MMU
-                                     STOREAC((tw<<8)&0x0ff); eaddr++;
+                                     STOREAC((tw>>8)&0x0ff); eaddr++;
                                      STOREAC(tw&0x0ff);
                                      break;
 #else
@@ -1202,7 +1230,7 @@
    case 0xFD: /*STD ext  */ EXTENDED
    				 tw=GETDREG; SETNZ16(tw) CLV
 #ifdef USE_MMU
-                                     STOREAC((tw<<8)&0x0ff); eaddr++;
+                                     STOREAC((tw>>8)&0x0ff); eaddr++;
                                      STOREAC(tw&0x0ff);
                                      break;
 #else
--- a/io.c	Thu Jul 05 18:37:11 2018 +0900
+++ b/io.c	Fri Jul 06 18:31:38 2018 +0900
@@ -101,7 +101,7 @@
 extern void disasm(int,int);
 #ifdef USE_MMU
 extern char *prog ;   // for disass
-extern Byte * mem1(Byte *iphymem, Word adr, Byte *immu) ;
+extern Byte * mem0(Byte *iphymem, Word adr, Byte *immu) ;
 #endif
 
 
@@ -253,12 +253,12 @@
                                 xidx = 0;
                         }
                 }
+        } else if (a >= 0x40+(IOPAGE&0xff)) { /* disk */
+             do_disk(a,c);
+        } else if (a >= 0x30+(IOPAGE&0xff)) { /* timer */
+             do_timer(a,c);
         } else if (a >= 0x10+(IOPAGE&0xff)) { /* mmu */
              do_mmu(a,c);
-        } else if (a >= 0x30+(IOPAGE&0xff)) { /* timer */
-             do_timer(a,c);
-        } else if (a >= 0x40+(IOPAGE&0xff)) { /* disk */
-             do_disk(a,c);
         }
 }
 
@@ -331,11 +331,8 @@
        } else {
            mmu = phymem+memsize-0x10000+0xffa8;
        }
-       mem[(IOPAGE&0xff00)+a] = c;
-   } if (0x20+(IOPAGE&0xff) <= a && a <= 0x2f+(IOPAGE&0xff)) {
-       mem[(IOPAGE&0xff00)+a] = c;
    }
-
+   mem[(IOPAGE&0xff00)+a] = c;   // other register such as 0xffa0-0xffaf
 #endif 
 }
 
@@ -404,7 +401,7 @@
         stkskip = 0;
         restore_term();
 #ifdef USE_MMU
-        Byte *phyadr = mem1(phymem,pcreg,mmu);
+        Byte *phyadr = mem0(phymem,pcreg,mmu);
         prog = (char*)phyadr - pcreg;
 #endif
         do_trace(stdout);
@@ -494,10 +491,10 @@
                    if (skip==2 && s[1]=='i') {
                      for(int i=0; len > 0 ; i+=16, len-=16) {
 #ifdef USE_MMU
-                        Byte *phyadr = mem1(phymem,adr+i,mmu);
+                        Byte *phyadr = mem0(phymem,adr+i,mmu);
                         prog = (char*)phyadr - adr;
 #endif
-                        disasm(adr,adr+i-(len<16?16-len:0));
+                        disasm(adr+i,adr+i+(len>16?16:len));
                       }
                    } else {
 #ifdef USE_MMU
@@ -506,7 +503,7 @@
                             if (adr+i > memsize) goto restart;
                             hexadump(phymem+adr+i,len>16?16:len,adr+i,16);
                         } else {
-                            Byte *phyadr = mem1(phymem,adr+i,mmu);
+                            Byte *phyadr = mem0(phymem,adr+i,mmu);
                             if (phyadr > phymem+memsize) goto restart;
                             hexadump(phyadr,len>16?16:len,adr+i,16);
                         }
--- a/os9/Makefile	Thu Jul 05 18:37:11 2018 +0900
+++ b/os9/Makefile	Fri Jul 06 18:31:38 2018 +0900
@@ -22,7 +22,7 @@
 	./makerom -o os9b.rom modules/Basic09 modules/Shell modules/init.b modules/mdir modules/SysGo modules/IOMan modules/SCF modules/pty-dd.b modules/pty.b modules/OS9p2 modules/OS9
 
 os9d.rom : makerom modules/init.b modules/pty.b
-	./makerom -o os9d.rom  modules/Shell modules/dir.b  modules/init.b modules/mdir modules/SysGo modules/IOMan modules/pty-dd.b modules/pty.b modules/pdisk.b modules/d0.b modules/d1.b modules/clock.b modules/SCF modules/rbf.b modules/OS9p2 modules/OS9
+	./makerom -o os9d.rom  modules/Shell modules/init.b modules/mdir modules/dir.b modules/SysGo modules/IOMan modules/pty-dd.b modules/pty.b modules/pdisk.b modules/d0.b modules/d1.b modules/clock.b modules/SCF modules/rbf.b modules/OS9p2 modules/OS9
    
-os9lv2.rom : level2/init
-	./makerom -o os9lv2.rom -2 level2/init level2/ioman level2/os9p2 level2/os9p3_perr level2/os9p4_regdump level2/pdisk level2/pipe level2/piper level2/pipeman level2/pty level2/rbf level2/scf level2/term level2/os9p1 
+os9lv2.rom : makerom level2/init
+	./makerom -o os9lv2.rom -2  level2/Shell level2/mdir level2/dir level2/ioman  level2/os9p3_perr level2/os9p4_regdump  level2/pipe level2/piper level2/pipeman level2/pty level2/rbf modules/SysGo  level2/scf level2/os9p2 level2/pdisk level2/pty level2/term level2/init level2/boot level2/os9p1 
--- a/os9/level2/Makefile	Thu Jul 05 18:37:11 2018 +0900
+++ b/os9/level2/Makefile	Fri Jul 06 18:31:38 2018 +0900
@@ -2,36 +2,51 @@
 A09 = ../../a09
 
 SRCDIR=../../CoCoOS9/level2v3/MODULES
+SRCCMD=../../CoCoOS9/level2v3/CMDS
 
-all : ioman pdisk init os9p1 os9p2 os9p3_perr os9p4_regdump pipe pipeman pipeman_named piper rbf scf term pty d0 d1 clock vector
+all : ioman pdisk init os9p1 os9p2 os9p3_perr os9p4_regdump pipe pipeman pipeman_named piper rbf scf term pty d0 d1 clock vector boot shell dir mdir
 
 clean : 
-	rm -f ioman pdisk init os9p1 os9p2 os9p3_perr os9p4_regdump pipe pipeman pipeman_named piper rbf scf term pty d0 d1 clock vector
+	rm -f ioman pdisk init os9p1 os9p2 os9p3_perr os9p4_regdump pipe pipeman pipeman_named piper rbf scf term pty d0 d1 clock vector boot shell dir mdir
 
+pdisk : 
+	$(A09) ../modules/pdisk.asm -o pdisk
 
-pdisk : ../modules/pdisk.asm
-	$(A09) ../modules/pdisk.asm -o pdisk
+boot : boot.asm
+	$(A09) boot.asm -o boot
+
+sysgo : sysgo.asm
+	$(A09) sysgo.asm -o sysgo
 
 init : init.asm
 	$(A09) init.asm -o init
 
-term :
+vector : vector.asm
+	$(A09) vector.asm -o vector
+
+term : pty-dd.asm
 	$(A09) pty-dd.asm -o term
 
-d0 :
+d0 : d0.asm
 	$(A09) d0.asm -o d0
 
-d1 :
+d1 : d1.asm
 	$(A09) d1.asm -o d1
 
-clock :
+clock :  clock.asm
 	$(A09) clock.asm -o clock
 
 pty :
 	$(A09) ../modules/pty.asm -o pty
 
-vector : vector.asm
-	$(A09) vector.asm -o vector
+shell :
+	$(A09) ${SRCCMD}/shell_21.asm -o shell
+
+mdir :
+	$(A09) ${SRCCMD}/mdir.asm -o mdir
+
+dir :
+	$(A09) ${SRCCMD}/dir.asm -o dir
 
 os9p1 :
 	$(A09) ${SRCDIR}/os9p1.asm -o os9p1
--- a/os9/level2/clock.asm	Thu Jul 05 18:37:11 2018 +0900
+++ b/os9/level2/clock.asm	Fri Jul 06 18:31:38 2018 +0900
@@ -15,7 +15,7 @@
          ttl   OS-9 Level One V2 Clock module
 
          ifp1
-         use   os9defs
+         use   defsfile
          endc
 
 tylg     set   Systm+Objct
--- a/os9/level2/d0.asm	Thu Jul 05 18:37:11 2018 +0900
+++ b/os9/level2/d0.asm	Fri Jul 06 18:31:38 2018 +0900
@@ -17,7 +17,7 @@
          ttl   40-track floppy disk device descriptor
 
          ifp1
-         use   os9defs
+         use   defsfile
          endc
 tylg     set   Devic+Objct   
 atrv     set   ReEnt+rev
--- a/os9/level2/d1.asm	Thu Jul 05 18:37:11 2018 +0900
+++ b/os9/level2/d1.asm	Fri Jul 06 18:31:38 2018 +0900
@@ -17,7 +17,7 @@
          ttl   40-track floppy disk device descriptor
 
          ifp1
-         use   os9defs
+         use   defsfile
          endc
 tylg     set   Devic+Objct   
 atrv     set   ReEnt+rev
--- a/os9/level2/init.asm	Thu Jul 05 18:37:11 2018 +0900
+++ b/os9/level2/init.asm	Fri Jul 06 18:31:38 2018 +0900
@@ -3,7 +3,7 @@
          ttl   os9 system module
 
          ifp1
-         use   os9defs
+         use   defsfile
          endc
 null     set   $0000
 tylg     set   Systm+$00
@@ -11,13 +11,13 @@
 rev      set   $01
          mod   eom,initnam,tylg,atrv
          fcb   7
-         fdb   $b800
+         fdb   $c000
          fcb   $0C
          fcb   $0C
          fdb   sysgo
-         fdb   null      system device (sysdev)
+         fdb   sysdev      system device (sysdev)
          fdb   systerm
-         fdb   null      bootstrap module (bootst)
+         fdb   bootst      bootstrap module (bootst)
 initnam  fcs   "Init"
 sysgo    fcs   "SysGo"
 sysdev   fcs   "/D0"
--- a/os9/level2/pty-dd.asm	Thu Jul 05 18:37:11 2018 +0900
+++ b/os9/level2/pty-dd.asm	Fri Jul 06 18:31:38 2018 +0900
@@ -4,7 +4,7 @@
 * Source by Soren Roug 2001
 *
          ifp1
-         use os9defs
+         use defsfile
          endc
 
          nam P1
--- a/os9/makerom.c	Thu Jul 05 18:37:11 2018 +0900
+++ b/os9/makerom.c	Fri Jul 06 18:31:38 2018 +0900
@@ -1,5 +1,8 @@
 /* makerom.c 
    build ROM image file os9.rom from module list
+
+         Shinji KONO    Fri Jul  6 13:31:52 JST 2018
+
 */
 
 #include <stdio.h>
@@ -7,6 +10,31 @@
 #include <strings.h>
 #include <sys/stat.h>
 
+// #define DEBUG 1
+
+/*
+ * Level1
+ *        os9p1 should be 0xf800
+ *        it searches ram from the beginning
+ *        rom modules are searched from just after the end of RAM
+ *
+ * Level2
+ *        Coco 512kb memory space
+ *        last 8k is a ROM (can be switched?) ( block 0x3f )
+ *        os9p1 search module on 0x0d00~0x1e00 at block 0x3f
+ *
+ *        8k block ( offset 0xc000 )
+ *
+ *        0xe000 - 0xccff   0xff
+ *        0xed00 - 0xff78   os9 modules,  os9p1 should be the last
+ *                 MMU doesnot touch below
+ *        0xff80 - 0xffdf   IO port  ( ACIA, clock, pdisk, MMU )
+ *        0xffd0 - 0xffef   boot code
+ *        0xfff0 - 0xffff   intr vector
+ *         ... next few blocks as extended ROM
+ *
+ */
+
 int level = 1;
 int IOBASE = 0xe000;
 int IOSIZE = 0x100;
@@ -102,6 +130,8 @@
 #ifdef DEBUG
       printf("*");
 #endif 
+   } else if (level==2 &&  0xed00 > top) {
+      m->ioflag = 1;
    }
    m->location = top;
 #ifdef DEBUG
@@ -155,9 +185,15 @@
  start = start&0xf800;
  printf("\n\n");
 
- pos = start;
+ if (level==2) {
+     for(int i=0; i<0xd00; i++) fputc(0xff,romfile);
+     pos = 0xed00;
+ } else {
+     pos = start;
+ }
  struct os9module *os9p1 = 0;
  for(struct os9module *cur = root.next; cur ; cur = cur->next ) {
+    if ( level==2 && cur->ioflag ==1) continue; 
     // last module have to os9p1
     if ( cur->next == 0 ) {
         os9p1 = cur;
@@ -181,7 +217,7 @@
     printf(" \t: 0x%x - 0x%x : 0x%lx \n",pos, pos + cur->size, ftell(romfile)+start);
 #endif 
     pos = pos+cur->size;
-    if (cur->ioflag) {
+    if (level==1 && cur->ioflag) {
        if (level==1) {
            for(; pos < IOBASE + IOSIZE; pos++) {
               fputc(0xff,romfile);
@@ -219,7 +255,7 @@
      printf("os9entry %x\n",os9p1->location+getword(os9p1->mod+9));
 
      fputword(os9p1->location+getword(os9p1->mod+9),romfile);     // os9p1 entry point 
-     unsigned short vec = os9p1->location+os9p1->size + 15;
+     unsigned short vec = os9p1->location+os9p1->size - 18;
      fputword(vec,romfile);
      fputword(vec+3,romfile);
      fputword(vec+6,romfile);
@@ -228,11 +264,28 @@
      fputword(vec+12,romfile);
      fputword(vec+15,romfile);
      fputword(LV2START,romfile);
+
+     pos = 0x10000;
+     for(struct os9module *cur = root.next; cur ; cur = cur->next ) {
+        if ( cur->ioflag ==0) continue; 
+        printf("mod ");
+        printOs9Str(cur->name);
+        fwrite(cur->mod, cur->size, 1, romfile);
+        printf(" \t: 0x%x - 0x%x\n",pos, pos + cur->size-1);
+#ifdef DEBUG
+        printf(" \t: 0x%x \n",cur->location);
+        printf(" \t: 0x%x - 0x%x : 0x%lx \n",pos, pos + cur->size, ftell(romfile)+start);
+#endif 
+        pos = pos+cur->size;
+     }
+     while(pos++ & 0x1fff) fputc(0xff,romfile);
  }
  if (level==1) 
      printf("boot rom from 0x%lx\n",0x10000-ftell(romfile)); 
  else
-     printf("boot rom from 0x%lx\n",512*1024-ftell(romfile)); 
+     printf("boot rom from 0xc000 size 0x%lx\n",ftell(romfile)); 
  fclose(romfile);
  return 0;
 }
+
+
--- a/v09.c	Thu Jul 05 18:37:11 2018 +0900
+++ b/v09.c	Fri Jul 06 18:31:38 2018 +0900
@@ -83,7 +83,10 @@
  long len = filesize(image);
  if (romstart==0x8000) {
 #ifdef USE_MMU
-     romstart = memsize - len;
+     phymem = malloc(memsize + len - 0x2000);
+     mem    = phymem + memsize - 0x10000 ;
+     mmu    = mem + 0xffa0;
+     romstart = memsize - 0x2000;
 #else
      romstart = 0x10000 - len; 
 #endif
@@ -151,18 +154,12 @@
      if (memsize < 512*1024) memsize = 512*1024;
    } else usage();
  }   
- #ifdef USE_MMU
-    phymem = malloc(memsize);
-    mem    = phymem + memsize - 0x10000 ;
-    mmu    = mem + 0xffa0;
- #else
  #ifdef MSDOS
  if((mem=farmalloc(65535))==0) { 
    fprintf(stderr,"Not enough memory\n");
    exit(2);
  } 
  #endif
- #endif
  read_image(); 
  if (setterm) set_term(escchar);
  pcreg=(mem[0xfffe]<<8)+mem[0xffff];