# HG changeset patch # User Shinji KONO # Date 1530869498 -32400 # Node ID ce7323f9b937ce9fd69e91a0f70a4debad20e706 # Parent 2a1338b218bf1df5201a7de186fdf833807f2db5 fix diff -r 2a1338b218bf -r ce7323f9b937 a09.c --- a/a09.c Thu Jul 05 18:37:11 2018 +0900 +++ b/a09.c Fri Jul 06 18:31:38 2018 +0900 @@ -451,8 +451,8 @@ if(isalpha(c))return scanlabel(); else if(isdigit(c))return scandecimal(); else switch(c) { - case '.' : - case '*' : srcptr++;exprcat|=2;return loccounter; + case '*' : if(prevloc) { srcptr++;exprcat|=2;return prevloc-1; } + case '.' : srcptr++;exprcat|=2;return loccounter; case '$' : return scanhex(); case '%' : return scanbin(); case '&' : /* compatibility */ diff -r 2a1338b218bf -r ce7323f9b937 engine.c --- a/engine.c Thu Jul 05 18:37:11 2018 +0900 +++ b/engine.c Fri Jul 06 18:31:38 2018 +0900 @@ -41,32 +41,58 @@ #ifdef USE_MMU -Byte dummy; -static Byte * mem0(Byte *iphymem, Word adr, Byte *immu) { - if (adr>=0xff00) return iphymem + memsize - 0x10000 + adr; // fixed area +Byte * mem0(Byte *iphymem, Word adr, Byte *immu) { int addr = (immu[ (adr) >> 13 ] <<13 ) + ((adr) & 0x1fff ); - if ( addr >= memsize ) { - dummy = 0; - return &dummy; - } return & iphymem[ addr ]; }; -#define mem(adr) (*mem0(iphymem, adr,immu)) -#define GETWORD(a) ({Byte *phy = mem0(iphymem, a,immu); phy[0]<<8|phy[1];}) -#define SETBYTE(a,n) {Byte *phy = mem0(iphymem, a,immu); if(!(phy-iphymem>=romstart)) phy[0]=n;} -#define SETWORD(a,n) {Byte *phy = mem0(iphymem, a,immu); if(!(phy-iphymem>=romstart)){phy[0]=(n)>>8;phy[1]=n;}} + +static Byte mem1(Byte *iphymem, Word adr, Byte *immu) { + if ((adr&0xff00)==(IOPAGE&0xff00)) return do_input(adr&0xff); + Byte *p = mem0(iphymem, adr, immu); + if(!(p-phymem>=memsize)) { + return *p; + } else { + return 0xff; + } +} -Byte * mem1(Byte *iphymem, Word adr, Byte *immu) { return mem0(iphymem,adr,immu); } +#define mem(a) mem1(iphymem,a,immu) + +static void SETBYTE1(Byte n,Byte *iphymem, Word adr, Byte *immu) { + if ((adr&0xff00)==(IOPAGE&0xff00)) do_output(adr&0xff,n); + Byte *p = mem0(iphymem, adr, immu); + if(!(p-phymem>=romstart)) { + *p=n; + } +} + +#define SETBYTE(a,n) SETBYTE1(n,iphymem,a,immu); #else -#define mem(adr) mem[adr] +static Byte mem1(Word adr) { + if ((adr&0xff00)==(IOPAGE&0xff00)) return do_input(adr&0xff); + return mem[adr]; +} + +static void SETBYTE1(Word a,Byte n) { + if ((a&0xff00)==(IOPAGE&0xff00)) do_output(a&0xff,n); + if(!(a>=romstart))mem[a]=n; +} +#define mem(a) mem1(a) +#define SETBYTE(a,n) SETBYTE1(a,n); + +#endif #define GETWORD(a) (mem(a)<<8|mem((a)+1)) -#define SETBYTE(a,n) {if(!(a>=romstart))mem(a)=n;} -#define SETWORD(a,n) if(!(a>=romstart)){mem(a)=(n)>>8;mem((a)+1)=n;} +#define SETWORD(a,n) {Word a1=a;SETBYTE(a1,n>>8);SETBYTE(a1+1,n);} -#endif +/* Macros for load and store of accumulators. Can be modified to check + for port addresses */ +// #define LOADAC(reg) if((eaddr&0xff00)!=(IOPAGE&0xff00))reg=mem(eaddr);else\ +// reg=do_input(eaddr&0xff); +// #define STOREAC(reg) if((eaddr&0xff00)!=(IOPAGE&0xff00))SETBYTE(eaddr,reg)else\ +// do_output(eaddr&0xff,reg); /* Two bytes of a word are fetched separately because of the possible wrap-around at address $ffff and alignment @@ -149,12 +175,9 @@ case 10: iccreg=val;break;\ case 11: idpreg=val;break;} -/* Macros for load and store of accumulators. Can be modified to check - for port addresses */ -#define LOADAC(reg) if((eaddr&0xff00)!=(IOPAGE&0xff00))reg=mem(eaddr);else\ - reg=do_input(eaddr&0xff); -#define STOREAC(reg) if((eaddr&0xff00)!=(IOPAGE&0xff00))SETBYTE(eaddr,reg)else\ - do_output(eaddr&0xff,reg); + +#define LOADAC(reg) reg=mem(eaddr); +#define STOREAC(reg) SETBYTE(eaddr,reg); #define LOADREGS ixreg=xreg;iyreg=yreg;\ iureg=ureg;isreg=sreg;\ @@ -212,7 +235,7 @@ if(tracing && ipcreg>=tracelo && ipcreg<=tracehi) { SAVEREGS #ifdef USE_MMU - Byte *phyadr = &mem(pcreg); + Byte *phyadr = mem0(phymem,pcreg,immu); prog = (char *)(phyadr - pcreg); #endif do_trace(tracefile); @@ -1105,7 +1128,12 @@ CLV SETDREG(tw) break; case 0xDD: /*STD direct */ DIRECT tw=GETDREG; SETNZ16(tw) CLV +#ifdef USE_MMU + STOREAC((tw>>8)&0x0ff); eaddr++; + STOREAC(tw&0x0ff); break; +#else SETWORD(eaddr,tw) break; +#endif case 0xDE: /* LDU (LDS) direct */ DIRECT tw=GETWORD(eaddr); CLV SETNZ16(tw) if(!iflag)iureg=tw; else isreg=tw;break; @@ -1151,7 +1179,7 @@ case 0xED: /*STD indexed */ tw=GETDREG; SETNZ16(tw) CLV #ifdef USE_MMU - STOREAC((tw<<8)&0x0ff); eaddr++; + STOREAC((tw>>8)&0x0ff); eaddr++; STOREAC(tw&0x0ff); break; #else @@ -1202,7 +1230,7 @@ case 0xFD: /*STD ext */ EXTENDED tw=GETDREG; SETNZ16(tw) CLV #ifdef USE_MMU - STOREAC((tw<<8)&0x0ff); eaddr++; + STOREAC((tw>>8)&0x0ff); eaddr++; STOREAC(tw&0x0ff); break; #else diff -r 2a1338b218bf -r ce7323f9b937 io.c --- a/io.c Thu Jul 05 18:37:11 2018 +0900 +++ b/io.c Fri Jul 06 18:31:38 2018 +0900 @@ -101,7 +101,7 @@ extern void disasm(int,int); #ifdef USE_MMU extern char *prog ; // for disass -extern Byte * mem1(Byte *iphymem, Word adr, Byte *immu) ; +extern Byte * mem0(Byte *iphymem, Word adr, Byte *immu) ; #endif @@ -253,12 +253,12 @@ xidx = 0; } } + } else if (a >= 0x40+(IOPAGE&0xff)) { /* disk */ + do_disk(a,c); + } else if (a >= 0x30+(IOPAGE&0xff)) { /* timer */ + do_timer(a,c); } else if (a >= 0x10+(IOPAGE&0xff)) { /* mmu */ do_mmu(a,c); - } else if (a >= 0x30+(IOPAGE&0xff)) { /* timer */ - do_timer(a,c); - } else if (a >= 0x40+(IOPAGE&0xff)) { /* disk */ - do_disk(a,c); } } @@ -331,11 +331,8 @@ } else { mmu = phymem+memsize-0x10000+0xffa8; } - mem[(IOPAGE&0xff00)+a] = c; - } if (0x20+(IOPAGE&0xff) <= a && a <= 0x2f+(IOPAGE&0xff)) { - mem[(IOPAGE&0xff00)+a] = c; } - + mem[(IOPAGE&0xff00)+a] = c; // other register such as 0xffa0-0xffaf #endif } @@ -404,7 +401,7 @@ stkskip = 0; restore_term(); #ifdef USE_MMU - Byte *phyadr = mem1(phymem,pcreg,mmu); + Byte *phyadr = mem0(phymem,pcreg,mmu); prog = (char*)phyadr - pcreg; #endif do_trace(stdout); @@ -494,10 +491,10 @@ if (skip==2 && s[1]=='i') { for(int i=0; len > 0 ; i+=16, len-=16) { #ifdef USE_MMU - Byte *phyadr = mem1(phymem,adr+i,mmu); + Byte *phyadr = mem0(phymem,adr+i,mmu); prog = (char*)phyadr - adr; #endif - disasm(adr,adr+i-(len<16?16-len:0)); + disasm(adr+i,adr+i+(len>16?16:len)); } } else { #ifdef USE_MMU @@ -506,7 +503,7 @@ if (adr+i > memsize) goto restart; hexadump(phymem+adr+i,len>16?16:len,adr+i,16); } else { - Byte *phyadr = mem1(phymem,adr+i,mmu); + Byte *phyadr = mem0(phymem,adr+i,mmu); if (phyadr > phymem+memsize) goto restart; hexadump(phyadr,len>16?16:len,adr+i,16); } diff -r 2a1338b218bf -r ce7323f9b937 os9/Makefile --- a/os9/Makefile Thu Jul 05 18:37:11 2018 +0900 +++ b/os9/Makefile Fri Jul 06 18:31:38 2018 +0900 @@ -22,7 +22,7 @@ ./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 -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 + ./makerom -o os9d.rom modules/Shell modules/init.b modules/mdir modules/dir.b 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 -2 level2/init level2/ioman level2/os9p2 level2/os9p3_perr level2/os9p4_regdump level2/pdisk level2/pipe level2/piper level2/pipeman level2/pty level2/rbf level2/scf level2/term level2/os9p1 +os9lv2.rom : makerom level2/init + ./makerom -o os9lv2.rom -2 level2/Shell level2/mdir level2/dir level2/ioman level2/os9p3_perr level2/os9p4_regdump level2/pipe level2/piper level2/pipeman level2/pty level2/rbf modules/SysGo level2/scf level2/os9p2 level2/pdisk level2/pty level2/term level2/init level2/boot level2/os9p1 diff -r 2a1338b218bf -r ce7323f9b937 os9/level2/Makefile --- a/os9/level2/Makefile Thu Jul 05 18:37:11 2018 +0900 +++ b/os9/level2/Makefile Fri Jul 06 18:31:38 2018 +0900 @@ -2,36 +2,51 @@ A09 = ../../a09 SRCDIR=../../CoCoOS9/level2v3/MODULES +SRCCMD=../../CoCoOS9/level2v3/CMDS -all : ioman pdisk init os9p1 os9p2 os9p3_perr os9p4_regdump pipe pipeman pipeman_named piper rbf scf term pty d0 d1 clock vector +all : ioman pdisk init os9p1 os9p2 os9p3_perr os9p4_regdump pipe pipeman pipeman_named piper rbf scf term pty d0 d1 clock vector boot shell dir mdir clean : - rm -f ioman pdisk init os9p1 os9p2 os9p3_perr os9p4_regdump pipe pipeman pipeman_named piper rbf scf term pty d0 d1 clock vector + rm -f ioman pdisk init os9p1 os9p2 os9p3_perr os9p4_regdump pipe pipeman pipeman_named piper rbf scf term pty d0 d1 clock vector boot shell dir mdir +pdisk : + $(A09) ../modules/pdisk.asm -o pdisk -pdisk : ../modules/pdisk.asm - $(A09) ../modules/pdisk.asm -o pdisk +boot : boot.asm + $(A09) boot.asm -o boot + +sysgo : sysgo.asm + $(A09) sysgo.asm -o sysgo init : init.asm $(A09) init.asm -o init -term : +vector : vector.asm + $(A09) vector.asm -o vector + +term : pty-dd.asm $(A09) pty-dd.asm -o term -d0 : +d0 : d0.asm $(A09) d0.asm -o d0 -d1 : +d1 : d1.asm $(A09) d1.asm -o d1 -clock : +clock : clock.asm $(A09) clock.asm -o clock pty : $(A09) ../modules/pty.asm -o pty -vector : vector.asm - $(A09) vector.asm -o vector +shell : + $(A09) ${SRCCMD}/shell_21.asm -o shell + +mdir : + $(A09) ${SRCCMD}/mdir.asm -o mdir + +dir : + $(A09) ${SRCCMD}/dir.asm -o dir os9p1 : $(A09) ${SRCDIR}/os9p1.asm -o os9p1 diff -r 2a1338b218bf -r ce7323f9b937 os9/level2/clock.asm --- a/os9/level2/clock.asm Thu Jul 05 18:37:11 2018 +0900 +++ b/os9/level2/clock.asm Fri Jul 06 18:31:38 2018 +0900 @@ -15,7 +15,7 @@ ttl OS-9 Level One V2 Clock module ifp1 - use os9defs + use defsfile endc tylg set Systm+Objct diff -r 2a1338b218bf -r ce7323f9b937 os9/level2/d0.asm --- a/os9/level2/d0.asm Thu Jul 05 18:37:11 2018 +0900 +++ b/os9/level2/d0.asm Fri Jul 06 18:31:38 2018 +0900 @@ -17,7 +17,7 @@ ttl 40-track floppy disk device descriptor ifp1 - use os9defs + use defsfile endc tylg set Devic+Objct atrv set ReEnt+rev diff -r 2a1338b218bf -r ce7323f9b937 os9/level2/d1.asm --- a/os9/level2/d1.asm Thu Jul 05 18:37:11 2018 +0900 +++ b/os9/level2/d1.asm Fri Jul 06 18:31:38 2018 +0900 @@ -17,7 +17,7 @@ ttl 40-track floppy disk device descriptor ifp1 - use os9defs + use defsfile endc tylg set Devic+Objct atrv set ReEnt+rev diff -r 2a1338b218bf -r ce7323f9b937 os9/level2/init.asm --- a/os9/level2/init.asm Thu Jul 05 18:37:11 2018 +0900 +++ b/os9/level2/init.asm Fri Jul 06 18:31:38 2018 +0900 @@ -3,7 +3,7 @@ ttl os9 system module ifp1 - use os9defs + use defsfile endc null set $0000 tylg set Systm+$00 @@ -11,13 +11,13 @@ rev set $01 mod eom,initnam,tylg,atrv fcb 7 - fdb $b800 + fdb $c000 fcb $0C fcb $0C fdb sysgo - fdb null system device (sysdev) + fdb sysdev system device (sysdev) fdb systerm - fdb null bootstrap module (bootst) + fdb bootst bootstrap module (bootst) initnam fcs "Init" sysgo fcs "SysGo" sysdev fcs "/D0" diff -r 2a1338b218bf -r ce7323f9b937 os9/level2/pty-dd.asm --- a/os9/level2/pty-dd.asm Thu Jul 05 18:37:11 2018 +0900 +++ b/os9/level2/pty-dd.asm Fri Jul 06 18:31:38 2018 +0900 @@ -4,7 +4,7 @@ * Source by Soren Roug 2001 * ifp1 - use os9defs + use defsfile endc nam P1 diff -r 2a1338b218bf -r ce7323f9b937 os9/makerom.c --- a/os9/makerom.c Thu Jul 05 18:37:11 2018 +0900 +++ b/os9/makerom.c Fri Jul 06 18:31:38 2018 +0900 @@ -1,5 +1,8 @@ /* makerom.c build ROM image file os9.rom from module list + + Shinji KONO Fri Jul 6 13:31:52 JST 2018 + */ #include @@ -7,6 +10,31 @@ #include #include +// #define DEBUG 1 + +/* + * Level1 + * os9p1 should be 0xf800 + * it searches ram from the beginning + * rom modules are searched from just after the end of RAM + * + * Level2 + * Coco 512kb memory space + * last 8k is a ROM (can be switched?) ( block 0x3f ) + * os9p1 search module on 0x0d00~0x1e00 at block 0x3f + * + * 8k block ( offset 0xc000 ) + * + * 0xe000 - 0xccff 0xff + * 0xed00 - 0xff78 os9 modules, os9p1 should be the last + * MMU doesnot touch below + * 0xff80 - 0xffdf IO port ( ACIA, clock, pdisk, MMU ) + * 0xffd0 - 0xffef boot code + * 0xfff0 - 0xffff intr vector + * ... next few blocks as extended ROM + * + */ + int level = 1; int IOBASE = 0xe000; int IOSIZE = 0x100; @@ -102,6 +130,8 @@ #ifdef DEBUG printf("*"); #endif + } else if (level==2 && 0xed00 > top) { + m->ioflag = 1; } m->location = top; #ifdef DEBUG @@ -155,9 +185,15 @@ start = start&0xf800; printf("\n\n"); - pos = start; + if (level==2) { + for(int i=0; i<0xd00; i++) fputc(0xff,romfile); + pos = 0xed00; + } else { + pos = start; + } struct os9module *os9p1 = 0; for(struct os9module *cur = root.next; cur ; cur = cur->next ) { + if ( level==2 && cur->ioflag ==1) continue; // last module have to os9p1 if ( cur->next == 0 ) { os9p1 = cur; @@ -181,7 +217,7 @@ printf(" \t: 0x%x - 0x%x : 0x%lx \n",pos, pos + cur->size, ftell(romfile)+start); #endif pos = pos+cur->size; - if (cur->ioflag) { + if (level==1 && cur->ioflag) { if (level==1) { for(; pos < IOBASE + IOSIZE; pos++) { fputc(0xff,romfile); @@ -219,7 +255,7 @@ printf("os9entry %x\n",os9p1->location+getword(os9p1->mod+9)); fputword(os9p1->location+getword(os9p1->mod+9),romfile); // os9p1 entry point - unsigned short vec = os9p1->location+os9p1->size + 15; + unsigned short vec = os9p1->location+os9p1->size - 18; fputword(vec,romfile); fputword(vec+3,romfile); fputword(vec+6,romfile); @@ -228,11 +264,28 @@ fputword(vec+12,romfile); fputword(vec+15,romfile); fputword(LV2START,romfile); + + pos = 0x10000; + for(struct os9module *cur = root.next; cur ; cur = cur->next ) { + if ( cur->ioflag ==0) continue; + printf("mod "); + printOs9Str(cur->name); + fwrite(cur->mod, cur->size, 1, romfile); + printf(" \t: 0x%x - 0x%x\n",pos, pos + cur->size-1); +#ifdef DEBUG + printf(" \t: 0x%x \n",cur->location); + printf(" \t: 0x%x - 0x%x : 0x%lx \n",pos, pos + cur->size, ftell(romfile)+start); +#endif + pos = pos+cur->size; + } + while(pos++ & 0x1fff) fputc(0xff,romfile); } if (level==1) printf("boot rom from 0x%lx\n",0x10000-ftell(romfile)); else - printf("boot rom from 0x%lx\n",512*1024-ftell(romfile)); + printf("boot rom from 0xc000 size 0x%lx\n",ftell(romfile)); fclose(romfile); return 0; } + + diff -r 2a1338b218bf -r ce7323f9b937 v09.c --- a/v09.c Thu Jul 05 18:37:11 2018 +0900 +++ b/v09.c Fri Jul 06 18:31:38 2018 +0900 @@ -83,7 +83,10 @@ long len = filesize(image); if (romstart==0x8000) { #ifdef USE_MMU - romstart = memsize - len; + phymem = malloc(memsize + len - 0x2000); + mem = phymem + memsize - 0x10000 ; + mmu = mem + 0xffa0; + romstart = memsize - 0x2000; #else romstart = 0x10000 - len; #endif @@ -151,18 +154,12 @@ if (memsize < 512*1024) memsize = 512*1024; } else usage(); } - #ifdef USE_MMU - phymem = malloc(memsize); - mem = phymem + memsize - 0x10000 ; - mmu = mem + 0xffa0; - #else #ifdef MSDOS if((mem=farmalloc(65535))==0) { fprintf(stderr,"Not enough memory\n"); exit(2); } #endif - #endif read_image(); if (setterm) set_term(escchar); pcreg=(mem[0xfffe]<<8)+mem[0xffff];