;=================== FM SOUND DRIVER ============================
;*YNSOUND /A220 /I5 /R *
;* /Axxx:BASE I/O ADRESS /Ixx:IRQ NO /R:긤깋귽긫?됶룣 *
;* /N:굍괶괦괮뼰궢 *
;*?귽??뒆귟뜛귒귩0.2148ms(1/256)궸먠믦궥귡 *
;*FNC 0CH궳3.4375mS(1/16)궻뒆귟뜛귒귩럚믦궢궫귺긤깒긚궸뵯맯됀? *
;* 덙궖릶 AL=0 DS:DX=긵깓긐깋?귺긤깒긚(RETF궳뽣귡) *
;* AL=1궻궴궖룊딖륉뫴궸뽣궥 *
;================================================================
; CRTV 福분 솔?
FM_PORT EQU 0
AFM_PORT EQU 2
MIX_PORT EQU 4
print MACRO BUFF
PUSH DS
PUSH AX
PUSH DX
MOV AX,CS
MOV DS,AX
MOV DX,OFFSET BUFF
MOV AH,09H
INT 21H
POP DX
POP AX
POP DS
ENDM
;------------------ 冷?璟肪捨?-------------------------------
CODE SEGMENT PUBLIC
ASSUME CS:CODE,DS:CODE,ES:CODE,SS:CODE
ORG 2CH
ENVSEG DW ? ;듏떕빾릶쀌덃궻긜긐긽깛긣
ORG 80H
ARGC DB ? ;긓?깛긤깋귽깛빒럻릶
ARGV DB 127 DUP(?) ;긓?깛긤깋귽깛빒럻쀱
ORG 100H ;COM 偈꾸
START: JMP DRVINIT ;INT40긜긞긣깑??깛귉
;========= BGM-DRV 붰콕겟 福분 석?鳴줍 (INT40)============
DRV_IO: CLI ;福분 STOP
PUSH BX
MOV BL,AH
SHL BL,01
XOR BH,BH
ADD BX,OFFSET IO_TBL
CALL CS:[BX]
POP BX
STI ;福분 ON
IRET
IO_TBL DW IO_INIT,NOISE_SET,SOUND_SET,VSYNC_START,ALL_STOP
DW SOUND_CODE,BGM_SET,BGM_START,BGM_END,FEAD_OUT
DW FLAG_READ,FMVOL_SET,ADR_SET
;------------ ??긤뼰궢 -----------------------
IO_RET: XOR AX,AX ;긖긂깛긤??긤궕뼰궋
RET
;------------ INT 62H먠믦 ----------------------
INT62H_SET:
CALL TIMER_INIT
XOR AX,AX
RET
;------------ INT 62H됶룣 ----------------------
INT62H_CLS:
CALL TIMER_STOP
XOR AX,AX
RET
;------------- 석렀 鳴줍 (AH=00) ---------------
;AH=0
IO_INIT:
PUSH DS
PUSH AX
PUSH SI
MOV BYTE PTR CS:SOU_NO,0FFH ;뵯맳돶긓?긤(FF:뵯맳뭷?)
MOV BYTE PTR CS:WAON,1 ;昞阜?쒸?
CALL DATA_INIT
MOV AX,CS
MOV DS,AX
;----------- 굈굊굂괨룊딖먠믦 ------------------
MOV DX,BASE_ADR ;굍괶괦괮궻긹?긚귺긤깒긚
ADD DX,AFM_PORT ;굈굊굂괨?괪긆긻깒??긾?긤
MOV AX,0105H
CALL FMOUT_PROC
MOV AX,3F04H
CALL FMOUT_PROC
MOV AX,01 ;돶뙶??긤궕궇귡
POP SI
POP AX
POP DS
RET
;-------------- ?꼍? 쒸챵 鳴줍 (AH=01) ---------------
;AH=1:AL=?꼍? 서너 슁(Noise Period)
NOISE_SET:
RET ;뼰럨
;------ SOUND START ADRESS SET (AH=02) ---------------
;AH=02: DS:SI=볐떫?춈걋?앴캐 궂柶?
SOUND_SET:
PUSH AX
MOV AX,DS
MOV CS:SOU_SEG,AX
MOV CS:SOU_OFF,SI
POP AX
RET
;----?귽??? 굍굎?굌굎(AH=03) ---------------
;AH=03:AL=NUL
VSYNC_START:
PUSH DS
PUSH ES
PUSH AX
PUSH BX
PUSH DX
MOV BYTE PTR CS:CHG_FLG,0 ;돶뒁뎶몋귩뼰럨궥귡
CALL TIMER_INIT
;----- 뚼됈돶뾭?귽??긜긞긣 ------------------
MOV AX,351CH ;롦벦
INT 21H
MOV CS:SINT_OFF,BX ;귺긤깒긚둰?
MOV CS:SINT_SEG,ES
MOV AX,CS
MOV DS,AX
MOV DX,OFFSET LFO_CONTROL ;뒆귟뜛귒깑??깛긜긞긣
MOV AX,251CH ;뒆귟뜛귒붥뜂
INT 21H
POP DX
POP BX
POP AX
POP ES
POP DS
RET
;-------------- ALL STOP (AH=04) ---------------
;AH=04:AL=NUL
ALL_STOP:
PUSH DS
PUSH ES
PUSH AX
PUSH BX
PUSH DX
CALL TIMER_STOP
LDS DX,DWORD PTR CS:SINT_OFF ;귺긤깒긚벶귒궬궢
MOV AX,251CH ;뒆귟뜛귒붥뜂벶귒궬궢
INT 21H
;--------- 깗?긏룊딖돸 ------------------------
MOV AX,CS
MOV DS,AX ;DS=CS
MOV BYTE PTR SOUND_FLG,0 ;뚼됈돶쁝돶긇긂깛??룊딖돸
CALL DATA_INIT ;싶伺?춈걋 석렀
MOV AH,05
ASLOP1: CALL KEYSUB ;KEY OFF
DEC AH
JNL ASLOP1
CALL FMCOL_INIT ;괻굃돶뙶깏깏?긚귖긏깏귺
POP DX
POP BX
POP AX
POP ES
POP DS
RET
;-------------- SOUND CODE SET (AH=05) ---------------
;AH=05:AL=CODE
SOUND_CODE:
PUSH AX
CALL SOUND_ON
POP AX
RET
;-------- BGM START ADRESS SET (AH=06) ---------------
;AH=06 AL=昞阜?6?캠?볐떫?식?? DS:SI=BGM 춈걋?앴캐 궂柶?
BGM_SET:
PUSH AX
MOV BYTE PTR CS:WAON,6 ;昞阜?쒸?
MOV AX,DS
MOV CS:BGM_SEG,AX
MOV CS:BGM_OFF,SI
POP AX
RET
;-------------- BGM START (AH=07) ---------------
;AH=07:AL=NUL
BGM_START:
PUSH DS
PUSH AX
PUSH BX
PUSH CX
PUSH SI
CALL DATA_INIT ;깗?긏룊딖돸
CALL FMCOL_INIT ;괻굃궻돶륡궸괥붥귩긜긞긣궢긤깋귽긫?궻깗?긏귩뜃귦궧귡
MOV DS,CS:BGM_SEG
MOV BX,CS:BGM_OFF
MOV SI,10H ;긬?긣긢??궻긶긞?
BSLOP1: MOV AX,[SI+BX] ;BGM 춈걋?古잗12艱꼼?BGM_ADD?
ADD AX,BX ;긆긲긜긞긣궻궦귢귩뢇맫
MOV CS:BGM_ADD-10H[SI],AX ;(떳 諫걜?앴캐궂柶슐?痂?꾸)
INC SI
INC SI
CMP SI,1CH
JB BSLOP1
MOV SI,02H ;돶륡긢??긆긲긜긞긣
MOV AX,[SI+BX]
ADD AX,BX ;긆긲긜긞긣궻궦귢귩뢇맫
MOV CS:FM_DATA,AX
INC SI
INC SI
MOV AX,[SI+BX]
ADD AX,BX ;긆긲긜긞긣궻궦귢귩뢇맫
MOV CS:SG_DATA,AX
MOV AX,0800H
XOR AX,AX ;돶궻뮮궠깏긜긞긣
MOV CX,6
MOV BX,OFFSET ONNCYOU
BSLOP3: MOV CS:[BX],AX
INC BX
INC BX
LOOP BSLOP3
MOV BYTE PTR CS:TIMER_FLG,3FH ;?귽???괶궴귖벍띿궠궧귡
OR BYTE PTR CS:CHG_FLG,02H ;뎶몋긲깋긐긜긞긣
AND BYTE PTR CS:CHG_FLG,0FEH ;擊걜檳냐긲깋긐긏깏귺
MOV BYTE PTR CS:TMP_SPD,1 ;긡깛?긇긂깛??띍뛼뭠
MOV BYTE PTR CS:TMP_CNT,1 ;뙸긇긂깛??띍뛼뭠
POP SI
POP CX
POP BX
POP AX
POP DS
RET
;-------------- BGM END (AH=08) ---------------
;AH=08:AL=NUL
BGM_END:
TEST BYTE PTR CS:CHG_FLG,02H ;뎶몋긲깋긐뵽뭚
JE BEJP1
CLD
PUSH DS
PUSH ES
PUSH AX
PUSH CX
PUSH DI
MOV AX,CS
MOV DS,AX ;DS=CS
MOV ES,AX
XOR AX,AX
MOV CX,35
MOV DI,OFFSET FM_DATA
REP STOSW
MOV CX,45
MOV DI,OFFSET VOLUM
REP STOSW
MOV AH,05
BELOP1: CALL KEYSUB ;KEY OFF
DEC AH
JNL BELOP1
CALL FMCOL_INIT ;괻굃돶뙶깏깏?긚귖긏깏귺
AND BYTE PTR CS:CHG_FLG,0FDH ;뎶몋긲깋긐긏깏귺
POP DI
POP CX
POP AX
POP ES
POP DS
BEJP1: RET
;-------------- FEAD OUT(AH=09) ---------------
;AL=擊걜檳냐 춈걋(7-4:困뛔? 3-0:困?율?
FEAD_OUT:
TEST BYTE PTR CS:CHG_FLG,02H ;뎶몋긲깋긐뵽뭚
JE FOJP1
PUSH DS
PUSH AX
PUSH BX
PUSH CX ;CALL뻔춈 CX?쨋?꾸
MOV BX,CS
MOV DS,BX
AND BYTE PTR CHG_FLG,0FEH ;긲긃?긤귺긂긣긲깋긐깏긜긞긣
MOV AH,91H
XCHG AH,AL
MOV BX,WAONW
DEC BX
FOLOP1: PUSH AX
CALL BGMCHG
POP AX
DEC BX
JNL FOLOP1
OR CHG_FLG,01H ;긲긃?긤귺긂긣긲깋긐긜긞긣
POP CX
POP BX
POP AX
POP DS
FOJP1: RET
;------------- FLAG 벶귒궬궢 (AH=0AH) ---------------
FLAG_READ:
XOR AH,AH
MOV AL,CS:CHG_FLG ;긲깋긐귩벶귒뢯궥
RET ;(0拒?ON:擊걜檳냐 1:BGM뎶몋 2:뚼됈돶뵯맳)
;---------- 괻굃돶쀊먠믦 (AH=0BH) ---------------
FMVOL_SET:
PUSH DS
PUSH ES
MOV CS:FMVOL,AL ;괻굃돶뙶궻돶쀊귩빾뛛궥귡
MOV AX,CS
MOV DS,AX ;DS=CS
MOV ES,BGM_SEG ;BGM 챨읠 씀射噴
XOR AH,AH
FSLOP1: CALL FVOLUM ;돶쀊떗맕빾뛛
INC AH
CMP AH,03
JNE FSLOP1
POP ES
POP DS
RET
;--- 3.4375mS뒆귟뜛귒귺긤깒긚먠믦(AH=0CH) ------
ADR_SET:
CMP AL,01
JE @F
MOV WORD PTR CS:TIMEINT_ADR,DX
MOV WORD PTR CS:2[TIMEINT_ADR],DS
RET
@@: MOV AX,OFFSET TIMEINT_PROC ;룊딖돸렄
MOV WORD PTR CS:TIMEINT_ADR,AX
MOV AX,CS
MOV WORD PTR CS:2[TIMEINT_ADR],AX
RET
;=========== ALL DATA INIT 鳴줍 ======================
;LFO,VOLUM 탠?싶伺?석렀 쌕
;뗘謬?CLI ?솩?낸?
DATA_INIT:
CLD
PUSH ES
PUSH AX
PUSH CX
PUSH DI
MOV AX,CS
MOV ES,AX
XOR AX,AX
MOV CX,47 ;10 솨슁
MOV DI,OFFSET READFLG
REP STOSW
MOV CX,37
MOV DI,OFFSET ONNCYOU
REP STOSW
MOV CX,45
MOV DI,OFFSET VOLUM
REP STOSW
POP DI
POP CX
POP AX
POP ES
RET
;=========== 괻굃돶륡룊딖돸 ================
;깒긙긚?빾뛛뼰궢
FMCOL_INIT:
PUSH DS
PUSH ES
PUSH AX
PUSH CX
MOV AX,CS
MOV DS,AX ;DS=CS
MOV ES,BGM_SEG ;BGM 챨읠 씀射噴
XOR AH,AH ;AH=쁝돶붥뜂룊딖돸
MOV CX,6
@@: CALL FM_SOU_INIT
INC AH
LOOP @B
POP CX
POP AX
POP ES
POP DS
RET
;-------- 돶륡룊딖돸깑??깛 ----------------------------------
;FM궻돶륡귩괥붥궻돶륡궸빾뛛궢KEY OFF륉뫴궸궥귡
;AH=쁝돶붥뜂
FM_SOU_INIT:
PUSH AX
PUSH BX
PUSH CX
CALL KEYSUB ;럭OFF
MOV BL,AH
XOR BH,BH
MOV SOU_COL[BX],BH ;돶륡괥붥긜긞긣(긏깏귺궢궶궘궲귖괥)
;------- T.L INIT-----------------------
MOV DX,CS:BASE_ADR
MOV AX,3F40H ;굎갆굂긏깏귺
CALL FMOUT_PROC
MOV AL,43H
CALL FMOUT_PROC
MOV AL,48H
CALL FMOUT_PROC
MOV AL,4BH
CALL FMOUT_PROC
;------- S.L,R.R INIT ------------------
MOV AX,0FF80H ;굍굂,굌굌긏깏귺
CALL FMOUT_PROC
MOV AL,83H
CALL FMOUT_PROC
MOV AL,88H
CALL FMOUT_PROC
MOV AL,8BH
CALL FMOUT_PROC
MOV AH,BL
OR AH,0F0H
CALL KEYSUB ;럭ON(뼰돶륉뫴귩뵯맯궢깏깏?긚귩뤑궥)
AND AH,0FH
CALL KEYSUB ;럭OFF
POP CX
POP BX
POP AX
RET
;============ 콤旒艱?冷?=================
BGMINT:
MOV CS:SS_SAV1,SS
MOV CS:SP_SAV1,SP
MOV SS,CS:CS_SAVE
MOV SP,OFFSET STACK_W
PUSHF
PUSH DS
PUSH ES
PUSH AX
PUSH BX
PUSH CX
PUSH DX
PUSH SI
PUSH DI
CALL BGM_CONTROL
POP DI
POP SI
POP DX
POP CX
POP BX
POP AX
POP ES
POP DS
POPF
MOV SP,CS:SP_SAV1
MOV SS,CS:SS_SAV1
RET
;========== 돶뒁븫맕뚥 ===================
BGM_CONTROL:
MOV AX,CS
MOV DS,AX ;DS=CS
MOV ES,BGM_SEG ;BGM 챨읠 씀射噴
;FM&SSG BGM 붰콕겟
XOR BX,BX ;FM 뒵받?BX=昞?떨鳧?
BLOOP4: MOV BYTE PTR KEY_SW,00H ;럭ON OFF 탉
MOV SI,BX
SHL SI,01
DEC ONNCYOU[SI] ;돨?킷憑 - 1
JG LOPEND ;돨?킷憑 > 0 ?
MOV DI,BGM_ADD[SI]
RETUR1: MOV AX,ES:[DI] ;춈걋?櫓붇
CMP AL,80H
JB BJUMP4
JMP SHORT SETSUB ;;괶괽굃댥둖궻먠믦 JUMP
BJUMP4: TEST AH,80H ;7拒? ON?
JNE BJUMP8
PUSH AX ; (KEY OFF 쁘챵?
MOV AH,BL
CALL KEYSUB ;KEY OFF
MOV BYTE PTR KEY_SW,01 ;럭ON OFF 극
POP AX
BJUMP8: AND AH,07FH ;쌓?율 ?敬메?멈굵?
PUSH BX
PUSH AX
MOV BL,AH
XOR BH,BH
MOV AL,BGM_LON[BX] ;돨?킷憑 (낫꼼슁) 櫓분
MOV AH,BH ;AH=0
MOV ONNCYOU[SI],AX ;돨?킷憑 쒸?
POP AX
POP BX
TEST AL,0FH ;땨븘궔갎
JNE BJUMP5
MOV AH,BL
CALL KEYSUB ;긌?궻떗맕OFF
JMP SHORT BJUMP9
BJUMP5: MOV AH,BL
CALL OTOOUT ;돨 춈걋 서쬐?
CMP BYTE PTR KEY_SW,0
JE BJUMP9
MOV CL,BL
OR CL,0F0H
MOV AH,CL
CALL KEYSUB ;KEY ON
BJUMP9: INC DI
INC DI
MOV BGM_ADD[SI],DI
LOPEND: INC BX
CMP BL,WAON
JAE BJUMP7
JMP BLOOP4
BJUMP7: RET
; --------------- 괶괽굃댥둖궻긢??먠믦 -------------------
;困볐 춈렴?譚 BX,SI,DI(PUSH),AX?춈걋뜅 凱簾킨캠?? 困볐춈뢨
SETSUB: INC DI ;쨌司 춈걋?交꿇육?냈?
INC DI
PUSH DI
PUSH BX
MOV BL,AL
AND BL,70H ;솩??4拒? ?根??7拒??OFF)
MOV CL,03
SHR BL,CL ;BL=BL/16*2(3拒? 鈞?셨?
MOV DI,BX
POP BX
CALL CS:COMADR[DI]
POP DI
JMP RETUR1
COMADR DW BGMVOL,BGMCHG,BGMCOL,BGMSPD,BGM_JL,BGMSET,BGM_NOISE,BGMFLG
;------ 轟幕겉 困볐 (80H)--------
BGMVOL: ADD AH,FEADCNT[BX]
JG VOLJP2 ;돶쀊궕?귽긥긚궔갎
MOV AH,BH ;BH=0
JMP SHORT BGMVO2
VOLJP2: CMP AH,0FH ;돶쀊궕괦괫댥뤵궔갎
JBE BGMVO2
MOV AH,0FH
BGMVO2: MOV VOLUM[BX],AH
MOV AH,BL
CALL FVOLUM
RET
;------ 轟幕겉 뎔?困볐 (90H,91H)---------
BGMCHG: TEST BYTE PTR CHG_FLG,01 ;둖븫긓?깛긤궻긲긃?긤귺긂긣렳뚼뭷궔갎
JNE CHGJP3
AND AL,01H ;긲긃?긤긇긂깛??궼뢎뿹렄궸괥궸뽣귡궫귕룊딖돸궻뷠뾴뼰궢
JNE CHGJP1 ;0拒? ON
INC AL ;AL=1
JMP SHORT CHGJP2
CHGJP1: NEG AL ;AL=0FFH(-1)
CHGJP2: MOV CHGLEV[BX],AL
XOR AL,AL ;AL=0
MOV CL,04 ;AH?0-3쪨L?4-7쪨H?돋?
SHR AX,CL
MOV CL,02 ;困?솩뜁 *4 ?잃
SHR AL,CL
MOV CHG_N[BX],AH ;困?슁 쒸?
MOV CHGCNT[BX],AL ;困?솩뜁 쒸?1困떽?솩뜁)
MOV CHG_W[BX],AL ;困?솩뜁?丙맹 쒸?
CHGJP3: RET
;------ 황?困볐 (A0H)----------------
BGMCOL: MOV SOU_COL[BX],AH
MOV AH,BL
CALL FM_SOU
RET
;------ 옇콤 困볐 (B0H)----------------
BGMSPD: MOV AL,AH
CALL TIMER_TMP
;+++ out_FM 26H,AL ;율構 쒸?
RET
;------ 솩л璟&鳴璟 (CxH)--------------
BGM_JL: POP DX ;RET궂柶쉐 떳??
POP DI ;DI?櫓잗?
CMP AL,0C1H
JE JL_JP1
CMP AL,0C2H
JE JL_JP2
CMP AL,0C3H
JE JL_JP3
MOV DI,JL_D0[SI] ;C0 솩??
JL_RET: PUSH DI
PUSH DX ;聃?聃聘
RET
JL_JP1: DEC JL_CNT[BX] ;C1솩??
JE JL_RET ;0???
MOV DI,JL_D1[SI]
JMP SHORT JL_RET
JL_JP2: MOV JL_D3[SI],DI ;C2 솩??:D3?궂柶?쒸?
MOV DI,JL_D2[SI]
JMP SHORT JL_RET
JL_JP3: CMP JL_D3[SI],00 ;C3 솩??
JE JL_RET ;0???
MOV DI,JL_D3[SI]
JMP SHORT JL_RET
;------ 궂柶?쒸?(DxH)-----------------
BGMSET: POP DX
POP DI
PUSH DI
PUSH DX
CMP AL,0D1H
JE SETJP1
CMP AL,0D2H
JE SETJP2
MOV JL_D0[SI],DI ;D0 솩??
RET
SETJP1: MOV JL_CNT[BX],AH ;D1 솩??:鳴璟 떨鳧?쒸?
MOV JL_D1[SI],DI
RET
SETJP2: MOV JL_D3[SI],00H ;D2 솩??:D3 0멈?
MOV JL_D2[SI],DI
RET
;-------- Noise 뢂봥릶?빾뛛 (E0H) -----------------------------
BGM_NOISE:
RET
;-------- 둮뮗긓?깛긤긄깏귺(F0H) ----------------------------
BGMFLG: MOV CS:ADR_NO,AH ;뙸띪궼렳뛱룷먢댧뭫뵽뭚긲깋긐
RET
;---------------- FM 뒵석맘??---------------------------------
; AH=昞?艱趺浜(0-5) 황?艱趺浜?SOU_COL
FM_SOU: PUSH AX
PUSH BX
PUSH CX
PUSH DX
PUSH SI
CALL KEYSUB ;럭OFF
MOV BL,AH
XOR BH,BH
MOV BL,SOU_COL[BX] ;황?方콤
MOV CL,05H
SHL BX,CL ;BX*32
ADD BX,FM_DATA ;황倍斌읠 古잗?櫓붇
MOV SI,BX
;---------- 뢯쀍??긣?긃긞긏 -----------------
MOV DX,BASE_ADR ;뢯쀍??긣벶귒궬궢
CMP AH,03
JB @F
SUB AH,03
ADD DX,AFM_PORT ;둮뮗괻굃궸빾뛛
;---------- 돶긏깏귺 ---------------------------
@@: MOV BL,ES:14H[SI] ;FB/CONNECT
MOV BH,ES:15H[SI]
AND BX,0101H ;CONNECT궻귒
SHL BL,01
OR BL,BH ;뜃맟(뜃맟룈룜뭾댰)
XOR BH,BH
MOV CH,CONNECT[BX] ;랸邈 쉿?
ADD AH,40H
MOV AL,AH ;귺긤깒긚귩AL궸긜긞긣
MOV AH,3FH
XOR BX,BX
FLOOP4: SHR CH,01
JNB @F ;랸邈 껫殯?羈쌕
CALL FMOUT_PROC
@@: ADD AL,OPLTBL[BX] ;SB16긆긻깒??귺긤깒긚
INC BX
CMP BL,4
JB FLOOP4
MOV BYTE PTR KEY_SW,01 ;럭 ?ON OFF 극
MOV AH,CL
ADD AL,80H-0BH ;AL=0C0H궸궥귡
;---------- FB/CONNECT -------------------------
MOV AH,ES:14H[SI]
CALL FMOUT_PROC
MOV AH,ES:15H[SI]
ADD AL,3
CALL FMOUT_PROC
SUB AL,0A0H+3 ;DT/MULTI 앰맣
;--------- MULTI -------------------------------
XOR BX,BX
FLOOP1: MOV AH,ES:[SI] ;DT/MULTI??
CALL FMOUT_PROC
INC SI
ADD AL,OPLTBL[BX] ;SB16긆긻깒??귺긤깒긚
INC BX
CMP BL,4
JB FLOOP1
;--------- T.L ---------------------------------
ADD AL,40H-0BH ;T.L?켁聘
ADD SI,04H
;--------- AR/DR -------------------------------
XOR BX,BX
FLOOP2: MOV AH,ES:[SI] ;?굌벶귒궬궢
CALL FMOUT_PROC
INC SI
ADD AL,OPLTBL[BX] ;SB16긆긻깒??귺긤깒긚
INC BX
CMP BL,4
JB FLOOP2
ADD AL,20H-0BH
;---------- SL/RR ------------------------------
XOR BX,BX
FLOOP3: MOV AH,ES:[SI] ;SL/RR??
CALL FMOUT_PROC
INC SI
ADD AL,OPLTBL[BX] ;SB16긆긻깒??귺긤깒긚
INC BX
CMP BL,4
JB FLOOP3
ADD AL,60H-0BH
;------------ WS -------------------------------
XOR BX,BX
FLOOP5: MOV AH,ES:[SI] ;SL/RR??
CALL FMOUT_PROC
INC SI
ADD AL,OPLTBL[BX] ;SB16긆긻깒??귺긤깒긚
INC BX
CMP BL,4
JB FLOOP5
POP SI
POP DX
POP CX
POP BX
POP AX
JMP FVOLUM
RET
;-------------------- FM 뒵漠?쒸?-----------------------------
; 랸邈?TL ?困볐쌕
; AH=昞?艱趺浜(0-5) 뒵漠너 VOLUM
FVOLUM: PUSH AX
PUSH BX
PUSH CX
PUSH DX
PUSH SI
MOV BL,AH
XOR BH,BH
MOV BL,SOU_COL[BX] ;황?方콤
MOV CL,05H
SHL BX,CL ;BX*32
ADD BX,FM_DATA ;황倍斌읠 古잗?櫓붇
MOV SI,BX
MOV CL,AH ;쁝돶붥뜂둰?
;----------- 뢯쀍??긣?긃긞긏 ----------------
MOV DX,BASE_ADR ;뢯쀍??긣벶귒궬궢
CMP AH,03
JB @F
SUB AH,03
ADD DX,AFM_PORT ;둮뮗괻굃궸빾뛛
;----------- 돶쀊걬굎굂긜긞긣 ------------------
@@: MOV BL,ES:14H[SI] ;FB/CONNECT
MOV BH,ES:15H[SI] ;FB/CONNECT
AND BX,0101H ;CONNECT???쌕
SHL BL,01
OR BL,BH
XOR BH,BH
MOV CH,CONNECT[BX] ;랸邈 쉿?
MOV BL,CL ;뙰궻쁝돶붥뜂긜긞긣
MOV AL,AH
ADD AL,40H ;TL ADRESS
MOV CL,15 ;15(VOLUM=MAX15)
SUB CL,VOLUM[BX] ;AL=VOLUM 謐斯
SHL CL,01H ;AL*4
SHL CL,01H
ADD CL,CS:FMVOL ;FM돶뙶궻돶쀊
CMP CL,3FH ;긆?긫?긲깓??긃긞긏
JB @F
MOV CL,3FH
@@: ADD SI,04H ;춈걋?TL?앴캐?
XOR BX,BX ;CL?뜀茉 떨鳧?
FVLOP1: MOV AH,ES:[SI] ;T.L 櫓잗?
SHR CH,01
JNB FVJP1 ;랸邈 껫殯?羈쌕
MOV BH,AH
AND AH,3FH ;굎굂궻귒
AND BH,0C0H ;굁굍궻귒
ADD AH,CL ;랸邈?뒵漠?묾쁨
CMP AH,3FH ;띍묈뭠?긃긞긏
JB @F
MOV AH,3FH
@@: OR AH,BH ;굎굂갅굁굍뜃맟
XOR BH,BH ;괶괾귩괥궸뽣궥
FVJP1: CALL FMOUT_PROC
INC SI
ADD AL,OPLTBL[BX] ;SB16긆긻깒??귺긤깒긚
INC BX
CMP BL,4
JB FVLOP1
POP SI
POP DX
POP CX
POP BX
POP AX
RET
;------------------- 돨 서쬐? --------------------------------
; AH=昞?艱趺浜 AL=뒵떤 춈걋
OTOOUT: PUSH AX
PUSH BX
PUSH CX
;----------- 뢂봥릶긜긞긣 ----------------------
MOV BL,AL
XOR BH,BH
MOV CH,FONTBLH[BX] ;서너슁 櫓잗?
AND BL,0FH
MOV CL,FONTBLL[BX]
MOV BL,AH
SHL BX,01
OR CH,20H ;KEY ON FLG긜긞긣
MOV ONNKAI[BX],CX
POP CX
POP BX
POP AX
RET
;-------------------- KEY ON/OFF -------------------------------
; AH=0F?H KEY ON /00?H KEY OFF
; FM/SSG ?맹仕?鳴줍킨춈 쌕
KEYSUB: PUSH AX
PUSH BX
PUSH DX
MOV BL,AH
AND BX,0FH
SHL BX,01
MOV CX,ONNKAI[BX] ;뢂봥릶벶귒궬궢
;---------- 긌?굈굆갅굈괻괻?긃긞긏 -----------
CMP AH,0F0H ;뙰갲긌?긆깛긲깋긐궼긜긞긣궢궲궇귡
JAE @F
XOR CX,CX
;----------- 뢯쀍??긣?긃긞긏 ----------------
@@: AND AH,0FH ;긌?긲깋긐긏깏귺
MOV DX,BASE_ADR ;뢯쀍??긣벶귒궬궢
CMP AH,03
JB @F
SUB AH,03
ADD DX,AFM_PORT ;둮뮗괻굃궸빾뛛
;----------- 긢??긜긞긣 ----------------------
@@: MOV AL,AH
ADD AL,0A0H
MOV AH,CL
CALL FMOUT_PROC
ADD AL,010H
MOV AH,CH
CALL FMOUT_PROC
POP DX
POP BX
POP AX
RET
;====== 긄깛긹깓?긵걬뚼됈돶 ===================
LFO_CONTROL:
CLI
MOV CS:SS_SAV1,SS
MOV CS:SP_SAV1,SP
MOV SS,CS:CS_SAVE
MOV SP,OFFSET STACK_W
PUSHF
PUSH DS
PUSH ES
PUSH AX
PUSH BX
PUSH CX
PUSH DX
PUSH SI
PUSH DI
CALL INTSOUND_MAIN ;뚼됈돶?긃긞긏
MOV AX,CS
MOV DS,AX ;DS=CS
MOV CX,6 ;뙰긢??궼9ms궻뒆귟뜛귒귩궰궔궯궲궋귡궫귕
VJUMP7: PUSH CX
VJUMP4: MOV ES,BGM_SEG ;BGM 챨읠 씀射噴
XOR BX,BX ;BX=昞?떨鳧?
VLOOP4: MOV SI,BX
SHL SI,01
;------ 볶뚱 LFO 붰콕겟 鳴줍 -------------------
CMP CHGCNT[BX],00H
JE VJUMP6
CALL CHGVOL ;뒵漠?困볐 鳴줍
VJUMP6: INC BX
CMP BL,WAON
JB VLOOP4
POP CX
LOOP VJUMP7
POP DI
POP SI
POP DX
POP CX
POP BX
POP AX
POP ES
POP DS
POPF
MOV SP,CS:SP_SAV1
MOV SS,CS:SS_SAV1
STI
PUSH WORD PTR CS:SINT_SEG
PUSH WORD PTR CS:SINT_OFF
RETF ;INT1CH궸긙긿깛긵
; IRET ;???
;------ 뒵漠?困볐 鳴줍(북噴?No 90H,91H)-------
CHGVOL: DEC CHG_W[BX] ;困?TIME
JG CVJP1
DEC CHG_N[BX] ;困?漠?
JNL CVJP2 ;毆탐?
MOV BYTE PTR CHGCNT[BX],00H
MOV BYTE PTR FEADCNT[BX],00H ;긲긃?긤긇긂깛??긏깏귺
TEST BYTE PTR CHG_FLG,01 ;둖븫긓?깛긤궔갎
JE CVJP1
AND BYTE PTR CHG_FLG,0FEH ;긲긃?긤귺긂긣뢎뿹(긲깋긐긏깏귺)
MOV AX,0800H ;돶긏깏귺
CALL BGM_END ;BGM궻긚긣긞긵
JMP SHORT CVJP1
CVJP2: MOV AH,CHGCNT[BX] ;MOV CHG_W,CHGCNT
MOV CHG_W[BX],AH
MOV AH,CHGLEV[BX] ;困?謐斯(90H=01 91H=0FFH)
ADD FEADCNT[BX],AH ;긲긃?긤긇긂깛??빾뛛
ADD AH,VOLUM[BX]
JG CVJP3 ;뒵漠?毆탐?
MOV AH,BH ;AH=0
JMP SHORT CVJP4
CVJP3: CMP AH,0FH ;뒵漠?15?
JNA CVJP4
MOV AH,0FH
CVJP4: CALL BGMVO2 ;뒵漠?쒸?
MOV SI,BX
SUB SI,03 ;SSG?VOLUM LFO ?뒵漠?쒸?
JB CVJP1
SHL SI,01
MOV AX,SSG_V[SI]
ADD AH,CHGLEV[BX] ;困?謐斯(90H=01 91H=0FFH)
JNL CVJP6 ;뒵漠?毆탐?
MOV AH,BH ;AH=0
JMP SHORT CVJP7
CVJP6: CMP AH,0FH ;뒵漠?15?
JNA CVJP7
MOV AH,0FH
CVJP7: MOV SSG_V[SI],AX ;뒵漠?쒸?
CVJP1: RET
;@===============================================================
;* 뚼됈돶뵯맳깑??깛 *
;================================================================
;============= 뚼됈돶뒆귟뜛귒긓깛긣깓?깑 =======================
;뒆귟뜛귒뚼됈돶긓깛긣깓?깑
INTSOUND_MAIN:
CMP BYTE PTR CS:SOU_NO,0FFH ;뚼됈돶뼰궢륉뫴갎
JE @F
DEC BYTE PTR CS:SOU_CNT
JNE @F
MOV AL,CS:SOU_NO ;렅궻뚼됈돶뵯맳
CALL SOUND_ON
@@: RET
;============== 뚼됈돶뵯맳 ======================================
;AL=뚼됈돶붥뜂
;AX댥둖빾뛛뼰궢
SOUND_ON:
PUSH DS
PUSH BX
PUSH SI
OR BYTE PTR CS:CHG_FLG,04H ;뚼됈돶뵯맳륉뫴
AND AL,AL ;뚼됈돶긏깏귺갎
JNE @F
AND BYTE PTR CS:CHG_FLG,0FBH ;뚼됈돶긲깋긐긏깏귺
@@: MOV BL,AL ;뚼됈돶붥뜂
XOR AH,AH
SHL AX,01 ;괦긢??괦괮긫귽긣
SHL AX,01
SHL AX,01
SHL AX,01
MOV DS,CS:SOU_SEG ;뚼됈돶긢??귺긤깒긚벶귒궬궢
ADD AX,CS:SOU_OFF
MOV SI,AX
MOV AL,0DH[SI] ;뚼됈돶붥뜂
MOV CS:SOU_NO,AL
MOV AL,0EH[SI] ;뚼됈돶긂긄귽긣
MOV CS:SOU_CNT,AL
XOR AL,AL
CALL SOUNDFM_SET
POP SI
POP BX
POP DS
RET
;=============== 돶륡먠믦 =======================================
;AL=긜긞긣궥귡쁝돶붥뜂(0?5)
;BL=뚼됈돶붥뜂
;DS:SI=긢??귺긤깒긚
;AX,SI빾뛛궇귟
SOUNDFM_SET:
PUSH CX
PUSH DX
;----------- 뢯쀍??긣?긃긞긏 ----------------
MOV DX,CS:BASE_ADR ;뢯쀍??긣벶귒궬궢
CMP AL,03
JB @F
SUB AL,03
ADD DX,AFM_PORT ;둮뮗괻굃궸빾뛛
;----------- 뚼됈돶긏깏귺 ----------------------
@@: ADD AL,0B6H
XOR AH,AH
CALL FMOUT_PROC ;KEY OFF
SUB AL,63H ;2OP궻굎굂긜깒긏긣
MOV AH,3FH ;뿼뺴궻긆긻깒??귩긏깏귺
CALL FMOUT_PROC
SUB AL,3
CALL FMOUT_PROC
SUB AL,20H ;AL=030H
AND BL,BL ;뼰돶륉뫴궻뚼됈돶갎
JE SFSJP1
;----------- 긢??긜긞긣 ----------------------
MOV CX,4 ;MULI,TL,AR,SL긜긞긣
@@: MOV AH,[SI] ;긢??벶귒궬궢
CALL FMOUT_PROC
INC SI
ADD AL,03
MOV AH,[SI] ;긢??벶귒궬궢
CALL FMOUT_PROC
INC SI
ADD AL,20H-3
LOOP @B
ADD AL,40H ;AL=F0H
;----------- 굒굍긜긞긣 ------------------------
MOV AH,[SI] ;긢??벶귒궬궢
CALL FMOUT_PROC
INC SI
ADD AL,03
MOV AH,[SI] ;긢??벶귒궬궢
CALL FMOUT_PROC
INC SI
SUB AL,33H-6 ;AL=C6H
;----------- 괻괶먠믦 --------------------------
MOV AH,[SI]
CALL FMOUT_PROC
INC SI
SUB AL,20H ;AL=A6H
;----------- 뢂봥릶긜긞긣 ----------------------
MOV AH,[SI] ;긢??벶귒궬궢
CALL FMOUT_PROC
INC SI
ADD AL,10H
MOV AH,[SI] ;긢??벶귒궬궢
CALL FMOUT_PROC ;KEY ON
SFSJP1: POP DX
POP CX
RET
;@===============================================================
;* 긢??볺뢯쀍깑??깛 *
;================================================================
;================== FM긢??긜긞긣 ==============================
;굍괶괦괮궻DX궳럚렑궠귢궫괻굃??긣궸긢??귩뢯쀍궥귡
;AL=긓?깛긤 AH=긢??
;DX=뢯쀍??긣귺긤깒긚
;깒긙긚?빾뛛뼰궢
FMOUT_PROC:
PUSH AX
PUSH CX
OUT DX,AL ;긓?깛긤뢯쀍
MOV CX,1H
@@: IN AL,DX
LOOP @B
XCHG AL,AH
INC DX
OUT DX,AL ;긢??뢯쀍
DEC DX
MOV CX,3H ;긂긄귽긣긇긂깛긣
@@: IN AL,DX
LOOP @B
POP CX
POP AX
RET
;================ 굃괿굓긢??벶귒궬궢 ===========================
;굍괶괦괮궻둮뮗괻굃??긣궸긢??귩뢯쀍궥귡(+4,+5)
;AL=긓?깛긤
;뽣귟뭠 AL=긢??
;깒긙긚?빾뛛뼰궢
MIXIN_PROC:
PUSH DX
MOV DX,CS:BASE_ADR
ADD DX,MIX_PORT
OUT DX,AL ;긓?깛긤뢯쀍
INC DX
IN AL,DX
POP DX
RET
PRO_END DW 0
;================================================================
;* ?귽??뒆귟뜛귒맕뚥 *
;================================================================
;================ ?귽??룊딖돸 ================================
TIMER_INIT:
PUSH DS
PUSH ES
PUSH AX
PUSH BX
PUSH DX
MOV AX,3508H ;?귽??뒆귟뜛귒귺긤깒긚벶귒궬궢
INT 21H
MOV WORD PTR CS:TIMER_ADR,BX
MOV WORD PTR CS:2[TIMER_ADR],ES
MOV AX,CS
MOV DS,AX ;뒆귟뜛귒깑??깛귺긤깒긚먠믦
MOV DX,OFFSET TIMER_PLAY
MOV AX,2508H
INT 21H
;--------- ?귽??뢂딖빾뛛 ------------
MOV AL,36H ;뺴?봥
OUT 43H,AL
MOV AX,100H ;뢂딖귩1/256궸빾뛛(214uS)
OUT 40H,AL
MOV AL,AH
OUT 40H,AL
MOV BYTE PTR CS:TIMEINT_CNT,16 ;벫롪뒆귟뜛귒궻긇긂깛??
MOV BYTE PTR CS:TIMER_CNT,0 ;뙰갲궻?귽??뒆귟뜛귒
POP DX
POP BX
POP AX
POP ES
POP DS
RET
;============= 긚긣긞긵뼺쀟 ======================================
TIMER_STOP:
PUSH DS
PUSH AX
PUSH DX
LDS DX,DWORD PTR CS:TIMER_ADR ;귺긤깒긚벶귒궬궢
MOV AX,2508H
INT 21H
;--------- ?귽??뢂딖빾뛛 ------------
MOV AL,36H ;뺴?봥
OUT 43H,AL
XOR AX,AX ;55ms궸뽣궥
OUT 40H,AL
MOV AL,AH
OUT 40H,AL
POP DX
POP AX
POP DS
RET
;============= ?귽??뒆귟뜛귒맕뚥긽귽깛 =============================
TIMER_PLAY:
CLI
PUSHF
PUSH AX
TEST BYTE PTR CS:CHG_FLG,02H ;뎶몋긲깋긐?긃긞긏
JE @F
DEC BYTE PTR CS:TMP_CNT ;긡깛?궸궇귦궧귡
JNE @F
MOV AL,CS:TMP_SPD
MOV CS:TMP_CNT,AL
CALL BGMINT ;긖긂깛긤긓깛긣깓?깑귉
;---------- 벫롪뒆귟뜛귒귉 -------------
@@: DEC BYTE PTR CS:TIMEINT_CNT ;긇긂깛??괦덙궘
JNE @F
MOV BYTE PTR CS:TIMEINT_CNT,16
DB 09AH ;벫롪?귽??뒆귟뜛귒빁뢂(JMP FAR)
TIMEINT_ADR DD 0
CLI ;STI륉뫴궻됀?맜궕갋갋갋
;------ 뙰궻?귽??뒆귟뜛귒귉 ---------
@@: DEC BYTE PTR CS:TIMER_CNT ;긇긂깛??괦덙궘(256궳깑?긵궻궫귕룊딖돸궼뼰궢)
JNE @F
POP AX
POPF
DB 0EAH ;뙰궻?귽??뒆귟뜛귒귉(JMP FAR)
TIMER_ADR DD 0
;---------- 믅륂뢎뿹 -------------------
@@: MOV AL,20H ;EOI SET
OUT 20H,AL
POP AX
POPF
STI
IRET
;============== 긡깛?먠믦 ======================================
;AH=긡깛?
TIMER_TMP:
PUSH AX
PUSH BX
MOV AL,0FFH
SUB AL,AH
XOR AH,AH
MOV BX,AX ;괦괦?궥귡
SHL AX,01
ADD BX,AX
SHL AX,01
SHL AX,01
ADD AX,BX
SHR AX,01 ;괰궳뒆귡
SHR AX,01
SHR AX,01 ;궇귦궧궲괦갆괨괯괫?
MOV CS:TMP_SPD,AL ;긡깛?먠믦
POP BX
POP AX
RET
;============== 벫롪뒆귟뜛귒궻룊딖깑??깛 =====================
TIMEINT_PROC:
RETF
; =================== 춈걋 닢?(CODE SEGMENT) ==================
EVEN
; ------------------- 벫빶깗?긏 -------------------------------
BASE_ADR DW 220H ;굍괶괦괮궻긢긲긅깑긣긹?긚귺긤깒긚
MIDI_ADR DW 330H ;굍괶괦괮굃굊굏궻긹?긚귺긤깒긚
CS_SAVE DW 0000H ;CS?떳?? 닢?
SS_SAV1 DW 0000H ;INT40?SS,SP 떳?? 닢?
SP_SAV1 DW 0000H ;(歌콤?福분?떻텐)
SS_SAV2 DW 0000H ;歌콤?福분?SS,SP 떳?? 닢?
SP_SAV2 DW 0000H
INTMASK DW 00H ;PIC궻?긚긏긢??(+0:絿육 +1:쌘겁?
TIMER_FLG DB 0 ;괻굃돶뙶궻?귽??긓깛긣깓?깑궻뭠
SOUND_FLG DB 0 ;뚼됈돶쁝돶긇긂깛??
; ------------------- DRIVER BUFF -------------------------------
SOU_SEG DW 0000H ;볐떫?춈걋?씀射噴
SOU_OFF DW 0000H ;볐떫?춈걋?됫쒸?
BGM_SEG DW 0000H ;BGM 춈걋?씀射噴
BGM_OFF DW 0000H ;BGM 춈걋?됫쒸?
FMVOL DB 00H,00 ;괻굃돶뙶궻?깏깄??먠믦
READFLG DB 00H ;긲긃?긤귺긂긣궻렳뛱륉뫴
ADR_NO DB 00H ;렳뛱룷먢붥뜂
FM_DATA DW 0000H ;FM?황?춈걋?궂柶?(OFFSET)
SG_DATA DW 0000H ;SSG?황?춈걋?궂柶?OFFSET)
CHG_FLG DB 00H ;(0拒?ON:擊걜檳냐 1:BGM뎶몋 2:뚼됈돶뵯맳)
DB 00H;*********잗逵*************
CHGCNT DB 00H,00H,00H,00H,00H,00H ;困?TIME
CHG_W DB 00H,00H,00H,00H,00H,00H ;CHGCNT?丙?붚뜅 떨鳧걱 텐)
CHG_N DB 00H,00H,00H,00H,00H,00H ;困?漠?0 OR 0FH?캠? 困?탉)
CHGLEV DB 00H,00H,00H,00H,00H,00H ;ADD?떽?1 OR 0FFH(-1))
JL_D0 DW 0000H,0000H,0000H,0000H,0000H,0000H
JL_D1 DW 0000H,0000H,0000H,0000H,0000H,0000H
JL_D2 DW 0000H,0000H,0000H,0000H,0000H,0000H
JL_D3 DW 0000H,0000H,0000H,0000H,0000H,0000H
JL_CNT DB 00H,00H,00H,00H,00H,00H ;D1?鳴璟 떤슁
; ------------------- SOUND DATA ------------------
SOU_NO DB 0FFH ;뵯맳돶긓?긤(FF:뵯맳뭷?)
SOU_CNT DB 00H ;SOUND?柯쓰 솩뜁(WAIT)
SOU_ADD DW 0000H ;뒵챵?왼넋死
SOU_WOR DW 0000H ;뵯맳뭷궻뢂봥릶
SOU_ADR DW 0000H ;뙸띪뵽뭚뭷궻긢??귺긤깒긚
; ------------------- BGM WORK --------------------
BGM_ADD DW 0000H,0000H,0000H,0000H,0000H,0000H ;뒵뜅?춈걋?交꿇?
ONNCYOU DW 0000H,0000H,0000H,0000H,0000H,0000H ;돨?킷憑 떨鳧?
ONNKAI DW 0000H,0000H,0000H,0000H,0000H,0000H ;뒵떤 춈걋
DELAY_C DB 00H,00H,00H,00H,00H,00H ;DELAY 낫꼼
WAV_CNT DB 00H,00H,00H,00H,00H,00H ;WAVE 떨鳧?0-4)
SPE_CNT DB 00H,00H,00H,00H,00H,00H ;SPEED 떨鳧?
HENNKA DW 0000H,0000H,0000H,0000H,0000H,0000H ;困뛔? 떨鳧?
FEADCNT DB 00H,00H,00H,00H,00H,00H ;FEAD IN(OUT)렄궻돶쀊궻빾돸쀊긇긂깛??
SSG_KEY DB 00H,00H,00H ;01:ON 04:OFF(떨鳧?팰 텐)
SSG_CNT DB 00H,00H,00H ;AR,DR?떨鳧?0팍穆춈 멈떪?
SSG_V DW 0000H,0000H,0000H ;H=쓰슁 L=석낸?H=VOLUM)
KEY_SW DB 00H
DB 00H;************잗逵************
WAONW LABEL WORD
WAON DB 00H,00H ;昞憤 떽?
CONNECT DB 08H,0AH,09H,0DH ;랸邈?됴象걋?소?
OPLTBL DB 03H,05H,03H,00H ;SB16긆긻깒??귺긤깒긚
; ------------------- BGM DATA --------------------
VOLUM DB 00H,00H,00H,00H,00H,00H ;FM(3艱꼼)/SSG?뒵漠?0-15)
SOU_COL DB 00H,00H,00H,00H,00H,00H ;FM(3艱꼼)/SSG 황?艱趺浜
LFO_DA1 DB 00H,00H,00H,00H,00H,00H ;왼낭 漠?6昞?烱?
LFO_DA2 DB 00H,00H,00H,00H,00H,00H ;받阜?漠?6昞?烱?
LFO_DA3 DB 00H,00H,00H,00H,00H,00H ;왼낭 漠?6昞?烱?
LFO_DA4 DB 00H,00H,00H,00H,00H,00H ;받阜?漠?6昞?烱?
PMD_S DB 00H,00H,00H,00H,00H,00H ;뜁콤(솨璟?
SPEED DB 00H,00H,00H,00H,00H,00H ;困똔 桿?
DELAY DB 00H,00H,00H,00H,00H,00H ;LFO?떴?율金메(KEY ON 뚱)
SSG_AR DB 00H,00H,00H ;SSG?A.R
SSG_DR DB 00H,00H,00H ;SSG?D.R
SSG_SR DB 00H,00H,00H ;SSG?S.R
SSG_RR DB 00H,00H,00H ;SSG?R.R
SSG_AL DW 0000H,0000H,0000H ;SSG?A.L
SSG_DL DW 0000H,0000H,0000H ;SSG?D.L
SSG_SL DW 0000H,0000H,0000H ;SSG?S.L
SSG_RL DW 0000H,0000H,0000H ;SSG?R.L
; --------------- 돶궻뮮궠긡?긳깑 ----------------
BGM_LON DB 0C0H,60H,30H,18H,0CH,06H,03H,00H;NOMAL WAIT
DB 000H,90H,48H,24H,12H,09H,00H,00H;븘?(멣,32,64돶븘궼뢯뿀궶궋)
DB 080H,40H,20H,10H,08H,04H,02H,01H;랳쁀븘
DB 0C0H,60H,30H,18H,0CH,06H,03H,00H;븘?랳쁀븘(64돶븘궼븉됀)
; ---------------FM 돶둏긢??긡?긳깑 ------------
FONTBLH DB 00,01H,01H,01H,01H,01H,01H,01H,02H,02H,02H,02H,02H,0,0,0 ;1돋육烱
DB 00,05H,05H,05H,05H,05H,05H,05H,06H,06H,06H,06H,06H,0,0,0 ;2돋육烱
DB 00,09H,09H,09H,09H,09H,09H,09H,0AH,0AH,0AH,0AH,0AH,0,0,0 ;3돋육烱
DB 00,0DH,0DH,0DH,0DH,0DH,0DH,0DH,0EH,0EH,0EH,0EH,0EH,0,0,0 ;4돋육烱
DB 00,11H,11H,11H,11H,11H,11H,11H,12H,12H,12H,12H,12H,0,0,0 ;5돋육烱
DB 00,15H,15H,15H,15H,15H,15H,15H,16H,16H,16H,16H,16H,0,0,0 ;6돋육烱
DB 00,19H,19H,19H,19H,19H,19H,19H,1AH,1AH,1AH,1AH,1AH,0,0,0 ;7돋육烱
DB 00,1DH,1DH,1DH,1DH,1DH,1DH,1DH,1EH,1EH,1EH,1EH,1EH,0,0,0 ;8돋육烱
FONTBLL DB 00,55H,6BH,081H,098H,0B0H,0CAH,0E5H,02H,020H,041H,63H,87H,0 ;뒵떤
;********* STACK AREA *************
INT_OFF DW 0000H
INT_SEG DW 0000H ;INT40궻귺긤깒긚귩둰?궥귡
SINT_OFF DW 0000H
SINT_SEG DW 0000H ;INT1C귽깛??긫깑?귽??둰?
HINT_NO DB 5 ;긪?긤뒆귟뜛귒붥뜂(긢긲긅깑긣IRQ5)
DB 0
TMP_SPD DB 4 ;긡깛?궻뭠(룊딖뭠)
TMP_CNT DB 4 ;긡깛?궻긇긂깛??
TIMEINT_CNT DB 0 ;벫롪뒆귟뜛귒긇긂깛??(16됷궸괦됷)
TIMER_CNT DB 0 ;?귽??뒆귟뜛귒(256됷궸괦됷)
DW 127 DUP(?)
STACK_W DW 0000H
;============== 福분 석렀 =======================
DRVINIT:
MOV SP,OFFSET STACK_W ;긚?긞긏?귽깛??궻빾뛛 CMP ARGC,0 ;덙릶뼰궢갎
MOV AH,'R'
CALL KENSAKU ;빒럻쀱귩뮧귊귡
JNB DREXIT
CALL CHKMEM ;딓궸륂뮄궢궲궋귡궔갎
CMP CX,0
JE DRJP2
;---------- I/O귺긤깒긚?긃긞긏 ----------------
MOV AH,'N' ;??긤렞빶
CALL KENSAKU
JB @F
JMP SHORT DRJP4 ;??긤뼰궢
@@: MOV AH,'A' ;귺긤깒긚
CALL KENSAKU
JB @F
MOV BASE_ADR,AX ;긹?긚귺긤깒긚긜긞긣
@@: MOV AH,'I' ;뒆귟뜛귒
CALL KENSAKU
JB @F
MOV HINT_NO,AL ;긪?긤뒆귟뜛귒붥뜂
@@:
; MOV AL,80H
; CALL MIXIN_PROC ;뒆귟뜛귒붥뜂긬깋긽??벶귒궬궢
; CMP AL,0FFH
; JE DRJP4
JMP SHORT DRJP6
;////////// 긤깋귽긫?궻둎뺳 ///////////////////
DREXIT: CALL CHKMEM
CMP CX,00
JNE DRJP3
print MSG3 ;긤깋귽긫?궻둎뺳
PUSH DS
MOV AX,3561H ;뒆뜛귒긹긏??궻롦벦
INT 21H
LDS DX,DWORD PTR ES:INT_OFF
MOV AX,2561H
INT 21H
POP DS
MOV AH,49H ;륂뮄궢궲궋궫긵깓긐깋?궻둎뺳
INT 21H
JC DRJP3
MOV AX,4C00H
INT 21H
DRJP3: MOV AX,4C01H
INT 21H
;////////// 긤깋귽긫?궕륂뮄궢궲궋궫 ///////////
DRJP2: print MSG2 ;딓궸륂뮄궢궲궋궫
MOV AX,4C01H
INT 21H
;/////////// ??긤궕뼰궋 //////////////////////
DRJP4: print MSG1 ;FM돶뙶??긤궕궶궋
CALL CHGTBL
JMP SHORT DRJP5
;/////////// ??긤궕뾎귡 //////////////////////
DRJP6: print MSG1 ;돶뙶??긤궕궇귡
DRJP5: MOV AX,OFFSET TIMEINT_PROC ;벫롪뒆귟뜛귒먠믦
MOV WORD PTR TIMEINT_ADR,AX
MOV AX,CS
MOV WORD PTR 2[TIMEINT_ADR],AX
MOV AX,3561H
INT 21H
MOV INT_SEG,ES ;INT40궻귺긤깒긚둰?
MOV INT_OFF,BX
CLI
PUSH DS
MOV AX,CS ;璟肪捨騏 씀射噴
MOV DS,AX
MOV DX,OFFSET DRV_IO ;璟肪捨騏 됫쒸?
MOV AX,2561H
INT 21H ;INT40귩긜긞긣궥귡
POP DS
STI
MOV ES,ENVSEG ;듏떕빾릶쀌덃궻긏깏귺
MOV AH,49H
INT 21H
MOV ENVSEG,0 ;봑궻궫귕(?뱰궼돺궳귖쀇궋)
MOV AX,OFFSET STACK_W ;璟肪捨騏 뺘서?궂柶?
MOV CL,04
SHR AX,CL ;16艱꼼 諫琉捨?困뜁
INC AX
MOV DX,AX
MOV AX,3100H
INT 21H ;솩?젱?서넥?
;--------- 딓궸륂뮄궢궲궋귡궔갎 ---------------------------
;CX=0:륂뮄 궩귢댥둖:뷄륂뮄
CHKMEM: MOV AX,3561H ;뒆뜛귒긹긏??궻롦벦
INT 21H
MOV SI,OFFSET BGMINT ;붶둹궥귡먩벆귺긤깒긚
MOV DI,SI
MOV CX,OFFSET PRO_END
SUB CX,OFFSET BGMINT ;붶둹긢??릶
CLD
REPE CMPSB ;붶둹
RET
;--------- 빒럻뙚랊 ----------------------------------------
;AH=?긃긞긏궥귡빒럻긓?긤(묈빒럻귺깑긲?긹긞긣)
;뽣귟뭠 CY=OFF AX=빒럻궸븊돿궢궲궋귡릶뭠
; CY=ON 뼰궢
KENSAKU:
PUSH BX
PUSH CX
;--------- 빒럻쀱?긃긞긏 ----------------------
XOR CH,CH ;CH=0
MOV CL,ARGC ;빒럻릶벶귒뜛귒
AND CL,CL ;빒럻릶괥갎
JE KEJP3
MOV BX,0
MOV AL,'/' ;빒럻궼/?궳?긃긞긏궥귡
KELOP1: CMP AX,WORD PTR ARGV[BX] ;묈빒럻?긃긞긏
JE @F
ADD AH,'a'-'A'
CMP AX,WORD PTR ARGV[BX] ;룷빒럻?긃긞긏
JE @F
SUB AH,'a'-'A'
INC BX
LOOP KELOP1
KEJP3: STC
JMP SHORT KEJP1 ;긄깋?뢎뿹
;---------- 릶뭠?긃긞긏 -----------------------
@@: ADD BX,2 ;빒럻빁댷벍
XOR AX,AX ;릶뭠긇긂깛??룊딖돸
KELOP2: MOV CL,ARGV[BX] ;괦빒럻벶귒궬궢
SUB CL,'0' ;릶뭠붝댪?긃긞긏
JB KEJP2
CMP CL,9
JBE @F
SUB CL,'A'-'0'-10 ;묈빒럻괦괮릋?긃긞긏
JB KEJP2
CMP CL,15
JBE @F
SUB CL,'a'-'A' ;룷빒럻괦괮릋?긃긞긏
JB KEJP2
CMP CL,15
JA KEJP2
@@: SHL AX,01 ;괦괮?궥귡
SHL AX,01
SHL AX,01
SHL AX,01
XOR CH,CH
ADD AX,CX ;릶뭠돿럁
INC BX
JMP SHORT KELOP2
KEJP2: CLC
KEJP1: POP CX
POP BX
RET
;------------ INT40H궻긙긿깛긵긡?긳깑궻빾뛛 ------------------
CHGTBL: PUSH ES
PUSH AX
PUSH CX
PUSH DI
PUSH CS ;ES=CS
POP ES
CLD
MOV DI,OFFSET IO_TBL
MOV AX,OFFSET IO_RET
MOV CX,12 ;멣궲궻긡?긳깑궸볺귢귡
REP STOSW
MOV DI,OFFSET IO_TBL
MOV AX,OFFSET INT62H_SET ;INT 62H궻귒맕뚥
MOV ES:6[DI],AX
MOV AX,OFFSET INT62H_CLS
MOV ES:8[DI],AX
POP DI
POP CX
POP AX
POP ES
RET
;------------ 긽긞긜?긙?긄깏귺 ------------------------------
MSG1 DB 'YNSound Driver Version 1.51 (1995/04/18)',0DH,0AH
DB 'Sound driver installed',0DH,0AH,0DH,0AH,'$'
MSG2 DB 'Existing Sound driver enabled',0DH,0AH,0DH,0AH,'$'
MSG3 DB 'Existing Sound driver from memory',0DH,0AH,0DH,0AH,'$'
CODE ENDS
END START
;*YNSOUND /A220 /I5 /R *
;* /Axxx:BASE I/O ADRESS /Ixx:IRQ NO /R:긤깋귽긫?됶룣 *
;* /N:굍괶괦괮뼰궢 *
;*?귽??뒆귟뜛귒귩0.2148ms(1/256)궸먠믦궥귡 *
;*FNC 0CH궳3.4375mS(1/16)궻뒆귟뜛귒귩럚믦궢궫귺긤깒긚궸뵯맯됀? *
;* 덙궖릶 AL=0 DS:DX=긵깓긐깋?귺긤깒긚(RETF궳뽣귡) *
;* AL=1궻궴궖룊딖륉뫴궸뽣궥 *
;================================================================
; CRTV 福분 솔?
FM_PORT EQU 0
AFM_PORT EQU 2
MIX_PORT EQU 4
print MACRO BUFF
PUSH DS
PUSH AX
PUSH DX
MOV AX,CS
MOV DS,AX
MOV DX,OFFSET BUFF
MOV AH,09H
INT 21H
POP DX
POP AX
POP DS
ENDM
;------------------ 冷?璟肪捨?-------------------------------
CODE SEGMENT PUBLIC
ASSUME CS:CODE,DS:CODE,ES:CODE,SS:CODE
ORG 2CH
ENVSEG DW ? ;듏떕빾릶쀌덃궻긜긐긽깛긣
ORG 80H
ARGC DB ? ;긓?깛긤깋귽깛빒럻릶
ARGV DB 127 DUP(?) ;긓?깛긤깋귽깛빒럻쀱
ORG 100H ;COM 偈꾸
START: JMP DRVINIT ;INT40긜긞긣깑??깛귉
;========= BGM-DRV 붰콕겟 福분 석?鳴줍 (INT40)============
DRV_IO: CLI ;福분 STOP
PUSH BX
MOV BL,AH
SHL BL,01
XOR BH,BH
ADD BX,OFFSET IO_TBL
CALL CS:[BX]
POP BX
STI ;福분 ON
IRET
IO_TBL DW IO_INIT,NOISE_SET,SOUND_SET,VSYNC_START,ALL_STOP
DW SOUND_CODE,BGM_SET,BGM_START,BGM_END,FEAD_OUT
DW FLAG_READ,FMVOL_SET,ADR_SET
;------------ ??긤뼰궢 -----------------------
IO_RET: XOR AX,AX ;긖긂깛긤??긤궕뼰궋
RET
;------------ INT 62H먠믦 ----------------------
INT62H_SET:
CALL TIMER_INIT
XOR AX,AX
RET
;------------ INT 62H됶룣 ----------------------
INT62H_CLS:
CALL TIMER_STOP
XOR AX,AX
RET
;------------- 석렀 鳴줍 (AH=00) ---------------
;AH=0
IO_INIT:
PUSH DS
PUSH AX
PUSH SI
MOV BYTE PTR CS:SOU_NO,0FFH ;뵯맳돶긓?긤(FF:뵯맳뭷?)
MOV BYTE PTR CS:WAON,1 ;昞阜?쒸?
CALL DATA_INIT
MOV AX,CS
MOV DS,AX
;----------- 굈굊굂괨룊딖먠믦 ------------------
MOV DX,BASE_ADR ;굍괶괦괮궻긹?긚귺긤깒긚
ADD DX,AFM_PORT ;굈굊굂괨?괪긆긻깒??긾?긤
MOV AX,0105H
CALL FMOUT_PROC
MOV AX,3F04H
CALL FMOUT_PROC
MOV AX,01 ;돶뙶??긤궕궇귡
POP SI
POP AX
POP DS
RET
;-------------- ?꼍? 쒸챵 鳴줍 (AH=01) ---------------
;AH=1:AL=?꼍? 서너 슁(Noise Period)
NOISE_SET:
RET ;뼰럨
;------ SOUND START ADRESS SET (AH=02) ---------------
;AH=02: DS:SI=볐떫?춈걋?앴캐 궂柶?
SOUND_SET:
PUSH AX
MOV AX,DS
MOV CS:SOU_SEG,AX
MOV CS:SOU_OFF,SI
POP AX
RET
;----?귽??? 굍굎?굌굎(AH=03) ---------------
;AH=03:AL=NUL
VSYNC_START:
PUSH DS
PUSH ES
PUSH AX
PUSH BX
PUSH DX
MOV BYTE PTR CS:CHG_FLG,0 ;돶뒁뎶몋귩뼰럨궥귡
CALL TIMER_INIT
;----- 뚼됈돶뾭?귽??긜긞긣 ------------------
MOV AX,351CH ;롦벦
INT 21H
MOV CS:SINT_OFF,BX ;귺긤깒긚둰?
MOV CS:SINT_SEG,ES
MOV AX,CS
MOV DS,AX
MOV DX,OFFSET LFO_CONTROL ;뒆귟뜛귒깑??깛긜긞긣
MOV AX,251CH ;뒆귟뜛귒붥뜂
INT 21H
POP DX
POP BX
POP AX
POP ES
POP DS
RET
;-------------- ALL STOP (AH=04) ---------------
;AH=04:AL=NUL
ALL_STOP:
PUSH DS
PUSH ES
PUSH AX
PUSH BX
PUSH DX
CALL TIMER_STOP
LDS DX,DWORD PTR CS:SINT_OFF ;귺긤깒긚벶귒궬궢
MOV AX,251CH ;뒆귟뜛귒붥뜂벶귒궬궢
INT 21H
;--------- 깗?긏룊딖돸 ------------------------
MOV AX,CS
MOV DS,AX ;DS=CS
MOV BYTE PTR SOUND_FLG,0 ;뚼됈돶쁝돶긇긂깛??룊딖돸
CALL DATA_INIT ;싶伺?춈걋 석렀
MOV AH,05
ASLOP1: CALL KEYSUB ;KEY OFF
DEC AH
JNL ASLOP1
CALL FMCOL_INIT ;괻굃돶뙶깏깏?긚귖긏깏귺
POP DX
POP BX
POP AX
POP ES
POP DS
RET
;-------------- SOUND CODE SET (AH=05) ---------------
;AH=05:AL=CODE
SOUND_CODE:
PUSH AX
CALL SOUND_ON
POP AX
RET
;-------- BGM START ADRESS SET (AH=06) ---------------
;AH=06 AL=昞阜?6?캠?볐떫?식?? DS:SI=BGM 춈걋?앴캐 궂柶?
BGM_SET:
PUSH AX
MOV BYTE PTR CS:WAON,6 ;昞阜?쒸?
MOV AX,DS
MOV CS:BGM_SEG,AX
MOV CS:BGM_OFF,SI
POP AX
RET
;-------------- BGM START (AH=07) ---------------
;AH=07:AL=NUL
BGM_START:
PUSH DS
PUSH AX
PUSH BX
PUSH CX
PUSH SI
CALL DATA_INIT ;깗?긏룊딖돸
CALL FMCOL_INIT ;괻굃궻돶륡궸괥붥귩긜긞긣궢긤깋귽긫?궻깗?긏귩뜃귦궧귡
MOV DS,CS:BGM_SEG
MOV BX,CS:BGM_OFF
MOV SI,10H ;긬?긣긢??궻긶긞?
BSLOP1: MOV AX,[SI+BX] ;BGM 춈걋?古잗12艱꼼?BGM_ADD?
ADD AX,BX ;긆긲긜긞긣궻궦귢귩뢇맫
MOV CS:BGM_ADD-10H[SI],AX ;(떳 諫걜?앴캐궂柶슐?痂?꾸)
INC SI
INC SI
CMP SI,1CH
JB BSLOP1
MOV SI,02H ;돶륡긢??긆긲긜긞긣
MOV AX,[SI+BX]
ADD AX,BX ;긆긲긜긞긣궻궦귢귩뢇맫
MOV CS:FM_DATA,AX
INC SI
INC SI
MOV AX,[SI+BX]
ADD AX,BX ;긆긲긜긞긣궻궦귢귩뢇맫
MOV CS:SG_DATA,AX
MOV AX,0800H
XOR AX,AX ;돶궻뮮궠깏긜긞긣
MOV CX,6
MOV BX,OFFSET ONNCYOU
BSLOP3: MOV CS:[BX],AX
INC BX
INC BX
LOOP BSLOP3
MOV BYTE PTR CS:TIMER_FLG,3FH ;?귽???괶궴귖벍띿궠궧귡
OR BYTE PTR CS:CHG_FLG,02H ;뎶몋긲깋긐긜긞긣
AND BYTE PTR CS:CHG_FLG,0FEH ;擊걜檳냐긲깋긐긏깏귺
MOV BYTE PTR CS:TMP_SPD,1 ;긡깛?긇긂깛??띍뛼뭠
MOV BYTE PTR CS:TMP_CNT,1 ;뙸긇긂깛??띍뛼뭠
POP SI
POP CX
POP BX
POP AX
POP DS
RET
;-------------- BGM END (AH=08) ---------------
;AH=08:AL=NUL
BGM_END:
TEST BYTE PTR CS:CHG_FLG,02H ;뎶몋긲깋긐뵽뭚
JE BEJP1
CLD
PUSH DS
PUSH ES
PUSH AX
PUSH CX
PUSH DI
MOV AX,CS
MOV DS,AX ;DS=CS
MOV ES,AX
XOR AX,AX
MOV CX,35
MOV DI,OFFSET FM_DATA
REP STOSW
MOV CX,45
MOV DI,OFFSET VOLUM
REP STOSW
MOV AH,05
BELOP1: CALL KEYSUB ;KEY OFF
DEC AH
JNL BELOP1
CALL FMCOL_INIT ;괻굃돶뙶깏깏?긚귖긏깏귺
AND BYTE PTR CS:CHG_FLG,0FDH ;뎶몋긲깋긐긏깏귺
POP DI
POP CX
POP AX
POP ES
POP DS
BEJP1: RET
;-------------- FEAD OUT(AH=09) ---------------
;AL=擊걜檳냐 춈걋(7-4:困뛔? 3-0:困?율?
FEAD_OUT:
TEST BYTE PTR CS:CHG_FLG,02H ;뎶몋긲깋긐뵽뭚
JE FOJP1
PUSH DS
PUSH AX
PUSH BX
PUSH CX ;CALL뻔춈 CX?쨋?꾸
MOV BX,CS
MOV DS,BX
AND BYTE PTR CHG_FLG,0FEH ;긲긃?긤귺긂긣긲깋긐깏긜긞긣
MOV AH,91H
XCHG AH,AL
MOV BX,WAONW
DEC BX
FOLOP1: PUSH AX
CALL BGMCHG
POP AX
DEC BX
JNL FOLOP1
OR CHG_FLG,01H ;긲긃?긤귺긂긣긲깋긐긜긞긣
POP CX
POP BX
POP AX
POP DS
FOJP1: RET
;------------- FLAG 벶귒궬궢 (AH=0AH) ---------------
FLAG_READ:
XOR AH,AH
MOV AL,CS:CHG_FLG ;긲깋긐귩벶귒뢯궥
RET ;(0拒?ON:擊걜檳냐 1:BGM뎶몋 2:뚼됈돶뵯맳)
;---------- 괻굃돶쀊먠믦 (AH=0BH) ---------------
FMVOL_SET:
PUSH DS
PUSH ES
MOV CS:FMVOL,AL ;괻굃돶뙶궻돶쀊귩빾뛛궥귡
MOV AX,CS
MOV DS,AX ;DS=CS
MOV ES,BGM_SEG ;BGM 챨읠 씀射噴
XOR AH,AH
FSLOP1: CALL FVOLUM ;돶쀊떗맕빾뛛
INC AH
CMP AH,03
JNE FSLOP1
POP ES
POP DS
RET
;--- 3.4375mS뒆귟뜛귒귺긤깒긚먠믦(AH=0CH) ------
ADR_SET:
CMP AL,01
JE @F
MOV WORD PTR CS:TIMEINT_ADR,DX
MOV WORD PTR CS:2[TIMEINT_ADR],DS
RET
@@: MOV AX,OFFSET TIMEINT_PROC ;룊딖돸렄
MOV WORD PTR CS:TIMEINT_ADR,AX
MOV AX,CS
MOV WORD PTR CS:2[TIMEINT_ADR],AX
RET
;=========== ALL DATA INIT 鳴줍 ======================
;LFO,VOLUM 탠?싶伺?석렀 쌕
;뗘謬?CLI ?솩?낸?
DATA_INIT:
CLD
PUSH ES
PUSH AX
PUSH CX
PUSH DI
MOV AX,CS
MOV ES,AX
XOR AX,AX
MOV CX,47 ;10 솨슁
MOV DI,OFFSET READFLG
REP STOSW
MOV CX,37
MOV DI,OFFSET ONNCYOU
REP STOSW
MOV CX,45
MOV DI,OFFSET VOLUM
REP STOSW
POP DI
POP CX
POP AX
POP ES
RET
;=========== 괻굃돶륡룊딖돸 ================
;깒긙긚?빾뛛뼰궢
FMCOL_INIT:
PUSH DS
PUSH ES
PUSH AX
PUSH CX
MOV AX,CS
MOV DS,AX ;DS=CS
MOV ES,BGM_SEG ;BGM 챨읠 씀射噴
XOR AH,AH ;AH=쁝돶붥뜂룊딖돸
MOV CX,6
@@: CALL FM_SOU_INIT
INC AH
LOOP @B
POP CX
POP AX
POP ES
POP DS
RET
;-------- 돶륡룊딖돸깑??깛 ----------------------------------
;FM궻돶륡귩괥붥궻돶륡궸빾뛛궢KEY OFF륉뫴궸궥귡
;AH=쁝돶붥뜂
FM_SOU_INIT:
PUSH AX
PUSH BX
PUSH CX
CALL KEYSUB ;럭OFF
MOV BL,AH
XOR BH,BH
MOV SOU_COL[BX],BH ;돶륡괥붥긜긞긣(긏깏귺궢궶궘궲귖괥)
;------- T.L INIT-----------------------
MOV DX,CS:BASE_ADR
MOV AX,3F40H ;굎갆굂긏깏귺
CALL FMOUT_PROC
MOV AL,43H
CALL FMOUT_PROC
MOV AL,48H
CALL FMOUT_PROC
MOV AL,4BH
CALL FMOUT_PROC
;------- S.L,R.R INIT ------------------
MOV AX,0FF80H ;굍굂,굌굌긏깏귺
CALL FMOUT_PROC
MOV AL,83H
CALL FMOUT_PROC
MOV AL,88H
CALL FMOUT_PROC
MOV AL,8BH
CALL FMOUT_PROC
MOV AH,BL
OR AH,0F0H
CALL KEYSUB ;럭ON(뼰돶륉뫴귩뵯맯궢깏깏?긚귩뤑궥)
AND AH,0FH
CALL KEYSUB ;럭OFF
POP CX
POP BX
POP AX
RET
;============ 콤旒艱?冷?=================
BGMINT:
MOV CS:SS_SAV1,SS
MOV CS:SP_SAV1,SP
MOV SS,CS:CS_SAVE
MOV SP,OFFSET STACK_W
PUSHF
PUSH DS
PUSH ES
PUSH AX
PUSH BX
PUSH CX
PUSH DX
PUSH SI
PUSH DI
CALL BGM_CONTROL
POP DI
POP SI
POP DX
POP CX
POP BX
POP AX
POP ES
POP DS
POPF
MOV SP,CS:SP_SAV1
MOV SS,CS:SS_SAV1
RET
;========== 돶뒁븫맕뚥 ===================
BGM_CONTROL:
MOV AX,CS
MOV DS,AX ;DS=CS
MOV ES,BGM_SEG ;BGM 챨읠 씀射噴
;FM&SSG BGM 붰콕겟
XOR BX,BX ;FM 뒵받?BX=昞?떨鳧?
BLOOP4: MOV BYTE PTR KEY_SW,00H ;럭ON OFF 탉
MOV SI,BX
SHL SI,01
DEC ONNCYOU[SI] ;돨?킷憑 - 1
JG LOPEND ;돨?킷憑 > 0 ?
MOV DI,BGM_ADD[SI]
RETUR1: MOV AX,ES:[DI] ;춈걋?櫓붇
CMP AL,80H
JB BJUMP4
JMP SHORT SETSUB ;;괶괽굃댥둖궻먠믦 JUMP
BJUMP4: TEST AH,80H ;7拒? ON?
JNE BJUMP8
PUSH AX ; (KEY OFF 쁘챵?
MOV AH,BL
CALL KEYSUB ;KEY OFF
MOV BYTE PTR KEY_SW,01 ;럭ON OFF 극
POP AX
BJUMP8: AND AH,07FH ;쌓?율 ?敬메?멈굵?
PUSH BX
PUSH AX
MOV BL,AH
XOR BH,BH
MOV AL,BGM_LON[BX] ;돨?킷憑 (낫꼼슁) 櫓분
MOV AH,BH ;AH=0
MOV ONNCYOU[SI],AX ;돨?킷憑 쒸?
POP AX
POP BX
TEST AL,0FH ;땨븘궔갎
JNE BJUMP5
MOV AH,BL
CALL KEYSUB ;긌?궻떗맕OFF
JMP SHORT BJUMP9
BJUMP5: MOV AH,BL
CALL OTOOUT ;돨 춈걋 서쬐?
CMP BYTE PTR KEY_SW,0
JE BJUMP9
MOV CL,BL
OR CL,0F0H
MOV AH,CL
CALL KEYSUB ;KEY ON
BJUMP9: INC DI
INC DI
MOV BGM_ADD[SI],DI
LOPEND: INC BX
CMP BL,WAON
JAE BJUMP7
JMP BLOOP4
BJUMP7: RET
; --------------- 괶괽굃댥둖궻긢??먠믦 -------------------
;困볐 춈렴?譚 BX,SI,DI(PUSH),AX?춈걋뜅 凱簾킨캠?? 困볐춈뢨
SETSUB: INC DI ;쨌司 춈걋?交꿇육?냈?
INC DI
PUSH DI
PUSH BX
MOV BL,AL
AND BL,70H ;솩??4拒? ?根??7拒??OFF)
MOV CL,03
SHR BL,CL ;BL=BL/16*2(3拒? 鈞?셨?
MOV DI,BX
POP BX
CALL CS:COMADR[DI]
POP DI
JMP RETUR1
COMADR DW BGMVOL,BGMCHG,BGMCOL,BGMSPD,BGM_JL,BGMSET,BGM_NOISE,BGMFLG
;------ 轟幕겉 困볐 (80H)--------
BGMVOL: ADD AH,FEADCNT[BX]
JG VOLJP2 ;돶쀊궕?귽긥긚궔갎
MOV AH,BH ;BH=0
JMP SHORT BGMVO2
VOLJP2: CMP AH,0FH ;돶쀊궕괦괫댥뤵궔갎
JBE BGMVO2
MOV AH,0FH
BGMVO2: MOV VOLUM[BX],AH
MOV AH,BL
CALL FVOLUM
RET
;------ 轟幕겉 뎔?困볐 (90H,91H)---------
BGMCHG: TEST BYTE PTR CHG_FLG,01 ;둖븫긓?깛긤궻긲긃?긤귺긂긣렳뚼뭷궔갎
JNE CHGJP3
AND AL,01H ;긲긃?긤긇긂깛??궼뢎뿹렄궸괥궸뽣귡궫귕룊딖돸궻뷠뾴뼰궢
JNE CHGJP1 ;0拒? ON
INC AL ;AL=1
JMP SHORT CHGJP2
CHGJP1: NEG AL ;AL=0FFH(-1)
CHGJP2: MOV CHGLEV[BX],AL
XOR AL,AL ;AL=0
MOV CL,04 ;AH?0-3쪨L?4-7쪨H?돋?
SHR AX,CL
MOV CL,02 ;困?솩뜁 *4 ?잃
SHR AL,CL
MOV CHG_N[BX],AH ;困?슁 쒸?
MOV CHGCNT[BX],AL ;困?솩뜁 쒸?1困떽?솩뜁)
MOV CHG_W[BX],AL ;困?솩뜁?丙맹 쒸?
CHGJP3: RET
;------ 황?困볐 (A0H)----------------
BGMCOL: MOV SOU_COL[BX],AH
MOV AH,BL
CALL FM_SOU
RET
;------ 옇콤 困볐 (B0H)----------------
BGMSPD: MOV AL,AH
CALL TIMER_TMP
;+++ out_FM 26H,AL ;율構 쒸?
RET
;------ 솩л璟&鳴璟 (CxH)--------------
BGM_JL: POP DX ;RET궂柶쉐 떳??
POP DI ;DI?櫓잗?
CMP AL,0C1H
JE JL_JP1
CMP AL,0C2H
JE JL_JP2
CMP AL,0C3H
JE JL_JP3
MOV DI,JL_D0[SI] ;C0 솩??
JL_RET: PUSH DI
PUSH DX ;聃?聃聘
RET
JL_JP1: DEC JL_CNT[BX] ;C1솩??
JE JL_RET ;0???
MOV DI,JL_D1[SI]
JMP SHORT JL_RET
JL_JP2: MOV JL_D3[SI],DI ;C2 솩??:D3?궂柶?쒸?
MOV DI,JL_D2[SI]
JMP SHORT JL_RET
JL_JP3: CMP JL_D3[SI],00 ;C3 솩??
JE JL_RET ;0???
MOV DI,JL_D3[SI]
JMP SHORT JL_RET
;------ 궂柶?쒸?(DxH)-----------------
BGMSET: POP DX
POP DI
PUSH DI
PUSH DX
CMP AL,0D1H
JE SETJP1
CMP AL,0D2H
JE SETJP2
MOV JL_D0[SI],DI ;D0 솩??
RET
SETJP1: MOV JL_CNT[BX],AH ;D1 솩??:鳴璟 떨鳧?쒸?
MOV JL_D1[SI],DI
RET
SETJP2: MOV JL_D3[SI],00H ;D2 솩??:D3 0멈?
MOV JL_D2[SI],DI
RET
;-------- Noise 뢂봥릶?빾뛛 (E0H) -----------------------------
BGM_NOISE:
RET
;-------- 둮뮗긓?깛긤긄깏귺(F0H) ----------------------------
BGMFLG: MOV CS:ADR_NO,AH ;뙸띪궼렳뛱룷먢댧뭫뵽뭚긲깋긐
RET
;---------------- FM 뒵석맘??---------------------------------
; AH=昞?艱趺浜(0-5) 황?艱趺浜?SOU_COL
FM_SOU: PUSH AX
PUSH BX
PUSH CX
PUSH DX
PUSH SI
CALL KEYSUB ;럭OFF
MOV BL,AH
XOR BH,BH
MOV BL,SOU_COL[BX] ;황?方콤
MOV CL,05H
SHL BX,CL ;BX*32
ADD BX,FM_DATA ;황倍斌읠 古잗?櫓붇
MOV SI,BX
;---------- 뢯쀍??긣?긃긞긏 -----------------
MOV DX,BASE_ADR ;뢯쀍??긣벶귒궬궢
CMP AH,03
JB @F
SUB AH,03
ADD DX,AFM_PORT ;둮뮗괻굃궸빾뛛
;---------- 돶긏깏귺 ---------------------------
@@: MOV BL,ES:14H[SI] ;FB/CONNECT
MOV BH,ES:15H[SI]
AND BX,0101H ;CONNECT궻귒
SHL BL,01
OR BL,BH ;뜃맟(뜃맟룈룜뭾댰)
XOR BH,BH
MOV CH,CONNECT[BX] ;랸邈 쉿?
ADD AH,40H
MOV AL,AH ;귺긤깒긚귩AL궸긜긞긣
MOV AH,3FH
XOR BX,BX
FLOOP4: SHR CH,01
JNB @F ;랸邈 껫殯?羈쌕
CALL FMOUT_PROC
@@: ADD AL,OPLTBL[BX] ;SB16긆긻깒??귺긤깒긚
INC BX
CMP BL,4
JB FLOOP4
MOV BYTE PTR KEY_SW,01 ;럭 ?ON OFF 극
MOV AH,CL
ADD AL,80H-0BH ;AL=0C0H궸궥귡
;---------- FB/CONNECT -------------------------
MOV AH,ES:14H[SI]
CALL FMOUT_PROC
MOV AH,ES:15H[SI]
ADD AL,3
CALL FMOUT_PROC
SUB AL,0A0H+3 ;DT/MULTI 앰맣
;--------- MULTI -------------------------------
XOR BX,BX
FLOOP1: MOV AH,ES:[SI] ;DT/MULTI??
CALL FMOUT_PROC
INC SI
ADD AL,OPLTBL[BX] ;SB16긆긻깒??귺긤깒긚
INC BX
CMP BL,4
JB FLOOP1
;--------- T.L ---------------------------------
ADD AL,40H-0BH ;T.L?켁聘
ADD SI,04H
;--------- AR/DR -------------------------------
XOR BX,BX
FLOOP2: MOV AH,ES:[SI] ;?굌벶귒궬궢
CALL FMOUT_PROC
INC SI
ADD AL,OPLTBL[BX] ;SB16긆긻깒??귺긤깒긚
INC BX
CMP BL,4
JB FLOOP2
ADD AL,20H-0BH
;---------- SL/RR ------------------------------
XOR BX,BX
FLOOP3: MOV AH,ES:[SI] ;SL/RR??
CALL FMOUT_PROC
INC SI
ADD AL,OPLTBL[BX] ;SB16긆긻깒??귺긤깒긚
INC BX
CMP BL,4
JB FLOOP3
ADD AL,60H-0BH
;------------ WS -------------------------------
XOR BX,BX
FLOOP5: MOV AH,ES:[SI] ;SL/RR??
CALL FMOUT_PROC
INC SI
ADD AL,OPLTBL[BX] ;SB16긆긻깒??귺긤깒긚
INC BX
CMP BL,4
JB FLOOP5
POP SI
POP DX
POP CX
POP BX
POP AX
JMP FVOLUM
RET
;-------------------- FM 뒵漠?쒸?-----------------------------
; 랸邈?TL ?困볐쌕
; AH=昞?艱趺浜(0-5) 뒵漠너 VOLUM
FVOLUM: PUSH AX
PUSH BX
PUSH CX
PUSH DX
PUSH SI
MOV BL,AH
XOR BH,BH
MOV BL,SOU_COL[BX] ;황?方콤
MOV CL,05H
SHL BX,CL ;BX*32
ADD BX,FM_DATA ;황倍斌읠 古잗?櫓붇
MOV SI,BX
MOV CL,AH ;쁝돶붥뜂둰?
;----------- 뢯쀍??긣?긃긞긏 ----------------
MOV DX,BASE_ADR ;뢯쀍??긣벶귒궬궢
CMP AH,03
JB @F
SUB AH,03
ADD DX,AFM_PORT ;둮뮗괻굃궸빾뛛
;----------- 돶쀊걬굎굂긜긞긣 ------------------
@@: MOV BL,ES:14H[SI] ;FB/CONNECT
MOV BH,ES:15H[SI] ;FB/CONNECT
AND BX,0101H ;CONNECT???쌕
SHL BL,01
OR BL,BH
XOR BH,BH
MOV CH,CONNECT[BX] ;랸邈 쉿?
MOV BL,CL ;뙰궻쁝돶붥뜂긜긞긣
MOV AL,AH
ADD AL,40H ;TL ADRESS
MOV CL,15 ;15(VOLUM=MAX15)
SUB CL,VOLUM[BX] ;AL=VOLUM 謐斯
SHL CL,01H ;AL*4
SHL CL,01H
ADD CL,CS:FMVOL ;FM돶뙶궻돶쀊
CMP CL,3FH ;긆?긫?긲깓??긃긞긏
JB @F
MOV CL,3FH
@@: ADD SI,04H ;춈걋?TL?앴캐?
XOR BX,BX ;CL?뜀茉 떨鳧?
FVLOP1: MOV AH,ES:[SI] ;T.L 櫓잗?
SHR CH,01
JNB FVJP1 ;랸邈 껫殯?羈쌕
MOV BH,AH
AND AH,3FH ;굎굂궻귒
AND BH,0C0H ;굁굍궻귒
ADD AH,CL ;랸邈?뒵漠?묾쁨
CMP AH,3FH ;띍묈뭠?긃긞긏
JB @F
MOV AH,3FH
@@: OR AH,BH ;굎굂갅굁굍뜃맟
XOR BH,BH ;괶괾귩괥궸뽣궥
FVJP1: CALL FMOUT_PROC
INC SI
ADD AL,OPLTBL[BX] ;SB16긆긻깒??귺긤깒긚
INC BX
CMP BL,4
JB FVLOP1
POP SI
POP DX
POP CX
POP BX
POP AX
RET
;------------------- 돨 서쬐? --------------------------------
; AH=昞?艱趺浜 AL=뒵떤 춈걋
OTOOUT: PUSH AX
PUSH BX
PUSH CX
;----------- 뢂봥릶긜긞긣 ----------------------
MOV BL,AL
XOR BH,BH
MOV CH,FONTBLH[BX] ;서너슁 櫓잗?
AND BL,0FH
MOV CL,FONTBLL[BX]
MOV BL,AH
SHL BX,01
OR CH,20H ;KEY ON FLG긜긞긣
MOV ONNKAI[BX],CX
POP CX
POP BX
POP AX
RET
;-------------------- KEY ON/OFF -------------------------------
; AH=0F?H KEY ON /00?H KEY OFF
; FM/SSG ?맹仕?鳴줍킨춈 쌕
KEYSUB: PUSH AX
PUSH BX
PUSH DX
MOV BL,AH
AND BX,0FH
SHL BX,01
MOV CX,ONNKAI[BX] ;뢂봥릶벶귒궬궢
;---------- 긌?굈굆갅굈괻괻?긃긞긏 -----------
CMP AH,0F0H ;뙰갲긌?긆깛긲깋긐궼긜긞긣궢궲궇귡
JAE @F
XOR CX,CX
;----------- 뢯쀍??긣?긃긞긏 ----------------
@@: AND AH,0FH ;긌?긲깋긐긏깏귺
MOV DX,BASE_ADR ;뢯쀍??긣벶귒궬궢
CMP AH,03
JB @F
SUB AH,03
ADD DX,AFM_PORT ;둮뮗괻굃궸빾뛛
;----------- 긢??긜긞긣 ----------------------
@@: MOV AL,AH
ADD AL,0A0H
MOV AH,CL
CALL FMOUT_PROC
ADD AL,010H
MOV AH,CH
CALL FMOUT_PROC
POP DX
POP BX
POP AX
RET
;====== 긄깛긹깓?긵걬뚼됈돶 ===================
LFO_CONTROL:
CLI
MOV CS:SS_SAV1,SS
MOV CS:SP_SAV1,SP
MOV SS,CS:CS_SAVE
MOV SP,OFFSET STACK_W
PUSHF
PUSH DS
PUSH ES
PUSH AX
PUSH BX
PUSH CX
PUSH DX
PUSH SI
PUSH DI
CALL INTSOUND_MAIN ;뚼됈돶?긃긞긏
MOV AX,CS
MOV DS,AX ;DS=CS
MOV CX,6 ;뙰긢??궼9ms궻뒆귟뜛귒귩궰궔궯궲궋귡궫귕
VJUMP7: PUSH CX
VJUMP4: MOV ES,BGM_SEG ;BGM 챨읠 씀射噴
XOR BX,BX ;BX=昞?떨鳧?
VLOOP4: MOV SI,BX
SHL SI,01
;------ 볶뚱 LFO 붰콕겟 鳴줍 -------------------
CMP CHGCNT[BX],00H
JE VJUMP6
CALL CHGVOL ;뒵漠?困볐 鳴줍
VJUMP6: INC BX
CMP BL,WAON
JB VLOOP4
POP CX
LOOP VJUMP7
POP DI
POP SI
POP DX
POP CX
POP BX
POP AX
POP ES
POP DS
POPF
MOV SP,CS:SP_SAV1
MOV SS,CS:SS_SAV1
STI
PUSH WORD PTR CS:SINT_SEG
PUSH WORD PTR CS:SINT_OFF
RETF ;INT1CH궸긙긿깛긵
; IRET ;???
;------ 뒵漠?困볐 鳴줍(북噴?No 90H,91H)-------
CHGVOL: DEC CHG_W[BX] ;困?TIME
JG CVJP1
DEC CHG_N[BX] ;困?漠?
JNL CVJP2 ;毆탐?
MOV BYTE PTR CHGCNT[BX],00H
MOV BYTE PTR FEADCNT[BX],00H ;긲긃?긤긇긂깛??긏깏귺
TEST BYTE PTR CHG_FLG,01 ;둖븫긓?깛긤궔갎
JE CVJP1
AND BYTE PTR CHG_FLG,0FEH ;긲긃?긤귺긂긣뢎뿹(긲깋긐긏깏귺)
MOV AX,0800H ;돶긏깏귺
CALL BGM_END ;BGM궻긚긣긞긵
JMP SHORT CVJP1
CVJP2: MOV AH,CHGCNT[BX] ;MOV CHG_W,CHGCNT
MOV CHG_W[BX],AH
MOV AH,CHGLEV[BX] ;困?謐斯(90H=01 91H=0FFH)
ADD FEADCNT[BX],AH ;긲긃?긤긇긂깛??빾뛛
ADD AH,VOLUM[BX]
JG CVJP3 ;뒵漠?毆탐?
MOV AH,BH ;AH=0
JMP SHORT CVJP4
CVJP3: CMP AH,0FH ;뒵漠?15?
JNA CVJP4
MOV AH,0FH
CVJP4: CALL BGMVO2 ;뒵漠?쒸?
MOV SI,BX
SUB SI,03 ;SSG?VOLUM LFO ?뒵漠?쒸?
JB CVJP1
SHL SI,01
MOV AX,SSG_V[SI]
ADD AH,CHGLEV[BX] ;困?謐斯(90H=01 91H=0FFH)
JNL CVJP6 ;뒵漠?毆탐?
MOV AH,BH ;AH=0
JMP SHORT CVJP7
CVJP6: CMP AH,0FH ;뒵漠?15?
JNA CVJP7
MOV AH,0FH
CVJP7: MOV SSG_V[SI],AX ;뒵漠?쒸?
CVJP1: RET
;@===============================================================
;* 뚼됈돶뵯맳깑??깛 *
;================================================================
;============= 뚼됈돶뒆귟뜛귒긓깛긣깓?깑 =======================
;뒆귟뜛귒뚼됈돶긓깛긣깓?깑
INTSOUND_MAIN:
CMP BYTE PTR CS:SOU_NO,0FFH ;뚼됈돶뼰궢륉뫴갎
JE @F
DEC BYTE PTR CS:SOU_CNT
JNE @F
MOV AL,CS:SOU_NO ;렅궻뚼됈돶뵯맳
CALL SOUND_ON
@@: RET
;============== 뚼됈돶뵯맳 ======================================
;AL=뚼됈돶붥뜂
;AX댥둖빾뛛뼰궢
SOUND_ON:
PUSH DS
PUSH BX
PUSH SI
OR BYTE PTR CS:CHG_FLG,04H ;뚼됈돶뵯맳륉뫴
AND AL,AL ;뚼됈돶긏깏귺갎
JNE @F
AND BYTE PTR CS:CHG_FLG,0FBH ;뚼됈돶긲깋긐긏깏귺
@@: MOV BL,AL ;뚼됈돶붥뜂
XOR AH,AH
SHL AX,01 ;괦긢??괦괮긫귽긣
SHL AX,01
SHL AX,01
SHL AX,01
MOV DS,CS:SOU_SEG ;뚼됈돶긢??귺긤깒긚벶귒궬궢
ADD AX,CS:SOU_OFF
MOV SI,AX
MOV AL,0DH[SI] ;뚼됈돶붥뜂
MOV CS:SOU_NO,AL
MOV AL,0EH[SI] ;뚼됈돶긂긄귽긣
MOV CS:SOU_CNT,AL
XOR AL,AL
CALL SOUNDFM_SET
POP SI
POP BX
POP DS
RET
;=============== 돶륡먠믦 =======================================
;AL=긜긞긣궥귡쁝돶붥뜂(0?5)
;BL=뚼됈돶붥뜂
;DS:SI=긢??귺긤깒긚
;AX,SI빾뛛궇귟
SOUNDFM_SET:
PUSH CX
PUSH DX
;----------- 뢯쀍??긣?긃긞긏 ----------------
MOV DX,CS:BASE_ADR ;뢯쀍??긣벶귒궬궢
CMP AL,03
JB @F
SUB AL,03
ADD DX,AFM_PORT ;둮뮗괻굃궸빾뛛
;----------- 뚼됈돶긏깏귺 ----------------------
@@: ADD AL,0B6H
XOR AH,AH
CALL FMOUT_PROC ;KEY OFF
SUB AL,63H ;2OP궻굎굂긜깒긏긣
MOV AH,3FH ;뿼뺴궻긆긻깒??귩긏깏귺
CALL FMOUT_PROC
SUB AL,3
CALL FMOUT_PROC
SUB AL,20H ;AL=030H
AND BL,BL ;뼰돶륉뫴궻뚼됈돶갎
JE SFSJP1
;----------- 긢??긜긞긣 ----------------------
MOV CX,4 ;MULI,TL,AR,SL긜긞긣
@@: MOV AH,[SI] ;긢??벶귒궬궢
CALL FMOUT_PROC
INC SI
ADD AL,03
MOV AH,[SI] ;긢??벶귒궬궢
CALL FMOUT_PROC
INC SI
ADD AL,20H-3
LOOP @B
ADD AL,40H ;AL=F0H
;----------- 굒굍긜긞긣 ------------------------
MOV AH,[SI] ;긢??벶귒궬궢
CALL FMOUT_PROC
INC SI
ADD AL,03
MOV AH,[SI] ;긢??벶귒궬궢
CALL FMOUT_PROC
INC SI
SUB AL,33H-6 ;AL=C6H
;----------- 괻괶먠믦 --------------------------
MOV AH,[SI]
CALL FMOUT_PROC
INC SI
SUB AL,20H ;AL=A6H
;----------- 뢂봥릶긜긞긣 ----------------------
MOV AH,[SI] ;긢??벶귒궬궢
CALL FMOUT_PROC
INC SI
ADD AL,10H
MOV AH,[SI] ;긢??벶귒궬궢
CALL FMOUT_PROC ;KEY ON
SFSJP1: POP DX
POP CX
RET
;@===============================================================
;* 긢??볺뢯쀍깑??깛 *
;================================================================
;================== FM긢??긜긞긣 ==============================
;굍괶괦괮궻DX궳럚렑궠귢궫괻굃??긣궸긢??귩뢯쀍궥귡
;AL=긓?깛긤 AH=긢??
;DX=뢯쀍??긣귺긤깒긚
;깒긙긚?빾뛛뼰궢
FMOUT_PROC:
PUSH AX
PUSH CX
OUT DX,AL ;긓?깛긤뢯쀍
MOV CX,1H
@@: IN AL,DX
LOOP @B
XCHG AL,AH
INC DX
OUT DX,AL ;긢??뢯쀍
DEC DX
MOV CX,3H ;긂긄귽긣긇긂깛긣
@@: IN AL,DX
LOOP @B
POP CX
POP AX
RET
;================ 굃괿굓긢??벶귒궬궢 ===========================
;굍괶괦괮궻둮뮗괻굃??긣궸긢??귩뢯쀍궥귡(+4,+5)
;AL=긓?깛긤
;뽣귟뭠 AL=긢??
;깒긙긚?빾뛛뼰궢
MIXIN_PROC:
PUSH DX
MOV DX,CS:BASE_ADR
ADD DX,MIX_PORT
OUT DX,AL ;긓?깛긤뢯쀍
INC DX
IN AL,DX
POP DX
RET
PRO_END DW 0
;================================================================
;* ?귽??뒆귟뜛귒맕뚥 *
;================================================================
;================ ?귽??룊딖돸 ================================
TIMER_INIT:
PUSH DS
PUSH ES
PUSH AX
PUSH BX
PUSH DX
MOV AX,3508H ;?귽??뒆귟뜛귒귺긤깒긚벶귒궬궢
INT 21H
MOV WORD PTR CS:TIMER_ADR,BX
MOV WORD PTR CS:2[TIMER_ADR],ES
MOV AX,CS
MOV DS,AX ;뒆귟뜛귒깑??깛귺긤깒긚먠믦
MOV DX,OFFSET TIMER_PLAY
MOV AX,2508H
INT 21H
;--------- ?귽??뢂딖빾뛛 ------------
MOV AL,36H ;뺴?봥
OUT 43H,AL
MOV AX,100H ;뢂딖귩1/256궸빾뛛(214uS)
OUT 40H,AL
MOV AL,AH
OUT 40H,AL
MOV BYTE PTR CS:TIMEINT_CNT,16 ;벫롪뒆귟뜛귒궻긇긂깛??
MOV BYTE PTR CS:TIMER_CNT,0 ;뙰갲궻?귽??뒆귟뜛귒
POP DX
POP BX
POP AX
POP ES
POP DS
RET
;============= 긚긣긞긵뼺쀟 ======================================
TIMER_STOP:
PUSH DS
PUSH AX
PUSH DX
LDS DX,DWORD PTR CS:TIMER_ADR ;귺긤깒긚벶귒궬궢
MOV AX,2508H
INT 21H
;--------- ?귽??뢂딖빾뛛 ------------
MOV AL,36H ;뺴?봥
OUT 43H,AL
XOR AX,AX ;55ms궸뽣궥
OUT 40H,AL
MOV AL,AH
OUT 40H,AL
POP DX
POP AX
POP DS
RET
;============= ?귽??뒆귟뜛귒맕뚥긽귽깛 =============================
TIMER_PLAY:
CLI
PUSHF
PUSH AX
TEST BYTE PTR CS:CHG_FLG,02H ;뎶몋긲깋긐?긃긞긏
JE @F
DEC BYTE PTR CS:TMP_CNT ;긡깛?궸궇귦궧귡
JNE @F
MOV AL,CS:TMP_SPD
MOV CS:TMP_CNT,AL
CALL BGMINT ;긖긂깛긤긓깛긣깓?깑귉
;---------- 벫롪뒆귟뜛귒귉 -------------
@@: DEC BYTE PTR CS:TIMEINT_CNT ;긇긂깛??괦덙궘
JNE @F
MOV BYTE PTR CS:TIMEINT_CNT,16
DB 09AH ;벫롪?귽??뒆귟뜛귒빁뢂(JMP FAR)
TIMEINT_ADR DD 0
CLI ;STI륉뫴궻됀?맜궕갋갋갋
;------ 뙰궻?귽??뒆귟뜛귒귉 ---------
@@: DEC BYTE PTR CS:TIMER_CNT ;긇긂깛??괦덙궘(256궳깑?긵궻궫귕룊딖돸궼뼰궢)
JNE @F
POP AX
POPF
DB 0EAH ;뙰궻?귽??뒆귟뜛귒귉(JMP FAR)
TIMER_ADR DD 0
;---------- 믅륂뢎뿹 -------------------
@@: MOV AL,20H ;EOI SET
OUT 20H,AL
POP AX
POPF
STI
IRET
;============== 긡깛?먠믦 ======================================
;AH=긡깛?
TIMER_TMP:
PUSH AX
PUSH BX
MOV AL,0FFH
SUB AL,AH
XOR AH,AH
MOV BX,AX ;괦괦?궥귡
SHL AX,01
ADD BX,AX
SHL AX,01
SHL AX,01
ADD AX,BX
SHR AX,01 ;괰궳뒆귡
SHR AX,01
SHR AX,01 ;궇귦궧궲괦갆괨괯괫?
MOV CS:TMP_SPD,AL ;긡깛?먠믦
POP BX
POP AX
RET
;============== 벫롪뒆귟뜛귒궻룊딖깑??깛 =====================
TIMEINT_PROC:
RETF
; =================== 춈걋 닢?(CODE SEGMENT) ==================
EVEN
; ------------------- 벫빶깗?긏 -------------------------------
BASE_ADR DW 220H ;굍괶괦괮궻긢긲긅깑긣긹?긚귺긤깒긚
MIDI_ADR DW 330H ;굍괶괦괮굃굊굏궻긹?긚귺긤깒긚
CS_SAVE DW 0000H ;CS?떳?? 닢?
SS_SAV1 DW 0000H ;INT40?SS,SP 떳?? 닢?
SP_SAV1 DW 0000H ;(歌콤?福분?떻텐)
SS_SAV2 DW 0000H ;歌콤?福분?SS,SP 떳?? 닢?
SP_SAV2 DW 0000H
INTMASK DW 00H ;PIC궻?긚긏긢??(+0:絿육 +1:쌘겁?
TIMER_FLG DB 0 ;괻굃돶뙶궻?귽??긓깛긣깓?깑궻뭠
SOUND_FLG DB 0 ;뚼됈돶쁝돶긇긂깛??
; ------------------- DRIVER BUFF -------------------------------
SOU_SEG DW 0000H ;볐떫?춈걋?씀射噴
SOU_OFF DW 0000H ;볐떫?춈걋?됫쒸?
BGM_SEG DW 0000H ;BGM 춈걋?씀射噴
BGM_OFF DW 0000H ;BGM 춈걋?됫쒸?
FMVOL DB 00H,00 ;괻굃돶뙶궻?깏깄??먠믦
READFLG DB 00H ;긲긃?긤귺긂긣궻렳뛱륉뫴
ADR_NO DB 00H ;렳뛱룷먢붥뜂
FM_DATA DW 0000H ;FM?황?춈걋?궂柶?(OFFSET)
SG_DATA DW 0000H ;SSG?황?춈걋?궂柶?OFFSET)
CHG_FLG DB 00H ;(0拒?ON:擊걜檳냐 1:BGM뎶몋 2:뚼됈돶뵯맳)
DB 00H;*********잗逵*************
CHGCNT DB 00H,00H,00H,00H,00H,00H ;困?TIME
CHG_W DB 00H,00H,00H,00H,00H,00H ;CHGCNT?丙?붚뜅 떨鳧걱 텐)
CHG_N DB 00H,00H,00H,00H,00H,00H ;困?漠?0 OR 0FH?캠? 困?탉)
CHGLEV DB 00H,00H,00H,00H,00H,00H ;ADD?떽?1 OR 0FFH(-1))
JL_D0 DW 0000H,0000H,0000H,0000H,0000H,0000H
JL_D1 DW 0000H,0000H,0000H,0000H,0000H,0000H
JL_D2 DW 0000H,0000H,0000H,0000H,0000H,0000H
JL_D3 DW 0000H,0000H,0000H,0000H,0000H,0000H
JL_CNT DB 00H,00H,00H,00H,00H,00H ;D1?鳴璟 떤슁
; ------------------- SOUND DATA ------------------
SOU_NO DB 0FFH ;뵯맳돶긓?긤(FF:뵯맳뭷?)
SOU_CNT DB 00H ;SOUND?柯쓰 솩뜁(WAIT)
SOU_ADD DW 0000H ;뒵챵?왼넋死
SOU_WOR DW 0000H ;뵯맳뭷궻뢂봥릶
SOU_ADR DW 0000H ;뙸띪뵽뭚뭷궻긢??귺긤깒긚
; ------------------- BGM WORK --------------------
BGM_ADD DW 0000H,0000H,0000H,0000H,0000H,0000H ;뒵뜅?춈걋?交꿇?
ONNCYOU DW 0000H,0000H,0000H,0000H,0000H,0000H ;돨?킷憑 떨鳧?
ONNKAI DW 0000H,0000H,0000H,0000H,0000H,0000H ;뒵떤 춈걋
DELAY_C DB 00H,00H,00H,00H,00H,00H ;DELAY 낫꼼
WAV_CNT DB 00H,00H,00H,00H,00H,00H ;WAVE 떨鳧?0-4)
SPE_CNT DB 00H,00H,00H,00H,00H,00H ;SPEED 떨鳧?
HENNKA DW 0000H,0000H,0000H,0000H,0000H,0000H ;困뛔? 떨鳧?
FEADCNT DB 00H,00H,00H,00H,00H,00H ;FEAD IN(OUT)렄궻돶쀊궻빾돸쀊긇긂깛??
SSG_KEY DB 00H,00H,00H ;01:ON 04:OFF(떨鳧?팰 텐)
SSG_CNT DB 00H,00H,00H ;AR,DR?떨鳧?0팍穆춈 멈떪?
SSG_V DW 0000H,0000H,0000H ;H=쓰슁 L=석낸?H=VOLUM)
KEY_SW DB 00H
DB 00H;************잗逵************
WAONW LABEL WORD
WAON DB 00H,00H ;昞憤 떽?
CONNECT DB 08H,0AH,09H,0DH ;랸邈?됴象걋?소?
OPLTBL DB 03H,05H,03H,00H ;SB16긆긻깒??귺긤깒긚
; ------------------- BGM DATA --------------------
VOLUM DB 00H,00H,00H,00H,00H,00H ;FM(3艱꼼)/SSG?뒵漠?0-15)
SOU_COL DB 00H,00H,00H,00H,00H,00H ;FM(3艱꼼)/SSG 황?艱趺浜
LFO_DA1 DB 00H,00H,00H,00H,00H,00H ;왼낭 漠?6昞?烱?
LFO_DA2 DB 00H,00H,00H,00H,00H,00H ;받阜?漠?6昞?烱?
LFO_DA3 DB 00H,00H,00H,00H,00H,00H ;왼낭 漠?6昞?烱?
LFO_DA4 DB 00H,00H,00H,00H,00H,00H ;받阜?漠?6昞?烱?
PMD_S DB 00H,00H,00H,00H,00H,00H ;뜁콤(솨璟?
SPEED DB 00H,00H,00H,00H,00H,00H ;困똔 桿?
DELAY DB 00H,00H,00H,00H,00H,00H ;LFO?떴?율金메(KEY ON 뚱)
SSG_AR DB 00H,00H,00H ;SSG?A.R
SSG_DR DB 00H,00H,00H ;SSG?D.R
SSG_SR DB 00H,00H,00H ;SSG?S.R
SSG_RR DB 00H,00H,00H ;SSG?R.R
SSG_AL DW 0000H,0000H,0000H ;SSG?A.L
SSG_DL DW 0000H,0000H,0000H ;SSG?D.L
SSG_SL DW 0000H,0000H,0000H ;SSG?S.L
SSG_RL DW 0000H,0000H,0000H ;SSG?R.L
; --------------- 돶궻뮮궠긡?긳깑 ----------------
BGM_LON DB 0C0H,60H,30H,18H,0CH,06H,03H,00H;NOMAL WAIT
DB 000H,90H,48H,24H,12H,09H,00H,00H;븘?(멣,32,64돶븘궼뢯뿀궶궋)
DB 080H,40H,20H,10H,08H,04H,02H,01H;랳쁀븘
DB 0C0H,60H,30H,18H,0CH,06H,03H,00H;븘?랳쁀븘(64돶븘궼븉됀)
; ---------------FM 돶둏긢??긡?긳깑 ------------
FONTBLH DB 00,01H,01H,01H,01H,01H,01H,01H,02H,02H,02H,02H,02H,0,0,0 ;1돋육烱
DB 00,05H,05H,05H,05H,05H,05H,05H,06H,06H,06H,06H,06H,0,0,0 ;2돋육烱
DB 00,09H,09H,09H,09H,09H,09H,09H,0AH,0AH,0AH,0AH,0AH,0,0,0 ;3돋육烱
DB 00,0DH,0DH,0DH,0DH,0DH,0DH,0DH,0EH,0EH,0EH,0EH,0EH,0,0,0 ;4돋육烱
DB 00,11H,11H,11H,11H,11H,11H,11H,12H,12H,12H,12H,12H,0,0,0 ;5돋육烱
DB 00,15H,15H,15H,15H,15H,15H,15H,16H,16H,16H,16H,16H,0,0,0 ;6돋육烱
DB 00,19H,19H,19H,19H,19H,19H,19H,1AH,1AH,1AH,1AH,1AH,0,0,0 ;7돋육烱
DB 00,1DH,1DH,1DH,1DH,1DH,1DH,1DH,1EH,1EH,1EH,1EH,1EH,0,0,0 ;8돋육烱
FONTBLL DB 00,55H,6BH,081H,098H,0B0H,0CAH,0E5H,02H,020H,041H,63H,87H,0 ;뒵떤
;********* STACK AREA *************
INT_OFF DW 0000H
INT_SEG DW 0000H ;INT40궻귺긤깒긚귩둰?궥귡
SINT_OFF DW 0000H
SINT_SEG DW 0000H ;INT1C귽깛??긫깑?귽??둰?
HINT_NO DB 5 ;긪?긤뒆귟뜛귒붥뜂(긢긲긅깑긣IRQ5)
DB 0
TMP_SPD DB 4 ;긡깛?궻뭠(룊딖뭠)
TMP_CNT DB 4 ;긡깛?궻긇긂깛??
TIMEINT_CNT DB 0 ;벫롪뒆귟뜛귒긇긂깛??(16됷궸괦됷)
TIMER_CNT DB 0 ;?귽??뒆귟뜛귒(256됷궸괦됷)
DW 127 DUP(?)
STACK_W DW 0000H
;============== 福분 석렀 =======================
DRVINIT:
MOV SP,OFFSET STACK_W ;긚?긞긏?귽깛??궻빾뛛 CMP ARGC,0 ;덙릶뼰궢갎
MOV AH,'R'
CALL KENSAKU ;빒럻쀱귩뮧귊귡
JNB DREXIT
CALL CHKMEM ;딓궸륂뮄궢궲궋귡궔갎
CMP CX,0
JE DRJP2
;---------- I/O귺긤깒긚?긃긞긏 ----------------
MOV AH,'N' ;??긤렞빶
CALL KENSAKU
JB @F
JMP SHORT DRJP4 ;??긤뼰궢
@@: MOV AH,'A' ;귺긤깒긚
CALL KENSAKU
JB @F
MOV BASE_ADR,AX ;긹?긚귺긤깒긚긜긞긣
@@: MOV AH,'I' ;뒆귟뜛귒
CALL KENSAKU
JB @F
MOV HINT_NO,AL ;긪?긤뒆귟뜛귒붥뜂
@@:
; MOV AL,80H
; CALL MIXIN_PROC ;뒆귟뜛귒붥뜂긬깋긽??벶귒궬궢
; CMP AL,0FFH
; JE DRJP4
JMP SHORT DRJP6
;////////// 긤깋귽긫?궻둎뺳 ///////////////////
DREXIT: CALL CHKMEM
CMP CX,00
JNE DRJP3
print MSG3 ;긤깋귽긫?궻둎뺳
PUSH DS
MOV AX,3561H ;뒆뜛귒긹긏??궻롦벦
INT 21H
LDS DX,DWORD PTR ES:INT_OFF
MOV AX,2561H
INT 21H
POP DS
MOV AH,49H ;륂뮄궢궲궋궫긵깓긐깋?궻둎뺳
INT 21H
JC DRJP3
MOV AX,4C00H
INT 21H
DRJP3: MOV AX,4C01H
INT 21H
;////////// 긤깋귽긫?궕륂뮄궢궲궋궫 ///////////
DRJP2: print MSG2 ;딓궸륂뮄궢궲궋궫
MOV AX,4C01H
INT 21H
;/////////// ??긤궕뼰궋 //////////////////////
DRJP4: print MSG1 ;FM돶뙶??긤궕궶궋
CALL CHGTBL
JMP SHORT DRJP5
;/////////// ??긤궕뾎귡 //////////////////////
DRJP6: print MSG1 ;돶뙶??긤궕궇귡
DRJP5: MOV AX,OFFSET TIMEINT_PROC ;벫롪뒆귟뜛귒먠믦
MOV WORD PTR TIMEINT_ADR,AX
MOV AX,CS
MOV WORD PTR 2[TIMEINT_ADR],AX
MOV AX,3561H
INT 21H
MOV INT_SEG,ES ;INT40궻귺긤깒긚둰?
MOV INT_OFF,BX
CLI
PUSH DS
MOV AX,CS ;璟肪捨騏 씀射噴
MOV DS,AX
MOV DX,OFFSET DRV_IO ;璟肪捨騏 됫쒸?
MOV AX,2561H
INT 21H ;INT40귩긜긞긣궥귡
POP DS
STI
MOV ES,ENVSEG ;듏떕빾릶쀌덃궻긏깏귺
MOV AH,49H
INT 21H
MOV ENVSEG,0 ;봑궻궫귕(?뱰궼돺궳귖쀇궋)
MOV AX,OFFSET STACK_W ;璟肪捨騏 뺘서?궂柶?
MOV CL,04
SHR AX,CL ;16艱꼼 諫琉捨?困뜁
INC AX
MOV DX,AX
MOV AX,3100H
INT 21H ;솩?젱?서넥?
;--------- 딓궸륂뮄궢궲궋귡궔갎 ---------------------------
;CX=0:륂뮄 궩귢댥둖:뷄륂뮄
CHKMEM: MOV AX,3561H ;뒆뜛귒긹긏??궻롦벦
INT 21H
MOV SI,OFFSET BGMINT ;붶둹궥귡먩벆귺긤깒긚
MOV DI,SI
MOV CX,OFFSET PRO_END
SUB CX,OFFSET BGMINT ;붶둹긢??릶
CLD
REPE CMPSB ;붶둹
RET
;--------- 빒럻뙚랊 ----------------------------------------
;AH=?긃긞긏궥귡빒럻긓?긤(묈빒럻귺깑긲?긹긞긣)
;뽣귟뭠 CY=OFF AX=빒럻궸븊돿궢궲궋귡릶뭠
; CY=ON 뼰궢
KENSAKU:
PUSH BX
PUSH CX
;--------- 빒럻쀱?긃긞긏 ----------------------
XOR CH,CH ;CH=0
MOV CL,ARGC ;빒럻릶벶귒뜛귒
AND CL,CL ;빒럻릶괥갎
JE KEJP3
MOV BX,0
MOV AL,'/' ;빒럻궼/?궳?긃긞긏궥귡
KELOP1: CMP AX,WORD PTR ARGV[BX] ;묈빒럻?긃긞긏
JE @F
ADD AH,'a'-'A'
CMP AX,WORD PTR ARGV[BX] ;룷빒럻?긃긞긏
JE @F
SUB AH,'a'-'A'
INC BX
LOOP KELOP1
KEJP3: STC
JMP SHORT KEJP1 ;긄깋?뢎뿹
;---------- 릶뭠?긃긞긏 -----------------------
@@: ADD BX,2 ;빒럻빁댷벍
XOR AX,AX ;릶뭠긇긂깛??룊딖돸
KELOP2: MOV CL,ARGV[BX] ;괦빒럻벶귒궬궢
SUB CL,'0' ;릶뭠붝댪?긃긞긏
JB KEJP2
CMP CL,9
JBE @F
SUB CL,'A'-'0'-10 ;묈빒럻괦괮릋?긃긞긏
JB KEJP2
CMP CL,15
JBE @F
SUB CL,'a'-'A' ;룷빒럻괦괮릋?긃긞긏
JB KEJP2
CMP CL,15
JA KEJP2
@@: SHL AX,01 ;괦괮?궥귡
SHL AX,01
SHL AX,01
SHL AX,01
XOR CH,CH
ADD AX,CX ;릶뭠돿럁
INC BX
JMP SHORT KELOP2
KEJP2: CLC
KEJP1: POP CX
POP BX
RET
;------------ INT40H궻긙긿깛긵긡?긳깑궻빾뛛 ------------------
CHGTBL: PUSH ES
PUSH AX
PUSH CX
PUSH DI
PUSH CS ;ES=CS
POP ES
CLD
MOV DI,OFFSET IO_TBL
MOV AX,OFFSET IO_RET
MOV CX,12 ;멣궲궻긡?긳깑궸볺귢귡
REP STOSW
MOV DI,OFFSET IO_TBL
MOV AX,OFFSET INT62H_SET ;INT 62H궻귒맕뚥
MOV ES:6[DI],AX
MOV AX,OFFSET INT62H_CLS
MOV ES:8[DI],AX
POP DI
POP CX
POP AX
POP ES
RET
;------------ 긽긞긜?긙?긄깏귺 ------------------------------
MSG1 DB 'YNSound Driver Version 1.51 (1995/04/18)',0DH,0AH
DB 'Sound driver installed',0DH,0AH,0DH,0AH,'$'
MSG2 DB 'Existing Sound driver enabled',0DH,0AH,0DH,0AH,'$'
MSG3 DB 'Existing Sound driver from memory',0DH,0AH,0DH,0AH,'$'
CODE ENDS
END START
다음검색