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 */