X-Git-Url: https://notaz.gp2x.de/cgi-bin/gitweb.cgi?p=pcsx_rearmed.git;a=blobdiff_plain;f=libpcsxcore%2Fnew_dynarec%2Flinkage_arm.s;h=70836df839d9cf567fc896442f5ae1cf5c18a18c;hp=bc7ee9d21f531c058aa91988af6277819fdb8d8c;hb=fca1aef29ed173264919b7a0b35f92dbe0d4e521;hpb=7e605697028dd22dbf2d6ee4701add1e31814b1a diff --git a/libpcsxcore/new_dynarec/linkage_arm.s b/libpcsxcore/new_dynarec/linkage_arm.s index bc7ee9d2..70836df8 100644 --- a/libpcsxcore/new_dynarec/linkage_arm.s +++ b/libpcsxcore/new_dynarec/linkage_arm.s @@ -1,7 +1,7 @@ /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * linkage_arm.s for PCSX * * Copyright (C) 2009-2010 Ari64 * - * Copyright (C) 2010 Gražvydas "notaz" Ignotas * + * Copyright (C) 2010-2011 Gražvydas "notaz" Ignotas * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * @@ -150,8 +150,8 @@ interrupt = cycle + 4 .size interrupt, 4 intCycle = interrupt + 4 .type intCycle, %object - .size intCycle, 128 -psxRegs_end = intCycle + 128 + .size intCycle, 256 +psxRegs_end = intCycle + 256 /* nd_pcsx_io */ nd_pcsx_io = psxRegs_end @@ -624,16 +624,12 @@ cc_interrupt: .global do_interrupt .type do_interrupt, %function do_interrupt: - /* FIXME: cycles already calculated, not needed? */ ldr r0, [fp, #pcaddr-dynarec_local] bl get_addr_ht - ldr r1, [fp, #next_interupt-dynarec_local] - ldr r10, [fp, #cycle-dynarec_local] - str r1, [fp, #last_count-dynarec_local] - sub r10, r10, r1 add r10, r10, #2 mov pc, r0 .size do_interrupt, .-do_interrupt + .align 2 .global fp_exception .type fp_exception, %function @@ -739,32 +735,6 @@ indirect_jump: .size indirect_jump, .-indirect_jump .size indirect_jump_indexed, .-indirect_jump_indexed - .align 2 - .global jump_eret - .type jump_eret, %function -jump_eret: - ldr r1, [fp, #reg_cop0+48-dynarec_local] /* Status */ - ldr r0, [fp, #last_count-dynarec_local] - bic r1, r1, #2 - add r10, r0, r10 - str r1, [fp, #reg_cop0+48-dynarec_local] /* Status */ - str r10, [fp, #cycle-dynarec_local] - bl check_interupt - ldr r1, [fp, #next_interupt-dynarec_local] - ldr r0, [fp, #reg_cop0+56-dynarec_local] /* EPC */ - str r1, [fp, #last_count-dynarec_local] - subs r10, r10, r1 - bpl .E11 -.E8: - bl get_addr - mov pc, r0 -.E11: - str r0, [fp, #pcaddr-dynarec_local] - bl cc_interrupt - ldr r0, [fp, #pcaddr-dynarec_local] - b .E8 - .size jump_eret, .-jump_eret - .align 2 .global new_dyna_start .type new_dyna_start, %function @@ -803,6 +773,9 @@ new_dyna_start: .global ari_write_ram_mirror8 .global ari_write_ram_mirror16 .global ari_write_ram_mirror32 +.global ari_read_bios8 +.global ari_read_bios16 +.global ari_read_bios32 .global ari_read_io8 .global ari_read_io16 .global ari_read_io32 @@ -893,6 +866,25 @@ ari_write_ram_mirror32: ari_write_ram_mirror (3<<11), word, str +.macro ari_read_bios_mirror bic_const op + ldr r0, [fp, #address-dynarec_local] + orr r0, r0, #0x80000000 + bic r0, r0, #(0x20000000|\bic_const) @ map to 0x9fc... + \op r0, [r0] + str r0, [fp, #readmem_dword-dynarec_local] + mov pc, lr +.endm + +ari_read_bios8: + ari_read_bios_mirror 0, ldrb + +ari_read_bios16: + ari_read_bios_mirror 1, ldrh + +ari_read_bios32: + ari_read_bios_mirror 3, ldr + + @ for testing .macro ari_read_io_old tab_shift str lr, [sp, #-8]! @ EABI alignment.. @@ -1007,7 +999,23 @@ ari_read_io32: .endm ari_write_io8: - ari_write_io ldrb, strb, byte, tab_write8, 2 + @ PCSX always writes to psxH, so do we for consistency + ldr r0, [fp, #address-dynarec_local] + ldr r3, [fp, #psxH_ptr-dynarec_local] + ldrb r1, [fp, #byte-dynarec_local] + bic r2, r0, #0x1f800000 + ldr r12,[fp, #tab_write8-dynarec_local] + strb r1, [r2, r3] + subs r3, r2, #0x1000 + movlo pc, lr +@ ari_write_io_old 2 + cmp r3, #0x880 + movhs pc, lr + ldr r12,[r12, r3, lsl #2] + mov r0, r1 + tst r12,r12 + bxne r12 + mov pc, lr ari_write_io16: ari_write_io ldrh, strh, hword, tab_write16, 1