© Иван Рощин, Москва
| ZXNet | : 500:95/462.53 |
| : bestview@mtu-net.ru | |
| WWW | : http://www.ivr.da.ru |
(«Радиолюбитель. Ваш
компьютер» 7/2000)
Дополненная версия. Дата последнего редактирования: 10.11.2002.
В
| Смещение от начала | Длина | Комментарий |
|---|---|---|
| 0 | 8 | Имя файла |
| 8 | 1 | Расширение файла |
| 9 | 2 | Стартовый адрес файла (для BASIC длина программы и переменных) |
| 11 | 2 | Длина файла в байтах (для BASIC длина программы без учёта длины переменных) |
| 13 | 1 | Длина файла в секторах |
| 14 | 1 | Номер сектора начала файла |
| 15 | 1 | Номер дорожки начала файла |
Но в последнее время всё шире используется более информативное
трёхсимвольное расширение файла (как в
| Смещение от начала | Длина | Комментарий |
|---|---|---|
| 0 | 8 | Имя файла |
| 8 | 3 | Расширение файла |
| 11 | 2 | Длина файла в байтах |
| 13 | 1 | Длина файла в секторах |
| 14 | 1 | Номер сектора начала файла |
| 15 | 1 | Номер дорожки начала файла |
Видно, что длина расширения увеличилась за счёт использования двух байтов, в которых раньше хранился стартовый адрес файла.
Если вы пишете
boot B± ZX_WIN ZIP ******** ZIP S_PLAY2d BБ BACKUM GTR BUZZ16_1 MPS FL_SH_EI MPS KL_F_CUT m!ћ SPY MPS VIVID MEљ NOSTALGY Y ђ s_play2d txt |
Попробуем сделать так: определим, какие последовательности из трёх байтов являются допустимыми трёхсимвольными расширениями, и если в описателе файла окажется недопустимая последовательность, то будем считать, что у этого файла односимвольное расширение.
Сначала перечислим список требований, которым должно удовлетворять трёхсимвольное расширение:
Теперь рассмотрим процедуру, определяющую длину расширения файла в соответствии с этими требованиями.
Процедура рассчитана на компиляцию в ассемблере ZX ASM 3.10, и при компиляции в другом ассемблере вам может потребоваться заменить команду «PUSH HL,DE,BC» на три команды: «PUSH HL», «PUSH DE» и «PUSH BC». Соответственно, команду «POP BC,DE,HL» тоже нужно будет заменить на три команды: «POP BC», «POP DE» и «POP HL».
Входные параметры: HL указывает на первый символ расширения. Регистр H не должен быть равен нулю.
Выходные параметры: регистры остаются без изменений (кроме аккумулятора), а флаг Z несёт информацию о длине расширения: если флаг установлен расширение трёхсимвольное; если сброшен односимвольное.
Длина процедуры всего семьдесят два байта, она максимально оптимизирована,
и,
Текст процедуры:
ANALYS_EXT PUSH HL,DE,BC
;Проверка на BASIC:
LD A,(HL)
CP "B"
JR Z,ANALYS_NO
;Проверка на XAS, xAS, XaS, xaS:
RES 5,A
CP "X"
JR NZ,ANALYS_EX1
INC HL
LD A,(HL)
RES 5,A
CP "A"
JR NZ,ANALYS_EX2
INC HL
LD A,(HL)
CP "S"
JR Z,ANALYS_YES
DEC HL
ANALYS_EX2 DEC HL
;Изначально D=#FF, E=0. Как только
;встречаем символ A..Z или a..z,
;добавляем его к D по AND и к E по OR.
;В пятом бите 0, если буква прописная,
;и 1, если буква строчная. Допустимы
;лишь варианты 0,0,0 и 1,1,1. Если
;вариант 0,0,0 (все буквы прописные), то
;5-й бит D = 0 и 5-й бит E = 0. Если
;вариант 1,1,1 (все буквы строчные), то
;5-й бит D = 1 и 5-й бит E = 1. Для
;других вариантов (когда есть и 0, и 1)
;5-й бит D = 0 и 5-й бит E = 1. Видим,
;что для вариантов 0,0,0 и 1,1,1 5-й бит
;от D XOR E будет равен 0, а для других
;вариантов он будет равен 1, таким
;образом, можно отличать допустимые
;варианты от недопустимых.
ANALYS_EX1 LD DE,#FF00
LD BC,3*256+%00100000
ANALYS_EX3 LD A,(HL)
CP C ;=CP #20
JR C,ANALYS_NO
CP #80
JR NC,ANALYS_NO;не #20..#7F
OR C
CP "a"
JR C,ANALYS_EX4
CP "z"+1
JR NC,ANALYS_EX4
LD A,(HL)
AND D
LD D,A
LD A,(HL)
OR E
LD E,A
ANALYS_EX4 INC HL
DJNZ ANALYS_EX3
LD A,D
XOR E
AND C
JR Z,ANALYS_YES
ANALYS_NO OR H ;Сбрасываем флаг Z
;(т.к. H<>0, то и
;результат операции
;OR будет <> 0).
;При передаче управления на ANALYS_YES
;по JR - флаг Z всегда будет установлен!
ANALYS_YES POP BC,DE,HL
RET
Вот, например, как выглядит каталог диска, где для каждого файла длина расширения определялась с помощью этой процедуры:
boot B ZX_WIN ZIP ******** ZIP S_PLAY2d B BACKUM GTR BUZZ16_1 MPS FL_SH_EI MPS KL_F_CUT m SPY MPS VIVID M NOSTALGY Y s_play2d txt |
Теперь хотелось бы сказать несколько слов об имени диска. В
Как видим, в этом секторе остаются свободными ещё три байта, а значит, имя
диска может быть увеличено до одиннадцати символов. Действительно,
Если вы хотите присвоить диску
Соответственно, если вы пишете программу для работы с диском и хотите
поддержать
Как выяснилось, одно из требований к трёхсимвольному расширению (ранее сформулированное так: все три символа коды в диапазоне #20..#7F) нуждается в некотором уточнении.
Соответственно, процедура определения длины расширения файла теперь должна выглядеть так:
ANALYS_EXT PUSH HL,DE,BC
LD BC,3*256+%00100000
;Проверка на BASIC:
LD A,(HL)
CP "B"
JR Z,ANALYS_NO
;Проверка: первый или второй символ - пробел?
INC HL
LD A,(HL)
CP C ;=CP #20
JR Z,ANALYS_NO
DEC HL
LD A,(HL)
CP C ;=CP #20
JR Z,ANALYS_NO
;Проверка на XAS, xAS, XaS, xaS:
RES 5,A
CP "X"
JR NZ,ANALYS_EX1
INC HL
LD A,(HL)
RES 5,A
CP "A"
JR NZ,ANALYS_EX2
INC HL
LD A,(HL)
CP "S"
JR Z,ANALYS_YES
DEC HL
ANALYS_EX2 DEC HL
ANALYS_EX1 LD DE,#FF00
ANALYS_EX3 LD A,(HL)
CP C ;=CP #20
JR C,ANALYS_NO
CP #80
JR NC,ANALYS_NO ;не #20..#7F
CP 96
JR Z,ANALYS_NO ;"`"
OR C
CP "a"
JR C,ANALYS_EX4
CP "z"+1
JR NC,ANALYS_EX4
LD A,(HL)
AND D
LD D,A
LD A,(HL)
OR E
LD E,A
ANALYS_EX4 INC HL
DJNZ ANALYS_EX3
LD A,D
XOR E
AND C
JR Z,ANALYS_YES
ANALYS_NO OR H
ANALYS_YES POP BC,DE,HL
RET
В регистровой паре HL, напомню, должен задаваться адрес первого символа расширения (H<>0!), а результат работы процедуры возвращается во флаге Z (установлен расширение трёхсимвольное, сброшен односимвольное).
|
Другие мои статьи о
|