사운드블라스터 음성 재생 시험

sb-voice-test.bas

원래 파일
FLAG/VOICE.BAS
날짜
1995-02-15
크기
2,089바이트, 96줄
저장 형식
CP949 텍스트를 UTF-8로 바꿈
내려받기
sb-voice-test.bas (UTF-8)

설명

사운드블라스터(포트 220h, DMA 1번)를 초기화하고 C:\FLAG\DON2.WAV를 재생합니다.
파일을 400바이트씩 문자열 배열에 읽어 들인 뒤, 배열의 물리 주소를 계산해 DMA 컨트롤러에 넘깁니다.

이 루틴은 그대로 청기백기에 들어갔습니다.
같은 폴더에 내용이 똑같은 FLAG2.BAS가 있었습니다.

소스

DECLARE SUB initvoice ()DECLARE SUB SBLCMD (N!)DECLARE FUNCTION SBLSNDCMD! (N!)DECLARE FUNCTION RDMACNT (N)DECLARE SUB sayvoc (F$)DECLARE SUB RUNDMA (APTR#, LENG, CHANN, DIR)DIM SHARED BUF(100) AS STRING * 400, VOCDSIZE, VOCDPOIN, VOCDATPHY(2), VOCDATPHYL(2), DMACHNPGE(4)DMACHNPGE(0) = &H87: DMACHNPGE(1) = &H83: DMACHNPGE(2) = &H81: DMACHNPGE(3) = &H82initvoicesayvoc "c:\FLAG\DON2.WAV"SUB initvoice OUT &H220 + 6, 1 FOR I = 0 TO 100: NEXT I OUT &H220 + 6, 0 FOR I = 0 TO 511  IF (INP(&H22E) AND &H80) <> 0 THEN   FOR J = 0 TO 511    IF INP(&H22A) = &HAA THEN GOTO OK   NEXT J  END IF NEXT I EXIT SUBOK: OUT &H21, 0 SBLCMD &HD1 SBLCMD &H40 A = 256 - (1000000 / 2900) IF A < 0 THEN A = A + 256 A = INT(A) SBLCMD AEND SUBFUNCTION RDMACNT (N) OUT &HB, 0 DMAP = N * 2 + 1 L = INP(DMAP) H = INP(DMAP) RDMACNT = L OR (H * 256)END FUNCTIONSUB RUNDMA (APTR#, LENG, CHANN, DIR) PAGE = INT(APTR# / 65536) LA = APTR# AND 255 HA = INT(APTR# / 256) AND 255 AVA = 65536 - (APTR# AND 65535) IF AVA < LENG THEN BEEP: EXIT SUB IF DIR THEN CMD = &H48 ELSE CMD = &H44 CMD = CMD + CHANN DMAP = CHANN * 2 OUT DMACHNPGE(CHANN), PAGE OUT &HC, 0 OUT DMAP, LA OUT DMAP, HA DMAP = DMAP + 1 OUT DMAP, (LENG AND 255) OUT DMAP, INT(LENG / 255) OUT &HB, CMD OUT &HA, CHANNEND SUBSUB sayvoc (F$) OPEN F$ FOR RANDOM AS #1 LEN = 200 FIELD 1, 200 AS R$ LF = LOF(1) IF LF > 40000 THEN LF = 40000 FOR I = 0 TO INT(LF / 400)  GET #1: BUF(I) = R$  GET #1: MID$(BUF(I), 201, 200) = R$ NEXT I CLOSE OF = VARPTR(BUF(0)) + 64 SG = VARSEG(BUF(0)) IF SG < 0 THEN SG = SG + 65536 IF OF < 0 THEN OF = OF + 65536 PHY# = SG * 16 + OF OUT &HA, 5 RUNDMA PHY#, LF, 1, 1 SBLCMD &H14 SBLCMD (LF AND 255) SBLCMD INT(LF / 255)END SUBSUB SBLCMD (N) IF SBLSNDCMD(N) THEN  OUT &HA, 1  NUL = INP(&H22E) END IFEND SUBFUNCTION SBLSNDCMD (N) WHILE INP(&H22C) >= &H80 Q = Q + 1: IF Q > 10000 THEN SBLSNDCMD = -1: EXIT FUNCTION WEND OUT &H22C, NEND FUNCTION