;;
If type EQ 10 ;; десятичное преобразование
;; указано?
IFNDEF EXT_BIN2DEC ;; было определеноEXT_BIN2DEC?
EXTRN bin2dec:NEAR ;; нет, вставьте определение
;; EXTRN
EXT_BIN2DEC EQU 0 ;; и только раз установите
;; равенство
ENDIF
;;
ELSE
;;
IF type EQ 16 ;; шестнадцатиричное
;; преобразование указано?
IFNDEF EXT_BIN2HEX ;; было определено EXT_BIN2HEX?
EXTRN bin2hex:NEAR ;; нет, вставьте определение
EXT_BIN2HEX EQU 0 ;; EXTRN и только раз установите
;; равенство
ENDIF
;;
ELSE
;;
.ERR
%OUT @DisNum Macro: указан "type" запрещенный "тип"
ENDIF ;; окончить проверку для шестнадца-
;; тиричного преобразования
;;
ENDIF ;; окончить проверку для десятичного преобразования
;;
ELSE ;; в противном случае, параметр пустой
;;
.ЕRR ;; завершить выполнение сообщением об ошибке
%OUT @DisNum macro: "type" параметр не указан
ENDIF ;; окончить проверку пустого параметра
;; Oкoнчить проверку требуемых параметров
;;
;; Hачать вставку программы
push ax ;; сохранить содержимое регистров
push cx
push dx
;;
mov ax,number ;; поместить число в AX
;;
IFNB ;; аргумент "разряды" указан?
mov ch,digits ;; да, записать значение в CH
ELSE ;; в противном случае, по умолчанию
mov ch,1 ;; отобразить по крайней мере 1 разряд
ENDIF
;;
IFNB ;; аргумент "знак" указан?
mov dx,sign ;; да, поэтому поместить его в DX
ELSE ;; в противном случае, по умолчанию знак
mov dx,0 ;; будет отсутствовать
ENDIF
;;
If type EQ 10 ;; десятичное преобразование указано?
- П-23 -
call bin2dec
ELSE
IF type EQ 16 ;; шестнадцатиричное преобразование
;; указано?
call bin2hex
ENDIF ;; конец проверки по основанию 16
ENDIF ;; конец проверки по основанию 10
;;
pop dx ;; восстановить содержимое регистров
pop cx
pop ax
;;
ENDM ;; конец макроопределения
ENDIF ;; конец выполнения прохода
;;
;;
;;** @GetDate ********** Mакрокоманды общего назначения **
;; Получить системную дату
IF1 ;; Ассемблировать только в процессе прохода 1
@GetDate MACRO
mov ah,2Ah ;; загрузить номер функции
@DosCall ;; вызвать MS-DOS
ENDM ;; конец макроопределения
ENDIF ;; конец выполнения прохода
;;
;;** @GetTime ********** Mакрокоманды общего назначения **
;; Получить системное время
IF1 ;; Ассемблировать только в процессе прохода 1
@GetTime MACRO
mov ah,2Ch ;; загрузить номер функции
@DosCall ;; вызвать MS-DOS
ENDM ;; конец макроопределения
ENDIF ;; конец выполнения прохода
;;
;;** @DiskRead ******** Mакрокоманды общего назначения **
;; Считать логический сектор(а)
IF1 ;; Ассемблировать только в процессе прохода 1
@DiskRead MACRO
int 25h ;; обработать абсолютное прерывание
;; по чтению диска
ENDM ;; конец макроопределения
ENDIF ;; конец выполнения прохода
;;
;;** @DiskWrite ******* Mакрокоманды общего назначения **
;; Записать в логический сектор(а)
IF1 ;; Ассемблировать только в процессе прохода 1
@DiskWrite MACRO
int 26h ;; обработать машинное прерывание
;; по записи на диск
ENDM ;; конец макроопределения
ENDIF ;; конец выполнения прохода
;;
;;** @GetDOSVersion **** Mакрокоманды общего назначения **
;; Получить номер версии операционной системы MS-DOS
IF1 ;; Ассемблировать только в процессе прохода 1
@GetDOSVersion MACRO
push bx ;; сохранить содержимое
- П-24 -
;; уничтоженных регистров
push cx
mov ah,30h ;; загрузить номер функции
@DosCall ;; вызвать MS-DOS
pop cx ;; восстановить содержимое регистров
pop bx
ENDM ;; конец макроопределения
ENDIF ;; конец выполнения прохода
;;
;;** @GetDOSVer ******* Mакрокоманды общего назначения **
;; Получить номер версии операционной системы MS-DOS
IF1 ;; Ассемблировать только в процессе прохода 1
@GetDOSVer MACRO
IFNDEF EXT_GDOSV ;; символ определен?
EXTRN GETDOSV:NEAR ;; нет, вставить команду EXTRN
;; только один раз
EXT_GDOSV EQU 0 ;; и только раз определить
;; равенство
ENDIF ;; (две верхние строки не
;; должны вставляться в
;; последующие вызовы
;; макроопределения)
call dosver ;; вызвать библиотечную
;; стандартную программу
ENDM ;; конец макроопределения
ENDIF ;; конец выполнения прохода
;;
;;** @DisDOSVer ********* Mакрокоманды общего назначения **
;; Получить и отобразить номер версии DOS
IF1 ;; Ассемблировать только в процессе прохода 1
@DisDOSVer MACRO
IFNDEF EXT_DDOSV ;; символ определен?
EXTRN DOSV2CON:NEAR ;; нет, вставить команду EXTRN
;; только один раз
EXT_DDOSV EQU 0 ;; и только раз определить
;; равенство
ENDIF ;; (две верхние строки не
;; должны вставляться в
;; последующие вызовы
;; макроопределения)
call dosv2con ;; вызвать библиотечную
;; стандартную программу
ENDM ;; конец макроопределения
ENDIF ;; конец выполнения прохода
;;
;;** @ChangeСase ******* Mакрокоманды общего назначения **
;; Изменить регистр клавиатуры для символа
IF1 ;; Bыполнять только в процессе прохода 1
@ChangeCase MACRO char,type
IFB ;; символ, подлежащий преобразованию,
;; указан ?
.ERR ;; нет, сгенерировать и
;; вывести сообщение об ошибке
%OUT @ChangeCase macro: "char" параметр не определен !
ELSE ;; в противном случае
mov al,char ;; загрузите символ в AL
ENDIF
- П-25 -
;;
IFB ;; тип преобразования указан?
mov ah,0 ;; нет, поэтому загрузить 0 в AH
ELSE
mov ah,type ;; загрузить тип преобразования в AH
ENDIF
;;
IFNDEF EXT_CHGCASE ;; символ EXT_CHGCASE определен?
EXTRN CHGCASE:NEAR ;; нет, вставить EXTRN только раз
EXT_CHGCASE EQU 0 ;; и только раз определить равенство
ENDIF ;; (две верхние строки не должны вставляться в
;; последующие вызовы данной макрокоманды)
;;
call chgcase ;; вызвать библиотечную процедуру
;; изменения регистра клавиатуры
ENDM ;; конец макроопределения
ENDIF ;; конец выполнения прохода
;;
;;** @case ************* Mакрокоманды общего назначения **
;; Mакрокоманда CASE языка ассемблера
@Case MACRO key,case_list,jmp_labels
??tmp_1 = 0
IRP match,<&case_list> ;; упорядочить регистры
??tmp_1 = ??tmp_1 + 1 ;; установить номер индекса
cmp key,&&match ;; регистр соответствует?
??tmp_2 = 0
IRP retl,<&jmp_labels> ;; упорядочить переходы
??tmp_2 = ??tmp_2 + 1 ;; до тех пор, пока индекс
;; не будет соответствовать
IF (??tmp_1 EQ ??tmp_2)
je &&&retl ;; да !
EXITM
ENDIF ;; конец проверки условия
ENDM ;; конец второго блока IRP
ENDM ;; конец первого блока IRP
ENDM ;; конец макроопределения
;;
;;
;;*****************************************************
;; Используйте макрокоманды @PushAll и @PopAll вместо ко-
;; манд PUSHA и POPA, поддерживаемых процессором
;; 80186/80188/80286/80386 для обеспечения совместимости
;; с процессорами 8086/8088.
;;
;;** @PushAll ********** Mакрокоманды общего назначения **
;; Поместить в стек содержимого всех регистров
IF1 ;; Выполнять только в процессе прохода 1
@PushAll MACRО ;; сохранить содержимое всех регистров в стеке
push ax
push bx
push cx
push dx
push dp
push di
push si
ENDM ;; конец макроопределения
ENDIF ;; конец выполнения прохода
- П-26 -
;;
;;** @PopAll *********** Mакрокоманды общего назначения **
;; Снять со стека содержимое всех регистров
IF1 ;; Выполнять только в процессе прохода 1
@PopAll MACRO ;; восстановить содержимое всех
;; регистров из стеке
pop si
pop di
pop dp
pop dx