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

  1. ; -------------------------------------------------------------------------- ;
  2. ; -------------------------------------------------------------------------- ;
  3. ; -------------------------------------------------------------------------- ;
  4. ; w DS - jest selector danych
  5. ;   CS - selector kodu
  6. ;   ES - blok PSP
  7. ; -------------------------------------------------------------------------- ;
  8. ; -------------------------------------------------------------------------- ;
  9. ; -------------------------------------------------------------------------- ;
  10.  
  11. ; ustaw ES taki sam selector jak w DS
  12. ; (jest to potrzebne jezeli chcemy wysylac
  13. ; dane przez rozkaz movsb itp. - movs es:[edi],ds:[esi])
  14.  
  15.     push    ds
  16.     pop    es
  17.  
  18. ; ustawmy odpowiedni tryb ekranu do pracy
  19. ; po tych rozkazach ekran zmieni swoje oblicze
  20.  
  21.     mov    ax,0013h    ;w ah = 00h
  22.                 ;  al = tryb 13h (320x200x256)
  23.     int    10h        ; wywolanie przerwanie VIDEO BIOS
  24.  
  25. ; przerwanie 10h nie zwraca wyniku i w sumie nie wiemy czy tryb
  26. ; ten jest aktywny. Jednak jest to jeden ze standardowych trybow
  27. ; karty VGA i w sumie mozemy byc pewni ze zadziala
  28.  
  29.  
  30. ; odczytanie pliku do bufora
  31.  
  32.     call    load_tga
  33.  
  34. ; odczytanie danych z naszym shapem
  35.  
  36.     call    load_shap
  37.  
  38. ; ustawienie palety kolorow
  39.  
  40.     call    set_color
  41.  
  42. ; wypisanie rysunku na ekranie
  43.  
  44.     call    bufor_to_screen
  45.  
  46. ; tutaj jest glowna petla programu
  47.  
  48. skok:
  49.     call    shap        ;wypisanie shapa na tle
  50.     mov    ecx,6
  51.     call    topause
  52.     call    bufor_to_screen    ;wypisz caly bufor na ekran
  53.  
  54.  
  55. ; zmiana polozenia shapa
  56.  
  57.     cmp    [x_kier],0
  58.     jne    lewo
  59.     inc    [xpos]
  60.     cmp    [xpos],320-32
  61.     jne    gora
  62.     xor    [x_kier],1
  63.     jmp    gora
  64. lewo:
  65.     dec    [xpos]
  66.     cmp    [xpos],0
  67.     jne    gora
  68.     xor    [x_kier],1
  69. gora:
  70.     cmp    [y_kier],1
  71.     jne    dol
  72.     dec    [ypos]
  73.     cmp    [ypos],0
  74.     jne    dalej
  75.     xor    [y_kier],1
  76.     jmp    dalej
  77. dol:
  78.     inc    [ypos]
  79.     cmp    [ypos],200-32
  80.     jne    dalej
  81.     xor    [y_kier],1
  82.  
  83. dalej:
  84.  
  85.         
  86. ; Wlasnie sobie przypomnialem, ze nie programowalismy jeszcze
  87. ; przerwania klawiatury. I tylko dlatego kolejne linie
  88. ; wygladaja tak a nie jak powinny.
  89. ; Nigdy w zyciu nie piszcze takich bzdur.
  90.  
  91.     in    al,060h        ;pobierz jaki klawisz wcisniety
  92.     cmp    al,01        ;sprawdz czy ESC
  93.     jne    skok        ;jezeli nie to skocz do etykiety SKOK
  94.  
  95. ; ustaw normalny ekran
  96.  
  97.     mov    eax,00000003h
  98.     int    10h
  99.  
  100. ; przejscie do systemu (Wirusa95 ha ha ha)
  101.  
  102.     mov    eax,00004c00h
  103.     int    21h
  104.  
  105.  
  106. ; tu mam do opisania kilka dziwnych procedurek
  107.  
  108.  
  109. ; -------------------------------------------------------------------------- ;
  110. ; -------------------------------------------------------------------------- ;
  111. ; -------------------------------------------------------------------------- ;
  112.  
  113.  
  114.  
  115. ; ▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓ ;
  116. ; ▓▓▓                                 ▓▓▓ ;
  117. ; ▓▓▓    Load_tga                     ▓▓▓ ;
  118. ; ▓▓▓                                 ▓▓▓ ;
  119. ; ▓▓▓    by Dan (c) Tue 1997.11.25    ▓▓▓ ;
  120. ; ▓▓▓                  21:25:37       ▓▓▓ ;
  121. ; ▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓ ;
  122. ; ▓▓▓                                 ▓▓▓ ;
  123. ; ▓▓▓  Odczytanie pliku w formacie    ▓▓▓ ;
  124. ; ▓▓▓  TGA (Targa).                   ▓▓▓ ;
  125. ; ▓▓▓                                 ▓▓▓ ;
  126. ; ▓▓▓                                 ▓▓▓ ;
  127. ; ▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓ ;
  128. ; ▓▓▓                                 ▓▓▓ ;
  129. ; ▓▓▓ IN : none                       ▓▓▓ ;
  130. ; ▓▓▓                                 ▓▓▓ ;
  131. ; ▓▓▓ OUT: none                       ▓▓▓ ;
  132. ; ▓▓▓                                 ▓▓▓ ;
  133. ; ▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓ ;
  134.  
  135. load_tga proc    near
  136.  
  137. ; otwarcie pliku do czytania
  138. ; DS:EDX - podajemy selector i offset do ciagu znakow z nazwa
  139. ;        pliku ktory chcemy odczytac (zapisac,zmienic) zakonczony
  140. ;        cyfra 00h
  141. ; AH      - podajemy numer funkcji przerwania 21h
  142.  
  143.     mov    edx,offset    nazwa_pliku
  144.     mov    eax,00003d00h
  145.     int    21h
  146.  
  147. ; jezeli funkcja znalazla plik i wszystko jest O.K. to w
  148. ; EAX     - jest handler pliku
  149. ; C     - wyzerowany (znacznik c)
  150.  
  151. ; jezeli chcemy odczytac plik to
  152. ; EBX     - zawiera handler wczesniej otwartego pliku
  153. ; AH      - podajemy numer funkcji przerwania 21h
  154. ; DS:EDX - selector:offset do bufora gdzie chcemy wczytac
  155. ;       otwarty plik
  156. ; ECX    - ile tego chcemy wczytac
  157.  
  158.     push    eax
  159.     mov    ebx,eax
  160.     mov    eax,00003f00h
  161.     mov    edx,offset    bufor
  162.     mov    ecx,64786       ; dlugosc pliku
  163.     int    21h
  164.  
  165. ; na koncu zamykamy plik i w
  166. ; EBX    - podajemy uchwyt zamykanego pliku
  167. ; AH     - podajemy numer funkcji przerwania 21h
  168.  
  169.     pop    ebx
  170.     mov    eax,00003e00h
  171.     int    21h
  172.  
  173. ; koniec procedury
  174.  
  175.     ret
  176. load_tga    endp
  177.  
  178.  
  179. ; ta procedura dziala tak samo jak
  180. ; wczesniejsza. Jedyna zmiana jest inny
  181. ; rozmiar wczytywane pliku i jego nazwa.
  182. ; Procedure LOAD_TGA i LOAD_SHAP mozna
  183. ; bez wiekszego wysilku zjednac w jedna
  184. ; uniwersalna procedure. Jezeli
  185. ; jednak nie potraficie, nie przejmujcie
  186. ; sie. W nastepnym nuerze bedzie juz
  187. ; taka zrobiona (jezeli nie zapomne
  188. ; jej dograc na plytke !!!).
  189.  
  190. ; ▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓ ;
  191. ; ▓▓▓                                 ▓▓▓ ;
  192. ; ▓▓▓    LOAD_SHAP                    ▓▓▓ ;
  193. ; ▓▓▓                                 ▓▓▓ ;
  194. ; ▓▓▓    by Dan (c) Mon 1998.01.26    ▓▓▓ ;
  195. ; ▓▓▓                  19:31:12       ▓▓▓ ;
  196. ; ▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓ ;
  197. ; ▓▓▓                                 ▓▓▓ ;
  198. ; ▓▓▓ Odczytanie pliku w formacie     ▓▓▓ ;
  199. ; ▓▓▓ TGA.                            ▓▓▓ ;
  200. ; ▓▓▓                                 ▓▓▓ ;
  201. ; ▓▓▓                                 ▓▓▓ ;
  202. ; ▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓ ;
  203. ; ▓▓▓                                 ▓▓▓ ;
  204. ; ▓▓▓ IN : none                       ▓▓▓ ;
  205. ; ▓▓▓                                 ▓▓▓ ;
  206. ; ▓▓▓ OUT: none                       ▓▓▓ ;
  207. ; ▓▓▓                                 ▓▓▓ ;
  208. ; ▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓ ;
  209.  
  210. load_shap    proc    near
  211.  
  212. ; otwarcie pliku do czytania
  213. ; DS:EDX - podajemy selector i offset do ciagu znakow z nazwa
  214. ;        pliku ktory chcemy odczytac (zapisac,zmienic) zakonczony
  215. ;        cyfra 00h
  216. ; AH      - podajemy numer funkcji przerwania 21h
  217.  
  218.     mov    edx,offset    nazwa_pliku2
  219.     mov    eax,00003d00h
  220.     int    21h
  221.  
  222. ; jezeli funkcja znalazla plik i wszystko jest O.K. to w
  223. ; EAX     - jest handler pliku
  224. ; C     - wyzerowany (znacznik c)
  225.  
  226. ; jezeli chcemy odczytac plik to
  227. ; EBX     - zawiera handler wczesniej otwartego pliku
  228. ; AH      - podajemy numer funkcji przerwania 21h
  229. ; DS:EDX - selector:offset do bufora gdzie chcemy wczytac
  230. ;       otwarty plik
  231. ; ECX    - ile tego chcemy wczytac
  232.  
  233.     mov    ebx,05h
  234.     mov    eax,00003f00h
  235.     mov    edx,offset    shap_data
  236.     mov    ecx,1810       ; dlugosc pliku
  237.     int    21h
  238.  
  239. ; na koncu zamykamy plik i w
  240. ; EBX    - podajemy uchwyt zamykanego pliku
  241. ; AH     - podajemy numer funkcji przerwania 21h
  242.  
  243.     mov    ebx,05h
  244.     mov    eax,00003e00h
  245.     int    21h
  246.  
  247. ; koniec procedury
  248.  
  249.     ret
  250. load_shap    endp
  251.  
  252.  
  253.  
  254. ; ▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓ ;
  255. ; ▓▓▓                                 ▓▓▓ ;
  256. ; ▓▓▓    Bufor_to_screen              ▓▓▓ ;
  257. ; ▓▓▓                                 ▓▓▓ ;
  258. ; ▓▓▓    by Dan (c) Tue 1997.11.25    ▓▓▓ ;
  259. ; ▓▓▓                  21:26:15       ▓▓▓ ;
  260. ; ▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓ ;
  261. ; ▓▓▓                                 ▓▓▓ ;
  262. ; ▓▓▓    Wypisanie danych z buforze   ▓▓▓ ;
  263. ; ▓▓▓    na ekran.                    ▓▓▓ ;
  264. ; ▓▓▓                                 ▓▓▓ ;
  265. ; ▓▓▓                                 ▓▓▓ ;
  266. ; ▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓ ;
  267. ; ▓▓▓                                 ▓▓▓ ;
  268. ; ▓▓▓ IN : none                       ▓▓▓ ;
  269. ; ▓▓▓                                 ▓▓▓ ;
  270. ; ▓▓▓ OUT: none                       ▓▓▓ ;
  271. ; ▓▓▓                                 ▓▓▓ ;
  272. ; ▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓ ;
  273.  
  274. bufor_to_screen    proc    near
  275. ; do ESI - ladujemy offset do bufora przesuniety o 786 bajtow 
  276. ; (patrz dlaczego opis w PCS)
  277.  
  278.     mov    esi,offset    bufor+786
  279.  
  280. ; do EDI - offset to pamieci ekranu karty VGA
  281.  
  282.     mov    edi,0a0000h
  283.  
  284. ; i standardowo w ECX ladujemy ilosc przepisywanych danych
  285. ; (dlaczego 16000 ? bo przepisujemy obraz o wymiarach
  286. ; 320x200 co daje 64000 i przepisujemy na raz po 4 bajty
  287. ; czyli 64000/4=16000).
  288.  
  289.     mov    ecx,16000
  290.     rep    movsd
  291.  
  292. ; koniec procedury
  293.  
  294.     ret
  295. bufor_to_screen endp
  296.  
  297. ; -------------------------------------------------------------------------- ;
  298. ; -------------------------------------------------------------------------- ;
  299. ; -------------------------------------------------------------------------- ;
  300.  
  301.  
  302.  
  303. ; ▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓ ;
  304. ; ▓▓▓                                 ▓▓▓ ;
  305. ; ▓▓▓    Set_color                    ▓▓▓ ;
  306. ; ▓▓▓                                 ▓▓▓ ;
  307. ; ▓▓▓    by Dan (c) Tue 1997.11.25    ▓▓▓ ;
  308. ; ▓▓▓                  21:26:58       ▓▓▓ ;
  309. ; ▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓ ;
  310. ; ▓▓▓                                 ▓▓▓ ;
  311. ; ▓▓▓    Wpisanie kolorow do          ▓▓▓ ;
  312. ; ▓▓▓    rejestrow karty VGA.         ▓▓▓ ;
  313. ; ▓▓▓                                 ▓▓▓ ;
  314. ; ▓▓▓                                 ▓▓▓ ;
  315. ; ▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓ ;
  316. ; ▓▓▓                                 ▓▓▓ ;
  317. ; ▓▓▓ IN : none                       ▓▓▓ ;
  318. ; ▓▓▓                                 ▓▓▓ ;
  319. ; ▓▓▓ OUT: none                       ▓▓▓ ;
  320. ; ▓▓▓                                 ▓▓▓ ;
  321. ; ▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓ ;
  322.  
  323.  
  324. set_color    proc    near
  325.  
  326. ; to bedzie opisane na lamach PCS.
  327. ; jest to po prostu odczytanie i przeksztalcenie
  328. ; danych o kolorach i jest zwiazane z pecyficznym
  329. ; formatem danych pliku graficznego TGA
  330.  
  331.     mov    esi,offset    bufor+18
  332.     mov    edi,esi
  333.     mov    ecx,256
  334. skok1:
  335.     lodsb
  336.     shr    al,2
  337.     push    eax
  338.     lodsb
  339.     shr    al,2
  340.     push    eax
  341.     lodsb
  342.     shr    al,2
  343.     stosb
  344.     pop    eax
  345.     stosb
  346.     pop    eax
  347.     stosb
  348.     loop    skok1
  349.  
  350. ; tutaj ustawiamy offset do bufora z danymi o kolorach
  351. ; do ECX - ladujemy ilosc kolorow 3*256 
  352. ; (1 bajt = jedna skladowa koloru czyli
  353. ; 1 bajt  = R
  354. ; 1 bajt  = G
  355. ; 1 bajt  = B
  356. ; -----------------
  357. ; 3 bajty = 1 kolor)
  358.  
  359.     mov    esi,offset    bufor+18
  360.     mov    ecx,256*3
  361.  
  362. ; powiadom rejest karty VGA ze bedziemy zapisywac 
  363. ; od koloru 0
  364.  
  365.     mov    edx,000003c8h
  366.     sub    eax,eax
  367.     out    dx,al
  368.  
  369. ; i zaladuj wszystkie kolory do bufora karty
  370.  
  371.     inc    edx
  372. skok2:
  373.     lodsb
  374.     out    dx,al
  375.     loop    skok2
  376.  
  377. ; koniec procedury
  378.  
  379.     ret
  380. set_color endp        
  381.  
  382. ; -------------------------------------------------------------------------- ;
  383. ; -------------------------------------------------------------------------- ;
  384. ; -------------------------------------------------------------------------- ;
  385.  
  386.