ZX-Ревю 1991 №10 1990 г.

Секреты ПЗУ - Подпрограмма INITIALIZATION.


Секреты ПЗУ

Подпрограмма INITIALIZATION.

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

11B7-11CA - NEW

Выполняются необходимые подготовительные операции для работы команды NEW. Регистры процессора выставляются в соответствии со значениями системных переменных RAMTOP, RASP, PIP, PRAMT, UDG. В аккумуляторе устанавливается FF.

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

11CB-11D9 - START/NEW

Это точка входа. Сюда Вы попадаете после включения питания компьютера. В этом случае в аккумуляторе содержится 0, а в паре DE - FFFF. Если же Вы попали сюда после исполнения команды NEW, то в аккумуляторе - FF, а в паре DE - значение (RAMTOP).

По порту FE выдается байт 7, что означает - бордюр белый. Инициализируется регистр I.

11DA-11DC RAM-CHECK

Отсюда начинается проверка ОЗУ.

11DC-11E1 RAM-FILL

Сначала в каждый байт ОЗУ засылается число 02. Засылка этого числа идет сверху вниз. Если первое включение, то с адреса FFFF до адреса 3FFF, а если по команде NEW, то с адреса (RAMTOP) до 3FFF.

11E2-11EE - RAM READ

Проверяется действительно ли в ячейках ОЗУ содержится число 02.

Проверка идет снизу вверх. Сначала в нижней ячейке содержимое уменьшается на 1. Если достигнут 0, значит память неисправна и следует переход на 11EF (RAM-DONE)- при этом регистр HL, содержащий адрес проверяемой ячейки становится как бы указателем верхнего физического предела памяти.

Вновь содержимое уменьшается на единицу. Должен быть 0. Если это не так - ошибка и прямой проход на RAM-DONE. HL указывает на вершину работоспособной памяти. Если все в порядке, переход в начало RAM-READ для проверки следующей ячейки. Когда все ячейки проверены - тоже переход на RAM-DONE.

11EF-1218 RAM-DONE

Из альтернативного набора в регистрах процессора восстанавливаются запомненные там значения системные переменных. Это важно при выполнении команды NEW, а для первого включения (системного рестарта) - безразлично.

Если идет инициализация после NEW выполняется переход на 1219 (RAM-SET), в противном случае работа продолжается.

Значение P-RAMT выставляется по содержимому HL (по результатам проверки).

В паре DE выставляется адрес 3EAF, который относится к таблице знакогенератора и соответствует концу шаблона буквы "U" (21-ая буква).

В паре BC выставляется число 00A8, что соответствует размеру памяти, отводимой под 21 символ UDG (каждому по 8 байтов).

Изображения двадцати одного символа копируются из знакогенератора ПЗУ в область графики пользователя UDG. это их первоначальная установка. Далее пользователь

сможет задавать их такими, какими ему надо.

1219-12A1 - RAM-SET

Эта весьма объемная процедура является общей для первого включения компьютера и для исполнения команды NEW.

Выставляется значение RAMTOP.

В системной переменной CHARS, от которой зависит, в каких адресах памяти расположен знакогенератор, выставляется исходное значение 3C00.

В ячейке, на которую указывает RAMTOP, устанавливается значение 3E, а адрес нижележащей ячейки засылается в регистровую пару SP. Тем самым на вершине памяти организовался машинный стек.

Адрес ячейки, находящейся еще на два байта ниже, засылается в системную переменную ERR-SP. Теперь в этих ячейках можно размещать адрес процедуры, к которой должен происходить переход при ошибке.

Инициализация продолжается:

1. Включается режим обработки прерываний IM1.

2. В индексный регистр IY засылается адрес 5C3A. Он служит как базовый для работы с таблицей системных переменных. Пока Вы работаете в БЕЙСИКе, это значение хранится там всегда, его менять нельзя.

3. В системную переменную CHANS засылается адрес 5CB6, используемый как базовый адрес таблицы, в которой содержится информация о каналах.

4. Начальная информация о каналах (15 байтов) пересылается из таблицы, находящейся в ПЗУ по адресу 15AF в область, на которую указывает установленное значение CHANS.

5. Системная переменная DATADD устанавливается так, чтобы указывать на последний байт таблицы информации о каналах.

6. Следующий за ним адрес используется в качестве исходного значения системных переменных PROG и VARS.

7. В него засылается число 80H, которое является меткой конца области переменных (VARS).

8. Следующий за ним адрес используется для установки системной переменной E-

LINE.

9. B него засылается число 0D, т.е. в исходном состоянии строка редактирования содержит только байт "возврат каретки" (ENTER).

10. В следующий адрес засылается байт 80H, который является меткой конца области редактирования.

11. Адрес следующего байта используется для установки конца рабочей области БЕЙСИКа (системной переменной WORKSP) и для установки основания и вершины стека встроенного калькулятора (системных переменных STKBOT и STKEND, которые пока совпадают).

12. В системные переменные, отвечающие за установку цветовых атрибутов ATTR-P, ATTR-T, BORDER, засылается байт 38H, что означает:

FLASH 0; BRIGHT 0;

PAPER 7; INK 0.

13. Инициализируются системные переменные REPDEL и REPPER.

14. В системных переменных KSTATE-0 и KSTATE-4 устанавливается значение FF.

15. Исходная информация о потоках (14 байтов) пересылается из таблицы, находящейся в ПЗУ по адресу 15C6 в область системных переменных (начиная с адреса STRMS).

16. Вызовом CLEAR-PRB (0EDF) очищается буфер принтера.

17. В системной переменной DF-SZ устанавливается число 02, что означает "две строки в системном окне".

16. Вызовом CLS (0D6B) выполняется очистка экрана.

19. Выполняется печать системного сообщения (с) 1982 Sinclair Research Ltd, для чего в паре DE выставляется адрес этого сообщения - 1538 и вызывается процедура PO-MSG (0C0A).

20. Для продолжения работы выполняется безусловный переход на процедуру MAIN-1 (12A9).

Подпрограмма "MAIN EXECUTION LOOP".

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

12A2 - 12A8 MAIN-EXEC

В нижней части экрана устанавливаются 2 строки и вызовом AUTO-LIST (1795) включается режим автоматического листинга.

12A9-12AB - MAIN-1

Вызовом SET-MIN (16B0) устанавливается мининальный размер всех областей, находящихся выше E-LINE.

12AC-12CE - MAIN-2

Вызовом CHAN-ОРЕN (1601) при содержимом аккумулятора, равном нулю, открывается канал "K".

Вызовом EDITOR (0F2C) включается режим редактирования для создания БЕЙСИК-строки.

Вызовом LINE-SCAN (1B17) текущая строка проверяется на правильность синтаксиса. Проверкой седьмого бита системной переменной ERR-NR устанавливается правильность синтаксиса. Если он включен - все правильно и происходит переход на MAIN-2 (12CF).

Если есть ошибка, устанавливается с каким каналом идет работа (по 4-му биту системной переменной FLAGS2). Если это не канал "K" - переход на MAIN-4 (1303).

Если это канал "K", вызовом REMOVE-FP (11A7) удаляются все числа, записанные в интегральной форме, в системной переменной ERR-NR устанавливается FF и выполняется возврат к началу MAIN-2 (12AC).

12CF-1302 - MAIN-3

Проверка строки на синтаксис прошла успешно.

В системную переменную CH-ADD устанавливается адрес начала области редактирования. Вызовом E-LINE-NO (19FB) выясняется номер этой строки. Если это полноценное число - переход на MAIN-ADD (155D). В противном случае вызовом RST 0018 вводится первый байт этой строки. Если это 0D ("возврат каретки") - вновь переход на MAIN-EXEC (12A2). В противном случае речь идет о выполнении прямой команды.

Если необходимо, вызовом CL-ALL (0DAF) очищается область экрана и вызовом CLS-LOWER (0D6E) - очищается нижняя часть экрана. Устанавливается необходимый режим скроллинга и вызовом LINE-RUN (1B6A) запускается исполнение строки.

После окончания интерпретации и исполнения строки выполняется возврат на 1303 (MAIN-4).

1303-1312 - MAIN-4

Отсюда начинается подготовка к печати сообщения по результатам работы строки или, если ранее была выявлена ошибка в синтаксисе, по результатам ее обработки.

Включаются маскируемые прерывания, подготавливается прием нажатой клавиши, очищается буфер принтера, в аккумулятор засылается содержимое ERR-NR плюс единица.

1313-133B - MAIN-G

Обнуляются системные переменные FLAGX, DEFADD, старший байт X-PTR.

Поток 0 подключается к каналу "K".

Вызовом SET-MIN (16B0) очищаются рабочая область и стек калькулятора.

Вызовом CLS-LOWER (0D6E) очищается нижняя часть экрана.

Проверяется код сообшения, подлежащего печати. Если он от 0 до 9 - переход на MAIN-5 (133C).

Если он больше 9, то к нему прибавляется число 7, чтобы после цифр 0...9 следовали буквы A...R. (Код цифры 9 равен 57. Следующий за ним код 58 не означает букву "а", а соответствует двоеточию ":". Код же буквы "A" равен 65, отсюда и возникает смещение на 7 единиц).

133C-1372 - MAIN-6

Вызовом OUT-CODE (15EF) печатается код сообщения. Вызовом RST 0010 вслед за ним печатается пробел.

В регистровой паре DE устанавливается адрес 1391 - базовый адрес таблицы, содержащей сообщения БЕЙСИКа.

Вызовом PO-MSG (0C0A) с кодом сообщения, установленным в аккумуляторе, печатается необходимое сообщение.

Следом за ним печатается номер строки (вызовом OUT-NUM1 - 1A1B), затем знак ":" (вызовом RST 0010) и наконец номер оператора в строке (вызовом OUT-NUM1 - 1A1B).

Вызовом CLEAR-SP (1097) очищается область редактирования.

Если программа завершилась успешно (в ERR-NR по-прежнему содержится FF) выполняется переход на MAIN-9 (1386).

Проверяется код сообщения. Если он равен 9 (STOP statement) или 15 (BREAK into program), то продолжение работы должно идти со следующего оператора и выполняется переход на MAIN-6 (1373). В прочих случаях - с того же места - переход на MAIN-7 (1376).

1373-1375 - MAIN-6

Здесь увеличивается на единицу системная переменная SUBPPC (номер оператора в строке).

1376 - 1383 - MAIN-7

Подготавливается перенос содержимого из системных переменных NEWPPC и NSPPC в системные переменные OLDPPC и OSPPC.

1384-1385 - MAIN-8

Выполняется этот перенос.

1366-1390 - MAIN-9

Заключительные операции.

Тексты сообщений.

В каждом сообщении последний символ - инвертирован, т.е. код символа увеличен на 80H, что служит маркером, разделяющим сообщения друг от друга.

1391

80H

- маркер.

1392

Report 0

- "O.K."

1394

Report 1

- "NEXT without FOR"

13A4

Report 2

- "Variable not found"

13B6

Report 3

- "Subscript wrong"

13C6

Report 4

- "Out of memory"

13D2

Report 5

- "Out of screen"

13DF

Report 6

- "Number too big"

13ED

Report 7

- "RETURN without GOSUB

1401

Report 8

- "End of file"

140C

Report 9

- "STOP statement"

141A

Report A

- "Invalid argument"

142A Report B - "Integer out of range" 143E Report C - "Nonsense in Basic" 144F Report D - "BREAK - CONT Repeats" 1463 Report E - "Out of DATA" 147F Report G - "No room for line" 148F Report H - "STOP in INPUT" 149C Report I - "FOR without NEXT" 14AC Report J - "Invalid I/O device" 14BE Report K - "Invalid color" 14CC Report L - "BREAK into program" 14DE Report M - "RAMTOP no good" 14EC Report N - "Statement lost" 14FA Report O - "Invalid stream" 1508 Report P - "FN without DEF" 1516 Report Q - "Parameter error" 1526 Report R - "Tape loading error" В этой же таблице есть еще два "сообщения": 1537 ", " - запятая с пробелом

1539 "(с) 1982 Sinclair Research Ltd" - исходное системное сообщение. 1555 - 155C - REPORT-G

Процедура служит для печати сообщения "No room for line". Печать выполняется переходом на процедуру MAIN-G (1313) с установленным в аккумуляторе кодом 10Н.

Подпрограмма "MAIN-ADD". Этот пакет процедур служит для "пристегивания" новой БЕЙСИК-строки к строкам существующей БЕЙСИК-программы. Если новая строка имеет номер, который уже есть у строки БЕЙСИК-программы, то происходит замена последней. Если новая строка не имеет номера, то ее ввод в программу не производится.

155D - 157C - MAIN-ADD

Номер новой строки делается текущим засылкой его в E-PPC, на стеке запоминается адрес процедуры обработки возможной ошибки REPORT-G (1555), определяется длина вводимой строки, вызовом LINE-ADDR (196E) проверяется нет ли строки с таким же номером и если нет, то переход на MAIN-ADD1 (157D).

Если уже есть, то ее длина определяется вызовом NEXT-ONE (19B8) и она удаляется вызовом RECLAIM-2 (19E8).

157D-15AA - MAIN-ADD1

Если новая строка содержит только номер и "возврат каретки" - переход на MAIN-ADD2 (15AB).

К длине новой строки прибавляются 4 байта (2 для номера строки и 2 для ее длины). Вызовом MAKE-ROOM (1655) под нее резервируется место и выполняется копирование. В E-PPC вводится номер этой строки и в саму строку вводятся два байта с ее номером и два байта с ее длиной.

15AB-15AE - MAIN-ADD2

Если строка пустая, отсюда делается безусловный переход на MAIN-EXEC (12A2) для включения автоматического листинга.

Раздел исходной информации о каналах.

Первоначально компьютер имеет четыре канала:

- "K" - связь с клавиатурой;

- "S" - связь с дисплеем;

- "R" - связь программной области с областью редактирования (внутренний канал);

- "P" - связь с принтером.

В нижележащей таблице содержится следующая информация по каждому из каналов:

- адрес процедуры, обрабатывающей вывод;

- адрес процедуры, обрабатывающей ввод;

- наименование канала (одна литера).

Адрес

Содерж.

Наименование

15AF

F4 09

PRINT-OUT (09F4)

A8 10

KEY-INPUT (10A8)

48

"K"

15B4

F4 09

PRINT-OUT (09F4)

C4 15

REPORT-J (15C4)

53

"S"

15B9

81 0F

ADD-CHAR (0F81)

C4 15

REPORT-J (15C4)

52

"R"

15BE

F4 09

PRINT-OUT (09F4)

C4 15

REPORT-J (15C4)

50

"P"

15C3

80

маркер конца таблицы

15C4-15C5 - REPORT-J

Вызывает RST 0008 с кодом перехвата 12H для генерации сообщения "Invalid I/O device".

Исходная информация о потоках.

"Спектрум" в исходном состоянии имеет семь задействованных потоков, которые ведут к четырем вышеперечисленным каналам. Номера этих потоков - от FD до 03.

Адрес

Данные

Комментарий.

15C6

01 00

Поток FD - подключен к каналу "K'

15C8

06 00

Поток FE (канал "S")

15CA

0B 00

Поток FF (канал "R")

15CC

01 00

Поток 00 (канал "K")

15CE

01 00

Поток 01 (канал "K")

15D0

06 00

Поток 02 (канал "S")

15D2

10 00

Поток 03 (канал "P")

Примечание ИНФОРКОМа:

Как мы уже упоминали, в начале следующего года мы дадим статью, подробно разбирающую концепцию потоков и каналов в "Спектруме" и откроем перспективы использования их в Ваших программах.

Подпрограмма WAIT-KEY.

Этот блок процедур осуществляет управление процедурами ввода информации.

15D4-15DD - WAIT-KEY

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

15DE-15E3 - WAIT-KEY1

Вызывается процедура подготовки ввода через INPUT-AD (15E6). Если положенный код принят - включается флаг переноса (CARRY) и по нему выполняется возврат. Если никакая клавиша не нажата, то и флаг CARRY и флаг ZERO равны нулю, в этом случае повтор исполнения WAIT-KEY1, в прочих случаях произошла ошибка и прямой проход на REPORT-8.

15E4-15E5 - REPORT-8

Вызывает RST 0008 с кодом перехвата 07Н для генерации сообщения "End of file".

15E6-15EE - INPUT-AD

Подготовительные операции перед безусловным переходом на процедуру CALL-SUB (15F7).

В регистре HL устанавливается базовый адрес таблицы информации о каналах.

Подпрограмма "MAIN PRINTING"

15EF-15F1 - OUT-CODE

Подпрограмма переводит целое число от 0 до 9 в значение его кода ASCII.

15F2-15F6 - PRINT-A-2

Подготовительная операция. В регистре HL устанавливается базовый адрес таблицы информации о каналах.

15F7-1600 CALL-SUB

По заданному каналу для ввода или вывода информации вызовом CALL-JUMP (162C) выполняется установка соответствующих данному каналу флаговых системных переменных. Далее возврат в вызывающую процедуру.

Подпрограмма "CHAN-OPEN".

Подпрограмма служит для открывания канала ввода/вывода. При входе в нее в регистре A должен содержаться номер задействованного потока - от FD до 03. В зависимости от данных по потокам тот или иной канал делается текущим.

1601-160D - CHAN-OPEN

Базовым адресом для потока 00 является 5C16 (23574). Содержимое аккумулятора удваивается и прибавляется к этому адресу. Полученный адрес указывает на место расположения данных по данному потоку. Вводятся оба байта. Если они оба равны нулю -проход на REPORT-0. Если все в порядке - переход на CHAN-OP-1 (1610).

160E-160F - REPORT-0

Вызывает RST 0008 с кодом перехвата 17Н для генерации сообщения "Invalid stream".

1610-1614 - CHAN-OP-1

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

Подпрограмма CHAN-FLAG.

Процедуры этой подпрограммы выставляют флаговые системные переменные в соответствии с тем, какой канал задействован.

1615-162B - CHAN-FLAG

Для каждого из стандартных трех внешних каналов есть для этого своя процедура. Обратиться к ней можно, вычислив ее адрес с помощью специальной таблицы (16ED). Здесь вводится базовый адрес этой таблицы - 163D и вызовом процедуры INDEXER (16DC) из нее выбирается величина смещения, соответствующая текущему каналу. Если такого канала в таблице нет - возврат. Далее величина смещения прибавляется к базовому адресу и получается адрес необходимой процедуры - это либо CHAN-K, либо CHAN-S, либо CHAN-P.

162C- CALL-JUMP

Безусловный переход по вычисленному адресу.

162D-1633 - таблица " смещений" для перехода к процедурам установки флагов.

1634-1641 - CHAN-K

Здесь выставляются флаги системных переменных TV-FLAG, FLAGS, FLAGS2 так, как это нужно для работы на ввод от клавиатуры и на вывод в нижнюю часть экрана дисплея. Работа завершается переходом на CHANS-S-1.

1642-1645 - CHAN-S

1646-164C - CHAN-S-1

Здесь выставляются флаги системных переменных TV-FLAG и FLAGS так, как это нужно для работы на вывод в главную часть экрана дисплея. Работа завершается переходом на TEMPS (0D4D).

164D-1651 - CHAN-P

Здесь выставляется бит 1 системной переменной FLAGS так, как это нужно для работы на вывод на принтер. Работа завершается возвратом в вызывающую процедуру.

Подпрограмма "MAKE-ROOM".

Эта чрезвычайно важная подпрограмма вызывается очень часто. Ее задача -"раздвинуть" БЕЙСИК-код с тем, чтобы в образовавшееся место вставить новую строку. При вызове этой подпрограммы регистровая пара HL должна содержать адрес точки, следующей за той, после которой необходимо выделить место, а в регистровой паре BC содержится длина необходимого пространства.

1652-1654 ONE-SPACE

Это точка входа для того случая, когда надо выделить только один байт. Здесь в BC устанавливается значение 0001.

1655-1663 - MAKE-ROOM

Вызовом TEST-ROOM (1F05) проверяется имеет ли компьютер достаточно свободной памяти, чтобы выполнить такую операцию.

Вызовом POINTERS (1664) изменяются системные переменные, которые служат указателями на различные разделы БЕЙСИК-области памяти.

Выполняется перемещение вверх всей БЕЙСИК-информации, лежащей выше точки, в которую будет делаться вставка.

После выхода из этой подпрограммы регистры процессора имеют следующее содержание:

- в HL содержится адрес, предшествующий началу новой выделенной области;

- содержимое DE указывает на конец выделенной области.

Подпрограмма POINTERS.

При всех операциях с БЕЙСИК-строками, когда различные разделы БЕЙСИК-области то растягиваются, то сжимаются, за их положение отвечают соответствующие системные переменные, например VARS и др. (их всего 14). Необходимо своевременно изменять содержимое этих указателей.

В BC содержится длина блока, вовлеченного в манипуляции, a HL указывает на адрес, предшествующий тому, с которого начинаются перемещения.

1664-166A - POINTERS

Здесь устанавливается адрес VARS (5C4B), с которого и начинаются в области системных переменных указатели, а в аккумуляторе выставляется 0EH (14 DEC) - их количество.

166B-167E - PTR-NEXT

Организуется цикл (14 проходов) для корректировки системных указателей. Если какой-либо из них не нуждается в переработке - переход на PTR-DONE (167F).

Последовательно изменяются: VARS, DEST, CHANS, CURCHL, PROG, NXTLIN, DATADD, E-LINE, K-CUR, CH-ADD, X-PTR, WORKSP, STKBOT, STKEND.

167F-168E - PTR-DONE

Если не все указатели еще обработаны, то отсюда выполняется переход в начало цикла PTR-NEXT (166B).

Подпрограмма "COLLECT A LINE NUMBER".

Процедура служит для выдачи номера строки. На входе пара HL содержит адрес, а на выходе номер строки содержится в паре DE. Если номер строки является недопустимым, то выдается нулевой номер.

168F-1690 - LINE-ZERO

Здесь стоят два нулевых байта - они нужны впоследствии для обнуления содержимого DE.

1691-1694 - LINE-NO-A

Подготовка к обнулению DE.

1695-169D - LINE-NO

Это обычная точка входа. Старший байт номера строки проверяется на допустимость и, если он не пригоден, переход на LINE-NO-A (1691). Далее возврат в вызывающую процедуру.

Подпрограмма RESERVE.

Эта подпрограмма служит для резервирования места в памяти компьютера между вершиной рабочего пространства (WORKSP) и основанием стека калькулятора (STKBOT). Используется процедурой RST 0030.

169E-16AF - RESERVE

В своей работе программа вызывает MAKE-ROOM (1655)

По окончании работы в регистровой паре DE содержится адрес первого байта вновь выделенной области, а пара HL указывает на последний байт.

Подпрограмма SET-MIN.

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

16B0-16BE - SET-MIN

Вводит данные из E-LINE, помещает в область редактирования только один байт -"возврат каретки" и следом за ним конечный маркер +80H. Следующий за ним адрес помещается в системную переменную WORKSP.

16BF-16C4 - SET-WORK

Если Вам надо очистить только рабочую область и стек встроенного калькулятора, то эта точка входа служит для этой цели.

16C5-16D3 - SET-STK

Это точка входа, если очистить надо только стек калькулятора.

Здесь же инициализируется системная переменная MEM (в ней устанавливается адрес 5C92).

По окончании следует возврат в вызывающую программу.

16D4 -16DA - REC-EDIT

Процедура служит для удаления из памяти редактируемой строки. Это выполняется вызовом RECLAIM-1 (19E5) при установленном в регистровой паре DE адресе, который хранится в E-LINE.

Подпрограмма INDEXER.

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

16D8-16DB - INDEXER-1

Переход к просмотру следующего адреса.

16DC-16E4 - INDEXER

Вводится первый байт. Если он равен нулю (конечный маркер) - возврат. Затем он сравнивается с искомым, содержащимся в регистре C. Если они не совпадают - переход на следующий адрес и переход на INDEXER-1 (16D8).

Подпрограмма "CLOSE #".

Процедуры, содержащиеся здесь, позволяют пользователю закрыть открытые потоки. Однако потоки 00, 01, 02 и 03 являются стандартными и постоянными - их закрыть нельзя.

16E5-16FB - CLOSE

Вызовом STR-DATA (171E) вводятся текущие данные по потоку.

Вызовом CLOSE-2 (1701) устанавливается код канала, к которому подключен текущий

поток.

Если речь идет о потоках, открытых пользователем, 04...0F, выполняется переход на CLOSE-1 (16FC), а для стандартных потоков 00...03 вводятся исходные данные из таблицы 15C6.

16FC-1700 - CLOSE-1

Для пользовательских потоков здесь в качестве данных вводятся нули и выполняется возврат в вызывающую программу.

1701-1715 - CLOSE-2

Здесь устанавливается, к какому каналу подключен поток путем выбора из таблицы (1716). Выбор выполняется вызовом процедуры INDEXER (16DC). Из таблицы же извлекается и величина "смещения" для расчета адреса подпрограммы, закрывающей поток. В нашем случае для всех трех стандартных потоков этот адрес будет один и тот же -171C (процедура CLOSE STREAM), но это не всегда так. Если Вами подключена периферия, обслуживаемая своим ПЗУ, замещающим (затеняющим) ПЗУ компьютера, то там для прочих потоков могут устанавливаться иные процедуры.

1716-171B - таблица смещений для расчета перехода на процедуру закрывания потока.

171C-171D - CLOSE-STR

Финишная процедура.

171E-1724 - STR-DATA

Снимая номер потока с вершины стека калькулятора, процедура возвращает в регистровой паре BC данные по этому потоку. Это выполняется вызовом STK-TO-A (1E94).

Принятый номер потока проверяется. Если он меньше 10Н, следует переход на STK-DATA-1 (1727). Если же больше 0F, чего быть не может, - прямой проход на REPORT-0.

1735-1736 - REPORT-0

Вызывает RST 0008 с кодом перехвата 17Н для генерации сообщения "Invalid stream".

1727-1735 - STK-DATA1.

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

(Продолжение следует).




СОДЕРЖАНИЕ:


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

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



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

Похожие статьи:
И снова party - Forever Quattro: подробный обзор демок, графики и музыки.
Люди - история Первоуральской группы Studio Stall.
От редакции - Пpактически завеpшена pабота по изготовлению часов по схеме Mr. Gluk'а.
Solution - Пароли к игре Net Walk.
Новости - новости от группы Fatality.

В этот день...   26 апреля