Comença a funcionar
This commit is contained in:
31
main.cpp
31
main.cpp
@@ -1,14 +1,41 @@
|
|||||||
#include <stdint.h>
|
#include <stdint.h>
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
#include <z80.h>
|
#include "z80.h"
|
||||||
|
#include "z80dis.h"
|
||||||
|
|
||||||
uint8_t memory[65536];
|
uint8_t memory[65536];
|
||||||
|
uint32_t t = 0;
|
||||||
|
|
||||||
|
int ula_in()
|
||||||
|
{
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
void ula_out(int val)
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
int main(int argc, char *argv[])
|
int main(int argc, char *argv[])
|
||||||
{
|
{
|
||||||
|
const char *peiv = "HOLA %s\n";
|
||||||
|
printf(peiv, "mundo");
|
||||||
|
|
||||||
FILE* f = fopen("48.rom", "rb");
|
FILE* f = fopen("48.rom", "rb");
|
||||||
fread(memory, 1024, 48, f);
|
fread(memory, 1024, 16, f);
|
||||||
fclose(f);
|
fclose(f);
|
||||||
|
|
||||||
z80::reset(memory);
|
z80::reset(memory);
|
||||||
|
z80::connect_port(0xfe, ula_in, ula_out);
|
||||||
|
|
||||||
|
bool should_exit = false;
|
||||||
|
while(!should_exit)
|
||||||
|
{
|
||||||
|
uint16_t PC = z80::getPC();
|
||||||
|
printf("[%04x] %s", PC, z80dis::getAsm(&memory[PC]));
|
||||||
|
t += z80::step();
|
||||||
|
getchar();
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
}
|
}
|
||||||
84
z80.cpp
84
z80.cpp
@@ -1,10 +1,15 @@
|
|||||||
#include "z80.h"
|
#include "z80.h"
|
||||||
|
|
||||||
|
#include <stdio.h>
|
||||||
|
|
||||||
namespace z80
|
namespace z80
|
||||||
{
|
{
|
||||||
static uint8_t *memory = nullptr;
|
static uint8_t *memory = nullptr;
|
||||||
static uint32_t t = 0;
|
static uint32_t t = 0;
|
||||||
|
|
||||||
|
int (*in_ports[256])();
|
||||||
|
void (*out_ports[256])(int);
|
||||||
|
|
||||||
#define _rM16(a) (uint16_t*)&memory[a]
|
#define _rM16(a) (uint16_t*)&memory[a]
|
||||||
#define rM16(a) *_rM16(a)
|
#define rM16(a) *_rM16(a)
|
||||||
|
|
||||||
@@ -18,7 +23,7 @@ namespace z80
|
|||||||
#define fZ 0b01000000
|
#define fZ 0b01000000
|
||||||
#define fS 0b10000000
|
#define fS 0b10000000
|
||||||
|
|
||||||
#define cNO -1
|
#define cNO 255
|
||||||
#define cNZ 0
|
#define cNZ 0
|
||||||
#define cZ 1
|
#define cZ 1
|
||||||
#define cNC 2
|
#define cNC 2
|
||||||
@@ -124,6 +129,11 @@ namespace z80
|
|||||||
|
|
||||||
#define SWAP(a,b) {auto temp=a;a=b;b=temp;}
|
#define SWAP(a,b) {auto temp=a;a=b;b=temp;}
|
||||||
|
|
||||||
|
uint16_t getPC()
|
||||||
|
{
|
||||||
|
return rPC;
|
||||||
|
}
|
||||||
|
|
||||||
uint8_t READ_MEM_8(const uint16_t addr)
|
uint8_t READ_MEM_8(const uint16_t addr)
|
||||||
{
|
{
|
||||||
t+=3;
|
t+=3;
|
||||||
@@ -143,7 +153,9 @@ namespace z80
|
|||||||
|
|
||||||
uint16_t READ_MEM_16()
|
uint16_t READ_MEM_16()
|
||||||
{
|
{
|
||||||
return READ_MEM_8() + READ_MEM_8() << 8;
|
const uint8_t L = READ_MEM_8();
|
||||||
|
const uint8_t H = READ_MEM_8();
|
||||||
|
return (H << 8) + L;
|
||||||
}
|
}
|
||||||
|
|
||||||
uint16_t READ_MEM_16(const uint16_t addr)
|
uint16_t READ_MEM_16(const uint16_t addr)
|
||||||
@@ -197,7 +209,7 @@ namespace z80
|
|||||||
{
|
{
|
||||||
uint8_t count=0;
|
uint8_t count=0;
|
||||||
uint8_t f = rF;
|
uint8_t f = rF;
|
||||||
while (f>0) { count+=(f&1); f>>1; }
|
while (f>0) { count+=(f&1); f=f>>1; }
|
||||||
if (!(count&1)) rF |= fP;
|
if (!(count&1)) rF |= fP;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -590,6 +602,7 @@ namespace z80
|
|||||||
|
|
||||||
void HALT()
|
void HALT()
|
||||||
{
|
{
|
||||||
|
printf("HALT\n");
|
||||||
rPC--;
|
rPC--;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -789,12 +802,19 @@ namespace z80
|
|||||||
} else {
|
} else {
|
||||||
// don't touch flags
|
// don't touch flags
|
||||||
}
|
}
|
||||||
// [TODO] Do the actual "inputting"
|
if (in_ports[port])
|
||||||
|
return (uint8_t)in_ports[port]();
|
||||||
|
else
|
||||||
|
return 0x00;
|
||||||
}
|
}
|
||||||
|
|
||||||
void OUT(uint8_t port, uint8_t val)
|
void OUT(uint8_t val, int port = 256)
|
||||||
{
|
{
|
||||||
// [TODO]
|
t+=4;
|
||||||
|
if (port == 256) {
|
||||||
|
port = rC;
|
||||||
|
}
|
||||||
|
if (out_ports[port]) out_ports[port](val);
|
||||||
}
|
}
|
||||||
|
|
||||||
void INI()
|
void INI()
|
||||||
@@ -833,15 +853,44 @@ namespace z80
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void OUTI() { /* [TODO] */ }
|
void OUTI()
|
||||||
void OUTIR() { /* [TODO] */ }
|
{
|
||||||
|
OUT(READ_MEM_8(rHL));
|
||||||
|
rHL++;
|
||||||
|
DEC8(_rB);
|
||||||
|
t+=5;
|
||||||
|
}
|
||||||
|
|
||||||
void OUTDR() { /* [TODO] */ }
|
void OUTIR()
|
||||||
void OUTD() { /* [TODO] */ }
|
{
|
||||||
|
OUTI();
|
||||||
|
if (rB!=0)
|
||||||
|
{
|
||||||
|
rPC-=2;
|
||||||
|
t+=5;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void OUTD() {
|
||||||
|
OUT(READ_MEM_8(rHL));
|
||||||
|
rHL--;
|
||||||
|
DEC8(_rB);
|
||||||
|
t+=5;
|
||||||
|
}
|
||||||
|
|
||||||
|
void OUTDR() {
|
||||||
|
OUTD();
|
||||||
|
if (rB!=0)
|
||||||
|
{
|
||||||
|
rPC-=2;
|
||||||
|
t+=5;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
void INVALID()
|
void INVALID()
|
||||||
{
|
{
|
||||||
// [TODO]
|
// [TODO]
|
||||||
|
printf("INVALID\n");
|
||||||
}
|
}
|
||||||
|
|
||||||
void reset(uint8_t* mem)
|
void reset(uint8_t* mem)
|
||||||
@@ -849,6 +898,11 @@ namespace z80
|
|||||||
memory = mem;
|
memory = mem;
|
||||||
rPC = 0;
|
rPC = 0;
|
||||||
t = 0;
|
t = 0;
|
||||||
|
for (int i=0; i<256; ++i)
|
||||||
|
{
|
||||||
|
in_ports[i] = nullptr;
|
||||||
|
out_ports[i] = nullptr;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void BIT_INSTRUCTIONS();
|
void BIT_INSTRUCTIONS();
|
||||||
@@ -858,8 +912,15 @@ namespace z80
|
|||||||
void IY_INSTRUCTIONS();
|
void IY_INSTRUCTIONS();
|
||||||
void IY_BIT_INSTRUCTIONS();
|
void IY_BIT_INSTRUCTIONS();
|
||||||
|
|
||||||
void step()
|
void connect_port(int num, int (*in_ptr)(), void (*out_ptr)(int))
|
||||||
{
|
{
|
||||||
|
if (in_ptr) in_ports[num] = in_ptr;
|
||||||
|
if (out_ptr) out_ports[num] = out_ptr;
|
||||||
|
}
|
||||||
|
|
||||||
|
uint32_t step()
|
||||||
|
{
|
||||||
|
t = 0;
|
||||||
const uint8_t opcode = READ_M1();
|
const uint8_t opcode = READ_M1();
|
||||||
uint16_t tmp;
|
uint16_t tmp;
|
||||||
|
|
||||||
@@ -1137,6 +1198,7 @@ namespace z80
|
|||||||
case 0xFE: CP(READ_MEM_8()); break;
|
case 0xFE: CP(READ_MEM_8()); break;
|
||||||
case 0xFF: RST(0x38); break;
|
case 0xFF: RST(0x38); break;
|
||||||
}
|
}
|
||||||
|
return t;
|
||||||
}
|
}
|
||||||
|
|
||||||
void BIT_INSTRUCTIONS()
|
void BIT_INSTRUCTIONS()
|
||||||
|
|||||||
4
z80.h
4
z80.h
@@ -5,5 +5,7 @@
|
|||||||
namespace z80
|
namespace z80
|
||||||
{
|
{
|
||||||
void reset(uint8_t* mem);
|
void reset(uint8_t* mem);
|
||||||
void step();
|
void connect_port(int num, int (*in_ptr)(), void (*out_ptr)(int));
|
||||||
|
uint32_t step();
|
||||||
|
uint16_t getPC();
|
||||||
}
|
}
|
||||||
70
z80dis.cpp
Normal file
70
z80dis.cpp
Normal file
File diff suppressed because one or more lines are too long
Reference in New Issue
Block a user