Создание TSR программ в операционной системе MS DOS, страница 2

ResNum                        db     0          ;номер сектора

ResSize                         db     0          ;код длины сектора

FDCResultLen              equ    $-FDCResult ; длина поля результата

FDCOpCode                 db     0          ;код команды контроллера

FDCErrCode                 db     0          ;код ошибки

FDCOutAreaLen          equ    $-FDCResult ; длина поля

; значения в поле FDCErrCode

FDCTimeOut                equ    1          ; нет прерывания

FDCTimeFail               equ    2          ;не ответил за положенное время

FDCBadData                equ    3          ; остались данные в контроллере

FDCComErr                 equ    4          ; другая ошибка

; области сохранения прерываний

Save08                          label dword  ;прерывание от таймера

Save08Off                    dw     0          ;смещение

Save08Seg                    dw     0          ;сегмент

Save0E                          label dword  ;прерывание от контроллера

;гибких дисков

Save0Eoff                     dw     0          ;смещение

Save0Eseg                    dw     0          ;сегмент

IntFlags                         db     0          ;признаки прерываний

IntPres                          equ    80h      ;есть прерывание от контроллера

IntMCA                        equ    40h      ;требуется команда завершения

;прерывания для шины МСА

PresMCA                      equ    20h      ;шина МСА установлена

ResultOut                     label byte     ;сообщение о результате

db                                  ‘ST0’

FirstOut                        db     ‘ ‘

ToMakeSkipLen           db     0dh,0ah

db                                  ‘ST1’

SkipOverTitle               equ    $-ToMakeSkipLen                ;длина до следующей

;переменной

db                                  ‘ ‘,0dh,0ah,’ST2 ‘

db                                  ‘ ‘,0dh,0ah,’C     ‘

db                                  ‘ ‘,0dh,0ah,’H     ‘

db                                  ‘ ‘,0dh,0ah,’R     ‘

db                                  ‘ ‘,0dh,0ah,’N     ‘

db                                  ‘ ‘,0dh,0ah,’OP   ‘

db                                  ‘ ‘,0dh,0ah,’Res  ‘,’ ‘,0dh,0ah,’$’

GoodMsg                      db     ‘Успешное завершение’,0dh,0ah,’$’

BadMsg                        db     'Неуспешное завершение',0dh,0ah,’$’

RtCounter                     dw     0                       ; счетчик интервалов таймерa

;основная процедура

main                              proc

push                              cs      ; установим адрасацию

pop                                ds

; проверим наличие шины МСА (микроканап)

mov                               ah,0c0h         ; получить характеристики  машины

int                                 15h

jc                                   NоnМСА     ; нет микроканала

;ES:BX- указывают на список характеристик машины: бит 1

;байта по смещению 5 содержит признак наличия микроканала

test                                byte  ptr    es:[bx][5],00000010b   ;есть микроканал ?

jz                                   NonMCA     ; нет, выход

or                                  IntFlags,PresMCA   ; установим признак

;наличия MCA

; определим адрес начала буфера в пределах страницы DMA

 


NonМСА :

mov                               ax,offset WorkArea            ; смещение рабочей области

mov                               bx,cs ; сегмент для определения составляющей смещения

mov                               cl,4

shi                                 bx,cl ; составляющая смещения в сегменте

add                                bx,ax ; полное смещение

jc                                   WorkNotCross         ; переехали страницу - не беспокоимся

mov                               cx,bx ; запомним полное смещение

add                                bx,512*3-1   ; размер буфера для трех секторов

jnc                                 WorkNotCrost         ; не пересекли страницу

sub                                ax,ex ; добавим к смещению сколько до пересечения