Проверка системы на 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 будет размер файла в секторах.