Попробовал компилировать под Windows в Qt Creator 4.6.0.
Конфигурация Desktop Qt 5.6.3 MinGW 32bit.
Собралось без ошибок и варнингов (и это отлично).
При запуске пустое окно со списком платформ -- тут было бы здорово писать сообщение о том что нужно положить/настроить emu80.conf, также стоит это написать в README.md в исходниках.
Затем, после того как я положил emu80.conf и запустил конфигурацию rk86 -- видимо программа не нашла папки rk86, программа работает в фоне, ошибок не показывает -- тут надо показать окно-алерт и завершиться или вернуться в окно выбора платформы.
При выборе команды Debug -- segmentation fault в DebugWindow::draw() строка 257.
Эта проблема решилась тем что подложил файл dbgfont.bin. Но тут нужно проверять что шрифт не загрузился.
Ну и отладчик лучше было переделать в графический конечно, выделить в отдельные окна просмотр памяти и всё остальное.
- - - Updated - - -
Несколько подозрительных мест в коде:
1. Debugger.cpp:130
Код:
memset(&m_states, sizeof(m_states), 1);
Похоже на то что перепутаны местами значение и количество байт.
2. Debugger.cpp:1035
Код:
if (useInitialNumber) {
m_inputCurPos = nDigits - 1;
m_inputCurValue = int2Hex(initialNumber, nDigits);
} else {
m_inputCurPos = 0;
m_inputCurValue = "";
}
m_inputCurPos = 0;
Странно что m_inputCurPos сначала вычисляется в зависимости от условия, а потом обнуляется.
3. ConfigReader.cpp
В функции ConfigReader::createObject() два раза одна проверка:
Код:
else if (typeName == "Ut88MemPageSelector")
obj = new Ut88MemPageSelector();
4. CpuZ80.cpp:377
Код:
cbits = (IXY ^ IXY ^ sum) >> 8;
IXY ^ IXY -- странно что одно и то же значение, по идее это даёт 0.
5. CpuZ80.cpp:841
Код:
case 0x08: /* EX AF,AF' */
af[af_sel] = AF;
af_sel = 1 - af_sel;
AF = af[af_sel];
break;
Что-то тут не так, AF это af[af_sel], то есть первая и третья строчки делают присваивание в себя.
И вот тут ниже подобный код, думаю та же проблема:
Код:
case 0xD9: /* EXX */
regs[regs_sel].bc = BC;
regs[regs_sel].de = DE;
regs[regs_sel].hl = HL;
regs_sel = 1 - regs_sel;
BC = regs[regs_sel].bc;
DE = regs[regs_sel].de;
HL = regs[regs_sel].hl;
break;
6. Eureka.cpp:70
Код:
m_useRomDisk = value && 0x80;
Логический AND между bool и константой -- непонятно что это значит.