summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMike Pavone <pavone@retrodev.com>2020-10-19 15:46:16 -0700
committerMike Pavone <pavone@retrodev.com>2020-10-19 15:46:16 -0700
commit581cca6792fd7e68e15c8268c8384e769584d50a (patch)
tree5bf3ffe41566d7464c70909875e96d5c18beac62
parenta132e67f7a2d728036edf5b8d56bb98766547721 (diff)
Add support for the parts of the KMod debug ports used by SGDK
-rw-r--r--vdp.c28
-rw-r--r--vdp.h9
2 files changed, 36 insertions, 1 deletions
diff --git a/vdp.c b/vdp.c
index b0e412f..81c7eec 100644
--- a/vdp.c
+++ b/vdp.c
@@ -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;
diff --git a/vdp.h b/vdp.h
index b58aca5..c33b42f 100644
--- a/vdp.h
+++ b/vdp.h
@@ -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];