oscar64/include/cx16/vera.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--;
}
}