Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- DosIntr equ 21h
- RetToDos equ 4ch
- Ok equ 0h
- F_C equ 34828 ; (1193000/131Hz)
- F_D equ 31028
- F_E equ 27643
- F_F equ 26091
- F_G equ 23245
- F_A equ 20709
- F_H equ 18449
- F_Y equ 32873 ;cis
- F_I equ 29287 ;dis
- F_O equ 26926 ;eis
- F_J equ 24627 ;fis
- F_K equ 21940 ;gis
- F_L equ 19857 ;ais
- ;---------------------------------------------------------------
- Progr segment
- assume cs:Progr, ds:dane, ss:stosik
- ;---------------------------------------------------------------
- DisplayText MACRO TextAddress
- lea dx,TextAddress
- mov ah,09h
- int 21h
- ENDM
- ;---------------------------------------------------------------
- FixFileName MACRO
- mov bx,80h
- mov dl,es:[bx]
- xor bh,bh
- mov bl,dl
- mov byte ptr es:[bx+81h],0
- ENDM
- ;---------------------------------------------------------------
- OpenFile MACRO
- mov cx, ds
- mov bx, es
- mov ds, bx
- mov dx,82h
- mov ah,3Dh
- mov al,0
- int 21h
- mov ds,cx
- mov FILE_HOLDER,ax
- ENDM
- ;---------------------------------------------------------------
- CloseFile MACRO
- mov ah,03Eh
- mov bx,FILE_HOLDER
- int 21h
- ENDM
- ;---------------------------------------------------------------
- ReadFile MACRO
- mov bx,FILE_HOLDER
- mov cx,0
- mov dx,0
- mov ax,4202h
- int 21h
- mov FILE_LENGTH,ax
- mov cx,0
- mov dx,0
- mov ax,4200h
- int 21h
- mov dx,offset TAB_NOTES
- mov cx,FILE_LENGTH
- mov ah,3Fh
- int 21h
- ENDM
- ;---------------------------------------------------------------
- InitTimer MACRO
- mov al,10110110b
- out 43h,al
- ENDM
- ;---------------------------------------------------------------
- SpeakerOn MACRO
- in al,61h
- or al,00000011b
- out 61h,al
- ENDM
- ;---------------------------------------------------------------
- SpeakerOff MACRO
- in al,61h
- and al,11111100b
- out 61h,al
- ENDM
- ;---------------------------------------------------------------
- CalculateFreq MACRO sound, octave
- push dx
- push cx
- cmp sound,'C'
- jz note_c
- cmp sound,'D'
- jz note_d
- cmp sound,'E'
- jz note_e
- cmp sound,'F'
- jz note_f
- cmp sound,'G'
- jz note_g
- cmp sound,'H'
- jz note_h
- cmp sound,'A'
- jz note_a
- cmp sound,'P'
- jz note_pause
- jmp cf_finish
- note_c: mov dx,F_C
- jmp set_octave
- note_d: mov dx,F_D
- jmp set_octave
- note_e: mov dx,F_E
- jmp set_octave
- note_f: mov dx,F_F
- jmp set_octave
- note_g: mov dx,F_G
- jmp set_octave
- note_h: mov dx,F_H
- jmp set_octave
- note_a: mov dx,F_A
- jmp set_octave
- note_Y: mov dx,F_Y
- jmp set_octave
- note_I: mov dx,F_I
- jmp set_octave
- note_O:
- mov dx,F_O
- jmp set_octave
- note_J: mov dx,F_J
- jmp set_octave
- note_K: mov dx,F_K
- jmp set_octave
- note_L: mov dx,F_L
- jmp set_octave
- note_pause: SpeakerOff
- mov PAUSED,1
- jmp cf_finish
- set_octave: sub octave,30h
- mov cl,octave
- shr dx,cl
- mov FREQUENCY,dx
- cmp PAUSED,1
- jnz cf_finish
- SpeakerOn
- mov PAUSED,0
- cf_finish: pop cx
- pop dx
- ENDM
- ;---------------------------------------------------------------
- SetFrequency MACRO freq
- push ax
- mov ax,freq
- out 42h,al
- mov al,ah
- out 42h,al
- pop ax
- ENDM
- ;---------------------------------------------------------------
- Delay MACRO msb, lsb ;mikrosekundy na jakie ma zatrzymać się program
- mov dx,lsb
- mov cx,msb
- mov al,0
- mov ah,86h
- int 15h
- ENDM
- ;---------------------------------------------------------------
- DelayByTone MACRO tone
- push dx
- push cx
- push ax
- CMP tone,'1'
- JZ whole_tone
- CMP tone,'2'
- JZ half_tone
- CMP tone,'4'
- JZ quarter_tone
- CMP tone,'8'
- JZ quaver_tone
- JMP error_tone
- whole_tone: Delay 8,0
- JMP dbtf
- half_tone: Delay 4,0
- JMP dbtf
- quarter_tone: Delay 2,0
- JMP dbtf
- quaver_tone: Delay 1,0
- JMP dbtf
- error_tone: Delay 1,0
- dbtf: pop ax
- pop cx
- pop dx
- ENDM
- ;---------------------------------------------------------------
- start: mov ax,dane
- mov ds,ax
- mov ax,stosik
- mov ss,ax
- mov sp,offset szczyt
- FixFileName
- OpenFile
- JNC no_error ;sprawdzenie czy udało się otworzyć plik
- jmp of_error
- no_error:
- ReadFile
- CloseFile
- mov ax,FILE_LENGTH
- mov cl,3
- div cl
- mov FILE_JUMP, ax
- InitTimer
- SpeakerOn
- mov cx,FILE_JUMP
- mov bx,0
- play_music: mov bx,SONG_POINTER
- mov ah,TAB_NOTES[bx]
- add bx,FILE_JUMP
- mov al,TAB_NOTES[bx]
- CalculateFreq ah,al
- SetFrequency FREQUENCY
- add bx,FILE_JUMP
- mov al,TAB_NOTES[bx]
- DelayByTone al
- inc SONG_POINTER
- dec cx
- cmp cx,0
- jz end_music
- jmp play_music
- end_music: SpeakerOff
- jmp finish
- of_error: DisplayText TEXT_FILE_ERROR
- finish: mov ah,RetToDos
- mov al,Ok
- int DosIntr
- Progr ends
- ;---------------------------------------------------------------
- dane segment
- TEXT_FILE_ERROR db "Nie udalo sie otworzyc pliku.",10,13,"$"
- ;inne
- FILE_HOLDER dw ?
- SONG_POINTER dw 0
- FREQUENCY dw ?
- PAUSED db 0
- ;tablice nut
- FILE_LENGTH dw ?
- FILE_JUMP dw ?
- TAB_NOTES db 900 dup(0)
- dane ends
- stosik segment
- dw 100h dup(0)
- szczyt Label word
- stosik ends
- end start
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement