home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Intermedia 1998 January
/
inter1_98.iso
/
www
/
rozi
/
CMF.ZIP
/
CMF.PAS
next >
Wrap
Pascal/Delphi Source File
|
1996-01-22
|
9KB
|
399 lines
unit CMF;
interface
type CMozliweBledy=(COk,
CMaloPamieci,
CBladZwalniania,
CNieInstalowany,
CBrakPlikuCMF,
CZlyNaglowek,
CZaDuzoInstr,
CAktywnyUtwor,
CNieGral,
CNieByloPauzy);
var CMFStatus:byte;
CMF_blad:CMozliweBledy;
CSBFMZainstalowany:boolean;
procedure CInicjalizujSBFM;
function CNumerWersjiSBFM:word;
procedure CUstawBajtStatusowySBFM;
function CZaladujPlikCMF(spec:string):pointer;
procedure CUstawInstrumenty(start:pointer);
procedure CNastawZegarSBFM(czest:word);
procedure CTranspozycjaUtworu(polt:word);
procedure CZagrajCMF(g:pointer);
procedure CZakonczCMF;
procedure CResetujSBFM;
procedure CPauzaCMF;
procedure CWznowCMF;
procedure CZwolnijPamiecCMF(g:pointer);
function CTytulCMF(g:pointer):string;
function CKompozytorCMF(g:pointer):string;
function CKomentarzCMF(g:pointer):string;
function COpisBledu:string;
implementation
uses dos;
type Naglowek=record
Identyfikator:array[0..3] of char;
Wersja :word;
Poloz_Instr :word;
Poloz_Muz :word;
Cwiercnuta :word;
Czestotliwosc:word;
Poloz_Tytulu :word;
Poloz_Kompoz :word;
Poloz_Koment :word;
Tab_kanalow :array[0..15] of char;
Instrumentow :word;
Podst_Tempo :word;
end;
var Int_CMF:byte;
CStaraProcWyjscia:pointer;
function Istnieje(Plik:string):boolean;
var f:file;
begin
assign(f,Plik);
{$I-}
reset(f);
close(f);
{$I+}
Istnieje:=(IOresult=0)
end;
procedure Zarezerwuj_pamiec(var gdzie:pointer;ile:longint);
var r:registers;
ilosc:word;
begin
ilosc:=(ile+15) shr 4;
r.ah:=$48;
r.bx:=ilosc;
MsDos(r);
if (r.bx<>ilosc) then CMF_blad:=CMaloPamieci
else begin
CMF_blad:=COk;
gdzie:=ptr(r.ax,0)
end
end;
procedure Zwolnij_pamiec(gdzie:pointer);
var r:registers;
begin
r.ah:=$49;
r.es:=seg(gdzie^);
msdos(r);
if (r.ax=7)or(r.ax=9) then CMF_blad:=CBladZwalniania
end;
procedure CInicjalizujSBFM;
function Jest_sygnatura(p:pointer):boolean;
type Sign=array[0..4] of char;
const Znak:Sign='FMDRV';
begin
Jest_sygnatura:=(Sign(p^)=Znak)
end;
var przerwanie:byte;
wskaznik:pointer;
rej:registers;
begin
CSBFMZainstalowany:=false;
przerwanie:=$7F;
repeat
inc(przerwanie);
getintvec(przerwanie,wskaznik);
wskaznik:=ptr(seg(wskaznik^),$103);
until
(Jest_sygnatura(wskaznik))or(przerwanie=$C0);
if Jest_sygnatura(wskaznik)
then
Int_CMF:=przerwanie
else
CMF_blad:=CNieInstalowany;
if przerwanie=$C0 then exit;
CSBFMZainstalowany:=true;
rej.bx:=8;
intr(Int_CMF,rej);
if rej.ax<>0 then begin
CMF_blad:=CAktywnyUtwor;
exit
end
else CMF_blad:=COk
end;
function CNumerWersjiSBFM:word;
var
rej:registers;
begin
rej.bx:=0;
intr(Int_CMF,rej);
CNumerWersjiSBFM:=rej.ax
end;
procedure CUstawBajtStatusowySBFM;
var
rej:registers;
begin
rej.bx:=1;
rej.dx:=seg(CMFStatus);
rej.ax:=ofs(CMFStatus);
intr(Int_CMF,rej)
end;
function CZaladujPlikCMF(spec:string):pointer;
var
f:file;
rozmiar_pliku,blokow,wynik:word;
wsk,miejsce:pointer;
ident:string[4];
begin
if not(Istnieje(spec)) then
begin
CMF_blad:=CBrakPlikuCMF;
exit
end;
assign(f,spec);
reset(f,1);
ident[0]:=#4;
blockread(f,ident[1],4);
seek(f,0);
if ident<>'CTMF' then
begin
close(f);
CMF_Blad:=CZlyNaglowek;
exit
end;
rozmiar_pliku:=filesize(f);
Zarezerwuj_pamiec(wsk,rozmiar_pliku);
if CMF_blad<>COk then
begin
close(f);
exit
end;
blokow:=0;
repeat
miejsce:=Ptr(seg(wsk^)+blokow*4096,ofs(wsk^));
blockread(f,miejsce^,$FFFF,wynik);
Inc(Blokow)
until wynik=0;
close(f);
CZaladujPlikCMF:=wsk;
CMF_blad:=COk
end;
procedure CUstawInstrumenty(start:pointer);
var
rej:registers;
begin
if Naglowek(start^).Instrumentow>128
then begin
CMF_Blad:=CZaDuzoInstr;
exit
end;
rej.bx:=2;
rej.cx:=Naglowek(start^).Instrumentow;
rej.dx:=seg(start^);
rej.ax:=ofs(start^)+Naglowek(start^).Poloz_instr;
intr(Int_CMF,rej)
end;
procedure CNastawZegarSBFM(czest:word);
var
rej:registers;
begin
rej.bx:=4;
rej.ax:=1193180 div czest;
intr(Int_CMF,rej)
end;
procedure CTranspozycjaUtworu(polt:word);
var
rej:registers;
begin
rej.bx:=5;
rej.bx:=polt;
intr(Int_CMF,rej)
end;
procedure CZagrajCMF(g:pointer);
var rej:registers;
begin
CNastawZegarSBFM(Naglowek(g^).Czestotliwosc);
CUstawInstrumenty(g);
if CMF_blad<>COk then exit;
rej.bx:=6;
rej.dx:=seg(g^);
rej.ax:=ofs(g^)+Naglowek(g^).Poloz_muz;
intr(Int_CMF,rej);
if rej.ax<>0 then CMF_blad:=CAktywnyUtwor
end;
procedure CZakonczCMF;
var
rej:registers;
begin
rej.bx:=7;
intr(Int_CMF,rej);
if rej.ax<>0 then CMF_blad:=CNieGral
end;
procedure CResetujSBFM;
var
rej:registers;
begin
rej.bx:=8;
intr(Int_CMF,rej);
if rej.ax<>0 then CMF_blad:=CAktywnyUtwor
else CMF_blad:=COk
end;
procedure CPauzaCMF;
var
rej:registers;
begin
rej.bx:=9;
intr(Int_CMF,rej);
if rej.ax<>0 then CMF_blad:=CNieGral
else CMF_blad:=COk
end;
procedure CWznowCMF;
var
rej:registers;
begin
rej.bx:=10;
intr(Int_CMF,rej);
if rej.ax<>0 then CMF_blad:=CNieGral
else CMF_blad:=COk
end;
procedure CZwolnijPamiecCMF(g:pointer);
begin
Zwolnij_pamiec(g)
end;
function CTytulCMF(g:pointer):string;
var
rob:string;
licz:byte;
pol_t_s,pol_t_o:word;
begin
rob:='';
if Naglowek(g^).Poloz_tytulu>0
then begin
pol_t_s:=seg(g^);
pol_t_o:=ofs(g^);
pol_t_o:=pol_t_o+Naglowek(g^).Poloz_tytulu;
licz:=0;
repeat
rob:=rob+chr(Mem[pol_t_s:pol_t_o+licz]);
inc(licz)
until
chr(Mem[pol_t_s:pol_t_o+licz])=#0
end;
CTytulCMF:=rob
end;
function CKompozytorCMF(g:pointer):string;
var
rob:string;
licz:byte;
pol_k_s,pol_k_o:word;
begin
rob:='';
if Naglowek(g^).Poloz_kompoz>0
then begin
pol_k_s:=seg(g^);
pol_k_o:=ofs(g^);
pol_k_o:=pol_k_o+Naglowek(g^).Poloz_kompoz;
licz:=0;
repeat
rob:=rob+chr(Mem[pol_k_s:pol_k_o+licz]);
inc(licz)
until
chr(Mem[pol_k_s:pol_k_o+licz])=#0
end;
CKompozytorCMF:=rob
end;
function CKomentarzCMF(g:pointer):string;
var
rob:string;
licz:byte;
pol_k_s,pol_k_o:word;
begin
rob:='';
if Naglowek(g^).Poloz_koment>0
then begin
pol_k_s:=seg(g^);
pol_k_o:=ofs(g^);
pol_k_o:=pol_k_o+Naglowek(g^).Poloz_koment;
licz:=0;
repeat
rob:=rob+chr(Mem[pol_k_s:pol_k_o+licz]);
inc(licz)
until
chr(Mem[pol_k_s:pol_k_o+licz])=#0
end;
CKomentarzCMF:=rob
end;
function COpisBledu:string;
begin
case CMF_blad of
COk
:CopisBledu:='Ok';
CMaloPamieci
:CopisBledu:='BÆZd allokacji pami■ci';
CBladZwalniania
:CopisBledu:='BÆZd zwalniania pami■ci';
CNieInstalowany
:CopisBledu:='Brak sterownika SBFM';
CBrakPlikuCMF
:CopisBledu:='Brak wskazanego pliku';
CZlyNaglowek
:CopisBledu:='ZÆy nagÆúwek pliku';
CZaDuzoInstr
:CopisBledu:='Za du┐o instrumentúw';
CAktywnyUtwor
:CopisBledu:='SBFM odtwarza utwúr';
CNieGral
:CopisBledu:='Utwúr nie jest odtwarzany';
CNieByloPauzy
:CopisBledu:='Utwúr nie byÆ zatrzymany'
end
end;
{$F+}
procedure Procedura_wyjscia_CMF;
begin
if CSBFMZainstalowany then
begin
CZakonczCMF;
CResetujSBFM
end;
ExitProc:=CStaraProcWyjscia
end;
{$F-}
begin
CStaraProcWyjscia:=ExitProc;
ExitProc:=@Procedura_wyjscia_CMF;
CInicjalizujSBFM;
CMFStatus:=0;
if CMF_blad=COk then
CUstawBajtStatusowySBFM
end.