DREAMWEB: showframe blacklisted

This commit is contained in:
Bertrand Augereau 2011-06-26 17:03:17 +02:00
parent 7af3cd565c
commit 880bcc69ef
5 changed files with 94 additions and 135 deletions

View File

@ -28,6 +28,7 @@ generator = cpp(context, "DreamGen", blacklist = [
'eraseoldobs',
'clearsprites',
'makesprite',
'showframe',
'spriteupdate',
'frameoutv',
'modifychar',

View File

@ -4090,114 +4090,6 @@ zeroblock:
goto loop120;
}
void DreamGenContext::showframe() {
STACK_CHECK;
push(dx);
push(ax);
cx = ax;
_and(cx, 511);
_add(cx, cx);
si = cx;
_add(cx, cx);
_add(si, cx);
_cmp(ds.word(si), 0);
if (!flags.z())
goto notblankshow;
ax = pop();
dx = pop();
cx = 0;
return;
notblankshow:
_test(ah, 128);
if (!flags.z())
goto skipoffsets;
al = ds.byte(si+4);
ah = 0;
_add(di, ax);
al = ds.byte(si+5);
ah = 0;
_add(bx, ax);
skipoffsets:
cx = ds.word(si+0);
ax = ds.word(si+2);
_add(ax, 2080);
si = ax;
ax = pop();
dx = pop();
_cmp(ah, 0);
if (flags.z())
goto noeffects;
_test(ah, 128);
if (flags.z())
goto notcentred;
push(ax);
al = cl;
ah = 0;
_shr(ax, 1);
_sub(di, ax);
al = ch;
ah = 0;
_shr(ax, 1);
_sub(bx, ax);
ax = pop();
notcentred:
_test(ah, 64);
if (flags.z())
goto notdiffdest;
push(cx);
frameoutfx();
cx = pop();
return;
notdiffdest:
_test(ah, 8);
if (flags.z())
goto notprintlist;
push(ax);
ax = di;
_sub(ax, data.word(kMapadx));
push(bx);
_sub(bx, data.word(kMapady));
ah = bl;
bx = pop();
ax = pop();
notprintlist:
_test(ah, 4);
if (flags.z())
goto notflippedx;
dx = (320);
es = data.word(kWorkspace);
push(cx);
frameoutfx();
cx = pop();
return;
notflippedx:
_test(ah, 2);
if (flags.z())
goto notnomask;
dx = (320);
es = data.word(kWorkspace);
push(cx);
frameoutnm();
cx = pop();
return;
notnomask:
_test(ah, 32);
if (flags.z())
goto noeffects;
dx = (320);
es = data.word(kWorkspace);
push(cx);
frameoutbh();
cx = pop();
return;
noeffects:
dx = (320);
es = data.word(kWorkspace);
push(cx);
frameoutv();
cx = pop();
}
void DreamGenContext::frameoutbh() {
STACK_CHECK;
push(dx);
@ -22020,7 +21912,6 @@ void DreamGenContext::__dispatch_call(uint16 addr) {
case addr_zoom: zoom(); break;
case addr_delthisone: delthisone(); break;
case addr_doblocks: doblocks(); break;
case addr_showframe: showframe(); break;
case addr_frameoutbh: frameoutbh(); break;
case addr_frameoutfx: frameoutfx(); break;
case addr_transferinv: transferinv(); break;

View File

@ -620,7 +620,6 @@ public:
static const uint16 addr_transferinv = 0xc240;
static const uint16 addr_frameoutfx = 0xc23c;
static const uint16 addr_frameoutbh = 0xc238;
static const uint16 addr_showframe = 0xc22c;
static const uint16 addr_doblocks = 0xc228;
static const uint16 addr_delthisone = 0xc214;
static const uint16 addr_zoom = 0xc210;
@ -1679,7 +1678,7 @@ public:
void walking();
void diarykeyp();
//void readabyte();
void showframe();
//void showframe();
void random();
void obicons();
void frameoutbh();

View File

@ -83,21 +83,14 @@ void DreamGenContext::cls() {
engine->cls();
}
void DreamGenContext::frameoutnm() {
unsigned w = (uint8)cl, h = (uint8)ch;
unsigned pitch = (uint16)dx;
unsigned src = (uint16)si;
int x = (uint16)di, y = (uint16)bx;
unsigned dst = x + y * pitch;
//debug(1, "framenm %ux%u[pitch: %u]-> %d,%d, segment: %04x->%04x", w, h, pitch, x, y, (uint16)ds, (uint16)es);
for(unsigned l = 0; l < h; ++l) {
uint8 *src_p = ds.ptr(src + w * l, w);
uint8 *dst_p = es.ptr(dst + pitch * l, w);
memcpy(dst_p, src_p, w);
void DreamGenContext::frameoutnm(uint8* dst, const uint8* src, uint16 pitch, uint16 width, uint16 height, uint16 x, uint16 y) {
dst += pitch * y + x;
for (uint16 j = 0; j < height; ++j) {
memcpy(dst, src, width);
dst += pitch;
src += width;
}
di += dst + pitch * h;
si += w * h;
cx = 0;
}
void DreamGenContext::seecommandtail() {
@ -528,24 +521,26 @@ void DreamGenContext::showpcx() {
pcxFile.close();
}
/*
void DreamGenContext::frameoutv() {
uint16 pitch = dx;
uint16 width = cx & 0xff;
uint16 height = cx >> 8;
const uint8* src = ds.ptr(si, width * height);
uint8* dst = es.ptr(di, pitch * height);
uint8* dst = es.ptr(0, pitch * height);
frameoutv(dst, src, pitch, width, height);
frameoutv(dst, src, pitch, width, height, di, bx);
}
*/
void DreamGenContext::frameoutv(uint8* dst, const uint8* src, uint16 pitch, uint16 width, uint16 height) {
void DreamGenContext::frameoutv(uint8* dst, const uint8* src, uint16 pitch, uint16 width, uint16 height, uint16 x, uint16 y) {
uint16 stride = pitch - width;
dst += pitch * bx;
dst += pitch * y + x;
// NB: Original code assumes non-zero width and height, "for" are unneeded, do-while would suffice but would be less readable
for (uint16 y = 0; y < height; ++y) {
for (uint16 x = 0; x < width; ++x) {
for (uint16 j = 0; j < height; ++j) {
for (uint16 i = 0; i < width; ++i) {
uint8 pixel = *src++;
if (pixel)
*dst = pixel;
@ -569,6 +564,78 @@ Sprite* DreamGenContext::spritetable() {
return sprite;
}
uint16 DreamGenContext::showframeCPP(uint16 dst, uint16 src, uint16 x, uint16 y, uint8 frameNumber, uint8 effectsFlag) {
es = dst;
ds = src;
di = x;
bx = y;
al = frameNumber;
ah = effectsFlag;
si = (ax & 0x1ff) * 6;
if (ds.word(si) == 0) {
return 0;
}
//notblankshow:
if ((effectsFlag & 128) == 0) {
di += ds.byte(si+4);
bx += ds.byte(si+5);
}
//skipoffsets:
cx = ds.word(si+0);
uint8 width = cl;
uint8 height = ch;
uint16 written = cx;
si = ds.word(si+2) + 2080;
if (effectsFlag) {
if (effectsFlag & 128) { //centred
di -= width / 2;
bx -= height / 2;
}
if (effectsFlag & 64) { //diffdest
frameoutfx();
return written;
}
if (effectsFlag & 8) { //printlist
push(ax);
ax = di - data.word(kMapadx);
push(bx);
bx -= data.word(kMapady);
ah = bl;
bx = pop();
//addtoprintlist(); // NB: Commented in the original asm
ax = pop();
}
if (effectsFlag & 4) { //flippedx
dx = (320);
es = data.word(kWorkspace);
frameoutfx();
return written;
}
if (effectsFlag & 2) { //nomask
es = data.word(kWorkspace);
frameoutnm(es.ptr(0, 320 * height), ds.ptr(si, width * height), 320, width, height, di, bx);
return written;
}
if (effectsFlag & 32) {
dx = (320);
es = data.word(kWorkspace);
frameoutbh();
return written;
}
}
//noeffects:
es = data.word(kWorkspace);
frameoutv(es.ptr(0, 320 * height), ds.ptr(si, width * height), 320, width, height, di, bx);
return written;
}
void DreamGenContext::showframe() {
cx = showframeCPP(es, ds, di, bx, al, ah);
}
void DreamGenContext::printsprites() {
for (size_t priority = 0; priority < 7; ++priority) {
Sprite *sprites = spritetable();
@ -606,7 +673,7 @@ void DreamGenContext::printasprite(const Sprite* sprite) {
ax = sprite->b15;
if (sprite->type != 0)
ah = 8;
showframe(); // NB: Params in ax, bx, di, ds:dx
showframe();
bx = pop();
es = pop();

View File

@ -1,6 +1,6 @@
void multidump();
void frameoutv();
void frameoutv(uint8* dst, const uint8* src, uint16 pitch, uint16 width, uint16 height);
void frameoutv(uint8* dst, const uint8* src, uint16 pitch, uint16 width, uint16 height, uint16 x, uint16 y);
void frameoutnm(uint8* dst, const uint8* src, uint16 pitch, uint16 width, uint16 height, uint16 x, uint16 y);
void worktoscreen();
void multiget();
void convertkey();
@ -10,10 +10,11 @@
void readoneblock();
void printundermon();
void seecommandtail();
void frameoutnm();
void randomnumber();
void quickquit2();
Sprite* spritetable();
void showframe();
uint16 showframeCPP(uint16 dst, uint16 src, uint16 x, uint16 y, uint8 frameNumber, uint8 effectsFlag);
void printasprite(const Sprite* sprite);
void width160();
void multiput();