Из всех клонов специалиста только у эрика можно организовать (за счет палитры) аппаратную двойную буферизацию.
Вид для печати
Из всех клонов специалиста только у эрика можно организовать (за счет палитры) аппаратную двойную буферизацию.
Эх... Эрик слишком редкая машинка, чтобы конкретно на неё ориентироваться.
В описании сказано, что страницы 64 кб:
В общем, какая-то корявая конфигурация памяти получается у Специалиста МХ. Если рассматривать её применительно к Prince of Persia, то я с трудом представляю, как эту дополнительную память вообще можно эффективно использовать, если предположить, что объём оригинального исполняемого кода в 48 Кб будет соответствовать объёму коду порта i8080/Z80. То есть всё пространство пользовательского ОЗУ будет занято исполняемым кодом. Далее идёт видеоОЗУ и небольшой хвост. Придётся постоянно щёлкать страницами и мелкими порциями перекидывать данные графики игры с одного места на другое.Цитата:
Кроме страницы ПЗУ, "Специалист MX" имел от 1 до 8 страниц дополнительного ОЗУ используемого под RAM - диск. Объём каждой дополнительной страницы ОЗУ - 64 кБайт.
Да, и это тоже. Но ivagor предлагал теоретические варианты как можно перед запуском игры настроить синхронизацию. Ну и в общую копилку ограничений: у Специалиста отсутствует какая-либо возможность узнать цвет пикселя на экране, можно только узнать зажжён он или потушен.
Всё говорит о том, что Специалист - это не игровой компьютер. Но всё равно, он остаётся моей первой любовью ;)
На Специалисте ещё всё более запутано, чем кажется с первого взгляда. Мы пишем в порт номер текущего цвета и далее всё, что будет записано в любую область видеоОЗУ будет рисоваться этим цветом. Чтобы поменять цвет, мы снова пишем его в номер в тот же порт и т.д. Предположим, что у нас есть фон в виде шахматной доски с красными и синими клетками, а по этому фону бегает зелёный квадрат. Чтобы рисовать зелёный квадрат нам нужно знать какой под ним цвет фона в данный момент, чтобы выставить правильный цвет и выдавать его в порт. Если бы могли получать цвет фона прямо с экрана - это было бы гораздо проще. Сейчас же нам придётся постоянно обсчитывать клетка какого именно цвета находится под квадратом. А если это не клетка, а какой-то сложный цветной фон, составленный из тайлов?
Я только один раз работал с цветом на Специалисте, при переносе Batty со Спектрума. И там я намучился, конечно, с этой схемой. Batty организована таким образом, что в памяти хранится копия Спектрумовского экрана с его атрибутами. И вот текущий цвет я узнавал как раз из атрибутов этого теневого экрана.
Мне больше всего понравилась версия для Macintosh, в неё как то можно под виндой поиграть?
В браузере можно попробовать на Archive.org
Apple II
https://archive.org/details/prince_o..._san_inc_crack
Macintosh
https://archive.org/details/PrinceOfPersiaMacintosh
Могу ошибаться, но похоже, что все порты на разные платформы делались "по мотивам" оригинальной игры, согласно авторскому описанию. Тем интереснее было бы получить точный порт игры, уже полагаясь на авторские исходники. Мне эта идея очень интересна на данный момент, но я один совершенно точно не потяну. Опять же, для меня Prince of Persia является особенной игрой, а для большинства - это одна игра из тысячи. Да и сложно сейчас кого чем-то заинтересовать. Тем не менее было бы интересно переписать все основные алгоритмы для процессора i8080, что позволило бы быстро адаптировать игру для целого ряда советских платформ и даже получить новый вариант для ZX Spectrum.
Или наваять нечто вроде cannonball (переписанный на C движок аркадного outrun)
Вкратце. Код копирует данные из 4 источников в 4 приёмника, по 6 байт. Теперь попробуйте перевести это покомандно и "в лоб" на z80 так, как это делала бы автотрансляция.Код:LDY #0
COPY:
LDA SRC1,Y
STA $8000,Y
LDA SRC2,Y
STA $8010,Y
LDA SRC3,Y
STA $8020,Y
LDA SRC4,Y
STA $8030,Y
INY
CPY #6
BNE COPY
Простейшая строка 6502 кода, загружающая индексный регистр, превратится в 4-5 строк кода на z80.
Автоматическая трансляция очень сильно раздует и затормозит код. Без осмысления кода и переписывания его под свой процессор, задачу не решить.
Libor Lasota начинал делать версию для PMD-85, потом был перерыв и недавно продолжил. В декабре выложил видео интры. Интра играется из внешнего модуля пзу. На его канале есть и более старые видео про PoP. Если кто и сделает принца для 8080, то скорее всего Libor.
Результат работы впечатляет!
https://www.youtube.com/watch?v=lK-x9by4n6c
https://www.youtube.com/watch?v=QvIU9D6S2_g
grf, а что вы думаете насчёт порта на Союз-Неон?
Процессор пошустрее чем на БК - 8 МГц 1806ВМ2 с командами EIS, графику можно выбирать - 1/2/4/8 бит на точку, памяти от 512 КБ.
Графика до 832 x 300, но обычно используется окно нужного размера.
Есть уже два эмулятора - Титуса и мой.
Собирать можно под Windows, используя эмулятор RT-11 в консоли. Можно под Линукс построить кросс-платформенный тулчейн.
Честно говоря, Принц мне поднадоел пока я его делал для БК, наконец-то можно заняться другими играми )
А где можно взять доку по этой машине, где описывалась бы организация памяти/видеопамяти и т.д.?
Спасибо, поизучаю.
Прямо произвела на меня впечатление демка от Libor Lasota. Не ожидал, что Принц будет настолько круто выглядеть при однобитной графике. Снова полез в исходники оригинальной игры, чтобы поизучать их и прикинуть что к чему. Начать изучение думал с вывода оригинальной заставки. Задача довольно простая, плюс можно будет понять насколько сложно преобразовывать код написанный для одного процессора под другой. И тут же встал в тупик...
Начало:
Допустим, находим процедуру TitleScreen:Код:*-------------------------------
*
* A T T R A C T
*
* Self-running "attract mode"
*
*-------------------------------
ATTRACTMODE
AttractLoop
lda #1
sta musicon
jsr SetupDHires
jsr PubCredit
jsr AuthorCredit
jsr TitleScreen
jsr Prolog1
]princess
jsr PrincessScene
jsr SetupDHires
jsr Prolog2
jsr SilentTitle
jmp Demo
И теперь ищем процедуру DeltaExpPop. И находим только такое:Код:TitleScreen
lda #38
jsr tpause
* Unpack title onto page 1
lda #delTitle
jsr DeltaExpPop
ldx #140
lda #s_Title
jsr PlaySongI
* Credit line disappears
jmp CleanScreen
Не понимаю как эта таблица переходов работает и где по итогу расположены все эти процедуры?Код:*-------------------------------
*
* Jump tables
*
*-------------------------------
...
SngExpand ds 3
DblExpand ds 3
DeltaExpPop ds 3
_inverty ds 3
DeltaExpWipe ds 3
...
Да, я находил процедуры, озаглавленные капсом. Но я всё равно не понимаю как это работает.
Видимо, таблица переходов ссылается вот на этот блок:
Код:*-------------------------------
*
* Sits in main l.c. bank 2
*
*-------------------------------
org org
jmp SNGEXPAND
jmp DBLEXPAND
jmp DELTAEXPPOP
jmp INVERTY
jmp DELTAEXPWIPE
jmp PURPLE
jmp PROMPT
jmp BLACKOUT
jmp CLR
jmp TEXT
jmp SETDHIRES
jmp FADEIN
jmp LOADSUPER
jmp FADEOUT
Дальше надо с логикой разбираться. В принципе, команды немного знакомы - как-то писал программу под Агат (а там вроде тот же проц), но ДАВНО это было, так что только общая логика понятно, но не детали