BDR - nesbox/TIC-80 GitHub Wiki
This was added to the API in version 0.90. See SCN for older carts.
The BDR callback allows you to execute code between the rendering of each scan line. The primary reason to do this is to manipulate the palette. Doing so makes it possible to use a different palette for each scan line, and therefore more than 16 colors at a time.
Usage
function BDR(scanline)
-- your code here
end
Parameters
- scanline : The scan line about to be drawn (0..143)
Details
+-----------+-----------------
| scanline | display |
+-----------+----------------+
| 0 - 3 | TOP BORDER |
| 4 | ROW 0 | equiv SCN(0)
| ... | ... | equiv SCN(n - 4)
| 139 | ROW 135 | equiv SCN(135)
| 140 - 143 | BOTTOM BORDER |
+-----------+----------------+
Example Glitch
Glitch effect using BDR:
-- 'Change screen offset in every scanline' demo
-- author: Vadim
shake=0
d=4
function TIC()
if btnp()~=0 then shake=30 end
if shake>0 then
poke(0x3FF9+1,math.random(-d,d))
shake=shake-1
if shake==0 then memset(0x3FF9,0,2) end
end
cls(12)
print("PRESS ANY KEY TO GLITCH!",54,64)
end
function BDR(row)
if shake>0 then
poke(0x3FF9,math.random(-d,d))
end
end
Example 256 Colors
The following example displays all 256 possible shades of gray. This can be done with any color.
-- title: 256 shades of gray
-- author: Marcuss2, fixed by nesbox
-- desc: Showoff of grayscale
-- script: lua
-- input: mouse
ADDR = 0x3FC0
palette = 0
function addLight()
for i=0, 15 do
for j=0, 2 do
poke(ADDR+(i*3)+j, palette)
end
palette = palette + 1
end
end
function BDR(scnline)
if scnline % 8 == 0 then
addLight()
end
end
function init()
for i=0, 16 do
rect(i*15, 0, 15, 240, i)
end
end
init()
function TIC()
palette = 0
end