diff options
-rw-r--r-- | vdp.c | 28 | ||||
-rw-r--r-- | vdp.h | 9 |
2 files changed, 36 insertions, 1 deletions
@@ -10,6 +10,7 @@ #include "render.h" #include "util.h" #include "event_log.h" +#include "terminal.h" #define NTSC_INACTIVE_START 224 #define PAL_INACTIVE_START 240 @@ -3782,6 +3783,33 @@ int vdp_control_port_write(vdp_context * context, uint16_t value) if (reg == REG_MODE_1 || reg == REG_MODE_2 || reg == REG_MODE_4) { update_video_params(context); } + } else if (reg == REG_KMOD_CTRL) { + if (!(value & 0xFF)) { + context->system->enter_debugger = 1; + } + } else if (reg == REG_KMOD_MSG) { + char c = value; + if (c) { + context->kmod_buffer_length++; + if ((context->kmod_buffer_length + 1) > context->kmod_buffer_storage) { + context->kmod_buffer_storage = context->kmod_buffer_length ? 128 : context->kmod_buffer_length * 2; + context->kmod_msg_buffer = realloc(context->kmod_msg_buffer, context->kmod_buffer_storage); + } + context->kmod_msg_buffer[context->kmod_buffer_length - 1] = c; + } else if (context->kmod_buffer_length) { + context->kmod_msg_buffer[context->kmod_buffer_length] = 0; + init_terminal(); + printf("KDEBUG MESSAGE: %s\n", context->kmod_msg_buffer); + context->kmod_buffer_length = 0; + } + } else if (reg == REG_KMOD_TIMER) { + if (!(value & 0x80)) { + init_terminal(); + printf("KDEBUG TIMER: %d\n", (context->cycles - context->timer_start_cycle) / 7); + } + if (value & 0xC0) { + context->timer_start_cycle = context->cycles; + } } } else if (mode_5) { context->flags |= FLAG_PENDING; @@ -91,7 +91,10 @@ enum { REG_DMALEN_H, REG_DMASRC_L, REG_DMASRC_M, - REG_DMASRC_H + REG_DMASRC_H, + REG_KMOD_CTRL=29, + REG_KMOD_MSG, + REG_KMOD_TIMER }; //Mode reg 1 @@ -168,6 +171,10 @@ typedef struct { uint32_t *fb; uint8_t *done_composite; uint32_t *debug_fbs[VDP_NUM_DEBUG_TYPES]; + char *kmod_msg_buffer; + uint32_t kmod_buffer_storage; + uint32_t kmod_buffer_length; + uint32_t timer_start_cycle; uint32_t output_pitch; uint32_t debug_fb_pitch[VDP_NUM_DEBUG_TYPES]; fifo_entry fifo[FIFO_SIZE]; |