changeset 47:15f1e1b49928

open dir worked ?
author Shinji KONO <kono@ie.u-ryukyu.ac.jp>
date Fri, 20 Jul 2018 17:04:49 +0900
parents ec9f494497e1
children ea1b17311bf3
files io.c os9/level2/vrbf.asm vdisk.c
diffstat 3 files changed, 97 insertions(+), 83 deletions(-) [+]
line wrap: on
line diff
--- a/io.c	Fri Jul 20 11:48:19 2018 +0900
+++ b/io.c	Fri Jul 20 17:04:49 2018 +0900
@@ -81,6 +81,8 @@
  *   IOPAGE + 0x44   LSN0     
  *   IOPAGE + 0x45   ADR2               / VDISK caller stack
  *   IOPAGE + 0x46   ADR1
+ *   IOPAGE + 0x47                      / VDISK path descriptor address (Y)
+ *   IOPAGE + 0x48   
  *
  *
  */
--- a/os9/level2/vrbf.asm	Fri Jul 20 11:48:19 2018 +0900
+++ b/os9/level2/vrbf.asm	Fri Jul 20 17:04:49 2018 +0900
@@ -95,8 +95,8 @@
          orcc  #IntMasks
          bsr   setuppd
          ldb   #$d2
-         stb   ,u
-         ldb   ,u
+         stb   ,x
+         ldb   ,x
          cmpb  #0
          beq   ok00
          bra   er00
@@ -110,24 +110,24 @@
 *         PD.DRV,y    drive number
 
 setuppd  ldx   #$FFc0           vdisk port
+         sty   7,x              path descriptor
          stu   5,x              caller stack
          lda   <PD.DRV,y
          sta   1,x
          clra
-         ldx   <D.Proc          get process pointer
-         cmpx  <D.SysPrc
+         ldy   <D.Proc          get process pointer
+         cmpy  <D.SysPrc
          beq   sysmode
          lda   #1
 sysmode  sta   2,x
          lda   R$A,u
          bita  #EXEC.
          bne   usechx
-         ldd   P$DIO+4,x        get curwdir #pdnumber
+         ldd   P$DIO+4,y        get curwdir #pdnumber
          bra   s1
-usechx   ldd   P$DIO+10,x       get curxdir #pdnumber
+usechx   ldd   P$DIO+10,y       get curxdir #pdnumber
 s1       
-         ldu   #$FFc0
-         std   3,u
+         std   3,x
          rts
 
 er00     puls  y,u,cc
@@ -149,8 +149,8 @@
          orcc  #IntMasks
          bsr   setuppd
          ldb   #$d3
-         stb   ,u
-         ldb   ,u
+         stb   ,x
+         ldb   ,x
          cmpb  #0
          beq   ok00
          bra   er00
@@ -169,8 +169,8 @@
          orcc  #IntMasks
          bsr   setuppd
          ldb   #$db
-         stb   ,u
-         ldb   ,u
+         stb   ,x
+         ldb   ,x
          cmpb  #0
          beq   ok00
          bra   er00
@@ -189,8 +189,10 @@
          orcc  #IntMasks
          bsr   setuppd
          ldb   #$d4
-         stb   ,u
-         ldb   ,u
+         stb   ,x
+         ldb   ,x
+         ldy   1,s
+         ldx   <D.Proc          get process pointer
          ldu   PD.RGS,y
          lda   R$A,u
          ldb   PD.MOD,y		get current file mode
@@ -221,8 +223,8 @@
          orcc  #IntMasks
          lbsr   setuppd
          ldb   #$d5
-         stb   ,u
-         ldb   ,u
+         stb   ,x
+         ldb   ,x
          cmpb  #0
          beq   ok01
          bra   er01
@@ -241,8 +243,8 @@
          orcc  #IntMasks
          lbsr   setuppd
          ldb   #$d6
-         stb   ,u
-         ldb   ,u
+         stb   ,x
+         ldb   ,x
          cmpb  #0
          beq   ok01
          bra   er01
@@ -261,8 +263,8 @@
          orcc  #IntMasks
          lbsr   setuppd
          ldb   #$d7
-         stb   ,u
-         ldb   ,u
+         stb   ,x
+         ldb   ,x
          beq   ok01
          bra   er01
 
@@ -280,8 +282,8 @@
          orcc  #IntMasks
          lbsr   setuppd
          ldb   #$d8
-         stb   ,u
-         ldb   ,u
+         stb   ,x
+         ldb   ,x
          beq   ok01
          bra   er01
 
@@ -300,8 +302,8 @@
          orcc  #IntMasks
          lbsr   setuppd
          ldb   #$d9
-         stb   ,u
-         ldb   ,u
+         stb   ,x
+         ldb   ,x
          beq   ok01
          bra   er01
 
@@ -319,8 +321,8 @@
          orcc  #IntMasks
          lbsr   setuppd
          ldb   #$da
-         stb   ,u
-         ldb   ,u
+         stb   ,x
+         ldb   ,x
          beq   ok01
 er01     puls  y,u,cc
          orcc  #Carry
@@ -342,8 +344,8 @@
          ldb   R$B,u		get function code
          lbsr   setuppd
          ldb   #$dc
-         stb   ,u
-         ldb   ,u
+         stb   ,x
+         ldb   ,x
          beq   ok01
          bra   er01
 
@@ -363,8 +365,8 @@
          ldb   R$B,u		get function code
          lbsr   setuppd
          ldb   #$dd
-         stb   ,u
-         ldb   ,u
+         stb   ,x
+         ldb   ,x
          beq   ok01
          bra   er01
 
--- a/vdisk.c	Fri Jul 20 11:48:19 2018 +0900
+++ b/vdisk.c	Fri Jul 20 17:04:49 2018 +0900
@@ -14,14 +14,19 @@
 #include <sys/select.h>
 #include <dirent.h>
 #include <string.h>
+#include <time.h>
+
 
 
 #ifdef USE_MMU
 extern char *prog ;   // for disass
 extern Byte * mem0(Byte *iphymem, Word adr, Byte *immu) ;
+//  pmem physical address using current mmu
+//  smem physical address using system mmu
+//  umem physical address using caller's mmu
 #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]))
+#define umem(a)  (mem[0x42+IOPAGE]?mem0(phymem,a,&mem[0x28+IOPAGE]):mem0(phymem,a,&mem[0x20+IOPAGE]))
 #else
 #define pmem(a)  (&mem[a])
 #define umem(a)  (&mem[a])
@@ -56,22 +61,6 @@
     return 0;
 }
 
-PathDesc *findPD() {
-    for(int i=0;i<MAXPDV;i++) {
-        if (!pdv[i].use) {
-            pdv[i].use = 1;
-            pdv[i].num = i;
-            pdv[i].mode = 0;
-            pdv[i].fp = 0;
-            pdv[i].dirfp = 0;
-            pdv[i].name = 0;
-            pdv[i].fd = 0;
-            return &pdv[i];
-        }
-    }
-    return 0;
-}
-
 void closepd(PathDesc *pd) {
     int err = fclose(pd->fp) ;
     pd->use = 0;
@@ -86,14 +75,20 @@
 
 char *addCurdir(char *name, PathDesc *pd, PathDesc *curdir) {
     int ns =0 ;
+    char *n = name;
     if (name[0]=='/') {
-        while(*name++ =='/') ; // skip /d0
+        while(*name !='/' && *name!=0) name ++ ; // skip /d0
         while(name[ns]!=0) ns++;
-    } else if (curdir==0 ) return 0; // no current directory
+    } else if (curdir==0 || !curdir->name ) return 0; // no current directory
     int ps = ns;
     char *base ; 
-    if (name[0]!='/') { name++; base = curdir->name; ps += strlen(curdir->name)+1; }
-    else { base = drvRoot[pd->drv]; ps += strlen(drvRoot[pd->drv])+1; }
+    if (name[0]-='/') { 
+        base = drvRoot[pd->drv]; ps += strlen(drvRoot[pd->drv])+1; 
+    } else if (name[0]==0) { 
+        return drvRoot[pd->drv]; 
+    } else { 
+        name++; base = curdir->name; ps += strlen(curdir->name)+1; 
+    }
     char *path = (char*)malloc(ps+1);
     int i = 0;
     for(;base[i];i++) path[i] = base[i];
@@ -107,14 +102,16 @@
     char *p = path;
     char *name = path;
     int maxlen = MAXPAHTLEN;
-    while(*p!=0 && (*p&80)==0 && maxlen-->0) p++;
+    while(*p!=0 && (*p&0x80)==0 && (*p>0x1f) && maxlen-->0) p++;
     if (maxlen==MAXPAHTLEN) return 0;
     if (*p!=0) {
         name = (char *)malloc(p-path+1); 
-        strncpy(path,p, MAXPAHTLEN-maxlen);
+        strncpy(name,path, MAXPAHTLEN-maxlen);
+        name[MAXPAHTLEN-maxlen] = 0;
     }
     char *name1 = addCurdir(name,pd,curdir);
     if (name1!=name && name1!=path) free(name);
+    if (name1==0) return 0;
     pd->name = name1;
     return p;
 }
@@ -191,6 +188,7 @@
     DIR *dir;
     struct dirent *dp;
     dir = opendir(pd->name);
+    if (dir==0) return -1;
     int dircount = 0;
     while ((dp = readdir(dir)) != NULL) dircount++;   // pass 1 to determine the size
     if (dircount==0) return 0;  // should contains . and .. at least
@@ -199,18 +197,18 @@
     rewinddir(dir);
     int i = 0;
     while ((dp = readdir(dir)) != NULL) {
-        i += DIR_SZ;
-        if (i>pd->sz) return 0;
         int j = 0;
         for(j = 0; j < DIR_NM ; j++) {
             if (j< dp->d_namlen) 
-               pd->dirfp[j] = dp->d_name[j];
+               pd->dirfp[i+j] = dp->d_name[j];
             else
-               pd->dirfp[j] = 0;
+               pd->dirfp[i+j] = 0;
         }
-        pd->dirfp[j] = (dp->d_ino&0xff0000)>>16;
-        pd->dirfp[j+1] = (dp->d_ino&0xff00)>>8;
-        pd->dirfp[j+2] = dp->d_ino&0xff;
+        pd->dirfp[i+j] = (dp->d_ino&0xff0000)>>16;
+        pd->dirfp[i+j+1] = (dp->d_ino&0xff00)>>8;
+        pd->dirfp[i+j+2] = dp->d_ino&0xff;
+        i += DIR_SZ;
+        if (i>pd->sz) return 0;
     }
     pd->fp = fmemopen(pd->dirfp,pd->sz,"r");
     return 0;
@@ -218,6 +216,14 @@
 
 void os9setdate(char *d,struct timespec * unixtime) {
     //   yymmddhhss
+    struct tm r;
+    localtime_r(&unixtime->tv_sec,&r);
+    d[0] = r.tm_year-2000;
+    d[1] = r.tm_mon;
+    d[2] = r.tm_mday;
+    d[3] = r.tm_hour;
+    d[4] = r.tm_min;
+    d[5] = r.tm_sec;
 }
 
 /* read file descriptor of Path Desc 
@@ -277,15 +283,17 @@
  */
 void do_vdisk(Byte cmd) {
     int err;
-    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 attr ;
-    Word u =  mem[0x45+IOPAGE];   // caller's stack in system segment
+    Word u =  (mem[0x45+IOPAGE]<<8)+mem[0x46+IOPAGE];   // caller's stack in system segment
     xreg = (*smem(u+4)<<8)+*smem(u+5);
     *areg = *smem(u+1);
     *breg = *smem(u+2);
+    Byte mode = yreg&0xff;
+    Byte *os9pd = smem((mem[0x47+IOPAGE]<<8)+mem[0x48+IOPAGE]);
+    PathDesc *pd = pdv+*os9pd;
+    pd->num = *os9pd;
+    pd->drv = mem[0x41+IOPAGE];
     char *path,*next,*buf;
 
     switch(cmd) {
@@ -303,11 +311,9 @@
         *        B = errcode
         */
         case 0xd1:
-            pd = findPD();
-            if (pd==0) { *breg = 0xff; break; }
             mode = *areg;
             attr = *breg;
-            path = (char *)pmem(xreg);
+            path = (char *)umem(xreg);
             next = pd->name  = checkFileName(path,pd,curdir);
             pd->dir = 0;
             pd->fp = fopen(pd->name, os9toUnixAttr(attr));
@@ -317,6 +323,7 @@
             } else  {
                 *breg = 0xff;
                 free(pd->name);
+                pd->use = 0;
             }
             break;
 
@@ -333,14 +340,13 @@
         *        B = errcode
         */
         case 0xd2:
-            pd = findPD();
             *breg = 0xff;
-            if (pd==0) break; 
             mode = *areg;
             attr = *breg;
             pd->fp = 0;
-            path = (char*)pmem(xreg);
+            path = (char*)umem(xreg);
             next = checkFileName(path,pd,curdir);
+            *breg = 0xff;
             if (next!=0) {
                 struct stat buf;
                 if (stat(pd->name,&buf)!=0) break;
@@ -351,11 +357,16 @@
                     pd->dir = 0;
                     pd->fp = fopen( pd->name,os9toUnixAttr(mode));
                 }
+                pd->use = 1;
             }
             if (next!=0 && pd->fp !=0) {
+                *breg = 0;
                 *areg = pd->num;
                 xreg += ( next - path );
-            } 
+                pd->use = 1;
+            } else {
+                pd->use = 0;
+            }
             break;
 
         /*
@@ -371,10 +382,8 @@
         */
 
         case 0xd3:
-            pd = findPD();
             *breg = 0xff;
-            if (pd==0) break; 
-            path = (char*)pmem(xreg);
+            path = (char*)umem(xreg);
             next =  checkFileName(path,pd,curdir);
             if (next!=0 &&  mkdir(pd->name,0)!= 0 ) {
                 xreg += ( next - path );
@@ -405,9 +414,7 @@
         *        B = errcode
         */
         case 0xd4:
-            pd = findPD();
-            if (pd==0) { *breg = 0xff; break; }
-            path = (char*)pmem(xreg);
+            path = (char*)umem(xreg);
             next = checkFileName(path,pd,curdir);
             if (next!=0 && os9opendir(pd)) {
                 if (curdir!=pd) closepd(curdir);
@@ -416,6 +423,7 @@
                 }
                 xreg += ( next - path );
                 *areg = pd->num;
+                pd->use = 1;
                 *breg = 0;
                 break;
             } 
@@ -436,8 +444,9 @@
             *breg = 0xff;
             if (pd==0) break;
             struct stat st;
-            path = (char*)pmem(xreg);
+            path = (char*)umem(xreg);
             next = checkFileName(path,pd,curdir);
+            pd->use = 0;
             if (next!=0 && stat(pd->name,&st)!=0) break;
             if (next!=0 && ((st.st_mode&S_IFDIR)?rmdir(pd->name):unlink(pd->name)) == 0) {
                 xreg += ( next - path );
@@ -488,7 +497,7 @@
             *breg = 0xff;
             if (pd==0) break;
             if (pd->dir) break;
-            buf = (char*)pmem(xreg);
+            buf = (char*)umem(xreg);
             if (fgets(buf,yreg,pd->fp)) {
                 int len = yreg;
                 int i;
@@ -514,7 +523,7 @@
         case 0xd8:
             *breg = 0xff;
             if (pd==0) break;
-            buf = (char*)pmem(xreg);
+            buf = (char*)umem(xreg);
             err =  fread(buf,yreg,1,pd->fp);
             *breg = err==0?0xff:0 ;
             yreg = err ;
@@ -541,7 +550,7 @@
             if (pd->dir) break;
             int len = yreg;
             int i = 0;
-            Byte *buf = pmem(xreg);
+            Byte *buf = umem(xreg);
             while(len>0 && *buf !='\r') {
                 fputc(buf[i++],pd->fp);
                 len--;
@@ -567,7 +576,7 @@
         case 0xda :
             *breg = 0xff;
             if (!pd->dir) {
-                Byte *buf = pmem(xreg);
+                Byte *buf = umem(xreg);
                 int len = yreg;
                 int err = fwrite(buf,len,1,pd->fp);
                 *breg = err?0xff:0;
@@ -637,8 +646,9 @@
                  *   this should be handled in vrbf
                  */
                     *breg = 0xff;
+                    yreg = (*smem(u+6)<<8)+*smem(u+7);
                     if (pd==0) break;
-                    *breg = filedescriptor(pmem(xreg), yreg,pd) ;
+                    *breg = filedescriptor(umem(xreg), yreg,pd) ;
                     break;
                 case 0x20: // Pos.FDInf    mandatry for dir command
                 /*         SS.FDInf ($20) - Directly reads a file descriptor from anywhere