- Вчера вечером в поисках новых материалов по ЛИКу нашел крутые наработки по эмулятору на java.
- Спасибо Lavr за публикацию исходников.
- Базируясь на них перевел проект с Ant+Applet на Jetty+Maven+JNLP+Applet.
- Запустил на нем ROM Лика и игру Клад (не без глюков).
- Описал по запуску мануал.
- Опубликовал проект на GitHub.
- И поделился наполеоновскими планами.
- Спасибо всем, кто повлиял на это.
Эксперименты с эмулятором продолжаются. На сегодня он умеет:
- Загружать ROM и RKS из файла (пока что в ручном режиме в сырцах true на false надо сменить).
- При этом можно загружать ПЗУ Лика или Специалиста.
- Игра Клад уже работает без ошибков. Бейсик все еще глючит.
- Появился программный ассемблер/дизассемблер. Он сейчас еще работает не полноценно, т.к. не все команды реализованы (пока что 30% готовности).
- Появились юнит тесты - тестирующие команды процессора.
- Появились интеграционные тесты, тестирующие что будет в результате выполнения 10M тиков на определенной ROM/игре c CPU/экраном (в формате png).
- Постепенно переношу полезные материалы (мануалы, игры) в ресурсы проекта. Этот репозиторий планируется как единое место для всех наработок и контента.
- Код сильно отрефакторен. Удален старый код ZX Spectrum, расширенные команды Z80, фичи, которые пока что не сильно нужны (после переноса на новый модерновый UI фреймворк часть из них верну). Сильно упрощал везде, где только можно. Разделил все GodObjects на компоненты.
Обновления в эмуляторе:
- Все команды мигрированы из старого процедурного стиля в новый OOP.
- Попутно устранены проблемы с флагом P и командой DAA (в этом
как оказалось, крылись отличия Z80 и i8080). - Спасибо Автору статьи про различия i8080 и Z80.
- Спасибо Viktor Pykhonin за исходники и emu80-дебаггер они очень помогли разобраться в отличиях.
- Спасибо Авторам тестов команд i8080 и Begoon за то, что выложил их на своем GitHub вместе с исходниками.
- Спасибо Svofski за чудный assembler редактор благодаря ему я смог адаптировать нерабочие тесты к работе на ЛИКе. Речь про test.asm и test.rks.
- Итого игра Клад работает до самого последнего призового уровня (раньше не работала), а так же бейсик завелся и предварительно работает.
- Уверен есть еще много косяков связанных с флагами. У меня в очереди жду еще три обширных теста команд i8080. В ближайшем будущем поправим. Тесты лежат тут.
- Так как разработка ведется через тесты - улучшен фреймворк для написания тестов. Можно ассемблировать-дизассемблировать команды. Можно останаваливать cpu по какому-то указанному в тесте критерию. Можно трейсить выполнение программы. Можно запускать тесты с записанными сценариями нажатых клавиш.
- Исправлена раскладка клавиатуры. Были ошибки.
- Для удобства есть возможность переключаться QWERTY/JCUKENG по переключению раскладки на хостовой машине, или по временно зажатому Ctrl.
- Модификаторы Ctrl, Alt, Shift (и их комбинации) так же обрабатываются - на некоторые клавиши 2, 4, 6, 7 (и другие) с модификаторами "повешаны" дополнительные символы, которые ждешь глядя на современную калавиатуру.
- По хоткеям NUM_PAD(* + -) можно влиять на скорость эмуляции: максимально ускорять, ускорять на 15% и замедлять на 15% соответственно.
- При работе эмулятора в корне создается файлик keys.rec в нем записано когда (тик) какая клавиша была нажата и когда отпущена. Это позволяет записать вручную сценарий, а потом детерминированно его воспроизводить в тестах или как replay.
- По хоткею NUM_PAD(.) можно загружать любой такой replay.
- По хоткею NUM_PAD(/) можно загружать rks/bin/com файлы. При этом эмулятор заботливо вобьет в мониторе JXXYY и нажмет Enter.
- Выпилены старые Апплеты, запуск приложения заменен на Swing.
- Добавлены скрипты build/build-client.sh для запуска десктопной версии, и build/build-server.sh чтобы поднять jetty и раздавать это же приложение в сети.
- Добавлены найденные на просторах сети игры ЛИКа и тексты.
- В JNLP формате не работают хоткеи так же как в обычной версии.
- Разделены тесты CpuTest, CpuPerformanceTest, CpuSmokeTest.
- Выделена документация по командам процессора.
- Добавлены тесты на команды процессора 8080.
- Добавлен более удобный тестовый метод для тестирования изменений в памяти.
- Добавлен GPT generated dirty класс, который позволяет быстро по отчету о сваленных тестах jUnit (из Intellij Idea) выкусить actual блок и заменить expected по всему исходнику java класса теста. Очень удобно. Давно пора это в IDE добавить как фичу.
...
- (033e1d34) Теперь тест js версии ассемблера генерируют контент для всех тестов процессора.
- (7009ba58) Теперь тест java версии ассемблера использует тот же контент, что и js версия для всех тестов процессора.
- (5262f92f) Исправление ошибки в java ассемблере связанной с неправильной обработкой чисел в формате
0b_1111_1111. в методеresolveNumber. - (cd2a4802) Исправление в js/java версиях ассемблера в области парсинга разных форматов чисел
resolveNumber. Это отступление от оригинальной вресии js ассемблера было необходимо, так как java версияevalInvokeне работает с некоторыми форматами чисел, так как это делает js версия. - (27b3fae7) Тест ассемблера
AssemblerTest.assemble()теперь генерируетmemфайлы тестов процессора из исходников. Все они соответсвуют оригинальным версиям, о чем можно сделать вывод, что ассемблер работает. - (c51579d2) В
Bitesпоявился методbyteArrayпозволяющий получить память в виде массива байтов, что
используется теперь в асемблере для удобства. - (c7d0080a)
Bitesтеперь может печатать содержимое памяти в виде таблицы. - (c7d0080a) Для нового ассемблера добавлена документация по использованию, тест и
Assembler.main()ззапускатор. - (ec138614) Обновил в шапке релизы ассемблера. Rev.K2: Ported to Java by Oleksandr Baglai Rev.K3: Fixed resolveNumber for processing numbers with '_' in them. Fixed corner cases with '0b' prefix in combination with 'h' suffix.
- (8818a6d1) Реализован функционал генерации wave файлов на основе нового ассемблера.
- (8818a6d1) Добавлены тесты на генерацию wave файлов для всех тестов процессора.
- (1914f442) Исправлена частота дискретизации wave чтобы было близко к тому, как оно в оригинале должно звучать.
- (1914f442) Добавлены тесты на генерацию wave файлов для игры
клад, исправлены wave файлы всех тестов процессора. - (c072c39e) Так как в играх появляются дополнительные артефакты кроме самой скопилированной версии, было разделение - каждая игра имеет свою папку с файлами.
- (15f2c737) Добавлена в тесте
testLik_generateWaveгенерация всех wave файлов для всех игр ЛИКа. - (ce6bfe72) В
FileAssertесли файл уже существует, и его хеша нет в кеше, то он пересчитывается. Так как не все тесты подчищают за собой перед своим запуском, это позволяет не падать на тестах,
- (c77afbdf) Каждый интеграционный тест теперь пишет approvals контент в папку, которая берется из имени теста. Каждый прочерк заменяется на слеш. Сделано для удобства отладки растущего количества тестов.
- (c77afbdf) В
TrackUpdatedMemorудобавлена возможность отслеживать изменения только тех даных, что реально поменялись, или всех записываемых. - (bfad2f98) В прошлых коммитах потерялись другие тесты. Докоммитил.
- (883a4221) Добавлены тесты для ассемблирования и дизассемблирования (были уже) игры после того как в нее поиграли, с проследующей проверкой как именно изменилась игра (где ее блоки данных в памяти).
- (883a4221) В
TrackUpdatedMemorутак же скипаются строчки для 16 байтовых блоков, которые не поменялись. - (20b019c0) Исправлено расширение файла на
log, так какdiffзарезервировано в IDE. - (6f466ad5) Исправлена информация про изменения в проекте, а так же в бклоге.
- (972082dc) Рефакторинг. Устранено дублирование в
Bites. - (7fa9bac0)
PngVideoработает в любом диапазоне дат, это необходимо для того, чтобы иметь возможность распечатать как бы выглядела любая область памяти, будь она video memory. Эта возможность пригодится в тестах дальше, чтобы быстро визуально понимать - что поменялось. - (684e580c) Уточнена связь между диапазоном видео памяти и шириной и высотой экрана.
- (25ddecc9) Реализован метод печатающий в png заданной высота Range из памяти - это полезно для отладки. При этом пришлось переработать логику отрисовки видеопамяти.
- (c99ef89f) Исправил ошибку с загрузкой игры через диалог загрузки. Из за недавних исправлений в (925298d1) появилась ошибка.
- (3e1c25cc) Добавлена информация о том, как работать с клавишами для упраления эмулятором.
- (8ebfbb6f) Добавлено логгирование разных важных этапов, для удобства отладки.
- (b352cd13) Добавлена возможность останавливать recording скрипт командой
stop();или по нажатиюPause/Break. - (e95ab927) Нажатие на клавишу
NumPad 3- создает скринотшот в папкеscreenshotsс именем содержащим текущую дату. - (f4a49761) Нажатие на клавишу
NumPad 4- останавливает воспроизведение/запись replay. - (91a7ae56) Поиграл еще в игру
Клади кажется нашел еще один баг.
- (c9ca6d77) Реализовал функциональность сохранения
NumPad 6и загрузкиNumPad 5snapshot по хоткеям. При этом сохраняются все регистры CPU, IO порты и состояния клавиатуры, а так же вся память. - (078e2e08) Инкапсулировал логику работы с
GraphicиioDrawModeвGraphicControlвнутриHardware. - (9144ed04) В загрузку/сохранение snapshot так же включен
ioDrawMode - (9abcc545) Полностью переделана загрузка/сохранение snapshot. Теперь каждый объект, который имеет стейт
должен реализовать
StateProviderи может быть сохранен в унифицированном подходе - теперь новое свойство добавлять просто. - (9abcc545) Все данные которые отностятся к подсчету таймингов вынесены из
ApplicationвTimings. - (9abcc545) Во всех тестах исправлено использование
SmartAssert.setup().
- (5f05384f) В загрузку/сохранение snapshot так же включен
Cpu.tick,Cpu.tact,Cpu.interrupt. - (a814b732) Выделил из
ApplicationвRomSwitcherлогику переключения ROM. - (3b59136f) В загрузку/сохранение snapshot так же включен
RomSwitcher.lik. - (a78bdb27) Рефакторинг в тестовом фреймворке. Больше полезных методов появилось у него из
IntegrationTest. - (16e02921) Добавил тест для декомплияции игры
Клади проверки, что она не изменилась после компиляции. - (c07e8646) Сделал работу с платформой в ООП стиле.
- (c07e8646) Выделил в отдельный класс тест для генерации Wave из
rks, сделал его рабочим для всех платформ. - (507d0fc4) Улучшена валидация в
StateProvider. - (01cb07a2) Новый тест
DizAssemblerTestтеперь пытается генерировать asm файлы для всех игр. Ряд игр не декомпилируются, или компилируются после с ошибками - их мы пока пропустили с TODO. - (c6f84cce) Добавил архивы из
https://emu80.org/files/?tags=spmxдля дальнейшей обработки всех полезных артефактов. - (8d7b70e3) Переработан формат работы с
base. Теперь заbaseвзят корень проекта, а неsrc/main/resources. Пришлось исправить все относительные пути, но зато теперь оно работает в едином стиле. - (8d7b70e3) Расширен интерфейс
Platformтеперь он заботится о поиске игры в папкеapps. - (5b694b34) Исправлена ошибка с расширением файла
RKSто же самое что иrks. - (e7a17f3a) Распаковал все игры и программы, их придется доработать перед тем, как использовать.
Формат
rksотличается от оригинального. - (6862f461) Распарсил новый подвид формата
rks. - (dda3b5fa) Нашел оригинальную игру тетрис от Черновицкого Электронмаша из подборки
emu80.org.
- (14087daa) Сделал labels такими, что не содержат чисел, а состоят из 4х-буквенных символов, первый из
которого
l, за которым идут три другие из набора[a-z]. Лейблы генерятся максимально уникальными. Так чтобы два соседних индекса не были похожими. - (5d6701f9) Добавил все GPT запросы, которые использовались, чтобы реализовать несколько последних фич.
- (df358a87) Несколько тестов исправлено после коммита (14087daa).
- (6068480a) Улучшил производительность путем исправления логики работы с модами в
Modifiable. Операция заключенная в модах выполняется для каждого тика, а то и по несколько раз - логика там должна быть молниеносная. - (032d06b4) Еще несколько улучшений с целью, которая преследовалась в (6068480a).
- (a41d2ea8) Пытался улучшить производительность еще, но пока что не получилось. Некоторые улучшения в коде оставил.
- (b0cbe80a) Еще немного оптимизации по памяти. Нет необходиомости записывать для каждого изменения
новый
UpdatedBite- все изменения можно хранить в одном. - (d8c6ef0d) Нашел описание одногно из тестов на просторах
web archiveи продублировал тут. - (f555516e) Добавил еще архив с файлами. Одного только не нашел.
- (6ed45fd4) Попробовал запустить тест
cputest\cputest.comно пока не очень получилось. Оставил TODO.
- (bfc10dce) Дизассемблировал
ЗагрузчикЛиквDizAssemblerTest.testDecompileTest_lik_romZagruzchik. - (bfc10dce) Исправлено несколько ошибок в декомплияции ассемберных программ со смещением.
- (78ca0036) Теперь во всех автогенерируемых
asmфайлах в шапке указано каким декомпилятором оно дизассемблировано и в каком тесте, и где брать исодную версию бинарного файла. - (a05e0e3e) Дизассемблировал
Монитор-1МЛиквDizAssemblerTest.testDecompileTest_lik_romMonitor. - (449706cc) Добавил функциональность, в которой я могу указать какие области памяти при дизассемблировании так же стоит рассматривать как вероятные облаасти памяти с кодом.
- (3e0147d7) Продолжаю уточнять возможные участки кода.
- (bfe630df) Посортировал все ссылки за пределами программы в порядке возрастания их адресов.
- (1bc7822d) Лейбл при дизассемблировании генерируется из адреса, а не длинны массива списка существующих лейблов. Это по какой-то причине поломало много игрушек. Надо разобраться что не так там. Оставил TODO пока.
- (1bc7822d) Удалил из дизассемблирования команды за пределами области памяти игры.
- (1bc7822d) Исправил форматирование лейблов дизассемблированного кода.
- (1bc7822d) Ссылки на вшение области памяти в начале программы через
EQUбольше не ссылаются на области внутри
программы - это приводило к конфликту, поскольку для этого существуют метки в кодеlabel:. - (8fb54751) Нашел ошибку. Дело было в методе, который генерил лейблы. 3х сиволов
[a-z]не достаточно для упаковки 16 бит. Надо 4. Но метод еще предстоит поискать. А пока вот GPT поздсказал решение. - (f850340c) Поправил алгоритм, и сделал умное размешивание битов, для больше рандомификации.
- (197e2482) Последний коммит (f850340c) исправил некоторые игрушки.
- (40cc0d2b) Уточнил еще точку входа в загрузчик Лика.
- (6b6f4043) Уточнил еще точку входа в загрузчик Лика.
- (ea4e618d) Уточнил еще точку входа в монитор Лика.
- (01981f87) Уточнил еще много точек входа в монитор Лика.
- (01981f87) Реализовал сохранение так же и лога дизассемблирования с адресами памяти и байтами. Так удобнее исследовать закрытые зоны.
- (f855d5ce) Запустил все тесты и прогенерировал логи для всех игр.
- (c071cd5a) Исправил тест монитора. Там не та ПЗУшка грузилась и я сделал дурную работу.
- (56ef720d) Начал с тестом Бейсика. Но пока только начал...
- (5c97f715) Сделал тест на выполнение команды
Bмонитора, и там проверил ПЗУ и адресс0000...на идентичность. Бейсик копируется и копируется as is. - (5c97f715) Порефакторил
MemoryиBitesустранил дублирование. - (e588333e) Реализовал распознавалку экрана. На вход передаешь ей
pngсо скриншотом экрана, а она возвращает текст что на нем написано. Есть коллизии с русским/английским текстом, и надо еще хорошо отлаживать.
- (793d3bc2) Исправил распознавание png в текст. Инвертированные сиволы тоже распознаются.
- (da1101d3) Реализовал иной метод проверки текстового распознавания экрана.
Теперь контент по методу
approvalsзаписывается в ресурсы теста. - (28c5711b) Добавил описание про новую функциональность.
- (ca03e46e) Исправил логику определения коллизий в распознавании текста с учетом того, что некоторые символы могут выглядеть одинаково в латинице и кириллице.
- (e4a4fe78) Еще улучшил, чтобы замена была в словах и распостранялось от символа в кириллице влево и вправо.
- (655aa883) Реализовал обратный алгоритм, который позволяет получать
pngизображение экрана печатающего заданный текст. - (fd370b44) Написал тесты на проверку всех символов, что есть в системе.
- (2b929129) Порефакторил внутри
LayoutиKeyboardвыделил поясняющие константы. - (5e223429) Добавил знак апострофа и знак пробела.
- (4422e6b5) Переместил часть полей из
IOPortsвKeyboardпоскольку хотелось сильнее отвязатьIOPortsот логики нажатия кнопок. - (77c6320c) Несколько реорганизовал код вокруг
Keyboard. Разюираюсь с тем, как отделить shift нажатый на хостовой машине от shift нажатого в эмулируемой машине. - (8b1547c6) Разделил шифт на хост машине и шифт на эмулируемой машине - теперь можно передавать shift отжатый на эумулируемую машину, при условии что он нажат на хостовой - реньше этого нельзя было сделать.
- (13ef528c) Небольшой рефакторинг, чтобы все блоки были в одном стиле. Это самый магический код во всем проекте.
- (d27a02fe) Сделал полную эмуляцию shift. Теперь нажатия на хостовой машине любых клавиш с любыми модицикаторами
связаны с нажатия клавиш на эмулируемой машине только через
Layoutкоторый указывает что реально будет происходить в эмулируемой среде. Пока что не уверен, что работает record логика и все клавиши надо проверить. Но уже получилось избавиться отalt+shiftкостыля. - (7d1fea7d) Исправил после последних коммитов
Layoutтак, чтобы работали нормально символы и буквы с модификаторами. - (a6e6858f) Еще подправил
Layoutчтобы было похоже на реальную клавиатуру. - (2e1bf41a) Порефакторил способ, которым отрабатывает
Layout. Теперь в нем содержится метод, который динамически рассчитывает код клавиши для эмулируемой машины, на основе кода клавиши на хостовой машине и флагаrusLat, который пока что не имеет никакого влияния. - (11530f72) Пересмотрел все клавиши в
Layout. Много исправил. Остальное в TODO.
- (16e0d47a) Во время записи record надо записывать все клавиши, иначе не работает риплей.
- (416753f6) Добавил состояние
cyrLatиshiftEmuв метод сохранения snapshot. - (0ababd63) Сделал так, чтобы переключение
cyrLatпроводилось 1 раз при нажатии кнопки. Была ошибка. - (81951f60) Отремонтировал record/replay теперь в файл так же пишутся модификаторы (alt, shift, ctrl) если они есть. Реализована поддержка старой и новой версий рекординга (с модификаторами и без).
- (23982ac6) Добавил подробный тест на первую линию клавиш со всеми мобификаторами. Он не работает правильно - надо разобраться почему.
- (fbad53cc) Закоммитил тест зафиксировав текущее нерабочее состояни риплея клавиш с модификаторами (alt, shift, ctrl) Оставил TODO разобраться позже.
- (a2827261) Сделал возможным по рисайзу скейлить при прорисовке окно с содержимым.
- (e6277460) Вынес все TODO в
readme.mdи пронумеровал их. Всего 28 типов проблем. - (9ab6559b) Добавил из архива новую игру
chessнаписал для нее несложный тест в до первого ответа компьютера. Она пока деззасмеблируется с ошибками - надо будет потом это все поправить. - (4b87cb79) Сделал возможным после остановки риплей-сценария в тесте, дописывать этот сценарий и снова запускать тест.
- (2a103430) По какой-то причине результаты выполнения старого теста удалились - вернул!
- (e1c91dcc) В игре
chessреализовал первых несколько шагов. Так же попаршен ход компьютера - я его далее буду использовать как генератор ходов для другой сессии игры. - (42fa47f6) Рефакторинг. Упрощаю код перед выделением общей логики.
- (e0d813aa) Рефакторинг. Применил Extract method - устранил дублирование.
- (8f8d3eb5) Реализовал игру одного эмулятора против другого.
- (3cfef530) Добавил wave файл игры chess
- (a6d77d85) Перевел все текстовые файлы в
utf8 - (51e2d9c3) Добавил еше две программы
basicдляСпециалистиМонтитор-1Мс тестами, wave и другими артефактами. - (7533a8c8) Дополнил тесты в прошлом коммите.
- (f6beae77) Сделал загрузку
BSSфайлов для бейсика. На примере программы на бейсикеpresidentнаписал тест. Программа пока не работает, о чем оставил упоминание TODO. Так же реализована загрузкаbssфайла из open dialog.
- (c6f860b8) Сделал парсилку
basicкоманд в машинном коде в текст. То есть теперь можно братьbssфайл за исключением первых 3х символов и запускать вBasicCompiler.getSourceи получить исходный текст программы. Не все коды команд сейчас обработаны, а так же вероятно не все символы. Надо проверить. Исправил так же ошибку в машинном коде программыpresident. - (c6774ee5) Создал тест в котором генерятся все возможные команды. Провериол все 256 символов. Часть из которых ничего не дают, и потому пока закомментированы. Надо будет потом проверить их один за другим.
- (6f6f850e) Поправил тесты к прошлому ккомиту.
- (ec88b00d) Удалил программу
presidentиз архива. Она уже обработана. - (65471237) Запустил из архива другую версию
basicдляСпециалистиМонтитор-1М. Так же обработал 1 программуdialog, которая запускается в этой версии бейсика (со смещением 0x2000). Для чего ввел новый формат файловbs1. - (644d8fea) Докоммитил некоторые изменения к предыдущему коммиту: wave файлы, документацию.
- (53166913) Разобрался с новой программой
dialogдляbasicМонтитор-1М. Поправил документацию. Сделал возможным пустые строки в программе.
- (2d93b24a) Поменял расширение в соответствии с типом файла для некоторых basic программ.
- (dacc2d6d) Достал еще некоторые архивы из старой версии emu80.org сайта. Возможно они не для моей платформы, позже разберемся.
- (dbb1de78) Почти все, что было найдено в вебархивах описанное в статье http://www.apofig.com/2018/08/blog-post.html сохранил тут. Позже буду разбираться что из этого останется в проекте как часть специалиста, а что нет.
- (bbd987aa) Поправил названия папки, чтобы в ней было видо полное имя ахива
- (8d2c1819) Распаковал архив
Alex_B. Поправил кодировки текстовых файлов. - (702f7371) Часть описания компьютера из
Alex_Bуже распакована. Сделал линки. - (30a10209) Убрал мертвый код.
- (f2cf9bd4) Разобрал образы пзу ЛИКа из архива
Alex_B. Поправил описание. Сделал линки. - (09dd4924) Распаковал архивы
pk-info.ru. - (b70bd6b4) Скопилировал хорошее описание игры
Клад. - (5dd6772f) Обновил описание игры
Клад. - (10658ef5) Еще раз обновил описание игры
Клад. - (b75a7b73) Добавил описание игры
Буран. - (bfba6088) Добавил описание игры
BUDI. - (34129a70) Обновил описание игры
КладиБуран. - (35ffa264) Еще немного обновил описания.
- (ba7f49dd) Отладил и починил все варианты запуска эмулятора: maven, ide, jar, bash, batch. Ни один из них не работал.
Сейчас все работает кроме jetty/jnlp. Обновил документацию. Полностью переработал способ работы с параметрами
spec.Main. Так же пришлось переделать тестовый фреймворк. В общем большой рефакторинг, но зато теперь все классно ранается. - (5855bb29) Добавил GPT запросы к прошлым коммитам.
- (0c23863f) Я мега крутой! Полностью доделал возможность запускать приложение из jetty сервера. Старый jnlp подход не работает уже. Пришлось искать что-то новое. Я нашел cheerpj который позволяет запускать java приложения в браузере. Очень круто! Для опенсорс некомерческих проектов свободный. Пришлось полностью переделать загрузки и сохранения файлов. Избавился от злощастного URL который сильно глючил. Добавил скриптов для запуска. Обновил документацию. Короче круто! :)
- (ef3b2216) Поправил пару тестов к прошлому коммиту. Не такой уж я и крутой :) Добавил GPT запросы к прошлому коммиту.
- (c0bbedf4) Поревьювал вчерашнее решение. Сделал несколько улучшений скриптов. Разукрасил один batch скрипт. Исправил ошибки.
- (c0bbedf4) Добавил пояснений в хоткеи. Буду их чуть реорганизовать чтобы UI/UX.
- (920cf9f5) Переделал расположение и назначение кнопок на NumPad. Теперь все интуитивнее :)
- (a37c7eb8) Сделал возможность копировать распознанное содержимое экрана в буфер обмена при нажатии
Ctrl_NumPad 8. - (a425687a) Долил GPT запрос.
- (248f7f55) Сделал по клику в
windowsна файл определенного типа загрузку его в эмуляторjarневажно какого он типа. Отдельно пришлось поиграться сsnpфайлом. А так как тестировать надо так же и в веб версии то пришлось поменять много где. Так же поправлен билд, теперьjarсоздается в двух местахbuild/outиsrc/main/webapp. Убрал лишний контент изjarсократил его размер. Для регистрации файлов вwindowsнадо запустить/build/open-file.regпредварительно поменяв пути.
- (a6e68ada) При загрузке
bssиbs1файлов, подгружается так же соответсвующий вариантbasic. Run config запускаjettyзависит теперь напрямую от сборркиjar-with-dependencies. - (5a39a8eb) Создал скрипт автоматически генерирующий файл реестра
build/open-file.regдля управления
ассоциациями файлов эмулятора в Windows. Запустив этот скрипт, можно легко ассоциировать расширения файловrks,bss,bs1и другие с эмулятором. Сгенерированные записи реестра создаются скриптомbuild/open-file.bat, что упрощает настройку для пользователей.
- (fd1fdb21) Какие-то исправления, я ХЗ какие :)
- (a8019f27) Добавлен новый способ воспроизведения звука записи на магнитофон, происхдящий в отдельно потоке что улучшает звучание.
- (0f23b0bf) Улучшил звучание, сделав его более синхронным с тиканием процессора. Теперь оно не задерживается.
- (05affaad) Удалил старый класс
OldAudioв пользу новогоContinuousAudio. - (2b7a0e2b) Хорошо звучит
BUDIно другого не слышно совсем. - (877f663e) При таком же хорошем звучании
BUDIтеперь слышно со скрежетом и звук основной. Так же присутствует эхо из буффера. - (720b259f) Попытка избавиться от эха.
- (0eca8fb6) Удалось добиться звучания клавиш чисто, но тональность при
переключенииrus/latне меняется. Похоже это связано с тем, что нули должны вставляться не в момент записи в регистр если не пишется туда 0x0B, а постоянно с определенной скоростью. - (c300c954) Избавился от кликов во время озвучиваия.
- (6f9cb443) Почистил
OldAudio.
- (b91662d8) Добавил возможность запускать конкретную команду на мониторе из окружения при старте
эмулятора. Например
spec.Main ./src/main/resources/ lik lik/apps/budi/budi.rks O=QWE,0000,6DFF - (187d43a0) Вывод на магнитофон звучит теперь чисто и по таймингам соответствует генератору wave
портированному из js ранее. Хоть в генераторе используется 1 битный звук, тут используется 8 битный
с частотой 44100 Гц. Проверил на audacity вывод
waveи того что пишется на магнитофон - одинаково. - (a1d699b4) Добавил хоткей
NumPad 9для переключения режима работы вывода звука: спикер или линеный вывод на магнитофон. - (1821e2f8) Выделил логику переключения аудио режима, синхронизацию потоков в отдельный класс
AudioDriver. - (47304d77) Добавил дат в этот файл.
- (7f45fd01) Небольшие уточнения в
OldAudio. Переименовал его вLineOutAudio. - (7bd645b6) Еще улучшил звучание спикера. Эскперименты продолжаются.
- (8aa2650c) Перевел все задержки на наносекунды - так проще настроить скорость. Выставил скорость
по игре
BUDYс эталонным эмуляторомemu80. - (7af0c2c4) Максимально выверил тайминги. Есть погрешность но не критичная.
- (068c79cb) Еще ближе к оригиналу звук игры
BUDYи мониора. - (612d8ed1) Уже совсем близко к оригиналу звук игры
BUDYи мониора. - (b6da698b) Выделил меджик намберс. Улучшил тайминги для звука. Удалил лишние переменные.
- (277f0a99) Переименовал
NewAudioвSpeakerAudio. Пофиксил TODO. - (98ad8edf) Выделил константу
- (d091605e) Небольшой рефакторинг, изменение названия переменных и иформация о тиках.
- (11437022) Замедление каждого interrupt новым способом заметно улучшило звучание, так как теперь
все происходит равномерно. Раньше щелчки были из за того, что только каждый
ninterrupt замедлялся. А делали мы это потому что небыло возможности сделать sleep меньше чем 1 ms. Теперь с nano все проще. - (7dd7efc3) Синхронизировал константы задержек с
emu80 - (c764a873) Увеличение размера буффера сказывается на устранении щелчков, но при этом заметнее подвисает сама эмуляция по время воспроизведения.
- (20b33a98) Реализована двойная буфферизация.
- (1ecf1b31) Реализован кольцевой буффер. Убрал 90% щелчков при воспроизведении. Некоторые артефакты звучания остались, но они минорные.
- (f7a7b647) Добавлен новый флаг, для сохранения состояния
AudioDriver- какой режим воспроизведения сейчас происходит. - (b21b5518) Рамка бордюр теперь подсвечивает красным, если режим воспроизведления звука из
LineOutAudioи зеленым, если как обычноSpeakedAudio. - (f3d92370) Исправлены тесты.
- (64cbf340) Начал переписывать логику сохранения
snapshot. В формате json будет приятнее для человека. Пока что перенесеныCpuиKeyboard. Попутно делаю небольшие рефакторинги. - (5d4a4aa0) Исправил ошибку с прошлым коммитом.
- (0a17a2ec) Исправил тесты после прошлых коммитов.
- (51890880) Продолжаю переписывать логику сохранения
snapshot. На этот разGraphicControl. - (5ceee173) Продолжаю переписывать логику сохранения
snapshot. На этот разAudioDriver. - (50cf54e7) Продолжаю переписывать логику сохранения
snapshot. На этот разIOPorts. - (0bbfd11a) Продолжаю переписывать логику сохранения
snapshot. Поправил имена вCpu. - (d0df24fd) Продолжаю переписывать логику сохранения
snapshot. На этот разMemory. - (15d9a26d) Продолжаю переписывать логику сохранения
snapshot. На этот разRomSwitcher. - (8b5b1fd9) Последнее в логике
snapshot. На этот разTimings. - (1a1131f1) Проверил новую логику на старых тестах.
- (f1215359) Удалил всю старую логику сохранения
snapshot. Поправил документацию. - (c6ec3552) Рефакторинг. Теперь
Hardwareтак же имеет стейт. В него пошла часть логики изRomLoader - (b14bd6fd) Добавлена TODO #44 - почему-то тесты висят.
- (c86aac31) Оптимизировал производительность тестов.
- (741caef7) Добавил QA с GPT для прошлых коммитов.
- (853cccac) Увелиличл размер буффера для
LineOutAudioпотому что были запинки. - (e4a2bd32) Использовал единый подход в
LineOutAudioиSpeakerAudioдля управления звуком, но привнеслись вLineOutAudioнекоторые артефакты звучания, которые я планирую устранить дальше. - (d8fee6fc) Наконец-то звучание идеальное! никаких артефактов. Кроме конечно поблемы, которая приводит к невозможности запускать эмулятор на большей скорости, чем необходимо для воспроизведения.
- (b543b943) При включении максимальной скорости отключается звук вообще. Так же при переключении режима воспроизведения линейного вывода на магнитофон скорость будет такой, которая необходима для нормального звучания так как в этом случае критично не пропускать аудиоданные (так кстати можно опытыным путем определить оптимальные задержки). Но если мы слушаем динамик, то ускоренние эмулятора сказывается на пропуске данных, что позволяет терять в качестве, но проджолжать ускорять эмуляцию.
- (11abf08a) Навел порядки с константами вокруг аудио.
- (e9513f22) Добавил возможность менять
allowDataSkipчерезCtrl + Num-9. Так что теперь можно найти идеальный тайминг для эмуляции, что по умолчанию выключено и при ускорении как в режимеSpeakerтак и в режимеLineOutзвуковые данные теряются и ускорение происходит. - (740e3da7) Навел чуть порядок в константах
- (aaf0a92c) Добавил GPT QA к прошлым коммитам
- (2ededb6a) Улучшил
readme.md - (a64df215) Добавил туду, исправил чтобы зву все же был но только не в браузерной версии. Которая кстати висит.
- (c7393c0c) Добавил рамку при копировании распознаного текста с экрана.
- (d8a1dab9) Переделал загрузку
snapshotsтеперь они грузят так же стейтHardware. ВHardwareтак же появились знания о:lastRom,lastRecordиlastSnapshotчтобы работа была более безшовной. Во время загрузкиreplayзапись в тот же файл продолжается, пока не будет остановлена. А если запись была остановлена, то это не мешает загрузке нового риплея. - (2a3018b7) Добавил стейтов во все классы, которые соедржат хоть что-нибудьт сохранябельное.
Пришлось повозиться с логикой, но теперь все работает очень консистентно:
сохранение/загрузка
snapshotво время/послеrecordи наоборот.
- (22d2b03a) Звук не теряется при ускорении
DO_NOT_SKIP_DATA- поставил его по умолчанию. Это атуально и критично дляAUDIO_MODE_LINE_OUT, а так же странным образом стабилизирует тайминги во время ускорения эмуляции не давая выполняться быстрее, чем положено для воспроизведения. Это еще предстоит разобрать, но так как это максимально точно передает оригинальный компьютер - я оставил по умолчанию эту опцию и поставил задержкуCPU_INTERRUPT_DELAY, которая чуть меньше чем надо.
- (509e868a) Fixed test.
- (25e92a5c) Added startup configuration files so you can run them from markdown.
- (e88f7799) Added a test for building a game from an assembler file. This allows you to reverse engineer levels.
- (f1314312) Added the ability to load an ‘asm’ file. This will assemble it and then load it into memory. The option is added to the file upload dialog and through launching the application in jar format. Updated the readme file with this description.
- (d6433584) Added information about building the levels of the klad game.
- (e3461f79) First attempt to retrieve a level from memory.
- (8ff0551a) Extracted all levels like the previous commit from memory.
- (9304c45b) Extracted all Klad constants to separate class.
- (84c28749) Implemented the logic of drawing maps from memory.
- (60e6a060) I drew heroes and hunters on the maps by parsing the system 16 bytes in front of the map. Changed the legend to make it display better. Printed out the memory area of the map as well.
- (66b2ba4b) Added a method to reverse level conversion.
- (85b36645) Fixed the past test so it reads the value from the game. Fixed TODO indexes
- (3a78e374) Preparatory refactoring in the test to isolate the method for level checking on the index from the test.
- (cf222293) Implemented a check for all levels. One corner case appeared when the hunter appears under the bridge.
- (e4a2b03f) Implemented the ability to change levels and run the emulator with the updated game.
- (--------) Updated klad level.
- (--------)
Продолжение следует!