Mercurial > hg > Members > kono > os9 > sbc09
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); }