ZX Spectrum
Game

128 Animation

ZX Computing (Великобритания),

Автор:

Жанр: Утилиты: Визуализация


Доступные версии

 Неофициальное издание
Играть!

Язык

  • Русский
  • English

Управление

  • Клавиатура(?)

Игроков

  • Один
  • Описание
  • Описание (авт.пер.)
  • Информация

128 АНИМАЦИЯ

от ZX Computing, декабрь 1986

Тони Бейкер показывает, как 128 в дополнительной памяти

могут быть использованы для супер гладкой мультипликации.

Поскольку я сижу здесь, в моем экране телевизора Ищу в удивительной эффект, который

Я не думал, что это возможно только несколько месяцев назад.

многогранная шипами форма вращается перед моими глазами, принимая около пять секунд для каждой революции. Форма – которые могут быть только адекватно описывается как первый-звездообразный додекаэдр – рисуется как рамки, так что я могу видеть заднюю часть формы, а также Передняя. Это довольно невероятно – но красивая.

Но, что самое удивительное из всего, что эффект быть

производится не кто иной, ZX Spectrum! Секрет кроется в Огромные неосвоенные ресурсы памяти на Spectrum 128, что делает его можно хранить целые экраны, и вызывать их в определенной последовательности. Полный экран высокого разрешения анимация наконец можно.

Еще более удивительным является знание того, что основная программа, которая

обратил отдельные кадры был сбит в несколько часов.

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

Карта памяти

Чтобы понять, как работает программа, необходимо знать все о

организация памяти на Spectrum 128. Это очень простой, так что я должен теперь объяснить. Память на 128 устроена СТРАНИЦЫ. Есть восемь таких страниц, пронумерованных от нуля до семи, и каждая страница памяти содержит 16К. Следовательно, мы имеем 16 * 8 = 128К памяти в целом. Кроме того, существуют два ПЗУ, но они не являются важно, насколько эта программа обеспокоен.

Адреса в памяти выгружаемого начнется в C000 и заканчиваются в FFFF. Таким образом, для каждого

страница памяти адреса перекрываются. Адрес CDEF на странице нуль не то же самое, адреса CDEF на первой странице. Они отличаются Места, несмотря на то, тот же адрес. Как же это возможно доступ ко всем этом память, если это все накладывается поверх себе с тем же адресом со ссылкой на любой из восьми страниц?

Ответ методика называется ПЕЙДЖИНГ. Только одна страница 16K может быть

“Выгружен в” одновременно. “По стр в” означает, что страница может быть доступна – это может быть заглянула или ткнул или использовать в обычном порядке. Если страница не По стр в то оно не может быть доступна на всех (только с двумя исключениями – Который мы придем к более поздней).

Поскольку адреса перекрываются, только одна страница может быть выгружен в на

Время. Во все времена, одна из страниц будет выгружен в. При использовании компьютер нормально, либо в BASIC или машинный код затем страницу нулю будет выгружен в, и это важно для любого машинного кода программы к восстановить страницу нулевой, прежде чем вернуться в базовый.

Как традиционные машино codeists будет знать, память на Spectrum по-видимому, начнется в 4000h и идут непрерывно вплоть до FFFF, а затем остановится. Ниже 4000h является ROM, или, по крайней мере, один из дисков! Но оказывается это оперативное слово. Память организована в восьми 16K страницы, как я говорил, и появление сплошного протяжения RAM от 4000h до FFFF является иллюзией 48К, и все это привело к по аппаратной, а не программного обеспечения.

Страницы

Первый кусок памяти работает от 4000h до 7FFF. Этот блок находится в То, RAM страница пять! Второй кусок бежит от 8000h до BFFF – это RAM страница два! Последний кусок, который проходит с C000 до FFFF является RAM страница нулю. На практике это означает, что если вы страницы в RAM пятой странице то адреса C000 для FFFF будет доступ точно такие же ячейки памяти как адреса 4000 до 7FFF. POKEing адрес в диапазоне C000 в FFFF фактически POKE соответствующий адрес в диапазоне от 4000 до 7FFF. Аналогичным образом, если вторая страница будет выгружен в то выглядывал адрес в диапазоне C000 на FFFF будет PEEK соответствующий адрес в диапазоне от 8000 до BFFF. Таким образом, появление непрерывности поддерживается. Для машинного кода программиста это означает, что страницы два и пять являются особенными. Они, кажется, фиксируется в памяти, и есть фиксированные адреса меньше, чем C000. Страницы двух до пяти, на самом деле, всегда выгружен в, и это является преимуществом.

Page пять особенный по-другому тоже – более привычным способом. Это сохраняет экран. POKEing адрес в диапазоне от 4000 до 57FF (или адрес в диапазоне C000 для D7FF когда страница пять будет выгружен в) будет непосредственно POKE экран. Это вы знаете, но Spectrum 128 имеет не один, а два памяти отображаются экраны. Давайте на некоторое время исследовать эту концепцию.

Экраны

Есть два экрана, но только один из них может быть видна на экране телевизора

в любой момент времени. Обычно это экран нулю. Экран нулю, как говорят, быть ACTIVE когда его содержимое на экране телевизора появляется, а так же экран один, как говорят, ACTIVE, когда его содержимое на экране телевизора появляется. Экран один хранится в странице семь, и это аппаратное проявление, не программное обеспечение один, так что вы не можете изменить местоположение экрана одного. Таким образом страница семь особенного тоже. Места C000 в D7FF хранить байт экрана, в то время как локаций D800 до Дафф хранения атрибуты, но помните, что эти адреса относятся к ОЗУ страницу семь, не в ОЗУ страницу нулевой, так что это не достаточно, чтобы ткнуть адреса. Страница семь должны быть выгружен в первую очередь.

Насколько экраны, то она не имеет никакого значения

какая страница выгружен в. Экран нулю или экран один может быть активным независимо от какой бы странице ОЗУ выгружен в. Только один экран может быть активным в то время (довольно очевидно), и невозможно деактивировать оба экрана сразу – это либо один или другой воли всегда показывать по телевизору.

Это означает, что можно создать анимацию немерцающий! Если

Вы рисуете на экране одного в то время как экран ноль активна только тогда экран нулевой появится на экране. После того, как рисунок будет завершена, то вы может активировать экран один и телевизионная картинка будет меняться мгновенно !!! Теперь, с экрана один активный, вы можете нарисовать на экране нулевой – только экран один (ранее готовый рисунок) будут показывать по телевизору. Когда этот рисунок будет завершена, вы можете активировать экран нуля. Еще раз Изображение на экране телевизора будет мгновенно менять, не мерцание бы то ни было. Это, Затем, это принцип моей программы.

Когда мы пишем Spectrum 128 адресов вниз это принято использовать пять значное шестнадцатеричное число, а не четырехзначный номер. первая цифра обозначает количество ОЗУ страницы. Таким образом, я мог однозначно относятся к решению шариков на странице четырех качестве адреса 48EAD. Это будет отличие, скажем, 6BEAD, который относится к решению шариков на RAM страница шесть. В то время как набор инструкций машинного кода делает его нельзя отнести к таким местах непосредственно (например, LD, (4C000) является невозможно) тем не менее, полезно обозначение мы, люди.

В этих обозначениях мы могли бы сказать, что экран один занимает адреса 7C000 в 7DAFF включительно (в том числе байт атрибута).

Это обозначение имеет и свои недостатки. Потому RAM страница пяти является

постоянно отображается в в 4000 в 7FFF то мы можем описать Положение экрана нулевой в одном из двух различных способов – либо как 4000 в 5AFF, или как 50000 в 5DAFF. Оба этих описаний см же участок памяти.

Для полноты я должен добавить, что есть также два 16K диски,

хотя, как уже говорилось, диски на самом деле не актуальны для этой программы. Два диски занимают по-адресам 0000 в 3FFF, так, как с ОЗУ страниц, только один диск может быть выгружен в за один раз. Использование Такое же соглашение, как и для оперативной памяти страниц мы можем однозначно указать диск обратиться в пяти значным шестнадцатеричным числом, так что 01234 относится к решения 1234 в ПЗУ нулевой, в то время как 11 234 относится к решению 1234 в ПЗУ один. Неожиданно оказалось, что диск, который по-видимому, выгружаемого в нормально (Которые вы можете PEEK либо из BASIC или машинный код) на самом деле ROM страница ONE, не равна нулю. Этот диск является таким же, как старого ПЗУ 16К, который был присутствует на 16К и 48К Спектры, только с несколькими изменениями.

Хватит дисков – давайте вернемся к оперативной памяти страниц и экранов. Как именно

Вы страница них? Ответ инструкция OUT, и новая система Переменная называется BANK_M. Его адрес 5B5C (или 5DB5C держать твердить на примерно такой же точки снова и снова). Рисунок один объясню именно то, что каждый из его битов для. В машинном коде можно изменить RAM страницу или изменить какой экран активен, по простой Процедура загрузки до н.э. с 7FFD, загрузка регистра со значением построены из рис одном, а затем выполнив два шага – в этом Порядок: (Я) Храните значение из зарегистрируйтесь в системной переменной (BANK_M); (Б), то использовать машинный код инструкции OUT (C), A.

Порядок последние две инструкции важно. Если поставить эти неправильный путь вокруг, то система пойдет не так, если прерывания происходит между двумя инструкциями – это наоборот, это вполне безопасно. Кроме того, можно изменить ROM страницу с помощью этого метода, но прерывания должна быть отключена, пока последние две инструкции выполняются в этот случай.

Рисунок 1. Смысл битов системной переменной BANK_M на

адрес 5B5C. Когда выход к порту 7FFD изменится страницы следующим образом:

 — — — — — — — —

| | | | | | | | |  — — — — — — — —

\ ___ ___ / | | | \ _____ _____ /
    | | | | |
    | | | | |
    | | | | \ ——– Биты 2,1,0 = RAM страница в настоящее время выгружен в
    | | | \ —————- Номер бита 3 = экран настоящее время активно

    | | \ Бит 4 = ROM число в настоящее время выгружен в     | \ Бит 5 = Должен быть сброшен всегда     \ Биты 7,6 = Не используется

М / С

Программа использует все эти методы. Машинный код

Программа чрезвычайно проста, при условии, вы понимаете, экран и пейджинговая система, что я только что описал. Я достиг анимация, сохраняя двенадцать полных экранных изображений на протяжении подавляющее Распространение доступной памяти. Байты атрибутов в данном случае не являются сохранены, так как они одинаковы для каждого кадра, но вы могли бы адаптироваться Программа для хранения атрибут байт, а без каких-либо затруднений. Я сохранили два полных кадров на RAM страниц ноль, один, два, три, четырех и шести. Я не использовал страницу пять, потому что страница пять содержит Экран нулю, а основная программа, наряду с системными переменными, стек машина (в соответствии с инструкцией BASIC CLEAR) и так далее. Я не используется страницу семь, потому что страница семь содержит экран один с целый ряд новых системных переменных и прочее. Четные кадры хранятся в адресной C000 на соответствующей странице, а нечетные кадры хранятся в адресной D800 на той же странице.

К сожалению, это не представляется возможным использовать машинный код LDIR

инструкция передавать байты из одной страницы памяти в другую, если обе страницы имеют одинаковые адреса. Например предположим, что было кадр сохраняется по адресу 4C000, и я хотел бы передать его для решения 7C000. Инструкция LDIR не возможно. Вполне возможно, чтобы загрузить один байт, в то время, если вы измените страниц между принести и магазин, а затем снова после этого, но это занимает феноменально долгое время в условиях машинного кода. Чтобы обойти эту проблему Я использовал временный буфер по адресу 6800 (то есть 5E800).

Приведенный выше пример будет решена подкачки в четвертой странице, используя LDIR передавать кадр из 4C000 до 6800, а затем поискового вызова в странице семь и с помощью LDIR еще раз – на этот раз для передачи из буфера в 6800 до 7C000.

Машинный код состоит из трех частей. Он хранится по адресу B000,

что соответствует решению 2F000. Следует отметить, что хотя две страницы находится в Дело в том, используемая для хранения экранов, эти экраны занимают местах 2C000 для 2EFFF только. Места над этим являются бесплатными для машинного кода и воли не затирают различных кадров.

Страница

Первая часть кода называется PAGE_A (адрес B001). Он страницы

в требуемом RAM странице и активирует необходимый экран, как указанный регистр A, но без изменения текущего диска.

Это довольно скучно просто. Вторая часть кода является STORE_FRAME (Адрес B011) и вызывается из BASIC для передачи изображения В настоящее время на экране (экран нулю, что является – обычный экран используется по BASIC) в его конкретном месте в памяти. Последний кусок кода называется ЖИВОЙ (адрес B03D), и именно это программа, которая оживляет двенадцать сохраненные кадры в размере двенадцати кадров в секунду. Это Скорость совершенно без мерцания и дает одну секунду непрерывной полный экран сыпучий движение. Если двенадцать кадров разработаны повторять в цикле, как в моем примере, то у вас есть цикл непрерывное движение, которое продолжается вечно. К счастью, моя программа делает позволяют вырваться нажатием BREAK.

BASIC, который я включил это пример того, как использовать

Анимировать рутину. Внешняя ДЛЯ / NEXT петли, ДЛЯ I = 0 до 11, привлечет довольно симпатичный геометрическая фигура из двенадцати разных углов. Линия 320 будем называть машинного кода STORE_FRAME рутину, которая будет хранить каждый представить в памяти, как только он обращается. Наконец, линия 340 будет звонить Анимировать процедуру, чтобы установить изображение в движении. Вы можете адаптировать, или даже изменить основной программы в целом, если вам нравится. Наиболее впечатляющим что вы могли бы сделать, чтобы создать двенадцать полных фотографии экрана с помощью программы арт студио, и сохранить их на ленте, как только они обращается. Тогда вы можете переписать мою основную программу, чтобы просто загрузить экран изображения с ленты и хранить их в памяти по одному, как они были загружены.

Эта программа является довольно интересным из машинного кода точки зрения,

и весьма внушительны с визуальной точки зрения. Это мое предложение для зимнего солнцестояния – представить вам все (или, по крайней мере, те из Вы, кто не собрали Spectrum 128 – Плюс Двойки прямо сейчас и вам никогда знаю – вы можете получить один в подарок в этом сезоне). Счастливый Solstice все.

# B000 00 FRAME_NO DEFB # 00

# B001 4F PAGE_A LD C, A; C: = нужная страница / номер экрана # B002 3A5C5B LD, (BANK_M);: = текущая страница / номер экрана # B005 E6F0 И # F0 # B007 B1 ИЛИ С # B008 01FD7F LD BC, # 7FFD; BC: = порт reqd изменить страницу / SCR # B00B 325C5B LD (BANK_M),; магазин новая страница / экран # B00E ED79 OUT (C), # B010 C9 RET

# B011 1100C0 STORE_FRAME LD DE, # C000; DE: = адр из четных кадров

# B014 3A00B0 LD, (FRAME_NO);: = номер кадра для хранения # B017 F5 PUSH AF # B018 CB3F SRL; Разделить на две # B01A 3002 JR NC, ST_FR_2 # B01C 16D8 LD D, # D8; DE: = адр из нечетных кадров # B01E FE05 ST_FR_2 CP # 05 # B020 2001 JR NZ, ST_FR_3 # B022 3C INC; Обратите внимание, что страница 5 должны быть пропущены # B023 CD01B0 ST_FR_3 ЗВОНОК PAGE_A; Выбор страницы RAM / Screen нулю # B026 210040 LD HL, # 4000; HL: точки на экран нулю # B029 010018 LD BC, # 1800 # B02C EDB0 LDIR; экран Хранить в памяти # B02E AF XOR;: = 00 # B02F CD01B0 ЗВОНОК PAGE_A; Восстановление RAM страница нуля / Screen нулю # B032 F1 POP AF;: = номер кадра # B033 3C INC;: = следующий номер кадра # B034 FE0C CP # 0C # B036 2001 JR NZ, ST_FR_4; Перейти если все кадры не сохраняются # B038 AF XOR; В этом случае начать снова # B039 3200B0 ST_FR_4 LD (FRAME_NO),; магазин новый номер кадра # B03C C9 RET; возврат

# B03D 3E07 ЖИВОЙ LD A, # 07

# B03F CD01B0 ЗВОНОК PAGE_A; страница Магазин RAM 7 / Screen нулю # B042 210058 LD HL, # 5800; HL: указывает на свойства файла # B045 1100D8 LD DE, # D800; DE: точки на экран 1 атрибуты # B048 010003 LD BC, # 0300 # B04B EDB0 LDIR; Копировать атрибуты в экране 1 # B04D 76 ANIM_LOOP HALT; Дождитесь следующего кадра # B04E 2100C0 LD HL, # C000; HL: = адр из четных кадров # B051 3A00B0 LD, (FRAME_NO);: = номер кадра для отображения # B054 F5 PUSH AF # B055 17 РБА # B056 17 РБА # 057 17 РБА # B058 E608 И # 08 # B05A 4F LD C, A; C: = 00 (даже кадры) или 08 (нечетная) # B05B F1 POP AF # B05C F5 PUSH AF # B05D CB3F SRL;: = номер страницы, на которой этот                                               кадр сохраняется # B05F 3002 JR NC, ANIM_2 # B061 26D8 LD H, # D8; HL: = ADDR из нечетными номерами кадров # B063 FE05 ANIM_2 CP # 05 # B065 2001 JR NZ, ANIM_3 # B067 3C INC; Обратите внимание, что страница 5 должны быть пропущены # B068 B1 ANIM_3 ИЛИ С; Включение экрана немного # B069 C5 PUSH BC # B06A CD01B0 ЗВОНОК PAGE_A; Выбор страницы памяти, на которой кадр                                              ; Хранится, и либо экран 0 (даже                                              ; рамы или экран 1 (нечетные кадры) # B06D 110068 LD DE, # 6800 # B070 010018 LD BC, # 1800 # B073 EDB0 LDIR; Копировать кадр в буфер # B075 C1 POP BC # B076 79 LD A, C; A: = 00 (эвенов) или 08 (шансы) # B077 0F RRCA # B078 0F RRCA # B079 EE07 XOR # 07 # B07B B1 ИЛИ С;: = 07 (эвенов) или 0D (шансы) # B07C CD01B0 ЗВОНОК PAGE_A; Ибо даже кадров экран выбора 0                                              И RAM страница 7; для нечетных кадров                                              ; Выберите экрана 1 и RAM страницу 5 # B07F 210068 LD HL, # 6800; HL: указывает на копию кадра                                              ;-Дисплей # B082 1100C0 LD DE, # C000; DE: = адрес экране (Обратите внимание, что                                              ; Адрес C000 на RAM странице 5 является                                              ; Так же, как адрес 4000 нормально) # B085 010018 LD BC, # 1800 # B088 EDB0 LDIR; Скопируйте кадр в экран                                              ; Не отображается # B08A F1 POP AF;: = номер кадра # B08B 3C INC;: = следующий номер кадра # B08C FE0C CP # 0C # B08E 2001 JR NZ, ANIM_4; Перейти если не отображается все кадры # B090 AF XOR; В этом случае начать снова # B091 3200B0 ANIM_4 LD (FRAME_NO),; магазин новый номер кадра # B094 CD541F ЗВОНОК BREAK_KEY; нажата ли клавиша BREAK?

# B097 38B4 JR C, ANIM_LOOP; Loop назад для отображения следующего кадра                                              ; Если не нажата ПЕРЕРЫВ # B099 AF XOR # B09A CD01B0 ЗВОНОК PAGE_A; Восстановление RAM страница 0 / Screen 0 # B09D CF RST # 08; Создать отчет об ошибке

# B09E 0C DEFB # 0C; “D ПЕРЕРЫВ – CONT повторяет”

Играйте в 128 Animation онлайн. Утилита для визуализации, которую подарил миру Toni Baker, была издана творческой группой ZX Computing в 1986 году в Великобритании.

Не запускается или глючит игра, или не можете пройти? Спросите в комментариях.

avatar
  Subscribe  
Уведомлять об
 

Сохранённые игры[X]

  

Справка[X]

Помощь уже в пути!

Не забывайте периодически сохранять игровой прогресс на сервере (клавишей F8), чтобы уверенно продвигаться вперёд!

Если вы гость на сайте, то прогресс будет сохранён только в памяти браузера и потеряется при закрытии. Чтобы этого не произошло - просто войдите в свой профиль.

Для загрузки сохранённой игры жмите F3 или откройте меню "Диск" кнопкой на правой панели.

Если игра не запускается, или у вас есть вопросы по игре - задайте их ниже.

Помощь

Размер

  • x1 [256x192]
  • x2 [512x384]
  • x3 [768x576]
  • Полный

Диск

Кликни в окно эмулятора, чтобы управлять!
<<<<
Close