Ассемблер и программирование для IBM PC



       

ГЛАВА 23. Прерывания BIOS и DOS - часть 36


CODESG ENDS END BEGIN

page 60,132 TITLE RANREAD (COM) Прямое чтение записей, ; созданных в FCBCREAT CODESG SEGMENT PARA 'Code' ASSUME CS:CODESG,DS:CODESG,SS:CODESG,ES:CODESG ORG 100H BEGIN: JMP MAIN ;----------------------------------------------------- FCBREC LABEL BYTE ;FCB для дискового файла FCBDRIV DB 04 ; дисковод D FCBNAME DB 'MAMEFILE' ; имя файла FCBEXT DB 'DAT' ; тип файла FCBBLK DW 0000 ; номер текущего блока FCBRCSZ DW 0000 ; длина логической записи DD ? ; размер файла (DOS) DW ? ; дата (DOS) DT ? ; зарезервировано (DOS)

Ассемблер для IBM PC. Программы. 114

DB 00 ; номер текущей записи FCBRNRC DD 000000000 ; относительный номер

RECLEN EQU 32 ;Длина записи RECDPAR LABEL BYTE ;Список параметров: MAXLEN DB 3 ; ACTLEN DB ? ; RECDNO DB 3 DUP(' ') ;

NAMEFLD DB RECLEN DUP(' '),13,10,'$' ;DTA

OPENMSG DB '*** Open error ***',13,10,'$' READMSG DB '*** Read error ***',13,10,'$' COL DB 00 PROMPT DB 'Record number? $' ROW DB 00 ENDCDE DB 00 ;----------------------------------------------------- MAIN PROC NEAR CALL Q10CLR ;Очистить экран CALL Q20CURS ;Установить курсор CALL C10OPEN ;Открыть файл, ; установить DTA CMP ENDCDE,00 ;Открытие без ошибок? JZ A20LOOP ; да - продолжить, RET ; нет - завершить A20LOOP: CALL D10RECN ;Получить номер записи CMP ACTLEN,00 ;Есть запрос? JE A40 ; нет - выйти CALL F10READ ;Чтение (прямой доступ) CMP ENDCDE,00 ;Есть ошибки чтения? JNZ A30 ; да - обойти CALL G10DISP ;Вывести на экран A30: JMP A20LOOP A40: RET ;Завершить программу MAIN ENDP ; Подпрограмма открытия файла на диске: ; ------------------------------------ C10OPEN PROC NEAR MOV AH,0FH ;Функция открытия LEA DX,FCBREC INT 21H CMP AL,00 ;Открытие нормальное? JNZ C20 ; нет - ошибка MOV FCBRCSZ,RECLEN ;Длина записи (EQU) MOV AH,1AH LEA DX,NAMEFLD ;Установить адрес DTA INT 21H RET C20: LEA DX,OPENMSG

Ассемблер для IBM PC. Программы. 115

CALL X10ERR RET C10OPEN ENDP ; Ввод с клавиатуры номера записи: ; ------------------------------- D10RECN PROC NEAR MOV AH,09H ;Функция вывода на экран LEA DX,PROMPT INT 21H MOV AH,0AH ;Функция ввода с клавиатуры LEA DX,RECDPAR INT 21H CMP ACTLEN,01 ;Проверить длину (0,1,2) JB D40 ;Длина 0, завершить JA D20 SUB AH,AH ;Длина 1 MOV AL,RECDNO JMP D30 D20: MOV AH,RECDNO ;Длина 2 MOV AL,RECDNO+1 D30: AND AX,0F0FH ;Удалить ASCII тройки AAD Преобразовать в двоичное MOV WORD PTR FCBRNRC,AX D40: MOV COL,20 CALL Q20CURS ;Установить курсор RET D10RECN ENDP ; Чтение дисковой записи: ; ---------------------- F10READ PROC NEAR MOV ENDCDE,00 ;Очистить код завершения MOV AH,21H ;Функция прямого чтения LEA DX,FCBREC INT 21H CMP AL,00 ;Чтение без ошибок? JZ F20 ; да - выйти LEA DX,READMSG ; нет - выдать CALL X10ERR ; сообщение об ошибке F20: RET F10READ ENDP ; Вывод имени на экран: ; -------------------- G10DISP PROC NEAR MOV AH,09 ;Функция вывода на экран LEA DX,NAMEFLD INC 21H INC ROW MOV COL,00 RET G10DISP ENDP




Содержание  Назад  Вперед