diff options
author | lonkaars <loek@pipeframe.xyz> | 2023-03-10 13:16:16 +0100 |
---|---|---|
committer | lonkaars <loek@pipeframe.xyz> | 2023-03-10 13:16:16 +0100 |
commit | c37397234534e9888dfeed9b1728c46646c33b58 (patch) | |
tree | c0e97dcccb1fce5bcd4550db243a67949a42ea1a | |
parent | bf8c5fdb43ae2446a502227a95f17167c3dcda33 (diff) |
`clang-format`
-rw-r--r-- | src/demo.c | 182 | ||||
-rw-r--r-- | src/ds.c | 2 | ||||
-rw-r--r-- | src/main.c | 3 | ||||
-rw-r--r-- | src/makefile | 4 | ||||
-rw-r--r-- | src/ppu/internals.c | 75 | ||||
-rw-r--r-- | src/ppu/ppu.c | 22 | ||||
-rw-r--r-- | src/ppusim/input.c | 13 | ||||
-rw-r--r-- | src/ppusim/mem.c | 4 | ||||
-rw-r--r-- | src/ppusim/pixel.c | 77 | ||||
-rw-r--r-- | src/ppusim/sim.c | 16 | ||||
-rw-r--r-- | src/ppusim/work.c | 35 |
11 files changed, 186 insertions, 247 deletions
@@ -1,36 +1,36 @@ #include <math.h> #include "demo.h" -#include "ppu/ppu.h" -#include "input.h" #include "entity.h" +#include "input.h" +#include "ppu/ppu.h" #define HH_DEMO_BALL_COUNT 1 hh_s_ppu_loc_fam_entry g_hh_demo_balls[HH_DEMO_BALL_COUNT]; hh_s_entity_player g_hh_player_1 = { - .pos_x = 31000, //0b0000 0001 0011 0110 - .pos_y = 21000, - .radius = 8, - .speed = 1, + .pos_x = 31000, // 0b0000 0001 0011 0110 + .pos_y = 21000, + .radius = 8, + .speed = 1, .direction_x = 1, - .rotation = 8, - .in_air = false, + .rotation = 8, + .in_air = false, }; -void playerMovement(); +void hh_player_movement(); -uint16_t pos_x; //0b0000 0001 0011 0110 -uint16_t pos_y; -uint8_t left = 0; -uint8_t right = 0; -uint8_t up = 0; -uint8_t down = 0; -uint8_t pos_x_bit[2]; -uint8_t pos_y_bit[2]; -uint8_t data_send[3]; -int tileX; -int tileY; +uint16_t g_hh_pos_x; // 0b0000 0001 0011 0110 +uint16_t g_hh_pos_y; +uint8_t g_hh_left = 0; +uint8_t g_hh_right = 0; +uint8_t g_hh_up = 0; +uint8_t g_hh_down = 0; +uint8_t g_hh_pos_x_bit[2]; +uint8_t g_hh_pos_y_bit[2]; +uint8_t g_hh_data_send[3]; +int g_hh_tile_x; +int g_hh_tile_y; void hh_demo_setup() { // load sprites @@ -38,55 +38,54 @@ void hh_demo_setup() { hh_ppu_update_sprite(1, HH_DBG_SPRITE_CHECKERBOARD); // background pattern - hh_ppu_update_color(0, 1, (hh_ppu_rgb_color_t) {0x4, 0x4, 0x4}); + hh_ppu_update_color(0, 1, (hh_ppu_rgb_color_t){0x4, 0x4, 0x4}); for (unsigned i = 0; i < HH_PPU_BG_CANVAS_TILES_H * HH_PPU_BG_CANVAS_TILES_V; i++) { - hh_ppu_update_background(i, (hh_s_ppu_loc_bam_entry) { - .horizontal_flip = false, - .vertical_flip = false, - .palette_index = 0, - .tilemap_index = 1, - }); + hh_ppu_update_background(i, (hh_s_ppu_loc_bam_entry){ + .horizontal_flip = false, + .vertical_flip = false, + .palette_index = 0, + .tilemap_index = 1, + }); } // cool colors - hh_ppu_update_color(1, 1, (hh_ppu_rgb_color_t) {0xf, 0x0, 0xf}); - hh_ppu_update_color(2, 1, (hh_ppu_rgb_color_t) {0xf, 0xf, 0xf}); - hh_ppu_update_color(3, 1, (hh_ppu_rgb_color_t) {0xf, 0x0, 0x0}); - hh_ppu_update_color(4, 1, (hh_ppu_rgb_color_t) {0x0, 0xf, 0xf}); - hh_ppu_update_color(5, 1, (hh_ppu_rgb_color_t) {0x0, 0x0, 0xf}); + hh_ppu_update_color(1, 1, (hh_ppu_rgb_color_t){0xf, 0x0, 0xf}); + hh_ppu_update_color(2, 1, (hh_ppu_rgb_color_t){0xf, 0xf, 0xf}); + hh_ppu_update_color(3, 1, (hh_ppu_rgb_color_t){0xf, 0x0, 0x0}); + hh_ppu_update_color(4, 1, (hh_ppu_rgb_color_t){0x0, 0xf, 0xf}); + hh_ppu_update_color(5, 1, (hh_ppu_rgb_color_t){0x0, 0x0, 0xf}); // balls for (unsigned i = 0; i < HH_DEMO_BALL_COUNT; i++) { g_hh_demo_balls[i].horizontal_flip = false; - g_hh_demo_balls[i].vertical_flip = false; - g_hh_demo_balls[i].palette_index = i+1; - g_hh_demo_balls[i].tilemap_index = 0; + g_hh_demo_balls[i].vertical_flip = false; + g_hh_demo_balls[i].palette_index = i + 1; + g_hh_demo_balls[i].tilemap_index = 0; } } void hh_demo_loop(unsigned long frame) { - playerMovement(); + hh_player_movement(); + + // adjust map size + g_hh_pos_x = g_hh_player_1.pos_x / 100; + g_hh_pos_y = g_hh_player_1.pos_y / 100; - //adjust map size - pos_x = g_hh_player_1.pos_x / 100; - pos_y = g_hh_player_1.pos_y / 100; - // input testing (no hitbox stuff) // pos_x += (-1 * g_hh_controller_p1.dpad_left) + (1 * g_hh_controller_p1.dpad_right); // -1 = L || 1 == R // pos_y += (-1 * g_hh_controller_p1.dpad_up) + (1 * g_hh_controller_p1.dpad_down); // -1 = D || 1 == U // update player sprite on ppu - g_hh_demo_balls[0].position_x = pos_x; - g_hh_demo_balls[0].position_y = pos_y; + g_hh_demo_balls[0].position_x = g_hh_pos_x; + g_hh_demo_balls[0].position_y = g_hh_pos_y; hh_ppu_update_foreground(0, g_hh_demo_balls[0]); - // set background pattern position - hh_ppu_update_aux((hh_s_ppu_loc_aux) { + hh_ppu_update_aux((hh_s_ppu_loc_aux){ .bg_shift_x = (frame / 2) % HH_PPU_SPRITE_WIDTH, .bg_shift_y = (frame / 8) % HH_PPU_SPRITE_HEIGHT, - .fg_fetch = 0, - .sysreset = 0, + .fg_fetch = 0, + .sysreset = 0, }); } @@ -95,91 +94,77 @@ void hh_demo_loop(unsigned long frame) { // bitData[2] = data & 0xff; // bitData[1] = (data >> 8); // bitData[0] = address; // first byte is address -// +// // HAL_GPIO_WritePin(GPIOA, GPIO_PIN_9, GPIO_PIN_RESET); // HAL_SPI_Transmit(&hspi1, bitData, 3, 100); //2*8 bit data // HAL_GPIO_WritePin(GPIOA, GPIO_PIN_9, GPIO_PIN_SET); // } -void playerMovement() { +void hh_player_movement() { int8_t directionX = (-1 * g_hh_controller_p1.dpad_left) + (1 * g_hh_controller_p1.dpad_right); // -1 = L || 1 == R - int8_t directionY = (-1 * g_hh_controller_p1.dpad_down) + (1 * g_hh_controller_p1.dpad_up); // -1 = D || 1 == U + int8_t directionY = (-1 * g_hh_controller_p1.dpad_down) + (1 * g_hh_controller_p1.dpad_up); // -1 = D || 1 == U - uint8_t i,j; + uint8_t i, j; uint8_t rotation = 0; // 0-7 - //rotation calc - for(i = -1; i < 2;i++) - { - for(j = -1; j < 2; j++) - { - if(directionX == i) - { - if(directionY == j) - { - if(i != 0 && j != 0) //dont update when player idle + // rotation calc + for (i = -1; i < 2; i++) { + for (j = -1; j < 2; j++) { + if (directionX == i) { + if (directionY == j) { + if (i != 0 && j != 0) // dont update when player idle { g_hh_player_1.rotation = rotation; } } } - rotation++; + rotation++; } } - //direction calc - if(directionX != 0) //update direction if player is not idle + // direction calc + if (directionX != 0) // update direction if player is not idle { g_hh_player_1.direction_x = directionX; } - //collision map x-axis + // collision map x-axis - //tile calc including radius and direction for background coliision + // tile calc including radius and direction for background coliision uint16_t tileColX; - uint16_t tileColY = ( g_hh_player_1.pos_y / 100) / 16; ; + uint16_t tileColY = (g_hh_player_1.pos_y / 100) / 16; + ; // remaining space between grid and exact uint8_t modTileX; uint8_t modTileY; - if(g_hh_player_1.in_air == false && directionX != 0) - { - if(directionX == 1) - { - tileColX = ( ( g_hh_player_1.pos_x / 100) + g_hh_player_1.radius ) / 20; - modTileX = ( g_hh_player_1.pos_x + ( 100 * g_hh_player_1.radius ) ) % 2000; + if (g_hh_player_1.in_air == false && directionX != 0) { + if (directionX == 1) { + tileColX = ((g_hh_player_1.pos_x / 100) + g_hh_player_1.radius) / 20; + modTileX = (g_hh_player_1.pos_x + (100 * g_hh_player_1.radius)) % 2000; + } else if (directionX == -1) { + tileColX = ((g_hh_player_1.pos_x / 100) - g_hh_player_1.radius) / 20; + modTileX = (g_hh_player_1.pos_x - (100 * g_hh_player_1.radius)) % 2000; } - else if(directionX == -1) - { - tileColX = ( ( g_hh_player_1.pos_x / 100) - g_hh_player_1.radius ) / 20; - modTileX = ( g_hh_player_1.pos_x - ( 100 * g_hh_player_1.radius ) ) % 2000; + + if (HH_DEMO_HITBOX_TILEMAP[tileColY][tileColX + directionX] != 1) { + g_hh_player_1.pos_x = g_hh_player_1.pos_x + (directionX * g_hh_player_1.speed); // NEW x set } - if(HH_DEMO_HITBOX_TILEMAP[tileColY][tileColX + directionX] != 1) - { + else if (HH_DEMO_HITBOX_TILEMAP[tileColY][tileColX + directionX] == 1) { + if (modTileX < g_hh_player_1.speed) { + g_hh_player_1.pos_x = g_hh_player_1.pos_x + (directionX * modTileX); // NEW x set + } else { g_hh_player_1.pos_x = g_hh_player_1.pos_x + (directionX * g_hh_player_1.speed); // NEW x set } + } - else if(HH_DEMO_HITBOX_TILEMAP[tileColY][tileColX + directionX] == 1) - { - if(modTileX < g_hh_player_1.speed) - { - g_hh_player_1.pos_x = g_hh_player_1.pos_x + (directionX * modTileX); // NEW x set - } - else - { - g_hh_player_1.pos_x = g_hh_player_1.pos_x + (directionX * g_hh_player_1.speed); // NEW x set - } - } - - } - else //if in air different all borders have to be checked + } else // if in air different all borders have to be checked { - } - //collision map floor (y-axis) (falling) - // if falling no jump press (implement) + // collision map floor (y-axis) (falling) + // if falling no jump press (implement) /* tileColY = (( g_hh_player_1.pos_y / 100) + g_hh_player_1.radius) / 16; //bottom of player box modTileY = 1; @@ -189,10 +174,5 @@ void playerMovement() { //playerStat = falling; //for later use of graphics/sound } */ - //else if(HH_DEMO_HITBOX_TILEMAP[]) - - - - - + // else if(HH_DEMO_HITBOX_TILEMAP[]) } @@ -1,6 +1,6 @@ +#include "demo.h" #include "main.h" #include "ppu/ppu.h" -#include "demo.h" void hh_setup() { hh_ppu_init(); @@ -1,8 +1,8 @@ #include <stdlib.h> -#include "main.h" #include "demo.h" #include "input.h" +#include "main.h" bool g_hh_run = true; @@ -19,4 +19,3 @@ void hh_ppu_vblank_interrupt() { hh_demo_loop(frame); frame++; } - diff --git a/src/makefile b/src/makefile index 1115874..c69bfb5 100644 --- a/src/makefile +++ b/src/makefile @@ -81,8 +81,8 @@ compile_commands.json: makefile stm32.mk ds.mk PHONY += format format: - clang-format -i $(LOCAL_SRCS) - clang-tidy --fix-errors $(LOCAL_SRCS) + clang-format -i $(LOCAL_SRCS) $(DESKTOP_SRCS) + clang-tidy --fix-errors $(LOCAL_SRCS) $(DESKTOP_SRCS) PHONY += clean clean: diff --git a/src/ppu/internals.c b/src/ppu/internals.c index 650ba3e..b8d3e27 100644 --- a/src/ppu/internals.c +++ b/src/ppu/internals.c @@ -1,8 +1,8 @@ #include <stdlib.h> -#include "ppu/types.h" -#include "ppu/internals.h" #include "ppu/consts.h" +#include "ppu/internals.h" +#include "ppu/types.h" bool hh_ppu_vram_valid_address(hh_ppu_addr_t addr) { #pragma GCC diagnostic push @@ -17,88 +17,59 @@ bool hh_ppu_vram_valid_address(hh_ppu_addr_t addr) { } void hh_ppu_vram_write(hh_s_ppu_vram_data data) { - for (unsigned i = 0; i < data.size; i++) - hh_ppu_vram_dwrite(data.offset + i, data.data[i]); + for (unsigned i = 0; i < data.size; i++) hh_ppu_vram_dwrite(data.offset + i, data.data[i]); } hh_s_ppu_vram_data hh_ppu_2nat_bam(hh_s_ppu_loc_bam_entry e) { - hh_ppu_data_t* data = malloc(sizeof(hh_ppu_data_t) * HH_PPU_VRAM_BAM_ENTRY_SIZE); + hh_ppu_data_t *data = malloc(sizeof(hh_ppu_data_t) * HH_PPU_VRAM_BAM_ENTRY_SIZE); - data[0] = HH_RESIZE(e.tilemap_index, 9, 0) << 0 | - HH_RESIZE(e.palette_index, 2, 0) << 10 | - e.vertical_flip << 13 | - e.horizontal_flip << 14; + data[0] = HH_RESIZE(e.tilemap_index, 9, 0) << 0 | HH_RESIZE(e.palette_index, 2, 0) << 10 | e.vertical_flip << 13 | e.horizontal_flip << 14; - hh_s_ppu_vram_data out = { - .data = data, - .size = HH_PPU_VRAM_FAM_ENTRY_SIZE - }; + hh_s_ppu_vram_data out = {.data = data, .size = HH_PPU_VRAM_FAM_ENTRY_SIZE}; return out; } hh_s_ppu_vram_data hh_ppu_2nat_fam(hh_s_ppu_loc_fam_entry e) { - hh_ppu_data_t* data = malloc(sizeof(hh_ppu_data_t) * HH_PPU_VRAM_FAM_ENTRY_SIZE); + hh_ppu_data_t *data = malloc(sizeof(hh_ppu_data_t) * HH_PPU_VRAM_FAM_ENTRY_SIZE); e.position_x += 16; e.position_y += 16; - data[0] = HH_RESIZE(e.tilemap_index, 9, 0) << 0 | - HH_RESIZE(e.palette_index, 2, 0) << 10 | - HH_RESIZE(e.position_y, 2, 0) << 13; - data[1] = HH_RESIZE(e.position_y, 7, 3) << 0 | - HH_RESIZE(e.position_x, 8, 0) << 5 | - e.vertical_flip << 14 | - e.horizontal_flip << 15; - - hh_s_ppu_vram_data out = { - .data = data, - .size = HH_PPU_VRAM_FAM_ENTRY_SIZE - }; + data[0] = HH_RESIZE(e.tilemap_index, 9, 0) << 0 | HH_RESIZE(e.palette_index, 2, 0) << 10 | HH_RESIZE(e.position_y, 2, 0) << 13; + data[1] = HH_RESIZE(e.position_y, 7, 3) << 0 | HH_RESIZE(e.position_x, 8, 0) << 5 | e.vertical_flip << 14 | e.horizontal_flip << 15; + + hh_s_ppu_vram_data out = {.data = data, .size = HH_PPU_VRAM_FAM_ENTRY_SIZE}; return out; } hh_s_ppu_vram_data hh_ppu_2nat_aux(hh_s_ppu_loc_aux aux) { - hh_ppu_data_t* data = malloc(sizeof(hh_ppu_data_t) * HH_PPU_VRAM_AUX_SIZE); - - data[0] = HH_RESIZE(aux.bg_shift_y, 7, 0) << 0 | - HH_RESIZE(aux.bg_shift_x, 7, 0) << 8; - data[1] = HH_RESIZE(aux.bg_shift_x, 8, 8) << 0 | - aux.fg_fetch << 1 | - aux.sysreset << 2; - - hh_s_ppu_vram_data out = { - .data = data, - .size = HH_PPU_VRAM_AUX_SIZE - }; + hh_ppu_data_t *data = malloc(sizeof(hh_ppu_data_t) * HH_PPU_VRAM_AUX_SIZE); + + data[0] = HH_RESIZE(aux.bg_shift_y, 7, 0) << 0 | HH_RESIZE(aux.bg_shift_x, 7, 0) << 8; + data[1] = HH_RESIZE(aux.bg_shift_x, 8, 8) << 0 | aux.fg_fetch << 1 | aux.sysreset << 2; + + hh_s_ppu_vram_data out = {.data = data, .size = HH_PPU_VRAM_AUX_SIZE}; return out; } hh_s_ppu_vram_data hh_ppu_2nat_sprite(const hh_ppu_loc_sprite_data_t sprite_data) { - hh_ppu_data_t* data = malloc(sizeof(hh_ppu_data_t) * HH_PPU_VRAM_TMM_SPRITE_SIZE); + hh_ppu_data_t *data = malloc(sizeof(hh_ppu_data_t) * HH_PPU_VRAM_TMM_SPRITE_SIZE); for (unsigned i = 0; i < HH_PPU_SPRITE_WIDTH * HH_PPU_SPRITE_HEIGHT; i++) { - unsigned word = i / 5; + unsigned word = i / 5; unsigned pixel = i % 5; if (pixel == 0) data[word] = 0; data[word] |= HH_RESIZE(sprite_data[i], 2, 0) << pixel * 3; } - hh_s_ppu_vram_data out = { - .data = data, - .size = HH_PPU_VRAM_TMM_SPRITE_SIZE - }; + hh_s_ppu_vram_data out = {.data = data, .size = HH_PPU_VRAM_TMM_SPRITE_SIZE}; return out; } hh_s_ppu_vram_data hh_ppu_2nat_color(hh_ppu_rgb_color_t rgb) { - hh_ppu_data_t* data = malloc(sizeof(hh_ppu_data_t) * HH_PPU_VRAM_PAL_ENTRY_SIZE); + hh_ppu_data_t *data = malloc(sizeof(hh_ppu_data_t) * HH_PPU_VRAM_PAL_ENTRY_SIZE); - data[0] = HH_RESIZE(rgb[0], 3, 0) << 8 | - HH_RESIZE(rgb[1], 3, 0) << 4 | - HH_RESIZE(rgb[2], 3, 0) << 0; + data[0] = HH_RESIZE(rgb[0], 3, 0) << 8 | HH_RESIZE(rgb[1], 3, 0) << 4 | HH_RESIZE(rgb[2], 3, 0) << 0; - hh_s_ppu_vram_data out = { - .data = data, - .size = HH_PPU_VRAM_PAL_ENTRY_SIZE - }; + hh_s_ppu_vram_data out = {.data = data, .size = HH_PPU_VRAM_PAL_ENTRY_SIZE}; return out; } diff --git a/src/ppu/ppu.c b/src/ppu/ppu.c index 5f33c55..df14b9f 100644 --- a/src/ppu/ppu.c +++ b/src/ppu/ppu.c @@ -1,52 +1,48 @@ #include <stdlib.h> -#include "ppu/ppu.h" -#include "ppu/internals.h" #include "ppu/consts.h" +#include "ppu/internals.h" +#include "ppu/ppu.h" void hh_ppu_update_foreground(unsigned index, hh_s_ppu_loc_fam_entry e) { hh_s_ppu_vram_data s = hh_ppu_2nat_fam(e); - s.offset = HH_PPU_VRAM_FAM_OFFSET + HH_PPU_VRAM_FAM_ENTRY_SIZE * index; + s.offset = HH_PPU_VRAM_FAM_OFFSET + HH_PPU_VRAM_FAM_ENTRY_SIZE * index; hh_ppu_vram_write(s); free(s.data); } void hh_ppu_update_background(unsigned index, hh_s_ppu_loc_bam_entry e) { hh_s_ppu_vram_data s = hh_ppu_2nat_bam(e); - s.offset = HH_PPU_VRAM_BAM_OFFSET + HH_PPU_VRAM_BAM_ENTRY_SIZE * index; + s.offset = HH_PPU_VRAM_BAM_OFFSET + HH_PPU_VRAM_BAM_ENTRY_SIZE * index; hh_ppu_vram_write(s); free(s.data); } void hh_ppu_update_sprite(unsigned tilemap_index, const hh_s_ppu_loc_sprite sprite) { hh_s_ppu_vram_data s = hh_ppu_2nat_sprite(sprite); - s.offset = HH_PPU_VRAM_TMM_OFFSET + HH_PPU_VRAM_TMM_SPRITE_SIZE * tilemap_index; + s.offset = HH_PPU_VRAM_TMM_OFFSET + HH_PPU_VRAM_TMM_SPRITE_SIZE * tilemap_index; hh_ppu_vram_write(s); free(s.data); } void hh_ppu_update_aux(hh_s_ppu_loc_aux aux) { hh_s_ppu_vram_data a = hh_ppu_2nat_aux(aux); - a.offset = HH_PPU_VRAM_AUX_OFFSET; + a.offset = HH_PPU_VRAM_AUX_OFFSET; hh_ppu_vram_write(a); free(a.data); } void hh_ppu_update_palette_table(hh_ppu_loc_palette_table_t table) { - for(unsigned i = 0; i < HH_PPU_PALETTE_COUNT; i++) - hh_ppu_update_palette(i, table[i]); + for (unsigned i = 0; i < HH_PPU_PALETTE_COUNT; i++) hh_ppu_update_palette(i, table[i]); } void hh_ppu_update_palette(unsigned palette_index, hh_ppu_loc_palette_data_t palette) { - for(unsigned i = 0; i < HH_PPU_PALETTE_COLOR_COUNT; i++) - hh_ppu_update_color(palette_index, i, palette[i]); + for (unsigned i = 0; i < HH_PPU_PALETTE_COLOR_COUNT; i++) hh_ppu_update_color(palette_index, i, palette[i]); } void hh_ppu_update_color(unsigned palette_index, unsigned color_index, hh_ppu_rgb_color_t color) { hh_s_ppu_vram_data c = hh_ppu_2nat_color(color); - c.offset = HH_PPU_VRAM_PAL_OFFSET + - palette_index * HH_PPU_VRAM_PAL_ENTRY_SIZE * HH_PPU_PALETTE_COLOR_COUNT + - color_index * HH_PPU_VRAM_PAL_ENTRY_SIZE; + c.offset = HH_PPU_VRAM_PAL_OFFSET + palette_index * HH_PPU_VRAM_PAL_ENTRY_SIZE * HH_PPU_PALETTE_COLOR_COUNT + color_index * HH_PPU_VRAM_PAL_ENTRY_SIZE; hh_ppu_vram_write(c); free(c.data); } diff --git a/src/ppusim/input.c b/src/ppusim/input.c index bdb94ac..08bc382 100644 --- a/src/ppusim/input.c +++ b/src/ppusim/input.c @@ -2,15 +2,14 @@ #include "input.h" -hh_s_gamepad g_hh_controller_p1 = { 0 }; -hh_s_gamepad g_hh_controller_p2 = { 0 }; +hh_s_gamepad g_hh_controller_p1 = {0}; +hh_s_gamepad g_hh_controller_p2 = {0}; void hh_input_read() { // SDL_PumpEvents(); - const Uint8* kb = SDL_GetKeyboardState(NULL); - g_hh_controller_p1.dpad_up = kb[SDL_SCANCODE_W]; - g_hh_controller_p1.dpad_down = kb[SDL_SCANCODE_S]; - g_hh_controller_p1.dpad_left = kb[SDL_SCANCODE_A]; + const Uint8 *kb = SDL_GetKeyboardState(NULL); + g_hh_controller_p1.dpad_up = kb[SDL_SCANCODE_W]; + g_hh_controller_p1.dpad_down = kb[SDL_SCANCODE_S]; + g_hh_controller_p1.dpad_left = kb[SDL_SCANCODE_A]; g_hh_controller_p1.dpad_right = kb[SDL_SCANCODE_D]; } - diff --git a/src/ppusim/mem.c b/src/ppusim/mem.c index e3f41f5..bd8606e 100644 --- a/src/ppusim/mem.c +++ b/src/ppusim/mem.c @@ -1,8 +1,8 @@ -#include <stdlib.h> #include <stdio.h> +#include <stdlib.h> -#include "ppusim/mem.h" #include "ppu/internals.h" +#include "ppusim/mem.h" hh_ppu_data_t *g_hh_ppusim_vram = NULL; diff --git a/src/ppusim/pixel.c b/src/ppusim/pixel.c index 6e915e6..0457d55 100644 --- a/src/ppusim/pixel.c +++ b/src/ppusim/pixel.c @@ -1,10 +1,10 @@ #include <SDL2/SDL.h> #include <stdbool.h> -#include "ppusim/work.h" +#include "ppu/consts.h" #include "ppu/internals.h" #include "ppusim/mem.h" -#include "ppu/consts.h" +#include "ppusim/work.h" /* transform xy if tile is flipped */ static uint16_t hh_ppusim_apply_transform(unsigned x, unsigned y, bool fliph, bool flipv) { @@ -15,25 +15,25 @@ static uint16_t hh_ppusim_apply_transform(unsigned x, unsigned y, bool fliph, bo /* @brief get current bg pixel cidx */ static uint8_t hh_ppusim_bg_pixel(unsigned x, unsigned y) { - hh_ppu_data_t* aux = &g_hh_ppusim_vram[HH_PPU_VRAM_AUX_OFFSET]; - unsigned bg_shift_y = HH_RESIZE(aux[0], 7, 0); - unsigned bg_shift_x = HH_RESIZE(aux[0], 15, 8) | HH_RESIZE(aux[1], 0, 0) << 8; - unsigned abs_x = bg_shift_x + x; - unsigned abs_y = bg_shift_y + y; - unsigned grid_x = abs_x / HH_PPU_SPRITE_WIDTH; - unsigned grid_y = abs_y / HH_PPU_SPRITE_HEIGHT; - unsigned loc_x = abs_x - grid_x * HH_PPU_SPRITE_WIDTH; - unsigned loc_y = abs_y - grid_y * HH_PPU_SPRITE_HEIGHT; - unsigned bam_offset = grid_y * HH_PPU_BG_CANVAS_TILES_H + grid_x; - hh_ppu_data_t bam = g_hh_ppusim_vram[HH_PPU_VRAM_BAM_OFFSET + bam_offset]; - uint8_t cidx = 0; + hh_ppu_data_t *aux = &g_hh_ppusim_vram[HH_PPU_VRAM_AUX_OFFSET]; + unsigned bg_shift_y = HH_RESIZE(aux[0], 7, 0); + unsigned bg_shift_x = HH_RESIZE(aux[0], 15, 8) | HH_RESIZE(aux[1], 0, 0) << 8; + unsigned abs_x = bg_shift_x + x; + unsigned abs_y = bg_shift_y + y; + unsigned grid_x = abs_x / HH_PPU_SPRITE_WIDTH; + unsigned grid_y = abs_y / HH_PPU_SPRITE_HEIGHT; + unsigned loc_x = abs_x - grid_x * HH_PPU_SPRITE_WIDTH; + unsigned loc_y = abs_y - grid_y * HH_PPU_SPRITE_HEIGHT; + unsigned bam_offset = grid_y * HH_PPU_BG_CANVAS_TILES_H + grid_x; + hh_ppu_data_t bam = g_hh_ppusim_vram[HH_PPU_VRAM_BAM_OFFSET + bam_offset]; + uint8_t cidx = 0; uint16_t tile_pixel_idx = hh_ppusim_apply_transform(loc_x, loc_y, HH_RESIZE(bam, 14, 14), HH_RESIZE(bam, 13, 13)); - uint16_t tile_idx = HH_RESIZE(bam, 9, 0); - hh_ppu_addr_t ttm_addr = tile_idx * HH_PPU_VRAM_TMM_SPRITE_SIZE + tile_pixel_idx / 5; - uint8_t word_bit_addr = (tile_pixel_idx % 5) * 3; - hh_ppu_data_t tmm = g_hh_ppusim_vram[HH_PPU_VRAM_TMM_OFFSET + ttm_addr]; + uint16_t tile_idx = HH_RESIZE(bam, 9, 0); + hh_ppu_addr_t ttm_addr = tile_idx * HH_PPU_VRAM_TMM_SPRITE_SIZE + tile_pixel_idx / 5; + uint8_t word_bit_addr = (tile_pixel_idx % 5) * 3; + hh_ppu_data_t tmm = g_hh_ppusim_vram[HH_PPU_VRAM_TMM_OFFSET + ttm_addr]; cidx |= HH_RESIZE(bam, 12, 10) << 3; - cidx |= HH_RESIZE(tmm, word_bit_addr+2, word_bit_addr) << 0; + cidx |= HH_RESIZE(tmm, word_bit_addr + 2, word_bit_addr) << 0; return cidx; } @@ -44,42 +44,37 @@ static uint8_t hh_ppusim_fg_pixel(unsigned x, unsigned y) { uint8_t cidx = 0; for (unsigned i = 0; i < HH_PPU_FG_SPRITE_COUNT; i++) { unsigned fam_offset = i * HH_PPU_VRAM_FAM_ENTRY_SIZE; - hh_ppu_data_t* fam = &g_hh_ppusim_vram[HH_PPU_VRAM_FAM_OFFSET + fam_offset]; - unsigned sprite_y = HH_RESIZE(fam[0], 15, 13) | HH_RESIZE(fam[1], 4, 0) << 3; - unsigned sprite_x = HH_RESIZE(fam[1], 13, 5); + hh_ppu_data_t *fam = &g_hh_ppusim_vram[HH_PPU_VRAM_FAM_OFFSET + fam_offset]; + unsigned sprite_y = HH_RESIZE(fam[0], 15, 13) | HH_RESIZE(fam[1], 4, 0) << 3; + unsigned sprite_x = HH_RESIZE(fam[1], 13, 5); if (x < sprite_x) continue; if (x >= sprite_x + HH_PPU_SPRITE_WIDTH) continue; if (y < sprite_y) continue; if (y >= sprite_y + HH_PPU_SPRITE_HEIGHT) continue; - unsigned loc_x = x - sprite_x; - unsigned loc_y = y - sprite_y; + unsigned loc_x = x - sprite_x; + unsigned loc_y = y - sprite_y; uint16_t tile_pixel_idx = hh_ppusim_apply_transform(loc_x, loc_y, HH_RESIZE(fam[1], 15, 15), HH_RESIZE(fam[1], 14, 14)); - uint16_t tile_idx = HH_RESIZE(fam[0], 9, 0); - hh_ppu_addr_t ttm_addr = tile_idx * HH_PPU_VRAM_TMM_SPRITE_SIZE + tile_pixel_idx / 5; - uint8_t word_bit_addr = (tile_pixel_idx % 5) * 3; - hh_ppu_data_t tmm = g_hh_ppusim_vram[HH_PPU_VRAM_TMM_OFFSET + ttm_addr]; - unsigned cidx_col = HH_RESIZE(tmm, word_bit_addr+2, word_bit_addr); + uint16_t tile_idx = HH_RESIZE(fam[0], 9, 0); + hh_ppu_addr_t ttm_addr = tile_idx * HH_PPU_VRAM_TMM_SPRITE_SIZE + tile_pixel_idx / 5; + uint8_t word_bit_addr = (tile_pixel_idx % 5) * 3; + hh_ppu_data_t tmm = g_hh_ppusim_vram[HH_PPU_VRAM_TMM_OFFSET + ttm_addr]; + unsigned cidx_col = HH_RESIZE(tmm, word_bit_addr + 2, word_bit_addr); if (cidx_col == 0) continue; unsigned cidx_pal = HH_RESIZE(fam[0], 12, 10); - cidx = (cidx_col << 0) | (cidx_pal << 3); + cidx = (cidx_col << 0) | (cidx_pal << 3); break; } return cidx; } -void hh_ppusim_pixel(uint8_t* s, unsigned x, unsigned y) { - uint8_t bg_cidx = hh_ppusim_bg_pixel(x, y); - uint8_t fg_cidx = hh_ppusim_fg_pixel(x, y); - uint8_t cidx = (fg_cidx & HH_MASK(3)) == 0 ? bg_cidx : fg_cidx; - hh_ppu_data_t pal_rgb = g_hh_ppusim_vram[HH_PPU_VRAM_PAL_OFFSET + cidx]; - hh_ppu_rgb_color_t rgb = { - HH_RESIZE(pal_rgb, 11, 8), - HH_RESIZE(pal_rgb, 7, 4), - HH_RESIZE(pal_rgb, 3, 0) - }; +void hh_ppusim_pixel(uint8_t *s, unsigned x, unsigned y) { + uint8_t bg_cidx = hh_ppusim_bg_pixel(x, y); + uint8_t fg_cidx = hh_ppusim_fg_pixel(x, y); + uint8_t cidx = (fg_cidx & HH_MASK(3)) == 0 ? bg_cidx : fg_cidx; + hh_ppu_data_t pal_rgb = g_hh_ppusim_vram[HH_PPU_VRAM_PAL_OFFSET + cidx]; + hh_ppu_rgb_color_t rgb = {HH_RESIZE(pal_rgb, 11, 8), HH_RESIZE(pal_rgb, 7, 4), HH_RESIZE(pal_rgb, 3, 0)}; s[0] = rgb[0] << 4; s[1] = rgb[1] << 4; s[2] = rgb[2] << 4; } - diff --git a/src/ppusim/sim.c b/src/ppusim/sim.c index 2816b31..449b78d 100644 --- a/src/ppusim/sim.c +++ b/src/ppusim/sim.c @@ -1,6 +1,6 @@ -#include <stdlib.h> -#include <stdbool.h> #include <SDL2/SDL.h> +#include <stdbool.h> +#include <stdlib.h> #include "main.h" #include "ppu/ppu.h" @@ -8,16 +8,17 @@ #include "ppusim/sim.h" #include "ppusim/work.h" -SDL_Window *g_hh_window = NULL; +SDL_Window *g_hh_window = NULL; SDL_Renderer *g_hh_renderer = NULL; void hh_ppu_init() { SDL_Init(SDL_INIT_VIDEO | SDL_INIT_EVENTS); - g_hh_window = SDL_CreateWindow("ppusim", SDL_WINDOWPOS_UNDEFINED, SDL_WINDOWPOS_UNDEFINED, HH_PPU_SCREEN_WIDTH * HH_PPUSIM_UPSCALE_FACTOR, HH_PPU_SCREEN_HEIGHT * HH_PPUSIM_UPSCALE_FACTOR, SDL_WINDOW_SHOWN); + g_hh_window = SDL_CreateWindow("ppusim", SDL_WINDOWPOS_UNDEFINED, SDL_WINDOWPOS_UNDEFINED, HH_PPU_SCREEN_WIDTH * HH_PPUSIM_UPSCALE_FACTOR, + HH_PPU_SCREEN_HEIGHT * HH_PPUSIM_UPSCALE_FACTOR, SDL_WINDOW_SHOWN); g_hh_renderer = SDL_CreateRenderer(g_hh_window, -1, SDL_RENDERER_ACCELERATED); g_hh_ppusim_core_count = SDL_GetCPUCount(); - g_hh_ppusim_threads = malloc(sizeof(pthread_t) * g_hh_ppusim_core_count); + g_hh_ppusim_threads = malloc(sizeof(pthread_t) * g_hh_ppusim_core_count); g_hh_ppusim_vram = malloc(sizeof(hh_ppu_data_t) * 0xffff); memset(g_hh_ppusim_vram, 0x0000, 0xffff); @@ -36,8 +37,9 @@ void hh_loop() { SDL_Event e; while (g_hh_run) { uint32_t start = SDL_GetTicks(); - while (SDL_PollEvent(&e)) if (e.type == SDL_QUIT) exit(0); - + while (SDL_PollEvent(&e)) + if (e.type == SDL_QUIT) exit(0); + hh_ppu_vblank_interrupt(); SDL_RenderClear(g_hh_renderer); diff --git a/src/ppusim/work.c b/src/ppusim/work.c index 3b9cee6..96d15aa 100644 --- a/src/ppusim/work.c +++ b/src/ppusim/work.c @@ -2,12 +2,12 @@ #include <pthread.h> #include <stdio.h> -#include "ppusim/work.h" -#include "ppusim/sim.h" #include "ppu/consts.h" #include "ppusim/pixel.h" +#include "ppusim/sim.h" +#include "ppusim/work.h" -pthread_t* g_hh_ppusim_threads; +pthread_t *g_hh_ppusim_threads; unsigned g_hh_ppusim_core_count; hh_s_ppusim_screen g_hh_ppusim_screen; @@ -15,29 +15,26 @@ hh_s_ppusim_screen g_hh_ppusim_screen; #pragma GCC diagnostic ignored "-Wint-to-pointer-cast" #pragma GCC diagnostic ignored "-Wpointer-to-int-cast" -void* hh_ppusim_draw_thread(void* arg) { - unsigned core = (unsigned long) arg; +void *hh_ppusim_draw_thread(void *arg) { + unsigned core = (unsigned long)arg; for (unsigned y = core; y < HH_PPU_SCREEN_HEIGHT; y += g_hh_ppusim_core_count) - for (unsigned x = 0; x < HH_PPU_SCREEN_WIDTH; x++) - hh_ppusim_pixel(g_hh_ppusim_screen[y][x], x, y); + for (unsigned x = 0; x < HH_PPU_SCREEN_WIDTH; x++) hh_ppusim_pixel(g_hh_ppusim_screen[y][x], x, y); return NULL; } -void hh_ppusim_draw_frame(SDL_Renderer* renderer) { - for (unsigned core = 0; core < g_hh_ppusim_core_count; core++) - pthread_create(&g_hh_ppusim_threads[core], NULL, hh_ppusim_draw_thread, (void*)(unsigned long)core); - for (unsigned core = 0; core < g_hh_ppusim_core_count; core++) - pthread_join(g_hh_ppusim_threads[core], NULL); - +void hh_ppusim_draw_frame(SDL_Renderer *renderer) { + for (unsigned core = 0; core < g_hh_ppusim_core_count; core++) pthread_create(&g_hh_ppusim_threads[core], NULL, hh_ppusim_draw_thread, (void *)(unsigned long)core); + for (unsigned core = 0; core < g_hh_ppusim_core_count; core++) pthread_join(g_hh_ppusim_threads[core], NULL); + for (unsigned x = 0; x < HH_PPU_SCREEN_WIDTH; x++) { for (unsigned y = 0; y < HH_PPU_SCREEN_HEIGHT; y++) { SDL_SetRenderDrawColor(renderer, g_hh_ppusim_screen[y][x][0], g_hh_ppusim_screen[y][x][1], g_hh_ppusim_screen[y][x][2], 255); - SDL_RenderFillRect(renderer, &(SDL_Rect) { - .x = x * HH_PPUSIM_UPSCALE_FACTOR, - .y = y * HH_PPUSIM_UPSCALE_FACTOR, - .w = HH_PPUSIM_UPSCALE_FACTOR, - .h = HH_PPUSIM_UPSCALE_FACTOR, - }); + SDL_RenderFillRect(renderer, &(SDL_Rect){ + .x = x * HH_PPUSIM_UPSCALE_FACTOR, + .y = y * HH_PPUSIM_UPSCALE_FACTOR, + .w = HH_PPUSIM_UPSCALE_FACTOR, + .h = HH_PPUSIM_UPSCALE_FACTOR, + }); } } } |