diff options
author | Mike Pavone <pavone@retrodev.com> | 2013-10-29 00:03:11 -0700 |
---|---|---|
committer | Mike Pavone <pavone@retrodev.com> | 2013-10-29 00:03:11 -0700 |
commit | 2f5d44553a78ac5af6045e66f2061a25103f660c (patch) | |
tree | 7cfd7e01e175f3804fb5d5415e4536b8461e943a | |
parent | d0b2a6deb5c48fc0f40a979401ea8e99eea7a65e (diff) | |
parent | 6d63c50747b7747dc1d15eb7fdcca94e7be71298 (diff) |
Merge
-rw-r--r-- | io.c | 16 | ||||
-rw-r--r-- | vdp.c | 15 | ||||
-rw-r--r-- | vdp.h | 7 |
3 files changed, 32 insertions, 6 deletions
@@ -147,6 +147,16 @@ void bind_ui(int keycode, ui_action action, uint8_t param) bind_key(keycode, BIND_UI, action, 0, param); } +void bind_button_ui(int joystick, int joybutton, ui_action action, uint8_t param) +{ + bind_button(joystick, joybutton, BIND_UI, action, 0, param); +} + +void bind_dpad_ui(int joystick, int dpad, uint8_t direction, ui_action action, uint8_t param) +{ + bind_dpad(joystick, dpad, direction, BIND_UI, action, 0, param); +} + void handle_binding_down(keybinding * binding) { switch(binding->bind_type) @@ -487,8 +497,9 @@ void set_keybindings() int bindtype = parse_binding_target(target, padbuttons, &ui_func, &padnum, &button); if (bindtype == 1) { bind_dpad_gamepad(i, dpad, dirnums[dir], padnum, button); + } else if (bindtype == 2) { + bind_dpad_ui(i, dpad, dirnums[dir], ui_func, button); } - //TODO: Handle UI bindings } } } @@ -508,8 +519,9 @@ void set_keybindings() int bindtype = parse_binding_target(target, padbuttons, &ui_func, &padnum, &button); if (bindtype == 1) { bind_button_gamepad(i, but, padnum, button); + } else if (bindtype == 2) { + bind_button_ui(i, but, ui_func, button); } - //TODO: Handle UI bindings } } } @@ -159,10 +159,16 @@ void render_sprite_cells(vdp_context * context) context->cur_slot--; for (uint16_t address = d->address; address != ((d->address+4) & 0xFFFF); address++) { if (x >= 0 && x < 320 && !(context->linebuf[x] & 0xF)) { + if (context->linebuf[x] && (context->vdpmem[address] >> 4)) { + context->flags2 |= FLAG2_SPRITE_COLLIDE; + } context->linebuf[x] = (context->vdpmem[address] >> 4) | d->pal_priority; } x += dir; if (x >= 0 && x < 320 && !(context->linebuf[x] & 0xF)) { + if (context->linebuf[x] && (context->vdpmem[address] & 0xF)) { + context->flags2 |= FLAG2_SPRITE_COLLIDE; + } context->linebuf[x] = (context->vdpmem[address] & 0xF) | d->pal_priority; } x += dir; @@ -1542,6 +1548,14 @@ uint16_t vdp_control_port_read(vdp_context * context) if (context->flags2 & FLAG2_VINT_PENDING) { value |= 0x80; } + if (context->flags & FLAG_DOT_OFLOW) { + value |= 0x40; + } + if (context->flags2 & FLAG2_SPRITE_COLLIDE) { + value |= 0x20; + //TODO: Test when this is actually cleared + context->flags2 &= ~FLAG2_SPRITE_COLLIDE; + } if ((context->regs[REG_MODE_4] & BIT_INTERLACE) && context->framebuf == context->oddbuf) { value |= 0x10; } @@ -1560,7 +1574,6 @@ uint16_t vdp_control_port_read(vdp_context * context) value |= 0x1; } //printf("status read at cycle %d returned %X\n", context->cycles, value); - //TODO: Sprite overflow, sprite collision, odd frame flag return value; } @@ -45,9 +45,10 @@ #define FLAG_DMA_RUN 0x40 #define FLAG_DMA_PROG 0x80 -#define FLAG2_VINT_PENDING 0x01 -#define FLAG2_HINT_PENDING 0x02 -#define FLAG2_READ_PENDING 0x04 +#define FLAG2_VINT_PENDING 0x01 +#define FLAG2_HINT_PENDING 0x02 +#define FLAG2_READ_PENDING 0x04 +#define FLAG2_SPRITE_COLLIDE 0x08 #define DISPLAY_ENABLE 0x40 |