ZX-Ревю 1996 №7-8 1995 г.

TR-DOS для начинающих - продолжение. (начало см. ZX РЕВЮ 96/1-2,4-5,6).


  Продолжение. (начало см. ZX РЕВЮ 96/1-2,4-5,6)
  (c) В.Сироткин, г.Краснокаменск.

                 ГЛАВА 4.
 МАКРО-ФУНКЦИИ  ТР ДОС (СТАНДАРТНЫЕ ПОДПРОГРАММЫ)

     Теперь, когда, в предыдущих главах, мы немного разобрались в структуре 
диска, рассмотрим как реализовать свои глубокие познания на практике и 
попытаться пообщаться с дисководом на языке АССЕМБЛЕР'а.
     Для облегчения жизни программистам, в ТРДОС выделены несколько функций, 
через которые можно управлять дисководом из АССЕМБЛЕРа.
     Назовем программирование,через эти функции - МАКРО УРОВНЕМ.
     Функции ТРДОС - это всего лишь несколько подпрограмм в ПЗУ, вызываемых 
через единственную точку входа, а адрес входа в эти подпрограммы для различных 
версий ТРДОС - ОДИН И ТОТ-ЖЕ!
     Все эти функции вызываются через  адрес:
     >>>>>>>>>>   #3D13   ( 15635 ). <<<<<<<<<<<<
     В регистр 'С' перед обращением к этому адресу, должен быть помещен номер 
вызываемой функции.

НАПРИМЕР:        LD    C,0      нулевая функция
                 CALL  #3D13    вызов функции

     При вызове большинства функций, (а их не много, не мало 21), система 
использует область системных переменных ТРДОС, а также использует перемещаемый
буфер.
     Так что проблемы снижения RAMTOP и затирания системной области ТРДОС 
остаются. Правда, есть функции, которые позволяют забыть об этом и выйти из 
любого трудного положения.
     Функции по назначению разделяются на четыре вида:
           1. Функции записи данных на диск.
           2. Фнкции считывания данных с диска.
           3. Функции управления контроллером.
           4. Вспомогательные функции.
Рассмотрим все функции подробнее.
--------------------------------------------------
          1. ФУНКЦИИ УПРАВЛЕНИЯ КОНТРОЛЛЕРОМ.
--------------------------------------------------
*  C=0    ВОСТАНОВЛЕНИЕ или  СБРОС микросхемы 1818ВГ93.
          Переход головок дисковода на дорожку 0.
           Опрашивается нажатие клавиши STOP
                      (C/SH+BREAK)
          Во время работы функции системная область ТРДОС НЕ ИСПОЛЬЗУЕТСЯ !
--------------------------------------------------
*  C=1    ВЫБОР ДИСКОВОДА.
          Номер выбираемого дисковода (от 0 до 4) помещают в регистр  'А'.
          Если по адресу 23802 (#5CFA) + НОМЕР ВЫБИРАЕМОГО ДИСКОВОДА записать 
          код #FF, то произойдет полная инициализация дисковода, определится 
          СИСТЕМНАЯ ОБЛАСТЬ ТРДОС, и туда запишется количество дорожек диска,
          величина позиционирования головок дисковода, и т.д.
          В ячейку 23798 (#5CF6) занесется номер выбранного дисковода.
          Во избежание нежелателных ситуаций рекомендуется: номер вызываемого 
          диска дублировать еще и в адреса 23800 (#5CF8) и 23801 (#5CF9).
          Функция активно использует системную область ТРДОС !
--------------------------------------------------
*  C=2    ПОЗИЦИОНИРОВАНИЕ (установка головок дисковода на нужный ЦИЛИНДР 
          диска).
          В регистр 'А' необходимо записать номер ДОРОЖКИ !!
          Дорожки с номерами 0,1 (верхняя и нижние стороны диска) будут 
          соответствовать ЦИЛИНДРУ номер 1, дорожки 2,3 - ЦИЛИНДРУ 2 и т.д.
          Быстро вычислить соответствие номера ДОРОЖКИ и номера ЦИЛИНДРА можно 
          по формуле:
                 N_ЦИЛИНДРА= INT (N_ДОР /2 )
--------------------------------------------------
*  C=#15  Проверка ЦИЛИНДРА.
          Регистр 'D' должен содержать номер проверяемого цилиндра.
          Сначала находится нужный цилиндр, затем проверяется сам цилиндр путем 
          считывания информации из системной области диска.
--------------------------------------------------
*  C=#16  ЗАГРУЗКА СИСТЕМНОГО РЕГИСТРА (РЕГИСТР УПРАВЛЕНИЯ КОНТРОЛЛЕРА, порт 
          #FF).
          Код управления контроллером заносится в регистр 'А'.
          Предварительно к нему прибавляется #3С (подробнее о портах 
          контроллера и командах управления -  смотри в последующих главах).
---------------------------------------------------
*  С=#17  Выбрать  нижнюю сторону диска (т.е., нечетные дорожки).
---------------------------------------------------
*  С=#18  НАСТРОЙКА НА ДИСК.
          Проверяется 8-й сектор нулевой дорожки. (Тип и емкость диска,
          количество цилиндров).

_______________________________________________________________________
         2. ФУНКЦИИ ЗАПИСИ ДАННЫХ НА ДИСК
--------------------------------------------------
*  С=9    ЗАПИСЬ В КАТАЛОГ ДИСКА ИНФОРМАЦИИ О ФАЙЛЕ.
           На диск записывается 16 байтов из области системного ОЗУ , т.е. 
           описатель файла из адреса 23773 (#5CDD)
           8 байтов -имя + 1 байт - тип (B,C,D,@) или др.,
           2 байта - начало в ОЗУ или длина Бейсика;
           2 байта - длина файла ;
           1 объем файла в секторах;
           1 байт  - номер первого сектора файла;
           1 байт -  номер первой дорожки файла;
           В РЕГИСТРЕ 'А' должен быть номер посадочного места в каталоге, куда 
           эта информация запишется,(т.е. номер файла).
---------------------------------------------------
*  С=#0С  ЗАПИСЬ БЕЙСИК ПРОГРАММЫ.

           С адреса 23773 (#5CD0) должны быть имя и тип файла.
           Если тип файла отличен от 'В', то файл записывается под именем 
           'ВООТ'.
--------------------------------------------------
*  С=#0В  ЗАПИСЬ ФАЙЛА.
           С адреса 23773 (#5CD0) должны быть;
           имя и тип фаила.
           В РЕГИСТРАХ 'HL' - адрес начала в памяти,
           В РЕГИСТРАХ 'DE' - длина файла.
--------------------------------------------------
*  С=6    ЗАПИСЬ ГРУППЫ СЕКТОРОВ
          Мощная подпрограмма записи информации из ОЗУ на диск, не требующая 
          для своей работы дополнительного буфера перекачки.
          Собственно область ОЗУ, которая должна сохраняться на диске, и будет 
          являться этим буфером.
          В регистр 'В' помещается количество СЕКТОРОВ, записываемых подряд на 
          диск (или проще - количество 256 байтных блоков из ОЗУ).
          В регистр 'HL' начальный адрес блока ОЗУ.
          В регистр 'D'  номер ДОРОЖКИ .
          В регистр 'Е' номер СЕКТОРА в ДОРОЖКЕ, с которого будет начинаться 
          запись.
          В регистре 'А' число 255 .

       !  ЕСЛИ регистр 'В' будет равен 0, запись производиться не будет.

----------------------------------------------------------------------------       
    3. ФУНКЦИИ  СЧИТЫВАНИЯ ИНФОРМАЦИИ С ДИСКА
----------------------------------------------------------------------------
*  С=#0А  ПОИСК ФАЙЛА В КАТАЛОГЕ
           Поиск файла производится по ИМЕНИ + ТИПУ файла.
           Шаблон имени должен быть помещен с адреса 23773 (#5CDD);
           8 символов имени + 1 символ - тип.
           Если по адресу 23814 (#5D06) изменить начальное значение = 9, на 
           меньшее, то поиск будет производиться по меньшему количеству 
           символов.
           Если шаблон имени найден в каталоге, то при выходе из подпрограммы 
           регистр 'С' будет содержать порядковый номер файла в каталоге;
           то же продублируется в адресах системной области  23828 (#5D14) и
           23823 (#5D0F).
           Если шаблон (файл) не найден,то старший байт регистра 'С' будет 
           установлен в 1, т.е. номер будет больше, чем 127 (#7F), а в адресе 
           23823 (#5D0F) установится 255 (#FF).
           Содержимое адреса 23828 (#5D14) не изменится.
--------------------------------------------------
*  С=8     ЧТЕНИЕ ИНФОРМАЦИИ О ФАЙЛЕ ПО ЕГО НОМЕРУ.
           В регистре 'А' должен быть номер интересующего Вас файла - (число от 
           0 до 127). После работы подпрограммы - 16 байт информации из 
           каталога диска перепишутся по адресу 23773 (#5CDD).
           Даже,если заданный номер в регистре 'А' будет указывать на стертый 
           файл или вообще на пустое место в каталоге, то и в этом случае из 
           диска что-то перепишется.
--------------------------------------------------
*  С=5     ЧТЕНИЕ ГРУППЫ СЕКТОРОВ С ДИСКА
            Мощная функция считывания информации с диска в ОЗУ, не требующая 
            для своей работы буфера перекачки, (буфером является та область,
            куда и считывается информация.
            В регистр 'В' помещается количество СЕКТОРОВ, считываемых подряд с 
            диска (или проще - количество 256 байтных блоков).
            В регистр 'HL' начальный адрес ОЗУ, куда будут считаны данные.
            В регистр 'D' номер ДОРОЖКИ.
            В регистр 'Е' номер СЕКТОРА в ДОРОЖКЕ, с которого будет начинаться 
            считывание.
            Регистр 'А' должен быть равным 0.
        !   Если регистр 'В' будет равен 0, то считывания в ОЗУ не произойдет.
--------------------------------------------------
*  С=#0Е  ЧТЕНИЕ / ПРОВЕРКА ФАЙЛА.
          Имя и тип файла должны быть сформированы с адреса 23773 (#5CDD).
          При 'А', равном 0 ,файл загружается по адресу, указанному в заголовке 
          файла в каталоге.
          При 'А', равном 3, файл загружается в адрес ОЗУ, указанном в регистре 
          'HL' и длиною из 'DE'.
          При 'А' равном 255 , файл загружается в адрес из регистра 'HL', 
          длиною равной длине файла, указанной в каталоге на диске.
          Если в системном адресе 23801 (#5CF9) будет записан 0, то происходит
          операция 'LOAD'; если #FF, то 'VERIFY'

--------------------------------------------------
           4. ВСПОМОГАТЕЛЬНЫЕ ФУНКЦИИ.
--------------------------------------------------
*  С=3    Перенос содержимого регистра 'А' в ячейку ОЗУ 23807 (#5CFF)- номер 
          сектора для п/п чтения-записи сектора.
--------------------------------------------------
*  С=4    Перенос содержимого регистра 'HL' в ячейки ОЗУ 23808/23809 
          (#5D00/#5D01) - текущий адрес буфера перекачки.
---------------------------------------------------
*  С=7    ВЫВОД КАТАЛОГА ДИСКА в канал, указанный в регистре 'А'. При 'А'=2 - 
          каталог выводится на экран. (аналогично комманде ТРДОС 'САТ').
          При 'А'=3 - каталог выводится в принтер и т.д.
          При исполнении данной функции автоматически исполняется функция #18.
--------------------------------------------------
*  C=#12  Удаление ФАЙЛОВ.
           Перед вызовом функции, в адресе 23773 (#5CDD) должны быть 
           сформированы ИМЯ И ТИП ФАЙЛА, а в адресе 23814 (#5D06) - количество 
           знаков на поиск шаблона.
           Удаляются все файлы, попадающие под этот шаблон.
           Удаление происходит путем записи в первый символ имени файла кода 
           01, в области каталога диска.
-----------------------------------------------------------------------------
*  C=#13  Копирование 16 байт из области ОЗУ, указанной регистром 'HL' в ОЗУ по 
          адресу 23773 (#5CDD).
--------------------------------------------------
*  C=#14  Копирование 16 байт из области ОЗУ, с адресом 23773 (#5CDD), в ОЗУ,
          адрес которого указан регистром 'HL'.
--------------------------------------------------

                  ПРИМЕЧАНИЯ:
     При записи файла или заголовка файла на диск функциями, в отличии от 
команд ТРДОС, на диске можно образовать несколько файлов с идентичными именами, 
а, также, с типами файлов - отличными от стандартных.
     При работе с функциями не забывайте , что почти все функции изменяют 
область СИСТЕМНЫХ ПЕРЕМЕННЫХ ТРДОС, а, также, требуют объем свободной памяти,
приблизительно равный объему памяти при работе с КОМАНДАМИ ТРДОС.
     Самыми мощными, но и самыми 'опасными' функциями считывания/записи  
являются функции #05 и #06, которые, в основном, и применяются при загрузке
больших или нестандартных файлов (опасными потому, что при ошибке во время 
записи есть риск потерять диск или отдельные файлы на нем).
     Если внимательно рассмотреть порядковый номер заголовков файлов в каталоге,
то нетрудно заметить, что СТАРШИЙ полубайт номера соответствует номеру сектора 
на нулевой дорожке, а МЛАДШИЙ полубайт - номеру записи в секторе.
     Используя вышеперечисленные функции, можно писать довольно приличные и 
универсальные загрузчики и адаптировать большинство программ под дисковую 
систему.
     С помощью этих функций были адаптированы такие программы, как "ARTSTUDIO",
"TASWORD", "PASCAL", "GENS", и многие, многие другие, а уж об играх и говорить 
не приходится.

                    ГЛАВА 4.1
          ПРИМЕНЕНИЕ ФУНКЦИЙ ТРДОС.

     Рассмотрим несколько примеров и приемов программирования на основе функций 
ТРДОС.
                    Пример 1.
                    ---------
     В первую очередь, при адаптировании программы на диск, программа может  
определять: "А подключен ли вообще контроллер ?" (такая проблема может 
возникнуть, если Ваша программа универсальна, т.е. работает и на магнитофоне
и на диске).
     Используя функцию #13, это сделать довольно просто;

LD C,#13           функция  переноса байтов
LD HL,#0900        адрес окуда перенести 16 байт
CALL #3D13         перенос 16 байт в адрес #5CDD

                   (если контроллера нет,то CALL #3D13 равносильно RST #38
                   т.к. в пзу SOS по этому адресу расположен код #FF.
                   А RST #38 это программа опроса клавиатуры).

LD A,(#5CDD)       если контроллер есть, на время выполнения функции включится
                   ПЗУ ТРДОС и 16 байт перепишутся из адреса #0900, а там
                   код #FF

CP #FF             это ТРДОС ПЗУ ?
JR NZ, NODISK      нет - переход на работу с лентой

DISK     ....      да - инициализация диска

     Приблизительно, так же можно определить номер версии ТРДОС. Только в 
регистр 'HL' помещается число #0360 (по этому адресу, в ПЗУ ТРДОС находится 
текстовое сообщение:'ver 5.01 *'. В разных версиях ТРДОС текстовое сообщение 
может находиться по разным адресам, но, как правило, в пределах 255 байт от 
этого места).

start    LD C,#13           функция
         LD  HL,#0360       адрес  текста  версии
         CALL #3D13         перенос 16 байт в адрес #5CDD
         LD   A,(#5CDD)     загрузим первый байт сообщения

         CP   ...           здесь идет сравнение перенесенных байтов.
         ...........

     Как уж Вы будете сравнивать и с чем, - это уже зависит от Вашей фантазии.
Самое главное, что у Вас по адресу #5CDD есть 16 байт из ПЗУ ТРДОС. Не найдете 
номер версии по адресу #0360, прибавляйте (или отнимайте) от этого адреса по 16 
и выполняйте функцию снова.
     Можно поступить еще проще, если заранее знать у какой версии ТРДОС какие 
байты по одному и тому-же адресу различны.
     Составив таблицу байтов из этого адреса, но из разных версий ТРДОС, Вы 
будете проверять всего лишь по одному байту, сравнивая его с таблицей.
     Такое определение версии ТРДОС необходимо в том случае, если в Вашей 
программе используются методы программирования непосредственно микросхемы ВГ93
через процедуры ПЗУ. А так как у разных версий ТРДОС эти процедуры расположены  
по разным адресам, то определение версии ТРДОС является необходимым для 
нормальной работы Вашей программы в любом компьютере, а не только в Вашем!
     С главы 5 этой книги начнется материал, как раз и посвященный таким 
методам программирования, а пока...

                    Пример 2.
                    ---------
Попробуем теперь распечатать каталог диска 
        .. на экране
         LD A,02     номер канала для вывода
                     (экран)
         LD C,07     функция
         CALL #3D13  вывести
;
        .. на принтере
         LD A,03     номер канала ( принтер)
         LD C,07     функция
         CALL #3D13  вывести на принтер
;

     Конечно, когда Вы будете выводить каталог на принтер, необходимо сначала 
загрузить драйвер принтера с диска или из ПЗУ (если, конечно, он у Вас 'зашит'
в ПЗУ) и включить принтер.
     В связи с этой программкой возникает интересная возможность: если 
вспомнить, что последовательные файлы ТРДОС резервируют каналы с 4 по 15, то 
что нам мешает 'распечатать' каталог в ФАЙЛ?  Надо только открыть файл, связать 
его с номером канала, и в этот канал вывести каталог.
     На БЕЙСИКЕ это бы выглядело так:

10 RANDOMIZE USR 15619:REM:OPEN# 4,"CATALOG",W
20 RANDOMIZE USR 15619:REM:CAT #4
30 RANDOMIZE USR 15619:REM:CLOSE# 4

     Вместо оператора 'САТ' можно использовать и 'LIST'. Тогда в ФАЙЛ "CATALOG" 
запишется полная информация о файлах на диске.
     Таким образом, можно в файлах хранить каталоги всех дисков которые у Вас 
есть. А если в каком-нибудь 'ДИСК  ДОКТОРЕ' исправить тип файла в каталоге с
'#' на 'С' , то этот файл можно загрузить в текстовый редактор , например TLW .

     Рассмотрим теперь несколько примеров считывания/записи на диск. Опустим 
только случаи , когда условия  благоприятны;  т.е. RAMTOP установлена достаточно 
высоко, область системных переменных БЕЙСИКА и ТРДОС не затронута (как в таких 
условиях произвести считывание/запись, я надеюсь, Вы разберетесь сами).
     Разберем более тяжелые случаи адаптации программы с магнифона на диск ...

                    Пример 3.
                    ---------
     RAMTOP программы расположена очень низко, программа с магнитофона 
загружается загрузчиком в машинных кодах  с адреса, например, 23867 (#5D3B), 
т.е. прямо в область БЕЙСИКА. Но области системных переменных БЕЙСИКА и ТРДОС 
не затронуты.
     Первое, что необходимо сделать - это просто перекопировать программу для  
адаптации с ленты на диск, каким-нибудь копировщиком (TAPE -> DISK).
     При работе со скопированным файлом надо знать, что длина файла и адрес 
загрузки в заголовке файла, как правило, указаны НЕВЕРНО! Такое встречается в 
90% магнитофонных программ.

             СЧИТЫВАНИЕ ФАЙЛА С ДИСКА

     Для загрузки файла с диска, нам нужен настоящий адрес посадки программы в  
ОЗУ и реальная длина блока программы. И, конечно, необходим адрес запуска 
программы.
     Очень надеюсь, что взламывать магнитофонные загрузчики Вы уже умеете и, 
в конечном итоге, у Вас есть все то ,что нужно для работы.
     В любом случае, нам  необходимо  использовать ТРДОС функцию  С=5, т.е. 
непосредственно считать сектора  файла, или прямо по нужному месту в ОЗУ,
или через какой нибудь буфер (например, экранный).

;-------- LOADER -----
; СТАРТ прогграммы с метки START
;
; для начала поместим имя и тип интересующего нас
; файла (9 байт) по адресу #5CDD.
; затем вызовем функцию ПОИСК файла (#0A).
; и если файл обнаружен , то прочтем информацию о
; нем т.е. весь заголовок файла из каталога.

FILENAME    DEFM  "filename" ; имя файла
            DEFM  "C"        ; тип файла

START       LD HL,FILENAME   ; перенесем 9 байтов
            LD DE,#5CDD      ; в системную
            LD BC,9          ; область ТРДОС
            LDIR

FIND        LD C,#0A      ; поиск заданного
            CALL #3D13    ; файла
            BIT 7,C       ; такой файл есть?
            JP NZ,NO_FIND ; нет, выход
            LD A,C        ; есть, тогда
            LD C,8        ; прочтем о нем
            CALL #3D13    ; информацию
; Теперь с адреса #5CDD у нас есть вся информация
; о файле для его загрузки.
; Нам нужно взять номер сектора, номер дорожки и
; занести  в  регистр 'DE', в регистр 'В'-
; количество  секторов, а в регистр 'HL'- адрес
; загрузки в ОЗУ.

LOAD        LD DE,(#5CEB)      ; в 'D' номер трека
                               ; в 'Е' сектор
            LD BC,(#5CE9)      ; в 'В' количество
            LD HL, ADRES       ; адрес загрузки
            LD C,05            ; функция
            CALL #3D13         ; загрузить

     Если реальная длина загружaемого блока в байтах кратна 256 или у Вас есть 
уверенность, что последние 'лишние' байты последнего загружаемого сектора
не затрут нужную информацию в ОЗУ, то чтение секторов можно производить прямо 
по адресу загрузки. Если нет - то загрузку необходимо производить через буфер  
или загружать в буфер последний сектор файла, и оттуда переносить нужные 
последние байты на место (в этом случае, Вам необходимо вычислить номер 
последнего загружаемого сектора.)
     Можно, конечно, написать загрузчик таким образом, чтобы он загружал всю 
программу через буфер в 256 байт. К примеру: нам надо загрузить файл длиною в 
40100 байтов, в адрес 24000. 40100  байт равны 157 секторам на диске (156 
секторов + 164 байта из 157 сектора).

;------------- LOADER 2  -------
; Загрузчик программы через буфер в 256 байт.
; регистр 'В' занести  количество секторов
; регистр 'D' - номер первого сектора файла на
;                диске
; регистр 'Е' - номер начальной дорожки файла
;
         LD SP,STEK     ; установим стек на
                        ; свободное место в
                        ; ОЗУ,в нашем случае
                        ; можно на 65535
START1   LD HL,BUFFER   ; адрес буфера перекачки,
                        ; (к примеру 16384 )
         LD C,05        ; функция чтения
         PUSH BC        ; спрячем
         LD B,1         ; количество загружаеных
                        ; секторов за один раз
         CALL #3D13     ; загрузим с диска в буфер
                        ; 1 сектор = 256 байт
         LD HL,BUFFER   ; начало буфера
         LD DE,(ADRES)  ; истинный адрес посадки
                        ; в ОЗУ
         LD BC,256      ; 1 сектор
         LDIR           ; перенесем загруженный
                        ; сектор туда,
                        ; где он должен быть
         LD (ADRES),DE  ; спрячем адрес, куда пере-
                        ; носить следующую порцию
         LD DE,(#5CF4)  ; возьмем из системной пе-
                        ; менной ТРДОС - ТЕКУЩИЙ
                        ; номер сектора и ТЕКУЩИЙ
                        ; номер дорожки ФАЙЛА
                        ; (при исполнении функции
                        ; эти данные заносятся
                        ; в адрес #5CF4  системой
                        ; автоматически )
         POP BC         ; востановим общее ко-
                        ; личество загружаемых
                        ; секторов
         DJNZ START1    ; все сектора считаны ?
                        ; нет - загружай еще
         LD HL,BUFFER   ; да, тогда подгрузим
                        ; последний сектор
         LD C,05        ;
         LD B,01
         CALL #3D13
         LD HL,BUFFER   ; и занесем его на
         LD DE,(ADRES)  ; место
         LD BC,164
         LDIR
         JP...          ; стартовать программу

ADRES    DEFW 24000     ; здесь адрес загружаемой
                        ; программы
;----------------
     Конечно, данный пример не очень изящен, и опытный читатель сразу заметит 
- вот тут бы подпрограммочку, а тут можно было бы по другому. Все правильно, 
данный пример показывает принцип загрузки, а уж как Вы этот принцип примените,
это дело Ваше.
     При необходимости, можно отказаться от опроса системной переменной  #5CF4 
и написать два вложенных цикла; один из которых считал бы сектора и при 
переходе через число 16 (16 секторов на дорожке), увеличивал бы номер дорожки 
на единицу (не забудьте, что функции ТРДОС работают с номерами секторов от 0 
до 15). Загрузчик увеличился бы в объеме, но выиграл бы в универсальности.
     И еще: данный способ загрузки через буфер страдает некоторой 
медлительностью (в 1,5 раза медленней, чем это делает ТРДОС). Но этот метод 
работает, и работает неплохо.
     Если областью работы данного загрузчика выбрать, к примеру, экран, на 
экран же определить стек и буфер перекачки, то, в принципе, можно загружать 
ЛЮБЫЕ файлы, не попадающие на системную область ТРДОС. Или, вообще, любые файлы, 
если загружать блоки программы, затирающие системную область, сначала в 
промежуточный буфер и, перебрасывая в конце загрузки эти блоки на нужное место.
Правда, это будет удобнее сделать другим методом, но об этом мы расскажем в 
главах, посвященных программированию непосредственно микросхемы 1818 ВГ93 .

* НЕСКОЛЬКО ОБЩИХ ЗАМЕЧАНИЙ И ДОПОЛНЕНИЙ  НА БУДУЩЕЕ *

- дисковая система не любит ВТОРОГО ПРЕРЫВАНИЯ, так что первой Вашей командой 
должна быть команда IM1 и DI;
- в любом случае, лучше всего запретить прывания вообще или запрещать их перед 
обращением к диску;
- если у Вас 2 и более дисковода, то выберите сначала номер дисковода, с 
которым будете работать;
- при первом опробовании Ваших программ желательно ЗАЩИТИТЬ ДИСК ОТ ЗАПИСИ -
заклейте прорезь на диске, и Вы избежите случайных неприятностей

                    ПРИМЕР 4.
                    ----------
     Теперь давайте рассмотрим случай более 'тяжелый'. Системные переменные 
ТРДОС и системная область БЕЙСИКА затерты кодами программы. Стек в программе 
установлен или на область экрана, или на самую верхушку ОЗУ, или в другое место.
Программа в своей работе догружает другие уровни или свое состояние.
     Для начала необходимо выбрать место для нашей подпрограммы загрузчика.
Это может быть та область, где помещались коды загрузчика с ленты, а если места 
там не хватит, то это может быть место, где располагается подпрограмма вывода 
имен создателей программы в заставке (иногда такие подпрограммы в заставках 
занимают до нескольких килобайт памяти).
     А если, все-таки, места свободного в программе нет, то можно впихнуть свою 
"загрузку" в какую-нибудь второстепенную подпрограмму или пожертвовать частью 
какой-нибудь картинки. В общем, если захотеть, можно выкрутиться. В крайнем
случае можно пожертвовать и звуком в программе.
     Самая тяжелая ситуация, с которой приходится сталкиваться - это 
загрузка-выгрузка состояния игры в программах  типа "SIM SITY", "ELITE",
"TAY 2" и т.д.
      В этих программах, казалось, байта лишнего не выкинешь, но,"разложив" 
программу по полочкам, может оказаться, что из нее безболезненно можно было бы 
удалить 0.5 - 1 килобайт. А для дискового загрузчика этого ПРЕДОСТАТОЧНО !
     Но вот свободное место в программе найдено, подсчитана длина и место 
посадки загружаемого блока в программе. Теперь осталось только загрузить...
     Для начала инициализируем область системных переменных ТРДОС ;

START   LD HL ,#5C00      ; сохраним область ОЗУ
        LD DE ,BUFFER     ; с #5C00 по #5DF4
        LD BC ,#01F4      ; в другое место
        LDIR              ; (например экран)

        LD HL ,#5C00      ; очистим это место
        LD DE ,#5C01      ; на всякий случай
        LD BC ,#01F3
        LD (HL),L
        LDIR
        LD (ADRES),IY     ; спрячем текущее значение
                          ; регистра IY
        LD IY,#5C3A       ; инициализация индексного
                          ; регистра на область пере-
                          ; менных SOS
        IM 1              ; прерывание 1
        LD A ,#FF         ; переменная SOS код сооб-
        LD (#5C3A),A      ; щения об ошибке
        LD (#5D0C),A      ; переменная ТРДОС -буфер
                          ; перекачки отсутствует
        LD A ,#C9         ; переменная ТРДОС для
        LD (#5CC2),A      ; возврата из подпрограмм
        LD A,#83          ; код для дисковода 'А'
        LD (#5CC8),A

LOADFILE CALL LOADER       ; загрузим файл с диска
         LD IY,(ADRES)     ; востановим все
         LD HL,BUFFER      ; на
         LD DE,#5C00       ; старое
         LD BC,#01F4       ; место
         LDIR
RETURN   JP...(RET)        ; выйдем в программу

;- -  а это сам загрузчик    - - - - - - - - - - -

LOADER   DI
         LD C,01           ; выберем дисковод 'А'
         LD A,0
         CALL #3D13
         LD HL,FILENAME    ; перенесем ИМЯ и ТИП
         LD DE,#5CDD       ; файла в системную
         LD BC,9           ; область
         LDIR
         ...               ; И ТАК ДАЛЕЕ, СМОТРИ
                           ; ПРЕДЫДУЩУЮ ПРОГРАММУ ...
;- - - - - - - - - - - - - - - - - - - - - - - - - - -

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

 !  Если в процессе своей работы, программа использует прерывание 2, то на 
выходе из загрузчика не забудьте его вернуть программе!

                    ПРИМЕР 5.
                    ---------
     А вот другой, довольно оригинальный, метод загрузки уровней для программ,
с использованием функции #0Е: чтение  ФАЙЛА через буфер ТРДОС. Правда, 
этот метод требует много места в ОЗУ.
     В теле основной программы Вы должны найти место не только для своего 
загрузчика, но и для копии всей инициализированной области системных переменных
ТРДОС, и в нужный момент перенести всю область на свое исконное место.

;      loader level game
;
START   LD DE,#5CC8       ; перенесем копию систем-
                          ; ной
        LD HL,BUFFER_1    ; области на место
        LD BC,#32
        LDIR
        LD A,(LEVEL)      ; здесь содержится номер
                          ; загружаемого уровня
        ADD A,#31         ; приведем номер к коду
                          ; цифр таблицы ASC
        LD (#5CE4),A      ; занесем номер уровня в
                          ; имя файла
        DI
        LD HL,BUFFER_2    ; перенесем вторую поло-
                          ; вину
        LD DE,#5CFB       ; копии системной области
        LD BC,#20         ; ТРДОС на место
        LDIR
        LD (ADRES),IY     ; спрячем текущее значе-
                          ; ние IY
        LD IY,#5C3A       ; занесем адрес системной
                          ; области БЕЙСИКА (SOS)
        LD (IY+00),#FF    ; инициализируем адрес
                          ; кода ошибки
        IM 1              ; прерывание 1
        LD A,#C9          ; код возврата из под-
                          ; програм
        LD (5CC2),A       ; занесем в область SYS 
                          ; TRDOS
        LD HL,#5D27       ; адрес вершины стека 
                          ; калькулятора
        LD (#5C65),HL     ; БЕЙСИКА

        XOR A             ; адрес загрузки взять из
                          ; каталога на диске
        LD C,#0E          ; загрузить файл адресом 
                          ; и
        CALL #3D13        ; длиною, как в каталоге
        ...               ; здесь может идти проверка
                          ; загрузился ли файл и тот ли
                          ; файл загрузился.
        RET               ; выход в программу
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
     В этом случае, во всех заголовках загружаемых файлов в каталоге должна 
быть указана реальная длина и истинный адрес загрузки блоков.

                    ПРИМЕР 6.
                    ---------
     Рассмотрим еше один способ загрузки с диска: это, так называемый, метод 
"склеенных" файлов. На диске такие файлы выглядят единым файлом БЕЙСИКА, но 
содержат в себе и коды экрана-заставки и рабочие коды программы. Такие файлы,
на мой взгляд, не являются крайней необходимостью, но они есть, и с ними надо 
считаться.
     Способ создания таких файлов прост... (естественно, что простыми командами 
ТРДОС тут не обойтись, и загружать такой файл мы будем своим загрузчиком).
     При создании такого файла желательно, чтобы файлы на диске располагались  
по порядку их загрузки, ПОСЛЕ файла БЕЙСИКА (можно, конечно их расположить в 
любом порядке, но это очень усложнит Вам вычисления в процессе работы Вашего  
загрузчика). Ну, и, естественно, эта программа не должна содержать других,  
старых  -  "чужих" подпрограмм загрузки с диска , а то может произойти конфликт.
     Захотелось, к примеру, Вам объединить в 'склееный' файл программу 
"PULSE WARRIOR ". Вся программа состоит из 3х файлов:

"PULSE.WR" - файл БЕЙСИКА
"pulse.w$" - файл экрана
"pulse.w1" - файл основного тела программы
     Из программы БЕЙСИКА мы узнаем ,что сначала грузится файл экрана, а затем 
основные коды программы по адресу 24500. RAMTOP снижена оператором CLEAR на  
24499. Стартует программа по адресу 24500 , а затем по адресу 62003.
     Для начала на диск запишем простую программу на БЕЙСИКЕ под именем 
"PULSE.W" и зарезервируем в первой строке, после оператора REM, область под наш
загрузчик .
1  REM : В этой строке резервируется место под наш
         загрузчик; (эдак, байтов на 40)
2  RANDOMIZE USR 23872 :REM: А это запуск загрузчика

     Далее, на ДРУГОЙ диск копировщиком копируем 2 файла
          " pulse.w$" и "pulse.w1"
И теперь нам потребуется программа, которая могла бы редактировать сектора 
диска на нулевой дорожке, т.е. область каталога.
     Это  может быть "DISK DOCTOR", а может, Вы захотите написать такую 
программку сами: тех знаний, которые Вы уже получили, дочитав до этого места -
вполне  хватит (всего лишь и надо считать с диска в ОЗУ первые СЕМЬ секторов 
нулевой дорожки, изменить с помощью какого-нибудь MONS'а в этой области ОЗУ 
всего лишь 1 байт и записать эту область ОЗУ на диск туда же, откуда и 
считывали).
     В области каталога находим имена наших программ и внимательно смотрим на 
байты, отвечающие за ОБЪЕМ ФАЙЛА В СЕКТОРАХ (14-й байт от первой буквы имени 
файла). В нашем случае это будет (к примеру):
   у файла  " pulse.w$" -  27 секторов ( #1B ),
   а у       "pulse.w1" - 101 сектор   ( #65 ).
     Складываем в уме 101 и 27 и получаем 128 (# 80) секторов. Аккуратно 
вписываем эту цифру в заголовок файла "pulse.w$" вместо цифры 27 (#1В) и 
записываем изменения на диск.
     Теперь у нас файл "pulse.w$" по объему секторов стал равен объему обоих 
файлов, т.е. он стал содержать в себе и экран, и рабочие коды программы.
     Возвратимся к первому диску, и в файле БЕЙСИКА в зарезервированном  месте  
первой  строки, с адреса 23872 (#5D40), любым способом вписываем коды 
следующей программы:

; КОДЫ в 'HEX'   МНЕМОНИКА
                 ORG #5D40      ; адрес первой
                                ; строки 23872
 31,B3,5C        LD SP,#5FB3    ; CLEAR 24499
 F3              DI
 ED,5B,F4,5C     LD DE,(#5CF4)  ; текущая дорож-
                                ; ка и сектор
 21,00,40        LD HL,#4000    ; адрес экранной
                                ; области
 01,05,1B        LD BC,#1B05    ; 27 секторов или
                                ; 6912 байт
                                ; и функция
                                ; #05 в 'С'
 CD,13,3D        CALL #3D13     ; загрузить на
                                ; экран.
 ED,5B,F4,5C     LD DE,(#5CF4)  ; взять следующие,
                                ; текущие
                                ; дорожку и сектор
 21,B4,5F        LD HL,#5FB4    ; адрес 24500
 01,05,65        LD BC,#6505    ; 101 сектор
 CD,13,3D        CALL #3D13     ; загрузить сектора
                                ; в ОЗУ
 CD,B4,5F        CALL #5FB4     ; первый старт прог-
                                ; раммы
                                ; по адресу 24500
 C3,33,F2        JP F233        ; второй старт прог-
                                ; раммы
                                ; по адресу 62003
     Теперь, как только коды загрузчика окажутся на месте, и БЕЙСИК-программа 
запишется на диск, например, под именем " P.W.", нам остается со второго
диска скопировать сюда наш склеенный файл.
     И опять программой ДИСК ДОКТОР внесем изменения в область каталога.
А именно, посмотрев сколько занимает секторов наш БЕЙСИК-файл с загрузчиком,
складываем (опять в уме) это число с объемом нашего 'склеенного' файла и 
вписываем полученный результат в байт 'количество секторов' в БЕЙСИК заголовок.
     В нашем случае количество секторов у БЕЙСИК файла равно одному, а общее 
количество стало быть 129 (#81).
     Все -  у нас на диске оказался 'склеенный' файл с именем "P.W." и типом 
БЕЙСИК. Остальные файлы можно безболезненно стирать.
     При запуске такого файла система загрузит поначалу только БЕЙСИК часть, а 
уж БЕЙСИК нашим загрузчиком догрузит все остальное.
     И последнее, что можно сказать по теме 'Считывание с диска', это то, как 
можно разделять большие файлы ,записанные на диск с магнитофонной ленты.
В кассетных версиях, есть такие программы, которые загружаются единым файлом,
начиная с экрана и почти до конца ОЗУ компьютера. Такие файлы могут  иметь  
длину до 45 Килобайт и больше, есть файлы даже в 49 Килобайт. Таких программ 
много, и возникает вопрос:
                " ЧТО ДЕЛАТЬ ?"
     Один способ известен уже давно - это применить популярный кассетный 
копировщик  "COPY-COPY" для разделения программы на несколько кусков. Такими 
составными коммандами копировщика, как
     * LOAD (ХХ    - загрузка первых ХХ  байтов файлa;
     * LOAD (ХХ TO - загрузка файла БЕЗ первых ХХ байтов,
можно изловчившись за 1-2 раза разделить любой файл. Для дисковых версий такие 
большие файлы легче делить на куски длинной кратной 256 (т.е. размеру сектора).
Выделить, к примеру, кусок экрана:
           длина = 6912 байт = 27 секторам .
Второй кусочек областью от адреса 23296 до 25343
           длина = 2048 байт= 8 секторам.
И последнй кусок - с адреса 25344 и до конца файла.
     Переписав без особого труда эти кусочки на диск, мы сначала будем загружать 
экран, затем кусок с адреса 25344 и оставшийся кусочек в 2 Килобайта в экранную 
область. Единственное, что нам останется сделать, так это предварительно вписать 
в свободное место на экране, или в другое место, коротенькую программу 
переброса этих самых 2048 байт на свое законное место, т.е. на адрес 23296. 
Последней строкой в БЕЙСИКЕ у нас должна находиться строка RANDOMIZE USR <адрес 
программы переброса>, а последними строками программы переброса - команды
            LD SP,STACK  ; 'родной' стек программы
            JP START     ; запуск программы

     Но есть и другой способ разделения файлов. Если у вас файл 'влез' в 
копировщик "TAPE <-> DISK" (например, копировщик "L-COPY" может записать файл 
длиною в 45056 байтов), то такой файл можно разделить и на диске (если у Вас 
компьютер 128 Килобайт ,то копировщик ТD.COPY может взять в себя любой 
сверхдлинный файл с ленты и записать его на диск).
     Но вот Вы скопировали файл с ленты на диск... После копирования, на диске 
у Вас получился файл длиною в 45056 байт (#В000), или 176 (#В0) секторов и 
адресом загрузки 16384 (#4000). Стартуем программу 'DISK DOKTOR' и выходим в 
режим редактирования НУЛЕВОЙ дорожки. Находим заголовок нашего файла,
(предположим имя файла у нас - "FILE 1"). Внизу этого заголовка создаем еще 2 
заголовка (каждый заголовок занимает 16 байт).
 -  сначала впишем имена "FILE 2" и "FILE 3";
 -  затем  в  обоих  файлах пометим ,что это коды, вписав после имен файлов 
    символ 'С';
 -  после идут 2 байта длины программы в байтах. Сделаем файл "FILE 2" длиною в 
    2048 (#0400) и адресом загрузки 23296 (#5В00), а "FILE 3" - длиною
в 36096 (#8D00) и адресом загрузки 25344 (#6300). Файл же "FILE 1" будет 
экраном, загрузка в 16384 (#4000) и длиною 6912 (#1В00);
 -  изменим во всех заголовках байты, отвечающие за адрес загрузки, (два байта) 
и длины (два байта);
 -  затем изменим байт, отвечающий за количество секторов;  первый файл у нас 
экран, длиною в 27 (#1В) секторов, второй #04 сектора и последний 141 (#8D) 
секторов.
 - теперь начнем изменять последние два байта в каждом загловке: байт 'номер 
первого сектора файла' и байт 'номер начальной дорожки файла';
 - изменять заголовок файла "FILE 1" мы не будем, а только возьмем из него 
значение байта "СЕКТОР" и байта " ДОРОЖКА";
 - подсчитаем, какой номер Начального сектора у нас будет во втором файле 
"FILE 2". Сложим номер начального сектора файла "FILE 1" с объемом файла в 
секторах. Полученный результат НАЦЕЛО разделим на 16. ОСТАТОК от деления есть 
НОМЕР начального сектора файла "FILE 2" (если остатка нет, то номер сектора 
будет 0);
 - число же, получившееся при делении, надо сложить с числом 'НОМЕР ДОРОЖКИ' 
файла "FILE 1", и мы получим номер дорожки файла "FILE 2" (естественно, если 
результат деления меньше единицы, то это НОЛЬ, и складывать номер дорожки надо 
с НОЛЕМ, т.е. следуюший файл расположен на этой же дорожке);
 - вписываем полученные резултаты вычислений СЕКТОРА и ДОРОЖКИ в заголовок 
файла "FILE 2".
 - точно такие же вычисления произведем для последнего файла, "FILE 3",
только исходя уже из данных файла "FILE 2".
 -  после того, как все подсчитано, все байты записаны, нам остается изменить 
один байт на ВОСЬМОМ системном секторе нулевой дорожки, а именно - байт  
"количество файлов на диске". Расположен он на 228 (#Е4) месте от начала 
сектора. Увеличим его значение на 2;
 -  если Вы сделаете все правильно, то у Вас на диске теперь будет вместо 
одного большого - 3 файла, и Вам останется только написать для них программу
загрузки (что не составит для Вас, я надеюсь, теперь большого труда).
 Приблизительно так же можно разделить дисковый MAGIC- файл, и создав свой 
загрузчик запускать его не командой GOTO , а 'нормальными' командами. Но об 
этом чуть позже - MAGIC-файлам будет посвящена отдельная глава.

     А теперь поговорим о ЗАПИСИ ...
     Наиболее часто ЗАПИСЬ файла на диск необходима в системных программах, где  
активно идет обмен информацией с различными файлами. Это и БАЗЫ ДАННЫХ, и 
ЭЛЕКТРОННЫЕ ТАБЛИЦЫ, и ПОИСКОВЫЕ СИСТЕМЫ. Или это файлы, где необходимо 
сохранять и считывать пользовательские наработки (РЕДАКТОРЫ ТЕКСТОВ, ГРАФИЧЕСКИЕ
РЕДАКТОРЫ, АССЕМБЛЕРы, и др.).
     В некоторых случаях проблема решается средствами стандартных команд ТРДОС,
в некоторых средствами ФУНКЦИЙ ТРДОС, а в иных (таких мало), прямым
программированием контроллера (например, текстовый редактор WORD, различные 
D.C.U., A.D.M., форматеры, исправители дисков, система IS.DOS и др.). В играх 
ЗАПИСЬ используется в случаях, когда нужно сохранить состояние игры ("SIM SITY",
"ELITE", "TAU CETI"), или когда необходимо записать результаты игры - таблицу 
выигрышей.
     Как и в предыдущих случаях, мы не будем рассматривать методы, основанные 
на командах ТРДОС и случаи, когда всего везде хватает. Единственное, что можно  
сказать по этому поводу, так это то, что такими способами, (когда все 
"тип-топ"), адаптированы графический редактор "ARTIST  2", текстовый редактор 
"T.L.W.+" и многие другие программы.
     Для случаев, когда можно использовать функцию #0В - запись файла и #0С  -  
запись файла БЕЙСИКА, единственное  добавление: Ваша программа сначала должна 
проверить имя Вашего записываемого файла на предмет отсутствия такого же имени 
на диске. И если такое имя на диске есть, то 'задать' вопрос о смене введенного  
имени или о стирании старого файла с диска.
Если этого не сделать, то у Вас на диске могут оказаться файлы с идиентичными 
именами и типами, а это недопустимо, если поступать по правилам!
     Рассмотрим, в идеале, что должна делать программа, которая записывает 
данные на диск в виде файла:
1. Выбрать дисковод ( #01 функция).
2. Настроить диск ( #18 функция).
3. Запросить у пользователя имя файла (длину, адрес начала и тип ), а если надо,
   то распечатать на экране каталог диска.
4. Перенести введенную информацию в системную область, в адрес #5CDD.
5. Дать команду "ПОИСК файла на диске".
6. Если имя такое есть, запросить об удалении старого или об изменении 
   введенного имени.
7. Удалить старый файл, если нужно.
8. Узнать из 8-го системного сектора диска первый СВОБОДНЫЙ сектор и дорожку, 
   а, также, количество свободных секторов на диске.
9. Подсчитать, хватит ли места на диске для Вашей программы, и если нет, то 
   попросить сменить диск.
10.Узнать из 1 - 7 сектора каталога первое свободное место для заголовка (по 
   символу 0).
11.Если все в норме, то записать полный заголовок Вашего файла в область 
   каталога на первое свободное место.
12.Записать блок данных из ОЗУ на диск с первого СВОБОДНОГО сектора диска.
13.Скорректировать данные на 8-ом системном секторе диска, а именно:
         байт 'количество свободных секторов',
         байт 'количество удаленных файлов',
         байт ' первый свободный сектор',
         байт ' первая свободная дорожка',
         байт ' число файлов на диске',
14. Выйти в основную программу.
     Конечно, на практике половина этих пунктов не соблюдается; для этого бы 
потребовалось слишком много места в ОЗУ, но некоторые пункты являются 
обязательными.
     Встает вопрос: "Как же впихнуть такую огромную подпрограмму в, и без того,     
ограниченное пространство ОЗУ игровой или системной программы" ?
     Если внимательно присмотреться, то можно заметить, что, как для загрузки,
так и для записи, МИНИМАЛЬНЫЕ данные которые нам требуются - это:
      . номер первой дорожки файла,
      . номер начального сектора файла,
      . реальная длина сохраняемых/загружаемых блоков.
И если точно знать первые два параметра и передавать их в подпрограмму ЗАПИСИ,
то можно избавиться от многих проблем. Но как же узнать эти самые параметры и 
как вносить эти все изменения в системную область диска? Да при помощи БЕЙСИКА!
Он нам будет и создавать файл и делать все остальное...
     Он же передаст все параметры этого файла в программу.
Назовем этот способ работы:
          'МЕТОДОМ ФИКСИРОВАННОГО ФАЙЛА'
                      ----
В  поцессе ВЗЛОМА адаптируемой программы, скинем на диск область ОЗУ, где лежат  
те данные, которые программа записывает и считывает во время своей работы.
Это  нужно делать в первичном состоянии игры, т.е. тогда, когда в области 
данных не произошли изменения.
     Предположим, что область данных программы занимает у нас 256 байт. После  
записи на диск у нас получится файл состояния игры, например, с именем 
"level 0" и длиною 256 байт. Теперь нам надо написать БЕЙСИК файл, который 
будет изначально формировать файл состояния игры, а также запускать игру и  
передавать данные о файле-подпрограмме работы с диском.
     Сделаем запрос имени файла, с которым потом будет работать программа, и 
перезапишем данные из файла "level0 " в файл с введенным именем.
10 INPUT " FILE ACCES ? "; A$
20 RANDOMIZE USR 15619:REM:LOAD"level 0"CODE 40000
30 RANDOMIZE USR 15619:REM:SAVE A$ CODE 40000,256
Теперь, когда файл состояния пересоздался (продублировался) с введенным именем,
нам нужно найти всего лишь НОМЕР его начального СЕКТОРА и НОМЕР ДОРОЖКИ.
Это без труда делается функцией:
           #0А - поиск файла по имени и типу (имя и тип файла по адресу 
системных переменных у нас уже есть - результат работы строки 30 БЕЙСИКА),
а затем функцией:
           #08 - чтение информации о файле.
     После этого осталось лишь сохранить в какой-нибудь ячейке ОЗУ данные из  
адреса #5CF4 / 5CF5 (сектор/дорожка), и можно приступать к загрузке тела игровой 
программы (можно сделать еще проще, если изначально все данные для файла 
состояния поместить в БЕЙСИК файле в НУЛЕВОЙ строке. Там же поместить и 
программу-опеделитель параметров файла).
     В теле игровой программы нами тоже должны быть внесены изменения.
Вместо обращения программы к магнитофону, мы должны вписать подпрограмму 
загрузки/выгрузки на диск, опираясь на сохраненные данные о секторе и о дорожке 
нашего файла. Используя все те принципы, которые используются при загрузке 
файлов (см.выше), несложно написать коротенькую подпрограмму, которая используя
функцию #06, будет сохранять состояние развития Вашей игры, конкретно в уже 
зафиксированный файл. Считывать тоже.
     При  неоднократном запуске программы с такой адаптацией, если на запрос  
"FILE ACCES?" Вы введете имя файла, который уже существует, то ТРДОС 
проигнорирует строку 30 БЕЙСИКА, т.к. файл с таким именем уже существует.
Но при этом в системной области ТРДОС оставит 'слепок'- имя и тип файла, и 
в основную программу, в конечном итоге, попадут координаты 'старого' файла, в  
котором сохранено состояние от предыдущего раза.
     Таким образом, "малой кровью" мы получим нужный результат. Правда, в таком 
методе есть один недостаток - невозможность сохранения предыдущих данных,
так как новые данные будут постоянно затирать старые. Но эту неприятность можно 
избежать простым копированием файлов предыдущих состояний на резервные диски и 
их переименованием.
     По такой, приблизительно, схеме адаптирована программа "ELITE" (адаптация  
"JOYSTICK CLUB") с сохранением боевого рейтинга пилота и остальных данных 
полета. Правда, там не используются ФУНКЦИИ ТРДОС, а программируется  
непосредственно контроллер дисковода. Но, в общем и целом, принципы сохранения 
состояния игры похожи.
                      * * *
Теперь, опираясь на все те знания, которые Вы уже почерпнули, Вы сможете 
адаптировать практически ЛЮБУЮ программу с кассеты на диск.
     Нетерпеливый читатель наверное воскликнет:
         "А на кой черт вся остальная книга?".
     Не торопитесь!!
Дело в том, что все самые интересные и сложные программы (а особенно, когда 
программы активно работают с диском), адаптируются методами, позволяющими  
непосредственно управлять дисковым накопителем, что гораздо экономичнее,
профессиональнее и удобнее. Правда, это намного сложнее, но!.. Как говорили
древние греки,-"Чем сложнее, тем проще!"
                 И вот тем,
        кто не успокоился на достигнутом,
            кто желает научиться: 
   - влезать в системную область диска, которую обычными методами не "достать";
   - форматировать диски не только стандартным способом;
   - каким образом прочитать диски других форматов (например от IBM PC);
   - как востанавливаются сбойные диски
             и многое-многое другое ...
     вот им то и предназначена оставшаяся часть книги.
           ****************************************************



СОДЕРЖАНИЕ:


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

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



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

Похожие статьи:
Разбиралка - Карта зоны игры THE GREAT ESCAPE (прохождение первого задания).
Клуб любителей SPECCY - Всем Привет !
Навины - новости, старости, слухи, приколы: "рано или позно вернемся всеравно на любимый Спекки!"
Открытые письма Nemo №2.3
Сначала - Закинутая в долгий ящик "читалка" была наконец извлечена на свет, с нее сдули пыль, причесали,подровняли и результат налицо.

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