changeset 45:07c84761da6f

dd vrbf asm code
author Shinji KONO <kono@ie.u-ryukyu.ac.jp>
date Thu, 19 Jul 2018 16:21:47 +0900
parents b26c23331d02
children ec9f494497e1
files io.c os9/level2/vrbf.asm vdisk.c
diffstat 3 files changed, 415 insertions(+), 49 deletions(-) [+]
line wrap: on
line diff
--- a/io.c	Thu Jul 19 11:31:17 2018 +0900
+++ b/io.c	Thu Jul 19 16:21:47 2018 +0900
@@ -71,10 +71,11 @@
  *   IOPAGE + 0x31-  YY/MM/DD/HH/MM/SS
  *
  *   IOPAGE + 0x40   Disk control        0x81 read/0x55 write   0 ... ok / 0xff .. error
- *   IOPAGE + 0x41   drive no / ( VDISK  0 for system, 1 for user )
- *   IOPAGE + 0x42   LSN2
- *   IOPAGE + 0x43   LSN1
- *   IOPAGE + 0x44   LSN0
+ *                                       0xd1- VDISK command
+ *   IOPAGE + 0x41   drive no           / VDISK drv
+ *   IOPAGE + 0x42   LSN2               / VDISK sysmode  0 for system, 1 for user 
+ *   IOPAGE + 0x43   LSN1               / VDISK Curdir pd number
+ *   IOPAGE + 0x44   LSN0               / VDISK file attribute
  *   IOPAGE + 0x45   ADR2
  *   IOPAGE + 0x46   ADR1
  *
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/os9/level2/vrbf.asm	Thu Jul 19 16:21:47 2018 +0900
@@ -0,0 +1,343 @@
+********************************************************************
+* Virtual RBF - Random Block File Manager
+*
+
+         nam   VRBF
+         ttl   VRandom Block File Manager
+
+         ifp1  
+         use   defsfile
+         endc  
+
+rev      set   $00
+ty       set   FlMgr
+         IFNE  H6309
+lg       set   Obj6309
+         ELSE
+lg       set   Objct
+         ENDC
+tylg     set   ty+lg
+atrv     set   ReEnt+rev
+edition  set   37
+
+         org   $00
+size     equ   .
+
+         mod   eom,name,tylg,atrv,start,size
+
+name     fcs   /VRBF/
+         fcb   edition
+
+*L0012    fcb   DRVMEM
+
+
+****************************
+*
+* Main entry point for RBF
+*
+* Entry: Y = Path descriptor pointer
+*        U = Register stack pointer
+
+start    bra   Create
+         nop   
+         lbra  Open
+         lbra  MakDir
+         lbra  ChgDir
+         lbra  Delete
+         lbra  Seek
+         lbra  Read
+         lbra  Write
+         lbra  ReadLn
+         lbra  WriteLn
+         lbra  GetStat
+         lbra  SetStat
+         lbra  Close
+
+
+*
+* I$Create Entry Point
+*
+* Entry: A = access mode desired (0 read, 1 write, 2 update, bit 4 for exex)
+*        B = file attributes
+*        X = address of the pathlist
+*
+* Exit:  A = pathnum
+*        X = last byte of pathlist address
+*
+* Error: CC Carry set
+*        B = errcode
+*
+Create   pshs  y,u		Preserve path desc ptr
+         sta   PD.MOD,y
+         bsr   setuppd
+         stb   4,u              put file attribute
+         ldb   #$d0
+         stb   ,u
+         ldb   ,u
+         beq   ok00
+err00    orcc  #$1
+ok00     pull  y,u,pc
+
+setuppd  pshs  x   
+         ldu   #$FFc0           vdisk port
+         lda   <PD.DRV,y
+         sta   1,u
+         ldx   <D.Proc          get process pointer
+         cmpx  <D.SysPrc
+         beq   sysmode
+         lda   #0
+sysmode  sta   2,u
+         lda   PD.MOD,y
+         bita  #EXEC.
+         bne   usechx
+         lda   P$DIO+5,x        get curwdir #pdnumber
+         bra   s1
+usechx   lda   P$DIO+11,x       get curxdir #pdnumber
+s1       sta   3,u
+         ldy   PD.PD,y          path number and mode
+         puls  x,pc
+
+*
+* I$Open Entry Point
+*
+* Entry: A = access mode desired
+*        X = address of the pathlist
+*
+* Exit:  A = pathnum
+*        X = last byte of pathlist address
+*
+* Error: CC Carry set
+*        B = errcode
+*
+Open     pshs  y,u
+         sta   PD.MOD,y
+         bsr   setuppd
+         ldb   #$d1
+         stb   ,u
+         ldb   ,u
+         beq   ok00
+         bra   er00
+
+*
+* I$MakDir Entry Point
+*
+* Entry: X = address of the pathlist
+*
+* Exit:  X = last byte of pathlist address
+*
+* Error: CC Carry set
+*        B = errcode
+*
+MakDir   pshs  y,u
+         sta   PD.MOD,y
+         bsr   setuppd
+         ldb   #$d2
+         stb   ,u
+         ldb   ,u
+         beq   ok00
+         bra   er00
+
+
+*
+* I$Close Entry Point
+*
+* Entry: A = path number
+*
+* Exit:
+*
+* Error: CC Carry set
+*        B = errcode
+*
+Close    pshs  y,u
+         bsr   setuppd
+         ldb   #$db
+         stb   ,u
+         ldb   ,u
+         beq   ok00
+         bra   er00
+
+
+*
+* I$ChgDir Entry Point
+*
+* Entry:
+*
+* Exit:
+*
+* Error: CC Carry set
+*        B = errcode
+*
+ChgDir   pshs  y,u
+         bsr   setuppd
+         ldb   #$d4
+         stb   ,u
+         ldb   ,u
+         bne   er00
+
+         ldb   PD.MOD,y		get current file mode
+         bitb  #UPDAT.		read or write mode?
+         beq   CD30D		no, skip ahead
+* Change current data dir
+         sta   P$DIO+5,x
+CD30D    bitb  #EXEC.		is it execution dir?
+         beq   CD31C		no, skip ahead
+* Change current execution directory
+         sta   P$DIO+11,x
+         bra   ok00
+
+*
+* I$Delete Entry Point
+*
+* Entry:
+*
+* Exit:
+*
+* Error: CC Carry set
+*        B = errcode
+*
+*
+Delete   pshs  y,u
+         bsr   setuppd
+         ldb   #$d5
+         stb   ,u
+         ldb   ,u
+         beq   ok00
+         bra   er00
+
+*
+* I$Seek Entry Point
+*
+* Entry:
+*
+* Exit:
+*
+* Error: CC Carry set
+*        B = errcode
+*
+Seek     pshs  y,u
+         bsr   setuppd
+         ldb   #$d6
+         stb   ,u
+         ldb   ,u
+         beq   ok00
+         bra   er00
+
+*
+* I$ReadLn Entry Point
+*
+* Entry:
+*
+* Exit:
+*
+* Error: CC Carry set
+*        B = errcode
+*
+ReadLn   pshs  y,u
+         bsr   setuppd
+         ldb   #$d7
+         stb   ,u
+         ldb   ,u
+         beq   ok00
+         bra   er00
+
+*
+* I$Read Entry Point
+*
+* Entry:
+*
+* Exit:
+*
+* Error: CC Carry set
+*        B = errcode
+*
+Read     pshs  y,u
+         bsr   setuppd
+         ldb   #$d8
+         stb   ,u
+         ldb   ,u
+         beq   ok00
+         bra   er00
+         beq   Read4BB		no, allow it
+         bsr   Read4BC		do reading
+
+
+*
+* I$WritLn Entry Point
+*
+* Entry:
+*
+* Exit:
+*
+* Error: CC Carry set
+*        B = errcode
+*
+WriteLn  pshs  y,u
+         bsr   setuppd
+         ldb   #$d9
+         stb   ,u
+         ldb   ,u
+         beq   ok00
+         bra   er00
+
+*
+* I$Write Entry Point
+*
+* Entry:
+*
+* Exit:
+*
+* Error: CC Carry set
+*        B = errcode
+*
+Write    pshs  y,u
+         bsr   setuppd
+         ldb   #$da
+         stb   ,u
+         ldb   ,u
+         beq   ok00
+         bra   er00
+
+*
+* I$GetStat Entry Point
+*
+* Entry:
+*
+* Exit:
+*
+* Error: CC Carry set
+*        B = errcode
+*
+GetStat  pshs  y,u
+         ldb   R$B,u		get function code
+         bsr   setuppd
+         ldb   #$dc
+         stb   ,u
+         ldb   ,u
+         beq   ok00
+         bra   er00
+
+
+*
+* I$SetStat Entry Point
+*
+* Entry:
+*
+* Exit:
+*
+* Error: CC Carry set
+*        B = errcode
+*
+SetStat  pshs  y,u
+         ldb   R$B,u		get function code
+         bsr   setuppd
+         ldb   #$dd
+         stb   ,u
+         ldb   ,u
+         beq   ok00
+         bra   er00
+
+
+         emod  
+eom      equ   *
+         end
+
--- a/vdisk.c	Thu Jul 19 11:31:17 2018 +0900
+++ b/vdisk.c	Thu Jul 19 16:21:47 2018 +0900
@@ -20,7 +20,7 @@
 extern char *prog ;   // for disass
 extern Byte * mem0(Byte *iphymem, Word adr, Byte *immu) ;
 #define pmem(a)  mem0(phymem,a,mmu)
-#define umem(a)  (mem[0x41+IOPAGE]?mem0(phymem,a,&mem[0x21+IOPAGE]):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])
@@ -28,31 +28,42 @@
 
 #define MAXPDV 256
 
+
 typedef struct pathDesc {
     char *name;
     FILE *fp;
     int mode;
     int inode ;  // lower 24 bit of unix inode, os9 lsn
     int num ;
+    int sz ;     // used only for directory
+    char drv ;
     char use ;
     char dir;
     char *fd ;
     char *dirfp;
 } PathDesc, *PathDescPtr;
 
+#define MAXVDRV 4
 
+char drvRoot[] = { '.','.','.','.'};
 PathDesc pdv[MAXPDV];
 
+int setVdisk(int drv,char *name) {
+    if (drv<0 || drv>=MAXVDRV) return -1;
+    drvRoot[drv] = name;
+    return 0;
+}
+
 PathDesc *findPD() {
     for(int i=0;i<MAXPDV;i++) {
         if (!pdv[i].use) {
             pdv[i].use = 1;
             pdv[i].num = i;
-            pd[i].mode = 0;
-            pd[i].fp = 0;
-            pd[i].dirfp = 0;
-            pd[i].name = 0;
-            pd[i].fd = 0;
+            pdv[i].mode = 0;
+            pdv[i].fp = 0;
+            pdv[i].dirfp = 0;
+            pdv[i].name = 0;
+            pdv[i].fd = 0;
             return &pdv[i];
         }
     }
@@ -71,18 +82,17 @@
 
 #define MAXPAHTLEN 256
 
-char *addCurdir(char *name, PathDesc *curdir) {
+char *addCurdir(char *name, PathDesc *pd, PathDesc *curdir) {
     int ns = strlen(name);
     int ps = ns;
-    int ds=0 ;
     if (curdir==0 && name[0]!='/') return 0; // no current directory
-    if (name[0]!='/') ps += (ds=strlen(curdir->name))+1;
+    char *base ; 
+    if (name[0]!='/') { 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;
-    if (ds) {
-        for(;i<ds;i++) path[i] = curdir->name[i];
-        path[i++] = '/';
-    }
+    for(;base[i];i++) path[i] = base[i];
+    path[i++] = '/';
     for(int j=0;j<ns;j++,i++) path[i] = name[j];
     path[i++] = 0;
     return path;
@@ -98,13 +108,13 @@
         name = (char *)malloc(p-path+1); 
         strncpy(path,p, MAXPAHTLEN-maxlen);
     }
-    char *name1 = addCurdir(name,curdir);
+    char *name1 = addCurdir(name,pd,curdir);
     if (name1!=name && name1!=path) free(name);
     pd->name = name1;
     return p;
 }
 
-void os9setmode(char &os9mode,int mode) {
+void os9setmode(char *os9mode,int mode) {
     char m = 0;
     if (mode&S_IFDIR) m|=0x80;
     if (mode&S_IRUSR) m|=0x01;
@@ -150,6 +160,15 @@
  * MINSEC         SET       16
  */
 
+#define FD_ATT 0 
+#define FD_OWN 1 
+#define FD_DAT 3 
+#define FD_LNK 8 
+#define FD_SIZ 9 
+#define FD_Creat 13 
+#define FD_SEG 16 
+
+
 /*
  *   os9 directory structure
  *
@@ -158,24 +177,25 @@
  *DIR.FD         RMB       3                   File descriptor physical sector number
  *DIR.SZ         EQU       .                   Directory record size
  */
+#define DIR_SZ 32
+#define DIR_NM 29
 
 
 /* read direcotry entry */
-int os9opendir(PathDesc pd) {
+int os9opendir(PathDesc *pd) {
     DIR *dir;
     struct dirent *dp;
     dir = opendir(pd->name);
-    pd->name=fname;
     int dircount = 0;
-    while ((dp = readdir(dirp)) != NULL) dircout++;   // pass 1 to determine the size
+    while ((dp = readdir(dir)) != NULL) dircount++;   // pass 1 to determine the size
     if (dircount==0) return 0;  // should contains . and .. at least
-    pd->sz = dircount*DIR_SZ
+    pd->sz = dircount*DIR_SZ;
     pd->dirfp = (char *)malloc(dircount*DIR_SZ);
     rewinddir(dir);
     int i = 0;
-    while ((dp = readdir(dirp)) != NULL) {
+    while ((dp = readdir(dir)) != NULL) {
         i += DIR_SZ;
-        if (i>pd->SZ) return 0;
+        if (i>pd->sz) return 0;
         int j = 0;
         for(j = 0; j < DIR_NM ; j++) {
             if (j< dp->d_namlen) 
@@ -183,14 +203,17 @@
             else
                pd->dirfp[j] = 0;
         }
-        pd->dirfp[j] = (d_ino&0xff0000)>>16;
-        pd->dirfp[j+1] = (d_ino&0xff00)>>8;
-        pd->dirfp[j+2] = d_ino&0xff;
+        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->fp = fmemopen(pd->dirfp,pd->sz,"r");
     return 0;
 }
 
+void os9setdate(char *d,struct timespec * unixtime) {
+    //   yymmddhhss
+}
 
 /* read file descriptor of Path Desc 
  *    create file descriptor sector if necessary
@@ -200,18 +223,18 @@
     struct stat st;
     if (pd->fd) return 1;
     pd->fd = (char *)malloc(256);
-    stat((pd->name,&st);
-    os9setmode(pd->fd,st.st_mode);
-    pd->fd+FD_OWN=(st.st_uid&0xff00)>>8;
-    pd->fd+FD_OWN+1=st.st_uid&0xff;
-    os9setdate(pd->fd,st.st_mtimespec);
-    pd->fd+FD_LNK+0=(st.st_uid&0xff000000)>>24;
-    pd->fd+FD_LNK+1=(st.st_uid&0xff0000)>>16;
-    pd->fd+FD_LNK+2=(st.st_uid&0xff00)>>8;
-    pd->fd+FD_LNK+3=st.st_nlink&0xff;
-    os9setdate(pd->fd,st.st_ctimespec);
+    stat(pd->name,&st);
+    os9setmode(pd->fd+FD_ATT,st.st_mode);
+    pd->fd[FD_OWN]=(st.st_uid&0xff00)>>8;
+    pd->fd[FD_OWN+1]=st.st_uid&0xff;
+    os9setdate(pd->fd + FD_DAT,&st.st_mtimespec);
+    pd->fd[FD_LNK+0]=(st.st_uid&0xff000000)>>24;
+    pd->fd[FD_LNK+1]=(st.st_uid&0xff0000)>>16;
+    pd->fd[FD_LNK+2]=(st.st_uid&0xff00)>>8;
+    pd->fd[FD_LNK+3]=st.st_nlink&0xff;
+    os9setdate(pd->fd+FD_Creat,&st.st_ctimespec);
     // dummy segment list
-    for(int i=0x10 ; i < 256; i++) pd->fd[i] = 0;
+    for(int i=FD_SEG ; i < 256; i++) pd->fd[i] = 0;
     return 0;
 }
 
@@ -221,7 +244,7 @@
  *     inode==0 should return disk id section
  *     inode==bitmap should return disk sector map for os9 free command
  */
-int fdinfo(Byte *buf,int len, int inode) {
+int fdinfo(Byte *buf,int len, int inode, PathDesc *pd) {
     int i;
     for(i=0;i<MAXPDV;i++) {
         PathDesc *pd = pdv+i;
@@ -231,7 +254,7 @@
         while( dir < dir + pd->sz ) {
             Byte *p = (Byte *)(dir + DIR_NM);
             int dinode = (p[0]<<16)+(p[1]<<8)+p[2];
-            if (inode == dir) {
+            if (inode == dinode) {
                 filedescriptor(buf,len,pd);
                 return 1;
             }
@@ -245,11 +268,13 @@
  *
  *   name or buffer, can be in a user map, pmem check that drive number ( mem[0x41+IOPAGE]  0 sys 1 user )
  *   current directory path number                                        mem[0x42+IOPAGE]  
+ *   yreg has pd number
  */
 void do_vdisk(Byte cmd) {
     int err;
-    PathDesc *pd = pdv + *areg;
-    PathDesc *curdir = pdv+mem[0x42+IOPAGE];
+    PathDesc *pd = pdv + yreg;
+    PathDesc *curdir = pdv+mem[0x43+IOPAGE];
+    pd->drv = mem[0x41+IOPAGE];
     Byte mode,attr ;
     char *path,*next,*buf;
 
@@ -305,7 +330,7 @@
             attr = *breg;
             pd->fp = 0;
             path = (char*)pmem(xreg);
-            next = pd->name = checkFileName(path,pd,curdir);
+            next = checkFileName(path,pd,curdir);
             if (next!=0) {
                 struct stat buf;
                 if (stat(pd->name,&buf)!=0) break;
@@ -313,11 +338,8 @@
                     pd->dir = 1;
                     os9opendir(pd);
                 } else {
-                    char *fname;
                     pd->dir = 0;
-                    if (curdir==0 && name[0]!='/') return 0; // no current directory
-                    pd->fp = fopen( fname=findfile(pd->name,curdir),"r+");
-                    free(fname);
+                    pd->fp = fopen( pd->name,os9toUnixAttr(mode));
                 }
             }
             if (next!=0 && pd->fp !=0) {
@@ -407,7 +429,7 @@
             path = (char*)pmem(xreg);
             next = checkFileName(path,pd,curdir);
             if (next!=0 && stat(pd->name,&st)!=0) break;
-            if (next!=0 && ((st->st_mode&S_IFDIR)?rmdir(pd->name):unlink(pd->name)) == 0) {
+            if (next!=0 && ((st.st_mode&S_IFDIR)?rmdir(pd->name):unlink(pd->name)) == 0) {
                 xreg += ( next - path );
                 *breg = 0;
             }