home *** CD-ROM | disk | FTP | other *** search
- ; -------------------------------------------------------------------------- ;
- ; -------------------------------------------------------------------------- ;
- ; -------------------------------------------------------------------------- ;
- ; w DS - jest selector danych
- ; CS - selector kodu
- ; ES - blok PSP
- ; -------------------------------------------------------------------------- ;
- ; -------------------------------------------------------------------------- ;
- ; -------------------------------------------------------------------------- ;
-
- ; ustaw ES taki sam selector jak w DS
- ; (jest to potrzebne jezeli chcemy wysylac
- ; dane przez rozkaz movsb itp. - movs es:[edi],ds:[esi])
-
- push ds
- pop es
-
- ; ustawmy odpowiedni tryb ekranu do pracy
- ; po tych rozkazach ekran zmieni swoje oblicze
-
- mov ax,0013h ;w ah = 00h
- ; al = tryb 13h (320x200x256)
- int 10h ; wywolanie przerwanie VIDEO BIOS
-
- ; przerwanie 10h nie zwraca wyniku i w sumie nie wiemy czy tryb
- ; ten jest aktywny. Jednak jest to jeden ze standardowych trybow
- ; karty VGA i w sumie mozemy byc pewni ze zadziala
-
-
- ; odczytanie pliku do bufora
-
- call load_tga
-
- ; odczytanie danych z naszym shapem
-
- call load_shap
-
- ; ustawienie palety kolorow
-
- call set_color
-
- ; wypisanie rysunku na ekranie
-
- call bufor_to_screen
-
- ; tutaj jest glowna petla programu
-
- skok:
- call shap ;wypisanie shapa na tle
- mov ecx,6
- call topause
- call bufor_to_screen ;wypisz caly bufor na ekran
-
-
- ; zmiana polozenia shapa
-
- cmp [x_kier],0
- jne lewo
- inc [xpos]
- cmp [xpos],320-32
- jne gora
- xor [x_kier],1
- jmp gora
- lewo:
- dec [xpos]
- cmp [xpos],0
- jne gora
- xor [x_kier],1
- gora:
- cmp [y_kier],1
- jne dol
- dec [ypos]
- cmp [ypos],0
- jne dalej
- xor [y_kier],1
- jmp dalej
- dol:
- inc [ypos]
- cmp [ypos],200-32
- jne dalej
- xor [y_kier],1
-
- dalej:
-
-
- ; Wlasnie sobie przypomnialem, ze nie programowalismy jeszcze
- ; przerwania klawiatury. I tylko dlatego kolejne linie
- ; wygladaja tak a nie jak powinny.
- ; Nigdy w zyciu nie piszcze takich bzdur.
-
- in al,060h ;pobierz jaki klawisz wcisniety
- cmp al,01 ;sprawdz czy ESC
- jne skok ;jezeli nie to skocz do etykiety SKOK
-
- ; ustaw normalny ekran
-
- mov eax,00000003h
- int 10h
-
- ; przejscie do systemu (Wirusa95 ha ha ha)
-
- mov eax,00004c00h
- int 21h
-
-
- ; tu mam do opisania kilka dziwnych procedurek
-
-
- ; -------------------------------------------------------------------------- ;
- ; -------------------------------------------------------------------------- ;
- ; -------------------------------------------------------------------------- ;
-
-
-
- ; ▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓ ;
- ; ▓▓▓ ▓▓▓ ;
- ; ▓▓▓ Load_tga ▓▓▓ ;
- ; ▓▓▓ ▓▓▓ ;
- ; ▓▓▓ by Dan (c) Tue 1997.11.25 ▓▓▓ ;
- ; ▓▓▓ 21:25:37 ▓▓▓ ;
- ; ▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓ ;
- ; ▓▓▓ ▓▓▓ ;
- ; ▓▓▓ Odczytanie pliku w formacie ▓▓▓ ;
- ; ▓▓▓ TGA (Targa). ▓▓▓ ;
- ; ▓▓▓ ▓▓▓ ;
- ; ▓▓▓ ▓▓▓ ;
- ; ▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓ ;
- ; ▓▓▓ ▓▓▓ ;
- ; ▓▓▓ IN : none ▓▓▓ ;
- ; ▓▓▓ ▓▓▓ ;
- ; ▓▓▓ OUT: none ▓▓▓ ;
- ; ▓▓▓ ▓▓▓ ;
- ; ▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓ ;
-
- load_tga proc near
-
- ; otwarcie pliku do czytania
- ; DS:EDX - podajemy selector i offset do ciagu znakow z nazwa
- ; pliku ktory chcemy odczytac (zapisac,zmienic) zakonczony
- ; cyfra 00h
- ; AH - podajemy numer funkcji przerwania 21h
-
- mov edx,offset nazwa_pliku
- mov eax,00003d00h
- int 21h
-
- ; jezeli funkcja znalazla plik i wszystko jest O.K. to w
- ; EAX - jest handler pliku
- ; C - wyzerowany (znacznik c)
-
- ; jezeli chcemy odczytac plik to
- ; EBX - zawiera handler wczesniej otwartego pliku
- ; AH - podajemy numer funkcji przerwania 21h
- ; DS:EDX - selector:offset do bufora gdzie chcemy wczytac
- ; otwarty plik
- ; ECX - ile tego chcemy wczytac
-
- push eax
- mov ebx,eax
- mov eax,00003f00h
- mov edx,offset bufor
- mov ecx,64786 ; dlugosc pliku
- int 21h
-
- ; na koncu zamykamy plik i w
- ; EBX - podajemy uchwyt zamykanego pliku
- ; AH - podajemy numer funkcji przerwania 21h
-
- pop ebx
- mov eax,00003e00h
- int 21h
-
- ; koniec procedury
-
- ret
- load_tga endp
-
-
- ; ta procedura dziala tak samo jak
- ; wczesniejsza. Jedyna zmiana jest inny
- ; rozmiar wczytywane pliku i jego nazwa.
- ; Procedure LOAD_TGA i LOAD_SHAP mozna
- ; bez wiekszego wysilku zjednac w jedna
- ; uniwersalna procedure. Jezeli
- ; jednak nie potraficie, nie przejmujcie
- ; sie. W nastepnym nuerze bedzie juz
- ; taka zrobiona (jezeli nie zapomne
- ; jej dograc na plytke !!!).
-
- ; ▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓ ;
- ; ▓▓▓ ▓▓▓ ;
- ; ▓▓▓ LOAD_SHAP ▓▓▓ ;
- ; ▓▓▓ ▓▓▓ ;
- ; ▓▓▓ by Dan (c) Mon 1998.01.26 ▓▓▓ ;
- ; ▓▓▓ 19:31:12 ▓▓▓ ;
- ; ▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓ ;
- ; ▓▓▓ ▓▓▓ ;
- ; ▓▓▓ Odczytanie pliku w formacie ▓▓▓ ;
- ; ▓▓▓ TGA. ▓▓▓ ;
- ; ▓▓▓ ▓▓▓ ;
- ; ▓▓▓ ▓▓▓ ;
- ; ▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓ ;
- ; ▓▓▓ ▓▓▓ ;
- ; ▓▓▓ IN : none ▓▓▓ ;
- ; ▓▓▓ ▓▓▓ ;
- ; ▓▓▓ OUT: none ▓▓▓ ;
- ; ▓▓▓ ▓▓▓ ;
- ; ▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓ ;
-
- load_shap proc near
-
- ; otwarcie pliku do czytania
- ; DS:EDX - podajemy selector i offset do ciagu znakow z nazwa
- ; pliku ktory chcemy odczytac (zapisac,zmienic) zakonczony
- ; cyfra 00h
- ; AH - podajemy numer funkcji przerwania 21h
-
- mov edx,offset nazwa_pliku2
- mov eax,00003d00h
- int 21h
-
- ; jezeli funkcja znalazla plik i wszystko jest O.K. to w
- ; EAX - jest handler pliku
- ; C - wyzerowany (znacznik c)
-
- ; jezeli chcemy odczytac plik to
- ; EBX - zawiera handler wczesniej otwartego pliku
- ; AH - podajemy numer funkcji przerwania 21h
- ; DS:EDX - selector:offset do bufora gdzie chcemy wczytac
- ; otwarty plik
- ; ECX - ile tego chcemy wczytac
-
- mov ebx,05h
- mov eax,00003f00h
- mov edx,offset shap_data
- mov ecx,1810 ; dlugosc pliku
- int 21h
-
- ; na koncu zamykamy plik i w
- ; EBX - podajemy uchwyt zamykanego pliku
- ; AH - podajemy numer funkcji przerwania 21h
-
- mov ebx,05h
- mov eax,00003e00h
- int 21h
-
- ; koniec procedury
-
- ret
- load_shap endp
-
-
-
- ; ▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓ ;
- ; ▓▓▓ ▓▓▓ ;
- ; ▓▓▓ Bufor_to_screen ▓▓▓ ;
- ; ▓▓▓ ▓▓▓ ;
- ; ▓▓▓ by Dan (c) Tue 1997.11.25 ▓▓▓ ;
- ; ▓▓▓ 21:26:15 ▓▓▓ ;
- ; ▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓ ;
- ; ▓▓▓ ▓▓▓ ;
- ; ▓▓▓ Wypisanie danych z buforze ▓▓▓ ;
- ; ▓▓▓ na ekran. ▓▓▓ ;
- ; ▓▓▓ ▓▓▓ ;
- ; ▓▓▓ ▓▓▓ ;
- ; ▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓ ;
- ; ▓▓▓ ▓▓▓ ;
- ; ▓▓▓ IN : none ▓▓▓ ;
- ; ▓▓▓ ▓▓▓ ;
- ; ▓▓▓ OUT: none ▓▓▓ ;
- ; ▓▓▓ ▓▓▓ ;
- ; ▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓ ;
-
- bufor_to_screen proc near
- ; do ESI - ladujemy offset do bufora przesuniety o 786 bajtow
- ; (patrz dlaczego opis w PCS)
-
- mov esi,offset bufor+786
-
- ; do EDI - offset to pamieci ekranu karty VGA
-
- mov edi,0a0000h
-
- ; i standardowo w ECX ladujemy ilosc przepisywanych danych
- ; (dlaczego 16000 ? bo przepisujemy obraz o wymiarach
- ; 320x200 co daje 64000 i przepisujemy na raz po 4 bajty
- ; czyli 64000/4=16000).
-
- mov ecx,16000
- rep movsd
-
- ; koniec procedury
-
- ret
- bufor_to_screen endp
-
- ; -------------------------------------------------------------------------- ;
- ; -------------------------------------------------------------------------- ;
- ; -------------------------------------------------------------------------- ;
-
-
-
- ; ▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓ ;
- ; ▓▓▓ ▓▓▓ ;
- ; ▓▓▓ Set_color ▓▓▓ ;
- ; ▓▓▓ ▓▓▓ ;
- ; ▓▓▓ by Dan (c) Tue 1997.11.25 ▓▓▓ ;
- ; ▓▓▓ 21:26:58 ▓▓▓ ;
- ; ▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓ ;
- ; ▓▓▓ ▓▓▓ ;
- ; ▓▓▓ Wpisanie kolorow do ▓▓▓ ;
- ; ▓▓▓ rejestrow karty VGA. ▓▓▓ ;
- ; ▓▓▓ ▓▓▓ ;
- ; ▓▓▓ ▓▓▓ ;
- ; ▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓ ;
- ; ▓▓▓ ▓▓▓ ;
- ; ▓▓▓ IN : none ▓▓▓ ;
- ; ▓▓▓ ▓▓▓ ;
- ; ▓▓▓ OUT: none ▓▓▓ ;
- ; ▓▓▓ ▓▓▓ ;
- ; ▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓ ;
-
-
- set_color proc near
-
- ; to bedzie opisane na lamach PCS.
- ; jest to po prostu odczytanie i przeksztalcenie
- ; danych o kolorach i jest zwiazane z pecyficznym
- ; formatem danych pliku graficznego TGA
-
- mov esi,offset bufor+18
- mov edi,esi
- mov ecx,256
- skok1:
- lodsb
- shr al,2
- push eax
- lodsb
- shr al,2
- push eax
- lodsb
- shr al,2
- stosb
- pop eax
- stosb
- pop eax
- stosb
- loop skok1
-
- ; tutaj ustawiamy offset do bufora z danymi o kolorach
- ; do ECX - ladujemy ilosc kolorow 3*256
- ; (1 bajt = jedna skladowa koloru czyli
- ; 1 bajt = R
- ; 1 bajt = G
- ; 1 bajt = B
- ; -----------------
- ; 3 bajty = 1 kolor)
-
- mov esi,offset bufor+18
- mov ecx,256*3
-
- ; powiadom rejest karty VGA ze bedziemy zapisywac
- ; od koloru 0
-
- mov edx,000003c8h
- sub eax,eax
- out dx,al
-
- ; i zaladuj wszystkie kolory do bufora karty
-
- inc edx
- skok2:
- lodsb
- out dx,al
- loop skok2
-
- ; koniec procedury
-
- ret
- set_color endp
-
- ; -------------------------------------------------------------------------- ;
- ; -------------------------------------------------------------------------- ;
- ; -------------------------------------------------------------------------- ;
-
-