Pascal Music

Music

Unit Music;

InterFace

TYPE HSC_Song = RECORD
                  Song     : POINTER;
                  SongSize : WORD;
                  FileName : STRING;
                  SongOK   : BOOLEAN;
                END;

PROCEDURE _HscPlayer;
PROCEDURE StartMusic (Song : POINTER; Polling, OldIRQ : BOOLEAN);
PROCEDURE PollMusic;
PROCEDURE StopMusic;
PROCEDURE FadeMusic;
FUNCTION  DetectAdlib (SuggestedPort : WORD) : WORD;
PROCEDURE ToggleRasterBar;
PROCEDURE SetUserIRQ (Link : BOOLEAN; Routine : POINTER);
PROCEDURE GetPlayerState (VAR Destination);
PROCEDURE LoadSong (VAR Dest : HSC_Song);
PROCEDURE ClearSong (VAR Dest : HSC_Song);

IMPLEMENTATION

{$L HSCOBJ.OBJ}
PROCEDURE _HscPlayer; EXTERNAL;

PROCEDURE StartMusic (Song : POINTER; Polling, OldIRQ : BOOLEAN); ASSEMBLER;
  ASM
    MOV  AH,0
    MOV  BL,Polling
    MOV  BH,OldIRQ
    CMP  BH,1
    JE   @Invert
    MOV  BH,1
    JMP  @GoOn
  @Invert:
    XOR  BH,BH
  @GoOn:
    LES  SI,DWORD PTR Song
    CALL _HscPlayer
  END;

PROCEDURE PollMusic; ASSEMBLER;
  ASM
    MOV  AH,1
    CALL _HscPlayer
  END;

PROCEDURE StopMusic; ASSEMBLER;
  ASM
    MOV  AH,2
    CALL _HscPlayer
  END;

PROCEDURE FadeMusic; ASSEMBLER;
  ASM
    MOV  AH,3
    CALL _HscPlayer
  END;

FUNCTION  DetectAdlib (SuggestedPort : WORD) : WORD; ASSEMBLER;
  ASM
    MOV  AH,4
    MOV  BX,SuggestedPort
    CALL _HscPlayer
    JNC  @GoOn
    MOV  AX,0FFh
  @GoOn:
  END;

PROCEDURE ToggleRasterBar; ASSEMBLER;
  ASM
    MOV  AH,5
    CALL _HscPlayer
  END;

PROCEDURE SetUserIRQ (Link : BOOLEAN; Routine : POINTER); ASSEMBLER;
  ASM
    PUSH DS
    MOV  AH,6
    MOV  BL,Link
    LDS  DX,DWORD PTR Routine
    CALL _HscPlayer
    POP  DS
  END;

PROCEDURE GetPlayerState (VAR Destination); ASSEMBLER;
  ASM
    MOV  AH,7
    LES  SI,DWORD PTR Destination
    CALL _HscPlayer
  END;

PROCEDURE LoadSong (VAR Dest : HSC_Song);
  VAR F : FILE;
  BEGIN
    ASSIGN (F,Dest.Filename);
    {$I-} RESET (F,1); {$I+}
    IF IORESULT <> 0
      THEN Dest.SongOK := FALSE
      ELSE
        BEGIN
          Dest.SongSize := FILESIZE (F);
          GETMEM (Dest.Song,Dest.SongSize);
          BLOCKREAD (F,Dest.Song^,Dest.SongSize);
          Dest.SongOK := TRUE;
          CLOSE (F)
        END
  END;

PROCEDURE ClearSong (VAR Dest : HSC_Song);
  BEGIN
    Dest.SongOK := FALSE;
    FREEMEM (Dest.Song,Dest.SongSize);
    Dest.SongSize := 0
  END;

End.