Mercurial > hg > Members > kono > os9 > sbc09
comparison 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 |
comparison
equal
deleted
inserted
replaced
45:07c84761da6f | 46:ec9f494497e1 |
---|---|
18 | 18 |
19 #ifdef USE_MMU | 19 #ifdef USE_MMU |
20 extern char *prog ; // for disass | 20 extern char *prog ; // for disass |
21 extern Byte * mem0(Byte *iphymem, Word adr, Byte *immu) ; | 21 extern Byte * mem0(Byte *iphymem, Word adr, Byte *immu) ; |
22 #define pmem(a) mem0(phymem,a,mmu) | 22 #define pmem(a) mem0(phymem,a,mmu) |
23 #define smem(a) mem0(phymem,a,&mem[0x20+IOPAGE]) | |
23 #define umem(a) (mem[0x42+IOPAGE]?mem0(phymem,a,&mem[0x21+IOPAGE]):mem0(phymem,a,&mem[0x20+IOPAGE])) | 24 #define umem(a) (mem[0x42+IOPAGE]?mem0(phymem,a,&mem[0x21+IOPAGE]):mem0(phymem,a,&mem[0x20+IOPAGE])) |
24 #else | 25 #else |
25 #define pmem(a) (&mem[a]) | 26 #define pmem(a) (&mem[a]) |
26 #define umem(a) (&mem[a]) | 27 #define umem(a) (&mem[a]) |
28 #define smem(a) (&mem[a]) | |
27 #endif | 29 #endif |
28 | 30 |
29 #define MAXPDV 256 | 31 #define MAXPDV 256 |
30 | 32 |
31 | 33 |
43 char *dirfp; | 45 char *dirfp; |
44 } PathDesc, *PathDescPtr; | 46 } PathDesc, *PathDescPtr; |
45 | 47 |
46 #define MAXVDRV 4 | 48 #define MAXVDRV 4 |
47 | 49 |
48 char drvRoot[] = { '.','.','.','.'}; | 50 char *drvRoot[] = { ".",".",".","."}; |
49 PathDesc pdv[MAXPDV]; | 51 PathDesc pdv[MAXPDV]; |
50 | 52 |
51 int setVdisk(int drv,char *name) { | 53 int setVdisk(int drv,char *name) { |
52 if (drv<0 || drv>=MAXVDRV) return -1; | 54 if (drv<0 || drv>=MAXVDRV) return -1; |
53 drvRoot[drv] = name; | 55 drvRoot[drv] = name; |
81 } | 83 } |
82 | 84 |
83 #define MAXPAHTLEN 256 | 85 #define MAXPAHTLEN 256 |
84 | 86 |
85 char *addCurdir(char *name, PathDesc *pd, PathDesc *curdir) { | 87 char *addCurdir(char *name, PathDesc *pd, PathDesc *curdir) { |
86 int ns = strlen(name); | 88 int ns =0 ; |
89 if (name[0]=='/') { | |
90 while(*name++ =='/') ; // skip /d0 | |
91 while(name[ns]!=0) ns++; | |
92 } else if (curdir==0 ) return 0; // no current directory | |
87 int ps = ns; | 93 int ps = ns; |
88 if (curdir==0 && name[0]!='/') return 0; // no current directory | |
89 char *base ; | 94 char *base ; |
90 if (name[0]!='/') { base = curdir->name; ps += strlen(curdir->name)+1; } | 95 if (name[0]!='/') { name++; base = curdir->name; ps += strlen(curdir->name)+1; } |
91 else { base = drvRoot[pd->drv]; ps += strlen(drvRoot[pd->drv])+1; } | 96 else { base = drvRoot[pd->drv]; ps += strlen(drvRoot[pd->drv])+1; } |
92 char *path = (char*)malloc(ps+1); | 97 char *path = (char*)malloc(ps+1); |
93 int i = 0; | 98 int i = 0; |
94 for(;base[i];i++) path[i] = base[i]; | 99 for(;base[i];i++) path[i] = base[i]; |
95 path[i++] = '/'; | 100 path[i++] = '/'; |
270 * current directory path number mem[0x42+IOPAGE] | 275 * current directory path number mem[0x42+IOPAGE] |
271 * yreg has pd number | 276 * yreg has pd number |
272 */ | 277 */ |
273 void do_vdisk(Byte cmd) { | 278 void do_vdisk(Byte cmd) { |
274 int err; | 279 int err; |
275 PathDesc *pd = pdv + yreg; | 280 Byte mode = yreg&0xff; |
276 PathDesc *curdir = pdv+mem[0x43+IOPAGE]; | 281 PathDesc *pd = pdv + ((yreg>>8)&0xff); |
282 PathDesc *curdir = pdv+mem[0x44+IOPAGE]; // garbage until set | |
277 pd->drv = mem[0x41+IOPAGE]; | 283 pd->drv = mem[0x41+IOPAGE]; |
278 Byte mode,attr ; | 284 Byte attr ; |
285 Word u = mem[0x45+IOPAGE]; // caller's stack in system segment | |
286 xreg = (*smem(u+4)<<8)+*smem(u+5); | |
287 *areg = *smem(u+1); | |
288 *breg = *smem(u+2); | |
279 char *path,*next,*buf; | 289 char *path,*next,*buf; |
280 | 290 |
281 switch(cmd) { | 291 switch(cmd) { |
282 /* | 292 /* |
283 * I$Create Entry Point | 293 * I$Create Entry Point |
640 * LSB - MSB of logical sector # | 650 * LSB - MSB of logical sector # |
641 * R$U= LSW of logical sector # | 651 * R$U= LSW of logical sector # |
642 */ | 652 */ |
643 *breg = 0xff; | 653 *breg = 0xff; |
644 if (pd==0) break; | 654 if (pd==0) break; |
655 yreg = (*smem(u+6)<<8)+*smem(u+7); | |
656 ureg = (*smem(u+8)<<8)+*smem(u+9); | |
645 *breg = fdinfo(pmem(xreg),yreg,xreg*0x10000+ureg,pd); | 657 *breg = fdinfo(pmem(xreg),yreg,xreg*0x10000+ureg,pd); |
646 break; | 658 break; |
647 default: | 659 default: |
648 *breg = 0xff; | 660 *breg = 0xff; |
649 } | 661 } |
673 default: | 685 default: |
674 *breg = 0xff; | 686 *breg = 0xff; |
675 } | 687 } |
676 break; | 688 break; |
677 } | 689 } |
678 } | 690 // return value |
679 | 691 mem[0xffc0] = *breg; |
680 | 692 *smem(u+2) = *breg ; |
693 *smem(u+4) = (xreg & 0xff00) >> 8; | |
694 *smem(u+5) = xreg & 0xff; | |
695 | |
696 } | |
697 | |
698 |