Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
37 commits
Select commit Hold shift + click to select a range
cf303a1
コア移植の下準備: UI互換ヘルパー追加とi825x最小互換対応
bubio Feb 12, 2026
a008114
コア移植の互換層を拡張: device/disk/upd765aの受け口を追加
bubio Feb 13, 2026
870de98
FDC/DISK互換APIを追加し次段移植の受け口を整備
bubio Feb 13, 2026
3654fce
upd765aのセクタ探索条件を整理しFM/MFM判定を共通化
bubio Feb 13, 2026
ef4b101
upd765aのセクタ選択とエラー判定をcommon側に近づける
bubio Feb 13, 2026
08e3dc8
upd765aのread_id/write_idの結果整合を調整
bubio Feb 13, 2026
e8a37bd
devをマージしてPR競合を解消
bubio Feb 13, 2026
b00e7ae
noise/vm_templateを現行xm8向けに整備しビルドへ追加
bubio Feb 13, 2026
6d1dd9b
pc8801/upd765aにFDDノイズ配線を追加しseek時に再生
bubio Feb 13, 2026
9874ac4
Windowsプロジェクトにnoise.cpp/noise.hを追加してリンクエラーを解消
bubio Feb 13, 2026
40904db
upd765aにヘッドロード/アンロード制御を移植しFDDヘッドノイズを再生
bubio Feb 13, 2026
9d3fec5
EVENTのサウンド登録上限超過を修正しゲーム音消失を解消
bubio Feb 13, 2026
084cf46
diskのtrack_mfm管理を導入しwrite_idのFM/MFM反映を修正
bubio Feb 13, 2026
994b016
upd765aの診断読込判定とサイズ計算をcommon互換へ調整
bubio Feb 13, 2026
8bb6308
upd765a: INDEX信号幅と現在位置計算を最新実装寄りに調整
bubio Feb 13, 2026
c843f0d
upd1990a: STBラッチ判定をCLK非依存に修正
bubio Feb 13, 2026
d82dffd
upd1990a: RTCデバイス名を明示設定
bubio Feb 13, 2026
684a5ab
i8251: リセット時のTXEN初期値を最新挙動に合わせる
bubio Feb 13, 2026
f863149
i8251: デバイス名を明示設定
bubio Feb 13, 2026
7a7d1ae
i8253: デバイス名を明示設定
bubio Feb 13, 2026
93312be
i8255: デバイス名を明示設定
bubio Feb 13, 2026
2102c67
dev取り込み時の競合を解消(disk/upd765a)
bubio Feb 13, 2026
2039c44
i8251: BREAK出力経路と制御ビット判定をcommon互換に調整
bubio Feb 13, 2026
e785e50
upd765a: seek step/endイベントを分離しシークノイズ挙動を改善
bubio Feb 13, 2026
3c47067
upd765a: seekステップ時間を旧実装互換の計算式に修正
bubio Feb 13, 2026
a19436c
upd765a: get_devstatのST3生成をcommon互換に整理
bubio Feb 13, 2026
3d5a4f8
upd765a: seek中の現在トラック追跡を追加しST3応答を改善
bubio Feb 13, 2026
b25239a
i8253: i8254 read-back状態を常時保持しステート互換を拡張
bubio Feb 13, 2026
658d84f
upd1990a: 1秒イベント周期を共通実装互換に統一
bubio Feb 13, 2026
de1aca7
event/device: common互換イベントAPIを追加し移植受け皿を拡張
bubio Feb 13, 2026
1ca6180
pc8801 VM: common命名の互換ラッパーを追加
bubio Feb 13, 2026
3330fcd
upd1990a: 8MHz時のRTCイベント周期を分割しディスク読込不良を回避
bubio Feb 13, 2026
bc6d43f
pc8801: common互換APIを拡張しFDD状態取得を改善
bubio Feb 13, 2026
12aae3d
pc88: DMA書込APIとlow-map互換エントリを追加
bubio Feb 13, 2026
ce6d87a
pc8801: FDDコントローラ取得ヘルパーを追加し操作系を共通化
bubio Feb 13, 2026
08f894b
pc8801: 共通API不足分として音量IFとCD系スタブを追加
bubio Feb 13, 2026
7b7938e
devを取り込み、PR競合を解消
bubio Feb 13, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
76 changes: 66 additions & 10 deletions Source/ePC-8801MA/vm/device.h
Original file line number Diff line number Diff line change
Expand Up @@ -624,16 +624,72 @@ class DEVICE
}
event_manager->set_frames_per_sec(frames);
}
virtual void set_lines_per_frame(int lines)
{
if(event_manager == NULL) {
event_manager = vm->first_device->next_device;
}
event_manager->set_lines_per_frame(lines);
}
#ifdef SDL
virtual void abort_main_cpu()
{
virtual void set_lines_per_frame(int lines)
{
if(event_manager == NULL) {
event_manager = vm->first_device->next_device;
}
event_manager->set_lines_per_frame(lines);
}
virtual int get_lines_per_frame()
{
if(event_manager == NULL) {
event_manager = vm->first_device->next_device;
}
return event_manager->get_lines_per_frame();
}
virtual void update_event_in_op(int clock)
{
if(event_manager == NULL) {
event_manager = vm->first_device->next_device;
}
event_manager->update_event_in_op(clock);
}
virtual uint32 get_event_remaining_clock(int register_id)
{
if(event_manager == NULL) {
event_manager = vm->first_device->next_device;
}
return event_manager->get_event_remaining_clock(register_id);
}
virtual double get_event_remaining_usec(int register_id)
{
if(event_manager == NULL) {
event_manager = vm->first_device->next_device;
}
return event_manager->get_event_remaining_usec(register_id);
}
virtual uint32 get_passed_clock_since_vline()
{
if(event_manager == NULL) {
event_manager = vm->first_device->next_device;
}
return event_manager->get_passed_clock_since_vline();
}
virtual double get_passed_usec_since_vline()
{
if(event_manager == NULL) {
event_manager = vm->first_device->next_device;
}
return event_manager->get_passed_usec_since_vline();
}
virtual int get_cur_vline()
{
if(event_manager == NULL) {
event_manager = vm->first_device->next_device;
}
return event_manager->get_cur_vline();
}
virtual int get_cur_vline_clocks()
{
if(event_manager == NULL) {
event_manager = vm->first_device->next_device;
}
return event_manager->get_cur_vline_clocks();
}
#ifdef SDL
virtual void abort_main_cpu()
{
if(event_manager == NULL) {
event_manager = vm->first_device->next_device;
}
Expand Down
177 changes: 128 additions & 49 deletions Source/ePC-8801MA/vm/event.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -107,12 +107,14 @@ void EVENT::reset()
single_exec_clock = 0;
#endif // SDL

event_remain = 0;
cpu_remain = cpu_accum = cpu_done = 0;

// reset sound
if(sound_buffer) {
memset(sound_buffer, 0, sound_samples * sizeof(uint16) * 2);
event_remain = 0;
cpu_remain = cpu_accum = cpu_done = 0;
cur_vline = 0;
vline_start_clock = current_clock();

// reset sound
if(sound_buffer) {
memset(sound_buffer, 0, sound_samples * sizeof(uint16) * 2);
}
if(sound_tmp) {
memset(sound_tmp, 0, sound_tmp_samples * sizeof(int32) * 2);
Expand Down Expand Up @@ -192,16 +194,19 @@ void EVENT::drive()
for(int i = 0; i < frame_event_count; i++) {
frame_event[i]->event_frame();
}
#ifdef SDL
for(int v = 0; v < lines_per_frame;) {
int exec_lines;
int min_event_clock;
int main_cpu_exec;
int sub_cpu_exec;
int sub_cpu_done;

// get execute lines from PC88::event_vline()
exec_lines = vline_event[0]->event_vline(v);
#ifdef SDL
for(int v = 0; v < lines_per_frame;) {
int exec_lines;
int min_event_clock;
int main_cpu_exec;
int sub_cpu_exec;
int sub_cpu_done;

cur_vline = v;
vline_start_clock = current_clock();

// get execute lines from PC88::event_vline()
exec_lines = vline_event[0]->event_vline(v);

if (exec_lines == 1) {
// V-DISP
Expand Down Expand Up @@ -304,12 +309,15 @@ void EVENT::drive()

// mix sound at the end of frame
mix_sound_block();
#else
for(int v = 0; v < lines_per_frame; v++) {
// run virtual machine per line
for(int i = 0; i < vline_event_count; i++) {
vline_event[i]->event_vline(v, vclocks[v]);
}
#else
for(int v = 0; v < lines_per_frame; v++) {
cur_vline = v;
vline_start_clock = current_clock();

// run virtual machine per line
for(int i = 0; i < vline_event_count; i++) {
vline_event[i]->event_vline(v, vclocks[v]);
}

if(event_remain < 0) {
if(-event_remain > vclocks[v]) {
Expand Down Expand Up @@ -361,11 +369,38 @@ void EVENT::drive()
}
}
}
#endif // SDL
}

void EVENT::update_event(int clock)
{
#endif // SDL
}

void EVENT::update_event_in_op(int clock)
{
#ifdef SDL
// SDL path updates events in drive(). Keep this as a compatibility no-op.
(void)clock;
#else
if(clock <= 0) {
return;
}
cpu_remain -= clock;
cpu_accum += clock;
int event_done = cpu_accum >> power;
cpu_accum -= event_done << power;

if(event_done > 0) {
if(event_remain > 0) {
if(event_done > event_remain) {
update_event(event_remain);
} else {
update_event(event_done);
}
}
event_remain -= event_done;
}
#endif // SDL
}

void EVENT::update_event(int clock)
{
#ifdef SDL
event_t *event_handle;

Expand Down Expand Up @@ -518,14 +553,24 @@ uint32 EVENT::passed_clock(uint32 prev)
return (current > prev) ? current - prev : current + (0xffffffff - prev) + 1;
}

double EVENT::passed_usec(uint32 prev)
{
return 1000000.0 * passed_clock(prev) / d_cpu[0].cpu_clocks;
}

uint32 EVENT::get_cpu_pc(int index)
{
return d_cpu[index].device->get_pc();
double EVENT::passed_usec(uint32 prev)
{
return 1000000.0 * passed_clock(prev) / d_cpu[0].cpu_clocks;
}

uint32 EVENT::get_passed_clock_since_vline()
{
return passed_clock(vline_start_clock);
}

double EVENT::get_passed_usec_since_vline()
{
return passed_usec(vline_start_clock);
}

uint32 EVENT::get_cpu_pc(int index)
{
return d_cpu[index].device->get_pc();
}

void EVENT::register_event(DEVICE* device, int event_id, double usec, bool loop, int* register_id)
Expand Down Expand Up @@ -750,27 +795,61 @@ void EVENT::cancel_event(DEVICE* device, int register_id)
}
}

void EVENT::register_frame_event(DEVICE* dev)
{
if(frame_event_count < MAX_EVENT) {
frame_event[frame_event_count++] = dev;
} else {
#ifdef _DEBUG_LOG
void EVENT::register_frame_event(DEVICE* dev)
{
if(frame_event_count < MAX_EVENT) {
for(int i = 0; i < frame_event_count; i++) {
if(frame_event[i] == dev) {
return;
}
}
frame_event[frame_event_count++] = dev;
} else {
#ifdef _DEBUG_LOG
emu->out_debug_log(_T("EVENT: too many frame events !!!\n"));
#endif
}
}

void EVENT::register_vline_event(DEVICE* dev)
{
if(vline_event_count < MAX_EVENT) {
vline_event[vline_event_count++] = dev;
} else {
#ifdef _DEBUG_LOG
void EVENT::register_vline_event(DEVICE* dev)
{
if(vline_event_count < MAX_EVENT) {
for(int i = 0; i < vline_event_count; i++) {
if(vline_event[i] == dev) {
return;
}
}
vline_event[vline_event_count++] = dev;
} else {
#ifdef _DEBUG_LOG
emu->out_debug_log(_T("EVENT: too many vline events !!!\n"));
#endif
}
}
}
}

uint32 EVENT::get_event_remaining_clock(int register_id)
{
if(0 <= register_id && register_id < MAX_EVENT) {
event_t *event_handle = &event[register_id];
if(event_handle->active) {
#ifdef SDL
if(event_handle->remain_clock > event_handle->passed_clock) {
return (event_handle->remain_clock - event_handle->passed_clock + 0x3ff) >> 10;
}
#else
if(event_handle->expired_clock > event_clocks) {
return (uint32)(event_handle->expired_clock - event_clocks);
}
#endif // SDL
}
}
return 0;
}

double EVENT::get_event_remaining_usec(int register_id)
{
return 1000000.0 * get_event_remaining_clock(register_id) / d_cpu[0].cpu_clocks;
}

#ifdef SDL
void EVENT::adjust_event(int register_id, double usec)
Expand Down
Loading
Loading