2 * (C) GraÅžvydas "notaz" Ignotas, 2011
4 * This work is licensed under the terms of GNU GPL version 2 or later.
5 * See the COPYING file in the top-level directory.
8 static int emit_ldr_type(int type, int offs, int rs, int rt)
12 emit_movsbl_indexed(offs,rs,rt);
15 emit_movzbl_indexed(offs,rs,rt);
18 emit_movswl_indexed(offs,rs,rt);
21 emit_movzwl_indexed(offs,rs,rt);
24 emit_readword_indexed(offs,rs,rt);
31 static int emit_str_type(int type, int offs, int rs, int rt)
35 emit_writebyte_indexed(rt,offs,rs);
38 emit_writehword_indexed(rt,offs,rs);
41 emit_writeword_indexed(rt,offs,rs);
48 static void convert_ram_addr(u_int a_rs, u_int a_rt, int rs, int rt)
52 else if((a_rs&~0x60000000)==a_rt)
53 emit_andimm(rs,~0x60000000,rt);
54 else if((a_rs&~0x00600000)==a_rt)
55 emit_andimm(rs,~0x00600000,rt);
60 static int pcsx_direct_read(int type, u_int addr, int rs, int rt)
62 if((addr & 0x1f800000) == 0) {
63 assem_debug("pcsx_direct_read %08x ram\n",addr);
66 u_int a=(addr&~0x60600000)|0x80000000;
67 convert_ram_addr(addr,a,rs,rt);
68 emit_ldr_type(type,0,rt,rt);
71 if((addr & 0x1ff80000) == 0x1fc00000) {
72 assem_debug("pcsx_direct_read %08x bios\n",addr);
75 emit_movimm((u_int)&psxR[addr&0x7ffff],rt);
76 emit_ldr_type(type,0,rt,rt);
79 if((addr & 0xfffff000) == 0x1f800000) {
80 assem_debug("pcsx_direct_read %08x scratchpad\n",addr);
83 if(type==LOADW_STUB||type==LOADBU_STUB||(addr&0xf00)==0) {
84 emit_readword((int)&psxH_ptr,rt);
85 emit_ldr_type(type,addr&0xfff,rt,rt);
87 emit_movimm((u_int)&psxH[addr&0xfff],rt);
88 emit_ldr_type(type,0,rt,rt);
93 assem_debug("pcsx_direct_read %08x miss\n",addr);
97 static int pcsx_direct_write(int type, u_int addr, int rs, int rt, signed char *regmap)
99 if((addr & 0x1f800000) == 0) {
100 assem_debug("pcsx_direct_write %08x ram\n",addr);
101 u_int a=(addr&~0x60600000)|0x80000000;
102 convert_ram_addr(addr,a,rs,HOST_TEMPREG);
103 emit_str_type(type,0,HOST_TEMPREG,rt);
105 int ir=get_reg(regmap,INVCP);
107 emit_cmpmem_indexedsr12_reg(ir,rs,1);
108 emit_callne(invalidate_addr_reg[rs]);
111 if((addr & 0xfffff000) == 0x1f800000) {
112 assem_debug("pcsx_direct_write %08x scratchpad\n",addr);
113 if(type==STOREW_STUB||type==STOREB_STUB||(addr&0xf00)==0) {
114 emit_readword((int)&psxH_ptr,HOST_TEMPREG);
115 emit_str_type(type,addr&0xfff,HOST_TEMPREG,rt);
117 emit_movimm((u_int)&psxH[addr&0xfff],HOST_TEMPREG);
118 emit_str_type(type,0,HOST_TEMPREG,rt);
123 assem_debug("pcsx_direct_write %08x miss\n",addr);
127 // vim:shiftwidth=2:expandtab