Скрипты в UKNCBTL.Qt
Начиная с UKNCBTL.Qt версии beta-32 в оболочку эмулятора добавлена поддержка скриптинга. Командой File > Run Script выбирается .JS-файл и запускается на выполнение. Язык файла -- ECMAScript, по сути это JavaScript.
Справочник по ECMAScript: http://qt-project.org/doc/qt-4.8/ecmascript.html
В тексте программы может использоваться объект emulator, методы которого используются для управления эмулятором UKNCBTL.
Методы объекта emulator
emulator.reset(); // since beta 32 Сброс эмулируемой машины. emulator.run(100); // since beta 32 Работа эмулятора в течение 100 фреймов, каждый фрейм это 1/25 секунды. emulator.saveScreenshot("test.png"); // since beta 32 Сохранение скриншота в формате PNG. emulator.attachCartridge(1, 'romctr_basic.bin'); // since beta 33 Подключение картриджа. emulator.detachCartridge(1); // since beta 33 Отключение картриджа. emulator.attachFloppy(0, 'sys1002.dsk'); // since beta 33 Подключение образа диска. emulator.detachFloppy(0); // since beta 33 Отключение диска. emulator.attachHard(1, 'WDC170inv.img'); // since beta 33 Подключение образа жёсткого диска, работает только если уже подключена прошивка через emulator.attachCartridge emulator.detachHard(1); // since beta 33 Отключение жёсткого диска. emulator.getUptime() либо свойство emulator.uptime // since beta 33 Возвращает тип number -- количество секунд работы эмулируемой машины, по emulator.reset() сбрасывается в 0. emulator.keyScan(0153); // since beta 33 Нажимает клавишу (задаётся скан-код), прогон 3 фрейма, отпускает, прогон 3 фрейма. emulator.keyScan(0153, 6); // since beta 33 То же, но задаётся интервал (фреймов) от нажатия до отжатия. emulator.keyScanShift(0013); // since beta 33 Нажатие SHIFT, 2 фрейма, нажатие клавиши, 3 фрейма, отжатие клавиши, 2 фрейма, отжатие SHIFT, 3 фрейма -- т.е. комбинация для ввода символа в другом регистре. emulator.keyString('1\n'); // since beta 33 Ввод серии символов; для каждого ASCII-символа ищется скан-код, если нужно используется нажатие SHIFT. emulator.getCPU() либо emulator.cpu // since beta 33 Получение объекта для ЦП. emulator.getPPU() либо emulator.ppu // since beta 33 Получение объекта для ПП. emulator.consolePrint('message') // since beta ?? Вывод сообщения в окно отладочной консоли; это окно видно если показаны отладочные окна. Методы объектов emulator.cpu и emulator.ppu
(В примерах используется emulator.ppu, для emulator.cpu работает точно также.)
emulator.ppu.getName() либо emulator.ppu.name // since beta 33 Название процессора, "CPU" либо "PPU". emulator.ppu.getReg(0) либо emulator.ppu.r(0) // since beta 33 Значение в регистре 0..7. emulator.ppu.getPC() либо emulator.ppu.pc // since beta 33 Значение в регистре 7. emulator.ppu.getSP() либо emulator.ppu.sp // since beta 33 Значение в регистре 6. emulator.ppu.getPSW() либо emulator.ppu.psw // since beta 33 Значение в PSW. emulator.ppu.setReg(0, 0123456) // since beta ?? Изменить значение в регистре 0..7. emulator.ppu.setPC(0123456) либо emulator.ppu.pc = 0123456 // since beta ?? Изменить значение в регистре 7. emulator.ppu.setSP(0123456) либо emulator.ppu.sp = 0123456 // since beta ?? Изменить значение в регистре 6. emulator.ppu.setPSW(0123456) либо emulator.ppu.psw = 0123456 // since beta ?? Изменить значение в регистре PSW. emulator.ppu.isHalt() либо emulator.ppu.halt // since beta 33 Признак HALT/USER режима. emulator.ppu.readWord(0160304) // since beta 33 Прочитать слово из памяти процессора. emulator.ppu.readByte(0160304) // since beta ?? Прочитать байт из памяти процессора. emulator.ppu.disassemble(0160304) // since beta 33 Дизассемблирует одну инструкцию по заданному адресу, возвращает массив из четырёх элементов: { address, instruction, arguments, instruction length }. Пример скрипта
Сбрасываем машинку, записываем процесс загрузки в виде скриншотов через каждые 10 фреймов:
emulator.reset();
for (i = 0; i < 10; i++)
{
emulator.run(10);
emulator.saveScreenshot('test' + i + '.png');
}Советы и находки
Для перевода числа в строку в восьмеричной системе используем toString(8).
Ссылки
Подобный скриптинг в других эмуляторах: