[4.5.X] 8x8 Detailed Screens - Cleaning up your Screen Banks

CutterCross

Active member
You likely already know that you can sacrifice 2 rows of 16x16 metatile-based gameplay screens on your Overworld / Underworld maps for 1 row of 8x8 tile-based detailed screens. Every 2 rows of 16x16 gameplay screens (or 1 row of 8x8 detailed screens) represents 1 bank of screen data. If you use 8x8 detailed screens for a bank, the nametable data for all the extra 16x16 gameplay screens will be gone. Except... what's all this extra data in the screen banks when viewing the ROM in Shiru's NES Space Checker?

PE_ScreenBank00_ExtraData.png

It turns out that while the nametable data for the 16x16 gameplay screens is cleared when using 8x8 detailed screens, the collision and attribute table data for each screen is not. So each bank that uses 8x8 detailed screens has unnecessary data corresponding to screens that don't exist anymore in your project.

An easy way to free this unused data is to simply comment out the nametable, attribute table, and collision table .includes for these unused screens in your bank data. The first 8 sets of these .includes correspond to your 8x8 detailed screens, leave these uncommented. Also leave all of the labels themselves uncommented.

Here is an example for Bank $00 [Bank00.asm]:
Code:
NT_Rm00:
.include "ScreenData\Nametables\Screen_Over_00.nam"

Ct00:
.include "ScreenData\CollisionTables\Screen_Over_00.col"

AT_Rm00:
.include "ScreenData\AttributeTables\Screen_Over_00.att"



NT_Rm01:
.include "ScreenData\Nametables\Screen_Over_01.nam"

Ct01:
.include "ScreenData\CollisionTables\Screen_Over_01.col"

AT_Rm01:
.include "ScreenData\AttributeTables\Screen_Over_01.att"



NT_Rm02:
.include "ScreenData\Nametables\Screen_Over_02.nam"

Ct02:
.include "ScreenData\CollisionTables\Screen_Over_02.col"

AT_Rm02:
.include "ScreenData\AttributeTables\Screen_Over_02.att"



NT_Rm03:
.include "ScreenData\Nametables\Screen_Over_03.nam"

Ct03:
.include "ScreenData\CollisionTables\Screen_Over_03.col"

AT_Rm03:
.include "ScreenData\AttributeTables\Screen_Over_03.att"



NT_Rm04:
.include "ScreenData\Nametables\Screen_Over_04.nam"

Ct04:
.include "ScreenData\CollisionTables\Screen_Over_04.col"

AT_Rm04:
.include "ScreenData\AttributeTables\Screen_Over_04.att"



NT_Rm05:
.include "ScreenData\Nametables\Screen_Over_05.nam"

Ct05:
.include "ScreenData\CollisionTables\Screen_Over_05.col"

AT_Rm05:
.include "ScreenData\AttributeTables\Screen_Over_05.att"



NT_Rm06:
.include "ScreenData\Nametables\Screen_Over_06.nam"

Ct06:
.include "ScreenData\CollisionTables\Screen_Over_06.col"

AT_Rm06:
.include "ScreenData\AttributeTables\Screen_Over_06.att"



NT_Rm07:
.include "ScreenData\Nametables\Screen_Over_07.nam"

Ct07:
.include "ScreenData\CollisionTables\Screen_Over_07.col"

AT_Rm07:
.include "ScreenData\AttributeTables\Screen_Over_07.att"



NT_Rm08:
;.include "ScreenData\Nametables\Screen_Over_08.nam"

Ct08:
;.include "ScreenData\CollisionTables\Screen_Over_08.col"

AT_Rm08:
;.include "ScreenData\AttributeTables\Screen_Over_08.att"



NT_Rm09:
;.include "ScreenData\Nametables\Screen_Over_09.nam"

Ct09:
;.include "ScreenData\CollisionTables\Screen_Over_09.col"

AT_Rm09:
;.include "ScreenData\AttributeTables\Screen_Over_09.att"



NT_Rm10:
;.include "ScreenData\Nametables\Screen_Over_0A.nam"

Ct10:
;.include "ScreenData\CollisionTables\Screen_Over_0A.col"

AT_Rm10:
;.include "ScreenData\AttributeTables\Screen_Over_0A.att"



NT_Rm11:
;.include "ScreenData\Nametables\Screen_Over_0B.nam"

Ct11:
;.include "ScreenData\CollisionTables\Screen_Over_0B.col"

AT_Rm11:
;.include "ScreenData\AttributeTables\Screen_Over_0B.att"



NT_Rm12:
;.include "ScreenData\Nametables\Screen_Over_0C.nam"

Ct12:
;.include "ScreenData\CollisionTables\Screen_Over_0C.col"

AT_Rm12:
;.include "ScreenData\AttributeTables\Screen_Over_0C.att"



NT_Rm13:
;.include "ScreenData\Nametables\Screen_Over_0D.nam"

Ct13:
;.include "ScreenData\CollisionTables\Screen_Over_0D.col"

AT_Rm13:
;.include "ScreenData\AttributeTables\Screen_Over_0D.att"



NT_Rm14:
;.include "ScreenData\Nametables\Screen_Over_0E.nam"

Ct14:
;.include "ScreenData\CollisionTables\Screen_Over_0E.col"

AT_Rm14:
;.include "ScreenData\AttributeTables\Screen_Over_0E.att"



NT_Rm15:
;.include "ScreenData\Nametables\Screen_Over_0F.nam"

Ct15:
;.include "ScreenData\CollisionTables\Screen_Over_0F.col"

AT_Rm15:
;.include "ScreenData\AttributeTables\Screen_Over_0F.att"



NT_Rm16:
;.include "ScreenData\Nametables\Screen_Over_10.nam"

Ct16:
;.include "ScreenData\CollisionTables\Screen_Over_10.col"

AT_Rm16:
;.include "ScreenData\AttributeTables\Screen_Over_10.att"



NT_Rm17:
;.include "ScreenData\Nametables\Screen_Over_11.nam"

Ct17:
;.include "ScreenData\CollisionTables\Screen_Over_11.col"

AT_Rm17:
;.include "ScreenData\AttributeTables\Screen_Over_11.att"



NT_Rm18:
;.include "ScreenData\Nametables\Screen_Over_12.nam"

Ct18:
;.include "ScreenData\CollisionTables\Screen_Over_12.col"

AT_Rm18:
;.include "ScreenData\AttributeTables\Screen_Over_12.att"



NT_Rm19:
;.include "ScreenData\Nametables\Screen_Over_13.nam"

Ct19:
;.include "ScreenData\CollisionTables\Screen_Over_13.col"

AT_Rm19:
;.include "ScreenData\AttributeTables\Screen_Over_13.att"



NT_Rm20:
;.include "ScreenData\Nametables\Screen_Over_14.nam"

Ct20:
;.include "ScreenData\CollisionTables\Screen_Over_14.col"

AT_Rm20:
;.include "ScreenData\AttributeTables\Screen_Over_14.att"



NT_Rm21:
;.include "ScreenData\Nametables\Screen_Over_15.nam"

Ct21:
;.include "ScreenData\CollisionTables\Screen_Over_15.col"

AT_Rm21:
;.include "ScreenData\AttributeTables\Screen_Over_15.att"



NT_Rm22:
;.include "ScreenData\Nametables\Screen_Over_16.nam"

Ct22:
;.include "ScreenData\CollisionTables\Screen_Over_16.col"

AT_Rm22:
;.include "ScreenData\AttributeTables\Screen_Over_16.att"



NT_Rm23:
;.include "ScreenData\Nametables\Screen_Over_17.nam"

Ct23:
;.include "ScreenData\CollisionTables\Screen_Over_17.col"

AT_Rm23:
;.include "ScreenData\AttributeTables\Screen_Over_17.att"



NT_Rm24:
;.include "ScreenData\Nametables\Screen_Over_18.nam"

Ct24:
;.include "ScreenData\CollisionTables\Screen_Over_18.col"

AT_Rm24:
;.include "ScreenData\AttributeTables\Screen_Over_18.att"



NT_Rm25:
;.include "ScreenData\Nametables\Screen_Over_19.nam"

Ct25:
;.include "ScreenData\CollisionTables\Screen_Over_19.col"

AT_Rm25:
;.include "ScreenData\AttributeTables\Screen_Over_19.att"



NT_Rm26:
;.include "ScreenData\Nametables\Screen_Over_1A.nam"

Ct26:
;.include "ScreenData\CollisionTables\Screen_Over_1A.col"

AT_Rm26:
;.include "ScreenData\AttributeTables\Screen_Over_1A.att"



NT_Rm27:
;.include "ScreenData\Nametables\Screen_Over_1B.nam"

Ct27:
;.include "ScreenData\CollisionTables\Screen_Over_1B.col"

AT_Rm27:
;.include "ScreenData\AttributeTables\Screen_Over_1B.att"



NT_Rm28:
;.include "ScreenData\Nametables\Screen_Over_1C.nam"

Ct28:
;.include "ScreenData\CollisionTables\Screen_Over_1C.col"

AT_Rm28:
;.include "ScreenData\AttributeTables\Screen_Over_1C.att"



NT_Rm29:
;.include "ScreenData\Nametables\Screen_Over_1D.nam"

Ct29:
;.include "ScreenData\CollisionTables\Screen_Over_1D.col"

AT_Rm29:
;.include "ScreenData\AttributeTables\Screen_Over_1D.att"



NT_Rm30:
;.include "ScreenData\Nametables\Screen_Over_1E.nam"

Ct30:
;.include "ScreenData\CollisionTables\Screen_Over_1E.col"

AT_Rm30:
;.include "ScreenData\AttributeTables\Screen_Over_1E.att"



NT_Rm31:
;.include "ScreenData\Nametables\Screen_Over_1F.nam"

Ct31:
;.include "ScreenData\CollisionTables\Screen_Over_1F.col"

AT_Rm31:
;.include "ScreenData\AttributeTables\Screen_Over_1F.att"



I exclusively use 8x8 detailed screens for my current project, and getting rid of this unused data in each screen bank saves a considerable amount of ROM space! This gives me plenty of room for manually including extra nametables, routines, or more likely in my case... more CHR graphics tilesets.

Before:
PE_ScreenBanks_BeforeCleanup.PNG

After:
PE_ScreenBanks_AfterCleanup.PNG

Hope this will be useful to users doing some more advanced things with their NESmaker projects!
 
Last edited:

CutterCross

Active member
In this example, is it your first row of screens that are 8x8 ?
All of my screens are 8x8, but I'm using Bank $00 as an isolated example. The first row of screens are 8x8, yes. If you were both mixing 8x8 and 16x16 screens, you would have to keep track of what bank uses 8x8 and what bank uses 16x16. Then only modify the 8x8 ones.
 

FuncleDude

New member
I'm just now seeing this post, and my goodness is this great stuff! While I don't mind using 16x16 metatiles, I do find it a bit restrictive when crafting screens/nametables.
 
Top Bottom