; AH = состояние символа:
; "L" = нижний регистр
; "U" = верхний регистр
; 0 = если символ в регистре AL не являлся
; буквенным символом в коде ASCII
; Содержимое всех других регистров
- П-35 -
; восстанавливается
;
; Вызываемые стандартные программы: нет
;- - - - - - - - - - - - - - - - - - - - - - - - - - - -
PUBLIC CHGCASE ; библиотечная стандартная программа
;
chgcase PROC NEAR
push dx ; сохранение содержимого регистров
;
; Определить, содержит ли регистр AL буквенный символ в коде
; ASCII, и если символ действителен, определить его регистр.
cmp al,"A" ; находится символ под первой
; буквой верхнего регистра?
jl error ; да, он не является буквенным
; символом в коде ASCII
cmp al,"Z" ; находится символ под последней
; буквой верхнего регистра?
jle is_upper ; да, символ соответствует
; верхнему регистру
cmp al,"a" ; находится символ под первой
; буквой нижнего регистра?
jl error ; да, он не является буквенным
; символом в коде ASCII
cmp al,"z" ; находится символ под последней
; буквой нижнего регистра?
jle is_lower ; да, символ находится в нижнем
; регистре
jmp short error ; в противном случае, он не являет-
; ся буквенным символом в коде ASCII
;
is_upper:
mov dl,"U" ; пометить символ как признак
; верхнего регистра
jmp short convert_type ; и продолжить
is_lower:
mov dl,"L" ; пометить символ как признак
; нижнего регистра
jmp short convert_type ; и продолжить
error:
mov ah,0 ; пометить символ как не буквенный
; символ в коде ASCII
jmp short done ; и завершить выполнение процедуры
;
convert_type:
cmp ah,"l" ; изменить на нижний регистр?
je to_lower ; да, поэтому изменить символ
cmp ah,"L" ; изменить на нижний регистр?
je to_lower ; да, поэтому изменить символ
cmp ah,"u" ; изменить на верхний регистр?
je to_upper ; да, поэтому изменить символ
cmp ah,"U" ; изменить на верхний регистр?
je to_upper ; да, поэтому изменить символ
;
; В противном случае, изменить регистр клавиатуры
; на противоположный
cmp dl,"L" ; это символ нижнего регистра?
je to_upper ; да, изменить его на верхний регистр
- П-36 -
; в противном случае, это верхний регистр,
; поэтому сделать его нижним
;
to_lower:
mov ah,"L" ; установить признак регистра для
; возврата
cmp dl,ah ; символ уже соответствует нижнему
; регистру?
je done ; да, действие выполнено
add al,20h ; в противном случае, изменить на
; нижний регистр
jmp short done ; и выйти из процедуры
;
to_upper:
mov ah,"U" ; установить признак регистра для возврата
cmp dl,ah ; символ уже соответствует верхнему
; регистру ?
je done ; да, действие выполнено
sub al,20h ; в противном случае, изменить на
; верхний регистр
;
done:
pop dx ; восстановить содержимое регистров
ret
;
chgcase ENDP
;
;
;+++++++++++++++++++++++++++++++++++++++++++++++++++++
; DOSVER - Получает версию операционной системы MS-DOS
; и возвращает старшую и младшую версии. Возвращает значе-
; ние "1.00", если текущая версия DOS 1.00 или 1.10.
;
; Вход : нет
;
; Выход : AL = старшая версия
; AH = младшая версия ( = 00, если перед этим
; была версия 2.00 DOS)
; (Содержимое всех других регистров восстанавливается)
;
; Вызываемые стандартные программы: нет
;- - - - - - - - - - - - - - - - - - - - - - - - - - - -
PUBLIC DOSVER ; библиотечная стандартная программа
;
dosver PROC NEAR
push bx ; сохранить содержимое регистров
push cx
push dx
;
xor ax,ax ; очистить регистр AX
mov ah,30h ; загрузить функцию "получить
; версию DOS"
@DosCall
cmp al,0 ; это версия предыдущая 2.00?
jg dos2plus ; нет, действие сделано
mov al,1 ; в противном случае это версия 1.ХХ
mov ah,0 ; установить младшую версию в "00"
- П-37 -
;
dos2plus:
pop dx ; восстановить содержимое регистров
pop cx
pop bx
ret
;
dosver ENDP
;
;
;+++++++++++++++++++++++++++++++++++++++++++++++++++++
; DOSV2CON: Получает и отображает текущую версию операцион-
; ной системы MS-DOS, и возвращает версию вызывающей прог-
; рамме.
;
; Вход : нет
;
; Выход : AL = старшая версия
; AH = младшая версия
; (Содержимое всех других регистров восстанавливается)
;
; Вызываемые стандартные программы:
; DOSVER (получает версию MS-DOS)
; BIN2CON (отображает номера в десятичном виде)
;- - - - - - - - - - - - - - - - - - - - - - - - - - - -
PUBLIC DOSV2CON ; библиотечная стандартная программа
;
dosv2con proc NEAR
; ;
;EXTRN dosver: NEAR ; получить версию MS-DOS
;EXTRN bin2dec: NEAR ; отображает номера в десятичном виде
;
push bx ; сохранить содержимое регистров
push cx ;
push dx ;
;
call dosver ; получить версию MS-DOS
push ax ; сохранить возвращенную версию
push ax ; и сохранить ее снова
xor ah,ah ; записать номер старшей версии в
; регистр AL
mov ch,1 ; отобразить по крайней мере 1 разряд
call bin2dec ; вывести на печать число
@DisChr '-' ; символ-разделитель
pop ax ; восстановить номер младшей версии
cmp al,1 ; это версия 1.ХХ?
je ver1xx ; да, отобразить "ХХ" как младшую версию
xchg ah,al ; в противном случае поместить номер
; младшей версии в регистр AL
xor ah,ah ; очистить верхние
mov ch,2 ; отобразить, по крайней мере, 2 разряда
call bin2dec ; вывести число
jmp short end_ver ; конец
;
ver1xx:
@DisChr 'X' ; вывести "Х"
@DisChr 'X' ; и опять
- П-38 -
;
end_ver:
pop ax ; восстановить номер версии для воз-
; врата основной стандартной программе
pop dx ; восстановить остальные регистры
pop cx
pop bx
ret
;
dosv2con ENDP ; конец стандартной программы
;
;
;+++++++++++++++++++++++++++++++++++++++++++++++++++++++
; MEMALLOC - Распределяет блок памяти указанного размера
; в параграфах (16 байт).
;
; Вход : BX = размер запрашиваемого блока в 16-байтных
; параграфах
;
; Выход : Признак переноса = 0, если УСПЕХ, причем
; AX = адрес сегмента распределенного
; блока памяти
; (Содержимое регистра BX восстанавливается)
; Признак переноса = 1, если ОТКАЗ, причем
; AX = код ошибки,
; 7 = разрушенные блоки управления памятью
; 8 = недостаточная память
; BX = наибольший доступный блок памяти в
; параграфах
;
; Вызываемые стандартные программы: нет
;- - - - - - - - - - - - - - - - - - - - - - - - - - - -
PUBLIC MEMALLOC ; библиотечная стандартная программа
;
memalloc PROC NEAR
push bp ; сохранить указатель базы
push bx ; сохранить содержимое регистра BX
mov bp,sp ; инициализировать указатель базы
;
xor al,al ; очистить регистр AL
mov ah,48h ; загрузить функцию распределения
; памяти
@DosCall ; выполнить распределение памяти
jnc end_memalloc ; завершить выполнение,
; если нет ошибки с адресом
; сегмента в регистре AX
; в противном случае, завершить
; выполнение с установкой признака
; переноса
mov word ptr [bp],bx ; максимальным размером
; блока (в регистре BX)
; и кодом ошибки в регистре AX
;
end_memalloc:
pop bx ; восстановить регистр BX
pop bp ; восстановить указатель базы
ret
- П-39 -
;
memalloc ENDP
;
;
;+++++++++++++++++++++++++++++++++++++++++++++++++++++
; MEMSIZE: Изменяет размер блока памяти, ранее распреде-
; ленной с помощью стандартной программы MEMALLOC. Указыва-
; ются адрес блока и запрашиваемый размер (в 16-байтных па-