#include "vram.h"
|
|
|
|
#include <string.h>
|
|
|
|
#include "game.h"
|
|
#include "sdk/video.h"
|
|
|
|
mem_xfer_t mem_xfer_queue[MAX_XFERS];
|
|
uint8_t mem_xfer_queue_size;
|
|
|
|
void vram_init(void) { mem_xfer_queue_size = 0; }
|
|
|
|
static inline void vram_xfer_row(uint8_t *dest, const uint8_t *source,
|
|
uint8_t size) {
|
|
while (size > 0) {
|
|
*dest++ = *source++;
|
|
if ((uint8_t)dest % 32 == 0) {
|
|
dest -= 32;
|
|
}
|
|
size--;
|
|
}
|
|
}
|
|
|
|
static inline void vram_xfer_col(uint8_t *dest, const uint8_t *source,
|
|
uint8_t size) {
|
|
while (size > 0) {
|
|
*dest = *source++;
|
|
dest += SCRN_VX_B;
|
|
if ((uint16_t)dest >= _SCRN1) {
|
|
dest -= _SCRN1 - _SCRN0;
|
|
}
|
|
size--;
|
|
}
|
|
}
|
|
|
|
void vram_update(void) {
|
|
mem_xfer_t *xfer = &mem_xfer_queue[0];
|
|
for (uint8_t i = 0; i < mem_xfer_queue_size; i++) {
|
|
if (xfer->type == XFER_TYPE_ROW) {
|
|
vram_xfer_row((uint8_t *)xfer->dest, xfer->source, xfer->size);
|
|
} else {
|
|
vram_xfer_col((uint8_t *)xfer->dest, xfer->source, xfer->size);
|
|
}
|
|
xfer++;
|
|
}
|
|
mem_xfer_queue_size = 0;
|
|
}
|