Mercurial > hg > Members > kono > os9 > sbc09
comparison vdisk.c @ 50:1430678cd4fb
use process structure's mmu
author | Shinji KONO <kono@ie.u-ryukyu.ac.jp> |
---|---|
date | Sat, 21 Jul 2018 22:44:02 +0900 |
parents | 947cbecdd8d5 |
children | 498b6fcaf270 |
comparison
equal
deleted
inserted
replaced
49:947cbecdd8d5 | 50:1430678cd4fb |
---|---|
17 #include <time.h> | 17 #include <time.h> |
18 #include <arpa/inet.h> | 18 #include <arpa/inet.h> |
19 | 19 |
20 static int vdiskdebug = 1; // 1 trace, 2 filename | 20 static int vdiskdebug = 1; // 1 trace, 2 filename |
21 | 21 |
22 | |
23 Byte pmmu[8]; // process dat mmu | |
24 | |
22 extern char *prog ; // for disass | 25 extern char *prog ; // for disass |
23 #ifdef USE_MMU | 26 #ifdef USE_MMU |
24 extern Byte * mem0(Byte *iphymem, Word adr, Byte *immu) ; | 27 extern Byte * mem0(Byte *iphymem, Word adr, Byte *immu) ; |
25 // smem physical address using system mmu | 28 // smem physical address using system mmu |
26 // umem physical address using caller's mmu | 29 // pmem physical address using caller's mmu |
27 #define smem(a) mem0(phymem,a,&mem[0x20+IOPAGE]) | 30 #define smem(a) mem0(phymem,a,&mem[0x20+IOPAGE]) |
28 #define umem(a) (mem[0x42+IOPAGE]?mem0(phymem,a,&mem[0x28+IOPAGE]):mem0(phymem,a,&mem[0x20+IOPAGE])) | 31 #define pmem(a) mem0(phymem,a,pmmu) |
29 #else | 32 #else |
30 #define umem(a) (&mem[a]) | |
31 #define smem(a) (&mem[a]) | 33 #define smem(a) (&mem[a]) |
34 #define pmem(a) (&mem[a]) | |
32 #endif | 35 #endif |
33 | 36 |
34 #define MAXPDV 256 | 37 #define MAXPDV 256 |
35 | 38 |
36 | 39 |
160 static char * | 163 static char * |
161 checkFileName(char *path, PathDesc *pd, int curdir) { | 164 checkFileName(char *path, PathDesc *pd, int curdir) { |
162 char *p = path; | 165 char *p = path; |
163 char *name = path; | 166 char *name = path; |
164 int maxlen = MAXPAHTLEN; | 167 int maxlen = MAXPAHTLEN; |
165 if(vdiskdebug) { printf("checkf \""); putOs9str(name); printf("\"\n"); } | 168 if(vdiskdebug&2) { printf("checkf \""); putOs9str(name); printf("\"\n"); } |
166 while(*p!=0 && (*p&0x80)==0 && (*p>0x1f) && maxlen-->0) p++; | 169 while(*p!=0 && (*p&0x80)==0 && (*p&0x7f)>' ' && maxlen-->0) p++; |
167 if (maxlen==MAXPAHTLEN) return 0; | 170 if (maxlen==MAXPAHTLEN) return 0; |
168 if (*p!=0) { | 171 if (*p!=0) { |
169 name = (char *)malloc(p-path+1); | 172 name = (char *)malloc(p-path+1); |
170 strncpy(name,path, MAXPAHTLEN-maxlen); | 173 int i; |
171 name[MAXPAHTLEN-maxlen-1] &= 0x7f; | 174 for(int i=0;i<MAXPAHTLEN;i++) { |
175 name[i] = path[i]&0x7f; | |
176 } | |
172 name[MAXPAHTLEN-maxlen] = 0; | 177 name[MAXPAHTLEN-maxlen] = 0; |
173 } | 178 } |
174 char *name1 = addCurdir(name,pd,curdir); | 179 char *name1 = addCurdir(name,pd,curdir); |
175 if (name1!=name && name1!=path) free(name); | 180 if (name1!=name && name1!=path) free(name); |
176 if (name1==0) return 0; | 181 if (name1==0) return 0; |
177 pd->name = name1; | 182 pd->name = name1; |
178 if(vdiskdebug) { | 183 if(vdiskdebug&2) { |
179 printf(" remain = \""); | 184 printf(" remain = \""); |
180 char *p1 = p; | 185 char *p1 = p; |
181 while(*p1 && (*p1&0x80)==0 ) { if (*p1<0x20) printf("(0x%02x)",*p1); else putchar(*p1); p1++; } | 186 while(*p1 && (*p1&0x80)==0 ) { if (*p1<0x20) printf("(0x%02x)",*p1); else putchar(*p1); p1++; } |
182 if (*p1) { if ((*p1&0x7f)<0x20) printf("(0x%02x)",*p1); else putchar(*p1&0x7f); } | 187 if (*p1) { if ((*p1&0x7f)<0x20) printf("(0x%02x)",*p1); else putchar(*p1&0x7f); } |
183 printf("\" checkname result \""); putOs9str(pd->name); printf("\"\n"); | 188 printf("\" checkname result \""); putOs9str(pd->name); printf("\"\n"); |
353 } | 358 } |
354 } | 359 } |
355 return 0; | 360 return 0; |
356 } | 361 } |
357 | 362 |
363 void | |
364 getDAT() { | |
365 Word ps = getword(smem(0x50)); // process structure | |
366 Byte *dat = smem(ps+0x40); // process dat (dynamic address translation) | |
367 for(int i=0; i<8; i++) { | |
368 pmmu[i] = dat[i*2+1]; | |
369 } | |
370 } | |
371 | |
358 /* | 372 /* |
359 * each command should have preallocated os9 path descriptor on Y | 373 * each command should have preallocated os9 path descriptor on Y |
360 * | 374 * |
361 * name or buffer, can be in a user map, check that drive number ( mem[0x41+IOPAGE] 0 sys 1 user ) | 375 * name or buffer, can be in a user map, check that drive number ( mem[0x41+IOPAGE] 0 sys 1 user ) |
362 * current directory path number mem[0x42+IOPAGE] | 376 * current directory path number mem[0x42+IOPAGE] |
374 *areg = *smem(u+1); | 388 *areg = *smem(u+1); |
375 *breg = *smem(u+2); | 389 *breg = *smem(u+2); |
376 Byte mode = 0; | 390 Byte mode = 0; |
377 Byte *os9pd = smem(getword(&mem[0x47+IOPAGE])); | 391 Byte *os9pd = smem(getword(&mem[0x47+IOPAGE])); |
378 PathDesc *pd = pdv+*os9pd; | 392 PathDesc *pd = pdv+*os9pd; |
393 | |
394 getDAT(); | |
379 pd->num = *os9pd; | 395 pd->num = *os9pd; |
380 pd->drv = mem[0x41+IOPAGE]; | 396 pd->drv = mem[0x41+IOPAGE]; |
381 char *path,*next,*buf; | 397 char *path,*next,*buf; |
382 if (vdiskdebug&1) vdisklog(u,pd,getword(&mem[0x47+IOPAGE]),curdir,stdout); | 398 if (vdiskdebug&1) vdisklog(u,pd,getword(&mem[0x47+IOPAGE]),curdir,stdout); |
383 | 399 |
396 * B = errcode | 412 * B = errcode |
397 */ | 413 */ |
398 case 0xd1: | 414 case 0xd1: |
399 mode = *areg; | 415 mode = *areg; |
400 attr = *breg; | 416 attr = *breg; |
401 path = (char *)umem(xreg); | 417 path = (char *)pmem(xreg); |
402 next = pd->name = checkFileName(path,pd,curdir); | 418 next = pd->name = checkFileName(path,pd,curdir); |
403 pd->dir = 0; | 419 pd->dir = 0; |
404 pd->fp = fopen(pd->name, os9toUnixAttr(attr)); | 420 pd->fp = fopen(pd->name, os9toUnixAttr(attr)); |
405 if (next!=0 && pd->fp ) { | 421 if (next!=0 && pd->fp ) { |
406 xreg += ( next - path ); | 422 xreg += ( next - path ); |
427 case 0xd2: | 443 case 0xd2: |
428 *breg = 0xff; | 444 *breg = 0xff; |
429 mode = *areg; | 445 mode = *areg; |
430 attr = *breg; | 446 attr = *breg; |
431 pd->fp = 0; | 447 pd->fp = 0; |
432 path = (char*)umem(xreg); | 448 path = (char*)pmem(xreg); |
433 next = checkFileName(path,pd,curdir); | 449 next = checkFileName(path,pd,curdir); |
434 *breg = 0xff; | 450 *breg = 0xff; |
435 if (next!=0) { | 451 if (next!=0) { |
436 struct stat buf; | 452 struct stat buf; |
437 if (stat(pd->name,&buf)!=0) break; | 453 if (stat(pd->name,&buf)!=0) break; |
467 * B = errcode | 483 * B = errcode |
468 */ | 484 */ |
469 | 485 |
470 case 0xd3: | 486 case 0xd3: |
471 *breg = 0xff; | 487 *breg = 0xff; |
472 path = (char*)umem(xreg); | 488 path = (char*)pmem(xreg); |
473 next = checkFileName(path,pd,curdir); | 489 next = checkFileName(path,pd,curdir); |
474 if (next!=0 && mkdir(pd->name,0)!= 0 ) { | 490 if (next!=0 && mkdir(pd->name,0)!= 0 ) { |
475 xreg += ( next - path ); | 491 xreg += ( next - path ); |
476 *breg = 0; | 492 *breg = 0; |
477 } | 493 } |
501 * | 517 * |
502 * | 518 * |
503 * we keep track a cwd and a cxd for a process using 8bit id | 519 * we keep track a cwd and a cxd for a process using 8bit id |
504 */ | 520 */ |
505 case 0xd4: | 521 case 0xd4: |
506 path = (char*)umem(xreg); | 522 path = (char*)pmem(xreg); |
507 next = checkFileName(path,pd,curdir); | 523 next = checkFileName(path,pd,curdir); |
508 if (next!=0) { | 524 if (next!=0) { |
509 struct stat buf; | 525 struct stat buf; |
510 if (stat(pd->name,&buf)!=0) break; | 526 if (stat(pd->name,&buf)!=0) break; |
511 if ((buf.st_mode & S_IFMT) != S_IFDIR) break; | 527 if ((buf.st_mode & S_IFMT) != S_IFDIR) break; |
532 */ | 548 */ |
533 case 0xd5: { | 549 case 0xd5: { |
534 *breg = 0xff; | 550 *breg = 0xff; |
535 if (pd==0) break; | 551 if (pd==0) break; |
536 struct stat st; | 552 struct stat st; |
537 path = (char*)umem(xreg); | 553 path = (char*)pmem(xreg); |
538 next = checkFileName(path,pd,curdir); | 554 next = checkFileName(path,pd,curdir); |
539 pd->use = 0; | 555 pd->use = 0; |
540 if (next!=0 && stat(pd->name,&st)!=0) break; | 556 if (next!=0 && stat(pd->name,&st)!=0) break; |
541 if (next!=0 && ((st.st_mode&S_IFDIR)?rmdir(pd->name):unlink(pd->name)) == 0) { | 557 if (next!=0 && ((st.st_mode&S_IFDIR)?rmdir(pd->name):unlink(pd->name)) == 0) { |
542 xreg += ( next - path ); | 558 xreg += ( next - path ); |
583 * | 599 * |
584 * | 600 * |
585 */ | 601 */ |
586 case 0xd7: | 602 case 0xd7: |
587 *breg = 0xff; | 603 *breg = 0xff; |
588 buf = (char*)umem(xreg); | 604 buf = (char*)pmem(xreg); |
589 char *b; | 605 char *b; |
590 if ((b=fgets(buf,yreg,pd->fp))) { | 606 if ((b=fgets(buf,yreg,pd->fp))) { |
591 if (b==0) { | 607 if (b==0) { |
592 *breg = 0xd3; | 608 *breg = 0xd3; |
593 break; | 609 break; |
614 * Error: CC Carry set | 630 * Error: CC Carry set |
615 * B = errcode | 631 * B = errcode |
616 */ | 632 */ |
617 case 0xd8: | 633 case 0xd8: |
618 *breg = 0xff; | 634 *breg = 0xff; |
619 buf = (char*)umem(xreg); | 635 buf = (char*)pmem(xreg); |
620 int i = fread(buf,1,yreg,pd->fp); | 636 int i = fread(buf,1,yreg,pd->fp); |
621 // set y | 637 // set y |
622 setword(smem(u+6),i); | 638 setword(smem(u+6),i); |
623 *breg = (i==0?0xd3:0) ; | 639 *breg = (i==0?0xd3:0) ; |
624 break; | 640 break; |
641 case 0xd9: { | 657 case 0xd9: { |
642 *breg = 0xff; | 658 *breg = 0xff; |
643 if (pd->dir) break; | 659 if (pd->dir) break; |
644 int len = yreg; | 660 int len = yreg; |
645 int i = 0; | 661 int i = 0; |
646 Byte *buf = umem(xreg); | 662 Byte *buf = pmem(xreg); |
647 while(len>0 && *buf !='\r') { | 663 while(len>0 && *buf !='\r') { |
648 fputc(buf[i++],pd->fp); | 664 fputc(buf[i++],pd->fp); |
649 len--; | 665 len--; |
650 } | 666 } |
651 if (buf[i]=='\r') { | 667 if (buf[i]=='\r') { |
669 * B = errcode | 685 * B = errcode |
670 */ | 686 */ |
671 case 0xda : | 687 case 0xda : |
672 *breg = 0xff; | 688 *breg = 0xff; |
673 if (!pd->dir) { | 689 if (!pd->dir) { |
674 Byte *buf = umem(xreg); | 690 Byte *buf = pmem(xreg); |
675 int len = yreg; | 691 int len = yreg; |
676 int err = fwrite(buf,1,len,pd->fp); | 692 int err = fwrite(buf,1,len,pd->fp); |
677 *breg = err?0:0xff; | 693 *breg = err?0:0xff; |
678 // set y | 694 // set y |
679 setword(smem(u+6),err); | 695 setword(smem(u+6),err); |
741 * R$Y=# bytes of FD required | 757 * R$Y=# bytes of FD required |
742 * this should be handled in vrbf | 758 * this should be handled in vrbf |
743 */ | 759 */ |
744 *breg = 0xff; | 760 *breg = 0xff; |
745 if (pd==0) break; | 761 if (pd==0) break; |
746 *breg = filedescriptor(umem(xreg), yreg,pd) ; | 762 *breg = filedescriptor(pmem(xreg), yreg,pd) ; |
747 break; | 763 break; |
748 case 0x20: // Pos.FDInf mandatry for dir command | 764 case 0x20: // Pos.FDInf mandatry for dir command |
749 /* SS.FDInf ($20) - Directly reads a file descriptor from anywhere | 765 /* SS.FDInf ($20) - Directly reads a file descriptor from anywhere |
750 * on drive. | 766 * on drive. |
751 * Entry: R$A=Path # | 767 * Entry: R$A=Path # |
756 * R$U= LSW of logical sector # | 772 * R$U= LSW of logical sector # |
757 */ | 773 */ |
758 *breg = 0xff; | 774 *breg = 0xff; |
759 if (pd==0) break; | 775 if (pd==0) break; |
760 ureg = getword(smem(u+8)); | 776 ureg = getword(smem(u+8)); |
761 *breg = fdinfo(umem(xreg),yreg,xreg*0x10000+ureg,pd); | 777 *breg = fdinfo(pmem(xreg),yreg,xreg*0x10000+ureg,pd); |
762 break; | 778 break; |
763 default: | 779 default: |
764 *breg = 0xff; | 780 *breg = 0xff; |
765 } | 781 } |
766 break; | 782 break; |
808 *breg = frame[2]; | 824 *breg = frame[2]; |
809 xreg = getword(frame+4); | 825 xreg = getword(frame+4); |
810 yreg = getword(frame+6); | 826 yreg = getword(frame+6); |
811 ureg = getword(frame+8); | 827 ureg = getword(frame+8); |
812 pcreg = getword(frame+10)-3; | 828 pcreg = getword(frame+10)-3; |
813 prog = (char*)(umem(pcreg) - pcreg); | 829 prog = (char*)(pmem(pcreg) - pcreg); |
814 do_trace(fp); | 830 do_trace(fp); |
815 } | 831 } |
816 | 832 |
817 | 833 |
818 /* end */ | 834 /* end */ |