--- xmil/vram/make24.c 2004/08/07 07:19:56 1.1 +++ xmil/vram/make24.c 2005/02/04 06:42:12 1.6 @@ -1,7 +1,6 @@ #include "compiler.h" #include "scrnmng.h" #include "pccore.h" -#include "iocore.h" #include "vram.h" #include "scrndraw.h" #include "makescrn.h" @@ -9,10 +8,6 @@ #include "font.h" -extern BYTE dispflg; -extern BYTE *dispp; - - void width80x25_200h(void) { // 80x25 200line UINT fontcy; @@ -23,13 +18,14 @@ void width80x25_200h(void) { // 8 UINT8 *lp; UINT x; REG8 udtmp; + REG8 dirty; UINT8 work[MAKETEXT_STEP * 2]; const UINT8 *src; UINT lines; UINT i; fontcy = min(makescrn.fontcy, MAKETEXT_ROW); - pos = crtc.s.TXT_TOP; + pos = makescrn.vramtop; dst = screenmap; newline = FALSE; y = makescrn.surfcy; @@ -37,18 +33,26 @@ const UINT8 *src; do { x = makescrn.surfcx; do { - udtmp = updatetmp[pos]; - if (udtmp & dispflg) { - updatetmp[pos] = (UINT8)(udtmp & (~dispflg)); + udtmp = TRAMUPDATE(pos); + dirty = udtmp & makescrn.dispflag; + if (dirty) { + TRAMUPDATE(pos) = (UINT8)(udtmp ^ dirty); newline = TRUE; - ZeroMemory(work, sizeof(work)); - makechr16(work, pos, fontcy, udtmp); - src = dispp + (pos << 5); - makemix_mix(dst, SURFACE_WIDTH * 2, work, src, fontcy); - makemix_mix(dst + SURFACE_WIDTH, SURFACE_WIDTH * 2, - work + MAKETEXT_STEP, src, fontcy); + if (dirty & UPDATE_TRAM) { + ZeroMemory(work, sizeof(work)); + makechr16(work, pos, fontcy, udtmp); + makemix_mixtext(dst, SURFACE_WIDTH * 2, work, fontcy); + makemix_mixtext(dst + SURFACE_WIDTH, SURFACE_WIDTH * 2, + work + MAKETEXT_STEP, fontcy); + } + if (dirty & UPDATE_VRAM) { + src = makescrn.disp1 + TRAM2GRAM(pos); + makemix_mixgrph(dst, SURFACE_WIDTH * 2, src, fontcy); + makemix_mixgrph(dst + SURFACE_WIDTH, SURFACE_WIDTH * 2, + src, fontcy); + } if (fontcy < makescrn.fontcy) { - makemix_remcpy(dst, fontcy * 2, makescrn.fontcy * 2); + makemix_cpy400(dst, fontcy * 2, makescrn.fontcy * 2); } } pos = LOW11(pos + 1); @@ -56,7 +60,7 @@ const UINT8 *src; } while(--x); pos = LOW11(pos + makescrn.surfrx); - if (updatetmp[LOW11(pos - 1)] & 4) { // 縦倍角描画だったら + if (TRAMUPDATE(LOW11(pos - 1)) & 4) { // 縦倍角描画だったら makescrn.fontycnt += makescrn.charcy; } else { @@ -91,7 +95,7 @@ const UINT8 *src; UINT i; fontcy = min(makescrn.fontcy, MAKETEXT_ROW); - pos = crtc.s.TXT_TOP; + pos = makescrn.vramtop; dst = screenmap; newline = FALSE; y = makescrn.surfcy; @@ -99,19 +103,29 @@ const UINT8 *src; do { x = makescrn.surfcx; do { - udtmp = updatetmp[pos]; - if (udtmp & UPDATE_VRAM) { - updatetmp[pos] = (UINT8)(udtmp & (~UPDATE_VRAM)); + udtmp = TRAMUPDATE(pos); + if (udtmp & UPDATE_TVRAM) { + TRAMUPDATE(pos) = (UINT8)(udtmp & (~UPDATE_TVRAM)); newline = TRUE; - ZeroMemory(work, sizeof(work)); - makechr16(work, pos, fontcy, udtmp); - src = GRP_RAM + (pos << 5); - makemix_mix(dst + SURFACE_WIDTH * 0, SURFACE_WIDTH * 2, - work, src + GRAM_BANK0, fontcy); - makemix_mix(dst + SURFACE_WIDTH * 1, SURFACE_WIDTH * 2, - work + MAKETEXT_STEP, src + GRAM_BANK1, fontcy); + if (udtmp & UPDATE_TRAM) { + ZeroMemory(work, sizeof(work)); + makechr16(work, pos, fontcy, udtmp); + makemix_mixtext(dst + SURFACE_WIDTH * 0, SURFACE_WIDTH * 2, + work, fontcy); + makemix_mixtext(dst + SURFACE_WIDTH * 1, SURFACE_WIDTH * 2, + work + MAKETEXT_STEP, fontcy); + } + src = gram + TRAM2GRAM(pos); + if (udtmp & UPDATE_VRAM0) { + makemix_mixgrph(dst + SURFACE_WIDTH * 0, SURFACE_WIDTH * 2, + src + GRAM_BANK0, fontcy); + } + if (udtmp & UPDATE_VRAM1) { + makemix_mixgrph(dst + SURFACE_WIDTH * 1, SURFACE_WIDTH * 2, + src + GRAM_BANK1, fontcy); + } if (fontcy < makescrn.fontcy) { - makemix_remcpy(dst, fontcy * 2, makescrn.fontcy * 2); + makemix_cpy400(dst, fontcy * 2, makescrn.fontcy * 2); } } pos = LOW11(pos + 1); @@ -119,7 +133,7 @@ const UINT8 *src; } while(--x); pos = LOW11(pos + makescrn.surfrx); - if (updatetmp[LOW11(pos - 1)] & 4) { // 縦倍角描画だったら + if (TRAMUPDATE(LOW11(pos - 1)) & 4) { // 縦倍角描画だったら makescrn.fontycnt += makescrn.charcy; } else { @@ -148,13 +162,14 @@ void width80x12_200h(void) { // 8 UINT8 *lp; UINT x; REG8 udtmp; + REG8 dirty; UINT8 work[MAKETEXT_STEP * 2]; const UINT8 *src; UINT lines; UINT i; fontcy = min(makescrn.fontcy, MAKETEXT_ROW); - pos = crtc.s.TXT_TOP; + pos = makescrn.vramtop; dst = screenmap; newline = FALSE; y = makescrn.surfcy; @@ -162,19 +177,27 @@ const UINT8 *src; do { x = makescrn.surfcx; do { - udtmp = updatetmp[pos]; - if (udtmp & dispflg) { - updatetmp[pos] = (UINT8)(udtmp & (~dispflg)); + udtmp = TRAMUPDATE(pos); + dirty = udtmp & makescrn.dispflag; + if (dirty) { + TRAMUPDATE(pos) = (UINT8)(udtmp ^ dirty); newline = TRUE; - ZeroMemory(work, sizeof(work)); - makechr16(work, pos, fontcy, udtmp); - src = dispp + (LOW10(pos) << 5); - makemix_mix(dst, SURFACE_WIDTH * 4, work, src, fontcy); - makemix_mix(dst + SURFACE_WIDTH * 2, SURFACE_WIDTH * 4, - work + MAKETEXT_STEP, src + GRAM_HALFSTEP, fontcy); - makemix_doubler(dst, fontcy * 2, 0); + if (dirty & UPDATE_TRAM) { + ZeroMemory(work, sizeof(work)); + makechr16(work, pos, fontcy, udtmp); + makemix_mixtext(dst, SURFACE_WIDTH * 4, work, fontcy); + makemix_mixtext(dst + SURFACE_WIDTH * 2, SURFACE_WIDTH * 4, + work + MAKETEXT_STEP, fontcy); + } + if (dirty & UPDATE_VRAM) { + src = makescrn.disp1 + TRAM2GRAM(LOW10(pos)); + makemix_mixgrph(dst, SURFACE_WIDTH * 4, src, fontcy); + makemix_mixgrph(dst + SURFACE_WIDTH * 2, SURFACE_WIDTH * 4, + src + GRAM_HALFSTEP, fontcy); + } + // makemix_doubler(dst, fontcy * 2, 0); if (fontcy < makescrn.fontcy) { - makemix_remcpy(dst, fontcy * 4, makescrn.fontcy * 4); + makemix_cpy200(dst, fontcy * 2, makescrn.fontcy * 2); } } pos = LOW11(pos + 1); @@ -182,7 +205,7 @@ const UINT8 *src; } while(--x); pos = LOW11(pos + makescrn.surfrx); - if (updatetmp[LOW11(pos - 1)] & 4) { // 縦倍角描画だったら + if (TRAMUPDATE(LOW11(pos - 1)) & 4) { // 縦倍角描画だったら makescrn.fontycnt += makescrn.charcy; } else { @@ -217,7 +240,7 @@ const UINT8 *src; UINT i; fontcy = min(makescrn.fontcy, MAKETEXT_ROW); - pos = crtc.s.TXT_TOP; + pos = makescrn.vramtop; dst = screenmap; newline = FALSE; y = makescrn.surfcy; @@ -225,23 +248,37 @@ const UINT8 *src; do { x = makescrn.surfcx; do { - udtmp = updatetmp[pos]; - if (udtmp & UPDATE_VRAM) { - updatetmp[pos] = (UINT8)(udtmp & (~UPDATE_VRAM)); + udtmp = TRAMUPDATE(pos); + if (udtmp & UPDATE_TVRAM) { + TRAMUPDATE(pos) = (UINT8)(udtmp & (~UPDATE_TVRAM)); newline = TRUE; - ZeroMemory(work, sizeof(work)); - makechr16(work, pos, fontcy, udtmp); - src = GRP_RAM + (LOW10(pos) << 5); - makemix_mix(dst + SURFACE_WIDTH * 0, SURFACE_WIDTH * 4, - work, src + GRAM_BANK0L, fontcy); - makemix_mix(dst + SURFACE_WIDTH * 1, SURFACE_WIDTH * 4, - work, src + GRAM_BANK1L, fontcy); - makemix_mix(dst + SURFACE_WIDTH * 2, SURFACE_WIDTH * 4, - work + MAKETEXT_STEP, src + GRAM_BANK0H, fontcy); - makemix_mix(dst + SURFACE_WIDTH * 3, SURFACE_WIDTH * 4, - work + MAKETEXT_STEP, src + GRAM_BANK1H, fontcy); + if (udtmp & UPDATE_TRAM) { + ZeroMemory(work, sizeof(work)); + makechr16(work, pos, fontcy, udtmp); + makemix_mixtext(dst + SURFACE_WIDTH * 0, SURFACE_WIDTH * 4, + work, fontcy); + makemix_mixtext(dst + SURFACE_WIDTH * 1, SURFACE_WIDTH * 4, + work, fontcy); + makemix_mixtext(dst + SURFACE_WIDTH * 2, SURFACE_WIDTH * 4, + work + MAKETEXT_STEP, fontcy); + makemix_mixtext(dst + SURFACE_WIDTH * 3, SURFACE_WIDTH * 4, + work + MAKETEXT_STEP, fontcy); + } + src = gram + TRAM2GRAM(LOW10(pos)); + if (udtmp & UPDATE_VRAM0) { + makemix_mixgrph(dst + SURFACE_WIDTH * 0, SURFACE_WIDTH * 4, + src + GRAM_BANK0L, fontcy); + makemix_mixgrph(dst + SURFACE_WIDTH * 2, SURFACE_WIDTH * 4, + src + GRAM_BANK0H, fontcy); + } + if (udtmp & UPDATE_VRAM1) { + makemix_mixgrph(dst + SURFACE_WIDTH * 1, SURFACE_WIDTH * 4, + src + GRAM_BANK1L, fontcy); + makemix_mixgrph(dst + SURFACE_WIDTH * 3, SURFACE_WIDTH * 4, + src + GRAM_BANK1H, fontcy); + } if (fontcy < makescrn.fontcy) { - makemix_remcpy(dst, fontcy * 4, makescrn.fontcy * 4); + makemix_cpy400(dst, fontcy * 4, makescrn.fontcy * 4); } } pos = LOW11(pos + 1); @@ -249,7 +286,7 @@ const UINT8 *src; } while(--x); pos = LOW11(pos + makescrn.surfrx); - if (updatetmp[LOW11(pos - 1)] & 4) { // 縦倍角描画だったら + if (TRAMUPDATE(LOW11(pos - 1)) & 4) { // 縦倍角描画だったら makescrn.fontycnt += makescrn.charcy; } else { @@ -283,7 +320,7 @@ void width80x20h(void) { UINT i; fontcy = min(makescrn.fontcy, MAKETEXT_ROW); - pos = crtc.s.TXT_TOP; + pos = makescrn.vramtop; dst = screenmap; newline = FALSE; y = makescrn.surfcy; @@ -291,27 +328,26 @@ void width80x20h(void) { do { x = makescrn.surfcx; do { - udtmp = updatetmp[pos]; + udtmp = TRAMUPDATE(pos); if (udtmp & UPDATE_TRAM) { - updatetmp[pos] = (UINT8)(udtmp & (~UPDATE_TRAM)); + TRAMUPDATE(pos) = (UINT8)(udtmp & (~UPDATE_TRAM)); newline = TRUE; ZeroMemory(work, sizeof(work)); makechr16(work, pos, fontcy, udtmp); - makemix_txt(dst, SURFACE_WIDTH * 2, work, fontcy); - makemix_txt(dst + SURFACE_WIDTH, SURFACE_WIDTH * 2, + makemix_settext(dst, SURFACE_WIDTH * 2, work, fontcy); + makemix_settext(dst + SURFACE_WIDTH, SURFACE_WIDTH * 2, work + MAKETEXT_STEP, fontcy); if (fontcy < makescrn.fontcy) { - makemix_remcpy(dst, fontcy * 2, makescrn.fontcy * 2); + makemix_cpy400(dst, fontcy * 2, makescrn.fontcy * 2); } - makemix_ul20(dst + SURFACE_WIDTH * makescrn.fontcy * 2, - pos, 0); + makemix_ul20(dst + SURFACE_WIDTH * makescrn.fontcy * 2, pos); } pos = LOW11(pos + 1); dst += 8; } while(--x); pos = LOW11(pos + makescrn.surfrx); - if (updatetmp[LOW11(pos - 1)] & 4) { // 縦倍角描画だったら + if (TRAMUPDATE(LOW11(pos - 1)) & 4) { // 縦倍角描画だったら makescrn.fontycnt += makescrn.charcy; } else { @@ -345,7 +381,7 @@ void width80x10h(void) { UINT i; fontcy = min(makescrn.fontcy, MAKETEXT_ROW); - pos = crtc.s.TXT_TOP; + pos = makescrn.vramtop; dst = screenmap; newline = FALSE; y = makescrn.surfcy; @@ -353,28 +389,26 @@ void width80x10h(void) { do { x = makescrn.surfcx; do { - udtmp = updatetmp[pos]; + udtmp = TRAMUPDATE(pos); if (udtmp & UPDATE_TRAM) { - updatetmp[pos] = (UINT8)(udtmp & (~UPDATE_TRAM)); + TRAMUPDATE(pos) = (UINT8)(udtmp & (~UPDATE_TRAM)); newline = TRUE; ZeroMemory(work, sizeof(work)); makechr16(work, pos, fontcy, udtmp); - makemix_txt(dst, SURFACE_WIDTH * 4, work, fontcy); - makemix_txt(dst + SURFACE_WIDTH * 2, SURFACE_WIDTH * 4, + makemix_settext(dst, SURFACE_WIDTH * 4, work, fontcy); + makemix_settext(dst + SURFACE_WIDTH * 2, SURFACE_WIDTH * 4, work + MAKETEXT_STEP, fontcy); - makemix_doubler(dst, fontcy * 2, 0); if (fontcy < makescrn.fontcy) { - makemix_remcpy(dst, fontcy * 4, makescrn.fontcy * 4); + makemix_cpy200(dst, fontcy * 2, makescrn.fontcy * 2); } - makemix_ul10(dst + SURFACE_WIDTH * makescrn.fontcy * 4, - pos, 0); + makemix_ul10(dst + SURFACE_WIDTH * makescrn.fontcy * 4, pos); } pos = LOW11(pos + 1); dst += 8; } while(--x); pos = LOW11(pos + makescrn.surfrx); - if (updatetmp[LOW11(pos - 1)] & 4) { // 縦倍角描画だったら + if (TRAMUPDATE(LOW11(pos - 1)) & 4) { // 縦倍角描画だったら makescrn.fontycnt += makescrn.charcy; } else {