#include "compiler.h"
#include "pccore.h"
#include "iocore.h"
#include "vram.h"
#include "makescrn.h"
#include "makesub.h"
#include "font.h"
static void copy2odd(UINT8 *dst, UINT8 *term) {
do {
*(UINT32 *)(dst + (MAKETEXT_ROW * 0)) =
*(UINT32 *)(dst + MAKETEXT_STEP + (MAKETEXT_ROW * 0));
*(UINT32 *)(dst + (MAKETEXT_ROW * 1)) =
*(UINT32 *)(dst + MAKETEXT_STEP + (MAKETEXT_ROW * 1));
*(UINT32 *)(dst + (MAKETEXT_ROW * 2)) =
*(UINT32 *)(dst + MAKETEXT_STEP + (MAKETEXT_ROW * 2));
dst += 4;
} while(dst < term);
}
void makechr16(UINT8 *dst, UINT pos, UINT count, REG8 udtmp) {
REG8 atr;
REG8 ank;
REG8 knj;
const UINT8 *pat;
REG8 func;
UINT8 *term;
atr = TRAM_ATR(pos);
if (atr & makescrn.blinktest) {
atr ^= TRAMATR_REVERSE;
}
if (udtmp & 0x10) {
pos = LOW11(pos - 1);
}
ank = TRAM_ANK(pos);
knj = TRAM_KNJ(pos);
func = udtmp & 0x0f;
term = dst + count;
if (!(TRAM_ATR(pos) & 0x20)) { // CHR
if (!(knj & 0x80)) { // ASCII
pat = font_txt + (ank << 4);
}
else { // KANJI
pat = font_knjx1t;
pat += (knj & 0x1f) << 12;
pat += ank << 4;
if (knj & 0x40) {
pat += FONTX1T_LR;
}
}
func += 0x10;
maketxt8_make(dst, term, pat, func, atr);
maketxt8_make(dst + MAKETEXT_STEP, term + MAKETEXT_STEP,
pat + 1, func, atr);
}
else { // PCG
if (!(knj & 0x90)) { // PCGの出力
pat = pcg.d + (ank << 3);
}
else { // 16ドットPCGの出力
pat = pcg.d + ((ank & (~1)) << 3);
func += 0x10;
}
makepcg8_make(dst, term, pat, func, atr);
if (!(func & 0x10)) {
copy2odd(dst, term);
}
else {
makepcg8_make(dst + MAKETEXT_STEP, term + MAKETEXT_STEP,
pat + 1, func, atr);
}
}
}
RetroPC.NET-CVS <cvs@retropc.net>