# HG changeset patch # User Shinji KONO # Date 1531631899 -32400 # Node ID 2032755628dc5560161198bdc5bcffb25830b18d # Parent 7c5379eb406eb4241ed6e1ae92cca91d920d558d fix for nitros9 diff -r 7c5379eb406e -r 2032755628dc a09.c --- a/a09.c Sat Jul 14 15:22:54 2018 +0900 +++ b/a09.c Sun Jul 15 14:18:19 2018 +0900 @@ -213,9 +213,8 @@ }; int symcounter=0; -int os9 = 0; // os9 flag -int prevloc = 0; -int prevrmb = 0; +int os9 = 0; // os9 flag +int rmbmode = 0; // in os9 work area struct symrecord * prevlp = 0; /* expression categories... @@ -334,7 +333,7 @@ char relocatable; /* flag to indicate relocatable object. */ char terminate; /* flag to indicate termination. */ char generating; /* flag to indicate that we generate code */ -unsigned short loccounter,oldlc; /* Location counter */ +unsigned short loccounter,oldlc,prevloc,rmbcounter; /* Location counter */ char inpline[128]; /* Current input line (not expanded)*/ char srcline[128]; /* Current source line */ @@ -351,10 +350,10 @@ void generate() { generating = 1; - if (prevloc) { - prevrmb = loccounter+1; // we were in rmb mode - oldlc = loccounter = prevloc-1 ; - prevloc = 0; + if (rmbmode) { + rmbcounter = loccounter; + oldlc = loccounter = prevloc; + rmbmode = 0; } } @@ -489,8 +488,8 @@ if(isalpha(c))return scanlabel(); else if(isdigit(c))return scandecimal(); else switch(c) { - case '*' : srcptr++;exprcat|=2; if(prevloc) return prevloc-1; else return loccounter; - case '.' : srcptr++;exprcat|=2; if(prevrmb) return prevrmb-1; else return loccounter; + case '*' : srcptr++;exprcat|=2; if(rmbmode) return prevloc; else return loccounter; + case '.' : srcptr++;exprcat|=2; if(os9&&!rmbmode) return rmbcounter; else return loccounter; case '$' : return scanhex(); case '%' : return scanbin(); case '&' : /* compatibility */ @@ -1169,13 +1168,11 @@ } } -int modStart; - void os9begin() { generate(); os9=1; // contiguous code generation ( i.e. ignore org nor rmb ) - modStart = loccounter; + oldlc = loccounter = rmbcounter = rmbmode = 0; reset_crc(); putword(0x87cd); putword(scanexpr(0)-loccounter); // module size @@ -1194,6 +1191,9 @@ putword(scanexpr(0)); skipspace(); } + prevloc = codeptr; + rmbmode = 1; // next org works on rmb + loccounter = 0x10000-codeptr; // should start at 0 } void os9end() @@ -1218,9 +1218,10 @@ case 0:/* RMB */ // in OS9 mode, this generates no data // loccounter will be reset after any code to the current code generation - if (prevrmb) { - oldlc = loccounter = prevrmb-1 ; - prevrmb = 0; + if (os9 && !rmbmode) { + prevloc = loccounter; + oldlc = loccounter = rmbcounter; + rmbmode = 1; } setlabel(lp); operand=scanexpr(0); @@ -1463,10 +1464,6 @@ } if(error)report(); loccounter+=codeptr; - if (os9 && prevloc==0 ) { - prevloc = loccounter+1; - oldlc = loccounter = 0; - } } void diff -r 7c5379eb406e -r 2032755628dc d09.c --- a/d09.c Sat Jul 14 15:22:54 2018 +0900 +++ b/d09.c Sun Jul 15 14:18:19 2018 +0900 @@ -1312,7 +1312,7 @@ break; case 0x0d : offset = prog[pc+2] * 256 + prog[pc+3]; - offset = ((offset>0x7fff?offset-0x8001 : offset )+pc+4) & 0xFFFF; + offset = ((offset>0x7fff? offset-0x10000 : offset )+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+adoffset); diff -r 7c5379eb406e -r 2032755628dc io.c --- a/io.c Sat Jul 14 15:22:54 2018 +0900 +++ b/io.c Sun Jul 15 14:18:19 2018 +0900 @@ -1,8 +1,7 @@ /* 6808 Simulator V092 - created 1993,1994 by L.C. Benschop. copyleft (c) 1994-2014 -by the sbc09 team, see AUTHORS for more details. license: -GNU General Public License version 2, see LICENSE for more -details. + created 1993,1994 by L.C. Benschop. copyleft (c) 1994-2014 +by the sbc09 team, see AUTHORS for more details. license: GNU +General Public License version 2, see LICENSE for more details. This program simulates a 6809 processor. @@ -49,7 +48,9 @@ * IOPAGE ~ IOPAGE+0x7f * for OS9 level2 * IOPAGE 0xff80 means ioport beging 0xff80 but IOPAGE itself starts 0xff00 - * 0xfe00-0xff7f, 0xffe0-0xffff can be used as ROM in fixed area + * 0xfe00-0xff7f, 0xffe0-0xffff can be used as RAM in fixed area in level2 + * and these are ROM in level1 + * * * IOPAGE + 0x00 ACIA control * IOPAGE + 0x01 ACIA data @@ -66,6 +67,7 @@ * tr=1 mmu=IOPAGE+0xa8 * * IOPAGE + 0x30 Timer control 0x8f start timer/0x80 stop timer/0x04 update date + * read 0x10 bit menas timer * IOPAGE + 0x31- YY/MM/DD/HH/MM/SS * * IOPAGE + 0x40 Disk control 0x81 read/0x55 write 0 ... ok / 0xff .. error @@ -94,6 +96,7 @@ int acknak; int rcvdnak; int blocknum; +int timer_irq = 2 ; // 2 = FIRQ, 1 = IRQ FILE *infile; FILE *xfile; @@ -194,15 +197,19 @@ if (a == 0+(IOPAGE&0x1ff)) { if (f == EOF) f = char_input(); - if (f != EOF) + if (f != EOF) { c = f; - return 2 + (f != EOF); + mem[(IOPAGE&0xfe00) + a] = c; + } + mem[(IOPAGE&0xfe00) + a] = c = 2 + (f != EOF); + return c; } else if (a == 1+(IOPAGE&0x1ff)) { /*data port*/ if (f == EOF) f = char_input(); if (f != EOF) { c = f; f = EOF; + mem[(IOPAGE&0xfe00) + a] = c; } return c; } @@ -274,11 +281,14 @@ timercontrol.it_interval.tv_usec = 20000; timercontrol.it_value.tv_sec = 0; timercontrol.it_value.tv_usec = 20000; + timer_irq = 1; setitimer(ITIMER_REAL, &timercontrol, NULL); + mem[(IOPAGE&0xfe00)+a]=c; } else if (a==0x30+(IOPAGE&0x1ff) && c==0x80) { timercontrol.it_interval.tv_sec = 0; timercontrol.it_interval.tv_usec = 0; setitimer(ITIMER_REAL, &timercontrol, NULL); + mem[(IOPAGE&0xfe00)+a]=c; } else if (a==0x30+(IOPAGE&0x1ff) && c==0x04) { time_t tm = time(0); struct tm *t = localtime(&tm); @@ -338,7 +348,8 @@ void timehandler(int sig) { attention = 1; irq = 2; - signal(SIGALRM, timehandler); + mem[(IOPAGE&0xfe00)+0x30] |= 0x10 ; + // signal(SIGALRM, timehandler); } void handler(int sig) { diff -r 7c5379eb406e -r 2032755628dc os9/level1/IOMan Binary file os9/level1/IOMan has changed diff -r 7c5379eb406e -r 2032755628dc os9/level1/OS9p2 Binary file os9/level1/OS9p2 has changed diff -r 7c5379eb406e -r 2032755628dc os9/level1/SCF Binary file os9/level1/SCF has changed diff -r 7c5379eb406e -r 2032755628dc os9/level1/Shell Binary file os9/level1/Shell has changed diff -r 7c5379eb406e -r 2032755628dc os9/level1/SysGo Binary file os9/level1/SysGo has changed diff -r 7c5379eb406e -r 2032755628dc os9/level1/clock.asm --- a/os9/level1/clock.asm Sat Jul 14 15:22:54 2018 +0900 +++ b/os9/level1/clock.asm Sun Jul 15 14:18:19 2018 +0900 @@ -23,6 +23,9 @@ rev set $01 edition set $06 TimerPort set $e030 +TkPerSec set 60 +TkPerTS equ TkPerSec/10 ticks per time slice + mod eom,name,tylg,atrv,ClkEnt,size @@ -38,22 +41,33 @@ ClockIRQ clra tfr a,dp -L00AE jsr [>D.Poll] - bcc L00AE -L00B4 jmp [>D.AltIRQ] - rts + ldx #TimerPort + lda ,x + bita #$10 + beq L00B4 + ldb #$8f start timer + stb ,x +L00B4 + jmp [>D.SvcIRQ] ClkEnt equ * + ldd #59*256+$01 last second and last tick + std ClockIRQ,pcr + leax SysTbl,pcr + leay mod = (unsigned char*)m + sizeof(struct os9module); fread(m->mod , size, 1, fp); m->name = (char*) (m->mod + (m->mod[4]*256 + m->mod[5]) ); + m->entry = m->mod[9]*256 + m->mod[10] ; fclose(fp); return m; } @@ -87,11 +89,15 @@ void printOs9Str(char *p) { + char *q = p; while((*p & 0x80)==0) { putchar(*p); p++; } putchar(*p & 0x7f); + while(pname); cur->location = pos; fwrite(cur->mod, cur->size, 1, romfile); - printf(" \t: 0x%x - 0x%x size 0x%x\n",pos, pos + cur->size-1,cur->size); + printf(" \t: 0x%x - 0x%x size 0x%04x entry 0x%x\n",pos, pos + cur->size-1,cur->size,cur->entry+cur->location); #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); @@ -273,8 +279,9 @@ if (vecofs==0) { printf("can't find vector\n"); } + static int perm[] = {0,1,5,4,2,3}; for(int i=0;i<6;i++) { - fputword(os9p1->location +vecofs+i*4,romfile); + fputword(os9p1->location +vecofs+perm[i]*4,romfile); } int entry_ofs = (m->mod[9]<<8) + m->mod[10]; fputword( os9p1->location + entry_ofs ,romfile); @@ -331,7 +338,7 @@ printf("mod "); printOs9Str(cur->name); fwrite(cur->mod, cur->size, 1, romfile); - printf(" \t: 0x%x - 0x%x size 0x%x\n",pos, pos + cur->size-1, cur->size); + printf(" \t: 0x%x - 0x%x size 0x%04x entry 0x%x\n",pos, pos + cur->size-1, cur->size, cur->entry+cur->location); #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);