- [NEW] Treballant en modularitzar la memòria, per a començar a implementar soport per als demes Spectrums
This commit is contained in:
52
z80dis.cpp
52
z80dis.cpp
@@ -1,7 +1,8 @@
|
||||
#include "z80dis.h"
|
||||
#include "z80.h"
|
||||
#include "z80mem.h"
|
||||
#include <string.h>
|
||||
#include <stdio.h>
|
||||
#include "z80.h"
|
||||
#include <vector>
|
||||
#include <bits/stdc++.h>
|
||||
|
||||
@@ -68,44 +69,41 @@ namespace z80dis
|
||||
|
||||
const char *getBase(const uint16_t pos)
|
||||
{
|
||||
const uint8_t *memory = &z80::getMem()[pos];
|
||||
|
||||
if (*memory == 0xCB) {
|
||||
if (z80mem::get()->readMem(pos) == 0xCB) {
|
||||
opcode_size=2;
|
||||
return cb_opcodes[*(memory+1)];
|
||||
} else if (*memory == 0xDD) {
|
||||
if (*(memory+1) == 0xCB) {
|
||||
return cb_opcodes[z80mem::get()->readMem(pos+1)];
|
||||
} else if (z80mem::get()->readMem(pos) == 0xDD) {
|
||||
if (z80mem::get()->readMem(pos+1) == 0xCB) {
|
||||
opcode_size=4;
|
||||
return ix_bit_opcodes[*(memory+3)];
|
||||
return ix_bit_opcodes[z80mem::get()->readMem(pos+3)];
|
||||
} else {
|
||||
opcode_size=2;
|
||||
return ix_opcodes[*(memory+1)];
|
||||
return ix_opcodes[z80mem::get()->readMem(pos+1)];
|
||||
}
|
||||
} else if (*memory == 0xED) {
|
||||
} else if (z80mem::get()->readMem(pos) == 0xED) {
|
||||
opcode_size=2;
|
||||
return misc_opcodes[(*(memory+1))-64];
|
||||
} else if (*memory == 0xFD) {
|
||||
if (*(memory+1) == 0xCB) {
|
||||
return misc_opcodes[(z80mem::get()->readMem(pos+1))-64];
|
||||
} else if (z80mem::get()->readMem(pos) == 0xFD) {
|
||||
if (z80mem::get()->readMem(pos+1) == 0xCB) {
|
||||
opcode_size=4;
|
||||
return iy_bit_opcodes[*(memory+3)];
|
||||
return iy_bit_opcodes[z80mem::get()->readMem(pos+3)];
|
||||
} else {
|
||||
opcode_size=2;
|
||||
return iy_opcodes[*(memory+1)];
|
||||
return iy_opcodes[z80mem::get()->readMem(pos+1)];
|
||||
}
|
||||
} else {
|
||||
opcode_size=1;
|
||||
return base_opcodes[*memory];
|
||||
return base_opcodes[z80mem::get()->readMem(pos)];
|
||||
}
|
||||
}
|
||||
|
||||
void printOpcode(const uint16_t pos)
|
||||
{
|
||||
const uint8_t *memory = &z80::getMem()[pos];
|
||||
char hex[4];
|
||||
for (int i=0; i<4;++i)
|
||||
{
|
||||
if (opcode_size>i)
|
||||
sprintf(hex, "%02x ", *(memory+i));
|
||||
sprintf(hex, "%02x ", z80mem::get()->readMem(pos+i));
|
||||
else
|
||||
sprintf(hex, " ");
|
||||
strcat(buffer, hex);
|
||||
@@ -114,8 +112,6 @@ namespace z80dis
|
||||
|
||||
const char *getAsm(const uint16_t pos)
|
||||
{
|
||||
const uint8_t *memory = &z80::getMem()[pos];
|
||||
|
||||
opcode_size = 0;
|
||||
char base[256];
|
||||
strcpy(buffer, getBase(pos));
|
||||
@@ -123,7 +119,9 @@ namespace z80dis
|
||||
if (strstr(buffer, "4x"))
|
||||
{
|
||||
opcode_size+=2;
|
||||
const uint16_t word = *(uint16_t*)(memory+((*memory==0xFD) || (*memory==0xDD) || (*memory==0xED)?2:1));
|
||||
const uint8_t memvalue = z80mem::get()->readMem(pos);
|
||||
const uint16_t address = pos + ((memvalue==0xFD) || (memvalue==0xDD) || (memvalue==0xED)?2:1);
|
||||
const uint16_t word = z80mem::get()->readMem(address) + (z80mem::get()->readMem(address+1)<<8);
|
||||
if (symbols[word][0]!=0) {
|
||||
char *p = strstr(buffer, "$");
|
||||
(*p)='%'; p++;
|
||||
@@ -144,7 +142,7 @@ namespace z80dis
|
||||
{
|
||||
opcode_size = 4;
|
||||
strcpy(base, buffer);
|
||||
sprintf(buffer, base, *(memory+2), (int8_t)*(memory+3));
|
||||
sprintf(buffer, base, z80mem::get()->readMem(pos+2), (int8_t)z80mem::get()->readMem(pos+3));
|
||||
return buffer;
|
||||
}
|
||||
|
||||
@@ -152,7 +150,7 @@ namespace z80dis
|
||||
{
|
||||
opcode_size+=1;
|
||||
strcpy(base, buffer);
|
||||
sprintf(buffer, base, *(memory+1));
|
||||
sprintf(buffer, base, z80mem::get()->readMem(pos+1));
|
||||
}
|
||||
|
||||
if (strstr(buffer, "Xx"))
|
||||
@@ -163,9 +161,9 @@ namespace z80dis
|
||||
|
||||
if (opcode_size>4) {
|
||||
opcode_size=4;
|
||||
sprintf(buffer, base, pos + opcode_size + (int8_t)*(memory+2));
|
||||
sprintf(buffer, base, pos + opcode_size + (int8_t)z80mem::get()->readMem(pos+2));
|
||||
} else {
|
||||
sprintf(buffer, base, pos + opcode_size + (int8_t)*(memory+1));
|
||||
sprintf(buffer, base, pos + opcode_size + (int8_t)z80mem::get()->readMem(pos+1));
|
||||
}
|
||||
}
|
||||
|
||||
@@ -175,9 +173,9 @@ namespace z80dis
|
||||
strcpy(base, buffer);
|
||||
if (opcode_size>4) {
|
||||
opcode_size=4;
|
||||
sprintf(buffer, base, (int8_t)*(memory+3));
|
||||
sprintf(buffer, base, (int8_t)z80mem::get()->readMem(pos+3));
|
||||
} else {
|
||||
sprintf(buffer, base, (int8_t)*(memory+2));
|
||||
sprintf(buffer, base, (int8_t)z80mem::get()->readMem(pos+2));
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user