use uxn::{DeviceHandler, Uxn}; pub use uxn; pub mod device; mod ram; use self::device::{ console::{self, Console}, controller::Controller, datetime::{self, Datetime}, file::File, mouse::Mouse, screen::{self, Screen}, system::System, }; pub struct Varvara { pub system: System, pub console: Console, // pub screen: Screen, pub controller: Controller, pub mouse: Mouse, pub file0: File, pub file1: File, pub datetime: Datetime, } impl DeviceHandler for Varvara where C: console::Handler, // S: screen::Handler, D: datetime::Handler, { fn device_in(&mut self, _uxn: &mut Uxn, addr: u8) -> u8 { // println!("{addr:02x} DEI"); match addr { // System 0x00 => self.system.halt.msb(), 0x01 => self.system.halt.lsb(), 0x04 => self.system.title.msb(), 0x05 => self.system.title.lsb(), 0x08 => 0, //self.screen.palette.r_msb(), 0x09 => 0, //self.screen.palette.r_lsb(), 0x0a => 0, //self.screen.palette.g_msb(), 0x0b => 0, //self.screen.palette.g_lsb(), 0x0c => 0, //self.screen.palette.b_msb(), 0x0d => 0, //self.screen.palette.b_lsb(), 0x0f => self.system.state, // Console 0x10 => self.console.vector.msb(), 0x11 => self.console.vector.lsb(), 0x12 => self.console.read, // Screen 0x20 => 0, //self.screen.vector.msb(), 0x21 => 0, //self.screen.vector.lsb(), 0x22 => 0, //self.screen.width.msb(), 0x23 => 0, //self.screen.width.lsb(), 0x24 => 0, //self.screen.height.msb(), 0x25 => 0, //self.screen.height.lsb(), 0x26 => 0, //self.screen.auto, 0x28 => 0, //self.screen.x.msb(), 0x29 => 0, //self.screen.x.lsb(), 0x2a => 0, //self.screen.y.msb(), 0x2b => 0, //self.screen.y.lsb(), 0x2c => 0, //self.screen.addr.msb(), 0x2d => 0, //self.screen.addr.lsb(), 0x2e => Default::default(), 0x2f => Default::default(), // Audio 0x30..=0x6f => Default::default(), // Controller 0x80 => self.controller.vector.msb(), 0x81 => self.controller.vector.lsb(), 0x82 => self.controller.button, 0x83 => self.controller.key, // Mouse 0x90 => self.mouse.vector.msb(), 0x91 => self.mouse.vector.lsb(), 0x92 => self.mouse.x.msb(), 0x93 => self.mouse.x.lsb(), 0x94 => self.mouse.y.msb(), 0x95 => self.mouse.y.lsb(), 0x9a => self.mouse.scroll_x.msb(), 0x9b => self.mouse.scroll_x.lsb(), 0x9c => self.mouse.scroll_y.msb(), 0x9d => self.mouse.scroll_y.lsb(), // File0 0xa0 => self.file0.vector.msb(), 0xa1 => self.file0.vector.lsb(), 0xa2 => self.file0.success.msb(), 0xa3 => self.file0.success.lsb(), 0xa4 => self.file0.stat_addr.msb(), 0xa5 => self.file0.stat_addr.lsb(), 0xa6 => todo!(".File0/delete DEI"), 0xa7 => todo!(".File0/append DEI"), 0xa8 => self.file0.name_addr.msb(), 0xa9 => self.file0.name_addr.lsb(), 0xaa => self.file0.length.msb(), 0xab => self.file0.length.lsb(), 0xac..=0xad => todo!(".File0/read DEI"), 0xae..=0xaf => todo!(".File0/write DEI"), // File1 0xb0..=0xbf => todo!("File1 DEI"), // Datetime 0xc0 => self.datetime.year().msb(), 0xc1 => self.datetime.year().lsb(), 0xc2 => self.datetime.month(), 0xc3 => self.datetime.day(), 0xc4 => self.datetime.hour(), 0xc5 => self.datetime.minute(), 0xc6 => self.datetime.second(), 0xc7 => self.datetime.day_of_week(), 0xc8 => self.datetime.day_of_year().msb(), 0xc9 => self.datetime.day_of_year().lsb(), 0xca => self.datetime.is_dst(), _ => todo!("{addr:02x} DEI"), } } fn device_out(&mut self, uxn: &mut Uxn, addr: u8, val: u8) { // println!("{val:02x} {addr:02x} DEO"); match addr { // System 0x00 => self.system.halt.set_msb(val), 0x01 => self.system.halt.set_lsb(val), 0x04 => self.system.title.set_msb(val), 0x05 => self.system.title.set_lsb(val), 0x08 => {},//self.screen.palette.set_r_msb(val), 0x09 => {},//self.screen.palette.set_r_lsb(val), 0x0a => {},//self.screen.palette.set_g_msb(val), 0x0b => {},//self.screen.palette.set_g_lsb(val), 0x0c => {},//self.screen.palette.set_b_msb(val), 0x0d => {},//self.screen.palette.set_b_lsb(val), 0x0e => { if val != 0 { println!("wst: {:?}", &uxn.wst.data[..uxn.wst.ptr as usize]); println!("rst: {:?}", &uxn.rst.data[..uxn.rst.ptr as usize]); } } 0x0f => self.system.state = val, // Console 0x10 => self.console.vector.set_msb(val), 0x11 => self.console.vector.set_lsb(val), 0x18 => self.console.write(val), 0x19 => self.console.error(val), // Screen 0x20 => {},//self.screen.vector.set_msb(val), 0x21 => {},//self.screen.vector.set_lsb(val), 0x22 => {},//self.screen.width.set_msb(val), 0x23 => {},/*{ self.screen.width.set_lsb(val); self.screen.adapt_size(); }*/ 0x24 => {},//self.screen.height.set_msb(val), 0x25 => {},/*{ self.screen.height.set_lsb(val); self.screen.adapt_size(); }*/ 0x26 => {},//self.screen.auto = val, 0x27 => {} 0x28 => {},//self.screen.x.set_msb(val), 0x29 => {},//self.screen.x.set_lsb(val), 0x2a => {},//self.screen.y.set_msb(val), 0x2b => {},//self.screen.y.set_lsb(val), 0x2c => {},//self.screen.addr.set_msb(val), 0x2d => {},//self.screen.addr.set_lsb(val), 0x2e => {},//self.screen.draw_pixel(val), 0x2f => {},/*{ self.screen.draw_sprite(val, uxn.ram()); }*/ // Audio 0x30..=0x6f => {} // Controller 0x80 => self.controller.vector.set_msb(val), 0x81 => self.controller.vector.set_lsb(val), // Mouse 0x90 => self.mouse.vector.set_msb(val), 0x91 => self.mouse.vector.set_lsb(val), // File0 0xa0 => self.file0.vector.set_msb(val), 0xa1 => self.file0.vector.set_lsb(val), 0xa2 => self.file0.success.set_msb(val), 0xa3 => self.file0.success.set_lsb(val), 0xa4 => self.file0.stat_addr.set_msb(val), 0xa5 => { self.file0.stat_addr.set_lsb(val); self.file0.stat(&uxn.ram); } 0xa6 => self.file0.delete(&uxn.ram), 0xa7 => todo!("File0/append DEO"), 0xa8 => self.file0.name_addr.set_msb(val), 0xa9 => { self.file0.name_addr.set_lsb(val); let res = self.file0.init_name(&uxn.ram); } 0xaa => self.file0.length.set_msb(val), 0xab => self.file0.length.set_lsb(val), 0xac..=0xad => todo!("File0/read DEO"), 0xae..=0xaf => todo!("File0/write DEO"), // File1 0xb0..=0xbf => todo!("File1 DEO"), _ => todo!("{addr:02x} DEO"), } } } trait Short { fn msb(&self) -> u8; fn lsb(&self) -> u8; fn set_msb(&mut self, msb: u8); fn set_lsb(&mut self, lsb: u8); } impl Short for u16 { fn msb(&self) -> u8 { ((*self & 0xff00) >> 8) as u8 } fn lsb(&self) -> u8 { (*self & 0x00ff) as u8 } fn set_msb(&mut self, msb: u8) { *self = ((msb as u16) << 8) | (*self & 0x00ff); } fn set_lsb(&mut self, lsb: u8) { *self = (*self & 0xff00) | (lsb as u16); } }