На этот пост Стивена Хагга я наткнулся после того как начал читать его книгу: Making 8-bit Arcade Games in C, в ней был упомянут его блог и онлайн IDE для непосредственной разработки (игр) для всех этих z80-based машин.
Перевод публикуется с любезного разрешения автора.
(Он, кстати, упомянул о планах добавить ZX Spectrum.)
Сильно переработал код виртуальной машины и ассемблера — разделил собственно классы на Машину и Ассемблер и кроме того теперь виртуальная машина умеет выводить символы в консоль, а ассемблер поддерживает строки и множество данных в одном ключевом слове dw.
Программа теперь может выглядеть так:
PORT_CONSOLE = $FFFF ; символ для порта ввода-вывода консоли
sp = $0050 ; настроим стек
r0 = str1
[ sp ] =+2 pc ; запоминаем в стеке pc для возврата
pc = print ; вместе с предыдущей инструкцией - CALL
r0 = str2
[ sp ] =+2 pc
pc = print ; т.е. два раза вызвали процедуру print разных строк
exit dw 0 ; STOP полный останов программы
; процедура print, на входе r0 - указатель на ASCIIZ-строку
print r1 =? [ r0 ] ; MOV с обновлением FLAGS (carry и zero)
pc = [ sp ] @z ; если флаг нуля, то совершаем выход
[ PORT_CONSOLE ] = r1 ; в порт консоли выводим очередной символ
r0 =+1 r0 ; увеличиваем указатель на строку
pc = print ; цикл на начало процедуры
org $0050 ; начало данных для вывода
str1 dw "Hello, world!" 13 10 0
str2 dw "That's it." 13 10 0
и выводит она следующее (включая дамп памяти и регистров после выполнения):
Единственный пока порт ввода-вывода замаплен на адрес $FFFF (и вообще все порты ввода-вывода будут замаплены на последние ячейки памяти) и при записи в себя выводит символ в консоль.
Ключевое слово dw теперь может принимать строки в кавычках и много данных в одной строке программмы — они даже не разделяются запятыми, а только пробельными символами, так парсер даже проще.
Заодно демонстрация того как CALL имитируется двумя инструкциями — сперва в стек пишется адрес возврата через инструкцию inc_by_two и уже потом совершается переход.
RET в программе условный.
Я на Орельке в детстве доходил до орбитальной платформы. На эмуле после тренировок прошел всю. Щас опять прошел всю, со второй попытки. Вот Xecutor сложный, попробовал сейчас, жость.
Если кто-то подскажет другие цветные спектрумовские леталки-стрелялки с вертикальным скроллом, буду очень благода.
Цветные вертикальные шмупы на спектруме действительно вспоминаются с трудом, но они есть.
Из самой махровой классики это прекраснейший Xecutor
Из новоделов очень страный Slowglass
Неделя с публикации вроде прошла, и, если что, я определился с игрой. Но, я так понял, топик надо создавать в блоге «Игры», а у меня доступ только к «Мой персональный блог» и «Новости».
а вот попытка портировать Xenon Megablast — Axons
Перевод публикуется с любезного разрешения автора.
(Он, кстати, упомянул о планах добавить ZX Spectrum.)
Программа теперь может выглядеть так:
и выводит она следующее (включая дамп памяти и регистров после выполнения):
Единственный пока порт ввода-вывода замаплен на адрес $FFFF (и вообще все порты ввода-вывода будут замаплены на последние ячейки памяти) и при записи в себя выводит символ в консоль.
Ключевое слово dw теперь может принимать строки в кавычках и много данных в одной строке программмы — они даже не разделяются запятыми, а только пробельными символами, так парсер даже проще.
Заодно демонстрация того как CALL имитируется двумя инструкциями — сперва в стек пишется адрес возврата через инструкцию inc_by_two и уже потом совершается переход.
RET в программе условный.
Из самой махровой классики это прекраснейший Xecutor
Из новоделов очень страный Slowglass