Article View: pl.comp.lang.asm
Article #642Re: Problem z przesunięciem ekranu
From: Matuzalem
Date: Thu, 14 Sep 2006 14:43
Date: Thu, 14 Sep 2006 14:43
230 lines
5287 bytes
5287 bytes
Johnny napisał(a): > Mam kolejny problem. Wszystko u mnie działa pięknie do momentu gdy > wskaźnik nie dojdzie do ostatniego wiersza i przedostatniej kolumny > wówczas wprowadzony znak nie zostaje wyświetlony, pojawia się on dopiero > wtedy gdy następuje przewinięcie okna. I tak się dzieje cały czas znak z > przedostatniej kolumny nie jest wyświetlany. Nie mam pojęcia dlaczego. > Podejrzewam, że może atrybut w pamięci dla tego obszaru jest "dziwny" > ale po pierwsze niby dlaczego po drugie nie potrafię go podejrzeć > (podgląd B800 w trybie debugowania CodeView pokazuje mi oczywiście > zawartość bieżącego okna). > > Poniżej zamieszczam kod programu. Może ktoś wie w czym rzecz. > > title 6_04 > .model small > .stack 100h > .386 > .code > ;--------------------------------------------- > ; main > ;--------------------------------------------- > main proc > mov ax,@data ; inicjalizacja ds > mov ds,ax > > mov ah,0h ; ustawienie trybu grafiki > mov al,1h > mov bh,0h > int 10h > > mov ah,3h ; odczytanie położenia wskaźnika > int 10h > > odczytaj: ; odczyt znaku > mov ah,10h > mov bh,0h > int 16h > > cmp ah,1h ; jeżeli wprowadzono ESC zakończ program > je exit > > cmp ah,2h ; jeżeli wprowadzono znak z zakresu 0-9 > jb odczytaj ; wyświetl go i przesuń wskaźnik > cmp ah,0Bh > ja odczytaj > > ;mov ah,0Ah ; wyświetl znak > ;mov bh,0h > ;mov cx,1h > ;int 10h > > mov ah,9h ; wyświetl znak > mov bh,0h > mov bl,7h > mov cx,1h > int 10h > > inc dl ; zwiększ wskaźnik kolumny > ;cmp dl,4Fh ; sprawdź czy to nie jest ostatnia kolumna > cmp dl,27h > ja next_row ; jeśli tak to przejdź do następnego wiersza > > mov ah,2h ; ustaw wskaźnik kolumnę dalej > int 10h > jmp odczytaj > > next_row: ; przejście do następnego wiersza > inc dh ; zwiększ wskaźnik wiersza > cmp dh,18h ; sprawdź czy to nie jest ostatni wiersz > ja scroll ; jeśli tak skocz do sekcji przewijania okna > > mov ah,2h ; ustaw wskaźnik w nowym wierszu > mov dl,0h > int 10h > > jmp odczytaj ; odczytaj kolejny znak > > scroll: ; przewiń okno > mov ah,6h > mov al,1h > xor cx,cx > ;mov dl,4Fh > mov dl,27h > mov dh,18h > mov bh,7h > int 10h > > mov ah,2h ; ustaw wskaźnik w nowym wierszu > mov bx,0h > mov dl,0h > mov dh,18h > int 10h > > jmp odczytaj ; odczytaj kolejny znak > > > exit: > mov ax,4C00h ; zakończenie procedury > int 21h > main endp > > .data > end main > > > -- > Johnny W wolnej chwili napisałem to co chcesz zrobić. ; ============================= title numberblock .model small .stack 100h .386 _TEXT segment start: ; tryb wideo mov ah, 0 mov al, 3 int 10h ; stronica mov ah, 5 mov al, 0 int 10h loop1: mov ah, 1 int 10h cmp al, 1bh ; esc je short exit call WriteChar call Scroll jmp short loop1 exit: mov ax, 4c00h int 21h WriteChar proc mov ah, 1 mov cx, 0607h int 10h mov ah, 10h int 16h ; wypisujemy tylko cyfry od 0 do 9 cmp al, '0' jb short loop1 cmp al, '9' ja short loop1 mov ah, 9 ; al jest już wypełnione xor bh, bh mov bl, 0000111b ; (000) - czarne tło, (0111) - białe litery mov cx, 1 int 10h ret WriteChar endp ; ----------------------- Scroll proc ; pobranie wskaźnika mov ah, 3 xor bh, bh int 10h ; ustawienie wskaźnika mov ah, 2 cmp dl, (4fh - 60) ; ilość znaków w wierszu ja short ch1 inc dl xor bx, bx int 10h ret ch1: inc dh cmp dh, 18h ja short ch2 xor dl, dl xor bx, bx int 10h ret ch2: mov dh, 18h xor dl, dl xor bx, bx int 10h ; przewinięcie okna mov ah, 6 mov al, 1 xor cx, cx mov dh, 18h mov dl, 4fh mov bh, 7 int 10h ret Scroll endp _TeXT ends end start ; ============================= Tobie zostawiam optymalizacje i poprawki (poprawki w sęsie przejżystości i złożoności kodu, bo działa bez problemów, przynajmniej mnie się nie udało ich znaleść :) ) Pozdrawiam
Technical Details
Message-ID:
<1158244982.390461.281100@m73g2000cwd.googlegroups.com>Path:
mbox-mo1.pugleaf.net!news-archive.icm.edu.pl!mat.uni.torun.pl!news.man.torun.pl!newsfeed.pionier.net.pl!news.glorb.com!postnews.google.com!m73g2000cwd.googlegroups.com!not-for-mailReferences:
<ee8g03$ia2$1@nemesis.news.tpi.pl> <eeb7nb$1r0$1@nemesis.news.tpi.pl>Show Full Headers
Complete Article Headers
Path: mbox-mo1.pugleaf.net!news-archive.icm.edu.pl!mat.uni.torun.pl!news.man.torun.pl!newsfeed.pionier.net.pl!news.glorb.com!postnews.google.com!m73g2000cwd.googlegroups.com!not-for-mail From: "Matuzalem" <codemaster_@op.pl> Newsgroups: pl.comp.lang.asm Subject: Re: Problem z przesunięciem ekranu Date: 14 Sep 2006 07:43:02 -0700 Organization: http://groups.google.com Lines: 236 Message-ID: <1158244982.390461.281100@m73g2000cwd.googlegroups.com> References: <ee8g03$ia2$1@nemesis.news.tpi.pl> <eeb7nb$1r0$1@nemesis.news.tpi.pl> NNTP-Posting-Host: 212.244.115.33 Mime-Version: 1.0 X-Trace: posting.google.com 1158244988 1381 127.0.0.1 (14 Sep 2006 14:43:08 GMT) X-Complaints-To: groups-abuse@google.com NNTP-Posting-Date: Thu, 14 Sep 2006 14:43:08 +0000 (UTC) User-Agent: G2/1.0 X-HTTP-UserAgent: Mozilla/5.0 (Windows; U; Windows NT 5.1; pl; rv:1.8.0.6) Gecko/20060728 Firefox/1.5.0.6,gzip(gfe),gzip(gfe) Complaints-To: groups-abuse@google.com Injection-Info: m73g2000cwd.googlegroups.com; posting-host=212.244.115.33; posting-account=HFFdEQ0AAACI08bdAnMScVqwVEj2ucOg Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit