mirror of
https://github.com/bsnes-emu/bsnes.git
synced 2025-09-19 17:11:37 +02:00
Compare commits
21 Commits
v064
...
graft-poin
Author | SHA1 | Date | |
---|---|---|---|
|
81f43a4d01 | ||
|
9ea739aec1 | ||
|
254a5016e1 | ||
|
dcc661cb28 | ||
|
431d5c8db7 | ||
|
7b7a95af67 | ||
|
a266a2b5e2 | ||
|
53f03be5a2 | ||
|
77375c3c68 | ||
|
dce3e61f06 | ||
|
20b44ddfd1 | ||
|
79f20030a0 | ||
|
79b939e1c7 | ||
|
3ae74ff5a5 | ||
|
7351b910c5 | ||
|
6bbb609f2f | ||
|
0d19902435 | ||
|
44bab83d68 | ||
|
42a4c1d60e | ||
|
645689e683 | ||
|
8b0153daf0 |
@@ -1,10 +1,11 @@
|
||||
include nall/Makefile
|
||||
ui := ui_qt
|
||||
snes := asnes
|
||||
ui := qt
|
||||
|
||||
# compiler
|
||||
c := $(compiler) -std=gnu99
|
||||
cpp := $(subst cc,++,$(compiler)) -std=gnu++0x
|
||||
flags := -O3 -fomit-frame-pointer -I.
|
||||
flags := -O3 -fomit-frame-pointer -I. -I$(snes)
|
||||
link :=
|
||||
objects :=
|
||||
|
||||
@@ -20,9 +21,9 @@ ifeq ($(platform),x)
|
||||
link += -s -ldl -lX11 -lXext
|
||||
else ifeq ($(platform),osx)
|
||||
else ifeq ($(platform),win)
|
||||
link += -mwindows -mthreads
|
||||
# link += -mconsole -mthreads
|
||||
link += -s -luuid -lkernel32 -luser32 -lgdi32 -lshell32
|
||||
link += -mwindows
|
||||
# link += -mconsole
|
||||
link += -mthreads -s -luuid -lkernel32 -luser32 -lgdi32 -lshell32
|
||||
link += -enable-stdcall-fixup -Wl,-enable-auto-import -Wl,-enable-runtime-pseudo-reloc
|
||||
else
|
||||
unknown_platform: help;
|
||||
@@ -43,7 +44,7 @@ compile = \
|
||||
|
||||
all: build;
|
||||
|
||||
include snes/Makefile
|
||||
include $(snes)/Makefile
|
||||
include $(ui)/Makefile
|
||||
|
||||
objects := $(patsubst %,obj/%.o,$(objects))
|
||||
@@ -54,7 +55,7 @@ ifeq ($(platform),osx)
|
||||
test -d ../bsnes.app || mkdir -p ../bsnes.app/Contents/MacOS
|
||||
$(strip $(cpp) -o ../bsnes.app/Contents/MacOS/bsnes $(objects) $(link))
|
||||
else
|
||||
$(strip $(cpp) -o ../bsnes $(objects) $(link))
|
||||
$(strip $(cpp) -o out/$(snes) $(objects) $(link))
|
||||
endif
|
||||
|
||||
install:
|
||||
@@ -84,4 +85,7 @@ clean: ui_clean
|
||||
-@$(call delete,*.pdb)
|
||||
-@$(call delete,*.manifest)
|
||||
|
||||
archive-all:
|
||||
tar -cjf snes-`date +%Y%m%d`.tar.bz2 asnes bsnes libco nall obj out qt ruby Makefile sync.sh
|
||||
|
||||
help:;
|
77
asnes/Makefile
Normal file
77
asnes/Makefile
Normal file
@@ -0,0 +1,77 @@
|
||||
snes_objects := libco
|
||||
snes_objects += snes-system
|
||||
snes_objects += snes-cartridge snes-cheat
|
||||
snes_objects += snes-memory snes-cpucore snes-cpu snes-smpcore snes-smp snes-dsp snes-ppu
|
||||
snes_objects += snes-supergameboy snes-superfx snes-sa1
|
||||
snes_objects += snes-bsx snes-srtc snes-sdd1 snes-spc7110
|
||||
snes_objects += snes-cx4 snes-dsp1 snes-dsp2 snes-dsp3 snes-dsp4
|
||||
snes_objects += snes-obc1 snes-st0010 snes-st0011 snes-st0018
|
||||
snes_objects += snes-msu1 snes-serial
|
||||
objects += $(snes_objects)
|
||||
|
||||
obj/libco.o : libco/libco.c libco/*
|
||||
obj/libsnes.o: $(snes)/libsnes/libsnes.cpp $(snes)/libsnes/*
|
||||
|
||||
obj/snes-system.o : $(snes)/system/system.cpp $(call rwildcard,$(snes)/system/) $(call rwildcard,$(snes)/video/)
|
||||
obj/snes-memory.o : $(snes)/memory/memory.cpp $(snes)/memory/*
|
||||
obj/snes-cpucore.o : $(snes)/cpu/core/core.cpp $(call rwildcard,$(snes)/cpu/core/)
|
||||
obj/snes-cpu.o : $(snes)/cpu/cpu.cpp $(snes)/cpu/*
|
||||
obj/snes-smpcore.o : $(snes)/smp/core/core.cpp $(call rwildcard,$(snes)/smp/core/)
|
||||
obj/snes-smp.o : $(snes)/smp/smp.cpp $(snes)/smp/*
|
||||
obj/snes-dsp.o : $(snes)/dsp/dsp.cpp $(snes)/dsp/*
|
||||
obj/snes-ppu.o : $(snes)/ppu/ppu.cpp $(snes)/ppu/*
|
||||
obj/snes-cartridge.o: $(snes)/cartridge/cartridge.cpp $(snes)/cartridge/*
|
||||
obj/snes-cheat.o : $(snes)/cheat/cheat.cpp $(snes)/cheat/*
|
||||
|
||||
obj/snes-supergameboy.o: $(snes)/chip/supergameboy/supergameboy.cpp $(call rwildcard,$(snes)/chip/supergameboy/)
|
||||
obj/snes-superfx.o : $(snes)/chip/superfx/superfx.cpp $(call rwildcard,$(snes)/chip/superfx/)
|
||||
obj/snes-sa1.o : $(snes)/chip/sa1/sa1.cpp $(call rwildcard,$(snes)/chip/sa1/)
|
||||
obj/snes-bsx.o : $(snes)/chip/bsx/bsx.cpp $(snes)/chip/bsx/*
|
||||
obj/snes-srtc.o : $(snes)/chip/srtc/srtc.cpp $(snes)/chip/srtc/*
|
||||
obj/snes-sdd1.o : $(snes)/chip/sdd1/sdd1.cpp $(snes)/chip/sdd1/*
|
||||
obj/snes-spc7110.o : $(snes)/chip/spc7110/spc7110.cpp $(snes)/chip/spc7110/*
|
||||
obj/snes-cx4.o : $(snes)/chip/cx4/cx4.cpp $(snes)/chip/cx4/*
|
||||
obj/snes-dsp1.o : $(snes)/chip/dsp1/dsp1.cpp $(snes)/chip/dsp1/*
|
||||
obj/snes-dsp2.o : $(snes)/chip/dsp2/dsp2.cpp $(snes)/chip/dsp2/*
|
||||
obj/snes-dsp3.o : $(snes)/chip/dsp3/dsp3.cpp $(snes)/chip/dsp3/*
|
||||
obj/snes-dsp4.o : $(snes)/chip/dsp4/dsp4.cpp $(snes)/chip/dsp4/*
|
||||
obj/snes-obc1.o : $(snes)/chip/obc1/obc1.cpp $(snes)/chip/obc1/*
|
||||
obj/snes-st0010.o : $(snes)/chip/st0010/st0010.cpp $(snes)/chip/st0010/*
|
||||
obj/snes-st0011.o : $(snes)/chip/st0011/st0011.cpp $(snes)/chip/st0011/*
|
||||
obj/snes-st0018.o : $(snes)/chip/st0018/st0018.cpp $(snes)/chip/st0018/*
|
||||
obj/snes-msu1.o : $(snes)/chip/msu1/msu1.cpp $(snes)/chip/msu1/*
|
||||
obj/snes-serial.o : $(snes)/chip/serial/serial.cpp $(snes)/chip/serial/*
|
||||
|
||||
###########
|
||||
# library #
|
||||
###########
|
||||
|
||||
snes_objects := $(patsubst %,obj/%.o,$(snes_objects))
|
||||
|
||||
library: $(snes_objects) obj/libsnes.o
|
||||
ifeq ($(platform),x)
|
||||
ar rcs obj/libsnes.a $(snes_objects) obj/libsnes.o
|
||||
$(cpp) -o obj/libsnes.so -shared -Wl,-soname,libsnes.so.1 $(snes_objects) obj/libsnes.o
|
||||
else ifeq ($(platform),osx)
|
||||
ar rcs obj/libsnes.a $(snes_objects) obj/libsnes.o
|
||||
$(cpp) -o obj/libsnes.dylib -install_name @executable_path/../Libraries/libsnes.dylib -shared -dynamiclib $(snes_objects) obj/libsnes.o
|
||||
else ifeq ($(platform),win)
|
||||
$(cpp) -o obj/snes.dll -shared -Wl,--out-implib,libsnes.a $(snes_objects) obj/libsnes.o
|
||||
endif
|
||||
|
||||
library-install:
|
||||
ifeq ($(platform),x)
|
||||
install -D -m 755 obj/libsnes.a $(DESTDIR)$(prefix)/lib/libsnes.a
|
||||
install -D -m 755 obj/libsnes.so $(DESTDIR)$(prefix)/lib/libsnes.so
|
||||
ldconfig -n $(DESTDIR)$(prefix)/lib
|
||||
else ifeq ($(platform),osx)
|
||||
cp obj/libsnes.dylib /usr/local/lib/libsnes.dylib
|
||||
endif
|
||||
|
||||
library-uninstall:
|
||||
ifeq ($(platform),x)
|
||||
rm $(DESTDIR)$(prefix)/lib/libsnes.a
|
||||
rm $(DESTDIR)$(prefix)/lib/libsnes.so
|
||||
else ifeq ($(platform),osx)
|
||||
rm /usr/local/lib/libsnes.dylib
|
||||
endif
|
@@ -14,12 +14,7 @@ void Audio::coprocessor_enable(bool state) {
|
||||
|
||||
void Audio::coprocessor_frequency(double input_frequency) {
|
||||
double output_frequency;
|
||||
if(system.region() == System::Region::NTSC) {
|
||||
output_frequency = config.smp.ntsc_clock_rate / 768.0;
|
||||
} else /* (system.region() == System::PAL) */ {
|
||||
output_frequency = config.smp.pal_clock_rate / 768.0;
|
||||
}
|
||||
|
||||
output_frequency = system.apu_frequency() / 768.0;
|
||||
r_step = input_frequency / output_frequency;
|
||||
r_frac = 0;
|
||||
}
|
@@ -1,4 +1,4 @@
|
||||
#include <snes/snes.hpp>
|
||||
#include <snes.hpp>
|
||||
|
||||
#include <nall/crc32.hpp>
|
||||
#include <nall/sha256.hpp>
|
||||
@@ -27,6 +27,7 @@ void Cartridge::load(Mode cartridge_mode, const lstring &xml_list) {
|
||||
supergameboy_version = SuperGameBoyVersion::Version1;
|
||||
supergameboy_ram_size = 0;
|
||||
supergameboy_rtc_size = 0;
|
||||
serial_baud_rate = 57600;
|
||||
|
||||
has_bsx_slot = false;
|
||||
has_superfx = false;
|
||||
@@ -45,6 +46,7 @@ void Cartridge::load(Mode cartridge_mode, const lstring &xml_list) {
|
||||
has_st0011 = false;
|
||||
has_st0018 = false;
|
||||
has_msu1 = false;
|
||||
has_serial = false;
|
||||
|
||||
parse_xml(xml_list);
|
||||
|
@@ -18,6 +18,10 @@ public:
|
||||
Version2,
|
||||
};
|
||||
|
||||
//assigned externally to point to file-system datafiles (msu1 and serial)
|
||||
//example: "/path/to/filename.sfc" would set this to "/path/to/filename"
|
||||
readwrite<string> basename;
|
||||
|
||||
readonly<bool> loaded;
|
||||
readonly<unsigned> crc32;
|
||||
readonly<string> sha256;
|
||||
@@ -29,6 +33,7 @@ public:
|
||||
readonly<SuperGameBoyVersion> supergameboy_version;
|
||||
readonly<unsigned> supergameboy_ram_size;
|
||||
readonly<unsigned> supergameboy_rtc_size;
|
||||
readonly<unsigned> serial_baud_rate;
|
||||
|
||||
readonly<bool> has_bsx_slot;
|
||||
readonly<bool> has_superfx;
|
||||
@@ -47,6 +52,7 @@ public:
|
||||
readonly<bool> has_st0011;
|
||||
readonly<bool> has_st0018;
|
||||
readonly<bool> has_msu1;
|
||||
readonly<bool> has_serial;
|
||||
|
||||
struct Mapping {
|
||||
Memory *memory;
|
||||
@@ -95,6 +101,7 @@ private:
|
||||
void xml_parse_setadsp(xml_element&);
|
||||
void xml_parse_setarisc(xml_element&);
|
||||
void xml_parse_msu1(xml_element&);
|
||||
void xml_parse_serial(xml_element&);
|
||||
|
||||
void xml_parse_address(Mapping&, const string&);
|
||||
void xml_parse_mode(Mapping&, const string&);
|
@@ -46,6 +46,7 @@ void Cartridge::parse_xml_cartridge(const char *data) {
|
||||
if(node.name == "setadsp") xml_parse_setadsp(node);
|
||||
if(node.name == "setarisc") xml_parse_setarisc(node);
|
||||
if(node.name == "msu1") xml_parse_msu1(node);
|
||||
if(node.name == "serial") xml_parse_serial(node);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -92,7 +93,7 @@ void Cartridge::xml_parse_rom(xml_element &root) {
|
||||
if(attr.name == "offset") m.offset = strhex(attr.content);
|
||||
if(attr.name == "size") m.size = strhex(attr.content);
|
||||
}
|
||||
mapping.add(m);
|
||||
mapping.append(m);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -111,7 +112,7 @@ void Cartridge::xml_parse_ram(xml_element &root) {
|
||||
if(attr.name == "offset") m.offset = strhex(attr.content);
|
||||
if(attr.name == "size") m.size = strhex(attr.content);
|
||||
}
|
||||
mapping.add(m);
|
||||
mapping.append(m);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -130,7 +131,7 @@ void Cartridge::xml_parse_superfx(xml_element &root) {
|
||||
if(attr.name == "offset") m.offset = strhex(attr.content);
|
||||
if(attr.name == "size") m.size = strhex(attr.content);
|
||||
}
|
||||
mapping.add(m);
|
||||
mapping.append(m);
|
||||
}
|
||||
}
|
||||
} else if(node.name == "ram") {
|
||||
@@ -147,7 +148,7 @@ void Cartridge::xml_parse_superfx(xml_element &root) {
|
||||
if(attr.name == "offset") m.offset = strhex(attr.content);
|
||||
if(attr.name == "size") m.size = strhex(attr.content);
|
||||
}
|
||||
mapping.add(m);
|
||||
mapping.append(m);
|
||||
}
|
||||
}
|
||||
} else if(node.name == "mmio") {
|
||||
@@ -157,7 +158,7 @@ void Cartridge::xml_parse_superfx(xml_element &root) {
|
||||
foreach(attr, leaf.attribute) {
|
||||
if(attr.name == "address") xml_parse_address(m, attr.content);
|
||||
}
|
||||
mapping.add(m);
|
||||
mapping.append(m);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -178,7 +179,7 @@ void Cartridge::xml_parse_sa1(xml_element &root) {
|
||||
if(attr.name == "offset") m.offset = strhex(attr.content);
|
||||
if(attr.name == "size") m.size = strhex(attr.content);
|
||||
}
|
||||
mapping.add(m);
|
||||
mapping.append(m);
|
||||
}
|
||||
}
|
||||
} else if(node.name == "iram") {
|
||||
@@ -191,7 +192,7 @@ void Cartridge::xml_parse_sa1(xml_element &root) {
|
||||
if(attr.name == "offset") m.offset = strhex(attr.content);
|
||||
if(attr.name == "size") m.size = strhex(attr.content);
|
||||
}
|
||||
mapping.add(m);
|
||||
mapping.append(m);
|
||||
}
|
||||
}
|
||||
} else if(node.name == "bwram") {
|
||||
@@ -208,7 +209,7 @@ void Cartridge::xml_parse_sa1(xml_element &root) {
|
||||
if(attr.name == "offset") m.offset = strhex(attr.content);
|
||||
if(attr.name == "size") m.size = strhex(attr.content);
|
||||
}
|
||||
mapping.add(m);
|
||||
mapping.append(m);
|
||||
}
|
||||
}
|
||||
} else if(node.name == "mmio") {
|
||||
@@ -218,7 +219,7 @@ void Cartridge::xml_parse_sa1(xml_element &root) {
|
||||
foreach(attr, leaf.attribute) {
|
||||
if(attr.name == "address") xml_parse_address(m, attr.content);
|
||||
}
|
||||
mapping.add(m);
|
||||
mapping.append(m);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -239,7 +240,7 @@ void Cartridge::xml_parse_bsx(xml_element &root) {
|
||||
if(attr.name == "offset") m.offset = strhex(attr.content);
|
||||
if(attr.name == "size") m.size = strhex(attr.content);
|
||||
}
|
||||
mapping.add(m);
|
||||
mapping.append(m);
|
||||
}
|
||||
}
|
||||
} else if(node.name == "mmio") {
|
||||
@@ -249,7 +250,7 @@ void Cartridge::xml_parse_bsx(xml_element &root) {
|
||||
foreach(attr, leaf.attribute) {
|
||||
if(attr.name == "address") xml_parse_address(m, attr.content);
|
||||
}
|
||||
mapping.add(m);
|
||||
mapping.append(m);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -280,7 +281,7 @@ void Cartridge::xml_parse_sufamiturbo(xml_element &root) {
|
||||
if(attr.name == "offset") m.offset = strhex(attr.content);
|
||||
if(attr.name == "size") m.size = strhex(attr.content);
|
||||
}
|
||||
if(m.memory->size() > 0) mapping.add(m);
|
||||
if(m.memory->size() > 0) mapping.append(m);
|
||||
}
|
||||
}
|
||||
} else if(slot.name == "ram") {
|
||||
@@ -293,7 +294,7 @@ void Cartridge::xml_parse_sufamiturbo(xml_element &root) {
|
||||
if(attr.name == "offset") m.offset = strhex(attr.content);
|
||||
if(attr.name == "size") m.size = strhex(attr.content);
|
||||
}
|
||||
if(m.memory->size() > 0) mapping.add(m);
|
||||
if(m.memory->size() > 0) mapping.append(m);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -320,7 +321,7 @@ void Cartridge::xml_parse_supergameboy(xml_element &root) {
|
||||
foreach(attr, leaf.attribute) {
|
||||
if(attr.name == "address") xml_parse_address(m, attr.content);
|
||||
}
|
||||
mapping.add(m);
|
||||
mapping.append(m);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -338,7 +339,7 @@ void Cartridge::xml_parse_srtc(xml_element &root) {
|
||||
foreach(attr, leaf.attribute) {
|
||||
if(attr.name == "address") xml_parse_address(m, attr.content);
|
||||
}
|
||||
mapping.add(m);
|
||||
mapping.append(m);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -356,7 +357,7 @@ void Cartridge::xml_parse_sdd1(xml_element &root) {
|
||||
foreach(attr, leaf.attribute) {
|
||||
if(attr.name == "address") xml_parse_address(m, attr.content);
|
||||
}
|
||||
mapping.add(m);
|
||||
mapping.append(m);
|
||||
}
|
||||
}
|
||||
} else if(node.name == "mmio") {
|
||||
@@ -366,7 +367,7 @@ void Cartridge::xml_parse_sdd1(xml_element &root) {
|
||||
foreach(attr, leaf.attribute) {
|
||||
if(attr.name == "address") xml_parse_address(m, attr.content);
|
||||
}
|
||||
mapping.add(m);
|
||||
mapping.append(m);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -384,7 +385,7 @@ void Cartridge::xml_parse_spc7110(xml_element &root) {
|
||||
foreach(attr, leaf.attribute) {
|
||||
if(attr.name == "address") xml_parse_address(m, attr.content);
|
||||
}
|
||||
mapping.add(m);
|
||||
mapping.append(m);
|
||||
}
|
||||
}
|
||||
} else if(node.name == "mcu") {
|
||||
@@ -395,7 +396,7 @@ void Cartridge::xml_parse_spc7110(xml_element &root) {
|
||||
if(attr.name == "address") xml_parse_address(m, attr.content);
|
||||
if(attr.name == "offset") spc7110_data_rom_offset = strhex(attr.content);
|
||||
}
|
||||
mapping.add(m);
|
||||
mapping.append(m);
|
||||
}
|
||||
}
|
||||
} else if(node.name == "mmio") {
|
||||
@@ -405,7 +406,7 @@ void Cartridge::xml_parse_spc7110(xml_element &root) {
|
||||
foreach(attr, leaf.attribute) {
|
||||
if(attr.name == "address") xml_parse_address(m, attr.content);
|
||||
}
|
||||
mapping.add(m);
|
||||
mapping.append(m);
|
||||
}
|
||||
}
|
||||
} else if(node.name == "ram") {
|
||||
@@ -422,7 +423,7 @@ void Cartridge::xml_parse_spc7110(xml_element &root) {
|
||||
if(attr.name == "offset") m.offset = strhex(attr.content);
|
||||
if(attr.name == "size") m.size = strhex(attr.content);
|
||||
}
|
||||
mapping.add(m);
|
||||
mapping.append(m);
|
||||
}
|
||||
}
|
||||
} else if(node.name == "rtc") {
|
||||
@@ -434,7 +435,7 @@ void Cartridge::xml_parse_spc7110(xml_element &root) {
|
||||
foreach(attr, leaf.attribute) {
|
||||
if(attr.name == "address") xml_parse_address(m, attr.content);
|
||||
}
|
||||
mapping.add(m);
|
||||
mapping.append(m);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -452,7 +453,7 @@ void Cartridge::xml_parse_cx4(xml_element &root) {
|
||||
foreach(attr, leaf.attribute) {
|
||||
if(attr.name == "address") xml_parse_address(m, attr.content);
|
||||
}
|
||||
mapping.add(m);
|
||||
mapping.append(m);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -491,7 +492,7 @@ void Cartridge::xml_parse_necdsp(xml_element &root) {
|
||||
foreach(attr, leaf.attribute) {
|
||||
if(attr.name == "address") xml_parse_address(m, attr.content);
|
||||
}
|
||||
mapping.add(m);
|
||||
mapping.append(m);
|
||||
}
|
||||
}
|
||||
} else if(node.name == "sr" && sr[program]) {
|
||||
@@ -501,7 +502,7 @@ void Cartridge::xml_parse_necdsp(xml_element &root) {
|
||||
foreach(attr, leaf.attribute) {
|
||||
if(attr.name == "address") xml_parse_address(m, attr.content);
|
||||
}
|
||||
mapping.add(m);
|
||||
mapping.append(m);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -519,7 +520,7 @@ void Cartridge::xml_parse_obc1(xml_element &root) {
|
||||
foreach(attr, leaf.attribute) {
|
||||
if(attr.name == "address") xml_parse_address(m, attr.content);
|
||||
}
|
||||
mapping.add(m);
|
||||
mapping.append(m);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -551,7 +552,7 @@ void Cartridge::xml_parse_setadsp(xml_element &root) {
|
||||
foreach(attr, leaf.attribute) {
|
||||
if(attr.name == "address") xml_parse_address(m, attr.content);
|
||||
}
|
||||
mapping.add(m);
|
||||
mapping.append(m);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -580,7 +581,7 @@ void Cartridge::xml_parse_setarisc(xml_element &root) {
|
||||
foreach(attr, leaf.attribute) {
|
||||
if(attr.name == "address") xml_parse_address(m, attr.content);
|
||||
}
|
||||
mapping.add(m);
|
||||
mapping.append(m);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -598,13 +599,23 @@ void Cartridge::xml_parse_msu1(xml_element &root) {
|
||||
foreach(attr, leaf.attribute) {
|
||||
if(attr.name == "address") xml_parse_address(m, attr.content);
|
||||
}
|
||||
mapping.add(m);
|
||||
mapping.append(m);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void Cartridge::xml_parse_serial(xml_element &root) {
|
||||
has_serial = true;
|
||||
|
||||
foreach(attr, root.attribute) {
|
||||
if(attr.name == "baud") {
|
||||
serial_baud_rate = strunsigned(attr.content);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void Cartridge::xml_parse_address(Mapping &m, const string &data) {
|
||||
lstring part;
|
||||
part.split(":", data);
|
@@ -1,4 +1,4 @@
|
||||
#include <snes/snes.hpp>
|
||||
#include <snes.hpp>
|
||||
|
||||
#define CHEAT_CPP
|
||||
namespace SNES {
|
||||
@@ -73,7 +73,7 @@ Cheat::Cheat() {
|
||||
|
||||
bool Cheat::decode(const char *s, unsigned &addr, uint8 &data, Type &type) {
|
||||
string t = s;
|
||||
strlower(t);
|
||||
t.lower();
|
||||
|
||||
#define ischr(n) ((n >= '0' && n <= '9') || (n >= 'a' && n <= 'f'))
|
||||
|
||||
@@ -95,7 +95,7 @@ bool Cheat::decode(const char *s, unsigned &addr, uint8 &data, Type &type) {
|
||||
for(unsigned i = 0; i < 8; i++) if(!ischr(t[i])) return false;
|
||||
|
||||
type = Type::GameGenie;
|
||||
strtr(t, "df4709156bc8a23e", "0123456789abcdef");
|
||||
t.transform("df4709156bc8a23e", "0123456789abcdef");
|
||||
unsigned r = strhex((const char*)t);
|
||||
//8421 8421 8421 8421 8421 8421
|
||||
//abcd efgh ijkl mnop qrst uvwx
|
||||
@@ -125,7 +125,7 @@ bool Cheat::encode(string &s, unsigned addr, uint8 data, Type type) {
|
||||
char t[16];
|
||||
|
||||
if(type == Type::ProActionReplay) {
|
||||
s = sprint(strhex<6>(addr), strhex<2>(data));
|
||||
s = string(strhex<6>(addr), strhex<2>(data));
|
||||
return true;
|
||||
} else if(type == Type::GameGenie) {
|
||||
unsigned r = addr;
|
||||
@@ -141,8 +141,8 @@ bool Cheat::encode(string &s, unsigned addr, uint8 data, Type type) {
|
||||
| (!!(r & 0x080000) << 5) | (!!(r & 0x040000) << 4)
|
||||
| (!!(r & 0x020000) << 3) | (!!(r & 0x010000) << 2)
|
||||
| (!!(r & 0x000800) << 1) | (!!(r & 0x000400) << 0);
|
||||
s = sprint(strhex<2>(data), strhex<2>(addr >> 16), "-", strhex<4>(addr & 0xffff));
|
||||
strtr(s, "0123456789abcdef", "df4709156bc8a23e");
|
||||
s = string(strhex<2>(data), strhex<2>(addr >> 16), "-", strhex<4>(addr & 0xffff));
|
||||
s.transform("0123456789abcdef", "df4709156bc8a23e");
|
||||
return true;
|
||||
} else {
|
||||
return false;
|
||||
@@ -180,8 +180,8 @@ bool CheatCode::operator=(string s) {
|
||||
return false;
|
||||
}
|
||||
|
||||
addr.add(addr_);
|
||||
data.add(data_);
|
||||
addr.append(addr_);
|
||||
data.append(data_);
|
||||
}
|
||||
|
||||
return true;
|
8
asnes/chip/bsx/bsx.cpp
Normal file
8
asnes/chip/bsx/bsx.cpp
Normal file
@@ -0,0 +1,8 @@
|
||||
#include <snes.hpp>
|
||||
|
||||
#define BSX_CPP
|
||||
namespace SNES {
|
||||
#include "bsx_base.cpp"
|
||||
#include "bsx_cart.cpp"
|
||||
#include "bsx_flash.cpp"
|
||||
}
|
31
asnes/chip/chip.hpp
Normal file
31
asnes/chip/chip.hpp
Normal file
@@ -0,0 +1,31 @@
|
||||
struct Coprocessor : Processor {
|
||||
alwaysinline void step(unsigned clocks);
|
||||
alwaysinline void synchronize_cpu();
|
||||
};
|
||||
|
||||
#include <chip/supergameboy/supergameboy.hpp>
|
||||
#include <chip/superfx/superfx.hpp>
|
||||
#include <chip/sa1/sa1.hpp>
|
||||
#include <chip/bsx/bsx.hpp>
|
||||
#include <chip/srtc/srtc.hpp>
|
||||
#include <chip/sdd1/sdd1.hpp>
|
||||
#include <chip/spc7110/spc7110.hpp>
|
||||
#include <chip/cx4/cx4.hpp>
|
||||
#include <chip/dsp1/dsp1.hpp>
|
||||
#include <chip/dsp2/dsp2.hpp>
|
||||
#include <chip/dsp3/dsp3.hpp>
|
||||
#include <chip/dsp4/dsp4.hpp>
|
||||
#include <chip/obc1/obc1.hpp>
|
||||
#include <chip/st0010/st0010.hpp>
|
||||
#include <chip/st0011/st0011.hpp>
|
||||
#include <chip/st0018/st0018.hpp>
|
||||
#include <chip/msu1/msu1.hpp>
|
||||
#include <chip/serial/serial.hpp>
|
||||
|
||||
void Coprocessor::step(unsigned clocks) {
|
||||
clock += clocks * (uint64)cpu.frequency;
|
||||
}
|
||||
|
||||
void Coprocessor::synchronize_cpu() {
|
||||
if(clock >= 0 && scheduler.sync != Scheduler::SynchronizeMode::All) co_switch(cpu.thread);
|
||||
}
|
@@ -4,7 +4,7 @@
|
||||
//Used in Rockman X2/X3 (Megaman X2/X3)
|
||||
//Portions (c) anomie, Overload, zsKnight, Nach, byuu
|
||||
|
||||
#include <snes/snes.hpp>
|
||||
#include <snes.hpp>
|
||||
|
||||
#define CX4_CPP
|
||||
namespace SNES {
|
@@ -1,4 +1,4 @@
|
||||
#include <snes/snes.hpp>
|
||||
#include <snes.hpp>
|
||||
|
||||
#define DSP1_CPP
|
||||
namespace SNES {
|
@@ -1,4 +1,4 @@
|
||||
#include <snes/snes.hpp>
|
||||
#include <snes.hpp>
|
||||
|
||||
#define DSP2_CPP
|
||||
namespace SNES {
|
@@ -1,4 +1,4 @@
|
||||
#include <snes/snes.hpp>
|
||||
#include <snes.hpp>
|
||||
|
||||
#define DSP3_CPP
|
||||
namespace SNES {
|
@@ -1,4 +1,4 @@
|
||||
#include <snes/snes.hpp>
|
||||
#include <snes.hpp>
|
||||
|
||||
#define DSP4_CPP
|
||||
namespace SNES {
|
@@ -1,4 +1,4 @@
|
||||
#include <snes/snes.hpp>
|
||||
#include <snes.hpp>
|
||||
|
||||
#define MSU1_CPP
|
||||
namespace SNES {
|
||||
@@ -7,9 +7,9 @@ MSU1 msu1;
|
||||
|
||||
#include "serialization.cpp"
|
||||
|
||||
void MSU1::enter() {
|
||||
scheduler.clock.cop_freq = 44100;
|
||||
void MSU1::Enter() { msu1.enter(); }
|
||||
|
||||
void MSU1::enter() {
|
||||
while(true) {
|
||||
if(scheduler.sync == Scheduler::SynchronizeMode::All) {
|
||||
scheduler.exit(Scheduler::ExitReason::SynchronizeEvent);
|
||||
@@ -36,8 +36,8 @@ void MSU1::enter() {
|
||||
right = sclamp<16>((double)right * (double)mmio.audio_volume / 255.0);
|
||||
|
||||
audio.coprocessor_sample(left, right);
|
||||
scheduler.addclocks_cop(1);
|
||||
scheduler.sync_copcpu();
|
||||
step(1);
|
||||
synchronize_cpu();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -49,7 +49,7 @@ void MSU1::enable() {
|
||||
audio.coprocessor_frequency(44100.0);
|
||||
|
||||
if(datafile.open()) datafile.close();
|
||||
datafile.open(string() << basename << ".msu", file::mode_read);
|
||||
datafile.open(string() << cartridge.basename() << ".msu", file::mode_read);
|
||||
}
|
||||
|
||||
void MSU1::power() {
|
||||
@@ -57,6 +57,8 @@ void MSU1::power() {
|
||||
}
|
||||
|
||||
void MSU1::reset() {
|
||||
create(MSU1::Enter, 44100);
|
||||
|
||||
mmio.data_offset = 0;
|
||||
mmio.audio_offset = 0;
|
||||
mmio.audio_track = 0;
|
||||
@@ -125,7 +127,7 @@ void MSU1::mmio_write(unsigned addr, uint8 data) {
|
||||
if(audiofile.open()) audiofile.close();
|
||||
char track[16];
|
||||
sprintf(track, "-%u", mmio.audio_track);
|
||||
if(audiofile.open(string() << basename << track << ".wav", file::mode_read)) {
|
||||
if(audiofile.open(string() << cartridge.basename() << track << ".wav", file::mode_read)) {
|
||||
audiofile.seek(mmio.audio_offset = 58); //skip WAV header
|
||||
}
|
||||
mmio.audio_busy = false;
|
||||
@@ -143,8 +145,4 @@ void MSU1::mmio_write(unsigned addr, uint8 data) {
|
||||
}
|
||||
}
|
||||
|
||||
void MSU1::base(const string& name) {
|
||||
basename = name;
|
||||
}
|
||||
|
||||
}
|
@@ -1,7 +1,7 @@
|
||||
class MSU1 : public MMIO {
|
||||
class MSU1 : public Coprocessor, public MMIO {
|
||||
public:
|
||||
static void Enter();
|
||||
void enter();
|
||||
|
||||
void init();
|
||||
void enable();
|
||||
void power();
|
||||
@@ -10,11 +10,9 @@ public:
|
||||
uint8 mmio_read(unsigned addr);
|
||||
void mmio_write(unsigned addr, uint8 data);
|
||||
|
||||
void base(const string &name);
|
||||
void serialize(serializer&);
|
||||
|
||||
private:
|
||||
string basename;
|
||||
file datafile;
|
||||
file audiofile;
|
||||
|
@@ -1,6 +1,8 @@
|
||||
#ifdef MSU1_CPP
|
||||
|
||||
void MSU1::serialize(serializer &s) {
|
||||
Processor::serialize(s);
|
||||
|
||||
s.integer(mmio.data_offset);
|
||||
s.integer(mmio.audio_offset);
|
||||
s.integer(mmio.audio_track);
|
||||
@@ -11,14 +13,14 @@ void MSU1::serialize(serializer &s) {
|
||||
s.integer(mmio.audio_play);
|
||||
|
||||
if(datafile.open()) datafile.close();
|
||||
if(datafile.open(string() << basename << ".msun", file::mode_read)) {
|
||||
if(datafile.open(string() << cartridge.basename() << ".msu", file::mode_read)) {
|
||||
datafile.seek(mmio.data_offset);
|
||||
}
|
||||
|
||||
if(audiofile.open()) audiofile.close();
|
||||
char track[16];
|
||||
sprintf(track, "-%u", mmio.audio_track);
|
||||
if(audiofile.open(string() << basename << track << ".wav", file::mode_read)) {
|
||||
if(audiofile.open(string() << cartridge.basename() << track << ".wav", file::mode_read)) {
|
||||
audiofile.seek(mmio.audio_offset);
|
||||
}
|
||||
}
|
@@ -1,4 +1,4 @@
|
||||
#include <snes/snes.hpp>
|
||||
#include <snes.hpp>
|
||||
|
||||
#define OBC1_CPP
|
||||
namespace SNES {
|
@@ -93,12 +93,12 @@ unsigned SA1IRAM::size() const {
|
||||
}
|
||||
|
||||
uint8 SA1IRAM::read(unsigned addr) {
|
||||
scheduler.sync_copcpu();
|
||||
sa1.synchronize_cpu();
|
||||
return memory::iram.read(addr);
|
||||
}
|
||||
|
||||
void SA1IRAM::write(unsigned addr, uint8 data) {
|
||||
scheduler.sync_copcpu();
|
||||
sa1.synchronize_cpu();
|
||||
memory::iram.write(addr, data);
|
||||
}
|
||||
|
||||
@@ -111,12 +111,12 @@ unsigned CPUIRAM::size() const {
|
||||
}
|
||||
|
||||
uint8 CPUIRAM::read(unsigned addr) {
|
||||
scheduler.sync_cpucop();
|
||||
cpu.synchronize_coprocessor();
|
||||
return memory::iram.read(addr);
|
||||
}
|
||||
|
||||
void CPUIRAM::write(unsigned addr, uint8 data) {
|
||||
scheduler.sync_cpucop();
|
||||
cpu.synchronize_coprocessor();
|
||||
memory::iram.write(addr, data);
|
||||
}
|
||||
|
||||
@@ -129,12 +129,12 @@ unsigned SA1BWRAM::size() const {
|
||||
}
|
||||
|
||||
uint8 SA1BWRAM::read(unsigned addr) {
|
||||
scheduler.sync_copcpu();
|
||||
sa1.synchronize_cpu();
|
||||
return memory::cartram.read(addr);
|
||||
}
|
||||
|
||||
void SA1BWRAM::write(unsigned addr, uint8 data) {
|
||||
scheduler.sync_copcpu();
|
||||
sa1.synchronize_cpu();
|
||||
memory::cartram.write(addr, data);
|
||||
}
|
||||
|
||||
@@ -147,13 +147,13 @@ unsigned CC1BWRAM::size() const {
|
||||
}
|
||||
|
||||
uint8 CC1BWRAM::read(unsigned addr) {
|
||||
scheduler.sync_cpucop();
|
||||
cpu.synchronize_coprocessor();
|
||||
if(dma) return sa1.dma_cc1_read(addr);
|
||||
return memory::cartram.read(addr);
|
||||
}
|
||||
|
||||
void CC1BWRAM::write(unsigned addr, uint8 data) {
|
||||
scheduler.sync_cpucop();
|
||||
cpu.synchronize_coprocessor();
|
||||
memory::cartram.write(addr, data);
|
||||
}
|
||||
|
||||
@@ -166,7 +166,7 @@ unsigned BitmapRAM::size() const {
|
||||
}
|
||||
|
||||
uint8 BitmapRAM::read(unsigned addr) {
|
||||
scheduler.sync_copcpu();
|
||||
sa1.synchronize_cpu();
|
||||
|
||||
if(sa1.mmio.bbf == 0) {
|
||||
//4bpp
|
||||
@@ -190,7 +190,7 @@ uint8 BitmapRAM::read(unsigned addr) {
|
||||
}
|
||||
|
||||
void BitmapRAM::write(unsigned addr, uint8 data) {
|
||||
scheduler.sync_copcpu();
|
||||
sa1.synchronize_cpu();
|
||||
|
||||
if(sa1.mmio.bbf == 0) {
|
||||
//4bpp
|
@@ -521,7 +521,7 @@ uint8 SA1::mmio_r230e() {
|
||||
}
|
||||
|
||||
uint8 SA1::mmio_read(unsigned addr) {
|
||||
(co_active() == scheduler.thread_cpu ? scheduler.sync_cpucop() : scheduler.sync_copcpu());
|
||||
(co_active() == cpu.thread ? cpu.synchronize_coprocessor() : synchronize_cpu());
|
||||
addr &= 0xffff;
|
||||
|
||||
switch(addr) {
|
||||
@@ -546,7 +546,7 @@ uint8 SA1::mmio_read(unsigned addr) {
|
||||
}
|
||||
|
||||
void SA1::mmio_write(unsigned addr, uint8 data) {
|
||||
(co_active() == scheduler.thread_cpu ? scheduler.sync_cpucop() : scheduler.sync_copcpu());
|
||||
(co_active() == cpu.thread ? cpu.synchronize_coprocessor() : synchronize_cpu());
|
||||
addr &= 0xffff;
|
||||
|
||||
switch(addr) {
|
@@ -1,4 +1,4 @@
|
||||
#include <snes/snes.hpp>
|
||||
#include <snes.hpp>
|
||||
|
||||
#define SA1_CPP
|
||||
namespace SNES {
|
||||
@@ -11,6 +11,8 @@ SA1 sa1;
|
||||
#include "memory/memory.cpp"
|
||||
#include "mmio/mmio.cpp"
|
||||
|
||||
void SA1::Enter() { sa1.enter(); }
|
||||
|
||||
void SA1::enter() {
|
||||
while(true) {
|
||||
if(scheduler.sync == Scheduler::SynchronizeMode::All) {
|
||||
@@ -20,7 +22,7 @@ void SA1::enter() {
|
||||
if(mmio.sa1_rdyb || mmio.sa1_resb) {
|
||||
//SA-1 co-processor is asleep
|
||||
tick();
|
||||
scheduler.sync_copcpu();
|
||||
synchronize_cpu();
|
||||
continue;
|
||||
}
|
||||
|
||||
@@ -61,8 +63,8 @@ void SA1::last_cycle() {
|
||||
}
|
||||
|
||||
void SA1::interrupt(uint16 vector) {
|
||||
op_read(regs.pc.d);
|
||||
op_io();
|
||||
SA1::op_read(regs.pc.d);
|
||||
SA1::op_io();
|
||||
if(!regs.e) op_writestack(regs.pc.b);
|
||||
op_writestack(regs.pc.h);
|
||||
op_writestack(regs.pc.l);
|
||||
@@ -78,8 +80,8 @@ bool SA1::interrupt_pending() {
|
||||
}
|
||||
|
||||
void SA1::tick() {
|
||||
scheduler.addclocks_cop(2);
|
||||
if(++status.tick_counter == 0) scheduler.sync_copcpu();
|
||||
step(2);
|
||||
if(++status.tick_counter == 0) synchronize_cpu();
|
||||
|
||||
//adjust counters:
|
||||
//note that internally, status counters are in clocks;
|
||||
@@ -122,17 +124,18 @@ void SA1::enable() {
|
||||
void SA1::power() {
|
||||
regs.a = regs.x = regs.y = 0x0000;
|
||||
regs.s = 0x01ff;
|
||||
|
||||
vbrbus.init();
|
||||
sa1bus.init();
|
||||
reset();
|
||||
}
|
||||
|
||||
void SA1::reset() {
|
||||
create(SA1::Enter, system.cpu_frequency());
|
||||
|
||||
memory::cc1bwram.dma = false;
|
||||
for(unsigned addr = 0; addr < memory::iram.size(); addr++) {
|
||||
memory::iram.write(addr, 0x00);
|
||||
}
|
||||
vbrbus.init();
|
||||
sa1bus.init();
|
||||
|
||||
regs.pc.d = 0x000000;
|
||||
regs.x.h = 0x00;
|
@@ -1,6 +1,6 @@
|
||||
#include "bus/bus.hpp"
|
||||
|
||||
class SA1 : public CPUcore, public MMIO {
|
||||
class SA1 : public Coprocessor, public CPUcore, public MMIO {
|
||||
public:
|
||||
#include "dma/dma.hpp"
|
||||
#include "memory/memory.hpp"
|
||||
@@ -17,6 +17,7 @@ public:
|
||||
uint16 hcounter;
|
||||
} status;
|
||||
|
||||
static void Enter();
|
||||
void enter();
|
||||
void interrupt(uint16 vector);
|
||||
void tick();
|
@@ -1,6 +1,7 @@
|
||||
#ifdef SA1_CPP
|
||||
|
||||
void SA1::serialize(serializer &s) {
|
||||
Processor::serialize(s);
|
||||
CPUcore::core_serialize(s);
|
||||
|
||||
//sa1.hpp
|
@@ -1,4 +1,4 @@
|
||||
#include <snes/snes.hpp>
|
||||
#include <snes.hpp>
|
||||
|
||||
#define SDD1_CPP
|
||||
namespace SNES {
|
97
asnes/chip/serial/serial.cpp
Normal file
97
asnes/chip/serial/serial.cpp
Normal file
@@ -0,0 +1,97 @@
|
||||
#include <snes.hpp>
|
||||
|
||||
#define SERIAL_CPP
|
||||
namespace SNES {
|
||||
|
||||
Serial serial;
|
||||
|
||||
#include "serialization.cpp"
|
||||
|
||||
static void snesserial_tick(unsigned clocks) { serial.add_clocks(clocks * 8); }
|
||||
static uint8 snesserial_read() { return serial.read(); }
|
||||
static void snesserial_write(uint8 data) { serial.write(data); }
|
||||
|
||||
void Serial::Enter() { serial.enter(); }
|
||||
|
||||
void Serial::enter() {
|
||||
latch = 0;
|
||||
add_clocks(256 * 8); //warm-up
|
||||
if(snesserial_main) snesserial_main(snesserial_tick, snesserial_read, snesserial_write);
|
||||
while(true) add_clocks(frequency); //snesserial_main() fallback
|
||||
}
|
||||
|
||||
void Serial::add_clocks(unsigned clocks) {
|
||||
step(clocks);
|
||||
synchronize_cpu();
|
||||
}
|
||||
|
||||
uint8 Serial::read() {
|
||||
while(cpu.joylatch() == 0) add_clocks(1);
|
||||
while(cpu.joylatch() == 1) add_clocks(1);
|
||||
add_clocks(4);
|
||||
|
||||
uint8 data = 0;
|
||||
for(unsigned i = 0; i < 8; i++) {
|
||||
add_clocks(8);
|
||||
data = (cpu.joylatch() << 7) | (data >> 1);
|
||||
}
|
||||
|
||||
return data;
|
||||
}
|
||||
|
||||
void Serial::write(uint8 data) {
|
||||
latch = 1;
|
||||
add_clocks(8);
|
||||
|
||||
for(unsigned i = 0; i < 8; i++) {
|
||||
latch = (data & 1) ^ 1;
|
||||
data >>= 1;
|
||||
add_clocks(8);
|
||||
}
|
||||
|
||||
latch = 0;
|
||||
add_clocks(8);
|
||||
}
|
||||
|
||||
uint8 Serial::mmio_read(unsigned addr) {
|
||||
cpu.synchronize_coprocessor();
|
||||
switch(addr & 1) { default:
|
||||
case 0: return r4016->mmio_read(addr);
|
||||
case 1: return r4017->mmio_read(addr);
|
||||
}
|
||||
}
|
||||
|
||||
void Serial::mmio_write(unsigned addr, uint8 data) {
|
||||
cpu.synchronize_coprocessor();
|
||||
switch(addr & 1) { default:
|
||||
case 0: r4016->mmio_write(addr, data); break;
|
||||
case 1: r4017->mmio_write(addr, data); break;
|
||||
}
|
||||
}
|
||||
|
||||
void Serial::init() {
|
||||
}
|
||||
|
||||
void Serial::enable() {
|
||||
r4016 = memory::mmio.mmio[0x4016 - 0x2000];
|
||||
r4017 = memory::mmio.mmio[0x4017 - 0x2000];
|
||||
memory::mmio.mmio[0x4016 - 0x2000] = this;
|
||||
memory::mmio.mmio[0x4017 - 0x2000] = this;
|
||||
|
||||
if(opened()) close();
|
||||
string name = notdir(cartridge.basename());
|
||||
string path = dir(cartridge.basename());
|
||||
if(open(name, path)) {
|
||||
snesserial_main = sym("snesserial_main");
|
||||
}
|
||||
}
|
||||
|
||||
void Serial::power() {
|
||||
reset();
|
||||
}
|
||||
|
||||
void Serial::reset() {
|
||||
create(Serial::Enter, cartridge.serial_baud_rate() * 8);
|
||||
}
|
||||
|
||||
}
|
25
asnes/chip/serial/serial.hpp
Normal file
25
asnes/chip/serial/serial.hpp
Normal file
@@ -0,0 +1,25 @@
|
||||
class Serial : public Coprocessor, public MMIO, public library, public property<Serial> {
|
||||
public:
|
||||
static void Enter();
|
||||
void enter();
|
||||
void init();
|
||||
void enable();
|
||||
void power();
|
||||
void reset();
|
||||
void serialize(serializer&);
|
||||
|
||||
readonly<bool> latch;
|
||||
|
||||
void add_clocks(unsigned clocks);
|
||||
uint8 read();
|
||||
void write(uint8 data);
|
||||
|
||||
uint8 mmio_read(unsigned addr);
|
||||
void mmio_write(unsigned addr, uint8 data);
|
||||
|
||||
private:
|
||||
MMIO *r4016, *r4017;
|
||||
function<void (void (*)(unsigned), uint8_t (*)(), void (*)(uint8_t))> snesserial_main;
|
||||
};
|
||||
|
||||
extern Serial serial;
|
8
asnes/chip/serial/serialization.cpp
Normal file
8
asnes/chip/serial/serialization.cpp
Normal file
@@ -0,0 +1,8 @@
|
||||
#ifdef SERIAL_CPP
|
||||
|
||||
void Serial::serialize(serializer &s) {
|
||||
Processor::serialize(s);
|
||||
s.integer((bool&)latch);
|
||||
}
|
||||
|
||||
#endif
|
@@ -1,4 +1,4 @@
|
||||
#include <snes/snes.hpp>
|
||||
#include <snes.hpp>
|
||||
|
||||
#define SPC7110_CPP
|
||||
namespace SNES {
|
@@ -1,4 +1,4 @@
|
||||
#include <snes/snes.hpp>
|
||||
#include <snes.hpp>
|
||||
|
||||
#define SRTC_CPP
|
||||
namespace SNES {
|
@@ -1,4 +1,4 @@
|
||||
#include <snes/snes.hpp>
|
||||
#include <snes.hpp>
|
||||
|
||||
#define ST0010_CPP
|
||||
namespace SNES {
|
@@ -1,4 +1,4 @@
|
||||
#include <snes/snes.hpp>
|
||||
#include <snes.hpp>
|
||||
|
||||
#define ST0011_CPP
|
||||
namespace SNES {
|
@@ -1,4 +1,4 @@
|
||||
#include <snes/snes.hpp>
|
||||
#include <snes.hpp>
|
||||
|
||||
#define ST0018_CPP
|
||||
namespace SNES {
|
@@ -27,7 +27,7 @@ unsigned SuperFXGSUROM::size() const {
|
||||
uint8 SuperFXGSUROM::read(unsigned addr) {
|
||||
while(!superfx.regs.scmr.ron && scheduler.sync != Scheduler::SynchronizeMode::All) {
|
||||
superfx.add_clocks(6);
|
||||
scheduler.sync_copcpu();
|
||||
superfx.synchronize_cpu();
|
||||
}
|
||||
return memory::cartrom.read(addr);
|
||||
}
|
||||
@@ -35,7 +35,7 @@ uint8 SuperFXGSUROM::read(unsigned addr) {
|
||||
void SuperFXGSUROM::write(unsigned addr, uint8 data) {
|
||||
while(!superfx.regs.scmr.ron && scheduler.sync != Scheduler::SynchronizeMode::All) {
|
||||
superfx.add_clocks(6);
|
||||
scheduler.sync_copcpu();
|
||||
superfx.synchronize_cpu();
|
||||
}
|
||||
memory::cartrom.write(addr, data);
|
||||
}
|
||||
@@ -47,7 +47,7 @@ unsigned SuperFXGSURAM::size() const {
|
||||
uint8 SuperFXGSURAM::read(unsigned addr) {
|
||||
while(!superfx.regs.scmr.ran && scheduler.sync != Scheduler::SynchronizeMode::All) {
|
||||
superfx.add_clocks(6);
|
||||
scheduler.sync_copcpu();
|
||||
superfx.synchronize_cpu();
|
||||
}
|
||||
return memory::cartram.read(addr);
|
||||
}
|
||||
@@ -55,7 +55,7 @@ uint8 SuperFXGSURAM::read(unsigned addr) {
|
||||
void SuperFXGSURAM::write(unsigned addr, uint8 data) {
|
||||
while(!superfx.regs.scmr.ran && scheduler.sync != Scheduler::SynchronizeMode::All) {
|
||||
superfx.add_clocks(6);
|
||||
scheduler.sync_copcpu();
|
||||
superfx.synchronize_cpu();
|
||||
}
|
||||
memory::cartram.write(addr, data);
|
||||
}
|
@@ -1,7 +1,7 @@
|
||||
#ifdef SUPERFX_CPP
|
||||
|
||||
uint8 SuperFX::mmio_read(unsigned addr) {
|
||||
scheduler.sync_cpucop();
|
||||
cpu.synchronize_coprocessor();
|
||||
addr &= 0xffff;
|
||||
|
||||
if(addr >= 0x3100 && addr <= 0x32ff) {
|
||||
@@ -53,7 +53,7 @@ uint8 SuperFX::mmio_read(unsigned addr) {
|
||||
}
|
||||
|
||||
void SuperFX::mmio_write(unsigned addr, uint8 data) {
|
||||
scheduler.sync_cpucop();
|
||||
cpu.synchronize_coprocessor();
|
||||
addr &= 0xffff;
|
||||
|
||||
if(addr >= 0x3100 && addr <= 0x32ff) {
|
@@ -1,6 +1,8 @@
|
||||
#ifdef SUPERFX_CPP
|
||||
|
||||
void SuperFX::serialize(serializer &s) {
|
||||
Processor::serialize(s);
|
||||
|
||||
//superfx.hpp
|
||||
s.integer(clockmode);
|
||||
s.integer(instruction_counter);
|
@@ -1,4 +1,4 @@
|
||||
#include <snes/snes.hpp>
|
||||
#include <snes.hpp>
|
||||
|
||||
#define SUPERFX_CPP
|
||||
namespace SNES {
|
||||
@@ -13,6 +13,8 @@ namespace SNES {
|
||||
|
||||
SuperFX superfx;
|
||||
|
||||
void SuperFX::Enter() { superfx.enter(); }
|
||||
|
||||
void SuperFX::enter() {
|
||||
while(true) {
|
||||
if(scheduler.sync == Scheduler::SynchronizeMode::All) {
|
||||
@@ -21,7 +23,7 @@ void SuperFX::enter() {
|
||||
|
||||
if(regs.sfr.g == 0) {
|
||||
add_clocks(6);
|
||||
scheduler.sync_copcpu();
|
||||
synchronize_cpu();
|
||||
continue;
|
||||
}
|
||||
|
||||
@@ -30,7 +32,7 @@ void SuperFX::enter() {
|
||||
|
||||
if(++instruction_counter >= 128) {
|
||||
instruction_counter = 0;
|
||||
scheduler.sync_copcpu();
|
||||
synchronize_cpu();
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -50,6 +52,7 @@ void SuperFX::power() {
|
||||
}
|
||||
|
||||
void SuperFX::reset() {
|
||||
create(SuperFX::Enter, system.cpu_frequency());
|
||||
superfxbus.init();
|
||||
instruction_counter = 0;
|
||||
|
@@ -1,6 +1,6 @@
|
||||
#include "bus/bus.hpp"
|
||||
|
||||
class SuperFX : public MMIO {
|
||||
class SuperFX : public Coprocessor, public MMIO {
|
||||
public:
|
||||
#include "core/core.hpp"
|
||||
#include "memory/memory.hpp"
|
||||
@@ -8,13 +8,12 @@ public:
|
||||
#include "timing/timing.hpp"
|
||||
#include "disasm/disasm.hpp"
|
||||
|
||||
static void Enter();
|
||||
void enter();
|
||||
|
||||
void init();
|
||||
void enable();
|
||||
void power();
|
||||
void reset();
|
||||
|
||||
void serialize(serializer&);
|
||||
|
||||
private:
|
@@ -16,8 +16,8 @@ void SuperFX::add_clocks(unsigned clocks) {
|
||||
}
|
||||
}
|
||||
|
||||
scheduler.addclocks_cop(clocks);
|
||||
scheduler.sync_copcpu();
|
||||
step(clocks);
|
||||
synchronize_cpu();
|
||||
}
|
||||
|
||||
void SuperFX::rombuffer_sync() {
|
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user