Sound Blaster DSP

F.25. Pascal unit a Sound Blaster DSP-jének programozására

unit dsp;

interface

type

{ Egy 64K széles bájttömb típus definiálása. }

memory = array[0..65534] of byte;

{ Mutató definiálása a 64K széles bájttömb számára. }

memptr = ^memory;

const

{ A Sound Blaster kártya rendszerinformációi. }

BaseAddr   : word = $220; { SB I/O báziscím. }

IRQnumber  : byte =  $05; { SB megszakítási vonal. }

DMAchannel : byte =  $01; { SB DMA csatornaszám. }

{ DSP parancsok. }

SetSampleRate = $40; { A mintavételezési idő beállítása. }

{ A DSP kimenetével kapcsolatos parancsok. }

SpeakerOn     = $d1; { A kimenet bekapcsolása. }

SpeakerOff    = $d3; { A kimenet kikapcsolása. }

SpeakerStatus = $d8; { A kimenet állapotának lekérdezése. }

{ Direkt módú lejátszás és felvétel. }

DirectDAC     = $10; { Direkt lejátszás (D/A konverzió). }

DirectADC     = $20; { Direkt felvétel  (A/D konverzió). }

{ A DMA átvitellel kapcsolatos parancsok. }

DSP_DMA_stop  = $d0; { A DMA átvitel felfüggesztése. }

DSP_DMA_cont  = $d4; { A DMA átvitel folytatása. }

NormalDMA_DAC = $14; { Normál 8 bites lejátszás (D/A konverzió). }

NormalDMA_ADC = $24; { Normál 8 bites felvétel  (A/D konverzió). }

{ Impulzuskód-modulált DMA átviteli parancsok. }

ADPCM4_DMA    = $74; { 4-bites ADPCM. }

ADPCM4r_DMA   = $75; { 4-bites ADPCM referenciával. }

ADPCM26_DMA   = $76; { 2.6 bites ADPCM. }

ADPCM26r_DMA  = $77; { 2.6 bites ADPCM referenciával. }

ADPCM2_DMA    = $16; { 2-bites ADPCM. }

ADPCM2r_DMA   = $17; { 2-bites ADPCM referenciával. }

GetDSPver     = $e1; { A DSP-chip verziószámának lekérdezése. }

function  DSPreset:boolean; { DSP alapállapotba hozása. }

procedure DSPwrite(DSPdata:byte); { DSP parancs/adat. }

function  DSPread:byte; { DSP adatbeolvasás. }

procedure DSPspeakerOn; { DSP kimenet bekapcsolása. }

procedure DSPspeakerOff; { DSP kimenet kikapcsolása. }

procedure Pause(Atime:word); { Várakozás. }

implementation

function DSPreset:boolean;              assembler;

asm

mov   dx,BaseAddr

add   dl,6   { $226 : DSP reset reg }

mov   al,1

out   dx,al   { dx – $226 }

mov   cx,100

rep lodsb

xor   al,al

out   dx,al   { dx – $226 }

add   dl,8

mov   cx,128

@wait1:

in    al,dx   { dx – $22e }

and   al,80h

jnz   @test2

loop  @wait1

jmp   @bad

@test2:

mov   cx,10240

sub   dl,4    { dx – $22a }

@wait2:

in    al,dx   { dx – $22a }

cmp   al,0aah

jz    @good

loop  @wait2

@bad:

xor   al,al

jmp   @exit

@good:

mov   al,1

@exit:

end;

procedure DSPwrite(DSPdata:byte);       assembler;

asm

mov   dx,BaseAddr

add   dl,0ch

@c1:

in    al,dx

and   al,80h

jnz   @c1

mov   al,DSPdata

out   dx,al

end;

function DSPread:byte;                  assembler;

asm

mov   dx,BaseAddr

add   dl,0eh

@wait:

in    al,dx

and   al,80h

jz    @wait

sub   dl,4

in    al,dx

end;

procedure DSPspeakerOn;

begin

DSPwrite(SpeakerOn);

end;

procedure DSPspeakerOff;

begin

DSPwrite(SpeakerOff);

end;

procedure Pause(Atime:word);            assembler;

asm

mov  cx,Atime

@wait:

nop

nop

loop @wait

end;

END.

Alábbi forrás alapján:

[4]   László József: Hangkártya programozása Pascal és Assembly nyelven, Computer Books, Budapest, 1999

1 hozzászólás a következőhöz: “Sound Blaster DSP

  1. Gábor szerint:

    Kedves Spiller László!

    Hagy kérdezzek a profitól, mit csinálok rosszul?
    A dsp-t rezeteltettem, mixer szintén, irq rutin rezidens, dma felprogramozva, int engedélyezve, hangerők beállítva, és … csak folyamatosan 127-es értékkel töltődik fel a puffer.
    Mit kellene még beállítani ahhoz, hogy szimpla mono ADC autoiniDMA mintavételezés működjön a mikrofon bemenetről?
    Válaszát előre is megköszönve, üdvözlettel: Gábor

Vélemény, hozzászólás?

Adatok megadása vagy bejelentkezés valamelyik ikonnal:

WordPress.com Logo

Hozzászólhat a WordPress.com felhasználói fiók használatával. Kilépés / Módosítás )

Twitter kép

Hozzászólhat a Twitter felhasználói fiók használatával. Kilépés / Módosítás )

Facebook kép

Hozzászólhat a Facebook felhasználói fiók használatával. Kilépés / Módosítás )

Google+ kép

Hozzászólhat a Google+ felhasználói fiók használatával. Kilépés / Módosítás )

Kapcsolódás: %s