Advertisement
Guest User

Untitled

a guest
Jan 23rd, 2018
88
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 7.19 KB | None | 0 0
  1. kod segment
  2.  
  3. assume cs:kod,ss:stosik,ds:dane
  4.  
  5. start:
  6. mov ax,dane
  7. mov ds,ax
  8. mov ax,stosik
  9. mov ss,ax
  10. mov sp,offset szczyt
  11.  
  12. ;czyszczenie ekranu
  13. mov ah,0
  14. mov al,03h
  15. int 10h
  16.  
  17.  
  18.  
  19. mov ah,62h ;wywolanie przerwania ktore wrzuca do bx offset prefiksu PSP
  20. int 21h
  21. mov es,bx
  22. mov al,es:[0080h] ;przekazanie ilosci znakow parametru do AL
  23. mov cl,al
  24. mov si,0 ;ustawiamy SI na 0, zeby czytac od poczatku parametru
  25. dec cl ;dwa ostatnie znaki parametru to znak 10 i 13 w ascii, czyli enter, musimy sie ich pozbyc
  26. dec cl
  27. cmp al,2 ;jesli parametr ma 2 lub mniej znakow, wtedy wyswietlamy komunikat o braku parametru
  28. jbe brakParametru
  29.  
  30. przepisywanie:
  31. mov al,es:[0081h+si+1] ;przekazanie znakow z bufora do al. Zaczynamy od 82, bo 81 to spacja po nazwie pliku
  32. lea bx,nazwa ;offset zmiennej 'nazwa' do bx
  33. mov ds:[bx+si],al ;przekazanie znaku do zmiennej lancuchowej
  34. cmp cl,0; porownanie rejestru CL z 0
  35. je end_przepisywanie; jesli CL=0 to skocz do zakoncz przepisywanie
  36. dec cl; zmniejsz wartosc CL o jeden
  37. inc si; zwieksz SI o 1
  38. jmp przepisywanie;
  39.  
  40. brakParametru:
  41. lea dx,napis1;
  42. call naekran;
  43. jmp kbhit;
  44.  
  45. end_przepisywanie:
  46. mov al,03h ;czyszczenie ekranu
  47. int 10h
  48.  
  49. call otworz_plik;
  50. lea dx,napis
  51. call naekran;
  52.  
  53.  
  54. melodia:
  55. call czytaj_z_pliku
  56. lea bx,bufor ;przeniesienie offsetu 3 znakowego bufora do BX
  57. mov dl,ds:[bx+0] ;znak pierwszy odpowiada za nute
  58. cmp dl,'W' ;jesli nuta jest 'W' oznacza to koniec melodii i konczy program
  59. je exit ;skok do zakonczenia programu
  60.  
  61. ; Przerwanie melodii po wcisnieciu dowolnego klawisza
  62. mov ah,0Bh
  63. int 21h ;przerwanie, ktore sprawdza, czy zostal wcisniety jakis klawisz i przechowuje ta informacje w AL
  64. cmp al,0 ;jesli AL nie jest puste, oznacza to, ze zostal wcisniety jakis klawisz
  65. jne exit; ;warunkowy skok do zakonczenia programu
  66. jmp nuty ;w przeciwnym wypadku przechodzi do odegrania nuty
  67.  
  68. exit:
  69. call zamknij_plik;
  70. mov ah,4ch
  71. mov al,00h
  72. int 21h ;wywolanie przerwania konczacego program
  73.  
  74. nuty: cmp dl,'C'
  75. je dojump
  76. cmp dl,'D'
  77. je rejump
  78. cmp dl,'E'
  79. je mijump
  80. cmp dl,'F'
  81. je fajump
  82. cmp dl,'G'
  83. je sojump
  84. cmp dl,'A'
  85. je lajump
  86. cmp dl,'H'
  87. je zijump
  88. cmp dl,'c'
  89. je cisjump
  90. cmp dl,'d'
  91. je disjump
  92. cmp dl,'f'
  93. je fisjump
  94. cmp dl,'g'
  95. je gisjump
  96. cmp dl,'a'
  97. je aisjump
  98. mov ton,1
  99. jmp graj
  100.  
  101. dojump:jmp do ;Wszystkie ponizsze skoki sa tylko po to, bo skoki maja okreslony dystans, a te powyzsze sa za dalekie i sie nie kompiluje
  102. aisjump:jmp ais
  103. gisjump:jmp gis
  104. fisjump:jmp fis
  105. disjump:jmp dis
  106. cisjump:jmp cis
  107. zijump:jmp zi
  108. lajump:jmp la
  109. sojump:jmp so
  110. fajump:jmp fa
  111. mijump:jmp mi
  112. rejump:jmp re
  113.  
  114. ;odczytanie drugiego znaku - oktawy
  115. graj: lea bx,bufor
  116. mov cl,ds:[bx+1] ;znak drugi odpowiada za oktawe
  117. sub cl,30h ;konwersja ze znaku ascii na liczbe
  118.  
  119. shr ton,cl ;zmniejszamy ton, czyli dzielnik czestotliwosci. Zmniejszajac dzielnik, zwiekszamy wynik.
  120.  
  121. ;odczytanie trzeciego znaku - czasu trwania dzwieku/pauzy
  122. lea bx,bufor
  123. mov cl,ds:[bx+2] ;znak trzeci odpowiada za czas
  124. sub cl,30h ;konwersja z ascii na liczbe
  125. mov ch,0 ;czas moze byc liczba od 0 do 9, wiec rejestr CH powinien byc pusty. Zerujemy go, zeby miec pewnosc
  126. mov czas,cl ;przenosimy informacje o czasie z rejestru CX do zmiennej
  127.  
  128. call play;
  129. jmp melodia;
  130.  
  131. do: mov ax,TC ;nie mozna przenosic bezposrednio z jednej zmiennej do drugiej, wiec wspomagamy sie rejestrem
  132. mov ton,ax
  133. jmp graj
  134. re: mov ax,TD
  135. mov ton,ax
  136. jmp graj
  137. mi: mov ax,TE
  138. mov ton,ax
  139. jmp graj
  140. fa: mov ax,TF
  141. mov ton,ax
  142. jmp graj
  143. so: mov ax,TG
  144. mov ton,ax
  145. jmp graj
  146. la: mov ax,TA
  147. mov ton,ax
  148. jmp graj
  149. zi: mov ax,TH
  150. mov ton,ax
  151. jmp graj
  152. cis: mov ax,TCis
  153. mov ton,ax
  154. jmp graj
  155. dis: mov ax,TDis
  156. mov ton,ax
  157. jmp graj
  158. fis: mov ax,TFis
  159. mov ton,ax
  160. jmp graj
  161. gis: mov ax,TGis
  162. mov ton,ax
  163. jmp graj
  164. ais: mov ax,TAis
  165. mov ton,ax
  166. jmp graj
  167.  
  168.  
  169. naekran:
  170. mov ah,09h;Funkcja wypisująca na ekran napis o adresie zawartym w rejestrze DX
  171. int 21h;Wywołanie przerwania DOSa z funkcją 09H
  172. ret;Powrót z procedury
  173.  
  174.  
  175. brak_pliku:
  176. lea dx,napis2 ;przeniesienie offsetu napisu do rejestru DX
  177. call naekran ;wyswietlenie napisu
  178.  
  179. kbhit: mov ah,0Bh ; Ta czesc programu zatrzymuje go zaraz po jego zakonczeniu, abys my mogli zobaczyc to, co wyswietlil na ekranie. Bedzie sie zapetlac, dopoki nie nacisniemy jakiegos przycisku
  180. int 21h ;funkcja sprawdzająca czy jakikolwiek klawisz został naciśnięty
  181. cmp al,0 ;jezeli jakis przycisk zostal nacisniety, to w AL bedzie wartosc rozna od 0
  182. je kbhit ;jeżeli wynik jest zerem to powróć do etykiety KBHIT
  183. jmp exit ;jeżeli klawisz został naciśnięty to skocz bezwarunkowo do zakonczenia programu
  184.  
  185.  
  186. otworz_plik:
  187. mov ah,3dh ;funkcja przerwania 21H otwierajaca plik
  188. mov al,0 ;otwarcie tylko do czytania
  189. mov dx,offset nazwa ;nazwa pliku ktory ma byc otwarty
  190. int 21h
  191. jc brak_pliku ;jeżeli przerwanie zwróciło błąd to skocz do procedury brak_pliku
  192. mov uchwytPliku,ax ;zapisanie uchwytu pliku do zmiennej uchwytPliku
  193. ret
  194.  
  195.  
  196. zamknij_plik:
  197. mov ah,3Eh ;funkcja przerwania 21H zamykajaca plik
  198. mov bx,uchwytPliku ;uchwyt pliku, ktory ma zostac zamkniety
  199. int 21h
  200. ret
  201.  
  202.  
  203. czytaj_z_pliku:
  204. push cx
  205. push dx
  206. mov ah,3Fh ;funkcja przerwania 21H czytajaca z pliku
  207. mov bx,uchwytPliku ;uchwyt pliku, ktory ma byc otwarty
  208. mov cx,3 ;liczba bajtow do przeczytania. 3, bo kazdy dzwiek sklada sie z 3 znakow
  209. lea dx,bufor
  210. int 21h
  211. pop dx
  212. pop cx
  213. ret
  214.  
  215.  
  216. sound:
  217. mov ax,ton
  218. mov dx,42h
  219. out dx,al ;wysylanie zawartosci AL do portu 42h, ktory odpowiada za glosnik. Innymi slowy - generowanie dzwieku
  220. mov al,ah
  221. out dx,al ; tutaj i wyzej mamy do czynienia z ukladem 8253
  222.  
  223. ;zalaczenie glosnika
  224. mov dx,61h
  225. in al,dx ; pobranie zawartosci portu 61h do rejestru AL
  226. or al,00000011B ; maska or (ustawienie najmlodszych bitow na 1);
  227. out dx,al ; wysłanie zawartości rejestru AL do portu DX
  228. ret ; w powyzszych rozkazach mamy do czynienia z ukladem 8255
  229.  
  230.  
  231. ;Wylaczenie glosnika
  232. nosound:
  233. mov dx,61h
  234. in al,dx ;pobranie zawartosci portu 61h do rejestru AL
  235. and al,11111100B ;maska and (ustawienie najmlodszych bitow na 0);
  236. out dx,al;
  237. ret
  238.  
  239.  
  240. play:
  241. call sound ;wlaczenie glosnika
  242. push cx
  243. push dx
  244. mov cl,czas ;ustawianie wiekszej czesci czasu na czas trwania dzwieku
  245. mov dx,0 ;ustawianie mniejszej czesci czasu na 0
  246. mov ah,86h ;funkcja ktora nic nie robi przez CX:DX mikrosekund
  247. int 15h
  248. call nosound ;wylaczenie glosnika
  249. pop dx
  250. pop cx
  251. ret
  252.  
  253.  
  254.  
  255. kod ends;
  256.  
  257.  
  258. dane segment
  259.  
  260. ton dw 0
  261. czas db 0
  262. uchwytPliku dw 0
  263.  
  264. ;plik
  265. bufor db 3 dup(0)
  266.  
  267. nazwa db 0,0,0,0,0,0,0,0,0,0,0,0,0; Nazwa pliku zakonczona #0
  268.  
  269. NAPIS DB '* MUZYKA Z PLIKU *$';
  270. napis1 DB 'Podaj nazwe pliku w parametrze! ',10,13,'$' ;
  271. Napis2 db ' Plik nie istnieje !!!$';
  272.  
  273. TC dw 36061; 1.19MHz/33Hz
  274. TD dw 32162; 1.19MHz/37Hz
  275. TE dw 29024; 1.19MHz/41Hz
  276. TF dw 27045; 1.19MHz/44Hz
  277. TG dw 24286; 1.19MHz/49Hz
  278. TA dw 21636; 1.19MHz/55Hz
  279. TH dw 19194; 1.19MHz/62Hz
  280. TCis dw 34000; 1.19Mhz/35Hz
  281. TDis dw 30512; 1.19Mhz/39Hz
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement