CodeNet / Языки программирования / Ассемблер / Пишем "многозадачную" ОС в "Real Mode"
CodeNet / Платформы / Пишем ОС / Пишем "многозадачную" ОС в "Real Mode"
CodeNet / Платформы / Пишем ОС / Пишем "многозадачную" ОС в "Real Mode"
Модуль 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