|
@@ -5,29 +5,60 @@ use structopt::StructOpt; |
|
|
#[structopt(name = "CERES-16", about = "16bit fantasy console")] |
|
|
#[structopt(name = "CERES-16", about = "16bit fantasy console")] |
|
|
struct Opt { |
|
|
struct Opt { |
|
|
/// times the screen should be scaled by |
|
|
/// times the screen should be scaled by |
|
|
#[structopt(short = "s", long = "scale", default_value = "2")] |
|
|
|
|
|
|
|
|
#[structopt(short = "s", long = "scale", default_value = "4")] |
|
|
scale_factor: usize, |
|
|
scale_factor: usize, |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
fn wrapper() -> Result<()> { |
|
|
fn wrapper() -> Result<()> { |
|
|
let opt = Opt::from_args(); |
|
|
let opt = Opt::from_args(); |
|
|
|
|
|
|
|
|
let mut ctx = offbrand::Context::new( |
|
|
let mut ctx = offbrand::Context::new( |
|
|
ceres_sys::SCREEN_WIDTH * opt.scale_factor, |
|
|
|
|
|
ceres_sys::SCREEN_HEIGHT * opt.scale_factor, |
|
|
|
|
|
|
|
|
ceres_sys::SCREEN_WIDTH, |
|
|
|
|
|
ceres_sys::SCREEN_HEIGHT, |
|
|
"CERES-16".to_owned(), |
|
|
"CERES-16".to_owned(), |
|
|
|
|
|
Some(opt.scale_factor), |
|
|
)?; |
|
|
)?; |
|
|
let sys = ceres_sys::System::init(); |
|
|
|
|
|
println!("{}", sys.registers); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
let mut sys = ceres_sys::System::init(); |
|
|
|
|
|
|
|
|
|
|
|
let mut colors: Vec<u16> = Vec::new(); |
|
|
|
|
|
|
|
|
|
|
|
for r in 0x0..0xf { |
|
|
|
|
|
for g in 0x0..0xf { |
|
|
|
|
|
for b in 0x0..0xf { |
|
|
|
|
|
colors.push((r << 8) | (g << 4) | b); |
|
|
|
|
|
} |
|
|
|
|
|
} |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
colors.iter().enumerate().for_each(|(addr, color)| { |
|
|
|
|
|
sys.video_memory[addr as u16] = *color; |
|
|
|
|
|
}); |
|
|
|
|
|
|
|
|
while ctx.is_open() { |
|
|
while ctx.is_open() { |
|
|
ctx.clear(None); |
|
|
ctx.clear(None); |
|
|
|
|
|
|
|
|
|
|
|
for x in 0..ceres_sys::SCREEN_WIDTH { |
|
|
|
|
|
for y in 0..ceres_sys::SCREEN_HEIGHT { |
|
|
|
|
|
let color = |
|
|
|
|
|
color_from_u16(sys.video_memory[(y * ceres_sys::SCREEN_WIDTH + x) as u16]); |
|
|
|
|
|
ctx.insert_pixel(x, y, color); |
|
|
|
|
|
} |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
ctx.present()?; |
|
|
ctx.present()?; |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
Ok(()) |
|
|
Ok(()) |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
fn color_from_u16(color: u16) -> Color { |
|
|
|
|
|
let r = (((color >> 8) & 0x000f) as u8) * 17; |
|
|
|
|
|
let g = (((color >> 4) & 0x000f) as u8) * 17; |
|
|
|
|
|
let b = ((color & 0x000f) as u8) * 17; |
|
|
|
|
|
Color { r, g, b } |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
fn main() { |
|
|
fn main() { |
|
|
if let Err(err) = wrapper() { |
|
|
if let Err(err) = wrapper() { |
|
|
eprintln!("error: {:?}", err); |
|
|
eprintln!("error: {:?}", err); |
|
|