Все-таки я не удержался и решил воспользоваться уровнями для Сокобана, выуженными из досовской программы “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”. На нем же я записал небольшой видос.