Voldemar0 пишет:Может этот кусок просто не завершен автором?
Спрайта нет, вызова нет.
В том то и дело, что вызов процедуры есть во всех вариантах, кроме KOSM.FIL.
Процедура получает на входе число от 0 до 3, обозначающее направление, откуда прилетел снаряд. Есть табличка с 4 адресами, где должен рисоваться спрайт. Нужный адрес загружается в рабочие ячейки и спрайт рисуется.
Но во всех вариантах, кроме KOSM.FIL эта табличка содержит 4 штуки $FFFF. Поэтому спрайт рисуется в адреса $FFFF - $07FE. Поскольку процедура считает, что выводит спрайт на экран, то затирается не все подряд, а только 16 байт из каждой строки длиной 64 байта. И видимо это так удачно совпадает, что нужные для выживания программы адреса в нулевой странице и стеке не портятся.
Я не думаю, что это автор так убрал вывод спрайта. Он то должен был представлять, чем чреват вывод спрайтов в нулевую страницу и стек. Если у него был исходный код, то проще было бы просто убрать вызов самой процедуры. Похоже, это делал кто-то другой.
===
Вообще, у меня предположение, что эта игрушка подверглась восстановлению. То есть, когда-то давно, диск, на котором была записана игрушка, затерся. Игрушка практически перестала читаться. Владелец диска каким-то чудом загрузил игру в память, но, поскольку алгоритм подсчета контрольных сумм секторов слишком примитивный и 1/8 ошибок он просто не может увидеть, то местами прочиталось совсем не то, что должно было. Владелец диска оказался программистом и смог заставить работать то, что удалось прочитать. Дальше эта пропатченная версия широко разошлась.
Есть места, которые на это указывают. Например, начало программы - это 256 байт, из которых используется примерно 70. Похоже, кто-то просто приделал "запускатель", который чистит экран и дальше делает переход куда-то вглубь программы.
Спрашивается, зачем автору программы делать начало в одном месте, а продолжение - совсем в другом?
Еще странный ход: "запускатель" создает процедуру в памяти.
LDX #$05
CODE_1F27
LDA DATA_1F45, X
STA SUB_6000, X
DEX
BPL CODE_1F27
DATA_1F45
.byte $A9, $00, $20, $94, $FB, $60
Получается такой код:
SUB_6000
LDA #$00
JSR SUB_FB94
RTS
И по всему коду стоят вызовы SUB_6000. Спрашивается, зачем создавать процедуру в памяти? Почему сразу не поставить вызов $FB94?
Могу предположить, что просто кусок с адреса $6000 не прочелся и автор "запускателя" так "заделал" отсутствующий кусок кода.
Еще странный момент - это подсчет очков. Во-первых, при запуске игрушки он просто не выводится, пока не убьешь одного из роботов. Во-вторых, он идет не с нуля, а со значения, хранящегося в памяти. И никогда не обнуляется.
Очень странно, что башня неуязвимая. В чем тогда игра, если враги тебя победить не могут?
В общем, нет у меня уверенности, что игрушка именно так и задумывалась.