Диалекты бейсика для ZX Spectrum 1992 г.

Спектрум Бейсик - Запись скомпилированных программ.


ЗАПИСЬ СКОМПИЛИРОВАННЫХ ПРОГРАММ

Полученный в результате компиляции код не является законченным программным продуктом, так как для его работы необходимо присутствие в памяти компьютера самого бейсик-компиля-тора.

Существует несколько способов записи на внешний носитель скомпилированной программы в формате, пригодном для ее самостоятельного применения. Суть этих способов сводится к написанию по окончании компиляции специальной программы-загрузчика на Бейсике, которая автоматически загружает в память компилятор, скомпилированную программу и запускает ее на выполнение. Нередко программа-загрузчик содержит в себе так называемый «самоспасатель», позволяющий после окончания компиляции одним оператором RUN создать на ленте или на диске все необходимые файлы, составляющие законченный программный продукт.

Рассмотрим несколько методов создания из скомпилированного полуфабриката законченного программного продукта

Метод первый

Суть метода — создание на ленте или диске трех файлов, загрузчика на Бейсике, файла в машинных кодах, содержащего пакет рабочих процедур компилятора, и файла скомпилированной программы (табл. 3).

Таблица 3. Распределение памяти при работе с компиляторами.

P RAMT (23732)34-

Символы, определяемые пользователем

UDG (23675)-

Свободная область

ADDRCOMP+LENCOMP-

Область, занятая компилятором

ADDRCOMP-

Рабочая область компилятора

ADDRCOMP-WSPACE-

Свободная область

ENDVARS-

Область переменных скомпилированной программы

ENDPROG-

Скомпилированная программа RAMTOP (23730)-

EJJNE (23641)-

Переменные Бейсика

VARS (23627)-

Бейсик-программа PROG (23635)-

Для осуществления замысла необходимо произвести следующие действия:

1. загрузить компилятор;

2. набрать или загрузить с внешнего носителя исходный текст программы на Беисике;

3. произвести компиляцию;

4. освободить область Бейсика от исходной программы, выполнив оператор NEW;

5. написать загрузчик на Бейсике по следующей схеме (для работы с диском здесь и далее изменения обычные):

10 CLEAR ADDR—1: REM Установка RAMTOP 20 LOAD "COMPILER" CODE: REM Загрузка компилятора 30 LOAD "NAME" CODE: REM Загрузка скомпилированной программы

40 RANDOMIZE USR ADDR: REM Запуск скомпилированной программы

6. записать файлы на внешний носитель строкой операторов:

SAVE "NAME" LINE 10 : SAVE "COMPILER" CODE ADDRCOMP, LENCOMP : SAVE "NAME" CODE ADDR, ENDVARS—ADDR

- где ADDRCOMP — адрес загрузки компилятора (он не всегда совпадает с адресом его запуска), LENCOMP — длина компилятора, ADDR — адрес начала скомпилированной программы (указывается самим компилятором и равен практически всегда RAMTOP-1), ENDVARS — адрес окончания области переменных скомпилированной программы (также выводится самим компилятором). Значения ADDRCOMP и LENCOMP для различных компиляторов сведены в табл. 4. Некоторые компиляторы, например, MCoder 2 или Tobos FP вместо адреса окончания скомпилированной программы выводят ее длину, в таком случае это значение прямо подставляется в оператор SAVE вместо выражения ENDVARS—ADDR.

Таблица 4. Параметры компиляторов, необходимые для записи готового программного продукта.

Комтшятор

ADDRCOMP

LGNCOMP

Адрес запуск* компилятор*

ZX-Compiler 1.0

59990

3600

60000

Softek IS

59300

6000

59300

MCoder 2

59990

5375

60000

Softek FP 1.1

59300

6050

59300

Softek FP 1.7

59300

6100

59300

Tobos FP

53100

12268

53100

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

10 SAVE "NAME" LINE 50: REM Начало *самоспасателя» 20 SAVE "COMPILER" CODE ADDRCOMP, LENCOMP 30 SAVE "NAME" CODE ADDR, ENDVARS—ADDR 40 STOP: REM Окончание «самоспасателя» 50 CLEAR ADDR—1 60 LOAD "COMPILER" CODE 70 LOAD "NAME" CODE 80 RANDOMIZE USR ADDR

После набора этого варианта загрузчика достаточно просто дать комайду RUN, и готовый программный продукт в виде трех файлов будет автоматически записан на внешний носитель. Теперь для запуска программы достаточно набрать LOAD "NAME".

Этот вариант при всех своих достоинствах, а именно простоте расчета адресов и минимальной суммарной длине файлов, не всегда удобен. Особенно это относится к компиляции больших программ. Действительно, когда верхняя граница области переменных скомпилированной программы подходит близко к нижней границе компилятора, есть смысл записать все это в виде одного файла, охватывающего область памяти от ADDR до ADDRCOMP+LENCOMP (см. табл. 4). Для таких случаев, главным образом, и предназначается следующий метод.

Метод второй

Он чрезвычайно прост, однако его применение сопряжено с несколько большим расходом памяти. На внешнем носителе формируются два файла: загрузчик на Бейсике и кодовый файл. Последний содержит скомпилированную программу, компилятор и некоторое количество неиспользованной памяти, находящейся между последним байтом скомпилированной программы и первым байтом области компилятора. Справедливости ради следует сказать, что эту область памяти нельзя считать полностью неиспользуемой, так как именно в ней располагается стек компилятора, но об этом чуть позже.

Для записи программного продукта этим методом необходимо составить следующий загрузчик на Бейсике:

10 CLEAR ADDR—1: REM Установка RAMTOP на адрес, на единицу меньший, чем начало скомпилированной прсграммы

20 LOAD "NAME" CODE: REM Загрузка скомпилированной программы

30 RANDOMIZE USR ADDR: REM Запуск программы

Затем нужно выполнить строку операторов:

SAVE "NAME" LINE 10: SAVE "NAME" CODE ADDR, LENGTH

- где ADDR — адрес начала скомпилированной программы, LENGTH — длина всего блока в кодах, рассчитываемая по формуле:

LENGTH = ADDRCOMP + LENCOMP - ADDR

~ где ADDRCOMP — адрес начала компилятора, a LENCOMP — его длина в байтах (см. табл. 4). Для простоты можно считать, что ADDRCOMP+LENCOMP=65535. Это позволит сохранить вместе с программой область определяемых пользователем символов, если, конечно, в этом есть необходимость. Естественно, что все операции по записи программы целесообразно, как и в первом варианте, поручить компьютеру. В этом случае программа-загрузчик будет иметь вид:

10 SAVE "NAME" LINE 40: REM Начало «самоспасателя»

20 SAVE "NAME" CODE ADDR, LENGTH

30 STOP: REM Окончание «самоспасателя»

40 CLEAR ADDR—1

50 LOAD "NAME" CODE

60 RANDOMIZE USR ADDR

И, наконец, для тех, кто, не считаясь с затратами времени, пожелает соединить преимущества двух описанных методов в одном, будет полезен третий метод.

Метод третий

Этот метод является наиболее трудоемким, но и самым эффективным. Его рекомендуется применять при создании законченного коммерческого продукта, так как именно этот способ удачно сочетает в себе как минимальное число файлов (два), так и наиболее эффективное использование места на магнитной ленте и объема памяти при работе программы. Основная идея этого метода заключается в размещении скомпилированной программы почти «впритык» к компилятору.

Метод требует специальной подготовки еще на этапе компиляции, поэтому приводим здесь подробный его алгоритм:

1. загрузить компилятор;

2. ввести исходный текст программы и запустить пробную компиляцию. По окончании запомнить стартовый адрес скомпилированной программы (ADDR) и адрес окончания области переменных (ENDVARS);

3. установить RAMTOP оператором

CLEAR ADDRCOMP-(ENDVARS-ADDR)-WSPACE-1 - где ADDRCOMP — адрес начала компилятора (см. табл. 4), ENDVARS и ADDR — соответственно, окончание и начало скомпилированной программы, запоминаемое после пробной компиляции, WSPACE — размер рабочего пространства (обычно от 130 до 200 байт), резервируемого на нужды самого компилятора;

4, скомпилировать программу еще раз по новому адресу, после чего сохранить на внешнем носителе блок машинных кодов, выполнив оператор:

SAVE "NAME" CODE ADDR, ADDRCOMP+LENCOMP—ADDR - где ADDRCOMP и LENCOMP — как и прежде, начальный адрес и длина компилятора (см. табл. 4}.

Бейсик-загрузчик для считывания и автоматического запуска скомпилированных программ в этом случае будет выглядеть так:

10 CLEAR ADDR—1 20 LOAD "NAME" CODE 30 RANDOMIZE USR ADDR

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

Кроме того, при работе с дисководом первый метод (с раздельным сохранением компилятора и скомпилированной программы) позволяет экономить место на дисхе за счет сохранения единственного файла с пакетом рабочих процедур компилятора и нескольких файлов с результатами компиляции различных программ, запускаемых разными загрузчиками.

При необходимости можно обеспечить сохранение в одном файле нескольких программ, скомпилированных в разные адреса. В этом случае все скомпилированные программы записываются на внешний носитель в виде одного файла вместе с компилятором и после загрузки запускаются по разным адресам. Адреса нужно выбрать таким образом, чтобы скомпилированные программы размещались впритирку друг к другу- это позволяет минимизировать размер файла*. Для большего удобства и во избежание разрушения уже скомпилированных программ рекомендуется транслировать фрагменты, располагая их в памяти «сверху вниз». Для начала необходимо установить RAMTOP на максимально высокий адрес, позволяющий разместить над ним первый фрагмент и рабочую область компилятора. После этого следует скомпилировать первую программу, затем опустить RAMTOP на величину необходимую для размещения следующей программы, и так до тех пор, пока не будут скомпилированы последовательно все программы. Затем остается лишь записать всю область памяти от RAMTOP до окончания компилятора на внешний носитель в виде единого блока кодов. Вызывающая программа пишется на Бейсике и также компилируется. Она содержит обращения к программам по адресам их начала. RAMTOP при загрузке устанавливается, как обычно, на адрес, на единицу меньший, чел адрес начала блока кодов.

При осуществлении этого варианта предварительно может потребоваться отдельная компиляция программ с целью определения размера каждой из них.

Таким образом, появляется реальная возможность организации процесса программирования путем разделения глобальной задачи на несколько независимых модулей. Кроме того, можно создавать наборы предварительно скомпилированных системных библиотек, пригодных для использования в различных программах. Проблемой остается лишь способ обмена данными между отдельно скомпилированными модулями. Вследствие того, что для каждого программного фрагмента при компиляции формируется своя область переменных, для передачи значений переменных от одного фрагмента к другому требуются специальные приемы. Практически это можно осуществить, например, путем побайтового обмене данными с помощью операторов РОКЕ и РЕЕК через специально отведенную область памяти.

Внешние процедуры в машинных кодах и таблицы пользователя (альтернативные символьные наборы и т. п.) могут располагаться в любом свободном месте памяти. Их можно оформлять как в виде отдельных файлов, так и присоединять к скомпилированной программе или самому компилятору. Впрочем, возможности человеческой фантазии поистине безграничны, поэтому предоставим читателю право самому придумать другие варианты использования богатейших возможностей, предоставляемых компиляторами Spectrum-Бейсика.




СОДЕРЖАНИЕ:
  1. Laser Basic - Вывод спрайтов на экран; Вывод на экран части спрайта; Перенос атрибутов; Преобразование окна экрана; Наборы переменных; Перемещение спрайтов; Наложение спрайтов; Копирование изображения с экрана в спрайт; Преобразование спрайтов; Скроллинг пейзажа; Изменение размеров области спрайт-файла; Вспомогательные графические операторы и функции; Определение столкновений спрайтов; Сервисные операторы и функции; Процедуры; Загрузка и запись программ.


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

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



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

Похожие статьи:
Железо - схема блокировки глючных портов на Scorpion и Profi.
Вступление - новый номер Target в новой оболочке.
Юмор - Штирлиц: Слоны идут на север.
Послесловие - история создания этого номера газеты.
Западная демoсцена - Kазалoсь, чтo нам пиздец. Оказалoсь, чтo не казалoсь.

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