diff options
author | Astatin <[email protected]> | 2024-09-14 23:49:32 +0900 |
---|---|---|
committer | Astatin <astatin@redacted> | 2024-09-14 23:49:32 +0900 |
commit | 7101d14f3bcc0af29b8d51b1f5d58689fee1a571 (patch) | |
tree | f0d24574e6ec3153a3f4a5969233946be43719a6 /src/state.rs | |
parent | 249921a2094d172e94543446e2af11dcba5075e8 (diff) |
Add keyboard support & start supporting serial communication (but tetris doesn't work in 2p)
Diffstat (limited to 'src/state.rs')
-rw-r--r-- | src/state.rs | 44 |
1 files changed, 41 insertions, 3 deletions
diff --git a/src/state.rs b/src/state.rs index d2f93d9..49bea41 100644 --- a/src/state.rs +++ b/src/state.rs @@ -1,6 +1,7 @@ use crate::audio::Audio; use crate::consts::{PROGRAM_START_ADDRESS, STACK_START_ADDRESS}; use crate::display::Display; +use crate::serial::Serial; use std::fs::File; use std::io::{Read, Write}; @@ -127,6 +128,8 @@ pub struct Memory { pub audio: Audio, + pub serial: Box<dyn Serial>, + pub ime: bool, pub div: u8, @@ -146,6 +149,10 @@ pub struct Memory { pub timer_enabled: bool, pub timer_speed: u8, + + pub serial_data: u8, + + pub serial_control: u8, } #[derive(Debug)] @@ -155,8 +162,13 @@ pub enum MemError { NotUsable, } +mod serial_control_flags { + pub const CLOCK_SELECT: u8 = 0b1; + pub const TRANSFER_ENABLE: u8 = 0b10000000; +} + impl Memory { - pub fn new() -> Self { + pub fn new(serial: Box<dyn Serial>) -> Self { let mut display = Display::new(); display.cls(); @@ -190,6 +202,32 @@ impl Memory { tma: 0, timer_enabled: false, timer_speed: 0, + serial, + serial_control: 0, + serial_data: 0, + } + } + + pub fn update_serial(&mut self) { + if self.serial.new_transfer() { + println!("TRANSFER ENABLED"); + self.serial_control |= serial_control_flags::TRANSFER_ENABLE; + } + + if self.serial.clock_master() { + self.serial_control |= serial_control_flags::CLOCK_SELECT; + } else { + self.serial_control &= !serial_control_flags::CLOCK_SELECT; + } + + if (self.serial_control & serial_control_flags::CLOCK_SELECT != 0 + || self.serial.new_transfer()) + && self.serial_control & serial_control_flags::TRANSFER_ENABLE != 0 + { + self.serial.write(self.serial_data); + self.serial_data = self.serial.read(); + self.serial_control &= !serial_control_flags::TRANSFER_ENABLE; + self.io[0x0f] |= 0b1000; } } @@ -331,8 +369,8 @@ pub struct GBState { } impl GBState { - pub fn new() -> Self { - let mem = Memory::new(); + pub fn new(serial: Box<dyn Serial>) -> Self { + let mem = Memory::new(serial); Self { cpu: CPU::new(), |