1
0
mirror of https://github.com/mist-devel/mist-board.git synced 2026-02-07 00:17:07 +00:00

[Gameboy] Sprite fixes from brNX

This commit is contained in:
Gyorgy Szombathelyi
2019-06-28 19:32:24 +02:00
parent 393aa60b0a
commit 8300476140
3 changed files with 11 additions and 24 deletions

View File

@@ -22,6 +22,8 @@
module sprite (
input clk,
input size16,
input isGBC,
input [7:0] sprite_index,
input [7:0] v_cnt,
input [7:0] h_cnt,
@@ -41,7 +43,6 @@ module sprite (
//gbc
output [2:0] pixel_cmap_gbc,
output tile_vbank,
input oam_wr,
input [1:0] oam_addr,
@@ -51,7 +52,7 @@ module sprite (
// x position for priority detection. Invisible sprites are far to the right and
// have minimum priority
assign x = v_visible?x_pos:8'hff;
assign x = v_visible?isGBC?sprite_index:x_pos:8'hff;
// register used to store pixel data for current line
reg [7:0] data0;
@@ -88,7 +89,6 @@ assign pixel_cmap = flags[4];
assign pixel_prio = flags[7];
assign pixel_cmap_gbc = flags[2:0];
assign tile_vbank = flags[3];
reg [7:0] y_pos;
reg [7:0] x_pos;

View File

@@ -23,6 +23,7 @@ module sprites (
input clk,
input clk_reg,
input size16,
input isGBC,
// pixel position input which the current pixel is generated for
input [7:0] v_cnt,
@@ -36,8 +37,7 @@ module sprites (
//gbc
output [2:0] pixel_cmap_gbc,
output tile_vbank,
input sort,
input [3:0] index, // index of sprite which video wants to read data for
output [10:0] addr,
@@ -82,7 +82,8 @@ assign oam_do = sprite_oam_do[oam_addr[7:2]];
// address where the sprite wants to read data from
wire [5:0] sprite_idx_array [SPRITES-1:0];
wire [5:0] prio_index = sprite_idx_array[index];
wire [5:0] padded_index = {2'd0,index};
wire [5:0] prio_index = sprite_idx_array[padded_index];
assign addr = sprite_addr[prio_index];
//gbc
@@ -98,6 +99,9 @@ for(i=0;i<SPRITES;i=i+1) begin : spr
sprite sprite (
.clk ( clk_reg ),
.size16 ( size16 ),
.isGBC ( isGBC ),
.sprite_index ( i ),
.v_cnt ( v_cnt ),
.h_cnt ( h_cnt ),
@@ -116,7 +120,6 @@ for(i=0;i<SPRITES;i=i+1) begin : spr
//gbc
.pixel_cmap_gbc ( sprite_pixel_cmap_gbc[i] ),
.tile_vbank ( sprite_tile_vbank[i] ),
.oam_wr ( oam_wr && (oam_addr[7:2] == i) ),
.oam_addr ( oam_addr[1:0] ),
@@ -200,21 +203,6 @@ assign pixel_cmap_gbc =
sprite_pixel_active[spr9]?sprite_pixel_cmap_gbc[spr9]:
1'b0;
// get the tile vbank of the leftmost sprite
assign tile_vbank =
sprite_pixel_active[spr0]?sprite_tile_vbank[spr0]:
sprite_pixel_active[spr1]?sprite_tile_vbank[spr1]:
sprite_pixel_active[spr2]?sprite_tile_vbank[spr2]:
sprite_pixel_active[spr3]?sprite_tile_vbank[spr3]:
sprite_pixel_active[spr4]?sprite_tile_vbank[spr4]:
sprite_pixel_active[spr5]?sprite_tile_vbank[spr5]:
sprite_pixel_active[spr6]?sprite_tile_vbank[spr6]:
sprite_pixel_active[spr7]?sprite_tile_vbank[spr7]:
sprite_pixel_active[spr8]?sprite_tile_vbank[spr8]:
sprite_pixel_active[spr9]?sprite_tile_vbank[spr9]:
1'b0;
// get the priority of the leftmost sprite
assign pixel_prio =
sprite_pixel_active[spr0]?sprite_pixel_prio[spr0]:

View File

@@ -71,7 +71,6 @@ wire [10:0] sprite_addr;
//gbc
wire [2:0] sprite_pixel_cmap_gbc;
wire sprite_tile_vbank;
// "data strobe" for the two bytes each sprite line consists of
wire [1:0] sprite_dvalid = {
@@ -82,6 +81,7 @@ sprites sprites (
.clk ( clk ),
.clk_reg ( clk_reg ),
.size16 ( lcdc_spr_siz ),
.isGBC ( isGBC ),
.v_cnt ( v_cnt ),
.h_cnt ( h_cnt-STAGE2 ), // sprites are added in second stage
@@ -100,7 +100,6 @@ sprites sprites (
//gbc
.pixel_cmap_gbc ( sprite_pixel_cmap_gbc ),
.tile_vbank ( sprite_tile_vbank ),
.oam_wr ( oam_wr ),
.oam_addr ( oam_addr ),