diff vdisk.c @ 46:ec9f494497e1

vdisk fix
author Shinji KONO <kono@ie.u-ryukyu.ac.jp>
date Fri, 20 Jul 2018 11:48:19 +0900
parents 07c84761da6f
children 15f1e1b49928
line wrap: on
line diff
--- a/vdisk.c	Thu Jul 19 16:21:47 2018 +0900
+++ b/vdisk.c	Fri Jul 20 11:48:19 2018 +0900
@@ -20,10 +20,12 @@
 extern char *prog ;   // for disass
 extern Byte * mem0(Byte *iphymem, Word adr, Byte *immu) ;
 #define pmem(a)  mem0(phymem,a,mmu)
+#define smem(a)  mem0(phymem,a,&mem[0x20+IOPAGE])
 #define umem(a)  (mem[0x42+IOPAGE]?mem0(phymem,a,&mem[0x21+IOPAGE]):mem0(phymem,a,&mem[0x20+IOPAGE]))
 #else
 #define pmem(a)  (&mem[a])
 #define umem(a)  (&mem[a])
+#define smem(a)  (&mem[a])
 #endif
 
 #define MAXPDV 256
@@ -45,7 +47,7 @@
 
 #define MAXVDRV 4
 
-char drvRoot[] = { '.','.','.','.'};
+char *drvRoot[] = { ".",".",".","."};
 PathDesc pdv[MAXPDV];
 
 int setVdisk(int drv,char *name) {
@@ -83,11 +85,14 @@
 #define MAXPAHTLEN 256
 
 char *addCurdir(char *name, PathDesc *pd, PathDesc *curdir) {
-    int ns = strlen(name);
+    int ns =0 ;
+    if (name[0]=='/') {
+        while(*name++ =='/') ; // skip /d0
+        while(name[ns]!=0) ns++;
+    } else if (curdir==0 ) return 0; // no current directory
     int ps = ns;
-    if (curdir==0 && name[0]!='/') return 0; // no current directory
     char *base ; 
-    if (name[0]!='/') { base = curdir->name; ps += strlen(curdir->name)+1; }
+    if (name[0]!='/') { name++; base = curdir->name; ps += strlen(curdir->name)+1; }
     else { base = drvRoot[pd->drv]; ps += strlen(drvRoot[pd->drv])+1; }
     char *path = (char*)malloc(ps+1);
     int i = 0;
@@ -272,10 +277,15 @@
  */
 void do_vdisk(Byte cmd) {
     int err;
-    PathDesc *pd = pdv + yreg;
-    PathDesc *curdir = pdv+mem[0x43+IOPAGE];
+    Byte mode = yreg&0xff;
+    PathDesc *pd = pdv + ((yreg>>8)&0xff);
+    PathDesc *curdir = pdv+mem[0x44+IOPAGE];  // garbage until set
     pd->drv = mem[0x41+IOPAGE];
-    Byte mode,attr ;
+    Byte attr ;
+    Word u =  mem[0x45+IOPAGE];   // caller's stack in system segment
+    xreg = (*smem(u+4)<<8)+*smem(u+5);
+    *areg = *smem(u+1);
+    *breg = *smem(u+2);
     char *path,*next,*buf;
 
     switch(cmd) {
@@ -642,6 +652,8 @@
                  */
                     *breg = 0xff;
                     if (pd==0) break;
+                    yreg = (*smem(u+6)<<8)+*smem(u+7);
+                    ureg = (*smem(u+8)<<8)+*smem(u+9);
                     *breg  = fdinfo(pmem(xreg),yreg,xreg*0x10000+ureg,pd);
                     break;
                 default:
@@ -675,6 +687,12 @@
             }
             break;
     }
+    // return value
+    mem[0xffc0] = *breg;
+    *smem(u+2) = *breg ;
+    *smem(u+4) = (xreg & 0xff00) >> 8;
+    *smem(u+5) = xreg & 0xff;
+
 }