mirror of
https://github.com/libretro/scummvm.git
synced 2024-12-14 13:50:13 +00:00
DREAMWEB: showframe blacklisted
This commit is contained in:
parent
7af3cd565c
commit
880bcc69ef
@ -28,6 +28,7 @@ generator = cpp(context, "DreamGen", blacklist = [
|
||||
'eraseoldobs',
|
||||
'clearsprites',
|
||||
'makesprite',
|
||||
'showframe',
|
||||
'spriteupdate',
|
||||
'frameoutv',
|
||||
'modifychar',
|
||||
|
@ -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;
|
||||
|
@ -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();
|
||||
|
@ -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();
|
||||
|
@ -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();
|
||||
|
Loading…
Reference in New Issue
Block a user