Из журнала Deja Vu #07, Кемерово, 1999 (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