Skip to main content

chip_eight/emulator/
quirks.rs

1/// Modern or Legacy SuperChip behaviour, I can't get it to work entirely correctly.
2#[derive(Debug, Clone)]
3pub enum SuperChipBehaviour {
4    Modern,
5    Legacy,
6}
7
8/// The preferred predefined set of behaviours.
9#[derive(Debug, Clone)]
10pub enum QuirksMode {
11    Chip8,
12    SuperChip(SuperChipBehaviour),
13}
14
15/// A customisable set of behaviours.
16#[derive(Debug, Clone)]
17pub struct QuirksFields {
18    pub vf_reset: bool,
19    pub memory: bool,
20    // NOTE: I actually don't understand what this is supposed to do
21    // I have read https://github.com/Timendus/chip8-test-suite/blob/main/legacy-superchip.md
22    // but don't seem to be getting it.
23    pub disp_wait: bool,
24    pub clipping: bool,
25    pub shifting: bool,
26    pub jumping: bool,
27}
28
29impl From<QuirksMode> for QuirksFields {
30    fn from(value: QuirksMode) -> Self {
31        match value {
32            QuirksMode::Chip8 => QuirksFields {
33                vf_reset: true,
34                memory: true,
35                disp_wait: true,
36                clipping: true,
37                shifting: false,
38                jumping: false,
39            },
40            QuirksMode::SuperChip(super_chip_behaviour) => match super_chip_behaviour {
41                SuperChipBehaviour::Modern => QuirksFields {
42                    vf_reset: false,
43                    memory: false,
44                    disp_wait: true,
45                    clipping: true,
46                    shifting: true,
47                    jumping: true,
48                },
49                SuperChipBehaviour::Legacy => QuirksFields {
50                    vf_reset: false,
51                    memory: false,
52                    disp_wait: false,
53                    clipping: true,
54                    shifting: true,
55                    jumping: true,
56                },
57            },
58        }
59    }
60}