Еще раз о терминаторе, MOS 6502 и Ion Maiden

Давно уже я написал эту заметку, но на HYPE не выкладывал ввиду некой «несерьёзности».
Но после того как погрузился в программирование на MOS 6502 думаю что пришла пора так сказать разбавить серьёзность парой забавностей.

Во время просмотра стрима демо–версии ретро–шутера Ion Maiden глаз наткнулся на казалось бы знакомый фрагмент ретро–кода на ассемблере MOS 6502:


MOS 6502 — знатный представитель 8–битных процессоров, трудившийся в таких эпохальных машинах как Apple II, Commodore 64, Atari и Famicom/NES/Денди.

Типовой ассемблерный код для этого процессора щедро обсыпан инструкциями LDA, LDX, LDY, STA, STX и STY — от LOAD/STORE (сохранения и загрузки) соответствующих трёх регистров общего назначения A, X и Y. Но глаз мой зацепился за знакомое словосочетание "...MOVE DATA FOR VTOC..." в комментариях программы.

Судя по всему это отсылка к (уже тоже «ретро») фильму «Терминатор», где для пущей убедительности кадры со зрением из глаз самого бездушного киборга–ассасина из будущего были украшены высокотехнологичными на тот момент буквами и цифрами компьютерного происхождения.

Вот конкретный кадр, который и вызвал этот факт из моей памяти:

Давно уже я читал в разных местах, что это были листинги ассемблерного кода для компьютера Apple II, но в этот раз решил разобраться поосновательнее и докопался до полного разбора полётов в следующем видео (на английском языке):

Оказалось, что подавляющая часть листингов и таблиц были взяты из компьютерного журнала Nibble — конкретно августовского и сентябрьского выпусков 1984 года. Вышеприведённый фрагмент это кусок кода драйвера RAM–диска с названием Ram.Disk.64 или NEWRAM (то самое сокращение VTOC — это Volume Table Of Contents, а AUXMEM — дополнительная память в которой оно всё и размещается). Кроме того использованы коды программы HIRESEX (Hi–Res–Ex, а не Hire Sex!), выводящей картинки на экран, выводы программ MON.E и Key Perfect 4.0 (последняя использовалась чтобы проверять корректность машинного кода с помощью сверочных кодов и выводила в терминаторе она сверочные коды для файла OVLY.OBJ).

Использовалась даже таблица параметров орбит нескольких советских и одного западного искусственных спутников Земли!

Конечно сейчас это воспринимается комично — неужели тот самый терминатор был 8–битным и работал с RAM–диском в десятки килобайт? Или он, попав в прошлое, разграбил где–то по пути компьютерный магазин и фетишировал на своих доисторических предков?

Так или иначе, если всмотреться в код из игры Ion Maiden, то легко заметить, что он хоть и похож на код из терминатора, но им не является. Это что–то другое.
Заинтересовавшись я начал его анализировать и пришёл к выводу, что это скорее всего набитая «с потолка» отсебятина, напоминающая код для MOS 6502, но по сути являющаяся бессмыслицей.
Так, например, первые строки кода в терминаторе:
LDA #<VTOC
STA A1
LDA #>VTOC
STA A1+1

загружают в аккумулятор и потом сохраняют в параметр A1 верхний и нижний байты адреса пересылаемого блока для процедуры AUXMOVE (# означает, что данное будет зашито в инструкцию, иначе оно бы воспринималось как адрес откуда данное надо взять, а > и < уже означают нижний и верхний байты адреса) — она пересылает куски байт между основной памятью и расширенной (замапленной на последние 8Кб памяти со страничным переключением — AUXMEM собственно).
Так вот, в коде из Ion Maiden происходит бессмыслица:
LDA #!PROC
STA $314
LDA #!PROC
STA $315

Во первых — в ассемблере 6502 знак! означает, как я понял, либо признак десятичной системы исчисления перед числом, либо двоичную операцию XOR и его использование в этом месте является бессмыслицей. Во вторых два идентичных значения #!PROC в те времена, когда экономился каждый байт никакой программист не грузил бы в аккумулятор, это просто расточительно, достаточно было одного, первого LDA. В третьих — PROC это адрес процедуры идущей ниже по коду и в 8–битный аккумулятор оно просто не влезло бы. В общем похоже, что это просто набросанное нечто просто по мотивам реальных исходников.

Интересно даже зачем — неужели создатели игры боятся каких либо претензий правообладателя?

11 комментариев

avatar
Эта заметка писалась когда еще Ion Maiden не была переименована в Ion Fury.
Это же надо было прикопаться к такому.
Маркетологи рок-группы по моему пробили днище из днищ.
avatar
Очень хороший рисерч. Одобрено дедом!
avatar
Если это перевод оригинального материала — дай ссылку на оригинал, проставь тег ПЕРЕВОД и укажи это явно в начале текста.
avatar
Оригинал это видео которое имплантировано в текст. Сам текст же не является переводом поскольку на 3/4 состоит из другого текста нежели говорит голос в видео.
avatar
«Оригинал» тут в кавычках должно быть написано.
avatar
А почему вообще такой вопрос возник? Что-то странно. Неужели кто-то меня уже на английский переводит и возникают вопросы с авторством даже?
avatar
Ну так дед то не дремле, реально следит! Просто не забывай добавлять ссылки на все источники заимствования, как по тексту, так и в конце материала.
avatar
Вскрывается, что это как минимум фрагмент звукового драйвера на Commodore 64 воспроизводящий небольшой фрагмент по адресу DATA на звуковом чипе SID. Так JMP $EA31 это передача управления в KERNAL для штатной обработки прерывания от видеочипа (т.е. 60 раз в секунду), а $D4xx — это порты SID. Есть вероятность, что это суперскрытая пасхалка, т.к. мне лично гугл на «Ion Maiden hidden music Commodore 64» ничего не выдаёт осмысленного.
avatar
P.S.
Точно: csdb.dk/release/?id=182055
Это пасхалка в квадрате — тут и отсылка к терминатору и код на Commodore 64 воспроизводящий на двух нотах мелодию из Duke3D.
avatar
В общем дошли руки скачать образ который создал Mr.Mouse/Xentax из ссылки выше и загрузить это дело в эмулятор Commodore 64:
И вот он результат:

Погуглив еще обнаружил, что адреса $0314-0315 куда процедура SETUP сохраняет адрес PROC это ничто иное как адрес процедуры обслуживания прерывания IRQ в Commodore Basic и поэтому в видео видно, что бейсик спокойно сосуществует с этой подпрограммой как с TSR.
Осталось только так и непонятым мною почему в листинге из игры используется некий оператор! и как он должен работать, но в реализации от Mr.Mouse он логично заменён на взятие нижней и верхней половины адреса < и >. Так же там все .dword заменены на .byte.
Возможно если бы не эти затуманившие мне мозг вещи я бы и сам смог докопаться до истины ранее. Так или иначе — пасхалка супер!
Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.