🚀 go-pugleaf

RetroBBS NetNews Server

Inspired by RockSolid Light RIP Retro Guy

Thread View: pl.comp.lang.asm
36 messages
36 total messages Started by Johnny Wed, 13 Sep 2006 08:35
Problem z przesunięciem ekranu
#629
Author: Johnny
Date: Wed, 13 Sep 2006 08:35
94 lines
2211 bytes
Mam drobny problem z przesunięciem ekranu. Otóż sam efekt przesunięcia
tekstu o 1 wiersz potrafię osiągnąć lecz po tym zabiegu nie są widoczne
dalsze wpisywane znaki (0-9). Prawdopodobnie niewłaściwie ustawiam
położenie wskaźnika przy pomocy int 10h i ah=2h. Próbowałem z różnymi
ustawieniami dh (wiersze) ale bezskutecznie. Mógłby ktoś rzucić na to
okiem? Dzięki z góry.

title 6_04
.model small
.stack 100h
.386
.code
;---------------------------------------------
; main
;---------------------------------------------
main proc
mov ax,@data		; inicjalizacja ds
mov ds,ax

mov ah,0h		; tryb video
mov al,3h
int 10h

; odczytanie położenia wskaźnika
mov ah,3h
int 10h

; odczyt znaku
odczytaj:
mov ah,10h
int 16h

; jeżeli wprowadzono ESC zakończ program
cmp ah,1h
je exit

; jeżeli wprowadzono znak z zakresu 0-9
; wyświetl go i przesuń wskaźnik
cmp ah,2h
jb odczytaj

cmp ah,0Bh
ja odczytaj

mov ah,0Ah		; wyświetl znak
mov cx,1h
int 10h

inc dl
cmp dl,4Fh
ja next_row
mov ah,2h
int 10h
jmp odczytaj

next_row:
inc dh
cmp dh,18h
ja move

mov ah,2h
mov dl,0h
int 10h

jmp odczytaj

move:
mov ah,3h
int 10h

mov ah,6h
mov al,1h
xor cx,cx
mov dl,5h
int 10h

mov ah,2h
mov dl,0h
inc dh
inc dh
int 10h

jmp odczytaj

exit:
mov ax,4C00h		; zakończenie procedury
int 21h
main endp

.data
end main

-- 
Johnny
Re: Problem z przesunięciem ekranu
#633
Author: Bogdan (bogdro)
Date: Wed, 13 Sep 2006 09:53
42 lines
2069 bytes
Johnny napisał(a):
> Mam drobny problem z przesunięciem ekranu. Otóż sam efekt przesunięcia
> tekstu o 1 wiersz potrafię osiągnąć lecz po tym zabiegu nie są widoczne
> dalsze wpisywane znaki (0-9). Prawdopodobnie niewłaściwie ustawiam
> położenie wskaźnika przy pomocy int 10h i ah=2h. Próbowałem z różnymi
> ustawieniami dh (wiersze) ale bezskutecznie. Mógłby ktoś rzucić na to
> okiem? Dzięki z góry.

[...]

> next_row:
> inc dh
> cmp dh,18h
> ja move

[...]

> move:
> mov ah,3h
> int 10h
> 
> mov ah,6h
> mov al,1h
> xor cx,cx
> mov dl,5h
> int 10h
> 
> mov ah,2h
> mov dl,0h
> inc dh
> inc dh
> int 10h

Gdy wpadasz do "move:", DH >= 25. Po wykonaniu przewinięcia ekranu,
ustaw kursor w wierszu 24 (18h), zamiast dawać 2 razy INC. Tyle na
pierwszy rzut oka (bez patrzenia do RBIL). Możliwe, że coś pominąłem.

-- 
Pozdrawiam, Bogdan                                  (Linux i FreeDOS)
Kurs assemblera x86 (DOS i Linuks): http://rudy.mif.pg.gda.pl/~bogdro
Grupy dyskusyjne o asm:  pl.comp.lang.asm alt.pl.asm alt.pl.asm.win32
Prawdziwy, bezpieczny komunikator:                   www.JabberPL.org
Re: Problem z przesunięciem ekranu
#634
Author: Johnny
Date: Wed, 13 Sep 2006 10:23
11 lines
1376 bytes
> Gdy wpadasz do "move:", DH >= 25. Po wykonaniu przewinięcia ekranu,
> ustaw kursor w wierszu 24 (18h), zamiast dawać 2 razy INC. Tyle na
> pierwszy rzut oka (bez patrzenia do RBIL). Możliwe, że coś pominąłem.
> 

Dzięki ale tak jak pisałem próbowałem już różnych ustawień z dh w tym z
18h. Przy tej wartości wskaźnik co prawda się pojawia lecz wprowadzane
znaki już nie.

-- 
Johnny
Re: Problem z przesunięciem ekranu
#630
Author: Matuzalem
Date: Wed, 13 Sep 2006 10:47
84 lines
3919 bytes
Johnny napisał(a):
> Mam drobny problem z przesunięciem ekranu. Otóż sam efekt przesunięcia
> tekstu o 1 wiersz potrafię osiągnąć lecz po tym zabiegu nie są widoczne
> dalsze wpisywane znaki (0-9). Prawdopodobnie niewłaściwie ustawiam
> położenie wskaźnika przy pomocy int 10h i ah=2h. Próbowałem z różnymi
> ustawieniami dh (wiersze) ale bezskutecznie. Mógłby ktoś rzucić na to
> okiem? Dzięki z góry.
>
> 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 video
> mov al,3h              ; wybór trybu
> int 10h                  ; wywołanie BIOS

   mov ah, 5h            ; wybranie funkcji stronicy
   mov al, 0               ; wybranie stronicy
   int 10h                  ; wywołanie BIOS

> mov ah,3h             ; odczytanie położenia wskaźnika
   mov bh, 0              ; stronica
> int 10h                  ; wywołanie BIOS

   mov ah, 2              ; ustawienie położenia wskaźnika
   mov dh, 10            ; wiersz
   mov dl, 20             ; kolumna
   mov bh, 0              ; stronica
   int 10h                  ; wywołanie BIOS

; uzyskanie położenia wskaźnika
; CH - początkowy wiersz kursora
; CL - końcowy wiersz kursora
; DH - wiersz wskaźnika
; DL - kolumna wskaźnika

   mov ah, 3             ; uzyskanie położenia wskaźnika
   mov bh, 0             ; stronica
   int 10h                 ; wywołanie BIOS

; pobieranie danych

   mov cursor, cx     ; zapisanie wierszy wskaźnika
   mov cur_row, dh   ; zapisanie wiersza
   mov cur_col, dl     ; zapisanie kolumny

; ------------------ Przykład ----------------
; poniższy kod oczyszcza cały ekran poprzez przewinęcie
; go do góry (normalne atrybuty pustych wierszy)

   mov ah, 6            ; przewinięcie do góry
   mov al, 0             ; całe okno
   mov ch, 0            ; wiersz dla lewy-górny wierzchołek
   mov cl, 0             ; kolumna dla lewy-górny wierzchołek
   mov ah, 24          ; wiersz dla prawy-donly wierzchołek
   mov dl, 79           ; kolumna dla prawy-dolny wierzchołek
   mov bh, 7            ; normalny atrybut dla pustych wierszy
   int 10h                ; wywołanie BIOS

[...]

> exit:
> mov ax,4C00h		; zakończenie procedury
> int 21h                     ; wywołanie DOS
> main endp
>
> end main
; -----------------------------------------------------------

INT 10h: Screen -> http://www.bookcase.com/library/dos/ints/int10.html

Mam nadzieje, że gdzieś się nie machłem :P :]


Pozdrawiam
Re: Problem z przesunięciem ekranu
#635
Author: Bernard
Date: Wed, 13 Sep 2006 11:51
13 lines
1527 bytes
Johnny wrote:
> Mam drobny problem z przesunięciem ekranu. Otóż sam efekt przesunięcia
> tekstu o 1 wiersz potrafię osiągnąć lecz po tym zabiegu nie są widoczne
> dalsze wpisywane znaki (0-9). Prawdopodobnie niewłaściwie ustawiam
> położenie wskaźnika przy pomocy int 10h i ah=2h. Próbowałem z różnymi
> ustawieniami dh (wiersze) ale bezskutecznie. Mógłby ktoś rzucić na to
> okiem? Dzięki z góry.

Masz problem z czytaniem dokumentacji. Wywołujesz funkcje nie podając 
wartości parametrów, które w tej sytuacji są dość losowe, bo nie 
wiadomo, co siedziało w rejestrze przed wywołaniem. Zwróć uwagę na 
podanie WSZYSTKICH argumentów, w tym rejestró2 bl i bh dla funkcji 
pisania znaków
Re: Problem z przesunięciem ekranu
#636
Author: Johnny
Date: Wed, 13 Sep 2006 12:29
12 lines
1431 bytes
> Masz problem z czytaniem dokumentacji. Wywołujesz funkcje nie podając
> wartości parametrów, które w tej sytuacji są dość losowe, bo nie
> wiadomo, co siedziało w rejestrze przed wywołaniem. Zwróć uwagę na
> podanie WSZYSTKICH argumentów, w tym rejestró2 bl i bh dla funkcji
> pisania znaków

Sądziłem, że taka jest praktyka by nie podawać argumentów, których
wartość znajduje się w rejestrach, stąd nagminne opuszczanie ustawień
stronicy itp.

-- 
Johnny
Re: Problem z przesunięciem ekranu
#631
Author: Johnny
Date: Wed, 13 Sep 2006 12:31
15 lines
1492 bytes
Matuzalem napisał(a):
>    mov ah, 2              ; ustawienie położenia wskaźnika
>    mov dh, 10            ; wiersz
>    mov dl, 20             ; kolumna
>    mov bh, 0              ; stronica
>    int 10h                  ; wywołanie BIOS

Dlaczego mam ustawiać tu wskaźnik skoro tego nie chcę?

Dzięki za przykład z oczyszczaniem całego ekranu ale go znam. Mój
problem dotyczy dokładnie tego co opisałem w pierwszym e-mailu oraz w
odpowiedzi do Bogdana.

-- 
Johnny
Re: Problem z przesunięciem ekranu
#632
Author: Matuzalem
Date: Wed, 13 Sep 2006 13:43
80 lines
4092 bytes
Johnny napisał(a):
> Matuzalem napisał(a):
> >    mov ah, 2              ; ustawienie położenia wskaźnika
> >    mov dh, 10            ; wiersz
> >    mov dl, 20             ; kolumna
> >    mov bh, 0              ; stronica
> >    int 10h                  ; wywołanie BIOS
>
> Dlaczego mam ustawiać tu wskaźnik skoro tego nie chcę?

Bo miałeś problem z jego ustawieniem, podałem to jako przykład :]

Bernard napisał(a):
> Masz problem z czytaniem dokumentacji. Wywołujesz funkcje nie podając
> wartości parametrów, które w tej sytuacji są dość losowe, bo nie
> wiadomo, co siedziało w rejestrze przed wywołaniem. Zwróć uwagę na
> podanie WSZYSTKICH argumentów, w tym rejestró2 bl i bh dla funkcji
> pisania znaków

a Ty na to:

Johnny napisał(a):
> Sądziłem, że taka jest praktyka by nie podawać argumentów, których
> wartość znajduje się w rejestrach, stąd nagminne opuszczanie ustawień
> stronicy itp.

Bernard ma racje, w przykładowych kodach które Ci podałem,
pozjadałeś dość istotne dane których nie iniciowałeś, choćby
stronice np.:

mov ah,3h
int 10h

W dokumentcji jest wspomniane o bh, a u Ciebie, gdzie ono jest ?
(http://www.bookcase.com/library/dos/ints/int10.html#03)
Co jeśli w bh znajdzie się coś "nie oczekiwanego"? mogą powstać
komplikacje, pomyśl o tym jak o "ostateczności", czemu?
W tym w/w przykładzie to jeszcze pewnie nic strasznego by się nie
stało (nie sprawdzałem, może z ciekawości to zrobie :P ) ale co by
było gdyby to były funkcje obsługujące np. dysk i zapomniałbyś
zainicjować jakąś zmienną i zostawił ją taką jaka jest?
mógłyś pożegnać się z danymi w najgorszym wypadku z dyskiem (to
już nie są żarty :P )

asm, to nie HLL, gdzie domyślne argumenty "same się" uzupełnią jak
np tu:

int Fun(int arg = 0);

int main()
{
 Fun();
 return 0;
}

Gdybyś skompilował to i zdeasemblował, zobaczyłbyś coś takiego
(mniej więcej i pod warunkiem, że kompilator nie zastosuje konwencji
wywołań przez rejestr [Register]):

 push 0            ; widzisz, nawet jeśi w C/C++ jest
                       ; domyślny zero to i tak musi zostać
odłożony na stos
 call 00401012  ; jakiś tam adres


Pojęcie "domyślny argument" w języku asm jest abstrakcyjne, nie ma
czegoś takiego (przynajmniej w tym konekście).
asm to język niskiego poziomu (wręcz kod maszynowy) to bardzo prosty
i logiczny język, dla tego nie należy interpretować go tak jak HLL.

Johnny napisał(a):
> Dzięki za przykład z oczyszczaniem całego ekranu ale go znam. Mój
> problem dotyczy dokładnie tego co opisałem w pierwszym e-mailu oraz w
> odpowiedzi do Bogdana.

Może napisz słownie co chcesz osiągnąć...


Pozdrawiam
Re: Problem z przesunięciem ekranu
#637
Author: Bernard
Date: Wed, 13 Sep 2006 18:20
15 lines
1652 bytes
Johnny wrote:
>> Masz problem z czytaniem dokumentacji. Wywołujesz funkcje nie podając
>> wartości parametrów, które w tej sytuacji są dość losowe, bo nie
>> wiadomo, co siedziało w rejestrze przed wywołaniem. Zwróć uwagę na
>> podanie WSZYSTKICH argumentów, w tym rejestró2 bl i bh dla funkcji
>> pisania znaków
> 
> Sądziłem, że taka jest praktyka by nie podawać argumentów, których
> wartość znajduje się w rejestrach, stąd nagminne opuszczanie ustawień
> stronicy itp.

A skąd pomysł, że się znajduje? Kto niby miał wstawić te wartości? Jeśli 
raz wstawiliśmy, a z opisu funkcji wynika, że zostały, to ok, ale jeśli 
nic nie wstawiliśmy, to np. możemy pisać czarno na czarnym, bo nie 
ustawiliśmy koloru znaku, a w rejestrze było 0.
Re: Problem z przesunięciem ekranu
#638
Author: Johnny
Date: Thu, 14 Sep 2006 08:13
13 lines
1605 bytes
Dzięki wszystkim za pomoc. Namierzyłem przyczynę błędu i zgodnie z tym
co pisał Bernard zemściło się nie podawanie niektórych parametrów: nie
podałem atrybutu w sekcji przewijania okna, stąd BH był zerowy...

Ale wracając do tego fragmentu. Czy mając pewność, że dany rejestr ma
określoną wartość należy mu przypisać ponownie wartość czy nie? Załóżmy,
że po sobie następuje odczyt położenia ah,3h i ustawienie położenia
wskaźnika ah,2h. W sekcji odczytu ustawiłem stronicę bh,0h czy w sekcji
ustawienia powtórzyć linię mov bh,0h skoro wiem, że tam jest na pewno
zero? Przecież to jest nadmiarowa instrukcja w tym wypadku.

-- 
Johnny
Re: Problem z przesunięciem ekranu
#639
Author: Bogdan (bogdro)
Date: Thu, 14 Sep 2006 08:28
27 lines
2182 bytes
Johnny napisał(a):
> Dzięki wszystkim za pomoc. Namierzyłem przyczynę błędu i zgodnie z tym
> co pisał Bernard zemściło się nie podawanie niektórych parametrów: nie
> podałem atrybutu w sekcji przewijania okna, stąd BH był zerowy...
> 
> Ale wracając do tego fragmentu. Czy mając pewność, że dany rejestr ma
> określoną wartość należy mu przypisać ponownie wartość czy nie? Załóżmy,
> że po sobie następuje odczyt położenia ah,3h i ustawienie położenia
> wskaźnika ah,2h. W sekcji odczytu ustawiłem stronicę bh,0h czy w sekcji
> ustawienia powtórzyć linię mov bh,0h skoro wiem, że tam jest na pewno
> zero? Przecież to jest nadmiarowa instrukcja w tym wypadku.

 Jeśli RBIL (a najlepiej też debuger) mówi, że dany rejestr nie jest
modyfikowany przez dane przerwanie, można nie powtarzać instrukcji, np.

 mov ah,0eh
 mov al,'A'
 int 10h
 mov al,'B'
 int 10h	; AH=0eh


-- 
Pozdrawiam, Bogdan                                  (Linux i FreeDOS)
Kurs assemblera x86 (DOS i Linuks): http://rudy.mif.pg.gda.pl/~bogdro
Grupy dyskusyjne o asm:  pl.comp.lang.asm alt.pl.asm alt.pl.asm.win32
Prawdziwy, bezpieczny komunikator:                   www.JabberPL.org
Re: Problem z przesunięciem ekranu
#641
Author: Johnny
Date: Thu, 14 Sep 2006 09:32
106 lines
3271 bytes
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
Re: Problem z przesunięciem ekranu
#640
Author: Matuzalem
Date: Thu, 14 Sep 2006 10:20
33 lines
2768 bytes
Bogdan (bogdro) napisał(a):
> Johnny napisał(a):
> > Dzięki wszystkim za pomoc. Namierzyłem przyczynę błędu i zgodnie z tym
> > co pisał Bernard zemściło się nie podawanie niektórych parametrów: nie
> > podałem atrybutu w sekcji przewijania okna, stąd BH był zerowy...
> >
> > Ale wracając do tego fragmentu. Czy mając pewność, że dany rejestr ma
> > określoną wartość należy mu przypisać ponownie wartość czy nie? Załóżmy,
> > że po sobie następuje odczyt położenia ah,3h i ustawienie położenia
> > wskaźnika ah,2h. W sekcji odczytu ustawiłem stronicę bh,0h czy w sekcji
> > ustawienia powtórzyć linię mov bh,0h skoro wiem, że tam jest na pewno
> > zero? Przecież to jest nadmiarowa instrukcja w tym wypadku.
>
>  Jeśli RBIL (a najlepiej też debuger) mówi, że dany rejestr nie jest
> modyfikowany przez dane przerwanie, można nie powtarzać instrukcji, np.
>
>  mov ah,0eh
>  mov al,'A'
>  int 10h
>  mov al,'B'
>  int 10h	; AH=0eh


Tak zgadza się, jednak z wielu powodów lepiej jest powtórzyć
choćby wiersz niżej tą samą instrukcje (np. dla tego, że: kod jest
przejżystrzy, czasem nie można mieć 100% pewności czy nie zostanie
zmieniony, jakiś błąd może spowodować zmiane)
Co prawda do w/w przykładu przez Bogdana raczej się nie trzeba tego
trzymać, ale ja i tak bym powtózył te ah :] może i kod byłby
większy o te pięć bajtów, ale za to pewny i przejrzysty.

Pozdrawiam
Re: Problem z przesunięciem ekranu
#642
Author: 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
Re: Problem z przesunięciem ekranu
#643
Author: Matuzalem
Date: Thu, 14 Sep 2006 15:31
174 lines
3781 bytes
Matuzalem napisał(a):
> 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ść :)  )

A to troche bardziej zoptymalizowana wersja procedury 'Scrool' :)  :

; -------------------------------------------------------
Scroll proc

	; pobranie wskaźnika
	mov ah, 3
	xor bx, bx
	int 10h

	; ustawienie wskaźnika
	mov ah, 2

	cmp dl, (4fh - 60) ; ilość znaków w wierszu
	ja short ch1

	inc dl
	int 10h
	ret

	ch1:
	inc dh
	xor dl, dl

	cmp dh, 18h
	ja short ch2

	int 10h
	ret

	ch2:

	mov dh, 18h
	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
; -------------------------------------------------------

Miłej zabawy ;]

Pozdrawiam
Re: Problem z przesunięciem ekranu
#644
Author: Matuzalem
Date: Thu, 14 Sep 2006 15:31
174 lines
3806 bytes
Matuzalem napisał(a):
> 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ść :)  )

A to troche bardziej zoptymalizowana wersja procedury 'Scrool' :)  :

; -------------------------------------------------------
Scroll proc

	; pobranie wskaźnika
	mov ah, 3
	xor bx, bx
	int 10h

	; ustawienie wskaźnika
	mov ah, 2

	cmp dl, (4fh - 60) ; ilość znaków w wierszu
	ja short ch1

	inc dl
	int 10h
	ret

	ch1:
	inc dh
	xor dl, dl

	cmp dh, 18h
	ja short ch2

	int 10h
	ret

	ch2:

	mov dh, 18h
	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
; -------------------------------------------------------

Miłej zabawy ;]

Pozdrawiam
Re: Problem z przesunięciem ekranu
#645
Author: Johnny
Date: Fri, 15 Sep 2006 06:18
7 lines
1375 bytes
Dzięki za przesłany program. To co piszę to zwykłe ćwiczenie z książki
więc równie ważne dla mnie jest zrozumienie przyczyny znikania w mojej
wersji znaku w przedostatniej kolumnie ostatniego wiersza. Czy moja
wersja zachowuje się tak samo na Twoim komputerze?

-- 
Johnny
Re: Problem z przesunięciem ekranu
#646
Author: Matuzalem
Date: Fri, 15 Sep 2006 10:05
25 lines
2486 bytes
Johnny napisał(a):
> Dzięki za przesłany program. To co piszę to zwykłe ćwiczenie z książki
> więc równie ważne dla mnie jest zrozumienie przyczyny znikania w mojej
> wersji znaku w przedostatniej kolumnie ostatniego wiersza. Czy moja
> wersja zachowuje się tak samo na Twoim komputerze?

Tak, a to jest powód:

> odczytaj:               ; odczyt znaku
> mov ah,10h
> int 16h

Ta funkcja czeka na naciśnięcie znaku, a potem jego wyświetlenie.
Zauważ, że w moim  przykładzie, jest funkcja mov ah, 1/int 10h
która wykonuje to samo, tyl, że nie czeka na wypełnienie bufora i
działa w pętli, więc nic nie "blokuje" programu.
mov ah, 10h blokuje program w tym miejscu, ponieważ wskaźnik zmienia
położenie, a bufor jeszcze nie jest pełny - bądź program w
związku z przesunięciem gdzieś "gubi" naciśnięcie klawisza przez
jakiś skok - i dlatego dopiero gdy wskaźnik zostanie ustawiony na
nowej pozycji sygnał naciśnięcia dociera do bufora i znak zostaje
wpisany.

Pozdrawiam
Re: Problem z przesunięciem ekranu
#647
Author: Matuzalem
Date: Fri, 15 Sep 2006 10:20
44 lines
3000 bytes
Matuzalem napisał(a):
> Johnny napisał(a):
> > Dzięki za przesłany program. To co piszę to zwykłe ćwiczenie z książki
> > więc równie ważne dla mnie jest zrozumienie przyczyny znikania w mojej
> > wersji znaku w przedostatniej kolumnie ostatniego wiersza. Czy moja
> > wersja zachowuje się tak samo na Twoim komputerze?
>
> Tak, a to jest powód:
>
> > odczytaj:               ; odczyt znaku
> > mov ah,10h
> > int 16h
>
> Ta funkcja czeka na naciśnięcie znaku, a potem jego wyświetlenie.
> Zauważ, że w moim  przykładzie, jest funkcja mov ah, 1/int 10h
> która wykonuje to samo, tyl, że nie czeka na wypełnienie bufora i
> działa w pętli, więc nic nie "blokuje" programu.
> mov ah, 10h blokuje program w tym miejscu, ponieważ wskaźnik zmienia
> położenie, a bufor jeszcze nie jest pełny - bądź program w
> związku z przesunięciem gdzieś "gubi" naciśnięcie klawisza przez
> jakiś skok - i dlatego dopiero gdy wskaźnik zostanie ustawiony na
> nowej pozycji sygnał naciśnięcia dociera do bufora i znak zostaje
> wpisany.

"sygnał naciśnięcia dociera" - ściślej: zostaje wykonany z
kolejki.

Tak mi jeszcze do głowy przyszło.. :P

Skoro uczysz się asm, sprubuj samemu zanalizować program który
stworzyłeś, będzie to niezła zabawa i dokładnie dowiesz się "dla
czego...".
Nie zapomnij dodać informacji debugowych.
Korzystasz z TASM, więc tak to będzie:

tasm /l/n/zi program.asm
tlink /3/m/v program.obj
td program.exe

'td' to Turbo Debugger.


Pozdrawiam
Re: Problem z przesunięciem ekranu
#648
Author: Johnny
Date: Fri, 15 Sep 2006 13:26
12 lines
1815 bytes
>> Ta funkcja czeka na naciśnięcie znaku, a potem jego wyświetlenie.
>> Zauważ, że w moim  przykładzie, jest funkcja mov ah, 1/int 10h

Czegoś tu nie rozumiem. Funkcja 1h przerwania 10h to ustawienie wierszy
wskaźnika, chyba, że chodziło Ci o przerwanie 16h ale to też się kupy
nie trzyma bo 1h jest sprawdzeniem buforu klawiatury dla starszych typów
klawiatur a odpowiednikiem mojej 10h jest 00h również jako alternatywa
dla starszych klawiatur. Czy podany przykład sprawdziłeś czy to była
tylko teoria?

-- 
Johnny
Re: Problem z przesunięciem ekranu
#649
Author: Matuzalem
Date: Fri, 15 Sep 2006 13:55
33 lines
2616 bytes
Johnny napisał(a):
> >> Ta funkcja czeka na naciśnięcie znaku, a potem jego wyświetlenie.
> >> Zauważ, że w moim  przykładzie, jest funkcja mov ah, 1/int 10h
>
> Czegoś tu nie rozumiem. Funkcja 1h przerwania 10h to ustawienie wierszy
> wskaźnika, chyba, że chodziło Ci o przerwanie 16h ale to też się kupy
> nie trzyma bo 1h jest sprawdzeniem buforu klawiatury dla starszych typów
> klawiatur a odpowiednikiem mojej 10h jest 00h również jako alternatywa
> dla starszych klawiatur. Czy podany przykład sprawdziłeś czy to była
> tylko teoria?

sorry jak się robi dwie rzeczy na raz to tak jest :P
Ten przykład co Ci napisałem działa, ale znalazłem błąd:

        loop1:

                mov ah, 1
                int 10h

ma być:

        loop1:

                mov ah, 10h
                int 16h

Tak 1/11 jest dla starszych klawiatur, ale zwróć uwage na ZF w opisie
tych dwuch funkcji.
Po prostu tak jak pisałem kolejka zanim się wypełni, jest wykonany
skok i dla tego dopiero znak jest wypisany po przesunięciu wskaźnika.

Pozdrawiam
Re: Problem z przesunięciem ekranu
#650
Author: Matuzalem
Date: Fri, 15 Sep 2006 14:09
41 lines
2624 bytes
Jeszcze tak przy okazji... :]

Po co iniciujesz _DATA:

mov ax,@data            ; inicjalizacja ds
mov ds,ax

Nie używasz tego segmentu (przynajmniej ja nigdzie tego nie
zaobserwowałem :) ) to go nie iniciuj.
Twój kod jest okropnie chaotyczny, co sprawia, że jest trudny do
odczytu dla człowieka i procesora :).
Wiem, że uczysz się, ale postaraj się najpierw przemyśleć to co
chcesz napisać, potem poukładać to w taki sposób, aby jednak
skoków (czy wywołań) było w miare mało - albo, przynajmniej, aby
skoki nie były dalekie i nie rozmieszczone chaotycznie.
Staraj się rónież używać optymalniejszych rozwiązań np.

mov ah, 0

itd.

lepiej zastąpić  xor ah, ah (na pewno wiesz czemu)
Pisze o tym bo np. (twój kod):

mov ah,2h
mov dl,0h ; lepiej użyć xor dl, dl
int 10h

a za chwile:

mov ah,6h
mov al,1h
xor cx,cx ; tu już urzyłeś xor
mov dl,5h
int 10h

W/w przykład dowodzi, że jeszcze piszesz chaotycznie (co tam dobrze
jest czepiam się :P )

Pozdrawiam
Re: Problem z przesunięciem ekranu
#651
Author: Johnny
Date: Mon, 18 Sep 2006 08:09
20 lines
2095 bytes
> ma być:
> 
>         loop1:
> 
>                 mov ah, 10h
>                 int 16h
> 

Aleś zakręcił. Tak właśnie wygląda moja funkcja odczytująca znak przed
Twoimi poprawkami. No może bez tego loop1. Poza tym mam wątpliwości co
do Twojej diagnozy. Gdyby tak było to znaki znikałyby losowo a
przynajmniej w wielu miejscach. Tymczasem efekt "nie wyświetlenia" znaku
występuje tylko w ostatnim wierszu i w przedostatniej kolumnie. Co
więcej znak zostaje wczytany do pamięci ekranu ponieważ przesunięcie
ekranu o wiersz skutkuje pojawieniem się tegoż. Może atrybut znaku w
ostatnim wierszu i przedostatniej kolumnie jest "inny". Tylko jak to
podejrzeć? W trybie debuggera pamięci ekranu znajduje się okno debuggera....

-- 
Johnny
Re: Problem z przesunięciem ekranu
#652
Author: Matuzalem
Date: Mon, 18 Sep 2006 17:37
57 lines
3420 bytes
Johnny napisał(a):
> > ma być:
> >
> >         loop1:
> >
> >                 mov ah, 10h
> >                 int 16h
> >
>
> Aleś zakręcił.

Troszeczke ... :]

> Tak właśnie wygląda moja funkcja odczytująca znak przed
> Twoimi poprawkami. No może bez tego loop1.

No nie do końca, choćby dla tego, że wszystkie potrzebne parametry
są przekazywane do funkcji, jest mniej "niepotrzebnych"
skoków/wywołań, no i jest w miare bardziej czytelna :]

> Poza tym mam wątpliwości co do Twojej diagnozy.

Nie debugowałem twojego programu, ja tylko przypuszczam,
debugowanie/analize/optymalizacje zostawiam Tobie...

> Gdyby tak było to znaki znikałyby losowo a przynajmniej w wielu miejscach.

No i właśnie, że nie jest to losowe, oznacza to iż prawdopodobnie
właśnie tak się dzieje jak pisałem (jeszcze trzeba wziąść pod
uwage, że może gdzieć "zjadłeś" wymagany parametr, lub ekran jest
najpierw "przesunięty", a potem znak jest nadpisywany w pamięci)

> Tymczasem efekt "nie wyświetlenia" znaku występuje tylko w ostatnim
>  wierszu i w przedostatniej kolumnie.

Jeśli występuje jakaś powtarzająca się zależność i za każdym
razem app reaguje tak samo, to oznacza, że błąd musi znajdować się
w implementacji.

> Co więcej znak zostaje wczytany do pamięci ekranu ponieważ przesunięcie ekranu
> o wiersz skutkuje pojawieniem się tegoż.

Bo prawdopodobnie najpierw znak jest wczytany, a potem następuje
przesunięcie (czyli tak jak pisałem: kolejka...)

> Może atrybut znaku w ostatnim wierszu i przedostatniej kolumnie jest "inny".

Jeśli gdzieś "zjadłeś" wymagany parametr funkcji, również może
tak być.

> Tylko jak to podejrzeć? 

Za pomocą debugera... :]


Pozdrawiam
Re: Problem z przesunięciem ekranu
#653
Author: Johnny
Date: Wed, 20 Sep 2006 08:31
94 lines
3071 bytes
No więc poddaję się. Próbuję przewalczyć "błąd przedostatniej i
ostatniej kolumny" ale bez pozytywnych rezultatów. Poniżej zamieszczam
uproszczoną wersję bez przesuwania ekranu. Nie korzystam już z funkcji
10h przerwania 16h lecz 8h - 21h ale to niewiele zmieniło.

Czy ktoś potrafi wskazać gdzie leży błąd lub przerobić to na działającą
wersję z wykorzystaniem tych samych funkcji?

Kolega Matuzalem bardzo się starał i za to mu dziękuję. Jednak teorii
podanej w jego odpowiedziach nie udało mi się przełożyć na praktykę.

title ekran
.model small
.stack 100h
.386
.code
;---------------------------------------------
; main
;---------------------------------------------
main proc
mov ax,@data		; inicjalizacja ds
mov ds,ax

xor ah,ah		; minimalny tryb wideo
mov al,1h
int 10h

mov ah,0fh		; odczyt liczby kolumn
int 10h
dec ah			; l kolumn - 1 bo indeks zaczyna się od zera
mov lcol,ah

mov cx,040ah		; licznik

odczyt:
mov ah,8h
int 21h

cmp al,1bh		; czy ESC
je exit

mov ah,0ah		; zapis znaku
xor bh,bh
push cx
mov cx,1h
int 10h
pop cx

call przesun

loop odczyt

exit:
mov ax,4C00h		; zakończenie procedury
int 21h
main endp


;---------------------------------------------
; przesun
;---------------------------------------------
przesun proc
pusha		; wszystko na stos

mov ah,3h	; odczytaj położenie wskaźnika
xor bh,bh
int 10h

mov ah,2h	; przesuń wskaźnik
xor bh,bh
cmp dl,lcol
je nwiersz
inc dl
jmp exec

nwiersz:
mov dl,0h
inc dh

exec:
int 10h

popa
ret

przesun endp

.data
lcol db ?
end main


-- 
Johnny
Re: Problem z przesunięciem ekranu
#654
Author: Bernard
Date: Wed, 20 Sep 2006 10:33
100 lines
3334 bytes
Johnny wrote:
> No więc poddaję się. Próbuję przewalczyć "błąd przedostatniej i
> ostatniej kolumny" ale bez pozytywnych rezultatów. Poniżej zamieszczam
> uproszczoną wersję bez przesuwania ekranu. Nie korzystam już z funkcji
> 10h przerwania 16h lecz 8h - 21h ale to niewiele zmieniło.
> 
> Czy ktoś potrafi wskazać gdzie leży błąd lub przerobić to na działającą
> wersję z wykorzystaniem tych samych funkcji?
> Kolega Matuzalem bardzo się starał i za to mu dziękuję. Jednak teorii
> podanej w jego odpowiedziach nie udało mi się przełożyć na praktykę.
> title ekran
> .model small
> .stack 100h
> .386
> .code
> ;---------------------------------------------
> ; main
> ;---------------------------------------------
> main proc
> mov ax,@data		; inicjalizacja ds
> mov ds,ax
> 
> xor ah,ah		; minimalny tryb wideo

40 kolumn? O to Ci chodziło?

> mov al,1h
> int 10h
> 
> mov ah,0fh		; odczyt liczby kolumn
> int 10h
> dec ah			; l kolumn - 1 bo indeks zaczyna się od zera
> mov lcol,ah
> 
> mov cx,040ah		; licznik

Będziemy powtarzali pętlę 1034 razy?

> odczyt:
> mov ah,8h
> int 21h

Ciekawe czy wartość CX przeżyje to wywołanie...

> cmp al,1bh		; czy ESC
> je exit
> 
> mov ah,0ah		; zapis znaku
> xor bh,bh
> push cx
> mov cx,1h
> int 10h
> pop cx
> 
> call przesun
> 
> loop odczyt
> 
> exit:
> mov ax,4C00h		; zakończenie procedury
> int 21h
> main endp
> 
> 
> ;---------------------------------------------
> ; przesun
> ;---------------------------------------------
> przesun proc
> pusha		; wszystko na stos
> 
> mov ah,3h	; odczytaj położenie wskaźnika
> xor bh,bh
> int 10h
> 
> mov ah,2h	; przesuń wskaźnik
> xor bh,bh
> cmp dl,lcol
> je nwiersz
> inc dl
> jmp exec
> 
> nwiersz:
> mov dl,0h
> inc dh

I przesuwamy do nieistniejącego wiersza ekranu...

> exec:
> int 10h
> 
> popa
> ret
> 
> przesun endp
> 
> .data
> lcol db ?
> end main
> 
> 
Re: Problem z przesunięciem ekranu
#655
Author: Johnny
Date: Wed, 20 Sep 2006 12:15
30 lines
2198 bytes
Bernard napisał(a):
>> xor ah,ah        ; minimalny tryb wideo
> 
> 40 kolumn? O to Ci chodziło?

Tryb 1 to raczej 28 kolumn. Ale to nie jest istotne.

>> mov cx,040ah        ; licznik
> 
> Będziemy powtarzali pętlę 1034 razy?

Tak. Mniej więcej tyle trzeba aby zapełnić ten ekran. To jest wersja
robocza na potrzeby wyłapania przyczyny błędu, więc proponuję nie
czepiać się takich rzeczy.
> 
>> odczyt:
>> mov ah,8h
>> int 21h
> 
> Ciekawe czy wartość CX przeżyje to wywołanie...
Przeżyje.

> I przesuwamy do nieistniejącego wiersza ekranu...
Patrz wyżej. Nie bawiłem się w przesuwanie ekranu. Chcę wyłapać
przyczynę błędu.

Problem nadal aktualny...

-- 
Johnny
Re: Problem z przesunięciem ekranu
#656
Author: Matuzalem
Date: Wed, 20 Sep 2006 15:50
69 lines
3987 bytes
Johnny napisał(a):
> Bernard napisał(a):
> >> xor ah,ah        ; minimalny tryb wideo
> >
> > 40 kolumn? O to Ci chodziło?
>
> Tryb 1 to raczej 28 kolumn. Ale to nie jest istotne.
>
> >> mov cx,040ah        ; licznik
> >
> > Będziemy powtarzali pętlę 1034 razy?
>
> Tak. Mniej więcej tyle trzeba aby zapełnić ten ekran. To jest wersja
> robocza na potrzeby wyłapania przyczyny błędu, więc proponuję nie
> czepiać się takich rzeczy.
> >
> >> odczyt:
> >> mov ah,8h
> >> int 21h
> >
> > Ciekawe czy wartość CX przeżyje to wywołanie...
> Przeżyje.
>
> > I przesuwamy do nieistniejącego wiersza ekranu...
> Patrz wyżej. Nie bawiłem się w przesuwanie ekranu. Chcę wyłapać
> przyczynę błędu.
>
> Problem nadal aktualny...
>
> --
> Johnny

Johnny, Johnny, Johnny ... :)

Napisałem Ci gotową wersje programu, który robi to co chcesz...
Teraz wystarczy porównać to co Ci napisałem z twoim kodem, i
wyszukać różnic, ewentualnie błędów.
Jeśli kompilowałeś mój kod, to zauważyłeś, że w nim tego
problem nie ma, czyli popełniasz gdzieś błąd, jednak to do Ciebie
należy znalezienie go - po pierwsze: życie nie jest łatwe, jeśli
sami coś "popsujemy", sami musimy to "naprawić"; po drugie: dla
Ciebie będzie lepiej, jak sam znajdziesz ten błąd, bo przy okazji
dowiesz się więcej.

Johnny napisał(a):
> No więc poddaję się.

Nigdy się nie poddawaj, to byłby największy błąd.

> Próbuję przewalczyć "błąd przedostatniej i ostatniej kolumny"
> ale bez pozytywnych rezultatów. Poniżej zamieszczam
> uproszczoną wersję bez przesuwania ekranu. Nie korzystam już z funkcji
> 10h przerwania 16h lecz 8h - 21h ale to niewiele zmieniło.

Problem nie tkwi w funkcjach które używasz, ale w implementacji
kodu...

> Czy ktoś potrafi wskazać gdzie leży błąd lub przerobić to na działającą
> wersję z wykorzystaniem tych samych funkcji?

Ja Ci już podałem... :)

> Kolega Matuzalem bardzo się starał i za to mu dziękuję. Jednak teorii
> podanej w jego odpowiedziach nie udało mi się przełożyć na praktykę.

Bo widać nie starałeś się za bardzo... :P

Pozdrawiam
Re: Problem z przesunięciem ekranu
#657
Author: Johnny
Date: Thu, 21 Sep 2006 07:38
112 lines
3429 bytes
Po pierwsze to palnąłem z odpowiedzią o 28 kolumnach. Oczywiście Bernard
ma rację chodzi o 40 kolumn czyli... 28h ;-)

Po drugie: Matuzalem, Matuzalem, Matuzalem

Twój program działa dokładnie w taki sam sposób jak mój (przynajmniej u
mnie) czyli gubi znak w przedostatniej kolumnie ostatniego wiersza.
Poniżej zamieszczam Twoją procedurę z małymi zmianami, tj. ustawienie
"małego" trybu video no i pętla do odczytu znaków z wywołaniem Twojej
procedury. W Twojej procedurze zmieniłem jedynie wiersz

cmp dl, (4fh - 60) ; ilość znaków w wierszu

na

cmp dl,26h

Doceniam Twoją pomoc. Próbuję samemu dojść przyczyny takiego zachowania.
Ale po kilku dniach takich poszukiwań i po wykonaniu wielu prób warto
zapytać innych, prawda?

-- 
Johnny

title ekran
.model small
.stack 100h
.386
.code
;---------------------------------------------
; main
;---------------------------------------------
main proc
mov ax,@data		; inicjalizacja ds
mov ds,ax

xor ah,ah		; minimalny tryb wideo
mov al,1h
int 10h


odczyt:
mov ah,8h
int 21h

cmp al,1bh		; czy ESC
je exit

mov ah,0ah		; zapis znaku
xor bh,bh
mov cx,1h
int 10h

call Scroll

loop odczyt

exit:
mov ax,4C00h		; zakończenie procedury
int 21h
main endp


;---------------------------------------------
; Scroll
;---------------------------------------------
Scroll proc

	; pobranie wskaźnika
	mov ah, 3
	xor bx, bx
	int 10h

	; ustawienie wskaźnika
	mov ah, 2

	;cmp dl, (4fh - 60) ; ilość znaków w wierszu
	cmp dl,26h
	ja short ch1

	inc dl
	int 10h
	ret

	ch1:
	inc dh
	xor dl, dl

	cmp dh, 18h
	ja short ch2

	int 10h
	ret

	ch2:

	mov dh, 18h
	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

end main
Re: Problem z przesunięciem ekranu
#667
Author: Johnny
Date: Thu, 21 Sep 2006 09:33
43 lines
2346 bytes
Zrobiłem jeszcze jedną rzecz (kod niżej). Skorzystałem z funkcji 0eh dla
int 10h, która "sama" przesuwa znak. I efekt mam ten sam. Więc może to
jest kwestia jakichś moich ustawień dla okna DOS-owego.

-- 
Johnny

title ekran
.model small
.stack 100h
.386
.code
;---------------------------------------------
; main
;---------------------------------------------
main proc
mov ax,@data		; inicjalizacja ds
mov ds,ax

xor ah,ah		; minimalny tryb wideo
mov al,1h
int 10h

odczyt:
mov ah,8h
int 21h

cmp al,1bh		; czy ESC
je exit

mov ah,0eh		; zapis znaku
xor bh,bh
int 10h

jmp odczyt

exit:
mov ax,4C00h		; zakończenie procedury
int 21h
main endp

.data
end main
Re: Problem z przesunięciem ekranu
#668
Author: Matuzalem
Date: Thu, 21 Sep 2006 11:19
12 lines
2350 bytes
Johnny napisał(a):
> Zrobiłem jeszcze jedną rzecz (kod niżej). Skorzystałem z funkcji 0eh dla
> int 10h, która "sama" przesuwa znak. I efekt mam ten sam. Więc może to
> jest kwestia jakichś moich ustawień dla okna DOS-owego.

Czekałem kiedy na to wpadniesz... :P
Nie Johnny, to nie ma nic wspulnego z żadnymi ustawieniami...
Skompiluj to co Ci napisałem - sprawdź czy działa poprawni, jak tak,
zanalizuj...

Pozdrawiam
Re: Problem z przesunięciem ekranu
#658
Author: Matuzalem
Date: Thu, 21 Sep 2006 11:24
25 lines
2482 bytes
Johnny napisał(a):
> Po pierwsze to palnąłem z odpowiedzią o 28 kolumnach. Oczywiście Bernard
> ma rację chodzi o 40 kolumn czyli... 28h ;-)
>
> Po drugie: Matuzalem, Matuzalem, Matuzalem
>
> Twój program działa dokładnie w taki sam sposób jak mój (przynajmniej u
> mnie) czyli gubi znak w przedostatniej kolumnie ostatniego wiersza.

A to dziwne... ?

czyli np.

4444444444444444
4444444444444444
4444444444444444
4444444444444400

i tam gdzie są '0' nie wywietla się dopuki nie zejdzie wiersz
niżej...?

U mnie to co napisałem działa pod 98 ME XP...

Pozdrawiam
Re: Problem z przesunięciem ekranu
#659
Author: Johnny
Date: Thu, 21 Sep 2006 11:46
10 lines
1858 bytes
> U mnie to co napisałem działa pod 98 ME XP...
> 
> Pozdrawiam
> 

A jaki XP? Bo ja to testowałem na dwóch komputerach z XP Pro i na obu
ten sam efekt...

-- 
Johnny
Re: Problem z przesunięciem ekranu
#660
Author: Matuzalem
Date: Thu, 21 Sep 2006 12:47
22 lines
2449 bytes
Johnny napisał(a):
> > U mnie to co napisałem działa pod 98 ME XP...
> >
> > Pozdrawiam
> >
>
> A jaki XP? Bo ja to testowałem na dwóch komputerach z XP Pro i na obu
> ten sam efekt...

XP Home i Pro

Zapomniałem dodać, że testowałem jako .exe i jako .com, oba
działają poprawnie na:

win: 98, ME, XP Home/Pro...

.exe działa troche wolniej, ale poprawnie.

Dziwna sprawa, a jakiego kompilatora używasz? (TASM wiem, ale wersja)

Pozdrawiam
Re: Problem z przesunięciem ekranu
#661
Author: Johnny
Date: Thu, 21 Sep 2006 20:32
10 lines
2265 bytes
> Dziwna sprawa, a jakiego kompilatora używasz? (TASM wiem, ale wersja)
> 

No właśnie... To jest stary MASM a nie TASM dołączony do książki
(v6.13). Jeśli mógłbyś na priva podesłać mi skompilowany przez Ciebie
program, a ja podesłałbym Ci mój. Porównalibyśmy przynajmniej czy to nie
jest wina kompilatora.

Pozdrowienia
Johnny
Re: Problem z przesunięciem ekranu
#669
Author: Wiktor S.
Date: Fri, 22 Sep 2006 09:20
100 lines
3392 bytes
> No więc poddaję się. Próbuję przewalczyć "błąd przedostatniej i
> ostatniej kolumny" ale bez pozytywnych rezultatów. Poniżej zamieszczam
> uproszczoną wersję bez przesuwania ekranu. Nie korzystam już z funkcji
> 10h przerwania 16h lecz 8h - 21h ale to niewiele zmieniło.
>
> Czy ktoś potrafi wskazać gdzie leży błąd lub przerobić to na
> działającą wersję z wykorzystaniem tych samych funkcji?
>
> Kolega Matuzalem bardzo się starał i za to mu dziękuję. Jednak teorii
> podanej w jego odpowiedziach nie udało mi się przełożyć na praktykę.

> title ekran
> .model small
> .stack 100h
> .386
> .code
> ;---------------------------------------------
> ; main
> ;---------------------------------------------
> main proc
> mov ax,@data ; inicjalizacja ds
> mov ds,ax
>
> xor ah,ah ; minimalny tryb wideo
> mov al,1h
> int 10h
>
> mov ah,0fh ; odczyt liczby kolumn
> int 10h
> dec ah ; l kolumn - 1 bo indeks zaczyna się od zera
> mov lcol,ah
>
> mov cx,040ah ; licznik
>
> odczyt:
> mov ah,8h
> int 21h
>
> cmp al,1bh ; czy ESC
> je exit
>
> mov ah,0ah ; zapis znaku
> xor bh,bh
> push cx
> mov cx,1h
> int 10h
> pop cx
>
> call przesun
>
> loop odczyt
>
> exit:
> mov ax,4C00h ; zakończenie procedury
> int 21h
> main endp
>
>
> ;---------------------------------------------
> ; przesun
> ;---------------------------------------------
> przesun proc
> pusha ; wszystko na stos
>
> mov ah,3h ; odczytaj położenie wskaźnika
> xor bh,bh
> int 10h
>
> mov ah,2h ; przesuń wskaźnik
> xor bh,bh
> cmp dl,lcol
> je nwiersz
> inc dl
> jmp exec
>
> nwiersz:
> mov dl,0h
> inc dh
>
> exec:
> int 10h
>
> popa
> ret
>
> przesun endp
>
> .data
> lcol db ?
> end main



SOA#1. Program po zapełnieniu całego ekranu (nie brakuje żadnego znaku) 
zaczyna mazać po nieistniejącym wierszu poniżej ekranu, co skutkuje rychłym 
wysypaniem.


-- 
Azarien
Thread Navigation

This is a paginated view of messages in the thread with full content displayed inline.

Messages are displayed in chronological order, with the original post highlighted in green.

Use pagination controls to navigate through all messages in large threads.

Back to All Threads