#include "stdafx.h"
|
#include "stdafx.h"
|
|
|
extern clsPIC pic1;
|
extern unsigned int breakpoints[30];
|
|
extern unsigned __int64 ibreakpoints[10];
|
|
extern bool ib_active[10];
|
|
extern bool isRunning;
|
|
extern bool stepout, stepover;
|
|
extern unsigned int step_depth, stepover_depth;
|
|
extern unsigned int stepoverBkpt;
|
|
extern unsigned int stepover_pc;
|
|
extern bool animate;
|
|
extern bool fullspeed;
|
|
extern bool runstop;
|
|
|
clsSystem::clsSystem() {
|
clsSystem::clsSystem() {
|
int nn;
|
int nn;
|
WriteROM = false;
|
WriteROM = false;
|
for (nn = 0; nn < sizeof(memory); nn+=8) {
|
for (nn = 0; nn < sizeof(memory); nn+=8) {
|
memory[nn>>3] = 0;
|
memory[nn>>3] = 0;
|
}
|
}
|
|
quit = false;
|
Reset();
|
Reset();
|
};
|
};
|
void clsSystem::Reset()
|
void clsSystem::Reset()
|
{
|
{
|
int nn;
|
int nn;
|
WriteROM = false;
|
WriteROM = false;
|
m_z = 88888888;
|
m_z = 88888888;
|
m_w = 12345678;
|
m_w = 12345678;
|
for (nn = 0; nn < 4096; nn++) {
|
for (nn = 0; nn < 4096; nn++) {
|
VideoMem[nn] = random();
|
VideoMem[nn] = random();
|
VideoMemDirty[nn] = true;
|
VideoMemDirty[nn] = true;
|
}
|
}
|
leds = 0;
|
leds = 0;
|
write_error = false;
|
write_error = false;
|
runstop = false;
|
runstop = false;
|
cpu1.system1 = this;
|
cpu2.system1 = this;
|
refscreen = true;
|
refscreen = true;
|
|
cpu2.Reset();
|
|
pic1.Reset();
|
|
uart1.Reset();
|
};
|
};
|
unsigned __int64 clsSystem::Read(unsigned int ad, int sr) {
|
unsigned __int64 clsSystem::Read(unsigned int ad, int sr) {
|
__int64 rr;
|
__int64 rr;
|
unsigned __int8 sc;
|
unsigned __int8 sc;
|
unsigned __int8 st;
|
unsigned __int8 st;
|
if (sr) {
|
if (sr) {
|
if (radr1 == 0)
|
if (radr1 == 0)
|
radr1 = ad;
|
radr1 = ad;
|
else if (radr2 == 0)
|
else if (radr2 == 0)
|
radr2 = ad;
|
radr2 = ad;
|
else {
|
else {
|
if (random()&1)
|
if (random()&1)
|
radr2 = ad;
|
radr2 = ad;
|
else
|
else
|
radr1 = ad;
|
radr1 = ad;
|
}
|
}
|
}
|
}
|
if (ad < 134217728) {
|
if (ad < 134217728) {
|
return memory[ad >> 3];
|
return memory[ad >> 3];
|
}
|
}
|
else if ((ad & 0xFFFF0000)==0xFFD00000) {
|
else if ((ad & 0xFFFF0000)==0xFFD00000) {
|
rr = VideoMem[(ad>>2)& 0xFFF];
|
rr = VideoMem[(ad>>2)& 0xFFF];
|
rr = (rr << 32) | rr;
|
rr = (rr << 32) | rr;
|
return rr;
|
return rr;
|
}
|
}
|
else if ((ad & 0xFFFC0000)==0xFFFC0000) {
|
else if ((ad & 0xFFFC0000)==0xFFFC0000) {
|
return rom[(ad&0x3FFFF)>>3];
|
return rom[(ad&0x3FFFF)>>3];
|
}
|
}
|
else if (keybd.IsSelected(ad)) {
|
else if (keybd.IsSelected(ad)) {
|
switch(ad & 0x1) {
|
switch(ad & 0x1) {
|
case 0:
|
case 0:
|
sc = keybd.Get();
|
sc = keybd.Get();
|
rr = ((int)sc<<24)|((int)sc << 16)|((int)sc<<8)|sc;
|
rr = ((int)sc<<24)|((int)sc << 16)|((int)sc<<8)|sc;
|
rr = (rr << 32) | rr;
|
rr = (rr << 32) | rr;
|
break;
|
break;
|
case 1:
|
case 1:
|
st = keybd.GetStatus();
|
st = keybd.GetStatus();
|
rr = ((int)st<<24)|((int)st<<16)|((int)st<<8)|st;
|
rr = ((int)st<<24)|((int)st<<16)|((int)st<<8)|st;
|
rr = (rr << 32) | rr;
|
rr = (rr << 32) | rr;
|
keybd_status = st;
|
keybd_status = st;
|
break;
|
break;
|
}
|
}
|
return rr;
|
return rr;
|
}
|
}
|
else if (pic1.IsSelected(ad)) {
|
else if (pic1.IsSelected(ad)) {
|
rr = pic1.Read(ad);
|
rr = pic1.Read(ad);
|
rr = (rr << 48) | (rr << 32) | (rr << 16) | rr;
|
rr = (rr << 48) | (rr << 32) | (rr << 16) | rr;
|
return rr;
|
return rr;
|
}
|
}
|
|
else if (uart1.IsSelected(ad)) {
|
|
rr = uart1.Read(ad) & 0xFF;
|
|
rr = (rr << 56) | (rr << 48) || (rr << 40) | (rr << 32)
|
|
| (rr << 24) | (rr << 16) | (rr << 8) | rr;
|
|
return rr;
|
|
}
|
return 0;
|
return 0;
|
};
|
};
|
int clsSystem::Write(unsigned int ad, unsigned __int64 dat, unsigned int mask, int cr) {
|
int clsSystem::Write(unsigned int ad, unsigned __int64 dat, unsigned int mask, int cr) {
|
int nn;
|
int nn;
|
int ret;
|
int ret;
|
|
|
if (cr && (ad!=radr1 && ad!=radr2)) {
|
if (cr && (ad!=radr1 && ad!=radr2)) {
|
ret = false;
|
ret = false;
|
goto j1;
|
goto j1;
|
}
|
}
|
if (cr) {
|
if (cr) {
|
if (ad==radr1)
|
if (ad==radr1)
|
radr1 = 0x00000000;
|
radr1 = 0x00000000;
|
if (ad==radr2)
|
if (ad==radr2)
|
radr2 = 0x00000000;
|
radr2 = 0x00000000;
|
}
|
}
|
if (ad < 134217728) {
|
if (ad < 134217728) {
|
if (ad >= 0x10000 && ad < 0x20000) {
|
if (ad >= 0xFFFC0000LL) {
|
write_error = true;
|
write_error = true;
|
ret = true;
|
ret = true;
|
goto j1;
|
goto j1;
|
}
|
}
|
if ((ad & 0xfffffff0)==0x00c431a0) {
|
if ((ad & 0xfffffff0)==0x00c431a0) {
|
ret = true;
|
ret = true;
|
}
|
}
|
switch(mask) {
|
switch(mask) {
|
case 0xFF:
|
case 0xFF:
|
memory[ad>>3] = dat;
|
memory[ad>>3] = dat;
|
break;
|
break;
|
case 0x1:
|
case 0x1:
|
memory[ad >> 3] &= 0xFFFFFFFFFFFFFF00LL;
|
memory[ad >> 3] &= 0xFFFFFFFFFFFFFF00LL;
|
memory[ad >> 3] |= dat & 0xFFLL;
|
memory[ad >> 3] |= dat & 0xFFLL;
|
break;
|
break;
|
case 0x2:
|
case 0x2:
|
memory[ad >> 3] &= 0xFFFFFFFFFFFF00FFLL;
|
memory[ad >> 3] &= 0xFFFFFFFFFFFF00FFLL;
|
memory[ad >> 3] |= (dat & 0xFFLL) << 8;
|
memory[ad >> 3] |= (dat & 0xFFLL) << 8;
|
break;
|
break;
|
case 0x4:
|
case 0x4:
|
memory[ad >> 3] &= 0xFFFFFFFFFF00FFFFLL;
|
memory[ad >> 3] &= 0xFFFFFFFFFF00FFFFLL;
|
memory[ad >> 3] |= (dat & 0xFFLL) << 16;
|
memory[ad >> 3] |= (dat & 0xFFLL) << 16;
|
break;
|
break;
|
case 0x8:
|
case 0x8:
|
memory[ad >> 3] &= 0xFFFFFFFF00FFFFFFLL;
|
memory[ad >> 3] &= 0xFFFFFFFF00FFFFFFLL;
|
memory[ad >> 3] |= (dat & 0xFFLL) << 24;
|
memory[ad >> 3] |= (dat & 0xFFLL) << 24;
|
break;
|
break;
|
case 0x10:
|
case 0x10:
|
memory[ad >> 3] &= 0xFFFFFF00FFFFFFFFLL;
|
memory[ad >> 3] &= 0xFFFFFF00FFFFFFFFLL;
|
memory[ad >> 3] |= (dat & 0xFFLL) << 32;
|
memory[ad >> 3] |= (dat & 0xFFLL) << 32;
|
break;
|
break;
|
case 0x20:
|
case 0x20:
|
memory[ad >> 3] &= 0xFFFF00FFFFFFFFFFLL;
|
memory[ad >> 3] &= 0xFFFF00FFFFFFFFFFLL;
|
memory[ad >> 3] |= (dat & 0xFFLL) << 40;
|
memory[ad >> 3] |= (dat & 0xFFLL) << 40;
|
break;
|
break;
|
case 0x40:
|
case 0x40:
|
memory[ad >> 3] &= 0xFF00FFFFFFFFFFFFLL;
|
memory[ad >> 3] &= 0xFF00FFFFFFFFFFFFLL;
|
memory[ad >> 3] |= (dat & 0xFFLL) << 48;
|
memory[ad >> 3] |= (dat & 0xFFLL) << 48;
|
break;
|
break;
|
case 0x80:
|
case 0x80:
|
memory[ad >> 3] &= 0x00FFFFFFFFFFFFFFLL;
|
memory[ad >> 3] &= 0x00FFFFFFFFFFFFFFLL;
|
memory[ad >> 3] |= (dat & 0xFFLL) << 56;
|
memory[ad >> 3] |= (dat & 0xFFLL) << 56;
|
break;
|
break;
|
case 0x3:
|
case 0x3:
|
memory[ad >> 3] &= 0xFFFFFFFFFFFF0000;
|
memory[ad >> 3] &= 0xFFFFFFFFFFFF0000;
|
memory[ad >> 3] |= dat & 0xFFFFLL;
|
memory[ad >> 3] |= dat & 0xFFFFLL;
|
break;
|
break;
|
case 0x6:
|
case 0x6:
|
memory[ad >> 3] &= 0xFFFFFFFFFF0000FF;
|
memory[ad >> 3] &= 0xFFFFFFFFFF0000FF;
|
memory[ad >> 3] |= (dat & 0xFFFFLL) << 8;
|
memory[ad >> 3] |= (dat & 0xFFFFLL) << 8;
|
break;
|
break;
|
case 0xC:
|
case 0xC:
|
memory[ad >> 3] &= 0xFFFFFFFF0000FFFF;
|
memory[ad >> 3] &= 0xFFFFFFFF0000FFFF;
|
memory[ad >> 3] |= (dat & 0xFFFFLL) << 16;
|
memory[ad >> 3] |= (dat & 0xFFFFLL) << 16;
|
case 0x18:
|
case 0x18:
|
break;
|
break;
|
memory[ad >> 3] &= 0xFFFFFF0000FFFFFF;
|
memory[ad >> 3] &= 0xFFFFFF0000FFFFFF;
|
memory[ad >> 3] |= (dat & 0xFFFFLL) << 24;
|
memory[ad >> 3] |= (dat & 0xFFFFLL) << 24;
|
break;
|
break;
|
case 0x30:
|
case 0x30:
|
memory[ad >> 3] &= 0xFFFF0000FFFFFFFF;
|
memory[ad >> 3] &= 0xFFFF0000FFFFFFFF;
|
memory[ad >> 3] |= (dat & 0xFFFFLL) << 32;
|
memory[ad >> 3] |= (dat & 0xFFFFLL) << 32;
|
break;
|
break;
|
case 0x60:
|
case 0x60:
|
memory[ad >> 3] &= 0xFF0000FFFFFFFFFF;
|
memory[ad >> 3] &= 0xFF0000FFFFFFFFFF;
|
memory[ad >> 3] |= (dat & 0xFFFFLL) << 40;
|
memory[ad >> 3] |= (dat & 0xFFFFLL) << 40;
|
break;
|
break;
|
case 0xC0:
|
case 0xC0:
|
memory[ad >> 3] &= 0x0000FFFFFFFFFFFF;
|
memory[ad >> 3] &= 0x0000FFFFFFFFFFFF;
|
memory[ad >> 3] |= (dat & 0xFFFFLL) << 48;
|
memory[ad >> 3] |= (dat & 0xFFFFLL) << 48;
|
break;
|
break;
|
case 0x0F:
|
case 0x0F:
|
memory[ad >> 3] &= 0xFFFFFFFF00000000;
|
memory[ad >> 3] &= 0xFFFFFFFF00000000;
|
memory[ad >> 3] |= (dat & 0xFFFFFFFFLL) << 0;
|
memory[ad >> 3] |= (dat & 0xFFFFFFFFLL) << 0;
|
break;
|
break;
|
case 0x1E:
|
case 0x1E:
|
memory[ad >> 3] &= 0xFFFFFF00000000FF;
|
memory[ad >> 3] &= 0xFFFFFF00000000FF;
|
memory[ad >> 3] |= (dat & 0xFFFFFFFFLL) << 8;
|
memory[ad >> 3] |= (dat & 0xFFFFFFFFLL) << 8;
|
break;
|
break;
|
case 0x3C:
|
case 0x3C:
|
memory[ad >> 3] &= 0xFFFF00000000FFFF;
|
memory[ad >> 3] &= 0xFFFF00000000FFFF;
|
memory[ad >> 3] |= (dat & 0xFFFFFFFFLL) << 16;
|
memory[ad >> 3] |= (dat & 0xFFFFFFFFLL) << 16;
|
break;
|
break;
|
case 0x78:
|
case 0x78:
|
memory[ad >> 3] &= 0xFF00000000FFFFFF;
|
memory[ad >> 3] &= 0xFF00000000FFFFFF;
|
memory[ad >> 3] |= (dat & 0xFFFFFFFFLL) << 24;
|
memory[ad >> 3] |= (dat & 0xFFFFFFFFLL) << 24;
|
break;
|
break;
|
case 0xF0:
|
case 0xF0:
|
memory[ad >> 3] &= 0x00000000FFFFFFFF;
|
memory[ad >> 3] &= 0x00000000FFFFFFFF;
|
memory[ad >> 3] |= (dat & 0xFFFFFFFFLL) << 32;
|
memory[ad >> 3] |= (dat & 0xFFFFFFFFLL) << 32;
|
break;
|
break;
|
case 0xE0:
|
case 0xE0:
|
memory[ad >> 3] &= 0x000000FFFFFFFFFF;
|
memory[ad >> 3] &= 0x000000FFFFFFFFFF;
|
memory[ad >> 3] |= (dat & 0xFFFFFFFFLL) << 40;
|
memory[ad >> 3] |= (dat & 0xFFFFFFFFLL) << 40;
|
break;
|
break;
|
}
|
}
|
}
|
}
|
else if ((ad & 0xFFFFFF00)==0xFFDC0600) {
|
else if ((ad & 0xFFFFFF00)==0xFFDC0600) {
|
leds = dat;
|
leds = dat;
|
}
|
}
|
else if ((ad & 0xFFFF0000)==0xFFD00000) {
|
else if ((ad & 0xFFFF0000)==0xFFD00000) {
|
VideoMem[(ad>>2)& 0xFFF] = dat;
|
VideoMem[(ad>>2)& 0xFFF] = dat;
|
VideoMemDirty[(ad>>2)&0xfff] = true;
|
VideoMemDirty[(ad>>2)&0xfff] = true;
|
refscreen = true;
|
refscreen = true;
|
}
|
}
|
|
else if ((ad & 0xFFFF0000)==0xFFD10000) {
|
|
DBGVideoMem[(ad>>2)& 0xFFF] = dat;
|
|
DBGVideoMemDirty[(ad>>2)&0xfff] = true;
|
|
refscreen = true;
|
|
}
|
else if ((ad & 0xFFFC0000)==0xFFFC0000 && WriteROM) {
|
else if ((ad & 0xFFFC0000)==0xFFFC0000 && WriteROM) {
|
rom[(ad&0x3FFFF)>>3] = dat;
|
rom[(ad&0x3FFFF)>>3] = dat;
|
}
|
}
|
else if (keybd.IsSelected(ad)) {
|
else if (keybd.IsSelected(ad)) {
|
switch(ad & 1) {
|
switch(ad & 1) {
|
case 1: keybd_status = 0; pic1.irqKeyboard = keybd.GetStatus()==0x80; break;
|
case 1: keybd_status = 0; pic1.irqKeyboard = keybd.GetStatus()==0x80; break;
|
}
|
}
|
}
|
}
|
else if (pic1.IsSelected(ad)) {
|
else if (pic1.IsSelected(ad)) {
|
pic1.Write(ad,dat,0x3);
|
pic1.Write(ad,dat,0x3);
|
}
|
}
|
|
else if (uart1.IsSelected(ad)) {
|
|
uart1.Write(ad,dat,0x1);
|
|
}
|
ret = true;
|
ret = true;
|
j1:
|
j1:
|
for (nn = 0; nn < numDataBreakpoints; nn++) {
|
for (nn = 0; nn < numDataBreakpoints; nn++) {
|
if (ad==dataBreakpoints[nn]) {
|
if (ad==dataBreakpoints[nn]) {
|
runstop = true;
|
runstop = true;
|
}
|
}
|
}
|
}
|
return ret;
|
return ret;
|
};
|
};
|
int clsSystem::random() {
|
int clsSystem::random() {
|
m_z = 36969 * (m_z & 65535) + (m_z >> 16);
|
m_z = 36969 * (m_z & 65535) + (m_z >> 16);
|
m_w = 18000 * (m_w & 65535) + (m_w >> 16);
|
m_w = 18000 * (m_w & 65535) + (m_w >> 16);
|
return (m_z << 16) + m_w;
|
return (m_z << 16) + m_w;
|
};
|
};
|
|
|
unsigned __int64 clsSystem::ReadByte(unsigned int ad) {
|
unsigned __int64 clsSystem::ReadByte(unsigned int ad) {
|
unsigned __int64 dat = Read(ad);
|
unsigned __int64 dat = Read(ad);
|
return (dat >> ((ad & 7) * 8)) & 0xFFLL;
|
return (dat >> ((ad & 7) * 8)) & 0xFFLL;
|
}
|
}
|
|
unsigned __int64 clsSystem::ReadChar(unsigned int ad) {
|
|
unsigned __int64 dat = Read(ad);
|
|
return (dat >> ((ad & 7) * 8)) & 0xFFFFLL;
|
|
}
|
|
unsigned __int64 clsSystem::ReadHalf(unsigned int ad) {
|
|
unsigned __int64 dat = Read(ad);
|
|
return (dat >> ((ad & 7) * 8)) & 0xFFFFFFFFLL;
|
|
}
|
|
|
|
|
|
void clsSystem::Step() {
|
|
uart1.Step();
|
|
keybd.Step();
|
|
pic1.Step();
|
|
cpu2.Step();
|
|
}
|
|
|
|
void clsSystem::Run() {
|
|
int nn,kk;
|
|
int xx;
|
|
|
|
do {
|
|
if (isRunning) {
|
|
// if (cpu2.pc > 134217727) {
|
|
if (cpu2.pc < 0xFFFC0000LL && cpu2.pc & 0x1000 != 0x1000) {
|
|
isRunning = false;
|
|
continue;
|
|
}
|
|
if (cpu2.pc == stepoverBkpt) {
|
|
stepoverBkpt = 0;
|
|
isRunning = false;
|
|
continue;
|
|
}
|
|
for (kk = 0; kk < 5; kk++) {
|
|
if (cpu2.pc == ibreakpoints[kk] && ib_active[kk]) {
|
|
isRunning = false;
|
|
continue;
|
|
}
|
|
}
|
|
if (system1.write_error==true) {
|
|
isRunning = false;
|
|
continue;
|
|
// this->lblWriteErr->Visible = true;
|
|
}
|
|
// Runstop becomes active when a data breakpoint is hit.
|
|
if (runstop) {
|
|
isRunning = false;
|
|
runstop = false;
|
|
continue;
|
|
}
|
|
cpu2.Step();
|
|
pic1.Step();
|
|
if (stepout) {
|
|
if (cpu2.sub_depth<step_depth) {
|
|
isRunning = false;
|
|
stepout = false;
|
|
continue;
|
|
}
|
|
}
|
|
if (stepover) {
|
|
if (cpu2.pc > stepover_pc && cpu2.sub_depth==stepover_depth) {
|
|
isRunning = false;
|
|
stepover = false;
|
|
continue;
|
|
}
|
|
}
|
|
/*
|
|
if (cpu2.pc == stepoverBkpt) {
|
|
stepoverBkpt = 0;
|
|
cpu2.isRunning = false;
|
|
UpdateListBox(cpu2.pc-32);
|
|
return;
|
|
}
|
|
for (kk = 0; kk < numBreakpoints; kk++) {
|
|
if (cpu2.pc == breakpoints[kk]) {
|
|
cpu2.isRunning = false;
|
|
UpdateListBox(cpu2.pc-32);
|
|
return;
|
|
}
|
|
}
|
|
cpu2.Step();
|
|
pic1.Step();
|
|
UpdateListBox(cpu2.pc-32);
|
|
*/
|
|
// UpdateListBox(cpu2.pc-32);
|
|
}
|
|
} while (false); // !quit
|
|
}
|
|
|
No newline at end of file
|
No newline at end of file
|