Diff for /xmil/vram/makescrn.c between versions 1.1 and 1.5

version 1.1, 2004/08/07 07:19:56 version 1.5, 2004/08/10 08:28:49
Line 10 Line 10
   
   
                 MAKESCRN        makescrn;                  MAKESCRN        makescrn;
                 BYTE            updatetmp[0x800+0x101];  
   
                 BYTE    scrnallflash;                  BYTE    scrnallflash;
                 BYTE    blinktest = 0;  
   
 extern  BYTE    dispmode;  
   
 static  BYTE    lastdisp = 0;  static  BYTE    lastdisp = 0;
                 BYTE    dispflg = UPDATE_VRAM0;  
                 BYTE    *dispp = &GRP_RAM[GRAM_BANK0];  
                 BYTE    *dispp2 = &GRP_RAM[GRAM_BANK1];  
 static  BYTE    blinktime = 1;  static  BYTE    blinktime = 1;
   
                 DWORD   drawtime = 0;                  DWORD   drawtime = 0;
   
   
 void init_draw(void) {  static void fillupdatetmp(void) {
   
         makesub_initialize();          UINT32  *p;
         reflesh_palette();          UINT    i;
         lastdisp = 0;  
         dispflg = UPDATE_VRAM0;  
         dispp = &GRP_RAM[GRAM_BANK0];  
 }  
   
           p = (UINT32 *)updatetmp;
           for (i=0; i<0x200; i++) {
                   p[i] |= (UPDATE_TVRAM << 24) | (UPDATE_TVRAM << 16) |
                                                                                   (UPDATE_TVRAM << 8) | UPDATE_TVRAM;
           }
   }
   
 void fillupdatetmp(void) {  #if 1
   static void flashupdatetmp(void) {
   
                 __asm {          UINT    posl;
                                 mov             ebx, offset updatetmp          UINT    y;
                                 mov             ecx, 0x200          UINT    x;
 filludt_lp:             or              dword ptr [ebx], (UPDATE_TVRAM * 01010101h)          UINT    r;
                                 add             ebx, 4          UINT    posr;
                                 loop    filludt_lp          BRESULT y2;
           REG16   atr;
           REG16   udtbase;
           REG16   udt;
   
           posl = crtc.s.TXT_TOP;
           y = crtc.s.TXT_YL;
           do {
                   for (x=0; x<crtc.s.TXT_XL; x++) {
                           if (!(tram[TRAM_ATR + LOW11(posl + x)] & TRAMATR_Yx2)) {
                                   break;
                           }
                   }
                   y2 = (x < crtc.s.TXT_XL)?FALSE:TRUE;
                   udtbase = (x < crtc.s.TXT_XL)?0x0000:0x0404;
                   r = (crtc.s.TXT_XL + 1) >> 1;
                   do {
                           posr = LOW11(posl + 1);
                           atr = (tram[TRAM_ATR + posl] << 8) | tram[TRAM_ATR + posr];
                           udt = udtbase;
                           if (!y2) {
                                   if (atr & (TRAMATR_Yx2 << 8)) {
                                           udt |= (UPDATE_TRAM | 1) << 8;          // º¸ÄÙ¤ì½ÄÇܳÑ
                                   }
                                   else {
                                           y2 = TRUE;
                                   }
                           }
                           if (!y2) {
                                   if (atr & (TRAMATR_Yx2 << 0)) {
                                           udt |= (UPDATE_TRAM | 1) << 0;          // ±¦ÄÙ¤ì½ÄÇܳÑ
                                   }
                                   else {
                                           y2 = TRUE;
                                   }
                           }
                           if (atr & (TRAMATR_Xx2 << 8)) {                         // º¸Â¦ÇܳÑ?
                                   udt |= 0x0812;
                           }
                           if (atr & (TRAMATR_Xx2 << 0)) {                         // ±¦Â¦ÇܳÑ?
                                   udt |= 0x0008;
                           }
                           if ((updatetmp[posl] ^ (udt >> 8)) & 0x1f) {
                                   updatetmp[posl] = (UINT8)((udt >> 8) | UPDATE_TVRAM);
                           }
                           if ((updatetmp[posr] ^ (udt >> 0)) & 0x1f) {
                                   updatetmp[posr] = (UINT8)((udt >> 0) | UPDATE_TVRAM);
                           }
                           posl = LOW11(posl + 2);
                   } while(--r);
                   if (crtc.s.TXT_XL & 1) {
                           posl = LOW11(posl - 1);
                 }                  }
           } while(--y);
 }  }
   #else
 static LABEL void flashupdatetmp(void) {  static LABEL void flashupdatetmp(void) {
   
                 __asm {                  __asm {
Line 145  nextlinecheck: inc  dl Line 191  nextlinecheck: inc  dl
                                 ret                                  ret
         }          }
 }  }
   #endif
   
 void updateblink(void) {  static BRESULT updateblink(void) {
   
                 __asm {          UINT    pos;
                                 dec             blinktime          REG8    update;
                                 jns             blinkupflg_ed          UINT    r;
                                 mov             blinktime, 30-1  
                                 push    edi          if (blinktime) {
                                 movzx   edi, crtc.s.TXT_TOP                  blinktime--;
                                 mov             ax, 010h                  return(FALSE);
                                 xor             blinktest, al          }
                                 mov             cx, word ptr (makescrn.vramsize)          else {
                                 or              cx, cx                  blinktime = 30 - 1;
                                 je              blinkupflg                  pos = makescrn.vramtop;
                   makescrn.blinktest ^= 0x10;
 blinkup_lp:             test    tram[TRAM_ATR + edi], al                  update = 0;
                                 je              short blinknup_ed                  r = makescrn.vramsize;
                                 mov             ah, UPDATE_TVRAM                  while(r) {
                                 or              updatetmp[edi], ah                          r--;
 blinknup_ed:    inc             edi                          if (tram[TRAM_ATR + pos] & 0x10) {
                                 dec             cx                                  updatetmp[pos] |= UPDATE_TRAM;
                                 jne             blinkup_lp                                  update = UPDATE_TRAM;
                                 or              makescrn.scrnflash, ah                          }
                                 shr             ah, 5                          pos = LOW11(pos + 1);
 blinkupflg:             pop             edi  
                                 mov             makescrn.existblink, ah  
 blinkupflg_ed:  
                 }                  }
                   if (update) {
                           makescrn.existblink = 1;
                           return(TRUE);
                   }
                   else {
                           return(FALSE);
                   }
           }
 }  }
   
   
 // ---------------------------------------------------------------------------  // ----
   
 static void x1vram_adjust(void) {  static void changemodes(void) {
   
           lastdisp = crtc.e.dispmode;
           if (!(lastdisp & SCRN_BANK1)) {
                   makescrn.disp1 = GRP_RAM + GRAM_BANK0;
                   makescrn.disp2 = GRP_RAM + GRAM_BANK1;
                   makescrn.dispflag = UPDATE_TRAM | UPDATE_VRAM0;
           }
           else {
                   makescrn.disp1 = GRP_RAM + GRAM_BANK1;
                   makescrn.disp2 = GRP_RAM + GRAM_BANK0;
                   makescrn.dispflag = UPDATE_TRAM | UPDATE_VRAM1;
           }
           scrnallflash = 1;
           makescrn.palandply = 1;
   }
   
   static void changecrtc(void) {
   
         REG8    widthmode;          REG8    widthmode;
         UINT    fontcy;          UINT    fontcy;
Line 187  static void x1vram_adjust(void) { Line 256  static void x1vram_adjust(void) {
         UINT    charcy;          UINT    charcy;
         UINT    surfcy;          UINT    surfcy;
   
           makescrn.vramtop = LOW11(crtc.s.TXT_TOP);
   
         if (crtc.s.TXT_XL <= 40) {          if (crtc.s.TXT_XL <= 40) {
                 if (dispmode & SCRN_DRAW4096) {                  if (lastdisp & SCRN_DRAW4096) {
                         widthmode = SCRNWIDTHMODE_4096;                          widthmode = SCRNWIDTHMODE_4096;
                 }                  }
                 else {                  else {
Line 238  static void x1vram_adjust(void) { Line 309  static void x1vram_adjust(void) {
         }          }
         makescrn.surfcy = surfcy;          makescrn.surfcy = surfcy;
         makescrn.surfstep = (SURFACE_WIDTH * charcy * 2) - (makescrn.surfcx * 8);          makescrn.surfstep = (SURFACE_WIDTH * charcy * 2) - (makescrn.surfcx * 8);
         makescrn.vramsize = min(0x800, charcy * crtc.s.TXT_XL);          makescrn.vramsize = min(0x800, surfcy * crtc.s.TXT_XL);
         scrnmng_setheight(0, charcy * surfcy * 2);          scrnmng_setheight(0, charcy * surfcy * 2);
 }  }
   
Line 270  void scrnupdate(void) { Line 341  void scrnupdate(void) {
         corestat.drawframe = 0;          corestat.drawframe = 0;
   
         ddrawflash = FALSE;          ddrawflash = FALSE;
         if (lastdisp != dispmode) {          if (lastdisp != crtc.e.dispmode) {
                 lastdisp = dispmode;                  changemodes();
                 scrnallflash = 1;  
                 makescrn.palandply = 1;  
                 if (!(dispmode & SCRN_BANK1)) {  
                         dispp = GRP_RAM + GRAM_BANK0;  
                         dispp2 = GRP_RAM + GRAM_BANK1;  
                         dispflg = UPDATE_VRAM0;  
                 }  
                 else {  
                         dispp = GRP_RAM + GRAM_BANK1;  
                         dispp2 = GRP_RAM + GRAM_BANK0;  
                         dispflg = UPDATE_VRAM1;  
                 }  
         }          }
         if (scrnallflash) {          if (scrnallflash) {
                 scrnallflash = 0;                  scrnallflash = 0;
                 fillupdatetmp();                  fillupdatetmp();
                 x1vram_adjust();                  changecrtc();
                 makescrn.scrnflash = 1;                  makescrn.scrnflash = 1;
         }          }
         if (makescrn.remakeattr) {          if (makescrn.remakeattr) {
Line 297  void scrnupdate(void) { Line 356  void scrnupdate(void) {
         }          }
         if (makescrn.palandply) {          if (makescrn.palandply) {
                 makescrn.palandply = 0;                  makescrn.palandply = 0;
                 palettes();                  pal_update();
                 ddrawflash = 1;                  ddrawflash = 1;
         }          }
         if (makescrn.existblink) {          if (makescrn.existblink) {
                 updateblink();                  makescrn.scrnflash |= updateblink();
         }          }
   
         if (makescrn.scrnflash) {          if (makescrn.scrnflash) {
Line 368  void scrnupdate(void) { Line 427  void scrnupdate(void) {
         }          }
 }  }
   
   
   void makescrn_initialize(void) {
   
           makesub_initialize();
   }
   
   void makescrn_reset(void) {
   
           fillupdatetmp();
           changemodes();
           changecrtc();
   }
   

Removed from v.1.1  
changed lines
  Added in v.1.5


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