Сокобан для Радио-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

Комментарии