2 Skelton for retropc emulator
3 Author : Takeda.Toshiya
4 Port to Qt : K.Ohta <whatisthis.sowhat _at_ gmail.com>
6 History: 2015.11.10 Split from qt_main.cpp
7 Note: This class must be compiled per VM, must not integrate shared units.
8 [ win32 main ] -> [ Qt main ] -> [Emu Thread] -> [Independed from VMs]
12 #include <QStringList>
15 #include <QWaitCondition>
17 #include <QOpenGLContext>
21 #include "emu_thread_tmpl.h"
22 #include "mainwidget_base.h"
23 #include "qt_gldraw.h"
25 #include "dock_disks.h"
27 #include "./virtualfileslist.h"
28 #include "menu_metaclass.h"
30 //#include "../../romakana.h"
32 //#include "csp_logger.h"
33 #include "menu_flags.h"
35 EmuThreadClassBase::EmuThreadClassBase(Ui_MainWindowBase *rootWindow, std::shared_ptr<USING_FLAGS> p, QObject *parent) : QThread(parent) {
36 MainWindow = rootWindow;
39 p_config = p->get_config_ptr();
42 poweroff_notified = false; // OK?
44 is_shared_glcontext = false;
46 glContext = new QOpenGLContext(this);
48 if(glContext != nullptr) {
49 glContext->setShareContext(rootWindow->getGraphicsView()->context());
52 if(glContext->isValid()) {
53 is_shared_glcontext = true;
54 // printf("Context sharing succeeded.ADDR=%08x GLES=%s\n", glContext, (glContext->isOpenGLES()) ? "YES" : "NO");
58 thread_id = (Qt::HANDLE)0;
62 //update_fps_time = tick_timer.elapsed();
63 //next_time = update_fps_time;
71 drawCond = new QWaitCondition();
72 // keyMutex = new QMutex(QMutex::Recursive);
76 if(using_flags.get() != nullptr) {
77 if(using_flags->is_use_tape() && !using_flags->is_tape_binary_only()) {
78 tape_play_flag = false;
79 tape_rec_flag = false;
83 if(using_flags->get_use_sound_volume() > 0) {
84 for(int i = 0; i < using_flags->get_use_sound_volume(); i++) {
85 bUpdateVolumeReq[i] = true;
86 volume_avg[i] = (p_config->sound_volume_l[i] +
87 p_config->sound_volume_r[i]) / 2;
88 volume_balance[i] = (p_config->sound_volume_r[i] -
89 p_config->sound_volume_l[i]) / 2;
93 QMutexLocker _n(&keyMutex);
96 key_fifo = new FIFO(512 * 6);
102 EmuThreadClassBase::~EmuThreadClassBase() {
110 void EmuThreadClassBase::calc_volume_from_balance(int num, int balance)
112 int level = volume_avg[num];
115 volume_balance[num] = balance;
116 right = level + balance;
117 left = level - balance;
118 p_config->sound_volume_l[num] = left;
119 p_config->sound_volume_r[num] = right;
122 void EmuThreadClassBase::calc_volume_from_level(int num, int level)
124 int balance = volume_balance[num];
126 volume_avg[num] = level;
127 right = level + balance;
128 left = level - balance;
129 p_config->sound_volume_l[num] = left;
130 p_config->sound_volume_r[num] = right;
133 void EmuThreadClassBase::doExit(void)
138 void EmuThreadClassBase::button_pressed_mouse(Qt::MouseButton button)
140 if(using_flags.get() == nullptr) return;
141 if(using_flags->is_use_mouse()) {
142 button_pressed_mouse_sub(button);
144 if(using_flags->get_max_button() > 0) {
145 button_desc_t *vm_buttons_d = using_flags->get_vm_buttons();
146 if(vm_buttons_d == NULL) return;
147 int _x = (int)rint(mouse_x);
148 int _y = (int)rint(mouse_y);
151 // case Qt::RightButton:
152 for(int i = 0; i < using_flags->get_max_button(); i++) {
153 if((_x >= vm_buttons_d[i].x) &&
154 (_x < (vm_buttons_d[i].x + vm_buttons_d[i].width))) {
155 if((_y >= vm_buttons_d[i].y) &&
156 (_y < (vm_buttons_d[i].y + vm_buttons_d[i].height))) {
157 if(vm_buttons_d[i].code != 0x00) {
159 sp.code = vm_buttons_d[i].code;
162 enqueue_key_down(sp);
177 void EmuThreadClassBase::button_released_mouse(Qt::MouseButton button)
179 if(using_flags.get() == nullptr) return;
180 if(using_flags->is_use_mouse()) {
181 button_released_mouse_sub(button);
183 if(using_flags->get_max_button() > 0) {
184 button_desc_t *vm_buttons_d = using_flags->get_vm_buttons();
185 if(vm_buttons_d == NULL) return;
186 int _x = (int)rint(mouse_x);
187 int _y = (int)rint(mouse_y);
190 // case Qt::RightButton:
191 for(int i = 0; i < using_flags->get_max_button(); i++) {
192 if((_x >= vm_buttons_d[i].x) &&
193 (_x < (vm_buttons_d[i].x + vm_buttons_d[i].width))) {
194 if((_y >= vm_buttons_d[i].y) &&
195 (_y < (vm_buttons_d[i].y + vm_buttons_d[i].height))) {
196 if(vm_buttons_d[i].code != 0x00) {
198 sp.code = vm_buttons_d[i].code;
215 void EmuThreadClassBase::do_key_down(uint32_t vk, uint32_t mod, bool repeat)
221 //key_changed = true;
222 enqueue_key_down(sp);
226 void EmuThreadClassBase::do_key_up(uint32_t vk, uint32_t mod)
236 void EmuThreadClassBase::set_tape_play(bool flag)
238 tape_play_flag = flag;
241 void EmuThreadClassBase::resize_screen(int screen_width, int screen_height, int stretched_width, int stretched_height)
243 emit sig_resize_screen(screen_width, screen_height);
244 emit sig_resize_osd(screen_width);
247 void EmuThreadClassBase::sample_access_drv(void)
249 if(using_flags.get() == nullptr) return;
250 if(using_flags->is_use_qd()) get_qd_string();
251 if(using_flags->is_use_fd()) get_fd_string();
252 if(using_flags->is_use_hdd()) get_hdd_string();
253 if(using_flags->is_use_tape() && !using_flags->is_tape_binary_only()) get_tape_string();
254 if(using_flags->is_use_compact_disc()) get_cd_string();
255 if(using_flags->is_use_bubble()) get_bubble_string();
261 void EmuThreadClassBase::do_update_config()
263 bUpdateConfigReq = true;
266 void EmuThreadClassBase::do_start_record_sound()
268 bStartRecordSoundReq = true;
271 void EmuThreadClassBase::do_stop_record_sound()
273 bStopRecordSoundReq = true;
276 void EmuThreadClassBase::do_reset()
281 void EmuThreadClassBase::do_unblock()
286 void EmuThreadClassBase::do_block()
290 void EmuThreadClassBase::do_start_emu_thread()
292 start(QThread::TimeCriticalPriority);
295 void EmuThreadClassBase::do_special_reset(void)
297 QAction *cp = qobject_cast<QAction*>(QObject::sender());
298 if(cp == nullptr) return;
299 int num = cp->data().value<int>();
302 if(using_flags.get() != nullptr) {
303 if(num >= using_flags->get_use_special_reset_num()) return;
305 bSpecialResetReq = true;
306 specialResetNum = num;
309 void EmuThreadClassBase::do_load_state(void)
311 QAction *cp = qobject_cast<QAction*>(QObject::sender());
312 if(cp == nullptr) return;
313 QString s = cp->data().toString();
316 bLoadStateReq = true;
319 void EmuThreadClassBase::do_save_state(void)
321 QAction *cp = qobject_cast<QAction*>(QObject::sender());
322 if(cp == nullptr) return;
323 QString s = cp->data().toString();
326 bSaveStateReq = true;
329 void EmuThreadClassBase::do_start_record_video()
331 if(p_config == nullptr) return;
332 int fps = p_config->video_frame_rate;
334 bStartRecordMovieReq = true;
337 void EmuThreadClassBase::do_stop_record_video()
339 bStartRecordMovieReq = false;
342 void EmuThreadClassBase::do_update_volume_level(int num, int level)
344 if(using_flags.get() == nullptr) return;
345 if(using_flags->get_use_sound_volume() > 0) {
346 if((num < using_flags->get_use_sound_volume()) && (num >= 0)) {
347 calc_volume_from_level(num, level);
348 bUpdateVolumeReq[num] = true;
353 void EmuThreadClassBase::do_update_volume_balance(int num, int level)
355 if(using_flags.get() == nullptr) return;
356 if(using_flags->get_use_sound_volume() > 0) {
357 if((num < using_flags->get_use_sound_volume()) && (num >= 0)) {
358 calc_volume_from_balance(num, level);
359 bUpdateVolumeReq[num] = true;
364 int EmuThreadClassBase::parse_command_queue(QStringList _l, int _begin)
366 int _ret = _l.size() / 2;
367 for(int i = _begin * 2; i < _l.size(); i+= 2) {
368 QString _dom = _l.at(i);
369 QString _file = _l.at(i + 1);
370 QString _dom_type = _dom.left(_dom.size() - 1);
373 _dom_num = _dom.right(1).toInt(&_num_ok);
375 if((_dom_type == QString::fromUtf8("vFloppyDisk")) ||
376 (_dom_type == QString::fromUtf8("vBubble"))) {
377 int _n = _file.indexOf(QString::fromUtf8("@"));
380 if((_n > 0) && (_n < 4)) {
381 _slot = _file.left(_n).toInt(&_num_ok);
383 fileInfo = QFileInfo(_file.right(_file.size() - (_n + 1)));
385 fileInfo = QFileInfo(_file);
389 fileInfo = QFileInfo(_file);
392 if(fileInfo.isFile()) {
393 const _TCHAR *path_shadow = (const _TCHAR *)(fileInfo.absoluteFilePath().toLocal8Bit().constData());
394 if(_dom_type == QString::fromUtf8("vFloppyDisk")) {
395 if(check_file_extension(path_shadow, ".d88") || check_file_extension(path_shadow, ".d77")) {
397 emit sig_change_virtual_media(CSP_DockDisks_Domain_FD, _dom_num, fileInfo.absoluteFilePath());;
399 emit sig_open_fd(_dom_num, fileInfo.absoluteFilePath());
400 emit sig_change_virtual_media(CSP_DockDisks_Domain_FD, _dom_num, fileInfo.absoluteFilePath());;
402 } else if(_dom_type == QString::fromUtf8("vHardDisk")) {
403 emit sig_open_hdd(_dom_num, fileInfo.absoluteFilePath());
404 emit sig_change_virtual_media(CSP_DockDisks_Domain_HD, _dom_num, fileInfo.absoluteFilePath());;
405 } else if(_dom_type == QString::fromUtf8("vBubble")) {
406 if(check_file_extension(path_shadow, ".b77")) {
407 emit sig_open_b77_bubble(_dom_num, fileInfo.absoluteFilePath(), _slot);
408 emit sig_change_virtual_media(CSP_DockDisks_Domain_Bubble, _dom_num, fileInfo.absoluteFilePath());;
410 emit sig_open_bubble(_dom_num, fileInfo.absoluteFilePath());
411 emit sig_change_virtual_media(CSP_DockDisks_Domain_Bubble, _dom_num, fileInfo.absoluteFilePath());;
416 QFileInfo fileInfo = QFileInfo(_file);
417 if(fileInfo.isFile()) {
418 if(_dom_type == QString::fromUtf8("vQuickDisk")) {
419 emit sig_open_quick_disk(_dom_num, fileInfo.absoluteFilePath());
420 emit sig_change_virtual_media(CSP_DockDisks_Domain_QD, _dom_num, fileInfo.absoluteFilePath());;
421 } else if(_dom_type == QString::fromUtf8("vCmt")) {
422 emit sig_open_cmt_load(_dom_num, fileInfo.absoluteFilePath());
423 emit sig_change_virtual_media(CSP_DockDisks_Domain_CMT, _dom_num, fileInfo.absoluteFilePath());;
424 } else if(_dom_type == QString::fromUtf8("vBinary")) {
425 emit sig_open_binary_load(_dom_num, fileInfo.absoluteFilePath());
426 emit sig_change_virtual_media(CSP_DockDisks_Domain_Binary, _dom_num, fileInfo.absoluteFilePath());;
427 } else if(_dom_type == QString::fromUtf8("vCart")) {
428 emit sig_open_cart(_dom_num, fileInfo.absoluteFilePath());
429 emit sig_change_virtual_media(CSP_DockDisks_Domain_Cart, _dom_num, fileInfo.absoluteFilePath());;
430 } else if(_dom_type == QString::fromUtf8("vLD")) {
431 vMovieQueue.append(_dom);
432 vMovieQueue.append(fileInfo.absoluteFilePath());
433 emit sig_change_virtual_media(CSP_DockDisks_Domain_LD, _dom_num, fileInfo.absoluteFilePath());;
434 //emit sig_open_laser_disc(_dom_num, fileInfo.absoluteFilePath());
435 } else if(_dom_type == QString::fromUtf8("vCD")) {
436 emit sig_open_cdrom(_dom_num, fileInfo.absoluteFilePath());
437 emit sig_change_virtual_media(CSP_DockDisks_Domain_CD, _dom_num, fileInfo.absoluteFilePath());;
443 _ret = _ret - _begin;
444 if(_ret < 0) _ret = 0;
449 const _TCHAR *EmuThreadClassBase::get_device_name(void)
451 return (const _TCHAR *)_T("TEST");
454 void EmuThreadClassBase::print_framerate(int frames)
456 if(frames >= 0) draw_frames += frames;
458 qint64 current_time = tick_timer.elapsed();
459 //qint64 current_time = SDL_GetTicks();
461 if(update_fps_time <= current_time && update_fps_time != 0) {
464 //int ratio = (int)(100.0 * (double)draw_frames / (double)total_frames + 0.5);
466 if((poweroff_notified) || (p_emu == nullptr)) {
467 my_stprintf_s(buf, 255, _T("*Power OFF*"));
468 } else if(now_skip) {
469 int ratio = (int)(100.0 * (((double)total_frames / get_emu_frame_rate()) * 2.0) + 0.5);
470 my_stprintf_s(buf, 255, _T("%s - Skip Frames (%d %%)"), get_device_name(), ratio);
472 if(get_message_count() > 0) {
473 snprintf(buf, 255, _T("%s - %s"), get_device_name(), get_emu_message());
476 int ratio = (int)(100.0 * ((double)draw_frames / (double)total_frames) * 2.0 + 0.5);
477 snprintf(buf, 255, _T("%s - %d fps (%d %%)"), get_device_name(), draw_frames, ratio);
480 if(p_config->romaji_to_kana) {
481 message = QString::fromUtf8("[R]");
482 message = message + QString::fromUtf8(buf);
486 emit message_changed(message);
487 emit window_title_changed(message);
488 update_fps_time += 1000;
489 total_frames = draw_frames = 0;
492 if(update_fps_time <= current_time) {
493 update_fps_time = current_time + 1000;
495 calc_message = false;
501 int EmuThreadClassBase::get_d88_file_cur_bank(int drive)
503 std::shared_ptr<USING_FLAGS> p = using_flags;
504 if(p.get() == nullptr) return -1;
505 if(!(p->is_use_fd())) return -1;
507 if((drive < p->get_max_drive()) && (p_emu != nullptr)) {
508 QMutexLocker _locker(&uiMutex);
509 int bank_num = p_emu->d88_file[drive].bank_num;
510 int cur_bank = p_emu->d88_file[drive].cur_bank;
511 if((bank_num > 0) && (cur_bank < bank_num)) {
519 int EmuThreadClassBase::get_d88_file_bank_num(int drive)
521 if(using_flags.get() == nullptr) return -1;
522 if(!(using_flags->is_use_fd())) return -1;
524 if(drive < using_flags->get_max_drive()) {
525 QMutexLocker _locker(&uiMutex);
526 return p_emu->d88_file[drive].bank_num;
533 QString EmuThreadClassBase::get_d88_file_disk_name(int drive, int banknum)
535 if(using_flags.get() == nullptr) return QString::fromUtf8("");
536 if(!(using_flags->is_use_fd())) return QString::fromUtf8("");
538 if(drive < 0) return QString::fromUtf8("");
539 if((drive < using_flags->get_max_drive()) && (banknum < get_d88_file_bank_num(drive))) {
540 QMutexLocker _locker(&uiMutex);
541 QString _n = QString::fromLocal8Bit((const char *)(&(p_emu->d88_file[drive].disk_name[banknum][0])));
545 return QString::fromUtf8("");
549 bool EmuThreadClassBase::is_floppy_disk_protected(int drive)
551 if(using_flags.get() == nullptr) return false;
552 if(!(using_flags->is_use_fd())) return false;
554 QMutexLocker _locker(&uiMutex);
555 bool _b = p_emu->is_floppy_disk_protected(drive);
560 QString EmuThreadClassBase::get_d88_file_path(int drive)
562 if(using_flags.get() == nullptr) return QString::fromUtf8("");
564 if(!(using_flags->is_use_fd())) return QString::fromUtf8("");
565 if(drive < 0) return QString::fromUtf8("");
567 if(drive < using_flags->get_max_drive()) {
568 QMutexLocker _locker(&uiMutex);
569 QString _n = QString::fromLocal8Bit((const char *)(&(p_emu->d88_file[drive].path)));
573 return QString::fromUtf8("");
576 void EmuThreadClassBase::set_floppy_disk_protected(int drive, bool flag)
578 if(using_flags.get() == nullptr) return;
579 if(!(using_flags->is_use_fd())) return;
581 QMutexLocker _locker(&uiMutex);
582 p_emu->is_floppy_disk_protected(drive, flag);
585 #if defined(Q_OS_LINUX)
586 //#define _GNU_SOURCE
592 void EmuThreadClassBase::do_set_emu_thread_to_fixed_cpu_from_action(void)
594 QAction *cp = qobject_cast<QAction*>(QObject::sender());
595 if(cp == nullptr) return;
596 int cpunum = cp->data().value<int>();
597 set_emu_thread_to_fixed_cpu(cpunum);
600 void EmuThreadClassBase::set_emu_thread_to_fixed_cpu(int cpunum)
602 #if defined(Q_OS_LINUX)
603 if(thread_id == (Qt::HANDLE)nullptr) {
604 queue_fixed_cpu = cpunum;
608 long cpus = sysconf(_SC_NPROCESSORS_ONLN);
610 mask = CPU_ALLOC(cpus);
611 CPU_ZERO_S(CPU_ALLOC_SIZE(cpus), mask);
612 if((cpunum < 0) || (cpunum >= cpus)) {
613 for(int i = 0; i < cpus; i++ ) {
617 CPU_SET(cpunum, mask);
619 // sched_setaffinity((pid_t)thread_id, CPU_ALLOC_SIZE(cpus), (const cpu_set_t*)mask);
620 pthread_setaffinity_np(*((pthread_t*)thread_id), CPU_ALLOC_SIZE(cpus),(const cpu_set_t *)mask);
628 void EmuThreadClassBase::get_fd_string(void)
630 if(using_flags.get() == nullptr) return;
631 if(!(using_flags->is_use_fd())) return;
636 uint32_t access_drv = 0;
637 bool lamp_stat = false;
638 access_drv = p_emu->is_floppy_disk_accessed();
640 for(i = 0; i < (int)using_flags->get_max_drive(); i++) {
644 if(p_emu->is_floppy_disk_inserted(i)) {
645 if(i == (access_drv - 1)) {
647 alamp = QString::fromUtf8("<FONT COLOR=FIREBRICK>â</FONT>"); // ðŸU+1F4BE Floppy Disk
649 alamp = QString::fromUtf8("<FONT COLOR=BLUE>â</FONT>"); // ðŸU+1F4BE Floppy Disk
651 if(p_emu->d88_file[i].bank_num > 0) {
652 iname = QString::fromUtf8(p_emu->d88_file[i].disk_name[p_emu->d88_file[i].cur_bank]);
654 iname = QString::fromUtf8("*Inserted*");
659 alamp = QString::fromUtf8("Ã");
661 if(alamp != fd_lamp[i]) {
662 emit sig_set_access_lamp(i + 2, lamp_stat);
663 emit sig_change_access_lamp(CSP_DockDisks_Domain_FD, i, alamp);
666 if(tmpstr != fd_text[i]) {
667 emit sig_set_access_lamp(i + 2, lamp_stat);
668 emit sig_change_osd(CSP_DockDisks_Domain_FD, i, tmpstr);
676 void EmuThreadClassBase::get_qd_string(void)
678 if(using_flags.get() == nullptr) return;
679 if(!(using_flags->is_use_qd())) return;
684 uint32_t access_drv = 0;
685 bool lamp_stat = false;
686 access_drv = p_emu->is_quick_disk_accessed();
687 for(i = 0; i < using_flags->get_max_qd(); i++) {
690 if(p_emu->is_quick_disk_inserted(i)) {
691 if(i == (access_drv - 1)) {
692 alamp = QString::fromUtf8("<FONT COLOR=MAGENTA>â</FONT>"); // ðœãU+1F4BD MiniDisc
695 alamp = QString::fromUtf8("<FONT COLOR=BLUE>â</FONT>"); // ðœU+1F4BD MiniDisc
698 //tmpstr = tmpstr + QString::fromUtf8(" ");
699 //iname = QString::fromUtf8("*Inserted*");
700 //tmpstr = tmpstr + iname;
702 tmpstr = QString::fromUtf8("Ã");
704 if(tmpstr != qd_text[i]) {
705 emit sig_set_access_lamp(i + 10, lamp_stat);
706 emit sig_change_access_lamp(CSP_DockDisks_Domain_QD, i, tmpstr);
713 void EmuThreadClassBase::get_tape_string()
719 if(using_flags.get() == nullptr) return;
720 if(!(using_flags->is_use_tape()) || (using_flags->is_tape_binary_only())) return;
721 for(int i = 0; i < using_flags->get_max_tape(); i++) {
722 inserted = p_emu->is_tape_inserted(i);
726 const _TCHAR *ts = p_emu->get_tape_message(i);
728 tmpstr = QString::fromUtf8(ts);
729 readwrite = p_emu->is_tape_recording(i);
731 tmpstr = QString::fromUtf8("<FONT COLOR=RED><B>") + tmpstr + QString::fromUtf8("</B></FONT>");
733 tmpstr = QString::fromUtf8("<FONT COLOR=GREEN><B>") + tmpstr + QString::fromUtf8("</B></FONT>");
737 tmpstr = QString::fromUtf8("<FONT COLOR=BLUE> EMPTY </FONT>");
739 emit sig_set_access_lamp(i + 12 + ((readwrite) ? 2 : 0), inserted);
740 if(tmpstr != cmt_text[i]) {
741 emit sig_change_osd(CSP_DockDisks_Domain_CMT, i, tmpstr);
742 cmt_text[i] = tmpstr;
748 void EmuThreadClassBase::get_hdd_string(void)
750 if(using_flags.get() == nullptr) return;
751 if(!(using_flags->is_use_hdd())) return;
753 QString tmpstr, alamp;
754 uint32_t access_drv = p_emu->is_hard_disk_accessed();
755 bool lamp_stat = false;
758 for(int i = 0; i < (int)using_flags->get_max_hdd(); i++) {
759 if(p_emu->is_hard_disk_inserted(i)) {
760 if((access_drv & (1 << i)) != 0) {
761 alamp = QString::fromUtf8("<FONT COLOR=LIME>â </FONT>"); //
764 alamp = QString::fromUtf8("<FONT COLOR=BLUE>â¡</FONT>"); //
767 alamp = QString::fromUtf8("Ã");
769 if(tmpstr != hdd_text[i]) {
770 emit sig_set_access_lamp(i + 16, lamp_stat);
771 emit sig_change_osd(CSP_DockDisks_Domain_HD, i, tmpstr);
772 hdd_text[i] = tmpstr;
774 if(alamp != hdd_lamp[i]) {
775 emit sig_set_access_lamp(i + 16, lamp_stat);
776 emit sig_change_access_lamp(CSP_DockDisks_Domain_HD, i, alamp);
783 void EmuThreadClassBase::get_cd_string(void)
785 if(using_flags.get() == nullptr) return;
786 if(!(using_flags->is_use_compact_disc())) return;
789 uint32_t access_drv = p_emu->is_compact_disc_accessed();
790 for(int i = 0; i < (int)using_flags->get_max_cd(); i++) {
791 if(p_emu->is_compact_disc_inserted(i)) {
792 if((access_drv & (1 << i)) != 0) {
793 tmpstr = QString::fromUtf8("<FONT COLOR=DEEPSKYBLUE>â</FONT>"); // U+1F4BF OPTICAL DISC
795 tmpstr = QString::fromUtf8("<FONT COLOR=BLUE>â</FONT>"); // U+1F4BF OPTICAL DISC
798 tmpstr = QString::fromUtf8("Ã");
800 if(tmpstr != cdrom_text[i]) {
801 emit sig_set_access_lamp(i + 24, ((access_drv & (1 << i)) != 0));
802 emit sig_change_access_lamp(CSP_DockDisks_Domain_CD, i, tmpstr);
803 cdrom_text[i] = tmpstr;
809 void EmuThreadClassBase::get_bubble_string(void)
811 if(using_flags.get() == nullptr) return;
812 if(!(using_flags->is_use_bubble())) return;
818 for(i = 0; i < using_flags->get_max_bubble() ; i++) {
819 if(p_emu->is_bubble_casette_inserted(i)) {
820 alamp = QString::fromUtf8("â ");
821 //tmpstr = alamp + QString::fromUtf8(" ");
823 tmpstr = QString::fromUtf8("Ã");
824 //tmpstr = tmpstr + QString::fromUtf8(" ");
826 if(alamp != bubble_text[i]) {
827 emit sig_change_access_lamp(CSP_DockDisks_Domain_Bubble, i, tmpstr);
828 bubble_text[i] = alamp;
834 double EmuThreadClassBase::get_emu_frame_rate(void)
836 if(using_flags.get() == nullptr) return 30.0;
837 return p_emu->get_frame_rate();
840 int EmuThreadClassBase::get_message_count(void)
842 if(using_flags.get() == nullptr) return 0;
843 return p_emu->message_count;
846 const _TCHAR *EmuThreadClassBase::get_emu_message(void)
848 if(using_flags.get() == nullptr) return ((const _TCHAR *)_T(""));
849 return (const _TCHAR *)(p_emu->message);
852 bool EmuThreadClassBase::now_debugging()
854 if(using_flags.get() == nullptr) return false;
855 if(using_flags->is_use_debugger()) {
856 return p_emu->now_debugging;
863 #if defined(Q_OS_LINUX)