mirror of
https://github.com/jscrane/r65emu.git
synced 2024-06-06 09:29:30 +00:00
get negative offsets right
This commit is contained in:
parent
ed268ed430
commit
8c24019f1f
2
z80.cpp
2
z80.cpp
|
@ -64,7 +64,7 @@ byte z80::_fetch_op() {
|
||||||
_mc(PC, 4);
|
_mc(PC, 4);
|
||||||
byte op = _mem[PC];
|
byte op = _mem[PC];
|
||||||
#if defined(CPU_DEBUG)
|
#if defined(CPU_DEBUG)
|
||||||
printf("%5d MR %04x %02x\n", _ts, PC, op);
|
_status("%5d MR %04x %02x\n", _ts, PC, op);
|
||||||
#endif
|
#endif
|
||||||
PC++;
|
PC++;
|
||||||
R++;
|
R++;
|
||||||
|
|
48
z80.h
48
z80.h
|
@ -312,12 +312,18 @@ private:
|
||||||
flags.N = 1;
|
flags.N = 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
inline word _ads(word a, byte b) {
|
||||||
|
word w = a + b;
|
||||||
|
if (b > 127) w -= 0x100;
|
||||||
|
return w;
|
||||||
|
}
|
||||||
|
|
||||||
inline void _incO(Memory::address a) {
|
inline void _incO(Memory::address a) {
|
||||||
char o = (char)_rb(PC);
|
byte o = _rb(PC);
|
||||||
_mc(PC, 1); _mc(PC, 1); _mc(PC, 1);
|
_mc(PC, 1); _mc(PC, 1); _mc(PC, 1);
|
||||||
_mc(PC, 1); _mc(PC, 1);
|
_mc(PC, 1); _mc(PC, 1);
|
||||||
PC++;
|
PC++;
|
||||||
word w = a + o;
|
word w = _ads(a, o);
|
||||||
byte b = _rb(w);
|
byte b = _rb(w);
|
||||||
_mc(w, 1);
|
_mc(w, 1);
|
||||||
_inc(b);
|
_inc(b);
|
||||||
|
@ -325,11 +331,11 @@ private:
|
||||||
}
|
}
|
||||||
|
|
||||||
inline void _decO(Memory::address a) {
|
inline void _decO(Memory::address a) {
|
||||||
char o = (char)_rb(PC);
|
byte o = _rb(PC);
|
||||||
_mc(PC, 1); _mc(PC, 1); _mc(PC, 1);
|
_mc(PC, 1); _mc(PC, 1); _mc(PC, 1);
|
||||||
_mc(PC, 1); _mc(PC, 1);
|
_mc(PC, 1); _mc(PC, 1);
|
||||||
PC++;
|
PC++;
|
||||||
word w = a + o;
|
word w = _ads(a, o);
|
||||||
byte b = _rb(w);
|
byte b = _rb(w);
|
||||||
_mc(w, 1);
|
_mc(w, 1);
|
||||||
_dec(b);
|
_dec(b);
|
||||||
|
@ -337,27 +343,27 @@ private:
|
||||||
}
|
}
|
||||||
|
|
||||||
inline void _sbO(Memory::address a) {
|
inline void _sbO(Memory::address a) {
|
||||||
char o = (char)_rb(PC++);
|
byte o = _rb(PC++);
|
||||||
byte b = _rb(PC);
|
byte b = _rb(PC);
|
||||||
_mc(PC, 1); _mc(PC, 1);
|
_mc(PC, 1); _mc(PC, 1);
|
||||||
PC++;
|
PC++;
|
||||||
_sb(a + o, b);
|
_sb(_ads(a, o), b);
|
||||||
}
|
}
|
||||||
|
|
||||||
inline byte _rbO(Memory::address a) {
|
inline byte _rbO(Memory::address a) {
|
||||||
char o = (char)_rb(PC);
|
byte o = _rb(PC);
|
||||||
_mc(PC, 1); _mc(PC, 1); _mc(PC, 1);
|
_mc(PC, 1); _mc(PC, 1); _mc(PC, 1);
|
||||||
_mc(PC, 1); _mc(PC, 1);
|
_mc(PC, 1); _mc(PC, 1);
|
||||||
PC++;
|
PC++;
|
||||||
return _rb(a + o);
|
return _rb(_ads(a, o));
|
||||||
}
|
}
|
||||||
|
|
||||||
inline void _sbO(Memory::address a, byte b) {
|
inline void _sbO(Memory::address a, byte b) {
|
||||||
char o = (char)_rb(PC);
|
byte o = _rb(PC);
|
||||||
_mc(PC, 1); _mc(PC, 1); _mc(PC, 1);
|
_mc(PC, 1); _mc(PC, 1); _mc(PC, 1);
|
||||||
_mc(PC, 1); _mc(PC, 1);
|
_mc(PC, 1); _mc(PC, 1);
|
||||||
PC++;
|
PC++;
|
||||||
_sb(a + o, b);
|
_sb(_ads(a, o), b);
|
||||||
}
|
}
|
||||||
|
|
||||||
inline void _exSP(word ®) {
|
inline void _exSP(word ®) {
|
||||||
|
@ -417,7 +423,11 @@ private:
|
||||||
}
|
}
|
||||||
|
|
||||||
// 0x18
|
// 0x18
|
||||||
void jr() { char o = (char)_rb(PC); _mc(PC, 1); _mc(PC, 1); _mc(PC, 1); _mc(PC, 1); _mc(PC, 1); PC += o + 1; }
|
void jr() {
|
||||||
|
byte b = _rb(PC);
|
||||||
|
_mc(PC, 1); _mc(PC, 1); _mc(PC, 1); _mc(PC, 1); _mc(PC, 1);
|
||||||
|
PC = _ads(PC, b+1);
|
||||||
|
}
|
||||||
void addhlde() { _add16(HL, DE); }
|
void addhlde() { _add16(HL, DE); }
|
||||||
void ldaDE() { A = _rb(DE); }
|
void ldaDE() { A = _rb(DE); }
|
||||||
void decde() { DE--; _mc(IR, 1); _mc(IR, 1); }
|
void decde() { DE--; _mc(IR, 1); _mc(IR, 1); }
|
||||||
|
@ -1163,7 +1173,7 @@ private:
|
||||||
// 0xDDCB extended instructions
|
// 0xDDCB extended instructions
|
||||||
|
|
||||||
inline word _rbIX(byte &b, byte o) {
|
inline word _rbIX(byte &b, byte o) {
|
||||||
word a = IX + (char)o;
|
word a = _ads(IX, o);
|
||||||
b = _rb(a);
|
b = _rb(a);
|
||||||
_mc(a, 1);
|
_mc(a, 1);
|
||||||
return a;
|
return a;
|
||||||
|
@ -1274,7 +1284,7 @@ private:
|
||||||
void srlIXA(byte o) { _srlIX(A, o); }
|
void srlIXA(byte o) { _srlIX(A, o); }
|
||||||
|
|
||||||
// 0x40
|
// 0x40
|
||||||
inline void _bitIX(int i, byte o) { _bitI(i, IX + (char)o); }
|
inline void _bitIX(int i, byte o) { _bitI(i, _ads(IX, o)); }
|
||||||
|
|
||||||
void bit0IX(byte o) { _bitIX(0, o); }
|
void bit0IX(byte o) { _bitIX(0, o); }
|
||||||
|
|
||||||
|
@ -1301,7 +1311,7 @@ private:
|
||||||
|
|
||||||
// 0x80
|
// 0x80
|
||||||
void _resIX(byte &b, byte o, byte m) {
|
void _resIX(byte &b, byte o, byte m) {
|
||||||
word a = IX + (char)o;
|
word a = _ads(IX, o);
|
||||||
b = _rb(a) & m;
|
b = _rb(a) & m;
|
||||||
_mc(a, 1);
|
_mc(a, 1);
|
||||||
_sb(a, b);
|
_sb(a, b);
|
||||||
|
@ -1387,7 +1397,7 @@ private:
|
||||||
|
|
||||||
// 0xc0
|
// 0xc0
|
||||||
void _setIX(byte &b, byte o, byte m) {
|
void _setIX(byte &b, byte o, byte m) {
|
||||||
word a = IX + (char)o;
|
word a = _ads(IX, o);
|
||||||
b = _rb(a) | m;
|
b = _rb(a) | m;
|
||||||
_mc(a, 1);
|
_mc(a, 1);
|
||||||
_sb(a, b);
|
_sb(a, b);
|
||||||
|
@ -1474,7 +1484,7 @@ private:
|
||||||
// 0xFDCB extended instructions
|
// 0xFDCB extended instructions
|
||||||
|
|
||||||
inline word _rbIY(byte &b, byte o) {
|
inline word _rbIY(byte &b, byte o) {
|
||||||
word a = IY + (char)o;
|
word a = _ads(IY, o);
|
||||||
b = _rb(a);
|
b = _rb(a);
|
||||||
_mc(a, 1);
|
_mc(a, 1);
|
||||||
return a;
|
return a;
|
||||||
|
@ -1585,7 +1595,7 @@ private:
|
||||||
void srlIYA(byte o) { _srlIY(A, o); }
|
void srlIYA(byte o) { _srlIY(A, o); }
|
||||||
|
|
||||||
// 0x40
|
// 0x40
|
||||||
inline void _bitIY(int i, byte o) { _bitI(i, IY + (char)o); }
|
inline void _bitIY(int i, byte o) { _bitI(i, _ads(IY, o)); }
|
||||||
|
|
||||||
void bit0IY(byte o) { _bitIY(0, o); }
|
void bit0IY(byte o) { _bitIY(0, o); }
|
||||||
|
|
||||||
|
@ -1612,7 +1622,7 @@ private:
|
||||||
|
|
||||||
// 0x80
|
// 0x80
|
||||||
void _resIY(byte &b, byte o, byte m) {
|
void _resIY(byte &b, byte o, byte m) {
|
||||||
word a = IY + (char)o;
|
word a = _ads(IY, o);
|
||||||
b = _rb(a) & m;
|
b = _rb(a) & m;
|
||||||
_mc(a, 1);
|
_mc(a, 1);
|
||||||
_sb(a, b);
|
_sb(a, b);
|
||||||
|
@ -1698,7 +1708,7 @@ private:
|
||||||
|
|
||||||
// 0xc0
|
// 0xc0
|
||||||
void _setIY(byte &b, byte o, byte m) {
|
void _setIY(byte &b, byte o, byte m) {
|
||||||
word a = IY + (char)o;
|
word a = _ads(IY, o);
|
||||||
b = _rb(a) | m;
|
b = _rb(a) | m;
|
||||||
_mc(a, 1);
|
_mc(a, 1);
|
||||||
_sb(a, b);
|
_sb(a, b);
|
||||||
|
|
Loading…
Reference in New Issue
Block a user