Rename some functions and a tad of cleanup.
This commit is contained in:
parent
4fc5193bc7
commit
8fa2ef06ab
@ -211,8 +211,8 @@ void ws_audio_port_write(uint32_t port, uint8_t value)
|
||||
|
||||
for (k = 0 ; k < n ; k++)
|
||||
{
|
||||
b = cpu_readmem20(i);
|
||||
cpu_writemem20(j, b);
|
||||
b = mem_readmem20(i);
|
||||
mem_writemem20(j, b);
|
||||
i++;
|
||||
j++;
|
||||
}
|
||||
@ -1305,7 +1305,7 @@ void ws_audio_process(void)
|
||||
{
|
||||
i = (SDMACH << 8) | SDMACL;
|
||||
j = (SDMASB << 16) | (SDMASH << 8) | SDMASL;
|
||||
b = cpu_readmem20(j);
|
||||
b = mem_readmem20(j);
|
||||
|
||||
if (!ws_audio_channel_isPlaying[5])
|
||||
{
|
||||
|
||||
@ -439,24 +439,25 @@ void ws_emulate(void)
|
||||
|
||||
dNormalLast = getTicks();
|
||||
|
||||
#define HCLK (1000. / 12000.)
|
||||
|
||||
while (1)
|
||||
{
|
||||
|
||||
dTemp = getTicks();
|
||||
dTime = dTemp - dNormalLast;
|
||||
|
||||
|
||||
nCount = (int32_t)(dTime * 0.07547); // does this calculation make sense?
|
||||
nCount = (int32_t)(dTime * HCLK); // does this calculation make sense?
|
||||
|
||||
if (nCount <= 0)
|
||||
{
|
||||
/* Sleep for 2ms */
|
||||
usleep(2000);
|
||||
/* Sleep for 500us */
|
||||
usleep(500);
|
||||
} // No need to do anything for a bit
|
||||
else
|
||||
{
|
||||
|
||||
dNormalLast += nCount * (1 / 0.07547);
|
||||
dNormalLast += nCount * (1 / HCLK);
|
||||
|
||||
if (nCount > 10)
|
||||
{
|
||||
@ -475,7 +476,7 @@ void ws_emulate(void)
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/* What is this mess? Frameskip? */
|
||||
for (i = 0 ; i < nCount - 1 ; i++)
|
||||
{
|
||||
while (!ws_executeLine(backBuffer, 0))
|
||||
|
||||
41
source/io.c
41
source/io.c
@ -102,7 +102,7 @@ FILE *ioLogFp = NULL;
|
||||
//
|
||||
//
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
void ws_io_reset(void)
|
||||
void io_reset(void)
|
||||
{
|
||||
ws_key_start = 0;
|
||||
ws_key_x4 = 0;
|
||||
@ -146,14 +146,14 @@ void ws_io_reset(void)
|
||||
//
|
||||
//
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
void ws_io_init(void)
|
||||
void io_init(void)
|
||||
{
|
||||
if (ws_ioRam == NULL)
|
||||
{
|
||||
ws_ioRam = (uint8_t *)malloc(0x100);
|
||||
}
|
||||
|
||||
ws_io_reset();
|
||||
io_reset();
|
||||
ws_key_flipped = 0;
|
||||
|
||||
#ifdef IO_DUMP
|
||||
@ -172,7 +172,7 @@ void ws_io_init(void)
|
||||
//
|
||||
//
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
void ws_io_flipControls(void)
|
||||
void io_flipControls(void)
|
||||
{
|
||||
ws_key_flipped = !ws_key_flipped;
|
||||
}
|
||||
@ -188,7 +188,7 @@ void ws_io_flipControls(void)
|
||||
//
|
||||
//
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
void ws_io_done(void)
|
||||
void io_done(void)
|
||||
{
|
||||
if (ws_ioRam == NULL)
|
||||
{
|
||||
@ -259,7 +259,7 @@ void set_baudrate(int speed)
|
||||
tcsetattr(serialfd, TCSANOW, &options);
|
||||
|
||||
/* Make sure read is not blocking */
|
||||
fcntl(serialfd, F_SETFL, FNDELAY);
|
||||
fcntl(serialfd, F_SETFL, FNDELAY);
|
||||
}
|
||||
|
||||
void close_serial()
|
||||
@ -351,7 +351,7 @@ void write_serial(unsigned char value)
|
||||
//
|
||||
//
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
uint8_t cpu_readport(uint8_t port)
|
||||
uint8_t io_readport(uint8_t port)
|
||||
{
|
||||
int w1, w2;
|
||||
uint8_t retVal = 0;
|
||||
@ -619,9 +619,28 @@ uint8_t cpu_readport(uint8_t port)
|
||||
|
||||
|
||||
exit:
|
||||
|
||||
if (port < 0xC0)
|
||||
{
|
||||
switch(port)
|
||||
{
|
||||
case 0x02:
|
||||
case 0x84:
|
||||
case 0x85:
|
||||
case 0x90:
|
||||
case 0x91:
|
||||
case 0xB5:
|
||||
break;
|
||||
|
||||
default:
|
||||
Log(TLOG_DEBUG, "io", "ReadIO %02X <= %02X", port, retVal);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (ioLogFp)
|
||||
{
|
||||
fprintf(ioLogFp, "%ld, R, %02X, %02X\n", nec_monotonicCycles, port, retVal);
|
||||
fprintf(ioLogFp, "%llu, R, %02X, %02X\n", nec_monotonicCycles, port, retVal);
|
||||
}
|
||||
return retVal;
|
||||
}
|
||||
@ -637,13 +656,13 @@ exit:
|
||||
//
|
||||
//
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
void cpu_writeport(uint32_t port, uint8_t value)
|
||||
void io_writeport(uint32_t port, uint8_t value)
|
||||
{
|
||||
int unknown_io_port = 0;
|
||||
|
||||
if (ioLogFp)
|
||||
{
|
||||
fprintf(ioLogFp, "%ld, W, %02X, %02X\n", nec_monotonicCycles, port, value);
|
||||
fprintf(ioLogFp, "%llu, W, %02X, %02X\n", nec_monotonicCycles, port, value);
|
||||
}
|
||||
|
||||
if (port > 0x100)
|
||||
@ -793,7 +812,7 @@ void cpu_writeport(uint32_t port, uint8_t value)
|
||||
|
||||
for (int ix = 0 ; ix < dma_size ; ix++)
|
||||
{
|
||||
cpu_writemem20(dma_end++, cpu_readmem20(dma_start++));
|
||||
mem_writemem20(dma_end++, mem_readmem20(dma_start++));
|
||||
}
|
||||
|
||||
ws_ioRam[0x47] = 0;
|
||||
|
||||
11
source/io.h
11
source/io.h
@ -33,10 +33,13 @@ extern uint8_t ws_key_y3;
|
||||
extern uint8_t ws_key_button_a;
|
||||
extern uint8_t ws_key_button_b;
|
||||
|
||||
void ws_io_init(void);
|
||||
void ws_io_reset(void);
|
||||
void ws_io_flipControls(void);
|
||||
void ws_io_done(void);
|
||||
void io_init(void);
|
||||
void io_reset(void);
|
||||
void io_flipControls(void);
|
||||
void io_done(void);
|
||||
|
||||
uint8_t io_readport(uint8_t port);
|
||||
void io_writeport(uint32_t port, uint8_t value);
|
||||
|
||||
#endif
|
||||
|
||||
|
||||
@ -7,7 +7,7 @@
|
||||
******************************************************************************/
|
||||
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
// Notes: need to optimize cpu_writemem20
|
||||
// Notes: need to optimize mem_writemem20
|
||||
//
|
||||
//
|
||||
//
|
||||
@ -136,7 +136,7 @@ void dump_memory()
|
||||
//
|
||||
//
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
void cpu_writemem20(uint32_t addr, uint8_t value)
|
||||
void mem_writemem20(uint32_t addr, uint8_t value)
|
||||
{
|
||||
uint32_t offset = addr & 0xffff;
|
||||
uint32_t bank = addr >> 16;
|
||||
@ -167,7 +167,7 @@ void cpu_writemem20(uint32_t addr, uint8_t value)
|
||||
//
|
||||
//
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
uint8_t cpu_readmem20(uint32_t addr)
|
||||
uint8_t mem_readmem20(uint32_t addr)
|
||||
{
|
||||
uint32_t offset = addr & 0xffff;
|
||||
uint32_t bank = addr >> 16;
|
||||
@ -260,7 +260,7 @@ uint8_t cpu_readmem20(uint32_t addr)
|
||||
uint8_t *pagedMemory[0x100];
|
||||
|
||||
/* Memory address is 20bit and split in 8 (page) - 12 (offset) */
|
||||
void cpu_writemem20(uint32_t addr, uint8_t value)
|
||||
void mem_writemem20(uint32_t addr, uint8_t value)
|
||||
{
|
||||
uint8_t page = addr >> 12;
|
||||
uint16_t offset = addr & 0xFFF;
|
||||
@ -274,7 +274,7 @@ void cpu_writemem20(uint32_t addr, uint8_t value)
|
||||
}
|
||||
}
|
||||
|
||||
uint8_t cpu_readmem20(uint32_t addr)
|
||||
uint8_t mem_readmem20(uint32_t addr)
|
||||
{
|
||||
uint8_t page = addr >> 12;
|
||||
uint16_t offset = addr & 0xFFF;
|
||||
|
||||
@ -59,6 +59,11 @@ uint8_t *getRom(uint32_t *size);
|
||||
uint8_t *getSram(uint32_t *size);
|
||||
#endif
|
||||
|
||||
#define mem_readop mem_readmem20
|
||||
#define mem_readop_arg mem_readmem20
|
||||
void mem_writemem20(uint32_t addr, uint8_t value);
|
||||
uint8_t mem_readmem20(uint32_t addr);
|
||||
|
||||
#define BW_IEEPROM_SIZE (128)
|
||||
#define COLOR_IEEPROM_SIZE (2048)
|
||||
|
||||
|
||||
@ -40,6 +40,9 @@
|
||||
|
||||
#include <log.h>
|
||||
|
||||
#include "memory.h"
|
||||
#include "io.h"
|
||||
|
||||
#include "nec.h"
|
||||
#include "necintrf.h"
|
||||
#include "nec_debugger.h"
|
||||
@ -4222,11 +4225,11 @@ int nec_execute(int cycles)
|
||||
while (nec_ICount > 0)
|
||||
{
|
||||
#if 0
|
||||
if ((I.sregs[CS] == 0x0600) /* && (I.ip > 0x0050) */)
|
||||
if ((I.sregs[CS] == 0xF000) && (I.ip >= 0x0000) )
|
||||
{
|
||||
int tmp;
|
||||
char buffer[256];
|
||||
uint8_t op = cpu_readmem20((I.sregs[CS] << 4) + I.ip);
|
||||
uint8_t op = mem_readmem20((I.sregs[CS] << 4) + I.ip);
|
||||
//Log(TLOG_NORMAL, "NEC v30", "[%04x:%04xh] %02xh '%s' - I=%d\n", I.sregs[CS], I.ip, op, instructionsName[op], I.IF);
|
||||
printf("AX: %04X, BX: %04X, CX: %04X, DX: %04X, SI: %04X, DI: %04X, SP: %04X\n",
|
||||
I.regs.w[AW], I.regs.w[BW], I.regs.w[CW], I.regs.w[DW],
|
||||
|
||||
@ -115,30 +115,30 @@ typedef struct
|
||||
|
||||
#define DefaultBase(Seg) ((seg_prefix && (Seg==DS || Seg==SS)) ? (prefix_base) : (uint32_t)(I.sregs[Seg] << 4))
|
||||
|
||||
#define GetMemB(Seg, Off) (/*nec_ICount-=((Off)&1)?1:0,*/ (uint8_t)cpu_readmem20((DefaultBase(Seg)+(Off))))
|
||||
#define GetMemW(Seg, Off) (/*nec_ICount-=((Off)&1)?1:0,*/ (uint16_t) cpu_readmem20((DefaultBase(Seg)+(Off))) + (cpu_readmem20((DefaultBase(Seg)+((Off)+1)))<<8) )
|
||||
#define GetMemB(Seg, Off) (/*nec_ICount-=((Off)&1)?1:0,*/ (uint8_t)mem_readmem20((DefaultBase(Seg)+(Off))))
|
||||
#define GetMemW(Seg, Off) (/*nec_ICount-=((Off)&1)?1:0,*/ (uint16_t) mem_readmem20((DefaultBase(Seg)+(Off))) + (mem_readmem20((DefaultBase(Seg)+((Off)+1)))<<8) )
|
||||
|
||||
#define PutMemB(Seg, Off, x) { /*nec_ICount-=((Off)&1)?1:0*/; cpu_writemem20((DefaultBase(Seg)+(Off)),(x)); }
|
||||
#define PutMemB(Seg, Off, x) { /*nec_ICount-=((Off)&1)?1:0*/; mem_writemem20((DefaultBase(Seg)+(Off)),(x)); }
|
||||
#define PutMemW(Seg, Off, x) { /*nec_ICount-=((Off)&1)?1:0*/; PutMemB(Seg,Off,(x)&0xff); PutMemB(Seg,(Off)+1,(uint8_t)((x)>>8)); }
|
||||
|
||||
/* Todo: Remove these later - plus readword could overflow */
|
||||
#define ReadByte(ea) (/*nec_ICount-=((ea)&1)?1:0,*/ (uint8_t)cpu_readmem20((ea)))
|
||||
#define ReadWord(ea) (/*nec_ICount-=((ea)&1)?1:0,*/ cpu_readmem20((ea))+(cpu_readmem20(((ea)+1))<<8))
|
||||
#define WriteByte(ea, val) { /*nec_ICount-=((ea)&1)?1:0*/; cpu_writemem20((ea),val); }
|
||||
#define WriteWord(ea, val) { /*nec_ICount-=((ea)&1)?1:0*/; cpu_writemem20((ea),(uint8_t)(val)); cpu_writemem20(((ea)+1),(val)>>8); }
|
||||
#define ReadByte(ea) (/*nec_ICount-=((ea)&1)?1:0,*/ (uint8_t)mem_readmem20((ea)))
|
||||
#define ReadWord(ea) (/*nec_ICount-=((ea)&1)?1:0,*/ mem_readmem20((ea))+(mem_readmem20(((ea)+1))<<8))
|
||||
#define WriteByte(ea, val) { /*nec_ICount-=((ea)&1)?1:0*/; mem_writemem20((ea),val); }
|
||||
#define WriteWord(ea, val) { /*nec_ICount-=((ea)&1)?1:0*/; mem_writemem20((ea),(uint8_t)(val)); mem_writemem20(((ea)+1),(val)>>8); }
|
||||
|
||||
#define read_port(port) cpu_readport(port)
|
||||
#define write_port(port, val) cpu_writeport(port,val)
|
||||
#define read_port(port) io_readport(port)
|
||||
#define write_port(port, val) io_writeport(port,val)
|
||||
|
||||
#define FETCH (cpu_readop_arg((I.sregs[CS]<<4)+I.ip++))
|
||||
#define FETCHOP (cpu_readop((I.sregs[CS]<<4)+I.ip++))
|
||||
#define FETCHWORD(var) { var=cpu_readop_arg((((I.sregs[CS]<<4)+I.ip)))+(cpu_readop_arg((((I.sregs[CS]<<4)+I.ip+1)))<<8); I.ip+=2; }
|
||||
#define FETCH (mem_readop_arg((I.sregs[CS]<<4)+I.ip++))
|
||||
#define FETCHOP (mem_readop((I.sregs[CS]<<4)+I.ip++))
|
||||
#define FETCHWORD(var) { var=mem_readop_arg((((I.sregs[CS]<<4)+I.ip)))+(mem_readop_arg((((I.sregs[CS]<<4)+I.ip+1)))<<8); I.ip+=2; }
|
||||
#define PUSH(val) { I.regs.w[SP]-=2; WriteWord((((I.sregs[SS]<<4)+I.regs.w[SP])),val); }
|
||||
#define POP(var) { var = ReadWord((((I.sregs[SS]<<4)+I.regs.w[SP]))); I.regs.w[SP]+=2; }
|
||||
#define PEEK(addr) ((uint8_t)cpu_readop_arg(addr))
|
||||
#define PEEKOP(addr) ((uint8_t)cpu_readop(addr))
|
||||
#define PEEK(addr) ((uint8_t)mem_readop_arg(addr))
|
||||
#define PEEKOP(addr) ((uint8_t)mem_readop(addr))
|
||||
|
||||
#define GetModRM uint32_t ModRM=cpu_readop_arg((I.sregs[CS]<<4)+I.ip++)
|
||||
#define GetModRM uint32_t ModRM=mem_readop_arg((I.sregs[CS]<<4)+I.ip++)
|
||||
|
||||
/* Cycle count macros:
|
||||
CLK - cycle count is the same on all processors
|
||||
|
||||
@ -14,6 +14,7 @@
|
||||
#include "log.h"
|
||||
#include "nec_debugger.h"
|
||||
#include "necintrf.h"
|
||||
#include "memory.h"
|
||||
|
||||
/***
|
||||
* Note: the while code to decode instruction is not meant to be optimised, but to be easy to maintain.
|
||||
@ -353,8 +354,8 @@ static inline void get_mod_reg_rm(uint8_t value, uint8_t *mod, uint8_t *reg, uin
|
||||
|
||||
static int decode_modrm(uint16_t segment, uint16_t offset, modrmValues modrm, bool is8bit, char *buffer, uint32_t bufferLength)
|
||||
{
|
||||
uint8_t disp8 = cpu_readmem20(MAKE_LINEAR(segment, offset));
|
||||
uint16_t disp16 = (cpu_readmem20(MAKE_LINEAR(segment, offset + 1)) << 8) | disp8;
|
||||
uint8_t disp8 = mem_readmem20(MAKE_LINEAR(segment, offset));
|
||||
uint16_t disp16 = (mem_readmem20(MAKE_LINEAR(segment, offset + 1)) << 8) | disp8;
|
||||
char buf[63];
|
||||
int offsetReturn = 0;
|
||||
|
||||
@ -544,7 +545,7 @@ static int decode_modrm(uint16_t segment, uint16_t offset, modrmValues modrm, bo
|
||||
|
||||
int nec_decode_instruction(uint16_t segment, uint16_t offset, char *buffer, unsigned int bufferSize)
|
||||
{
|
||||
uint8_t opcode = cpu_readmem20(MAKE_LINEAR(segment, offset));
|
||||
uint8_t opcode = mem_readmem20(MAKE_LINEAR(segment, offset));
|
||||
uint16_t currentOffset = offset;
|
||||
int16_t param1, param2;
|
||||
uint8_t modrm, reg;
|
||||
@ -562,7 +563,7 @@ int nec_decode_instruction(uint16_t segment, uint16_t offset, char *buffer, unsi
|
||||
{
|
||||
/* Need to handle opcode group */
|
||||
case OP_IMMED:
|
||||
param1 = cpu_readmem20(MAKE_LINEAR(segment, offset + 1));
|
||||
param1 = mem_readmem20(MAKE_LINEAR(segment, offset + 1));
|
||||
get_mod_reg_rm(param1, NULL, ®, NULL, NULL);
|
||||
switch (reg)
|
||||
{
|
||||
@ -631,7 +632,7 @@ int nec_decode_instruction(uint16_t segment, uint16_t offset, char *buffer, unsi
|
||||
break;
|
||||
|
||||
case OP_SHIFT:
|
||||
param1 = cpu_readmem20(MAKE_LINEAR(segment, offset + 1));
|
||||
param1 = mem_readmem20(MAKE_LINEAR(segment, offset + 1));
|
||||
get_mod_reg_rm(param1, NULL, ®, NULL, NULL);
|
||||
switch (reg)
|
||||
{
|
||||
@ -666,7 +667,7 @@ int nec_decode_instruction(uint16_t segment, uint16_t offset, char *buffer, unsi
|
||||
break;
|
||||
|
||||
case OP_GRP1:
|
||||
param1 = cpu_readmem20(MAKE_LINEAR(segment, offset + 1));
|
||||
param1 = mem_readmem20(MAKE_LINEAR(segment, offset + 1));
|
||||
get_mod_reg_rm(param1, NULL, ®, NULL, NULL);
|
||||
switch (reg)
|
||||
{
|
||||
@ -711,7 +712,7 @@ int nec_decode_instruction(uint16_t segment, uint16_t offset, char *buffer, unsi
|
||||
break;
|
||||
|
||||
case OP_GRP2:
|
||||
param1 = cpu_readmem20(MAKE_LINEAR(segment, offset + 1));
|
||||
param1 = mem_readmem20(MAKE_LINEAR(segment, offset + 1));
|
||||
get_mod_reg_rm(param1, NULL, ®, NULL, NULL);
|
||||
switch (reg)
|
||||
{
|
||||
@ -787,7 +788,7 @@ int nec_decode_instruction(uint16_t segment, uint16_t offset, char *buffer, unsi
|
||||
|
||||
case OP_MOVG:
|
||||
/* Special case for C6 and C7, they are valid ONLY if reg == 0 */
|
||||
param1 = cpu_readmem20(MAKE_LINEAR(segment, offset + 1));
|
||||
param1 = mem_readmem20(MAKE_LINEAR(segment, offset + 1));
|
||||
get_mod_reg_rm(param1, NULL, ®, NULL, NULL);
|
||||
if (reg > 0)
|
||||
{
|
||||
@ -852,202 +853,202 @@ int nec_decode_instruction(uint16_t segment, uint16_t offset, char *buffer, unsi
|
||||
|
||||
/******* Immediate values *******/
|
||||
case PR_IM8:
|
||||
param1 = cpu_readmem20(MAKE_LINEAR(segment, currentOffset));
|
||||
param1 = mem_readmem20(MAKE_LINEAR(segment, currentOffset));
|
||||
snprintf(buf, 63, " 0%Xh", param1 & 0xFF);
|
||||
strncat(buffer, buf, bufferSize);
|
||||
currentOffset++;
|
||||
break;
|
||||
|
||||
case PR_IM16:
|
||||
param1 = (cpu_readmem20(MAKE_LINEAR(segment, currentOffset + 1)) << 8) |
|
||||
cpu_readmem20(MAKE_LINEAR(segment, currentOffset));
|
||||
snprintf(buf, 63, " 0%Xh", param1 & 0xFF);
|
||||
param1 = (mem_readmem20(MAKE_LINEAR(segment, currentOffset + 1)) << 8) |
|
||||
mem_readmem20(MAKE_LINEAR(segment, currentOffset));
|
||||
snprintf(buf, 63, " 0%Xh", param1);
|
||||
strncat(buffer, buf, bufferSize);
|
||||
currentOffset += 2;
|
||||
break;
|
||||
|
||||
/******* Register / Immediate *******/
|
||||
case PR_AL_IM8:
|
||||
param1 = cpu_readmem20(MAKE_LINEAR(segment, currentOffset));
|
||||
param1 = mem_readmem20(MAKE_LINEAR(segment, currentOffset));
|
||||
snprintf(buf, 63, " al, 0%Xh", param1 & 0xFF);
|
||||
strncat(buffer, buf, bufferSize);
|
||||
currentOffset++;
|
||||
break;
|
||||
|
||||
case PR_AH_IM8:
|
||||
param1 = cpu_readmem20(MAKE_LINEAR(segment, currentOffset));
|
||||
param1 = mem_readmem20(MAKE_LINEAR(segment, currentOffset));
|
||||
snprintf(buf, 63, " ah, 0%Xh", param1 & 0xFF);
|
||||
strncat(buffer, buf, bufferSize);
|
||||
currentOffset++;
|
||||
break;
|
||||
|
||||
case PR_AX_IM8:
|
||||
param1 = cpu_readmem20(MAKE_LINEAR(segment, currentOffset));
|
||||
param1 = mem_readmem20(MAKE_LINEAR(segment, currentOffset));
|
||||
snprintf(buf, 63, " ax, 0%Xh", param1 & 0xFF);
|
||||
strncat(buffer, buf, bufferSize);
|
||||
currentOffset++;
|
||||
break;
|
||||
|
||||
case PR_AX_IM16:
|
||||
param1 = (cpu_readmem20(MAKE_LINEAR(segment, currentOffset + 1)) << 8) |
|
||||
cpu_readmem20(MAKE_LINEAR(segment, currentOffset));
|
||||
snprintf(buf, 63, " ax, 0%Xh", param1 & 0xFF);
|
||||
param1 = (mem_readmem20(MAKE_LINEAR(segment, currentOffset + 1)) << 8) |
|
||||
mem_readmem20(MAKE_LINEAR(segment, currentOffset));
|
||||
snprintf(buf, 63, " ax, 0%Xh", param1);
|
||||
strncat(buffer, buf, bufferSize);
|
||||
currentOffset += 2;
|
||||
break;
|
||||
|
||||
case PR_IM8_AL:
|
||||
param1 = cpu_readmem20(MAKE_LINEAR(segment, currentOffset));
|
||||
param1 = mem_readmem20(MAKE_LINEAR(segment, currentOffset));
|
||||
snprintf(buf, 63, " 0%Xh, al", param1 & 0xFF);
|
||||
strncat(buffer, buf, bufferSize);
|
||||
currentOffset++;
|
||||
break;
|
||||
|
||||
case PR_IM8_AX:
|
||||
param1 = cpu_readmem20(MAKE_LINEAR(segment, currentOffset));
|
||||
param1 = mem_readmem20(MAKE_LINEAR(segment, currentOffset));
|
||||
snprintf(buf, 63, " 0%Xh, ax", param1 & 0xFF);
|
||||
strncat(buffer, buf, bufferSize);
|
||||
currentOffset++;
|
||||
break;
|
||||
|
||||
case PR_BL_IM8:
|
||||
param1 = cpu_readmem20(MAKE_LINEAR(segment, currentOffset));
|
||||
param1 = mem_readmem20(MAKE_LINEAR(segment, currentOffset));
|
||||
snprintf(buf, 63, " bl, 0%Xh", param1 & 0xFF);
|
||||
strncat(buffer, buf, bufferSize);
|
||||
currentOffset++;
|
||||
break;
|
||||
|
||||
case PR_BH_IM8:
|
||||
param1 = cpu_readmem20(MAKE_LINEAR(segment, currentOffset));
|
||||
param1 = mem_readmem20(MAKE_LINEAR(segment, currentOffset));
|
||||
snprintf(buf, 63, " bh, 0%Xh", param1 & 0xFF);
|
||||
strncat(buffer, buf, bufferSize);
|
||||
currentOffset++;
|
||||
break;
|
||||
|
||||
case PR_BX_IM16:
|
||||
param1 = (cpu_readmem20(MAKE_LINEAR(segment, currentOffset + 1)) << 8) |
|
||||
cpu_readmem20(MAKE_LINEAR(segment, currentOffset));
|
||||
snprintf(buf, 63, " bx, 0%Xh", param1 & 0xFF);
|
||||
param1 = (mem_readmem20(MAKE_LINEAR(segment, currentOffset + 1)) << 8) |
|
||||
mem_readmem20(MAKE_LINEAR(segment, currentOffset));
|
||||
snprintf(buf, 63, " bx, 0%Xh", param1);
|
||||
strncat(buffer, buf, bufferSize);
|
||||
currentOffset += 2;
|
||||
break;
|
||||
|
||||
case PR_CL_IM8:
|
||||
param1 = cpu_readmem20(MAKE_LINEAR(segment, currentOffset));
|
||||
param1 = mem_readmem20(MAKE_LINEAR(segment, currentOffset));
|
||||
snprintf(buf, 63, " cl, 0%Xh", param1 & 0xFF);
|
||||
strncat(buffer, buf, bufferSize);
|
||||
currentOffset++;
|
||||
break;
|
||||
|
||||
case PR_CH_IM8:
|
||||
param1 = cpu_readmem20(MAKE_LINEAR(segment, currentOffset));
|
||||
param1 = mem_readmem20(MAKE_LINEAR(segment, currentOffset));
|
||||
snprintf(buf, 63, " ch, 0%Xh", param1 & 0xFF);
|
||||
strncat(buffer, buf, bufferSize);
|
||||
currentOffset++;
|
||||
break;
|
||||
|
||||
case PR_CX_IM16:
|
||||
param1 = (cpu_readmem20(MAKE_LINEAR(segment, currentOffset + 1)) << 8) |
|
||||
cpu_readmem20(MAKE_LINEAR(segment, currentOffset));
|
||||
snprintf(buf, 63, " cx, 0%Xh", param1 & 0xFF);
|
||||
param1 = (mem_readmem20(MAKE_LINEAR(segment, currentOffset + 1)) << 8) |
|
||||
mem_readmem20(MAKE_LINEAR(segment, currentOffset));
|
||||
snprintf(buf, 63, " cx, 0%Xh", param1);
|
||||
strncat(buffer, buf, bufferSize);
|
||||
currentOffset += 2;
|
||||
break;
|
||||
|
||||
case PR_DL_IM8:
|
||||
param1 = cpu_readmem20(MAKE_LINEAR(segment, currentOffset));
|
||||
param1 = mem_readmem20(MAKE_LINEAR(segment, currentOffset));
|
||||
snprintf(buf, 63, " dl, 0%Xh", param1 & 0xFF);
|
||||
strncat(buffer, buf, bufferSize);
|
||||
currentOffset++;
|
||||
break;
|
||||
|
||||
case PR_DH_IM8:
|
||||
param1 = cpu_readmem20(MAKE_LINEAR(segment, currentOffset));
|
||||
param1 = mem_readmem20(MAKE_LINEAR(segment, currentOffset));
|
||||
snprintf(buf, 63, " dh, 0%Xh", param1 & 0xFF);
|
||||
strncat(buffer, buf, bufferSize);
|
||||
currentOffset++;
|
||||
break;
|
||||
|
||||
case PR_DX_IM16:
|
||||
param1 = (cpu_readmem20(MAKE_LINEAR(segment, currentOffset + 1)) << 8) |
|
||||
cpu_readmem20(MAKE_LINEAR(segment, currentOffset));
|
||||
snprintf(buf, 63, " dx, 0%Xh", param1 & 0xFF);
|
||||
param1 = (mem_readmem20(MAKE_LINEAR(segment, currentOffset + 1)) << 8) |
|
||||
mem_readmem20(MAKE_LINEAR(segment, currentOffset));
|
||||
snprintf(buf, 63, " dx, 0%Xh", param1);
|
||||
strncat(buffer, buf, bufferSize);
|
||||
currentOffset += 2;
|
||||
break;
|
||||
|
||||
case PR_SP_IM16:
|
||||
param1 = (cpu_readmem20(MAKE_LINEAR(segment, currentOffset + 1)) << 8) |
|
||||
cpu_readmem20(MAKE_LINEAR(segment, currentOffset));
|
||||
snprintf(buf, 63, " sp, 0%Xh", param1 & 0xFF);
|
||||
param1 = (mem_readmem20(MAKE_LINEAR(segment, currentOffset + 1)) << 8) |
|
||||
mem_readmem20(MAKE_LINEAR(segment, currentOffset));
|
||||
snprintf(buf, 63, " sp, 0%Xh", param1);
|
||||
strncat(buffer, buf, bufferSize);
|
||||
currentOffset += 2;
|
||||
break;
|
||||
|
||||
case PR_BP_IM16:
|
||||
param1 = (cpu_readmem20(MAKE_LINEAR(segment, currentOffset + 1)) << 8) |
|
||||
cpu_readmem20(MAKE_LINEAR(segment, currentOffset));
|
||||
snprintf(buf, 63, " bp, 0%Xh", param1 & 0xFF);
|
||||
param1 = (mem_readmem20(MAKE_LINEAR(segment, currentOffset + 1)) << 8) |
|
||||
mem_readmem20(MAKE_LINEAR(segment, currentOffset));
|
||||
snprintf(buf, 63, " bp, 0%Xh", param1);
|
||||
strncat(buffer, buf, bufferSize);
|
||||
currentOffset += 2;
|
||||
break;
|
||||
|
||||
case PR_DI_IM16:
|
||||
param1 = (cpu_readmem20(MAKE_LINEAR(segment, currentOffset + 1)) << 8) |
|
||||
cpu_readmem20(MAKE_LINEAR(segment, currentOffset));
|
||||
snprintf(buf, 63, " di, 0%Xh", param1 & 0xFF);
|
||||
param1 = (mem_readmem20(MAKE_LINEAR(segment, currentOffset + 1)) << 8) |
|
||||
mem_readmem20(MAKE_LINEAR(segment, currentOffset));
|
||||
snprintf(buf, 63, " di, 0%Xh", param1);
|
||||
strncat(buffer, buf, bufferSize);
|
||||
currentOffset += 2;
|
||||
break;
|
||||
|
||||
case PR_SI_IM16:
|
||||
param1 = (cpu_readmem20(MAKE_LINEAR(segment, currentOffset + 1)) << 8) |
|
||||
cpu_readmem20(MAKE_LINEAR(segment, currentOffset));
|
||||
snprintf(buf, 63, " si, 0%Xh", param1 & 0xFF);
|
||||
param1 = (mem_readmem20(MAKE_LINEAR(segment, currentOffset + 1)) << 8) |
|
||||
mem_readmem20(MAKE_LINEAR(segment, currentOffset));
|
||||
snprintf(buf, 63, " si, 0%Xh", param1);
|
||||
strncat(buffer, buf, bufferSize);
|
||||
currentOffset += 2;
|
||||
break;
|
||||
|
||||
/******* Register / Memory *******/
|
||||
case PR_M8_AL:
|
||||
param1 = (cpu_readmem20(MAKE_LINEAR(segment, currentOffset + 1)) << 8) |
|
||||
cpu_readmem20(MAKE_LINEAR(segment, currentOffset));
|
||||
param1 = (mem_readmem20(MAKE_LINEAR(segment, currentOffset + 1)) << 8) |
|
||||
mem_readmem20(MAKE_LINEAR(segment, currentOffset));
|
||||
/* TODO: If having a list of known label, try to match and display label instead of value */
|
||||
snprintf(buf, 63, " byte [0%Xh], al", param1 & 0xFF);
|
||||
snprintf(buf, 63, " byte [0%Xh], al", param1);
|
||||
strncat(buffer, buf, bufferSize);
|
||||
currentOffset += 2;
|
||||
break;
|
||||
|
||||
case PR_M16_AX:
|
||||
param1 = (cpu_readmem20(MAKE_LINEAR(segment, currentOffset + 1)) << 8) |
|
||||
cpu_readmem20(MAKE_LINEAR(segment, currentOffset));
|
||||
param1 = (mem_readmem20(MAKE_LINEAR(segment, currentOffset + 1)) << 8) |
|
||||
mem_readmem20(MAKE_LINEAR(segment, currentOffset));
|
||||
/* TODO: If having a list of known label, try to match and display label instead of value */
|
||||
snprintf(buf, 63, " word [0%Xh], ax", param1 & 0xFF);
|
||||
snprintf(buf, 63, " word [0%Xh], ax", param1);
|
||||
strncat(buffer, buf, bufferSize);
|
||||
currentOffset += 2;
|
||||
break;
|
||||
|
||||
case PR_AL_M8:
|
||||
param1 = (cpu_readmem20(MAKE_LINEAR(segment, currentOffset + 1)) << 8) |
|
||||
cpu_readmem20(MAKE_LINEAR(segment, currentOffset));
|
||||
param1 = (mem_readmem20(MAKE_LINEAR(segment, currentOffset + 1)) << 8) |
|
||||
mem_readmem20(MAKE_LINEAR(segment, currentOffset));
|
||||
/* TODO: If having a list of known label, try to match and display label instead of value */
|
||||
snprintf(buf, 63, " al, byte [0%Xh]", param1 & 0xFF);
|
||||
snprintf(buf, 63, " al, byte [0%Xh]", param1);
|
||||
strncat(buffer, buf, bufferSize);
|
||||
currentOffset += 2;
|
||||
break;
|
||||
|
||||
case PR_AX_M16:
|
||||
param1 = (cpu_readmem20(MAKE_LINEAR(segment, currentOffset + 1)) << 8) |
|
||||
cpu_readmem20(MAKE_LINEAR(segment, currentOffset));
|
||||
param1 = (mem_readmem20(MAKE_LINEAR(segment, currentOffset + 1)) << 8) |
|
||||
mem_readmem20(MAKE_LINEAR(segment, currentOffset));
|
||||
/* TODO: If having a list of known label, try to match and display label instead of value */
|
||||
snprintf(buf, 63, " ax, word [0%Xh]", param1 & 0xFF);
|
||||
snprintf(buf, 63, " ax, word [0%Xh]", param1);
|
||||
strncat(buffer, buf, bufferSize);
|
||||
currentOffset += 2;
|
||||
break;
|
||||
|
||||
/******* Address calculation *******/
|
||||
case PR_REL8:
|
||||
param1 = cpu_readmem20(MAKE_LINEAR(segment, currentOffset));
|
||||
param1 = mem_readmem20(MAKE_LINEAR(segment, currentOffset));
|
||||
currentOffset++;
|
||||
param1 = currentOffset + (int8_t)param1;
|
||||
/* TODO: If having a list of known label, try to match and display label instead of value */
|
||||
@ -1057,8 +1058,8 @@ int nec_decode_instruction(uint16_t segment, uint16_t offset, char *buffer, unsi
|
||||
break;
|
||||
|
||||
case PR_REL16:
|
||||
param1 = (cpu_readmem20(MAKE_LINEAR(segment, currentOffset + 1)) << 8) |
|
||||
cpu_readmem20(MAKE_LINEAR(segment, currentOffset));
|
||||
param1 = (mem_readmem20(MAKE_LINEAR(segment, currentOffset + 1)) << 8) |
|
||||
mem_readmem20(MAKE_LINEAR(segment, currentOffset));
|
||||
currentOffset += 2;
|
||||
param1 = currentOffset + (int16_t) param1;
|
||||
|
||||
@ -1069,21 +1070,21 @@ int nec_decode_instruction(uint16_t segment, uint16_t offset, char *buffer, unsi
|
||||
break;
|
||||
|
||||
case PR_ABS32:
|
||||
param1 = (cpu_readmem20(MAKE_LINEAR(segment, currentOffset + 1)) << 8) |
|
||||
cpu_readmem20(MAKE_LINEAR(segment, currentOffset));
|
||||
param2 = (cpu_readmem20(MAKE_LINEAR(segment, currentOffset + 3)) << 8) |
|
||||
cpu_readmem20(MAKE_LINEAR(segment, currentOffset + 2));
|
||||
param1 = (mem_readmem20(MAKE_LINEAR(segment, currentOffset + 1)) << 8) |
|
||||
mem_readmem20(MAKE_LINEAR(segment, currentOffset));
|
||||
param2 = (mem_readmem20(MAKE_LINEAR(segment, currentOffset + 3)) << 8) |
|
||||
mem_readmem20(MAKE_LINEAR(segment, currentOffset + 2));
|
||||
/* TODO: If having a list of known label, try to match and display label instead of value */
|
||||
snprintf(buf, 63, " 0%Xh:0%Xh", param2, param1);
|
||||
snprintf(buf, 63, " 0%Xh:0%Xh", param2 & 0xFFFF, param1 & 0xFFFF);
|
||||
strncat(buffer, buf, bufferSize);
|
||||
currentOffset += 4;
|
||||
break;
|
||||
|
||||
/******* Other cases *******/
|
||||
case PR_IM16_IM8:
|
||||
param1 = (cpu_readmem20(MAKE_LINEAR(segment, currentOffset + 1)) << 8) |
|
||||
cpu_readmem20(MAKE_LINEAR(segment, currentOffset));
|
||||
param2 = cpu_readmem20(MAKE_LINEAR(segment, currentOffset + 2));
|
||||
param1 = (mem_readmem20(MAKE_LINEAR(segment, currentOffset + 1)) << 8) |
|
||||
mem_readmem20(MAKE_LINEAR(segment, currentOffset));
|
||||
param2 = mem_readmem20(MAKE_LINEAR(segment, currentOffset + 2));
|
||||
snprintf(buf, 63, " 0%Xh:0%Xh", param1, param2);
|
||||
strncat(buffer, buf, bufferSize);
|
||||
currentOffset += 3;
|
||||
@ -1093,55 +1094,55 @@ int nec_decode_instruction(uint16_t segment, uint16_t offset, char *buffer, unsi
|
||||
************************************************ Complicated cases ************************************************
|
||||
******************************************************************************************************************/
|
||||
case PR_RM8:
|
||||
param1 = cpu_readmem20(MAKE_LINEAR(segment, currentOffset));
|
||||
param1 = mem_readmem20(MAKE_LINEAR(segment, currentOffset));
|
||||
currentOffset++;
|
||||
get_mod_reg_rm(param1, NULL, NULL, NULL, &modrm);
|
||||
currentOffset += decode_modrm(segment, currentOffset, modrm, true, buffer, bufferSize);
|
||||
break;
|
||||
|
||||
case PR_RM16:
|
||||
param1 = cpu_readmem20(MAKE_LINEAR(segment, currentOffset));
|
||||
param1 = mem_readmem20(MAKE_LINEAR(segment, currentOffset));
|
||||
currentOffset++;
|
||||
get_mod_reg_rm(param1, NULL, NULL, NULL, &modrm);
|
||||
currentOffset += decode_modrm(segment, currentOffset, modrm, false, buffer, bufferSize);
|
||||
break;
|
||||
|
||||
case PR_RM_IM8:
|
||||
param1 = cpu_readmem20(MAKE_LINEAR(segment, currentOffset));
|
||||
param1 = mem_readmem20(MAKE_LINEAR(segment, currentOffset));
|
||||
currentOffset++;
|
||||
get_mod_reg_rm(param1, NULL, NULL, NULL, &modrm);
|
||||
currentOffset += decode_modrm(segment, currentOffset, modrm, true, buffer, bufferSize);
|
||||
param1 = cpu_readmem20(MAKE_LINEAR(segment, currentOffset));
|
||||
param1 = mem_readmem20(MAKE_LINEAR(segment, currentOffset));
|
||||
currentOffset++;
|
||||
snprintf(buf, 63, ", 0%Xh", param1);
|
||||
strncat(buffer, buf, bufferSize);
|
||||
break;
|
||||
|
||||
case PR_RM16_IM8:
|
||||
param1 = cpu_readmem20(MAKE_LINEAR(segment, currentOffset));
|
||||
param1 = mem_readmem20(MAKE_LINEAR(segment, currentOffset));
|
||||
currentOffset++;
|
||||
get_mod_reg_rm(param1, NULL, NULL, NULL, &modrm);
|
||||
currentOffset += decode_modrm(segment, currentOffset, modrm, false, buffer, bufferSize);
|
||||
param1 = cpu_readmem20(MAKE_LINEAR(segment, currentOffset));
|
||||
param1 = mem_readmem20(MAKE_LINEAR(segment, currentOffset));
|
||||
currentOffset ++;
|
||||
snprintf(buf, 63, ", 0%Xh", param1 & 0xFF);
|
||||
strncat(buffer, buf, bufferSize);
|
||||
break;
|
||||
|
||||
case PR_RM_IM16:
|
||||
param1 = cpu_readmem20(MAKE_LINEAR(segment, currentOffset));
|
||||
param1 = mem_readmem20(MAKE_LINEAR(segment, currentOffset));
|
||||
currentOffset++;
|
||||
get_mod_reg_rm(param1, NULL, NULL, NULL, &modrm);
|
||||
currentOffset += decode_modrm(segment, currentOffset, modrm, false, buffer, bufferSize);
|
||||
param1 = (cpu_readmem20(MAKE_LINEAR(segment, currentOffset + 1)) << 8) |
|
||||
cpu_readmem20(MAKE_LINEAR(segment, currentOffset));
|
||||
param1 = (mem_readmem20(MAKE_LINEAR(segment, currentOffset + 1)) << 8) |
|
||||
mem_readmem20(MAKE_LINEAR(segment, currentOffset));
|
||||
currentOffset += 2;
|
||||
snprintf(buf, 63, ", 0%Xh", param1);
|
||||
strncat(buffer, buf, bufferSize);
|
||||
break;
|
||||
|
||||
case PR_RM8_1:
|
||||
param1 = cpu_readmem20(MAKE_LINEAR(segment, currentOffset));
|
||||
param1 = mem_readmem20(MAKE_LINEAR(segment, currentOffset));
|
||||
currentOffset++;
|
||||
get_mod_reg_rm(param1, NULL, NULL, NULL, &modrm);
|
||||
currentOffset += decode_modrm(segment, currentOffset, modrm, true, buffer, bufferSize);
|
||||
@ -1149,7 +1150,7 @@ int nec_decode_instruction(uint16_t segment, uint16_t offset, char *buffer, unsi
|
||||
break;
|
||||
|
||||
case PR_RM16_1:
|
||||
param1 = cpu_readmem20(MAKE_LINEAR(segment, currentOffset));
|
||||
param1 = mem_readmem20(MAKE_LINEAR(segment, currentOffset));
|
||||
currentOffset++;
|
||||
get_mod_reg_rm(param1, NULL, NULL, NULL, &modrm);
|
||||
currentOffset += decode_modrm(segment, currentOffset, modrm, false, buffer, bufferSize);
|
||||
@ -1157,7 +1158,7 @@ int nec_decode_instruction(uint16_t segment, uint16_t offset, char *buffer, unsi
|
||||
break;
|
||||
|
||||
case PR_RM8_CL:
|
||||
param1 = cpu_readmem20(MAKE_LINEAR(segment, currentOffset));
|
||||
param1 = mem_readmem20(MAKE_LINEAR(segment, currentOffset));
|
||||
currentOffset++;
|
||||
get_mod_reg_rm(param1, NULL, NULL, NULL, &modrm);
|
||||
currentOffset += decode_modrm(segment, currentOffset, modrm, true, buffer, bufferSize);
|
||||
@ -1165,7 +1166,7 @@ int nec_decode_instruction(uint16_t segment, uint16_t offset, char *buffer, unsi
|
||||
break;
|
||||
|
||||
case PR_RM16_CL:
|
||||
param1 = cpu_readmem20(MAKE_LINEAR(segment, currentOffset));
|
||||
param1 = mem_readmem20(MAKE_LINEAR(segment, currentOffset));
|
||||
currentOffset++;
|
||||
get_mod_reg_rm(param1, NULL, NULL, NULL, &modrm);
|
||||
currentOffset += decode_modrm(segment, currentOffset, modrm, false, buffer, bufferSize);
|
||||
@ -1173,7 +1174,7 @@ int nec_decode_instruction(uint16_t segment, uint16_t offset, char *buffer, unsi
|
||||
break;
|
||||
|
||||
case PR_RM_R8:
|
||||
param1 = cpu_readmem20(MAKE_LINEAR(segment, currentOffset));
|
||||
param1 = mem_readmem20(MAKE_LINEAR(segment, currentOffset));
|
||||
currentOffset++;
|
||||
get_mod_reg_rm(param1, NULL, ®, NULL, &modrm);
|
||||
currentOffset += decode_modrm(segment, currentOffset, modrm, true, buffer, bufferSize);
|
||||
@ -1182,7 +1183,7 @@ int nec_decode_instruction(uint16_t segment, uint16_t offset, char *buffer, unsi
|
||||
break;
|
||||
|
||||
case PR_RM_R16:
|
||||
param1 = cpu_readmem20(MAKE_LINEAR(segment, currentOffset));
|
||||
param1 = mem_readmem20(MAKE_LINEAR(segment, currentOffset));
|
||||
currentOffset++;
|
||||
get_mod_reg_rm(param1, NULL, ®, NULL, &modrm);
|
||||
currentOffset += decode_modrm(segment, currentOffset, modrm, false, buffer, bufferSize);
|
||||
@ -1191,7 +1192,7 @@ int nec_decode_instruction(uint16_t segment, uint16_t offset, char *buffer, unsi
|
||||
break;
|
||||
|
||||
case PR_R_RM8:
|
||||
param1 = cpu_readmem20(MAKE_LINEAR(segment, currentOffset));
|
||||
param1 = mem_readmem20(MAKE_LINEAR(segment, currentOffset));
|
||||
currentOffset++;
|
||||
get_mod_reg_rm(param1, NULL, ®, NULL, &modrm);
|
||||
snprintf(buf, 63, " %s,", modrmReg8List[reg]);
|
||||
@ -1200,7 +1201,7 @@ int nec_decode_instruction(uint16_t segment, uint16_t offset, char *buffer, unsi
|
||||
break;
|
||||
|
||||
case PR_R_RM16:
|
||||
param1 = cpu_readmem20(MAKE_LINEAR(segment, currentOffset));
|
||||
param1 = mem_readmem20(MAKE_LINEAR(segment, currentOffset));
|
||||
currentOffset++;
|
||||
get_mod_reg_rm(param1, NULL, ®, NULL, &modrm);
|
||||
snprintf(buf, 63, " %s,", modrmReg16List[reg]);
|
||||
@ -1209,25 +1210,25 @@ int nec_decode_instruction(uint16_t segment, uint16_t offset, char *buffer, unsi
|
||||
break;
|
||||
|
||||
case PR_RM16_SEG:
|
||||
param1 = cpu_readmem20(MAKE_LINEAR(segment, currentOffset));
|
||||
param1 = mem_readmem20(MAKE_LINEAR(segment, currentOffset));
|
||||
currentOffset++;
|
||||
get_mod_reg_rm(param1, NULL, ®, NULL, &modrm);
|
||||
currentOffset += decode_modrm(segment, currentOffset, modrm, false, buffer, bufferSize);
|
||||
param1 = (cpu_readmem20(MAKE_LINEAR(segment, currentOffset + 1)) << 8) |
|
||||
cpu_readmem20(MAKE_LINEAR(segment, currentOffset));
|
||||
param1 = (mem_readmem20(MAKE_LINEAR(segment, currentOffset + 1)) << 8) |
|
||||
mem_readmem20(MAKE_LINEAR(segment, currentOffset));
|
||||
currentOffset += 2;
|
||||
snprintf(buf, 63, ", %s", segmentRegList[reg]);
|
||||
strncat(buffer, buf, bufferSize);
|
||||
break;
|
||||
|
||||
case PR_SEG_RM16:
|
||||
param1 = cpu_readmem20(MAKE_LINEAR(segment, currentOffset));
|
||||
param1 = mem_readmem20(MAKE_LINEAR(segment, currentOffset));
|
||||
currentOffset++;
|
||||
get_mod_reg_rm(param1, NULL, ®, NULL, &modrm);
|
||||
snprintf(buf, 63, ", %s", segmentRegList[reg]);
|
||||
currentOffset += decode_modrm(segment, currentOffset, modrm, false, buffer, bufferSize);
|
||||
param1 = (cpu_readmem20(MAKE_LINEAR(segment, currentOffset + 1)) << 8) |
|
||||
cpu_readmem20(MAKE_LINEAR(segment, currentOffset));
|
||||
param1 = (mem_readmem20(MAKE_LINEAR(segment, currentOffset + 1)) << 8) |
|
||||
mem_readmem20(MAKE_LINEAR(segment, currentOffset));
|
||||
currentOffset += 2;
|
||||
strncat(buffer, buf, bufferSize);
|
||||
break;
|
||||
@ -1246,3 +1247,22 @@ int nec_decode_instruction(uint16_t segment, uint16_t offset, char *buffer, unsi
|
||||
|
||||
return currentOffset - offset;
|
||||
}
|
||||
|
||||
#if 0
|
||||
if ((I.sregs[CS] == 0x0600) /* && (I.ip > 0x0050) */)
|
||||
{
|
||||
int tmp;
|
||||
char buffer[256];
|
||||
uint8_t op = mem_readmem20((I.sregs[CS] << 4) + I.ip);
|
||||
//Log(TLOG_NORMAL, "NEC v30", "[%04x:%04xh] %02xh '%s' - I=%d\n", I.sregs[CS], I.ip, op, instructionsName[op], I.IF);
|
||||
printf("AX: %04X, BX: %04X, CX: %04X, DX: %04X, SI: %04X, DI: %04X, SP: %04X\n",
|
||||
I.regs.w[AW], I.regs.w[BW], I.regs.w[CW], I.regs.w[DW],
|
||||
I.regs.w[IX], I.regs.w[IY], I.regs.w[SP]);
|
||||
printf("CS: %04X, DS: %04X, SS: %04X, ES: %04X\n",
|
||||
I.sregs[CS], I.sregs[DS], I.sregs[SS], I.sregs[ES]);
|
||||
memset(buffer, 0, 256);
|
||||
nec_decode_instruction(I.sregs[CS], I.ip, buffer, 255);
|
||||
printf("[%04x:%04xh] %02xh '%s' - I=%d\n", I.sregs[CS], I.ip, op, buffer, I.IF);
|
||||
tmp = getchar();
|
||||
}
|
||||
#endif
|
||||
@ -45,11 +45,4 @@ unsigned nec_get_reg(int regnum);
|
||||
void nec_reset(void *param);
|
||||
void nec_int(uint16_t vector);
|
||||
|
||||
uint8_t cpu_readport(uint8_t);
|
||||
void cpu_writeport(uint32_t, uint8_t);
|
||||
#define cpu_readop cpu_readmem20
|
||||
#define cpu_readop_arg cpu_readmem20
|
||||
void cpu_writemem20(uint32_t, uint8_t);
|
||||
uint8_t cpu_readmem20(uint32_t);
|
||||
|
||||
#endif /* __NECITRF_H_ */
|
||||
|
||||
23
source/rom.h
23
source/rom.h
@ -33,7 +33,11 @@
|
||||
#define WS_EEPROM_SIZE_NONE 0
|
||||
#define WS_EEPROM_SIZE_1k 0x10
|
||||
#define WS_EEPROM_SIZE_16k 0x20
|
||||
#define WS_EEPROM_SIZE_32k 0x30
|
||||
/* 40 is not valid */
|
||||
#define WS_EEPROM_SIZE_8k 0x50
|
||||
#define WS_EEPROM_SIZE_4k 0x60
|
||||
#define WS_EEPROM_SIZE_2k 0x70
|
||||
|
||||
#define WS_SRAM_SIZE_NONE 0
|
||||
#define WS_SRAM_SIZE_64k 0x01
|
||||
@ -45,15 +49,16 @@
|
||||
#pragma pack(1)
|
||||
typedef struct ws_romHeaderStruct
|
||||
{
|
||||
uint8_t developperId;
|
||||
uint8_t minimumSupportSystem;
|
||||
uint8_t cartId;
|
||||
uint8_t gameVertion;
|
||||
uint8_t romSize;
|
||||
uint8_t saveSize;
|
||||
uint8_t cartFlags;
|
||||
uint8_t realtimeClock;
|
||||
uint16_t checksum;
|
||||
/* Miss "Fixed Data" (F5h) */
|
||||
uint8_t developperId; /* Maker Code L */
|
||||
uint8_t minimumSupportSystem; /* Maker Code H */
|
||||
uint8_t cartId; /* Title code */
|
||||
uint8_t gameVertion; /* Version */
|
||||
uint8_t romSize; /* ROM Size */
|
||||
uint8_t saveSize; /* XROM/XEROM Size */
|
||||
uint8_t cartFlags; /* Boot loader */
|
||||
uint8_t realtimeClock; /* Syb System LSI */
|
||||
uint16_t checksum; /* Checksum */
|
||||
} ws_romHeaderStruct;
|
||||
#pragma pack()
|
||||
|
||||
|
||||
@ -133,13 +133,13 @@ int ws_init(char *rompath)
|
||||
ws_memory_init(rom, romSize);
|
||||
ws_patchRom();
|
||||
|
||||
ws_io_init();
|
||||
io_init();
|
||||
ws_audio_init();
|
||||
ws_gpu_init();
|
||||
|
||||
if (ws_rotated())
|
||||
{
|
||||
ws_io_flipControls();
|
||||
io_flipControls();
|
||||
}
|
||||
|
||||
return (1);
|
||||
@ -159,7 +159,7 @@ int ws_init(char *rompath)
|
||||
void ws_reset(void)
|
||||
{
|
||||
ws_memory_reset();
|
||||
ws_io_reset();
|
||||
io_reset();
|
||||
ws_audio_reset();
|
||||
ws_gpu_reset();
|
||||
nec_reset(NULL);
|
||||
@ -288,7 +288,7 @@ int ws_executeLine(int16_t *framebuffer, int renderLine)
|
||||
void ws_done(void)
|
||||
{
|
||||
ws_memory_done();
|
||||
ws_io_done();
|
||||
io_done();
|
||||
ws_audio_done();
|
||||
ws_gpu_done();
|
||||
}
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user