changeset 499:27345a67225d

Merge
author Mike Pavone <pavone@retrodev.com>
date Tue, 29 Oct 2013 00:03:11 -0700
parents 51bf87f76d15 (current diff) 8ac0eb05642c (diff)
children 251fe7a75a14
files vdp.c
diffstat 3 files changed, 32 insertions(+), 6 deletions(-) [+]
line wrap: on
line diff
--- a/io.c	Mon Oct 28 23:59:59 2013 -0700
+++ b/io.c	Tue Oct 29 00:03:11 2013 -0700
@@ -147,6 +147,16 @@
 	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 @@
 						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 @@
 					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
 				}
 			}
 		}
--- a/vdp.c	Mon Oct 28 23:59:59 2013 -0700
+++ b/vdp.c	Tue Oct 29 00:03:11 2013 -0700
@@ -159,10 +159,16 @@
 		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 @@
 	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 @@
 		value |= 0x1;
 	}
 	//printf("status read at cycle %d returned %X\n", context->cycles, value);
-	//TODO: Sprite overflow, sprite collision, odd frame flag
 	return value;
 }
 
--- a/vdp.h	Mon Oct 28 23:59:59 2013 -0700
+++ b/vdp.h	Tue Oct 29 00:03:11 2013 -0700
@@ -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