notaz.gp2x.de
/
picodrive.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
0.0088 release
[picodrive.git]
/
cpu
/
Cyclone
/
OpLogic.cpp
diff --git
a/cpu/Cyclone/OpLogic.cpp
b/cpu/Cyclone/OpLogic.cpp
index
7623704
..
4bd0869
100644
(file)
--- a/
cpu/Cyclone/OpLogic.cpp
+++ b/
cpu/Cyclone/OpLogic.cpp
@@
-207,6
+207,7
@@
int OpNeg(int op)
ot("\n");
\r
}
\r
\r
ot("\n");
\r
}
\r
\r
+ if (type==1) eawrite_check_addrerr=1;
\r
EaWrite(10, 1,ea,size,0x003f,0,0);
\r
\r
OpEnd(ea);
\r
EaWrite(10, 1,ea,size,0x003f,0,0);
\r
\r
OpEnd(ea);
\r
@@
-307,7
+308,7
@@
int OpExt(int op)
int OpSet(int op)
\r
{
\r
int cc=0,ea=0;
\r
int OpSet(int op)
\r
{
\r
int cc=0,ea=0;
\r
- int size=0,use=0;
\r
+ int size=0,use=0
,changed_cycles=0
;
\r
char *cond[16]=
\r
{
\r
"al","", "hi","ls","cc","cs","ne","eq",
\r
char *cond[16]=
\r
{
\r
"al","", "hi","ls","cc","cs","ne","eq",
\r
@@
-325,7
+326,8
@@
int OpSet(int op)
use=OpBase(op,size);
\r
if (op!=use) { OpUse(op,use); return 0; } // Use existing handler
\r
\r
use=OpBase(op,size);
\r
if (op!=use) { OpUse(op,use); return 0; } // Use existing handler
\r
\r
- OpStart(op,ea); Cycles=8;
\r
+ changed_cycles=ea<8 && cc>=2;
\r
+ OpStart(op,ea,0,changed_cycles); Cycles=8;
\r
if (ea<8) Cycles=4;
\r
\r
if (cc)
\r
if (ea<8) Cycles=4;
\r
\r
if (cc)
\r
@@
-359,10
+361,12
@@
int OpSet(int op)
\r
ot("\n");
\r
\r
\r
ot("\n");
\r
\r
+ eawrite_check_addrerr=1;
\r
EaCalc (0,0x003f, ea,size,0,0);
\r
EaWrite(0, 1, ea,size,0x003f,0,0);
\r
\r
EaCalc (0,0x003f, ea,size,0,0);
\r
EaWrite(0, 1, ea,size,0x003f,0,0);
\r
\r
- OpEnd(ea);
\r
+ opend_op_changes_cycles=changed_cycles;
\r
+ OpEnd(ea,0);
\r
return 0;
\r
}
\r
\r
return 0;
\r
}
\r
\r
@@
-403,7
+407,7
@@
static int EmitAsr(int op,int type,int dir,int count,int size,int usereg)
ot("\n");
\r
}
\r
\r
ot("\n");
\r
}
\r
\r
- if (type==0 && dir) ot("
mov r3,r0 ;@ save old value for V flag calculation
\n");
\r
+ if (type==0 && dir) ot("
adds r3,r0,#0 ;@ save old value for V flag calculation, also clear V
\n");
\r
\r
ot(";@ Shift register:\n");
\r
if (type==0) ot(" movs r0,r0,%s %s\n",dir?"asl":"asr",pct);
\r
\r
ot(";@ Shift register:\n");
\r
if (type==0) ot(" movs r0,r0,%s %s\n",dir?"asl":"asr",pct);
\r
@@
-434,7
+438,8
@@
static int EmitAsr(int op,int type,int dir,int count,int size,int usereg)
ot(" mov r1,#0x80000000\n");
\r
ot(" ands r3,r3,r1,asr %s\n", pct);
\r
ot(" cmpne r3,r1,asr %s\n", pct);
\r
ot(" mov r1,#0x80000000\n");
\r
ot(" ands r3,r3,r1,asr %s\n", pct);
\r
ot(" cmpne r3,r1,asr %s\n", pct);
\r
- ot(" biceq r9,r9,#0x10000000\n");
\r
+ ot(" eoreq r1,r0,r3\n"); // above check doesn't catch (-1)<<(32+), so we need this
\r
+ ot(" tsteq r1,#0x80000000\n");
\r
ot(" orrne r9,r9,#0x10000000\n");
\r
ot("\n");
\r
}
\r
ot(" orrne r9,r9,#0x10000000\n");
\r
ot("\n");
\r
}
\r
@@
-585,7
+590,6
@@
int OpAsr(int op)
int count=0,dir=0;
\r
int size=0,usereg=0,type=0;
\r
\r
int count=0,dir=0;
\r
int size=0,usereg=0,type=0;
\r
\r
- ea=0;
\r
count =(op>>9)&7;
\r
dir =(op>>8)&1;
\r
size =(op>>6)&3;
\r
count =(op>>9)&7;
\r
dir =(op>>8)&1;
\r
size =(op>>6)&3;
\r
@@
-604,7
+608,7
@@
int OpAsr(int op)
\r
if (op!=use) { OpUse(op,use); return 0; } // Use existing handler
\r
\r
\r
if (op!=use) { OpUse(op,use); return 0; } // Use existing handler
\r
\r
- OpStart(op); Cycles=size<2?6:8;
\r
+ OpStart(op
,ea,0,count<0
); Cycles=size<2?6:8;
\r
\r
EaCalc(10,0x0007, ea,size,1);
\r
EaRead(10, 0, ea,size,0x0007,1);
\r
\r
EaCalc(10,0x0007, ea,size,1);
\r
EaRead(10, 0, ea,size,0x0007,1);
\r
@@
-613,7
+617,8
@@
int OpAsr(int op)
\r
EaWrite(10, 0, ea,size,0x0007,1);
\r
\r
\r
EaWrite(10, 0, ea,size,0x0007,1);
\r
\r
- OpEnd();
\r
+ opend_op_changes_cycles = (count<0);
\r
+ OpEnd(ea,0);
\r
\r
return 0;
\r
}
\r
\r
return 0;
\r
}
\r