DREAMWEB: Ported 'dirfile' to C++

Needs some checking of es:di usage and work to remove _operand1 to
dreambase.h
This commit is contained in:
D G Turner 2011-12-26 21:23:38 +00:00
parent b3b904ddab
commit 6a7e798f46
3 changed files with 56 additions and 77 deletions

View File

@ -1027,6 +1027,7 @@ generator = cpp(context, "DreamGen", blacklist = [
'zoomonoff',
], skip_output = [
# These functions are processed but not output
'dirfile',
'dreamweb',
], skip_dispatch_call = True, skip_addr_constants = True,
header_omit_blacklisted = True,

View File

@ -26,83 +26,6 @@
namespace DreamGen {
void DreamGenContext::dirFile() {
STACK_CHECK;
al = 34;
es.byte(di) = al;
push(es);
push(di);
ds = data.word(kTextfile1);
si = (66*2);
searchForString();
_cmp(al, 0);
if (flags.z())
goto foundfile;
di = pop();
es = pop();
push(es);
push(di);
ds = data.word(kTextfile2);
si = (66*2);
searchForString();
_cmp(al, 0);
if (flags.z())
goto foundfile;
di = pop();
es = pop();
push(es);
push(di);
ds = data.word(kTextfile3);
si = (66*2);
searchForString();
_cmp(al, 0);
if (flags.z())
goto foundfile;
di = pop();
es = pop();
al = 7;
monMessage();
return;
foundfile:
ax = pop();
ax = pop();
getKeyAndLogo();
_cmp(al, 0);
if (flags.z())
goto keyok2;
return;
keyok2:
push(es);
push(bx);
ds = cs;
si = offset_operand1+1;
es = cs;
di = 408+1;
cx = 12;
_movsb(cx, true);
monitorLogo();
scrollMonitor();
al = 10;
monMessage();
bx = pop();
es = pop();
directloop2:
al = es.byte(bx);
_inc(bx);
_cmp(al, 34);
if (flags.z())
goto endofdir2;
_cmp(al, '*');
if (flags.z())
goto endofdir2;
_cmp(al, '=');
if (!flags.z())
goto directloop2;
monPrint();
goto directloop2;
endofdir2:
scrollMonitor();
}
void DreamGenContext::__start() {
static const uint8 src[] = {

View File

@ -453,6 +453,61 @@ void DreamGenContext::getKeyAndLogo() {
}
}
void DreamGenContext::dirFile() {
bool foundFile = false;
es.byte(di) = 34;
ds = data.word(kTextfile1);
si = kTextstart;
searchForString();
if (al == 0) {
foundFile = true;
} else {
ds = data.word(kTextfile2);
si = kTextstart;
searchForString();
if (al == 0) {
foundFile = true;
} else {
ds = data.word(kTextfile3);
si = kTextstart;
searchForString();
if (al == 0)
foundFile = true;
}
}
if (!foundFile) {
monMessage(7);
return;
}
// "foundfile"
getKeyAndLogo();
if (al != 0)
return;
// "keyok2"
memcpy(data.ptr(kCurrentfile+1, 0), data.ptr(offset_operand1+1, 0), 12);
monitorLogo();
scrollMonitor();
monMessage(10);
while (true) {
al = es.byte(bx);
bx++;
if (al == 34 || al == '*') {
// "endofdir2"
scrollMonitor();
return;
}
if (al == '=')
monPrint();
}
}
void DreamGenContext::dirCom() {
randomAccess(30);