; Rysowanie okienek z ramka ; ; Autor: Bogdan D. ; kontakt: bogdandr (at) op (dot) pl ; ; nasm -O999 -o ramki.com -f bin ramki.asm ; ; Copyright (C) 2005-2007 Bogdan 'bogdro' Drozdowski, bogdandr @ op . pl ; ; Ten program jest wolnym oprogramowaniem; mozesz go rozpowszechniac ; i/lub modyfikowac zgodnie z licencja GNU Lesser General Public License ; (GNU LGPL) w wersji wydanej przez Fundacje Wolnego Oprogramowania; ; wedlug wersji 3 Licencji lub (jesli wolisz) jednej z pozniejszych wersji. ; ; Ten program jest udostepniany z nadzieja, ze bedzie uzyteczny, lecz ; BEZ JAKIEJKOLWIEK GWARANCJI; nawet domyslnej gwarancji PRZYDATNOSCI ; HANDLOWEJ albo PRZYDATNOSCI DO OKRESLONYCH ZASTOSOWAN. W celu uzyskania ; blizszych informacji - Licencja GNU Lesser General Public License. ; ; Z pewnoscia wraz z niniejszym programem otrzymales tez egzemplarz ; Licencji GNU Lesser General Public License; jesli nie - napisz do ; Fundacji Wolnego Oprogramowania: ; Free Software Foundation ; 51 Franklin Street, Fifth Floor ; Boston, MA 02110-1301 ; USA org 100h ; ramki podwojne: mov ah, 7 ; atrybut znaku xor bx, bx ; kolumna lewego gornego rogu xor cx, cx ; wiersz lewego gornego rogu mov dx, 9 ; kolumna prawego dolnego rogu mov bp, 9 ; wiersz prawego dolnego rogu call rysuj_okienko ; rysuj mov ah, 42h mov bx, 10 mov cx, 10 mov dx, 20 mov bp, 16 call rysuj_okienko xor ah, ah int 16h ; czekamy na klawisz mov ax, 4c00h int 21h ; wyjscie z programu ; ==================================== rysuj_okienko: ; wejscie: ; ; AH = atrybut znaku (kolor) ; BX = kolumna lewego gornego rogu ; CX = wiersz lewego gornego rogu ; DX = kolumna prawego dolnego rogu ; BP = wiersz prawego dolnego rogu ; ; wyjscie: ; nic ; znaki przedstawiajace ramki: r_p equ 0bah ; prawa boczna r_pg equ 0bbh ; prawa gorna (naroznik) r_pd equ 0bch ; prawa dolna r_g equ 0cdh ; gorna r_d equ r_g ; dolna r_l equ r_p ; lewa boczna r_lg equ 0c9h ; lewa gorna r_ld equ 0c8h ; lewa dolna spacja equ 20h push di push si push es push ax mov di, cx ; DI = numer wiersza mov si, cx shl di, 6 shl si, 4 add di, si ; DI:=DI*80=numer pierwszego ; wiersza * 80 mov si, 0b800h mov es, si ; ES = segment ekranu mov si, di add di, bx ; DI = pozycja poczatku add si, dx ; SI = pozycja konca shl di, 1 ; 2 bajty/element shl si, 1 mov al, r_lg mov [es:di], ax ; rysujemy lewy gorny naroznik add di, 2 ; przechodzimy na kolejny znak ; (dodajemy 2, bo w pamieci obok ; znaku stoi jego atrybut) mov al, r_g ; bedziemy rysowac gorny brzeg .rysuj_gore: cmp di, si ; dopoki DI < pozycja koncowa jae .koniec_gora mov [es:di], ax ; wyswietlamy ten znak add di, 2 ; przechodzimy na kolejny znak jmp short .rysuj_gore .koniec_gora: mov al, r_pg mov [es:di], ax ; rysujemy prawy gorny naroznik ; ---------------------------- .wnetrze: shr di, 1 add di, 80 ; kolejny wiersz sub di, dx ; poczatek wiersza push di mov di, bp ; SI = numer ostatniego wiersza mov si, bp shl di, 6 shl si, 4 add si, di ; SI := SI*80 = numer ostatniego ; wiersza * 80 pop di cmp di, si ; czy skonczylismy? je .koniec_wnetrze mov si, di add di, bx ; DI = pozycja poczatku add si, dx ; SI = pozycja konca shl di, 1 ; 2 bajty / element shl si, 1 mov al, r_l mov [es:di], ax ; rysujemy lewy brzeg add di, 2 mov al, spacja ; wnetrze okienka wypelniamy spacjami .rysuj_srodek: cmp di, si ; dopoki DI < pozycja koncowa jae .koniec_srodek mov [es:di], ax ; wyswietlamy znak add di, 2 ; przechodzimy na kolejny znak jmp short .rysuj_srodek .koniec_srodek: mov al, r_p mov [es:di], ax ; rysujemy prawy brzeg jmp short .wnetrze .koniec_wnetrze: ; ---------------------------- mov di, bp ; DI = wiersz prawego dolnego rogu mov si, bp shl di, 6 shl si, 4 add di, si ; DI = DI*80 mov si, di add di, bx ; DI = pozycja poczatku w ; ostatnim wierszu add si, dx ; SI=pozycja konca w ostatnim wierszu shl di, 1 ; 2 bajty / element shl si, 1 mov al, r_ld mov [es:di], ax ; rysujemy lewy dolny naroznik add di, 2 ; przechodzimy na kolejny znak mov al, r_d ; bedziemy rysowac dolny brzeg .rysuj_dol: cmp di, si ; dopoki DI < pozycja koncowa jae .koniec_dol mov [es:di], ax ; wyswietl ten znak add di, 2 ; przechodzimy na kolejny znak jmp short .rysuj_dol .koniec_dol: mov al, r_pd mov [es:di], ax ; rysujemy prawy dolny naroznik pop ax pop es pop si pop di ret