8bitworkshop/presets/nes/vrambuf.c

48 lines
978 B
C

#include "neslib.h"
#include "vrambuf.h"
#pragma bss-name(push,"ZEROPAGE")
#pragma data-name(push,"ZEROPAGE")
// index to end of buffer
byte updptr = 0;
#pragma bss-name(pop)
#pragma data-name(pop)
// add EOF marker to buffer
void cendbuf(void) {
updbuf[updptr] = NT_UPD_EOF;
}
void cclearbuf(void) {
updptr = 0;
cendbuf();
}
// flush buffer now, waiting for next frame
void cflushnow(void) {
// make sure buffer has EOF marker
cendbuf();
// wait for next frame to flush update buffer
// this will also set the scroll registers properly
ppu_wait_frame();
// clear the buffer
cclearbuf();
}
// add multiple characters to update buffer
// using horizontal increment
void putbytes(word addr, const char* str, byte len) {
if (updptr >= VBUFSIZE-4-len) cflushnow();
updbuf[updptr] = (addr >> 8) ^ NT_UPD_HORZ;
updbuf[++updptr] = addr & 0xff;
updbuf[++updptr] = len;
while (len--) {
updbuf[++updptr] = *str++;
}
++updptr;
cendbuf();
}