2017-01-13 23:59:38 +00:00
|
|
|
//Hudson Soft HuC6280
|
Update to v101r30 release.
byuu says:
Changelog:
- SMS: added cartridge ROM/RAM mirroring (fixes Alex Kidd)
- SMS: fixed 8x16 sprite mode (fixes Wonder Boy, Ys graphics)
- Z80: emulated "ex (sp),hl" instruction
- Z80: fixed INx NF (should be set instead of cleared)
- Z80: fixed loop condition check for CPxR, INxR, LDxR, OTxR (fixes
walking in Wonder Boy)
- SFC: removed Debugger and sfc/debugger.hpp
- icarus: connected MS, GG, MD importing to the scan dialog
- PCE: added emulation skeleton to higan and icarus
At this point, Master System games are fairly highly compatible, sans
audio. Game Gear games are running, but I need to crop the resolution
and support the higher color palette that they can utilize. It's really
something else the way they handled the resolution shrink on that thing.
The last change is obviously going to be the biggest news.
I'm very well aware it's not an ideal time to start on a new emulation
core, with the MS and MD cores only just now coming to life with no
audio support.
But, for whatever reason, my heart's really set on working on the PC
Engine. I wanted to write the final higan skeleton core, and get things
ready so that whenever I'm in the mood to work on the PCE, I can do so.
The skeleton is far and away the most tedious and obnoxious part of the
emulator development, because it's basically all just lots of
boilerplate templated code, lots of new files to create, etc.
I really don't know how things are going to proceed ... but I can say
with 99.9% certainty that this will be the final brand new core ever
added to higan -- at least one written by me, that is. This was
basically the last system from my childhood that I ever cared about.
It's the last 2D system with games that I really enjoy playing. No other
system is worth dividing my efforts and reducing the quality and amount
of time to work on the systems I have.
In the future, there will be potential for FDS, Mega CD and PCE-CD
support. But those will all be add-ons, and they'll all be really
difficult and challenge the entire design of higan's UI (it's entirely
cartridge-driven at this time.) None of them will be entirely new cores
like this one.
2017-01-11 20:27:30 +00:00
|
|
|
|
|
|
|
#pragma once
|
|
|
|
|
|
|
|
namespace Processor {
|
|
|
|
|
|
|
|
struct HuC6280 {
|
|
|
|
virtual auto step(uint clocks) -> void = 0;
|
2017-01-13 23:59:38 +00:00
|
|
|
virtual auto read(uint21 addr) -> uint8 = 0;
|
|
|
|
virtual auto write(uint21 addr, uint8 data) -> void = 0;
|
2017-01-13 01:15:45 +00:00
|
|
|
virtual auto lastCycle() -> void = 0;
|
Update to v101r30 release.
byuu says:
Changelog:
- SMS: added cartridge ROM/RAM mirroring (fixes Alex Kidd)
- SMS: fixed 8x16 sprite mode (fixes Wonder Boy, Ys graphics)
- Z80: emulated "ex (sp),hl" instruction
- Z80: fixed INx NF (should be set instead of cleared)
- Z80: fixed loop condition check for CPxR, INxR, LDxR, OTxR (fixes
walking in Wonder Boy)
- SFC: removed Debugger and sfc/debugger.hpp
- icarus: connected MS, GG, MD importing to the scan dialog
- PCE: added emulation skeleton to higan and icarus
At this point, Master System games are fairly highly compatible, sans
audio. Game Gear games are running, but I need to crop the resolution
and support the higher color palette that they can utilize. It's really
something else the way they handled the resolution shrink on that thing.
The last change is obviously going to be the biggest news.
I'm very well aware it's not an ideal time to start on a new emulation
core, with the MS and MD cores only just now coming to life with no
audio support.
But, for whatever reason, my heart's really set on working on the PC
Engine. I wanted to write the final higan skeleton core, and get things
ready so that whenever I'm in the mood to work on the PCE, I can do so.
The skeleton is far and away the most tedious and obnoxious part of the
emulator development, because it's basically all just lots of
boilerplate templated code, lots of new files to create, etc.
I really don't know how things are going to proceed ... but I can say
with 99.9% certainty that this will be the final brand new core ever
added to higan -- at least one written by me, that is. This was
basically the last system from my childhood that I ever cared about.
It's the last 2D system with games that I really enjoy playing. No other
system is worth dividing my efforts and reducing the quality and amount
of time to work on the systems I have.
In the future, there will be potential for FDS, Mega CD and PCE-CD
support. But those will all be add-ons, and they'll all be really
difficult and challenge the entire design of higan's UI (it's entirely
cartridge-driven at this time.) None of them will be entirely new cores
like this one.
2017-01-11 20:27:30 +00:00
|
|
|
|
|
|
|
auto power() -> void;
|
2017-01-13 01:15:45 +00:00
|
|
|
|
|
|
|
//memory.cpp
|
2017-01-13 23:59:38 +00:00
|
|
|
inline auto mmu(uint16) const -> uint21;
|
Update to v102 release.
byuu says (in the public announcement):
This release adds very preliminary emulation of the Sega Master System
(Mark III), Sega Game Gear, Sega Mega Drive (Genesis), and NEC PC Engine
(Turbografx-16). These cores do not yet offer sound emulation, save
states or cheat codes.
I'm always very hesitant to release a new emulation core in its alpha
stages, as in the past this has resulted in lasting bad impressions
of cores that have since improved greatly. For instance, the Game Boy
Advance emulation offered today is easily the second most accurate around,
yet it is still widely judged by its much older alpha implementation.
However, it's always been tradition with higan to not hold onto code
in secret. Rather than delay future releases for another year or two,
I'll put my faith in you all to understand that the emulation of these
systems will improve over time.
I hope that by releasing things as they are now, I might be able to
receive some much needed assistance in improving these cores, as the
documentation for these new systems is very much less than ideal.
byuu says (in the WIP forum):
Changelog:
- PCE: latch background scroll registers (fixes Neutopia scrolling)
- PCE: clip background attribute table scrolling (fixes Blazing Lazers
scrolling)
- PCE: support background/sprite enable/disable bits
- PCE: fix large sprite indexing (fixes Blazing Lazers title screen
sprites)
- HuC6280: wrap zeropage accesses to never go beyond $20xx
- HuC6280: fix alternating addresses for block move instructions
(fixes Neutopia II)
- HuC6280: block move instructions save and restore A,X,Y registers
- HuC6280: emulate BCD mode (may not be 100% correct, based on SNES
BCD) (fixes Blazing Lazers scoring)
2017-01-19 21:01:15 +00:00
|
|
|
inline auto load8(uint8) -> uint8;
|
|
|
|
inline auto load16(uint16) -> uint8;
|
|
|
|
inline auto store8(uint8, uint8) -> void;
|
|
|
|
inline auto store16(uint16, uint8) -> void;
|
|
|
|
inline auto store21(uint21, uint8) -> void;
|
2017-01-13 23:59:38 +00:00
|
|
|
|
2017-01-13 01:15:45 +00:00
|
|
|
auto io() -> uint8;
|
|
|
|
auto opcode() -> uint8;
|
|
|
|
auto operand() -> uint8;
|
|
|
|
|
2017-01-13 23:59:38 +00:00
|
|
|
auto push(uint8) -> void;
|
|
|
|
auto pull() -> uint8;
|
|
|
|
|
2017-01-13 01:15:45 +00:00
|
|
|
//instruction.cpp
|
2017-01-16 21:02:56 +00:00
|
|
|
auto interrupt(uint16 vector) -> void;
|
Update to v101r30 release.
byuu says:
Changelog:
- SMS: added cartridge ROM/RAM mirroring (fixes Alex Kidd)
- SMS: fixed 8x16 sprite mode (fixes Wonder Boy, Ys graphics)
- Z80: emulated "ex (sp),hl" instruction
- Z80: fixed INx NF (should be set instead of cleared)
- Z80: fixed loop condition check for CPxR, INxR, LDxR, OTxR (fixes
walking in Wonder Boy)
- SFC: removed Debugger and sfc/debugger.hpp
- icarus: connected MS, GG, MD importing to the scan dialog
- PCE: added emulation skeleton to higan and icarus
At this point, Master System games are fairly highly compatible, sans
audio. Game Gear games are running, but I need to crop the resolution
and support the higher color palette that they can utilize. It's really
something else the way they handled the resolution shrink on that thing.
The last change is obviously going to be the biggest news.
I'm very well aware it's not an ideal time to start on a new emulation
core, with the MS and MD cores only just now coming to life with no
audio support.
But, for whatever reason, my heart's really set on working on the PC
Engine. I wanted to write the final higan skeleton core, and get things
ready so that whenever I'm in the mood to work on the PCE, I can do so.
The skeleton is far and away the most tedious and obnoxious part of the
emulator development, because it's basically all just lots of
boilerplate templated code, lots of new files to create, etc.
I really don't know how things are going to proceed ... but I can say
with 99.9% certainty that this will be the final brand new core ever
added to higan -- at least one written by me, that is. This was
basically the last system from my childhood that I ever cared about.
It's the last 2D system with games that I really enjoy playing. No other
system is worth dividing my efforts and reducing the quality and amount
of time to work on the systems I have.
In the future, there will be potential for FDS, Mega CD and PCE-CD
support. But those will all be add-ons, and they'll all be really
difficult and challenge the entire design of higan's UI (it's entirely
cartridge-driven at this time.) None of them will be entirely new cores
like this one.
2017-01-11 20:27:30 +00:00
|
|
|
auto instruction() -> void;
|
2017-01-13 01:15:45 +00:00
|
|
|
|
|
|
|
//instructions.cpp
|
2017-01-15 00:58:47 +00:00
|
|
|
using fp = auto (HuC6280::*)(uint8) -> uint8;
|
2017-01-13 23:59:38 +00:00
|
|
|
auto ADC(uint8) -> uint8;
|
|
|
|
auto AND(uint8) -> uint8;
|
|
|
|
auto ASL(uint8) -> uint8;
|
|
|
|
auto BIT(uint8) -> uint8;
|
|
|
|
auto CMP(uint8) -> uint8;
|
|
|
|
auto CPX(uint8) -> uint8;
|
|
|
|
auto CPY(uint8) -> uint8;
|
|
|
|
auto DEC(uint8) -> uint8;
|
|
|
|
auto EOR(uint8) -> uint8;
|
|
|
|
auto INC(uint8) -> uint8;
|
|
|
|
auto LD (uint8) -> uint8;
|
|
|
|
auto LSR(uint8) -> uint8;
|
|
|
|
auto ORA(uint8) -> uint8;
|
|
|
|
auto ROL(uint8) -> uint8;
|
|
|
|
auto ROR(uint8) -> uint8;
|
|
|
|
auto SBC(uint8) -> uint8;
|
2017-01-15 00:58:47 +00:00
|
|
|
auto TRB(uint8) -> uint8;
|
|
|
|
auto TSB(uint8) -> uint8;
|
|
|
|
|
Update to v102 release.
byuu says (in the public announcement):
This release adds very preliminary emulation of the Sega Master System
(Mark III), Sega Game Gear, Sega Mega Drive (Genesis), and NEC PC Engine
(Turbografx-16). These cores do not yet offer sound emulation, save
states or cheat codes.
I'm always very hesitant to release a new emulation core in its alpha
stages, as in the past this has resulted in lasting bad impressions
of cores that have since improved greatly. For instance, the Game Boy
Advance emulation offered today is easily the second most accurate around,
yet it is still widely judged by its much older alpha implementation.
However, it's always been tradition with higan to not hold onto code
in secret. Rather than delay future releases for another year or two,
I'll put my faith in you all to understand that the emulation of these
systems will improve over time.
I hope that by releasing things as they are now, I might be able to
receive some much needed assistance in improving these cores, as the
documentation for these new systems is very much less than ideal.
byuu says (in the WIP forum):
Changelog:
- PCE: latch background scroll registers (fixes Neutopia scrolling)
- PCE: clip background attribute table scrolling (fixes Blazing Lazers
scrolling)
- PCE: support background/sprite enable/disable bits
- PCE: fix large sprite indexing (fixes Blazing Lazers title screen
sprites)
- HuC6280: wrap zeropage accesses to never go beyond $20xx
- HuC6280: fix alternating addresses for block move instructions
(fixes Neutopia II)
- HuC6280: block move instructions save and restore A,X,Y registers
- HuC6280: emulate BCD mode (may not be 100% correct, based on SNES
BCD) (fixes Blazing Lazers scoring)
2017-01-19 21:01:15 +00:00
|
|
|
using bp = auto (HuC6280::*)(uint16&, uint16&, bool) -> void;
|
|
|
|
auto TAI(uint16&, uint16&, bool) -> void;
|
|
|
|
auto TDD(uint16&, uint16&, bool) -> void;
|
|
|
|
auto TIA(uint16&, uint16&, bool) -> void;
|
|
|
|
auto TII(uint16&, uint16&, bool) -> void;
|
|
|
|
auto TIN(uint16&, uint16&, bool) -> void;
|
2017-01-15 00:58:47 +00:00
|
|
|
|
|
|
|
auto instruction_absoluteLoad(fp, uint8&, uint8 = 0) -> void;
|
|
|
|
auto instruction_absoluteModify(fp, uint8 = 0) -> void;
|
|
|
|
auto instruction_absoluteStore(uint8, uint8 = 0) -> void;
|
|
|
|
auto instruction_blockmove(bp) -> void;
|
|
|
|
auto instruction_branch(bool) -> void;
|
|
|
|
auto instruction_clear(uint8&) -> void;
|
|
|
|
auto instruction_clear(bool&) -> void;
|
|
|
|
auto instruction_immediate(fp, uint8&) -> void;
|
|
|
|
auto instruction_implied(fp, uint8&) -> void;
|
|
|
|
auto instruction_indirectLoad(fp, uint8&, uint8 = 0) -> void;
|
|
|
|
auto instruction_indirectStore(uint8, uint8 = 0) -> void;
|
|
|
|
auto instruction_indirectYLoad(fp, uint8&) -> void;
|
|
|
|
auto instruction_indirectYStore(uint8) -> void;
|
|
|
|
auto instruction_memory(fp) -> void;
|
|
|
|
auto instruction_pull(uint8&) -> void;
|
|
|
|
auto instruction_pullP() -> void;
|
|
|
|
auto instruction_push(uint8) -> void;
|
|
|
|
auto instruction_set(bool&) -> void;
|
|
|
|
auto instruction_swap(uint8&, uint8&) -> void;
|
|
|
|
auto instruction_transfer(uint8&, uint8&) -> void;
|
|
|
|
auto instruction_zeropageLoad(fp, uint8&, uint8 = 0) -> void;
|
|
|
|
auto instruction_zeropageModify(fp, uint8 = 0) -> void;
|
|
|
|
auto instruction_zeropageStore(uint8, uint8 = 0) -> void;
|
|
|
|
|
|
|
|
auto instruction_BBR(uint3) -> void;
|
|
|
|
auto instruction_BBS(uint3) -> void;
|
|
|
|
auto instruction_BRK() -> void;
|
|
|
|
auto instruction_BSR() -> void;
|
2017-01-13 23:59:38 +00:00
|
|
|
auto instruction_CSL() -> void;
|
|
|
|
auto instruction_CSH() -> void;
|
2017-01-15 00:58:47 +00:00
|
|
|
auto instruction_JMP_absolute() -> void;
|
|
|
|
auto instruction_JMP_indirect(uint8 = 0) -> void;
|
|
|
|
auto instruction_JSR() -> void;
|
2017-01-13 23:59:38 +00:00
|
|
|
auto instruction_NOP() -> void;
|
|
|
|
auto instruction_PHP() -> void;
|
2017-01-15 00:58:47 +00:00
|
|
|
auto instruction_RMB(uint3) -> void;
|
|
|
|
auto instruction_RTI() -> void;
|
|
|
|
auto instruction_RTS() -> void;
|
|
|
|
auto instruction_SMB(uint3) -> void;
|
|
|
|
auto instruction_ST(uint2) -> void;
|
2017-01-13 23:59:38 +00:00
|
|
|
auto instruction_TAM() -> void;
|
|
|
|
auto instruction_TMA() -> void;
|
2017-01-15 00:58:47 +00:00
|
|
|
auto instruction_TST_absolute(uint8 = 0) -> void;
|
|
|
|
auto instruction_TST_zeropage(uint8 = 0) -> void;
|
2017-01-13 23:59:38 +00:00
|
|
|
auto instruction_TXS() -> void;
|
2017-01-13 01:15:45 +00:00
|
|
|
|
|
|
|
//disassembler.cpp
|
|
|
|
auto disassemble(uint16 pc) -> string;
|
|
|
|
|
|
|
|
struct Flags {
|
2017-01-13 23:59:38 +00:00
|
|
|
bool c; //carry
|
|
|
|
bool z; //zero
|
|
|
|
bool i; //interrupt disable
|
|
|
|
bool d; //decimal mode
|
|
|
|
bool b; //break
|
|
|
|
bool t; //memory operation
|
|
|
|
bool v; //overflow
|
|
|
|
bool n; //negative
|
|
|
|
|
|
|
|
inline operator uint8() const {
|
|
|
|
return c << 0 | z << 1 | i << 2 | d << 3 | b << 4 | t << 5 | v << 6 | n << 7;
|
|
|
|
}
|
|
|
|
|
|
|
|
inline auto& operator=(uint8 data) {
|
|
|
|
c = data.bit(0);
|
|
|
|
z = data.bit(1);
|
|
|
|
i = data.bit(2);
|
|
|
|
d = data.bit(3);
|
|
|
|
b = data.bit(4);
|
|
|
|
t = data.bit(5);
|
|
|
|
v = data.bit(6);
|
|
|
|
n = data.bit(7);
|
|
|
|
return *this;
|
|
|
|
}
|
2017-01-13 01:15:45 +00:00
|
|
|
};
|
|
|
|
|
|
|
|
struct Registers {
|
|
|
|
uint8 a;
|
|
|
|
uint8 x;
|
|
|
|
uint8 y;
|
|
|
|
uint8 s;
|
|
|
|
uint16 pc;
|
2017-01-13 23:59:38 +00:00
|
|
|
uint8 mpr[8];
|
2017-01-13 01:15:45 +00:00
|
|
|
uint8 mdr;
|
2017-01-13 23:59:38 +00:00
|
|
|
Flags p;
|
|
|
|
uint8 cs; //code speed (3 = fast, 12 = slow)
|
2017-01-13 01:15:45 +00:00
|
|
|
} r;
|
Update to v101r30 release.
byuu says:
Changelog:
- SMS: added cartridge ROM/RAM mirroring (fixes Alex Kidd)
- SMS: fixed 8x16 sprite mode (fixes Wonder Boy, Ys graphics)
- Z80: emulated "ex (sp),hl" instruction
- Z80: fixed INx NF (should be set instead of cleared)
- Z80: fixed loop condition check for CPxR, INxR, LDxR, OTxR (fixes
walking in Wonder Boy)
- SFC: removed Debugger and sfc/debugger.hpp
- icarus: connected MS, GG, MD importing to the scan dialog
- PCE: added emulation skeleton to higan and icarus
At this point, Master System games are fairly highly compatible, sans
audio. Game Gear games are running, but I need to crop the resolution
and support the higher color palette that they can utilize. It's really
something else the way they handled the resolution shrink on that thing.
The last change is obviously going to be the biggest news.
I'm very well aware it's not an ideal time to start on a new emulation
core, with the MS and MD cores only just now coming to life with no
audio support.
But, for whatever reason, my heart's really set on working on the PC
Engine. I wanted to write the final higan skeleton core, and get things
ready so that whenever I'm in the mood to work on the PCE, I can do so.
The skeleton is far and away the most tedious and obnoxious part of the
emulator development, because it's basically all just lots of
boilerplate templated code, lots of new files to create, etc.
I really don't know how things are going to proceed ... but I can say
with 99.9% certainty that this will be the final brand new core ever
added to higan -- at least one written by me, that is. This was
basically the last system from my childhood that I ever cared about.
It's the last 2D system with games that I really enjoy playing. No other
system is worth dividing my efforts and reducing the quality and amount
of time to work on the systems I have.
In the future, there will be potential for FDS, Mega CD and PCE-CD
support. But those will all be add-ons, and they'll all be really
difficult and challenge the entire design of higan's UI (it's entirely
cartridge-driven at this time.) None of them will be entirely new cores
like this one.
2017-01-11 20:27:30 +00:00
|
|
|
};
|
|
|
|
|
|
|
|
}
|