diff os9/os9disass.c @ 1:3c736a81b886

add disk
author Shinji KONO <kono@ie.u-ryukyu.ac.jp>
date Mon, 02 Jul 2018 19:07:39 +0900
parents 9a224bd9b45f
children 96a067cf4c4f
line wrap: on
line diff
--- a/os9/os9disass.c	Mon Jul 02 02:12:31 2018 +0900
+++ b/os9/os9disass.c	Mon Jul 02 19:07:39 2018 +0900
@@ -916,6 +916,103 @@
 				 { "?????",  0,  1,   D_Illegal,   NULL },        /* 0xff */
 };
 
+
+struct os9syscall { int code; char *name; } os9sys[] = {
+    {0x0000,"F$LINK"},
+    {0x0001,"F$LOAD"},
+    {0x0002,"F$UNLINK"},
+    {0x0003,"F$FORK"},
+    {0x0004,"F$WAIT"},
+    {0x0005,"F$CHAIN"},
+    {0x0006,"F$EXIT"},
+    {0x0007,"F$MEM"},
+    {0x0008,"F$SEND"},
+    {0x0009,"F$ICPT"},
+    {0x000a,"F$SLEEP"},
+    {0x000b,"F$SSPD"},
+    {0x000c,"F$ID"},
+    {0x000d,"F$SPRIOR"},
+    {0x000e,"F$SSWI"},
+    {0x000f,"F$PERR"},
+    {0x0010,"F$PRSNAM"},
+    {0x0011,"F$CMPNAM"},
+    {0x0012,"F$SCHBIT"},
+    {0x0013,"F$ALLBIT"},
+    {0x0014,"F$DELBIT"},
+    {0x0015,"F$TIME"},
+    {0x0016,"F$STIME"},
+    {0x0017,"F$CRC"},
+    {0x0018,"F$GPRDSC"},
+    {0x0019,"F$GBLKMP"},
+    {0x001a,"F$GMODDR"},
+    {0x001b,"F$CPYMEM"},
+    {0x001c,"F$SUSER"},
+    {0x001d,"F$UNLOAD"},
+    {0x0027,"F$VIRQ"},
+    {0x0028,"F$SRQMEM"},
+    {0x0029,"F$SRTMEM"},
+    {0x002a,"F$IRQ"},
+    {0x002b,"F$IOQU"},
+    {0x002c,"F$APROC"},
+    {0x002d,"F$NPROC"},
+    {0x002e,"F$VMODUL"},
+    {0x002f,"F$FIND64"},
+    {0x0030,"F$ALL64"},
+    {0x0031,"F$RET64"},
+    {0x0032,"F$SSVC"},
+    {0x0033,"F$IODEL"},
+    {0x0034,"F$SLINK"},
+    {0x0035,"F$BOOT"},
+    {0x0036,"F$BTMEM"},
+    {0x0037,"F$GPROCP"},
+    {0x0038,"F$MOVE"},
+    {0x0039,"F$ALLRAM"},
+    {0x003a,"F$ALLIMG"},
+    {0x003b,"F$DELIMG"},
+    {0x003c,"F$SETIMG"},
+    {0x003d,"F$FREELB"},
+    {0x003e,"F$FREEHB"},
+    {0x003f,"F$ALLTSK"},
+    {0x0040,"F$DELTSK"},
+    {0x0041,"F$SETTSK"},
+    {0x0042,"F$RESTSK"},
+    {0x0043,"F$RELTSK"},
+    {0x0044,"F$DATLOG"},
+    {0x0045,"F$DATTMP"},
+    {0x0046,"F$LDAXY"},
+    {0x0047,"F$LDAXYP"},
+    {0x0048,"F$LDDDXY"},
+    {0x0049,"F$LDABX"},
+    {0x004a,"F$STABX"},
+    {0x004b,"F$ALLPRC"},
+    {0x004c,"F$DELPRC"},
+    {0x004d,"F$ELINK"},
+    {0x004e,"F$FMODUL"},
+    {0x004f,"F$MAPBLK"},
+    {0x0050,"F$CLRBLK"},
+    {0x0051,"F$DELRAM"},
+    {0x0052,"F$GCMDIR"},
+    {0x0053,"F$ALHRAM"},
+    {0x0080    , "I$ATTACH"},
+    {0x0081, "I$DETACH"},
+    {0x0082  , "I$DUP"},
+    {0x0083  , "I$CREATE"},
+    {0x0084, "I$OPEN"},
+    {0x0085    , "I$MAKDIR"},
+    {0x0086    , "I$CHGDIR"},
+    {0x0087  , "I$DELETE"},
+    {0x0088, "I$SEEK"},
+    {0x0089  , "I$READ"},
+    {0x008a, "I$WRITE"},
+    {0x008b    , "I$READLN"},
+    {0x008c    , "I$WRITLN"},
+    {0x008d, "I$GETSTT"},
+    {0x008e    , "I$SSTT"},
+    {0x008f    , "I$CLOSE"},
+    {0x0090  , "I$DELETX"},
+  } ;
+
+
 int iotable[32] = {
 	0x0000,
 	0x0001,
@@ -1092,10 +1189,20 @@
 {
   int offset;
 
-  offset = prog[pc+2];
-
+  offset = prog[pc+1];
+  for(int i =0, j = sizeof(os9sys)/sizeof(struct os9syscall), m = (i+j)/2 ;i<=j; m=(i+j)/2  ) {
+     if (os9sys[m].code > offset) {
+         j=m-1; 
+     } else if (os9sys[m].code < offset) {
+         i=m+1; 
+     } else if (os9sys[m].code == offset) {
+          fprintf(fp,"%0.2X %0.2X       %s%s       %s",
+                code, offset, suffix, op->name, os9sys[m].name);
+          return op->bytes;
+     } 
+  } 
   fprintf(fp,"%0.2X %0.2X       %s%s       $%0.2X",
-	code, offset, suffix, op->name, prog[pc+2]);
+	code, offset, suffix, op->name, prog[pc+1]);
   return op->bytes;
 }
 
@@ -1280,14 +1387,14 @@
 		offset = (prog[pc+2]+pc+3) & 0xFFFF;
 		s = "<";
 		fprintf(fp,"%0.2X %0.2X %0.2X    %s%s       [%s$%0.2X,PCR]",
-				  code, postbyte, prog[pc+2], suffix, op->name, s, offset);
+				  code, postbyte, prog[pc+2], suffix, op->name, s, offset+pc+2+adoffset);
 		extrabytes = 1;
 		break;
 	 case 0x1d :
 		offset = (prog[pc+2] * 256 + prog[pc+3]+pc+4) & 0xFFFF;
 		s = ">";
 		fprintf(fp,"%0.2X %0.2X %0.2X %0.2X %s%s       [%s$%0.4X,PCR]",
-				  code, postbyte, prog[pc+2], prog[pc+3], suffix, op->name, s, offset);
+				  code, postbyte, prog[pc+2], prog[pc+3], suffix, op->name, s, offset+pc+3+adoffset);
 		extrabytes = 2;
 		break;
 	 case 0x1e :