Advertisement
ItsMeLucifer

x86 Assembly - Music played from external file

Jan 16th, 2020
2,214
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. Progr           segment
  2.                 assume  cs:Progr, ds:dane, ss:stosik
  3.  
  4.  
  5. blad:
  6.                 mov dx,offset blad_odczytu
  7.                 mov ah,09h ;Zapisanie funkcji wyświetlania do rejestru ah
  8.                 int 21h
  9.                 jmp koniec
  10.  
  11.  
  12. start:          mov     ax,dane
  13.                 mov     ds,ax
  14.                 mov     ax,stosik
  15.                 mov     ss,ax
  16.                 mov     sp,offset szczyt
  17.  
  18.                 ;--------- GET A FILE
  19.  
  20.                 mov dx,offset Witaj
  21.                 mov ah,09h ;Zapisanie funkcji wyświetlania do rejestru ah
  22.                 int 21h
  23.  
  24.                 mov dx,offset max_file
  25.                 mov ax,0A00h
  26.                 int 21h
  27.  
  28.                 xor ax,ax
  29.                 xor dx,dx
  30.                 mov bl,length_file
  31.                 xor bh,bh
  32.                 mov string_file[bx],'0'
  33.  
  34.  
  35.  
  36.                 mov ax,seg string_file
  37.                     mov ds,ax
  38.                   mov dx,offset string_file     ;adres DS:DX zawiera nazw� pliku
  39.  
  40.                     mov ax,3d02h        ;Funkcja otwarcia pliku do odczytu i zapisu
  41.                     int 21h
  42.  
  43.                 jc blad
  44.  
  45.                     mov bx,ax           ;uchwyt pliku do BX
  46.  
  47.                     mov cx,0            ;pobierz d�ugo�� za pomoc� przesuwania
  48.                     mov dx,0            ;wska�nika w pliku (cx:dx to przesuni�cie od ko�ca pliku)
  49.                     mov ax,4202h        ;Funkcja przesuwania wska�nika do ko�ca pliku
  50.                     int 21h
  51.                     mov Dlugosc,ax      ;d�ugo�� pliku jest zapisana do rejestru AX przez DOS
  52.  
  53.                     mov cx,0        ;wr�� na pocz�tek pliku
  54.                     mov dx,0
  55.                     mov ax,4200h
  56.                     int 21h
  57.  
  58.                     mov dx,offset Text
  59.                     mov cx,Dlugosc
  60.                     mov ah,3fh          ;odczytaj z pliku tyle bajt�w
  61.                     int 21h             ;ile plik ma od d�ugo�ci
  62.  
  63.                     mov ah,3eh          ;zamknij plik
  64.                     int 21h
  65.  
  66.  
  67.  
  68.  
  69.               ;-------- GET A LETTER FROM THE FILE
  70.                 mov cx,[Dlugosc]
  71.  
  72.                 sprawdz:
  73.                 mov bx, [indeks]
  74.                 mov al,Text[bx]
  75.                 mov nuta[0], al
  76.                 mov dx, offset nuta
  77.                 mov ah,9h
  78.                 int 21h
  79.                 inc [indeks]
  80.  
  81.                 cmp al, '-'
  82.                 je pol
  83.                 cmp al, '='
  84.                 je cala
  85.  
  86.                 xor bx,bx
  87.                 mov bx, offset oktawa
  88.                 call start2
  89.  
  90.                 xor al,al
  91.                 loop sprawdz
  92.  
  93.                 jmp koniec
  94.  
  95.  
  96.                 pol:
  97.                 mov dlugosc_dzwieku, 3
  98.                 jmp sprawdz
  99.                 cala:
  100.                 mov dlugosc_dzwieku, 4
  101.                 jmp sprawdz
  102.                 start2:
  103.                 call getfreq
  104.                 cmp si, 50000
  105.                 je continue
  106.                 call noteon
  107.                 continue:
  108.                 mov ah, 86h
  109.                 mov cx, [dlugosc_dzwieku]
  110.                 mov dx, [dlugosc_dzwieku]
  111.                 int 15h
  112.                 call noteoff
  113.                 ret
  114.  
  115.                 ;--------- NOTE STARTER
  116.                 noteon:
  117.                 add bx, si
  118.                 mov ax, [bx] ;frequency
  119.  
  120.                 out 42h, al ;mniejszy bajt
  121.                 mov al, ah ;wiekszy bajt
  122.                 out 42h, al
  123.                 mov al, 61h ;wlacz glosnik
  124.                 mov al, 11b ;set bits 1 and 0;;tegomaniebyc
  125.                 out 61h, al ;send new value
  126.                 ret
  127.                 ;-------------------END
  128.  
  129.                 ;-------------------NOTE ENDER
  130.                 noteoff:
  131.                 mov al, 61h ;turn off note
  132.                 out 61h, al ;send new value
  133.                 ret
  134.                 ;-------------------END
  135.  
  136.  
  137.  
  138.  
  139.                 getfreq:
  140.  
  141.  
  142.  
  143.                 cmp al, 'c'
  144.                 je C
  145.                 cmp al, 'D'
  146.                 je D
  147.                 cmp al, 'E'
  148.                 je E
  149.                 cmp al, 'F'
  150.                 je F
  151.                 cmp al, 'G'
  152.                 je G
  153.                 cmp al, 'A'
  154.                 je A
  155.                 cmp al, 'H'
  156.                 je H
  157.                 cmp al, 'C'
  158.                 je BIG_C
  159.  
  160.                 cmp al, '!'
  161.                 je cis
  162.                 cmp al, '@'
  163.                 je dis
  164.                 cmp al, '$'
  165.                 je eis
  166.                 cmp al, '%'
  167.                 je fis
  168.                 cmp al, '^'
  169.                 je gis
  170.                 cmp al, '&'
  171.                 je ais
  172.  
  173.  
  174.                 cmp al, '1'
  175.                 je first
  176.                 cmp al, '2'
  177.                 je  second
  178.                 cmp al, '3'
  179.                 je third
  180.                 cmp al, '4'
  181.                 je fourth
  182.                 cmp al, '5'
  183.                 je fifth
  184.                 cmp al, '6'
  185.                 je sixth
  186.                 cmp al, '7'
  187.                 je seventh
  188.  
  189.                 cmp al, ' '
  190.                 je pauza
  191.                 cmp al, 'T'
  192.                 je t
  193.  
  194.                 pauza:
  195.                 mov si, 50000
  196.                 ret
  197.                 t:
  198.                 jmp koniec
  199.  
  200.                 _exit:
  201.                 int 20h
  202.  
  203.                 C:
  204.                 mov si,0000h
  205.                 ret
  206.  
  207.                 D:
  208.                 mov si,0002h
  209.                 ret
  210.  
  211.                 E:
  212.                 mov si, 0004h
  213.                 ret
  214.  
  215.                 F:
  216.                 mov si, 0006h
  217.                 ret
  218.  
  219.                 G:
  220.                 mov si, 0008h
  221.                 ret
  222.  
  223.                 A:
  224.                 mov si, 000ah
  225.                 ret
  226.  
  227.                 H:
  228.                 mov si, 000ch
  229.                 ret
  230.  
  231.                 BIG_C:
  232.                 mov si,000eh
  233.                 ret
  234.  
  235.                 cis:
  236.                 mov si,0010h
  237.                 ret
  238.                 dis:
  239.                 mov si, 0012h
  240.                 ret
  241.                 eis:
  242.                 mov si, 0014h
  243.                 ret
  244.                 fis:
  245.                 mov si, 0016h
  246.                 ret
  247.                 gis:
  248.                 mov si, 0018h
  249.                 ret
  250.                 ais:
  251.                 mov si, 00a0h
  252.  
  253.  
  254.                 first:
  255.                   mov si, 0
  256.                   mov bx, offset oktawa1
  257.                   jmp arrayop
  258.                 second:
  259.                   mov si, 0
  260.                   mov bx, offset oktawa2
  261.                   jmp arrayop
  262.                 third:
  263.                   mov si, 0
  264.                   mov bx, offset oktawa3
  265.                   jmp arrayop
  266.                 fourth:
  267.                   mov si, 0
  268.                   mov bx, offset oktawa4
  269.                   jmp arrayop
  270.                 fifth:
  271.                   mov si, 0
  272.                   mov bx, offset oktawa5
  273.                   jmp arrayop
  274.                 sixth:
  275.                   mov si, 0
  276.                   mov bx, offset oktawa6
  277.                   jmp arrayop
  278.                 seventh:
  279.                   mov si, 0
  280.                   mov bx, offset oktawa7
  281.                   jmp arrayop
  282.  
  283.                 arrayop:
  284.                   petla:
  285.                     mov ax, [bx]
  286.                     mov oktawa[si], ax
  287.                     add bx, 2
  288.                     add si, 2
  289.                     cmp si, 28
  290.                     jle petla
  291.                     jmp sprawdz
  292.  
  293.  
  294.  
  295.  
  296. koniec:
  297.             mov     ah,4ch
  298.             mov     al,0
  299.             int     21h
  300. Progr           ends
  301.  
  302. dane            segment
  303.         Witaj db 13,10, 'Witaj! Prosze podac nazwe pliku z ktorego odegrana zostanie melodia: ',13,10,'$'
  304.  
  305.         max_file db 42
  306.         length_file db ?
  307.         string_file db 42 dup(0)
  308.  
  309.         blad_odczytu    db 10,13,"Blad odczytu!$"
  310.         nuta db 2 dup ('$')
  311.         dlugosc_dzwieku dw 5
  312.  
  313.         indeks dw 0
  314.             Dlugosc      dw ?       ;d�ugo�� pliku jeszcze nie znana
  315.             Text db 30000 dup ('$') ;
  316.  
  317. ;;;;oktawy;;    C          D              E                  F          G             A           H            C                cis           Dis         Eis             Fis           Gis           ais
  318. oktawa1 dw (1193000/33), (1193000/37), (1193000/41), (1193000/44), (1193000/49), (1193000/55), (1193000/62), (1193000/65), (1193000/35), (1193000/39), (1193000/42), (1193000/46), (1193000/52), (1193000/58)
  319. oktawa2 dw (1193000/65), (1193000/73), (1193000/82), (1193000/87), (1193000/98), (1193000/110), (1193000/123), (1193000/131), (1193000/69), (1193000/77), (1193000/84), (1193000/92), (1193000/104), (1193000/116)
  320. oktawa3 dw (1193000/131), (1193000/147), (1193000/165), (1193000/175), (1193000/196), (1193000/220), (1193000/247), (1193000/262), (1193000/139), (1193000/156), (1193000/170), (1193000/185), (1193000/208), (1193000/233)
  321. oktawa4 dw (1193000/263), (1193000/294), (1193000/330), (1193000/349), (1193000/392), (1193000/440), (1193000/494), (1193000/523), (1193000/277), (1193000/311), (1193000/339), (1193000/370), (1193000/415), (1193000/466)
  322. oktawa5 dw (1193000/523), (1193000/587), (1193000/659), (1193000/698), (1193000/784), (1193000/880), (1193000/988), (1193000/1047), (1193000/554), (1193000/622), (1193000/678), (1193000/740), (1193000/831), (1193000/932)
  323. oktawa6 dw (1193000/1047), (1193000/1175), (1193000/1319), (1193000/1397), (1193000/1568), (1193000/1760), (1193000/1976), (1193000/2093), (1193000/1109), (1193000/1245), (1193000/1357), (1193000/1480), (1193000/1661), (1193000/1865)
  324. oktawa7 dw (1193000/2093), (1193000/2349), (1193000/2637), (1193000/2794), (1193000/3136), (1193000/3520), (1193000/3951), (1193000/4186), (1193000/2217), (1193000/2489), (1193000/2714), (1193000/2960), (1193000/3322), (1193000/3729)
  325.  
  326. oktawa dw (1193000/263), (1193000/294), (1193000/330), (1193000/349), (1193000/392), (1193000/440), (1193000/494), (1193000/523), (1193000/277), (1193000/311), (1193000/339), (1193000/370), (1193000/415), (1193000/466)
  327. ;;;;;;;;;
  328.  
  329.  
  330.  
  331.  
  332.  
  333.  
  334.  
  335. dane            ends
  336.  
  337. stosik          segment
  338.                 dw    100h dup(0)
  339. szczyt          Label word
  340. stosik          ends
  341.  
  342. end start
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement