diff --git a/CMakeLists.txt b/CMakeLists.txt index e47f19fe..a328d1b1 100755 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -87,11 +87,17 @@ elseif(${CMAKE_SYSTEM_NAME} MATCHES "Darwin") set(CPACK_DMG_NAME ${PROJECT_NAME}) set(CPACK_DMG_FORMAT UDZO) - set(CPACK_BUNDLE_NAME ${PROJECT_NAME}.app) - set(CPACK_BUNDLE_ICON ${CMAKE_SOURCE_DIR}/images/xpeccy.icns) + set(MACOSX_BUNDLE_BUNDLE_NAME ${PROJECT_NAME}.app) + set(MACOSX_BUNDLE_ICON_FILE ${PROJECT_NAME}.icns) + set(MACOSX_BUNDLE_INFO_PLIST ${CMAKE_SOURCE_DIR}/Info.plist) + set(MACOSX_BUNDLE_BUNDLE_VERSION ${XVER}) - set_source_files_properties(${CMAKE_BINARY_DIR}/${PROJECT_NAME} PROPERTIES MACOS_PACKAGE_LOCATION MacOSX) - set_source_files_properties(${CPACK_BUNDLE_ICON} PROPERTIES MACOS_PACKAGE_LOCATION Resources) + set(BUNDLE_ICON_PATH ${CMAKE_SOURCE_DIR}/images/${MACOSX_BUNDLE_ICON_FILE}) + set(BUNDLE_PATH ${CMAKE_BINARY_DIR}/${MACOSX_BUNDLE_BUNDLE_NAME}) + + + set_source_files_properties(${CMAKE_BINARY_DIR}/${PROJECT_NAME} PROPERTIES MACOSX_PACKAGE_LOCATION MacOSX) + set_source_files_properties(${BUNDLE_ICON_PATH} PROPERTIES MACOSX_PACKAGE_LOCATION Resources) elseif(${CMAKE_SYSTEM_NAME} MATCHES "Windows") @@ -143,6 +149,7 @@ set(MOCFILES ./src/dbg_finder.h ./src/watcher.h ./src/setupwin.h + ./src/vkeyboard.h ./src/xgui/xgui.h ) @@ -232,14 +239,20 @@ include_directories(${INCLUDIRS}) if(${CMAKE_SYSTEM_NAME} MATCHES "Linux") add_executable(${PROJECT_NAME} ${SOURCES} ${HEADERS} ${UIHEADERS} ${RESOURCES} ${MOCHEADERS}) elseif(${CMAKE_SYSTEM_NAME} MATCHES "Darwin") - add_executable(${PROJECT_NAME} MACOSX_BUNDLE ${SOURCES} ${HEADERS} ${UIHEADERS} ${RESOURCES} ${MOCHEADERS}) + add_executable(${PROJECT_NAME} MACOSX_BUNDLE ${SOURCES} ${HEADERS} ${UIHEADERS} ${RESOURCES} ${MOCHEADERS} ${BUNDLE_ICON_PATH}) find_program(MACDEPLOYQTEXE macdeployqt) add_custom_command(TARGET ${PROJECT_NAME} POST_BUILD - COMMAND mkdir ARGS -p ${CMAKE_BINARY_DIR}/${CPACK_BUNDLE_NAME}/Contents/Frameworks - COMMAND cp ARGS -R /Library/Frameworks/SDL.framework ${CMAKE_BINARY_DIR}/${CPACK_BUNDLE_NAME}/Contents/Frameworks - COMMAND ${MACDEPLOYQTEXE} ARGS ${CMAKE_BINARY_DIR}/${CPACK_BUNDLE_NAME} -always-overwrite + COMMAND ${MACDEPLOYQTEXE} ARGS ${BUNDLE_PATH} -always-overwrite +# COMMAND mkdir ARGS -p ${BUNDLE_PATH}/Contents/Frameworks + COMMAND cp ARGS -R /Library/Frameworks/SDL.framework ${BUNDLE_PATH}/Contents/Frameworks ) set(CMAKE_INSTALL_PREFIX "/Applications") +# install(CODE " +# include(BundleUtilities) +# fixup_bundle(${BUNDLE_PATH} \"\" ${LIBDIRS}) +# find_program(MACDEPLOYQTEXE macdeployqt) +# execute_process(COMMAND ${MACDEPLOYQTEXE} ARGS ${BUNDLE_PATH} -always-overwrite) +# " COMPONENT Runtime) install(TARGETS ${PROJECT_NAME} BUNDLE DESTINATION .) elseif(${CMAKE_SYSTEM_NAME} MATCHES "Windows") add_executable(${PROJECT_NAME} WIN32 ${SOURCES} ${HEADERS} ${UIHEADERS} ${RESOURCES} ${MOCHEADERS}) diff --git a/Info.plist b/Info.plist new file mode 100644 index 00000000..a22227cb --- /dev/null +++ b/Info.plist @@ -0,0 +1,30 @@ + + + + + CFBundleDevelopmentRegion + Russian + CFBundleDisplayName + xpeccy + CFBundleExecutable + xpeccy + CFBundleIconFile + xpeccy.icns + CFBundleIdentifier + ru.samstyle.xpeccy + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + xpeccy + CFBundlePackageType + APPL + CFBundleShortVersionString + 0.6 + CFBundleSignature + iddqd + NSPrincipalClass + NSApplication + LSApplicationCategoryType + public.app-category.productivity + + \ No newline at end of file diff --git a/Release b/Release index 839ff8c3..966d5fc1 100644 --- a/Release +++ b/Release @@ -1 +1 @@ -0.6.20170419 +0.6.20170426 diff --git a/images/cartrige.png b/images/cartrige.png new file mode 100644 index 00000000..f56fe037 Binary files /dev/null and b/images/cartrige.png differ diff --git a/images/eye.png b/images/eye.png deleted file mode 100644 index c93b971f..00000000 Binary files a/images/eye.png and /dev/null differ diff --git a/images/keyboardzx.png b/images/keyboardzx.png new file mode 100644 index 00000000..640309f4 Binary files /dev/null and b/images/keyboardzx.png differ diff --git a/images/objective.png b/images/objective.png new file mode 100644 index 00000000..9734d605 Binary files /dev/null and b/images/objective.png differ diff --git a/images/pixels.png b/images/pixels.png new file mode 100644 index 00000000..87b50c9f Binary files /dev/null and b/images/pixels.png differ diff --git a/src/debuger.cpp b/src/debuger.cpp index 9ed31725..adcf084a 100644 --- a/src/debuger.cpp +++ b/src/debuger.cpp @@ -41,7 +41,7 @@ void DebugWin::start(Computer* c) { updateScreen(); if (!comp->vid->tail) vidDarkTail(comp->vid); - ui.tabsPanel->setTabEnabled(ui.tabsPanel->indexOf(ui.gbTab), comp->hw->type == HW_GBC); + ui.tabsPanel->setTabEnabled(ui.tabsPanel->indexOf(ui.gbTab), comp->hw->id == HW_GBC); ui.dasmTable->comp = comp; move(winPos); @@ -369,7 +369,7 @@ void DebugWin::doStep() { disasmAdr = comp->cpu->pc; fillDisasm(); } - if ((traceType == DBG_TRACE_INT) && (comp->cpu->inth)) + if ((traceType == DBG_TRACE_INT) && (comp->cpu->intrq & comp->cpu->inten)) trace = 0; if ((traceType == DBG_TRACE_HERE) && (comp->cpu->pc == traceAdr)) trace = 0; @@ -646,7 +646,7 @@ bool DebugWin::fillAll() { setSignal(ui.labCPM, comp->cpm); //setSignal(ui.labHBlank, comp->vid->hblank); //setSignal(ui.labVBlank, comp->vid->vblank); - setSignal(ui.labINT, comp->cpu->inth); + setSignal(ui.labINT, comp->cpu->intrq & comp->cpu->inten); if (memViewer->isVisible()) memViewer->fillImage(); return fillDisasm(); diff --git a/src/emulwin.cpp b/src/emulwin.cpp index cde378c1..485e0114 100644 --- a/src/emulwin.cpp +++ b/src/emulwin.cpp @@ -33,83 +33,13 @@ // main -unsigned char screen[2048 * 2048 * 3]; // scaled image (up to fullscreen) +unsigned char screen[4096 * 2048 * 3]; // scaled image (up to fullscreen) unsigned char scrn[1024 * 512 * 3]; // 2:1 image unsigned char prvScr[1024 * 512 * 3]; // copy of last 2:1 image (for noflic) // temp emulation unsigned short pc,af,de,ix; -// onscreen keyboard - -unsigned char kwMap[4][10] = { - {'1','2','3','4','5','6','7','8','9','0'}, - {'q','w','e','r','t','y','u','i','o','p'}, - {'a','s','d','f','g','h','j','k','l','E'}, - {'C','z','x','c','v','b','n','m','S',' '} -}; - -keyWindow::keyWindow(QWidget* p):QLabel(p) { - kb = NULL; - xk.key1 = 0; - xk.key2 = 0; -} - -void keyWindow::paintEvent(QPaintEvent*) { - QPainter pnt; - int wid = width() / 10 + 1; - int hig = height() / 4; - pnt.begin(this); - pnt.fillRect(QRectF(0,0,1,1), qRgba(0,0,0,0)); - if (~kb->map[0] & 2) { // SS - pnt.fillRect(8 * wid, 3 * hig, wid, hig, qRgba(64, 160, 160, 100)); - } - if (~kb->map[7] & 1) { // CS - pnt.fillRect(0, 3 * hig, wid, hig, qRgba(64, 160, 160, 100)); - } - pnt.drawPixmap(0, 0, QPixmap(":/images/keymap.png")); - pnt.end(); -} - -void keyWindow::mousePressEvent(QMouseEvent* ev) { - if (!kb) return; - int row; - int col; - if (ev->button() == Qt::RightButton) { - keyReleaseAll(kb); - xk.key1 = 0; - } else { - row = ev->y() * 4 / height(); - col = ev->x() * 10 / width(); - xk.key1 = kwMap[row][col]; - if ((xk.key1 == 'S') || (xk.key1 == 'C')) { - keyTrigger(kb, xk, 0); - update(); - } else { - keyPress(kb, xk, 0); - } - } -} - -void keyWindow::mouseReleaseEvent(QMouseEvent* ev) { - if (!kb) return; - switch(xk.key1) { - case 'C': - if (kb->map[0] & 2) break; - keyRelease(kb, xk, 0); - update(); - break; - case 'S': - if (kb->map[7] & 1) break; - keyRelease(kb, xk, 0); - update(); - break; - default: - keyRelease(kb, xk, 0); - break; - } -} - // mainwin void MainWin::updateHead() { @@ -236,8 +166,6 @@ MainWin::MainWin() { rzxWin = new RZXWin(this); connect(rzxWin,SIGNAL(stateChanged(int)),this,SLOT(rzxStateChanged(int))); - initUserMenu(); - keywin = new keyWindow(); QPixmap pxm(":/images/keymap.png"); keywin->setPixmap(pxm); @@ -245,6 +173,8 @@ MainWin::MainWin() { keywin->setWindowIcon(QIcon(":/images/keyboard.png")); keywin->setWindowTitle("ZX Keyboard"); + initUserMenu(); + cmosTimer.start(1000); timer.setInterval(20); connect(&cmosTimer,SIGNAL(timeout()),this,SLOT(cmosTick())); @@ -554,8 +484,8 @@ void MainWin::keyPressEvent(QKeyEvent *ev) { keywin->close(); } else { keywin->show(); - activateWindow(); - raise(); + // activateWindow(); + // raise(); } break; case Qt::Key_N: @@ -572,7 +502,7 @@ void MainWin::keyPressEvent(QKeyEvent *ev) { break; } } else { - if (comp->hw->type == HW_GBC) + if (comp->hw->id == HW_GBC) gbPress(comp, kent.name); keyPress(comp->keyb, kent.zxKey, 0); if (kent.msxKey.key1) keyPress(comp->keyb,kent.msxKey,2); @@ -664,6 +594,7 @@ void MainWin::keyPressEvent(QKeyEvent *ev) { break; } } + if (keywin->isVisible()) keywin->update(); } void MainWin::keyReleaseEvent(QKeyEvent *ev) { @@ -680,6 +611,7 @@ void MainWin::keyReleaseEvent(QKeyEvent *ev) { keyRelease(comp->keyb, kent.zxKey, 0); if (kent.msxKey.key1) keyRelease(comp->keyb,kent.msxKey,2); } + if (keywin->isVisible()) keywin->update(); } void MainWin::mousePressEvent(QMouseEvent *ev){ @@ -1031,7 +963,8 @@ void MainWin::initUserMenu() { userMenu->addSeparator(); pckAct = userMenu->addAction(QIcon(":/images/keyboard.png"),"PC keyboard"); pckAct->setCheckable(true); - userMenu->addAction(QIcon(),"Watcher",watcher,SLOT(show())); + userMenu->addAction(QIcon(":/images/keyboardzx.png"),"ZX Keyboard",keywin,SLOT(show())); + userMenu->addAction(QIcon(":/images/objective.png"),"Watcher",watcher,SLOT(show())); userMenu->addAction(QIcon(":/images/other.png"),"Options",this,SLOT(doOptions())); connect(bookmarkMenu,SIGNAL(triggered(QAction*)),this,SLOT(bookmarkSelected(QAction*))); @@ -1044,7 +977,7 @@ void MainWin::initUserMenu() { fileMenu->addAction(QIcon(":/images/memory.png"),"Snapshot")->setData(FT_SNAP | FT_SPG); fileMenu->addAction(QIcon(":/images/tape.png"),"Tape")->setData(FT_TAPE); fileMenu->addAction(QIcon(":/images/floppy.png"),"Floppy")->setData(FT_DISK); - fileMenu->addAction(QIcon(),"Slot")->setData(FT_SLOT); + fileMenu->addAction(QIcon(":/images/cartrige.png"),"Slot")->setData(FT_SLOT); nsAct = vmodeMenu->addAction("No screen"); nsAct->setData(-1); diff --git a/src/emulwin.h b/src/emulwin.h index 31e836d2..c8bcf22f 100644 --- a/src/emulwin.h +++ b/src/emulwin.h @@ -11,6 +11,7 @@ #include "setupwin.h" #include "debuger.h" #include "watcher.h" +#include "vkeyboard.h" #include "xcore/xcore.h" #include "xgui/xgui.h" #include "ethread.h" @@ -35,19 +36,6 @@ typedef struct { QString imgName; } xLed; -class keyWindow : public QLabel { - Q_OBJECT - public: - keyWindow(QWidget* = NULL); - Keyboard* kb; - private: - xKey xk; - protected: - void paintEvent(QPaintEvent*); - void mousePressEvent(QMouseEvent*); - void mouseReleaseEvent(QMouseEvent*); -}; - class MainWin : public QWidget { Q_OBJECT public: diff --git a/src/ethread.cpp b/src/ethread.cpp index c6af35a1..a16c6627 100644 --- a/src/ethread.cpp +++ b/src/ethread.cpp @@ -4,7 +4,7 @@ #include "xgui/xgui.h" #include "xcore/sound.h" -std::mutex emutex; +QMutex emutex; unsigned char* blkData = NULL; extern unsigned char scrn[1024 * 512 * 3]; diff --git a/src/ethread.h b/src/ethread.h index 54a5c7ed..7f7c6176 100644 --- a/src/ethread.h +++ b/src/ethread.h @@ -2,7 +2,7 @@ #define _ETHREAD_H #include -#include +#include #include "xcore/xcore.h" @@ -29,6 +29,6 @@ class xThread : public QThread { void tapeSignal(int,int); }; -extern std::mutex emutex; +extern QMutex emutex; #endif diff --git a/src/filer.cpp b/src/filer.cpp index e0a30390..94cc9c44 100644 --- a/src/filer.cpp +++ b/src/filer.cpp @@ -93,7 +93,7 @@ int getFileType(QString path) { int testSlotOn(Computer* comp) { int res = 0; - switch (comp->hw->type) { + switch (comp->hw->id) { case HW_MSX: case HW_MSX2: case HW_GBC: diff --git a/src/libxpeccy/cpu/LR35902/lr35902.c b/src/libxpeccy/cpu/LR35902/lr35902.c index e0e819a5..ee842cae 100644 --- a/src/libxpeccy/cpu/LR35902/lr35902.c +++ b/src/libxpeccy/cpu/LR35902/lr35902.c @@ -27,23 +27,6 @@ void lr_reset(CPU* cpu) { cpu->i = cpu->r = cpu->r7 = 0xff; } -int lr_exec(CPU* cpu) { - if (cpu->lock) return 1; - cpu->t = 0; - cpu->opTab = lrTab; - do { - cpu->tmp = cpu->mrd(cpu->pc++, 1, cpu->data); - cpu->op = &cpu->opTab[cpu->tmp]; - cpu->t += cpu->op->t; - cpu->op->exec(cpu); - } while (cpu->op->prefix); - if (cpu->dihalt) { // LR35902 bug (?) : repeat opcode after HALT with disabled interrupts (DI) - cpu->dihalt = 0; - cpu->pc = cpu->tmpw; - } - return cpu->t; -} - typedef struct { unsigned char mask; unsigned short inta; @@ -77,6 +60,30 @@ int lr_int(CPU* cpu) { return res; } +int lr_exec(CPU* cpu) { + int res = 0; + if ((cpu->intrq & cpu->inten) && cpu->iff1) { + res = lr_int(cpu); + } else if (cpu->lock) { + res = 1; + } else { + cpu->t = 0; + cpu->opTab = lrTab; + do { + cpu->tmp = cpu->mrd(cpu->pc++, 1, cpu->data); + cpu->op = &cpu->opTab[cpu->tmp]; + cpu->t += cpu->op->t; + cpu->op->exec(cpu); + } while (cpu->op->prefix); + if (cpu->dihalt) { // LR35902 bug (?) : repeat opcode after HALT with disabled interrupts (DI) + cpu->dihalt = 0; + cpu->pc = cpu->tmpw; + } + res = cpu->t; + } + return res; +} + // disasm xAsmScan lr_asm(const char* cbuf, char* buf) { diff --git a/src/libxpeccy/cpu/MOS6502/6502.c b/src/libxpeccy/cpu/MOS6502/6502.c index 51543d44..95fd124b 100644 --- a/src/libxpeccy/cpu/MOS6502/6502.c +++ b/src/libxpeccy/cpu/MOS6502/6502.c @@ -26,16 +26,23 @@ int m6502_int(CPU* cpu) { m6502_push_int(cpu); cpu->pc = 0xfffe; } - cpu->inth = cpu->intrq ? 1 : 0; // if both INT happened in one time +// cpu->inth = cpu->intrq ? 1 : 0; // if both INT happened in one time return 7; } int m6502_exec(CPU* cpu) { - unsigned char com = cpu->mrd(cpu->pc++, 1, cpu->data); - opCode* op = &mosTab[com]; - cpu->t = op->t; // 2T fetch - op->exec(cpu); - return cpu->t; + int res = 0; + unsigned char com; + if (cpu->intrq & cpu->inten) { + res = m6502_int(cpu); + } else { + com = cpu->mrd(cpu->pc++, 1, cpu->data); + opCode* op = &mosTab[com]; + cpu->t = op->t; // 2T fetch + op->exec(cpu); + res = cpu->t; + } + return res; } xMnem m6502_mnem(CPU* cpu, unsigned short adr, cbdmr mrd, void* data) { diff --git a/src/libxpeccy/cpu/MOS6502/6502_opcode.c b/src/libxpeccy/cpu/MOS6502/6502_opcode.c index d66ac0f2..368f1e6c 100644 --- a/src/libxpeccy/cpu/MOS6502/6502_opcode.c +++ b/src/libxpeccy/cpu/MOS6502/6502_opcode.c @@ -92,7 +92,7 @@ void mosGetINDY(CPU* cpu) { // brk : 7T void mosop00(CPU* cpu) { cpu->intrq |= 1; // request for user interrupt - cpu->inth = 1; +// cpu->inth = 1; } // 01:ora indx n : 6T diff --git a/src/libxpeccy/cpu/Z80/z80.c b/src/libxpeccy/cpu/Z80/z80.c index 04bc3e5b..dddd0940 100644 --- a/src/libxpeccy/cpu/Z80/z80.c +++ b/src/libxpeccy/cpu/Z80/z80.c @@ -26,24 +26,10 @@ void z80_reset(CPU* cpu) { cpu->i = cpu->r = cpu->r7 = 0; cpu->halt = 0; cpu->intrq = 0; + cpu->inten = 2; // NMI allways enabled, INT is controlled by ei/di cpu->wait = 0; } -int z80_exec(CPU* cpu) { - if (cpu->wait) return 1; - cpu->t = 0; - cpu->noint = 0; - cpu->opTab = npTab; - do { - cpu->com = cpu->mrd(cpu->pc++,1,cpu->data); - cpu->op = &cpu->opTab[cpu->com]; - cpu->r++; - cpu->t += cpu->op->t; - cpu->op->exec(cpu); - } while (cpu->op->prefix); - return cpu->t; -} - int z80_int(CPU* cpu) { int res = 0; if (cpu->wait) return 0; @@ -108,6 +94,28 @@ int z80_int(CPU* cpu) { return res; } +int z80_exec(CPU* cpu) { + int res = 0; + if (cpu->wait) { + res = 1; + } else if (cpu->intrq & cpu->inten) { + res = z80_int(cpu); + } else { + cpu->t = 0; + cpu->noint = 0; + cpu->opTab = npTab; + do { + cpu->com = cpu->mrd(cpu->pc++,1,cpu->data); + cpu->op = &cpu->opTab[cpu->com]; + cpu->r++; + cpu->t += cpu->op->t; + cpu->op->exec(cpu); + } while (cpu->op->prefix); + res = cpu->t; + } + return res; +} + // disasm unsigned char z80_cnd[4] = {FZ, FC, FP, FS}; diff --git a/src/libxpeccy/cpu/Z80/z80nop.c b/src/libxpeccy/cpu/Z80/z80nop.c index 31a421e8..c9372968 100644 --- a/src/libxpeccy/cpu/Z80/z80nop.c +++ b/src/libxpeccy/cpu/Z80/z80nop.c @@ -845,6 +845,7 @@ void nprF2(CPU* cpu) { void nprF3(CPU* cpu) { cpu->iff1 = 0; cpu->iff2 = 0; + cpu->inten &= ~1; } // f4 call p,nn 4 3rd 3rd[+1] [3wr 3wr] memptr = nn @@ -897,6 +898,7 @@ void nprFB(CPU* cpu) { cpu->iff1 = 1; cpu->iff2 = 1; cpu->noint = 1; + cpu->inten |= 1; } // fc call m,nn 4 3rd 3rd[+1] [3wr 3wr] mptr = nn diff --git a/src/libxpeccy/cpu/cpu.c b/src/libxpeccy/cpu/cpu.c index 7db0a6f0..89e3b6d1 100644 --- a/src/libxpeccy/cpu/cpu.c +++ b/src/libxpeccy/cpu/cpu.c @@ -28,9 +28,9 @@ extern opCode npTab[256]; extern opCode lrTab[256]; cpuCore cpuTab[] = { - {CPU_Z80, "Z80", npTab, z80_reset, z80_exec, z80_int, z80_asm, z80_mnem}, - {CPU_LR35902, "LR35902", lrTab, lr_reset, lr_exec, lr_int, lr_asm, lr_mnem}, - {CPU_NONE, "none", NULL, nil_reset, nil_exec, nil_int, nil_asm, nil_mnem} + {CPU_Z80, "Z80", npTab, z80_reset, z80_exec, /*z80_int,*/ z80_asm, z80_mnem}, + {CPU_LR35902, "LR35902", lrTab, lr_reset, lr_exec, /*lr_int,*/ lr_asm, lr_mnem}, + {CPU_NONE, "none", NULL, nil_reset, nil_exec, /*nil_int,*/ nil_asm, nil_mnem} }; cpuCore* findCore(int type) { @@ -59,7 +59,7 @@ void cpuSetType(CPU* cpu, int type) { cpu->type = core->type; cpu->reset = core->reset; cpu->exec = core->exec; - cpu->intr = core->intr; +// cpu->intr = core->intr; cpu->asmbl = core->asmbl; cpu->mnem = core->mnem; cpu->tab = core->tab; diff --git a/src/libxpeccy/cpu/cpu.h b/src/libxpeccy/cpu/cpu.h index b8d1c30b..3024e49b 100644 --- a/src/libxpeccy/cpu/cpu.h +++ b/src/libxpeccy/cpu/cpu.h @@ -10,11 +10,17 @@ typedef struct { const char* mnem; } xMnem; +// memrq rd typedef unsigned char(*cbmr)(unsigned short,int,void*); +// memrq wr typedef void(*cbmw)(unsigned short,unsigned char,void*); +// iorq rd typedef unsigned char(*cbir)(unsigned short,void*); +// iorq wr typedef void(*cbiw)(unsigned short,unsigned char,void*); +// iorq int : interrupt vector request typedef unsigned char(*cbirq)(void*); +// memrd external typedef unsigned char(*cbdmr)(unsigned short,void*); #ifdef WORDS_BIG_ENDIAN @@ -55,7 +61,7 @@ enum { struct CPU { unsigned halt:1; // cpu halted, undo on interrput - unsigned inth:1; // next step is 1:handle interrupt, 0: exec opcode +// unsigned inth:1; // next step is 1:handle interrupt, 0: exec opcode unsigned resPV:1; // Z80: reset PV flag on INT unsigned noint:1; // Z80: don't handle INT after EI unsigned wait:1; // Z80: WAIT signal @@ -106,7 +112,7 @@ struct CPU { void (*reset)(CPU*); int (*exec)(CPU*); - int (*intr)(CPU*); // handle interrupt. intrq = requested INT types +// int (*intr)(CPU*); // handle interrupt. intrq = requested INT types xAsmScan (*asmbl)(const char*, char*); xMnem (*mnem)(CPU*, unsigned short, cbdmr, void*); @@ -123,7 +129,7 @@ typedef struct { opCode* tab; // start opcode tab; void (*reset)(CPU*); // reset int (*exec)(CPU*); // exec opcode, return T - int (*intr)(CPU*); // handle interrupt, return T +// int (*intr)(CPU*); // handle interrupt, return T xAsmScan (*asmbl)(const char*, char*); // compile mnemonic xMnem (*mnem)(CPU*, unsigned short, cbdmr, void*); } cpuCore; diff --git a/src/libxpeccy/hardware/common.c b/src/libxpeccy/hardware/common.c index 6fe649a1..30a3ab29 100644 --- a/src/libxpeccy/hardware/common.c +++ b/src/libxpeccy/hardware/common.c @@ -30,17 +30,17 @@ void zx_sync(Computer* comp, long ns) { if (!comp->cpu->iff1 || comp->cpu->noint) return; if (comp->vid->intFRAME && (comp->vid->intMask & 1)) { comp->intVector = 0xff; - comp->cpu->inth = 1; +// comp->cpu->inth = 1; comp->cpu->intrq |= 1; comp->vid->intFRAME = 0; } else if (comp->vid->intLINE) { comp->intVector = 0xfd; - comp->cpu->inth = 1; +// comp->cpu->inth = 1; comp->cpu->intrq |= 1; comp->vid->intLINE = 0; } else if (comp->vid->intDMA) { comp->intVector = 0xfb; - comp->cpu->inth = 1; +// comp->cpu->inth = 1; comp->cpu->intrq |= 1; comp->vid->intDMA = 0; } diff --git a/src/libxpeccy/hardware/gameboy.c b/src/libxpeccy/hardware/gameboy.c index 2242e1c8..a6a58245 100644 --- a/src/libxpeccy/hardware/gameboy.c +++ b/src/libxpeccy/hardware/gameboy.c @@ -732,8 +732,8 @@ void gbc_sync(Computer* comp, long ns) { req |= 16; } comp->cpu->intrq |= req; // cpu int req - if (comp->cpu->iff1 && (comp->cpu->intrq & 0x1f)) //comp->cpu->inten)) - comp->cpu->inth = 1; +// if (comp->cpu->iff1 && (comp->cpu->intrq & 0x1f)) //comp->cpu->inten)) +// comp->cpu->inth = 1; } // keypress diff --git a/src/libxpeccy/hardware/hardware.c b/src/libxpeccy/hardware/hardware.c index 08b77004..8f62db72 100644 --- a/src/libxpeccy/hardware/hardware.c +++ b/src/libxpeccy/hardware/hardware.c @@ -4,55 +4,55 @@ HardWare hwTab[] = { { - "ZX48K","ZX 48K",HW_ZX48,50,MEM_48, + HW_ZX48,"ZX48K","ZX 48K",50,MEM_48, &speMapMem,&speOut,&speIn,&stdMRd,&stdMWr,&speReset,&zx_sync },{ - "Pentagon","Pentagon",HW_PENT,50,MEM_128 | MEM_512, + HW_PENT,"Pentagon","Pentagon",50,MEM_128 | MEM_512, &penMapMem,&penOut,&penIn,&stdMRd,&stdMWr,NULL,&zx_sync },{ - "Pentagon1024SL","Pentagon 1024 SL",HW_P1024,50,MEM_1M, + HW_P1024,"Pentagon1024SL","Pentagon 1024 SL",50,MEM_1M, &p1mMapMem,&p1mOut,&p1mIn,&stdMRd,&stdMWr,NULL,&zx_sync },{ - "Scorpion","ZS Scorpion",HW_SCORP,50,MEM_256 | MEM_1M, + HW_SCORP,"Scorpion","ZS Scorpion",50,MEM_256 | MEM_1M, &scoMapMem,&scoOut,&scoIn,&scoMRd,&stdMWr,NULL,&zx_sync },{ - "ATM2","ATM Turbo 2+",HW_ATM2,50,MEM_128 | MEM_256 | MEM_512 | MEM_1M, + HW_ATM2,"ATM2","ATM Turbo 2+",50,MEM_128 | MEM_256 | MEM_512 | MEM_1M, &atm2MapMem,&atm2Out,&atm2In,&stdMRd,&stdMWr,&atm2Reset,&zx_sync },{ - "Profi","Profi",HW_PROFI,50,MEM_512 | MEM_1M, + HW_PROFI,"Profi","Profi",50,MEM_512 | MEM_1M, &prfMapMem,&prfOut,&prfIn,&stdMRd,&stdMWr,&prfReset,&zx_sync },{ - "Phoenix","ZXM Phoenix",HW_PHOENIX,50,MEM_2M, + HW_PHOENIX,"Phoenix","ZXM Phoenix",50,MEM_2M, &phxMapMem,&phxOut,&phxIn,&stdMRd,&stdMWr,&phxReset,&zx_sync },{ - "PentEvo","Evo Baseconf",HW_PENTEVO,50,MEM_4M, + HW_PENTEVO,"PentEvo","Evo Baseconf",50,MEM_4M, &evoMapMem,&evoOut,&evoIn,&evoMRd,&evoMWr,&evoReset,&zx_sync },{ - "TSLab","Evo TSConf",HW_TSLAB,50,MEM_4M, + HW_TSLAB,"TSLab","Evo TSConf",50,MEM_4M, &tslMapMem,&tslOut,&tslIn,&tslMRd,&tslMWr,&tslReset,&zx_sync },{ - "","",HW_NULL,50,0,NULL,NULL,NULL,NULL,NULL,NULL // separator + HW_NULL,"","",50,0,NULL,NULL,NULL,NULL,NULL,NULL // separator },{ - "Spectrum +2","Spectrum +2",HW_PLUS2,50,MEM_128, + HW_PLUS2,"Spectrum +2","Spectrum +2",50,MEM_128, &pl2MapMem,&pl2Out,&pl2In,&stdMRd,&stdMWr,NULL,&zx_sync },{ - "Spectrum +3","Spectrum +3",HW_PLUS3,50,MEM_128, + HW_PLUS3,"Spectrum +3","Spectrum +3",50,MEM_128, &pl2MapMem,&pl3Out,&pl3In,&stdMRd,&stdMWr,NULL,&zx_sync },{ - "","",HW_NULL,50,0,NULL,NULL,NULL,NULL,NULL,NULL // separator + HW_NULL,"","",50,0,NULL,NULL,NULL,NULL,NULL,NULL // separator },{ - "MSX","MSX-1",HW_MSX,60,MEM_128, + HW_MSX,"MSX","MSX-1",60,MEM_128, &msxMapMem,&msxOut,&msxIn,&stdMRd,&stdMWr,&msxReset,&msx_sync },{ - "MSX2","MSX-2 (alfa)",HW_MSX2,60,MEM_128, + HW_MSX2,"MSX2","MSX-2 (alfa)",60,MEM_128, &msx2mapper,&msx2Out,&msx2In,&msx2mrd,&msx2mwr,&msx2Reset,&msx_sync },{ - "","",HW_NULL,50,0,NULL,NULL,NULL,NULL,NULL,NULL // separator + HW_NULL,"","",50,0,NULL,NULL,NULL,NULL,NULL,NULL // separator },{ - "GameBoy", "Game Boy", HW_GBC, 60, MEM_48, - &gbMaper, NULL, NULL, &gbMemRd, &gbMemWr, &gbReset, &gbc_sync + HW_GBC,"GameBoy","Game Boy",60,MEM_48, + &gbMaper,NULL,NULL,&gbMemRd,&gbMemWr,&gbReset,&gbc_sync },{ - NULL,NULL,HW_NULL,50,0,NULL,NULL,NULL,NULL,NULL,NULL // eot + HW_NULL,NULL,NULL,50,0,NULL,NULL,NULL,NULL,NULL,NULL // eot } }; @@ -60,7 +60,7 @@ HardWare* findHardware(const char* name) { HardWare* hw = NULL; int idx = 0; while (hwTab[idx].name != NULL) { - if ((hwTab[idx].type != HW_NULL) && !strcmp(hwTab[idx].name,name)) { + if ((hwTab[idx].id != HW_NULL) && !strcmp(hwTab[idx].name,name)) { hw = &hwTab[idx]; break; } diff --git a/src/libxpeccy/hardware/hardware.h b/src/libxpeccy/hardware/hardware.h index 4054727e..ef00751c 100644 --- a/src/libxpeccy/hardware/hardware.h +++ b/src/libxpeccy/hardware/hardware.h @@ -37,12 +37,37 @@ enum { #define MEM_2M (1<<4) #define MEM_4M (1<<5) +// Hardware callbacks + +// reset +typedef void(*cbHwRes)(Computer*); +// map memory +typedef void(*cbHwMap)(Computer*); +// sync: calls after every CPU command +typedef void(*cbHwSnc)(Computer*, long); +// memory read +typedef unsigned char(*cbHwMrd)(Computer*, unsigned short, int); +// memory write +typedef void(*cbHwMwr)(Computer*, unsigned short, unsigned char); +// io read; TODO:remove last argument (bdi activity) +typedef unsigned char(*cbHwIrd)(Computer*, unsigned short, int); +// io write +typedef void(*cbHwIwr)(Computer*, unsigned short, unsigned char, int); + struct HardWare { + int id; // id const char* name; // name used for conf file const char* optName; // name used for setup window - int type; // id int fps; int mask; // mem size bits (b0:128, b1:256, b2:512, b3:1M, b4:2M, b5:4M); =0 for 48K + cbHwMap mapMem; + cbHwIwr out; + cbHwIrd in; + cbHwMrd mrd; + cbHwMwr mwr; + cbHwRes reset; + cbHwSnc sync; +/* void (*mapMem)(Computer*); void (*out)(Computer*,unsigned short,unsigned char,int); unsigned char (*in)(Computer*,unsigned short,int); @@ -50,6 +75,7 @@ struct HardWare { void (*mwr)(Computer*,unsigned short,unsigned char); void (*reset)(Computer*); void (*sync)(Computer*, long); // callback after each command. control request/handle interrupt bit +*/ }; typedef struct { diff --git a/src/libxpeccy/hardware/msx.c b/src/libxpeccy/hardware/msx.c index 3424b244..56f56914 100644 --- a/src/libxpeccy/hardware/msx.c +++ b/src/libxpeccy/hardware/msx.c @@ -249,7 +249,8 @@ void msxOut(Computer* comp, unsigned short port, unsigned char val, int dos) { // int zxINT(Computer*, unsigned char); void msx_sync(Computer* comp, long ns) { if ((comp->vid->v9938.reg[1] & 0x40) && comp->vid->newFrame && comp->cpu->iff1) { - comp->cpu->inth = 1; +// comp->cpu->inth = 1; + comp->cpu->intrq |= 1; comp->intVector = 0xff; } } diff --git a/src/libxpeccy/hardware/zx48.c b/src/libxpeccy/hardware/zx48.c index eb2bacb9..0bd79545 100644 --- a/src/libxpeccy/hardware/zx48.c +++ b/src/libxpeccy/hardware/zx48.c @@ -1,7 +1,7 @@ #include "../spectrum.h" void speReset(Computer* comp) { - comp->p7FFD = 0x10; + } void speMapMem(Computer* comp) { diff --git a/src/libxpeccy/sound/gs.c b/src/libxpeccy/sound/gs.c index 42d5a791..4fa3ca83 100644 --- a/src/libxpeccy/sound/gs.c +++ b/src/libxpeccy/sound/gs.c @@ -130,18 +130,12 @@ void gsSync(GSound* gs) { int res; gs->counter += gs->sync * GS_FRQ / 980; // ticks to emulate while (gs->counter > 0) { - if (gs->cpu->inth) { - gs->cpu->inth = 0; - gs->cpu->intrq = 1; - res = gs->cpu->intr(gs->cpu); - } else { - res = gs->cpu->exec(gs->cpu); - } + res = gs->cpu->exec(gs->cpu); gs->counter -= res; gs->cnt += res; if (gs->cnt > 320) { // 12MHz CLK, 37.5KHz INT -> int in each 320 ticks gs->cnt -= 320; - gs->cpu->inth = 1; + gs->cpu->intrq |= 1; } } gs->sync = 0; diff --git a/src/libxpeccy/spectrum.c b/src/libxpeccy/spectrum.c index 6c2a8eef..95789b23 100644 --- a/src/libxpeccy/spectrum.c +++ b/src/libxpeccy/spectrum.c @@ -246,7 +246,6 @@ void compReset(Computer* comp,int res) { if (comp->rzx.play) rzxStop(comp); zxInitPalete(comp); comp->vid->ula->active = 0; - comp->rzx.play = 0; comp->prt2 = 0; comp->p1FFD = 0; comp->pEFF7 = 0; @@ -285,7 +284,7 @@ void compUpdateTimings(Computer* comp) { long perNoTurbo = 1e3 / comp->cpuFrq; if (perNoTurbo & 1) perNoTurbo++; comp->nsPerTick = perNoTurbo / comp->frqMul; - int type = comp->hw ? comp->hw->type : HW_NULL; + int type = comp->hw ? comp->hw->id : HW_NULL; switch (type) { case HW_MSX: case HW_MSX2: @@ -324,25 +323,23 @@ void compSetHardware(Computer* comp, const char* name) { HardWare* hw = findHardware(name); if (hw == NULL) return; comp->hw = hw; - comp->vid->istsconf = (hw->type == HW_TSLAB) ? 1 : 0; - comp->vid->ismsx = ((hw->type == HW_MSX) || (hw->type == HW_MSX2)) ? 1 : 0; - comp->vid->isgb = (hw->type == HW_GBC) ? 1 : 0; + comp->vid->istsconf = (hw->id == HW_TSLAB) ? 1 : 0; + comp->vid->ismsx = ((hw->id == HW_MSX) || (hw->id == HW_MSX2)) ? 1 : 0; + comp->vid->isgb = (hw->id == HW_GBC) ? 1 : 0; compUpdateTimings(comp); } // interrupts // exec 1 opcode, sync devices, return eated ns +// IDEA : let video system to accumulate TIME value, not like (cpu->t * comp->nsPerTick); + void vidTSRender(Video*, unsigned char*); int compExec(Computer* comp) { res4 = 0; res2 = 0; - if (comp->cpu->inth) { // 1:handle interrupt - comp->cpu->inth = 0; - res2 = comp->cpu->intr(comp->cpu); - } - if (res2 == 0) - res2 = comp->cpu->exec(comp->cpu); +// exec cpu opcode OR handle interrupt. get T states back + res2 = comp->cpu->exec(comp->cpu); // scorpion WAIT: add 1T to odd-T command if (comp->evenM1 && (res2 & 1)) res2++; @@ -368,10 +365,9 @@ int compExec(Computer* comp) { // ... res1 = res2; pcreg = comp->cpu->pc; -// NMI TODO: remake as another INT +// NMI if ((pcreg > 0x3fff) && comp->nmiRequest && !comp->rzx.play) { comp->cpu->intrq |= 2; // request nmi - comp->cpu->inth = 1; comp->dos = 1; // set dos page comp->rom = 1; comp->hw->mapMem(comp); @@ -383,7 +379,7 @@ int compExec(Computer* comp) { if (comp->rzx.play) { if (comp->rzx.frm.fetches < 1) { comp->intVector = 0xff; - comp->cpu->inth = 1; + comp->cpu->intrq |= 1; comp->rzx.fCurrent++; comp->rzx.fCount--; rzxGetFrame(comp); @@ -399,7 +395,6 @@ int compExec(Computer* comp) { // TSConf : update 'next-line' registers TODO:move to TSConf hw->sync if (comp->vid->nextrow && comp->vid->istsconf) { tslUpdatePorts(comp); - // vidTSRender(comp->vid, comp->vid->linptr); comp->vid->nextrow = 0; } // breakpoints @@ -419,7 +414,7 @@ int compExec(Computer* comp) { difSync(comp->dif, nsTime); // tsSync(comp->ts, nsTime); - if (comp->hw->type == HW_GBC) { + if (comp->hw->id == HW_GBC) { // sound gbsSync(comp->gbsnd, nsTime); // timer diff --git a/src/setupwin.cpp b/src/setupwin.cpp index 79ddda08..1ad58ba0 100644 --- a/src/setupwin.cpp +++ b/src/setupwin.cpp @@ -59,7 +59,7 @@ SetupWin::SetupWin(QWidget* par):QDialog(par) { // machine i = 0; while (hwTab[i].name != NULL) { - if (hwTab[i].type != HW_NULL) { + if (hwTab[i].id != HW_NULL) { ui.machbox->addItem(trUtf8(hwTab[i].optName),QString::fromLocal8Bit(hwTab[i].name)); } else { ui.machbox->insertSeparator(i); diff --git a/src/version.h b/src/version.h index e46ec559..17f11bd5 100644 --- a/src/version.h +++ b/src/version.h @@ -1 +1 @@ -#define VERSION 0.6.20170419 +#define VERSION 0.6.20170426 diff --git a/src/vkeyboard.cpp b/src/vkeyboard.cpp new file mode 100644 index 00000000..eeba4d70 --- /dev/null +++ b/src/vkeyboard.cpp @@ -0,0 +1,103 @@ +// virtual keyboard + +#include "vkeyboard.h" +#include "xcore/xcore.h" + +#include + +unsigned char kwMap[4][10] = { + {'1','2','3','4','5','6','7','8','9','0'}, + {'q','w','e','r','t','y','u','i','o','p'}, + {'a','s','d','f','g','h','j','k','l','E'}, + {'C','z','x','c','v','b','n','m','S',' '} +}; + +keyWindow::keyWindow(QWidget* p):QLabel(p) { + kb = NULL; + xk.key1 = 0; + xk.key2 = 0; + // setWindowModality(Qt::WindowModal); +} + +void keyWindow::paintEvent(QPaintEvent*) { + QPainter pnt; + int wid = width() / 10 + 1; + int hig = (height() - 10) / 4; + unsigned char val; + int row, pos; + pnt.begin(this); + pnt.fillRect(QRectF(0,0,1,1), qRgba(0,0,0,0)); +// pnt.setPen(qRgb(0, 200, 255)); +// pnt.setBrush(QBrush(qRgb(0, 180, 235))); + for(int i = 0; i < 8; i++) { + pos = (i & 4) ? 0 : 9; + row = (i & 4) ? (i & 3) : (~i & 3); + val = ~kb->map[i] & 0x1f; + while(val) { + if (val & 1) { + pnt.fillRect(pos * wid, 10 + row * hig, wid, hig, qRgb(0, 200, 255)); + //pnt.drawRoundRect(pos * wid, row * hig, wid, hig); + } + val >>= 1; + pos += (i & 4) ? 1 : -1; + } + } + pnt.drawPixmap(0, 0, QPixmap(":/images/keymap.png")); + pnt.end(); +} + +void keyWindow::mousePressEvent(QMouseEvent* ev) { + if (!kb) return; + int row; + int col; + row = ev->y() * 4 / height(); + col = ev->x() * 10 / width(); + xk.key1 = kwMap[row][col]; + switch(ev->button()) { + case Qt::LeftButton: + keyPress(kb, xk, 0); + update(); + break; + case Qt::RightButton: + keyTrigger(kb, xk, 0); + update(); + break; + case Qt::MiddleButton: + keyReleaseAll(kb); + xk.key1 = 0; + update(); + break; + default: + break; + } +} + +void keyWindow::mouseReleaseEvent(QMouseEvent* ev) { + if (!kb) return; + if (ev->button() == Qt::LeftButton) { + keyRelease(kb, xk, 0); + } + update(); +} + +void keyWindow::keyPressEvent(QKeyEvent* ev) { + int keyid = qKey2id(ev->key()); + keyEntry kent = getKeyEntry(keyid); + if (ev->modifiers() & Qt::AltModifier) { + if (ev->key() == Qt::Key_K) + close(); + } else { + keyPress(kb, kent.zxKey, 0); + if (kent.msxKey.key1) + keyPress(kb,kent.msxKey,2); + update(); + } +} + +void keyWindow::keyReleaseEvent(QKeyEvent* ev) { + int keyid = qKey2id(ev->key()); + keyEntry kent = getKeyEntry(keyid); + keyRelease(kb, kent.zxKey, 0); + if (kent.msxKey.key1) keyRelease(kb,kent.msxKey,2); + update(); +} diff --git a/src/vkeyboard.h b/src/vkeyboard.h new file mode 100644 index 00000000..8dbb298e --- /dev/null +++ b/src/vkeyboard.h @@ -0,0 +1,27 @@ +#ifndef _VKEYBOARD_H +#define _VKEYBOARD_H + +#include +#include +#include +#include +#include + +#include "libxpeccy/input.h" + +class keyWindow : public QLabel { + Q_OBJECT + public: + keyWindow(QWidget* = NULL); + Keyboard* kb; + private: + xKey xk; + protected: + void paintEvent(QPaintEvent*); + void mousePressEvent(QMouseEvent*); + void mouseReleaseEvent(QMouseEvent*); + void keyPressEvent(QKeyEvent*); + void keyReleaseEvent(QKeyEvent*); +}; + +#endif diff --git a/src/xcore/keymap.cpp b/src/xcore/keymap.cpp index cd7483c0..df9f80b6 100644 --- a/src/xcore/keymap.cpp +++ b/src/xcore/keymap.cpp @@ -2,8 +2,6 @@ #include "xcore.h" -// #if __linux - #define XKEY_1 10 #define XKEY_2 11 #define XKEY_3 12 @@ -90,94 +88,6 @@ #define XKEY_RBRACK 257 // } #define XKEY_QUEST 258 -/* -#elif _WIN32 - -#define XKEY_1 2 -#define XKEY_2 3 -#define XKEY_3 4 -#define XKEY_4 5 -#define XKEY_5 6 -#define XKEY_6 7 -#define XKEY_7 8 -#define XKEY_8 9 -#define XKEY_9 10 -#define XKEY_0 11 -#define XKEY_MINUS 12 -#define XKEY_PLUS 13 -#define XKEY_BSP 14 -#define XKEY_TAB 15 -#define XKEY_Q 16 -#define XKEY_W 17 -#define XKEY_E 18 -#define XKEY_R 19 -#define XKEY_T 20 -#define XKEY_Y 21 -#define XKEY_U 22 -#define XKEY_I 23 -#define XKEY_O 24 -#define XKEY_P 25 -#define XKEY_LBRACE 26 -#define XKEY_RBRACE 27 -#define XKEY_ENTER 28 -#define XKEY_LCTRL 29 -#define XKEY_A 30 -#define XKEY_S 31 -#define XKEY_D 32 -#define XKEY_F 33 -#define XKEY_G 34 -#define XKEY_H 35 -#define XKEY_J 36 -#define XKEY_K 37 -#define XKEY_L 38 -#define XKEY_DOTCOM 39 // ; -#define XKEY_QUOTE 40 // " -#define XKEY_TILDA 41 // ~ -#define XKEY_LSHIFT 42 -#define XKEY_SLASH 43 -#define XKEY_Z 44 -#define XKEY_X 45 -#define XKEY_C 46 -#define XKEY_V 47 -#define XKEY_B 48 -#define XKEY_N 49 -#define XKEY_M 50 -#define XKEY_PERIOD 51 -#define XKEY_COMMA 52 -#define XKEY_BSLASH 53 // / -#define XKEY_RSHIFT 54 -#define XKEY_SPACE 57 -#define XKEY_CAPS 58 -#define XKEY_RCTRL XKEY_LCTRL -#define XKEY_RALT 312 -#define XKEY_LALT 56 -#define XKEY_HOME 327 -#define XKEY_UP 328 -#define XKEY_PGUP 329 -#define XKEY_LEFT 331 -#define XKEY_RIGHT 333 -#define XKEY_END 335 -#define XKEY_DOWN 336 -#define XKEY_PGDN 337 -#define XKEY_INS 338 -#define XKEY_DEL 339 -#define XKEY_MENU 349 -#define XKEY_ESC 1 -#define XKEY_F1 59 -#define XKEY_F2 60 -#define XKEY_F3 61 -#define XKEY_F4 62 -#define XKEY_F5 63 -#define XKEY_F6 64 -#define XKEY_F7 65 -#define XKEY_F8 66 -#define XKEY_F9 67 -#define XKEY_F10 68 -#define XKEY_F11 87 - -#endif -*/ - #define ENDKEY 0 // KEYMAPS @@ -240,7 +150,7 @@ keyEntry keyMapInit[] = { {"[",XKEY_LBRACK,{'S','8'},{'S','y'},{'[',0},0x54}, {"]",XKEY_RBRACK,{'S','9'},{'S','u'},{']',0},0x5b}, {"`",XKEY_TILDA,{'C','S'},{'S','x'},{'`',0},0x0e}, - {"\\",XKEY_SLASH,{'S','c'},{'S','d'},{'\\',0},0x5d}, + {"\\",XKEY_SLASH,{'S','C'},{0,0},{'\\',0},0x5d}, {"PGDN",XKEY_PGUP,{'C','3'},{'m'|0x80,0},{MSXK_CODE,0},0x7de0}, {"PGUP",XKEY_PGDN,{'C','4'},{'n'|0x80,0},{MSXK_SEL,0},0x7ae0}, @@ -354,7 +264,7 @@ keyTrans ktTab[] = { {Qt::Key_BracketRight, 1066, XKEY_RBRACK}, // ] // {Qt::Key_BraceLeft, 1061, XKEY_LBRACE}, // { == Shift + [ // {Qt::Key_BraceRight, 1066, XKEY_LBRACE}, // } == Shift + ] - {Qt::Key_Slash, Qt::Key_Slash, XKEY_BSLASH}, // ? + {Qt::Key_Backslash, Qt::Key_Backslash, XKEY_SLASH}, // | {Qt::Key_CapsLock, Qt::Key_CapsLock, XKEY_CAPS}, {Qt::Key_A, 1060, XKEY_A}, @@ -380,6 +290,7 @@ keyTrans ktTab[] = { {Qt::Key_M, 1068, XKEY_M}, {Qt::Key_Period, 1041, XKEY_PERIOD}, {Qt::Key_Comma, Qt::Key_Comma, XKEY_COMMA}, + {Qt::Key_Slash, Qt::Key_Slash, XKEY_BSLASH}, // ? {Qt::Key_Control, Qt::Key_Control, XKEY_LCTRL}, {Qt::Key_Alt, Qt::Key_Alt, XKEY_LALT}, diff --git a/src/xcore/sound.cpp b/src/xcore/sound.cpp index 21708c3f..a6e1c4db 100644 --- a/src/xcore/sound.cpp +++ b/src/xcore/sound.cpp @@ -4,12 +4,12 @@ #include "xcore.h" #include -#include +#include #include #undef main -extern std::mutex emutex; // unlock to start emulation cycle +extern QMutex emutex; // unlock to start emulation cycle typedef struct { unsigned char data[0x1000]; diff --git a/ui/debuger.ui b/ui/debuger.ui index 44794728..dcae5177 100644 --- a/ui/debuger.ui +++ b/ui/debuger.ui @@ -2220,7 +2220,7 @@ - :/images/eye.png:/images/eye.png + :/images/pixels.png:/images/pixels.png Sprite scanner diff --git a/xpeccy.qrc b/xpeccy.qrc index fce89088..473541b8 100755 --- a/xpeccy.qrc +++ b/xpeccy.qrc @@ -48,7 +48,6 @@ images/msx.png images/stop.png images/floppyRed.png - images/eye.png images/gameboy.png font.bin images/label.png @@ -61,5 +60,9 @@ images/search.png DejaVuSansMono.ttf images/note.png + images/keyboardzx.png + images/objective.png + images/pixels.png + images/cartrige.png