summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--event_log.c51
-rw-r--r--event_log.h9
-rw-r--r--vdp.c22
3 files changed, 68 insertions, 14 deletions
diff --git a/event_log.c b/event_log.c
index 0abfafe..63122cf 100644
--- a/event_log.c
+++ b/event_log.c
@@ -104,9 +104,39 @@ void event_system_start(system_type stype, vid_std video_std, char *name)
//Four byte: 8-bit type, 24-bit signed delta
#define FORMAT_3BYTE 0xE0
#define FORMAT_4BYTE 0xF0
+static uint8_t last_event_type = 0xFF;
+static uint32_t last_delta;
+static uint8_t multi_count;
+static size_t multi_start;
static void event_header(uint8_t type, uint32_t cycle)
{
uint32_t delta = cycle - last;
+ if (multi_count) {
+ if (type != last_event_type || delta != last_delta) {
+ buffer.data[multi_start] |= multi_count - 2;
+ multi_count = 0;
+ } else {
+ ++multi_count;
+ if (multi_count == 17) {
+ buffer.data[multi_start] |= multi_count - 2;
+ last_event_type = 0xFF;
+ multi_count = 0;
+ }
+ return;
+ }
+ } else if (type == last_event_type && delta == last_delta) {
+ //make some room
+ save_int8(&buffer, 0);
+ //shift existing command
+ memmove(buffer.data + multi_start + 1, buffer.data + multi_start, buffer.size - multi_start - 1);
+ buffer.data[multi_start] = EVENT_MULTI << 4;
+ multi_count = 2;
+ return;
+ }
+ multi_start = buffer.size;
+ last_event_type = type;
+ last_delta = delta;
+
if (delta > 65535) {
save_int8(&buffer, FORMAT_4BYTE | type);
save_int8(&buffer, delta >> 16);
@@ -202,6 +232,8 @@ static void flush_socket(void)
if (min_progress == buffer.size) {
buffer.size = 0;
memset(remote_send_progress, 0, sizeof(remote_send_progress));
+ multi_count = 0;
+ last_event_type = 0xFF;
}
}
@@ -312,6 +344,8 @@ void event_flush(uint32_t cycle)
fwrite(buffer.data, 1, buffer.size, event_file);
fflush(event_file);
buffer.size = 0;
+ multi_count = 0;
+ last_event_type = 0xFF;
} else if (listen_sock) {
flush_socket();
}
@@ -321,6 +355,7 @@ void init_event_reader(event_reader *reader, uint8_t *data, size_t size)
{
reader->socket = 0;
reader->last_cycle = 0;
+ reader->repeat_event = 0xFF;
init_deserialize(&reader->buffer, data, size);
}
@@ -361,6 +396,12 @@ void init_event_reader_tcp(event_reader *reader, char *address, char *port)
uint8_t reader_next_event(event_reader *reader, uint32_t *cycle_out)
{
+ if (reader->repeat_remaining) {
+ reader->repeat_remaining--;
+ *cycle_out = reader->last_cycle + reader->repeat_delta;
+ reader->last_cycle = *cycle_out;
+ return reader->repeat_event;
+ }
if (reader->socket) {
uint8_t blocking = 0;
if (reader->buffer.size - reader->buffer.cur_pos < 9) {
@@ -394,6 +435,12 @@ uint8_t reader_next_event(event_reader *reader, uint32_t *cycle_out)
uint8_t header = load_int8(&reader->buffer);
uint8_t ret;
uint32_t delta;
+ uint8_t multi_start = 0;
+ if ((header & 0xF0) == (EVENT_MULTI << 4)) {
+ reader->repeat_remaining = (header & 0xF) + 1;
+ multi_start = 1;
+ header = load_int8(&reader->buffer);
+ }
if ((header & 0xF0) < FORMAT_3BYTE) {
delta = (header & 0xF) + 16;
ret = header >> 4;
@@ -409,6 +456,10 @@ uint8_t reader_next_event(event_reader *reader, uint32_t *cycle_out)
delta |= load_int16(&reader->buffer);
ret = header & 0xF;
}
+ if (multi_start) {
+ reader->repeat_event = ret;
+ reader->repeat_delta = delta;
+ }
*cycle_out = reader->last_cycle + delta;
reader->last_cycle = *cycle_out;
if (ret == EVENT_ADJUST) {
diff --git a/event_log.h b/event_log.h
index e994b8f..5080f80 100644
--- a/event_log.h
+++ b/event_log.h
@@ -13,9 +13,9 @@ enum {
EVENT_VRAM_BYTE_AUTO = 8,
EVENT_VRAM_WORD = 9,
EVENT_VRAM_WORD_DELTA = 10,
- EVENT_CRAM = 11,
- EVENT_VSRAM = 12,
- EVENT_STATE = 13
+ EVENT_VDP_INTRAM = 11,
+ EVENT_STATE = 12,
+ EVENT_MULTI = 13
//14 and 15 are reserved for header types
};
@@ -26,7 +26,10 @@ typedef struct {
uint32_t last_cycle;
uint32_t last_word_address;
uint32_t last_byte_address;
+ uint32_t repeat_delta;
deserialize_buffer buffer;
+ uint8_t repeat_event;
+ uint8_t repeat_remaining;
} event_reader;
#include "system.h"
diff --git a/vdp.c b/vdp.c
index 3b6677f..3bf05cd 100644
--- a/vdp.c
+++ b/vdp.c
@@ -939,8 +939,8 @@ static void external_slot(vdp_context * context)
} else {
val = start->partial ? context->fifo[context->fifo_write].value : start->value;
}
- uint8_t buffer[3] = {start->address, val >> 8, val};
- event_log(EVENT_CRAM, context->cycles, sizeof(buffer), buffer);
+ uint8_t buffer[3] = {start->address & 127, val >> 8, val};
+ event_log(EVENT_VDP_INTRAM, context->cycles, sizeof(buffer), buffer);
write_cram(context, start->address, val);
break;
}
@@ -958,8 +958,8 @@ static void external_slot(vdp_context * context)
} else {
context->vsram[(start->address/2) & 63] = start->partial ? context->fifo[context->fifo_write].value : start->value;
}
- uint8_t buffer[3] = {(start->address/2) & 63, context->vsram[(start->address/2) & 63] >> 8, context->vsram[(start->address/2) & 63]};
- event_log(EVENT_VSRAM, context->cycles, sizeof(buffer), buffer);
+ uint8_t buffer[3] = {((start->address/2) & 63) + 128, context->vsram[(start->address/2) & 63] >> 8, context->vsram[(start->address/2) & 63]};
+ event_log(EVENT_VDP_INTRAM, context->cycles, sizeof(buffer), buffer);
}
break;
@@ -4590,8 +4590,7 @@ void vdp_replay_event(vdp_context *context, uint8_t event, event_reader *reader)
address = reader->last_word_address + load_int8(buffer);
break;
case EVENT_VDP_REG:
- case EVENT_CRAM:
- case EVENT_VSRAM:
+ case EVENT_VDP_INTRAM:
address = load_int8(buffer);
break;
}
@@ -4630,11 +4629,12 @@ void vdp_replay_event(vdp_context *context, uint8_t event, event_reader *reader)
write_vram_word(context, address, value);
break;
}
- case EVENT_CRAM:
- write_cram(context, address, load_int16(buffer));
- break;
- case EVENT_VSRAM:
- context->vsram[address] = load_int16(buffer);
+ case EVENT_VDP_INTRAM:
+ if (address < 128) {
+ write_cram(context, address, load_int16(buffer));
+ } else {
+ context->vsram[address&63] = load_int16(buffer);
+ }
break;
}
}