Advertisement
Guest User

Untitled

a guest
Nov 21st, 2017
88
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 7.98 KB | None | 0 0
  1. ;dlugosc bufora - 4000
  2. Progr segment
  3. assume cs:Progr, ds:dane, ss:stosik
  4. ;-------------------makra------------------------------
  5. Czysc MACRO
  6.  
  7. mov di,0 ;Wybieramy 0 pixel do czyszczenia
  8. mov cx, 320*200 ;do CXa wpisujemy rozmiar ekranu
  9. mov al,0 ;0-czarny ekran, tym czyscimy calosc. Adresacja natychmiastowa.
  10. rep stosb ;wykona się CX razy, wysyla do bufora ekranu 0, w wyniku czego uzyskujemy czarny ekran.
  11.  
  12. ENDM
  13.  
  14.  
  15. Load MACRO
  16. LES DI,DWORD PTR VidOrigin ;wpisz do ES:DI adres bufora ekranu
  17. MOV CX,2000 ;wpisuje dlugosc bufora
  18. MOV BX,0 ;zerujemy, bo BX przesuwamy
  19. wczyt: ;wczytuje zrzut, zeby bylo tlo
  20. MOV AX,zrzut[BX] ;do AX przesyla kolejne 16bitow z zrzutu ekranu
  21. ADD BX,2 ;zwiekszamy BX, wskazuje na nastepna wartosc
  22. STOSW ;STOSW przesylanie 16bitow do bufora ekranu
  23. LOOP WCZYT
  24. ENDM
  25.  
  26.  
  27.  
  28. ;---------------------------program-------------------------------
  29. start: mov ax,dane
  30. mov ds,ax
  31. mov ax,stosik
  32. mov ss,ax
  33. mov sp,offset szczyt
  34. ;----------------------------kod---------------------------------------
  35. JMP wybor
  36.  
  37. Kwadrat:
  38. MOV DI, txtWsp ;do rejestru DI wrzuca wartość etykiety txtWsp, wskazuje lewą górną część kwadratu, skad zaczynamy go rysować
  39.  
  40. MOV AH,10 ;10-kolor kwadratu
  41. MOV AL,'X' ;znak X
  42.  
  43. MOV CX,5 ;wysokosc na 5 wierszy
  44. petlagraf:
  45. MOV BX,CX ;licznik petli wrzucamy do BXa
  46. MOV CX,10 ;wrzucamy 10 do CX, żeby 5 razy 10 "X" narysowało
  47. REP STOSW ;STOSW wykona się 10 razy, STOSW przesylanie 16bitow do bufora ekranu
  48. ADD DI,140 ;Dodajemy 140, żeby w nastepnej linii narysowało kolejne, 140 ponieważ
  49. MOV CX,BX ;Cofamy licznik, zeby wydobyc tą "5"
  50. LOOP petlagraf ;petla sie wykona 5 razy.
  51. RET
  52.  
  53. Save: ;zapisuje bufor ekranu do pamięci komputera, żeby przy poruszaniu się kwadratu ekran się odświeżał cały czas
  54. MOV AX,dane ;te 4 liniki wrzucają do ES:DI adres etykiety zrzut
  55. MOV ES,AX
  56. LEA AX,zrzut
  57. MOV DI,ax
  58.  
  59. LDS SI,DWORD PTR VidOrigin ;wrzucamy do DS:SI adres bufora ekranu
  60. MOV CX,2000
  61. REP MOVSW ;REP oznacza tyle, ze MOVSW wykona sie tyle razy ile jest w CX czyli 2000 razy. MOVSW przesyla dane z DS:SI do ES:DI. Prześle z bufora ekranu do zrzutu po 16bajtów
  62. MOV AX,dane ;nadpisywalismy DS, musismy z powrotem przywrocic pierwotna wartosc na segment danych. Zmienialismy, bo MOVSW korzysta z DSa
  63. MOV DS,AX
  64.  
  65. RET
  66.  
  67. wybor:
  68. LEA DX, Tekst ;Ładuje adres efektywny etykiety Tekst do rejestru DX
  69. MOV AH, 09H ;wypisywanie
  70. INT 21H
  71.  
  72. LEA DX, max
  73. MOV ah, 0Ah ;0Ah parametr przerwania, wczytywanie
  74. INT 21h ;przerwanie DOS obslugujacy klawiature
  75.  
  76.  
  77. CMP tab,'1'
  78. JZ txt
  79. CMP tab,'2'
  80. JZ graf1 ;skacze max o 128bajtów i wykoczyłby błąd, że chcemy wykonać "za daleki" skok
  81. JMP wybor
  82.  
  83.  
  84. ;-----------------------Tryb tekstowy------------------------------
  85. txt:
  86. LES DI,DWORD PTR VidOrigin ;wpisuje do pary rejestrów ES:DI adres bufora ekranu
  87. CALL Save ;wywoluje "Save"
  88.  
  89. tgora:
  90. CMP txtWsp,160 ;Warunek końca, żebyśmy nie wyszli poza ekran,
  91. JL txtloop ;jest wartosc 160 jest mniejsza to skok do etykiety txtloop
  92. sub txtWsp,160 ;odejmujemy 160, jeśli chcemy przejść linike wyżej, jesli jest poniżej "160" to nie możemy przejść linikę wyżej, tak samo działa "tdol"
  93. JMP txtloop
  94. tdol:
  95. CMP txtWsp,3198 ;3198 nie mozemy nizej tej wartosci, ostatnia linia do ktorej mozemy przejsc
  96. JA txtloop ;JA-jesli wieksze
  97. add txtWsp,160
  98. JMP txtloop
  99.  
  100. graf1:
  101. JMP graf
  102. tprawo: ;0-158 to jest max, po którym możemy się poruszać.
  103. MOV AX,txtWsp ;do AX wrzucamy wsplórzędną kwadratu.
  104. MOV BL,160 ;dzielimy przez 160
  105. DIV BL
  106. CMP AH,140 ;porownujemy z 140, ponieważ nasz kwadrat ma długosć 20 bajtów i żebyśmy nie wyszli poza ekran.
  107. JE txtloop ;Jeśli reszta z dzielenia AX z BL bedzie równa 140 ( koniec ekranu ) to skaczemy od razu do txtloop bez przesuniecia ekranu, jeśli różna to kwadrat sie przesunie w prawo. To samo dla tlewo.
  108. ADD txtWsp,2
  109. JMP txtloop
  110. tlewo:
  111. MOV AX,txtWsp
  112. MOV BL,160
  113. DIV BL
  114. CMP AH,0
  115. JE txtloop
  116. SUB txtWsp,2
  117. JMP txtloop
  118.  
  119. txtloop:
  120. Load ;zaladuj makro.
  121. CALL Kwadrat ;wywolanie kwadratu
  122.  
  123. xor ah, ah ;zerowanko AH, adresacja bezpośrednia
  124. int 16h ;przerwanie, czeka na znak z klawiatury i umieści go w AH
  125.  
  126. CMP ah,48h ;48H-strzalka w gore
  127. JZ tgora
  128. CMP ah,4Dh ;prawo
  129. JZ tprawo
  130. CMP ah,4Bh ;lewo
  131. JZ tlewo
  132. CMP ah,50h ;dol
  133. JZ tdol
  134.  
  135. mov ah,4ch ;koniec programu w tym miejscu!
  136. mov al,0
  137. int 21h
  138.  
  139. ;-----------------------/Tryb tekstowy------------------------------
  140.  
  141. ;-----------------------Tryb graficzny------------------------------
  142. graf:
  143.  
  144. MOV AX, 13h
  145. INT 10h ;uruchom tryb graficzny 13h (320x200 256 kolorów.10h przerwanie bios
  146.  
  147. mov ax, 0a000h ;0A000:0000 - pierwszy piksel (bajt)
  148. mov es, ax ;adres 1 pixela ( lewy górny róg )
  149.  
  150. gora: ;obsługa klawiszy, działają tak samo jak tgora. ekran 320x200, Jak chcesz w gore odejmuje 320, jak chce w dol dodaje 320
  151. CMP rysWsp,320
  152. JB grafloop
  153. sub rysWsp,320
  154. JMP grafloop
  155. dol:
  156. CMP rysWsp,32000 ;32000 ostatnia linia.
  157. JA grafloop
  158. add rysWsp,320
  159. JMP grafloop
  160. prawo:
  161. MOV DX,0
  162. MOV AX,rysWsp
  163. MOV BX,320
  164. DIV BX
  165. CMP DX,220
  166. JE grafloop ;IDZIE DO GRAFLOOP JESLI ROWNE PO DZIELELNIU. Jesli 220=220
  167. inc rysWsp
  168. JMP grafloop
  169. lewo:
  170. MOV DX,0
  171. MOV AX,rysWsp
  172. MOV BX,320
  173. DIV BX
  174. CMP DX,0
  175. JE grafloop
  176. dec rysWsp
  177. JMP grafloop
  178.  
  179. grafloop:
  180. Czysc ;wyczyscilismy ekran
  181. mov di,rysWsp ;wybieramy skad rysujemy kwadrat i wrzucamy do rejestru DI
  182. mov al,3 ;3-kolor kwadratu
  183. call Ryss ;funkcja rysujaca kwadrat
  184.  
  185.  
  186. xor ah, ah ;oczekiwanie na naciśnięcie klawisza, zerujemy ah
  187. int 16h
  188. CMP ah,48h ;gora
  189. JZ gora
  190. CMP ah,50h ;dol
  191. JZ dol
  192. CMP ah,4Dh ;prawo
  193. JZ prawo
  194. CMP ah,4Bh ;lewo
  195. JZ lewo
  196.  
  197. MOV AX, 3
  198. INT 10h ;powrót do trybu tekstowego
  199.  
  200. mov ah,4ch ;koniec programu
  201. mov al,0
  202. int 21h
  203.  
  204. ;-----------------------/Tryb graficzny------------------------------
  205. Ryss: ;kwadrat 100x100
  206. mov cx,100 ;Wysokosc kwadratu wrzucamy do rejestru CX
  207. petlarys:
  208. mov bx,cx ;petla wykonuje się 100 razy, żebyśmy narysowali 100x100pixeli kwadrata
  209. mov cx,100
  210. rep stosb ;przesyła bajt do bufora ekranu 100 razy
  211. mov cx,bx ;przywracamy poprzedni CX
  212. add di, 220 ;dodajemy 220, żebyśmy w nowej lini zaczeli rysować kolejną linikę kwadrata
  213. loop petlarys ;petla sie wykona 100 razy.
  214. RET
  215.  
  216. ;----------------------------/kod---------------------------------------
  217. Progr ends
  218.  
  219. dane segment
  220. rysWsp dw 320*40+100
  221. txtWsp dw 70+160*10
  222. Tekst db 13,10,'Wybierz tryb 1.Tekstowy/2.Graficzny (1/2): $'
  223. max db 2
  224. ile db ?
  225. tab db 2 dup(0)
  226. zrzut Dw 4000 dup(1443)
  227. VidOrigin DD 0B8000000H
  228. dlugosc dw 320
  229. dane ends
  230.  
  231. stosik segment stack
  232. dw 100h dup(0)
  233. szczyt Label word
  234. stosik ends
  235.  
  236. end start
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement