Проверка
системы на Chic/Classic (show.com)
#5DD1 DI
LD HL,#0044 ;проверять будем байт по адресу #44
LD A,(HL) ;берем
байт
LD E,A ;сохраняем
DEC (HL) ;уменьшаем
на 1 значение байта в ПЗУ
DEC A ;уменьшаем на 1 значение прочитанного байта
XOR (HL) ;сравниваем,
если система Chic, то байт в ПЗУ изменится, и
операция
;XOR даст Z. Иначе NZ - мы в Classic
LD (HL),E ;восстанавливаем байт в
ПЗУ на тот случай, если мы в Chic
EI
Проверка на
наличие места под кэшем
LD C,#10 ;$g_com
RST #10
EXX
LD BC,5 ;+5 - адрес кэша
ADD HL,BC
LD E,(HL)
INC HL
LD D,(HL) ;DE - адрес кэша
LD HL,END ;адрес
конца буфера
AND A
SBC HL,DE
JR C,$+6 ;если адрес конца буфера меньше адреса кэша,
то О.К.
SCF ;иначе данные "налезут" на
кэш, вываливаемся с ошибкой 130
LD A,130
RET
…
Тут находится сама программа
…
BUFER ;тут
располагается буфер, наличие места под которого надо проверить
END EQU BUFER+[размер буфера] ;указатель на конец буфера
Подсчёт
контрольной суммы открытого файла
;Фрагмент ide_tune.com
LD HL,CALC ;считаем
контрольную сумму измененного
LD C,#48 ;файла с помощью резидента calc.res
RST #10
JR NC,FLUSH ;если
резидент был найден и все ОК.
CP 37 ;если
не было резидента, то просто оставим драйвер
;с непосчитанной КС
;и выйдем, сделав flush
SCF ;при
любой другой ошибке выходим в оболочку
RET NZ ;с ошибкой
FLUSH …
CALC DEFM
"@calc"
DEFB 13
Вычисление
длины файла в секторах
;Процедура справедлива для файлов размером не более 255
секторов.
;На входе в HL -
адрес описателя файла
LD DE,14 ;+14 - младший байт длины файла
ADD HL,DE
LD A,(HL) ;извлекаем
младший байт
INC HL ;+15 - старший байт длины (*256 байт)
LD B,(HL)
OR A ;проверка, не кратна ли длина файла 256 байт
JR Z,$+3 ;если кратна, то старший байт и будет
указывать размер файла в секторах
INC B ;иначе старший байт увеличим на 1 и получим
размер файла в секторах
...
;На выходе
в регистре B будет размер файла в секторах.