Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- Progr segment
- assume cs:Progr, ds:dane, ss:stosik
- start: mov ax,dane
- mov ds,ax
- mov ax,stosik
- mov ss,ax
- mov sp,offset szczyt
- mov al,10110110b ;Do AL 7,6<-10 5,4<-11(Read/Write least, then most, significant byte) 321<-011(licznik square waves) 0<-0(binarnie) (Timer Interrupt/czasomierz)
- out 43h,al ;Na port 43h wysylamy info konfiguracyjne
- in al,61h ;Do AL pobieramy wartosc z portu 61h
- or al,11b ;Na bitach 0 i 1 AL umieszczamy 11 co oznacza ze bedziemy korzystac ze speakera
- out 61h,al ;Zmieniona wartosc wciepujemy spowrotem na port 61h
- mov cx, 54d ;W CX licznik petli, tyle ile nutek mamy w zmiennej
- mov bx, offset tabulatura;Do BX przypisujemy adres zmiennej nutki
- mov dx, offset dlugosc ;Do DX przypisujemy adres zmiennej czas
- petla: ;Etykieta petelki
- push bx ;procedury call moc korzystac z tych wartosci
- push dx
- push cx
- call graj ;Wywolanie podprogramu graj
- pop cx
- pop dx ;Zbieramy ze stosu wartosc do DX (to co wczesniej zrzucilismy)
- add dx, 2d ;Dodajemy 2 do DX zeby miec adres nastepnej wartosci ze zmiennej czas
- pop bx ;dodalismy 2 bo zmienna jest typu Word (DW = 2 bajty)
- add bx, 2d ;czyli kazda wartosc zmiennej nutki/czas ma dlugosc 2 bajty
- loop petla ;Loop czyli jesli wartosc CX > 0 to skocz do etykiety petla
- in al,61h ;wczytujemy znowu wartosc z portu 61h do AL
- and al,11111100b ;maskujemy, 00 na koncu przerywa dzwieki ze speakera
- out 61h,al ;no i zwracamy ta zmieniona wartosc na port 61h
- mov ah,4ch
- mov al,0h
- int 21h
- graj:
- mov bx, [bx] ;Do BX przypisujemy wartosc spod adresu BX
- mov al,bl ;Na port 42h wysylamy nute ktora znajduje sie w BX,
- out 42h,al ;robimy to w porcjach 8 bitowych najpierw BL,
- mov al,bh ;potem BH, bo magistrala 8 bitowa
- out 42h,al
- mov bx, dx ;W DX znajduje sie czas trwania dzwieku
- mov cx, [bx] ;do CX przypisujemy wartosc spod adresu BX bo przerwanie 15h korzysta z CX
- mov ah, 86h ;te dwa kolejne wiersze to delay (czyli ten czas trwania dzwieku)
- int 15h
- ret ;powrot z procedurki
- Progr ends
- dane segment
- ;nasze nutki czyli te wartosci przez ktore trzeba podzielic czestotliwosc zegara 1193181/f
- tabulatura dw 3045,2712,3045,3620,3045,2712,3045,3620,2032,18,2032
- dw 2416,18,2416,2280,18,2280,3045,2712,18,2712,2280,2416,2712
- dw 3045,2712,3045,3620,2712,18,2712,2280,2416,2712
- dw 3045,2712,3045,3620,2032,18,2032,1708,2032,2416
- dw 2280,1810,2280,3045,3620,3045,3413,4062,4561,4561
- ;czas czyli 32 - cala nuta, 16 - polnuta, 12 - cwierc_kropka, 8 - osemka...
- dlugosc dw 6,3,5,14,6,3,5,14,7,1,5
- dw 7,1,5,7,1,5,14,7,1,5,6,3,5
- dw 6,3,5,14,7,1,5,6,3,5
- dw 6,3,5,14,7,1,5,6,3,5
- dw 12,10,6,3,5,6,3,5,12,5
- dane ends
- stosik segment
- dw 100h dup(0)
- szczyt Label word
- stosik ends
- end start
Add Comment
Please, Sign In to add comment