home *** CD-ROM | disk | FTP | other *** search
/ modiromppu / modiromppu.iso / PROGRAMS / ORGPACKS / SNGPLY10.ZIP / PLAYMUS.PAS < prev    next >
Pascal/Delphi Source File  |  1997-01-01  |  5KB  |  271 lines

  1. {$A+,B-,D+,E+,F-,G+,I+,L+,N-,O-,P-,Q-,R-,S+,T-,V+,X+}
  2. {$M 16384,0,655360}
  3.  
  4. Program PlayMusic;   {By Bugsy of OBSESSION 1994 FREEWARE}
  5.  
  6. Uses
  7.   Crt;
  8.  
  9. Type
  10.   TSongBuf   = Array [1..$FFFF] Of Byte;
  11.  
  12.   THeaderRec = Record
  13.     IDWord1    ,
  14.     IDWord2    ,
  15.     SongLength ,
  16.     SongStart  ,
  17.     SongLoop   : Word;
  18.     DelayStart : Byte;
  19.     Compressed : Boolean;
  20.   End;
  21.  
  22. Var
  23.   DelayCt    : Byte;
  24.   SongSeg    ,
  25.   NodePos    : Word;
  26.   SongPtr    : ^TSongBuf;
  27.   HeaderRec  : THeaderRec;
  28.  
  29.  
  30. Procedure OutAdlib; Assembler;
  31. ASM
  32.   Push    ax
  33.   Push    dx
  34.   Mov     dx, 388h
  35.   Xchg    al, ah
  36.   Out     dx, al
  37.   Inc     dx
  38.   In      al, dx
  39.   In      al, dx
  40.   In      al, dx
  41.   In      al, dx
  42.   In      al, dx
  43.   In      al, dx
  44.   In      al, dx
  45.   Mov     al, ah
  46.   Out     dx, al
  47.   In      al, dx
  48.   In      al, dx
  49.   In      al, dx
  50.   In      al, dx
  51.   In      al, dx
  52.   In      al, dx
  53.   In      al, dx
  54.   In      al, dx
  55.   In      al, dx
  56.   In      al, dx
  57.   In      al, dx
  58.   In      al, dx
  59.   In      al, dx
  60.   In      al, dx
  61.   In      al, dx
  62.   In      al, dx
  63.   In      al, dx
  64.   In      al, dx
  65.   In      al, dx
  66.   In      al, dx
  67.   In      al, dx
  68.   In      al, dx
  69.   In      al, dx
  70.   In      al, dx
  71.   In      al, dx
  72.   In      al, dx
  73.   In      al, dx
  74.   In      al, dx
  75.   In      al, dx
  76.   In      al, dx
  77.   Pop     dx
  78.   Pop     ax
  79. End;
  80.  
  81. Procedure InitAdlib; Assembler;
  82. Asm
  83.   Mov     cx, 0F0h
  84.   Mov     ax, 1000h
  85. @Loop_1:
  86.   Call    OutAdlib
  87.   Inc     ah
  88.   Loop    @Loop_1
  89.  
  90.   Mov     cx, 20h
  91.   Mov     ax, 403Fh
  92. @Loop_2:
  93.   Call    OutAdlib
  94.   Inc     ah
  95.   Loop    @Loop_2
  96.  
  97.   Mov     cx, 0A0h
  98.   Mov     ax, 6000h
  99. @Loop_3:
  100.   Call    OutAdlib
  101.   Inc     ah
  102.   Loop    @Loop_3
  103.  
  104.   Mov     ax, 120h
  105.   Call    OutAdlib
  106.  
  107.   Mov     ax, 0800h
  108.   Call    OutAdlib
  109.  
  110.   Mov     ax, 0BD00h
  111.   Call    OutAdlib
  112.  
  113.   Mov     cx, 9
  114.   Xor     di, di
  115. @Loop_4:
  116.   Push    cx
  117.   Xor     ax, ax
  118.   Mov     bx, di
  119.   Mov     bh, ah
  120.   Mov     ah, 0A0h
  121.   Add     ah, bl
  122.   Call    OutAdlib
  123.  
  124.   Mov     al, bh
  125.   Add     ah, 10h
  126.   Call    OutAdlib
  127.  
  128.   Inc     di
  129.   Pop     cx
  130.   Loop    @Loop_4
  131. End;
  132.  
  133. Procedure PlayNote; Assembler;
  134. Asm
  135.   Push    ax
  136.   Push    bx
  137.   Push    ES
  138.   Mov     ax, SongSeg
  139.   Mov     ES, ax
  140.  
  141.   Cmp     HeaderRec.Compressed, True
  142.   Jne      @NotCompressed
  143.  
  144.   Dec     DelayCt
  145.   Cmp     DelayCt, 0
  146.   Jne     @DelayNOTDone
  147.  
  148. @NotCompressed:
  149.   Mov     bx, NodePos
  150.  
  151. @NextCommand:
  152.   Mov     ax, ES:[bx]
  153.   Add     bx, 2
  154.  
  155.   Cmp     bx, HeaderRec.SongLength
  156.   Jb      @SongNOTDone
  157.  
  158.   Mov     bx, HeaderRec.SongLoop
  159.   Jmp     @NextCommand
  160.  
  161. @SongNOTDone:
  162.  
  163.   Cmp     ah, 0
  164.   Je      @RowDone
  165.  
  166.   Call    OutAdlib
  167.   Jmp     @NextCommand
  168.  
  169. @RowDone:
  170.   Mov     DelayCt, al
  171.   Mov     NodePos, bx
  172.  
  173. @DelayNOTDone:
  174.   Pop     ES
  175.   Pop     bx
  176.   Pop     ax
  177. End;
  178.  
  179.  
  180. Procedure WaitRetrace; Assembler;
  181. Asm
  182.   Mov     dx, 3DAh
  183. @NoRetrace:
  184.   In      al, dx
  185.   Test    al, 8
  186.   Jz      @NoRetrace
  187.  
  188. @Retrace:
  189.   In      al, dx
  190.   test    al, 8
  191.   jnz     @Retrace
  192. End;
  193.  
  194. Procedure PlaySongPas;
  195. Var
  196.   Ct : Word;
  197.  
  198. Begin
  199.   Repeat
  200.     PlayNote;
  201.     WaitRetrace;
  202.     GotoXY (1, WhereY-1);
  203.     WriteLn ('Music pos : ',NodePos,'   ');
  204.   Until Port[$60] = 1;     {ESC}
  205.   Readkey;
  206. End;
  207.  
  208. Procedure Error (Err : Byte);
  209. Begin
  210.   Write ('ERROR (',Err,') : ');
  211.   Case Err Of
  212.     1 : WriteLn ('USAGE Playmus filename.ext');
  213.     2 : WriteLn ('File not found');
  214.     3 : WriteLn ('Can''t read from file');
  215.     4 : WriteLn ('Unknown file format');
  216.     5 : WriteLn ('Not enough memory');
  217.   Else
  218.     WriteLn ('Unknown, programmer is a jerk !');
  219.   End;
  220.   Halt (Err);
  221. End;
  222.  
  223. Procedure LoadSong;
  224. Var
  225.   ReadCt     : Word;
  226.   InFile     : File;
  227.   HeaderFile : File Of THeaderRec;
  228.  
  229. Begin
  230.   If ParamCount <> 1 Then Error (1);
  231.   Assign (HeaderFile, ParamStr(1));
  232.   {$I-}
  233.   Reset(HeaderFile);
  234.   If IOResult <> 0 Then Error(2);
  235.   Read(HeaderFile, HeaderRec);
  236.   If IOResult <> 0 Then Error(3);
  237.   Close(HeaderFile);
  238.  
  239.   New (SongPtr);
  240.   If SongPtr = Nil Then Error(5);
  241.   SongSeg := Seg (SongPtr^);
  242.  
  243.   Assign (InFile, ParamStr(1));
  244.   Reset (InFile,1);
  245.   BlockRead (InFile,SongPtr^,$FFFF, ReadCt);
  246.   If IOResult <> 0 Then Error(3);
  247.   Close (InFile);
  248.   {$I+}
  249.  
  250.   With HeaderRec Do Begin
  251.     If (IDWord1 <> $624F) OR (IDWord2 <> $4D73) Then Error (4);
  252.     NodePos := SongStart + Sizeof(THeaderRec);
  253.     DelayCt := DelayStart;
  254.   End;
  255.   Write ('Type      : ');
  256.   If HeaderRec.Compressed Then WriteLn ('Compressed')
  257.   Else WriteLn ('Uncompressed');
  258.   WriteLn;
  259. End;
  260.  
  261. Begin
  262.   WriteLn;
  263.   WriteLn ('Music player v 1.0 by BUGSY of OBSESSION  FREEWARE 1994');
  264.   WriteLn;
  265.  
  266.   LoadSong;
  267.   InitAdlib;
  268.   PlaySongPas;
  269.   InitAdlib;
  270. End.
  271.