comparison vdisk.c @ 48:ea1b17311bf3

dir /v0 worked but dir /v0/src and chd /v0; dir does not
author Shinji KONO <kono@ie.u-ryukyu.ac.jp>
date Fri, 20 Jul 2018 21:28:57 +0900
parents 15f1e1b49928
children 947cbecdd8d5
comparison
equal deleted inserted replaced
47:15f1e1b49928 48:ea1b17311bf3
60 drvRoot[drv] = name; 60 drvRoot[drv] = name;
61 return 0; 61 return 0;
62 } 62 }
63 63
64 void closepd(PathDesc *pd) { 64 void closepd(PathDesc *pd) {
65 int err = fclose(pd->fp) ; 65 if(pd->fp) fclose(pd->fp) ;
66 pd->dir = 0;
66 pd->use = 0; 67 pd->use = 0;
67 pd->fp = 0; 68 pd->fp = 0;
68 pd->mode = 0; 69 pd->mode = 0;
69 free(pd->dirfp); pd->dirfp = 0; 70 free(pd->dirfp); pd->dirfp = 0;
70 free(pd->name); pd->name = 0; 71 free(pd->name); pd->name = 0;
71 free(pd->fd); pd->fd = 0;
72 } 72 }
73 73
74 #define MAXPAHTLEN 256 74 #define MAXPAHTLEN 256
75 75
76 char *addCurdir(char *name, PathDesc *pd, PathDesc *curdir) { 76 char *addCurdir(char *name, PathDesc *pd, PathDesc *curdir) {
83 int ps = ns; 83 int ps = ns;
84 char *base ; 84 char *base ;
85 if (name[0]-='/') { 85 if (name[0]-='/') {
86 base = drvRoot[pd->drv]; ps += strlen(drvRoot[pd->drv])+1; 86 base = drvRoot[pd->drv]; ps += strlen(drvRoot[pd->drv])+1;
87 } else if (name[0]==0) { 87 } else if (name[0]==0) {
88 return drvRoot[pd->drv]; 88 base = drvRoot[pd->drv];
89 char *path = (char*)malloc(strlen(base)+1); // we'll free this, malloc it.
90 int i = 0;
91 for(;base[i];i++) path[i] = base[i];
92 path[i]=0;
93 return path;
89 } else { 94 } else {
90 name++; base = curdir->name; ps += strlen(curdir->name)+1; 95 name++; base = curdir->name; ps += strlen(curdir->name)+1;
91 } 96 }
92 char *path = (char*)malloc(ps+1); 97 char *path = (char*)malloc(ps+1);
93 int i = 0; 98 int i = 0;
185 190
186 /* read direcotry entry */ 191 /* read direcotry entry */
187 int os9opendir(PathDesc *pd) { 192 int os9opendir(PathDesc *pd) {
188 DIR *dir; 193 DIR *dir;
189 struct dirent *dp; 194 struct dirent *dp;
195 if (pd->dirfp) return 0; // already opened
190 dir = opendir(pd->name); 196 dir = opendir(pd->name);
191 if (dir==0) return -1; 197 if (dir==0) return -1;
192 int dircount = 0; 198 int dircount = 0;
193 while ((dp = readdir(dir)) != NULL) dircount++; // pass 1 to determine the size 199 while ((dp = readdir(dir)) != NULL) dircount++; // pass 1 to determine the size
194 if (dircount==0) return 0; // should contains . and .. at least 200 if (dircount==0) return 0; // should contains . and .. at least
197 rewinddir(dir); 203 rewinddir(dir);
198 int i = 0; 204 int i = 0;
199 while ((dp = readdir(dir)) != NULL) { 205 while ((dp = readdir(dir)) != NULL) {
200 int j = 0; 206 int j = 0;
201 for(j = 0; j < DIR_NM ; j++) { 207 for(j = 0; j < DIR_NM ; j++) {
202 if (j< dp->d_namlen) 208 if (j< dp->d_namlen) {
203 pd->dirfp[i+j] = dp->d_name[j]; 209 pd->dirfp[i+j] = dp->d_name[j]&0x7f;
204 else 210 if (j== dp->d_namlen-1)
211 pd->dirfp[i+j] |= 0x80; // os9 EOL
212 } else
205 pd->dirfp[i+j] = 0; 213 pd->dirfp[i+j] = 0;
206 } 214 }
207 pd->dirfp[i+j] = (dp->d_ino&0xff0000)>>16; 215 pd->dirfp[i+j] = (dp->d_ino&0xff0000)>>16;
208 pd->dirfp[i+j+1] = (dp->d_ino&0xff00)>>8; 216 pd->dirfp[i+j+1] = (dp->d_ino&0xff00)>>8;
209 pd->dirfp[i+j+2] = dp->d_ino&0xff; 217 pd->dirfp[i+j+2] = dp->d_ino&0xff;
285 int err; 293 int err;
286 PathDesc *curdir = pdv+mem[0x44+IOPAGE]; // garbage until set 294 PathDesc *curdir = pdv+mem[0x44+IOPAGE]; // garbage until set
287 Byte attr ; 295 Byte attr ;
288 Word u = (mem[0x45+IOPAGE]<<8)+mem[0x46+IOPAGE]; // caller's stack in system segment 296 Word u = (mem[0x45+IOPAGE]<<8)+mem[0x46+IOPAGE]; // caller's stack in system segment
289 xreg = (*smem(u+4)<<8)+*smem(u+5); 297 xreg = (*smem(u+4)<<8)+*smem(u+5);
298 yreg = (*smem(u+6)<<8)+*smem(u+7);
290 *areg = *smem(u+1); 299 *areg = *smem(u+1);
291 *breg = *smem(u+2); 300 *breg = *smem(u+2);
292 Byte mode = yreg&0xff; 301 Byte mode = yreg&0xff;
293 Byte *os9pd = smem((mem[0x47+IOPAGE]<<8)+mem[0x48+IOPAGE]); 302 Byte *os9pd = smem((mem[0x47+IOPAGE]<<8)+mem[0x48+IOPAGE]);
294 PathDesc *pd = pdv+*os9pd; 303 PathDesc *pd = pdv+*os9pd;
414 * B = errcode 423 * B = errcode
415 */ 424 */
416 case 0xd4: 425 case 0xd4:
417 path = (char*)umem(xreg); 426 path = (char*)umem(xreg);
418 next = checkFileName(path,pd,curdir); 427 next = checkFileName(path,pd,curdir);
419 if (next!=0 && os9opendir(pd)) { 428 if (next!=0 && os9opendir(pd)==0) {
420 if (curdir!=pd) closepd(curdir); 429 if (curdir!=pd) closepd(curdir);
421 if (pd->name != path) {
422 free(path);
423 }
424 xreg += ( next - path ); 430 xreg += ( next - path );
425 *areg = pd->num; 431 *areg = pd->num;
426 pd->use = 1; 432 pd->use = 1;
427 *breg = 0; 433 *breg = 0;
428 break; 434 break;
468 * Error: CC Carry set 474 * Error: CC Carry set
469 * B = errcode 475 * B = errcode
470 */ 476 */
471 case 0xd6: { 477 case 0xd6: {
472 *breg = 0xff; 478 *breg = 0xff;
473 if (pd==0) break;
474 off_t seek = (xreg<<16)+yreg; 479 off_t seek = (xreg<<16)+yreg;
475 *breg = fseek(pd->fp,(off_t)seek,SEEK_SET); 480 *breg = fseek(pd->fp,(off_t)seek,SEEK_SET);
476 break; 481 break;
477 } 482 }
478 /* 483 /*
493 * 498 *
494 * 499 *
495 */ 500 */
496 case 0xd7: 501 case 0xd7:
497 *breg = 0xff; 502 *breg = 0xff;
498 if (pd==0) break;
499 if (pd->dir) break;
500 buf = (char*)umem(xreg); 503 buf = (char*)umem(xreg);
501 if (fgets(buf,yreg,pd->fp)) { 504 char *b;
502 int len = yreg; 505 if ((b=fgets(buf,yreg,pd->fp))) {
506 // set y
507 *smem(u+6) = (err>>8)&0xff;
508 *smem(u+7) = err&0xff;
509 if (b==0) {
510 *breg = 0xd3;
511 break;
512 }
513 int len = err;
503 int i; 514 int i;
504 for(i=0;i<len && buf[i];i++); 515 for(i=0;i<len && buf[i];i++);
505 if (i>0 && buf[i-1]=='\n') { 516 if (i>0 && buf[i-1]=='\n') {
506 buf[i-1] = '\r'; 517 buf[i-1] = '\r';
507 yreg = i; 518 yreg = i;
520 * Error: CC Carry set 531 * Error: CC Carry set
521 * B = errcode 532 * B = errcode
522 */ 533 */
523 case 0xd8: 534 case 0xd8:
524 *breg = 0xff; 535 *breg = 0xff;
525 if (pd==0) break;
526 buf = (char*)umem(xreg); 536 buf = (char*)umem(xreg);
527 err = fread(buf,yreg,1,pd->fp); 537 int i = fread(buf,1,yreg,pd->fp);
528 *breg = err==0?0xff:0 ; 538 // set y
529 yreg = err ; 539 *smem(u+6) = (i>>8)&0xff;
540 *smem(u+7) = i&0xff;
541 *breg = (i==0?0xd3:0) ;
530 break; 542 break;
531 543
532 /* 544 /*
533 * I$WritLn Entry Point 545 * I$WritLn Entry Point
534 * 546 *
542 * Y number of bytes written 554 * Y number of bytes written
543 * 555 *
544 * Error: CC Carry set 556 * Error: CC Carry set
545 * B = errcode 557 * B = errcode
546 */ 558 */
547 case 0xd9: 559 case 0xd9: {
548 *breg = 0xff; 560 *breg = 0xff;
549 if (pd==0) break;
550 if (pd->dir) break; 561 if (pd->dir) break;
551 int len = yreg; 562 int len = yreg;
552 int i = 0; 563 int i = 0;
553 Byte *buf = umem(xreg); 564 Byte *buf = umem(xreg);
554 while(len>0 && *buf !='\r') { 565 while(len>0 && *buf !='\r') {
558 if (buf[i]=='\r') { 569 if (buf[i]=='\r') {
559 fputc('\n',pd->fp); 570 fputc('\n',pd->fp);
560 i++; 571 i++;
561 } 572 }
562 *breg = 0; 573 *breg = 0;
563 yreg = i; 574 // set y
575 *smem(u+6) = (i>>8)&0xff;
576 *smem(u+7) = i&0xff;
564 break; 577 break;
578 }
565 579
566 /* 580 /*
567 * I$Write Entry Point 581 * I$Write Entry Point
568 * 582 *
569 * Entry: 583 * Entry:
576 case 0xda : 590 case 0xda :
577 *breg = 0xff; 591 *breg = 0xff;
578 if (!pd->dir) { 592 if (!pd->dir) {
579 Byte *buf = umem(xreg); 593 Byte *buf = umem(xreg);
580 int len = yreg; 594 int len = yreg;
581 int err = fwrite(buf,len,1,pd->fp); 595 int err = fwrite(buf,1,len,pd->fp);
582 *breg = err?0xff:0; 596 *breg = err?0xff:0;
583 yreg = err; 597 // set y
598 *smem(u+6) = (i>>8)&0xff;
599 *smem(u+7) = i&0xff;
584 } 600 }
585 break; 601 break;
586 602
587 /* I$Close Entry Point 603 /* I$Close Entry Point
588 * 604 *
644 * R$X=Pointer to a 256 byte buffer 660 * R$X=Pointer to a 256 byte buffer
645 * R$Y=# bytes of FD required 661 * R$Y=# bytes of FD required
646 * this should be handled in vrbf 662 * this should be handled in vrbf
647 */ 663 */
648 *breg = 0xff; 664 *breg = 0xff;
649 yreg = (*smem(u+6)<<8)+*smem(u+7);
650 if (pd==0) break; 665 if (pd==0) break;
651 *breg = filedescriptor(umem(xreg), yreg,pd) ; 666 *breg = filedescriptor(umem(xreg), yreg,pd) ;
652 break; 667 break;
653 case 0x20: // Pos.FDInf mandatry for dir command 668 case 0x20: // Pos.FDInf mandatry for dir command
654 /* SS.FDInf ($20) - Directly reads a file descriptor from anywhere 669 /* SS.FDInf ($20) - Directly reads a file descriptor from anywhere
660 * LSB - MSB of logical sector # 675 * LSB - MSB of logical sector #
661 * R$U= LSW of logical sector # 676 * R$U= LSW of logical sector #
662 */ 677 */
663 *breg = 0xff; 678 *breg = 0xff;
664 if (pd==0) break; 679 if (pd==0) break;
665 yreg = (*smem(u+6)<<8)+*smem(u+7);
666 ureg = (*smem(u+8)<<8)+*smem(u+9); 680 ureg = (*smem(u+8)<<8)+*smem(u+9);
667 *breg = fdinfo(pmem(xreg),yreg,xreg*0x10000+ureg,pd); 681 *breg = fdinfo(pmem(xreg),yreg,xreg*0x10000+ureg,pd);
668 break; 682 break;
669 default: 683 default:
670 *breg = 0xff; 684 *breg = 0xff;