--- xmil/vram/makescrn.c 2004/08/08 16:39:04 1.4 +++ xmil/vram/makescrn.c 2004/08/14 12:16:18 1.12 @@ -11,16 +11,10 @@ MAKESCRN makescrn; - BYTE scrnallflash; - BYTE blinktest = 0; - -static BYTE lastdisp = 0; - BYTE dispflg; - BYTE *dispp = &GRP_RAM[GRAM_BANK0]; - BYTE *dispp2 = &GRP_RAM[GRAM_BANK1]; -static BYTE blinktime = 1; - - DWORD drawtime = 0; + UINT8 scrnallflash; +static UINT8 lastdisp = 0; +static UINT8 blinktime = 1; + UINT drawtime = 0; static void fillupdatetmp(void) { @@ -35,7 +29,6 @@ static void fillupdatetmp(void) { } } -#if 1 static void flashupdatetmp(void) { UINT posl; @@ -48,17 +41,20 @@ static void flashupdatetmp(void) { REG16 udtbase; REG16 udt; - posl = crtc.s.TXT_TOP; - y = crtc.s.TXT_YL; + if (!makescrn.vramsize) { + return; + } + posl = crtc.e.pos; + y = crtc.e.yl; do { - for (x=0; x> 1; + y2 = (x < crtc.s.reg[CRTCREG_HDISP])?FALSE:TRUE; + udtbase = (x < crtc.s.reg[CRTCREG_HDISP])?0x0000:0x0404; + r = (crtc.s.reg[CRTCREG_HDISP] + 1) >> 1; do { posr = LOW11(posl + 1); atr = (tram[TRAM_ATR + posl] << 8) | tram[TRAM_ATR + posr]; @@ -93,111 +89,11 @@ static void flashupdatetmp(void) { } posl = LOW11(posl + 2); } while(--r); - if (crtc.s.TXT_XL & 1) { + if (crtc.s.reg[CRTCREG_HDISP] & 1) { posl = LOW11(posl - 1); } } 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) { @@ -212,7 +108,7 @@ static BRESULT updateblink(void) { else { blinktime = 30 - 1; pos = makescrn.vramtop; - blinktest ^= 0x10; + makescrn.blinktest ^= 0x10; update = 0; r = makescrn.vramsize; while(r) { @@ -240,14 +136,14 @@ static void changemodes(void) { lastdisp = crtc.e.dispmode; if (!(lastdisp & SCRN_BANK1)) { - dispp = GRP_RAM + GRAM_BANK0; - dispp2 = GRP_RAM + GRAM_BANK1; - dispflg = UPDATE_TRAM | UPDATE_VRAM0; + makescrn.disp1 = gram + GRAM_BANK0; + makescrn.disp2 = gram + GRAM_BANK1; + makescrn.dispflag = UPDATE_TRAM | UPDATE_VRAM0; } else { - dispp = GRP_RAM + GRAM_BANK1; - dispp2 = GRP_RAM + GRAM_BANK0; - dispflg = UPDATE_TRAM | UPDATE_VRAM1; + makescrn.disp1 = gram + GRAM_BANK1; + makescrn.disp2 = gram + GRAM_BANK0; + makescrn.dispflag = UPDATE_TRAM | UPDATE_VRAM1; } scrnallflash = 1; makescrn.palandply = 1; @@ -255,16 +151,26 @@ static void changemodes(void) { static void changecrtc(void) { + UINT scrnxmax; + UINT scrnymax; + UINT textxl; + UINT surfcx; REG8 widthmode; UINT fontcy; UINT underlines; REG8 y2; UINT charcy; 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.width40)?40:80; + scrnymax = 200; + if (crtc.s.width40) { if (lastdisp & SCRN_DRAW4096) { widthmode = SCRNWIDTHMODE_4096; } @@ -277,13 +183,10 @@ static void changecrtc(void) { } scrndraw_changewidth(widthmode); - makescrn.surfcx = min(80, crtc.s.TXT_XL); - makescrn.surfrx = crtc.s.TXT_XL - makescrn.surfcx; + textxl = crtc.s.reg[CRTCREG_HDISP]; + surfcx = min(scrnxmax, textxl); - fontcy = crtc.s.FNT_YL; - if (crtc.s.SCRN_BITS & SCRN_24KHZ) { - fontcy >>= 1; - } + fontcy = crtc.e.fonty; underlines = (crtc.s.SCRN_BITS & SCRN_UNDERLINE)?2:0; if (fontcy > underlines) { fontcy -= underlines; @@ -307,16 +210,35 @@ static void changecrtc(void) { charcy = fontcy + underlines; makescrn.fontcy = fontcy; makescrn.charcy = charcy; - charcy <<= y2; - surfcy = 200 / charcy; - if (surfcy > crtc.s.TXT_YL) { - surfcy = crtc.s.TXT_YL; + surfcy = scrnymax / charcy; + if (surfcy > crtc.e.yl) { + surfcy = crtc.e.yl; + } + + 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.surfstep = (SURFACE_WIDTH * charcy * 2) - (makescrn.surfcx * 8); - makescrn.vramsize = min(0x800, surfcy * crtc.s.TXT_XL); - scrnmng_setheight(0, charcy * surfcy * 2); + makescrn.surfsy = surfsy; + makescrn.surfstep = (SURFACE_WIDTH * charcy * 2) - (surfcx * 8); + makescrn.vramsize = min(0x800, surfcy * textxl); +// scrnmng_setheight(0, charcy * surfcy * 2); } @@ -340,6 +262,7 @@ static const DRAWFN screendraw2[8] = { void scrnupdate(void) { BRESULT ddrawflash; + BRESULT allflash; if (!corestat.drawframe) { return; @@ -347,6 +270,7 @@ void scrnupdate(void) { corestat.drawframe = 0; ddrawflash = FALSE; + allflash = FALSE; if (lastdisp != crtc.e.dispmode) { changemodes(); } @@ -354,6 +278,8 @@ void scrnupdate(void) { scrnallflash = 0; fillupdatetmp(); changecrtc(); + ddrawflash = TRUE; + allflash = TRUE; makescrn.scrnflash = 1; } if (makescrn.remakeattr) { @@ -363,7 +289,7 @@ void scrnupdate(void) { if (makescrn.palandply) { makescrn.palandply = 0; pal_update(); - ddrawflash = 1; + ddrawflash = TRUE; } if (makescrn.existblink) { makescrn.scrnflash |= updateblink(); @@ -371,64 +297,66 @@ void scrnupdate(void) { if (makescrn.scrnflash) { makescrn.scrnflash = 0; - makescrn.fontycnt = 0; - switch(lastdisp & SCRN64_MASK) { - case SCRN64_320x200: -// width40x25_64s(); - break; - - case SCRN64_L320x200x2: -// width40x25_64x2(); - break; - - case SCRN64_L640x200: -// width80x25_64s(); - break; - - case SCRN64_H320x400: -// width40x25_64h(); - break; - - case SCRN64_320x200x4096: -// width40x25_4096(); - break; - - case SCRN64_320x100: -// width40x12_64l(); - break; - - case SCRN64_320x100x2: -// width40x12_64x2(); - break; - - case SCRN64_L640x100: -// width80x12_64s(); - break; - - case SCRN64_H320x200: -// width40x12_64h(); - break; - - case SCRN64_320x100x4096: -// width40x12_4096(); - break; - -// case SCRN64_INVALID: - default: - if (!(crtc.s.SCRN_BITS & SCRN_UNDERLINE)) { - screendraw[crtc.s.SCRN_BITS & 7](); - } - else { - screendraw2[crtc.s.SCRN_BITS & 7](); - } - break; + if (makescrn.vramsize) { + makescrn.fontycnt = 0; + switch(lastdisp & SCRN64_MASK) { + case SCRN64_320x200: +// width40x25_64s(); + break; + + case SCRN64_L320x200x2: +// width40x25_64x2(); + break; + + case SCRN64_L640x200: +// width80x25_64s(); + break; + + case SCRN64_H320x400: +// width40x25_64h(); + break; + + case SCRN64_320x200x4096: +// width40x25_4096(); + break; + + case SCRN64_320x100: +// width40x12_64l(); + break; + + case SCRN64_320x100x2: +// width40x12_64x2(); + break; + + case SCRN64_L640x100: +// width80x12_64s(); + break; + + case SCRN64_H320x200: +// width40x12_64h(); + break; + + case SCRN64_320x100x4096: +// width40x12_4096(); + break; + +// case SCRN64_INVALID: + default: + if (!(crtc.s.SCRN_BITS & SCRN_UNDERLINE)) { + screendraw[crtc.s.SCRN_BITS & 7](); + } + else { + screendraw2[crtc.s.SCRN_BITS & 7](); + } + break; + } + ddrawflash = 1; } - ddrawflash = 1; } if (ddrawflash) { ddrawflash = 0; - scrndraw_draw(FALSE); + scrndraw_draw(allflash); drawtime++; } } @@ -441,8 +369,8 @@ void makescrn_initialize(void) { void makescrn_reset(void) { - fillupdatetmp(); changemodes(); changecrtc(); + flashupdatetmp(); }