Pascal Music
Pascal
Download (.zip)
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.
|