set(VMFILES_BASE
mc6800.cpp
- datarec.cpp
event.cpp
)
set(VMFILES_LIB
- mc6820.cpp
+ datarec.cpp
+ mc6820.cpp
)
set(USE_OPENMP ON CACHE BOOL "Build using OpenMP")
mc6809.cpp
)
set(MCS48_CPPS
- libcpu_newdev/mcs48.cpp
+ mcs48.cpp
)
set(IX86_CPPS
libcpu_newdev/i86.cpp
else()
set(I386_CPPS i386.cpp)
set(MC6809_CPPS mc6809_base.cpp mc6809.cpp)
- set(MCS48_CPPS mcs48.cpp)
+ set(MCS48_CPPS mcs48_base.cpp mcs48.cpp)
set(IX86_CPPS i86.cpp)
set(Z80_CPPS z80_base.cpp z80.cpp)
set(VMFILES ${VMFILES} ${VMFILES_LIB})
set(WITH_JOYSTICK ON)
set(VMFILES
- datarec.cpp
event.cpp
io.cpp
)
set(VMFILES_LIB
+ datarec.cpp
ym2203.cpp
pcm1bit.cpp
disk.cpp
set(EXEC_TARGET emugamegear)
add_definitions(-D_GAMEGEAR)
set(VMFILES ${VMFILES}
- datarec.cpp
)
set(VMFILES_LIB ${VMFILES_LIB}
- sn76489an.cpp
315-5124.cpp
+ datarec.cpp
+ sn76489an.cpp
upd765a.cpp
disk.cpp
)
z80ctc.cpp
- datarec.cpp
io.cpp
event.cpp
)
set(VMFILES_LIB
- ls393.cpp
- not.cpp
- z80pio.cpp
- pcm1bit.cpp
- upd765a.cpp
- disk.cpp
- hd46505.cpp
+ datarec.cpp
+ ls393.cpp
+ not.cpp
+ z80pio.cpp
+ pcm1bit.cpp
+ upd765a.cpp
+ disk.cpp
+ hd46505.cpp
)
if(NOT BUILD_PASOPIA)
message("")
set(VMFILES_BASE
- datarec.cpp
event.cpp
io.cpp
memory.cpp
)
set(VMFILES_LIB
+ datarec.cpp
ay_3_891x.cpp
i8255.cpp
not.cpp
)
set(VMFILES_BASE
- datarec.cpp
mz1p17.cpp
event.cpp
)
set(VMFILES_LIB
+ datarec.cpp
i8253.cpp
i8255.cpp
set(FLAG_USE_Z80 ON)
set(VMFILES_BASE
- datarec.cpp
-
event.cpp
io.cpp
memory.cpp
)
set(VMFILES_LIB
+ datarec.cpp
i8255.cpp
i8253.cpp
set(VMFILES_BASE
i8253.cpp
i8255.cpp
- datarec.cpp
prnfile.cpp
mz1p17.cpp
event.cpp
set(VMFILES_LIB
beep.cpp
+ datarec.cpp
ls393.cpp
pcm1bit.cpp
)
event.cpp
io.cpp
memory.cpp
- datarec.cpp
)
set(VMFILES_LIB
+ datarec.cpp
pc6031.cpp
pc80s31k.cpp
upd765a.cpp
- disk.cpp
ym2203.cpp
prnfile.cpp
+ disk.cpp
)
set(FLAG_USE_MCS48 ON)
set(FLAG_USE_Z80 ON)
i8080.cpp
io.cpp
- datarec.cpp
event.cpp
)
set(VMFILES_LIB
+ datarec.cpp
i8155.cpp
pcm1bit.cpp
upd1990a.cpp
set(VMFILES
z80ctc.cpp
- datarec.cpp
event.cpp
io.cpp
memory.cpp
)
set(VMFILES_LIB
beep.cpp
+ datarec.cpp
i8251.cpp
i8255.cpp
set(FLAG_USE_Z80 ON)
set(VMFILES
- mc6847.cpp
- ym2203.cpp
-
- datarec.cpp
io.cpp
event.cpp
)
set(VMFILES_LIB
+ datarec.cpp
+ mc6847.cpp
not.cpp
+ ym2203.cpp
)
set(BUILD_SHARED_LIBS OFF)
set(VMFILES_BASE
msm58321.cpp
- datarec.cpp
event.cpp
)
set(VMFILES_LIB
+ datarec.cpp
hd46505.cpp
- pcm1bit.cpp
mb8877.cpp
+ msm58321_base.cpp
+ pcm1bit.cpp
disk.cpp
)
add_definitions(-D_SMC70)
set(EXEC_TARGET emusmc777)
set(VMFILES_BASE
- hd46505.cpp
- datarec.cpp
event.cpp
)
set(VMFILES_LIB
+ datarec.cpp
hd46505.cpp
sn76489an.cpp
pcmibit.cpp
add_definitions(-D_TK80BS)
set(EXEC_TARGET emutk80bs)
set(VM_NAME tk80bs)
- set(VMFILES_LIB ${VMFILES_LIB} i8251.cpp)
- set(VMFILES_BASE ${VMFILES_BASE} datarec.cpp io.cpp)
+ set(VMFILES_LIB ${VMFILES_LIB} datarec.cpp i8251.cpp)
+ set(VMFILES_BASE ${VMFILES_BASE} io.cpp)
set(RESOURCE ${CMAKE_SOURCE_DIR}/../../src/qt/common/qrc/tk80bs.qrc)
elseif(BUILD_TK80)
add_definitions(-D_TK80)
add_definitions(-D_TK85)
set(EXEC_TARGET emutk85)
set(VM_NAME tk80bs)
- set(VMFILES_LIB ${VMFILES_LIB} )
- set(VMFILES_BASE ${VMFILES_BASE} datarec.cpp io.cpp)
+ set(VMFILES_LIB ${VMFILES_LIB} datarec.cpp )
+ set(VMFILES_BASE ${VMFILES_BASE} io.cpp)
set(RESOURCE ${CMAKE_SOURCE_DIR}/../../src/qt/common/qrc/tk85.qrc)
endif()
set(VMFILES
z80ctc.cpp
- datarec.cpp
event.cpp
io.cpp
set(VMFILES_LIB
ay_3_891x.cpp
beep.cpp
- i8255.cpp
+ datarec.cpp
hd46505.cpp
+ i8255.cpp
mb8877.cpp
upd1990a.cpp
ym2151.cpp
set(VMFILES
# i286.cpp
msm58321.cpp
-# datarec.cpp
event.cpp
io.cpp
memory.cpp
)
set(VMFILES_LIB
+# datarec.cpp
i8253.cpp
i8255.cpp
i8259.cpp
set(FLAG_USE_Z80 ON)
set(VMFILES
- upd7801.cpp
-# hd46505.cpp
-# upd765a.cpp
-# ym2203.cpp
-# disk.cpp
- datarec.cpp
-
- event.cpp
- io.cpp
- memory.cpp
+ event.cpp
+ io.cpp
+ memory.cpp
)
set(VMFILES_LIB
+ datarec.cpp
+ upd7801.cpp
upd765a.cpp
# pcm1bit.cpp
ym2203.cpp
set(VMFILES
i8080.cpp
- datarec.cpp
memory.cpp
event.cpp
)
set(VMFILES_LIB
+ datarec.cpp
i8080_base.cpp
rp5c01.cpp
)
set(VMFILES_BASE
mc6800.cpp
- datarec.cpp
+
event.cpp
io.cpp
memory.cpp
)
set(VMFILES_LIB
beep.cpp
+ datarec.cpp
i8255.cpp
hd146818p.cpp
set(FLAG_USE_Z80 ON)
set(VMFILES_BASE
- datarec.cpp
event.cpp
)
set(VMFILES_LIB
beep.cpp
+ datarec.cpp
ptf20.cpp
disk.cpp
set(WITH_MOUSE OFF)
set(VMFILES_BASE
- mc6800.cpp
+ mc6800.cpp
+ sy6522.cpp
- sy6522.cpp
- datarec.cpp
-
- event.cpp
+ event.cpp
)
set(VMFILES_LIB
- pcm1bit.cpp
- not.cpp
+ datarec.cpp
+ not.cpp
+ pcm1bit.cpp
)
set(USE_OPENMP ON CACHE BOOL "Build using OpenMP")
set(WITH_MOUSE OFF)
set(VMFILES_BASE
- mc6800.cpp
-
- memory.cpp
- datarec.cpp
-
- event.cpp
+ mc6800.cpp
+ memory.cpp
+ event.cpp
)
set(VMFILES_LIB
- hd44102.cpp
- pcm1bit.cpp
+ datarec.cpp
+ hd44102.cpp
+ pcm1bit.cpp
)
set(USE_OPENMP ON CACHE BOOL "Build using OpenMP")
z80ctc.cpp
memory.cpp
- datarec.cpp
io.cpp
event.cpp
)
set(VMFILES_LIB
+ datarec.cpp
sn76489an.cpp
tms9918a.cpp
)
set(FLAG_USE_Z80 ON)
set(VMFILES_BASE
io.cpp
- datarec.cpp
event.cpp
)
set(VMFILES_LIB
+ datarec.cpp
hd46505.cpp
i8251.cpp
i8253.cpp
set(USE_FMGEN OFF)
set(FLAG_USE_Z80 ON)
set(VMFILES
+ msm5832.cpp
+ datarec.cpp
- i8255.cpp
- msm5832.cpp
- datarec.cpp
-
- event.cpp
- io.cpp
+ event.cpp
+ io.cpp
)
set(VMFILES_LIB
- hd46505.cpp
- sn76489an.cpp
+ datarec.cpp
+ hd46505.cpp
+ i8255.cpp
+ msm58321_base.cpp
+ sn76489an.cpp
)
set(BUILD_MYCOMZ80A ON CACHE BOOL "Build EMU-MYCOMZ80A")
set(WITH_DEBUGGER ON)
set(VMFILES
-# upd16434.cpp
upd7810.cpp
- datarec.cpp
memory.cpp
event.cpp
)
set(VMFILES_LIB
+ datarec.cpp
+ pcm1bit.cpp
upd16434.cpp
upd1990a.cpp
- pcm1bit.cpp
)
set(BUILD_SHARED_LIBS OFF)
set(USE_OPENMP ON CACHE BOOL "Build using OpenMP")
set(USE_FMGEN OFF)
set(FLAG_USE_Z80 ON)
set(VMFILES
-
- mc6847.cpp
-
- datarec.cpp
event.cpp
)
set(VMFILES_LIB
+ mc6847.cpp
+ datarec.cpp
)
set(BUILD_SHARED_LIBS OFF)
set(USE_OPENMP ON CACHE BOOL "Build using OpenMP")
set(VMFILES_BASE
tms9995.cpp
- datarec.cpp
event.cpp
memory.cpp
)
set(VMFILES_LIB
+ datarec.cpp
sn76489an.cpp
tms9918a.cpp
)
set(FLAG_USE_Z80 ON)
set(VMFILES
- datarec.cpp
-
io.cpp
event.cpp
)
set(VMFILES_LIB
+ datarec.cpp
sn76489an.cpp
)
set(FLAG_USE_Z80 ON)
set(VMFILES
- i8255.cpp
- datarec.cpp
io.cpp
event.cpp
)
set(VMFILES_LIB
+ datarec.cpp
i8251.cpp
+ i8255.cpp
sn76489an.cpp
tms9918a.cpp
upd765a.cpp
set(WITH_MOUSE OFF)
set(VMFILES
- upd7801.cpp
-
event.cpp
)
+set(VMFILES_LIB
+ upd7801.cpp
+)
set(BUILD_SHARED_LIBS OFF)
set(USE_OPENMP ON CACHE BOOL "Build using OpenMP")
set(FLAG_USE_Z80 ON)
set(VMFILES_BASE
io.cpp
- datarec.cpp
event.cpp
)
set(VMFILES_LIB
- z80pio.cpp
+ datarec.cpp
not.cpp
+ z80pio.cpp
)
set(USE_OPENMP ON CACHE BOOL "Build using OpenMP")
set(VMFILES_BASE
i8080.cpp
- datarec.cpp
memory.cpp
event.cpp
)
set(VMFILES_LIB
+ datarec.cpp
i8080_base.cpp
i8155.cpp
not.cpp
add_feature(_T("SUPPORT_AY_3_891X_PORT_B"), 1);
#endif
#ifdef DATAREC_FAST_FWD_SPEED
- add_feature(_T("DATAREC_FAST_FWD_SPEED"), (int)DATAREC_FAST_FWD_SPEED);
+ add_feature(_T("DATAREC_FAST_FWD_SPEED"), (double)DATAREC_FAST_FWD_SPEED);
#endif
#ifdef DATAREC_FAST_REW_SPEED
- add_feature(_T("DATAREC_FAST_REW_SPEED"), (int)DATAREC_FAST_REW_SPEED);
+ add_feature(_T("DATAREC_FAST_REW_SPEED"), (double)DATAREC_FAST_REW_SPEED);
#endif
#ifdef DATAREC_PCM_VOLUME
add_feature(_T("DATAREC_PCM_VOLUME"), (int)DATAREC_PCM_VOLUME);
#ifdef DATAREC_SOUND_LEFT
add_feature(_T("DATAREC_SOUND_LEFT"), 1);
#endif
+#ifdef DATAREC_SOUND_RIGHT
+ add_feature(_T("DATAREC_SOUND_RIGHT"), 1);
+#endif
}
void OSD::set_features(void)
../and.cpp
../ay_3_891x.cpp
../beep.cpp
-# ../datarec.cpp
+ ../datarec.cpp
../disk.cpp
../hd146818p.cpp
../mc6844.cpp
../mc6847_base.cpp
../mc6850.cpp
-# ../mcs48.cpp
+ ../mcs48_base.cpp
../msm5205.cpp
../msm58321_base.cpp
# ../mz1p17.cpp
../upd7220_base.cpp
../upd765a.cpp
../upd7752.cpp
-# ../upd7801.cpp
-# ../upd7810.cpp
+ ../upd7801.cpp
+# 20170527 UPD7180 will not add to lbCSP_common_vm.
+## ../upd7810.cpp
# 20170518/MSX: Use v9938.cpp and define "-D_MSX_VDP_MESS" instead of v99x8.cpp .
../v9938.cpp
## ../v99x8.cpp
../z80pio.cpp
../z80sio.cpp
-
- ../libcpu_newdev/mcs48_base.cpp
../libcpu_newdev/i86_base.cpp
../libcpu_newdev/libcpu_i386/i386_opdef.cpp
${s_vm_common_vm_srcs}
)
set_target_properties(CSPcommon_vm PROPERTIES
- SOVERSION 1.1.9
- VERSION 1.1.9
+ SOVERSION 1.1.10
+ VERSION 1.1.10
)
INSTALL(TARGETS CSPcommon_vm DESTINATION ${LIBCSP_INSTALL_DIR})
endif()
*/
#include "datarec.h"
-#include "event.h"
+//#include "event.h"
#include "noise.h"
#define EVENT_SIGNAL 0
#define EVENT_SOUND 1
-#ifndef DATAREC_FAST_FWD_SPEED
-#define DATAREC_FAST_FWD_SPEED 10
-#endif
-#ifndef DATAREC_FAST_REW_SPEED
-#define DATAREC_FAST_REW_SPEED 10
-#endif
+//#ifndef DATAREC_FAST_FWD_SPEED
+//#define DATAREC_FAST_FWD_SPEED 10
+//#endif
+//#ifndef DATAREC_FAST_REW_SPEED
+//#define DATAREC_FAST_REW_SPEED 10
+//#endif
void DATAREC::initialize()
{
DEVICE::initialize();
+ __DATAREC_SOUND = osd->check_feature(_T("DATAREC_SOUND"));
+ if(osd->check_feature(_T("DATAREC_PCM_VOLUME"))) {
+ pcm_max_vol = (int)osd->get_feature_int_value(_T("DATAREC_PCM_VOLUME"));
+ }
+ __DATAREC_SOUND_LEFT = osd->check_feature(_T("DATAREC_SOUND_LEFT"));
+ __DATAREC_SOUND_RIGHT = osd->check_feature(_T("DATAREC_SOUND_RIGHT"));
+
+ __DATAREC_FAST_FWD_SPEED = 10.0;
+ if(osd->check_feature(_T("DATAREC_FAST_FWD_SPEED"))) {
+ __DATAREC_FAST_FWD_SPEED = osd->get_feature_double_value(_T("DATAREC_FAST_FWD_SPEED"));
+ }
+ __DATAREC_FAST_REW_SPEED = 10.0;
+ if(osd->check_feature(_T("DATAREC_FAST_REW_SPEED"))) {
+ __DATAREC_FAST_REW_SPEED = osd->get_feature_double_value(_T("DATAREC_FAST_REW_SPEED"));
+ }
+ __TYPE_MZ80B = false;
+ if(osd->check_feature(_T("_MZ80B"))) __TYPE_MZ80B = true;
+ if(osd->check_feature(_T("_MZ2000"))) __TYPE_MZ80B = true;
+ if(osd->check_feature(_T("_MZ2200"))) __TYPE_MZ80B = true;
play_fio = new FILEIO();
rec_fio = new FILEIO();
realtime = false;
buffer = buffer_bak = NULL;
-#ifdef DATAREC_SOUND
+//#ifdef DATAREC_SOUND
sound_buffer = NULL;
-#endif
+//#endif
apss_buffer = NULL;
buffer_ptr = buffer_length = 0;
is_wav = is_tap = is_t77 = false;
pcm_changed = 0;
pcm_last_vol_l = pcm_last_vol_r = 0;
-#ifdef DATAREC_SOUND
+//#ifdef DATAREC_SOUND
sound_last_vol_l = sound_last_vol_r = 0;
-#endif
+//#endif
// initialize noise
if(d_noise_play != NULL) {
if(pcm_changed) {
pcm_changed--;
}
-#ifdef DATAREC_SOUND
- if(remote && (play || rec) && ff_rew == 0 && signal_changed > 10 && !config.sound_play_tape && sound_sample == 0) {
-#else
- if(remote && (play || rec) && ff_rew == 0 && signal_changed > 10 && !config.sound_play_tape) {
-#endif
- request_skip_frames();
+//#ifdef DATAREC_SOUND
+ if(__DATAREC_SOUND) {
+ if(remote && (play || rec) && ff_rew == 0 && signal_changed > 10 && !config.sound_play_tape && sound_sample == 0) {
+ request_skip_frames();
+ }
+ } else {
+//#else
+ if(remote && (play || rec) && ff_rew == 0 && signal_changed > 10 && !config.sound_play_tape) {
+//#endif
+ request_skip_frames();
+ }
}
signal_changed = 0;
}
} else {
signal = false;
}
-#ifdef DATAREC_SOUND
- if(sound_buffer != NULL && ff_rew == 0) {
- sound_sample = sound_buffer[buffer_ptr];
- } else {
- sound_sample = 0;
+//#ifdef DATAREC_SOUND
+ if(__DATAREC_SOUND) {
+ if(sound_buffer != NULL && ff_rew == 0) {
+ sound_sample = sound_buffer[buffer_ptr];
+ } else {
+ sound_sample = 0;
+ }
}
-#endif
+//#endif
}
if(ff_rew < 0) {
if((buffer_ptr = max(buffer_ptr - 1, 0)) == 0) {
if(remote && (play || rec)) {
if(register_id == -1) {
if(ff_rew > 0) {
- register_event(this, EVENT_SIGNAL, sample_usec / DATAREC_FAST_FWD_SPEED, true, ®ister_id);
+ register_event(this, EVENT_SIGNAL, sample_usec / __DATAREC_FAST_FWD_SPEED, true, ®ister_id);
} else if(ff_rew < 0) {
- register_event(this, EVENT_SIGNAL, sample_usec / DATAREC_FAST_REW_SPEED, true, ®ister_id);
+ register_event(this, EVENT_SIGNAL, sample_usec / __DATAREC_FAST_REW_SPEED, true, ®ister_id);
} else {
if(rec) {
my_stprintf_s(message, 1024, _T("Record"));
}
// update signals
-#ifdef DATAREC_SOUND
- if(!(play && remote)) {
- sound_sample = 0;
+//#ifdef DATAREC_SOUND
+ if(__DATAREC_SOUND) {
+ if(!(play && remote)) {
+ sound_sample = 0;
+ }
}
-#endif
+//#endif
write_signals(&outputs_remote, remote ? 0xffffffff : 0);
write_signals(&outputs_rotate, (register_id != -1) ? 0xffffffff : 0);
write_signals(&outputs_end, (buffer_ptr == buffer_length) ? 0xffffffff : 0);
free(buffer_bak);
buffer_bak = NULL;
}
-#ifdef DATAREC_SOUND
- if(sound_buffer != NULL) {
- free(sound_buffer);
- sound_buffer = NULL;
+//#ifdef DATAREC_SOUND
+ if(__DATAREC_SOUND) {
+ if(sound_buffer != NULL) {
+ free(sound_buffer);
+ sound_buffer = NULL;
+ }
}
-#endif
+//#endif
if(apss_buffer != NULL) {
free(apss_buffer);
apss_buffer = NULL;
}
free(zero_buffer);
}
-
int DATAREC::load_wav_image(int offset)
{
// check wave header
tmp_ptr = 0; \
} \
}
-
-#ifdef DATAREC_SOUND
- if(!config.wave_shaper[drive_num] || header.channels > 1) {
-#else
- if(!config.wave_shaper[drive_num]) {
-#endif
+
+ bool __t = false;
+ if(__DATAREC_SOUND) {
+ if(!config.wave_shaper[drive_num] || header.channels > 1) {
+ __t = true;
+ }
+ } else {
+ if(!config.wave_shaper[drive_num]) {
+ __t = true;
+ }
+ }
+//#ifdef DATAREC_SOUND
+// if(!config.wave_shaper[drive_num] || header.channels > 1) {
+//#else
+// if(!config.wave_shaper[drive_num]) {
+//#endif
+ if(__t) {
// load samples
-#ifdef DATAREC_SOUND
- if(header.channels > 1) {
- sound_buffer_length = samples * sizeof(int16_t);
- sound_buffer = (int16_t *)malloc(sound_buffer_length);
+//#ifdef DATAREC_SOUND
+ if(__DATAREC_SOUND) {
+ if(header.channels > 1) {
+ sound_buffer_length = samples * sizeof(int16_t);
+ sound_buffer = (int16_t *)malloc(sound_buffer_length);
+ }
}
-#endif
+//#endif
int16_t *wav_buffer = (int16_t *)malloc(samples * sizeof(int16_t));
for(int i = 0, tmp_ptr = 0; i < samples; i++) {
int16_t sample[16];
GET_SAMPLE
int16_t sample_signal = sample[0];
-#ifdef DATAREC_SOUND
- if(header.channels > 1) {
-#ifdef DATAREC_SOUND_LEFT
- sample_signal = sample[1];
- sound_buffer[i] = sample[0];
-#else
- sound_buffer[i] = sample[1];
-#endif
+//#ifdef DATAREC_SOUND
+ if(__DATAREC_SOUND) {
+ if(header.channels > 1) {
+//#ifdef DATAREC_SOUND_LEFT
+ if(__DATAREC_SOUND_LEFT) {
+ sample_signal = sample[1];
+ sound_buffer[i] = sample[0];
+ } else {
+//#else
+ sound_buffer[i] = sample[1];
+ }
+//#endif
+ }
}
-#endif
+//#endif
wav_buffer[i] = sample_signal;
}
adjust_zero_position(wav_buffer, samples, header.sample_rate);
int top_index = 0;
int16_t max_sample = 0, min_sample = 0;
- for(int i = 0, tmp_ptr = 0; i < samples; i++) {
+ for(int i = 0 /*, tmp_ptr = 0 */; i < samples; i++) {
int16_t sample_signal = wav_buffer[i];
bool signal = (sample_signal > 0);
}
if(t == 1) {
buffer = (uint8_t *)malloc(loaded_samples);
-#ifdef DATAREC_SOUND
- if(header.channels > 1) {
- sound_buffer_length = loaded_samples * sizeof(int16_t);
- sound_buffer = (int16_t *)malloc(sound_buffer_length);
+//#ifdef DATAREC_SOUND
+ if(__DATAREC_SOUND) {
+ if(header.channels > 1) {
+ sound_buffer_length = loaded_samples * sizeof(int16_t);
+ sound_buffer = (int16_t *)malloc(sound_buffer_length);
+ }
}
-#endif
+//#endif
loaded_samples = 0;
}
}
return loaded_samples;
}
+
void DATAREC::save_wav_image()
{
// write samples remained in buffer
{
// get file size
play_fio->Fseek(0, FILEIO_SEEK_END);
- int file_size = play_fio->Ftell();
+ //int file_size = play_fio->Ftell();
play_fio->Fseek(0, FILEIO_SEEK_SET);
// check header
} \
}
-#if defined(_MZ80B) || defined(_MZ2000) || defined(_MZ2200)
-#define MZT_PUT_BIT(bit, len) { \
- for(int l = 0; l < (len); l++) { \
- if(bit) { \
- MZT_PUT_SIGNAL(1, (int)(120.0 / 16.0 * sample_rate / 22050.0 + 0.5)); \
- MZT_PUT_SIGNAL(0, (int)(120.0 / 16.0 * sample_rate / 22050.0 + 0.5)); \
- } else { \
- MZT_PUT_SIGNAL(1, (int)(60.0 / 16.0 * sample_rate / 22050.0 + 0.5)); \
- MZT_PUT_SIGNAL(0, (int)(60.0 / 16.0 * sample_rate / 22050.0 + 0.5)); \
- } \
- } \
-}
-#else
#define MZT_PUT_BIT(bit, len) { \
for(int l = 0; l < (len); l++) { \
if(bit) { \
- MZT_PUT_SIGNAL(1, (int)(24.0 * sample_rate / 48000.0 + 0.5)); \
- MZT_PUT_SIGNAL(0, (int)(29.0 * sample_rate / 48000.0 + 0.5)); \
+ MZT_PUT_SIGNAL(1, len1); \
+ MZT_PUT_SIGNAL(0, len2); \
} else { \
- MZT_PUT_SIGNAL(1, (int)(11.0 * sample_rate / 48000.0 + 0.5)); \
- MZT_PUT_SIGNAL(0, (int)(15.0 * sample_rate / 48000.0 + 0.5)); \
+ MZT_PUT_SIGNAL(1, len3); \
+ MZT_PUT_SIGNAL(0, len4); \
} \
} \
}
-#endif
#define MZT_PUT_BYTE(byte) { \
MZT_PUT_BIT(1, 1); \
int DATAREC::load_mzt_image()
{
+ int len1, len2, len3, len4;
+ if(__TYPE_MZ80B) {
+ len1 = len2 = (int)(120.0 / 16.0 * sample_rate / 22050.0 + 0.5);
+ len3 = len4 = (int)(60.0 / 16.0 * sample_rate / 22050.0 + 0.5);
+ } else {
+ len1 = (int)(24.0 * sample_rate / 48000.0 + 0.5);
+ len2 = (int)(29.0 * sample_rate / 48000.0 + 0.5);
+ len3 = (int)(11.0 * sample_rate / 48000.0 + 0.5);
+ len4 = (int)(15.0 * sample_rate / 48000.0 + 0.5);
+ }
sample_rate = 48000;
sample_usec = 1000000. / sample_rate;
+
// get file size
play_fio->Fseek(0, FILEIO_SEEK_END);
int file_size = play_fio->Ftell();
#endif
// output to buffer
MZT_PUT_SIGNAL(0, sample_rate);
-#if defined(_MZ80B) || defined(_MZ2000) || defined(_MZ2200)
+//#if defined(_MZ80B) || defined(_MZ2000) || defined(_MZ2200)
+ if(__TYPE_MZ80B) {
// Bin2Wav Ver 0.03
- MZT_PUT_BIT(0, 22000);
- MZT_PUT_BIT(1, 40);
- MZT_PUT_BIT(0, 41);
- MZT_PUT_BLOCK(header, 128);
- MZT_PUT_BIT(1, 1);
- MZT_PUT_SIGNAL(1, (int)(22.0 * sample_rate / 22050.0 + 0.5));
- MZT_PUT_SIGNAL(0, (int)(22.0 * sample_rate / 22050.0 + 0.5));
- MZT_PUT_SIGNAL(0, sample_rate);
- MZT_PUT_BIT(0, 11000);
- MZT_PUT_BIT(1, 20);
- MZT_PUT_BIT(0, 21);
- MZT_PUT_BLOCK(ram + offs, size);
- MZT_PUT_BIT(1, 1);
-#else
- // format info written in \8e\8e\8c±\82É\8fo\82éX1
- MZT_PUT_BIT(0, 10000);
- MZT_PUT_BIT(1, 40);
- MZT_PUT_BIT(0, 40);
- MZT_PUT_BIT(1, 1);
- MZT_PUT_BLOCK(header, 128);
- MZT_PUT_BIT(1, 1);
- MZT_PUT_BIT(0, 256);
- MZT_PUT_BLOCK(header, 128);
- MZT_PUT_BIT(1, 1);
- MZT_PUT_SIGNAL(0, sample_rate);
- MZT_PUT_BIT(0, 10000);
- MZT_PUT_BIT(1, 20);
- MZT_PUT_BIT(0, 20);
- MZT_PUT_BIT(1, 1);
- MZT_PUT_BLOCK(ram + offs, size);
- MZT_PUT_BIT(1, 1);
-#endif
+ MZT_PUT_BIT(0, 22000);
+ MZT_PUT_BIT(1, 40);
+ MZT_PUT_BIT(0, 41);
+ MZT_PUT_BLOCK(header, 128);
+ MZT_PUT_BIT(1, 1);
+ MZT_PUT_SIGNAL(1, (int)(22.0 * sample_rate / 22050.0 + 0.5));
+ MZT_PUT_SIGNAL(0, (int)(22.0 * sample_rate / 22050.0 + 0.5));
+ MZT_PUT_SIGNAL(0, sample_rate);
+ MZT_PUT_BIT(0, 11000);
+ MZT_PUT_BIT(1, 20);
+ MZT_PUT_BIT(0, 21);
+ MZT_PUT_BLOCK(ram + offs, size);
+ MZT_PUT_BIT(1, 1);
+ } else {
+//#else
+ // format info written in \8e\8e\8c±\82É\8fo\82éX1
+ MZT_PUT_BIT(0, 10000);
+ MZT_PUT_BIT(1, 40);
+ MZT_PUT_BIT(0, 40);
+ MZT_PUT_BIT(1, 1);
+ MZT_PUT_BLOCK(header, 128);
+ MZT_PUT_BIT(1, 1);
+ MZT_PUT_BIT(0, 256);
+ MZT_PUT_BLOCK(header, 128);
+ MZT_PUT_BIT(1, 1);
+ MZT_PUT_SIGNAL(0, sample_rate);
+ MZT_PUT_BIT(0, 10000);
+ MZT_PUT_BIT(1, 20);
+ MZT_PUT_BIT(0, 20);
+ MZT_PUT_BIT(1, 1);
+ MZT_PUT_BLOCK(ram + offs, size);
+ MZT_PUT_BIT(1, 1);
+ }
+//#endif
}
return ptr;
}
pcm_prev_clock = get_current_clock();
pcm_positive_clocks = pcm_negative_clocks = 0;
-#ifdef DATAREC_SOUND
- if(/*config.sound_play_tape && */remote && play && ff_rew == 0) {
- sound_last_vol_l = apply_volume(sound_sample, sound_volume_l);
- sound_last_vol_r = apply_volume(sound_sample, sound_volume_r);
- buffer = buffer_tmp; // restore
- for(int i = 0; i < cnt; i++) {
- *buffer += sound_last_vol_l; // L
- *buffer += sound_last_vol_r; // R
- }
- } else if(sound_last_vol_l || sound_last_vol_r) {
- // suppress petite noise when go to mute
- for(int i = 0; i < cnt; i++) {
- *buffer++ += sound_last_vol_l; // L
- *buffer++ += sound_last_vol_r; // R
-
- if(sound_last_vol_l > 0) {
- sound_last_vol_l--;
- } else if(sound_last_vol_l < 0) {
- sound_last_vol_l++;
+//#ifdef DATAREC_SOUND
+ if(__DATAREC_SOUND) {
+ if(/*config.sound_play_tape && */remote && play && ff_rew == 0) {
+ sound_last_vol_l = apply_volume(sound_sample, sound_volume_l);
+ sound_last_vol_r = apply_volume(sound_sample, sound_volume_r);
+ buffer = buffer_tmp; // restore
+ for(int i = 0; i < cnt; i++) {
+ *buffer += sound_last_vol_l; // L
+ *buffer += sound_last_vol_r; // R
}
- if(sound_last_vol_r > 0) {
- sound_last_vol_r--;
- } else if(sound_last_vol_r < 0) {
- sound_last_vol_r++;
+ } else if(sound_last_vol_l || sound_last_vol_r) {
+ // suppress petite noise when go to mute
+ for(int i = 0; i < cnt; i++) {
+ *buffer++ += sound_last_vol_l; // L
+ *buffer++ += sound_last_vol_r; // R
+
+ if(sound_last_vol_l > 0) {
+ sound_last_vol_l--;
+ } else if(sound_last_vol_l < 0) {
+ sound_last_vol_l++;
+ }
+ if(sound_last_vol_r > 0) {
+ sound_last_vol_r--;
+ } else if(sound_last_vol_r < 0) {
+ sound_last_vol_r++;
+ }
}
}
}
-#endif
+//#endif
}
void DATAREC::set_volume(int ch, int decibel_l, int decibel_r)
if(ch == 0) {
pcm_volume_l = decibel_to_volume(decibel_l);
pcm_volume_r = decibel_to_volume(decibel_r);
-#ifdef DATAREC_SOUND
+//#ifdef DATAREC_SOUND
} else if(ch == 1) {
- sound_volume_l = decibel_to_volume(decibel_l);
- sound_volume_r = decibel_to_volume(decibel_r);
-#endif
+ if(__DATAREC_SOUND) {
+ sound_volume_l = decibel_to_volume(decibel_l);
+ sound_volume_r = decibel_to_volume(decibel_r);
+ }
+//#endif
}
}
} else {
state_fio->FputInt32(0);
}
-#ifdef DATAREC_SOUND
- if(sound_buffer) {
- state_fio->FputInt32(sound_buffer_length);
- state_fio->Fwrite(sound_buffer, sound_buffer_length, 1);
- } else {
- state_fio->FputInt32(0);
+//#ifdef DATAREC_SOUND
+ if(__DATAREC_SOUND) {
+ if(sound_buffer) {
+ state_fio->FputInt32(sound_buffer_length);
+ state_fio->Fwrite(sound_buffer, sound_buffer_length, 1);
+ } else {
+ state_fio->FputInt32(0);
+ }
+ state_fio->FputInt16(sound_sample);
}
- state_fio->FputInt16(sound_sample);
-#endif
+//#endif
state_fio->FputBool(is_wav);
state_fio->FputBool(is_tap);
state_fio->FputBool(is_t77);
buffer_bak = (uint8_t *)malloc(length_tmp);
state_fio->Fread(buffer_bak, length_tmp, 1);
}
-#ifdef DATAREC_SOUND
- if((sound_buffer_length = state_fio->FgetInt32()) != 0) {
- sound_buffer = (int16_t *)malloc(sound_buffer_length);
- state_fio->Fread(sound_buffer, sound_buffer_length, 1);
+//#ifdef DATAREC_SOUND
+ if(__DATAREC_SOUND) {
+ if((sound_buffer_length = state_fio->FgetInt32()) != 0) {
+ sound_buffer = (int16_t *)malloc(sound_buffer_length);
+ state_fio->Fread(sound_buffer, sound_buffer_length, 1);
+ }
+ sound_sample = state_fio->FgetInt16();
}
- sound_sample = state_fio->FgetInt16();
-#endif
+//#endif
is_wav = state_fio->FgetBool();
is_tap = state_fio->FgetBool();
is_t77 = state_fio->FgetBool();
// post process
pcm_last_vol_l = pcm_last_vol_r = 0;
-#ifdef DATAREC_SOUND
+//#ifdef DATAREC_SOUND
sound_last_vol_l = sound_last_vol_r = 0;
-#endif
+//#endif
return true;
}
#ifndef _DREC_H_
#define _DREC_H_
-#include "vm.h"
-#include "../emu.h"
+//#include "vm.h"
+//#include "../emu.h"
#include "device.h"
#define SIG_DATAREC_MIC 0
double sample_usec;
int buffer_ptr, buffer_length;
uint8_t *buffer, *buffer_bak;
-#ifdef DATAREC_SOUND
+//#ifdef DATAREC_SOUND
int sound_buffer_length;
int16_t *sound_buffer, sound_sample;
-#endif
+//#endif
bool is_wav, is_tap, is_t77;
double ave_hi_freq;
int pcm_max_vol;
int32_t pcm_last_vol_l, pcm_last_vol_r;
int pcm_volume_l, pcm_volume_r;
-#ifdef DATAREC_SOUND
+//#ifdef DATAREC_SOUND
int32_t sound_last_vol_l, sound_last_vol_r;
int sound_volume_l, sound_volume_r;
-#endif
+//#endif
_TCHAR message[1024];
+
+
+ bool __DATAREC_SOUND;
+ bool __DATAREC_SOUND_LEFT;
+ bool __DATAREC_SOUND_RIGHT;
+ bool __TYPE_MZ80B;
+ double __DATAREC_FAST_FWD_SPEED;
+ double __DATAREC_FAST_REW_SPEED;
void update_event();
void update_realtime_render();
d_noise_play = NULL;
d_noise_stop = NULL;
d_noise_fast = NULL;
-#ifdef DATAREC_PCM_VOLUME
- pcm_max_vol = DATAREC_PCM_VOLUME;
-#else
+//#ifdef DATAREC_PCM_VOLUME
+// pcm_max_vol = DATAREC_PCM_VOLUME;
+//#else
pcm_max_vol = 8000;
-#endif
+//#endif
pcm_volume_l = pcm_volume_r = 1024;
-#ifdef DATAREC_SOUND
+//#ifdef DATAREC_SOUND
sound_volume_l = sound_volume_r = 1024;
-#endif
+//#endif
+ __TYPE_MZ80B = false;
+ __DATAREC_SOUND = __DATAREC_SOUND_LEFT = __DATAREC_SOUND_RIGHT = false;
+ __DATAREC_FAST_FWD_SPEED = __DATAREC_FAST_REW_SPEED = 10.0;
my_tcscpy_s(message, 1023, _T("Stop"));
set_device_name(_T("Data Recorder"));
}
lines_per_frame = 0;
next_frames_per_sec = FRAMES_PER_SEC;
next_lines_per_frame = LINES_PER_FRAME;
-
// reset before other device may call set_realtime_render()
memset(dev_need_mix, 0, sizeof(dev_need_mix));
need_mix = 0;
[ MCS48 ]
*/
+#include "vm.h"
+#include "../emu.h"
+#include "mcs48_flags.h"
#include "mcs48.h"
#ifdef USE_DEBUGGER
#include "debugger.h"
#pragma warning( disable : 4244 )
#endif
-#define INLINE inline
-
-/***************************************************************************
- CONSTANTS
-***************************************************************************/
-
-/* timer/counter enable bits */
-#define TIMER_ENABLED 0x01
-#define COUNTER_ENABLED 0x02
-
-/* flag bits */
-#define C_FLAG 0x80
-#define A_FLAG 0x40
-#define F_FLAG 0x20
-#define B_FLAG 0x10
-
-/* status bits (UPI-41) */
-#define STS_F1 0x08
-#define STS_F0 0x04
-
-/* 8243 expander operations */
-enum
-{
- MCS48_EXPANDER_OP_READ = 0,
- MCS48_EXPANDER_OP_WRITE = 1,
- MCS48_EXPANDER_OP_OR = 2,
- MCS48_EXPANDER_OP_AND = 3
-};
-
-/***************************************************************************
- TYPE DEFINITIONS
-***************************************************************************/
-
-/* live processor state */
-struct mcs48_state
-{
- UINT16 prevpc; /* 16-bit previous program counter */
- UINT16 pc; /* 16-bit program counter */
-
- UINT8 a; /* 8-bit accumulator */
- int regptr; /* offset of r0-r7 */
- UINT8 psw; /* 8-bit cpustate->psw */
- UINT8 p1; /* 8-bit latched port 1 */
- UINT8 p2; /* 8-bit latched port 2 */
- UINT8 timer; /* 8-bit timer */
- UINT8 prescaler; /* 5-bit timer prescaler */
- UINT8 t1_history; /* 8-bit history of the T1 input */
- UINT8 sts; /* 8-bit status register */
-
- UINT8 int_state; /* INT signal status */
- UINT8 irq_state; /* TRUE if an IRQ is pending */
- UINT8 irq_in_progress; /* TRUE if an IRQ is in progress */
- UINT8 timer_overflow; /* TRUE on a timer overflow; cleared by taking interrupt */
- UINT8 timer_flag; /* TRUE on a timer overflow; cleared on JTF */
- UINT8 tirq_enabled; /* TRUE if the timer IRQ is enabled */
- UINT8 xirq_enabled; /* TRUE if the external IRQ is enabled */
- UINT8 t0_clk_enabled; /* TRUE if ent0_clk is called */
- UINT8 timecount_enabled; /* bitmask of timer/counter enabled */
-
- UINT16 a11; /* A11 value, either 0x000 or 0x800 */
-
- DEVICE * mem;
- DEVICE * io;
- DEVICE * intr;
-
- int icount;
-
- UINT8 rom[0x1000];
-// UINT8 ram[0x100];
-};
-
-/* opcode table entry */
-typedef int (*mcs48_ophandler)(mcs48_state *state);
-
-/***************************************************************************
- MACROS
-***************************************************************************/
-
-#define program_r(a) cpustate->rom[(a) & 0xfff]
-
-#define ram_r(a) cpustate->mem->read_data8(a)
-#define ram_w(a,V) cpustate->mem->write_data8(a, V)
-#define reg_r(a) cpustate->mem->read_data8(cpustate->regptr + a)
-#define reg_w(a,V) cpustate->mem->write_data8(cpustate->regptr + a, V)
-
-#define ext_r(a) cpustate->io->read_io8(a)
-#define ext_w(a,V) cpustate->io->write_io8(a, V)
-#define port_r(a) cpustate->io->read_io8(MCS48_PORT_P0 + a)
-#define port_w(a,V) cpustate->io->write_io8(MCS48_PORT_P0 + a, V)
-#define test_r(a) cpustate->io->read_io8(MCS48_PORT_T0 + a)
-#define test_w(a,V) cpustate->io->write_io8(MCS48_PORT_T0 + a, V)
-#define bus_r() cpustate->io->read_io8(MCS48_PORT_BUS)
-#define bus_w(V) cpustate->io->write_io8(MCS48_PORT_BUS, V)
-#define prog_w(V) cpustate->io->write_io8(MCS48_PORT_PROG, V)
-
-/***************************************************************************
- FUNCTION PROTOTYPES
-***************************************************************************/
-
-static int check_irqs(mcs48_state *cpustate);
-
-/***************************************************************************
- INLINE FUNCTIONS
-***************************************************************************/
-
-/*-------------------------------------------------
- opcode_fetch - fetch an opcode byte
--------------------------------------------------*/
-
-INLINE UINT8 opcode_fetch(mcs48_state *cpustate)
-{
- return cpustate->rom[cpustate->pc++ & 0xfff];
-}
-
-/*-------------------------------------------------
- argument_fetch - fetch an opcode argument
- byte
--------------------------------------------------*/
-
-INLINE UINT8 argument_fetch(mcs48_state *cpustate)
-{
- return cpustate->rom[cpustate->pc++ & 0xfff];
-}
-
-/*-------------------------------------------------
- update_regptr - update the regptr member to
- point to the appropriate register bank
--------------------------------------------------*/
-
-INLINE void update_regptr(mcs48_state *cpustate)
-{
- cpustate->regptr = ((cpustate->psw & B_FLAG) ? 24 : 0);
-}
-
-/*-------------------------------------------------
- push_pc_psw - push the cpustate->pc and cpustate->psw values onto
- the stack
--------------------------------------------------*/
-
-INLINE void push_pc_psw(mcs48_state *cpustate)
-{
- UINT8 sp = cpustate->psw & 0x07;
- ram_w(8 + 2*sp, cpustate->pc);
- ram_w(9 + 2*sp, ((cpustate->pc >> 8) & 0x0f) | (cpustate->psw & 0xf0));
- cpustate->psw = (cpustate->psw & 0xf8) | ((sp + 1) & 0x07);
-}
-
-/*-------------------------------------------------
- pull_pc_psw - pull the PC and PSW values from
- the stack
--------------------------------------------------*/
-
-INLINE void pull_pc_psw(mcs48_state *cpustate)
-{
- UINT8 sp = (cpustate->psw - 1) & 0x07;
- cpustate->pc = ram_r(8 + 2*sp);
- cpustate->pc |= ram_r(9 + 2*sp) << 8;
- cpustate->psw = ((cpustate->pc >> 8) & 0xf0) | 0x08 | sp;
- cpustate->pc &= 0xfff;
- update_regptr(cpustate);
-}
-
-/*-------------------------------------------------
- pull_pc - pull the PC value from the stack,
- leaving the upper part of PSW intact
--------------------------------------------------*/
-
-INLINE void pull_pc(mcs48_state *cpustate)
-{
- UINT8 sp = (cpustate->psw - 1) & 0x07;
- cpustate->pc = ram_r(8 + 2*sp);
- cpustate->pc |= ram_r(9 + 2*sp) << 8;
- cpustate->pc &= 0xfff;
- cpustate->psw = (cpustate->psw & 0xf0) | 0x08 | sp;
-}
-
-/*-------------------------------------------------
- execute_add - perform the logic of an ADD
- instruction
--------------------------------------------------*/
-
-INLINE void execute_add(mcs48_state *cpustate, UINT8 dat)
-{
- UINT16 temp = cpustate->a + dat;
- UINT16 temp4 = (cpustate->a & 0x0f) + (dat & 0x0f);
-
- cpustate->psw &= ~(C_FLAG | A_FLAG);
- cpustate->psw |= (temp4 << 2) & A_FLAG;
- cpustate->psw |= (temp >> 1) & C_FLAG;
- cpustate->a = temp;
-}
-
-/*-------------------------------------------------
- execute_addc - perform the logic of an ADDC
- instruction
--------------------------------------------------*/
-
-INLINE void execute_addc(mcs48_state *cpustate, UINT8 dat)
-{
- UINT8 carryin = (cpustate->psw & C_FLAG) >> 7;
- UINT16 temp = cpustate->a + dat + carryin;
- UINT16 temp4 = (cpustate->a & 0x0f) + (dat & 0x0f) + carryin;
-
- cpustate->psw &= ~(C_FLAG | A_FLAG);
- cpustate->psw |= (temp4 << 2) & A_FLAG;
- cpustate->psw |= (temp >> 1) & C_FLAG;
- cpustate->a = temp;
-}
-
-/*-------------------------------------------------
- execute_jmp - perform the logic of a JMP
- instruction
--------------------------------------------------*/
-
-INLINE void execute_jmp(mcs48_state *cpustate, UINT16 address)
-{
- UINT16 a11 = (cpustate->irq_in_progress) ? 0 : cpustate->a11;
- cpustate->pc = address | a11;
-}
-
-/*-------------------------------------------------
- execute_call - perform the logic of a CALL
- instruction
--------------------------------------------------*/
-
-INLINE void execute_call(mcs48_state *cpustate, UINT16 address)
-{
- push_pc_psw(cpustate);
- execute_jmp(cpustate, address);
-}
-
-/*-------------------------------------------------
- execute_jcc - perform the logic of a
- conditional jump instruction
--------------------------------------------------*/
-
-INLINE void execute_jcc(mcs48_state *cpustate, UINT8 result)
-{
- UINT8 offset = argument_fetch(cpustate);
- if (result != 0)
- cpustate->pc = ((cpustate->pc - 1) & 0xf00) | offset;
-}
-
-/*-------------------------------------------------
- expander_operation - perform an operation via
- the 8243 expander chip
--------------------------------------------------*/
-
-INLINE void expander_operation(mcs48_state *cpustate, UINT8 operation, UINT8 port)
-{
- /* put opcode/data on low 4 bits of P2 */
- port_w(2, cpustate->p2 = (cpustate->p2 & 0xf0) | (operation << 2) | (port & 3));
-
- /* generate high-to-low transition on PROG line */
- prog_w(0);
-
- /* put data on low 4 bits of P2 */
- if (operation != 0)
- port_w(2, cpustate->p2 = (cpustate->p2 & 0xf0) | (cpustate->a & 0x0f));
- else
- cpustate->a = port_r(2) | 0x0f;
-
- /* generate low-to-high transition on PROG line */
- prog_w(1);
-}
-
-/***************************************************************************
- OPCODE HANDLERS
-***************************************************************************/
-
-#define OPHANDLER(_name) static int _name(mcs48_state *cpustate)
-
-OPHANDLER( illegal )
-{
-// logerror("MCS-48 PC:%04X - Illegal opcode = %02x\n", cpustate->pc - 1, program_r(cpustate->pc - 1));
- return 1;
-}
-
-OPHANDLER( add_a_r0 ) { execute_add(cpustate, reg_r(0)); return 1; }
-OPHANDLER( add_a_r1 ) { execute_add(cpustate, reg_r(1)); return 1; }
-OPHANDLER( add_a_r2 ) { execute_add(cpustate, reg_r(2)); return 1; }
-OPHANDLER( add_a_r3 ) { execute_add(cpustate, reg_r(3)); return 1; }
-OPHANDLER( add_a_r4 ) { execute_add(cpustate, reg_r(4)); return 1; }
-OPHANDLER( add_a_r5 ) { execute_add(cpustate, reg_r(5)); return 1; }
-OPHANDLER( add_a_r6 ) { execute_add(cpustate, reg_r(6)); return 1; }
-OPHANDLER( add_a_r7 ) { execute_add(cpustate, reg_r(7)); return 1; }
-OPHANDLER( add_a_xr0 ) { execute_add(cpustate, ram_r(reg_r(0))); return 1; }
-OPHANDLER( add_a_xr1 ) { execute_add(cpustate, ram_r(reg_r(1))); return 1; }
-OPHANDLER( add_a_n ) { execute_add(cpustate, argument_fetch(cpustate)); return 2; }
-
-OPHANDLER( adc_a_r0 ) { execute_addc(cpustate, reg_r(0)); return 1; }
-OPHANDLER( adc_a_r1 ) { execute_addc(cpustate, reg_r(1)); return 1; }
-OPHANDLER( adc_a_r2 ) { execute_addc(cpustate, reg_r(2)); return 1; }
-OPHANDLER( adc_a_r3 ) { execute_addc(cpustate, reg_r(3)); return 1; }
-OPHANDLER( adc_a_r4 ) { execute_addc(cpustate, reg_r(4)); return 1; }
-OPHANDLER( adc_a_r5 ) { execute_addc(cpustate, reg_r(5)); return 1; }
-OPHANDLER( adc_a_r6 ) { execute_addc(cpustate, reg_r(6)); return 1; }
-OPHANDLER( adc_a_r7 ) { execute_addc(cpustate, reg_r(7)); return 1; }
-OPHANDLER( adc_a_xr0 ) { execute_addc(cpustate, ram_r(reg_r(0))); return 1; }
-OPHANDLER( adc_a_xr1 ) { execute_addc(cpustate, ram_r(reg_r(1))); return 1; }
-OPHANDLER( adc_a_n ) { execute_addc(cpustate, argument_fetch(cpustate)); return 2; }
-
-OPHANDLER( anl_a_r0 ) { cpustate->a &= reg_r(0); return 1; }
-OPHANDLER( anl_a_r1 ) { cpustate->a &= reg_r(1); return 1; }
-OPHANDLER( anl_a_r2 ) { cpustate->a &= reg_r(2); return 1; }
-OPHANDLER( anl_a_r3 ) { cpustate->a &= reg_r(3); return 1; }
-OPHANDLER( anl_a_r4 ) { cpustate->a &= reg_r(4); return 1; }
-OPHANDLER( anl_a_r5 ) { cpustate->a &= reg_r(5); return 1; }
-OPHANDLER( anl_a_r6 ) { cpustate->a &= reg_r(6); return 1; }
-OPHANDLER( anl_a_r7 ) { cpustate->a &= reg_r(7); return 1; }
-OPHANDLER( anl_a_xr0 ) { cpustate->a &= ram_r(reg_r(0)); return 1; }
-OPHANDLER( anl_a_xr1 ) { cpustate->a &= ram_r(reg_r(1)); return 1; }
-OPHANDLER( anl_a_n ) { cpustate->a &= argument_fetch(cpustate); return 2; }
-
-OPHANDLER( anl_bus_n ) { bus_w(bus_r() & argument_fetch(cpustate)); return 2; }
-OPHANDLER( anl_p1_n ) { port_w(1, cpustate->p1 &= argument_fetch(cpustate)); return 2; }
-OPHANDLER( anl_p2_n ) { port_w(2, cpustate->p2 &= argument_fetch(cpustate)); return 2; }
-OPHANDLER( anld_p4_a ) { expander_operation(cpustate, MCS48_EXPANDER_OP_AND, 4); return 2; }
-OPHANDLER( anld_p5_a ) { expander_operation(cpustate, MCS48_EXPANDER_OP_AND, 5); return 2; }
-OPHANDLER( anld_p6_a ) { expander_operation(cpustate, MCS48_EXPANDER_OP_AND, 6); return 2; }
-OPHANDLER( anld_p7_a ) { expander_operation(cpustate, MCS48_EXPANDER_OP_AND, 7); return 2; }
-
-OPHANDLER( call_0 ) { execute_call(cpustate, argument_fetch(cpustate) | 0x000); return 2; }
-OPHANDLER( call_1 ) { execute_call(cpustate, argument_fetch(cpustate) | 0x100); return 2; }
-OPHANDLER( call_2 ) { execute_call(cpustate, argument_fetch(cpustate) | 0x200); return 2; }
-OPHANDLER( call_3 ) { execute_call(cpustate, argument_fetch(cpustate) | 0x300); return 2; }
-OPHANDLER( call_4 ) { execute_call(cpustate, argument_fetch(cpustate) | 0x400); return 2; }
-OPHANDLER( call_5 ) { execute_call(cpustate, argument_fetch(cpustate) | 0x500); return 2; }
-OPHANDLER( call_6 ) { execute_call(cpustate, argument_fetch(cpustate) | 0x600); return 2; }
-OPHANDLER( call_7 ) { execute_call(cpustate, argument_fetch(cpustate) | 0x700); return 2; }
-
-OPHANDLER( clr_a ) { cpustate->a = 0; return 1; }
-OPHANDLER( clr_c ) { cpustate->psw &= ~C_FLAG; return 1; }
-OPHANDLER( clr_f0 ) { cpustate->psw &= ~F_FLAG; cpustate->sts &= ~STS_F0; return 1; }
-OPHANDLER( clr_f1 ) { cpustate->sts &= ~STS_F1; return 1; }
-
-OPHANDLER( cpl_a ) { cpustate->a ^= 0xff; return 1; }
-OPHANDLER( cpl_c ) { cpustate->psw ^= C_FLAG; return 1; }
-OPHANDLER( cpl_f0 ) { cpustate->psw ^= F_FLAG; cpustate->sts ^= STS_F0; return 1; }
-OPHANDLER( cpl_f1 ) { cpustate->sts ^= STS_F1; return 1; }
-
-OPHANDLER( da_a )
-{
- if ((cpustate->a & 0x0f) > 0x09 || (cpustate->psw & A_FLAG))
- {
- cpustate->a += 0x06;
- if ((cpustate->a & 0xf0) == 0x00)
- cpustate->psw |= C_FLAG;
- }
- if ((cpustate->a & 0xf0) > 0x90 || (cpustate->psw & C_FLAG))
- {
- cpustate->a += 0x60;
- cpustate->psw |= C_FLAG;
- }
- else
- cpustate->psw &= ~C_FLAG;
- return 1;
-}
-
-OPHANDLER( dec_a ) { cpustate->a--; return 1; }
-OPHANDLER( dec_r0 ) { reg_w(0, reg_r(0) - 1); return 1; }
-OPHANDLER( dec_r1 ) { reg_w(1, reg_r(1) - 1); return 1; }
-OPHANDLER( dec_r2 ) { reg_w(2, reg_r(2) - 1); return 1; }
-OPHANDLER( dec_r3 ) { reg_w(3, reg_r(3) - 1); return 1; }
-OPHANDLER( dec_r4 ) { reg_w(4, reg_r(4) - 1); return 1; }
-OPHANDLER( dec_r5 ) { reg_w(5, reg_r(5) - 1); return 1; }
-OPHANDLER( dec_r6 ) { reg_w(6, reg_r(6) - 1); return 1; }
-OPHANDLER( dec_r7 ) { reg_w(7, reg_r(7) - 1); return 1; }
-
-OPHANDLER( dis_i ) { cpustate->xirq_enabled = FALSE; return 1; }
-OPHANDLER( dis_tcnti ) { cpustate->tirq_enabled = FALSE; cpustate->timer_overflow = FALSE; return 1; }
-
-OPHANDLER( djnz_r0 ) { UINT8 r0 = reg_r(0); reg_w(0, --r0); execute_jcc(cpustate, r0 != 0); return 2; }
-OPHANDLER( djnz_r1 ) { UINT8 r1 = reg_r(1); reg_w(1, --r1); execute_jcc(cpustate, r1 != 0); return 2; }
-OPHANDLER( djnz_r2 ) { UINT8 r2 = reg_r(2); reg_w(2, --r2); execute_jcc(cpustate, r2 != 0); return 2; }
-OPHANDLER( djnz_r3 ) { UINT8 r3 = reg_r(3); reg_w(3, --r3); execute_jcc(cpustate, r3 != 0); return 2; }
-OPHANDLER( djnz_r4 ) { UINT8 r4 = reg_r(4); reg_w(4, --r4); execute_jcc(cpustate, r4 != 0); return 2; }
-OPHANDLER( djnz_r5 ) { UINT8 r5 = reg_r(5); reg_w(5, --r5); execute_jcc(cpustate, r5 != 0); return 2; }
-OPHANDLER( djnz_r6 ) { UINT8 r6 = reg_r(6); reg_w(6, --r6); execute_jcc(cpustate, r6 != 0); return 2; }
-OPHANDLER( djnz_r7 ) { UINT8 r7 = reg_r(7); reg_w(7, --r7); execute_jcc(cpustate, r7 != 0); return 2; }
-
-OPHANDLER( en_i ) { cpustate->xirq_enabled = TRUE; return 1 + check_irqs(cpustate); }
-OPHANDLER( en_tcnti ) { cpustate->tirq_enabled = TRUE; return 1 + check_irqs(cpustate); }
-OPHANDLER( ent0_clk ) { cpustate->t0_clk_enabled = TRUE; return 1; }
-
-OPHANDLER( in_a_p1 ) { cpustate->a = port_r(1) & cpustate->p1; return 2; }
-OPHANDLER( in_a_p2 ) { cpustate->a = port_r(2) & cpustate->p2; return 2; }
-OPHANDLER( ins_a_bus ) { cpustate->a = bus_r(); return 2; }
-
-OPHANDLER( inc_a ) { cpustate->a++; return 1; }
-OPHANDLER( inc_r0 ) { reg_w(0, reg_r(0) + 1); return 1; }
-OPHANDLER( inc_r1 ) { reg_w(1, reg_r(1) + 1); return 1; }
-OPHANDLER( inc_r2 ) { reg_w(2, reg_r(2) + 1); return 1; }
-OPHANDLER( inc_r3 ) { reg_w(3, reg_r(3) + 1); return 1; }
-OPHANDLER( inc_r4 ) { reg_w(4, reg_r(4) + 1); return 1; }
-OPHANDLER( inc_r5 ) { reg_w(5, reg_r(5) + 1); return 1; }
-OPHANDLER( inc_r6 ) { reg_w(6, reg_r(6) + 1); return 1; }
-OPHANDLER( inc_r7 ) { reg_w(7, reg_r(7) + 1); return 1; }
-OPHANDLER( inc_xr0 ) { UINT8 r0 = reg_r(0); ram_w(r0, ram_r(r0) + 1); return 1; }
-OPHANDLER( inc_xr1 ) { UINT8 r1 = reg_r(1); ram_w(r1, ram_r(r1) + 1); return 1; }
-
-OPHANDLER( jb_0 ) { execute_jcc(cpustate, (cpustate->a & 0x01) != 0); return 2; }
-OPHANDLER( jb_1 ) { execute_jcc(cpustate, (cpustate->a & 0x02) != 0); return 2; }
-OPHANDLER( jb_2 ) { execute_jcc(cpustate, (cpustate->a & 0x04) != 0); return 2; }
-OPHANDLER( jb_3 ) { execute_jcc(cpustate, (cpustate->a & 0x08) != 0); return 2; }
-OPHANDLER( jb_4 ) { execute_jcc(cpustate, (cpustate->a & 0x10) != 0); return 2; }
-OPHANDLER( jb_5 ) { execute_jcc(cpustate, (cpustate->a & 0x20) != 0); return 2; }
-OPHANDLER( jb_6 ) { execute_jcc(cpustate, (cpustate->a & 0x40) != 0); return 2; }
-OPHANDLER( jb_7 ) { execute_jcc(cpustate, (cpustate->a & 0x80) != 0); return 2; }
-OPHANDLER( jc ) { execute_jcc(cpustate, (cpustate->psw & C_FLAG) != 0); return 2; }
-OPHANDLER( jf0 ) { execute_jcc(cpustate, (cpustate->psw & F_FLAG) != 0); return 2; }
-OPHANDLER( jf1 ) { execute_jcc(cpustate, (cpustate->sts & STS_F1) != 0); return 2; }
-OPHANDLER( jnc ) { execute_jcc(cpustate, (cpustate->psw & C_FLAG) == 0); return 2; }
-OPHANDLER( jni ) { execute_jcc(cpustate, cpustate->int_state == 0); return 2; }
-OPHANDLER( jnt_0 ) { execute_jcc(cpustate, test_r(0) == 0); return 2; }
-OPHANDLER( jnt_1 ) { execute_jcc(cpustate, test_r(1) == 0); return 2; }
-OPHANDLER( jnz ) { execute_jcc(cpustate, cpustate->a != 0); return 2; }
-OPHANDLER( jtf ) { execute_jcc(cpustate, cpustate->timer_flag); cpustate->timer_flag = FALSE; return 2; }
-OPHANDLER( jt_0 ) { execute_jcc(cpustate, test_r(0) != 0); return 2; }
-OPHANDLER( jt_1 ) { execute_jcc(cpustate, test_r(1) != 0); return 2; }
-OPHANDLER( jz ) { execute_jcc(cpustate, cpustate->a == 0); return 2; }
-
-OPHANDLER( jmp_0 ) { execute_jmp(cpustate, argument_fetch(cpustate) | 0x000); return 2; }
-OPHANDLER( jmp_1 ) { execute_jmp(cpustate, argument_fetch(cpustate) | 0x100); return 2; }
-OPHANDLER( jmp_2 ) { execute_jmp(cpustate, argument_fetch(cpustate) | 0x200); return 2; }
-OPHANDLER( jmp_3 ) { execute_jmp(cpustate, argument_fetch(cpustate) | 0x300); return 2; }
-OPHANDLER( jmp_4 ) { execute_jmp(cpustate, argument_fetch(cpustate) | 0x400); return 2; }
-OPHANDLER( jmp_5 ) { execute_jmp(cpustate, argument_fetch(cpustate) | 0x500); return 2; }
-OPHANDLER( jmp_6 ) { execute_jmp(cpustate, argument_fetch(cpustate) | 0x600); return 2; }
-OPHANDLER( jmp_7 ) { execute_jmp(cpustate, argument_fetch(cpustate) | 0x700); return 2; }
-OPHANDLER( jmpp_xa ) { cpustate->pc &= 0xf00; cpustate->pc |= program_r(cpustate->pc | cpustate->a); return 2; }
-
-OPHANDLER( mov_a_n ) { cpustate->a = argument_fetch(cpustate); return 2; }
-OPHANDLER( mov_a_psw ) { cpustate->a = cpustate->psw; return 1; }
-OPHANDLER( mov_a_r0 ) { cpustate->a = reg_r(0); return 1; }
-OPHANDLER( mov_a_r1 ) { cpustate->a = reg_r(1); return 1; }
-OPHANDLER( mov_a_r2 ) { cpustate->a = reg_r(2); return 1; }
-OPHANDLER( mov_a_r3 ) { cpustate->a = reg_r(3); return 1; }
-OPHANDLER( mov_a_r4 ) { cpustate->a = reg_r(4); return 1; }
-OPHANDLER( mov_a_r5 ) { cpustate->a = reg_r(5); return 1; }
-OPHANDLER( mov_a_r6 ) { cpustate->a = reg_r(6); return 1; }
-OPHANDLER( mov_a_r7 ) { cpustate->a = reg_r(7); return 1; }
-OPHANDLER( mov_a_xr0 ) { cpustate->a = ram_r(reg_r(0)); return 1; }
-OPHANDLER( mov_a_xr1 ) { cpustate->a = ram_r(reg_r(1)); return 1; }
-OPHANDLER( mov_a_t ) { cpustate->a = cpustate->timer; return 1; }
-
-OPHANDLER( mov_psw_a ) { cpustate->psw = cpustate->a; update_regptr(cpustate); return 1; }
-OPHANDLER( mov_r0_a ) { reg_w(0, cpustate->a); return 1; }
-OPHANDLER( mov_r1_a ) { reg_w(1, cpustate->a); return 1; }
-OPHANDLER( mov_r2_a ) { reg_w(2, cpustate->a); return 1; }
-OPHANDLER( mov_r3_a ) { reg_w(3, cpustate->a); return 1; }
-OPHANDLER( mov_r4_a ) { reg_w(4, cpustate->a); return 1; }
-OPHANDLER( mov_r5_a ) { reg_w(5, cpustate->a); return 1; }
-OPHANDLER( mov_r6_a ) { reg_w(6, cpustate->a); return 1; }
-OPHANDLER( mov_r7_a ) { reg_w(7, cpustate->a); return 1; }
-OPHANDLER( mov_r0_n ) { reg_w(0, argument_fetch(cpustate)); return 2; }
-OPHANDLER( mov_r1_n ) { reg_w(1, argument_fetch(cpustate)); return 2; }
-OPHANDLER( mov_r2_n ) { reg_w(2, argument_fetch(cpustate)); return 2; }
-OPHANDLER( mov_r3_n ) { reg_w(3, argument_fetch(cpustate)); return 2; }
-OPHANDLER( mov_r4_n ) { reg_w(4, argument_fetch(cpustate)); return 2; }
-OPHANDLER( mov_r5_n ) { reg_w(5, argument_fetch(cpustate)); return 2; }
-OPHANDLER( mov_r6_n ) { reg_w(6, argument_fetch(cpustate)); return 2; }
-OPHANDLER( mov_r7_n ) { reg_w(7, argument_fetch(cpustate)); return 2; }
-OPHANDLER( mov_t_a ) { cpustate->timer = cpustate->a; return 1; }
-OPHANDLER( mov_xr0_a ) { ram_w(reg_r(0), cpustate->a); return 1; }
-OPHANDLER( mov_xr1_a ) { ram_w(reg_r(1), cpustate->a); return 1; }
-OPHANDLER( mov_xr0_n ) { ram_w(reg_r(0), argument_fetch(cpustate)); return 2; }
-OPHANDLER( mov_xr1_n ) { ram_w(reg_r(1), argument_fetch(cpustate)); return 2; }
-
-OPHANDLER( movd_a_p4 ) { expander_operation(cpustate, MCS48_EXPANDER_OP_READ, 4); return 2; }
-OPHANDLER( movd_a_p5 ) { expander_operation(cpustate, MCS48_EXPANDER_OP_READ, 5); return 2; }
-OPHANDLER( movd_a_p6 ) { expander_operation(cpustate, MCS48_EXPANDER_OP_READ, 6); return 2; }
-OPHANDLER( movd_a_p7 ) { expander_operation(cpustate, MCS48_EXPANDER_OP_READ, 7); return 2; }
-OPHANDLER( movd_p4_a ) { expander_operation(cpustate, MCS48_EXPANDER_OP_WRITE, 4); return 2; }
-OPHANDLER( movd_p5_a ) { expander_operation(cpustate, MCS48_EXPANDER_OP_WRITE, 5); return 2; }
-OPHANDLER( movd_p6_a ) { expander_operation(cpustate, MCS48_EXPANDER_OP_WRITE, 6); return 2; }
-OPHANDLER( movd_p7_a ) { expander_operation(cpustate, MCS48_EXPANDER_OP_WRITE, 7); return 2; }
-
-OPHANDLER( movp_a_xa ) { cpustate->a = program_r((cpustate->pc & 0xf00) | cpustate->a); return 2; }
-OPHANDLER( movp3_a_xa ) { cpustate->a = program_r(0x300 | cpustate->a); return 2; }
-
-OPHANDLER( movx_a_xr0 ) { cpustate->a = ext_r(reg_r(0)); return 2; }
-OPHANDLER( movx_a_xr1 ) { cpustate->a = ext_r(reg_r(1)); return 2; }
-OPHANDLER( movx_xr0_a ) { ext_w(reg_r(0), cpustate->a); return 2; }
-OPHANDLER( movx_xr1_a ) { ext_w(reg_r(1), cpustate->a); return 2; }
-
-OPHANDLER( nop ) { return 1; }
-
-OPHANDLER( orl_a_r0 ) { cpustate->a |= reg_r(0); return 1; }
-OPHANDLER( orl_a_r1 ) { cpustate->a |= reg_r(1); return 1; }
-OPHANDLER( orl_a_r2 ) { cpustate->a |= reg_r(2); return 1; }
-OPHANDLER( orl_a_r3 ) { cpustate->a |= reg_r(3); return 1; }
-OPHANDLER( orl_a_r4 ) { cpustate->a |= reg_r(4); return 1; }
-OPHANDLER( orl_a_r5 ) { cpustate->a |= reg_r(5); return 1; }
-OPHANDLER( orl_a_r6 ) { cpustate->a |= reg_r(6); return 1; }
-OPHANDLER( orl_a_r7 ) { cpustate->a |= reg_r(7); return 1; }
-OPHANDLER( orl_a_xr0 ) { cpustate->a |= ram_r(reg_r(0)); return 1; }
-OPHANDLER( orl_a_xr1 ) { cpustate->a |= ram_r(reg_r(1)); return 1; }
-OPHANDLER( orl_a_n ) { cpustate->a |= argument_fetch(cpustate); return 2; }
-
-OPHANDLER( orl_bus_n ) { bus_w(bus_r() | argument_fetch(cpustate)); return 2; }
-OPHANDLER( orl_p1_n ) { port_w(1, cpustate->p1 |= argument_fetch(cpustate)); return 2; }
-OPHANDLER( orl_p2_n ) { port_w(2, cpustate->p2 |= argument_fetch(cpustate)); return 2; }
-OPHANDLER( orld_p4_a ) { expander_operation(cpustate, MCS48_EXPANDER_OP_OR, 4); return 2; }
-OPHANDLER( orld_p5_a ) { expander_operation(cpustate, MCS48_EXPANDER_OP_OR, 5); return 2; }
-OPHANDLER( orld_p6_a ) { expander_operation(cpustate, MCS48_EXPANDER_OP_OR, 6); return 2; }
-OPHANDLER( orld_p7_a ) { expander_operation(cpustate, MCS48_EXPANDER_OP_OR, 7); return 2; }
-
-OPHANDLER( outl_bus_a ) { bus_w(cpustate->a); return 2; }
-OPHANDLER( outl_p1_a ) { port_w(1, cpustate->p1 = cpustate->a); return 2; }
-OPHANDLER( outl_p2_a ) { port_w(2, cpustate->p2 = cpustate->a); return 2; }
-
-OPHANDLER( ret ) { pull_pc(cpustate); return 2; }
-OPHANDLER( retr )
-{
- pull_pc_psw(cpustate);
-
- /* implicitly clear the IRQ in progress flip flop and re-check interrupts */
- cpustate->irq_in_progress = FALSE;
- return 2 + check_irqs(cpustate);
-}
-
-OPHANDLER( rl_a ) { cpustate->a = (cpustate->a << 1) | (cpustate->a >> 7); return 1; }
-OPHANDLER( rlc_a ) { UINT8 newc = cpustate->a & C_FLAG; cpustate->a = (cpustate->a << 1) | (cpustate->psw >> 7); cpustate->psw = (cpustate->psw & ~C_FLAG) | newc; return 1; }
-
-OPHANDLER( rr_a ) { cpustate->a = (cpustate->a >> 1) | (cpustate->a << 7); return 1; }
-OPHANDLER( rrc_a ) { UINT8 newc = (cpustate->a << 7) & C_FLAG; cpustate->a = (cpustate->a >> 1) | (cpustate->psw & C_FLAG); cpustate->psw = (cpustate->psw & ~C_FLAG) | newc; return 1; }
-
-OPHANDLER( sel_mb0 ) { cpustate->a11 = 0x000; return 1; }
-OPHANDLER( sel_mb1 ) { cpustate->a11 = 0x800; return 1; }
-
-OPHANDLER( sel_rb0 ) { cpustate->psw &= ~B_FLAG; update_regptr(cpustate); return 1; }
-OPHANDLER( sel_rb1 ) { cpustate->psw |= B_FLAG; update_regptr(cpustate); return 1; }
-
-OPHANDLER( stop_tcnt ) { cpustate->timecount_enabled = 0; return 1; }
-
-OPHANDLER( strt_cnt ) { cpustate->timecount_enabled = COUNTER_ENABLED; cpustate->t1_history = test_r(1); return 1; }
-OPHANDLER( strt_t ) { cpustate->timecount_enabled = TIMER_ENABLED; cpustate->prescaler = 0; return 1; }
-
-OPHANDLER( swap_a ) { cpustate->a = (cpustate->a << 4) | (cpustate->a >> 4); return 1; }
-
-OPHANDLER( xch_a_r0 ) { UINT8 tmp = cpustate->a; cpustate->a = reg_r(0); reg_w(0, tmp); return 1; }
-OPHANDLER( xch_a_r1 ) { UINT8 tmp = cpustate->a; cpustate->a = reg_r(1); reg_w(1, tmp); return 1; }
-OPHANDLER( xch_a_r2 ) { UINT8 tmp = cpustate->a; cpustate->a = reg_r(2); reg_w(2, tmp); return 1; }
-OPHANDLER( xch_a_r3 ) { UINT8 tmp = cpustate->a; cpustate->a = reg_r(3); reg_w(3, tmp); return 1; }
-OPHANDLER( xch_a_r4 ) { UINT8 tmp = cpustate->a; cpustate->a = reg_r(4); reg_w(4, tmp); return 1; }
-OPHANDLER( xch_a_r5 ) { UINT8 tmp = cpustate->a; cpustate->a = reg_r(5); reg_w(5, tmp); return 1; }
-OPHANDLER( xch_a_r6 ) { UINT8 tmp = cpustate->a; cpustate->a = reg_r(6); reg_w(6, tmp); return 1; }
-OPHANDLER( xch_a_r7 ) { UINT8 tmp = cpustate->a; cpustate->a = reg_r(7); reg_w(7, tmp); return 1; }
-OPHANDLER( xch_a_xr0 ) { UINT8 r0 = reg_r(0); UINT8 tmp = cpustate->a; cpustate->a = ram_r(r0); ram_w(r0, tmp); return 1; }
-OPHANDLER( xch_a_xr1 ) { UINT8 r1 = reg_r(1); UINT8 tmp = cpustate->a; cpustate->a = ram_r(r1); ram_w(r1, tmp); return 1; }
-
-OPHANDLER( xchd_a_xr0 ) { UINT8 r0 = reg_r(0); UINT8 oldram = ram_r(r0); ram_w(r0, (oldram & 0xf0) | (cpustate->a & 0x0f)); cpustate->a = (cpustate->a & 0xf0) | (oldram & 0x0f); return 1; }
-OPHANDLER( xchd_a_xr1 ) { UINT8 r1 = reg_r(1); UINT8 oldram = ram_r(r1); ram_w(r1, (oldram & 0xf0) | (cpustate->a & 0x0f)); cpustate->a = (cpustate->a & 0xf0) | (oldram & 0x0f); return 1; }
-
-OPHANDLER( xrl_a_r0 ) { cpustate->a ^= reg_r(0); return 1; }
-OPHANDLER( xrl_a_r1 ) { cpustate->a ^= reg_r(1); return 1; }
-OPHANDLER( xrl_a_r2 ) { cpustate->a ^= reg_r(2); return 1; }
-OPHANDLER( xrl_a_r3 ) { cpustate->a ^= reg_r(3); return 1; }
-OPHANDLER( xrl_a_r4 ) { cpustate->a ^= reg_r(4); return 1; }
-OPHANDLER( xrl_a_r5 ) { cpustate->a ^= reg_r(5); return 1; }
-OPHANDLER( xrl_a_r6 ) { cpustate->a ^= reg_r(6); return 1; }
-OPHANDLER( xrl_a_r7 ) { cpustate->a ^= reg_r(7); return 1; }
-OPHANDLER( xrl_a_xr0 ) { cpustate->a ^= ram_r(reg_r(0)); return 1; }
-OPHANDLER( xrl_a_xr1 ) { cpustate->a ^= ram_r(reg_r(1)); return 1; }
-OPHANDLER( xrl_a_n ) { cpustate->a ^= argument_fetch(cpustate); return 2; }
-
-/***************************************************************************
- OPCODE TABLES
-***************************************************************************/
-
-static const mcs48_ophandler opcode_table[256]=
-{
- nop, illegal, outl_bus_a,add_a_n, jmp_0, en_i, illegal, dec_a, /* 00 */
- ins_a_bus, in_a_p1, in_a_p2, illegal, movd_a_p4, movd_a_p5, movd_a_p6, movd_a_p7,
- inc_xr0, inc_xr1, jb_0, adc_a_n, call_0, dis_i, jtf, inc_a, /* 10 */
- inc_r0, inc_r1, inc_r2, inc_r3, inc_r4, inc_r5, inc_r6, inc_r7,
- xch_a_xr0, xch_a_xr1, illegal, mov_a_n, jmp_1, en_tcnti, jnt_0, clr_a, /* 20 */
- xch_a_r0, xch_a_r1, xch_a_r2, xch_a_r3, xch_a_r4, xch_a_r5, xch_a_r6, xch_a_r7,
- xchd_a_xr0, xchd_a_xr1, jb_1, illegal, call_1, dis_tcnti, jt_0, cpl_a, /* 30 */
- illegal, outl_p1_a, outl_p2_a, illegal, movd_p4_a, movd_p5_a, movd_p6_a, movd_p7_a,
- orl_a_xr0, orl_a_xr1, mov_a_t, orl_a_n, jmp_2, strt_cnt, jnt_1, swap_a, /* 40 */
- orl_a_r0, orl_a_r1, orl_a_r2, orl_a_r3, orl_a_r4, orl_a_r5, orl_a_r6, orl_a_r7,
- anl_a_xr0, anl_a_xr1, jb_2, anl_a_n, call_2, strt_t, jt_1, da_a, /* 50 */
- anl_a_r0, anl_a_r1, anl_a_r2, anl_a_r3, anl_a_r4, anl_a_r5, anl_a_r6, anl_a_r7,
- add_a_xr0, add_a_xr1, mov_t_a, illegal, jmp_3, stop_tcnt, illegal, rrc_a, /* 60 */
- add_a_r0, add_a_r1, add_a_r2, add_a_r3, add_a_r4, add_a_r5, add_a_r6, add_a_r7,
- adc_a_xr0, adc_a_xr1, jb_3, illegal, call_3, ent0_clk, jf1, rr_a, /* 70 */
- adc_a_r0, adc_a_r1, adc_a_r2, adc_a_r3, adc_a_r4, adc_a_r5, adc_a_r6, adc_a_r7,
- movx_a_xr0, movx_a_xr1, illegal, ret, jmp_4, clr_f0, jni, illegal, /* 80 */
- orl_bus_n, orl_p1_n, orl_p2_n, illegal, orld_p4_a, orld_p5_a, orld_p6_a, orld_p7_a,
- movx_xr0_a, movx_xr1_a, jb_4, retr, call_4, cpl_f0, jnz, clr_c, /* 90 */
- anl_bus_n, anl_p1_n, anl_p2_n, illegal, anld_p4_a, anld_p5_a, anld_p6_a, anld_p7_a,
- mov_xr0_a, mov_xr1_a, illegal, movp_a_xa, jmp_5, clr_f1, illegal, cpl_c, /* A0 */
- mov_r0_a, mov_r1_a, mov_r2_a, mov_r3_a, mov_r4_a, mov_r5_a, mov_r6_a, mov_r7_a,
- mov_xr0_n, mov_xr1_n, jb_5, jmpp_xa, call_5, cpl_f1, jf0, illegal, /* B0 */
- mov_r0_n, mov_r1_n, mov_r2_n, mov_r3_n, mov_r4_n, mov_r5_n, mov_r6_n, mov_r7_n,
- illegal, illegal, illegal, illegal, jmp_6, sel_rb0, jz, mov_a_psw, /* C0 */
- dec_r0, dec_r1, dec_r2, dec_r3, dec_r4, dec_r5, dec_r6, dec_r7,
- xrl_a_xr0, xrl_a_xr1, jb_6, xrl_a_n, call_6, sel_rb1, illegal, mov_psw_a, /* D0 */
- xrl_a_r0, xrl_a_r1, xrl_a_r2, xrl_a_r3, xrl_a_r4, xrl_a_r5, xrl_a_r6, xrl_a_r7,
- illegal, illegal, illegal, movp3_a_xa,jmp_7, sel_mb0, jnc, rl_a, /* E0 */
- djnz_r0, djnz_r1, djnz_r2, djnz_r3, djnz_r4, djnz_r5, djnz_r6, djnz_r7,
- mov_a_xr0, mov_a_xr1, jb_7, illegal, call_7, sel_mb1, jc, rlc_a, /* F0 */
- mov_a_r0, mov_a_r1, mov_a_r2, mov_a_r3, mov_a_r4, mov_a_r5, mov_a_r6, mov_a_r7
-};
-
/***************************************************************************
INITIALIZATION/RESET
***************************************************************************/
free(opaque);
}
-void MCS48::reset()
-{
- mcs48_state *cpustate = (mcs48_state *)opaque;
-
- /* confirmed from reset description */
- cpustate->pc = 0;
- cpustate->psw = (cpustate->psw & (C_FLAG | A_FLAG)) | 0x08;
- cpustate->a11 = 0x000;
-// bus_w(0xff);
- cpustate->p1 = 0xff;
- cpustate->p2 = 0xff;
-// port_w(1, cpustate->p1);
-// port_w(2, cpustate->p2);
- cpustate->tirq_enabled = FALSE;
- cpustate->xirq_enabled = FALSE;
- cpustate->t0_clk_enabled = FALSE;
- cpustate->timecount_enabled = 0;
- cpustate->timer_flag = FALSE;
- cpustate->sts = 0;
-
- cpustate->icount = 0;
-
- /* confirmed from interrupt logic description */
- cpustate->int_state = TRUE;
- cpustate->irq_state = cpustate->irq_in_progress = FALSE;
- cpustate->timer_overflow = FALSE;
-}
-
-void MCS48::load_rom_image(const _TCHAR *file_path)
-{
- mcs48_state *cpustate = (mcs48_state *)opaque;
-
- memset(cpustate->rom, 0, sizeof(cpustate->rom));
-
- FILEIO* fio = new FILEIO();
- if(fio->Fopen(file_path, FILEIO_READ_BINARY)) {
- fio->Fread(cpustate->rom, sizeof(cpustate->rom), 1);
- fio->Fclose();
- }
- delete fio;
-}
-
-uint8_t *MCS48::get_rom_ptr()
-{
- mcs48_state *cpustate = (mcs48_state *)opaque;
- return cpustate->rom;
-}
-
/***************************************************************************
EXECUTION
***************************************************************************/
-/*-------------------------------------------------
- check_irqs - check for and process IRQs
--------------------------------------------------*/
-
-static int check_irqs(mcs48_state *cpustate)
-{
- /* if something is in progress, we do nothing */
- if (cpustate->irq_in_progress)
- return 0;
-
- /* external interrupts take priority */
- if (cpustate->irq_state && cpustate->xirq_enabled)
- {
- cpustate->irq_state = FALSE;
- cpustate->irq_in_progress = TRUE;
-
- /* transfer to location 0x03 */
- push_pc_psw(cpustate);
- cpustate->pc = 0x03;
-
- /* indicate we took the external IRQ */
- if (cpustate->intr != NULL)
- cpustate->intr->get_intr_ack();
- return 2;
- }
-
- /* timer overflow interrupts follow */
- if (cpustate->timer_overflow && cpustate->tirq_enabled)
- {
- cpustate->irq_in_progress = TRUE;
-
- /* transfer to location 0x07 */
- push_pc_psw(cpustate);
- cpustate->pc = 0x07;
-
- /* timer overflow flip-flop is reset once taken */
- cpustate->timer_overflow = FALSE;
- return 2;
- }
- return 0;
-}
/*-------------------------------------------------
burn_cycles - burn cycles, processing timers
and counters
-------------------------------------------------*/
-static void burn_cycles(mcs48_state *cpustate, int count)
+void MCS48::burn_cycles(mcs48_state *cpustate, int count)
{
int timerover = FALSE;
{
for(int i = 0; i < count * 5; i++)
{
- test_w(0, 1);
- test_w(0, 0);
+ __mcs48_test_w(0, 1);
+ __mcs48_test_w(0, 0);
}
}
/* if the timer is enabled, accumulate prescaler cycles */
- if (cpustate->timecount_enabled & TIMER_ENABLED)
+ if (cpustate->timecount_enabled & __MCS48_TIMER_ENABLED)
{
UINT8 oldtimer = cpustate->timer;
cpustate->prescaler += count;
}
/* if the counter is enabled, poll the T1 test input once for each cycle */
- else if (cpustate->timecount_enabled & COUNTER_ENABLED)
+ else if (cpustate->timecount_enabled & __MCS48_COUNTER_ENABLED)
for ( ; count > 0; count--)
{
- cpustate->t1_history = (cpustate->t1_history << 1) | (test_r(1) & 1);
+ cpustate->t1_history = (cpustate->t1_history << 1) | (__mcs48_test_r(1) & 1);
if ((cpustate->t1_history & 3) == 2)
timerover = (++cpustate->timer == 0);
}
/* fetch next opcode */
cpustate->prevpc = cpustate->pc;
- unsigned opcode = opcode_fetch(cpustate);
-
- /* process opcode and count cycles */
- curcycles = (*opcode_table[opcode])(cpustate);
+ curcycles = op_call(cpustate);
/* burn the cycles */
cpustate->icount -= curcycles * 15;
#endif
/* fetch next opcode */
cpustate->prevpc = cpustate->pc;
- unsigned opcode = opcode_fetch(cpustate);
-
- /* process opcode and count cycles */
- curcycles = (*opcode_table[opcode])(cpustate);
+ curcycles = op_call(cpustate);
/* burn the cycles */
cpustate->icount -= curcycles * 15;
return base_icount - cpustate->icount;
}
-uint32_t MCS48::get_pc()
-{
- mcs48_state *cpustate = (mcs48_state *)opaque;
- return cpustate->prevpc;
-}
-
-uint32_t MCS48::get_next_pc()
-{
- mcs48_state *cpustate = (mcs48_state *)opaque;
- return cpustate->pc;
-}
-
-/***************************************************************************
- GENERAL CONTEXT ACCESS
-***************************************************************************/
-
-void MCS48::write_signal(int id, uint32_t data, uint32_t mask)
-{
- mcs48_state *cpustate = (mcs48_state *)opaque;
-
- if(id == SIG_CPU_IRQ) {
- UINT8 prev = cpustate->int_state;
- cpustate->int_state = ((data & mask) != 0);
- // INT H->L
- if(prev && !cpustate->int_state) {
- cpustate->irq_state = TRUE;
- }
- }
-}
-
-#ifdef USE_DEBUGGER
-void MCS48::write_debug_data8(uint32_t addr, uint32_t data)
-{
- d_mem_stored->write_data8(addr, data);
-}
-
-uint32_t MCS48::read_debug_data8(uint32_t addr)
-{
- return d_mem_stored->read_data8(addr);
-}
-
-void MCS48::write_debug_io8(uint32_t addr, uint32_t data)
-{
- d_io_stored->write_io8(addr, data);
-}
-
-uint32_t MCS48::read_debug_io8(uint32_t addr)
-{
- return d_io_stored->read_io8(addr);
-}
-
-bool MCS48::write_debug_reg(const _TCHAR *reg, uint32_t data)
-{
- mcs48_state *cpustate = (mcs48_state *)opaque;
-
- if(_tcsicmp(reg, _T("R0")) == 0) {
- reg_w(0, data);
- } else if(_tcsicmp(reg, _T("R1")) == 0) {
- reg_w(1, data);
- } else if(_tcsicmp(reg, _T("R2")) == 0) {
- reg_w(2, data);
- } else if(_tcsicmp(reg, _T("R3")) == 0) {
- reg_w(3, data);
- } else if(_tcsicmp(reg, _T("R4")) == 0) {
- reg_w(4, data);
- } else if(_tcsicmp(reg, _T("R5")) == 0) {
- reg_w(5, data);
- } else if(_tcsicmp(reg, _T("R6")) == 0) {
- reg_w(6, data);
- } else if(_tcsicmp(reg, _T("R7")) == 0) {
- reg_w(7, data);
- } else {
- return false;
- }
- return true;
-}
-
-void MCS48::get_debug_regs_info(_TCHAR *buffer, size_t buffer_len)
-{
-/*
-R0 = 00 R1 = 00 R2 = 00 R3 = 00 (R0)= 00 (R1)= 00 (SP-1)= 0000 PC = 0000
-R4 = 00 R5 = 00 R6 = 00 R7 = 00 AC = 00 SP = 00 [MB F1 C AC F0 BS]
-*/
- mcs48_state *cpustate = (mcs48_state *)opaque;
- UINT8 sp = 8 + 2 * (cpustate->psw & 7);
- UINT8 prev_sp = 8 + 2 * ((cpustate->psw - 1) & 7);
-
- my_stprintf_s(buffer, buffer_len,
- _T("R0 = %02X R1 = %02X R2 = %02X R3 = %02X (R0)= %02X (R1)= %02X (SP-1)= %04X PC = %04X\nR4 = %02X R5 = %02X R6 = %02X R7 = %02X AC = %02X SP = %02X [%s %s %s %s %s %s]"),
- reg_r(0), reg_r(1), reg_r(2), reg_r(3), d_mem_stored->read_data8(reg_r(0)), d_mem_stored->read_data8(reg_r(1)),
- d_mem_stored->read_data8(prev_sp) | (d_mem_stored->read_data8(prev_sp + 1) << 8), cpustate->pc,
- reg_r(4), reg_r(5), reg_r(6), reg_r(7), cpustate->a, sp,
- (cpustate->a11 == 0x800) ? _T("MB") : _T("--"), (cpustate->sts & STS_F1) ? _T("F1") : _T("--"),
- (cpustate->psw & C_FLAG) ? _T("C" ) : _T("-" ), (cpustate->psw & A_FLAG) ? _T("AC") : _T("--"),
- (cpustate->psw & F_FLAG) ? _T("F0") : _T("--"), (cpustate->psw & B_FLAG) ? _T("BS") : _T("--"));
-}
-
-// license:BSD-3-Clause
-// copyright-holders:Aaron Giles
-/***************************************************************************
-
- mcs48dsm.c
-
- Simple MCS-48/UPI-41 disassembler.
- Written by Aaron Giles
-
-***************************************************************************/
-
-int MCS48::debug_dasm(uint32_t pc, _TCHAR *buffer, size_t buffer_len)
-{
- mcs48_state *cpustate = (mcs48_state *)opaque;
- uint32_t ptr = pc;
-
- #define upi41 false
-
- switch (program_r(ptr++))
- {
- case 0x00: my_stprintf_s(buffer, buffer_len, _T("nop")); break;
- case 0x02: if (!upi41)
- my_stprintf_s(buffer, buffer_len, _T("out bus,a"));
- else
- my_stprintf_s(buffer, buffer_len, _T("out dbb,a")); break;
- case 0x03: my_stprintf_s(buffer, buffer_len, _T("add a,#$%02X"), program_r(ptr++)); break;
- case 0x04: my_stprintf_s(buffer, buffer_len, _T("jmp %s"), get_value_or_symbol(d_debugger->first_symbol, _T("$%03X"), 0x000 | program_r(ptr++))); break;
- case 0x05: my_stprintf_s(buffer, buffer_len, _T("en i")); break;
- case 0x07: my_stprintf_s(buffer, buffer_len, _T("dec a")); break;
- case 0x08: if (!upi41)
- my_stprintf_s(buffer, buffer_len, _T("in a,bus"));
- else
- my_stprintf_s(buffer, buffer_len, _T("illegal")); break;
- case 0x09: my_stprintf_s(buffer, buffer_len, _T("in a,p1")); break;
- case 0x0a: my_stprintf_s(buffer, buffer_len, _T("in a,p2")); break;
- case 0x0c: my_stprintf_s(buffer, buffer_len, _T("movd a,p4")); break;
- case 0x0d: my_stprintf_s(buffer, buffer_len, _T("movd a,p5")); break;
- case 0x0e: my_stprintf_s(buffer, buffer_len, _T("movd a,p6")); break;
- case 0x0f: my_stprintf_s(buffer, buffer_len, _T("movd a,p7")); break;
- case 0x10: my_stprintf_s(buffer, buffer_len, _T("inc @r0")); break;
- case 0x11: my_stprintf_s(buffer, buffer_len, _T("inc @r1")); break;
- case 0x12: my_stprintf_s(buffer, buffer_len, _T("jb0 %s"), get_value_or_symbol(d_debugger->first_symbol, _T("$%03X"), (pc & 0xf00) | program_r(ptr++))); break;
- case 0x13: my_stprintf_s(buffer, buffer_len, _T("addc a,#$%02X"), program_r(ptr++)); break;
- case 0x14: my_stprintf_s(buffer, buffer_len, _T("call %s"), get_value_or_symbol(d_debugger->first_symbol, _T("$%03X"), 0x000 | program_r(ptr++))); break;
- case 0x15: my_stprintf_s(buffer, buffer_len, _T("dis i")); break;
- case 0x16: my_stprintf_s(buffer, buffer_len, _T("jtf %s"), get_value_or_symbol(d_debugger->first_symbol, _T("$%03X"), (pc & 0xf00) | program_r(ptr++))); break;
- case 0x17: my_stprintf_s(buffer, buffer_len, _T("inc a")); break;
- case 0x18: my_stprintf_s(buffer, buffer_len, _T("inc r0")); break;
- case 0x19: my_stprintf_s(buffer, buffer_len, _T("inc r1")); break;
- case 0x1a: my_stprintf_s(buffer, buffer_len, _T("inc r2")); break;
- case 0x1b: my_stprintf_s(buffer, buffer_len, _T("inc r3")); break;
- case 0x1c: my_stprintf_s(buffer, buffer_len, _T("inc r4")); break;
- case 0x1d: my_stprintf_s(buffer, buffer_len, _T("inc r5")); break;
- case 0x1e: my_stprintf_s(buffer, buffer_len, _T("inc r6")); break;
- case 0x1f: my_stprintf_s(buffer, buffer_len, _T("inc r7")); break;
- case 0x20: my_stprintf_s(buffer, buffer_len, _T("xch a,@r0")); break;
- case 0x21: my_stprintf_s(buffer, buffer_len, _T("xch a,@r1")); break;
- case 0x22: if (!upi41)
- my_stprintf_s(buffer, buffer_len, _T("illegal"));
- else
- my_stprintf_s(buffer, buffer_len, _T("in a,dbb")); break;
- case 0x23: my_stprintf_s(buffer, buffer_len, _T("mov a,#$%02X"), program_r(ptr++)); break;
- case 0x24: my_stprintf_s(buffer, buffer_len, _T("jmp %s"), get_value_or_symbol(d_debugger->first_symbol, _T("$%03X"), 0x100 | program_r(ptr++))); break;
- case 0x25: my_stprintf_s(buffer, buffer_len, _T("en tcnti")); break;
- case 0x26: my_stprintf_s(buffer, buffer_len, _T("jnt0 %s"), get_value_or_symbol(d_debugger->first_symbol, _T("$%03X"), (pc & 0xf00) | program_r(ptr++))); break;
- case 0x27: my_stprintf_s(buffer, buffer_len, _T("clr a")); break;
- case 0x28: my_stprintf_s(buffer, buffer_len, _T("xch a,r0")); break;
- case 0x29: my_stprintf_s(buffer, buffer_len, _T("xch a,r1")); break;
- case 0x2a: my_stprintf_s(buffer, buffer_len, _T("xch a,r2")); break;
- case 0x2b: my_stprintf_s(buffer, buffer_len, _T("xch a,r3")); break;
- case 0x2c: my_stprintf_s(buffer, buffer_len, _T("xch a,r4")); break;
- case 0x2d: my_stprintf_s(buffer, buffer_len, _T("xch a,r5")); break;
- case 0x2e: my_stprintf_s(buffer, buffer_len, _T("xch a,r6")); break;
- case 0x2f: my_stprintf_s(buffer, buffer_len, _T("xch a,r7")); break;
- case 0x30: my_stprintf_s(buffer, buffer_len, _T("xchd a,@r0")); break;
- case 0x31: my_stprintf_s(buffer, buffer_len, _T("xchd a,@r1")); break;
- case 0x32: my_stprintf_s(buffer, buffer_len, _T("jb1 %s"), get_value_or_symbol(d_debugger->first_symbol, _T("$%03X"), (pc & 0xf00) | program_r(ptr++))); break;
- case 0x34: my_stprintf_s(buffer, buffer_len, _T("call %s"), get_value_or_symbol(d_debugger->first_symbol, _T("$%03X"), 0x100 | program_r(ptr++))); break;
- case 0x35: my_stprintf_s(buffer, buffer_len, _T("dis tcnti")); break;
- case 0x36: my_stprintf_s(buffer, buffer_len, _T("jt0 %s"), get_value_or_symbol(d_debugger->first_symbol, _T("$%03X"), (pc & 0xf00) | program_r(ptr++))); break;
- case 0x37: my_stprintf_s(buffer, buffer_len, _T("cpl a")); break;
- case 0x39: my_stprintf_s(buffer, buffer_len, _T("outl p1,a")); break;
- case 0x3a: my_stprintf_s(buffer, buffer_len, _T("outl p2,a")); break;
- case 0x3c: my_stprintf_s(buffer, buffer_len, _T("movd p4,a")); break;
- case 0x3d: my_stprintf_s(buffer, buffer_len, _T("movd p5,a")); break;
- case 0x3e: my_stprintf_s(buffer, buffer_len, _T("movd p6,a")); break;
- case 0x3f: my_stprintf_s(buffer, buffer_len, _T("movd p7,a")); break;
- case 0x40: my_stprintf_s(buffer, buffer_len, _T("orl a,@r0")); break;
- case 0x41: my_stprintf_s(buffer, buffer_len, _T("orl a,@r1")); break;
- case 0x42: my_stprintf_s(buffer, buffer_len, _T("mov a,t")); break;
- case 0x43: my_stprintf_s(buffer, buffer_len, _T("orl a,#$%02X"), program_r(ptr++)); break;
- case 0x44: my_stprintf_s(buffer, buffer_len, _T("jmp %s"), get_value_or_symbol(d_debugger->first_symbol, _T("$%03X"), 0x200 | program_r(ptr++))); break;
- case 0x45: my_stprintf_s(buffer, buffer_len, _T("strt cnt")); break;
- case 0x46: my_stprintf_s(buffer, buffer_len, _T("jnt1 %s"), get_value_or_symbol(d_debugger->first_symbol, _T("$%03X"), (pc & 0xf00) | program_r(ptr++))); break;
- case 0x47: my_stprintf_s(buffer, buffer_len, _T("swap a")); break;
- case 0x48: my_stprintf_s(buffer, buffer_len, _T("orl a,r0")); break;
- case 0x49: my_stprintf_s(buffer, buffer_len, _T("orl a,r1")); break;
- case 0x4a: my_stprintf_s(buffer, buffer_len, _T("orl a,r2")); break;
- case 0x4b: my_stprintf_s(buffer, buffer_len, _T("orl a,r3")); break;
- case 0x4c: my_stprintf_s(buffer, buffer_len, _T("orl a,r4")); break;
- case 0x4d: my_stprintf_s(buffer, buffer_len, _T("orl a,r5")); break;
- case 0x4e: my_stprintf_s(buffer, buffer_len, _T("orl a,r6")); break;
- case 0x4f: my_stprintf_s(buffer, buffer_len, _T("orl a,r7")); break;
- case 0x50: my_stprintf_s(buffer, buffer_len, _T("anl a,@r0")); break;
- case 0x51: my_stprintf_s(buffer, buffer_len, _T("anl a,@r1")); break;
- case 0x52: my_stprintf_s(buffer, buffer_len, _T("jb2 %s"), get_value_or_symbol(d_debugger->first_symbol, _T("$%03X"), (pc & 0xf00) | program_r(ptr++))); break;
- case 0x53: my_stprintf_s(buffer, buffer_len, _T("anl a,#$%02X"), program_r(ptr++)); break;
- case 0x54: my_stprintf_s(buffer, buffer_len, _T("call %s"), get_value_or_symbol(d_debugger->first_symbol, _T("$%03X"), 0x200 | program_r(ptr++))); break;
- case 0x55: my_stprintf_s(buffer, buffer_len, _T("strt t")); break;
- case 0x56: my_stprintf_s(buffer, buffer_len, _T("jt1 %s"), get_value_or_symbol(d_debugger->first_symbol, _T("$%03X"), (pc & 0xf00) | program_r(ptr++))); break;
- case 0x57: my_stprintf_s(buffer, buffer_len, _T("da a")); break;
- case 0x58: my_stprintf_s(buffer, buffer_len, _T("anl a,r0")); break;
- case 0x59: my_stprintf_s(buffer, buffer_len, _T("anl a,r1")); break;
- case 0x5a: my_stprintf_s(buffer, buffer_len, _T("anl a,r2")); break;
- case 0x5b: my_stprintf_s(buffer, buffer_len, _T("anl a,r3")); break;
- case 0x5c: my_stprintf_s(buffer, buffer_len, _T("anl a,r4")); break;
- case 0x5d: my_stprintf_s(buffer, buffer_len, _T("anl a,r5")); break;
- case 0x5e: my_stprintf_s(buffer, buffer_len, _T("anl a,r6")); break;
- case 0x5f: my_stprintf_s(buffer, buffer_len, _T("anl a,r7")); break;
- case 0x60: my_stprintf_s(buffer, buffer_len, _T("add a,@r0")); break;
- case 0x61: my_stprintf_s(buffer, buffer_len, _T("add a,@r1")); break;
- case 0x62: my_stprintf_s(buffer, buffer_len, _T("mov t,a")); break;
- case 0x64: my_stprintf_s(buffer, buffer_len, _T("jmp %s"), get_value_or_symbol(d_debugger->first_symbol, _T("$%03X"), 0x300 | program_r(ptr++))); break;
- case 0x65: my_stprintf_s(buffer, buffer_len, _T("stop tcnt")); break;
- case 0x67: my_stprintf_s(buffer, buffer_len, _T("rrc a")); break;
- case 0x68: my_stprintf_s(buffer, buffer_len, _T("add a,r0")); break;
- case 0x69: my_stprintf_s(buffer, buffer_len, _T("add a,r1")); break;
- case 0x6a: my_stprintf_s(buffer, buffer_len, _T("add a,r2")); break;
- case 0x6b: my_stprintf_s(buffer, buffer_len, _T("add a,r3")); break;
- case 0x6c: my_stprintf_s(buffer, buffer_len, _T("add a,r4")); break;
- case 0x6d: my_stprintf_s(buffer, buffer_len, _T("add a,r5")); break;
- case 0x6e: my_stprintf_s(buffer, buffer_len, _T("add a,r6")); break;
- case 0x6f: my_stprintf_s(buffer, buffer_len, _T("add a,r7")); break;
- case 0x70: my_stprintf_s(buffer, buffer_len, _T("addc a,@r0")); break;
- case 0x71: my_stprintf_s(buffer, buffer_len, _T("addc a,@r1")); break;
- case 0x72: my_stprintf_s(buffer, buffer_len, _T("jb3 %s"), get_value_or_symbol(d_debugger->first_symbol, _T("$%03X"), (pc & 0xf00) | program_r(ptr++))); break;
- case 0x74: my_stprintf_s(buffer, buffer_len, _T("call %s"), get_value_or_symbol(d_debugger->first_symbol, _T("$%03X"), 0x300 | program_r(ptr++))); break;
- case 0x75: if (!upi41)
- my_stprintf_s(buffer, buffer_len, _T("ent0 clk"));
- else
- my_stprintf_s(buffer, buffer_len, _T("illegal")); break;
- case 0x76: my_stprintf_s(buffer, buffer_len, _T("jf1 %s"), get_value_or_symbol(d_debugger->first_symbol, _T("$%03X"), (pc & 0xf00) | program_r(ptr++))); break;
- case 0x77: my_stprintf_s(buffer, buffer_len, _T("rr a")); break;
- case 0x78: my_stprintf_s(buffer, buffer_len, _T("addc a,r0")); break;
- case 0x79: my_stprintf_s(buffer, buffer_len, _T("addc a,r1")); break;
- case 0x7a: my_stprintf_s(buffer, buffer_len, _T("addc a,r2")); break;
- case 0x7b: my_stprintf_s(buffer, buffer_len, _T("addc a,r3")); break;
- case 0x7c: my_stprintf_s(buffer, buffer_len, _T("addc a,r4")); break;
- case 0x7d: my_stprintf_s(buffer, buffer_len, _T("addc a,r5")); break;
- case 0x7e: my_stprintf_s(buffer, buffer_len, _T("addc a,r6")); break;
- case 0x7f: my_stprintf_s(buffer, buffer_len, _T("addc a,r7")); break;
- case 0x80: if (!upi41)
- my_stprintf_s(buffer, buffer_len, _T("movx a,@r0"));
- else
- my_stprintf_s(buffer, buffer_len, _T("illegal")); break;
- case 0x81: if (!upi41)
- my_stprintf_s(buffer, buffer_len, _T("movx a,@r1"));
- else
- my_stprintf_s(buffer, buffer_len, _T("illegal")); break;
- case 0x83: my_stprintf_s(buffer, buffer_len, _T("ret")); break;
- case 0x84: my_stprintf_s(buffer, buffer_len, _T("jmp %s"), get_value_or_symbol(d_debugger->first_symbol, _T("$%03X"), 0x400 | program_r(ptr++))); break;
- case 0x85: my_stprintf_s(buffer, buffer_len, _T("clr f0")); break;
- case 0x86: if (!upi41)
- my_stprintf_s(buffer, buffer_len, _T("jni %s"), get_value_or_symbol(d_debugger->first_symbol, _T("$%03X"), (pc & 0xf00) | program_r(ptr++)));
- else
- my_stprintf_s(buffer, buffer_len, _T("jobf %s"), get_value_or_symbol(d_debugger->first_symbol, _T("$%03X"), (pc & 0xf00) | program_r(ptr++))); break;
- case 0x88: if (!upi41)
- my_stprintf_s(buffer, buffer_len, _T("orl bus,#$%02X"), program_r(ptr++));
- else
- my_stprintf_s(buffer, buffer_len, _T("illegal")); break;
- case 0x89: my_stprintf_s(buffer, buffer_len, _T("orl p1,#$%02X"), program_r(ptr++)); break;
- case 0x8a: my_stprintf_s(buffer, buffer_len, _T("orl p2,#$%02X"), program_r(ptr++)); break;
- case 0x8c: my_stprintf_s(buffer, buffer_len, _T("orld p4,a")); break;
- case 0x8d: my_stprintf_s(buffer, buffer_len, _T("orld p5,a")); break;
- case 0x8e: my_stprintf_s(buffer, buffer_len, _T("orld p6,a")); break;
- case 0x8f: my_stprintf_s(buffer, buffer_len, _T("orld p7,a")); break;
- case 0x90: if (!upi41)
- my_stprintf_s(buffer, buffer_len, _T("movx @r0,a"));
- else
- my_stprintf_s(buffer, buffer_len, _T("mov sts,a")); break;
- case 0x91: if (!upi41)
- my_stprintf_s(buffer, buffer_len, _T("movx @r1,a"));
- else
- my_stprintf_s(buffer, buffer_len, _T("illegal")); break;
- case 0x92: my_stprintf_s(buffer, buffer_len, _T("jb4 %s"), get_value_or_symbol(d_debugger->first_symbol, _T("$%03X"), (pc & 0xf00) | program_r(ptr++))); break;
- case 0x93: my_stprintf_s(buffer, buffer_len, _T("retr")); break;
- case 0x94: my_stprintf_s(buffer, buffer_len, _T("call %s"), get_value_or_symbol(d_debugger->first_symbol, _T("$%03X"), 0x400 | program_r(ptr++))); break;
- case 0x95: my_stprintf_s(buffer, buffer_len, _T("cpl f0")); break;
- case 0x96: my_stprintf_s(buffer, buffer_len, _T("jnz %s"), get_value_or_symbol(d_debugger->first_symbol, _T("$%03X"), (pc & 0xf00) | program_r(ptr++))); break;
- case 0x97: my_stprintf_s(buffer, buffer_len, _T("clr c")); break;
- case 0x98: if (!upi41)
- my_stprintf_s(buffer, buffer_len, _T("anl bus,#$%02X"), program_r(ptr++));
- else
- my_stprintf_s(buffer, buffer_len, _T("illegal")); break;
- case 0x99: my_stprintf_s(buffer, buffer_len, _T("anl p1,#$%02X"), program_r(ptr++)); break;
- case 0x9a: my_stprintf_s(buffer, buffer_len, _T("anl p2,#$%02X"), program_r(ptr++)); break;
- case 0x9c: my_stprintf_s(buffer, buffer_len, _T("anld p4,a")); break;
- case 0x9d: my_stprintf_s(buffer, buffer_len, _T("anld p5,a")); break;
- case 0x9e: my_stprintf_s(buffer, buffer_len, _T("anld p6,a")); break;
- case 0x9f: my_stprintf_s(buffer, buffer_len, _T("anld p7,a")); break;
- case 0xa0: my_stprintf_s(buffer, buffer_len, _T("mov @r0,a")); break;
- case 0xa1: my_stprintf_s(buffer, buffer_len, _T("mov @r1,a")); break;
- case 0xa3: my_stprintf_s(buffer, buffer_len, _T("movp a,@a")); break;
- case 0xa4: my_stprintf_s(buffer, buffer_len, _T("jmp %s"), get_value_or_symbol(d_debugger->first_symbol, _T("$%03X"), 0x500 | program_r(ptr++))); break;
- case 0xa5: my_stprintf_s(buffer, buffer_len, _T("clr f1")); break;
- case 0xa7: my_stprintf_s(buffer, buffer_len, _T("cpl c")); break;
- case 0xa8: my_stprintf_s(buffer, buffer_len, _T("mov r0,a")); break;
- case 0xa9: my_stprintf_s(buffer, buffer_len, _T("mov r1,a")); break;
- case 0xaa: my_stprintf_s(buffer, buffer_len, _T("mov r2,a")); break;
- case 0xab: my_stprintf_s(buffer, buffer_len, _T("mov r3,a")); break;
- case 0xac: my_stprintf_s(buffer, buffer_len, _T("mov r4,a")); break;
- case 0xad: my_stprintf_s(buffer, buffer_len, _T("mov r5,a")); break;
- case 0xae: my_stprintf_s(buffer, buffer_len, _T("mov r6,a")); break;
- case 0xaf: my_stprintf_s(buffer, buffer_len, _T("mov r7,a")); break;
- case 0xb0: my_stprintf_s(buffer, buffer_len, _T("mov @r0,#$%02X"), program_r(ptr++)); break;
- case 0xb1: my_stprintf_s(buffer, buffer_len, _T("mov @r1,#$%02X"), program_r(ptr++)); break;
- case 0xb2: my_stprintf_s(buffer, buffer_len, _T("jb5 %s"), get_value_or_symbol(d_debugger->first_symbol, _T("$%03X"), (pc & 0xf00) | program_r(ptr++))); break;
- case 0xb3: my_stprintf_s(buffer, buffer_len, _T("jmpp @a")); break;
- case 0xb4: my_stprintf_s(buffer, buffer_len, _T("call %s"), get_value_or_symbol(d_debugger->first_symbol, _T("$%03X"), 0x500 | program_r(ptr++))); break;
- case 0xb5: my_stprintf_s(buffer, buffer_len, _T("cpl f1")); break;
- case 0xb6: my_stprintf_s(buffer, buffer_len, _T("jf0 %s"), get_value_or_symbol(d_debugger->first_symbol, _T("$%03X"), (pc & 0xf00) | program_r(ptr++))); break;
- case 0xb8: my_stprintf_s(buffer, buffer_len, _T("mov r0,#$%02X"), program_r(ptr++)); break;
- case 0xb9: my_stprintf_s(buffer, buffer_len, _T("mov r1,#$%02X"), program_r(ptr++)); break;
- case 0xba: my_stprintf_s(buffer, buffer_len, _T("mov r2,#$%02X"), program_r(ptr++)); break;
- case 0xbb: my_stprintf_s(buffer, buffer_len, _T("mov r3,#$%02X"), program_r(ptr++)); break;
- case 0xbc: my_stprintf_s(buffer, buffer_len, _T("mov r4,#$%02X"), program_r(ptr++)); break;
- case 0xbd: my_stprintf_s(buffer, buffer_len, _T("mov r5,#$%02X"), program_r(ptr++)); break;
- case 0xbe: my_stprintf_s(buffer, buffer_len, _T("mov r6,#$%02X"), program_r(ptr++)); break;
- case 0xbf: my_stprintf_s(buffer, buffer_len, _T("mov r7,#$%02X"), program_r(ptr++)); break;
- case 0xc4: my_stprintf_s(buffer, buffer_len, _T("jmp %s"), get_value_or_symbol(d_debugger->first_symbol, _T("$%03X"), 0x600 | program_r(ptr++))); break;
- case 0xc5: my_stprintf_s(buffer, buffer_len, _T("sel rb0")); break;
- case 0xc6: my_stprintf_s(buffer, buffer_len, _T("jz %s"), get_value_or_symbol(d_debugger->first_symbol, _T("$%03X"), (pc & 0xf00) | program_r(ptr++))); break;
- case 0xc7: my_stprintf_s(buffer, buffer_len, _T("mov a,psw")); break;
- case 0xc8: my_stprintf_s(buffer, buffer_len, _T("dec r0")); break;
- case 0xc9: my_stprintf_s(buffer, buffer_len, _T("dec r1")); break;
- case 0xca: my_stprintf_s(buffer, buffer_len, _T("dec r2")); break;
- case 0xcb: my_stprintf_s(buffer, buffer_len, _T("dec r3")); break;
- case 0xcc: my_stprintf_s(buffer, buffer_len, _T("dec r4")); break;
- case 0xcd: my_stprintf_s(buffer, buffer_len, _T("dec r5")); break;
- case 0xce: my_stprintf_s(buffer, buffer_len, _T("dec r6")); break;
- case 0xcf: my_stprintf_s(buffer, buffer_len, _T("dec r7")); break;
- case 0xd0: my_stprintf_s(buffer, buffer_len, _T("xrl a,@r0")); break;
- case 0xd1: my_stprintf_s(buffer, buffer_len, _T("xrl a,@r1")); break;
- case 0xd2: my_stprintf_s(buffer, buffer_len, _T("jb6 %s"), get_value_or_symbol(d_debugger->first_symbol, _T("$%03X"), (pc & 0xf00) | program_r(ptr++))); break;
- case 0xd3: my_stprintf_s(buffer, buffer_len, _T("xrl a,#$%02X"), program_r(ptr++)); break;
- case 0xd4: my_stprintf_s(buffer, buffer_len, _T("call %s"), get_value_or_symbol(d_debugger->first_symbol, _T("$%03X"), 0x600 | program_r(ptr++))); break;
- case 0xd5: my_stprintf_s(buffer, buffer_len, _T("sel rb1")); break;
- case 0xd6: if (!upi41)
- my_stprintf_s(buffer, buffer_len, _T("illegal"));
- else
- my_stprintf_s(buffer, buffer_len, _T("jnibf %s"), get_value_or_symbol(d_debugger->first_symbol, _T("$%03X"), (pc & 0xf00) | program_r(ptr++))); break;
- case 0xd7: my_stprintf_s(buffer, buffer_len, _T("mov psw,a")); break;
- case 0xd8: my_stprintf_s(buffer, buffer_len, _T("xrl a,r0")); break;
- case 0xd9: my_stprintf_s(buffer, buffer_len, _T("xrl a,r1")); break;
- case 0xda: my_stprintf_s(buffer, buffer_len, _T("xrl a,r2")); break;
- case 0xdb: my_stprintf_s(buffer, buffer_len, _T("xrl a,r3")); break;
- case 0xdc: my_stprintf_s(buffer, buffer_len, _T("xrl a,r4")); break;
- case 0xdd: my_stprintf_s(buffer, buffer_len, _T("xrl a,r5")); break;
- case 0xde: my_stprintf_s(buffer, buffer_len, _T("xrl a,r6")); break;
- case 0xdf: my_stprintf_s(buffer, buffer_len, _T("xrl a,r7")); break;
- case 0xe3: my_stprintf_s(buffer, buffer_len, _T("movp3 a,@a")); break;
- case 0xe4: my_stprintf_s(buffer, buffer_len, _T("jmp %s"), get_value_or_symbol(d_debugger->first_symbol, _T("$%03X"), 0x700 | program_r(ptr++))); break;
- case 0xe5: if (!upi41)
- my_stprintf_s(buffer, buffer_len, _T("sel mb0"));
- else
- my_stprintf_s(buffer, buffer_len, _T("en dma")); break;
- case 0xe6: my_stprintf_s(buffer, buffer_len, _T("jnc %s"), get_value_or_symbol(d_debugger->first_symbol, _T("$%03X"), (pc & 0xf00) | program_r(ptr++))); break;
- case 0xe7: my_stprintf_s(buffer, buffer_len, _T("rl a")); break;
- case 0xe8: my_stprintf_s(buffer, buffer_len, _T("djnz r0,%s"), get_value_or_symbol(d_debugger->first_symbol, _T("$%03X"), (pc & 0xf00) | program_r(ptr++))); break;
- case 0xe9: my_stprintf_s(buffer, buffer_len, _T("djnz r1,%s"), get_value_or_symbol(d_debugger->first_symbol, _T("$%03X"), (pc & 0xf00) | program_r(ptr++))); break;
- case 0xea: my_stprintf_s(buffer, buffer_len, _T("djnz r2,%s"), get_value_or_symbol(d_debugger->first_symbol, _T("$%03X"), (pc & 0xf00) | program_r(ptr++))); break;
- case 0xeb: my_stprintf_s(buffer, buffer_len, _T("djnz r3,%s"), get_value_or_symbol(d_debugger->first_symbol, _T("$%03X"), (pc & 0xf00) | program_r(ptr++))); break;
- case 0xec: my_stprintf_s(buffer, buffer_len, _T("djnz r4,%s"), get_value_or_symbol(d_debugger->first_symbol, _T("$%03X"), (pc & 0xf00) | program_r(ptr++))); break;
- case 0xed: my_stprintf_s(buffer, buffer_len, _T("djnz r5,%s"), get_value_or_symbol(d_debugger->first_symbol, _T("$%03X"), (pc & 0xf00) | program_r(ptr++))); break;
- case 0xee: my_stprintf_s(buffer, buffer_len, _T("djnz r6,%s"), get_value_or_symbol(d_debugger->first_symbol, _T("$%03X"), (pc & 0xf00) | program_r(ptr++))); break;
- case 0xef: my_stprintf_s(buffer, buffer_len, _T("djnz r7,%s"), get_value_or_symbol(d_debugger->first_symbol, _T("$%03X"), (pc & 0xf00) | program_r(ptr++))); break;
- case 0xf0: my_stprintf_s(buffer, buffer_len, _T("mov a,@r0")); break;
- case 0xf1: my_stprintf_s(buffer, buffer_len, _T("mov a,@r1")); break;
- case 0xf2: my_stprintf_s(buffer, buffer_len, _T("jb7 %s"), get_value_or_symbol(d_debugger->first_symbol, _T("$%03X"), (pc & 0xf00) | program_r(ptr++))); break;
- case 0xf4: my_stprintf_s(buffer, buffer_len, _T("call %s"), get_value_or_symbol(d_debugger->first_symbol, _T("$%03X"), 0x700 | program_r(ptr++))); break;
- case 0xf5: if (!upi41)
- my_stprintf_s(buffer, buffer_len, _T("sel mb1"));
- else
- my_stprintf_s(buffer, buffer_len, _T("en flags")); break;
- case 0xf6: my_stprintf_s(buffer, buffer_len, _T("jc %s"), get_value_or_symbol(d_debugger->first_symbol, _T("$%03X"), (pc & 0xf00) | program_r(ptr++))); break;
- case 0xf7: my_stprintf_s(buffer, buffer_len, _T("rlc a")); break;
- case 0xf8: my_stprintf_s(buffer, buffer_len, _T("mov a,r0")); break;
- case 0xf9: my_stprintf_s(buffer, buffer_len, _T("mov a,r1")); break;
- case 0xfa: my_stprintf_s(buffer, buffer_len, _T("mov a,r2")); break;
- case 0xfb: my_stprintf_s(buffer, buffer_len, _T("mov a,r3")); break;
- case 0xfc: my_stprintf_s(buffer, buffer_len, _T("mov a,r4")); break;
- case 0xfd: my_stprintf_s(buffer, buffer_len, _T("mov a,r5")); break;
- case 0xfe: my_stprintf_s(buffer, buffer_len, _T("mov a,r6")); break;
- case 0xff: my_stprintf_s(buffer, buffer_len, _T("mov a,r7")); break;
- default: my_stprintf_s(buffer, buffer_len, _T("illegal")); break;
-
- }
- return ptr - pc;
-}
-#endif
#define STATE_VERSION 1
-void MCS48MEM::save_state(FILEIO* state_fio)
-{
- state_fio->FputUint32(STATE_VERSION);
- state_fio->FputInt32(this_device_id);
-
- state_fio->Fwrite(ram, sizeof(ram), 1);
-}
-
-bool MCS48MEM::load_state(FILEIO* state_fio)
-{
- if(state_fio->FgetUint32() != STATE_VERSION) {
- return false;
- }
- if(state_fio->FgetInt32() != this_device_id) {
- return false;
- }
- state_fio->Fread(ram, sizeof(ram), 1);
- return true;
-}
-
void MCS48::save_state(FILEIO* state_fio)
{
state_fio->FputUint32(STATE_VERSION);
#ifndef _MCS84_H_
#define _MCS48_H_
-#if defined(USE_SHARED_DLL)
-#include "libcpu_newdev/mcs48.h"
-#else
-#include "vm.h"
-#include "../emu.h"
+//#include "vm.h"
+//#include "../emu.h"
#include "device.h"
+#include "mcs48_flags.h"
+#ifndef INLINE
+#define INLINE inline
+#endif
+
#define MCS48_PORT_P0 0x100 /* Not used */
#define MCS48_PORT_P1 0x101 /* P10-P17 */
#define MCS48_PORT_P2 0x102 /* P20-P28 */
#define MCS48_PORT_BUS 0x120 /* DB0-DB7 */
#define MCS48_PORT_PROG 0x121 /* PROG line to 8243 expander */
-#ifdef USE_DEBUGGER
+//#ifdef USE_DEBUGGER
class DEBUGGER;
-#endif
+//#endif
+
+/***************************************************************************
+ CONSTANTS
+***************************************************************************/
+
+/* timer/counter enable bits */
+#define __MCS48_TIMER_ENABLED 0x01
+#define __MCS48_COUNTER_ENABLED 0x02
+
+/***************************************************************************
+ TYPE DEFINITIONS
+***************************************************************************/
+
+/* live processor state */
+struct mcs48_state
+{
+ UINT16 prevpc; /* 16-bit previous program counter */
+ UINT16 pc; /* 16-bit program counter */
+
+ UINT8 a; /* 8-bit accumulator */
+ int regptr; /* offset of r0-r7 */
+ UINT8 psw; /* 8-bit cpustate->psw */
+ UINT8 p1; /* 8-bit latched port 1 */
+ UINT8 p2; /* 8-bit latched port 2 */
+ UINT8 timer; /* 8-bit timer */
+ UINT8 prescaler; /* 5-bit timer prescaler */
+ UINT8 t1_history; /* 8-bit history of the T1 input */
+ UINT8 sts; /* 8-bit status register */
+
+ UINT8 int_state; /* INT signal status */
+ UINT8 irq_state; /* TRUE if an IRQ is pending */
+ UINT8 irq_in_progress; /* TRUE if an IRQ is in progress */
+ UINT8 timer_overflow; /* TRUE on a timer overflow; cleared by taking interrupt */
+ UINT8 timer_flag; /* TRUE on a timer overflow; cleared on JTF */
+ UINT8 tirq_enabled; /* TRUE if the timer IRQ is enabled */
+ UINT8 xirq_enabled; /* TRUE if the external IRQ is enabled */
+ UINT8 t0_clk_enabled; /* TRUE if ent0_clk is called */
+ UINT8 timecount_enabled; /* bitmask of timer/counter enabled */
+
+ UINT16 a11; /* A11 value, either 0x000 or 0x800 */
+
+ DEVICE * mem;
+ DEVICE * io;
+ DEVICE * intr;
+
+ int icount;
+
+ UINT8 rom[0x1000];
+// UINT8 ram[0x100];
+};
+/***************************************************************************
+ MACROS
+***************************************************************************/
+
+#define __mcs48_program_r(a) cpustate->rom[(a) & 0xfff]
+
+#define __mcs48_ram_r(a) cpustate->mem->read_data8(a)
+#define __mcs48_ram_w(a,V) cpustate->mem->write_data8(a, V)
+#define __mcs48_reg_r(a) cpustate->mem->read_data8(cpustate->regptr + a)
+#define __mcs48_reg_w(a,V) cpustate->mem->write_data8(cpustate->regptr + a, V)
+
+#define __mcs48_ext_r(a) cpustate->io->read_io8(a)
+#define __mcs48_ext_w(a,V) cpustate->io->write_io8(a, V)
+#define __mcs48_port_r(a) cpustate->io->read_io8(MCS48_PORT_P0 + a)
+#define __mcs48_port_w(a,V) cpustate->io->write_io8(MCS48_PORT_P0 + a, V)
+#define __mcs48_test_r(a) cpustate->io->read_io8(MCS48_PORT_T0 + a)
+#define __mcs48_test_w(a,V) cpustate->io->write_io8(MCS48_PORT_T0 + a, V)
+#define __mcs48_bus_r() cpustate->io->read_io8(MCS48_PORT_BUS)
+#define __mcs48_bus_w(V) cpustate->io->write_io8(MCS48_PORT_BUS, V)
+#define __mcs48_prog_w(V) cpustate->io->write_io8(MCS48_PORT_PROG, V)
+
+
+
+#define __MCS48_OPHANDLER(_name) int MCS48_BASE::_name(mcs48_state *cpustate)
+#define __MCS48_OPHANDLER_D(_name) int _name(mcs48_state *cpustate)
class MCS48MEM : public DEVICE
{
bool load_state(FILEIO* state_fio);
};
-class MCS48 : public DEVICE
+class MCS48_BASE : public DEVICE
{
+protected:
+ inline UINT8 argument_fetch(mcs48_state *cpustate);
+ inline void pull_pc(mcs48_state *cpustate);
+ inline void execute_add(mcs48_state *cpustate, UINT8 dat);
+ inline void execute_addc(mcs48_state *cpustate, UINT8 dat);
+ inline void execute_jmp(mcs48_state *cpustate, UINT16 address);
+ inline void execute_call(mcs48_state *cpustate, UINT16 address);
+ inline void execute_jcc(mcs48_state *cpustate, UINT8 result);
+ inline void expander_operation(mcs48_state *cpustate, UINT8 operation, UINT8 port);
+
private:
+ __MCS48_OPHANDLER_D( illegal );
+ __MCS48_OPHANDLER_D( add_a_r0 );
+ __MCS48_OPHANDLER_D( add_a_r1 );
+ __MCS48_OPHANDLER_D( add_a_r2 );
+ __MCS48_OPHANDLER_D( add_a_r3 );
+ __MCS48_OPHANDLER_D( add_a_r4 );
+ __MCS48_OPHANDLER_D( add_a_r5 );
+ __MCS48_OPHANDLER_D( add_a_r6 );
+ __MCS48_OPHANDLER_D( add_a_r7 );
+ __MCS48_OPHANDLER_D( add_a_xr0 );
+ __MCS48_OPHANDLER_D( add_a_xr1 );
+ __MCS48_OPHANDLER_D( add_a_n );
+
+ __MCS48_OPHANDLER_D( adc_a_r0 );
+ __MCS48_OPHANDLER_D( adc_a_r1 );
+ __MCS48_OPHANDLER_D( adc_a_r2 );
+ __MCS48_OPHANDLER_D( adc_a_r3 );
+ __MCS48_OPHANDLER_D( adc_a_r4 );
+ __MCS48_OPHANDLER_D( adc_a_r5 );
+ __MCS48_OPHANDLER_D( adc_a_r6 );
+ __MCS48_OPHANDLER_D( adc_a_r7 );
+ __MCS48_OPHANDLER_D( adc_a_xr0 );
+ __MCS48_OPHANDLER_D( adc_a_xr1 );
+ __MCS48_OPHANDLER_D( adc_a_n );
+
+ __MCS48_OPHANDLER_D( anl_a_r0 );
+ __MCS48_OPHANDLER_D( anl_a_r1 );
+ __MCS48_OPHANDLER_D( anl_a_r2 );
+ __MCS48_OPHANDLER_D( anl_a_r3 );
+ __MCS48_OPHANDLER_D( anl_a_r4 );
+ __MCS48_OPHANDLER_D( anl_a_r5 );
+ __MCS48_OPHANDLER_D( anl_a_r6 );
+ __MCS48_OPHANDLER_D( anl_a_r7 );
+ __MCS48_OPHANDLER_D( anl_a_xr0 );
+ __MCS48_OPHANDLER_D( anl_a_xr1 );
+ __MCS48_OPHANDLER_D( anl_a_n );
+
+ __MCS48_OPHANDLER_D( anl_bus_n );
+ __MCS48_OPHANDLER_D( anl_p1_n );
+ __MCS48_OPHANDLER_D( anl_p2_n );
+ __MCS48_OPHANDLER_D( anld_p4_a );
+ __MCS48_OPHANDLER_D( anld_p5_a );
+ __MCS48_OPHANDLER_D( anld_p6_a );
+ __MCS48_OPHANDLER_D( anld_p7_a );
+
+ __MCS48_OPHANDLER_D( call_0 );
+ __MCS48_OPHANDLER_D( call_1 );
+ __MCS48_OPHANDLER_D( call_2 );
+ __MCS48_OPHANDLER_D( call_3 );
+ __MCS48_OPHANDLER_D( call_4 );
+ __MCS48_OPHANDLER_D( call_5 );
+ __MCS48_OPHANDLER_D( call_6 );
+ __MCS48_OPHANDLER_D( call_7 );
+
+ __MCS48_OPHANDLER_D( clr_a );
+ __MCS48_OPHANDLER_D( clr_c );
+ __MCS48_OPHANDLER_D( clr_f0 );
+ __MCS48_OPHANDLER_D( clr_f1 );
+
+ __MCS48_OPHANDLER_D( cpl_a );
+ __MCS48_OPHANDLER_D( cpl_c );
+ __MCS48_OPHANDLER_D( cpl_f0 );
+ __MCS48_OPHANDLER_D( cpl_f1 );
+
+ __MCS48_OPHANDLER_D( da_a );
+
+ __MCS48_OPHANDLER_D( dec_a );
+ __MCS48_OPHANDLER_D( dec_r0 );
+ __MCS48_OPHANDLER_D( dec_r1 );
+ __MCS48_OPHANDLER_D( dec_r2 );
+ __MCS48_OPHANDLER_D( dec_r3 );
+ __MCS48_OPHANDLER_D( dec_r4 );
+ __MCS48_OPHANDLER_D( dec_r5 );
+ __MCS48_OPHANDLER_D( dec_r6 );
+ __MCS48_OPHANDLER_D( dec_r7 );
+
+ __MCS48_OPHANDLER_D( dis_i );
+ __MCS48_OPHANDLER_D( dis_tcnti );
+
+ __MCS48_OPHANDLER_D( djnz_r0 );
+ __MCS48_OPHANDLER_D( djnz_r1 );
+ __MCS48_OPHANDLER_D( djnz_r2 );
+ __MCS48_OPHANDLER_D( djnz_r3 );
+ __MCS48_OPHANDLER_D( djnz_r4 );
+ __MCS48_OPHANDLER_D( djnz_r5 );
+ __MCS48_OPHANDLER_D( djnz_r6 );
+ __MCS48_OPHANDLER_D( djnz_r7 );
+
+ __MCS48_OPHANDLER_D( en_i );
+ __MCS48_OPHANDLER_D( en_tcnti );
+ __MCS48_OPHANDLER_D( ent0_clk );
+
+ __MCS48_OPHANDLER_D( in_a_p1 );
+ __MCS48_OPHANDLER_D( in_a_p2 );
+ __MCS48_OPHANDLER_D( ins_a_bus );
+
+ __MCS48_OPHANDLER_D( inc_a );
+ __MCS48_OPHANDLER_D( inc_r0 );
+ __MCS48_OPHANDLER_D( inc_r1 );
+ __MCS48_OPHANDLER_D( inc_r2 );
+ __MCS48_OPHANDLER_D( inc_r3 );
+ __MCS48_OPHANDLER_D( inc_r4 );
+ __MCS48_OPHANDLER_D( inc_r5 );
+ __MCS48_OPHANDLER_D( inc_r6 );
+ __MCS48_OPHANDLER_D( inc_r7 );
+ __MCS48_OPHANDLER_D( inc_xr0 );
+ __MCS48_OPHANDLER_D( inc_xr1 );
+
+ __MCS48_OPHANDLER_D( jb_0 );
+ __MCS48_OPHANDLER_D( jb_1 );
+ __MCS48_OPHANDLER_D( jb_2 );
+ __MCS48_OPHANDLER_D( jb_3 );
+ __MCS48_OPHANDLER_D( jb_4 );
+ __MCS48_OPHANDLER_D( jb_5 );
+ __MCS48_OPHANDLER_D( jb_6 );
+ __MCS48_OPHANDLER_D( jb_7 );
+ __MCS48_OPHANDLER_D( jc );
+ __MCS48_OPHANDLER_D( jf0 );
+ __MCS48_OPHANDLER_D( jf1 );
+ __MCS48_OPHANDLER_D( jnc );
+ __MCS48_OPHANDLER_D( jni );
+ __MCS48_OPHANDLER_D( jnt_0 );
+ __MCS48_OPHANDLER_D( jnt_1 );
+ __MCS48_OPHANDLER_D( jnz );
+ __MCS48_OPHANDLER_D( jtf );
+ __MCS48_OPHANDLER_D( jt_0 );
+ __MCS48_OPHANDLER_D( jt_1 );
+ __MCS48_OPHANDLER_D( jz );
+
+ __MCS48_OPHANDLER_D( jmp_0 );
+ __MCS48_OPHANDLER_D( jmp_1 );
+ __MCS48_OPHANDLER_D( jmp_2 );
+ __MCS48_OPHANDLER_D( jmp_3 );
+ __MCS48_OPHANDLER_D( jmp_4 );
+ __MCS48_OPHANDLER_D( jmp_5 );
+ __MCS48_OPHANDLER_D( jmp_6 );
+ __MCS48_OPHANDLER_D( jmp_7 );
+ __MCS48_OPHANDLER_D( jmpp_xa );
+
+ __MCS48_OPHANDLER_D( mov_a_n );
+ __MCS48_OPHANDLER_D( mov_a_psw );
+ __MCS48_OPHANDLER_D( mov_a_r0 );
+ __MCS48_OPHANDLER_D( mov_a_r1 );
+ __MCS48_OPHANDLER_D( mov_a_r2 );
+ __MCS48_OPHANDLER_D( mov_a_r3 );
+ __MCS48_OPHANDLER_D( mov_a_r4 );
+ __MCS48_OPHANDLER_D( mov_a_r5 );
+ __MCS48_OPHANDLER_D( mov_a_r6 );
+ __MCS48_OPHANDLER_D( mov_a_r7 );
+ __MCS48_OPHANDLER_D( mov_a_xr0 );
+ __MCS48_OPHANDLER_D( mov_a_xr1 );
+ __MCS48_OPHANDLER_D( mov_a_t );
+
+ __MCS48_OPHANDLER_D( mov_psw_a );
+ __MCS48_OPHANDLER_D( mov_r0_a );
+ __MCS48_OPHANDLER_D( mov_r1_a );
+ __MCS48_OPHANDLER_D( mov_r2_a );
+ __MCS48_OPHANDLER_D( mov_r3_a );
+ __MCS48_OPHANDLER_D( mov_r4_a );
+ __MCS48_OPHANDLER_D( mov_r5_a );
+ __MCS48_OPHANDLER_D( mov_r6_a );
+ __MCS48_OPHANDLER_D( mov_r7_a );
+ __MCS48_OPHANDLER_D( mov_r0_n );
+ __MCS48_OPHANDLER_D( mov_r1_n );
+ __MCS48_OPHANDLER_D( mov_r2_n );
+ __MCS48_OPHANDLER_D( mov_r3_n );
+ __MCS48_OPHANDLER_D( mov_r4_n );
+ __MCS48_OPHANDLER_D( mov_r5_n );
+ __MCS48_OPHANDLER_D( mov_r6_n );
+ __MCS48_OPHANDLER_D( mov_r7_n );
+ __MCS48_OPHANDLER_D( mov_t_a );
+ __MCS48_OPHANDLER_D( mov_xr0_a );
+ __MCS48_OPHANDLER_D( mov_xr1_a );
+ __MCS48_OPHANDLER_D( mov_xr0_n );
+ __MCS48_OPHANDLER_D( mov_xr1_n );
+
+ __MCS48_OPHANDLER_D( movd_a_p4 );
+ __MCS48_OPHANDLER_D( movd_a_p5 );
+ __MCS48_OPHANDLER_D( movd_a_p6 );
+ __MCS48_OPHANDLER_D( movd_a_p7 );
+ __MCS48_OPHANDLER_D( movd_p4_a );
+ __MCS48_OPHANDLER_D( movd_p5_a );
+ __MCS48_OPHANDLER_D( movd_p6_a );
+ __MCS48_OPHANDLER_D( movd_p7_a );
+
+ __MCS48_OPHANDLER_D( movp_a_xa );
+ __MCS48_OPHANDLER_D( movp3_a_xa );
+
+ __MCS48_OPHANDLER_D( movx_a_xr0 );
+ __MCS48_OPHANDLER_D( movx_a_xr1 );
+ __MCS48_OPHANDLER_D( movx_xr0_a );
+ __MCS48_OPHANDLER_D( movx_xr1_a );
+
+ __MCS48_OPHANDLER_D( nop );
+
+ __MCS48_OPHANDLER_D( orl_a_r0 );
+ __MCS48_OPHANDLER_D( orl_a_r1 );
+ __MCS48_OPHANDLER_D( orl_a_r2 );
+ __MCS48_OPHANDLER_D( orl_a_r3 );
+ __MCS48_OPHANDLER_D( orl_a_r4 );
+ __MCS48_OPHANDLER_D( orl_a_r5 );
+ __MCS48_OPHANDLER_D( orl_a_r6 );
+ __MCS48_OPHANDLER_D( orl_a_r7 );
+ __MCS48_OPHANDLER_D( orl_a_xr0 );
+ __MCS48_OPHANDLER_D( orl_a_xr1 );
+ __MCS48_OPHANDLER_D( orl_a_n );
+
+ __MCS48_OPHANDLER_D( orl_bus_n );
+ __MCS48_OPHANDLER_D( orl_p1_n );
+ __MCS48_OPHANDLER_D( orl_p2_n );
+ __MCS48_OPHANDLER_D( orld_p4_a );
+ __MCS48_OPHANDLER_D( orld_p5_a );
+ __MCS48_OPHANDLER_D( orld_p6_a );
+ __MCS48_OPHANDLER_D( orld_p7_a );
+
+ __MCS48_OPHANDLER_D( outl_bus_a );
+ __MCS48_OPHANDLER_D( outl_p1_a );
+ __MCS48_OPHANDLER_D( outl_p2_a );
+
+ __MCS48_OPHANDLER_D( ret );
+ __MCS48_OPHANDLER_D( retr );
+
+ __MCS48_OPHANDLER_D( rl_a );
+ __MCS48_OPHANDLER_D( rlc_a );
+
+ __MCS48_OPHANDLER_D( rr_a );
+ __MCS48_OPHANDLER_D( rrc_a );
+
+ __MCS48_OPHANDLER_D( sel_mb0 );
+ __MCS48_OPHANDLER_D( sel_mb1 );
+
+ __MCS48_OPHANDLER_D( sel_rb0 );
+ __MCS48_OPHANDLER_D( sel_rb1 );
+
+ __MCS48_OPHANDLER_D( stop_tcnt );
+
+ __MCS48_OPHANDLER_D( strt_cnt );
+ __MCS48_OPHANDLER_D( strt_t );
+
+ __MCS48_OPHANDLER_D( swap_a );
+
+ __MCS48_OPHANDLER_D( xch_a_r0 );
+ __MCS48_OPHANDLER_D( xch_a_r1 );
+ __MCS48_OPHANDLER_D( xch_a_r2 );
+ __MCS48_OPHANDLER_D( xch_a_r3 );
+ __MCS48_OPHANDLER_D( xch_a_r4 );
+ __MCS48_OPHANDLER_D( xch_a_r5 );
+ __MCS48_OPHANDLER_D( xch_a_r6 );
+ __MCS48_OPHANDLER_D( xch_a_r7 );
+ __MCS48_OPHANDLER_D( xch_a_xr0 );
+ __MCS48_OPHANDLER_D( xch_a_xr1 );
+
+ __MCS48_OPHANDLER_D( xchd_a_xr0 );
+ __MCS48_OPHANDLER_D( xchd_a_xr1 );
+
+ __MCS48_OPHANDLER_D( xrl_a_r0 );
+ __MCS48_OPHANDLER_D( xrl_a_r1 );
+ __MCS48_OPHANDLER_D( xrl_a_r2 );
+ __MCS48_OPHANDLER_D( xrl_a_r3 );
+ __MCS48_OPHANDLER_D( xrl_a_r4 );
+ __MCS48_OPHANDLER_D( xrl_a_r5 );
+ __MCS48_OPHANDLER_D( xrl_a_r6 );
+ __MCS48_OPHANDLER_D( xrl_a_r7 );
+ __MCS48_OPHANDLER_D( xrl_a_xr0 );
+ __MCS48_OPHANDLER_D( xrl_a_xr1 );
+ __MCS48_OPHANDLER_D( xrl_a_n );
+
+protected:
/* ---------------------------------------------------------------------------
contexts
--------------------------------------------------------------------------- */
DEVICE *d_mem, *d_io, *d_intr;
-#ifdef USE_DEBUGGER
+//#ifdef USE_DEBUGGER
DEBUGGER *d_debugger;
DEVICE *d_mem_stored, *d_io_stored;
-#endif
+//#endif
void *opaque;
+ /* opcode table entry */
+ typedef int (MCS48_BASE::*mcs48_ophandler)(mcs48_state *state);
+
+ const mcs48_ophandler opcode_table[256] =
+ {
+ &MCS48_BASE::nop, &MCS48_BASE::illegal, &MCS48_BASE::outl_bus_a, &MCS48_BASE::add_a_n, &MCS48_BASE::jmp_0, &MCS48_BASE::en_i, &MCS48_BASE::illegal, &MCS48_BASE::dec_a, /* 00 */
+ &MCS48_BASE::ins_a_bus, &MCS48_BASE::in_a_p1, &MCS48_BASE::in_a_p2, &MCS48_BASE::illegal, &MCS48_BASE::movd_a_p4, &MCS48_BASE::movd_a_p5, &MCS48_BASE::movd_a_p6, &MCS48_BASE::movd_a_p7,
+ &MCS48_BASE::inc_xr0, &MCS48_BASE::inc_xr1, &MCS48_BASE::jb_0, &MCS48_BASE::adc_a_n, &MCS48_BASE::call_0, &MCS48_BASE::dis_i, &MCS48_BASE::jtf, &MCS48_BASE::inc_a, /* 10 */
+ &MCS48_BASE::inc_r0, &MCS48_BASE::inc_r1, &MCS48_BASE::inc_r2, &MCS48_BASE::inc_r3, &MCS48_BASE::inc_r4, &MCS48_BASE::inc_r5, &MCS48_BASE::inc_r6, &MCS48_BASE::inc_r7,
+ &MCS48_BASE::xch_a_xr0, &MCS48_BASE::xch_a_xr1, &MCS48_BASE::illegal, &MCS48_BASE::mov_a_n, &MCS48_BASE::jmp_1, &MCS48_BASE::en_tcnti, &MCS48_BASE::jnt_0, &MCS48_BASE::clr_a, /* 20 */
+ &MCS48_BASE::xch_a_r0, &MCS48_BASE::xch_a_r1, &MCS48_BASE::xch_a_r2, &MCS48_BASE::xch_a_r3, &MCS48_BASE::xch_a_r4, &MCS48_BASE::xch_a_r5, &MCS48_BASE::xch_a_r6, &MCS48_BASE::xch_a_r7,
+ &MCS48_BASE::xchd_a_xr0, &MCS48_BASE::xchd_a_xr1, &MCS48_BASE::jb_1, &MCS48_BASE::illegal, &MCS48_BASE::call_1, &MCS48_BASE::dis_tcnti, &MCS48_BASE::jt_0, &MCS48_BASE::cpl_a, /* 30 */
+ &MCS48_BASE::illegal, &MCS48_BASE::outl_p1_a, &MCS48_BASE::outl_p2_a, &MCS48_BASE::illegal, &MCS48_BASE::movd_p4_a, &MCS48_BASE::movd_p5_a, &MCS48_BASE::movd_p6_a, &MCS48_BASE::movd_p7_a,
+ &MCS48_BASE::orl_a_xr0, &MCS48_BASE::orl_a_xr1, &MCS48_BASE::mov_a_t, &MCS48_BASE::orl_a_n, &MCS48_BASE::jmp_2, &MCS48_BASE::strt_cnt, &MCS48_BASE::jnt_1, &MCS48_BASE::swap_a, /* 40 */
+ &MCS48_BASE::orl_a_r0, &MCS48_BASE::orl_a_r1, &MCS48_BASE::orl_a_r2, &MCS48_BASE::orl_a_r3, &MCS48_BASE::orl_a_r4, &MCS48_BASE::orl_a_r5, &MCS48_BASE::orl_a_r6, &MCS48_BASE::orl_a_r7,
+ &MCS48_BASE::anl_a_xr0, &MCS48_BASE::anl_a_xr1, &MCS48_BASE::jb_2, &MCS48_BASE::anl_a_n, &MCS48_BASE::call_2, &MCS48_BASE::strt_t, &MCS48_BASE::jt_1, &MCS48_BASE::da_a, /* 50 */
+ &MCS48_BASE::anl_a_r0, &MCS48_BASE::anl_a_r1, &MCS48_BASE::anl_a_r2, &MCS48_BASE::anl_a_r3, &MCS48_BASE::anl_a_r4, &MCS48_BASE::anl_a_r5, &MCS48_BASE::anl_a_r6, &MCS48_BASE::anl_a_r7,
+ &MCS48_BASE::add_a_xr0, &MCS48_BASE::add_a_xr1, &MCS48_BASE::mov_t_a, &MCS48_BASE::illegal, &MCS48_BASE::jmp_3, &MCS48_BASE::stop_tcnt, &MCS48_BASE::illegal, &MCS48_BASE::rrc_a, /* 60 */
+ &MCS48_BASE::add_a_r0, &MCS48_BASE::add_a_r1, &MCS48_BASE::add_a_r2, &MCS48_BASE::add_a_r3, &MCS48_BASE::add_a_r4, &MCS48_BASE::add_a_r5, &MCS48_BASE::add_a_r6, &MCS48_BASE::add_a_r7,
+ &MCS48_BASE::adc_a_xr0, &MCS48_BASE::adc_a_xr1, &MCS48_BASE::jb_3, &MCS48_BASE::illegal, &MCS48_BASE::call_3, &MCS48_BASE::ent0_clk, &MCS48_BASE::jf1, &MCS48_BASE::rr_a, /* 70 */
+ &MCS48_BASE::adc_a_r0, &MCS48_BASE::adc_a_r1, &MCS48_BASE::adc_a_r2, &MCS48_BASE::adc_a_r3, &MCS48_BASE::adc_a_r4, &MCS48_BASE::adc_a_r5, &MCS48_BASE::adc_a_r6, &MCS48_BASE::adc_a_r7,
+ &MCS48_BASE::movx_a_xr0, &MCS48_BASE::movx_a_xr1, &MCS48_BASE::illegal, &MCS48_BASE::ret, &MCS48_BASE::jmp_4, &MCS48_BASE::clr_f0, &MCS48_BASE::jni, &MCS48_BASE::illegal, /* 80 */
+ &MCS48_BASE::orl_bus_n, &MCS48_BASE::orl_p1_n, &MCS48_BASE::orl_p2_n, &MCS48_BASE::illegal, &MCS48_BASE::orld_p4_a, &MCS48_BASE::orld_p5_a, &MCS48_BASE::orld_p6_a, &MCS48_BASE::orld_p7_a,
+ &MCS48_BASE::movx_xr0_a, &MCS48_BASE::movx_xr1_a, &MCS48_BASE::jb_4, &MCS48_BASE::retr, &MCS48_BASE::call_4, &MCS48_BASE::cpl_f0, &MCS48_BASE::jnz, &MCS48_BASE::clr_c, /* 90 */
+ &MCS48_BASE::anl_bus_n, &MCS48_BASE::anl_p1_n, &MCS48_BASE::anl_p2_n, &MCS48_BASE::illegal, &MCS48_BASE::anld_p4_a, &MCS48_BASE::anld_p5_a, &MCS48_BASE::anld_p6_a, &MCS48_BASE::anld_p7_a,
+ &MCS48_BASE::mov_xr0_a, &MCS48_BASE::mov_xr1_a, &MCS48_BASE::illegal, &MCS48_BASE::movp_a_xa, &MCS48_BASE::jmp_5, &MCS48_BASE::clr_f1, &MCS48_BASE::illegal, &MCS48_BASE::cpl_c, /* A0 */
+ &MCS48_BASE::mov_r0_a, &MCS48_BASE::mov_r1_a, &MCS48_BASE::mov_r2_a, &MCS48_BASE::mov_r3_a, &MCS48_BASE::mov_r4_a, &MCS48_BASE::mov_r5_a, &MCS48_BASE::mov_r6_a, &MCS48_BASE::mov_r7_a,
+ &MCS48_BASE::mov_xr0_n, &MCS48_BASE::mov_xr1_n, &MCS48_BASE::jb_5, &MCS48_BASE::jmpp_xa, &MCS48_BASE::call_5, &MCS48_BASE::cpl_f1, &MCS48_BASE::jf0, &MCS48_BASE::illegal, /* B0 */
+ &MCS48_BASE::mov_r0_n, &MCS48_BASE::mov_r1_n, &MCS48_BASE::mov_r2_n, &MCS48_BASE::mov_r3_n, &MCS48_BASE::mov_r4_n, &MCS48_BASE::mov_r5_n, &MCS48_BASE::mov_r6_n, &MCS48_BASE::mov_r7_n,
+ &MCS48_BASE::illegal, &MCS48_BASE::illegal, &MCS48_BASE::illegal, &MCS48_BASE::illegal, &MCS48_BASE::jmp_6, &MCS48_BASE::sel_rb0, &MCS48_BASE::jz, &MCS48_BASE::mov_a_psw, /* C0 */
+ &MCS48_BASE::dec_r0, &MCS48_BASE::dec_r1, &MCS48_BASE::dec_r2, &MCS48_BASE::dec_r3, &MCS48_BASE::dec_r4, &MCS48_BASE::dec_r5, &MCS48_BASE::dec_r6, &MCS48_BASE::dec_r7,
+ &MCS48_BASE::xrl_a_xr0, &MCS48_BASE::xrl_a_xr1, &MCS48_BASE::jb_6, &MCS48_BASE::xrl_a_n, &MCS48_BASE::call_6, &MCS48_BASE::sel_rb1, &MCS48_BASE::illegal, &MCS48_BASE::mov_psw_a, /* D0 */
+ &MCS48_BASE::xrl_a_r0, &MCS48_BASE::xrl_a_r1, &MCS48_BASE::xrl_a_r2, &MCS48_BASE::xrl_a_r3, &MCS48_BASE::xrl_a_r4, &MCS48_BASE::xrl_a_r5, &MCS48_BASE::xrl_a_r6, &MCS48_BASE::xrl_a_r7,
+ &MCS48_BASE::illegal, &MCS48_BASE::illegal, &MCS48_BASE::illegal, &MCS48_BASE::movp3_a_xa,&MCS48_BASE::jmp_7, &MCS48_BASE::sel_mb0, &MCS48_BASE::jnc, &MCS48_BASE::rl_a, /* E0 */
+ &MCS48_BASE::djnz_r0, &MCS48_BASE::djnz_r1, &MCS48_BASE::djnz_r2, &MCS48_BASE::djnz_r3, &MCS48_BASE::djnz_r4, &MCS48_BASE::djnz_r5, &MCS48_BASE::djnz_r6, &MCS48_BASE::djnz_r7,
+ &MCS48_BASE::mov_a_xr0, &MCS48_BASE::mov_a_xr1, &MCS48_BASE::jb_7, &MCS48_BASE::illegal, &MCS48_BASE::call_7, &MCS48_BASE::sel_mb1, &MCS48_BASE::jc, &MCS48_BASE::rlc_a, /* F0 */
+ &MCS48_BASE::mov_a_r0, &MCS48_BASE::mov_a_r1, &MCS48_BASE::mov_a_r2, &MCS48_BASE::mov_a_r3, &MCS48_BASE::mov_a_r4, &MCS48_BASE::mov_a_r5, &MCS48_BASE::mov_a_r6, &MCS48_BASE::mov_a_r7
+ };
+ inline void update_regptr(mcs48_state *cpustate);
+ inline void push_pc_psw(mcs48_state *cpustate);
+ inline void pull_pc_psw(mcs48_state *cpustate);
+ inline int check_irqs(mcs48_state *cpustate);
+ inline UINT8 opcode_fetch(mcs48_state *cpustate);
+ int op_call(mcs48_state *);
public:
- MCS48(VM* parent_vm, EMU* parent_emu) : DEVICE(parent_vm, parent_emu)
+ MCS48_BASE(VM* parent_vm, EMU* parent_emu) : DEVICE(parent_vm, parent_emu)
{
d_mem = d_io = d_intr = NULL;
+ d_debugger = NULL;
+ d_mem_stored = d_io_stored = NULL;
set_device_name(_T("MCS48 MCU"));
}
- ~MCS48() {}
+ ~MCS48_BASE() {}
// common functions
- void initialize();
- void release();
+ virtual void initialize();
+ virtual void release();
void reset();
- int run(int icount);
+ virtual int run(int icount);
void write_signal(int id, uint32_t data, uint32_t mask);
uint32_t get_pc();
uint32_t get_next_pc();
-#ifdef USE_DEBUGGER
- void *get_debugger()
- {
- return d_debugger;
- }
- uint32_t get_debug_prog_addr_mask()
- {
- return 0xfff;
- }
- uint32_t get_debug_data_addr_mask()
- {
- return 0xff;
- }
+//#ifdef USE_DEBUGGER
void write_debug_data8(uint32_t addr, uint32_t data);
uint32_t read_debug_data8(uint32_t addr);
void write_debug_io8(uint32_t addr, uint32_t data);
bool write_debug_reg(const _TCHAR *reg, uint32_t data);
void get_debug_regs_info(_TCHAR *buffer, size_t buffer_len);
int debug_dasm(uint32_t pc, _TCHAR *buffer, size_t buffer_len);
-#endif
- void save_state(FILEIO* state_state_fio);
- bool load_state(FILEIO* state_state_fio);
+//#endif
// unique functions
void set_context_mem(DEVICE* device)
{
d_intr = device;
}
+ void load_rom_image(const _TCHAR *file_path);
+ uint8_t *get_rom_ptr();
+};
+
+
+/*-------------------------------------------------
+ update_regptr - update the regptr member to
+ point to the appropriate register bank
+-------------------------------------------------*/
+
+inline void MCS48_BASE::update_regptr(mcs48_state *cpustate)
+{
+ cpustate->regptr = ((cpustate->psw & B_FLAG) ? 24 : 0);
+}
+
+/*-------------------------------------------------
+ push_pc_psw - push the cpustate->pc and cpustate->psw values onto
+ the stack
+-------------------------------------------------*/
+
+inline void MCS48_BASE::push_pc_psw(mcs48_state *cpustate)
+{
+ UINT8 sp = cpustate->psw & 0x07;
+ __mcs48_ram_w(8 + 2*sp, cpustate->pc);
+ __mcs48_ram_w(9 + 2*sp, ((cpustate->pc >> 8) & 0x0f) | (cpustate->psw & 0xf0));
+ cpustate->psw = (cpustate->psw & 0xf8) | ((sp + 1) & 0x07);
+}
+
+/*-------------------------------------------------
+ pull_pc_psw - pull the PC and PSW values from
+ the stack
+-------------------------------------------------*/
+
+inline void MCS48_BASE::pull_pc_psw(mcs48_state *cpustate)
+{
+ UINT8 sp = (cpustate->psw - 1) & 0x07;
+ cpustate->pc = __mcs48_ram_r(8 + 2*sp);
+ cpustate->pc |= __mcs48_ram_r(9 + 2*sp) << 8;
+ cpustate->psw = ((cpustate->pc >> 8) & 0xf0) | 0x08 | sp;
+ cpustate->pc &= 0xfff;
+ update_regptr(cpustate);
+}
+
+/*-------------------------------------------------
+ check_irqs - check for and process IRQs
+-------------------------------------------------*/
+
+inline int MCS48_BASE::check_irqs(mcs48_state *cpustate)
+{
+ /* if something is in progress, we do nothing */
+ if (cpustate->irq_in_progress)
+ return 0;
+
+ /* external interrupts take priority */
+ if (cpustate->irq_state && cpustate->xirq_enabled)
+ {
+ cpustate->irq_state = FALSE;
+ cpustate->irq_in_progress = TRUE;
+
+ /* transfer to location 0x03 */
+ push_pc_psw(cpustate);
+ cpustate->pc = 0x03;
+
+ /* indicate we took the external IRQ */
+ if (cpustate->intr != NULL)
+ cpustate->intr->get_intr_ack();
+ return 2;
+ }
+
+ /* timer overflow interrupts follow */
+ if (cpustate->timer_overflow && cpustate->tirq_enabled)
+ {
+ cpustate->irq_in_progress = TRUE;
+
+ /* transfer to location 0x07 */
+ push_pc_psw(cpustate);
+ cpustate->pc = 0x07;
+
+ /* timer overflow flip-flop is reset once taken */
+ cpustate->timer_overflow = FALSE;
+ return 2;
+ }
+ return 0;
+}
+
+/***************************************************************************
+ INLINE FUNCTIONS
+***************************************************************************/
+
+/*-------------------------------------------------
+ opcode_fetch - fetch an opcode byte
+-------------------------------------------------*/
+
+inline UINT8 MCS48_BASE::opcode_fetch(mcs48_state *cpustate)
+{
+ return cpustate->rom[cpustate->pc++ & 0xfff];
+}
+
+/*-------------------------------------------------
+ argument_fetch - fetch an opcode argument
+ byte
+-------------------------------------------------*/
+
+inline UINT8 MCS48_BASE::argument_fetch(mcs48_state *cpustate)
+{
+ return cpustate->rom[cpustate->pc++ & 0xfff];
+}
+
+/*-------------------------------------------------
+ pull_pc - pull the PC value from the stack,
+ leaving the upper part of PSW intact
+-------------------------------------------------*/
+
+inline void MCS48_BASE::pull_pc(mcs48_state *cpustate)
+{
+ UINT8 sp = (cpustate->psw - 1) & 0x07;
+ cpustate->pc = __mcs48_ram_r(8 + 2*sp);
+ cpustate->pc |= __mcs48_ram_r(9 + 2*sp) << 8;
+ cpustate->pc &= 0xfff;
+ cpustate->psw = (cpustate->psw & 0xf0) | 0x08 | sp;
+}
+
+/*-------------------------------------------------
+ execute_add - perform the logic of an ADD
+ instruction
+-------------------------------------------------*/
+
+inline void MCS48_BASE::execute_add(mcs48_state *cpustate, UINT8 dat)
+{
+ UINT16 temp = cpustate->a + dat;
+ UINT16 temp4 = (cpustate->a & 0x0f) + (dat & 0x0f);
+
+ cpustate->psw &= ~(C_FLAG | A_FLAG);
+ cpustate->psw |= (temp4 << 2) & A_FLAG;
+ cpustate->psw |= (temp >> 1) & C_FLAG;
+ cpustate->a = temp;
+}
+
+/*-------------------------------------------------
+ execute_addc - perform the logic of an ADDC
+ instruction
+-------------------------------------------------*/
+
+inline void MCS48_BASE::execute_addc(mcs48_state *cpustate, UINT8 dat)
+{
+ UINT8 carryin = (cpustate->psw & C_FLAG) >> 7;
+ UINT16 temp = cpustate->a + dat + carryin;
+ UINT16 temp4 = (cpustate->a & 0x0f) + (dat & 0x0f) + carryin;
+
+ cpustate->psw &= ~(C_FLAG | A_FLAG);
+ cpustate->psw |= (temp4 << 2) & A_FLAG;
+ cpustate->psw |= (temp >> 1) & C_FLAG;
+ cpustate->a = temp;
+}
+
+/*-------------------------------------------------
+ execute_jmp - perform the logic of a JMP
+ instruction
+-------------------------------------------------*/
+
+inline void MCS48_BASE::execute_jmp(mcs48_state *cpustate, UINT16 address)
+{
+ UINT16 a11 = (cpustate->irq_in_progress) ? 0 : cpustate->a11;
+ cpustate->pc = address | a11;
+}
+
+/*-------------------------------------------------
+ execute_call - perform the logic of a CALL
+ instruction
+-------------------------------------------------*/
+
+inline void MCS48_BASE::execute_call(mcs48_state *cpustate, UINT16 address)
+{
+ push_pc_psw(cpustate);
+ execute_jmp(cpustate, address);
+}
+
+/*-------------------------------------------------
+ execute_jcc - perform the logic of a
+ conditional jump instruction
+-------------------------------------------------*/
+
+inline void MCS48_BASE::execute_jcc(mcs48_state *cpustate, UINT8 result)
+{
+ UINT8 offset = argument_fetch(cpustate);
+ if (result != 0)
+ cpustate->pc = ((cpustate->pc - 1) & 0xf00) | offset;
+}
+
+/*-------------------------------------------------
+ expander_operation - perform an operation via
+ the 8243 expander chip
+-------------------------------------------------*/
+
+inline void MCS48_BASE::expander_operation(mcs48_state *cpustate, UINT8 operation, UINT8 port)
+{
+ /* put opcode/data on low 4 bits of P2 */
+ __mcs48_port_w(2, cpustate->p2 = (cpustate->p2 & 0xf0) | (operation << 2) | (port & 3));
+
+ /* generate high-to-low transition on PROG line */
+ __mcs48_prog_w(0);
+
+ /* put data on low 4 bits of P2 */
+ if (operation != 0)
+ __mcs48_port_w(2, cpustate->p2 = (cpustate->p2 & 0xf0) | (cpustate->a & 0x0f));
+ else
+ cpustate->a = __mcs48_port_r(2) | 0x0f;
+
+ /* generate low-to-high transition on PROG line */
+ __mcs48_prog_w(1);
+}
+
+
+class MCS48 : public MCS48_BASE
+{
+private:
+ void burn_cycles(mcs48_state *cpustate, int count);
+public:
+ MCS48(VM* parent_vm, EMU* parent_emu) : MCS48_BASE(parent_vm, parent_emu)
+ {
+ }
+ ~MCS48() {}
+ void initialize();
+ void release();
+ int run(int icount);
+ void save_state(FILEIO* state_state_fio);
+ bool load_state(FILEIO* state_state_fio);
#ifdef USE_DEBUGGER
+ void *get_debugger()
+ {
+ return d_debugger;
+ }
+ uint32_t get_debug_prog_addr_mask()
+ {
+ return 0xfff;
+ }
+ uint32_t get_debug_data_addr_mask()
+ {
+ return 0xff;
+ }
void set_context_debugger(DEBUGGER* device)
{
d_debugger = device;
}
#endif
- void load_rom_image(const _TCHAR *file_path);
- uint8_t *get_rom_ptr();
-};
-#endif // USE_SHARED_DLL
+};
+
#endif
--- /dev/null
+/*
+ Skelton for retropc emulator
+
+ Origin : MAME 0.148
+ Author : Takeda.Toshiya
+ Date : 2013.05.01-
+
+ [ MCS48 ]
+*/
+
+#include "mcs48_flags.h"
+#include "mcs48.h"
+//#ifdef USE_DEBUGGER
+#include "debugger.h"
+//#endif
+
+/***************************************************************************
+
+ mcs48.c
+
+ Intel MCS-48/UPI-41 Portable Emulator
+
+ Copyright Mirko Buffoni
+ Based on the original work Copyright Dan Boris, an 8048 emulator
+ You are not allowed to distribute this software commercially
+
+****************************************************************************
+
+ Note that the default internal divisor for this chip is by 3 and
+ then again by 5, or by 15 total.
+
+***************************************************************************/
+
+#if defined(_MSC_VER) && (_MSC_VER >= 1400)
+#pragma warning( disable : 4244 )
+#endif
+
+
+/***************************************************************************
+ OPCODE HANDLERS
+***************************************************************************/
+
+
+__MCS48_OPHANDLER( illegal )
+{
+// logerror("MCS-48 PC:%04X - Illegal opcode = %02x\n", cpustate->pc - 1, __mcs48_program_r(cpustate->pc - 1));
+ return 1;
+}
+
+__MCS48_OPHANDLER( add_a_r0 ) { execute_add(cpustate, __mcs48_reg_r(0)); return 1; }
+__MCS48_OPHANDLER( add_a_r1 ) { execute_add(cpustate, __mcs48_reg_r(1)); return 1; }
+__MCS48_OPHANDLER( add_a_r2 ) { execute_add(cpustate, __mcs48_reg_r(2)); return 1; }
+__MCS48_OPHANDLER( add_a_r3 ) { execute_add(cpustate, __mcs48_reg_r(3)); return 1; }
+__MCS48_OPHANDLER( add_a_r4 ) { execute_add(cpustate, __mcs48_reg_r(4)); return 1; }
+__MCS48_OPHANDLER( add_a_r5 ) { execute_add(cpustate, __mcs48_reg_r(5)); return 1; }
+__MCS48_OPHANDLER( add_a_r6 ) { execute_add(cpustate, __mcs48_reg_r(6)); return 1; }
+__MCS48_OPHANDLER( add_a_r7 ) { execute_add(cpustate, __mcs48_reg_r(7)); return 1; }
+__MCS48_OPHANDLER( add_a_xr0 ) { execute_add(cpustate, __mcs48_ram_r(__mcs48_reg_r(0))); return 1; }
+__MCS48_OPHANDLER( add_a_xr1 ) { execute_add(cpustate, __mcs48_ram_r(__mcs48_reg_r(1))); return 1; }
+__MCS48_OPHANDLER( add_a_n ) { execute_add(cpustate, argument_fetch(cpustate)); return 2; }
+
+__MCS48_OPHANDLER( adc_a_r0 ) { execute_addc(cpustate, __mcs48_reg_r(0)); return 1; }
+__MCS48_OPHANDLER( adc_a_r1 ) { execute_addc(cpustate, __mcs48_reg_r(1)); return 1; }
+__MCS48_OPHANDLER( adc_a_r2 ) { execute_addc(cpustate, __mcs48_reg_r(2)); return 1; }
+__MCS48_OPHANDLER( adc_a_r3 ) { execute_addc(cpustate, __mcs48_reg_r(3)); return 1; }
+__MCS48_OPHANDLER( adc_a_r4 ) { execute_addc(cpustate, __mcs48_reg_r(4)); return 1; }
+__MCS48_OPHANDLER( adc_a_r5 ) { execute_addc(cpustate, __mcs48_reg_r(5)); return 1; }
+__MCS48_OPHANDLER( adc_a_r6 ) { execute_addc(cpustate, __mcs48_reg_r(6)); return 1; }
+__MCS48_OPHANDLER( adc_a_r7 ) { execute_addc(cpustate, __mcs48_reg_r(7)); return 1; }
+__MCS48_OPHANDLER( adc_a_xr0 ) { execute_addc(cpustate, __mcs48_ram_r(__mcs48_reg_r(0))); return 1; }
+__MCS48_OPHANDLER( adc_a_xr1 ) { execute_addc(cpustate, __mcs48_ram_r(__mcs48_reg_r(1))); return 1; }
+__MCS48_OPHANDLER( adc_a_n ) { execute_addc(cpustate, argument_fetch(cpustate)); return 2; }
+
+__MCS48_OPHANDLER( anl_a_r0 ) { cpustate->a &= __mcs48_reg_r(0); return 1; }
+__MCS48_OPHANDLER( anl_a_r1 ) { cpustate->a &= __mcs48_reg_r(1); return 1; }
+__MCS48_OPHANDLER( anl_a_r2 ) { cpustate->a &= __mcs48_reg_r(2); return 1; }
+__MCS48_OPHANDLER( anl_a_r3 ) { cpustate->a &= __mcs48_reg_r(3); return 1; }
+__MCS48_OPHANDLER( anl_a_r4 ) { cpustate->a &= __mcs48_reg_r(4); return 1; }
+__MCS48_OPHANDLER( anl_a_r5 ) { cpustate->a &= __mcs48_reg_r(5); return 1; }
+__MCS48_OPHANDLER( anl_a_r6 ) { cpustate->a &= __mcs48_reg_r(6); return 1; }
+__MCS48_OPHANDLER( anl_a_r7 ) { cpustate->a &= __mcs48_reg_r(7); return 1; }
+__MCS48_OPHANDLER( anl_a_xr0 ) { cpustate->a &= __mcs48_ram_r(__mcs48_reg_r(0)); return 1; }
+__MCS48_OPHANDLER( anl_a_xr1 ) { cpustate->a &= __mcs48_ram_r(__mcs48_reg_r(1)); return 1; }
+__MCS48_OPHANDLER( anl_a_n ) { cpustate->a &= argument_fetch(cpustate); return 2; }
+
+__MCS48_OPHANDLER( anl_bus_n ) { __mcs48_bus_w(__mcs48_bus_r() & argument_fetch(cpustate)); return 2; }
+__MCS48_OPHANDLER( anl_p1_n ) { __mcs48_port_w(1, cpustate->p1 &= argument_fetch(cpustate)); return 2; }
+__MCS48_OPHANDLER( anl_p2_n ) { __mcs48_port_w(2, cpustate->p2 &= argument_fetch(cpustate)); return 2; }
+__MCS48_OPHANDLER( anld_p4_a ) { expander_operation(cpustate, MCS48_EXPANDER_OP_AND, 4); return 2; }
+__MCS48_OPHANDLER( anld_p5_a ) { expander_operation(cpustate, MCS48_EXPANDER_OP_AND, 5); return 2; }
+__MCS48_OPHANDLER( anld_p6_a ) { expander_operation(cpustate, MCS48_EXPANDER_OP_AND, 6); return 2; }
+__MCS48_OPHANDLER( anld_p7_a ) { expander_operation(cpustate, MCS48_EXPANDER_OP_AND, 7); return 2; }
+
+__MCS48_OPHANDLER( call_0 ) { execute_call(cpustate, argument_fetch(cpustate) | 0x000); return 2; }
+__MCS48_OPHANDLER( call_1 ) { execute_call(cpustate, argument_fetch(cpustate) | 0x100); return 2; }
+__MCS48_OPHANDLER( call_2 ) { execute_call(cpustate, argument_fetch(cpustate) | 0x200); return 2; }
+__MCS48_OPHANDLER( call_3 ) { execute_call(cpustate, argument_fetch(cpustate) | 0x300); return 2; }
+__MCS48_OPHANDLER( call_4 ) { execute_call(cpustate, argument_fetch(cpustate) | 0x400); return 2; }
+__MCS48_OPHANDLER( call_5 ) { execute_call(cpustate, argument_fetch(cpustate) | 0x500); return 2; }
+__MCS48_OPHANDLER( call_6 ) { execute_call(cpustate, argument_fetch(cpustate) | 0x600); return 2; }
+__MCS48_OPHANDLER( call_7 ) { execute_call(cpustate, argument_fetch(cpustate) | 0x700); return 2; }
+
+__MCS48_OPHANDLER( clr_a ) { cpustate->a = 0; return 1; }
+__MCS48_OPHANDLER( clr_c ) { cpustate->psw &= ~C_FLAG; return 1; }
+__MCS48_OPHANDLER( clr_f0 ) { cpustate->psw &= ~F_FLAG; cpustate->sts &= ~STS_F0; return 1; }
+__MCS48_OPHANDLER( clr_f1 ) { cpustate->sts &= ~STS_F1; return 1; }
+
+__MCS48_OPHANDLER( cpl_a ) { cpustate->a ^= 0xff; return 1; }
+__MCS48_OPHANDLER( cpl_c ) { cpustate->psw ^= C_FLAG; return 1; }
+__MCS48_OPHANDLER( cpl_f0 ) { cpustate->psw ^= F_FLAG; cpustate->sts ^= STS_F0; return 1; }
+__MCS48_OPHANDLER( cpl_f1 ) { cpustate->sts ^= STS_F1; return 1; }
+
+__MCS48_OPHANDLER( da_a )
+{
+ if ((cpustate->a & 0x0f) > 0x09 || (cpustate->psw & A_FLAG))
+ {
+ cpustate->a += 0x06;
+ if ((cpustate->a & 0xf0) == 0x00)
+ cpustate->psw |= C_FLAG;
+ }
+ if ((cpustate->a & 0xf0) > 0x90 || (cpustate->psw & C_FLAG))
+ {
+ cpustate->a += 0x60;
+ cpustate->psw |= C_FLAG;
+ }
+ else
+ cpustate->psw &= ~C_FLAG;
+ return 1;
+}
+
+__MCS48_OPHANDLER( dec_a ) { cpustate->a--; return 1; }
+__MCS48_OPHANDLER( dec_r0 ) { __mcs48_reg_w(0, __mcs48_reg_r(0) - 1); return 1; }
+__MCS48_OPHANDLER( dec_r1 ) { __mcs48_reg_w(1, __mcs48_reg_r(1) - 1); return 1; }
+__MCS48_OPHANDLER( dec_r2 ) { __mcs48_reg_w(2, __mcs48_reg_r(2) - 1); return 1; }
+__MCS48_OPHANDLER( dec_r3 ) { __mcs48_reg_w(3, __mcs48_reg_r(3) - 1); return 1; }
+__MCS48_OPHANDLER( dec_r4 ) { __mcs48_reg_w(4, __mcs48_reg_r(4) - 1); return 1; }
+__MCS48_OPHANDLER( dec_r5 ) { __mcs48_reg_w(5, __mcs48_reg_r(5) - 1); return 1; }
+__MCS48_OPHANDLER( dec_r6 ) { __mcs48_reg_w(6, __mcs48_reg_r(6) - 1); return 1; }
+__MCS48_OPHANDLER( dec_r7 ) { __mcs48_reg_w(7, __mcs48_reg_r(7) - 1); return 1; }
+
+__MCS48_OPHANDLER( dis_i ) { cpustate->xirq_enabled = FALSE; return 1; }
+__MCS48_OPHANDLER( dis_tcnti ) { cpustate->tirq_enabled = FALSE; cpustate->timer_overflow = FALSE; return 1; }
+
+__MCS48_OPHANDLER( djnz_r0 ) { UINT8 r0 = __mcs48_reg_r(0); __mcs48_reg_w(0, --r0); execute_jcc(cpustate, r0 != 0); return 2; }
+__MCS48_OPHANDLER( djnz_r1 ) { UINT8 r1 = __mcs48_reg_r(1); __mcs48_reg_w(1, --r1); execute_jcc(cpustate, r1 != 0); return 2; }
+__MCS48_OPHANDLER( djnz_r2 ) { UINT8 r2 = __mcs48_reg_r(2); __mcs48_reg_w(2, --r2); execute_jcc(cpustate, r2 != 0); return 2; }
+__MCS48_OPHANDLER( djnz_r3 ) { UINT8 r3 = __mcs48_reg_r(3); __mcs48_reg_w(3, --r3); execute_jcc(cpustate, r3 != 0); return 2; }
+__MCS48_OPHANDLER( djnz_r4 ) { UINT8 r4 = __mcs48_reg_r(4); __mcs48_reg_w(4, --r4); execute_jcc(cpustate, r4 != 0); return 2; }
+__MCS48_OPHANDLER( djnz_r5 ) { UINT8 r5 = __mcs48_reg_r(5); __mcs48_reg_w(5, --r5); execute_jcc(cpustate, r5 != 0); return 2; }
+__MCS48_OPHANDLER( djnz_r6 ) { UINT8 r6 = __mcs48_reg_r(6); __mcs48_reg_w(6, --r6); execute_jcc(cpustate, r6 != 0); return 2; }
+__MCS48_OPHANDLER( djnz_r7 ) { UINT8 r7 = __mcs48_reg_r(7); __mcs48_reg_w(7, --r7); execute_jcc(cpustate, r7 != 0); return 2; }
+
+__MCS48_OPHANDLER( en_i ) { cpustate->xirq_enabled = TRUE; return 1 + check_irqs(cpustate); }
+__MCS48_OPHANDLER( en_tcnti ) { cpustate->tirq_enabled = TRUE; return 1 + check_irqs(cpustate); }
+__MCS48_OPHANDLER( ent0_clk ) { cpustate->t0_clk_enabled = TRUE; return 1; }
+
+__MCS48_OPHANDLER( in_a_p1 ) { cpustate->a = __mcs48_port_r(1) & cpustate->p1; return 2; }
+__MCS48_OPHANDLER( in_a_p2 ) { cpustate->a = __mcs48_port_r(2) & cpustate->p2; return 2; }
+__MCS48_OPHANDLER( ins_a_bus ) { cpustate->a = __mcs48_bus_r(); return 2; }
+
+__MCS48_OPHANDLER( inc_a ) { cpustate->a++; return 1; }
+__MCS48_OPHANDLER( inc_r0 ) { __mcs48_reg_w(0, __mcs48_reg_r(0) + 1); return 1; }
+__MCS48_OPHANDLER( inc_r1 ) { __mcs48_reg_w(1, __mcs48_reg_r(1) + 1); return 1; }
+__MCS48_OPHANDLER( inc_r2 ) { __mcs48_reg_w(2, __mcs48_reg_r(2) + 1); return 1; }
+__MCS48_OPHANDLER( inc_r3 ) { __mcs48_reg_w(3, __mcs48_reg_r(3) + 1); return 1; }
+__MCS48_OPHANDLER( inc_r4 ) { __mcs48_reg_w(4, __mcs48_reg_r(4) + 1); return 1; }
+__MCS48_OPHANDLER( inc_r5 ) { __mcs48_reg_w(5, __mcs48_reg_r(5) + 1); return 1; }
+__MCS48_OPHANDLER( inc_r6 ) { __mcs48_reg_w(6, __mcs48_reg_r(6) + 1); return 1; }
+__MCS48_OPHANDLER( inc_r7 ) { __mcs48_reg_w(7, __mcs48_reg_r(7) + 1); return 1; }
+__MCS48_OPHANDLER( inc_xr0 ) { UINT8 r0 = __mcs48_reg_r(0); __mcs48_ram_w(r0, __mcs48_ram_r(r0) + 1); return 1; }
+__MCS48_OPHANDLER( inc_xr1 ) { UINT8 r1 = __mcs48_reg_r(1); __mcs48_ram_w(r1, __mcs48_ram_r(r1) + 1); return 1; }
+
+__MCS48_OPHANDLER( jb_0 ) { execute_jcc(cpustate, (cpustate->a & 0x01) != 0); return 2; }
+__MCS48_OPHANDLER( jb_1 ) { execute_jcc(cpustate, (cpustate->a & 0x02) != 0); return 2; }
+__MCS48_OPHANDLER( jb_2 ) { execute_jcc(cpustate, (cpustate->a & 0x04) != 0); return 2; }
+__MCS48_OPHANDLER( jb_3 ) { execute_jcc(cpustate, (cpustate->a & 0x08) != 0); return 2; }
+__MCS48_OPHANDLER( jb_4 ) { execute_jcc(cpustate, (cpustate->a & 0x10) != 0); return 2; }
+__MCS48_OPHANDLER( jb_5 ) { execute_jcc(cpustate, (cpustate->a & 0x20) != 0); return 2; }
+__MCS48_OPHANDLER( jb_6 ) { execute_jcc(cpustate, (cpustate->a & 0x40) != 0); return 2; }
+__MCS48_OPHANDLER( jb_7 ) { execute_jcc(cpustate, (cpustate->a & 0x80) != 0); return 2; }
+__MCS48_OPHANDLER( jc ) { execute_jcc(cpustate, (cpustate->psw & C_FLAG) != 0); return 2; }
+__MCS48_OPHANDLER( jf0 ) { execute_jcc(cpustate, (cpustate->psw & F_FLAG) != 0); return 2; }
+__MCS48_OPHANDLER( jf1 ) { execute_jcc(cpustate, (cpustate->sts & STS_F1) != 0); return 2; }
+__MCS48_OPHANDLER( jnc ) { execute_jcc(cpustate, (cpustate->psw & C_FLAG) == 0); return 2; }
+__MCS48_OPHANDLER( jni ) { execute_jcc(cpustate, cpustate->int_state == 0); return 2; }
+__MCS48_OPHANDLER( jnt_0 ) { execute_jcc(cpustate, __mcs48_test_r(0) == 0); return 2; }
+__MCS48_OPHANDLER( jnt_1 ) { execute_jcc(cpustate, __mcs48_test_r(1) == 0); return 2; }
+__MCS48_OPHANDLER( jnz ) { execute_jcc(cpustate, cpustate->a != 0); return 2; }
+__MCS48_OPHANDLER( jtf ) { execute_jcc(cpustate, cpustate->timer_flag); cpustate->timer_flag = FALSE; return 2; }
+__MCS48_OPHANDLER( jt_0 ) { execute_jcc(cpustate, __mcs48_test_r(0) != 0); return 2; }
+__MCS48_OPHANDLER( jt_1 ) { execute_jcc(cpustate, __mcs48_test_r(1) != 0); return 2; }
+__MCS48_OPHANDLER( jz ) { execute_jcc(cpustate, cpustate->a == 0); return 2; }
+
+__MCS48_OPHANDLER( jmp_0 ) { execute_jmp(cpustate, argument_fetch(cpustate) | 0x000); return 2; }
+__MCS48_OPHANDLER( jmp_1 ) { execute_jmp(cpustate, argument_fetch(cpustate) | 0x100); return 2; }
+__MCS48_OPHANDLER( jmp_2 ) { execute_jmp(cpustate, argument_fetch(cpustate) | 0x200); return 2; }
+__MCS48_OPHANDLER( jmp_3 ) { execute_jmp(cpustate, argument_fetch(cpustate) | 0x300); return 2; }
+__MCS48_OPHANDLER( jmp_4 ) { execute_jmp(cpustate, argument_fetch(cpustate) | 0x400); return 2; }
+__MCS48_OPHANDLER( jmp_5 ) { execute_jmp(cpustate, argument_fetch(cpustate) | 0x500); return 2; }
+__MCS48_OPHANDLER( jmp_6 ) { execute_jmp(cpustate, argument_fetch(cpustate) | 0x600); return 2; }
+__MCS48_OPHANDLER( jmp_7 ) { execute_jmp(cpustate, argument_fetch(cpustate) | 0x700); return 2; }
+__MCS48_OPHANDLER( jmpp_xa ) { cpustate->pc &= 0xf00; cpustate->pc |= __mcs48_program_r(cpustate->pc | cpustate->a); return 2; }
+
+__MCS48_OPHANDLER( mov_a_n ) { cpustate->a = argument_fetch(cpustate); return 2; }
+__MCS48_OPHANDLER( mov_a_psw ) { cpustate->a = cpustate->psw; return 1; }
+__MCS48_OPHANDLER( mov_a_r0 ) { cpustate->a = __mcs48_reg_r(0); return 1; }
+__MCS48_OPHANDLER( mov_a_r1 ) { cpustate->a = __mcs48_reg_r(1); return 1; }
+__MCS48_OPHANDLER( mov_a_r2 ) { cpustate->a = __mcs48_reg_r(2); return 1; }
+__MCS48_OPHANDLER( mov_a_r3 ) { cpustate->a = __mcs48_reg_r(3); return 1; }
+__MCS48_OPHANDLER( mov_a_r4 ) { cpustate->a = __mcs48_reg_r(4); return 1; }
+__MCS48_OPHANDLER( mov_a_r5 ) { cpustate->a = __mcs48_reg_r(5); return 1; }
+__MCS48_OPHANDLER( mov_a_r6 ) { cpustate->a = __mcs48_reg_r(6); return 1; }
+__MCS48_OPHANDLER( mov_a_r7 ) { cpustate->a = __mcs48_reg_r(7); return 1; }
+__MCS48_OPHANDLER( mov_a_xr0 ) { cpustate->a = __mcs48_ram_r(__mcs48_reg_r(0)); return 1; }
+__MCS48_OPHANDLER( mov_a_xr1 ) { cpustate->a = __mcs48_ram_r(__mcs48_reg_r(1)); return 1; }
+__MCS48_OPHANDLER( mov_a_t ) { cpustate->a = cpustate->timer; return 1; }
+
+__MCS48_OPHANDLER( mov_psw_a ) { cpustate->psw = cpustate->a; update_regptr(cpustate); return 1; }
+__MCS48_OPHANDLER( mov_r0_a ) { __mcs48_reg_w(0, cpustate->a); return 1; }
+__MCS48_OPHANDLER( mov_r1_a ) { __mcs48_reg_w(1, cpustate->a); return 1; }
+__MCS48_OPHANDLER( mov_r2_a ) { __mcs48_reg_w(2, cpustate->a); return 1; }
+__MCS48_OPHANDLER( mov_r3_a ) { __mcs48_reg_w(3, cpustate->a); return 1; }
+__MCS48_OPHANDLER( mov_r4_a ) { __mcs48_reg_w(4, cpustate->a); return 1; }
+__MCS48_OPHANDLER( mov_r5_a ) { __mcs48_reg_w(5, cpustate->a); return 1; }
+__MCS48_OPHANDLER( mov_r6_a ) { __mcs48_reg_w(6, cpustate->a); return 1; }
+__MCS48_OPHANDLER( mov_r7_a ) { __mcs48_reg_w(7, cpustate->a); return 1; }
+__MCS48_OPHANDLER( mov_r0_n ) { __mcs48_reg_w(0, argument_fetch(cpustate)); return 2; }
+__MCS48_OPHANDLER( mov_r1_n ) { __mcs48_reg_w(1, argument_fetch(cpustate)); return 2; }
+__MCS48_OPHANDLER( mov_r2_n ) { __mcs48_reg_w(2, argument_fetch(cpustate)); return 2; }
+__MCS48_OPHANDLER( mov_r3_n ) { __mcs48_reg_w(3, argument_fetch(cpustate)); return 2; }
+__MCS48_OPHANDLER( mov_r4_n ) { __mcs48_reg_w(4, argument_fetch(cpustate)); return 2; }
+__MCS48_OPHANDLER( mov_r5_n ) { __mcs48_reg_w(5, argument_fetch(cpustate)); return 2; }
+__MCS48_OPHANDLER( mov_r6_n ) { __mcs48_reg_w(6, argument_fetch(cpustate)); return 2; }
+__MCS48_OPHANDLER( mov_r7_n ) { __mcs48_reg_w(7, argument_fetch(cpustate)); return 2; }
+__MCS48_OPHANDLER( mov_t_a ) { cpustate->timer = cpustate->a; return 1; }
+__MCS48_OPHANDLER( mov_xr0_a ) { __mcs48_ram_w(__mcs48_reg_r(0), cpustate->a); return 1; }
+__MCS48_OPHANDLER( mov_xr1_a ) { __mcs48_ram_w(__mcs48_reg_r(1), cpustate->a); return 1; }
+__MCS48_OPHANDLER( mov_xr0_n ) { __mcs48_ram_w(__mcs48_reg_r(0), argument_fetch(cpustate)); return 2; }
+__MCS48_OPHANDLER( mov_xr1_n ) { __mcs48_ram_w(__mcs48_reg_r(1), argument_fetch(cpustate)); return 2; }
+
+__MCS48_OPHANDLER( movd_a_p4 ) { expander_operation(cpustate, MCS48_EXPANDER_OP_READ, 4); return 2; }
+__MCS48_OPHANDLER( movd_a_p5 ) { expander_operation(cpustate, MCS48_EXPANDER_OP_READ, 5); return 2; }
+__MCS48_OPHANDLER( movd_a_p6 ) { expander_operation(cpustate, MCS48_EXPANDER_OP_READ, 6); return 2; }
+__MCS48_OPHANDLER( movd_a_p7 ) { expander_operation(cpustate, MCS48_EXPANDER_OP_READ, 7); return 2; }
+__MCS48_OPHANDLER( movd_p4_a ) { expander_operation(cpustate, MCS48_EXPANDER_OP_WRITE, 4); return 2; }
+__MCS48_OPHANDLER( movd_p5_a ) { expander_operation(cpustate, MCS48_EXPANDER_OP_WRITE, 5); return 2; }
+__MCS48_OPHANDLER( movd_p6_a ) { expander_operation(cpustate, MCS48_EXPANDER_OP_WRITE, 6); return 2; }
+__MCS48_OPHANDLER( movd_p7_a ) { expander_operation(cpustate, MCS48_EXPANDER_OP_WRITE, 7); return 2; }
+
+__MCS48_OPHANDLER( movp_a_xa ) { cpustate->a = __mcs48_program_r((cpustate->pc & 0xf00) | cpustate->a); return 2; }
+__MCS48_OPHANDLER( movp3_a_xa ) { cpustate->a = __mcs48_program_r(0x300 | cpustate->a); return 2; }
+
+__MCS48_OPHANDLER( movx_a_xr0 ) { cpustate->a = __mcs48_ext_r(__mcs48_reg_r(0)); return 2; }
+__MCS48_OPHANDLER( movx_a_xr1 ) { cpustate->a = __mcs48_ext_r(__mcs48_reg_r(1)); return 2; }
+__MCS48_OPHANDLER( movx_xr0_a ) { __mcs48_ext_w(__mcs48_reg_r(0), cpustate->a); return 2; }
+__MCS48_OPHANDLER( movx_xr1_a ) { __mcs48_ext_w(__mcs48_reg_r(1), cpustate->a); return 2; }
+
+__MCS48_OPHANDLER( nop ) { return 1; }
+
+__MCS48_OPHANDLER( orl_a_r0 ) { cpustate->a |= __mcs48_reg_r(0); return 1; }
+__MCS48_OPHANDLER( orl_a_r1 ) { cpustate->a |= __mcs48_reg_r(1); return 1; }
+__MCS48_OPHANDLER( orl_a_r2 ) { cpustate->a |= __mcs48_reg_r(2); return 1; }
+__MCS48_OPHANDLER( orl_a_r3 ) { cpustate->a |= __mcs48_reg_r(3); return 1; }
+__MCS48_OPHANDLER( orl_a_r4 ) { cpustate->a |= __mcs48_reg_r(4); return 1; }
+__MCS48_OPHANDLER( orl_a_r5 ) { cpustate->a |= __mcs48_reg_r(5); return 1; }
+__MCS48_OPHANDLER( orl_a_r6 ) { cpustate->a |= __mcs48_reg_r(6); return 1; }
+__MCS48_OPHANDLER( orl_a_r7 ) { cpustate->a |= __mcs48_reg_r(7); return 1; }
+__MCS48_OPHANDLER( orl_a_xr0 ) { cpustate->a |= __mcs48_ram_r(__mcs48_reg_r(0)); return 1; }
+__MCS48_OPHANDLER( orl_a_xr1 ) { cpustate->a |= __mcs48_ram_r(__mcs48_reg_r(1)); return 1; }
+__MCS48_OPHANDLER( orl_a_n ) { cpustate->a |= argument_fetch(cpustate); return 2; }
+
+__MCS48_OPHANDLER( orl_bus_n ) { __mcs48_bus_w(__mcs48_bus_r() | argument_fetch(cpustate)); return 2; }
+__MCS48_OPHANDLER( orl_p1_n ) { __mcs48_port_w(1, cpustate->p1 |= argument_fetch(cpustate)); return 2; }
+__MCS48_OPHANDLER( orl_p2_n ) { __mcs48_port_w(2, cpustate->p2 |= argument_fetch(cpustate)); return 2; }
+__MCS48_OPHANDLER( orld_p4_a ) { expander_operation(cpustate, MCS48_EXPANDER_OP_OR, 4); return 2; }
+__MCS48_OPHANDLER( orld_p5_a ) { expander_operation(cpustate, MCS48_EXPANDER_OP_OR, 5); return 2; }
+__MCS48_OPHANDLER( orld_p6_a ) { expander_operation(cpustate, MCS48_EXPANDER_OP_OR, 6); return 2; }
+__MCS48_OPHANDLER( orld_p7_a ) { expander_operation(cpustate, MCS48_EXPANDER_OP_OR, 7); return 2; }
+
+__MCS48_OPHANDLER( outl_bus_a ) { __mcs48_bus_w(cpustate->a); return 2; }
+__MCS48_OPHANDLER( outl_p1_a ) { __mcs48_port_w(1, cpustate->p1 = cpustate->a); return 2; }
+__MCS48_OPHANDLER( outl_p2_a ) { __mcs48_port_w(2, cpustate->p2 = cpustate->a); return 2; }
+
+__MCS48_OPHANDLER( ret ) { pull_pc(cpustate); return 2; }
+__MCS48_OPHANDLER( retr )
+{
+ pull_pc_psw(cpustate);
+
+ /* implicitly clear the IRQ in progress flip flop and re-check interrupts */
+ cpustate->irq_in_progress = FALSE;
+ return 2 + check_irqs(cpustate);
+}
+
+__MCS48_OPHANDLER( rl_a ) { cpustate->a = (cpustate->a << 1) | (cpustate->a >> 7); return 1; }
+__MCS48_OPHANDLER( rlc_a ) { UINT8 newc = cpustate->a & C_FLAG; cpustate->a = (cpustate->a << 1) | (cpustate->psw >> 7); cpustate->psw = (cpustate->psw & ~C_FLAG) | newc; return 1; }
+
+__MCS48_OPHANDLER( rr_a ) { cpustate->a = (cpustate->a >> 1) | (cpustate->a << 7); return 1; }
+__MCS48_OPHANDLER( rrc_a ) { UINT8 newc = (cpustate->a << 7) & C_FLAG; cpustate->a = (cpustate->a >> 1) | (cpustate->psw & C_FLAG); cpustate->psw = (cpustate->psw & ~C_FLAG) | newc; return 1; }
+
+__MCS48_OPHANDLER( sel_mb0 ) { cpustate->a11 = 0x000; return 1; }
+__MCS48_OPHANDLER( sel_mb1 ) { cpustate->a11 = 0x800; return 1; }
+
+__MCS48_OPHANDLER( sel_rb0 ) { cpustate->psw &= ~B_FLAG; update_regptr(cpustate); return 1; }
+__MCS48_OPHANDLER( sel_rb1 ) { cpustate->psw |= B_FLAG; update_regptr(cpustate); return 1; }
+
+__MCS48_OPHANDLER( stop_tcnt ) { cpustate->timecount_enabled = 0; return 1; }
+
+__MCS48_OPHANDLER( strt_cnt ) { cpustate->timecount_enabled = __MCS48_COUNTER_ENABLED; cpustate->t1_history = __mcs48_test_r(1); return 1; }
+__MCS48_OPHANDLER( strt_t ) { cpustate->timecount_enabled = __MCS48_TIMER_ENABLED; cpustate->prescaler = 0; return 1; }
+
+__MCS48_OPHANDLER( swap_a ) { cpustate->a = (cpustate->a << 4) | (cpustate->a >> 4); return 1; }
+
+__MCS48_OPHANDLER( xch_a_r0 ) { UINT8 tmp = cpustate->a; cpustate->a = __mcs48_reg_r(0); __mcs48_reg_w(0, tmp); return 1; }
+__MCS48_OPHANDLER( xch_a_r1 ) { UINT8 tmp = cpustate->a; cpustate->a = __mcs48_reg_r(1); __mcs48_reg_w(1, tmp); return 1; }
+__MCS48_OPHANDLER( xch_a_r2 ) { UINT8 tmp = cpustate->a; cpustate->a = __mcs48_reg_r(2); __mcs48_reg_w(2, tmp); return 1; }
+__MCS48_OPHANDLER( xch_a_r3 ) { UINT8 tmp = cpustate->a; cpustate->a = __mcs48_reg_r(3); __mcs48_reg_w(3, tmp); return 1; }
+__MCS48_OPHANDLER( xch_a_r4 ) { UINT8 tmp = cpustate->a; cpustate->a = __mcs48_reg_r(4); __mcs48_reg_w(4, tmp); return 1; }
+__MCS48_OPHANDLER( xch_a_r5 ) { UINT8 tmp = cpustate->a; cpustate->a = __mcs48_reg_r(5); __mcs48_reg_w(5, tmp); return 1; }
+__MCS48_OPHANDLER( xch_a_r6 ) { UINT8 tmp = cpustate->a; cpustate->a = __mcs48_reg_r(6); __mcs48_reg_w(6, tmp); return 1; }
+__MCS48_OPHANDLER( xch_a_r7 ) { UINT8 tmp = cpustate->a; cpustate->a = __mcs48_reg_r(7); __mcs48_reg_w(7, tmp); return 1; }
+__MCS48_OPHANDLER( xch_a_xr0 ) { UINT8 r0 = __mcs48_reg_r(0); UINT8 tmp = cpustate->a; cpustate->a = __mcs48_ram_r(r0); __mcs48_ram_w(r0, tmp); return 1; }
+__MCS48_OPHANDLER( xch_a_xr1 ) { UINT8 r1 = __mcs48_reg_r(1); UINT8 tmp = cpustate->a; cpustate->a = __mcs48_ram_r(r1); __mcs48_ram_w(r1, tmp); return 1; }
+
+__MCS48_OPHANDLER( xchd_a_xr0 ) { UINT8 r0 = __mcs48_reg_r(0); UINT8 oldram = __mcs48_ram_r(r0); __mcs48_ram_w(r0, (oldram & 0xf0) | (cpustate->a & 0x0f)); cpustate->a = (cpustate->a & 0xf0) | (oldram & 0x0f); return 1; }
+__MCS48_OPHANDLER( xchd_a_xr1 ) { UINT8 r1 = __mcs48_reg_r(1); UINT8 oldram = __mcs48_ram_r(r1); __mcs48_ram_w(r1, (oldram & 0xf0) | (cpustate->a & 0x0f)); cpustate->a = (cpustate->a & 0xf0) | (oldram & 0x0f); return 1; }
+
+__MCS48_OPHANDLER( xrl_a_r0 ) { cpustate->a ^= __mcs48_reg_r(0); return 1; }
+__MCS48_OPHANDLER( xrl_a_r1 ) { cpustate->a ^= __mcs48_reg_r(1); return 1; }
+__MCS48_OPHANDLER( xrl_a_r2 ) { cpustate->a ^= __mcs48_reg_r(2); return 1; }
+__MCS48_OPHANDLER( xrl_a_r3 ) { cpustate->a ^= __mcs48_reg_r(3); return 1; }
+__MCS48_OPHANDLER( xrl_a_r4 ) { cpustate->a ^= __mcs48_reg_r(4); return 1; }
+__MCS48_OPHANDLER( xrl_a_r5 ) { cpustate->a ^= __mcs48_reg_r(5); return 1; }
+__MCS48_OPHANDLER( xrl_a_r6 ) { cpustate->a ^= __mcs48_reg_r(6); return 1; }
+__MCS48_OPHANDLER( xrl_a_r7 ) { cpustate->a ^= __mcs48_reg_r(7); return 1; }
+__MCS48_OPHANDLER( xrl_a_xr0 ) { cpustate->a ^= __mcs48_ram_r(__mcs48_reg_r(0)); return 1; }
+__MCS48_OPHANDLER( xrl_a_xr1 ) { cpustate->a ^= __mcs48_ram_r(__mcs48_reg_r(1)); return 1; }
+__MCS48_OPHANDLER( xrl_a_n ) { cpustate->a ^= argument_fetch(cpustate); return 2; }
+
+/***************************************************************************
+ OPCODE TABLES
+***************************************************************************/
+
+
+/***************************************************************************
+ INITIALIZATION/RESET
+***************************************************************************/
+
+void MCS48_BASE::initialize()
+{
+ // Dummy function
+}
+
+void MCS48_BASE::release()
+{
+ // Dummy function
+}
+
+void MCS48_BASE::reset()
+{
+ mcs48_state *cpustate = (mcs48_state *)opaque;
+
+ /* confirmed from reset description */
+ cpustate->pc = 0;
+ cpustate->psw = (cpustate->psw & (C_FLAG | A_FLAG)) | 0x08;
+ cpustate->a11 = 0x000;
+// __mcs48_bus_w(0xff);
+ cpustate->p1 = 0xff;
+ cpustate->p2 = 0xff;
+// __mcs48_port_w(1, cpustate->p1);
+// __mcs48_port_w(2, cpustate->p2);
+ cpustate->tirq_enabled = FALSE;
+ cpustate->xirq_enabled = FALSE;
+ cpustate->t0_clk_enabled = FALSE;
+ cpustate->timecount_enabled = 0;
+ cpustate->timer_flag = FALSE;
+ cpustate->sts = 0;
+
+ cpustate->icount = 0;
+
+ /* confirmed from interrupt logic description */
+ cpustate->int_state = TRUE;
+ cpustate->irq_state = cpustate->irq_in_progress = FALSE;
+ cpustate->timer_overflow = FALSE;
+}
+
+void MCS48_BASE::load_rom_image(const _TCHAR *file_path)
+{
+ mcs48_state *cpustate = (mcs48_state *)opaque;
+
+ memset(cpustate->rom, 0, sizeof(cpustate->rom));
+
+ FILEIO* fio = new FILEIO();
+ if(fio->Fopen(file_path, FILEIO_READ_BINARY)) {
+ fio->Fread(cpustate->rom, sizeof(cpustate->rom), 1);
+ fio->Fclose();
+ }
+ delete fio;
+}
+
+uint8_t *MCS48_BASE::get_rom_ptr()
+{
+ mcs48_state *cpustate = (mcs48_state *)opaque;
+ return cpustate->rom;
+}
+
+/***************************************************************************
+ EXECUTION
+***************************************************************************/
+
+
+int MCS48_BASE::op_call(mcs48_state *cpustate)
+{
+ unsigned opcode = opcode_fetch(cpustate);
+
+ /* process opcode and count cycles */
+ return (this->*opcode_table[opcode])(cpustate);
+}
+
+int MCS48_BASE::run(int icount)
+{
+ // Dummy
+ return icount;
+}
+
+uint32_t MCS48_BASE::get_pc()
+{
+ mcs48_state *cpustate = (mcs48_state *)opaque;
+ return cpustate->prevpc;
+}
+
+uint32_t MCS48_BASE::get_next_pc()
+{
+ mcs48_state *cpustate = (mcs48_state *)opaque;
+ return cpustate->pc;
+}
+
+/***************************************************************************
+ GENERAL CONTEXT ACCESS
+***************************************************************************/
+
+void MCS48_BASE::write_signal(int id, uint32_t data, uint32_t mask)
+{
+ mcs48_state *cpustate = (mcs48_state *)opaque;
+
+ if(id == SIG_CPU_IRQ) {
+ UINT8 prev = cpustate->int_state;
+ cpustate->int_state = ((data & mask) != 0);
+ // INT H->L
+ if(prev && !cpustate->int_state) {
+ cpustate->irq_state = TRUE;
+ }
+ }
+}
+
+//#ifdef USE_DEBUGGER
+void MCS48_BASE::write_debug_data8(uint32_t addr, uint32_t data)
+{
+ d_mem_stored->write_data8(addr, data);
+}
+
+uint32_t MCS48_BASE::read_debug_data8(uint32_t addr)
+{
+ return d_mem_stored->read_data8(addr);
+}
+
+void MCS48_BASE::write_debug_io8(uint32_t addr, uint32_t data)
+{
+ d_io_stored->write_io8(addr, data);
+}
+
+uint32_t MCS48_BASE::read_debug_io8(uint32_t addr)
+{
+ return d_io_stored->read_io8(addr);
+}
+
+bool MCS48_BASE::write_debug_reg(const _TCHAR *reg, uint32_t data)
+{
+ mcs48_state *cpustate = (mcs48_state *)opaque;
+
+ if(_tcsicmp(reg, _T("R0")) == 0) {
+ __mcs48_reg_w(0, data);
+ } else if(_tcsicmp(reg, _T("R1")) == 0) {
+ __mcs48_reg_w(1, data);
+ } else if(_tcsicmp(reg, _T("R2")) == 0) {
+ __mcs48_reg_w(2, data);
+ } else if(_tcsicmp(reg, _T("R3")) == 0) {
+ __mcs48_reg_w(3, data);
+ } else if(_tcsicmp(reg, _T("R4")) == 0) {
+ __mcs48_reg_w(4, data);
+ } else if(_tcsicmp(reg, _T("R5")) == 0) {
+ __mcs48_reg_w(5, data);
+ } else if(_tcsicmp(reg, _T("R6")) == 0) {
+ __mcs48_reg_w(6, data);
+ } else if(_tcsicmp(reg, _T("R7")) == 0) {
+ __mcs48_reg_w(7, data);
+ } else {
+ return false;
+ }
+ return true;
+}
+
+void MCS48_BASE::get_debug_regs_info(_TCHAR *buffer, size_t buffer_len)
+{
+/*
+R0 = 00 R1 = 00 R2 = 00 R3 = 00 (R0)= 00 (R1)= 00 (SP-1)= 0000 PC = 0000
+R4 = 00 R5 = 00 R6 = 00 R7 = 00 AC = 00 SP = 00 [MB F1 C AC F0 BS]
+*/
+ mcs48_state *cpustate = (mcs48_state *)opaque;
+ UINT8 sp = 8 + 2 * (cpustate->psw & 7);
+ UINT8 prev_sp = 8 + 2 * ((cpustate->psw - 1) & 7);
+
+ my_stprintf_s(buffer, buffer_len,
+ _T("R0 = %02X R1 = %02X R2 = %02X R3 = %02X (R0)= %02X (R1)= %02X (SP-1)= %04X PC = %04X\nR4 = %02X R5 = %02X R6 = %02X R7 = %02X AC = %02X SP = %02X [%s %s %s %s %s %s]"),
+ __mcs48_reg_r(0), __mcs48_reg_r(1), __mcs48_reg_r(2), __mcs48_reg_r(3), d_mem_stored->read_data8(__mcs48_reg_r(0)), d_mem_stored->read_data8(__mcs48_reg_r(1)),
+ d_mem_stored->read_data8(prev_sp) | (d_mem_stored->read_data8(prev_sp + 1) << 8), cpustate->pc,
+ __mcs48_reg_r(4), __mcs48_reg_r(5), __mcs48_reg_r(6), __mcs48_reg_r(7), cpustate->a, sp,
+ (cpustate->a11 == 0x800) ? _T("MB") : _T("--"), (cpustate->sts & STS_F1) ? _T("F1") : _T("--"),
+ (cpustate->psw & C_FLAG) ? _T("C" ) : _T("-" ), (cpustate->psw & A_FLAG) ? _T("AC") : _T("--"),
+ (cpustate->psw & F_FLAG) ? _T("F0") : _T("--"), (cpustate->psw & B_FLAG) ? _T("BS") : _T("--"));
+}
+
+// license:BSD-3-Clause
+// copyright-holders:Aaron Giles
+/***************************************************************************
+
+ mcs48dsm.c
+
+ Simple MCS-48/UPI-41 disassembler.
+ Written by Aaron Giles
+
+***************************************************************************/
+
+int MCS48_BASE::debug_dasm(uint32_t pc, _TCHAR *buffer, size_t buffer_len)
+{
+ mcs48_state *cpustate = (mcs48_state *)opaque;
+ uint32_t ptr = pc;
+
+ #define upi41 false
+
+ switch (__mcs48_program_r(ptr++))
+ {
+ case 0x00: my_stprintf_s(buffer, buffer_len, _T("nop")); break;
+ case 0x02: if (!upi41) {
+ my_stprintf_s(buffer, buffer_len, _T("out bus,a"));
+ } else {
+ my_stprintf_s(buffer, buffer_len, _T("out dbb,a"));
+ }
+ break;
+ case 0x03: my_stprintf_s(buffer, buffer_len, _T("add a,#$%02X"), __mcs48_program_r(ptr++)); break;
+ case 0x04: my_stprintf_s(buffer, buffer_len, _T("jmp %s"), get_value_or_symbol(d_debugger->first_symbol, _T("$%03X"), 0x000 | __mcs48_program_r(ptr++))); break;
+ case 0x05: my_stprintf_s(buffer, buffer_len, _T("en i")); break;
+ case 0x07: my_stprintf_s(buffer, buffer_len, _T("dec a")); break;
+ case 0x08: if (!upi41) {
+ my_stprintf_s(buffer, buffer_len, _T("in a,bus"));
+ } else {
+ my_stprintf_s(buffer, buffer_len, _T("illegal"));
+ }
+ break;
+ case 0x09: my_stprintf_s(buffer, buffer_len, _T("in a,p1")); break;
+ case 0x0a: my_stprintf_s(buffer, buffer_len, _T("in a,p2")); break;
+ case 0x0c: my_stprintf_s(buffer, buffer_len, _T("movd a,p4")); break;
+ case 0x0d: my_stprintf_s(buffer, buffer_len, _T("movd a,p5")); break;
+ case 0x0e: my_stprintf_s(buffer, buffer_len, _T("movd a,p6")); break;
+ case 0x0f: my_stprintf_s(buffer, buffer_len, _T("movd a,p7")); break;
+ case 0x10: my_stprintf_s(buffer, buffer_len, _T("inc @r0")); break;
+ case 0x11: my_stprintf_s(buffer, buffer_len, _T("inc @r1")); break;
+ case 0x12: my_stprintf_s(buffer, buffer_len, _T("jb0 %s"), get_value_or_symbol(d_debugger->first_symbol, _T("$%03X"), (pc & 0xf00) | __mcs48_program_r(ptr++))); break;
+ case 0x13: my_stprintf_s(buffer, buffer_len, _T("addc a,#$%02X"), __mcs48_program_r(ptr++)); break;
+ case 0x14: my_stprintf_s(buffer, buffer_len, _T("call %s"), get_value_or_symbol(d_debugger->first_symbol, _T("$%03X"), 0x000 | __mcs48_program_r(ptr++))); break;
+ case 0x15: my_stprintf_s(buffer, buffer_len, _T("dis i")); break;
+ case 0x16: my_stprintf_s(buffer, buffer_len, _T("jtf %s"), get_value_or_symbol(d_debugger->first_symbol, _T("$%03X"), (pc & 0xf00) | __mcs48_program_r(ptr++))); break;
+ case 0x17: my_stprintf_s(buffer, buffer_len, _T("inc a")); break;
+ case 0x18: my_stprintf_s(buffer, buffer_len, _T("inc r0")); break;
+ case 0x19: my_stprintf_s(buffer, buffer_len, _T("inc r1")); break;
+ case 0x1a: my_stprintf_s(buffer, buffer_len, _T("inc r2")); break;
+ case 0x1b: my_stprintf_s(buffer, buffer_len, _T("inc r3")); break;
+ case 0x1c: my_stprintf_s(buffer, buffer_len, _T("inc r4")); break;
+ case 0x1d: my_stprintf_s(buffer, buffer_len, _T("inc r5")); break;
+ case 0x1e: my_stprintf_s(buffer, buffer_len, _T("inc r6")); break;
+ case 0x1f: my_stprintf_s(buffer, buffer_len, _T("inc r7")); break;
+ case 0x20: my_stprintf_s(buffer, buffer_len, _T("xch a,@r0")); break;
+ case 0x21: my_stprintf_s(buffer, buffer_len, _T("xch a,@r1")); break;
+ case 0x22: if (!upi41) {
+ my_stprintf_s(buffer, buffer_len, _T("illegal"));
+ } else {
+ my_stprintf_s(buffer, buffer_len, _T("in a,dbb"));
+ }
+ break;
+ case 0x23: my_stprintf_s(buffer, buffer_len, _T("mov a,#$%02X"), __mcs48_program_r(ptr++)); break;
+ case 0x24: my_stprintf_s(buffer, buffer_len, _T("jmp %s"), get_value_or_symbol(d_debugger->first_symbol, _T("$%03X"), 0x100 | __mcs48_program_r(ptr++))); break;
+ case 0x25: my_stprintf_s(buffer, buffer_len, _T("en tcnti")); break;
+ case 0x26: my_stprintf_s(buffer, buffer_len, _T("jnt0 %s"), get_value_or_symbol(d_debugger->first_symbol, _T("$%03X"), (pc & 0xf00) | __mcs48_program_r(ptr++))); break;
+ case 0x27: my_stprintf_s(buffer, buffer_len, _T("clr a")); break;
+ case 0x28: my_stprintf_s(buffer, buffer_len, _T("xch a,r0")); break;
+ case 0x29: my_stprintf_s(buffer, buffer_len, _T("xch a,r1")); break;
+ case 0x2a: my_stprintf_s(buffer, buffer_len, _T("xch a,r2")); break;
+ case 0x2b: my_stprintf_s(buffer, buffer_len, _T("xch a,r3")); break;
+ case 0x2c: my_stprintf_s(buffer, buffer_len, _T("xch a,r4")); break;
+ case 0x2d: my_stprintf_s(buffer, buffer_len, _T("xch a,r5")); break;
+ case 0x2e: my_stprintf_s(buffer, buffer_len, _T("xch a,r6")); break;
+ case 0x2f: my_stprintf_s(buffer, buffer_len, _T("xch a,r7")); break;
+ case 0x30: my_stprintf_s(buffer, buffer_len, _T("xchd a,@r0")); break;
+ case 0x31: my_stprintf_s(buffer, buffer_len, _T("xchd a,@r1")); break;
+ case 0x32: my_stprintf_s(buffer, buffer_len, _T("jb1 %s"), get_value_or_symbol(d_debugger->first_symbol, _T("$%03X"), (pc & 0xf00) | __mcs48_program_r(ptr++))); break;
+ case 0x34: my_stprintf_s(buffer, buffer_len, _T("call %s"), get_value_or_symbol(d_debugger->first_symbol, _T("$%03X"), 0x100 | __mcs48_program_r(ptr++))); break;
+ case 0x35: my_stprintf_s(buffer, buffer_len, _T("dis tcnti")); break;
+ case 0x36: my_stprintf_s(buffer, buffer_len, _T("jt0 %s"), get_value_or_symbol(d_debugger->first_symbol, _T("$%03X"), (pc & 0xf00) | __mcs48_program_r(ptr++))); break;
+ case 0x37: my_stprintf_s(buffer, buffer_len, _T("cpl a")); break;
+ case 0x39: my_stprintf_s(buffer, buffer_len, _T("outl p1,a")); break;
+ case 0x3a: my_stprintf_s(buffer, buffer_len, _T("outl p2,a")); break;
+ case 0x3c: my_stprintf_s(buffer, buffer_len, _T("movd p4,a")); break;
+ case 0x3d: my_stprintf_s(buffer, buffer_len, _T("movd p5,a")); break;
+ case 0x3e: my_stprintf_s(buffer, buffer_len, _T("movd p6,a")); break;
+ case 0x3f: my_stprintf_s(buffer, buffer_len, _T("movd p7,a")); break;
+ case 0x40: my_stprintf_s(buffer, buffer_len, _T("orl a,@r0")); break;
+ case 0x41: my_stprintf_s(buffer, buffer_len, _T("orl a,@r1")); break;
+ case 0x42: my_stprintf_s(buffer, buffer_len, _T("mov a,t")); break;
+ case 0x43: my_stprintf_s(buffer, buffer_len, _T("orl a,#$%02X"), __mcs48_program_r(ptr++)); break;
+ case 0x44: my_stprintf_s(buffer, buffer_len, _T("jmp %s"), get_value_or_symbol(d_debugger->first_symbol, _T("$%03X"), 0x200 | __mcs48_program_r(ptr++))); break;
+ case 0x45: my_stprintf_s(buffer, buffer_len, _T("strt cnt")); break;
+ case 0x46: my_stprintf_s(buffer, buffer_len, _T("jnt1 %s"), get_value_or_symbol(d_debugger->first_symbol, _T("$%03X"), (pc & 0xf00) | __mcs48_program_r(ptr++))); break;
+ case 0x47: my_stprintf_s(buffer, buffer_len, _T("swap a")); break;
+ case 0x48: my_stprintf_s(buffer, buffer_len, _T("orl a,r0")); break;
+ case 0x49: my_stprintf_s(buffer, buffer_len, _T("orl a,r1")); break;
+ case 0x4a: my_stprintf_s(buffer, buffer_len, _T("orl a,r2")); break;
+ case 0x4b: my_stprintf_s(buffer, buffer_len, _T("orl a,r3")); break;
+ case 0x4c: my_stprintf_s(buffer, buffer_len, _T("orl a,r4")); break;
+ case 0x4d: my_stprintf_s(buffer, buffer_len, _T("orl a,r5")); break;
+ case 0x4e: my_stprintf_s(buffer, buffer_len, _T("orl a,r6")); break;
+ case 0x4f: my_stprintf_s(buffer, buffer_len, _T("orl a,r7")); break;
+ case 0x50: my_stprintf_s(buffer, buffer_len, _T("anl a,@r0")); break;
+ case 0x51: my_stprintf_s(buffer, buffer_len, _T("anl a,@r1")); break;
+ case 0x52: my_stprintf_s(buffer, buffer_len, _T("jb2 %s"), get_value_or_symbol(d_debugger->first_symbol, _T("$%03X"), (pc & 0xf00) | __mcs48_program_r(ptr++))); break;
+ case 0x53: my_stprintf_s(buffer, buffer_len, _T("anl a,#$%02X"), __mcs48_program_r(ptr++)); break;
+ case 0x54: my_stprintf_s(buffer, buffer_len, _T("call %s"), get_value_or_symbol(d_debugger->first_symbol, _T("$%03X"), 0x200 | __mcs48_program_r(ptr++))); break;
+ case 0x55: my_stprintf_s(buffer, buffer_len, _T("strt t")); break;
+ case 0x56: my_stprintf_s(buffer, buffer_len, _T("jt1 %s"), get_value_or_symbol(d_debugger->first_symbol, _T("$%03X"), (pc & 0xf00) | __mcs48_program_r(ptr++))); break;
+ case 0x57: my_stprintf_s(buffer, buffer_len, _T("da a")); break;
+ case 0x58: my_stprintf_s(buffer, buffer_len, _T("anl a,r0")); break;
+ case 0x59: my_stprintf_s(buffer, buffer_len, _T("anl a,r1")); break;
+ case 0x5a: my_stprintf_s(buffer, buffer_len, _T("anl a,r2")); break;
+ case 0x5b: my_stprintf_s(buffer, buffer_len, _T("anl a,r3")); break;
+ case 0x5c: my_stprintf_s(buffer, buffer_len, _T("anl a,r4")); break;
+ case 0x5d: my_stprintf_s(buffer, buffer_len, _T("anl a,r5")); break;
+ case 0x5e: my_stprintf_s(buffer, buffer_len, _T("anl a,r6")); break;
+ case 0x5f: my_stprintf_s(buffer, buffer_len, _T("anl a,r7")); break;
+ case 0x60: my_stprintf_s(buffer, buffer_len, _T("add a,@r0")); break;
+ case 0x61: my_stprintf_s(buffer, buffer_len, _T("add a,@r1")); break;
+ case 0x62: my_stprintf_s(buffer, buffer_len, _T("mov t,a")); break;
+ case 0x64: my_stprintf_s(buffer, buffer_len, _T("jmp %s"), get_value_or_symbol(d_debugger->first_symbol, _T("$%03X"), 0x300 | __mcs48_program_r(ptr++))); break;
+ case 0x65: my_stprintf_s(buffer, buffer_len, _T("stop tcnt")); break;
+ case 0x67: my_stprintf_s(buffer, buffer_len, _T("rrc a")); break;
+ case 0x68: my_stprintf_s(buffer, buffer_len, _T("add a,r0")); break;
+ case 0x69: my_stprintf_s(buffer, buffer_len, _T("add a,r1")); break;
+ case 0x6a: my_stprintf_s(buffer, buffer_len, _T("add a,r2")); break;
+ case 0x6b: my_stprintf_s(buffer, buffer_len, _T("add a,r3")); break;
+ case 0x6c: my_stprintf_s(buffer, buffer_len, _T("add a,r4")); break;
+ case 0x6d: my_stprintf_s(buffer, buffer_len, _T("add a,r5")); break;
+ case 0x6e: my_stprintf_s(buffer, buffer_len, _T("add a,r6")); break;
+ case 0x6f: my_stprintf_s(buffer, buffer_len, _T("add a,r7")); break;
+ case 0x70: my_stprintf_s(buffer, buffer_len, _T("addc a,@r0")); break;
+ case 0x71: my_stprintf_s(buffer, buffer_len, _T("addc a,@r1")); break;
+ case 0x72: my_stprintf_s(buffer, buffer_len, _T("jb3 %s"), get_value_or_symbol(d_debugger->first_symbol, _T("$%03X"), (pc & 0xf00) | __mcs48_program_r(ptr++))); break;
+ case 0x74: my_stprintf_s(buffer, buffer_len, _T("call %s"), get_value_or_symbol(d_debugger->first_symbol, _T("$%03X"), 0x300 | __mcs48_program_r(ptr++))); break;
+ case 0x75: if (!upi41) {
+ my_stprintf_s(buffer, buffer_len, _T("ent0 clk"));
+ } else {
+ my_stprintf_s(buffer, buffer_len, _T("illegal"));
+ }
+ break;
+ case 0x76: my_stprintf_s(buffer, buffer_len, _T("jf1 %s"), get_value_or_symbol(d_debugger->first_symbol, _T("$%03X"), (pc & 0xf00) | __mcs48_program_r(ptr++))); break;
+ case 0x77: my_stprintf_s(buffer, buffer_len, _T("rr a")); break;
+ case 0x78: my_stprintf_s(buffer, buffer_len, _T("addc a,r0")); break;
+ case 0x79: my_stprintf_s(buffer, buffer_len, _T("addc a,r1")); break;
+ case 0x7a: my_stprintf_s(buffer, buffer_len, _T("addc a,r2")); break;
+ case 0x7b: my_stprintf_s(buffer, buffer_len, _T("addc a,r3")); break;
+ case 0x7c: my_stprintf_s(buffer, buffer_len, _T("addc a,r4")); break;
+ case 0x7d: my_stprintf_s(buffer, buffer_len, _T("addc a,r5")); break;
+ case 0x7e: my_stprintf_s(buffer, buffer_len, _T("addc a,r6")); break;
+ case 0x7f: my_stprintf_s(buffer, buffer_len, _T("addc a,r7")); break;
+ case 0x80: if (!upi41) {
+ my_stprintf_s(buffer, buffer_len, _T("movx a,@r0"));
+ } else {
+ my_stprintf_s(buffer, buffer_len, _T("illegal"));
+ }
+ break;
+ case 0x81: if (!upi41)
+ my_stprintf_s(buffer, buffer_len, _T("movx a,@r1"));
+ else
+ my_stprintf_s(buffer, buffer_len, _T("illegal")); break;
+ case 0x83: my_stprintf_s(buffer, buffer_len, _T("ret")); break;
+ case 0x84: my_stprintf_s(buffer, buffer_len, _T("jmp %s"), get_value_or_symbol(d_debugger->first_symbol, _T("$%03X"), 0x400 | __mcs48_program_r(ptr++))); break;
+ case 0x85: my_stprintf_s(buffer, buffer_len, _T("clr f0")); break;
+ case 0x86: if (!upi41)
+ my_stprintf_s(buffer, buffer_len, _T("jni %s"), get_value_or_symbol(d_debugger->first_symbol, _T("$%03X"), (pc & 0xf00) | __mcs48_program_r(ptr++)));
+ else
+ my_stprintf_s(buffer, buffer_len, _T("jobf %s"), get_value_or_symbol(d_debugger->first_symbol, _T("$%03X"), (pc & 0xf00) | __mcs48_program_r(ptr++))); break;
+ case 0x88: if (!upi41)
+ my_stprintf_s(buffer, buffer_len, _T("orl bus,#$%02X"), __mcs48_program_r(ptr++));
+ else
+ my_stprintf_s(buffer, buffer_len, _T("illegal")); break;
+ case 0x89: my_stprintf_s(buffer, buffer_len, _T("orl p1,#$%02X"), __mcs48_program_r(ptr++)); break;
+ case 0x8a: my_stprintf_s(buffer, buffer_len, _T("orl p2,#$%02X"), __mcs48_program_r(ptr++)); break;
+ case 0x8c: my_stprintf_s(buffer, buffer_len, _T("orld p4,a")); break;
+ case 0x8d: my_stprintf_s(buffer, buffer_len, _T("orld p5,a")); break;
+ case 0x8e: my_stprintf_s(buffer, buffer_len, _T("orld p6,a")); break;
+ case 0x8f: my_stprintf_s(buffer, buffer_len, _T("orld p7,a")); break;
+ case 0x90: if (!upi41)
+ my_stprintf_s(buffer, buffer_len, _T("movx @r0,a"));
+ else
+ my_stprintf_s(buffer, buffer_len, _T("mov sts,a")); break;
+ case 0x91: if (!upi41)
+ my_stprintf_s(buffer, buffer_len, _T("movx @r1,a"));
+ else
+ my_stprintf_s(buffer, buffer_len, _T("illegal")); break;
+ case 0x92: my_stprintf_s(buffer, buffer_len, _T("jb4 %s"), get_value_or_symbol(d_debugger->first_symbol, _T("$%03X"), (pc & 0xf00) | __mcs48_program_r(ptr++))); break;
+ case 0x93: my_stprintf_s(buffer, buffer_len, _T("retr")); break;
+ case 0x94: my_stprintf_s(buffer, buffer_len, _T("call %s"), get_value_or_symbol(d_debugger->first_symbol, _T("$%03X"), 0x400 | __mcs48_program_r(ptr++))); break;
+ case 0x95: my_stprintf_s(buffer, buffer_len, _T("cpl f0")); break;
+ case 0x96: my_stprintf_s(buffer, buffer_len, _T("jnz %s"), get_value_or_symbol(d_debugger->first_symbol, _T("$%03X"), (pc & 0xf00) | __mcs48_program_r(ptr++))); break;
+ case 0x97: my_stprintf_s(buffer, buffer_len, _T("clr c")); break;
+ case 0x98: if (!upi41)
+ my_stprintf_s(buffer, buffer_len, _T("anl bus,#$%02X"), __mcs48_program_r(ptr++));
+ else
+ my_stprintf_s(buffer, buffer_len, _T("illegal")); break;
+ case 0x99: my_stprintf_s(buffer, buffer_len, _T("anl p1,#$%02X"), __mcs48_program_r(ptr++)); break;
+ case 0x9a: my_stprintf_s(buffer, buffer_len, _T("anl p2,#$%02X"), __mcs48_program_r(ptr++)); break;
+ case 0x9c: my_stprintf_s(buffer, buffer_len, _T("anld p4,a")); break;
+ case 0x9d: my_stprintf_s(buffer, buffer_len, _T("anld p5,a")); break;
+ case 0x9e: my_stprintf_s(buffer, buffer_len, _T("anld p6,a")); break;
+ case 0x9f: my_stprintf_s(buffer, buffer_len, _T("anld p7,a")); break;
+ case 0xa0: my_stprintf_s(buffer, buffer_len, _T("mov @r0,a")); break;
+ case 0xa1: my_stprintf_s(buffer, buffer_len, _T("mov @r1,a")); break;
+ case 0xa3: my_stprintf_s(buffer, buffer_len, _T("movp a,@a")); break;
+ case 0xa4: my_stprintf_s(buffer, buffer_len, _T("jmp %s"), get_value_or_symbol(d_debugger->first_symbol, _T("$%03X"), 0x500 | __mcs48_program_r(ptr++))); break;
+ case 0xa5: my_stprintf_s(buffer, buffer_len, _T("clr f1")); break;
+ case 0xa7: my_stprintf_s(buffer, buffer_len, _T("cpl c")); break;
+ case 0xa8: my_stprintf_s(buffer, buffer_len, _T("mov r0,a")); break;
+ case 0xa9: my_stprintf_s(buffer, buffer_len, _T("mov r1,a")); break;
+ case 0xaa: my_stprintf_s(buffer, buffer_len, _T("mov r2,a")); break;
+ case 0xab: my_stprintf_s(buffer, buffer_len, _T("mov r3,a")); break;
+ case 0xac: my_stprintf_s(buffer, buffer_len, _T("mov r4,a")); break;
+ case 0xad: my_stprintf_s(buffer, buffer_len, _T("mov r5,a")); break;
+ case 0xae: my_stprintf_s(buffer, buffer_len, _T("mov r6,a")); break;
+ case 0xaf: my_stprintf_s(buffer, buffer_len, _T("mov r7,a")); break;
+ case 0xb0: my_stprintf_s(buffer, buffer_len, _T("mov @r0,#$%02X"), __mcs48_program_r(ptr++)); break;
+ case 0xb1: my_stprintf_s(buffer, buffer_len, _T("mov @r1,#$%02X"), __mcs48_program_r(ptr++)); break;
+ case 0xb2: my_stprintf_s(buffer, buffer_len, _T("jb5 %s"), get_value_or_symbol(d_debugger->first_symbol, _T("$%03X"), (pc & 0xf00) | __mcs48_program_r(ptr++))); break;
+ case 0xb3: my_stprintf_s(buffer, buffer_len, _T("jmpp @a")); break;
+ case 0xb4: my_stprintf_s(buffer, buffer_len, _T("call %s"), get_value_or_symbol(d_debugger->first_symbol, _T("$%03X"), 0x500 | __mcs48_program_r(ptr++))); break;
+ case 0xb5: my_stprintf_s(buffer, buffer_len, _T("cpl f1")); break;
+ case 0xb6: my_stprintf_s(buffer, buffer_len, _T("jf0 %s"), get_value_or_symbol(d_debugger->first_symbol, _T("$%03X"), (pc & 0xf00) | __mcs48_program_r(ptr++))); break;
+ case 0xb8: my_stprintf_s(buffer, buffer_len, _T("mov r0,#$%02X"), __mcs48_program_r(ptr++)); break;
+ case 0xb9: my_stprintf_s(buffer, buffer_len, _T("mov r1,#$%02X"), __mcs48_program_r(ptr++)); break;
+ case 0xba: my_stprintf_s(buffer, buffer_len, _T("mov r2,#$%02X"), __mcs48_program_r(ptr++)); break;
+ case 0xbb: my_stprintf_s(buffer, buffer_len, _T("mov r3,#$%02X"), __mcs48_program_r(ptr++)); break;
+ case 0xbc: my_stprintf_s(buffer, buffer_len, _T("mov r4,#$%02X"), __mcs48_program_r(ptr++)); break;
+ case 0xbd: my_stprintf_s(buffer, buffer_len, _T("mov r5,#$%02X"), __mcs48_program_r(ptr++)); break;
+ case 0xbe: my_stprintf_s(buffer, buffer_len, _T("mov r6,#$%02X"), __mcs48_program_r(ptr++)); break;
+ case 0xbf: my_stprintf_s(buffer, buffer_len, _T("mov r7,#$%02X"), __mcs48_program_r(ptr++)); break;
+ case 0xc4: my_stprintf_s(buffer, buffer_len, _T("jmp %s"), get_value_or_symbol(d_debugger->first_symbol, _T("$%03X"), 0x600 | __mcs48_program_r(ptr++))); break;
+ case 0xc5: my_stprintf_s(buffer, buffer_len, _T("sel rb0")); break;
+ case 0xc6: my_stprintf_s(buffer, buffer_len, _T("jz %s"), get_value_or_symbol(d_debugger->first_symbol, _T("$%03X"), (pc & 0xf00) | __mcs48_program_r(ptr++))); break;
+ case 0xc7: my_stprintf_s(buffer, buffer_len, _T("mov a,psw")); break;
+ case 0xc8: my_stprintf_s(buffer, buffer_len, _T("dec r0")); break;
+ case 0xc9: my_stprintf_s(buffer, buffer_len, _T("dec r1")); break;
+ case 0xca: my_stprintf_s(buffer, buffer_len, _T("dec r2")); break;
+ case 0xcb: my_stprintf_s(buffer, buffer_len, _T("dec r3")); break;
+ case 0xcc: my_stprintf_s(buffer, buffer_len, _T("dec r4")); break;
+ case 0xcd: my_stprintf_s(buffer, buffer_len, _T("dec r5")); break;
+ case 0xce: my_stprintf_s(buffer, buffer_len, _T("dec r6")); break;
+ case 0xcf: my_stprintf_s(buffer, buffer_len, _T("dec r7")); break;
+ case 0xd0: my_stprintf_s(buffer, buffer_len, _T("xrl a,@r0")); break;
+ case 0xd1: my_stprintf_s(buffer, buffer_len, _T("xrl a,@r1")); break;
+ case 0xd2: my_stprintf_s(buffer, buffer_len, _T("jb6 %s"), get_value_or_symbol(d_debugger->first_symbol, _T("$%03X"), (pc & 0xf00) | __mcs48_program_r(ptr++))); break;
+ case 0xd3: my_stprintf_s(buffer, buffer_len, _T("xrl a,#$%02X"), __mcs48_program_r(ptr++)); break;
+ case 0xd4: my_stprintf_s(buffer, buffer_len, _T("call %s"), get_value_or_symbol(d_debugger->first_symbol, _T("$%03X"), 0x600 | __mcs48_program_r(ptr++))); break;
+ case 0xd5: my_stprintf_s(buffer, buffer_len, _T("sel rb1")); break;
+ case 0xd6: if (!upi41)
+ my_stprintf_s(buffer, buffer_len, _T("illegal"));
+ else
+ my_stprintf_s(buffer, buffer_len, _T("jnibf %s"), get_value_or_symbol(d_debugger->first_symbol, _T("$%03X"), (pc & 0xf00) | __mcs48_program_r(ptr++))); break;
+ case 0xd7: my_stprintf_s(buffer, buffer_len, _T("mov psw,a")); break;
+ case 0xd8: my_stprintf_s(buffer, buffer_len, _T("xrl a,r0")); break;
+ case 0xd9: my_stprintf_s(buffer, buffer_len, _T("xrl a,r1")); break;
+ case 0xda: my_stprintf_s(buffer, buffer_len, _T("xrl a,r2")); break;
+ case 0xdb: my_stprintf_s(buffer, buffer_len, _T("xrl a,r3")); break;
+ case 0xdc: my_stprintf_s(buffer, buffer_len, _T("xrl a,r4")); break;
+ case 0xdd: my_stprintf_s(buffer, buffer_len, _T("xrl a,r5")); break;
+ case 0xde: my_stprintf_s(buffer, buffer_len, _T("xrl a,r6")); break;
+ case 0xdf: my_stprintf_s(buffer, buffer_len, _T("xrl a,r7")); break;
+ case 0xe3: my_stprintf_s(buffer, buffer_len, _T("movp3 a,@a")); break;
+ case 0xe4: my_stprintf_s(buffer, buffer_len, _T("jmp %s"), get_value_or_symbol(d_debugger->first_symbol, _T("$%03X"), 0x700 | __mcs48_program_r(ptr++))); break;
+ case 0xe5: if (!upi41)
+ my_stprintf_s(buffer, buffer_len, _T("sel mb0"));
+ else
+ my_stprintf_s(buffer, buffer_len, _T("en dma")); break;
+ case 0xe6: my_stprintf_s(buffer, buffer_len, _T("jnc %s"), get_value_or_symbol(d_debugger->first_symbol, _T("$%03X"), (pc & 0xf00) | __mcs48_program_r(ptr++))); break;
+ case 0xe7: my_stprintf_s(buffer, buffer_len, _T("rl a")); break;
+ case 0xe8: my_stprintf_s(buffer, buffer_len, _T("djnz r0,%s"), get_value_or_symbol(d_debugger->first_symbol, _T("$%03X"), (pc & 0xf00) | __mcs48_program_r(ptr++))); break;
+ case 0xe9: my_stprintf_s(buffer, buffer_len, _T("djnz r1,%s"), get_value_or_symbol(d_debugger->first_symbol, _T("$%03X"), (pc & 0xf00) | __mcs48_program_r(ptr++))); break;
+ case 0xea: my_stprintf_s(buffer, buffer_len, _T("djnz r2,%s"), get_value_or_symbol(d_debugger->first_symbol, _T("$%03X"), (pc & 0xf00) | __mcs48_program_r(ptr++))); break;
+ case 0xeb: my_stprintf_s(buffer, buffer_len, _T("djnz r3,%s"), get_value_or_symbol(d_debugger->first_symbol, _T("$%03X"), (pc & 0xf00) | __mcs48_program_r(ptr++))); break;
+ case 0xec: my_stprintf_s(buffer, buffer_len, _T("djnz r4,%s"), get_value_or_symbol(d_debugger->first_symbol, _T("$%03X"), (pc & 0xf00) | __mcs48_program_r(ptr++))); break;
+ case 0xed: my_stprintf_s(buffer, buffer_len, _T("djnz r5,%s"), get_value_or_symbol(d_debugger->first_symbol, _T("$%03X"), (pc & 0xf00) | __mcs48_program_r(ptr++))); break;
+ case 0xee: my_stprintf_s(buffer, buffer_len, _T("djnz r6,%s"), get_value_or_symbol(d_debugger->first_symbol, _T("$%03X"), (pc & 0xf00) | __mcs48_program_r(ptr++))); break;
+ case 0xef: my_stprintf_s(buffer, buffer_len, _T("djnz r7,%s"), get_value_or_symbol(d_debugger->first_symbol, _T("$%03X"), (pc & 0xf00) | __mcs48_program_r(ptr++))); break;
+ case 0xf0: my_stprintf_s(buffer, buffer_len, _T("mov a,@r0")); break;
+ case 0xf1: my_stprintf_s(buffer, buffer_len, _T("mov a,@r1")); break;
+ case 0xf2: my_stprintf_s(buffer, buffer_len, _T("jb7 %s"), get_value_or_symbol(d_debugger->first_symbol, _T("$%03X"), (pc & 0xf00) | __mcs48_program_r(ptr++))); break;
+ case 0xf4: my_stprintf_s(buffer, buffer_len, _T("call %s"), get_value_or_symbol(d_debugger->first_symbol, _T("$%03X"), 0x700 | __mcs48_program_r(ptr++))); break;
+ case 0xf5: if (!upi41)
+ my_stprintf_s(buffer, buffer_len, _T("sel mb1"));
+ else
+ my_stprintf_s(buffer, buffer_len, _T("en flags")); break;
+ case 0xf6: my_stprintf_s(buffer, buffer_len, _T("jc %s"), get_value_or_symbol(d_debugger->first_symbol, _T("$%03X"), (pc & 0xf00) | __mcs48_program_r(ptr++))); break;
+ case 0xf7: my_stprintf_s(buffer, buffer_len, _T("rlc a")); break;
+ case 0xf8: my_stprintf_s(buffer, buffer_len, _T("mov a,r0")); break;
+ case 0xf9: my_stprintf_s(buffer, buffer_len, _T("mov a,r1")); break;
+ case 0xfa: my_stprintf_s(buffer, buffer_len, _T("mov a,r2")); break;
+ case 0xfb: my_stprintf_s(buffer, buffer_len, _T("mov a,r3")); break;
+ case 0xfc: my_stprintf_s(buffer, buffer_len, _T("mov a,r4")); break;
+ case 0xfd: my_stprintf_s(buffer, buffer_len, _T("mov a,r5")); break;
+ case 0xfe: my_stprintf_s(buffer, buffer_len, _T("mov a,r6")); break;
+ case 0xff: my_stprintf_s(buffer, buffer_len, _T("mov a,r7")); break;
+ default: my_stprintf_s(buffer, buffer_len, _T("illegal")); break;
+
+ }
+ return ptr - pc;
+}
+//#endif
+#define STATE_VERSION 1
+
+void MCS48MEM::save_state(FILEIO* state_fio)
+{
+ state_fio->FputUint32(STATE_VERSION);
+ state_fio->FputInt32(this_device_id);
+
+ state_fio->Fwrite(ram, sizeof(ram), 1);
+}
+
+bool MCS48MEM::load_state(FILEIO* state_fio)
+{
+ if(state_fio->FgetUint32() != STATE_VERSION) {
+ return false;
+ }
+ if(state_fio->FgetInt32() != this_device_id) {
+ return false;
+ }
+ state_fio->Fread(ram, sizeof(ram), 1);
+ return true;
+}
+
+
--- /dev/null
+/*
+ Skelton for retropc emulator
+
+ Origin : MAME 0.148
+ Author : Takeda.Toshiya
+ Date : 2013.05.01-
+
+ [ MCS48 ]
+*/
+
+#ifndef __MCS48_FLAGS_H_
+#define __MCS48_FLAGS_H_
+
+/***************************************************************************
+ CONSTANTS
+***************************************************************************/
+
+/* flag bits */
+#define C_FLAG 0x80
+#define A_FLAG 0x40
+#define F_FLAG 0x20
+#define B_FLAG 0x10
+
+/* status bits (UPI-41) */
+#define STS_F1 0x08
+#define STS_F0 0x04
+
+/* 8243 expander operations */
+enum
+{
+ MCS48_EXPANDER_OP_READ = 0,
+ MCS48_EXPANDER_OP_WRITE = 1,
+ MCS48_EXPANDER_OP_OR = 2,
+ MCS48_EXPANDER_OP_AND = 3
+};
+
+#endif
*/
#include "upd7801.h"
-#ifdef USE_DEBUGGER
+//#ifdef USE_DEBUGGER
#include "debugger.h"
-#endif
+//#endif
#define PRESCALER 16
inline uint8_t UPD7801::RM8(uint16_t addr)
{
-#ifdef UPD7801_MEMORY_WAIT
- int wait;
- uint8_t val = d_mem->read_data8w(addr, &wait);
- period += wait;
- return val;
-#else
- return d_mem->read_data8(addr);
-#endif
+//#ifdef UPD7801_MEMORY_WAIT
+ if(__UPD7801_MEMORY_WAIT) {
+ int wait;
+ uint8_t val = d_mem->read_data8w(addr, &wait);
+ period += wait;
+ return val;
+ } else {
+//#else
+ return d_mem->read_data8(addr);
+ }
+//#endif
}
inline void UPD7801::WM8(uint16_t addr, uint8_t val)
{
-#ifdef UPD7801_MEMORY_WAIT
- int wait;
- d_mem->write_data8w(addr, val, &wait);
- period += wait;
-#else
- d_mem->write_data8(addr, val);
-#endif
+//#ifdef UPD7801_MEMORY_WAIT
+ if(__UPD7801_MEMORY_WAIT) {
+ int wait;
+ d_mem->write_data8w(addr, val, &wait);
+ period += wait;
+ } else {
+//#else
+ d_mem->write_data8(addr, val);
+ }
+//#endif
}
inline uint16_t UPD7801::RM16(uint16_t addr)
{
-#ifdef UPD7801_MEMORY_WAIT
- int wait;
- uint16_t val = d_mem->read_data16w(addr, &wait);
- period += wait;
- return val;
-#else
- return d_mem->read_data16(addr);
-#endif
+//#ifdef UPD7801_MEMORY_WAIT
+ if(__UPD7801_MEMORY_WAIT) {
+ int wait;
+ uint16_t val = d_mem->read_data16w(addr, &wait);
+ period += wait;
+ return val;
+ } else {
+//#else
+ return d_mem->read_data16(addr);
+ }
+//#endif
}
inline void UPD7801::WM16(uint16_t addr, uint16_t val)
{
-#ifdef UPD7801_MEMORY_WAIT
- int wait;
- d_mem->write_data16w(addr, val, &wait);
- period += wait;
-#else
- d_mem->write_data16(addr, val);
-#endif
+//#ifdef UPD7801_MEMORY_WAIT
+ if(__UPD7801_MEMORY_WAIT) {
+ int wait;
+ d_mem->write_data16w(addr, val, &wait);
+ period += wait;
+ } else {
+//#else
+ d_mem->write_data16(addr, val);
+ }
+//#endif
}
inline uint8_t UPD7801::FETCH8()
{
-#ifdef UPD7801_MEMORY_WAIT
- int wait;
- uint8_t val = d_mem->read_data8w(PC++, &wait);
- period += wait;
- return val;
-#else
- return d_mem->read_data8(PC++);
-#endif
+//#ifdef UPD7801_MEMORY_WAIT
+ if(__UPD7801_MEMORY_WAIT) {
+ int wait;
+ uint8_t val = d_mem->read_data8w(PC++, &wait);
+ period += wait;
+ return val;
+ } else {
+//#else
+ return d_mem->read_data8(PC++);
+ }
+//#endif
}
inline uint16_t UPD7801::FETCH16()
{
-#ifdef UPD7801_MEMORY_WAIT
- int wait;
- uint16_t val = d_mem->read_data16w(PC, &wait);
- period += wait;
-#else
- uint16_t val = d_mem->read_data16(PC);
-#endif
+ uint16_t val;
+//#ifdef UPD7801_MEMORY_WAIT
+ if(__UPD7801_MEMORY_WAIT) {
+ int wait;
+ val = d_mem->read_data16w(PC, &wait);
+ period += wait;
+ } else {
+//#else
+ val = d_mem->read_data16(PC);
+ }
+//#endif
PC += 2;
return val;
}
inline uint16_t UPD7801::FETCHWA()
{
-#ifdef UPD7801_MEMORY_WAIT
- int wait;
- uint16_t val = (_V << 8) | d_mem->read_data8w(PC++, &wait);
- period += wait;
- return val;
-#else
- return (_V << 8) | d_mem->read_data8(PC++);
-#endif
+//#ifdef UPD7801_MEMORY_WAIT
+ if(__UPD7801_MEMORY_WAIT) {
+ int wait;
+ uint16_t val = (_V << 8) | d_mem->read_data8w(PC++, &wait);
+ period += wait;
+ return val;
+ } else {
+//#else
+ return (_V << 8) | d_mem->read_data8(PC++);
+ }
+//#endif
}
inline uint8_t UPD7801::POP8()
{
-#ifdef UPD7801_MEMORY_WAIT
- int wait;
- uint8_t val = d_mem->read_data8w(SP++, &wait);
- period += wait;
- return val;
-#else
- return d_mem->read_data8(SP++);
-#endif
+//#ifdef UPD7801_MEMORY_WAIT
+ if(__UPD7801_MEMORY_WAIT) {
+ int wait;
+ uint8_t val = d_mem->read_data8w(SP++, &wait);
+ period += wait;
+ return val;
+ } else {
+//#else
+ return d_mem->read_data8(SP++);
+ }
+//#endif
}
inline void UPD7801::PUSH8(uint8_t val)
{
-#ifdef UPD7801_MEMORY_WAIT
- int wait;
- d_mem->write_data8w(--SP, val, &wait);
- period += wait;
-#else
- d_mem->write_data8(--SP, val);
-#endif
+//#ifdef UPD7801_MEMORY_WAIT
+ if(__UPD7801_MEMORY_WAIT) {
+ int wait;
+ d_mem->write_data8w(--SP, val, &wait);
+ period += wait;
+ } else {
+//#else
+ d_mem->write_data8(--SP, val);
+ }
+//#endif
}
inline uint16_t UPD7801::POP16()
{
-#ifdef UPD7801_MEMORY_WAIT
- int wait;
- uint16_t val = d_mem->read_data16w(SP, &wait);
- period += wait;
-#else
- uint16_t val = d_mem->read_data16(SP);
-#endif
+ uint16_t val;
+//#ifdef UPD7801_MEMORY_WAIT
+ if(__UPD7801_MEMORY_WAIT) {
+ int wait;
+ val = d_mem->read_data16w(SP, &wait);
+ period += wait;
+ } else {
+//#else
+ val = d_mem->read_data16(SP);
+ }
+//#endif
SP += 2;
return val;
}
inline void UPD7801::PUSH16(uint16_t val)
{
SP -= 2;
-#ifdef UPD7801_MEMORY_WAIT
- int wait;
- d_mem->write_data16w(SP, val, &wait);
- period += wait;
-#else
- d_mem->write_data16(SP, val);
-#endif
+//#ifdef UPD7801_MEMORY_WAIT
+ if(__UPD7801_MEMORY_WAIT) {
+ int wait;
+ d_mem->write_data16w(SP, val, &wait);
+ period += wait;
+ } else {
+//#else
+ d_mem->write_data16(SP, val);
+ }
+//#endif
}
// io
void UPD7801::initialize()
{
DEVICE::initialize();
-#ifdef USE_DEBUGGER
- d_mem_stored = d_mem;
- d_io_stored = d_io;
- d_debugger->set_context_mem(d_mem);
- d_debugger->set_context_io(d_io);
-#endif
+ __UPD7801_MEMORY_WAIT = osd->check_feature(_T("UPD7801_MEMORY_WAIT"));
+ __USE_DEBUGGER = osd->check_feature(_T("USE_DEBUGGER"));
+
+//#ifdef USE_DEBUGGER
+ if((__USE_DEBUGGER) && (d_debugger != NULL)) {
+ d_mem_stored = d_mem;
+ d_io_stored = d_io;
+ d_debugger->set_context_mem(d_mem);
+ d_debugger->set_context_io(d_io);
+ }
+//#endif
}
void UPD7801::reset()
if(clock == -1) {
// run only one opcode
count = 0;
-#ifdef USE_DEBUGGER
- run_one_opecode_debugger();
-#else
- run_one_opecode();
-#endif
+//#ifdef USE_DEBUGGER
+ if(__USE_DEBUGGER) {
+ run_one_opecode_debugger();
+ } else {
+//#else
+ run_one_opecode();
+ }
+//#endif
return -count;
} else {
// run cpu while given clocks
int first_count = count;
while(count > 0) {
-#ifdef USE_DEBUGGER
- run_one_opecode_debugger();
-#else
- run_one_opecode();
-#endif
+//#ifdef USE_DEBUGGER
+ if(__USE_DEBUGGER) {
+ run_one_opecode_debugger();
+ } else {
+//#else
+ run_one_opecode();
+ }
+//#endif
}
return first_count - count;
}
}
}
-#ifdef USE_DEBUGGER
+//#ifdef USE_DEBUGGER
void UPD7801::run_one_opecode_debugger()
{
+ if(d_debugger == NULL) return;
bool now_debugging = d_debugger->now_debugging;
if(now_debugging) {
d_debugger->check_break_points(PC);
int UPD7801::debug_dasm(uint32_t pc, _TCHAR *buffer, size_t buffer_len)
{
+ if(d_debugger == NULL) return 0;
for(int i = 0; i < 4; i++) {
int wait;
upd7801_dasm_ops[i] = d_mem_stored->read_data8w(pc + i, &wait);
}
return upd7801_dasm_ptr;
}
-#endif
+//#endif
void UPD7801::write_signal(int id, uint32_t data, uint32_t mask)
{
#ifndef _UPD7801_H_
#define _UPD7801_H_
-#include "vm.h"
-#include "../emu.h"
+//#include "vm.h"
+//#include "../emu.h"
#include "device.h"
#define SIG_UPD7801_INTF0 0
#define P_B 1
#define P_C 2
-#ifdef USE_DEBUGGER
+//#ifdef USE_DEBUGGER
class DEBUGGER;
-#endif
+//#endif
class UPD7801 : public DEVICE
{
outputs_t outputs_so;
DEVICE *d_mem, *d_io;
-#ifdef USE_DEBUGGER
+//#ifdef USE_DEBUGGER
DEBUGGER *d_debugger;
DEVICE *d_mem_stored, *d_io_stored;
-#endif
+//#endif
/* ---------------------------------------------------------------------------
registers
inline uint8_t IN8(int port);
inline void OUT8(int port, uint8_t val);
inline void UPDATE_PORTC(uint8_t IOM);
+
+ bool __USE_DEBUGGER;
+ bool __UPD7801_MEMORY_WAIT;
/* ---------------------------------------------------------------------------
opecode
--------------------------------------------------------------------------- */
void run_one_opecode();
-#ifdef USE_DEBUGGER
+//#ifdef USE_DEBUGGER
void run_one_opecode_debugger();
-#endif
+//#endif
void OP();
void OP48();
void OP4C();
{
initialize_output_signals(&outputs_so);
SI = SCK = false;
+ d_debugger = NULL;
+ d_mem_stored = d_io_stored = NULL;
+ __USE_DEBUGGER = __UPD7801_MEMORY_WAIT = false;
set_device_name(_T("uPD7801 CPU"));
}
~UPD7801() {}
{
return PC;
}
-#ifdef USE_DEBUGGER
+//#ifdef USE_DEBUGGER
void *get_debugger()
{
return d_debugger;
bool write_debug_reg(const _TCHAR *reg, uint32_t data);
void get_debug_regs_info(_TCHAR *buffer, size_t buffer_len);
int debug_dasm(uint32_t pc, _TCHAR *buffer, size_t buffer_len);
-#endif
+//#endif
void save_state(FILEIO* state_fio);
bool load_state(FILEIO* state_fio);
{
d_io = device;
}
-#ifdef USE_DEBUGGER
+//#ifdef USE_DEBUGGER
void set_context_debugger(DEBUGGER* device)
{
d_debugger = device;
}
-#endif
+//#endif
void set_context_so(DEVICE* device, int id, uint32_t mask)
{
register_output_signal(&outputs_so, device, id, mask);