changeset 6:9c2602e1d716

level2 rom done
author Shinji KONO <kono@ie.u-ryukyu.ac.jp>
date Thu, 05 Jul 2018 00:02:54 +0900
parents 35028b396a35
children a6db579d8c11
files a09.c os9/Makefile os9/level2/Makefile os9/makerom.c
diffstat 4 files changed, 134 insertions(+), 45 deletions(-) [+]
line wrap: on
line diff
--- a/a09.c	Wed Jul 04 21:30:24 2018 +0900
+++ b/a09.c	Thu Jul 05 00:02:54 2018 +0900
@@ -179,6 +179,7 @@
 
 int symcounter=0;
 int os9 = 0;   // os9 flag
+int prevloc = 0;
 
 /* Symbol categories.
    0 Constant value (from equ).
@@ -300,6 +301,15 @@
                           label or constant, this is important when
                           generating relocatable object code. */
 
+void generate()
+{
+    generating = 1;
+    if (prevloc) {
+       loccounter  = prevloc-1 ;
+       prevloc = 0;
+    }
+}
+
 
 char namebuf[MAXIDLEN+1];
 
@@ -1105,7 +1115,7 @@
 
 void os9begin()
 {
- generating=1;
+ generate();
  os9=1;   // contiguous code generation ( i.e. ignore org nor rmb )
  modStart = loccounter;
  reset_crc();
@@ -1150,14 +1160,16 @@
  case 0:/* RMB */
         //   in OS9 mode, this generates no data
         //   loccounter will be reset after any code to the current code generation
+        if (os9 && !prevloc) prevloc = loccounter+1;
         setlabel(lp);
         operand=scanexpr(0);
         if(unknown)error|=4;
         loccounter+=operand;
         if(generating&&pass==2) {
-           if(!outmode || os9 )for(i=0;i<operand;i++) {
-              fputc(0,objfile);
-           } else flushhex();  
+           if(!outmode && !os9 ) {
+               for(i=0;i<operand;i++) { fputc(0,objfile); } 
+           } else 
+               flushhex();  
         }   
         hexaddr=loccounter;
         break;
@@ -1174,8 +1186,8 @@
         }
         break;
  case 7:/* FCB */
+        generate();
         setlabel(lp);
-        generating=1;
         do {
         if(*srcptr==',')srcptr++;
         skipspace();
@@ -1192,7 +1204,7 @@
         } while(*srcptr==',');
         break;
  case 8:/* FCC */
-        generating=1;
+        generate();
         setlabel(lp);
         skipspace();
         c=*srcptr++;
@@ -1201,7 +1213,7 @@
         if(*srcptr==c)srcptr++;
         break;
  case 9:/* FDB */
-        generating=1;
+        generate();
         setlabel(lp);
         do {
          if(*srcptr==',')srcptr++;
@@ -1212,7 +1224,7 @@
         } while(*srcptr==',');
         break;
  case 23 :/* FCS */
-        generating=1;
+        generate();
         setlabel(lp);
         skipspace();
         int sep = *srcptr;
@@ -1252,6 +1264,7 @@
         if(!operand)suppress=2;
         break;                
  case 12: /* ORG */
+         if (os9 && !prevloc) prevloc = loccounter+1;
          operand=scanexpr(0);
          if(unknown)error|=4;
          if(generating&&pass==2&&!outmode&&!os9) {
@@ -1283,7 +1296,7 @@
         terminate=1;
         break;     
    case 27: /* USE */     
-        locsave = loccounter ;
+        // locsave = loccounter ;
    case 16: /* INCLUDE */     
         skipspace();
         if(*srcptr=='"')srcptr++;
@@ -1302,7 +1315,7 @@
         // if (co==27) loccounter = locsave;
         break; 
    case 24: /* MOD */     
-        loccounter = 0;
+        oldlc = loccounter = 0;
         setlabel(lp);
         os9begin();
         break; 
@@ -1310,7 +1323,7 @@
         os9end();
         break; 
    case 32: /* OS9 */     
-        generating = 1;
+        generate();
         setlabel(lp);
         putword(0x103f); // SWI2
         putbyte(scanexpr(0));
@@ -1349,8 +1362,8 @@
   op=findop(namebuf);
   if(op) {
    if(op->cat!=13){
+     generate();
      setlabel(lp);
-     generating=1;
    }
    co=op->code;
    switch(op->cat) {
@@ -1404,8 +1417,7 @@
    if(ifcount==0 && suppress==2)suppress=0;
   }
  }  
- if(pass==2&&listing)outlist();
-}
+ if(pass==2&&listing)outlist(); } 
 
 void
 usage(char*nm)
@@ -1431,29 +1443,30 @@
 void
 getoptions(int c,char*v[])
 {
- int i=0;
+ int i=1;
  if(c==1)usage(v[0]);
- if(strcmp(v[1],"-d")==0) {
-   debug=1;
-   i++;
- }
- if(strcmp(v[1],"-o")==0) {
-   if(c<4)usage(v[0]);
-   objname = v[2];
-   i+=2;
+ while(v[i]) {
+     if(strcmp(v[i],"-d")==0) {
+       debug=1;
+       i++;
+     } else if(strcmp(v[i],"-o")==0) {
+       objname = v[i+1];
+       i+=2;
+     } else if(strcmp(v[i],"-s")==0) {
+       objname=v[i+1];
+       outmode=1;
+       i+=2;
+     } else if(strcmp(v[i],"-l")==0) {
+       listname=v[i+1];
+       i+=2;
+     } else if(*v[i]=='-') {
+         usage(v[0]);
+     } else {
+        if (srcname) usage(v[0]);
+        srcname=v[i];
+        i++;
+     }
  }
- if(strcmp(v[i+1],"-s")==0) {
-   if(c<4+i)usage(v[0]);
-   objname=v[i+2];
-   outmode=1;
-   i+=2;
- }
- if(strcmp(v[i+1],"-l")==0) {
-   if(c<4+i)usage(v[0]);
-   listname=v[2+i];
-   i+=2;
- }
- srcname=v[1+i];
  if(objname==0) {
    for(i=0;srcname[i]!='.' && srcname[i]!=0 ;i++) ;
    objname = strconcat(srcname,i,".b");
@@ -1490,8 +1503,11 @@
  oldno=lineno;
  lineno=0;
  if((srcfile=fopen(name,"r"))==0) {
-   int i = strlen(oldname);
-   while(i>0 && oldname[i]!='/') i--;
+   int i = 0;
+   if (oldname) {
+       i = strlen(oldname);
+       while(i>0 && oldname[i]!='/') i--;
+   }
    if (i>0) {
        char *next = strconcat(oldname,i+1,name);
        if((srcfile=fopen(next,"r"))==0) {
@@ -1536,6 +1552,7 @@
   if(c=='n'||c=='N') exit(3);
  }
  pass=2;
+ prevloc = 0;
  loccounter=0;
  errors=0;
  generating=0;
--- a/os9/Makefile	Wed Jul 04 21:30:24 2018 +0900
+++ b/os9/Makefile	Thu Jul 05 00:02:54 2018 +0900
@@ -13,11 +13,13 @@
 	$(CC) $(CFLAGS) -Wno-format-security -o os9disass  os9disass.c
 
 os9.rom : makerom modules/init.b modules/pty.b
-	./makerom os9.rom modules/Shell modules/init.b modules/mdir modules/SysGo modules/IOMan modules/SCF modules/pty-dd.b modules/pty.b modules/OS9p2 modules/OS9
+	./makerom -o os9.rom modules/Shell modules/init.b modules/mdir modules/SysGo modules/IOMan modules/SCF modules/pty-dd.b modules/pty.b modules/OS9p2 modules/OS9
 
 os9b.rom : makerom modules/init.b modules/pty.b
-	./makerom os9b.rom modules/Basic09 modules/Shell modules/init.b modules/mdir modules/SysGo modules/IOMan modules/SCF modules/pty-dd.b modules/pty.b modules/OS9p2 modules/OS9
+	./makerom -o os9b.rom modules/Basic09 modules/Shell modules/init.b modules/mdir modules/SysGo modules/IOMan modules/SCF modules/pty-dd.b modules/pty.b modules/OS9p2 modules/OS9
 
 os9d.rom : makerom modules/init.b modules/pty.b
-	./makerom os9d.rom  modules/Shell modules/dir.b  modules/init.b modules/mdir modules/SysGo modules/IOMan modules/pty-dd.b modules/pty.b modules/pdisk.b modules/d0.b modules/d1.b modules/clock.b modules/SCF modules/rbf.b modules/OS9p2 modules/OS9
+	./makerom -o os9d.rom  modules/Shell modules/dir.b  modules/init.b modules/mdir modules/SysGo modules/IOMan modules/pty-dd.b modules/pty.b modules/pdisk.b modules/d0.b modules/d1.b modules/clock.b modules/SCF modules/rbf.b modules/OS9p2 modules/OS9
    
+os9lv2.rom : level2/init
+	./makerom -o os9lv2.rom -i 0xff00 level2/init level2/ioman level2/os9p2 level2/os9p3_perr level2/os9p4_regdump level2/pdisk level2/pipe level2/pipeman level2/pipeman_named level2/piper level2/pty level2/rbf level2/scf level2/term level2/os9p1 
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/os9/level2/Makefile	Thu Jul 05 00:02:54 2018 +0900
@@ -0,0 +1,55 @@
+
+A09 = ../../a09
+
+SRCDIR=../../CoCoOS9/level2v3/MODULES
+
+all : ioman pdisk init os9p1 os9p2 os9p3_perr os9p4_regdump pipe pipeman pipeman_named piper rbf scf term pty
+
+clean : 
+	rm -f ioman pdisk init os9p1 os9p2 os9p3_perr os9p4_regdump pipe pipeman pipeman_named piper rbf scf term pty
+
+ioman :
+	$(A09) ${SRCDIR}/ioman.asm -o ioman
+
+pdisk :
+	$(A09) ../modules/pdisk.asm -o pdisk
+
+init :
+	$(A09) ../modules/init.asm -o init
+
+os9p1 :
+	$(A09) ${SRCDIR}/os9p1.asm -o os9p1
+
+os9p2 :
+	$(A09) ${SRCDIR}/os9p2.asm -o os9p2
+
+os9p3_perr :
+	$(A09) ${SRCDIR}/os9p3_perr.asm -o os9p3_perr
+
+os9p4_regdump :
+	$(A09) ${SRCDIR}/os9p4_regdump.asm -o os9p4_regdump
+
+pipe :
+	$(A09) ${SRCDIR}/pipe.asm -o pipe
+
+pipeman :
+	$(A09) ${SRCDIR}/pipeman.asm -o pipeman
+
+pipeman_named :
+	$(A09) ${SRCDIR}/pipeman_named.asm -o pipeman_named
+
+piper :
+	$(A09) ${SRCDIR}/piper.asm -o piper
+
+rbf :
+	$(A09) ${SRCDIR}/rbf.asm -o rbf
+
+scf :
+	$(A09) ${SRCDIR}/scf.asm -o scf
+
+term :
+	$(A09) ../modules/pty-dd.asm -o term
+
+pty :
+	$(A09) ../modules/pty.asm -o pty
+
--- a/os9/makerom.c	Wed Jul 04 21:30:24 2018 +0900
+++ b/os9/makerom.c	Thu Jul 05 00:02:54 2018 +0900
@@ -7,8 +7,9 @@
 #include <strings.h>
 #include <sys/stat.h>
 
-#define IOBASE 0xe000
-#define IOSIZE 0x100
+int IOBASE = 0xe000;
+int IOSIZE = 0x100;
+char * outfile ;
 
 typedef struct os9module {
    int size;
@@ -85,7 +86,19 @@
  root.mod = 0;
  m = &root;
 
- for(int i = 2 ; i<ac ; i++ ) {
+ for(int i = 1 ; i<ac ; i++ ) {
+    if (*av[i]=='-') {
+        if (av[i][1] =='i') {
+            IOBASE = strtol(av[i],(char**)0,0);
+            i += 1;
+        } else if (av[i][1] =='o') {
+            outfile = av[i+1];
+            i += 1;
+        } else {
+            return 1;
+        }
+        continue;
+    }
     struct os9module *cur;
     cur = readOS9module(av[i]);
     m->next = cur;
@@ -94,8 +107,9 @@
 
  FILE *romfile;
  unsigned pos;
+ if (outfile==0) return 1;
 
- romfile=fopen(av[1],"wb");
+ romfile=fopen(outfile,"wb");
  if(!romfile) {
   fprintf(stderr,"Cannot create file %s\n",av[1]);
   exit(1);
@@ -108,7 +122,8 @@
 
  pos = start;
  for(struct os9module *cur = root.next; cur ; cur = cur->next ) {
-    if ( cur->size && (cur->name[0]=='O' && cur->name[1]=='S' && cur->name[2]== -71)) {
+    // last module have to os9p1
+    if ( cur->next == 0 ) { //   cur->size && (cur->name[0]=='O' && cur->name[1]=='S' && cur->name[2]== -71)) {
        for(; pos < 0xf800 ; pos++) {   // os9p1 begins at 0xf800
           fputc(0xff,romfile);
        }