Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- ;podzielniki czestotliwosci
- TC equ 34546; 1.19MHz/33Hz 1140000/33
- TD equ 30811; 1.19MHz/37Hz
- TE equ 27805; 1.19MHz/41Hz
- TF equ 25909; 1.19MHz/44Hz
- TG equ 23265; 1.19MHz/49Hz
- TA equ 20727; 1.19MHz/55Hz
- TH equ 18387; 1.19MHz/62Hz
- TP equ 1;pauza
- ;Q koniec melodii
- Przerwanie21 equ 21H
- Przerwanie15 equ 15H
- kod segment
- assume cs:kod,ss:stosik,ds:dane;
- ;procedury
- nuta proc;cx,dx czas := DX + (65536*CX) /1000000
- mov cx,7
- mov dx,65535
- mov ah,86h
- int Przerwanie15;czekaj
- ret
- nuta endp;
- polnuta proc
- mov cx,3
- mov dx,65535
- mov ah,86h
- int Przerwanie15
- ret
- polnuta endp;
- cwiercnuta proc
- mov cx,1
- mov dx,65535
- mov ah,86h
- int Przerwanie15
- ret
- cwiercnuta endp
- osemka proc
- mov cx,0
- mov dx,32000;
- mov ah,86h
- int Przerwanie15
- ret
- osemka endp;
- speakeron proc ;max podzielnik 65536 daje 18hz, 8253
- mov ax,frequency
- mov dx,42h ;numer portu
- out dx,al ;First operand is a port number
- mov al,ah
- out dx,al
- ;Wlaczenie glosnika
- mov dx,61h ;8255 równoległy
- in al,dx ;Input from port into AL or AX.
- or al,00000011B
- out dx,al
- ret
- endp
- ;Wylaczenie glosnika
- speakeroff proc
- mov dx,61h
- in al,dx
- and al,11111100B
- out dx,al
- ret
- endp;
- ;Odtwarzanie
- play proc
- call speakeron
- cmp czas,1
- je cala
- cmp czas,2
- je pol
- cmp czas,4
- je cwierc
- cmp czas,8
- je osem
- jmp stopplay
- cala: call nuta
- jmp stopplay
- pol: call polnuta
- jmp stopplay
- cwierc: call cwiercnuta
- jmp stopplay
- osem: call osemka
- jmp stopplay
- stopplay:call speakeroff
- ret
- endp
- start: mov ax,dane
- mov ds,ax
- mov ax,stosik
- mov ss,ax
- mov sp,offset szczyt
- mov ah,62h ;Funkcja GetPSP, parametr programu
- int Przerwanie21;Adres segmentu PSP w rejestrze BX (segment PSP to specjalny segment przechowujący dane na temat programu).
- mov es,bx
- mov si,80h
- xor ch,ch ;zeruje dla stosu
- mov cl,es:[si] ;W es:[80h] znajduje się długość 1BAJT podanego parametru.
- cmp cl,0 ;czy dlugosc =0
- je defaultName ;jak tak to domyslny
- dec cl
- inc si ;81h to spacja
- lea di,nazwaPliku ;do di offset nazwaPliku
- push cx ;ch=0,cl=dlugosc
- zapisz:
- inc si ;82h W adresach 82h-FFh znajdują się znaki ASCII parametru zakończone przez 0Dh ENTER, ENTER = 13 w ASCII
- mov al,es:[si]
- mov ds:[di],al ;zapisuje nazwe pliku w ds:[di]
- inc di
- loop zapisz ;wykona sie tyle razy ile dlugosc nazwy pliku -1
- pop cx ;dlugosc nazwy pliku ze stosu
- cmp cl,9
- jge defaultName ;jesli nazwa pliku >=9 to 'nuty.txt' zostalo nadpisane
- mov al,9
- sub al,cl
- mov cl,al
- xor ch,ch
- xor al,al
- uzupelnij: ;nadpisuje pozostala czesc 'nuty.txt'
- mov ds:[di],al
- inc di
- loop uzupelnij
- defaultName:
- lea dx,nazwaPliku ;offset nazwaPliku do ds
- mov ah,3Dh ;Otwiera plik (numer funkcji do przerwania)
- xor al,al ;prawa dla pliku 0 (odczyt)
- int Przerwanie21
- mov bx,ax ;ax uchwyt do pliku
- jnc bezBledu ;jak nie ma przeniesienia to ok
- lea dx,blad
- mov ah,09H
- int Przerwanie21
- jmp exit
- bezBledu:
- xor cx,cx
- xor dx,dx
- mov ah,42h
- mov al,2h
- int Przerwanie21 ;ustaw sie na koncu pliku
- mov dlugosc,ax ;dlugosc pliku(pozycja liczona od poczatku pliku)
- xor cx,cx
- xor dx,dx
- mov ah,42h
- xor al,al ;ustaw sie na poczatku pliku
- int Przerwanie21
- mov cx,dlugosc ;ilosc bajtow do przeczytania
- lea dx,dzwiek ;bufor
- mov ah,3FH ;czytaj do bufora
- int Przerwanie21
- mov ah,3eh ;zamknij plik
- int Przerwanie21
- lea dx,komunikatOdtw
- mov ah,09H
- int Przerwanie21
- mov di,0
- melodia: lea bx,dzwiek
- mov dl,ds:[bx+di]
- inc di
- cmp dl,'Q'
- jne czyC
- jmp exit
- czyC: cmp dl,'C'
- jne czyD
- mov frequency,TC
- jmp graj
- czyD: cmp dl,'D'
- jne czyE
- mov frequency,TD
- jmp graj
- czyE: cmp dl,'E'
- jne czyF
- mov frequency,TE
- jmp graj
- czyF: cmp dl,'F'
- jne czyG
- mov frequency,TF
- jmp graj
- czyG: cmp dl,'G'
- jne czyA
- mov frequency,TG
- jmp graj
- czyA: cmp dl,'A'
- jne czyH
- mov frequency,TA
- jmp graj
- czyH: cmp dl,'H'
- jne pauza
- mov frequency,TH
- jmp graj
- pauza: mov frequency,1
- graj: mov cl,ds:[bx+di]
- inc di
- sub cl,30h
- shr frequency,cl ;dzielenie frequencyu przez 2*oktawa
- mov cl,ds:[bx+di]
- inc di
- sub cl,30h
- mov czas,cl
- call play
- jmp melodia
- exit: mov ax,4c00h
- int Przerwanie21
- kod ends;
- dane segment
- dzwiek db 3000 dup('$')
- frequency dw 0
- czas db 0
- dlugosc dw 0
- komunikatOdtw db 'Odtwarzanie pliku: '
- nazwaPliku db 'nuty.txt'
- db 50 dup('$')
- blad db 'Brak pliku$'
- dane ends
- stosik segment stack
- dw 100h dup(0)
- szczyt label word
- stosik ends
- end start
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement