summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMike Pavone <pavone@retrodev.com>2012-12-26 17:06:34 -0800
committerMike Pavone <pavone@retrodev.com>2012-12-26 17:06:34 -0800
commite47a5743357fe9d026a62cb4c1c01f044215adde (patch)
tree66b6bbde368cc7ca7b1d5f58b791804ab9a2ca61
parentd5d5e11b5d93b718cb89131c704705c71b7976b7 (diff)
Implement Z80 reset and bus request registers.
-rw-r--r--runtime.S48
-rw-r--r--vdp.c6
2 files changed, 36 insertions, 18 deletions
diff --git a/runtime.S b/runtime.S
index e55b0bc..c5618f8 100644
--- a/runtime.S
+++ b/runtime.S
@@ -123,21 +123,39 @@ do_vdp_port_read:
do_io_write:
call m68k_save_context
- and $0xFF, %edi
- mov %rcx, %rdx
+ and $0x3FF, %edi
+ mov %ecx, %edx
call io_write
mov %rax, %rsi
call m68k_load_context
ret
do_io_read:
mov %ecx, %edi
- and $0xFF, %edi
+ and $0x3FF, %edi
call m68k_save_context
call io_read
mov %rax, %rsi
call m68k_load_context
mov 136(%rsi), %cl
ret
+
+do_io_write_w:
+ call m68k_save_context
+ and $0x3FF, %edi
+ mov %ecx, %edx
+ call io_write_w
+ mov %rax, %rsi
+ call m68k_load_context
+ ret
+do_io_read_w:
+ mov %ecx, %edi
+ and $0x3FF, %edi
+ call m68k_save_context
+ call io_read_w
+ mov %rax, %rsi
+ call m68k_load_context
+ mov 136(%rsi), %cl
+ ret
bad_access_msg:
.asciz "Program tried to access illegal 68K address %X\n"
@@ -208,8 +226,6 @@ crash:
m68k_write_byte:
call inccycles
and $0xFFFFFF, %rdi
- /* deal with byte swapping */
- xor $1, %edi
cmp $0x400000, %edi
jle cart_wb
cmp $0xE00000, %edi
@@ -218,16 +234,20 @@ m68k_write_byte:
jge vdp_psg_wb
cmp $0xA10000, %edi
jl not_io_wb
- cmp $0xA10100, %edi
+ cmp $0xA10300, %edi
jge not_io_wb
jmp do_io_write
not_io_wb:
ret
workram_wb:
+ /* deal with byte swapping */
+ xor $1, %edi
and $0xFFFF, %rdi
mov %cl, (%r9, %rdi)
ret
cart_wb:
+ /* deal with byte swapping */
+ xor $1, %edi
mov %cl, (%r8, %rdi)
ret
vdp_psg_wb:
@@ -285,13 +305,9 @@ m68k_read_word_scratch1:
jge vdp_psg
cmp $0xA10000, %ecx
jl not_io
- cmp $0xA10100, %ecx
+ cmp $0xA10300, %ecx
jge not_io
- call do_io_read
- mov %cl, %dil
- and $0xFF, %cx
- shl $8, %di
- or %di, %cx
+ call do_io_read_w
ret
not_io:
xor %cx, %cx
@@ -327,15 +343,13 @@ m68k_read_long_scratch1:
m68k_read_byte_scratch1:
call inccycles
and $0xFFFFFF, %rcx
- /* deal with byte swapping */
- xor $1, %ecx
cmp $0x400000, %ecx
jle cart_b
cmp $0xE00000, %ecx
jge workram_b
cmp $0xA10000, %ecx
jl not_io_b
- cmp $0xA10100, %ecx
+ cmp $0xA10300, %ecx
jge not_io_b
jmp do_io_read
not_io_b:
@@ -343,10 +357,14 @@ not_io_b:
dec %cl
ret
workram_b:
+ /* deal with byte swapping */
+ xor $1, %ecx
and $0xFFFF, %rcx
mov (%r9, %rcx), %cl
ret
cart_b:
+ /* deal with byte swapping */
+ xor $1, %ecx
mov (%r8, %rcx), %cl
ret
diff --git a/vdp.c b/vdp.c
index 961968a..621c314 100644
--- a/vdp.c
+++ b/vdp.c
@@ -1044,11 +1044,11 @@ int vdp_control_port_write(vdp_context * context, uint16_t value)
//Register write
uint8_t reg = (value >> 8) & 0x1F;
if (reg < VDP_REGS) {
- //printf("register %d set to %X\n", reg, value & 0xFF);
+ printf("register %d set to %X\n", reg, value & 0xFF);
context->regs[reg] = value;
- /*if (reg == REG_MODE_2) {
+ if (reg == REG_MODE_2) {
printf("Display is now %s\n", (context->regs[REG_MODE_2] & DISPLAY_ENABLE) ? "enabled" : "disabled");
- }*/
+ }
}
} else {
context->flags |= FLAG_PENDING;