AY-Track: (C) Mitchell/Mitchell House
__________________________________________
(C) Колесников Сергей
__________________________________________
Своей небольшой заметкой я хочу воспол-
нить пробел: начинающие или малоопытные
синклеристы зачастую хотят что-то сделать
на своем любимом SPECCY, но просто не зна-
ют, а КАК это сделать... Литературы по
"Спектрум" мало, а в провинции вообще нет,
остаются только электронные журналы.
Я остановлюсь на проблеме полных диско-
вых версий игр, особенно адвентюрных. Уж
сколько гуляет по стране так называемых
"дисковых" версий адвентюр, которые прек-
расно грузятся с диска, а захочешь сохра-
нить состояние, получаешь оплеуху в виде
"START TAPE AND PRESS ANY KEY"! И особенно
возмущает то, что в заставке красуется
"DISKED BY ..."! -((
Прежде всего предупреждаю: если вы счи-
таете себя крутым кодером или опытным про-
граммистом,то дальше можете не читать. Вам
это не нужно и не интересно. Я адресую сей
материал малоопытным (вроде меня) любите-
лям и фанатикам SPECCY, и призываю всех
принять активное участие в обмене опытом.
Я думаю, это будет интересно очень и очень
многим. Все-таки большинство спектрумистов
- это не крутые кодеры,а обыкновенные юзе-
ры...
Мне неоднократно уже доводилось делать
полные дисковые версии, причем мне всегда
нравились игры, выполненные единым бейсик-
блоком с отгрузкой состояния "в тело прог-
раммы". Можно, конечно, сделать отгрузку в
разные файлы с заданием имени перед сохра-
нением, но это немного сложнее и требует
более-менее неплохого знания ассемблера
(т.к. придется искать в программе процеду-
ру ввода строки).
Если кто-то не знает, с чего конкретно
начать, подскажу: начать надо с поиска в
программе процедур записи на ленту и заг-
рузки с ленты. Точки входа в процедуру за-
писи чаще всего CALL #04C2, CALL #04C6 или
CALL #04D0. Таким образом, вам надо с по-
мощью диск-доктора или теневика SCORPION'а
(если у вас SCORPION), найти в программе
последовательность байтов :
#CD #C2 #04, или
#CD #C6 #04, или
#CD #D0 #04.
Если вы нашли одну из этих последова-
тельностей, вы сможете определить парамет-
ры отгружаемого блока кодов. В регистре IX
будет начальный адрес отгрузки, а в ре-
гистре DE - длина блока кодов.
Для LOAD чаще всего применяется точка
входа в ПЗУ CALL #0556, бывает еще CALL
#0802, CALL #0562 и CALL #0761.
Здесь последовательности для поиска та-
кие:
#CD #56 #05, или
#CD #02 #08, или
#CD #62 #05, или
#CD #61 #07.
Теперь, когда вы нашли в программе про-
цедуры сохранения и загрузки, внимательно
просмотрите программу. Если она загружает-
ся и работает с адреса как минимум 24500,
то все в порядке: можно воспользоваться
процедурой ПЗУ с точкой входа #3D13. Если
же программа грузится с меньшего адреса,
или после загрузки перебрасывает себя на
меньший адрес, то необходимо воспользо-
ваться специальным драйвером дисковых опе-
раций, т.к. обращение к системным перемен-
ным, при использовании точки входа #3D13,
будет невозможно.
Их достаточно много, но я обычно поль-
зуюсь драйвером А.Алексеева(ZX-РЕВЮ 4/1995
г.). И хотя у него есть недостаток (рабо-
тает только с дисководом "А"), он занимает
всего 131 байт, и я им давно успешно поль-
зуюсь.
Вам надо найти в программе место для
размещения драйвера, записать туда его ко-
довый блок и запомнить адрес для после-
дующего обращения к нему. Процедура записи
на диск будет выглядеть так :
LD HL,адрес загрузки
LD BC,#NN06
LD DE,(TREK/SEKTOR); куда писать
CALL #3D13; (или адрес размещения
драйвера)
где NN - количество секторов, которое бу-
дет сохраняться или загружаться.
По поводу TREK/SEKTOR:как вам известно,
при загрузке программы в системной пере-
менной #5CF4 сохраняются значения первого
сектора и дорожки на диске, с которого за-
грузили программу, следующего сразу же за
ней.
Я делаю так. В кодовом загрузчике прог-
раммы, непосредственно перед ее стартом, я
встраиваю такую конструкцию:
.......
LD HL,(#5CF4)
LD (#nnnn),HL
JP ... - старт программы.
где nnnn - адрес, где сохраняются значе-
ния первого свободного секто-
ра/дорожки (уж найдите пару
байт свободного места где-ни-
будь в программе).
Допустим, у вас будет сохраняться на
диске 250 байтов, т.е. 1 сектор. Значит,
сразу же за программой запишите на диск
кодовый блок длиной 1 сектор. Таким обра-
зом, когда вы будете записывать на диск
состояние игры, его месторасположение на
диске вы всегда можете взять из ячеек па-
мяти с адресом #nnnn. Просто, как все ге-
ниальное!-))
Процедура записи на диск аналогична вы-
шеприведенной, только в регистр BC надо
загружать не #NN06, а #NN05.
А теперь хочу рассказать конкретный
случай из практики. Я делал дисковую вер-
сию игры "ADVENTURE B - INCA CURSE". Что
интересно:там сохраняются два кодовых бло-
ка длиной 49 и 41 байт. Я записал на диск
сразу за программой два кодовых блока дли-
ной по 1 сектору. Возникла тема для разду-
мий: ну ладно, адрес первого блока я узнаю
из тех ячеек, что сохранил при загрузке
программы, а как узнать адрес второго бло-
ка? Ответ оказался прост. Вот каким обра-
зом я сохраняю/загружаю второй блок:
...........
LD DE,(#9900) ;это адрес ячеек, где
;сохранено значение
;#5CF4 для первого бл.
INC DE ;увеличиваю на едини-
;цу, т.к. длина блока
;кодов 1 сектор.
LD HL,#7724 ;адрес загр. 2 блока.
LD BC,#0106 ;запись 1 сектора
CALL DRIVER ;обращение к драйверу
..........
Ну вот и все! Желаю всем успехов и пе-
редаю привет всем, кто меня знает!
Сергей Колесников
355042, г.Ставрополь,
ул.Доваторцев 53/2-8