OpenCores
URL https://opencores.org/ocsvn/thor/thor/trunk

Subversion Repositories thor

[/] [thor/] [trunk/] [software/] [emuThor/] [source/] [clsSystem.cpp] - Diff between revs 30 and 32

Go to most recent revision | Only display areas with differences | Details | Blame | View Log

Rev 30 Rev 32
#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

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.