mirror of
https://github.com/kirjavascript/trueLMAO.git
synced 2024-05-10 08:53:40 -04:00
integrate z80
This commit is contained in:
parent
5a02599c1b
commit
c691d74f52
7
Cargo.lock
generated
7
Cargo.lock
generated
|
@ -676,6 +676,7 @@ dependencies = [
|
|||
"instant",
|
||||
"r68k-emu",
|
||||
"r68k-tools",
|
||||
"z80",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
|
@ -2319,3 +2320,9 @@ name = "xml-rs"
|
|||
version = "0.8.4"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "d2d7d3948613f75c98fd9328cfdcc45acc4d360655289d0a7d4ec931392200a3"
|
||||
|
||||
[[package]]
|
||||
name = "z80"
|
||||
version = "1.0.2"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "5b0da1e980dcad2d81fc5d2a6384fc67997ecfa4a2263772e5ccc9a2faedc043"
|
||||
|
|
|
@ -10,4 +10,6 @@ trueLMAO is an in-progress Sega Megadrive (Genesis) emulator for web & native
|
|||
|
||||
### attribution
|
||||
|
||||
This project uses the 68k CPU from [marhel/r68k](https://github.com/marhel/r68k), and the Z80 CPU comes from [carmiker/jgz80](https://github.com/carmiker/jgz80) which was ported to Rust at [kirjavascript/z80](https://github.com/kirjavascript/z80) for this project
|
||||
This project uses the 68k CPU from [marhel/r68k](https://github.com/marhel/r68k)
|
||||
|
||||
The Z80 CPU comes from [carmiker/jgz80](https://github.com/carmiker/jgz80) which was ported to Rust at [kirjavascript/z80](https://github.com/kirjavascript/z80) for this project
|
||||
|
|
|
@ -6,4 +6,5 @@ edition = "2021"
|
|||
[dependencies]
|
||||
r68k-emu = { git = "https://github.com/marhel/r68k.git" }
|
||||
r68k-tools = { git = "https://github.com/marhel/r68k.git" }
|
||||
z80 = "1.0.2"
|
||||
instant = { version = "0.1.12", features = [ "wasm-bindgen" ] }
|
||||
|
|
|
@ -30,7 +30,7 @@ impl Mem {
|
|||
match address & 0xFFFFFF {
|
||||
0..=0x7FFFFF => self.rom.read_byte(address & 0x3FFFFF) as _,
|
||||
0x800000..=0x9FFFFF => /* reserved */ 0,
|
||||
0xA00000..=0xA03FFF => self.z80.read_byte(address) as _,
|
||||
0xA00000..=0xA03FFF => self.z80.read_byte(address as u16) as _,
|
||||
0xA04000..=0xA0FFFF => /* Z80 */ 0,
|
||||
0xA10000..=0xA1001F => self.io.read_byte(address) as _,
|
||||
0xA10020..=0xA10FFF => /* reserved */ 0,
|
||||
|
@ -58,7 +58,7 @@ impl Mem {
|
|||
match address & 0xFFFFFF {
|
||||
0..=0x3FFFFF => {/* ROM */},
|
||||
0x400000..=0x9FFFFF => {/* reserved */},
|
||||
0xA00000..=0xA03FFF => self.z80.write_byte(address, value),
|
||||
0xA00000..=0xA03FFF => self.z80.write_byte(address as u16, value as u8),
|
||||
0xA04000..=0xA0FFFF => {/* Z80 */},
|
||||
0xA10000..=0xA1001F => self.io.write_byte(address, value),
|
||||
0xA10020..=0xA10FFF => {/* reserved */},
|
||||
|
|
|
@ -1,26 +1,45 @@
|
|||
use z80::{Z80 as Zilog80, Z80_io};
|
||||
|
||||
pub struct Z80 {
|
||||
ram: [u8; 0x2000],
|
||||
cpu: Zilog80<Z80Mem>,
|
||||
bus_ack: bool,
|
||||
reset: bool,
|
||||
}
|
||||
|
||||
struct Z80Mem {
|
||||
ram: [u8; 0x2000],
|
||||
}
|
||||
|
||||
impl Z80_io for Z80Mem {
|
||||
fn read_byte(&self, address: u16) -> u8 {
|
||||
self.ram[address as usize & 0x1FFF]
|
||||
}
|
||||
|
||||
fn write_byte(&mut self, address: u16, value: u8) {
|
||||
self.ram[address as usize & 0x1FFF] = value as u8;
|
||||
}
|
||||
}
|
||||
|
||||
impl Z80 {
|
||||
pub fn new() -> Self {
|
||||
Self {
|
||||
ram: [0; 0x2000],
|
||||
cpu: Zilog80::new(Z80Mem {
|
||||
ram: [0; 0x2000],
|
||||
}),
|
||||
bus_ack: false,
|
||||
reset: false,
|
||||
}
|
||||
}
|
||||
|
||||
pub fn read_byte(&self, address: u32) -> u8 {
|
||||
self.ram[address as usize & 0x1FFF]
|
||||
pub fn read_byte(&self, address: u16) -> u8 {
|
||||
self.cpu.io.read_byte(address)
|
||||
}
|
||||
|
||||
pub fn write_byte(&mut self, address: u32, value: u32) {
|
||||
self.ram[address as usize & 0x1FFF] = value as u8;
|
||||
pub fn write_byte(&mut self, address: u16, value: u8) {
|
||||
self.cpu.io.write_byte(address, value);
|
||||
}
|
||||
|
||||
|
||||
pub fn ctrl_read(&self, address: u32) -> u8 {
|
||||
if address & 0xFFFF == 0x1100 {
|
||||
!(self.reset && self.bus_ack) as u8
|
||||
|
@ -31,7 +50,7 @@ impl Z80 {
|
|||
|
||||
pub fn ctrl_write(&mut self, mut address: u32, value: u32) {
|
||||
address &= 0xFFFF;
|
||||
self.ram[address as usize & 0x1FFF] = value as u8;
|
||||
self.cpu.io.ram[address as usize & 0x1FFF] = value as u8;
|
||||
if address == 0x1100 {
|
||||
self.bus_ack = value == 1;
|
||||
} else if address == 0x1200 {
|
||||
|
|
Loading…
Reference in a new issue