Mercurial > hg > Members > kono > os9 > sbc09
diff vdisk.c @ 46:ec9f494497e1
vdisk fix
author | Shinji KONO <kono@ie.u-ryukyu.ac.jp> |
---|---|
date | Fri, 20 Jul 2018 11:48:19 +0900 |
parents | 07c84761da6f |
children | 15f1e1b49928 |
line wrap: on
line diff
--- a/vdisk.c Thu Jul 19 16:21:47 2018 +0900 +++ b/vdisk.c Fri Jul 20 11:48:19 2018 +0900 @@ -20,10 +20,12 @@ extern char *prog ; // for disass extern Byte * mem0(Byte *iphymem, Word adr, Byte *immu) ; #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])) #else #define pmem(a) (&mem[a]) #define umem(a) (&mem[a]) +#define smem(a) (&mem[a]) #endif #define MAXPDV 256 @@ -45,7 +47,7 @@ #define MAXVDRV 4 -char drvRoot[] = { '.','.','.','.'}; +char *drvRoot[] = { ".",".",".","."}; PathDesc pdv[MAXPDV]; int setVdisk(int drv,char *name) { @@ -83,11 +85,14 @@ #define MAXPAHTLEN 256 char *addCurdir(char *name, PathDesc *pd, PathDesc *curdir) { - int ns = strlen(name); + int ns =0 ; + if (name[0]=='/') { + while(*name++ =='/') ; // skip /d0 + while(name[ns]!=0) ns++; + } else if (curdir==0 ) return 0; // no current directory int ps = ns; - if (curdir==0 && name[0]!='/') return 0; // no current directory char *base ; - if (name[0]!='/') { base = curdir->name; ps += strlen(curdir->name)+1; } + if (name[0]!='/') { name++; 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; @@ -272,10 +277,15 @@ */ void do_vdisk(Byte cmd) { int err; - PathDesc *pd = pdv + yreg; - PathDesc *curdir = pdv+mem[0x43+IOPAGE]; + 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 mode,attr ; + Byte attr ; + Word u = mem[0x45+IOPAGE]; // caller's stack in system segment + xreg = (*smem(u+4)<<8)+*smem(u+5); + *areg = *smem(u+1); + *breg = *smem(u+2); char *path,*next,*buf; switch(cmd) { @@ -642,6 +652,8 @@ */ *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; default: @@ -675,6 +687,12 @@ } break; } + // return value + mem[0xffc0] = *breg; + *smem(u+2) = *breg ; + *smem(u+4) = (xreg & 0xff00) >> 8; + *smem(u+5) = xreg & 0xff; + }