# HG changeset patch # User Shinji KONO # Date 1530716574 -32400 # Node ID 9c2602e1d71693c65fa53b356a0939854b23f633 # Parent 35028b396a353fa994a3c562ad6910aa7d151f8a level2 rom done diff -r 35028b396a35 -r 9c2602e1d716 a09.c --- 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;icat!=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; diff -r 35028b396a35 -r 9c2602e1d716 os9/Makefile --- 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 diff -r 35028b396a35 -r 9c2602e1d716 os9/level2/Makefile --- /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 + diff -r 35028b396a35 -r 9c2602e1d716 os9/makerom.c --- 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 #include -#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 ; inext = 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); }