changeset 84:9b661787d5ed

2Mbyte
author Shinji KONO <kono@ie.u-ryukyu.ac.jp>
date Sat, 11 Aug 2018 18:16:04 +0900
parents 2e3d4b54ec2d
children 4652761a60f9
files src/engine.c src/os9/makerom.c src/trace.c src/v09.c
diffstat 4 files changed, 40 insertions(+), 26 deletions(-) [+]
line wrap: on
line diff
--- a/src/engine.c	Sat Aug 11 14:06:43 2018 +0900
+++ b/src/engine.c	Sat Aug 11 18:16:04 2018 +0900
@@ -56,7 +56,7 @@
 #else
 
 int paddr(Word adr, Byte *immu) { 
-    if ((adr&0xfe00)==(IOPAGE&0xfe00)) return memsize-0x10000+adr;
+    if ((adr&0xfe00)==(IOPAGE&0xfe00)) return adr;
     return  (immu[ (adr) >> 13 ] <<13 ) + ((adr) & 0x1fff ); 
 }
 
--- a/src/os9/makerom.c	Sat Aug 11 14:06:43 2018 +0900
+++ b/src/os9/makerom.c	Sat Aug 11 18:16:04 2018 +0900
@@ -32,6 +32,9 @@
  *        0xffd0 - 0xffef   boot code
  *        0xfff0 - 0xffff   intr vector
  *         ... next few blocks as extended ROM
+ *         lv2 6809 memory check routine destroys 0x200 on page 0x40
+ *                  sta     >-$6000,x
+ *         avoid 0x200
  *
  */
 
@@ -329,9 +332,11 @@
         if ( cur->ioflag ==0) continue; 
         bootsize += cur->size;
      }
+     bootsize += 0x300-2;    // to avoid 0x200 bombing
      fputc(bootsize>>8,romfile);
      fputc(bootsize&0xff,romfile);
      pos += 2;
+     for( int i = 0; i<0x300-2; i++) fputc(0xff,romfile);
      for(struct os9module *cur = root.next; cur ; cur = cur->next ) {
         if ( cur->ioflag ==0) continue; 
         cur->location = pos;
--- a/src/trace.c	Sat Aug 11 14:06:43 2018 +0900
+++ b/src/trace.c	Sat Aug 11 18:16:04 2018 +0900
@@ -142,7 +142,7 @@
 }
 
                
-void setbreak(int adr,int count) ;
+void setbreak(int adr,int count, int page) ;
 int nexti(void);
 
 void do_escape(void) {
@@ -225,20 +225,27 @@
                 stkskip = sreg + 2;
                 attention = escape = 1;
                 break;
-        case 'b':   // set break point
-                if (s[1]) {
-                   char *next;
+        case 'b': { // set break point
+                char *next = s;
+                int page = -1;
+                if (next[1]=='p') {
+                   next++;
+                   if (next[1]) 
+                      page = getarg(next+1,&next);
+                }
+                if (next[1]) {
                    int count = 0;
-                   int adr = getarg(s+1,&next);
+                   int adr = getarg(next+1,&next);
                    if (next[0]) {
                       count = getarg(next,&next);
                    }
-                   setbreak(adr,count);
+                   setbreak(adr,count,page);
                 } else {
-                   setbreak(pcreg,0);
+                   setbreak(pcreg,0,page);
                 }
                 bpskip = -1;
                 goto restart;
+             }
         case 'B':   // break point list
                 for(BPTR bp = breakpoint; bp ; bp = bp->next) {
 #ifdef USE_MMU
@@ -291,8 +298,8 @@
                 if (next[0]) {
                    adr = getarg(next,&next);
 #ifdef USE_MMU
-                   adr -= adr &0xf;
-                   // if (p=='p') adr -= adr&0x1fff;
+                   if (d!='i')   // disassembler may fail on page boundary
+                       adr -= adr &0xf;
 #endif
                    if (next[0]) {
                        len = getarg(next,&next);
@@ -432,14 +439,17 @@
 /*
  *     keep break point / watch point in a list
  */
-void setbreak(int adr, int count) {
+void setbreak(int adr, int count, int page) {
   BPTR bp = calloc(1,sizeof(BP));
   bp->count = count;
   bp->laddr = adr;
   bp->address = paddr(adr,mmu);
 #ifdef USE_MMU
+  if (page!=-1) {
+      bp->address = page*0x2000 + adr;
+  } 
   if (bp->address >= memsize) { free(bp); return; }
-  bp->watch = *mem0(phymem,adr,mmu);
+  bp->watch = phymem[bp->address];
 #else
   bp->watch = mem[adr];
 #endif
@@ -500,7 +510,7 @@
             }
             break;
     }
-    if (ofs) setbreak(pcreg+ofs,-1);
+    if (ofs) setbreak(pcreg+ofs,-1,-1);
     return ofs;
 }
 
--- a/src/v09.c	Sat Aug 11 14:06:43 2018 +0900
+++ b/src/v09.c	Sat Aug 11 18:16:04 2018 +0900
@@ -103,26 +103,25 @@
   * In case of Coco, there is no ROM (switched out after boot )
   *    0x00000-0x0fdff    normal mem
   *    0x0fe00-0x0ffff    ram fixed address ram including io
-  *    0x10000-0x7ffff    ram (512Kb memory current implementation)
-  * it should have 2MB memory
-  *    0x10000-0xfffff    ram
-  *  >0x100000            lapround
+  *    0x10000-0x1fffff    ram (2MB memory )
+  *  >0x200000            lapround
   *
   * discless boot
-  *    rom image will be copyied from 0xed00-0x1xxxx (all ram)
-  *    boot copies 0x10000-0x1xxxx to os9's boot memory  (ususally done by rel.asm )
-  *    after that 0x10000-0x1xxx will be all free
+  *    rom image will be copyied from 0x7eed00-0x7fxxxx (all ram)
+  *    boot copies 0x800000-0x8xxxx to os9's boot memory  (ususally done by rel.asm )
+  *        (original system copies it from fd or hd)
+  *    after that 0x800000-0x8xxxx will be all free
   */
- phymem = malloc(memsize + len - 0x2000);
- rommemsize = memsize + len - 0x2000;
- mem    = phymem + memsize - 0x10000 ;
+ phymem = malloc(memsize );
+ rommemsize = memsize ;
+ mem    = phymem + 0x38*0x2000;
  mmu = &mem[0xffa0];
  prog = (char*)mem;
  if (romstart==0x8000) {
-     // romstart = memsize - 0x10000 + 0xed00 ;
      romstart = memsize ;  // full 512kb mem
  }
- fread(mem+ 0xe000,len,1,image);
+ fread(mem+  0xe000,len,1,image);
+ mem[0xff90] = 0;
  mem[0xffa7] = 0x3f;
 #else
  if (romstart==0x8000) {
@@ -154,7 +153,7 @@
  int i;
  int setterm = 1;
  timerirq = 2;   // use FIRQ default
- memsize = 512*1024;      // full 2 mbute
+ memsize = 512*1024*4;      // full 2 mbute
  escchar='\x1d'; 
  tracelo=0;tracehi=0xffff;
  for(i=1;i<argc;i++) {