ZX-Ревю 1996 №4-5 1996 г.

Авторская разработка - Адаптация игр 8-битовых видеоприставок для ZX-Spectrum с видеопроцессором.


АВТОРСКАЯ РАЗРАБОТКА

© С. Веремеенко

АДАПТАЦИЯ ИГР 8-БИТОВЫХ ВИДЕОПРИСТАВОК ДЛЯ ZX-SPECTRUM С ВИДЕОПРОЦЕССОРОМ

В ZX-Ревю 1995/6 была опубликована статья «Видеопроцессор» для ZX-Spectrum". Первые отклики на нее показали, что наибольший интерес (пока!!) вызвала возможность адаптации игр 8-битовых видеоприставок для ZX-Spectrum с видеопроцессором.

Это несколько не тот эффект, на который я рассчитывал, но, как говорится: "Голос народа - глас божий".

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

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

Схема нового варианта интерфейсной платы приведена на рис. 1. Микросхемы D10 и D14 можно заменить на 556РТ11. В этом случае резисторы R1-R8 устанавливать не нужно. Если DENDY подключается по низкой частоте, то ее блок питания можно не подключать и, в любом случае, выключатель питания должен быть в положении "выключено", т. к. питание заведено от SPECTRUMa.

Прошивки ПЗУ приведены в таблицах на рис. 2-4.

Ограничения на адаптацию.

Интерфейсная плата в, своей максимальной конфигурации, имеет один банк ОЗУ программ емкостью 32 К. Некоторые игры занимают несколько (до 8 ) банков. Если в игре используется быстрое переключение банков, такая игра, для предложенного варианта интерфейсной платы, адаптирована быть не может. Не представляет особого труда увеличить емкость ОЗУ до 128 К. При этом появится возможность адаптации любых игр, но вряд ли это целесообразно. Стоимость платы резко возрастет, а количество игр увеличится не очень заметно. Подавляющее большинство игр из картриджей могут быть адаптированы под существующий вариант.

Существуют несколько разновидностей картриджей 8-битовых видеоприставок. Рассмотрим некоторые из них.

В простейшем и самом приятном случае, картридж содержит 1 банк ПЗУ программ (в дальнейшем S-ROM) и 1 банк видеоПЗУ (V-ROM). Эти картриджи обычно содержат одну игру. Считывание информации из них не представляет никаких трудностей. В принципе, можно использовать любой программатор РПЗУ с соответствующим переходником. Файлы S-ROM и V-ROM в коррекции не нуждаются, и их достаточно снабдить BASIC-загрузчиком.

Наиболее распространены картриджи, в которых ПЗУ делится на несколько банков. Банки ПЗУ переключаются путем записи кода в специальный регистр, как правило, выполненный на микросхеме 74ALS161 (1533ИЕ10). Эта микросхема используется как регистр с параллельной записью. При считывании информации из таких картриджей возникают некоторые трудности.

Запись в регистр осуществляется сигналом WRS, формально- это запись в ПЗУ. Естественно, никакой записи в ПЗУ при этом не происходит, но картриджи устроены так, что S-ROM по сигналу записи переходит в режим чтения! Если порт, выставивший данные, достаточно мощный, он, конечно, передавит достаточно хилый S-ROM, но, в этом случае, невозможно поручиться за сохранность картриджа. Ну, а если порт достаточно деликатный, байт на входе регистра банков выставит S-ROM, и что туда запишется предсказать невозможно. Единственный выход заключается в том, что в S-ROM нужно записывать то, что уже там есть. Положение усугубляется тем, что входы регистра банков могут быть подключены как к шине данных, так и к шине адреса, и разряды могут использоваться любые. Кроме того, часто используется дополнительная логика, которая может модифицировать номер банка в зависимости от других разрядов. А если учесть еще и то, что иногда применяются бескорпусные микросхемы, залитые эпоксидкой, и проследить схему по дорожкам невозможно.

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

Адаптер содержит 4 выходных и 2 входных порта, буфер данных и дешифратор адресов портов. Если у Вас возникнет необходимость изменить адреса портов, то придется изменить схему дешифратора. Через порты ADRF и ADRL устанавливается адрес S-ROM или V-ROM, через порть, RDAT и WDAT производится чтение и запись данных. Порт WDAT имеет третье состояние выхода. Порт УПР служит для передачи управляющих сигналов. Порт РЕЖ позволяет определить режим работы V-ROM данного картриджа.

Некоторую сложность представляет выбор адресов портов. В разных моделях SPECTRUM для дешифрации системных портов задействованы различные разряды адресной шины с различной степенью неполноты дешифрации. Вследствие этого очень трудно выбрать адреса внешних портов, которые не конфликтовали бы с внутренними во всех моделях. Чтобы не заставлять пользователей переделывать свои компьютеры, программа «Анализатор картриджей» позволяет выбрать произвольные, наиболее удобные для каждой модели адреса портов. Исходно, в ней используются адреса 04h, 0Ch, 14h, lCh. Эти адреса внешних портов удобны для использования в SCORPION ZS-256. При необходимости их изменения нужно выбрать в главном меню пункт "НАСТРОЙКА ПОРТОВ" и внести в таблицу портов соответствующие изменения. Программа с внесенными изменениями перезапишется на дискету, и в дальнейшем будет использовать, указанны Вами адреса портов. Эту процедуру можно проводить многократно, но если у Вас не очень надежный дисковод, позаботьтесь предварительно о страховой копии программы. Разумеется, «Анализатор картриджей» не всемогущ, и если получена диагностика «Анализ невозможен» или явно бессмысленный результат анализа, то остается только с вздохом отложить картридж. Я проанализировал несколько десятков картриджей. «Не по зубам» анализатору пришлось 5 или 6.

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

Х1

SOUND

GND

+5 В

WAIT

RESET

DO

D1

D2

D3

D4

D5

D6

D7

RD

WR

Ml

DOS

A5

A8

IORQ

A7

AO

BO

A1

R1

A2 A3

B2

B3

B4

A4

Bb

A5

B6

Ab

R7

A7

T

OE

СМОТРИ НА

ПРЕДЫДУЩЕЙ

14

13

V1 КД522

12

1

СТРАНИЦЕ

38

17

16

15

14

_13 12

Л1 1

D2 - 555ЛА2 D3 - 555ЛЕ1 D15 - 555ЛАЗ

(ПРОДОЛЖЕНИЕ)

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

Т

10

77

8

D1

555АП6

В большинстве случаев каждая игра занимает один банк S-ROM и один V-ROM. Соответствие банков определяется достаточно просто, если «Анализатор» показал одни и те же разряды регистра банков для S-ROM и V-ROM. В этом случае файлы на дискете, относящиеся - к одной игре, будут иметь один и тот же номер. Если разряды регистра банков различны для S-RO3M и V-ROM, то соответствие можно определить, просматривая файлы S-ROM кроссмонитором MON6502, который имеет команду поиска команд переключения банков. Когда все команды переключения найдены, определяем соответствие битов кодам банков.

Например, "Анализатор" выдал следующий диагноз:

СЕЛЕКЦИЯ БАНКОВ ПО ДАННЫМ БАНКОВ S-ROM ЕМКОСТЬЮ 16KB

04

БАНКОВ V-ROM ЕМКОСТЬЮ 8KB 04

КОДЫ1 БАНКОВ: S-ROM00 00 V-ROM00 00 S-ROMOl 04 V-ROMOl 01 S-ROM02 08 V-ROM02 02 S-ROM03 0С V-ROM03 03 РЕЖИМ А11

Из этого следует, что банки S-ROM переключаются разрядами D2 и D3, а банки V-ROM разрядами DO и D1.

Допустим, MON6502 нашел команду переключения банков: FF52 LDA #FAh FF54 STA #FF53h

В аккумулятор загружается число FAh и производится запись по адресу FF53, который соответствует второму байту команды загрузки аккумулятора. Это почти стандартный прием. 4 старших бита значения не имеют, а 4 младших вызовут включение S-ROM02 и V-ROM02.

Хорошие результаты может дать метод «научного тыка», когда на заключительном этапе адаптации, просто случайным образом объединяются разные S-ROM и V-ROM. При работе с дисководом это занимает меньше времени, чем анализ программы.

Следующий этап заключается в восстановлении программы. Это самый сложный этап, и результат здесь во многом зависит от Ваших хакерских способностей. Если в картридже всего одна игра или игра не имеет модификаций, то этот этап пропускается. Если же модификации есть, например, в меню фигурируют MARIO, MARIO1, ... MARIO999, игру придется восстанавливать. Все эти модификации делаются довольно просто. В любой игре есть процедура инициализации, которая устанавливает значения переменных. В лучшем случае, в программе, обслуживающей меню, есть своя процедура инициализации, а основная программа запускается не с начала, хотя присутствует в S-ROM полностью и в неискаженном виде. А в худшем. Китайские хакеры вообще работают очень грубо. Что они делают с играми «при помощи лома и кувалды» словами не передать. Впрочем, с грубыми и однообразными приемами, при некотором навыке, справляться легче.

Не забудьте установить вектор "START" на начало игры. Пока существует единственный инструмент для просмотра и внесения изменений в программы для DENDY. Это кроссмонитор MON6502.

Он имеет следующие команды: L - загрузка файла S-ROM. На экране появляется имя первого файла на дискете. CS+6 и CS+7 - выбор файла, ENTER - загрузка.

S - сохранение измененного файла. Новый файл не создается, изменения вносятся в исходный. Z - дизассемблер. Подрежимы: R - новый адрес, Р - РОКЕ адрес, данные; ПРОБЕЛ - следующая страница, CS+0 - выход в меню D - дамп. Подрежим:

Р - РОКЕ адрес, данные, ПРОБЕЛ - следующая страница, CS+0 - выход в меню. Т - текстовый дамп.

ПРОБЕЛ - следующая страница,

CS+0 - выход в меню. F - поиск

ПРОБЕЛ - следующий элемент поиска,

CS+0 - выход в меню.

Поиск имеет 4 модификации:

Тип 1 - поиск команд переключения банков. Ищутся команды записи в область BOOOh-OFFFFh. Поиск проводится по формальным признакам, поэтому монитор может дать «ложную тревогу». Окончательно решать: найдена ли нужная команда или это случайное сочетание байтов - Вам.

Тип 2 - поиск обращений к видеопроцессору. Запись и чтение по адресам 2000h-2007h.

Тип 3 - поиск обращений к портам. Запись и чтение по адресам 4000h-4020h.

Тип 4 - поиск последовательности от 1 до 3 заданных байтов.

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

Некоторые рекомендации,

Хотя маскируемое прерывание в играх не используется, его вектор часто указывает на истинное начало игры, размещенной в' данном банке. Вектор START показывает на переход к меню. Очень часто, но не всегда, стартовый адрес совпадает с началом банка. Достаточно надежно начало игры можно найти, задав поиск команды установки стека, если ее не «ампутировал» китайский хакер.

Если в начале игры обнаружились длинные цепочки NOP, значит игра запускается с начала, но инициализация неполная. В этом случае недостающие команды несложно найти в программе МЕНЮ.

Гораздо хуже, если начало игры полностью разрушено. В этом случае Вам понадобится поистине ангельское терпение и весь отпущенный природой интеллект. При раздельной адаптации игра полностью загружается в ОЗУ интерфейсной платы, и в дальнейшем никакого взаимодействия между Spectrum и DENDY нет вплоть до сброса.

При адаптации картриджа целиком, необходимо найти в памяти DENDY свободный участок около 200 байт. В нем нужно разместить небольшую подпрограмму, которая будет выполнять функцию диспетчера. Алгоритм загрузки приблизительно таков:

1. Загружаем банк памяти, содержащий МЕНЮ и устанавливаем вектор маскируемого прерывания на диспетчер.

2. Порт 6000h устанавливаем в 00h и запускаем МЕНЮ. SPECTRUM непрерывно читает порт 7Fh, и пока в нем 00h, не предпринимает никаких действий.

3. Выбираем пункт МЕНЮ с нужной игрой, при этом в порт 6000h записывается код игры.

4. SPECTRUM, прочитав код игры, считывает соответствующий блок с дискеты и загружает его в DENDY.

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

Организация взаимодействия между SPECTRUM и DENDY может потребоваться и в еще одном случае. Не очень удобно, кроме клавиатуры и джойстика SPECTRUMa использовать еще и DENDY'ский джойстик. Можно заменить подпрограмму чтения состояния DENDY'вского джойстика подпрограммой, принимающей управляющий код от SPECTRUMa по прерываниям. В этом случае DENDY'вской игрушкой станет возможным управлять с клавиатуры или KEMPSTON-джойстиком. Адреса портов джойстиков в DENDY 4016h и 4017 h MON6502 позволяет найти подпрограмму чтения джойстика за несколько секунд. Загрузка игры.

В ПЗУ интерфейсной платы размещена программа-загрузчик. Предусмотрено 4 режима загрузки. Три из них упрощенные, рассчитанные на применение стандартных загрузчиков. Комплект загрузчиков для всех возможных вариантов предложен мною на дистрибуцию в «Инфорком». При использовании стандартного, загрузчика заключительный этап адаптации упрощен до предела. Предположим, нужно перевести на дискету игру с S-ROM емкостью 32 Кб и режимом видеопроцессора А10. Объединяем файлы V-ROM и S-ROM в один (V-ROM при объединении должен занимать в памяти компьютера младшие адреса) размером 40 Кб и снабжаем его BASIC-загрузчиком D32A10. Все стандартные загрузчики универсальны, они одинаково позволяют загрузить игру с дискеты и кассеты.

Четвертый режим существенно сложнее, но он позволяет использовать все возможности интерфейсной платы. В основном он предназначен для загрузки программ, в которых во время работы сохраняется возможность взаимодействия SPECTRUM и DENDY.

g DO

3

3

2

D1

4

4

3

-D2

5

5

4

-D3

6

G

5

.□4

7

7

6

.□5 8

8

7

-D8

9

9 8

eD7

10

10

9

61

1

2

19

-A3

11

-A4

12

-A5

13

f WR

14

18

2

(RD

15

19

3

,iORO

18

20

4

eDOS

17

21

5

22

8

23

7

-+5B

1

24 8

-GND

2

25

9

2

1

59

19

<39 Q1

<32

<зз

<34 <35 06 <37

16

40

D5 555 ПР23

DO

<36

D1

<31

D2 D3 D4 D5 D6

<32 <33 <34 <35 <36 <37

D7

С

L

15

оо Q1

Q2 <33 <34 Q5 Q6 <37

47

7

55

6

50

5

57

4

50

9 59

10

60

Hf^T-j* в _ |8

Ч-1 „

В четвертом режиме в память DENDY по адресу 0700h загружается загрузчик в машинном коде DENDY длиной 256 байт, и управление передается ему. За универсальность приходится платить необходимостью писать программу на непривычном для синклериста ассемблере 6502. Для перевода загрузчика в 4 режим, перед передачей 256-байтного блока нужно передать байт Olh.

Х1.В

1

+5B

2

RDV

3

A12

4

A13

5

A14

6

D7

7

D6

8

D5

9

D4

10

D3

11

D2

12

□1

13

DO

14

CSS

15

SOUHD1

18

SOUIIDO

17

WRV

18

vcs-

19

VA13

20

UA7

21

VA8

22

VA9

23

VA10

24

VA11

25

VA12

26

VA13

27

VD7

20

VD6

29

VD5

30

VD4

2

1

14

1

83

2

11

13

12

3

15

15

62

14

DIP 555 ИД4

Х1.А

40

49

1

GND

2

Д11

3

A10

4

A9

5

A8

6

A7

7

A6

8

AS

9

A4

10

A3

11

A2

12

A1

13

AO

14

WRS

15

INT

16

GIID

17

OEV

18

VA10'

19

VA8

20

VA5

21

VA4

22

VA3

23

VA2

24

VA1

25

VA0

28

VD0

27

VD1

28

VD2

29

VD3

30

+5B

32

30

т

17_19

58_11

18

26

17

27

16

28

15

29

14

30

13

31

12

32

11

33

D7 555 ЛАЗ □8 555 ЛП8 D9 555 ЛЕ4

Рис. 5

Прошивка микросхемы D10

00

01

02

03

04

05

06

07

08

09

0A

0b

0C

0D

0E

0F

00

0A

0 a

0a

0 a

0 a

0A

0A

0A

0D

0B

0F

0F

08

08

08

08

01

00

00

00

00

00

00

00

00

0C

08

0E

0E

08

08

08

08

02

0A

0A

0A

0A

0A

0A

0A

0A

0D

0F

0F

0F

08

08

08

08

03

00

00

00

00

00

00

00

00

0C

08

0E

0E

08

08

08

08

04

08

08

08

08

08

08

08

08

0D

0B

08

08

08

08

08

08

05

00

00

00

00

00

00

00

00

0C

08

0E

0E

08

08

08

08

06

08

08

08

08

08

08

08

08

0D

0F

08

08

08

08

08

08

07

00

00

00

00

00

00

00

00

0C

08

0E

0E

08

08

08

08

Рис

. 2

Прошивка микросхемы

D14

00

01

02

03

04

05

06

07

08

09

0A

0b

0C

0D

0E

0F

00

06

06

06

06

06

06

06

06

0C

0D

0A

0b

0E

0E

0E

0E

01

0E

0E

0E

0E

0E

0E

0E

0E

0C

0D

0A

0B

0E

0E

0E

0E

02

06

06

06

06

06

06

06

06

0C

0D

0A

0B

0E

0E

0E

0E

03

0E

0E

0E

0E

0E

0E

0E

0E

0C

0D

0A

0B

0E

0E

0E

0E

04

0E

0E

0E

0E

0E

0E

0E

0E

0C

0D

0A

0B

0E

0E

0E

0E

05

0E

0E

0E

0E

0E

0E

0E

0E

0C

0D

0A

0B

0E

0E

0E

0E

06

0E

0E

0E

0E

0E

0E

0E

0E

0C

0D

0A

0B

0E

0E

0E

0E

07

0E

0E

0E

0E

0E

0E

0E

0E

0C

0D

0A

0B

0E

0E

0E

0E

08

06

06

06

06

06

06

06

06

0C

0D

0C

0D

0C

0D

0C

0D

09

0E

0E

0E

0E

0E

0E

0E

0E

0C

0D

0C

0D

0C

0D

0C

0D

0A

06

06

06

06

06

06

06

06

0C

0C

0D

0D

0C

0C

0D

0D

0B

0E

0E

0E

0E

0E

0E

0E

0C

0C

0D

0D

0C

0C

0D

0D

0C

0E

0E

0E

0E

0E

0E

0E

0E

0C

0D

0C

0D

0C

0D

0C

0D

0D

0E

0E

0E

0E

0E

0E

0E

0E

0C

0D

0C

0D

0C

0D

0C

0D

0E

0E

0E

0E

0E

0E

0E

0E

0E

0C

0C

0D

0D

0C

0C

0D

0D

OF

0E

0E

0E

0E

0E

0E

0E

0E

0C

0C

0D

0D

0C

0C

0D

0D

Рис.

3.

Прошивка микросхемы

D11

00

01

02

03

04

05

06

07

08

09

0A

0B

0C

0D

0E

0F

F800

78

D8

A9

00

8D

00

60

8D

00

20

8D

01

20

AD

02

20

F810

10

FB

AD

02

20

30

FB

A9

00

8D

00

20

8D

01

20

A9

F820

3F

8D

06

20

A9

F0

8D

06

20

A9

0D

8D

07

20

A9

FF

F830

8D

17

40

A2

96

AD

02

20

10

FB

AD

02

20

30

FB

CA

F840

D 0

F3

A0

00

98

99

00

00

C8

D0

FA

A0

00

B9

00

F9

F850

99

00

03

C8

D0

F7

B9

00

F9

D9

00

03

D0

ED

C8

D0

F860

F5

4C

00

03

FF

FF

FF

FF

FF

FF

FF

FF

FF

FF

FF

FF

Далее

до адреса

F8FF

заполнено FF

F900

A9

20

8D

01

60

A9

3F

8D

06

20

A9

F0

8D

06

20

A9

F910

10

8D

07

20

A2

FF

9A

A0

00

8C

06

20

8C

06

20

A9

F920

80

8D

00

80

A9

20

8D

00

E0

A9

08

8D

00

F8

AD

00

F930

80

8D

00

60

A9

03

8D

FB

FF

8D

FD

FF

8D

FF

FF

A9

F940

51

8D

FE

FF

A9

62

8D

FB

FF

58

EA

EA

EA

78

4C

49

F950

03

AD

00

60

C9

01

F0

0B

85

20

A9

68

8D

FE

FF

8D

F960

00

60

40

A9

7A

4C

6F

F9

AD

00

60

85

23

A9

8D

8D

F970

FE

FF

A2

00

A0

00

8D

00

60

40

AD

00

60

99

00

07

F980

C8

F0

04

8D

00

60

40

CA

9A

58

4C

00

07

AD

00

60

F990

8D

07

20

E8

D0

0C

C8

C0

20

D0

07

A0

00

A9

A6

8D

F9A0

FE

FF

8D

00

60

40

A5

23

C9

FF

D0

10

C0

FE

D0

0C

F9B0

AC

00

60

A9

C8

8D

FE

FF

8D

00

60

40

AD

00

60

91

F9C0

22

C8

D0

DE

E6

23

D0

DA

AD

00

60

8D

FF

FF

8D

00

F9D0

60

8C

FE

FF

A5

20

F0

11

A2

E0

C9

FF

F0

08

A2

F0

F9E0

C 9

FE

F0

02

A2

F8

8E

01

60

6C

FC

FF

FF

FF

FF

FF

Далее

до адреса

FFF0

заполнено FF

FFF0

FF

FF

FF

FF

FF

FF

FF

FF

FF

FF

62

F9

00

F8

62

F9

Рис. 4.




СОДЕРЖАНИЕ:


  Оставте Ваш отзыв:

  НИК/ИМЯ
  ПОЧТА (шифруется)
  КОД



Темы: Игры, Программное обеспечение, Пресса, Аппаратное обеспечение, Сеть, Демосцена, Люди, Программирование

Похожие статьи:
Risk - мысли risk'a o genz'e 3.5
Презентация - "Bard's Tale Merger Programm" - программа для работы с отгрузками из игры Bard's Tale.
Разное - Интервью с DESALEX'ом/XPJ.
Модем - Что такое модем ? Какой модем лучше ?..
Список BBS - Список работающий BBS.

В этот день...   29 марта