Секреты ПЗУ
Подпрограмма 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. Далее -возврат.
(Продолжение следует).