Сокобан для Радио-86РК
Все-таки я не удержался и решил воспользоваться уровнями для Сокобана, выуженными из досовской программы “pusher.exe”. Сокобан было решено написать на ассемблере Intel 8080 и запустить на Радио-86РК.
Знаю-знаю, зачем откапывать стюардессу, да еще и по второму разу и все такое, но все же.
Тут все по-взрослому. Уровни лежат запакованные, и распаковываются на лету.
Конечно, исходник писался и компилировался не на РК, а туда заливался только готовый бинарь. Это сильно упростило задачу. Хотя для полной аутентичности надо было писать и ассемблировать на самом же РК. Как-нибудь в другой раз.
Я, если честно, давно не писал на ассемблере что-то длиннее пары десятков строк, поэтому сначала было странное ощущение. Потом вспомнилось, что лучше в подпрограммах всегда сохранять регистры, не гнаться чрезмерной компактностью кода (по крайней мере сначала), и все пошло на лад.
Ассемблер, особенно старый, где нет разных свистелок типа деления, заставляет подумать о том, что реально требуется, и отбросить обобщения типа “мне это пригодится потом”. Например, подпрограмма вывода аккумулятора в десятичном виде. Так как значения могут быть только от 0 до 59 (00-3B), номер уровня, я решил сделать кондово: посчитать сколько раз удастся вычесть 10 – это будет первая цифра, а результат перед последним вычитанием будет второй цифрой.
print_dec:
push psw
push b
mvi b, 0ffh
print_dec_loop:
inr b
sui 10
jp print_dec_loop
adi 10
push psw
mvi a, '0'
add b
mov c, a
call monitor_putchar
pop psw
adi '0'
mov c, a
call monitor_putchar
pop b
pop psw
ret
Исходник лежит в составе проекта “Эмулятор Радио-86РК на Maximite”. На нем же я записал небольшой видос.
Disclaimer