Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Модуль utils.asm

; Вывод строки с переносом и общими координатами #############################
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

Оставить комментарий

Комментарий:
можно использовать BB-коды
Максимальная длина комментария - 4000 символов.
 
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог