Skip to content

Commit 3ddde47

Browse files
committed
clean up public API
1 parent 9b19bca commit 3ddde47

File tree

3 files changed

+49
-58
lines changed

3 files changed

+49
-58
lines changed

README.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22

33
A fast and accurate instruction-stepped Z80 emulator written in C11 and ported to Rust with c2rust and manual refactoring.
44

5-
The Rust version performs at the same speed as the C11 version in benchmarks.
5+
The Rust version appears to run about 25% faster than the C version when benchmarked on my machine.
66

77
This emulator passes both the ZEXDOC and ZEXALL Z80 instruction tests. It has also been verified correct against VisualZ80, and is known to run the entire ColecoVision, SG-1000, Master System, and Game Gear libraries. Additionally, it has been successfully integrated into Mega Drive/Genesis and Neo Geo emulators with unknown (but likely high or perfect) compatibility.
88

lib.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55

66

77
mod z80;
8-
pub use z80::*;
8+
pub use self::z80::*;
99

1010
#[cfg(test)]
1111
mod z80_tests;

z80.rs

Lines changed: 47 additions & 56 deletions
Original file line numberDiff line numberDiff line change
@@ -150,9 +150,6 @@ impl<T: Z80_io> Z80<T> {
150150
self.test_finished = false;
151151
}
152152
}
153-
pub fn step(&mut self) -> u32 {
154-
unsafe { step_s(self) }
155-
}
156153
fn internal_port_in(&self, addr: u16) -> u8 {
157154
#[cfg(test)]
158155
unsafe {
@@ -183,6 +180,50 @@ impl<T: Z80_io> Z80<T> {
183180
}
184181
self.ctrl.port_out(addr, value);
185182
}
183+
pub fn step(&mut self) -> u32 {
184+
unsafe { step_s(self) }
185+
}
186+
pub fn reset(&mut self) {
187+
self.pc = 0 as i32 as uint16_t;
188+
self.mem_ptr = 0 as i32 as uint16_t;
189+
self.i = 0 as i32 as uint8_t;
190+
self.r = 0 as i32 as uint8_t;
191+
self.interrupt_mode = 0 as i32 as uint8_t;
192+
self.iff_delay = 0 as i32 as uint8_t;
193+
self.iff1 = 0 as i32 != 0;
194+
self.iff2 = 0 as i32 != 0;
195+
self.halted = 0 as i32 != 0;
196+
self.nmi_pending = 0 as i32 as uint8_t;
197+
}
198+
199+
pub fn assert_irq(&mut self, mut data: uint8_t) {
200+
self
201+
.irq_pending = (self.irq_pending as i32 | ASSERT as i32)
202+
as uint8_t;
203+
self.irq_data = data;
204+
}
205+
pub fn assert_nmi(&mut self) {
206+
self
207+
.nmi_pending = (self.nmi_pending as i32 | ASSERT as i32)
208+
as uint8_t;
209+
}
210+
pub fn pulse_nmi(&mut self) {
211+
self
212+
.nmi_pending = (self.nmi_pending as i32 | PULSE as i32)
213+
as uint8_t;
214+
}
215+
pub fn clr_nmi(&mut self) {
216+
self.nmi_pending = 0 as i32 as uint8_t;
217+
}
218+
pub fn pulse_irq(&mut self, mut data: uint8_t) {
219+
self
220+
.irq_pending = (self.irq_pending as i32 | PULSE as i32)
221+
as uint8_t;
222+
self.irq_data = data;
223+
}
224+
pub fn clr_irq(&mut self) {
225+
self.irq_pending = 0 as i32 as uint8_t;
226+
}
186227
}
187228

188229
#[derive(Copy, Clone)]
@@ -1101,19 +1142,6 @@ unsafe fn process_interrupts<T: Z80_io>(z: *mut Z80<T>) -> u32 {
11011142
}
11021143
return cyc;
11031144
}
1104-
#[no_mangle]
1105-
pub unsafe fn reset<T: Z80_io>(z: *mut Z80<T>) {
1106-
(*z).pc = 0 as i32 as uint16_t;
1107-
(*z).mem_ptr = 0 as i32 as uint16_t;
1108-
(*z).i = 0 as i32 as uint8_t;
1109-
(*z).r = 0 as i32 as uint8_t;
1110-
(*z).interrupt_mode = 0 as i32 as uint8_t;
1111-
(*z).iff_delay = 0 as i32 as uint8_t;
1112-
(*z).iff1 = 0 as i32 != 0;
1113-
(*z).iff2 = 0 as i32 != 0;
1114-
(*z).halted = 0 as i32 != 0;
1115-
(*z).nmi_pending = 0 as i32 as uint8_t;
1116-
}
11171145
unsafe fn step_s<T: Z80_io>(z: *mut Z80<T>) -> u32 {
11181146
let mut cyc: u32 = 0;
11191147
if (*z).halted {
@@ -1125,16 +1153,13 @@ unsafe fn step_s<T: Z80_io>(z: *mut Z80<T>) -> u32 {
11251153
cyc = cyc.wrapping_add(process_interrupts(z));
11261154
return cyc;
11271155
}
1128-
#[no_mangle]
1129-
pub unsafe fn set_pc<T: Z80_io>(z: *mut Z80<T>, mut pc: uint16_t) {
1156+
unsafe fn _set_pc<T: Z80_io>(z: *mut Z80<T>, mut pc: uint16_t) {
11301157
(*z).pc = pc;
11311158
}
1132-
#[no_mangle]
1133-
pub unsafe fn set_sp<T: Z80_io>(z: *mut Z80<T>, mut sp: uint16_t) {
1159+
unsafe fn _set_sp<T: Z80_io>(z: *mut Z80<T>, mut sp: uint16_t) {
11341160
(*z).sp = sp;
11351161
}
1136-
#[no_mangle]
1137-
pub unsafe fn step_n<T: Z80_io>(
1162+
unsafe fn _step_n<T: Z80_io>(
11381163
z: *mut Z80<T>,
11391164
mut cycles: u32,
11401165
) -> u32 {
@@ -1144,40 +1169,6 @@ pub unsafe fn step_n<T: Z80_io>(
11441169
}
11451170
return cyc;
11461171
}
1147-
#[no_mangle]
1148-
pub unsafe fn assert_nmi<T: Z80_io>(z: *mut Z80<T>) {
1149-
(*z)
1150-
.nmi_pending = ((*z).nmi_pending as i32 | ASSERT as i32)
1151-
as uint8_t;
1152-
}
1153-
#[no_mangle]
1154-
pub unsafe fn pulse_nmi<T: Z80_io>(z: *mut Z80<T>) {
1155-
(*z)
1156-
.nmi_pending = ((*z).nmi_pending as i32 | PULSE as i32)
1157-
as uint8_t;
1158-
}
1159-
#[no_mangle]
1160-
pub unsafe fn clr_nmi<T: Z80_io>(z: *mut Z80<T>) {
1161-
(*z).nmi_pending = 0 as i32 as uint8_t;
1162-
}
1163-
#[no_mangle]
1164-
pub unsafe fn assert_irq<T: Z80_io>(z: *mut Z80<T>, mut data: uint8_t) {
1165-
(*z)
1166-
.irq_pending = ((*z).irq_pending as i32 | ASSERT as i32)
1167-
as uint8_t;
1168-
(*z).irq_data = data;
1169-
}
1170-
#[no_mangle]
1171-
pub unsafe fn pulse_irq<T: Z80_io>(z: *mut Z80<T>, mut data: uint8_t) {
1172-
(*z)
1173-
.irq_pending = ((*z).irq_pending as i32 | PULSE as i32)
1174-
as uint8_t;
1175-
(*z).irq_data = data;
1176-
}
1177-
#[no_mangle]
1178-
pub unsafe fn clr_irq<T: Z80_io>(z: *mut Z80<T>) {
1179-
(*z).irq_pending = 0 as i32 as uint8_t;
1180-
}
11811172
unsafe fn exec_opcode<T: Z80_io>(z: *mut Z80<T>, mut opcode: uint8_t) -> u32 {
11821173
let mut cyc: u32 = 0;
11831174
inc_r(z);

0 commit comments

Comments
 (0)