Diff for /xmil/io/pcg.c between versions 1.11 and 1.15

version 1.11, 2004/08/15 11:14:42 version 1.15, 2008/06/02 20:07:31
Line 2 Line 2
 #include        "z80core.h"  #include        "z80core.h"
 #include        "pccore.h"  #include        "pccore.h"
 #include        "iocore.h"  #include        "iocore.h"
 #include        "nevent.h"  
 #include        "vram.h"  #include        "vram.h"
   #include        "makescrn.h"
 #include        "font.h"  #include        "font.h"
   
   
Line 12  static void waithsync(void) { Line 12  static void waithsync(void) {
         SINT32  clock;          SINT32  clock;
         SINT32  h;          SINT32  h;
   
 //      必ず hsyncを待つ?          clock = (CPU_CLOCKCOUNT - iocore.e.framestartclock) << 8;
 //      if (corestat.vsync) {  
 //              return;  
 //      }  
         clock = nevent_getwork(NEVENT_FRAMES) << 8;  
         h = clock % crtc.e.rasterclock8;          h = clock % crtc.e.rasterclock8;
         h = crtc.e.rasterdisp8 - h;          h = crtc.e.rasterdisp8 - h;
         if (h < 0) {          if (h < 0) {
Line 28  static void waithsync(void) { Line 24  static void waithsync(void) {
   
 static UINT pcg_offset(void) {  static UINT pcg_offset(void) {
   
         if (tram[TRAM_ATR + 0x07ff] & 0x20) {          if (TRAM_ATR(0x07ff) & 0x20) {
                 return(0x7ff);                  return(0x7ff);
         }          }
         if (tram[TRAM_ATR + 0x03ff] & 0x20) {          if (TRAM_ATR(0x03ff) & 0x20) {
                 return(0x3ff);                  return(0x3ff);
         }          }
         if (tram[TRAM_ATR + 0x05ff] & 0x20) {          if (TRAM_ATR(0x05ff) & 0x20) {
                 return(0x5ff);                  return(0x5ff);
         }          }
         if (tram[TRAM_ATR + 0x01ff] & 0x20) {          if (TRAM_ATR(0x01ff) & 0x20) {
                 return(0x1ff);                  return(0x1ff);
         }          }
         return(0x7ff);          return(0x7ff);
Line 45  static UINT pcg_offset(void) { Line 41  static UINT pcg_offset(void) {
   
 static UINT knj_offset(void) {  static UINT knj_offset(void) {
   
         if (!(tram[TRAM_ATR + 0x07ff] & 0x20)) {          if (!(TRAM_ATR(0x07ff) & 0x20)) {
                 return(0x7ff);                  return(0x7ff);
         }          }
         if (!(tram[TRAM_ATR + 0x03ff] & 0x20)) {          if (!(TRAM_ATR(0x03ff) & 0x20)) {
                 return(0x3ff);                  return(0x3ff);
         }          }
         if (!(tram[TRAM_ATR + 0x05ff] & 0x20)) {          if (!(TRAM_ATR(0x05ff) & 0x20)) {
                 return(0x5ff);                  return(0x5ff);
         }          }
         if (!(tram[TRAM_ATR + 0x01ff] & 0x20)) {          if (!(TRAM_ATR(0x01ff) & 0x20)) {
                 return(0x1ff);                  return(0x1ff);
         }          }
         return(0x7ff);          return(0x7ff);
Line 67  static UINT nowsyncoffset(UINT *line) { Line 63  static UINT nowsyncoffset(UINT *line) {
         UINT    v;          UINT    v;
         UINT    ret;          UINT    ret;
   
         clock = nevent_getwork(NEVENT_FRAMES);          clock = (CPU_CLOCKCOUNT - iocore.e.framestartclock) << 8;
         if (corestat.vsync) {  
                 clock += corestat.dispclock;  
         }  
         clock = clock << 8;  
         v = clock / crtc.e.rasterclock8;          v = clock / crtc.e.rasterclock8;
         h = clock - (v * crtc.e.rasterclock8);          h = clock - (v * crtc.e.rasterclock8);
         if (crtc.s.SCRN_BITS & SCRN_24KHZ) {          if (crtc.s.SCRN_BITS & SCRN_24KHZ) {
Line 82  static UINT nowsyncoffset(UINT *line) { Line 74  static UINT nowsyncoffset(UINT *line) {
         ret = (ret * crtc.s.reg[CRTCREG_HDISP]) + crtc.e.pos;          ret = (ret * crtc.s.reg[CRTCREG_HDISP]) + crtc.e.pos;
         ret += (h * crtc.s.reg[CRTCREG_HDISP]) / crtc.e.rasterclock8;          ret += (h * crtc.s.reg[CRTCREG_HDISP]) / crtc.e.rasterclock8;
         if (ret >= 0x0800) {          if (ret >= 0x0800) {
                 ret = 0x07ff;           // オーバーフロー                  ret = 0x07ff;           /* オーバーフロー */
         }          }
         return(ret);                    // まさに表示しようとしている TXT-RAMアドレス          return(ret);                    /* まさに表示しようとしている TXT-RAMアドレス */
 }  }
   
   
Line 97  void IOOUTCALL pcg_o(UINT port, REG8 val Line 89  void IOOUTCALL pcg_o(UINT port, REG8 val
         if (crtc.s.SCRN_BITS & SCRN_PCGMODE) {          if (crtc.s.SCRN_BITS & SCRN_PCGMODE) {
                 waithsync();                  waithsync();
                 off = pcg_offset();                  off = pcg_offset();
                 chr = tram[TRAM_ANK + off];                  chr = TRAM_ANK(off);
                 if (tram[TRAM_KNJ + off] & 0x90) {                  if (TRAM_KNJ(off) & 0x90) {
                         chr = chr & (~1);                          chr = chr & (~1);
                         line = port & 15;                          line = port & 15;
                 }                  }
Line 108  void IOOUTCALL pcg_o(UINT port, REG8 val Line 100  void IOOUTCALL pcg_o(UINT port, REG8 val
         }          }
         else {          else {
                 off = nowsyncoffset(&line);                  off = nowsyncoffset(&line);
                 chr = tram[TRAM_ANK + off];                  chr = TRAM_ANK(off);
         }          }
         chr += (port & 0x0300) - 0x100;          chr += (port & 0x0300) - 0x100;
         pcg.d[(chr << 3) + line] = value;          if (pcg.d[(chr << 3) + line] != value) {
                   pcg.d[(chr << 3) + line] = value;
                   crtc.e.scrnallflash = TRUE;
           }
 }  }
   
 REG8 IOINPCALL pcg_i(UINT port) {  REG8 IOINPCALL pcg_i(UINT port) {
Line 123  REG8 IOINPCALL pcg_i(UINT port) { Line 118  REG8 IOINPCALL pcg_i(UINT port) {
         UINT    knj;          UINT    knj;
         UINT    addr;          UINT    addr;
   
         TRACEOUT(("pcg->%.4x", port));  
         upper = port & 0x0300;          upper = port & 0x0300;
         if (crtc.s.SCRN_BITS & SCRN_PCGMODE) {          if (crtc.s.SCRN_BITS & SCRN_PCGMODE) {
                 waithsync();                  waithsync();
                 line = port & 0x0f;                  line = port & 0x0f;
                 if (!upper) {                  if (!upper) {
                         off = knj_offset();                          off = knj_offset();
                         chr = tram[TRAM_ANK + off];                          chr = TRAM_ANK(off);
                         knj = tram[TRAM_KNJ + off];                          knj = TRAM_KNJ(off);
                         if (knj & 0x80) {                          if (knj & 0x80) {
                                 addr = ((((knj & 0x1f) << 8) + chr) << 4) + line;                                  addr = ((((knj & 0x1f) << 8) + chr) << 4) + line;
                                 if (knj & 0x40) {                                  if (knj & 0x40) {
Line 148  REG8 IOINPCALL pcg_i(UINT port) { Line 142  REG8 IOINPCALL pcg_i(UINT port) {
                 }                  }
                 else {                  else {
                         off = pcg_offset();                          off = pcg_offset();
                         chr = tram[TRAM_ANK + off];                          chr = TRAM_ANK(off);
                         if (tram[TRAM_KNJ + off] & 0x90) {                          if (TRAM_KNJ(off) & 0x90) {
                                 chr = chr & (~1);                                  chr = chr & (~1);
                         }                          }
                         else {                          else {
Line 159  REG8 IOINPCALL pcg_i(UINT port) { Line 153  REG8 IOINPCALL pcg_i(UINT port) {
         }          }
         else {          else {
                 off = nowsyncoffset(&line);                  off = nowsyncoffset(&line);
                 chr = tram[TRAM_ANK + off];                  chr = TRAM_ANK(off);
         }          }
         if (!upper) {          if (!upper) {
                 return(font_ank[(chr << 3) + line]);                  return(font_ank[(chr << 3) + line]);
Line 171  REG8 IOINPCALL pcg_i(UINT port) { Line 165  REG8 IOINPCALL pcg_i(UINT port) {
 }  }
   
   
 // ----  /* initialize & reset */
   
 void pcg_initialize(void) {  void pcg_initialize(void) {
   

Removed from v.1.11  
changed lines
  Added in v.1.15


RetroPC.NET-CVS <cvs@retropc.net>