Руководство к ZX-Spectrum. Глава 3.1

Глава 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-тиричном виде.