#include "compiler.h"
#include "vram.h"
#include "makescrn.h"
#include "makesub.h"
// 遅いのが嫌なら後でインラインにすればいい
// to256colex
// bit0 = normal left
// bit3 = normal right
// bit4 = interleaf 0
// bit7 = interleaf 1
static UINT vramstep = ADVV_WIDTH;
void makemix_mixstep(BRESULT x2) {
vramstep = (x2)?(ADVV_WIDTH * 2):(ADVV_WIDTH * 1);
}
void makemix_mixtext40(UINT8 *dst, const UINT8 *txt, UINT count) {
UINT32 datl;
UINT32 datr;
REG8 dat;
do {
datl = (*(UINT32 *)(dst + 0)) & 0x38383838;
datr = (*(UINT32 *)(dst + 4)) & 0x38383838;
dat = txt[MAKETEXT_ROW * 0];
datl |= (to256colex[dat] & 0x01010101) << 0;
datr |= (to256colex[dat] & 0x08080808) >> 3;
dat = txt[MAKETEXT_ROW * 1];
datl |= (to256colex[dat] & 0x01010101) << 1;
datr |= (to256colex[dat] & 0x08080808) >> 2;
dat = txt[MAKETEXT_ROW * 2];
datl |= (to256colex[dat] & 0x01010101) << 2;
datr |= (to256colex[dat] & 0x08080808) >> 1;
*(UINT32 *)(dst + 0) = datl;
*(UINT32 *)(dst + 4) = datr;
txt++;
dst += vramstep;
} while(--count);
}
void makemix_mixgrph40(UINT8 *dst, const UINT8 *grp, UINT count) {
UINT pos;
UINT32 datl;
UINT32 datr;
REG8 dat;
pos = 0;
do {
datl = (*(UINT32 *)(dst + 0)) & 0x07070707;
datr = (*(UINT32 *)(dst + 4)) & 0x07070707;
dat = grp[pos + GRAM_B];
datl |= (to256colex[dat] & 0x01010101) << 3;
datr |= (to256colex[dat] & 0x08080808) << 0;
dat = grp[pos + GRAM_R];
datl |= (to256colex[dat] & 0x01010101) << 4;
datr |= (to256colex[dat] & 0x08080808) << 1;
dat = grp[pos + GRAM_G];
datl |= (to256colex[dat] & 0x01010101) << 5;
datr |= (to256colex[dat] & 0x08080808) << 2;
*(UINT32 *)(dst + 0) = datl;
*(UINT32 *)(dst + 4) = datr;
pos = (pos + GRAM_LINESTEP) & (GRAM_LINESTEP * 7);
dst += vramstep;
} while(--count);
}
void makemix_mixtext80(UINT8 *dst, const UINT8 *txt, UINT count) {
UINT32 dat0;
UINT32 dat1;
REG8 dat;
do {
dat0 = (*(UINT32 *)(dst + 0x0000)) & 0x38383838;
dat1 = (*(UINT32 *)(dst + 0xa000)) & 0x38383838;
dat = txt[MAKETEXT_ROW * 0];
dat0 |= (to256colex[dat] & 0x10101010) >> 4;
dat1 |= (to256colex[dat] & 0x80808080) >> 7;
dat = txt[MAKETEXT_ROW * 1];
dat0 |= (to256colex[dat] & 0x10101010) >> 3;
dat1 |= (to256colex[dat] & 0x80808080) >> 6;
dat = txt[MAKETEXT_ROW * 2];
dat0 |= (to256colex[dat] & 0x10101010) >> 2;
dat1 |= (to256colex[dat] & 0x80808080) >> 5;
*(UINT32 *)(dst + 0x0000) = dat0;
*(UINT32 *)(dst + 0xa000) = dat1;
txt++;
dst += vramstep;
} while(--count);
}
void makemix_mixgrph80(UINT8 *dst, const UINT8 *grp, UINT count) {
UINT pos;
UINT32 dat0;
UINT32 dat1;
REG8 dat;
pos = 0;
do {
dat0 = (*(UINT32 *)(dst + 0x0000)) & 0x07070707;
dat1 = (*(UINT32 *)(dst + 0xa000)) & 0x07070707;
dat = grp[pos + GRAM_B];
dat0 |= (to256colex[dat] & 0x10101010) >> 1;
dat1 |= (to256colex[dat] & 0x80808080) >> 4;
dat = grp[pos + GRAM_R];
dat0 |= (to256colex[dat] & 0x10101010) << 0;
dat1 |= (to256colex[dat] & 0x80808080) >> 3;
dat = grp[pos + GRAM_G];
dat0 |= (to256colex[dat] & 0x10101010) << 1;
dat1 |= (to256colex[dat] & 0x80808080) >> 2;
*(UINT32 *)(dst + 0x0000) = dat0;
*(UINT32 *)(dst + 0xa000) = dat1;
pos = (pos + GRAM_LINESTEP) & (GRAM_LINESTEP * 7);
dst += vramstep;
} while(--count);
}
#if 0
void makemix_settext(UINT8 *dst, UINT align, const UINT8 *txt, UINT count) {
REG8 dat;
UINT32 datl;
UINT32 datr;
do {
dat = txt[MAKETEXT_ROW * 0];
datl = TO256COLL(dat, 3);
datr = TO256COLR(dat, 3);
dat = txt[MAKETEXT_ROW * 1];
datl |= TO256COLL(dat, 4);
datr |= TO256COLR(dat, 4);
dat = txt[MAKETEXT_ROW * 2];
datl |= TO256COLL(dat, 5);
datr |= TO256COLR(dat, 5);
*(UINT32 *)(dst + 0) = datl;
*(UINT32 *)(dst + 4) = datr;
txt++;
dst += align;
} while(--count);
}
void makemix_ul20(UINT8 *dst, UINT pos) {
UINT32 dat;
dat = (TRAM_KNJ(pos) & TRAMKNJ_ULINE)?0x01010101:0x00000000;
*(UINT32 *)(dst + (SURFACE_WIDTH * 0) + 0) = dat;
*(UINT32 *)(dst + (SURFACE_WIDTH * 0) + 4) = dat;
*(UINT32 *)(dst + (SURFACE_WIDTH * 1) + 0) = dat;
*(UINT32 *)(dst + (SURFACE_WIDTH * 1) + 4) = dat;
*(UINT32 *)(dst + (SURFACE_WIDTH * 2) + 0) = 0;
*(UINT32 *)(dst + (SURFACE_WIDTH * 2) + 4) = 0;
*(UINT32 *)(dst + (SURFACE_WIDTH * 3) + 0) = 0;
*(UINT32 *)(dst + (SURFACE_WIDTH * 3) + 4) = 0;
}
void makemix_ul10(UINT8 *dst, UINT pos) {
UINT32 dat;
dat = (TRAM_KNJ(pos) & TRAMKNJ_ULINE)?0x01010101:0x00000000;
*(UINT32 *)(dst + (SURFACE_WIDTH * 0) + 0) = dat;
*(UINT32 *)(dst + (SURFACE_WIDTH * 0) + 4) = dat;
// *(UINT32 *)(dst + (SURFACE_WIDTH * 1) + 0) = dat;
// *(UINT32 *)(dst + (SURFACE_WIDTH * 1) + 4) = dat;
*(UINT32 *)(dst + (SURFACE_WIDTH * 2) + 0) = dat;
*(UINT32 *)(dst + (SURFACE_WIDTH * 2) + 4) = dat;
// *(UINT32 *)(dst + (SURFACE_WIDTH * 3) + 0) = dat;
// *(UINT32 *)(dst + (SURFACE_WIDTH * 3) + 4) = dat;
*(UINT32 *)(dst + (SURFACE_WIDTH * 4) + 0) = 0;
*(UINT32 *)(dst + (SURFACE_WIDTH * 4) + 4) = 0;
// *(UINT32 *)(dst + (SURFACE_WIDTH * 5) + 0) = 0;
// *(UINT32 *)(dst + (SURFACE_WIDTH * 5) + 4) = 0;
*(UINT32 *)(dst + (SURFACE_WIDTH * 6) + 0) = 0;
*(UINT32 *)(dst + (SURFACE_WIDTH * 6) + 4) = 0;
// *(UINT32 *)(dst + (SURFACE_WIDTH * 7) + 0) = 0;
// *(UINT32 *)(dst + (SURFACE_WIDTH * 7) + 4) = 0;
}
void makemix_cpy200(UINT8 *dst, UINT pos, UINT count) {
count -= pos;
pos = pos * SURFACE_WIDTH * 2;
do {
*(UINT32 *)(dst + pos + 0) = *(UINT32 *)(dst + 0);
*(UINT32 *)(dst + pos + 4) = *(UINT32 *)(dst + 4);
dst += SURFACE_WIDTH * 2;
} while(--count);
}
void makemix_cpy400(UINT8 *dst, UINT pos, UINT count) {
count -= pos;
pos = pos * SURFACE_WIDTH;
do {
*(UINT32 *)(dst + pos + 0) = *(UINT32 *)(dst + 0);
*(UINT32 *)(dst + pos + 4) = *(UINT32 *)(dst + 4);
dst += SURFACE_WIDTH;
} while(--count);
}
#endif
RetroPC.NET-CVS <cvs@retropc.net>