| // vdp.h |
| // |
| // Copyright (C) 2020 Dan Rodrigues <danrr.gh.oss@gmail.com> |
| // |
| // SPDX-License-Identifier: MIT |
| |
| #ifndef vdp_h |
| #define vdp_h |
| |
| #include <stdint.h> |
| #include <stdbool.h> |
| |
| typedef volatile uint16_t *const VDP_REG; |
| |
| static VDP_REG VDP_BASE = (VDP_REG)0x30100000; |
| |
| typedef enum { |
| SCROLL0 = 1 << 0, |
| SCROLL1 = 1 << 1, |
| SCROLL2 = 1 << 2, |
| SCROLL3 = 1 << 3, |
| SPRITES = 1 << 4, |
| |
| AFFINE = 1 << 5 |
| } VDPLayer; |
| |
| extern const VDPLayer VDP_ALL_LAYERS; |
| |
| // MARK: Screen metrics |
| |
| extern const uint16_t SCREEN_ACTIVE_WIDTH; |
| extern const uint16_t SCREEN_ACTIVE_HEIGHT; |
| extern const uint16_t SCREEN_OFFSCREEN_X; |
| |
| extern const uint16_t RASTER_X_MAX; |
| |
| // MARK: Attributes |
| |
| // scrolling layer map attribute bits |
| |
| extern const uint16_t SCROLL_MAP_X_FLIP_SHIFT; |
| extern const uint16_t SCROLL_MAP_Y_FLIP_SHIFT; |
| |
| extern const uint16_t SCROLL_MAP_X_FLIP; |
| extern const uint16_t SCROLL_MAP_Y_FLIP; |
| extern const uint16_t SCROLL_MAP_PAL_SHIFT; |
| |
| // sprite meta block attribute bits |
| |
| // y_block |
| extern const uint16_t SPRITE_Y_FLIP; |
| extern const uint16_t SPRITE_16_TALL; |
| extern const uint16_t SPRITE_16_WIDE; |
| |
| // g_block |
| extern const uint16_t SPRITE_PRIORITY_SHIFT; |
| extern const uint16_t SPRITE_PAL_SHIFT; |
| |
| // x_block |
| extern const uint16_t SPRITE_X_FLIP; |
| |
| // MARK: Read functions |
| |
| static const VDP_REG VDP_CURRENT_RASTER_BASE = VDP_BASE + 0x00; |
| |
| #define VDP_CURRENT_RASTER_X (*((VDP_REG) VDP_CURRENT_RASTER_BASE + 0)) |
| #define VDP_CURRENT_RASTER_Y (*((VDP_REG) VDP_CURRENT_RASTER_BASE + 2)) |
| |
| void vdp_wait_frame_ended(void); |
| |
| // MARK: Write functions |
| |
| void vdp_enable_copper(uint8_t enable); |
| |
| void vdp_enable_layers(VDPLayer layers); |
| void vdp_set_alpha_over_layers(VDPLayer layers); |
| void vdp_set_wide_map_layers(VDPLayer layers); |
| |
| void vdp_set_layer_tile_base(uint8_t layer, uint16_t address); |
| void vdp_set_layer_map_base(uint8_t layer, uint16_t address); |
| |
| void vdp_seek_vram(uint16_t address); |
| void vdp_fill_vram(uint16_t count, uint16_t word); |
| void vdp_write_vram(uint16_t word); |
| void vdp_write_vram_block(const uint16_t *data, uint16_t size); |
| void vdp_set_vram_increment(uint8_t increment); |
| |
| void vdp_write_palette_range(uint8_t color_id_start, uint32_t count, const uint16_t *palette_start); |
| |
| void vdp_set_single_palette_color(uint8_t color_id, uint16_t color); |
| void vdp_seek_palette(uint8_t palette_id); |
| void vdp_write_palette_color(uint16_t color); |
| |
| void vdp_set_layer_scroll(uint8_t layer, uint16_t scroll_x, uint16_t scroll_y); |
| |
| void vdp_set_sprite_tile_base(uint16_t base); |
| void vdp_write_single_sprite_meta(uint8_t sprite_id, uint16_t x_block, uint16_t y_block, uint16_t g_block); |
| void vdp_seek_sprite(uint8_t sprite_id); |
| void vdp_write_sprite_meta(uint16_t x_block, uint16_t y_block, uint16_t g_block); |
| void vdp_clear_all_sprites(void); |
| |
| void vdp_set_affine_matrix(int16_t a, int16_t b, int16_t c, int16_t d); |
| void vdp_set_affine_pretranslate(int16_t x, int16_t y); |
| |
| void vdp_set_target_raster_x(uint16_t x); |
| void vdp_set_target_raster_y(uint16_t y); |
| |
| void vdp_set_affine_matrix(int16_t a, int16_t b, int16_t c, int16_t d); |
| void vdp_set_affine_pretranslate(int16_t x, int16_t y); |
| void vdp_set_affine_translate(int16_t x, int16_t y); |
| |
| // MARK: Convenience |
| |
| bool vdp_layer_is_odd(VDPLayer layer); |
| |
| #endif /* vdp_h */ |