mirror of
https://github.com/italicsjenga/gba.git
synced 2024-12-24 03:11:29 +11:00
234 lines
7.9 KiB
Rust
234 lines
7.9 KiB
Rust
|
use crate::macros::{
|
||
|
pub_const_fn_new_zeroed, u16_bool_field, u16_enum_field, u16_int_field,
|
||
|
};
|
||
|
|
||
|
/// An RGB555 color value (packed into `u16`).
|
||
|
#[derive(Debug, Clone, Copy, Default, PartialEq, Eq, PartialOrd, Ord, Hash)]
|
||
|
#[repr(transparent)]
|
||
|
pub struct Color(pub u16);
|
||
|
impl Color {
|
||
|
pub_const_fn_new_zeroed!();
|
||
|
u16_int_field!(0 - 4, red, with_red);
|
||
|
u16_int_field!(5 - 9, green, with_green);
|
||
|
u16_int_field!(10 - 14, blue, with_blue);
|
||
|
}
|
||
|
|
||
|
#[derive(Debug, Clone, Copy, Default, PartialEq, Eq, PartialOrd, Ord, Hash)]
|
||
|
#[repr(u16)]
|
||
|
pub enum VideoMode {
|
||
|
#[default]
|
||
|
_0 = 0,
|
||
|
_1 = 1,
|
||
|
_2 = 2,
|
||
|
_3 = 3,
|
||
|
_4 = 4,
|
||
|
_5 = 5,
|
||
|
}
|
||
|
|
||
|
#[derive(Debug, Clone, Copy, Default, PartialEq, Eq, PartialOrd, Ord, Hash)]
|
||
|
#[repr(transparent)]
|
||
|
pub struct DisplayControl(u16);
|
||
|
impl DisplayControl {
|
||
|
pub_const_fn_new_zeroed!();
|
||
|
u16_enum_field!(0 - 2: VideoMode, video_mode, with_video_mode);
|
||
|
u16_bool_field!(4, show_frame1, with_show_frame1);
|
||
|
u16_bool_field!(5, hblank_oam_free, with_hblank_oam_free);
|
||
|
u16_bool_field!(6, obj_vram_1d, with_obj_vram_1d);
|
||
|
u16_bool_field!(7, forced_blank, with_forced_blank);
|
||
|
u16_bool_field!(8, show_bg0, with_show_bg0);
|
||
|
u16_bool_field!(9, show_bg1, with_show_bg1);
|
||
|
u16_bool_field!(10, show_bg2, with_show_bg2);
|
||
|
u16_bool_field!(11, show_bg3, with_show_bg3);
|
||
|
u16_bool_field!(12, show_obj, with_show_obj);
|
||
|
u16_bool_field!(13, enable_win0, with_enable_win0);
|
||
|
u16_bool_field!(14, enable_win1, with_enable_win1);
|
||
|
u16_bool_field!(15, enable_obj_win, with_enable_obj_win);
|
||
|
}
|
||
|
|
||
|
#[derive(Debug, Clone, Copy, Default, PartialEq, Eq, PartialOrd, Ord, Hash)]
|
||
|
#[repr(transparent)]
|
||
|
pub struct DisplayStatus(u16);
|
||
|
impl DisplayStatus {
|
||
|
pub_const_fn_new_zeroed!();
|
||
|
u16_bool_field!(0, currently_vblank, with_currently_vblank);
|
||
|
u16_bool_field!(1, currently_hblank, with_currently_hblank);
|
||
|
u16_bool_field!(2, currently_vcount, with_currently_vcount);
|
||
|
u16_bool_field!(3, irq_vblank, with_irq_vblank);
|
||
|
u16_bool_field!(4, irq_hblank, with_irq_hblank);
|
||
|
u16_bool_field!(5, irq_vcount, with_irq_vcount);
|
||
|
u16_int_field!(8 - 15, vcount_setting, with_vcount_setting);
|
||
|
}
|
||
|
|
||
|
#[derive(Debug, Clone, Copy, Default, PartialEq, Eq, PartialOrd, Ord, Hash)]
|
||
|
#[repr(transparent)]
|
||
|
pub struct BackgroundControl(u16);
|
||
|
impl BackgroundControl {
|
||
|
pub_const_fn_new_zeroed!();
|
||
|
u16_int_field!(0 - 1, priority, with_priority);
|
||
|
u16_int_field!(2 - 3, charblock, with_charblock);
|
||
|
u16_bool_field!(6, mosaic, with_mosaic);
|
||
|
u16_bool_field!(7, bpp8, with_bpp8);
|
||
|
u16_int_field!(8 - 12, screenblock, with_screenblock);
|
||
|
u16_bool_field!(13, is_affine_wrapping, with_is_affine_wrapping);
|
||
|
u16_int_field!(14 - 15, size, with_size);
|
||
|
}
|
||
|
|
||
|
#[derive(Debug, Clone, Copy, Default, PartialEq, Eq, PartialOrd, Ord, Hash)]
|
||
|
#[repr(transparent)]
|
||
|
pub struct WindowInside(u16);
|
||
|
impl WindowInside {
|
||
|
pub_const_fn_new_zeroed!();
|
||
|
u16_bool_field!(0, win0_bg0, with_win0_bg0);
|
||
|
u16_bool_field!(1, win0_bg1, with_win0_bg1);
|
||
|
u16_bool_field!(2, win0_bg2, with_win0_bg2);
|
||
|
u16_bool_field!(3, win0_bg3, with_win0_bg3);
|
||
|
u16_bool_field!(4, win0_obj, with_win0_obj);
|
||
|
u16_bool_field!(5, win0_effect, with_win0_effect);
|
||
|
u16_bool_field!(8, win1_bg0, with_win1_bg0);
|
||
|
u16_bool_field!(9, win1_bg1, with_win1_bg1);
|
||
|
u16_bool_field!(10, win1_bg2, with_win1_bg2);
|
||
|
u16_bool_field!(11, win1_bg3, with_win1_bg3);
|
||
|
u16_bool_field!(12, win1_obj, with_win1_obj);
|
||
|
u16_bool_field!(13, win1_effect, with_win1_effect);
|
||
|
}
|
||
|
|
||
|
#[derive(Debug, Clone, Copy, Default, PartialEq, Eq, PartialOrd, Ord, Hash)]
|
||
|
#[repr(transparent)]
|
||
|
pub struct WindowOutside(u16);
|
||
|
impl WindowOutside {
|
||
|
pub_const_fn_new_zeroed!();
|
||
|
u16_bool_field!(0, outside_bg0, with_outside_bg0);
|
||
|
u16_bool_field!(1, outside_bg1, with_outside_bg1);
|
||
|
u16_bool_field!(2, outside_bg2, with_outside_bg2);
|
||
|
u16_bool_field!(3, outside_bg3, with_outside_bg3);
|
||
|
u16_bool_field!(4, outside_obj, with_outside_obj);
|
||
|
u16_bool_field!(5, outside_effect, with_outside_effect);
|
||
|
u16_bool_field!(8, obj_win_bg0, with_obj_win_bg0);
|
||
|
u16_bool_field!(9, obj_win_bg1, with_obj_win_bg1);
|
||
|
u16_bool_field!(10, obj_win_bg2, with_obj_win_bg2);
|
||
|
u16_bool_field!(11, obj_win_bg3, with_obj_win_bg3);
|
||
|
u16_bool_field!(12, obj_win_obj, with_obj_win_obj);
|
||
|
u16_bool_field!(13, obj_win_effect, with_obj_win_effect);
|
||
|
}
|
||
|
|
||
|
#[derive(Debug, Clone, Copy, Default, PartialEq, Eq, PartialOrd, Ord, Hash)]
|
||
|
#[repr(transparent)]
|
||
|
pub struct Mosaic(u16);
|
||
|
impl Mosaic {
|
||
|
pub_const_fn_new_zeroed!();
|
||
|
u16_int_field!(0 - 3, bg_h_extra, with_bg_h_extra);
|
||
|
u16_int_field!(4 - 7, bg_v_extra, with_bg_v_extra);
|
||
|
u16_int_field!(8 - 11, obj_h_extra, with_obj_h_extra);
|
||
|
u16_int_field!(12 - 15, obj_v_extra, with_obj_v_extra);
|
||
|
}
|
||
|
|
||
|
#[derive(Debug, Clone, Copy, Default, PartialEq, Eq, PartialOrd, Ord, Hash)]
|
||
|
#[repr(u16)]
|
||
|
pub enum ColorEffectMode {
|
||
|
#[default]
|
||
|
NoEffect = 0 << 6,
|
||
|
AlphaBlend = 1 << 6,
|
||
|
Brighten = 2 << 6,
|
||
|
Darken = 3 << 6,
|
||
|
}
|
||
|
|
||
|
#[derive(Debug, Clone, Copy, Default, PartialEq, Eq, PartialOrd, Ord, Hash)]
|
||
|
#[repr(transparent)]
|
||
|
pub struct BlendControl(u16);
|
||
|
impl BlendControl {
|
||
|
pub_const_fn_new_zeroed!();
|
||
|
u16_bool_field!(0, target1_bg0, with_target1_bg0);
|
||
|
u16_bool_field!(1, target1_bg1, with_target1_bg1);
|
||
|
u16_bool_field!(2, target1_bg2, with_target1_bg2);
|
||
|
u16_bool_field!(3, target1_bg3, with_target1_bg3);
|
||
|
u16_bool_field!(4, target1_obj, with_target1_obj);
|
||
|
u16_bool_field!(5, target1_backdrop, with_target1_backdrop);
|
||
|
u16_enum_field!(6 - 7: ColorEffectMode, mode, with_mode);
|
||
|
u16_bool_field!(8, target2_bg0, with_target2_bg0);
|
||
|
u16_bool_field!(9, target2_bg1, with_target2_bg1);
|
||
|
u16_bool_field!(10, target2_bg2, with_target2_bg2);
|
||
|
u16_bool_field!(11, target2_bg3, with_target2_bg3);
|
||
|
u16_bool_field!(12, target2_obj, with_target2_obj);
|
||
|
u16_bool_field!(13, target2_backdrop, with_target2_backdrop);
|
||
|
}
|
||
|
|
||
|
/// Data for a 4-bit-per-pixel tile.
|
||
|
pub type Tile4 = [u32; 8];
|
||
|
|
||
|
/// Data for an 8-bit-per-pixel tile.
|
||
|
pub type Tile8 = [u32; 16];
|
||
|
|
||
|
#[derive(Debug, Clone, Copy, Default, PartialEq, Eq, PartialOrd, Ord, Hash)]
|
||
|
#[repr(transparent)]
|
||
|
pub struct TextEntry(u16);
|
||
|
impl TextEntry {
|
||
|
pub_const_fn_new_zeroed!();
|
||
|
u16_int_field!(0 - 9, tile_id, with_tile_id);
|
||
|
u16_bool_field!(10, hflip, with_hflip);
|
||
|
u16_bool_field!(11, vflip, with_vflip);
|
||
|
u16_int_field!(12 - 15, palbank, with_palbank);
|
||
|
}
|
||
|
|
||
|
#[derive(Debug, Clone, Copy, Default, PartialEq, Eq, PartialOrd, Ord, Hash)]
|
||
|
#[repr(u16)]
|
||
|
pub enum ObjDisplayStyle {
|
||
|
#[default]
|
||
|
Normal = 0 << 8,
|
||
|
Affine = 1 << 8,
|
||
|
NotDisplayed = 2 << 8,
|
||
|
DoubleSizeAffine = 3 << 8,
|
||
|
}
|
||
|
|
||
|
#[derive(Debug, Clone, Copy, Default, PartialEq, Eq, PartialOrd, Ord, Hash)]
|
||
|
#[repr(u16)]
|
||
|
pub enum ObjDisplayMode {
|
||
|
#[default]
|
||
|
Normal = 0 << 10,
|
||
|
SemiTransparent = 1 << 10,
|
||
|
Window = 2 << 10,
|
||
|
}
|
||
|
|
||
|
#[derive(Debug, Clone, Copy, Default, PartialEq, Eq, PartialOrd, Ord, Hash)]
|
||
|
#[repr(u16)]
|
||
|
pub enum ObjShape {
|
||
|
#[default]
|
||
|
Square = 0 << 14,
|
||
|
Horizontal = 1 << 14,
|
||
|
Vertical = 2 << 14,
|
||
|
}
|
||
|
|
||
|
#[derive(Debug, Clone, Copy, Default, PartialEq, Eq, PartialOrd, Ord, Hash)]
|
||
|
#[repr(transparent)]
|
||
|
pub struct ObjAttr0(u16);
|
||
|
impl ObjAttr0 {
|
||
|
pub_const_fn_new_zeroed!();
|
||
|
u16_int_field!(0 - 7, y, with_y);
|
||
|
u16_enum_field!(8 - 9: ObjDisplayStyle, style, with_style);
|
||
|
u16_enum_field!(10 - 11: ObjDisplayMode, mode, with_mode);
|
||
|
u16_bool_field!(12, mosaic, with_mosaic);
|
||
|
u16_bool_field!(13, bpp8, with_bpp8);
|
||
|
u16_enum_field!(14 - 15: ObjShape, shape, with_shape);
|
||
|
}
|
||
|
|
||
|
#[derive(Debug, Clone, Copy, Default, PartialEq, Eq, PartialOrd, Ord, Hash)]
|
||
|
#[repr(transparent)]
|
||
|
pub struct ObjAttr1(u16);
|
||
|
impl ObjAttr1 {
|
||
|
pub_const_fn_new_zeroed!();
|
||
|
u16_int_field!(0 - 8, x, with_x);
|
||
|
u16_int_field!(9 - 13, affine_index, with_affine_index);
|
||
|
u16_bool_field!(12, hflip, with_hflip);
|
||
|
u16_bool_field!(13, vflip, with_vflip);
|
||
|
u16_int_field!(14 - 15, size, with_size);
|
||
|
}
|
||
|
|
||
|
#[derive(Debug, Clone, Copy, Default, PartialEq, Eq, PartialOrd, Ord, Hash)]
|
||
|
#[repr(transparent)]
|
||
|
pub struct ObjAttr2(u16);
|
||
|
impl ObjAttr2 {
|
||
|
pub_const_fn_new_zeroed!();
|
||
|
u16_int_field!(0 - 9, tile_id, with_tile_id);
|
||
|
u16_int_field!(10 - 11, priority, with_priority);
|
||
|
u16_int_field!(12 - 15, palbank, with_palbank);
|
||
|
}
|