| version 1.6, 2004/08/10 10:41:53 | version 1.11, 2004/08/13 04:08:33 | 
| Line 11 | Line 11 | 
 |  |  | 
 | MAKESCRN        makescrn; | MAKESCRN        makescrn; | 
 |  |  | 
| BYTE    scrnallflash; | UINT8   scrnallflash; | 
| static  BYTE    lastdisp = 0; | static  UINT8   lastdisp = 0; | 
| static  BYTE    blinktime = 1; | static  UINT8   blinktime = 1; | 
| DWORD   drawtime = 0; | UINT    drawtime = 0; | 
 |  |  | 
 |  |  | 
 | static void fillupdatetmp(void) { | static void fillupdatetmp(void) { | 
| 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 42  static void flashupdatetmp(void) { | Line 41  static void flashupdatetmp(void) { | 
 | REG16   udtbase; | REG16   udtbase; | 
 | REG16   udt; | REG16   udt; | 
 |  |  | 
| posl = crtc.s.TXT_TOP; | if (!makescrn.vramsize) { | 
| y = crtc.s.TXT_YL; | return; | 
|  | } | 
|  | posl = crtc.e.pos; | 
|  | 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 87  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 234  static void changemodes(void) { | Line 136  static void changemodes(void) { | 
 |  |  | 
 | lastdisp = crtc.e.dispmode; | lastdisp = crtc.e.dispmode; | 
 | if (!(lastdisp & SCRN_BANK1)) { | if (!(lastdisp & SCRN_BANK1)) { | 
| makescrn.disp1 = GRP_RAM + GRAM_BANK0; | makescrn.disp1 = gram + GRAM_BANK0; | 
| makescrn.disp2 = GRP_RAM + GRAM_BANK1; | makescrn.disp2 = gram + GRAM_BANK1; | 
 | makescrn.dispflag = UPDATE_TRAM | UPDATE_VRAM0; | makescrn.dispflag = UPDATE_TRAM | UPDATE_VRAM0; | 
 | } | } | 
 | else { | else { | 
| makescrn.disp1 = GRP_RAM + GRAM_BANK1; | makescrn.disp1 = gram + GRAM_BANK1; | 
| makescrn.disp2 = GRP_RAM + GRAM_BANK0; | makescrn.disp2 = gram + GRAM_BANK0; | 
 | makescrn.dispflag = UPDATE_TRAM | UPDATE_VRAM1; | makescrn.dispflag = UPDATE_TRAM | UPDATE_VRAM1; | 
 | } | } | 
 | scrnallflash = 1; | scrnallflash = 1; | 
| Line 249  static void changemodes(void) { | Line 151  static void changemodes(void) { | 
 |  |  | 
 | static void changecrtc(void) { | static void changecrtc(void) { | 
 |  |  | 
 |  | UINT    scrnxmax; | 
 |  | UINT    scrnymax; | 
 |  | UINT    textxl; | 
 |  | UINT    surfcx; | 
 | REG8    widthmode; | REG8    widthmode; | 
 | UINT    fontcy; | UINT    fontcy; | 
 | UINT    underlines; | UINT    underlines; | 
 | REG8    y2; | REG8    y2; | 
 | UINT    charcy; | UINT    charcy; | 
 | UINT    surfcy; | UINT    surfcy; | 
 |  | UINT    surfsy; | 
 |  | UINT    x; | 
 |  | UINT    y; | 
 |  | UINT8   *p; | 
 |  |  | 
| makescrn.vramtop = LOW11(crtc.s.TXT_TOP); | makescrn.vramtop = crtc.e.pos; | 
 |  |  | 
| if (crtc.s.TXT_XL <= 40) { | scrnxmax = (crtc.s.reg[CRTCREG_HDISP] <= 40)?40:80; | 
|  | scrnymax = 200; | 
|  | if (crtc.s.reg[CRTCREG_HDISP] <= 40) { | 
 | if (lastdisp & SCRN_DRAW4096) { | if (lastdisp & SCRN_DRAW4096) { | 
 | widthmode = SCRNWIDTHMODE_4096; | widthmode = SCRNWIDTHMODE_4096; | 
 | } | } | 
| Line 271  static void changecrtc(void) { | Line 183  static void changecrtc(void) { | 
 | } | } | 
 | scrndraw_changewidth(widthmode); | scrndraw_changewidth(widthmode); | 
 |  |  | 
| makescrn.surfcx = min(80, crtc.s.TXT_XL); | textxl = crtc.s.reg[CRTCREG_HDISP]; | 
| makescrn.surfrx = crtc.s.TXT_XL - makescrn.surfcx; | surfcx = min(scrnxmax, textxl); | 
 |  |  | 
| fontcy = crtc.s.FNT_YL; | fontcy = crtc.e.fonty; | 
| if (crtc.s.SCRN_BITS & SCRN_24KHZ) { |  | 
| fontcy >>= 1; |  | 
| } |  | 
 | underlines = (crtc.s.SCRN_BITS & SCRN_UNDERLINE)?2:0; | underlines = (crtc.s.SCRN_BITS & SCRN_UNDERLINE)?2:0; | 
 | if (fontcy > underlines) { | if (fontcy > underlines) { | 
 | fontcy -= underlines; | fontcy -= underlines; | 
| Line 301  static void changecrtc(void) { | Line 210  static void changecrtc(void) { | 
 | charcy = fontcy + underlines; | charcy = fontcy + underlines; | 
 | makescrn.fontcy = fontcy; | makescrn.fontcy = fontcy; | 
 | makescrn.charcy = charcy; | makescrn.charcy = charcy; | 
 |  |  | 
 | charcy <<= y2; | charcy <<= y2; | 
| surfcy = 200 / charcy; | surfcy = scrnymax / charcy; | 
| if (surfcy > crtc.s.TXT_YL) { | if (surfcy > crtc.e.yl) { | 
| surfcy = crtc.s.TXT_YL; | surfcy = crtc.e.yl; | 
 | } | } | 
| surfcy = max(1, surfcy); |  | 
|  | surfsy = charcy * surfcy * 2; | 
|  | x = min(scrnxmax, makescrn.surfcx); | 
|  | if (surfcx < x) {                                                               // 小さくなった | 
|  | x = (x - surfcx) * 8; | 
|  | p = screenmap + (surfcx * 8); | 
|  | y = surfsy; | 
|  | while(y) { | 
|  | y--; | 
|  | ZeroMemory(p, x); | 
|  | p += SURFACE_WIDTH; | 
|  | } | 
|  | } | 
|  | if (surfsy < makescrn.surfsy) { | 
|  | ZeroMemory(screenmap + (SURFACE_WIDTH * surfsy), | 
|  | SURFACE_WIDTH * (makescrn.surfsy - surfsy)); | 
|  | } | 
|  | makescrn.surfcx = surfcx; | 
|  | makescrn.surfrx = textxl - surfcx; | 
 | makescrn.surfcy = surfcy; | makescrn.surfcy = surfcy; | 
| makescrn.surfstep = (SURFACE_WIDTH * charcy * 2) - (makescrn.surfcx * 8); | makescrn.surfsy = surfsy; | 
| makescrn.vramsize = min(0x800, surfcy * crtc.s.TXT_XL); | makescrn.surfstep = (SURFACE_WIDTH * charcy * 2) - (surfcx * 8); | 
| scrnmng_setheight(0, charcy * surfcy * 2); | makescrn.vramsize = min(0x800, surfcy * textxl); | 
|  | //      scrnmng_setheight(0, charcy * surfcy * 2); | 
 | } | } | 
 |  |  | 
 |  |  | 
| Line 335  static const DRAWFN screendraw2[8] = { | Line 262  static const DRAWFN screendraw2[8] = { | 
 | void scrnupdate(void) { | void scrnupdate(void) { | 
 |  |  | 
 | BRESULT ddrawflash; | BRESULT ddrawflash; | 
 |  | BRESULT allflash; | 
 |  |  | 
 | if (!corestat.drawframe) { | if (!corestat.drawframe) { | 
 | return; | return; | 
| Line 342  void scrnupdate(void) { | Line 270  void scrnupdate(void) { | 
 | corestat.drawframe = 0; | corestat.drawframe = 0; | 
 |  |  | 
 | ddrawflash = FALSE; | ddrawflash = FALSE; | 
 |  | allflash = FALSE; | 
 | if (lastdisp != crtc.e.dispmode) { | if (lastdisp != crtc.e.dispmode) { | 
 | changemodes(); | changemodes(); | 
 | } | } | 
| Line 349  void scrnupdate(void) { | Line 278  void scrnupdate(void) { | 
 | scrnallflash = 0; | scrnallflash = 0; | 
 | fillupdatetmp(); | fillupdatetmp(); | 
 | changecrtc(); | changecrtc(); | 
 |  | ddrawflash = TRUE; | 
 |  | allflash = TRUE; | 
 | makescrn.scrnflash = 1; | makescrn.scrnflash = 1; | 
 | } | } | 
 | if (makescrn.remakeattr) { | if (makescrn.remakeattr) { | 
| Line 358  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 366  void scrnupdate(void) { | Line 297  void scrnupdate(void) { | 
 |  |  | 
 | if (makescrn.scrnflash) { | if (makescrn.scrnflash) { | 
 | makescrn.scrnflash = 0; | makescrn.scrnflash = 0; | 
| makescrn.fontycnt = 0; | if (makescrn.vramsize) { | 
| switch(lastdisp & SCRN64_MASK) { | makescrn.fontycnt = 0; | 
| case SCRN64_320x200: | switch(lastdisp & SCRN64_MASK) { | 
| //                              width40x25_64s(); | case SCRN64_320x200: | 
| break; | //                                      width40x25_64s(); | 
|  | break; | 
| case SCRN64_L320x200x2: |  | 
| //                              width40x25_64x2(); | case SCRN64_L320x200x2: | 
| break; | //                                      width40x25_64x2(); | 
|  | break; | 
| case SCRN64_L640x200: |  | 
| //                              width80x25_64s(); | case SCRN64_L640x200: | 
| break; | //                                      width80x25_64s(); | 
|  | break; | 
| case SCRN64_H320x400: |  | 
| //                              width40x25_64h(); | case SCRN64_H320x400: | 
| break; | //                                      width40x25_64h(); | 
|  | break; | 
| case SCRN64_320x200x4096: |  | 
| //                              width40x25_4096(); | case SCRN64_320x200x4096: | 
| break; | //                                      width40x25_4096(); | 
|  | break; | 
| case SCRN64_320x100: |  | 
| //                              width40x12_64l(); | case SCRN64_320x100: | 
| break; | //                                      width40x12_64l(); | 
|  | break; | 
| case SCRN64_320x100x2: |  | 
| //                              width40x12_64x2(); | case SCRN64_320x100x2: | 
| break; | //                                      width40x12_64x2(); | 
|  | break; | 
| case SCRN64_L640x100: |  | 
| //                              width80x12_64s(); | case SCRN64_L640x100: | 
| break; | //                                      width80x12_64s(); | 
|  | break; | 
| case SCRN64_H320x200: |  | 
| //                              width40x12_64h(); | case SCRN64_H320x200: | 
| break; | //                                      width40x12_64h(); | 
|  | break; | 
| case SCRN64_320x100x4096: |  | 
| //                              width40x12_4096(); | case SCRN64_320x100x4096: | 
| break; | //                                      width40x12_4096(); | 
|  | break; | 
| //                      case SCRN64_INVALID: |  | 
| default: | //                              case SCRN64_INVALID: | 
| if (!(crtc.s.SCRN_BITS & SCRN_UNDERLINE)) { | default: | 
| screendraw[crtc.s.SCRN_BITS & 7](); | if (!(crtc.s.SCRN_BITS & SCRN_UNDERLINE)) { | 
| } | screendraw[crtc.s.SCRN_BITS & 7](); | 
| else { | } | 
| screendraw2[crtc.s.SCRN_BITS & 7](); | else { | 
| } | screendraw2[crtc.s.SCRN_BITS & 7](); | 
| break; | } | 
|  | break; | 
|  | } | 
|  | ddrawflash = 1; | 
 | } | } | 
 | ddrawflash = 1; |  | 
 | } | } | 
 |  |  | 
 | if (ddrawflash) { | if (ddrawflash) { | 
 | ddrawflash = 0; | ddrawflash = 0; | 
| scrndraw_draw(FALSE); | scrndraw_draw(allflash); | 
 | drawtime++; | drawtime++; | 
 | } | } | 
 | } | } | 
| Line 436  void makescrn_initialize(void) { | Line 369  void makescrn_initialize(void) { | 
 |  |  | 
 | void makescrn_reset(void) { | void makescrn_reset(void) { | 
 |  |  | 
 | fillupdatetmp(); |  | 
 | changemodes(); | changemodes(); | 
 | changecrtc(); | changecrtc(); | 
 |  | flashupdatetmp(); | 
 | } | } | 
 |  |  |