# HG changeset patch # User Shinji KONO # Date 1532073889 -32400 # Node ID 15f1e1b49928abaa6d1f3aafc21d93444f3971a6 # Parent ec9f494497e1d08c6325c2768b16ecbfaa292c2d open dir worked ? diff -r ec9f494497e1 -r 15f1e1b49928 io.c --- 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 * * */ diff -r ec9f494497e1 -r 15f1e1b49928 os9/level2/vrbf.asm --- 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 #include #include +#include + #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;ifp) ; 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