Следующая подпрограмма, кото-
рую я рассмотрю в этой статье-
это корректная обработка диско-
вых ошибок.
Данная процедура довольно
проста и особых комментариев не
требует. Обращаться к ней нужно
также, как и к #3D13, единствен-
ное, что тут нужно сказать - это
то, что она изменяет значения
системных переменных #5C3D/#5C3E
(23613/23614), 23746(#5CC2), ве-
ктор прерываний I, регистр IY, и
устанавливает режим прерываний
IM 1, так что при необходимости
Вы можете перед вызовом проце-
дуры эти значения запоминать и
восстанавливать их на выходе.
Отличие данной процедуры от
#3D13 заключается в том, что на
выходе из нее при возникновении
ошибки в аккамулятор будет запи-
сана единица (как правило, для
чтения это ошибка DISK ERROR, а
для записи READ ONLY), если же
обращение к диску прошло успеш-
но, в аккамуляторе будет 0.
Если в дисковод не будет
вставлена дискета, то никакого
выхода из процедуры не произой-
дет, пока дисковод не дождется
хотя бы какого-нибудь диска.
А теперь можете ознакомиться
с описанной выше процедурой:
DISK DI
LD (RHL+1),HL
LD (RDE+1),DE
LD (RBC+1),BC
LD (RGA+1),A
IM 1
LD A,#3F
LD I,A
LD (ZABA+1),SP
MOLOKO LD HL,ZABA
PUSH HL
LD (23613),SP
LD A,195
LD HL,REAL_SF
LD (23746),A
LD (23747),HL
LD HL,0
LD (23823),HL
LD IY,23610
LD (IY+0),255
RHL LD HL,0
RDE LD DE,0
RBC LD BC,0
RGA LD A,0
CALL #3D13
XOR A
LER2 DI
LD SP,(ZABA+1)
RET
ZABA LD SP,0
JR MOLOKO
REAL_SF EX (SP),HL
PUSH HL
PUSH DE
PUSH AF
EX DE,HL
OR A
LD HL,3435
SBC HL,DE
JR Z,E1
OR A
LD HL,8020
SBC HL,DE
JR Z,E2
POP AF
POP DE
POP HL
EX (SP),HL
RET
E1 LD A,1
JR LER2
E2 POP AF
POP DE
POP HL
EX (SP),HL
INC SP
INC SP
SCF
RET
* * *
P.S. Вот, такие вот, дела.