Skip to content
Nikita Zimin edited this page Apr 9, 2015 · 1 revision

Скрипты в 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).

Ссылки

Подобный скриптинг в других эмуляторах: