Mercurial > repos > blastem
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