home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
PC Shareware 1998 March
/
PCShareware-3-98.iso
/
imple
/
IMPLE.RAR
/
CODE.ASM
next >
Wrap
Assembly Source File
|
1998-01-26
|
10KB
|
386 lines
; -------------------------------------------------------------------------- ;
; -------------------------------------------------------------------------- ;
; -------------------------------------------------------------------------- ;
; 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
; -------------------------------------------------------------------------- ;
; -------------------------------------------------------------------------- ;
; -------------------------------------------------------------------------- ;