Задание функции чтения оверлея
Переменная OvrReadBuf позволяет вам перехватывать операции загрузки оверлеев. Например, вы можете реализовать обработку оши- бок или проверку наличия сменного диска. Когда администратору оверлеев требуется считать оверлей, он вызывает функцию, адрес которой записан в OverReadBuf. Если функция возвращает нулевое значение, то администратор оверлеев предполагает, что операция была успешной. Если функция возвращает ненулевой результат, то компилятор генерирует ошибку этапа выполнения 209. Параметр OvrSeg указывает, какой именно оверлей требуется загрузить, но, как вы далее увидите, вам эта информация не потребуется.
Чтобы установить свою собственную функцию чтения оверлея, вам нужно сначала сохранить предыдущее значение OvrReadBuf в пе- ременной типа OvrReadFunc, а затем присвоить OvrReadBuf вашу функцию чтения оверлея. В своей функции чтения вам следует для выполнения фактической операции загрузки вызвать сохраненную функцию чтения оверлея. Любые нужные вам проверки допустимости (такие как проверка наличия сменного диска) следует выполнять пе- ред вызовом сохраненной функции чтения, а все проверки на ошибки следует выполнять после вызова.
Примечание: Не пытайтесь вызывать из своей функции чтения оверлея какие-либо оверлейные подпрограммы - это приведет к сбою системы.
Код для установки функции чтения оверлея должен следовать непосредственно после вызова OvrInit; в этот момент OvrReadBuf будет содержать адрес используемой по умолчанию функции чтения с диска.
Если вы также вызываете OvrInitEMS, она использует вашу функцию чтения для чтения оверлеев с диска в память EMS, и в слу- чае отсутствия ошибок сохраняет адрес используемой по умолчанию функции чтения в EMS в OvrReadBuf. Если вы хотите также переопре- делить функцию чтения в EMS, просто повторите после вызова OvrInitEMS процесс установки.
Используемая по умолчанию функция чтения с диска в случае успешного выполнения возвращает 0. В противном случае возвращает- ся код ошибки DOS. Аналогично, используемая по умолчанию функция чтения из EMS в случае успешного выполнения возвращает 0. В про- тивном случае возвращается код ошибки EMS (от $80 до $FF). Под- робно коды ошибок DOS описываются в "Справочном руководстве прог- раммиста". Коды ошибок EMS можно найти в документации по EMS.
Следующий фрагмент программы показывает, как написать и ус- тановить функцию чтения оверлея. Новая функция чтения оверлея повторно вызывает сохраненные функции чтения оверлея, пока не возникает ошибка. Все ошибки передаются процедурам DOSError или EMSError (ко- торые здесь не показаны), которые могут вывести ошибку пользова- телю. Заметим, что параметр OvrSeg просто передается сохраненной функции чтения оверлея и не обрабатывается непосредственно новой функцией чтения оверлея.
uses Overlay; var SaveOvrRead: OvrReadFunc; UsingEMS: Boolean;
function MyOvrRead(OvrSeg: Word): Integer: far; var E: Integer; begin repeat E := SaveOvrRead(OvrSeg); if E <> 0 then if UsingEMS then EMSError(E) else DOSError(E); until E = 0; MyOvrRead := 0; end;
begin OvrInit('MYPROG.OVR'); SaveOvrRead := OvrReadBuf; { сохранить } OvrReadBuf := MyOvrRead; { установить свою } UsingEMS := False; OvrInitEMS; if OvrResult = OvrOK then begin SaveOvrRead := OvrReadBuf { сохранение } OvrReadBuf := MyOvrRead; { установить свою } UsingEMS := True; end; . . . end.