167 lines
2.7 KiB
C
167 lines
2.7 KiB
C
#include "vera.h"
|
|
|
|
void vram_addr(unsigned long addr)
|
|
{
|
|
vera.ctrl &= ~VERA_CTRL_ADDRSEL;
|
|
vera.addr = (unsigned)addr;
|
|
vera.addrh = (char)((addr >> 16) & 1) | 0x10;
|
|
}
|
|
|
|
void vram_addr0(unsigned long addr)
|
|
{
|
|
vera.ctrl &= ~VERA_CTRL_ADDRSEL;
|
|
vera.addr = (unsigned)addr;
|
|
vera.addrh = (char)((addr >> 16) & 1) | 0x00;
|
|
}
|
|
|
|
void vram_addr2(unsigned long addr)
|
|
{
|
|
vera.ctrl &= ~VERA_CTRL_ADDRSEL;
|
|
vera.addr = (unsigned)addr;
|
|
vera.addrh = (char)((addr >> 16) & 1) | 0x20;
|
|
}
|
|
|
|
void vram_put(char data)
|
|
{
|
|
vera.data0 = data;
|
|
}
|
|
|
|
void vram_putw(unsigned data)
|
|
{
|
|
vera.data0 = data & 0xff;
|
|
vera.data0 = data >> 8;
|
|
}
|
|
|
|
char vram_get(void)
|
|
{
|
|
return vera.data0;
|
|
}
|
|
|
|
unsigned vram_getw(void)
|
|
{
|
|
unsigned l = vera.data0;
|
|
unsigned h = vera.data0;
|
|
return (h << 8) | l;
|
|
}
|
|
|
|
|
|
void vram_put_at(unsigned long addr, char data)
|
|
{
|
|
vram_addr(addr);
|
|
vram_put(data);
|
|
}
|
|
|
|
char vram_get_at(unsigned long addr)
|
|
{
|
|
vram_addr(addr);
|
|
return vram_get();;
|
|
}
|
|
|
|
void vram_putn(unsigned long addr, const char * data, unsigned size)
|
|
{
|
|
vram_addr(addr);
|
|
while(size > 0)
|
|
{
|
|
vram_put(*data++);
|
|
size--;
|
|
}
|
|
}
|
|
|
|
void vram_getn(unsigned long addr, char * data, unsigned size)
|
|
{
|
|
vram_addr(addr);
|
|
|
|
while(size > 0)
|
|
{
|
|
*data++ = vram_get();
|
|
size--;
|
|
}
|
|
}
|
|
|
|
void vram_fill(unsigned long addr, char data, unsigned size)
|
|
{
|
|
vram_addr(addr);
|
|
|
|
while(size > 0)
|
|
{
|
|
vram_put(data);
|
|
size--;
|
|
}
|
|
}
|
|
|
|
|
|
void vera_spr_set(char spr, unsigned addr32, VERASpriteMode mode8, VERASpriteSize w, VERASpriteSize h, VERASpritePriority z, char pal)
|
|
{
|
|
__assume(spr < 128);
|
|
|
|
vram_addr(0x1fc00UL + spr * 8);
|
|
vram_putw(addr32 | (mode8 ? 0x8000 : 0x0000));
|
|
vram_putw(0);
|
|
vram_putw(0);
|
|
vram_put(z << 2);
|
|
vram_put((h << 6) | (w << 4) | pal);
|
|
}
|
|
|
|
void vera_spr_flip(char spr, bool fliph, bool flipv)
|
|
{
|
|
__assume(spr < 128);
|
|
|
|
vram_addr0(0x1fc00UL + spr * 8 + 6);
|
|
char b = vram_get() & 0xfc;
|
|
if (fliph) b |= 0x01;
|
|
if (flipv) b |= 0x02;
|
|
vram_put(b);
|
|
}
|
|
|
|
void vera_spr_move(char spr, int x, int y)
|
|
{
|
|
__assume(spr < 128);
|
|
|
|
vram_addr(0x1fc00UL + spr * 8 + 2);
|
|
vram_putw(x);
|
|
vram_putw(y);
|
|
}
|
|
|
|
void vera_spr_image(char spr, unsigned addr32)
|
|
{
|
|
__assume(spr < 128);
|
|
|
|
vram_addr(0x1fc00UL + spr * 8);
|
|
vram_put(addr32 & 0xff);
|
|
vera.addrh &= 0x0f;
|
|
char b = vram_get() & 0x80;
|
|
vram_put((addr32 >> 8) | b);
|
|
}
|
|
|
|
void vera_pal_put(char index, unsigned color)
|
|
{
|
|
vram_addr(0x1fa00ul + 2 * index);
|
|
vram_putw(color);
|
|
}
|
|
|
|
unsigned vera_pal_get(char index)
|
|
{
|
|
vram_addr(0x1fa00ul + 2 * index);
|
|
return vram_getw();
|
|
}
|
|
|
|
void vera_pal_putn(char index, const unsigned * color, unsigned size)
|
|
{
|
|
vram_addr(0x1fa00ul + 2 * index);
|
|
while (size > 0)
|
|
{
|
|
vram_putw(*color++);
|
|
size--;
|
|
}
|
|
}
|
|
|
|
void vera_pal_getn(char index, unsigned * color, unsigned size)
|
|
{
|
|
vram_addr(0x1fa00ul + 2 * index);
|
|
while (size > 0)
|
|
{
|
|
*color++ = vram_getw();
|
|
size--;
|
|
}
|
|
}
|