Diff for /xmil/vram/makescrn.c between versions 1.7 and 1.10

version 1.7, 2004/08/12 13:32:52 version 1.10, 2004/08/12 20:23:31
Line 29  static void fillupdatetmp(void) { Line 29  static void fillupdatetmp(void) {
         }          }
 }  }
   
 #if 1  
 static void flashupdatetmp(void) {  static void flashupdatetmp(void) {
   
         UINT    posl;          UINT    posl;
Line 45  static void flashupdatetmp(void) { Line 44  static void flashupdatetmp(void) {
         if (!makescrn.vramsize) {          if (!makescrn.vramsize) {
                 return;                  return;
         }          }
         posl = crtc.s.TXT_TOP;          posl = crtc.e.pos;
         y = crtc.s.TXT_YL;          y = crtc.e.yl;
         do {          do {
                 for (x=0; x<crtc.s.TXT_XL; x++) {                  for (x=0; x<crtc.s.reg[CRTCREG_HDISP]; x++) {
                         if (!(tram[TRAM_ATR + LOW11(posl + x)] & TRAMATR_Yx2)) {                          if (!(tram[TRAM_ATR + LOW11(posl + x)] & TRAMATR_Yx2)) {
                                 break;                                  break;
                         }                          }
                 }                  }
                 y2 = (x < crtc.s.TXT_XL)?FALSE:TRUE;                  y2 = (x < crtc.s.reg[CRTCREG_HDISP])?FALSE:TRUE;
                 udtbase = (x < crtc.s.TXT_XL)?0x0000:0x0404;                  udtbase = (x < crtc.s.reg[CRTCREG_HDISP])?0x0000:0x0404;
                 r = (crtc.s.TXT_XL + 1) >> 1;                  r = (crtc.s.reg[CRTCREG_HDISP] + 1) >> 1;
                 do {                  do {
                         posr = LOW11(posl + 1);                          posr = LOW11(posl + 1);
                         atr = (tram[TRAM_ATR + posl] << 8) | tram[TRAM_ATR + posr];                          atr = (tram[TRAM_ATR + posl] << 8) | tram[TRAM_ATR + posr];
Line 90  static void flashupdatetmp(void) { Line 89  static void flashupdatetmp(void) {
                         }                          }
                         posl = LOW11(posl + 2);                          posl = LOW11(posl + 2);
                 } while(--r);                  } while(--r);
                 if (crtc.s.TXT_XL & 1) {                  if (crtc.s.reg[CRTCREG_HDISP] & 1) {
                         posl = LOW11(posl - 1);                          posl = LOW11(posl - 1);
                 }                  }
         } while(--y);          } while(--y);
 }  }
 #else  
 static LABEL void flashupdatetmp(void) {  
   
                 __asm {  
                                 push    ebx  
                                 push    esi  
                                 push    edi  
   
                                 movzx   esi, crtc.s.TXT_TOP  
                                 xor             dl, dl  
                                                                                 // まず行すべてが縦倍角か調べる  
 check_tateflag: mov             edi, esi  
                                 movzx   ecx, crtc.s.TXT_XL  
 tateflaglp_s:   and             edi, (TRAM_MAX - 1)  
                                 test    tram[TRAM_ATR + edi], X1ATR_Yx2  
                                 je              tatex1  
                                 inc             edi  
                                 loop    tateflaglp_s  
                                                                                 // すべて縦倍角 だったら  
   
                                 movzx   ecx, crtc.s.TXT_XL  
                                 shr             cl, 1  
   
 tatex2loop_s:   and             esi, (TRAM_MAX - 1)  
                                 mov             ax, (UPDATE_TVRAM or 04h) * 0101h               // 縦倍角  
                                 mov             bx, word ptr (tram[TRAM_ATR + esi])  
   
                                 test    bl, X1ATR_Xx2  
                                 je              tatex2_norleft  
                                                                                                 // 倍角フラグが立ってる  
                                 or              ax, 08h + 12h * 256             // 左4倍角 + 右縦倍角は確定  
                                 test    bh, X1ATR_Xx2  
                                 je              tatex2_pcg  
                                 or              ah, 8                                   // 右側も倍角ビットが立ってた  
                                 jmp             tatex2_pcg  
   
 tatex2_norleft: test    bh, X1ATR_Xx2                   // 4倍角でない場合  
                                 je              tatex2_pcg  
                                 or              ah, 8                                   // 右側のみ倍角だった  
 tatex2_pcg:             mov             bx, word ptr (updatetmp[esi])  
                                 and             bx, UPDATE_TVRAM * 0101h  
                                 or              ax, bx                                  // UPDATEフラグを加える  
                                 cmp             word ptr (updatetmp[esi]), ax  
                                 je              tatex2noupdate  
                                 or              ax, UPDATE_TVRAM * 0101h  
                                 mov             word ptr (updatetmp[esi]), ax  
 tatex2noupdate: add             esi, 2  
                                 loop    tatex2loop_s  
                                 jmp             nextlinecheck  
   
 tatex1:                 movzx   ecx, crtc.s.TXT_XL  
                                 shr             cl, 1  
                                 xor             dh, dh  
 tatex1loop_s:   and             esi, (TRAM_MAX - 1)  
                                 xor             ax, ax  
                                 mov             bx, word ptr (tram[TRAM_ATR + esi])  
                                 or              dh, dh                                  // 縦ノーマルは既にあったか?  
                                 jne             tatex1_tate_e  
                                 test    bl, X1ATR_Yx2  
                                 je              tatex1_tate0  
                                 mov             al, UPDATE_TVRAM or 1   // 左潰れ縦倍角  
                                 test    bh, X1ATR_Yx2  
                                 je              tatex1_tate0  
                                 mov             ah, UPDATE_TVRAM or 1   // 右潰れ縦倍角  
                                 jmp             tatex1_tate_e  
 tatex1_tate0:   inc             dh                                              // 縦ノーマルの出現  
 tatex1_tate_e:  
                                 test    bl, X1ATR_Xx2  
                                 je              tatex1_norleft  
                                                                                                 // 倍角フラグが立ってる  
                                 or              ax, 08h + (12h * 256)   // 左横倍角 は確定  
                                 test    bh, X1ATR_Xx2  
                                 je              tatex1_pcg  
                                 or              ah, 8                                   // 右側も倍角ビットが立ってた  
                                 jmp             tatex1_pcg  
   
 tatex1_norleft: test    bh, X1ATR_Xx2                   // 倍角でない場合  
                                 je              tatex1_pcg  
                                 or              ah, 8                                   // 右側のみ倍角だった  
 tatex1_pcg:             mov             bx, word ptr (updatetmp[esi])  
                                 and             bx, UPDATE_TVRAM * 0101h  
                                 or              ax, bx  
                                 cmp             word ptr (updatetmp[esi]), ax  
                                 je              tatex1noupdate  
                                 or              ax, UPDATE_TVRAM * 0101h  
                                 mov             word ptr (updatetmp[esi]), ax  
 tatex1noupdate: add             esi, 2  
                                 loop    tatex1loop_s  
   
 nextlinecheck:  inc             dl  
                                 cmp             dl, crtc.s.TXT_YL  
                                 jb              check_tateflag  
   
                                 pop             edi  
                                 pop             esi  
                                 pop             ebx  
                                 ret  
         }  
 }  
 #endif  
   
 static BRESULT updateblink(void) {  static BRESULT updateblink(void) {
   
Line 262  static void changecrtc(void) { Line 161  static void changecrtc(void) {
         REG8    y2;          REG8    y2;
         UINT    charcy;          UINT    charcy;
         UINT    surfcy;          UINT    surfcy;
           UINT    surfsy;
         UINT    x;          UINT    x;
         UINT    y;          UINT    y;
         UINT8   *p;          UINT8   *p;
   
         makescrn.vramtop = LOW11(crtc.s.TXT_TOP);          makescrn.vramtop = crtc.e.pos;
   
         scrnxmax = (crtc.s.TXT_XL <= 40)?40:80;          scrnxmax = (crtc.s.reg[CRTCREG_HDISP] <= 40)?40:80;
         scrnymax = 200;          scrnymax = 200;
         if (crtc.s.TXT_XL <= 40) {          if (crtc.s.reg[CRTCREG_HDISP] <= 40) {
                 if (lastdisp & SCRN_DRAW4096) {                  if (lastdisp & SCRN_DRAW4096) {
                         widthmode = SCRNWIDTHMODE_4096;                          widthmode = SCRNWIDTHMODE_4096;
                 }                  }
Line 283  static void changecrtc(void) { Line 183  static void changecrtc(void) {
         }          }
         scrndraw_changewidth(widthmode);          scrndraw_changewidth(widthmode);
   
         textxl = crtc.s.TXT_XL;          textxl = crtc.s.reg[CRTCREG_HDISP];
         surfcx = min(scrnxmax, textxl);          surfcx = min(scrnxmax, textxl);
   
         fontcy = crtc.e.fonty;          fontcy = crtc.e.fonty;
Line 312  static void changecrtc(void) { Line 212  static void changecrtc(void) {
         makescrn.charcy = charcy;          makescrn.charcy = charcy;
         charcy <<= y2;          charcy <<= y2;
         surfcy = scrnymax / charcy;          surfcy = scrnymax / charcy;
         if (surfcy > crtc.s.TXT_YL) {          if (surfcy > crtc.e.yl) {
                 surfcy = crtc.s.TXT_YL;                  surfcy = crtc.e.yl;
         }          }
   
           surfsy = charcy * surfcy * 2;
         x = min(scrnxmax, makescrn.surfcx);          x = min(scrnxmax, makescrn.surfcx);
         if (surfcx < x) {                                                               // 小さくなった          if (surfcx < x) {                                                               // 小さくなった
                 x = (x - surfcx) * 8;                  x = (x - surfcx) * 8;
                 p = screenmap + (surfcx * 8);                  p = screenmap + (surfcx * 8);
                 y = surfcy * 2;                  y = surfsy;
                 while(y) {                  while(y) {
                         y--;                          y--;
                         ZeroMemory(p, x);                          ZeroMemory(p, x);
                         p += SURFACE_WIDTH;                          p += SURFACE_WIDTH;
                 }                  }
         }          }
         if (surfcy < makescrn.surfcy) {          if (surfsy < makescrn.surfsy) {
                 ZeroMemory(screenmap + (SURFACE_WIDTH * surfcy * 2),                  ZeroMemory(screenmap + (SURFACE_WIDTH * surfsy),
                                                         SURFACE_WIDTH * (makescrn.surfcy - surfcy) * 2);                                                                  SURFACE_WIDTH * (makescrn.surfsy - surfsy));
         }          }
         makescrn.surfcx = surfcx;          makescrn.surfcx = surfcx;
         makescrn.surfrx = textxl - surfcx;          makescrn.surfrx = textxl - surfcx;
         makescrn.surfcy = surfcy;          makescrn.surfcy = surfcy;
           makescrn.surfsy = surfsy;
         makescrn.surfstep = (SURFACE_WIDTH * charcy * 2) - (surfcx * 8);          makescrn.surfstep = (SURFACE_WIDTH * charcy * 2) - (surfcx * 8);
         makescrn.vramsize = min(0x800, surfcy * textxl);          makescrn.vramsize = min(0x800, surfcy * textxl);
 //      scrnmng_setheight(0, charcy * surfcy * 2);  //      scrnmng_setheight(0, charcy * surfcy * 2);
Line 376  void scrnupdate(void) { Line 278  void scrnupdate(void) {
                 scrnallflash = 0;                  scrnallflash = 0;
                 fillupdatetmp();                  fillupdatetmp();
                 changecrtc();                  changecrtc();
                   ddrawflash = TRUE;
                 allflash = TRUE;                  allflash = TRUE;
                 makescrn.scrnflash = 1;                  makescrn.scrnflash = 1;
         }          }
Line 386  void scrnupdate(void) { Line 289  void scrnupdate(void) {
         if (makescrn.palandply) {          if (makescrn.palandply) {
                 makescrn.palandply = 0;                  makescrn.palandply = 0;
                 pal_update();                  pal_update();
                 ddrawflash = 1;                  ddrawflash = TRUE;
         }          }
         if (makescrn.existblink) {          if (makescrn.existblink) {
                 makescrn.scrnflash |= updateblink();                  makescrn.scrnflash |= updateblink();
Line 466  void makescrn_initialize(void) { Line 369  void makescrn_initialize(void) {
   
 void makescrn_reset(void) {  void makescrn_reset(void) {
   
         fillupdatetmp();  
         changemodes();          changemodes();
         changecrtc();          changecrtc();
           flashupdatetmp();
 }  }
   

Removed from v.1.7  
changed lines
  Added in v.1.10


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