comparison io.c @ 11:ce7323f9b937

fix
author Shinji KONO <kono@ie.u-ryukyu.ac.jp>
date Fri, 06 Jul 2018 18:31:38 +0900
parents 2a1338b218bf
children 111e5defb8ab
comparison
equal deleted inserted replaced
10:2a1338b218bf 11:ce7323f9b937
99 99
100 extern void hexadump( unsigned char *b, int l, int loc, int w); 100 extern void hexadump( unsigned char *b, int l, int loc, int w);
101 extern void disasm(int,int); 101 extern void disasm(int,int);
102 #ifdef USE_MMU 102 #ifdef USE_MMU
103 extern char *prog ; // for disass 103 extern char *prog ; // for disass
104 extern Byte * mem1(Byte *iphymem, Word adr, Byte *immu) ; 104 extern Byte * mem0(Byte *iphymem, Word adr, Byte *immu) ;
105 #endif 105 #endif
106 106
107 107
108 void do_timer(int,int); 108 void do_timer(int,int);
109 void do_disk(int,int); 109 void do_disk(int,int);
251 fwrite(xmbuf + 3, 1, 128, xfile); 251 fwrite(xmbuf + 3, 1, 128, xfile);
252 } 252 }
253 xidx = 0; 253 xidx = 0;
254 } 254 }
255 } 255 }
256 } else if (a >= 0x40+(IOPAGE&0xff)) { /* disk */
257 do_disk(a,c);
258 } else if (a >= 0x30+(IOPAGE&0xff)) { /* timer */
259 do_timer(a,c);
256 } else if (a >= 0x10+(IOPAGE&0xff)) { /* mmu */ 260 } else if (a >= 0x10+(IOPAGE&0xff)) { /* mmu */
257 do_mmu(a,c); 261 do_mmu(a,c);
258 } else if (a >= 0x30+(IOPAGE&0xff)) { /* timer */
259 do_timer(a,c);
260 } else if (a >= 0x40+(IOPAGE&0xff)) { /* disk */
261 do_disk(a,c);
262 } 262 }
263 } 263 }
264 264
265 void restore_term(void) { 265 void restore_term(void) {
266 tcsetattr(0, TCSAFLUSH, &termsetting); 266 tcsetattr(0, TCSAFLUSH, &termsetting);
329 if (c&0) { 329 if (c&0) {
330 mmu = phymem+memsize-0x10000+0xffa0; 330 mmu = phymem+memsize-0x10000+0xffa0;
331 } else { 331 } else {
332 mmu = phymem+memsize-0x10000+0xffa8; 332 mmu = phymem+memsize-0x10000+0xffa8;
333 } 333 }
334 mem[(IOPAGE&0xff00)+a] = c;
335 } if (0x20+(IOPAGE&0xff) <= a && a <= 0x2f+(IOPAGE&0xff)) {
336 mem[(IOPAGE&0xff00)+a] = c;
337 } 334 }
338 335 mem[(IOPAGE&0xff00)+a] = c; // other register such as 0xffa0-0xffaf
339 #endif 336 #endif
340 } 337 }
341 338
342 typedef struct bp { 339 typedef struct bp {
343 int address; 340 int address;
402 } 399 }
403 restart0: 400 restart0:
404 stkskip = 0; 401 stkskip = 0;
405 restore_term(); 402 restore_term();
406 #ifdef USE_MMU 403 #ifdef USE_MMU
407 Byte *phyadr = mem1(phymem,pcreg,mmu); 404 Byte *phyadr = mem0(phymem,pcreg,mmu);
408 prog = (char*)phyadr - pcreg; 405 prog = (char*)phyadr - pcreg;
409 #endif 406 #endif
410 do_trace(stdout); 407 do_trace(stdout);
411 if (trskip>1) { // show trace and step 408 if (trskip>1) { // show trace and step
412 trskip--; 409 trskip--;
492 len = getarg(next,&next); 489 len = getarg(next,&next);
493 } 490 }
494 if (skip==2 && s[1]=='i') { 491 if (skip==2 && s[1]=='i') {
495 for(int i=0; len > 0 ; i+=16, len-=16) { 492 for(int i=0; len > 0 ; i+=16, len-=16) {
496 #ifdef USE_MMU 493 #ifdef USE_MMU
497 Byte *phyadr = mem1(phymem,adr+i,mmu); 494 Byte *phyadr = mem0(phymem,adr+i,mmu);
498 prog = (char*)phyadr - adr; 495 prog = (char*)phyadr - adr;
499 #endif 496 #endif
500 disasm(adr,adr+i-(len<16?16-len:0)); 497 disasm(adr+i,adr+i+(len>16?16:len));
501 } 498 }
502 } else { 499 } else {
503 #ifdef USE_MMU 500 #ifdef USE_MMU
504 for(int i=0; len > 0 ; i+=16, len-=16) { 501 for(int i=0; len > 0 ; i+=16, len-=16) {
505 if (skip==2 && s[1]=='p') { 502 if (skip==2 && s[1]=='p') {
506 if (adr+i > memsize) goto restart; 503 if (adr+i > memsize) goto restart;
507 hexadump(phymem+adr+i,len>16?16:len,adr+i,16); 504 hexadump(phymem+adr+i,len>16?16:len,adr+i,16);
508 } else { 505 } else {
509 Byte *phyadr = mem1(phymem,adr+i,mmu); 506 Byte *phyadr = mem0(phymem,adr+i,mmu);
510 if (phyadr > phymem+memsize) goto restart; 507 if (phyadr > phymem+memsize) goto restart;
511 hexadump(phyadr,len>16?16:len,adr+i,16); 508 hexadump(phyadr,len>16?16:len,adr+i,16);
512 } 509 }
513 } 510 }
514 #else 511 #else