Оптимизация программ
или пишем загрузчик в кодах.
MAX SNAKE / MSD
Наверняка у вас есть любимая игра, у меня она тоже есть,
это Sim City. При ее частой загрузке, я обратил
внимание на то, что мне приходиться долго ожидать окончания
загрузки. В старые-добрые времена мне бы и в голову не пришло
смотреть из скольки файлов состоит данный шедевр, но времена
меняются. Теперь у меня не успокоится душа, пока Я не буду
знать, что программа занимает на диске минимум места.
Итак, я захотел сделать программу, занимающую меньше
дискового пространства и желательно занимающую место одного
файла в каталоге. Сделать все это можете и вы, причем большими
знаниями можете и не располагать. Для желающих изучать ассемблер
это статья не будет лишней. Статья разбита на шаги, для простоты
понимания.
Шаг 1-ый, смотрим каталог, видим:
Файл старт длина
SIMCITY .B - - ┐
SIMCITY1.C 28350 3825 ├ Обший объем 108 секторов
SIMCITY2.C 24500 19059 │
SIMCITYЗ.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 "SIMCITYЗ" CODE ; загрузка 3-го файла в экран
RANDOMIZE USR 24500 ; Запуск распаковки 2-го файла
RANDOMIZE USR 20480 ; Запуск игры
Примечание. Не подумайте, что это загрузчик с магнитофона,
просто здесь показана сама последовательнось работы загрузчика.
По этой же причине опущена и нумерация строк.
Теперь попробуем разобраться с основными понятиями. Стек
опускается вниз, чтобы не загрузить на него файл, при входе
в бэйсик его значение 6SSxx, если не ошибаюсь. 1-ый файл
является запакованной картинкой-заставкой с релоцируемым
адресом старта (т.е. может работать в любых адресах). Чтобы
не было видно "грязи" на экране от 3-его файла, предварительно
экран очищается черными чернилами и бумагой. Предпоследний
запуск, это скорее всего распаковка.
Все. Теперь мы знаем все адреса работы загрузчика,
пора приступать непосредственно к упаковке файлов. Так же
этот процесс можно назвать "компрессией", только не путайте с
"архивацией" - это немного другая "компрессия".
Для этого процесса можно взять MS_PACK, но он уже уступает
по скорости и результатам сжатия. Лучше воспользоваться
программой "HRUMЗ.5i", исправив адрес депакера на 23296 (!!!),
Также один из лучших - HRUST v1.3 & v2.1.
Шаг 3-ий, компрессируем файлы:
Имя Вид Установка адреса Получили Старая
файла упаковщика автостарта длину длина
SIMCITY1.С MSP v1.7 - 3115 3825
SIMCITY2.C HRUM v3.5i 24500 14060 19059
SIMCITYЗ.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,(#5CFЧ) ; ┐ Подпрограмма вызова 5-ой функции
LD C,5 ; ├ TR-DOS, ей нужно:
CALL #3D13 ; │ HL - адрес загрузки
RET ; ┘ DE - дорожка/сектор берем из перемен-
; ных TR-DOS, (текущее значение головки)
; B - количество читаемых подряд секторов
; с - номер функции (5)
Примечание: вместо "TR" набирайте "0", а потом, когда
будете знать значение "TR" подставите его вместо "0". В 5-ой
функции в регистре "DE" береться значение из переменной
TR-DOS с адресом #5CFЧ, где хранятся текущие координаты
головки дисковода. То есть, три файла будут считаны подряд,
достаточно знать лишь их длину в секторах.
Внимательно проверьте правильность написанного. Если все
нормально, то можете сохранить, клавиша "S" - сохранение. После
сохранения файл-загрузчик будет иметь параметр старт в каталоге
равным 23867. То есть, STS сохранил его как кодовый файл с
расширением "B". Что конечно же нужно исправить. Загрузите
файл-загрузчик командой "LOAD" из TR-DOS, и тут же, не выходя
в бэйсик, сораните его командой "SAVE" c "LINE 0". Все, теперь
он будет запускаться. Осталось последнее.
Шаг 6-ой, составить файлы последовательно загрузке.
Длина в
Файл секторах
SIM_CITY+.B 1 ┐
SIMCITY1 .C 13 │
SIMCITY2 .C 55 ├ Итого 82 секторов против 108.
SIMCITYЗ .C 13 ┘
Примечание: Имя файла загрузчика - это ваш модифицированный
загрузчик, здесь имя выбрано произвольно. Для нормального
запуска между файлами не должно быть удаленных файлов, сами
догадайтесь почему.
Пробуем запустить. Не получилось - проверьте все снова.
Получилось - отлично, теперь можно склеить файлы в один.
Сделать это можно программой "Conver Commander v4.x". Пометьте
файлы (4 шт.) и выберите функцию "Склеить файлы". В итоге вы
получите файл-загрузчик длиной 80 секторов.
Вот и все, с оптимизацией покончено. А вот,как бы сделать,
чтобы игра делала откладки на диск ? Очень интересный вопрос,
пока я не настолько компетентен в этом, чтобы учить других,
может быть потом . . .
MAX SNAKE / MSD / 1.12.1999
Other articles: