CMP ENDCDE,00 ;Чтение без ошибок?
JNZ A90 ; нет - выйти
CALL G10DISP ;Выдать имя на экран
JMP A20LOOP ;Продолжить
A90: RET ;Завершить
BEGIN ENDP



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


; Открытие файла на диске:
; -----------------------
E10OPEN PROC NEAR
LEA X,FCBREC
MOV AH,0FH ;Функция открытия
INT 21H
CMP AL,00 ;Файл найден?
JNZ E20 ; нет - ошибка

MOV FCBRCSZ,RECLEN ;Длина записи (EQU)
MOV AH,1AH
LEA DX,NAMEFLD ;Адрес DTA
INT 21H
RET
E20:
MOV ENDCDE,01 ;Сообщение об ошибке
LEA DX,OPENMSG
CALL X10ERROR
RET
E10OPEN ENDP
; Чтение дисковой записи:
; ----------------------
F10READ PROC NEAR
MOV AH,14H ;Функция чтения
LEA DX,FCBREC
INT 21H
CMP NAMEFLD,1AH ;Считан маркер EOF?
JNE F20 ; нет
MOV ENDCDE,01 ; да
JMP F90
F20:
CMP AL,00 ;Чтение без ошибок?
JZ F90 ; да - выйти
MOV ENDCDE,01 ;Нет:
CMP AL,01 ;Конец файла?
JZ F90 ; да - выйти,
LEA DX,READMSG ; нет - значит
CALL X10ERR ; ошибка чтения
F90:
RET
F10READ ENDP
; Вывод записи на экран:
; ---------------------
G10DISP PROC NEAR
MOV AH,09 ;Функция вывода на экран
LEA DX,NAMEFLD
INT 21H
CMP ROW,20 ;Последняя строка экрана?
JAE G30 ; нет -
INC ROW ; да - увеличить строку
JMP G90
G30:
MOV AX,0601H



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


CALL Q10SCR ; прокрутить
CALL Q20CURS ; установить курсор
G90: RET
G10DISP ENDP
; Прокрутка (скроллинг) экрана:
; ----------------------------
Q10SCR PROC NEAR ;AX уже установлен
MOV BH,1EH ;Установить цвет
MOV CX,0000
MOV DX,184FH ;Функция прокрутки
INT 10H
RET
Q1OSCR ENDP
; Установка курсора:
; -----------------
Q20CURS PROC NEAR
MOV AH,02
MOV BH,00
MOV DH,ROW
MOV DL,00
INT 10H
RET
Q20CURS ENDP
; Вывод сообщения об ошибке на диске:
; ----------------------------------
X10ERR PROC NEAR
MOV AH,09 ;DX содержит адрес
INT 21H ; сообщения
RET
X10ERR ENDP

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



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


; Очистка экрана:
; --------------
Q10CLR PROC NEAR
MOV AX,0600H ;Функция прокрутки
MOV BH,41H ;Цвет (07 для ч/б)
MOV CX,0000
MOV DX,184FH
INT 10H
RET
Q10CLR ENDP
; Установка курсора:
; -----------------
Q20CURS PROC NEAR
MOV AH,02 ;Функция установки
MOV BH,00 ; курсора
MOV DH,ROW
MOV DL,COL
INT 10H
RET
Q20CURS ENDP
; Вывод сообщения об ошибке на диске:
; ----------------------------------
X10ERR PROC NEAR
MOV AH,09 ;DX содержит адрес
INT 21H ; сообщения
INC ROW
MOV ENDCDE,01
RET
X10ERR ENDP
CODESG ENDS
END BEGIN

























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



TITLE RANBLOK (COM) Прямое блочное чтение файла
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 'NAMEFILE' ; имя файла
FCBEXT DB 'DAT' ; тип файла
FCBBLK DW 0000 ; номер текущего блока
FCBRCSZ DW 0000 ; логическая длина записи
FCBFLZ DD ? ; DOS размер файла
DW ? ; DOS дата
DT ? ; DOS зарезервировано
DB 00 ; номер текущей записи
FCBRNRC DD 00000000 ; относительный номер

DSKRECS DB 1024 DUP(?),'$' ;DTA для блока записей

ENDCODE DB 00
NORECS DW 25 ;Число записей
OPENMSG DB '*** Open error ***',13,10,'$'
READMSG DB '*** Open error ***',13,10,'$'
ROWCTR DB 00
; ---------------------------------------------------
MAIN PROC NEAR
CALL Q10CLR ;Очистить экран
CALL Q20CURS ;Установить курсор
CALL E10OPEN ;Открыть файл,
; установить DTA
CMP ENDCODE,00 ;Успешное открытие?
JNZ A30 ; нет - выйти
CALL F10READ ;Читать записи
CALL G10DISP ;Вывод блока на экран
A30: RET ;Завершить программу
MAIN ENDP
; Открыть дисковый файл:
; ---------------------
E10OPEN PROC NEAR
MOV AH,0FH ;Функция открытия файла
LEA DX,FCBREC
INT 21H
CMP AL,00 ;Успешное открытие?
JNZ A30 ; нет - ошибка

MOV FCBRCSZ,0020H ;Размер записи
MOV AH,1AH
LEA DX,DSKRECS ;Установить адрес DTA
INT 21H
RET
E20:



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


LEA DX,OPENMSG ;Ошибка открытия файла
CALL X10ERR
RET
E10OPEN ENDP
; Чтение блока:
; ------------
F10READ PROC NEAR
MOV AH,27H ;Прямое чтение блока
MOV CX,NORECS ;Число записей
LEA DX,FCBREC
INT 21H
MOV ENDCODE,AL ;Сохранить код возврата
RET
F10READ ENDP
; Вывод блока на экран:
; --------------------
G10DISP PROC NEAR
MOV AH,09 ;Функция вывода на экран
LEA DX,DSKRECS
INT 21H
RET
G10DISP ENDP
; Подпрограмма очистки экрана:
Q10CLR PROC NEAR
MOV AX,0600H ;Функция скрол
MOV BH,41H ;Цвет (07 для ч/б)
MOV CX,0000
MOV DX,184FH
INT 10H
RET
Q10CLR ENDP
; Подпрограмма установки курсора:
; ------------------------------
Q20CURS PROC NEAR
MOV AH,02 ;Функция установки курсора
MOV BH,00
MOV DH,ROWCTR
MOV DL,00
INT 10H
INC ROWCTR
RET
Q20CURS ENDP
; Подпрограмма сообщения об ошибке диска:
; --------------------------------------
X10ERR PROC NEAR
MOV AH,09 ;DX содержит адрес
INT 21H ; сообщения
MOV ENDCODE,01
RET
X10ERR ENDP

CODESG ENDS
END BEGIN



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



TITLE SELDEL (COM) Выборочное удаление файлов
; Предполагается текущий дисковод;
; Примеры параметров: *.*, *.BAK, и т.д.
CODESG SEGMENT PARA 'Code'
ASSUME CS:CODESG,DS:CODESG,SS:CODESG
ORG 100H
BEGIN JMP MAIN
; ----------------------------------------------------------
TAB EQU 09
LF EQU 10
CR EQU 13
CRLF DB CR,LF,'$'
DELMSG DB TAB,'Erase','$'
ENDMSG DB CR,LF,'No more directory entries',CR,LF,'$'
ERRMSG DB 'Write protected disk','$'
PROMPT DB 'y = Erase, N = Keep, Ret = Exit',CR,LF,'$'
; ----------------------------------------------------------
MAIN PROC NEAR ;Главная процедура
MOV AH,11H ;Найти первый элемент
CALL D10DISK
CMP AL,0FFH ;Если нет элементов,
JE A90 ; то выйти
LEA DX,PROMPT ;Текст запроса
CALL B10DISP
A20:
LEA DX,DELMSG ;Выдать сообщение
CALL B10DISP ; об удалении файла
MOV CX,11 ;11 символов
MOV SI,81H ;Начало имени файла
A30:
MOV DL,[SI] ;Текущий символ
CALL C10CHAR ; для вывода на экран
INC SI ;Следующий символ
LOOP A30
MOV DL,'?'
CALL C10CHAR
MOV AH,01 ;Получить односимвольный
INT 21H ; ответ
CMP AL,ODH ;Символ Return?
JE A90 ; да - выйти
OR AL,00100000B ;Перекодировать
; в прописную букву
CMP AL,'y' ;Запрошено удаление?
JNE A50 ; нет - обойти,
MOV AH,13H ; да - удалить файл
MOV DX,80H
INT 21H
CMP AL,0 ;Успешное удаление?
JZ A50 ; да - обойти
LEA DX,ERRMSG ; нет - выдать
CALL B10DISP ; предупреждение
JMP A90



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


A50:
LEA DX,CRLF ;Перевести строку на экране
CALL B10DISP
MOV AH,12H
CALL B10DISK ;Получить следующий элемент
CMP AL,0FFH ;Есть еще?
JNE A20 ; да - повторить
A90:
RET ;Выход в DOS
MAIN ENDP
; Вывод строки на экран;
; ---------------------
B10DISP PROC NEAR ;в DX находится адрес
MOV AH,09 ; строки
INT 21H
RET
B10DISP ENDP
; Вывод символа на экран;
; ----------------------
C10CHAR PROC NEAR ;в DL находится символ
MOV AH,02
INT 21H
RET
C10CHAR ENDP
; Чтение элемента каталога:
; ------------------------
D10DISK PROC NEAR
MOV DX,5CH ;Установить FCB
INT 21H
CMP AL,0FFH ;Есть еще элементы?
JNE D90
PUSH AX ;Сохранить AL
LEA DX,ENDMSG
CALL B10DISP
POP AX ;Восстановить AL
D90: RET
D10DISK ENDP

CODESG ENDS
END BEGIN
















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



page 60,132
TTILE HANCREAT (EXE) Создание файла на диске
; -----------------------------------------------------
STACKSG SEGMENT PARA STACK 'Stack'
DW 80 DUP(?)
STACKSG ENDS
; -----------------------------------------------------
DATASG SEGMENT PARA 'Data'
NAMEPAR LABEL BYTE ;Список параметров:
MAXLEN DB 30 ;
NAMELEN DB ? ;
NAMEREC DB 30 DUP(' '), 0DH, 0AH ; введенное имя,
; CR/LF для записи
ERRCDE DB 00
HANDLE DW ?
PATHNAM DB 'D:\NAMEFILE.DAT',0
PROMPT DB 'Name? '
ROW DB 01
OPNMSG DB '*** Open error ***', 0DH, 0AH
WRTMSG DB '*** Write error ***', 0DH, 0AH
DATASG ENDS
; -------------------------------------------------------
CODESG SEGMENT PARA 'Code'
BEGIN PROC FAR
ASSUME CS:CODESG,DS:DATASG,SS:STACKSG,ES:DATASG
PUSH DS
SUB AX,AX
PUSH AX
MOV AX,DATASG
MOV DS,AX
MOV ES,AX
MOV AX,0600H
CALL Q10SCR ;Очистка экрана
CALL Q20CURS ;Установка курсора
CALL C10CREA ;Создание файла,
; установка DTA
CMP ERRCDE,00 ;Ошибка при создании?
JZ A20LOOP ; да - продолжить,
RET ; нет - вернуться в DOS
A20LOOP:
CALL D10PROC
CMP NAMELEN,00 ;Конец ввода?
JNE A20LOOP ; нет - продолжить,
CALL G10CLSE ; да - закрыть файл
RET ; и выйти в DOS
BEGIN ENDP
; Создание файла на диске:
; -----------------------
C10CREA PROC NEAR
MOV AH,3CH ;Функция создания файла
MOV CX,00 ;Нормальный атрибут
LEA CX,PATHNAM



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


INT 21H
JC C20 ;Есть ошибка?
MOV HANDLE,AX ; нет - запомнить номер,
RET
C20: ; да -
LEA DX,OPNMSG ; выдать сообщение
CALL X10ERR ; об ошибке
RET
C10CREA ENDP
; Ввод с клавиатуры:
; -----------------
D10PROC PROC NEAR
MOV AH,40H ;Функция вывода на экран
MOV BX,01 ;Номер (Handle)
MOV CX,06 ;Длина текста запроса
LEA DX,PROMPT ;Выдать запрос
INT 21H

MOV AH,0AH ;Функция ввода с клавиатуры
LEA DX,NAMEPAR ;Список параметров
INT 21H
CMP NAMELEN,00 ;Имя введено?
JNE D20 ; да - обойти
RET ; нет - выйти
D20:
MOV AL,20H ;Пробел для заполнения
SUB CH,CH
MOV CL,NAMELEN ;Длина
LEA DI,NAMEREC ;
ADD DI,CX ;Адрес + длина
NEG CX ;Вычислить
ADD CX,30 ; оставшуюся длину
REP STOSB ;Заполнить пробелом
D90:
CALL F10WRIT ;Запись на диск
CALL E10SCRL ;Проверка на скролинг
RET
D10PROC ENDP
; Проверка на скролинг:
; --------------------
E10SCRL PROC NEAR
CMP ROW,18 ;Последняя строка экрана
JAE E10 ; да - обойти,
INC ROW ; нет - увеличить строку
JMP E10
E10:
MOV AX,0601H ;Продвинуть на одну строку
CALL Q10SCR
E90: CALL Q20CURS ;Установка курсора
RET
E10SCRL ENDP
; Запись на диск:
; --------------



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


F10WRIT PROC NEAR
MOV AH,40H ;Функция записи на диск
MOV BX,HANDLE
MOV CX,32 ;30 для имени + 2 для CR/LF
LEA DX,NAMEREC
INT 21H
JNC F20 ;Ошибка записи?
LEA DX,WRTMSG ; да -
CALL X10ERR ; выдать предупреждение
MOV NAMELEN,00
F20:
RET
F10WRIT ENDP
; Закрытие файла на диске:
; -----------------------
G10CLSE PROC NEAR
MOV NAMEREC,1AH ;Маркер конца записи (EOF)
CALL F10WRIT
MOV AH,3EH ;Функция закрытия
MOV BX,HANDLE
INT 21H
RET
G10CLSE ENDP
; Прокрутка (скроллинг) экрана:
; ----------------------------
Q10SCR PROC NEAR ;в AX - адрес элемента
MOV BH,1EH ;Цвет - желтый на синем
MOV CX,0000
MOV DX,184FH
INT 10H ;Скроллинг
RET
Q10SCR ENDP
; Установка курсора:
; -----------------
Q20CURS PROC NEAR
MOV AH,02
MOV BH,00
MOV DH,ROW ;Установить курсор
MOV DL,00
INT 10H
RET
Q20CURS ENDP
; Вывод сообщения об ошибке:
; -------------------------
X10ERR PROC NEAR ;DX содержит
MOV AH,40H ; адрес сообщения
MOV BX,01
MOV CX,21 ;Длина сообщения
INT 21H
MOV ERRCDE,01 ;Установить код ошибки
RET
X10ERR ENDP




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


CODESG ENDS
END BEGIN






















































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



page 60,132
TITLE HANREAD (EXE) Чтение записей, созданных в HANCREAT
; -----------------------------------------------------
STACKSG SEGMENT PARA STACK 'Stack'
DW 80 DUP(?)
STACKSG ENDS
; -----------------------------------------------------
DATASG SEGMENT PARA 'Data'
ENDCDE DB 00
HANDLE DW ?
IOAREA DB 32 DUP(' ')
PATHNAM DB 'D:\NAMEFILE.SRT',0
OPENMSG DB '*** Open error ***', 0DH, 0AH
READMSG DB '*** Read error ***', 0DH, 0AH
ROW DB 00
DATASG ENDS
; ------------------------------------------------------
CODESG SEGMENT PARA 'Code'
BEGIN PROC FAR
ASSUME CS:CODESG,DS:DATASG,SS:STACKSG,ES:DATASG
PUSH DS
SUB AX,AX
PUSH AX
MOV AX,DATASG
MOV DS,AX
MOV ES,AX
MOV AX,0600H
CALL Q10SCR ;Очистить экран
CALL Q20CURS ;Установить курсор
CALL E100PEN ;Открыть файл,
; ; установить DTA
CMP ENDCDE,00 ;Ошибка открытия?
JNZ A90 ; да - завершить программу
A20LOOP:
CALL F10READ ;Чтение записи с диска
CMP ENDCDE,00 ;Ошибка чтения?
JNZ A90 ; да - выйти,
CALL G10DISP ; нет - выдать имя,
JMP A20LOOP ; и продолжить
A90: RET
BEGIN ENDP
; Открытие файла:
; --------------
E100PEN PROC NEAR
MOV AH,3DH ;Функция открытия
MOV CX,00 ;Нормальные атрибуты
LEA DX,PATHNAM
INT 21H
JC E20 ;Ошибка открытия?
MOV HANDLE,AX ; нет - сохранить
RET ; файловый номер
E20:



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


MOV ENDCDE,01 ; да - выдать
LEA DX,OPENMSG ; сообщение об ошибке
CALL X10ERR
RET
E100PEN ENDP
; Чтение дисковой записи:
; ----------------------
F10READ PROC NEAR
MOV AX,3FH ;Функция чтения
MOV BX,HANDLE
MOV CX,32 ;30 для имени, 2 для CR/LF
LEA DX,IOAREA
INT 21H
JC F20 ;Ошибка при чтении?
CMP AX,00 ;Конец файла?
JE F30
CMP IOAREA,1AH ;Маркер конца файла (EOF)?
JE F30 ; да - выйти
RET
F20:
LEA DX,READMSG ; нет - выдать
CALL X10ERR ; сообщение об ошибке
F30:
MOV ENDCDE,01 ;Код завершения
F90: RET
F10READ ENDP
; Вывод имени на экран:
; --------------------
G10DISP PROC NEAR
MOV AH,40H ;Функция вывода на экран
MOV BX,01 ;Установить номер
MOV CX,32 ; и длину
LEA DX,IOAREA
INT 21H
CMP ROW,20 ;Последняя строка экрана?
JEA G90 ; да - обойти
INC ROW
RET
G90:
MOV AX,0601H
CALL Q10SCR ;Прокрутка (скроллинг)
CALL Q20CURS ;Установить курсор
RET
G10DISP ENDP
; Прокрутка (скроллинг) экрана:
; ----------------------------
Q10SCR PROC NEAR ;в AX - адрес элемента
MOV BH,1EH ;Установить цвет
MOV CX,0000
MOV DXX,184FH ;Функция прокрутки
INT 10H
RET
Q10SCR ENDP



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


; Установка курсора:
; -----------------
Q20CURS PROC NEAR
MOV AH,02 ;Функция установки курсора
MOV BH,00 ; курсор
MOV DH,ROW ; строка
MOV DL,00 ; столбец
INT 10H
RET
Q20CURS ENDP
; Вывод сообщения об ошибке:
; -------------------------
X10ERR PROC NEAR
MOV AH,40H ;в DX - адрес сообщения
MOV BX,01 ;Номер
MOV CX,20 ;Длина сообщения
INT 21H
RET
X10ERR ENDP

CODESG ENDS
END BEGIN


































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



page 60,132
TITLE ASCREAD (COM) Чтение ASCII файла
CODESG SEGMENT PARA 'Code'
ASSUME CS:CODESG,DS:CODESG,SS:CODESG,ES:CODESG
ORG 100H
BEGIN: JMP MAIN
; -------------------------------------------------
SECTOR DB 512 DUP(' ') ;Область ввода
DISAREA DB 120 DUP(' ') ;Область вывода на экран
ENDCDE DW 00
HANDLE DW 0
OPENMSG DB '*** Open error ***'
PATHNAM DB 'D:\HANREAD.ASM', 0
ROW DB 00
; -------------------------------------------------
MAIN PROC NEAR ;Основная программя
MOV AX,0600H
CALL Q10SCR ;Очистить экран
CALL Q20CURS ;Установить курсор
CALL E10OPEN ;Открыть файл,
; установить DTA
CMP ENDCDE,00 ;Ошибка при открытии?
JNE A90 ; да - выйти,
A20LOOP: ; нет - продолжить
CALL R10READ ;Чтение первого сектора
CMP ENDCDE,00 ;Конец файла, нет данных?
JE A90 ; да - выйти
CALL G10XPER ;Выдать на экран
A90: RET ;Завершить программу
MAIN ENDP
; Открыть файл на диске:
; ---------------------
E10OPEN PROC NEAR
MOV AH,3DH ;Функция открытия
MOV AL,00 ;Только чтение
LEA DX,PATHNAM
INT 21H
JNC E20 ;Проверить флаг CF
CALL X10ERR ; ошибка, если установлен
RET
E20:
MOV HANDLE,AX ;Запомниить номер файла
RET
E10OPEN ENDP
; Построчный вывод данных на экран:
; --------------------------------
G10XPER PROC NEAR
CLD ;Направление слева-направо
LEA SI,SECTOR
G20:
LEA DI,DISAREA
G30:



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


LEA DX,SECTOR+512
CMP SI,DX ;Конец сектора?
JNE G40 ; нет - обойти,
CALL R10READ ; да - читать следующий
CMP ENDCDE,00 ;Конец файла?
JE G80 ; да - выйти
LEA SI,SECTOR
G40:
LEA DX,DISAREA+80
CMP DI,DX ;Конец DISAREA?
JB G50 ; нет - обойти,
MOV [DI],0D0AH ; да - установить CR/LF
CALL H10DISP ; и выдать на экран
LEA DI,DISAREA
G50:
LODSB ;Загрузить [SI] в AL
; и увеличить SI
STOSB ;Записать AL в [DI]
; и увеличить DI
CMP AL,1AH ;Конец файла?
JE G80 ; да - выйти
CMP AL,0AH ;Конец строки?
JNE G30 ; нет - повторить цикл,
CALL H10DISP ; да - вывести на экран
JMP G20
G80:
CALL H10DISP ;Вывести последнюю строку
G90: RET
G10XPER ENDP
; Вывод строки на экран:
; ---------------------
H10DISP PROC NEAR
MOV AH,40H ;Функция вывода на экран
MOV BX,01 ;Номер (Handle)
LEA CX,DISAREA ;Вычислить
NEG CX ; длину
ADD CX,DI ; строки
LEA DX,DISAREA
INT 21H
CMP ROW,22 ;Последняя строка экрана?
JAE H20 ; нет - выйти
INC ROW
JMP H90
H20:
MOV AX,0601H ;Прокрутка (скроллинг)
CALL Q10SCR
CALL Q20CURS
H90: RET
H10DISP ENDP
; Чтени дискового сектора:
; -----------------------
R10READ PROC NEAR
MOV AH,3FH ;Функция чтения



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


MOV BX,HANDLE ;Устройство
MOV CX,512 ;Длина
LEA DX,SECTOR ;Буфер
INT 21H
MOV ENDCDE,AX
RET
R10READ ENDP
; Прокрутка (скроллинг) экрана:
; ----------------------------
Q10SCR PROC NEAR ;в AX адрес элемента
MOV BH,1EH ;Установить цвет
MOV CX,0000 ;Прокрутка
MOV DX,184FH
INT 10H
RET
Q10SCR ENDP
; Установка курсора:
; -----------------
Q20CURS PROC NEAR
MOV AH,02 ;Функция
MOV BH,00 ; установки курсора
MOV DH,ROW
MOV DL,00
INT 10H
RET
Q20CURS ENDP
; Вывод сообщения об ошибке на диске:
; ----------------------------------
X10ERR PROC NEAR
MOV AH,40H ;Функция вывода на экран
MOV BX,01 ;Номер устройства
MOV CX,18 ;Длина
LEA DX,OPENMSG
INT 21H
MOV ENDCDE,O1 ;Индикатор ошибки
RET
X10ERR ENDP

CODESG ENDS
END BEGIN
















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



TITLE GETPATH (COM) Получить текущий каталог
CODESG SEGMENT PARA 'Code'
ASSUME CS:CODESG,DS:CODESG,ES:CODESG
ORG 100H
BEGIN: JMP SHORT MAIN
; -----------------------------------------------
PATHNAM DB 65 DUP(' ') ;Имя текущего пути доступа
; -----------------------------------------------
MAIN PROC NEAR
MOV AH,19H ;Определить текущий диск
INT 21H
ADD AL,41H ;Заменить шест.номер
MOV DL,AL ; на букву: 0=A, 1=B ...
CAL B10DISP ;Выдать номер дисковода,
MOV DL,':'
CAL B10DISP ; двоеточие,
MOV DL,'\'
CAL B10DISP ; обратную косую

MOV AH,47H ;Получить текущий каталог
MOV DL,00
LEA SI,PATHNAM
INT 21H
A10LOOP:
CMP BYTE PTR [SI],0 ;Конец имени пути доступа
JE A20 ; да - выйти
MOV AL,[SI] ;Выдать на экран
MOV DL,AL ; имя пути доступа
CALL B10DISP ; побайтно
INC SI
JMP A10LOOP
A20: RET ;Выход в DOS
MAIN ENDP

B10DISP PROC NEAR
MOV AH,02 ;в DL - адрес элемента
INT 21H ;Функция вывода на экран
RET
B10DISP ENDP

CODESG ENDS
END BEGIN













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



TITLE BIOREAD (COM) Чтение дискового сектора через BIOS
CODESG SEGMENT PARA 'Code'
ASSUME CS:CODESG,DS:CODESG,SS:CODESG,ES:CODESG
ORG 100H
BEGIN JMP MAIN
; ---------------------------------------------------------
RECDIN DB 512 DUP(' ') ;Область ввода
ENDCDE DB 00
CURADR DW 0304H ;Начало (дорожка/сектор)
ENDADR DW 0501H ;Конец (дорожка/сектор)
READMSG DB '*** Read error ***$'
SIDE DB 00
; ---------------------------------------------------------
MAIN PROC NEAR
MOV AX,0600H ;Функция прокрутки экрана
A20LOOP:
CALL Q10SCR ;Очистить экран
CALL Q20CURS ;Установить курсор
CALL C10ADDR ;Определить адрес на диске
MOV CX,CURADR
MOV DX,ENDADR
CMP CX,DX ;Последний сектор?
JE A90 ; да - выйти
CALL F10READ ;Получить дисковую запись
CMP ENDCDE,00 ;Ошибка чтения?
JNZ A90 ; да - выйти
CALL G10DISP ;Вывести сектор на экран
JMP A20LOOP ;Повторить
A90 RET ;Завершить программу
MAIN ENDP
; Вычислить следующий адрес на диске:
; ----------------------------------
C10ADDR PROC NEAR
MOV CX,CURADR ;Последняя дорожка/сектор
CMP CL,10 ;Последний сектор?
JNE C90 ; нет - выйти
CMP SIDE,00 ;Обойти, если сторона = 0
JE C20
INC CH ;Увеличить номер дорожки
C20:
XOR SIDE,01 ;Сменить сторону
MOV CL,01 ;Установить сектор = 1
MOV CURADR,CX
C90: RET
C10ADDR ENDP
; Чтение дискового сектора:
; ------------------------
F10READ PROC NEAR
MOV AL,01 ;Число секторов
MOV AH,02 ;Функция чтения
LEA BX,RECDIN ;Адрес буфера
MOV CX,CURADR ;Дорожка/сектор



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


MOV DH,SIDE ;Сторона
MOV DL,01 ;Дисковод B
INT 13H ;Выполнить ввод
CMP AH,00 ;Ошибка чтения?
JZ F90 ; нет - выйти
MOV ENDCDE,01 ; да:
CALL X10ERR ; ошибка чтения
F90:
INC CURADR ;Увеличить номер сектора
RET
F10READ ENDP
; Вывод сектора на экран:
; ----------------------
G10DISP PROC NEAR
MOV AH,40H ;Функция вывода на экран
MOV BX,01 ;Номер устройства
MOV CX,512 ;Длина
LEA DX,RECDIN
INT 21H
RET
G10DISP ENDP
; Очистка экрана:
; --------------
Q10SCR PROC NEAR
MOV AX,0600H ;Полный экран
MOV BH,1EH ;Установить цвет
MOV CX,0000 ;Функция прокрутки
MOV DX,184FH
INT 10H
RET
Q10SCR ENDP
; Установка курсора:
; -----------------
Q20CURS PROC NEAR
MOV AH,02 ;Функция установки
MOV BH,00 ; курсора
MOV DX,0000
INT 10H
RET
Q20CURS ENDP
; Вывод сообщения об ошибке на диске:
; ----------------------------------
X10ERR PROC NEAR
MOV AH,40H ;Функция вывода на экран
MOV BH,01 ;Номер устройства
MOV CX,18 ;Длина сообщения
LEA DX,READMSG
INT 21H
RET
X10ERR ENDP
CODESG ENDS
END BEGIN




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



TITLE PRTNAME (COM) Ввод и печать имен
CODESG SEGMENT PARA PUBLIC 'CODE'
ASSUME CS:CODESG,DS:CODESG,SS:CODESG,ES:CODESG
ORG 100H
BEGIN: JMP SHORT MAIN
; -----------------------------------------------------
NAMEPAR LABEL BYTE ;Список параметров
MAXNLEN DB 20 ; максимальная длина имени
NAMELEN DB ? ; длина введенного имени
NAMEFLD DB 20 DUP(' ') ; введенное имя
;Строка заголовка:
HEADG DB 'List of Employee Names Page '
PAGECTR DB '01',0AH,0AH
FFEED DB 0CH ;Перевод страницы
LFEED DB 0AH ;Перевод строки
LINECTR DB 01
PROMPT DB 'Name? '
; -----------------------------------------------------
MAIN PROC NEAR
CALL Q10CLR ;Очистить экран
CALL M10PAGE ;Установка номера страницы
A2LOOP:
MOV DX,0000 ;Установить курсор в 00,00
CALL Q20CURS
CALL D10INPT ;Ввести имя
CALL Q10CLR
CMP NAMELEN,00 ;Имя введено?
JE A30 ; если нет - выйти,
CALL E10PRNT ; если да - подготовить
; печать
JMP A20LOOP
A30:
MOV CX,01 ;Конец работы:
LEA DX,FFEED ; один символ
CALL P10OUT ; для прогона страницы,
RET ; возврат в DOS
MAIN ENDP
; Ввод имени с клавиатуры:
; -----------------------
D10INPT PROC NEAR
MOV AH,40H ;Функция
MOV BX,01 ; вывода на экран
MOV CX,05 ; 5 символов
LEA DX,PROMPT
INT 21H ;Вызов DOS
MOV AH,0AH ;Функция ввода с клавиатуры
LEA DX,NAMEPAR
INT 21H ;Вызов DOS
RET