Skip to content
Nikita Zimin edited this page Aug 16, 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).

Ссылки

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