Diff for /xmil/io/crtc.c between versions 1.18 and 1.20

version 1.18, 2004/08/18 08:08:13 version 1.20, 2008/06/02 20:07:31
Line 1 Line 1
 #include        "compiler.h"  #include        "compiler.h"
 #include        "scrnmng.h"  
 #include        "z80core.h"  #include        "z80core.h"
 #include        "pccore.h"  #include        "pccore.h"
 #include        "iocore.h"  #include        "iocore.h"
Line 49  static const GDCCLK gdcclk[] = { Line 48  static const GDCCLK gdcclk[] = {
 static void crtc_bankupdate(void) {  static void crtc_bankupdate(void) {
   
         if (!(crtc.s.SCRN_BITS & SCRN_ACCESSVRAM)) {          if (!(crtc.s.SCRN_BITS & SCRN_ACCESSVRAM)) {
                 crtc.e.gram = gram + GRAM_BANK0;                  crtc.e.gramacc = gram + GRAM_BANK0;
                 crtc.e.updatebit = UPDATE_VRAM0;                  crtc.e.updatebit = UPDATE_VRAM0;
         }          }
         else {          else {
                 crtc.e.gram = gram + GRAM_BANK1;                  crtc.e.gramacc = gram + GRAM_BANK1;
                 crtc.e.updatebit = UPDATE_VRAM1;                  crtc.e.updatebit = UPDATE_VRAM1;
         }          }
 }  }
Line 92  static void crtc_dispupdate(void) { Line 91  static void crtc_dispupdate(void) {
                         updatemask = 0x3ff;                          updatemask = 0x3ff;
                 }                  }
         }          }
         else {                                                                                                  // Analog mode          else {                                                                                          /* Analog mode */
                 updatemask = 0x3ff;                  updatemask = 0x3ff;
                 if (!(crtc.s.SCRN_BITS & SCRN_TEXTYx2)) {                  if (!(crtc.s.SCRN_BITS & SCRN_TEXTYx2)) {
                         if (crtc.s.SCRN_BITS & SCRN_24KHZ) {                          if (crtc.s.SCRN_BITS & SCRN_24KHZ) {
                                 if (crtc.s.width40) {                                  if (crtc.s.width40) {
                                         if (crtc.s.SCRN_BITS & SCRN_200LINE) {  // width 40,25,0,2                                          if (crtc.s.SCRN_BITS & SCRN_200LINE) {
                                                                                                                   /* width 40,25,0,2 */
                                                 dispmode = scrnpage + SCRN64_320x200;                                                  dispmode = scrnpage + SCRN64_320x200;
                                         }                                          }
                                         else {                                                                  // width 40,25,1,2                                          else {                                                          /* width 40,25,1,2 */
                                                 dispmode = SCRN64_H320x400;                                                  dispmode = SCRN64_H320x400;
                                         }                                          }
                                 }                                  }
                                 else {                                                                          // width 80,25,?,2                                  else {                                                                  /* width 80,25,?,2 */
                                         updatemask = 0x7ff;                                          updatemask = 0x7ff;
                                         pal_bank = PAL_HIGHRESO;                                          pal_bank = PAL_HIGHRESO;
                                         pal_disp = PAL_HIGHRESO;                                          pal_disp = PAL_HIGHRESO;
                                 }                                  }
                         }                          }
                         else {                          else {
                                 if (crtc.s.width40) {                                           // width 40,25,0,1                                  if (crtc.s.width40) {                                   /* width 40,25,0,1 */
                                         if (crtc.s.EXTPALMODE & 0x10) {                                          if (crtc.s.EXTPALMODE & 0x10) {
                                                 if (crtc.s.ZPRY & 0x10) {                                                  if (crtc.s.ZPRY & 0x10) {
                                                         dispmode = SCRN64_L320x200x2 +                                                          dispmode = SCRN64_L320x200x2 +
Line 135  static void crtc_dispupdate(void) { Line 135  static void crtc_dispupdate(void) {
                                                 pal_disp = PAL_4096 + PAL_4096FULL;                                                  pal_disp = PAL_4096 + PAL_4096FULL;
                                         }                                          }
                                 }                                  }
                                 else {                                                                          // width 80,25,0,1                                  else {                                                                  /* width 80,25,0,1 */
                                         updatemask = 0x7ff;                                          updatemask = 0x7ff;
                                         dispmode = SCRN_WIDTH80 + SCRN64_L640x200;                                          dispmode = SCRN_WIDTH80 + SCRN64_L640x200;
                                 }                                  }
Line 144  static void crtc_dispupdate(void) { Line 144  static void crtc_dispupdate(void) {
                 else {                  else {
                         if (crtc.s.SCRN_BITS & SCRN_24KHZ) {                          if (crtc.s.SCRN_BITS & SCRN_24KHZ) {
                                 if (crtc.s.width40) {                                  if (crtc.s.width40) {
                                         if (crtc.s.SCRN_BITS & SCRN_200LINE) {  // width 40,12,0,2                                          if (crtc.s.SCRN_BITS & SCRN_200LINE) {
                                                                                                                   /* width 40,12,0,2 */
                                                 dispmode = scrnpage + SCRN64_320x100;                                                  dispmode = scrnpage + SCRN64_320x100;
                                         }                                          }
                                         else {                                                                  // width 40,12,1,2                                          else {                                                          /* width 40,12,1,2 */
                                                 dispmode = SCRN64_H320x200;                                                  dispmode = SCRN64_H320x200;
                                         }                                          }
                                 }                                  }
                                 else {                                                                          // width 80,12,?,2                                  else {                                                                  /* width 80,12,?,2 */
                                         pal_bank = PAL_HIGHRESO;                                          pal_bank = PAL_HIGHRESO;
                                         pal_disp = PAL_HIGHRESO;                                          pal_disp = PAL_HIGHRESO;
                                 }                                  }
                         }                          }
                         else {                          else {
                                 if (crtc.s.width40) {                                           // width 40,12,0,1                                  if (crtc.s.width40) {                                   /* width 40,12,0,1 */
                                         if (crtc.s.EXTPALMODE & 0x10) {                                          if (crtc.s.EXTPALMODE & 0x10) {
                                                 if (crtc.s.ZPRY & 0x10) {                                                  if (crtc.s.ZPRY & 0x10) {
                                                         dispmode = SCRN64_320x100x2 +                                                          dispmode = SCRN64_320x100x2 +
Line 181  static void crtc_dispupdate(void) { Line 182  static void crtc_dispupdate(void) {
                                                 pal_disp = PAL_4096 + PAL_4096FULL;                                                  pal_disp = PAL_4096 + PAL_4096FULL;
                                         }                                          }
                                 }                                  }
                                 else {                                                                          // width 80,12,0,1                                  else {                                                                  /* width 80,12,0,1 */
                                         dispmode = SCRN_WIDTH80 + SCRN64_L640x100;                                          dispmode = SCRN_WIDTH80 + SCRN64_L640x100;
                                 }                                  }
                         }                          }
Line 237  static void crtc_timingupdate(void) { Line 238  static void crtc_timingupdate(void) {
   
         UINT32  fontclock;          UINT32  fontclock;
         UINT    yl;          UINT    yl;
           SINT32  vsyncstart;
   
           /* とりあえず…ね */
           crtc.e.pos = crtc.s.reg[CRTCREG_POSL]
                                                                           + ((crtc.s.reg[CRTCREG_POSH] & 7) << 8);
   
         // とりあえず…ね  
         crtc.e.rasterdisp8 = (crtc.e.rasterclock8 * 40) / 56;          crtc.e.rasterdisp8 = (crtc.e.rasterclock8 * 40) / 56;
   
         fontclock = (crtc.s.reg[CRTCREG_CHRCY] & 0x1f) + 1;          fontclock = (crtc.s.reg[CRTCREG_CHRCY] & 0x1f) + 1;
         fontclock = (fontclock * crtc.e.rasterclock8) >> 8;          fontclock = (fontclock * crtc.e.rasterclock8) >> 8;
   
         // YsIIIが yl==0で disp信号見る…なんで?          /* YsIIIが yl==0で disp信号見る…なんで? */
         yl = (crtc.s.reg[CRTCREG_VDISP] & 0x7f);          yl = (crtc.s.reg[CRTCREG_VDISP] & 0x7f);
         crtc.e.yl = yl;          crtc.e.yl = yl;
         crtc.e.dispclock = fontclock * max(yl, 1);          iocore.e.dispclock = fontclock * max(yl, 1);
         crtc.e.vsyncstart = fontclock * ((crtc.s.reg[CRTCREG_VSYNC] & 0x7f) + 1);          vsyncstart = fontclock * ((crtc.s.reg[CRTCREG_VSYNC] & 0x7f) + 1);
         crtc.e.vpulseclock = ((crtc.s.reg[CRTCREG_PULSE] >> 4)          iocore.e.vsyncstart = vsyncstart;
   #if !defined(MAINFRAMES_OLD)
           iocore.e.vsyncend = vsyncstart + (((crtc.s.reg[CRTCREG_PULSE] >> 4)
                                                                                                   * crtc.e.rasterclock8) >> 8);
           neitem_mainframes(NEVENT_FRAMES);
   #else
           iocore.e.vpulseclock = ((crtc.s.reg[CRTCREG_PULSE] >> 4)
                                                                                                 * crtc.e.rasterclock8) >> 8;                                                                                                  * crtc.e.rasterclock8) >> 8;
   #endif
         crtc.e.pos = crtc.s.reg[CRTCREG_POSL]  
                                                                         + ((crtc.s.reg[CRTCREG_POSH] & 7) << 8);  
 }  }
   
   
 // ---- CRTC  /* CRTC */
   
 void IOOUTCALL crtc_o(UINT port, REG8 value) {  void IOOUTCALL crtc_o(UINT port, REG8 value) {
   
Line 271  void IOOUTCALL crtc_o(UINT port, REG8 va Line 280  void IOOUTCALL crtc_o(UINT port, REG8 va
                                 crtc.s.reg[crtc.s.regnum] = value;                                  crtc.s.reg[crtc.s.regnum] = value;
                                 crtc_clkupdate();                                  crtc_clkupdate();
                                 crtc_timingupdate();                                  crtc_timingupdate();
                                 makescrn.remakeattr = 1;                                  crtc.e.remakeattr = 1;
                                 scrnallflash = 1;                                  crtc.e.scrnallflash = 1;
                         }                          }
                 }                  }
         }          }
 }  }
   
   
 // ---- スクリーンモード  /* スクリーンモード */
   
 void IOOUTCALL scrn_o(UINT port, REG8 value) {  void IOOUTCALL scrn_o(UINT port, REG8 value) {
   
Line 291  void IOOUTCALL scrn_o(UINT port, REG8 va Line 300  void IOOUTCALL scrn_o(UINT port, REG8 va
                 crtc_bankupdate();                  crtc_bankupdate();
         }          }
         if (modify & SCRN_DISPCHANGE) {          if (modify & SCRN_DISPCHANGE) {
 //              pal_reset();                                    // なんで?                  crtc.e.scrnallflash = 1;
                 scrnallflash = 1;  
                 crtc_dispupdate();                  crtc_dispupdate();
                 crtc_clkupdate();                  crtc_clkupdate();
                 crtc_timingupdate();                  crtc_timingupdate();
                 makescrn.palandply = 1;                  crtc.e.palandply = 1;
         }          }
         (void)port;          (void)port;
 }  }
Line 308  REG8 IOINPCALL scrn_i(UINT port) { Line 316  REG8 IOINPCALL scrn_i(UINT port) {
 }  }
   
   
 // ---- プライオリティ  /* プライオリティ */
   
 void IOOUTCALL ply_o(UINT port, REG8 value) {  void IOOUTCALL ply_o(UINT port, REG8 value) {
   
         if (crtc.s.rgbp[CRTC_PLY] != value) {          if (crtc.s.rgbp[CRTC_PLY] != value) {
                 crtc.s.rgbp[CRTC_PLY] = value;                  crtc.s.rgbp[CRTC_PLY] = value;
                 makescrn.palandply = 1;                  crtc.e.palandply = 1;
 #if defined(SUPPORT_PALEVENT)  #if defined(SUPPORT_PALEVENT)
                 if ((!corestat.vsync) && (palevent.events < SUPPORT_PALEVENT)) {                  if ((!corestat.vsync) && (palevent.events < SUPPORT_PALEVENT)) {
                         PAL1EVENT *e = palevent.event + palevent.events;                          PAL1EVENT *e = palevent.event + palevent.events;
Line 329  void IOOUTCALL ply_o(UINT port, REG8 val Line 337  void IOOUTCALL ply_o(UINT port, REG8 val
 }  }
   
   
 // ---- パレット  /* パレット */
   
 void IOOUTCALL palette_o(UINT port, REG8 value) {  void IOOUTCALL palette_o(UINT port, REG8 value) {
   
Line 346  void IOOUTCALL palette_o(UINT port, REG8 Line 354  void IOOUTCALL palette_o(UINT port, REG8
                 num = (port >> 8) & 3;                  num = (port >> 8) & 3;
                 if (crtc.s.rgbp[num] != value) {                  if (crtc.s.rgbp[num] != value) {
                         crtc.s.rgbp[num] = value;                          crtc.s.rgbp[num] = value;
                         makescrn.palandply = 1;                          crtc.e.palandply = 1;
 #if defined(SUPPORT_PALEVENT)  #if defined(SUPPORT_PALEVENT)
                         if ((!corestat.vsync) && (palevent.events < SUPPORT_PALEVENT)) {                          if ((!corestat.vsync) && (palevent.events < SUPPORT_PALEVENT)) {
                                 PAL1EVENT *e = palevent.event + palevent.events;                                  PAL1EVENT *e = palevent.event + palevent.events;
Line 364  void IOOUTCALL palette_o(UINT port, REG8 Line 372  void IOOUTCALL palette_o(UINT port, REG8
                         return;                          return;
                 }                  }
                 sft = (port >> (8 - 2)) & (3 << 2);                  sft = (port >> (8 - 2)) & (3 << 2);
                 if (crtc.e.pal_bank & PAL_4096) {                               // use 4096palettes                  if (crtc.e.pal_bank & PAL_4096) {                               /* use 4096palettes */
                         num = ((port & 0xff) << 4) + (crtc.s.lastpal >> 4);                          num = ((port & 0xff) << 4) + (crtc.s.lastpal >> 4);
                         if (!(crtc.e.pal_bank & PAL_4096FULL)) {                          if (!(crtc.e.pal_bank & PAL_4096FULL)) {
                                 num &= 0xccc;                                  num &= 0xccc;
Line 402  void IOOUTCALL blackctrl_o(UINT port, RE Line 410  void IOOUTCALL blackctrl_o(UINT port, RE
   
         if (crtc.s.rgbp[CRTC_BLACK] != value) {          if (crtc.s.rgbp[CRTC_BLACK] != value) {
                 crtc.s.rgbp[CRTC_BLACK] = value;                  crtc.s.rgbp[CRTC_BLACK] = value;
                 makescrn.palandply = 1;                  crtc.e.palandply = 1;
 #if defined(SUPPORT_PALEVENT)  #if defined(SUPPORT_PALEVENT)
                 if ((!corestat.vsync) && (palevent.events < SUPPORT_PALEVENT)) {                  if ((!corestat.vsync) && (palevent.events < SUPPORT_PALEVENT)) {
                         PAL1EVENT *e = palevent.event + palevent.events;                          PAL1EVENT *e = palevent.event + palevent.events;
Line 423  REG8 IOINPCALL blackctrl_i(UINT port) { Line 431  REG8 IOINPCALL blackctrl_i(UINT port) {
 }  }
   
   
 // ---- turboZ  /* turboZ */
   
 #if defined(SUPPORT_TURBOZ)  #if defined(SUPPORT_TURBOZ)
 REG8 IOINPCALL ply_i(UINT port) {  REG8 IOINPCALL ply_i(UINT port) {
Line 439  REG8 IOINPCALL palette_i(UINT port) { Line 447  REG8 IOINPCALL palette_i(UINT port) {
         REG8    sft;          REG8    sft;
   
         if ((crtc.s.EXTPALMODE & 0x80) && ((crtc.s.EXTGRPHPAL & 0x88) == 0x88)) {          if ((crtc.s.EXTPALMODE & 0x80) && ((crtc.s.EXTGRPHPAL & 0x88) == 0x88)) {
                 if (crtc.e.pal_bank & PAL_4096) {                               // use 4096palettes                  if (crtc.e.pal_bank & PAL_4096) {                               /* use 4096palettes */
                         num = ((port & 0xff) << 4) + (crtc.s.lastpal >> 4);                          num = ((port & 0xff) << 4) + (crtc.s.lastpal >> 4);
                         if (!(crtc.e.pal_bank & PAL_4096FULL)) {                          if (!(crtc.e.pal_bank & PAL_4096FULL)) {
                                 num &= 0xccc;                                  num &= 0xccc;
Line 534  REG8 IOINPCALL exttextdisp_i(UINT port)  Line 542  REG8 IOINPCALL exttextdisp_i(UINT port) 
 #endif  #endif
   
   
 // ----  /* extension */
   
 void crtc_update(void) {  void crtc_update(void) {
   
Line 542  void crtc_update(void) { Line 550  void crtc_update(void) {
         crtc_dispupdate();          crtc_dispupdate();
         crtc_clkupdate();          crtc_clkupdate();
         crtc_timingupdate();          crtc_timingupdate();
         makescrn.palandply = 1;          crtc.e.palandply = 1;
         scrnallflash = 1;          crtc.e.scrnallflash = 1;
 }  }
   
 void crtc_setwidth(REG8 width40) {  void crtc_setwidth(REG8 width40) {
Line 553  void crtc_setwidth(REG8 width40) { Line 561  void crtc_setwidth(REG8 width40) {
 }  }
   
   
 // ----  /* init/reset */
   
 #if defined(SUPPORT_TURBOZ)  #if defined(SUPPORT_TURBOZ)
 static void resetpal(void) {  static void resetpal(void) {
Line 587  void crtc_reset(void) { Line 595  void crtc_reset(void) {
                 resetpal();                  resetpal();
         }          }
 #endif  #endif
 //      IPLが勝手に切り替える筈である  #if 0
 //      if ((pccore.ROM_TYPE >= 2) && (!(pccore.DIP_SW & 1))) {          /* IPLが勝手に切り替える筈である */
 //              crtc.s.SCRN_BITS = SCRN_200LINE;          if ((pccore.ROM_TYPE >= 2) && (!(pccore.DIP_SW & 1))) {
 //              crtc.s.reg[CRTCREG_CHRCY] = 15;                  crtc.s.SCRN_BITS = SCRN_200LINE;
 //      }                  crtc.s.reg[CRTCREG_CHRCY] = 15;
           }
   #endif  /* 0 */
   
         pal_reset();          pal_reset();
         makescrn.palandply = 1;          crtc.e.palandply = 1;
         crtc_update();          crtc_update();
 }  }
   
Line 602  void crtc_forcesetwidth(REG8 width) { Line 612  void crtc_forcesetwidth(REG8 width) {
   
         crtc.s.reg[CRTCREG_HDISP] = (UINT8)width;          crtc.s.reg[CRTCREG_HDISP] = (UINT8)width;
         crtc_dispupdate();          crtc_dispupdate();
         scrnallflash = 1;          crtc.e.scrnallflash = 1;
 }  }
   

Removed from v.1.18  
changed lines
  Added in v.1.20


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