changeset 84:2d1ae596db7a

Fix long reads from IO ports or long reads that trigger sync cycles by saving rdi. Possibly fix word wide IO reads.
author Mike Pavone <pavone@retrodev.com>
date Wed, 26 Dec 2012 17:34:59 -0800
parents 2c7267617d71
children 1db2a0b655d1
files runtime.S vdp.c
diffstat 2 files changed, 5 insertions(+), 3 deletions(-) [+]
line wrap: on
line diff
--- a/runtime.S	Wed Dec 26 17:06:34 2012 -0800
+++ b/runtime.S	Wed Dec 26 17:34:59 2012 -0800
@@ -154,7 +154,7 @@
 	call io_read_w
 	mov %rax, %rsi
 	call m68k_load_context
-	mov 136(%rsi), %cl
+	mov 136(%rsi), %cx
 	ret
 	
 bad_access_msg:
@@ -333,7 +333,9 @@
 	mov %cx, %di
 	pop %rcx
 	add $2, %ecx
+	push %rdi
 	call m68k_read_word_scratch1
+	pop %rdi
 	and $0xFFFF, %ecx
 	shl $16, %edi
 	or %edi, %ecx
--- a/vdp.c	Wed Dec 26 17:06:34 2012 -0800
+++ b/vdp.c	Wed Dec 26 17:34:59 2012 -0800
@@ -313,7 +313,7 @@
 					}
 					break;
 				case CRAM_WRITE:
-					//printf("CRAM Write: %X to %X\n", start->value, context->address);
+					printf("CRAM Write: %X to %X, autoinc: %d\n", start->value, context->address, context->regs[REG_AUTOINC]);
 					context->cram[(context->address/2) & (CRAM_SIZE-1)] = start->value;
 					break;
 				case VSRAM_WRITE:
@@ -1029,7 +1029,7 @@
 		context->address = (context->address & 0x3FFF) | (value << 14);
 		context->cd = (context->cd & 0x3) | ((value >> 2) & 0x3C);
 		context->flags &= ~FLAG_PENDING;
-		//printf("New Address: %X, New CD: %X\n", context->address, context->cd);
+		printf("New Address: %X, New CD: %X\n", context->address, context->cd);
 		if (context->cd & 0x20) {
 			if((context->regs[REG_DMASRC_H] & 0xC0) != 0x80) {
 				//DMA copy or 68K -> VDP, transfer starts immediately