Skip to content

Commit 6310dcc

Browse files
committed
performance improvements
1 parent 7ec822c commit 6310dcc

8 files changed

Lines changed: 87 additions & 27 deletions

File tree

.github/workflows/ci.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,4 +23,4 @@ jobs:
2323
- uses: actions/checkout@v4
2424
- uses: Swatinem/rust-cache@v2
2525
- run: cargo build --package scamu --verbose
26-
- run: cargo test --package scamu --verbose
26+
- run: cargo test --package scamu --features cpu_logger --verbose

scami/src/app.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@ const MAX_CATCHUP_TICKS: u64 = MASTER_CLOCK as u64 / 30; // ≈ 2 frames at 60 H
3333

3434
pub(crate) struct AudioState {
3535
_handle: rodio::MixerDeviceSink,
36+
#[allow(unused)]
3637
pub(crate) player: rodio::Player,
3738
}
3839

scamu/Cargo.toml

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,9 @@ name = "scamu"
33
version = "0.1.0"
44
edition = "2024"
55

6+
[features]
7+
cpu_logger = []
8+
69
[lib]
710
name = "scamu"
811
crate-type = ["rlib", "staticlib", "dylib"]

scamu/src/hardware/cpu/addressing_modes/factories.rs

Lines changed: 32 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ use crate::hardware::{cpu::Cpu, cpu_bus::CpuBus};
88

99
use super::implementations::*;
1010

11+
#[allow(dead_code)]
1112
fn format_hex_u8(value: u8) -> String {
1213
format!("${value:02X}")
1314
}
@@ -19,7 +20,7 @@ fn format_hex_u8(value: u8) -> String {
1920
// format!("${:02X}", value as u8)
2021
// }
2122
// }
22-
23+
#[allow(dead_code)]
2324
fn format_hex_u16(value: u16) -> String {
2425
format!("${value:04X}")
2526
}
@@ -45,23 +46,27 @@ pub(crate) const ACCUMULATOR: fn(cpu: &Cpu, bus: &CpuBus) -> Box<AccumulatorAddr
4546
Box::new(AccumulatorAddressingMode {
4647
cpu_program_counter_offset: 0,
4748
cpu_additional_cycles_required: 0,
49+
#[cfg(feature = "cpu_logger")]
4850
display: format!("A"),
4951
})
5052
};
5153

5254
/// Immediate addressing mode
5355
///
5456
/// Gets the next byte as the argument
57+
#[allow(unused_variables)]
5558
pub(crate) const IMMEDIATE: fn(cpu: &Cpu, bus: &CpuBus) -> Box<MemoryAddressingMode> =
5659
|cpu: &Cpu, bus: &CpuBus| {
5760
let address = cpu.program_counter;
5861

62+
#[cfg(feature = "cpu_logger")]
5963
let value = bus.peek(address);
6064

6165
Box::new(MemoryAddressingMode {
6266
address,
6367
cpu_program_counter_offset: 1,
6468
cpu_additional_cycles_required: 0,
69+
#[cfg(feature = "cpu_logger")]
6570
display: format!("#{}", format_hex_u8(value)),
6671
})
6772
};
@@ -82,12 +87,14 @@ pub(crate) const ZERO_PAGE: fn(cpu: &Cpu, bus: &CpuBus) -> Box<MemoryAddressingM
8287
|cpu: &Cpu, bus: &CpuBus| {
8388
let address = bus.peek(cpu.program_counter) as u16;
8489

90+
#[cfg(feature = "cpu_logger")]
8591
let value = bus.peek(address);
8692

8793
Box::new(MemoryAddressingMode {
8894
address,
8995
cpu_program_counter_offset: 1,
9096
cpu_additional_cycles_required: 0,
97+
#[cfg(feature = "cpu_logger")]
9198
display: format!("{} = {value:02X}", format_hex_u8(address as u8),),
9299
})
93100
};
@@ -110,12 +117,14 @@ pub(crate) const ZERO_PAGE_X_OFFSET: fn(cpu: &Cpu, bus: &CpuBus) -> Box<MemoryAd
110117
let argument = cpu.program_counter;
111118
let address = bus.peek(argument);
112119
let offset_address = address.wrapping_add(cpu.x) as u16;
120+
#[cfg(feature = "cpu_logger")]
113121
let value = bus.peek(offset_address);
114122

115123
Box::new(MemoryAddressingMode {
116124
address: offset_address,
117125
cpu_program_counter_offset: 1,
118126
cpu_additional_cycles_required: 0,
127+
#[cfg(feature = "cpu_logger")]
119128
display: format!(
120129
"{},X @ {offset_address:02X} = {value:02X}",
121130
format_hex_u8(address as u8)
@@ -141,12 +150,14 @@ pub(crate) const ZERO_PAGE_Y_OFFSET: fn(cpu: &Cpu, bus: &CpuBus) -> Box<MemoryAd
141150
let argument = cpu.program_counter;
142151
let address = bus.peek(argument);
143152
let offset_address = address.wrapping_add(cpu.y) as u16;
153+
#[cfg(feature = "cpu_logger")]
144154
let value = bus.peek(offset_address);
145155

146156
Box::new(MemoryAddressingMode {
147157
address: offset_address,
148158
cpu_program_counter_offset: 1,
149159
cpu_additional_cycles_required: 0,
160+
#[cfg(feature = "cpu_logger")]
150161
display: format!(
151162
"{},Y @ {offset_address:02X} = {value:02X}",
152163
format_hex_u8(address as u8)
@@ -168,12 +179,14 @@ pub(crate) const ABSOLUTE: fn(cpu: &Cpu, bus: &CpuBus) -> Box<MemoryAddressingMo
168179
|cpu: &Cpu, bus: &CpuBus| {
169180
let address = bus.peek_u16(cpu.program_counter);
170181

182+
#[cfg(feature = "cpu_logger")]
171183
let value = bus.peek(address);
172184

173185
Box::new(MemoryAddressingMode {
174186
address,
175187
cpu_program_counter_offset: 2,
176188
cpu_additional_cycles_required: 0,
189+
#[cfg(feature = "cpu_logger")]
177190
display: format!("{} = {value:02X}", format_hex_u16(address)),
178191
})
179192
};
@@ -187,6 +200,7 @@ pub(crate) const ABSOLUTE_JMP: fn(cpu: &Cpu, bus: &CpuBus) -> Box<MemoryAddressi
187200
address,
188201
cpu_program_counter_offset: 2,
189202
cpu_additional_cycles_required: 0,
203+
#[cfg(feature = "cpu_logger")]
190204
display: format!("{}", format_hex_u16(address)),
191205
})
192206
};
@@ -202,6 +216,7 @@ pub(crate) const ABSOLUTE_JMP: fn(cpu: &Cpu, bus: &CpuBus) -> Box<MemoryAddressi
202216
// address,
203217
// cpu_program_counter_offset: 2,
204218
// cpu_additional_cycles_required: 0,
219+
// #[cfg(feature = "cpu_logger")]
205220
// display: format!("{}", format_hex_u16(address)),
206221
// })
207222
// };
@@ -220,6 +235,7 @@ pub(crate) const ABSOLUTE_X_OFFSET: fn(cpu: &Cpu, bus: &CpuBus) -> Box<MemoryAdd
220235
|cpu: &Cpu, bus: &CpuBus| {
221236
let address = bus.peek_u16(cpu.program_counter);
222237
let offset_address = address + cpu.x as u16;
238+
#[cfg(feature = "cpu_logger")]
223239
let value = bus.peek(offset_address);
224240

225241
let add_cycle = offset_address & 0xFF00 != address & 0xFF00;
@@ -228,6 +244,7 @@ pub(crate) const ABSOLUTE_X_OFFSET: fn(cpu: &Cpu, bus: &CpuBus) -> Box<MemoryAdd
228244
address: offset_address,
229245
cpu_program_counter_offset: 2,
230246
cpu_additional_cycles_required: add_cycle as u8,
247+
#[cfg(feature = "cpu_logger")]
231248
display: format!(
232249
"{},X @ {offset_address:04X} = {value:02X}",
233250
format_hex_u16(address)
@@ -249,6 +266,7 @@ pub(crate) const ABSOLUTE_Y_OFFSET: fn(cpu: &Cpu, bus: &CpuBus) -> Box<MemoryAdd
249266
|cpu: &Cpu, bus: &CpuBus| {
250267
let address = bus.peek_u16(cpu.program_counter);
251268
let offset_address = address.wrapping_add(cpu.y as u16);
269+
#[cfg(feature = "cpu_logger")]
252270
let value = bus.peek(offset_address);
253271

254272
let add_cycle = offset_address & 0xFF00 != address & 0xFF00;
@@ -257,6 +275,7 @@ pub(crate) const ABSOLUTE_Y_OFFSET: fn(cpu: &Cpu, bus: &CpuBus) -> Box<MemoryAdd
257275
address: offset_address,
258276
cpu_program_counter_offset: 2,
259277
cpu_additional_cycles_required: add_cycle as u8,
278+
#[cfg(feature = "cpu_logger")]
260279
display: format!(
261280
"{},Y @ {offset_address:04X} = {value:02X}",
262281
format_hex_u16(address)
@@ -286,6 +305,7 @@ pub(crate) const ABSOLUTE_Y_OFFSET: fn(cpu: &Cpu, bus: &CpuBus) -> Box<MemoryAdd
286305
// address: offset_address,
287306
// cpu_program_counter_offset: 2,
288307
// cpu_additional_cycles_required: add_cycle as u8,
308+
// #[cfg(feature = "cpu_logger")]
289309
// display: format!(
290310
// "{},Y @ {offset_address:04X} = {value:02X}",
291311
// format_hex_u16(address)
@@ -337,6 +357,7 @@ pub(crate) const INDIRECT: fn(cpu: &Cpu, bus: &CpuBus) -> Box<MemoryAddressingMo
337357
address,
338358
cpu_program_counter_offset: 2,
339359
cpu_additional_cycles_required: 0,
360+
#[cfg(feature = "cpu_logger")]
340361
display: format!("({}) = {address:04X}", format_hex_u16(pointer_address)),
341362
})
342363
};
@@ -357,12 +378,14 @@ pub(crate) const INDIRECT_X_OFFSET: fn(cpu: &Cpu, bus: &CpuBus) -> Box<MemoryAdd
357378
let high = bus.peek(high_address) as u16;
358379
let address = (high << 8) | low;
359380

381+
#[cfg(feature = "cpu_logger")]
360382
let value = bus.peek(address);
361383

362384
Box::new(MemoryAddressingMode {
363385
address,
364386
cpu_program_counter_offset: 1,
365387
cpu_additional_cycles_required: 0,
388+
#[cfg(feature = "cpu_logger")]
366389
display: format!(
367390
"({},X) @ {pointer_address:02X} = {address:04X} = {value:02X}",
368391
format_hex_u8(argument)
@@ -385,13 +408,16 @@ pub(crate) const INDIRECT_Y_OFFSET: fn(cpu: &Cpu, bus: &CpuBus) -> Box<MemoryAdd
385408
let offset_address = address.wrapping_add(cpu.y as u16);
386409
let add_cycle = offset_address & 0xFF00 != address & 0xFF00;
387410

411+
#[cfg(feature = "cpu_logger")]
388412
let value = bus.peek(offset_address);
389413

390414
Box::new(MemoryAddressingMode {
391415
address: offset_address,
392416
cpu_program_counter_offset: 1,
393417
cpu_additional_cycles_required: add_cycle as u8,
418+
#[cfg(feature = "cpu_logger")]
394419
// display: format!("({}),y", format_hex_u16(address)),
420+
#[cfg(feature = "cpu_logger")]
395421
display: format!(
396422
"({}),Y = {address:04X} @ {offset_address:04X} = {value:02X}",
397423
format_hex_u8(argument as u8)
@@ -420,7 +446,9 @@ pub(crate) const INDIRECT_Y_OFFSET: fn(cpu: &Cpu, bus: &CpuBus) -> Box<MemoryAdd
420446
// address: offset_address,
421447
// cpu_program_counter_offset: 1,
422448
// cpu_additional_cycles_required: add_cycle as u8,
449+
// #[cfg(feature = "cpu_logger")]
423450
// // display: format!("({}),y", format_hex_u16(address)),
451+
// #[cfg(feature = "cpu_logger")]
424452
// display: format!(
425453
// "({}),Y = {address:04X} @ {offset_address:04X} = {value:02X}",
426454
// format_hex_u8(argument as u8)
@@ -431,16 +459,19 @@ pub(crate) const INDIRECT_Y_OFFSET: fn(cpu: &Cpu, bus: &CpuBus) -> Box<MemoryAdd
431459
/// Relative addressing mode
432460
///
433461
/// Only branch instructions use this.
462+
#[allow(unused_variables)]
434463
pub(crate) const RELATIVE: fn(cpu: &Cpu, bus: &CpuBus) -> Box<RelativeAddressingMode> =
435464
|cpu: &Cpu, bus: &CpuBus| {
436465
let address = cpu.program_counter;
437466

467+
#[cfg(feature = "cpu_logger")]
438468
let value = bus.peek(address) as i8;
439469

440470
Box::new(RelativeAddressingMode {
441471
address,
442472
cpu_program_counter_offset: 1,
443473
cpu_additional_cycles_required: 0,
474+
#[cfg(feature = "cpu_logger")]
444475
display: format!(
445476
"{}",
446477
format_hex_u16(((address as i32) + (value as i32) + 1) as u16)

scamu/src/hardware/cpu/addressing_modes/implementations.rs

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,7 @@ impl AddressingMode<()> for ImplicitAddressingMode {
3232

3333
fn write(&mut self, _: (), _: &mut Cpu, _: &mut CpuBus) {}
3434

35+
#[cfg(feature = "cpu_logger")]
3536
fn display(&self) -> &str {
3637
""
3738
}
@@ -40,6 +41,7 @@ impl AddressingMode<()> for ImplicitAddressingMode {
4041
pub(crate) struct AccumulatorAddressingMode {
4142
pub(crate) cpu_program_counter_offset: u16,
4243
pub(crate) cpu_additional_cycles_required: u8,
44+
#[cfg(feature = "cpu_logger")]
4345
pub(crate) display: String,
4446
}
4547

@@ -64,6 +66,7 @@ impl AddressingMode<u8> for AccumulatorAddressingMode {
6466
cpu.accumulator = new_value;
6567
}
6668

69+
#[cfg(feature = "cpu_logger")]
6770
fn display(&self) -> &str {
6871
&self.display
6972
}
@@ -73,6 +76,7 @@ pub(crate) struct MemoryAddressingMode {
7376
pub(crate) address: u16,
7477
pub(crate) cpu_program_counter_offset: u16,
7578
pub(crate) cpu_additional_cycles_required: u8,
79+
#[cfg(feature = "cpu_logger")]
7680
pub(crate) display: String,
7781
}
7882

@@ -97,6 +101,7 @@ impl AddressingMode<u8> for MemoryAddressingMode {
97101
bus.write(self.address, new_value);
98102
}
99103

104+
#[cfg(feature = "cpu_logger")]
100105
fn display(&self) -> &str {
101106
&self.display
102107
}
@@ -126,6 +131,7 @@ impl AddressingMode<MemoryAddress> for MemoryAddressingMode {
126131
bus.write(self.address, new_value.value);
127132
}
128133

134+
#[cfg(feature = "cpu_logger")]
129135
fn display(&self) -> &str {
130136
&self.display
131137
}
@@ -135,6 +141,7 @@ pub(crate) struct RelativeAddressingMode {
135141
pub(crate) address: u16,
136142
pub(crate) cpu_program_counter_offset: u16,
137143
pub(crate) cpu_additional_cycles_required: u8,
144+
#[cfg(feature = "cpu_logger")]
138145
pub(crate) display: String,
139146
}
140147

@@ -159,6 +166,7 @@ impl AddressingMode<i8> for RelativeAddressingMode {
159166
bus.write(self.address, new_value as u8);
160167
}
161168

169+
#[cfg(feature = "cpu_logger")]
162170
fn display(&self) -> &str {
163171
&self.display
164172
}

scamu/src/hardware/cpu/addressing_modes/mod.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,5 +23,6 @@ pub(super) trait AddressingMode<T: Debug> {
2323
fn cpu_add_another_required_cycle(&mut self);
2424
fn read(&self, cpu: &Cpu, bus: &CpuBus) -> T;
2525
fn write(&mut self, new_value: T, cpu: &mut Cpu, bus: &mut CpuBus);
26+
#[cfg(feature = "cpu_logger")]
2627
fn display(&self) -> &str;
2728
}

0 commit comments

Comments
 (0)