Глава 3
Программы в ПЗУ.
Для работы компьютеру необходимо программное
обеспечение. Некоторую часть программного обеспечения по
многим причинам выгодно раз и навсегда встроить в ПЗУ.
Программы, записанные в микросхемы ПЗУ доступны процессору
немедленно, после включения питания, их нельзя изменить
стерять или потерять.
Машины семейства Спектрум имеют довольно большой объем
ПЗУ с программами и данными, необходимыми для запуска и
обслуживания периферийных устройств. Поскольку эти программы
судят в ПЗУ всегда, их не надо загружать с диска, как
например драйверы нестандартных принтеров.
По назначению, программы в ПЗУ делятся на: программы
запуска машины, базовую систему ввода-вывода (ROM-BIOS),
интерпретаторы языка бейсик и расширения ПЗУ, добавляемые в
случае установки дополнительных переферийных устройств.
В адресном пространстве Спектрума для ПЗУ отведен самый
нижний блок в 16К, начинающийся с адреса #0000. Не всем
моделям хватает этого размера. (Первый Spectrum-16K имел 16К
ПЗУ, а гораздо более мощный PROFI имеет 68К ПЗУ)
3.1 Программы запуска машины.
Такие программы выполняются всякий раз при включении
компьютера или нажатии на кнопку сброса. Хотя программист не
использует их, знать что они делают поучительно.
Работа программы состоит из нескольких фаз: проверка
работоспособности компьютера, инициализация памяти, проверка
на дополнительное оборудование.
Проверка работоспособности или POST (Power On Self-Test
; питание включено - самопроверка) важный шаг в подготовке
компьютера к работе. Программы, проверяющие отдельные
устройства, невелики и выполняются незаметно.
Программы иницализации компьютера существенно сложней.
Сначала отрабатывается программа установки стандартных
значений системных переменных. Затем запускается программа
инициализации переферийных устройств. После этого вы можете
увидеть фирменную заставку.
Если в системе имеется подключенный контроллер
дисковода, то управление передается дисковой операционной
системе (для того чтобы это быле действительно автоматически
необходимо установить на контролеере перемычку ). DOS
пытается найти диске файл с названием boot (TR-DOS) или
config.sys (SP-DOS) и если это удается, передает ему
управление. TR-DOS делает автостарт только в версии 5.1 и
выше.
3.2 ROM-BIOS
ROM-BIOS ялвется основной часть ПЗУ, которая активно
используется в течении всего времени работы компьтера.
Назначени ROM-BIOS обеспечивает все основные служебные
функции, необдимые для работы компьютера. Большей частью
BIOS управляет переферийными устройствами, такими как
магнитофон, дисковод, принтер, клавиатура, динамик или
экран.
Концептуально программы BIOS лежат между нашими
программами и аппаратурой. В действительности это означает,
что BIOS работает в двух направлениях в некотором
двухстороннем процессе. Одна сторона получает от программы
запросы на выполнение служебных функций BIOS, связанных с
вводом-выводом. Эти функции вызываются нашими программами.
Так как служебные функции будут рассмтриваться позже
намного подробнее, мы не будем здесь рассматривать, что они
делают, а перейдем к следующему вопросу.
3.3 Память под управлением операционной системы.
48К Символы псевдографики
Стек операционной системы (процессора)
Стек калькулятора
Рабочая область операционной системы
<байт разделитель #80>
буфер строчного редактора интерпретатора Бейсик
(Каждая строка оканчивается байтом #0D - перевод
строки)
Байт разделитель #80
Имена и значения переменных бейсик-программы
Текст бейсик-программы
Байт разделитель #80
Область размещения информации о каналах
Системные переменные TR-DOS
Системные переменные INTERFACE 1
#5C00 Системные переменные операционной системе
#5B00 Буфер принтера или сист. перем. 128К
#5800 Область атрибутов экрана
#4000 Область экрана
#0000 16К ПЗУ
Числа обозначают начала этих областей. Для большинства
указаны не адреса, а именно системные переменных в которых
содержиться соответствующие значения.
Если вам не интересно столь подробная информация, вы
можете обратиться к следующей:
Область зарезервированная пользователем
Область бейсик интерпретатора и системы
Информация о каналах
Системные переменные
Буфер принтера
Область атрибутов экрана
Область экрана
ПЗУ
128К. Основная память в 128К такая же как и в 48К, но в
буфере принтера находяться специальные системные переменные.
Страницы в основной памяти следующие:
0
2
5
ПЗУ
Страницы 1,3,4,6,7 отданы под RAM-диск. Каталог
RAM-диска находиться в седьмой странице, там же находиться
дополнительный экран, но этот экран не поддерживается ПЗУ.
PROFI. Страницы от #08 до #3F. Их наличие не
обязательно, но если они есть, то используются как RAM-диск
(как правило).
7 страница Здесь находиться операционная система
6 страница Дополнительный экран 512*240 точек
5 страница Цветной экран и модули управления аппаратурой
3 и 4 стрн. Резерв
2,1,0 Область транзитных программ
(#8000-#BFFF,#4000-#7FFF,#0000-#3FFF)
3.4 Системные переменные
Большинство подпрограмм BIOS управляется с помощью
данных, хранимых в области называемой областью системных
переменных. Данные этой области устанавливаются
подпрограммами ПЗУ во время начального запуска. Хотя
предпологается, что эти управляющие данные являются
собственнстью BIOS, наши программы могут их читать,а
некоторые даже изменять. Даже если вы не будете использовать
функции BIOS, Вам все равно не помешает ознакомиться с
системными переменными.
Для всех ячеек мы указываем: имя, объем, адрес шестнд.,
флажок (десят. адрес, смещение)
Флажок следует интепритировать следующим образом:
X - переменная содержит данные, которые не рекомендуется
менять во избежание неприятностей
N - переменная интенсивно используется операционной
системой, изменение ее значение не приведет к очень
недолговременному эффекту.
R - точка входа в процедуру BIOS, не переменная
Имена переменных чисто условная вещь, вы не можете
обращаться к переменным по именам (хотя при желании все
возможно), но названия переменных стали уже стандартными и
вы можете найти их в любой литературе по ZX-Spectrum.
3.4.1 Стандартные переменные 48К.
Эти переменные начинаются с адреса #5C00 и занимают 182
байта и присутствуют во всех моделях. На середину этой
области указывает IY=#5C3A, вы можете адресоваться к
переменным через регистр IY, но не можете изменять его, это
может привести к сбою в работе системы.
KSTATE, #5C00..#5C07, два блока по 4 байта, N
23552..23559
Эти восемь байт используются программами для обслуживания
клавиатуры, но внешними программами не используются.
Назначение байтов KSTATE:
#5C00 (IY-58) Значение 255, если блок свободен, либо код
#5C04 (IY-54) нажатой клавиши ( в верхнем регистре).
#5C01 (IY-57) Счетчик для устранения дребезга.
#5C05 (IY-53)
#5C02 (IY-56) Счетчик, определяющий задержку автоповтора
#5C06 (IY-52) действия клавиши.
#5C03 (IY-55) Код нажатой клавиши
#5C07 (IY-51)
LAST_K, 1 байт, #5C08, N, 23560, IY-50
Код последней нажатой клавиши с учетом регистров. Он
хранится здесь, пока не будет нажата другая клавиша
REPDEL, 1 байт, #5C09, , 23561, IY-49
Величина задержки между нажатием клавиши и автоповтором.
Нормальное значение 35 (#23).
REPPER, 1 байт, #5C0A,, 23562, IY-48
Скорость автоповтора при длительном нажатии на клавишу.
Нормальное значение 5.
DEFADD, слово, #5C0B, N, 23563, IY-47
Адрес первого параметра функции, предопределенной
пользователем, если используется, в противном случае 0.
Например:
DEF FN A(B)=...
В памяти храниться DEF FN A (B, #0E....)
^DEFADD
K_DATA, 1 байт, #5C0D, N, 23565, IY-45
Код цвета, заданный цифровой клавишей в режиме курсора
E. Хранится в этом байте до задания следующего кода.
TV_DATA1, 1 байт, #5C0E, N, 23566, IY-44
Последний код управления печатью в режиме курсора Е.
TV_DATA2, 1 байт, #5C0F, N, 23567, IY-43
Первый параметр переданный через AT или TAB. Не
изменяется до следующего управления.
STRMS, 38 байт, #5C10..#5C35, X, 23568..23605, IY-42
Область хранения информации о потоках. Первые две ячейки
указывают на канал потока -3, следующие на -2 и так до 15
потока. В этих ячейках храняться увеличенные на единицу,
смещения описателей канала относительно адреса указанного в
переменной CHANS. Если поток закрыт оба байта равны 0.
Следует учесть, что в мониторе 90 года по адресу
#5C34/5C35 (23604/23605) храниться код скорости
записи/чтения. При одинарной плотности 00/00, при двойной
плотности #82/#75, хотя достаточно занести в ячейку #5C35
любое значение, отличное от нуля, чтобы программа
записывалась на двойной скорости.
В ячейку #5C10 (23568) необходимо занести значение 8,
чтобы программа работала нормально, но ее нельзя было
редактировать и происходил автоматический сброс при нажатии
на кнопку сброса. (Напомню, что это о мониторе 1990 года)
CHARS, слово, #5C36, N, 23606, IY-4
Адрес расположения шрифта, на 256 больший
действительного адреса. Это связано с тем, что первые 32
символа являются непечатными и в таблицу не входят
(32*8=256). Нормальное значение #3C00
RASP, байт, #5C38,, 23608, IY-2
Длина звука предупреждающего о ошибке редактора.
Нормальное значение 0.
PIP, байт, #5C39,, 23609, IY-1
Длительность звука при нажатии на клавишу в режиме
редактирования. Нормальное значение 63, однако можно
обнулить его во избежание мелодичных звуков из динамика.
ERR_NR, байт, #5C3A, ,23610,IY+0
Число на единицу меньше кода сообщения, выдаваемого при
ошибке, включая сообщение о нормальном завершении работы
программы ОК. Нормальное значение #FF.
FLAGS, байт, #5C3B, X, 23611, IY+1
Флаговый байт. Назначение отдельных битов:
бит 0 =1, если не нужно выводить пробел перед
бейсик-оператором.
бит 1 =1, если при выводе на принтер, точнее в 3 поток.
бит 2 =1, при вводе в режиме L-курсора, иначе К-курсор
бит 3 =1, при ожидании ввода ввода символа в курсоре L,
иначе ожидается К-курсор
бит 4, (используется только в 128К), =1 при новом ПЗУ, иначе
0.
бит 5, =1 если нажата клавиша
бит 6, =1, если обрабатывается число, иначе строка
бит 7, =1, если редактирование, иначе выполнение программы.
TV_FLAG, байт, #5C3C, X, 23612, IY+2
Флаговый байт. Биты управляют выводом на экран:
бит 0, =1, при выводе в две нижние строки
бит 3, =1, при необдимости проверки
бит 4, =1, при выводе листинга программы
бит 5, =1, при необходимости очистки нижних строк
ERR_SP, слово, #5C3D, X, 23613, IY+5
Адрес, на который устанавливается стек при запуске
программы обработки ошибок. Изменив значение переменной,
можно подключить собственные процедуры обработки ошибки.
Пример. оператор CLEAR устанавливает нормальное
значение, поэтому переменную следует изменять позже подачи
оператора.
LIST_SP,слово, #5C3F, N, 23615, IY+5
Сохраняет адрес вершины стека, пока выводиться листинг.
MODE, байт, #5C41, N, 23617, IY+7
Число определяюще курсор:
0 курсор К,L,C
1 курсор Е
2 курсор G
Если занести значение большее, чем 2, то измениться вид
курсора, но все-таки будет работать как G
NEWPPC, слово, #5C42, , 23618, IY+8
Номер строки бейсик-программы, в которой расположен
следующий оператор. Изменяя эту и следующую переменную можно
организовать переход к любой строке и к любому оператору
программы.
NSPPC, байт, #5C44,, 23620, IY+10
Номер следующего выполняемого оператора в строке бейсик
программы. См также NEWPPC
PPC, слово, #5C45,, 23621, IY+11
Номер текущей, выполняемой строки бейсик программы. Если
выполняется строка без номера (непосредственная
интерпретация), то переменная содержит #FFFE
SUBPPC, байт, #5C47, , 23623, IY+13
Номер текущего оператора в строке программы
BORDCR, байт, #5C48, , 23624, IY+14
Атрибуты нижних строк и бордера. Нормально 56
E_PPC, слово, #5C49, , 23625, IY+15
Номер бейсик-программы, в которой находится курсор
VARS, слово, #5C4B, X, 23627, IY+17
Адрес начала области переменных бейсик программы
DEST, слово, #5C4D, N, 23629, IY+19
Адрес первого символа имени обрабатываемой в данный
момент переменной.
CHANS, слово, #5C4F, X, 23631, IY+21
Адрес начала области информации о каналах. По умолчанию
#5CB6
CURCHL, слово, #5C51, X, 23633, IY+23
Адрес первого описателя текущего канала.
PROG, слово, #5C53, X, 23635, IY+25
Адрес начала бейсик программы
NXTLIN, слово, #5C55, X, 23637, IY+27
Адрес начала следующей строки бейсик-программы
DATADD, слово, #5C57, X, 23639, IY+29
Адрес последнего считанного оператором READ объекта из
бейсик-программы.
E_LINE, слово, #5C59, X, 23641, IY+31
Адрес начала редактируемой строки
K_CUR, слово, #5C5B, , 23643, IY+33
Адрес символа редактируемой строки, на которую
установлен курсор.
CH_ADD, слово, #5C5D, X, 23645, IY+35
Адрес следующего интерпретируемого символа
бейсик-программы.
X_PTR, слово, #5C5F, X, 23647, IY+37
Адрес символа бейсик-строки, вслед за которым установлен
знак ? при обнаружении синктаксической ошибки.
WORK_SP, слово, #5C63, X, 23651, IY+41
Адрес начала рабочей области бейсик-программы
STKBOT, слово, #5C65, X, 23653, IY+43
Адрес начала стека калькулятора
STKEND, слово, #5C65, X, 23653, IY+43
Адрес вершины стека калькулятора.
BREG, байт, #5C67, N, 23655, IY+45
Регистр В калькулятора
MEM, слово, #5C68, N, 23656, IY+46
Адрес области памяти, используемой калькулятором.
FLAGS2, байт, #5C6A, X, 23658, IY+48
Флаговый бит, назначение битов следующие:
бит 0 =1, при необходимоти очистить основной экран
бит 1 =1, если буфер принтера уже использовался
бит 2 =1, если основной экран уже очищен
бит 3 =1, если включен С курсор
бит 4 =1, установлен при использовании К-курсора
биты 5,6,7 используются только в мониторе 90 года:
бит 5 =1, при необходимости выводить расширенную информацию
о заголовке при считывании с кассеты.
бит 6 =1, при выводе в монитере-отладчике символьных данных
бит 7 =1, при выводе в шестнадцатиричном виде (в
мониторе-отлдчике).
DF_SZ, байт, #5C6B, X, 23659, IY+49
Количество строк в нижнем (служебном) экране. Нормальное
значение 2. Занеся туда число 0, вы устроите некое подобие
защиты.
S_TOP, слово, #5C6C, , 23660, IY+50
Номер строки бейсик-программы, начиная с которой
выводиться автоматический листинг.
OLDPPC, слово, #5C6E,, 23662, IY+52
Номер строки программы, с которой будет продолжено
выполнение по вводу оператора CONTINUE.
OSPPPP, байт, #5C70, , 23664, IY+54
Номер оператора в строке, который будет выполнен по
вводу оператора CONTINUE.
FLAGX, байт, #5C71, N, 23665, IY+55
Флаги оператора INPUT:
бит 1 =1, если вводиться новая переменная.
бит 5 =1, если работает INPUT, иначе редактирование
бит 6 =1, при обработке строки введенной через INPUT
бит 7 =1, если выполняется INPUT LINE
STRLEN, слово, #5C72, N, 23666, IY+56
Длина обрабатываемой символьной переменной, ранее
определенной или идентефикатор новой в младшем байте.
T_ADDR, слово, #5C74, N, 23668, IY+58
Адрес следующего элемента в таблице синтаксиса,
расположенной в ПЗУ, точнее говоря, в таблице классов
операторов.
SEED, слово, #5C76, , 23670, IY+60
Значение используемое для вычисления псевдослучайного
числа.
FRAMES, три байта, #5C78..#5C7A, N, 23672..23674, IY+62
Системный таймер. Увеличивается каждые 1/50 секунды на
единицу.
UDG, слово, #5C7B, , 23675, IY+65
Адрес начала области, используемой для размещения
определяемых пользователем символов.
COORDS, два байта, #5C7D и #5C7E, , 23677, IY+67
Координаты X и Y последней изображенной точки.
P_POSN, байт, #5C7F, ,23679, IY+69
Позиция следующей печати на принтере. Определяется как
33-n (#21-n)
PR_CC, слово, #5CB0, X, 23680, IY+70
Адрес памяти, используемой как буфер принтера
ECHO_E, 2 байта, #5C82, , 23692, IY+72
Позиция печати (строка и колонка) следующего символа
бейсик-строки.
DF_CC, слово, #5C84, , 23684, IY+74
Адрес байта, соответствующий верхней линии точек
знакоместа, в которое был осуществлен последний вывод.
DF_CCL, слово, #5C86, , 23696, IY+76
Тоже, что и DF_CC, но для командых строк.
S_POSN, 2 байта, #5C88, , 23688, IY+78
Координаты позиции вывода на экран. Представляются как
дополнение до 24 строки и 33 столбца.
S_POSNL, 2 байта, #5C8A, , 23690, IY+80
Координаты печати для командой строки.
SCR_CT, байт, #5C8C, 23692, IY+82
Число, на единицу большее числа строк для скроллинга.
ATTR_P, байт, #5C8D, , 23693, IY+83
Постоянные атрибуты экрана.
MASK_P, байт, #5C8E, , 23694, IY+84
Маска для разделения постоянных и уже существующих
атрибутов при выводе на экран. Если в MASK_P бит установлен,
то соответствующий бит атрибута при выводе на экран не
изменяется.
ATTR_T, байт, #5C8F, N, 23695, IY+85
Временные переменные, используемые при выводе на экран.
MASK_T, байт, #5C90, , 23696, IY+86
Маска для разделения временных атрибутов и уже
выведенных на экран. См MASK_P
P_FLAG, байт, #5C91, , 23697, IY+87
Управляющие биты вывода на экран. Четные атрибуты
используются для постояных параметров, нечетные для
временных.
0/1 бит = при OVER 1
2/3 бит = при INVERSE 1
4/5 бит = при INK 9
6/7 бит = при PAPER 9
MEMBOT, 30 байт, #5C92..5CAF, N, 23698
Область значений калькулятора, которые неудобно хранить
на стеке калькулятора.
NMIADD, 2 байта, #5CB0, ,23728, IY+118
Из-за ошибки в ПЗУ не используется, хотя должна хранить
адрес процедуры обработки немаскируемых прерываний.
RAMTOP, слово, #5CB2, X, 23730, IY+120
Адрес последнего байта системной области ОЗУ.
P_RAMT, слово, #5CB4, , 23732, IY+122
Адрес последнего байта рабочего ОЗУ. В компьютере с ОЗУ
48К должно содержать 65535 #FFFF, компьютеры 128К также
имеют здесь значение #FFFF
3.4.2 Системные переменные монитора 1990 года
Монитор 1990 года имеет несколько новых режимов, а также
встроенных монитор-DUMPER, который тоже имеет свои режимы.
Для хранения этих режимов монитор также использует системные
переменные. Хоть эти переменные были описаны и предыдущей
подглаве, мы все же выделим их отдельно.
#5C34 - хранит в себе 0 при записи на одинарной плотности и
#5С35 - 82 и 75 при записи на двойной частоте.
#5C10 - должно содержать 8, если вы желаете, чтобы произошел
полный сброс при подачи сигнала RESET
#5CAA - хранит текущий адрес монитора-DUMPERа
#5САС - адрес, по которому храниться текущий регистр.
#5С6А - в трех стрших битах хранит режимы
бит 5=1 при выводе расширенной информации о файле
(при считывания с кассеты)
бит 6=1 при выводе в мониторе в числовом виде
бит 7=1 при выводе в мониторе в 16-тиричном виде.