My example does the following:
1. I have a painted sprite the size of 4x3 cells, it is drawn in BG.
I put it on the screen at position 0,0. The rest of the space BG and FG is empty.
2. Now I read 2-bit pixel values from the screen, combine two values into one 4-bit value and save it in a table
3. I write down all the values from the received table into memory. For clarity, I wrote them down in the FG area, but this area can be any.
4. Now I show how you can display a 2-bit image.
Also, for clarity, I used the palette of the 2-bit CGA palette
Here you can see the animation
-- title: 2-bit sprite
-- author: Al Rado
-- desc: shows how convert native TIC-80 4-bit sprite to 2-bit
-- script: lua
-- input: gamepad
-- pal: 00000000ffffff00ffffffff000000000000000000000000000000000000000000000000000000000000000000000000
SPRITE_ADDR=0x4000*2
NIBBLES_IN_SPR=64
SPR_IX=256
ADDR=SPRITE_ADDR+NIBBLES_IN_SPR*SPR_IX
SPR_W=4*8
SPR_H=3*8
-- convert native sprite to 2-bit sprite and save to memory
cls()
spr(0,0,0,-1,1,0,0,4,3)
local nibbles={}
for i=0,SPR_W*SPR_H-1 do
nibbles[#nibbles+1]=pix(i%SPR_W,i/SPR_W)
end
for i=1,#nibbles,2 do
local first=nibbles[i] << 2
local second=nibbles[i+1]
poke4(ADDR+i//2, first+second)
end
-- draw 2-bit screen from memory
local posX=50
local posY=50
for i=1,SPR_W*SPR_H,2 do
local val=peek4(ADDR+i//2)
local first=val >> 2
local second=val - (first << 2)
pix(posX+(i-1)%SPR_W,posY+(i-1)/SPR_W,first)
pix(posX+(i)%SPR_W,posY+(i)/SPR_W,second)
end
function TIC()
-- not implemented
end