Из газеты MSD #9, Уфа, 19.12.99 Оптимизация программ или пишем загрузчик в кодах. 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