; Вывод строки с переносом и общими координатами #############################
PROC writeln
push ds es
call write
mov [Byte Ptr mainx],0
mov al,[mainy]
inc al
cmp al,[windowhx]
jne wln
dec al
push ax
mov ch,[windowy] ;¬
mov cl,[windowx] ;¦
dec cl ;¦
mov dh,[windowHx] ;¦
inc dh ;¦
mov dl,[windowWx] ;¦ Сдвиг окна вверх
inc dl ;¦
inc dl ;¦
mov ax,0601h ;¦
mov bh,[color] ;¦
int 10h ;-
pop ax
wln: mov [mainy],al
mov dh,[mainy]
mov dl,[mainx]
add dh,[windowy]
add dl,[windowx]
xor bx,bx
mov ax,0200h
int 10h
pop es ds
ret
ENDP writeln
; Вывод строки с общими координатами #########################################
PROC write
push ds es
mov ax,0B800h
mov es,ax
call GetCurentVideoAddr
mov dl,[mainx]
mov dh,[mainy]
write1: mov ah,[Color]
mov al,[ds:si]
or al,al
je writeend
mov [es:di],ax
inc di
inc di
inc si
inc dl
cmp dl,[windowwx]
je wxcarry
jmp write1
writeend: mov [mainx],dl
mov [mainy],dh
add dh,[windowy]
add dl,[windowx]
push bx
xor bx,bx
mov ax,0200h
int 10h
pop bx
pop es ds
ret
; Перенос строки
wxcarry: xor dl,dl
inc dh
push dx
call WindowSetVidAddr
pop dx
cmp dh,[windowhx]
jne write1
dec dh
push dx
push bx
mov ch,[windowy] ;¬
mov cl,[windowx] ;¦
dec cl ;¦
mov dh,[windowHx] ;¦
inc dh ;¦
mov dl,[windowWx] ;¦ Сдвиг окна вверх
inc dl ;¦
inc dl ;¦
mov ax,0601h ;¦
mov bh,[color] ;¦
int 10h ;-
call WindowSetVidAddr
pop bx
pop dx
dec bh
jmp write1
ENDP write
; Вывод строки ds:di #########################################################
PROC print
mov ax,0B800h
mov es,ax
add dh,[windowy]
add dl,[windowx]
call SetVidAddr
print1: mov ah,[Color]
mov al,[ds:si]
or al,al
je prnend
mov [es:di],ax
inc di
inc di
inc si
jmp print1
prnend: ret
ENDP print
; Получаем текущий адресс в видеопамяти ######################################
PROC GetCurentVideoAddr
mov dl,[mainx]
mov dh,[mainy]
ENDP GetCurentVideoAddr
PROC WindowSetVidAddr
add dl,[windowx]
add dh,[windowy]
ENDP WindowSetVidAddr
; Установить адресс видеопамяти ##############################################
PROC SetVidAddr ;подготовить адресс видеопамяти.
push bx
xor bh, bh ;dx - координаты
mov bl, dh ;Возвращяет в di адресс
shl bx, 1
mov di, [ScRow+bx]
xor dh, dh
shl dx, 1
add di, dx
pop bx
ret
ENDP SetVidAddr
; Рамка ######################################################################
Ramka: mov ax,0B800h
mov es,ax
or dl,dl ; [ch] - Y [cl] - X
je RamkaEnd ; [dh] - Y [dl] - X
or dh,dh
je RamkaEnd
mov ah,[Color]
dec dl
dec dh
xor bh,bh
mov bl,ch
push dx ax
mov dx,160
mov ax,bx
mul dx
mov bx,ax
pop ax dx
xor ch,ch
shl cx,1
add bx,cx
mov di,bx ;[di] - адресс верхнего-левого
push di
mov al,"г"
stosw
mov al,"="
xor ch,ch
mov cl,dl
rep stosw
mov al,"¬"
stosw
pop di
mov cl,dh
xor ch,ch
Ramka_1: add di,160
push di
push cx
mov al,"¦"
stosw
mov al," "
xor ch,ch
mov cl,dl
rep stosw
mov al,"¦"
stosw
pop cx
pop di
loop Ramka_1
add di,160
mov al,"L"
stosw
mov al,"="
xor ch,ch
mov cl,dl
rep stosw
mov al,"-"
stosw
RamkaEnd: ret
; Вывод строки с заданой длиной (SI и CX) ####################################
PROC writeCX
push es di cx si
lea di,[tmp_String]
rep movsb
mov [Byte Ptr di],0
pop si
push si
lea si,[tmp_String]
call write
pop si cx di es
ret
ENDP writeCX
; Сравнить строки (SI,DI - строки) ###########################################
; Сравнение не корректно и работает только в данном частном случаем ##########
PROC CmpStrings
cmpstr2: mov al,[si]
or al,al
je cmpstr3 ; Строки равны
cmp al,[di]
jne cmpstr1 ; Строки не равны
inc di
inc si
jmp cmpstr2
cmpstr3: stc ; STC Установка признака переноса
ret
cmpstr1: clc ; CLC Сброс признака переноса
ret
ENDP CmpStrings
; Конвертирует AX в HEX строку ###############################################
PROC bin2hex ; Convert AX to ASCII and
push ax ; store result at [DS:DX].
push bx ; All regs (including
push cx ; DX) are preserved.
push dx
mov bx,dx
mov dl,ah
mov cl,4
shr dl,cl
call bh10
mov dl,ah
and dl,15
call bh10
mov dl,al
shr dl,cl
call bh10
mov dl,al
and dl,15
call bh10
pop dx
pop cx
pop bx
pop ax
ret
bh10: cmp dl,10
jb bh11
add dl,7
bh11: add dl,'0'
mov [bx],dl
inc bx
ret
ENDP Bin2Hex
; Вывод HEX числа ############################################################
WriteAXData1 db ' ',0
PROC WriteAX
push cs
pop ds
lea dx,[WriteAXData1]
call Bin2Hex
lea si,[WriteAXData1]
call write
ret
ENDP WriteAX
; UpperString (ds:di - строка )###############################################
PROC UpperString
push di ax
us0: mov al,[ds:di]
or al,al
je us1
cmp al,'a' ; "a"
jc us2
cmp al,'z' ; "z"
ja us2
us00: sub al,20h
mov [ds:di],al
us01: inc di
jmp us0
us2: cmp al,0A0h ; "a" русское
jc us3
cmp al,0AFh ; "п" русское
ja us3
jmp us00
us3: cmp al,0E0h
jc us01
cmp al,0EFh
ja us01
sub al,'р'-'Р'
mov [ds:di],al
jmp us01
us1: pop ax di
ret
ENDP UpperString
; Преобразование деситичного числа в строку ##################################
PROC BinToAscDec ;ax - Число
push bx ;cx - Минимальное кол-во вывод. чисел
mov bx,10 ;di - Адресс строки с рез-том.
call NumToAscii
pop bx
ret
ENDP BinToAscDec
;*****************************************************************************
PROC NumToAscii
push dx
push di
push si
xor si,si
jcxz NTA20
NTA10: xor dx,dx
div bx
call HexDigit
push dx
inc si
loop NTA10
NTA20: inc cx
or ax,ax
jnz NTA10
mov cx,si
jcxz NTA40
cld
NTA30: pop ax
stosb
loop NTA30
NTA40: mov [byte di],0
pop si
pop di
pop dx
ret
ENDP NumToAscii
;*****************************************************************************
PROC HexDigit
cmp dl,10
jb HD10
add dl,"A"-10
ret
HD10: or dl,"0"
ret
ENDP HexDigit
; Вывод двухзначного десятичного числа (00-99) ###################################
writeDEC2Data DB "00",0
PROC writeDEC2 ; AX - число
lea di,[writeDEC2Data]
mov cx,2
xor ah,ah
call BinToAscDec
lea si,[writeDEC2Data]
call write
ret
ENDP writeDEC2
; Вывод четырехзначного десятичного числа (00-9999) #################################
writeDEC4Data DB "0000",0
PROC writeDEC4 ; AX - число
lea di,[writeDEC4Data]
mov cx,4
call BinToAscDec
lea si,[writeDEC4Data]
call write
ret
ENDP writeDEC4
|