DOS для
ввода/вывода будет использовать заново определенную JFT, но будет
иметь трудности клонирования этой JFT при обработке запроса за-
грузки (int 21h AH=4bh).
Рабочая таблица файлов заносит описатели в качестве входов
таблицы файловой системы. Каждый вход JFT занимает один байт.
Ес-
ли вход не использован, он содержит 0FFh; в противном случае он
содержит системный номер файла(SFN), который используется как ин-
декс в таблице файловой системы. DOS использует описатель файла в
JFT как индекс.
Листинги 4-16 и 4-17 иллюстрируют связи между PSP, JFT, SFN
и SFT.
Первая подпрограмма принимает описатель в BX и возвращает
- 4-22 -
соответствующий системный номер файла (SFN) в AX. Подпрограмма
использует функцию BIOS AH=62h для размещения текущего PSP, когда
получает адрес JFT из PSP, и в конечном счете использует описа-
тель, как индекс в JFT.
В предыдущей главе описаны многие из полей PSP. DOS
всегда помещает PSP на шестнадцатибайтовую границу параграфа, так
что он может быть описан, как значение длиной в слово (сегмент, а
смещение ноль). Команда DOS 62h возвращает адрес текущего PSP в
регистре BX (недокументированная функция AH=51h также возвращает
PSP в BX).
- 4-21 -
Листинг 4-15 показывает структуру PSP. Поля PSP
PSP_D_JFTAddr и PSP_W_JFTSize содержат адрес и размер рабочей
таблицы файлов (JFT). PSP содержит также копию (по умолчанию)
JFT, начинающуюся с JFT_T_JFT. DOS использует некоторые другие
поля PSP для обработки критических ошибок и запроса завершения;
подробнее об этих полях позднее.
Листинг 4-15. Структура PSP
----------------------------------------------------------------
PSP STRUC
PSP_W_int20 DW 0cd20h ; [00] команда int 20
PSP_W_MemSiz DW 0 ; [02] начало памяти (para)
PSP_B_Unused0 DB 0 ; [04] неизвестно
PSP_T_Call DB 09aH,0f0h ; [05] дальний вызов DOS
DB 0feH,01dh,00f0h ; диспетчер (CPM relic)
PSP_D_Term DD 0 ; [0a] конечный адрес
PSP_D_Break DD 0 ; [0e] адрес прерывания
PSP_D_CritErr DD 0 ; [12] критическая ошибка
PSP_W_Parent DW 0 ; [16] родительский PSP
PSP_T_JFT DB 14h DUP 90ffn) ; [18] таблица JFT
PSP_W_Envron DW 0 ; [2c] окружение
PSP_D_SSSP DD 0 ; [2e] SS:SP пользователя на
; время int 21
PSP_W_JFTSize DW 14h ; [32] размер JFT
PSP_D_JFTAddr DD 0 ; [34] адрес JFT
PSP_D_NextPSP DW 0ffffH,0ffffh ; [38] не применяется
PSP_T_Unused2 DB 14h DUP (0) ; [3c] не применяется
PSP_W_Int21 DW 0cd21h ; [50]
PSP_B_Retf DB 0 ; [52]
PSP_T_Unused3 DB 9 DUP (0) ; [53]
PSP_T_Parm1 DB 10h DUP (0) ; [5c] форматировано param 1
PSP_T_Parm2 DB 14h DUP (0) ; [6c] форматировано param 2
PSP_T_DTA DB 80h DUP (0) ; [80] по умолчанию DTA
PSP ENDS
----------------------------------------------------------------
Рабочая таблица файлов (JFT)
В большинстве случаев PSP будет содержать саму рабочую таб-
лицу файлов. По умолчанию JFT позволяет открыть одновременно 20
файлов, но имеется возможность создания альтернативной JFT для
увеличения максимального количества открытых файлов. В DOS 3.3
для этого имеется специальная функция (int 21h AH=67h). В DOS
версии ниже 3.3 можно изменять адрес JFT в PSP вручную.