# HG changeset patch # User Shinji KONO # Date 1532089737 -32400 # Node ID ea1b17311bf3b1dfbcdd7409d804d1566381a568 # Parent 15f1e1b49928abaa6d1f3aafc21d93444f3971a6 dir /v0 worked but dir /v0/src and chd /v0; dir does not diff -r 15f1e1b49928 -r ea1b17311bf3 io.c --- 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; diff -r 15f1e1b49928 -r ea1b17311bf3 os9/level2/vrbf.asm --- 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 diff -r 15f1e1b49928 -r ea1b17311bf3 vdisk.c --- 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;i0 && 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;