This program plays 11025 Hz samples on a SoundBlaster (compatible card). The program sends data directly to the card (and will probably not work correctly under Windows). The program assumes DMA channel 1 and baseaddress 220h. This is hardcoded in the program. Knowledge about SoundBlaster cards and DMA programming are required to change baseaddress and DMA channel.
The source and a compiled version is available for download (1524 bytes).;
; FSTsp v0.7 by Necros (aka Dodger) & Protected Christmas
;
; DESCRIPTION: a VERY small sample player
; REQUIREMENTS: Sound Blaster at 220h, DMA 1 (ask for other configurations)
; SPECIAL FEATURES: - DMA transfers
; - EMM386 not needed :-D
; - Read the sample name from the command line
; - File error detection
; - 8086 instructions
; - Play up to 64k samples!
; - 11025 Hz samples
; SIZE: 84 bytes
;
; COMPILE:
; TASM fstsp
; TLINK /t fstsp
;
; PROGRAMMER'S EMAIL:
; skoog@ibm.net ( Protected Christmas )
; fst0001@ibm.net ( Dodger )
;
IDEAL
MODEL TINY
CODESEG
ORG 100h
init:
mov ah,30h
push ax
out 02h,al ; send low offset (DMA)
out 02h,al ; send high offset (DMA)
;-- get file name --
mov bl,82h
mov dx,bx
add bl,[bx-2]
mov [byte ptr bx-1],bh ; convert to ASCIIZ
;-- open file --
mov ah,3Dh
int 21h ; ax=file handle
jc short exit ; detect file error
xchg ax,bx
;-- read sample --
not cx
xor dx,dx
pop ds
mov ah,3Fh
int 21h
xchg ax,bp
mov al,03h
out 83h,al ; send page (DMA)
;-- reset DSP --
mov dx,0226h
out dx,al ; Sup. AL=01h
dsploop1:
loop short dsploop1
dec ax
out dx,al
dsploop2:
loop short dsploop2
mov dl,2Ch
mov al,0D1h
out dx,al ; turn speaker on
mov al,49h
out 0Bh,al ; send playback code (DMA)
mov al,40h
out dx,al
wait2:
loop short wait2
mov al,0A5h ; send high byte of sampling frequency
out dx,al
wait3:
loop short wait3
mov al,14h
out dx,al ; set mode (8 bits DMA single-cycle)
xchg ax,bp
out 03h,al ; send low byte of sample length DMA
out dx,al ; send low byte of sample length DSP
mov al,ah
out 03h,al ; send high byte of sample length DMA
out dx,al ; send high byte of sample length DSP
mov al,01h
out 0Ah,al ; unmask channel 1 (DMA)
exit:
ret ; nice way to quit
END init