Rename some functions and a tad of cleanup.

This commit is contained in:
Godzil 2021-12-17 23:13:46 +00:00
parent 4fc5193bc7
commit 8fa2ef06ab
12 changed files with 208 additions and 159 deletions

View File

@ -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])
{

View File

@ -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))

View File

@ -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;

View File

@ -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

View File

@ -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;

View File

@ -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)

View File

@ -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],

View File

@ -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

View File

@ -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, &reg, 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, &reg, 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, &reg, 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, &reg, 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, &reg, 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, &reg, 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, &reg, 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, &reg, 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, &reg, 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, &reg, 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, &reg, 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

View File

@ -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_ */

View File

@ -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()

View File

@ -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();
}