changeset 48:ea1b17311bf3

dir /v0 worked but dir /v0/src and chd /v0; dir does not
author Shinji KONO <kono@ie.u-ryukyu.ac.jp>
date Fri, 20 Jul 2018 21:28:57 +0900
parents 15f1e1b49928
children 947cbecdd8d5
files io.c os9/level2/vrbf.asm vdisk.c
diffstat 3 files changed, 48 insertions(+), 29 deletions(-) [+]
line wrap: on
line diff
--- a/io.c	Fri Jul 20 17:04:49 2018 +0900
+++ b/io.c	Fri Jul 20 21:28:57 2018 +0900
@@ -342,6 +342,7 @@
 #ifdef USE_VDISK
    } else  {
        do_vdisk(c);
+       return;
 #endif
    }
    mem[IOPAGE+0x40] = 0;
--- a/os9/level2/vrbf.asm	Fri Jul 20 17:04:49 2018 +0900
+++ b/os9/level2/vrbf.asm	Fri Jul 20 21:28:57 2018 +0900
@@ -126,12 +126,13 @@
          ldd   P$DIO+4,y        get curwdir #pdnumber
          bra   s1
 usechx   ldd   P$DIO+10,y       get curxdir #pdnumber
-s1       
-         std   3,x
+s1       std   3,x
          rts
 
 er00     puls  y,u,cc
-         orcc  #Carry
+         lda   R$Cc,u
+         ora   #Carry
+         sta   R$Cc,u
          rts
 ok00     puls  y,u,cc,pc
 
@@ -325,6 +326,9 @@
          ldb   ,x
          beq   ok01
 er01     puls  y,u,cc
+         lda   R$Cc,u
+         ora   #Carry
+         sta   R$Cc,u
          orcc  #Carry
          rts
 ok01     puls  y,u,cc,pc
--- a/vdisk.c	Fri Jul 20 17:04:49 2018 +0900
+++ b/vdisk.c	Fri Jul 20 21:28:57 2018 +0900
@@ -62,13 +62,13 @@
 }
 
 void closepd(PathDesc *pd) {
-    int err = fclose(pd->fp) ;
+    if(pd->fp) fclose(pd->fp) ;
+    pd->dir = 0;
     pd->use = 0;
     pd->fp = 0;
     pd->mode = 0;
     free(pd->dirfp); pd->dirfp = 0;
     free(pd->name); pd->name = 0;
-    free(pd->fd); pd->fd = 0;
 }
 
 #define MAXPAHTLEN 256
@@ -85,7 +85,12 @@
     if (name[0]-='/') { 
         base = drvRoot[pd->drv]; ps += strlen(drvRoot[pd->drv])+1; 
     } else if (name[0]==0) { 
-        return drvRoot[pd->drv]; 
+        base = drvRoot[pd->drv];
+        char *path = (char*)malloc(strlen(base)+1);   // we'll free this, malloc it.
+        int i = 0;
+        for(;base[i];i++) path[i] = base[i];
+        path[i]=0;
+        return path;
     } else { 
         name++; base = curdir->name; ps += strlen(curdir->name)+1; 
     }
@@ -187,6 +192,7 @@
 int os9opendir(PathDesc *pd) {
     DIR *dir;
     struct dirent *dp;
+    if (pd->dirfp) return 0; // already opened
     dir = opendir(pd->name);
     if (dir==0) return -1;
     int dircount = 0;
@@ -199,9 +205,11 @@
     while ((dp = readdir(dir)) != NULL) {
         int j = 0;
         for(j = 0; j < DIR_NM ; j++) {
-            if (j< dp->d_namlen) 
-               pd->dirfp[i+j] = dp->d_name[j];
-            else
+            if (j< dp->d_namlen)  {
+               pd->dirfp[i+j] = dp->d_name[j]&0x7f;
+               if (j== dp->d_namlen-1)  
+                  pd->dirfp[i+j] |= 0x80;    // os9 EOL
+            } else
                pd->dirfp[i+j] = 0;
         }
         pd->dirfp[i+j] = (dp->d_ino&0xff0000)>>16;
@@ -287,6 +295,7 @@
     Byte attr ;
     Word u =  (mem[0x45+IOPAGE]<<8)+mem[0x46+IOPAGE];   // caller's stack in system segment
     xreg = (*smem(u+4)<<8)+*smem(u+5);
+    yreg = (*smem(u+6)<<8)+*smem(u+7);
     *areg = *smem(u+1);
     *breg = *smem(u+2);
     Byte mode = yreg&0xff;
@@ -416,11 +425,8 @@
         case 0xd4:
             path = (char*)umem(xreg);
             next = checkFileName(path,pd,curdir);
-            if (next!=0 && os9opendir(pd)) {
+            if (next!=0 && os9opendir(pd)==0) {
                 if (curdir!=pd) closepd(curdir);
-                if (pd->name != path) {
-                    free(path);
-                }
                 xreg += ( next - path );
                 *areg = pd->num;
                 pd->use = 1;
@@ -470,7 +476,6 @@
         */
         case 0xd6: {
             *breg = 0xff;
-            if (pd==0) break;
             off_t seek = (xreg<<16)+yreg;
             *breg = fseek(pd->fp,(off_t)seek,SEEK_SET);
             break;
@@ -495,11 +500,17 @@
         */
         case 0xd7:
             *breg = 0xff;
-            if (pd==0) break;
-            if (pd->dir) break;
             buf = (char*)umem(xreg);
-            if (fgets(buf,yreg,pd->fp)) {
-                int len = yreg;
+            char *b;
+            if ((b=fgets(buf,yreg,pd->fp))) {
+                // set y 
+                *smem(u+6) = (err>>8)&0xff;
+                *smem(u+7) = err&0xff;
+                if (b==0) {
+                    *breg = 0xd3;
+                    break;
+                }
+                int len = err;
                 int i;
                 for(i=0;i<len && buf[i];i++);
                 if (i>0 && buf[i-1]=='\n') {
@@ -522,11 +533,12 @@
         */
         case 0xd8:
             *breg = 0xff;
-            if (pd==0) break;
             buf = (char*)umem(xreg);
-            err =  fread(buf,yreg,1,pd->fp);
-            *breg = err==0?0xff:0 ;
-            yreg = err ;
+            int i =  fread(buf,1,yreg,pd->fp);
+            // set y 
+            *smem(u+6) = (i>>8)&0xff;
+            *smem(u+7) = i&0xff;
+            *breg = (i==0?0xd3:0) ;
             break;
 
         /*
@@ -544,9 +556,8 @@
         * Error: CC Carry set
         *        B = errcode
         */
-        case 0xd9:
+        case 0xd9: {
             *breg = 0xff;
-            if (pd==0) break;
             if (pd->dir) break;
             int len = yreg;
             int i = 0;
@@ -560,8 +571,11 @@
                 i++;
             }
             *breg = 0;
-            yreg = i;
+            // set y 
+            *smem(u+6) = (i>>8)&0xff;
+            *smem(u+7) = i&0xff;
             break; 
+         }
 
         /*
         * I$Write Entry Point
@@ -578,9 +592,11 @@
             if (!pd->dir) {
                 Byte *buf = umem(xreg);
                 int len = yreg;
-                int err = fwrite(buf,len,1,pd->fp);
+                int err = fwrite(buf,1,len,pd->fp);
                 *breg = err?0xff:0;
-                yreg = err; 
+                // set y 
+                *smem(u+6) = (i>>8)&0xff;
+                *smem(u+7) = i&0xff;
             }
             break;
 
@@ -646,7 +662,6 @@
                  *   this should be handled in vrbf
                  */
                     *breg = 0xff;
-                    yreg = (*smem(u+6)<<8)+*smem(u+7);
                     if (pd==0) break;
                     *breg = filedescriptor(umem(xreg), yreg,pd) ;
                     break;
@@ -662,7 +677,6 @@
                  */
                     *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;