diff runtime.S @ 54:3b79cbcf6846

Get Flavio's color bar demo kind of sort of working
author Mike Pavone <pavone@retrodev.com>
date Tue, 18 Dec 2012 02:16:42 -0800
parents 44e661913a51
children bc3bc7a60c4e
line wrap: on
line diff
--- a/runtime.S	Sun Dec 16 22:25:29 2012 -0800
+++ b/runtime.S	Tue Dec 18 02:16:42 2012 -0800
@@ -1,15 +1,42 @@
 
 	.global handle_cycle_limit
 handle_cycle_limit:
+	call m68k_save_context
+	mov %rsi, %rdi
+	call sync_components
+	mov %rax, %rsi
+	call m68k_load_context
+	ret
+
+do_vdp_port_write:
+	call m68k_save_context
+	mov %rcx, %rdx
+	call vdp_port_write
+	mov %rax, %rsi
+	call m68k_load_context
+	ret
+
+do_vdp_port_read:
+	call m68k_save_context
+	call vdp_port_read
+	mov %rax, %rsi
+	call m68k_load_context
+	mov 120(%rsi), %cx
 	ret
 	
+bad_access_msg:
+	.asciz "Program tried to access illegal 68K address %X\n"
+	
 	.global m68k_write_word
+	.global vdp_psg_w
 m68k_write_word:
 	and $0xFFFFFF, %rdi
 	cmp $0x400000, %edi
 	jle cart_w
 	cmp $0xE00000, %edi
 	jge workram_w
+	cmp $0xC00000, %edi
+	jge vdp_psg_w
 	jmp inccycles
 workram_w:
 	and $0xFFFF, %rdi
@@ -18,6 +45,48 @@
 cart_w:
 	mov %cx, (%r8, %rdi)
 	jmp inccycles
+vdp_psg_w:
+	test $0x2700E0, %edi
+	jnz crash
+	and $0x1F, %edi
+	cmp $4, %edi
+	jl try_fifo_write
+	jmp do_vdp_port_write
+try_fifo_write:
+	push %rdx
+	push %rbx
+	/* fetch VDP context pointer from 68K context */
+	mov 112(%rsi), %rdx
+	/* get fifo_cur and compare it to fifo_end */
+	mov (%rdx), %rbx
+	cmp %rbx, 8(%rdx)
+	/* bail out if fifo is full */
+	je fifo_fallback
+	/* populate FIFO entry */
+	mov %cx, 4(%rbx) /* value */
+	movb $0, 6(%rbx) /* partial */
+	mov %eax, %ecx
+	shl $3, %ecx /* multiply by 68K cycle by 7 to get MCLK cycle */
+	sub %eax, %ecx
+	mov %ecx, (%rbx) /* cycle */
+	/* update fifo_cur and store back in 68K context */
+	add $8, %rbx
+	mov %rbx, (%rdx)
+	/* clear pending flag */
+	andb $0xEF, 19(%rdx)
+	pop %rbx
+	pop %rdx
+	jmp inccycles
+fifo_fallback:
+	pop %rbx
+	pop %rdx
+	jmp do_vdp_port_write
+crash:
+	mov %edi, %esi
+	lea bad_access_msg(%rip), %rdi
+	call printf
+	mov $1, %rdi
+	call exit
 
 	.global m68k_write_byte
 m68k_write_byte:
@@ -64,20 +133,26 @@
 	jle cart
 	cmp $0xE00000, %ecx
 	jge workram
+	cmp $0xC00000, %edi
+	jge vdp_psg
 	xor %cx, %cx
+	dec %cx
 	jmp inccycles
 workram:
 	and $0xFFFF, %rcx
 	mov (%r9, %rcx), %cx
 	jmp inccycles
+vdp_psg:
+	test $0x2700E0, %edi
+	jnz crash
+	and $0x1F, %edi
+	jmp do_vdp_port_read
 cart:
 	mov (%r8, %rcx), %cx
 inccycles:
 	add $4, %rax
 	cmp %rbp, %rax
-	jge sync
-	ret
-sync:
+	jge handle_cycle_limit
 	ret
 	
 	.global m68k_read_long_scratch1
@@ -103,6 +178,7 @@
 	cmp $0xE00000, %ecx
 	jge workram_b
 	xor %cl, %cl
+	dec %cl
 	jmp inccycles
 workram_b:
 	and $0xFFFF, %rcx
@@ -146,6 +222,7 @@
 	mov %r13d, 40(%rsi) /* a0 */
 	mov %r14d, 44(%rsi) /* a1 */
 	mov %r15d, 68(%rsi) /* a7 */
+	mov %eax, 76(%rsi) /* current cycle count */
 	ret
 
 	.global m68k_load_context