1use ull::{Bus, Byte, Word};
2
3#[derive(Clone, Copy, Debug, PartialEq, Eq)]
6pub enum Phase {
7 Read,
8 Write,
9}
10
11#[derive(Clone, Copy, Debug, PartialEq, Eq, Default)]
13pub enum AccessType {
14 #[default]
15 DataRead,
16 DataWrite,
17 OpcodeFetch,
18 StackRead,
19 StackWrite,
20 InterruptVectorRead,
21 DmaRead,
22 DmaWrite,
23 DummyRead,
24}
25
26impl AccessType {
27 #[must_use]
28 pub const fn is_write(self) -> bool {
29 matches!(
30 self,
31 AccessType::DataWrite | AccessType::StackWrite | AccessType::DmaWrite
32 )
33 }
34
35 #[must_use]
36 pub const fn phase(self) -> Phase {
37 if self.is_write() {
38 Phase::Write
39 } else {
40 Phase::Read
41 }
42 }
43}
44
45pub trait ResetVectorExt {
46 fn set_reset_vector(&mut self, target: Word);
47}
48
49impl<B> ResetVectorExt for B
50where
51 B: Bus<Access = AccessType, Data = Byte>,
52{
53 fn set_reset_vector(&mut self, target: Word) {
54 self.write(Word(0xFFFC), target.lo(), AccessType::DataWrite);
55 self.write(Word(0xFFFD), target.hi(), AccessType::DataWrite);
56 }
57}