integrate z80

This commit is contained in:
kirjavascript 2023-03-01 22:51:51 +00:00
parent 5a02599c1b
commit c691d74f52
5 changed files with 39 additions and 10 deletions

7
Cargo.lock generated
View file

@ -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"

View file

@ -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

View file

@ -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" ] }

View file

@ -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 */},

View file

@ -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 {