66 lines
2.9 KiB
Lua
66 lines
2.9 KiB
Lua
-- Sprite visualizer
|
|
--
|
|
-- Draws a box around all sprites on screen,
|
|
-- hover with the mouse to inspect data.
|
|
--
|
|
-- Original by tokumaru 2016-10-08:
|
|
-- https://forums.nesdev.com/viewtopic.php?p=181008#p181008
|
|
|
|
numSpriteHeight = 8
|
|
strFillColor = "#ffffff3f"
|
|
strOutlineColor = "#ff0000bf"
|
|
strHighlightColor = "#ffffffbf"
|
|
|
|
function readSpriteAttributes(a,s,v)
|
|
local numAddress = v * 256
|
|
tabSpriteAttributes = {}
|
|
for numIndex = 0, 255 do
|
|
table.insert(tabSpriteAttributes, memory.readbyte(numAddress + numIndex))
|
|
end
|
|
end
|
|
|
|
function setSpriteHeight(a,s,v)
|
|
if AND(a, 7) == 0 then
|
|
numSpriteHeight = AND((v / 4), 8) + 8
|
|
end
|
|
end
|
|
|
|
function drawBoxes()
|
|
local tabInput, numSpriteX, numSpriteY, numDetailsBase, numTextY = input.read()
|
|
if tabSpriteAttributes ~= nill then
|
|
for numBase = 252, 0, -4 do
|
|
numSpriteX0 = tabSpriteAttributes[numBase + 4]
|
|
numSpriteY0 = tabSpriteAttributes[numBase + 1] + 1
|
|
numSpriteX1 = numSpriteX0 + 7
|
|
numSpriteY1 = numSpriteY0 + numSpriteHeight - 1
|
|
if (tabInput.xmouse >= numSpriteX0) and (tabInput.xmouse <= numSpriteX1) and (tabInput.ymouse >= numSpriteY0) and (tabInput.ymouse <= numSpriteY1) then
|
|
gui.box(numSpriteX0, numSpriteY0, numSpriteX1, numSpriteY1, strHighlightColor, strOutlineColor)
|
|
numDetailsBase = numBase
|
|
else
|
|
gui.box(numSpriteX0, numSpriteY0, numSpriteX1, numSpriteY1, strFillColor, strOutlineColor)
|
|
end
|
|
end
|
|
end
|
|
if numDetailsBase ~= nil then
|
|
numTextY = (1 - math.floor(tabInput.ymouse / 120)) * 127 + 16
|
|
gui.text(16, numTextY, string.format("OAM Slot: %d", numDetailsBase / 4)); numTextY = numTextY + 9
|
|
gui.text(16, numTextY, string.format("OAM Offset: $%02X", numDetailsBase)); numTextY = numTextY + 9
|
|
gui.text(16, numTextY, string.format("Sprite X: $%02X", tabSpriteAttributes[numDetailsBase + 4])); numTextY = numTextY + 9
|
|
gui.text(16, numTextY, string.format("Sprite Y: $%02X", tabSpriteAttributes[numDetailsBase + 1])); numTextY = numTextY + 9
|
|
gui.text(16, numTextY, string.format("Tile ID: $%02X", tabSpriteAttributes[numDetailsBase + 2])); numTextY = numTextY + 9
|
|
gui.text(16, numTextY, string.format("Palette: %d", AND(tabSpriteAttributes[numDetailsBase + 3], 0x03))); numTextY = numTextY + 9
|
|
gui.text(16, numTextY, string.format("Behind Background: %d", AND(tabSpriteAttributes[numDetailsBase + 3], 0x20) / 0x20)); numTextY = numTextY + 9
|
|
gui.text(16, numTextY, string.format("Flip X: %d", AND(tabSpriteAttributes[numDetailsBase + 3], 0x40) / 0x40)); numTextY = numTextY + 9
|
|
gui.text(16, numTextY, string.format("Flip Y: %d", AND(tabSpriteAttributes[numDetailsBase + 3], 0x80) / 0x80)); numTextY = numTextY + 9
|
|
end
|
|
gui.box(tabInput.xmouse - 2, tabInput.ymouse - 2, tabInput.xmouse + 2, tabInput.ymouse + 2, strHighlightColor, strOutlineColor)
|
|
end
|
|
|
|
memory.registerwrite(0x4014, 0x0001, readSpriteAttributes)
|
|
memory.registerwrite(0x2000, 0x2000, setSpriteHeight)
|
|
gui.register(drawBoxes)
|
|
|
|
while (true) do
|
|
emu.frameadvance()
|
|
end
|