mupen64plus-oldsvn/r4300/regimm.c
Jesse Dean 895a9d3d48 Rewrite of debugger memory breakpoint trap. Memory breakpoints are now
trapped by functions injected into the memory function tables.  
New setup should be MUCH faster, and more flexible
2008-12-22 04:54:03 +00:00

489 lines
10 KiB
C

/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
* Mupen64plus - regimm.h *
* Mupen64Plus homepage: http://code.google.com/p/mupen64plus/ *
* Copyright (C) 2002 Hacktarux *
* *
* 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 *
* the Free Software Foundation; either version 2 of the License, or *
* (at your option) any later version. *
* *
* This program is distributed in the hope that it will be useful, *
* but WITHOUT ANY WARRANTY; without even the implied warranty of *
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
* GNU General Public License for more details. *
* *
* You should have received a copy of the GNU General Public License *
* along with this program; if not, write to the *
* Free Software Foundation, Inc., *
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. *
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
#include "r4300.h"
#include "interupt.h"
#include "ops.h"
#include "macros.h"
#include "../memory/memory.h"
#include "../debugger/debugger.h"
void BLTZ(void)
{
local_rs = irs;
PC++;
delay_slot=1;
#ifdef DBG
if (debugger_mode) update_debugger(PC->addr);
#endif
PC->ops();
update_count();
delay_slot=0;
if (local_rs < 0 && !skip_jump)
PC += (PC-2)->f.i.immediate-1;
last_addr = PC->addr;
if (next_interupt <= Count) gen_interupt();
}
void BLTZ_OUT(void)
{
local_rs = irs;
jump_target = (int)PC->f.i.immediate;
PC++;
delay_slot=1;
#ifdef DBG
if (debugger_mode) update_debugger(PC->addr);
#endif
PC->ops();
update_count();
delay_slot=0;
if (!skip_jump && local_rs < 0)
jump_to(PC->addr + ((jump_target-1)<<2));
last_addr = PC->addr;
if (next_interupt <= Count) gen_interupt();
}
void BLTZ_IDLE(void)
{
int skip;
if (irs < 0)
{
update_count();
skip = next_interupt - Count;
if (skip > 3) Count += (skip & 0xFFFFFFFC);
else BLTZ();
}
else BLTZ();
}
void BGEZ(void)
{
local_rs = irs;
PC++;
delay_slot=1;
#ifdef DBG
if (debugger_mode) update_debugger(PC->addr);
#endif
PC->ops();
update_count();
delay_slot=0;
if (local_rs >= 0 && !skip_jump)
PC += (PC-2)->f.i.immediate - 1;
last_addr = PC->addr;
if (next_interupt <= Count) gen_interupt();
}
void BGEZ_OUT(void)
{
local_rs = irs;
jump_target = (int)PC->f.i.immediate;
PC++;
delay_slot=1;
#ifdef DBG
if (debugger_mode) update_debugger(PC->addr);
#endif
PC->ops();
update_count();
delay_slot=0;
if (!skip_jump && local_rs >= 0)
jump_to(PC->addr + ((jump_target-1)<<2));
last_addr = PC->addr;
if (next_interupt <= Count) gen_interupt();
}
void BGEZ_IDLE(void)
{
int skip;
if (irs >= 0)
{
update_count();
skip = next_interupt - Count;
if (skip > 3) Count += (skip & 0xFFFFFFFC);
else BGEZ();
}
else BGEZ();
}
void BLTZL(void)
{
if (irs < 0)
{
PC++;
delay_slot=1;
#ifdef DBG
if (debugger_mode) update_debugger(PC->addr);
#endif
PC->ops();
update_count();
delay_slot=0;
if(!skip_jump)
PC += (PC-2)->f.i.immediate-1;
}
else
PC+=2;
last_addr = PC->addr;
if (next_interupt <= Count) gen_interupt();
}
void BLTZL_OUT(void)
{
if (irs < 0)
{
jump_target = (int)PC->f.i.immediate;
PC++;
delay_slot=1;
#ifdef DBG
if (debugger_mode) update_debugger(PC->addr);
#endif
PC->ops();
update_count();
delay_slot=0;
if (!skip_jump)
jump_to(PC->addr + ((jump_target-1)<<2));
}
else
PC+=2;
last_addr = PC->addr;
if (next_interupt <= Count) gen_interupt();
}
void BLTZL_IDLE(void)
{
int skip;
if (irs < 0)
{
update_count();
skip = next_interupt - Count;
if (skip > 3) Count += (skip & 0xFFFFFFFC);
else BLTZL();
}
else BLTZL();
}
void BGEZL(void)
{
if (irs >= 0)
{
PC++;
delay_slot=1;
#ifdef DBG
if (debugger_mode) update_debugger(PC->addr);
#endif
PC->ops();
update_count();
delay_slot=0;
if(!skip_jump)
PC += (PC-2)->f.i.immediate-1;
}
else
PC+=2;
last_addr = PC->addr;
if (next_interupt <= Count) gen_interupt();
}
void BGEZL_OUT(void)
{
if (irs >= 0)
{
jump_target = (int)PC->f.i.immediate;
PC++;
delay_slot=1;
#ifdef DBG
if (debugger_mode) update_debugger(PC->addr);
#endif
PC->ops();
update_count();
delay_slot=0;
if (!skip_jump)
jump_to(PC->addr + ((jump_target-1)<<2));
}
else
PC+=2;
last_addr = PC->addr;
if (next_interupt <= Count) gen_interupt();
}
void BGEZL_IDLE(void)
{
int skip;
if (irs >= 0)
{
update_count();
skip = next_interupt - Count;
if (skip > 3) Count += (skip & 0xFFFFFFFC);
else BGEZL();
}
else BGEZL();
}
void BLTZAL(void)
{
local_rs = irs;
reg[31]=PC->addr+8;
if((&irs)!=(reg+31))
{
PC++;
delay_slot=1;
#ifdef DBG
if (debugger_mode) update_debugger(PC->addr);
#endif
PC->ops();
update_count();
delay_slot=0;
if(local_rs < 0 && !skip_jump)
PC += (PC-2)->f.i.immediate-1;
}
else printf("erreur dans bltzal\n");
last_addr = PC->addr;
if (next_interupt <= Count) gen_interupt();
}
void BLTZAL_OUT(void)
{
local_rs = irs;
reg[31]=PC->addr+8;
if((&irs)!=(reg+31))
{
jump_target = (int)PC->f.i.immediate;
PC++;
delay_slot=1;
#ifdef DBG
if (debugger_mode) update_debugger(PC->addr);
#endif
PC->ops();
update_count();
delay_slot=0;
if(!skip_jump && local_rs < 0)
jump_to(PC->addr + ((jump_target-1)<<2));
}
else printf("erreur dans bltzal\n");
last_addr = PC->addr;
if (next_interupt <= Count) gen_interupt();
}
void BLTZAL_IDLE(void)
{
int skip;
if (irs < 0)
{
update_count();
skip = next_interupt - Count;
if (skip > 3) Count += (skip & 0xFFFFFFFC);
else BLTZAL();
}
else BLTZAL();
}
void BGEZAL(void)
{
local_rs = irs;
reg[31]=PC->addr+8;
if((&irs)!=(reg+31))
{
PC++;
delay_slot=1;
#ifdef DBG
if (debugger_mode) update_debugger(PC->addr);
#endif
PC->ops();
update_count();
delay_slot=0;
if(local_rs >= 0 && !skip_jump)
PC += (PC-2)->f.i.immediate-1;
}
else printf("erreur dans bgezal\n");
last_addr = PC->addr;
if (next_interupt <= Count) gen_interupt();
}
void BGEZAL_OUT(void)
{
local_rs = irs;
reg[31]=PC->addr+8;
if((&irs)!=(reg+31))
{
jump_target = (int)PC->f.i.immediate;
PC++;
delay_slot=1;
#ifdef DBG
if (debugger_mode) update_debugger(PC->addr);
#endif
PC->ops();
update_count();
delay_slot=0;
if(!skip_jump && local_rs >= 0)
jump_to(PC->addr + ((jump_target-1)<<2));
}
else printf("erreur dans bgezal\n");
last_addr = PC->addr;
if (next_interupt <= Count) gen_interupt();
}
void BGEZAL_IDLE(void)
{
int skip;
if (irs >=0)
{
update_count();
skip = next_interupt - Count;
if (skip > 3) Count += (skip & 0xFFFFFFFC);
else BGEZAL();
}
else BGEZAL();
}
void BLTZALL(void)
{
local_rs = irs;
reg[31]=PC->addr+8;
if((&irs)!=(reg+31))
{
if (local_rs < 0)
{
PC++;
delay_slot=1;
#ifdef DBG
if (debugger_mode) update_debugger(PC->addr);
#endif
PC->ops();
update_count();
delay_slot=0;
if(!skip_jump)
PC += (PC-2)->f.i.immediate-1;
}
else
PC+=2;
}
else printf("erreur dans bltzall\n");
last_addr = PC->addr;
if (next_interupt <= Count) gen_interupt();
}
void BLTZALL_OUT(void)
{
local_rs = irs;
reg[31]=PC->addr+8;
if((&irs)!=(reg+31))
{
if (local_rs < 0)
{
jump_target = (int)PC->f.i.immediate;
PC++;
delay_slot=1;
#ifdef DBG
if (debugger_mode) update_debugger(PC->addr);
#endif
PC->ops();
update_count();
delay_slot=0;
if (!skip_jump)
jump_to(PC->addr + ((jump_target-1)<<2));
}
else
PC+=2;
}
else printf("erreur dans bltzall\n");
last_addr = PC->addr;
if (next_interupt <= Count) gen_interupt();
}
void BLTZALL_IDLE(void)
{
int skip;
if (irs < 0)
{
update_count();
skip = next_interupt - Count;
if (skip > 3) Count += (skip & 0xFFFFFFFC);
else BLTZALL();
}
else BLTZALL();
}
void BGEZALL(void)
{
local_rs = irs;
reg[31]=PC->addr+8;
if((&irs)!=(reg+31))
{
if (local_rs >= 0)
{
PC++;
delay_slot=1;
#ifdef DBG
if (debugger_mode) update_debugger(PC->addr);
#endif
PC->ops();
update_count();
delay_slot=0;
if(!skip_jump)
PC += (PC-2)->f.i.immediate-1;
}
else
PC+=2;
}
else printf("erreur dans bgezall\n");
last_addr = PC->addr;
if (next_interupt <= Count) gen_interupt();
}
void BGEZALL_OUT(void)
{
local_rs = irs;
reg[31]=PC->addr+8;
if((&irs)!=(reg+31))
{
if (local_rs >= 0)
{
jump_target = (int)PC->f.i.immediate;
PC++;
delay_slot=1;
#ifdef DBG
if (debugger_mode) update_debugger(PC->addr);
#endif
PC->ops();
update_count();
delay_slot=0;
if (!skip_jump)
jump_to(PC->addr + ((jump_target-1)<<2));
}
else
PC+=2;
}
else printf("erreur dans bgezall\n");
last_addr = PC->addr;
if (next_interupt <= Count) gen_interupt();
}
void BGEZALL_IDLE(void)
{
int skip;
if (irs >= 0)
{
update_count();
skip = next_interupt - Count;
if (skip > 3) Count += (skip & 0xFFFFFFFC);
else BGEZALL();
}
else BGEZALL();
}