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