MSD #09
18 декабря 1999

Программирование - Оптимизация программ или пишем загрузчик в кодах.



                   Оптимизация программ
               или пишем загрузчик в кодах.

                                               MAX SNAKE / MSD


     Наверняка у вас есть любимая игра, у меня она тоже есть,
это Sim City. При ее частой загрузке, я обратил
внимание на то, что мне приходиться долго ожидать окончания
загрузки. В старые-добрые времена мне бы и в голову не пришло
смотреть из скольки файлов состоит данный шедевр, но времена
меняются. Теперь у меня не успокоится душа, пока Я не буду
знать, что программа занимает на диске минимум места.
     Итак, я захотел сделать программу, занимающую меньше
дискового пространства и желательно занимающую место одного
файла в каталоге. Сделать все это можете и вы, причем большими
знаниями можете и не располагать. Для желающих изучать ассемблер
это статья не будет лишней. Статья разбита на шаги, для простоты
понимания.


 Шаг 1-ый, смотрим каталог, видим:


    Файл       старт  длина

   SIMCITY .B    -      -     ┐
   SIMCITY1.C  28350  3825    ├ Обший объем 108 секторов
   SIMCITY2.C  24500  19059   │
   SIMCITY3.C  16384  4128    ┘


Примечание. В вашей версии атрибуты файлов могут быть другими,
файл загрузчик "SIMCITY .B" занимает 1 сектор.


      Теперь нужно разобраться в последовательностью загрузки
файлов, смотрим загрузчик. Сделать это можно при помощи
доктора, встроенного в Conver Commander v4.x. Или программы
Best View. Записываем основные, т.е. важные для вас сведения.
 Установка атрибутов экрана тоже важна, особенно если они
отличаются от черного.


Шаг 2-ой, смотрим загрузчик:


  CLEAR 24499              ; Установка стека минус единица
  LOAD "SIMCITY1" CODE 4E4 ; Загрузка 1-го файла
  RANDOMIZE USR 4E4        ; Запуск первого файла
  LOAD "SIMCITY2" CODE     ; Загрузка 2-го файла
  INK 0                    ; Чернила черные
  PAPER 0                  ; Бумага то же
  CLS                      ; Очистка экрана "чернотой" т.к.
  LOAD "SIMCITY3" CODE     ; загрузка 3-го файла в экран
  RANDOMIZE USR 24500      ; Запуск распаковки 2-го файла
  RANDOMIZE USR 20480      ; Запуск игры


Примечание. Не подумайте, что это загрузчик с магнитофона,
просто здесь показана сама последовательнось работы загрузчика.
По этой же причине опущена и нумерация строк.


      Теперь попробуем разобраться с основными понятиями. Стек
опускается вниз, чтобы не загрузить на него файл, при входе
в бэйсик его значение 655xx, если не ошибаюсь. 1-ый файл
является запакованной картинкой-заставкой с релоцируемым
адресом старта (т.е. может работать в любых адресах). Чтобы
не было видно "грязи" на экране от 3-его файла, предварительно
экран очищается черными чернилами и бумагой. Предпоследний
запуск, это скорее всего распаковка.
      Все. Теперь мы знаем все адреса работы загрузчика,
пора приступать непосредственно к упаковке файлов. Так же
этот процесс можно назвать "компрессией", только не путайте с
"архивацией" - это немного другая "компрессия".
      Для этого процесса можно взять MS_PACK, но он уже уступает
по скорости и результатам сжатия. Лучше воспользоваться
программой "HRUM3.5i", исправив адрес депакера на 23296 (!!!),
Также один из лучших - HRUST v1.3 & v2.1.


Шаг 3-ий, компрессируем файлы:


    Имя         Вид       Установка адреса  Получили    Старая
   файла     упаковщика     автостарта       длину      длина

SIMCITY1.С   MSP v1.7           -            3115        3825
SIMCITY2.C   HRUM v3.5i       24500         14060       19059
SIMCITY3.C   HRUM v3.5i       20480          3227        4128


Примечание. 1-ый файл-картинку мы извлекли и запаковали специ-
альным экранным компрессором "Maxsoft Screen Packer v1.7".
В 3-ем автостарт и есть запуск игры. Разница длин могла быть
и больше, напомню, ведь мы компрессируем уже компрессированое.


      Ну, вот и запаковали все это добро. Теперь на основе
всего записанного о работе загрузчика-оригинала будем писать
загрузчик в кодах. Нужно составить файлы в той последователь-
ности, в которой они грузятся, т.е. как раз так как стоят.
Загрузчик будет занимать 1 сектор (т.е длина до 256 б.). В
бэйсик загрузчик мы вставим прцедуру загрузки в кодах.


Шаг 4-ый, готовим бэйсик-часть загрузчика:
Пишем на бэйсике:


  10 REM ...................
............................
............................
..........................!
  20 RANDOMIZE USR VAL "23874"

Выходим в TR-DOS (RANDOMIZE USR 15616) и набираем:
SAVE "LOADER" LINE 0


Примечание. В 10-ой строке на месте точек мы запишем кодовую
часть загрузчика, а пока пишем там 80 с лишним каких-нибудь
знаков. В строке 20, адрес запуска кодового загрузчика, это
адрес идущий сразу за оператором " REM " + 2. При выгрузке файла
имя берем произвольное, потом переименуем. "LINE 0" - определяет
строку автостарта бэйсик загрузчика. (" LINE 10" - тоже самое).


      Вот написали бэйсик загрузчик. Для написания кодового
загрузчика возьмем STSv 4.x или выше, ниже тоже можно. В STS
клавиша "l" - LOAD, "s" - SAVE, чтобы набрать что-либо нужно
встать в нужную колонку и нажать "ENTER". Для перевода в деся-
тичную систему нажмите ss+3. Загрузились, жмем
"l", набераем имя "LOADER  B",жмем 2 раза "ENTER".
успешно встаем в колонку адресов и набераем "23874".


Шаг 5-ый, пишем загрузчик в кодах.


 Встаем в 3-ей колонке и с адреса 23874 начинаем набирать:

  XOR A         ; ┐   Очищаем бордюр
  OUT (254),A   ; ┘
  LD HL,22528   ; ┐   Очищаем экран чернотой.
  LD DE,22529   ; ├
  LD BC,767     ; │
  LD (HL),0     ; │
  LDIR          ; ┘

  LD SP,24499   ;     установка стека

  LD HL,32768   ; ┐  загрузка 1-го файла,
  LD B,13       ; ├  в "HL" - адрес загрузки,
  CALL TR       ; │  в "B" - длина 1-го файла в секторах
  CALL 32768    ; ┘  и распаковка.

  LD HL,24500   ; ┐  загрузка 2-го файла,
  LD B,55       ; ├  в "HL" - адрес загрузки,
  CALL TR       ; │  в "B" - длина 2-го файла в секторах
  CALL 24500    ; ┘  и распаковка.

  XOR A         ; ┐
  LD HL,22528   ; │   Снова очищаем экран чернотой.
  LD DE,22529   ; ├  т.к. 3-ий файл грузится в экран, а
  LD BC,767     ; │  у нас на экране заставка.
  LD (HL),0     ; │  Грязь сквозь атрибуты заставки будут
  LDIR          ; ┘  смотреться "нехорошо". Хотя кому как !

  LD HL,24500   ; ┐  загрузка 3-го файла,
  LD B,13       ; ├  в "HL" - адрес загрузки,
  CALL TR       ; │  в "B" - длина 3-го файла в секторах
  CALL 16384    ; ┘  и распаковка и автостарт на 20480

                ; JP 20480  Запуск игры

TR  LD DE,(#5CF4) ;  ┐  Подпрограмма вызова 5-ой функции
    LD C,5        ;  ├  TR-DOS, ей нужно:
    CALL #3D13    ;  │  HL - адрес загрузки
    RET           ;  ┘  DE - дорожка/сектор берем из перемен-
                  ;     ных TR-DOS, (текущее значение головки)
                  ;     B - количество читаемых подряд секторов
                  ;     с - номер функции (5)



Примечание: вместо "TR" набирайте "0", а потом, когда
будете знать значение "TR" подставите его вместо "0". В 5-ой
функции в регистре "DE" береться значение из переменной
TR-DOS с адресом #5CF4, где хранятся текущие координаты
головки дисковода. То есть, три файла будут считаны подряд,
достаточно знать лишь их длину в секторах.


      Внимательно проверьте правильность написанного. Если все
нормально, то можете сохранить, клавиша "S" - сохранение. После
сохранения файл-загрузчик будет иметь параметр старт в каталоге
равным 23867. То есть, STS сохранил его как кодовый файл с
расширением "B". Что конечно же нужно исправить. Загрузите
файл-загрузчик командой "LOAD" из TR-DOS, и тут же, не выходя
в бэйсик, сораните его командой "SAVE" c "LINE 0". Все, теперь
он будет запускаться. Осталось последнее.


Шаг 6-ой, составить файлы последовательно загрузке.


            Длина в
  Файл      секторах

SIM_CITY+.B    1     ┐
SIMCITY1 .C   13     │
SIMCITY2 .C   55     ├ Итого 82 секторов против 108.
SIMCITY3 .C   13     ┘


Примечание: Имя файла загрузчика - это ваш модифицированный
загрузчик, здесь имя выбрано произвольно. Для нормального
запуска между файлами не должно быть удаленных файлов, сами
догадайтесь почему.


      Пробуем запустить. Не получилось - проверьте все снова.
Получилось - отлично, теперь можно склеить файлы в один.
Сделать это можно программой "Conver Commander v4.x". Пометьте
файлы (4 шт.) и выберите функцию "Склеить файлы". В итоге вы
получите файл-загрузчик длиной 80 секторов.
      Вот и все, с оптимизацией покончено. А вот,как бы сделать,
чтобы игра делала откладки на диск ? Очень интересный вопрос,
пока я не настолько компетентен в этом, чтобы учить других,
может быть потом . . .



                                   MAX SNAKE / MSD / 1.12.1999







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

Похожие статьи:
Фантастика - крыса из нержавеющей стали (часть 9).
PC vs Speccy - битва титанов? (уроды пытаются сломить нас...)
Credits - Мнения редакции не всегда совпадают с мнением автора статьи.

В этот день...   17 августа