Po współpracy z kolegą zrobiliśmy działający programik.
Działa on, ale bez odczytywania palety z pliku BMP obrazki mają dziwne kolory.
Znalazłem przykład odczytywania palety i chciałbym go zastosować. Ale chyba proste skopiowanie jej do programu nie daje rezultatów. Obrazki odczytują się w takich samych kolorach. na razie została ona skopiowana do procedury odczytywania obrazka 320x200x256. Co jeszcze należy zrobić, żeby to działało?
.model small
.386
.code
Start: mov ax, @DATA
mov ds, ax
cmp byte ptr es:[80h],0
je Brak_arg
mov cl,es:[80h]
xor ch,ch
dec cx
mov si, 82h
lea di, NazwaPliku
;wczytanie nazwy pliku z atrybutu
kopiuj:
mov al,es:[si]
mov [di],al
inc si
inc di
loop kopiuj
mov byte ptr [di],'$'
;sprawdzenie czy podany plik istnieje
mov ah,3Dh ;otworzenie pliku
mov al,0
lea dx,NazwaPliku
int 21h
jc BrakPliku
mov Uchwyt,ax
menu:
;wlaczenie trybu tekstowego
mov ax, 3
int 10h;
mov ah,42h ;przesuniecie wskaznika pliku
mov al,0 ;al=0 - wzgledem poczatku pliku
mov bx,Uchwyt
xor cx,cx
mov dx,0Ah ;przesun do informacji o polozeniu poczatku danych
int 21h
mov ah,3Fh ;czytanie z pliku
mov bx,Uchwyt
lea dx,dane
mov cx,4 ;ilosc odczytanych bajtow
int 21h
;sprawdzenie ilosci kolorow
mov ah,42h ;przesuniecie wskaznika pliku
mov al,0 ;al=0 - wzgledem poczatku pliku
mov bx,Uchwyt
xor cx,cx
mov dx,1Ch ;przesun do informacji o ilosci kolorow
int 21h
mov ah,3Fh ;czytanie z pliku
mov bx,Uchwyt
lea dx,kolory ;wartosc 08h - 256, 04h - 16
mov cx,2 ;ilosc odczytanych bajtow
int 21h
;sprawdzenie rozdzielczosci
mov ah,42h ;przesuniecie wskaznika pliku
mov al,0 ;al=0 - wzgledem poczatku pliku
mov bx,Uchwyt
xor cx,cx
mov dx,12h ;przesun do informacji o szerokosci pliku
int 21h
mov ah,3Fh ;czytanie z pliku
mov bx,Uchwyt
lea dx,szerokosc
mov cx,2 ;ilosc odczytanych bajtow
int 21h
mov ah,42h ;przesuniecie wskaznika pliku
mov al,0 ;al=0 - wzgledem poczatku pliku
mov bx,Uchwyt
xor cx,cx
mov dx,16h ;przesun do informacji o wysokosci pliku
int 21h
mov ah,3Fh ;czytanie z pliku
mov bx,Uchwyt
lea dx,wysokosc
mov cx,2 ;ilosc odczytanych bajtow
int 21h
;przesuniecie wskaznika do poczatku danych
mov ah,42h ;przesuniecie wskaznika pliku
mov al,0 ;al=0 - wzgledem poczatku pliku
mov bx,Uchwyt
xor cx,cx
mov dx,dane ;przesun do poczatku danych
int 21h
;wyswietlenie menu
mov ah, 09h
lea dx, tMenu
int 21h
;wczytanie wybranej opcji
wybor_trybu:
mov ah, 08h
int 21h
cmp al, 49
je tryb320
cmp al, 50
je tryb640
cmp al, 27
je wyjscie
jmp wybor_trybu
tryb320:
;sprawdzenie czy rozdzielczosc nie jest za duza
cmp szerokosc,320
jna wys320
mov ah,9h
lea dx,tZaDuzy
int 21h
mov ah, 08h
int 21h
jmp menu
wys320:
cmp wysokosc,200
jna wyswietl320
mov ah,9h
lea dx,tZaDuzy
int 21h
mov ah, 08h
int 21h
jmp menu
;ustawienie trybu graficznego
wyswietl320:
mov ah,0
mov al,19 ;tryb 320x200x256
int 10h
mov cx,0
mov dx,wysokosc ;przesuniecie do dolu ekranu (200)
push cx
push dx
;//////////////////////////////////////////////////////////
;czytanie_palety
mov AH,3Fh
mov CX,kolory ; CX = liczba kolorów w palecie
shl CX,2 ; CX = mnożenie przez 4, aby uzyskać
; wielkość palety (w bajtach)
mov DX,offset paleta
int 21h ; Umieszczenie palety w buforze
;wysylanie palety
mov SI,offset paleta ; Wskazanie buforu zawierającego paletę
mov CX,kolory ; CX = Liczba kolorów do wysłania
mov DX,3C8h
mov AL,0 ; Rozpoczęcie od koloru 0
out DX,AL
inc DX ; DX = 3C9h.
wysylaj:
mov AL,[SI+2] ; Uzyskanie wartości czerwonego koloru
shr AL,2 ; Maksymalnie 255, ale możliwe jest
; wyświetlenie wartości tylko do 63.
; Dzielenie przez 4 zapewnia dobry wynik
out DX,AL ; Wysłanie wartości
mov AL,[SI+1] ; Uzyskanie wartości zielonego koloru
shr AL,2
out DX,AL ; Wysłanie wartości
mov AL,[SI] ; Uzyskanie wartości niebieskiego koloru
shr AL,2
out DX,AL ; Wysłanie wartości
add SI,4 ; Wskazanie kolejnego koloru
loop wysylaj
;////////////////////////////////////////////////////////////
;wyswietlanie pliku
czytaj320:
mov ah,3Fh
mov bx,Uchwyt
lea dx,bufor
mov cx,1
int 21h
cmp ax,0
je Eof
pop dx
pop cx
mov ah,0Ch ;wyswietlanie pikseli
mov bh,0 ;b - numer strony, al - kolor piksela, cx - Y, dx - X
mov al, bufor
int 10h
cmp kolory,08h
je k256x320
shl bufor,4
inc cx
mov ah,0Ch ;wyswietlanie pikseli
mov bh,0 ;b - numer strony, al - kolor piksela, cx - Y, dx - X
mov al, bufor
int 10h
k256x320:
inc cx
cmp cx,szerokosc
jne dalej320
dec dx
xor cx,cx
dalej320:
push cx
push dx
jmp czytaj320
tryb640:
;sprawdzenie czy rozdzielczosc nie jest za duza
cmp szerokosc,640
jna wys640
mov ah,9h
lea dx,tZaDuzy
int 21h
mov ah, 08h
int 21h
jmp menu
wys640:
cmp wysokosc,480
jna wyswietl640
mov ah,9h
lea dx,tZaDuzy
int 21h
mov ah, 08h
int 21h
jmp menu
;ustawienie trybu graficznego
wyswietl640:
mov ah,0
mov al,18 ;tryb 640x480x16
int 10h
mov cx,0
mov dx, wysokosc ;przesuniecie do dolu ekranu
push cx
push dx
;wyswietlanie pliku
czytaj640:
mov ah,3Fh
mov bx,Uchwyt
lea dx,bufor
mov cx,1
int 21h
cmp ax,0
je Eof
pop dx
pop cx
mov ah,0Ch
mov bh,0
mov al, bufor
int 10h
cmp kolory,08h
je k256x640
shl bufor,4
inc cx
mov ah,0Ch ;wyswietlanie pikseli
mov bh,0 ;b - numer strony, al - kolor piksela, cx - Y, dx - X
mov al, bufor
int 10h
k256x640:
inc cx
cmp cx, szerokosc
jne dalej640
dec dx
xor cx,cx
dalej640:
push cx
push dx
jmp czytaj640
Eof:
mov ah, 08h
int 21h
jmp menu
BrakPliku:
mov ah,9h
lea dx,tBrakPliku
int 21h
jmp wyjscie
Brak_arg:
mov ah,9h
lea dx,tBrakArg
int 21h
wyjscie:
mov ah,3Eh ;zamkniecie pliku
mov bx, Uchwyt
int 21h
mov ah, 4Ch
mov al, 00h
int 21h
.data
tMenu db ' Wybierz tryb wyswietlania bitmapy: 1 - 320x200 w 256 kolorach, 2 - 640x480 w 16 kolorach, ESC - wyjscie ','$'
tBrakPliku db 'Podany plik nie istnieje!$'
tBrakArg db 'Bledny atrybut pliku! (atrybut - nazwa pliku bmp, np plik.bmp)$'
NazwaPliku db 128 dup(?)
Uchwyt dw 0
bufor db ?
dane dw ?
szerokosc dw ?
wysokosc dw ?
kolory dw ?
tZaDuzy db ' Plik ma za duza rozdzielczosc!$'
paleta db 1024 dup('P')
.stack
END Start