sd2snes/src/rle.c
2011-02-08 01:08:08 +01:00

67 lines
1.4 KiB
C

#include "rle.h"
#include "fileops.h"
uint8_t rle_file_getc() {
static uint16_t rle_filled = 0;
static uint8_t data;
if(!rle_filled) {
data = file_getc();
switch(data) {
case RLE_RUN:
data = file_getc();
rle_filled = file_getc()-1;
break;
case RLE_RUNLONG:
data = file_getc();
rle_filled = file_getc();
rle_filled |= file_getc() << 8;
rle_filled--;
break;
case RLE_ESC:
data = file_getc();
break;
}
} else {
rle_filled--;
}
if(file_status || file_res) rle_filled = 0;
return data;
}
void rle_mem_init(const uint8_t* address, uint32_t len) {
rle_mem_ptr = address;
rle_mem_endptr = address+len;
rle_state = 0;
}
uint8_t rle_mem_getc() {
static uint16_t rle_mem_filled = 0;
static uint8_t rle_mem_data;
if(!rle_mem_filled) {
rle_mem_data = *(rle_mem_ptr++);
switch(rle_mem_data) {
case RLE_RUN:
rle_mem_data = *(rle_mem_ptr)++;
rle_mem_filled = *(rle_mem_ptr)++ - 1;
break;
case RLE_RUNLONG:
rle_mem_data = *(rle_mem_ptr)++;
rle_mem_filled = *(rle_mem_ptr)++;
rle_mem_filled |= *(rle_mem_ptr)++ << 8;
rle_mem_filled--;
break;
case RLE_ESC:
rle_mem_data = *(rle_mem_ptr)++;
break;
}
} else {
rle_mem_filled--;
}
if(rle_mem_ptr>=rle_mem_endptr){
rle_mem_filled = 0;
rle_state = 1;
}
return rle_mem_data;
}