Skocz do zawartości
Zamknięcie Forum PC LAB

Szanowny Użytkowniku,

Informujemy, że za 30 dni tj. 30 listopada 2024 r. serwis internetowy Forum PC LAB zostanie zamknięty.

Administrator Serwisu Forum PC LAB - Ringier Axel Springer Polska sp. z o.o. z siedzibą w Warszawie: wypowiada całość usług Serwisu Forum PC LAB z zachowaniem miesięcznego okresu wypowiedzenia.

Administrator Serwisu Forum PC LAB informuje, że:

  1. Z dniem 29 listopada 2024 r. zakończy się świadczenie wszystkich usług Serwisu Forum PC LAB. Ważną przyczyną uzasadniającą wypowiedzenie jest zamknięcie Serwisu Forum PC LAB
  2. Dotychczas zamowione przez Użytkownika usługi Serwisu Forum PC LAB będą świadczone w okresie wypowiedzenia tj. do dnia 29 listopada 2024 r.
  3. Po ogłoszeniu zamknięcia Serwisu Forum od dnia 30 października 2024 r. zakładanie nowych kont w serwisie Forum PC LAB nie będzie możliwe
  4. Wraz z zamknięciem Serwisu Forum PC LAB, tj. dnia 29 listopada 2024 r. nie będzie już dostępny katalog treści Forum PC LAB. Do tego czasu Użytkownicy Forum PC LAB mają dostęp do swoich treści w zakładce "Profil", gdzie mają możliwość ich skopiowania lub archiwizowania w formie screenshotów.
  5. Administrator danych osobowych Użytkowników - Ringier Axel Springer Polska sp. z o.o. z siedzibą w Warszawie zapewnia realizację praw podmiotów danych osobowych przez cały okres świadczenia usług Serwisu Forum PC LAB. Szczegółowe informacje znajdziesz w Polityce Prywatności

Administrator informuje, iż wraz z zamknięciem Serwisu Forum PC LAB, dane osobowe Użytkowników Serwisu Forum PC LAB zostaną trwale usunięte ze względu na brak podstawy ich dalszego przetwarzania. Proces trwałego usuwania danych z kopii zapasowych może przekroczyć termin zamknięcia Forum PC LAB o kilka miesięcy. Wyjątek może stanowić przetwarzanie danych użytkownika do czasu zakończenia toczących się postepowań.

Temat został przeniesiony do archiwum

Ten temat przebywa obecnie w archiwum. Dodawanie nowych odpowiedzi zostało zablokowane.

BzikOS

[asm] VESA i wyświetlenie BMP

Rekomendowane odpowiedzi

Witam forumowiczów :)

Zwracam się do Was z prośba o drobną pomoc. Otóż z asemblerem nigdy nie miałem do czynienia i nagle wypadło mi napisać w nim program do wyświetlania bitmapy w 800x600x32 (na zaliczenie przedmiotu oczywiście).

Po wielu mękach i przy pomocy innych udało mi się sklecić taki kod (z gotowych fragmentów :)):

 

CR  EQU	0dh

LF  EQU	0ah



dane SEGMENT

 FileName	DB	'mnm2.bmp',0

 StrErrOpen	DB	'Blad otwarcia pliku',CR,LF,'$'

 StrErrRead	DB	'Blad czytania pliku',CR,LF,'$'

 StrErrInitGr	DB	'Blad inicjacji grafiki',CR,LF,'$'

 numer_id	DW	?

 bufor  DB	1 dup(1)

dane ENDS



linia SEGMENT

ASSUME CS:linia ,  DS:dane

ORG 1000h



Start:  mov	ax,dane

 mov	ds,ax

 mov	ah,3Dh  ; otwieranie dojscia do pliku

 mov	al,0  ; al=0 prawo do czytania

 mov	dx,offset FileName; nazwa pliku - przekazanie funkcji

 int	21h

 jnc	SHORT GoodOpen

 jmp	ErrOpenFile



GoodOpen:	mov	ds:[numer_id],ax; numer dojscia do pliku

 mov	ah,42h  ; ustawienie wskaznika pliku

 mov	al,2  ; al = 2 sposob przesuniecia 2-od konca pliku

 mov	cx,-1  ; para cx:dx 32 bitowa liczba o jaka przesunac wskaznik	

 mov	dx,-3  ; cx=-1 i dx=-3 przesun o 3 do tylu

 mov	bx,ds:[numer_id]; numer dojscia

 int	21h

 jnc	SHORT GoodRead

 jmp	ErrReadFile



GoodRead:	mov	ah,4Fh  ; inicjowanie trybu VESA

 mov	al,02h  ; podfunkcja wywolanie trybu vesa

 mov	bx,115h  ; tryb graficzny 800*600 16M

 int	10h  ; wywolanie Biosu



 mov	di,0  ; licznik zmiany banku 30 razy aby wczytac cala bitmape

Zmien_bank:	mov	dx,di  ; numer banku czyli adres pamieci RAM polaczony z adresami pam karty graf

 inc	di

 mov	ax,4F05h	; funkcja zmiany aktywnego banku wyswietlenia 

 mov	bx,00h  ; podfunkcja 00

 int	10h



               mov     ax,0A000h              ; inicjalizacja pamieci ekranu w trybie graficznym

 mov	es,ax  ; przypisanie adresu pamieci do es



               mov     cx,0FFFCh              ; licznik petli przypisujcej do pamieci odpow kolor

Petla:  mov	si,0h  ; petla wykonujaca potrojne wczytanie piksela do pamieci

Petla_zero:	mov	ah,3Fh  ; czytanie pliku

 mov	bx,ds:[numer_id]; numer dojscia

 push	cx  ; odlozenie licznika petli na stos

 mov	cx,1h  ; liczba bajtow do przeczytania

 mov	dx,offset bufor	; miejsce zapisu przeczytanego bajtu

 int	21h



 mov	ax,4201h	; cofniecie wskaznika pliku

  	 ; al = 1 sposob przesuniecia 1-od biezacej pozycji

 mov	cx,-1  ; para cx:dx 32 bitowa liczba o jaka przesunac wskaznik	

 mov	dx,-2  ; cx=-1 i dx=-2 przesun o 2 do tylu

 mov	bx,ds:[numer_id];numer dojscia

 int	21h



 pop	cx  ; przywrocenie licznika petli

               mov     bx,0FFFCh

 sub	bx,cx  ; ustawienie ofsetu adresu pam ekranu 

 mov	al,ds:[bufor]	; ustawinie koloru pierwszego bajtu piksela do al

 mov	es:[bx],al	; przypisanie wartosci koloru bezposrednio do pamieci

 inc	si

 dec	cx



               cmp     si,3h

 jne	Petla_zero	; petla wykonuje wczytanie FFFCh razy



 loop	Petla



 mov	si,0h  ; petla wykonujaca potrojne wczytanie piksela do pamieci

Petla_zero_2:	mov	ah,3Fh  ; czytanie pliku

 mov	bx,ds:[numer_id]; numer dojscia

 mov	cx,1h  ; liczba bajtow do przeczytania

 mov	dx,offset bufor	; miejsce zapisu przeczytanego bajtu

 int	21h



 mov	ax,4201h	; cofniecie wskaznika pliku

  	 ; al = 1 sposob przesuniecia 1-od biezacej pozycji

 mov	cx,-1  ; para cx:dx 32 bitowa liczba o jaka przesunac wskaznik	

 mov	dx,-2  ; cx=-1 i dx=-2 przesun o 2 do tylu

 mov	bx,ds:[numer_id]; numer dojscia

 int	21h



               mov     bx,0FFFCh

 add	bx,si  ; ustawienie ofsetu adresu pam ekranu 

 mov	al,ds:[bufor]	; ustawinie koloru pierwszego bajtu piksela o kolorze blue  00h-FFh

 mov	es:[bx],al	; przypisanie wartosci bezposrednio do pamieci

 inc	si



 cmp	si,3h

 jne	Petla_zero_2	; funkcja wykonuje wczytanie 3h razy + pop petla FFFCh = FFFFh =65536d czyli rozmiar pamieci ekranu w pamieci ram







 cmp	di,30

 jne	Zmien_bank


;-----------------

 mov	ah,08h  ; czytanie znaku bez echa

 int	21h  ; przerwanie DOS-a



 mov	ah,3Eh  ; zamykanie dojscia do pliku

 mov	bx,ds:[numer_id]; numer dojscia

 int	21h



 jmp	SHORT Exit
;-----------------





ErrInit:      mov     dx,OFFSET StrErrInitGr

             call    Print

             jmp     SHORT Exit



ErrOpenFile:  mov     dx,OFFSET StrErrOpen

             call    Print

             jmp     SHORT Exit



ErrReadFile:  mov     dx,OFFSET StrErrRead

             call    Print

             jmp     SHORT Exit



Print:        mov     ah,09h

             int     21h

             ret



Exit:         mov     ax,4c00h

             int     21h



linia ENDS

END start

 

Mniej więcej rozumiem o co w nim chodzi, ale nie mogę sobie poradzić z taką zmianą, aby bitmapa była wyświetlana od połowy ekranu. Wiem, że trzeba przesunąc offset pamięci karty graficznej, ale pomimu kilku godzin prób nie udało mi się uzyskać efektu o jaki mi chodzi :(

Dlatego zwracam się z gorącą prośbą do Was - jak to należy zrobić (przewertowałem chyba wszystkie polskie strony na temat VESY i ASM'a - teoretycznie mniej więcej wiem jak to zrobić, ale praktycznie nie mogę tego zrealizować :()

 

Pozdrawiam i z góry dziękuję za odpowiedzi

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

  • Ostatnio przeglądający   0 użytkowników

    Brak zarejestrowanych użytkowników przeglądających tę stronę.

×
×
  • Dodaj nową pozycję...