🚀 go-pugleaf

RetroBBS NetNews Server

Inspired by RockSolid Light RIP Retro Guy

Article View: pl.comp.lang.asm
Article #642

Re: Problem z przesunięciem ekranu

#642
From: Matuzalem
Date: Thu, 14 Sep 2006 14:43
230 lines
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-mail
References: <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