Этот проект создался как инструмент для решения более общей задачи - реверс-инжиниринг Бытового Компьютера Лик производства завода Электронмаш, г. Черновцы в 1988 году.
Данная тема была впервые мной заявлена на форуме https://zx-pk.ru 2 мая 2018 года. С тех пор я периодически (запоями) делаю набеги к задачам.
Мое путешествие в мир компьютерной инженерии начался с игр на этом компьютере. После того как игры перестали загружаться с магнитофонных кассет мне пришлось освоить BASIC. А после того, как ПЗУ микросхема с BASIC начала сбоить и Basic больше не загружался мне пришлось освоиться и в Assembler. Это было очень увлекательно. Препарирование игрушек, чтобы разобраться как там все устроено. Ночные кодинги и дебаги перед маленьким мониторчиком, от которого жутко болели глаза.
Сам компьютер достаточно редкий даже в кругу ценителей ретро компьютеров. Я свой экземпляр искал 7 лет. Вскоре он приедет ко мне, что даст толчок в реверс-инжиниринге.
Я хочу вернуть молодость!
Так же мне давно хотелось написать свой эмулятор БК Лик на java. В прошлом я совершал попытки эмулировать процессор и частично реализовал команды, но позже нашел готовое решение на страничках форума и порадовался, так как всю эту работу уже сделали до меня. С этого момента начался разбор сырцов.
Так как Java ушла далеко вперед и Applets уже не в моде, после серии попыток запустить этот проект в Intellij Idea было решено мигрировать его. Google Driven Development подсказал, что проще всего будет перевести на JNLP технологию (которая так же устарела, но в отличие от Applets еще может быть запущена в современных браузерах). Два вечера и завелось. В будущем проект будет переведен на более модерновые UI, но пока в нем тестов нет рефачить опасно.
Позже код был отрефакторен полностью, так что связать его с оригинальным кодом практически не возможно. Мне очень хочется отметить вклад всех Авторов, а потому был создан этот раздел и все коммиты, которые я смог найти на просторах сети были добавлены в git history этого проекта. В OpenSource считаю важно не только делиться, но и помнить всех, кто так или иначе повлиял на тебя в прошлом.
Спасибо всем Авторам!
- Завести проект в любом виде.
- Перевести проект c Ant на Maven.
- Запустить на нем Монитор-1М / Basic ЛИК V2.
- Запустить на нем игру Клад.
- Снабдить документацией.
- Восстановить историческую связь с https://github.com/begoon/jasper
- И тут https://web.archive.org/web/20061229151903/http://www.spectrum.lovely.net/jasp1_1j.zip
- Изучить так же правки сделанные Автором тут https://github.com/Arlorean/Jasper
- И тут немного истории есть https://github.com/arlorean/casper
- Определиться с наследуемой лицензией и настроить maven плагин. Причем сообщить, что игры не распостраняются под той же лицензией.
- Отформатировать проект по JCC, сохранив всю документацию.
- Сделать переключение ROM и загрузку RKS на лету, без перезапуска сервера по хоткею ',' в области NumLock загружаются RKS программы, а по хоткею '0' в области NumLock переключается ПЗУ Лик/Специалист.
- Пофиксить серверную версию после добавление OpenFileDialog.
- Покрыть тестами.
- Принять решение, что делать со старым Spectrum кодом.
- Отдебажить, почему не работает игра Клад.
- Отдебажить, почему Basic глючит (сравнивая с эталонным эмулятором emu80v4).
- Перевести на модерновый UI фреймворк. Был выбран Swing и JNLP + Swing. Теперь можно запускать приложение c UI из IDE и дебажить в нем.
- Добавлены тесты а-ля "Экзорцист".
- По тестам "Экзорцист" надо убедиться что все команды работают.
- Запустить и отладить второй тест "Экзорцист".
- Запустить и отладить третий тест "Экзорцист".
- Запустить и отладить четвертый тест "Экзорцист".
- Попробовать в бейсике запустить какую-то большую игру и подебажить ошибки.
- Добавить поддержку звука.
- Сделать возможным по рисайзу скейлить окно с содержимым.
- Разделить GODObjects на компоненты.
- Отрефакторить видео логику, там ужас сейчас как не просто.
- Реализовать сохранение скриншота в png файл.
- Написать интеграционные тесты, которые будут тестить разные игрушки на большом количестве тиков.
- Код сильно отрефакторен. Удален старый код ZX Spectrum, расширенные команды Z80, фичи, которые пока что не сильно нужны. Сильно упрощал везде, где только можно.
- Реализовать ассемблер/дизассемблер для удобного превращения hex кодов в asm и назад.
- Закончить с портированием команд.
- Дописать юнит тесты для каждой не протестированной команды.
- Реализовать в TestMemory возможность проверять какие участки памяти поменялись.
- Реализовать возможность трейсить выполнение CPU в рантайме.
- Возможность определять зацикливания, вход/выход в процедуры.
- Разобраться как работает IOPorts.
- Поправить все клавиши клавиатуры (они не работали корректно).
- Покрыть IOPorts тестами с максимальным кавераджем и порефакторить.
- Сделать возможным в интеграционных тестах нажимать (програмно) клавиши.
- Перевести все найденные в сети игрушки по Лику в репозиторий.
- Добавить описание к игрушкам Лика.
- Найти еще игрушек для Специалиста.
- Возможность дебажить на UI.
- Сделать два дружественных скрипта для сборки приложения с запуском jnlp сервера и для запуска клиентского приложения.
- Сделать метод печатающий в png заданной высота Range из памяти - полезно будет для отладки.
- Реализовать возможность record/replay как прототип.
- Сделать record/replay с форматом записи в файл соответствующего типа. Record автоматически просиходит при запуске эмулятора. А вот replay по клавише '/' в области NumLock.
- Сделать по хоткею ('*' в области NumLock) максимальное ускорение/замедление эмуляции системы.
- Сделать по хоткею ('+', '-' в области NumLock) возможность плавно наращивать/уменьшать скорость эмуляции системы.
- Реализовать более умную остановку в тесте по достижению некоторого условия, а не просто спустя 10M тиков.
- Существенно улучшить производительность (как cpu, так и отрисовки).
- В интеграционных тестах большие trace/cpu assert блоки вынести в отдельные файлы, как с png.
- Реализована загрузка rks файлов с помощью эмулятора из OS.
- Сделать возможным после запуска rks собрать статистическую информацию, в каких ячейках бывал процессор, дабы понять, где есть программа, а где данные. Это на следующем этапе позволит
- Реализовать ассемблер как в https://svofski.github.io/pretty-8080-assembler/
- [!] Закончить дизасемблер.
- Реализовать сохранение/загрузку снепшотов по хоткеям. Весь стейт должен сохраняться.
- Тест
8080ex1.asm
не работает во всех местах правильно, смотриcurrent expected crc from emu80
- Сделать распознавалку текста, нарисованного на экране. Попиксельно изучить каждый символ.
- [!] Дезассемблировать
Монитор-1М
иБейсик Лик V2
и сравнить с эталоном, как в
DizAssemblerTest.testDecompileTest_lik_romZagruzchik
. - Распечатка
01_zagr.log
в области данных выводит неправильно символы - пофиксить. А вообще надо добавить символов как вA
команде монитора. - Написать тест на выполнение команды
B
монитора, и затем провериь ПЗУ и адресс0000...
на идентичность. Бейсик копируется и надо понять насколько точно. И какая подпрограмма монитора это делает. - В
мониторе
почему-то не печатаются символы!@#$%^&*()
с шифтом. - Если печатать все символы с модификаторами (alt | shift | ctrl) а потом взять файл
rec
и прогнать его еще раз, то результат будет совсем другим. Видимо не все записывается, что должно. - Сделать что-то еще...
- И еще что-то...
- Проект иначально взят тут http://sgu-wap.narod.ru/SP_MX/SPECOLD/Spec1987.zip, но у него большая история.
- Спасибо всем по цепочке fork'ов, благодаря которым эту код базу могу подхватить дальше.
- Clive Sinclair за создание (Sinclair ZX Spectrum)[https://en.wikipedia.org/wiki/ZX_Spectrum]. Если по правде, именно с него я начинал играть на компьютере, но я почему-то этого почти не помню, т.к. был мал. Эта платформа вдохновила тысячи людей на создание своих проектов. Это одна из историй.
- Andrew Pollard за первые наработки эмулятора Z80 на платформе Motorola 68000, с последующим портом кода на C.
- Adam Davidson за порт этого эмулятора на Java и создание Jasper.
- Philip M. Scull за вторую жизнь Jasper.
- Alexander Demin за третью жизнь Jasper.
- Lavr за проделанную работу по запуску Специалист'а (старший брат Лик'а) и подробные комментарии в коде.
- Спасибо Организаторам и комьюнити за возможность держать связь с коллегами по цеху:
- форума nedopc.org.
- форума zx-pk.ru (именно на этом форуме я и купил свой второй Лик).
- Спасибо svofski за чудный assembler редактор.
- Спасибо Viktor Pykhonin (vpyk) за крутой эмулятор.
- Отдельное спасибо за исходники и emu80-дебаггер они очень помогли в поиске отличий между процессором Z80 и i8080.
- Спасибо Автору статьи Различия между процессорами i8080 (он же КР580ВМ80А) и Z80.
- Спасибо Диме Вилюжанину за то, что помог купить реальный Лик.
- Спасибо моему Папе за то, что привил мне любовь к инженерии.
- Спасибо инженерам Черновицкого завода 'Электронмаш' за Лик.
- Спасибо Лищинскому К.В за римейк игры Клад на Лик'е.
- Спасибо Авторам за картинку
- Спасибо Oracle за Java.
- Спасибо Markdown за то, что я не мучаюсь с версткой этой странички.
- Для запуска необходимо установить java 1.8 версии.
- Прописать переменную окружения JAVA_HOME ссылающуюся на папку с установленной java.
- Затем добавить в Path переменную
JAVA_HOME/bin
. - Выполнить команду в консоли
java -version
и увидеть версию java.
- Для открытия проекта в IDE стоит импортировать его как maven проект.
- Запустить класс
spec.Main
. - Так же для Intellij Idea есть конфигурации запуска в папке
.run
. - В проекте присутствуют unit/integration тесты с хорошим code-coverage - рекомендуем начать работу с их запуска.
- Для этого стоит запустить скрипт
build/build-client.sh
. Если нет linux можно использовать тулы типаcygwin
/mingw
. - В процессе сборки создастся папка
build/out
в которой будет все необходимое для запуска. Скриптbuild/out/run.sh
запустится автоматически. В будущем не стоит пересобирать все приложение - для запуска достаточно запуска скриптаbuild/out/run.sh
.
- Для этого стоит запустить скрипт
build/build-server.sh
. Если нет linux можно использовать тулы типаcygwin
/mingw
. - Скрипт в какой-то момент остановится (сервер запустился) - окно закрывать не стоит, его закрытие приведет к остановке сервера.
[INFO] Started ServerConnector@697c9218{HTTP/1.1, (http/1.1)}{0.0.0.0:8080}
[INFO] Started Server@15200332{STARTING}[11.0.7,sto=0] @8448ms
- После стоит проследовать в
JAVA_HOME/bin
и запустить тамjavacpl
. - В tab
Security
- Поставить галочку
Enable Java content for browser and Web Start applications
. - Выбрать опцию
Very high
дляSecurity level for applications not on the Exception Site list
. - Добавить в
Exception Site list
новый сайтhttp://localhost:8080/
- Поставить галочку
- В tab
Advanced
- В разделе
Debugging
выбрать галочкиEnable tracing
,Enable logging
иShow applet lifecycle exceptions
. - В разделе
Java console
выбрать опциюShow console
.
- В разделе
- Остальное оставляем без изменений. Кликаем
Apply
и закрываем окно. - Так мы настроили вывод логов из Applet в консоль, которая откроется при запуске приложения.
- Направляемся в браузер и набираем в адресной строке
http://localhost:8080/
. В этот момент Applet незамедлительно попробует загрузиться. - Для другого URL необходимо править файл
build-server.sh
в области
eval_echo "HOST=localhost"
eval_echo "PORT=8080"
- Если агент безопасности спросит можно ли это сделать - разрешаем ему открыть приложение.
- Если сервер более не нужен - стоит нажать Ctrl-C в консоли, иначе если просто закрыть окно консоли - процесс будет висеть в памяти, не давая запустить сервер второй раз.
- Приветствуем надпись
* RUN"COM:"
- Жмем на клавиатуре клавишу
Pause/Break
, затемEnd
, затемEnter
. - Приветствуем надпись
* RUN"COM:"
* МОНИТОР-1М *
===>
- Нажимаем клавишу
B
, затемEnter
. - Приветствуем надпись
* BASIC ЛИК V2 *
OK
- Нажимаем на клавиатуре клавишу
Pause/Break
, затемEnd
, затемEnter
. - Нажимаем на клавиатуре клавишу
.
(точка), затемEnter
. - Откроется диалог выбора файла. Выбираем файл
klad.rks
из папкиsrc/main/resources/roms/lik/apps
. - Нажимаем на клавиатуре клавишу
J
, затемEnter
. - Радуемся игре
Клад
.
- В методе
spec.Application.loadRoms()
можно поменять настройки загружаемых ROM
boolean lik = true;
if (lik) {
Lik.loadRom(base, hard.roms());
Lik.loadGame(base, hard.roms(), "klad");
// Lik.loadTest(base, hard.roms(), "test");
} else {
Specialist.loadRom(base, hard.roms());
Specialist.loadGame(base, hard.roms(), "blobcop");
}
- Отредактировав его можно выбрать любой ROM/RKS загрузить его в определенное место памяти.
- После сервер jetty стоит перезапустить, закрыть старый Applet и открыть его повторно.
- В Java консоли Applet можно увидеть как и куда происходит загрузка
network: Cache entry not found [url: http://localhost:8080/lik/01_zagr.BIN, version: null]
network: Connecting http://localhost:8080/lik/01_zagr.BIN with proxy=DIRECT
Loading 'http://localhost:8080/lik/01_zagr.BIN' into [C000:C800]
network: Cache entry not found [url: http://localhost:8080/lik/02_mon-1m.BIN, version: null]
network: Connecting http://localhost:8080/lik/02_mon-1m.BIN with proxy=DIRECT
Loading 'http://localhost:8080/lik/02_mon-1m.BIN' into [C800:D000]
network: Cache entry not found [url: http://localhost:8080/lik/03_mon-1m_basicLik.BIN, version: null]
network: Connecting http://localhost:8080/lik/03_mon-1m_basicLik.BIN with proxy=DIRECT
Loading 'http://localhost:8080/lik/03_mon-1m_basicLik.BIN' into [D000:D800]
network: Cache entry not found [url: http://localhost:8080/lik/04_basicLik.BIN, version: null]
network: Connecting http://localhost:8080/lik/04_basicLik.BIN with proxy=DIRECT
Loading 'http://localhost:8080/lik/04_basicLik.BIN' into [D800:E000]
network: Cache entry not found [url: http://localhost:8080/lik/05_basicLik.BIN, version: null]
network: Connecting http://localhost:8080/lik/05_basicLik.BIN with proxy=DIRECT
Loading 'http://localhost:8080/lik/05_basicLik.BIN' into [E000:E800]
network: Cache entry not found [url: http://localhost:8080/lik/06_basicLik.BIN, version: null]
network: Connecting http://localhost:8080/lik/06_basicLik.BIN with proxy=DIRECT
Loading 'http://localhost:8080/lik/06_basicLik.BIN' into [E800:F000]
network: Cache entry not found [url: http://localhost:8080/lik/apps/klad.rks, version: null]
network: Connecting http://localhost:8080/lik/apps/klad.rks with proxy=DIRECT
Loading 'http://localhost:8080/lik/apps/klad.rks' into [0000:4430]
cache: MemoryCache: removed entry http://localhost:8080/spec.jnlp
После того как приложение запущено, есть несколько вариантов как влиять на работу эмулятора.
Большинство манипуляций осуществляются через number pad - NumLock
должен быть включен.
-
Pause/Break
- Сброс процессора. После сброса процессора, загружается монитор (ЛИК или Специалист). -
End
- Эмуляция клавишиStop
на клавиатуре. -
NumPad 0
- Переключение ПЗУ Лик/Специалист. -
NumPad 1
- Приостановка/Запуск процессора. -
NumPad 2
- Режим вывода бордюра. Работает цилично.ioDrawMode = 0
- бордюр подсвечивает активно ли окно эмулятораioDrawMode = 1
- бордюр подсвечивает запись байта в порт АioDrawMode = 2
- бордюр подсвечивает запись байта в порт BioDrawMode = 3
- бордюр подсвечивает запись байта в порт CioDrawMode = 4
- бордюр подсвечивает запись байта в порт RgSYS
-
NumPad 3
- Создает скринотшот в папкеscreenshots
с именем содержащим текущую дату. -
NumPad 4
- Останавливает воспроизведение/запись replay. -
NumPad 5
- Загрузка состояния машины из папкиsnapshots
. При этом заружаются все регистры CPU, IO порты и состояния клавиатуры, а так же вся память. Выполнение продолдается с места на котором было сохранено состояние. -
NumPad 6
- Сохранение состояния машины в папкуsnapshots
. При этом сохраняются все регистры CPU, IO порты и состояния клавиатуры, а так же вся память. Сохранение происходит в файл с расширениемsnp
. Его структура такая:- CPU state:
- 2 bytes -
PC
(low byte, high byte) - 2 bytes -
SP
(low byte, high byte) - 2 bytes -
AF
(low byte, high byte) - 2 bytes -
BC
(low byte, high byte) - 2 bytes -
DE
(low byte, high byte) - 2 bytes -
HL
(low byte, high byte) - 4 bytes for int -
interrupt
- 4 bytes for int -
tick
- 4 bytes for int -
tact
- 2 bytes -
- Keyboard state:
- 12*6 bytes - keyboard state 12 x 6 for all keys - is key pressed
- 1 byte - flags
0b__shift_alt_ctrl_shiftEmu__cyrLat_0_0_0
- shift -
0b_x000_0000
is shift key pressed - alt -
0b_0x00_0000
is alt key pressed - ctrl -
0b_00x0_0000
is ctrl key pressed - shiftEmu -
0b_000x_0000
is shiftEmu flag is set - cyrLat -
0b_0000_x000
is cyrLat is cyrillic or latin
- shift -
- I/O ports state:
- 1 byte - flags
0b__0_0_0_A__C1_0_B_C0
- Ain -
0b_000x_0000
- Bin -
0b_0000_00x0
- C0in -
0b_0000_000x
- C1in -
0b_0000_x000
- Ain -
- 1 byte - flags
- GraphicControl state:
- 1 byte for int -
ioDrawMode
- 1 byte for int -
- Timings state:
- 4 bytes for int -
interrupt
- 4 bytes for int -
refreshRate
- 1 byte for boolean - 1 if
willReset
true, 0 otherwise - 8 bytes for long -
last
- 4 bytes for int -
delay
- 1 byte for boolean - 1 if
fullSpeed
true, 0 otherwise - 8 bytes for long -
time
- 4 bytes for int -
iterations
- 4 bytes for int -
- Memory dump:
0x0000
-0xFFFF
- ROM switcher state:
- 1 byte for boolean - 1 if
lik
true, 0 otherwise
- 1 byte for boolean - 1 if
- CPU state:
-
NumPad /
- Запуск replay режима. Откроется диалогRecording file
в котором можно выбрать файлrec
с записью. После выбора файла эмулятор выполнитreset
и начнет воспроизведение записи. Формат файла текстовый, показывает все нажатые клавиши в зависимости от тика процессора.after(138119).down(0x23); after(57046).up(0x23); after(56044).down(0x0A); after(58289).up(0x0A); after(238600).down(0x4A); after(51332).up(0x4A); after(226480).down(0x0A); after(87217).up(0x0A);
В данном примере на 138119й тик после сброса процессора нажата клавиша
0x23
, затем еще после 57046 тиков она отпущена. Потом через 56044 тика нажата клавиша0x0A
и так далее. Когда файл закончится, эмулятор перейдет в нормальный режим, но будет продолжать записывать все новые нажатия в исходный файл. -
NumPad .
- Загрузка бинарного файла в память. Откроется диалогData file
и можно выбрать файлcom
,rom
,bin
,rks
илиmem
.com
- загружаеся в область памяти0x0100
.rom
иbin
- загружается в область памяти0xC000
.rks
- загружается в область памяти указанный в самом файле - первые 4 байта файла отвечают за это: lo(START), hi(START), lo(END), hi(END). Затем идут данные. Последние два байта - контрольная сумма: lo(CRC), hi(CRC).mem
- загружается в область памяти0x0000
.
После загрузки файла в память, происходит
reset
процессора, загружается монитор (ЛИК или Специалист), а затем выполняется командаJXXXX
(ЛИК) илиGXXXX
(Специалист) для запуска программы, гдеXXXX
- адрес начала программы. -
NumPad *
- Ускорение/Замедление эмуляции. По умолчанию эмуляция происходит в реальном времени. При нажатии клавиши происходит максимальное возможное ускорение эмуляции. При повторном нажатии происходит возврат к реальному времени. -
NumPad +
- Плавное наращивание скорости эмуляции до максимальной. -
NumPad -
- Плавное уменьшение скорости эмуляции до минимальной.
Разновидность 1 для ПК "Специалист":
- 2 байта - адресс начала памяти (low byte, high byte)
- 2 байта - адресс конца памяти (low byte, high byte)
- массив байтов прпограммы длинной между началом и концом
- 2 байта - контрольная сумма (low byte, high byte)
Разновидность 2
- 4 байта - 0x70 0x8F 0x82 0x8F (префикс)
- 16 байт - 0x00
- 1 байт - 0xBC
- 2 байта - контрольная сумма (low byte, high byte)
- 255 байт - 0x00
- 1 байт - 0xE6
- 2 байта - адресс начала памяти (low byte, high byte)
- 2 байта - адресс конца памяти (low byte, high byte)
- массив байтов прпограммы длинной между началом и концом
В эмуляторе есть возможность генерировать Wave файлы. Тестовый класс WaveGeneratorTest
служит для генерации
wave для всех игр всех платформ.
В эмуляторе есть возможность дизассемблировать приложения. Тестовый класс DisassemblerTest
служит для генерации
asm файлов для всех игр всех платформ.
Для распознавания текста на экране используется класс PngScreenToText
. Пример использования в main
методе.
Возможна и обраатная процедура.
Так же логику работы изучить с помощью теста PngScreenToTextest
там есть примеры использования.
public static void main(String[] args) {
PngScreenToText scanner = new PngScreenToText();
// парсим картинку в текст
String parse = scanner.parse("./src/test/resources/IntegrationTest/testLik/smoke/7_exit.png");
// печатаем на экран
System.out.println(parse);
// 0 1 2 3 4 5 6 7 01234567
// 8 9 A B C D E F 89ABCDEF
// 9000: 00 00 00 00 00 00 00 00 ........
// 9008: 00 00 00 00 00 00 00 00 ........
// 9010: 00 00 00 00 00 00 00 00 ........
// 9018: 00 00 00 00 00 00 00 38 .......8
// 9020: 45 45 3D 05 09 70 00 00 EE=..П..
// 9028: 00 38 45 45 3D 05 09 70 .8EE=..П
// 9030: 00 00 00 38 45 45 3D 05 ...8EE=.
// 9038: 09 70 00 00 00 38 45 45 .П...8EE
// 9040: 3D 05 09 70 00 00 00 38 =..П...8
// 9048: 45 45 3D 05 09 70 00 00 EE=..П..
// 9050: 00 38 45 45 3D 05 09 70 .8EE=..П
// 9058: 00 00 00 38 45 45 3D 05 ...8EE=.
// 9060: 09 70 00 00 00 38 45 45 .П...8EE
// 9068: 3D 05 09 70 00 00 00 38 =..П...8
// 9070: 45 45 3D 05 09 70 00 00 EE=..П..
// 9078: 00 38 45 45 3D 05 09 70 .8EE=..П
// ===>
// * MOHИTOP-1M *
// ===>█
// сохраняем текст в картинку
scanner.draw(parse, new File("target/screen.txt").getAbsolutePath());
}
Для компиляции asm
в bin
используется класс svofski.Assembler
. Пример использования в main
методе.
Детали в Различные тесты CPU
From site: http://www.spectrum.lovely.net/
Jasper V1.1 is now available with the following enhancements:
- Screen updating is now much faster thanks to David Dawkins image handling tips.
- The class files have been shrunk to speed download times.
- Progress of snapshot loading uses a progress bar thanks to Adam Doppelt.
- The screen is double buffered for smoother display of games which use scrolling.
- Click on progress bar to toggle between Full and Slow speed (slow to 100%).
- Saving snapshots has been removed to save on class file size.
- The emulator has been updated to handle JDK1.1 as well as JDK1.02.
- Source code is now available for download.
- Jasper.class now replaces SpectrumApplet.class as the main class file.
For a Quick Start try out Manic Miner.
After seeing Jasper, a friend of ours, David Dawkins, decided to do an Atari ST Emulator. So far, it is looking very good. Look at his website for more details.
The Sinclair ZX Spectrum ( TS 2068 for those in the US) was a home computer released in 1982 by a British company called Sinclair Research Limited. The chip inside the Spectrum was a Z80 clocking in at 3.5Mhz, not quite the 1GHz of todays Intel machines. It only had 48Kb of memory, PC speaker style sound and only audio cassette tape for storage, but in the 1980's it was the business.
Due to demand, we've added a zip file to save downloading the .class files each time, jasp1_1c.zip. The source code is now available for download, jasp1_1j.zip. We haven't included any game snapshots with this so you'll have to download these yourself from ftp://ftp.nvg.unit.no/pub/spectrum/snaps/games .
With the old version you can convert between .z80 and .sna snapshot formats. Jasper automatically detects which type to load and saves by default as a .z80, unless you add a .sna extension to the end (PgUp/PgDn do LOAD and SAVE). LOAD and SAVE also work from within BASIC but are limited to 10 characters for the filename.
Gamelan say this applet is cool. Thanks to them and to everyone else who has sent us email, the response has been greatly appreciated.
The Java(tm) Centre, who I can't seem to find their web address anymore, have given us a "Golden Duke" award for this applet.
Java(tm) Review Service have rated us as a top 1% applet.
This version contains support for old Netscape/JDK implementations by providing a sleep statement every Z80 interrupt (5 milliseconds by default), so that other threads are not blocked. If you are running Internet Explorer 3.0 or Netcsape 3.0 then click on the "Speed: 100%, Sleep:5" text at the foot of the screen to speed things up.
If you click on the progress bar at the foot of the screen, it will speed up the emulator although on some systems you may find that this locks up your browser. If it works, subsequent clicks on the progress bar will toggle between Fast and Slow modes. In Fast mode the Spectrum will try to consume as much CPU time as it can, making the Spectrum run as fast as possible. In Slow mode if the Spectrum is running over 100% (faster than the original Spectrum) it will try to slow itself down to be closer to 100%.
The AMDProgressBar class was written by Adam Doppelt.
Comments: Adam Doppelt [email protected]
Comments: Adam Davidson [email protected].
From site: https://github.com/Arlorean/Jasper
A friend of mine originally wrote this emulator in 68000 assembler in order to play Steve Davies Snooker on his Atari ST back in 1988. He then ported it to 'C'. At this point I was keen to play Match Day with two players, each on their own Sun Sparcstation 1 that we used at University at the time in 1991. This was done using X-Windows windows on different displays while running the emulator as a server process updating the independent X-Displays.
Time then passed until Sun released their first version of Java in 1996 and I was hooked. I instantly started porting the 'C' code to Java and created an applet that could eventually run in a browser, if they were ever supported. Competition is a great thing. In 1997 Netscape and Internet Explorer both released browsers with Java applet support baked in. I took a week vacation and got the emulator up and running and it was slow as anything, unplayable on the 133Mhz Pentium that I had at the time. Shortly afterwards though the JIT compilers arrived and suddenly the applet ran in real-time (most of the time) and we decided to release it and put up a webpage. I tried contacting the orignal firms that wrote some of the games to ask if they were OK with us putting up a snapshot of their game on our site for people to play. Contacting companies that wrote software in the 1982-1986 timeframe was VERY hard. We got some OKs but many just ignored us. In the end we put up a selection of games and waited to see what would happen.
Surprisingly we were contacted by Sun Microsystem's lawyers with a cease and desist letter because we called in "Java ZX Spectrum Emulator"! Of all the companies I thought would complain, I didn't expect Sun to be one of them as they were trying to promote Java heavily at the time. We had to change the name to Jasper (JAva SPectrum EmulatoR).
The original browser applet APIs didn't really have support for sound in the way we needed it to emulate the ZX Specturm audio correctly so we never managed to get sound support in there.
Some other kind users have also uploaded the source code we wrote. Many thanks to them for doing that and keeping our names on the repositories.
From site: https://github.com/Arlorean/Casper
This is a C# port of Jasper (Java Spectrum Emulator) for .NET Standard (2.0.3) and Windows Forms. This project is a C# port of Jasper (Java Spectrum Emulator) for .NET Standard (2.0.3), Windows Forms (on .NET Framework 4.6.1), and now Blazor Server-side and Blazor Client-side (using WebAssembly) on .NET Core 3.1.
In 1982 the hugely popular home computer the Sinclair ZX Spectrum was created by Clive Sinclair. It seeded a generation of software developers and I owe my entire career to that one purchasing decision made for me when I was 12 years old. Thanks Mum!
In 1989 my friend Andrew Pollard created this emulator in Motorola 68000 assembly code in order to play Steve Davis Snooker on his Atari ST because he was disappointed in the Atari ST version.
In 1992 Andrew ported the emulator to C code and we then ported it to X Windows so we could play Match Day where each of us played on our own Sun SparcStation with the emulator essentially running as a backend server.
In 1996 Sun released their first version of the Java Develop Kit with the tag line write once, run anywhere. I was completely sold, especially when I saw their Web Browser implemention HotJava written 100% in Java with a new Java Applet model for running Java content inside a Web Browser. I could see that we could resurrent the emulator and port it to Java. Yes it would be slow, since the Java Bytecode was interpretted, but Just-in-Time (JIT) compilation was coming and I knew I couldn't wait.
In 1997 during the browser wars Netscape and Internet Explorer were both viaing to be the best Web Browser on the market and Java Applet performance was a differentiator for them. They both came our with JIT support for Java Applets around the same time and suddenly the Java Spectrum Emulator (Jasper) got a new lease of life. With JIT it ran in real-time on a 133Mhz Pentium in 16Mb RAM. We even got some interest from the press, Internet Magazine ran an article on our website in March 1997:
In 2019 in a bid to learn about Blazor I decided to ressurect the old emulator code again and port it to C#. I did a Windows Forms reference first so I could make sure things were working as they should be. Then I moved on to the Blazor version. I could see the same story of interpretted byte code initially with the promise of JIT or AOT (Ahead-of-Time) compilation hopefully making the Blazor WebAssembly version run in real-time once again.
I hit a roadblock straight away. The promise of Blazor was that you didn't have to write JavaScript, you could create an app, in the browser, with just C# code. However I couldn't see how to write a canvas object in C# without all the messy JavaScript interop which I really didn't want to deal with.
In 2020, Coronavirus lock-down has given us a lot of time for fun projects so I thought I'd revisit this one. Blazor (or Razor) is all about DOM manipulation but the HTML Canvas doesn't have a DOM, it's all immediate. However I realized that HTML Scalable Vector Graphics (SVG) does and so I set about creating a Blazor SVG version of the ZX Spectrum Emulator. Crazy, right?!
Andrew Pollard who created the original emulator code and painstakingly went through each Z80 Mnemonic checking that they functioned as they did in the original Zilog Z80.
Amstrad who now own the ZX Spectrum brand are the owners of the Spectrum.rom file, which is a copy of the original ZX Spectrum 16K ROM code. In a post on comp.sys.sinclair they requested this notice be attached whenever their ROM files were redistributed:
Amstrad have kindly given their permission for the redistribution of their copyrighted material but retain that copyright The font used on the web page is the ZX82 System Font by Paul van der Laan.
The Keyboard SVG was derived from a PowerPoint of the ZX Spectrum Keyboard by Magnus Krook.
The Manic Miner game was written by Matthew Smith and published by Bug Byte Software Limited in 1983.
From site: http://www.liaquay.co.uk/spectrum/index.html
Jasper - ZX Spectrum Emulator by Adam Davidson & Andrew Pollard hacked about by Philip M. Scull
Source for Hacked Jaster. Please note this is not an offical Jasper release. Hacked Jasper Source - Release 1.0
Visit the original jasper www.spectrum.lovely.net
Comments, complaints, congratulations to [email protected]
From site: https://github.com/begoon/jasper
This is a fork of the original version of Jasper 1.1j by Adam Davidson and Andrew Pollard. Previously it was available at http://spectrum.lovely.net/, but currently this website is unavailable.
Also this fork includes a fix allowing screen scaling using the pixelScale
variable.
From site: http://www.nedopc.org/forum
В принципе его как такового не было... 😉 И его так бы и не было, если бы я его не написал.
Исходники доступны ЗДЕСЬ.
К действию меня сподвиг вот этот довольно давно существующий проект: Jasper - ZX Spectrum Emulator by Adam Davidson & Andrew Pollard http://www.liaquay.co.uk/spectrum/index.html
Джентельмены Adam Davidson & Andrew Pollard люди не жадные и исходников своих не прятали. Исходники и сейчас доступны здесь: The source code is available online from http://www.odie.demon.co.uk/spectrum/jasp1_1j.zip. The AMDProgressBar class was written by Adam Doppelt. (специально проверил). Исходники весьма понятны и очень мне помогли при эмуяции ZX Spectrum на платформе J2M сотовых телефонов.
Задача очень культурно и неглупо разбита на классы:
- Z80.class - эмуляция процессора;
- Spectrum.class - эмуляция ZX Spectrum;
- Jasper.class - интерфейс с браузером и др.;
- AMDProgressBar.class - полоска внизу, позволяет регулировать скорость эмуляции и др., в принципе без неё можно обойтись, поправив коды.
И у меня всё это запросто работало под IE 5.0 без всяких претензий и с тройным запасом по скорости. Этого никак не скажешь о сегодняшних эмуляторах на JS:
- http://code.google.com/p/radio86/
- и вдохновляющий прототип http://jsspeccy.zxdemo.org/ И броузеры - им не броузеры, и скорости эмуляции как у спринтерских черепах...
Поскольку «Специалист» по идеологии очень близок к «ZX Spectrum», мне хотелось написать его эмулятор самому. По моим прикидкам это всё вполне осуществимо на основе имеющихся исходников.
Если Ленин хотел реорганизовать рабкрин, то здесь придётся в основном реорганизовать экран и карту памяти. 😉
Вижу я, что всё по жизни сам не успеешь - возможно кому-то этот проект будет интересен.
PS. Идеи глупо держать под подушкой, там они гниют и тухнут. Хороший слоган!: http://easy-coding.blogspot.com/ Поэтому, кому надо - вот исходники «Специалиста» на Java.
Please scroll up and read Intro.