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

Subversion Repositories s80186

[/] [s80186/] [trunk/] [python/] [py8086sim/] [Cpu.cpp] - Rev 2

Compare with Previous | Blame | View Log

// Copyright Jamie Iles, 2017
//
// This file is part of s80x86.
//
// s80x86 is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
//
// s80x86 is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
// GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with s80x86.  If not, see <http://www.gnu.org/licenses/>.
 
#include <boost/python.hpp>
#include <boost/version.hpp>
 
#include "RegisterFile.h"
#include "RTLCPU.h"
#include "SoftwareCPU.h"
#include "JTAGCPU.h"
 
using namespace boost::python;
 
typedef RTLCPU<verilator_debug_enabled> rtlcpu;
 
template <typename T>
void write_vector8(T *c,
                   uint16_t segment,
                   uint16_t addr,
                   boost::python::list vals)
{
    std::vector<uint8_t> vec;
 
    for (auto i = 0; i < boost::python::len(vals); ++i)
        vec.push_back(boost::python::extract<uint8_t>(vals[i]));
 
    c->write_vector8(segment, addr, vec);
}
 
template <typename T>
void write_vector16(T *c,
                    uint16_t segment,
                    uint16_t addr,
                    boost::python::list vals)
{
    std::vector<uint16_t> vec;
 
    for (auto i = 0; i < boost::python::len(vals); ++i)
        vec.push_back(boost::python::extract<uint16_t>(vals[i]));
 
    c->write_vector16(segment, addr, vec);
}
 
BOOST_PYTHON_MODULE(Cpu)
{
    class_<SoftwareCPU, boost::noncopyable>("Sim", init<const std::string &>())
        .def("reset", &SoftwareCPU::reset)
        .def("write_reg", &SoftwareCPU::write_reg)
        .def("read_reg", &SoftwareCPU::read_reg)
        .def("write_mem8", &SoftwareCPU::write_mem8)
        .def("write_mem16", &SoftwareCPU::write_mem16)
        .def("write_mem32", &SoftwareCPU::write_mem32)
        .def("read_mem8", &SoftwareCPU::read_mem8)
        .def("read_mem16", &SoftwareCPU::read_mem16)
        .def("read_mem32", &SoftwareCPU::read_mem32)
        .def("write_io8", &SoftwareCPU::write_io8)
        .def("write_io16", &SoftwareCPU::write_io16)
        .def("write_vector8", &write_vector8<SoftwareCPU>)
        .def("write_vector16", &write_vector16<SoftwareCPU>)
        .def("read_io8", &SoftwareCPU::read_io8)
        .def("read_io16", &SoftwareCPU::read_io16)
        .def("read_flags", &SoftwareCPU::read_flags)
        .def("write_flags", &SoftwareCPU::write_flags)
        .def("step", &SoftwareCPU::step)
        .def("has_trapped", &SoftwareCPU::has_trapped);
    class_<rtlcpu, boost::noncopyable>("RTLCPU", init<const std::string &>())
        .def("reset", &rtlcpu::reset)
        .def("write_reg", &rtlcpu::write_reg)
        .def("read_reg", &rtlcpu::read_reg)
        .def("write_mem8", &rtlcpu::write_mem8)
        .def("write_mem16", &rtlcpu::write_mem16)
        .def("write_mem32", &rtlcpu::write_mem32)
        .def("read_mem8", &rtlcpu::read_mem8)
        .def("read_mem16", &rtlcpu::read_mem16)
        .def("read_mem32", &rtlcpu::read_mem32)
        .def("write_vector8", &write_vector8<rtlcpu>)
        .def("write_vector16", &write_vector16<rtlcpu>)
        .def("write_io8", &rtlcpu::write_io8)
        .def("write_io16", &rtlcpu::write_io16)
        .def("read_io8", &rtlcpu::read_io8)
        .def("read_io16", &rtlcpu::read_io16)
        .def("read_flags", &rtlcpu::read_flags)
        .def("write_flags", &rtlcpu::write_flags)
        .def("step", &rtlcpu::step)
        .def("idle", &rtlcpu::idle)
        .def("time_step", &rtlcpu::time_step)
        .def("has_trapped", &rtlcpu::has_trapped);
    class_<JTAGCPU, boost::noncopyable>("JTAGCPU", init<const std::string &>())
        .def("reset", &JTAGCPU::reset)
        .def("write_reg", &JTAGCPU::write_reg)
        .def("read_reg", &JTAGCPU::read_reg)
        .def("write_mem8", &JTAGCPU::write_mem8)
        .def("write_mem16", &JTAGCPU::write_mem16)
        .def("write_mem32", &JTAGCPU::write_mem32)
        .def("read_mem8", &JTAGCPU::read_mem8)
        .def("read_mem16", &JTAGCPU::read_mem16)
        .def("read_mem32", &JTAGCPU::read_mem32)
        .def("write_vector8", &write_vector8<JTAGCPU>)
        .def("write_vector16", &write_vector16<JTAGCPU>)
        .def("write_io8", &JTAGCPU::write_io8)
        .def("write_io16", &JTAGCPU::write_io16)
        .def("read_io8", &JTAGCPU::read_io8)
        .def("read_io16", &JTAGCPU::read_io16)
        .def("read_flags", &JTAGCPU::read_flags)
        .def("write_flags", &JTAGCPU::write_flags)
        .def("step", &JTAGCPU::step)
        .def("has_trapped", &JTAGCPU::has_trapped);
    enum_<GPR>("GPR")
        .value("AX", AX)
        .value("CX", CX)
        .value("DX", DX)
        .value("BX", BX)
        .value("SP", SP)
        .value("BP", BP)
        .value("SI", SI)
        .value("DI", DI)
        .value("IP", IP)
        .value("ES", ES)
        .value("CS", CS)
        .value("SS", SS)
        .value("DS", DS)
        .value("AL", AL)
        .value("CL", CL)
        .value("DL", DL)
        .value("BL", BL)
        .value("AH", AH)
        .value("CH", CH)
        .value("DH", DH)
        .value("BH", BH);
    enum_<Flag>("Flag")
        .value("CF", CF)
        .value("PF", PF)
        .value("AF", AF)
        .value("ZF", ZF)
        .value("SF", SF)
        .value("TF", TF)
        .value("IF", IF)
        .value("DF", DF)
        .value("OF", OF);
}
 

Compare with Previous | Blame | View Log

powered by: WebSVN 2.1.0

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