ReC98/libs/master.lib/bgm_init_finish.asm

287 lines
5.5 KiB
NASM

; master library - BGM
;
; Description:
; 初期化・後始末をする
;
; Function/Procedures:
; int bgm_init(int bufsiz);
; void bgm_finish(void);
;
; Parameters:
; bufsiz 1パートあたりのバッファサイズ
;
; Returns:
; BGM_COMPLETE 正常終了
; BGM_OVERFLOW メモリが足りない
;
; Binding Target:
; Microsoft-C / Turbo-C / Turbo Pascal
;
; Running Target:
; PC-9801V
;
; Requiring Resources:
; CPU: V30
;
; Notes:
;
;
; Assembly Language Note:
;
;
; Compiler/Assembler:
; TASM 3.0
; OPTASM 1.6
;
; Author:
; femy(淀 文武) : オリジナル・C言語版
; steelman(千野 裕司) : アセンブリ言語版
; 恋塚
;
; Revision History:
; 93/12/19 Initial: b_inifin.asm / master.lib 0.22 <- bgmlibs.lib 1.12
; 94/ 4/11 [M0.23] AT互換機対応
; 95/ 2/14 [M0.22k] mem_AllocID対応
; 95/ 4/ 1 [M0.22k] メモリ不足時のメモリ開放もれを修正
; 95/ 4/ 2 [M0.22k] BUGFIX EFSメモリの確保サイズが256要素には足りなかった
MRETURN macro
pop DI
pop SI
leave
ret 2
EVEN
endm
func BGM_INIT ; bgm_init() {
push BP
mov BP,SP
sub SP,2
push SI
push DI
@@bsize = (RETSIZE+1)*2
@@bsize2 = -2
nopcall GET_MACHINE
cmp glb.init,0
je short B_INIT_NOTINITIALIZED1
xor AX,AX ; BGM_COMPLETE
MRETURN
B_INIT_NOTINITIALIZED1:
;bsize2 = bufsiz;
mov DX,[BP+@@bsize]
mov [BP+@@bsize2],DX
or DX,DX
jg short B_INIT_SETBUFSIZE
mov word ptr [BP+@@bsize2],BUFMAX
B_INIT_SETBUFSIZE:
mov AX,[BP+@@bsize2]
mov glb.bufsiz,AX
;曲バッファ確保
mov DI,offset part
B_INIT_ALLOCATEMBUF:
;if ((part[cnt].mbuf = MK_FP(hmem_allocbyte(bsize2),0)) == NULL)
mov mem_AllocID,MEMID_bgm
push word ptr [BP+@@bsize2]
nopcall HMEM_ALLOCBYTE
mov word ptr [DI].mbuf+2,AX
mov word ptr [DI].mbuf,0
jnc short B_INIT_MBUFALLOCATED
mov AX,BGM_OVERFLOW
MRETURN
B_INIT_MBUFALLOCATED:
add DI,type SPART
cmp DI,offset part + (type SPART * PMAX)
jne short B_INIT_ALLOCATEMBUF
;効果音バッファ確保
mov DI,offset esound
B_INIT_ALLOCATESBUF:
;if ((esound[cnt].sbuf = MK_FP(hmem_allocbyte(SBUFMAX * sizeof(uint) + 1),0)) == NULL)
mov mem_AllocID,MEMID_efs
push (SBUFMAX * 2)+1
nopcall HMEM_ALLOCBYTE
mov word ptr [DI].sbuf+2,AX
mov word ptr [DI].sbuf,0
jnc short B_INIT_SBUFALLOCATED
push word ptr [DI].mbuf+2
mov word ptr [DI].mbuf+2,0
nopcall HMEM_FREE
mov AX,BGM_OVERFLOW
MRETURN
B_INIT_SBUFALLOCATED:
add DI,type SESOUND
cmp DI,offset esound + (type SESOUND * SMAX)
jne short B_INIT_ALLOCATESBUF
;BGMOFF
mov glb.rflg,OFF
;登録曲数
mov glb.mnum,0
;セレクト中曲番号
mov glb.mcnt,0
;パート数
mov glb.pnum,PMAX
;パートカウンタ
mov glb.pcnt,0
;終了パート数
mov glb.fin,0
;リピートON
mov glb.repsw,ON
;処理カウンタ
mov glb.tcnt,0
;曲バッファ末尾
mov glb.buflast,0
;曲ごとのテンポ情報
CLD
mov CX,MMAX
mov DI,offset glb.mtp
push DS
pop ES
mov AX,DEFTEMPO
rep stosw
;効果音OFF
mov glb.effect,OFF
;登録効果音数
mov glb.snum,0
;セレクト中効果音番号
mov glb.scnt,0
;演奏処理ON
mov glb.music,ON
;効果音処理ON
mov glb.sound,ON
;glb.clockbase = ((ulong)TVAL1ms * 120UL);
;tempo120のタイマカウント
test Machine_State,10h ; PC/AT
jz short B_INIT_PC98
mov AX,TVALATORG_RTC
jmp short B_INIT_SET_CLOCKBASE
B_INIT_PC98:
xor AX,AX
mov ES,AX
test byte ptr ES:[0501H],80h
mov AX,TVAL8ORG
jnz short B_INIT_CLOCK8MHZ
mov AX,TVAL10ORG
B_INIT_CLOCK8MHZ:
B_INIT_SET_CLOCKBASE:
and AX,0fffeh
mov DX,DEFTEMPO
mul DX
mov word ptr glb.clockbase+2,DX
mov word ptr glb.clockbase,AX
push DEFTEMPO
nopcall BGM_SET_TEMPO
;バッファクリア
mov BX,offset part.mbuf
xor DX,DX
xor AX,AX
B_INIT_BUFFERCLEARLOOP:
les DI,[BX]
mov CX,glb.bufsiz
shr CX,1
rep stosw
adc CX,CX
rep stosb
add BX,type SPART
inc DX
cmp DX,PMAX
jl short B_INIT_BUFFERCLEARLOOP
nopcall _BGM_TIMER_INIT
;BEEPモード設定
test Machine_State,10h ; PC/AT
jz short B_INIT_PC98_2
B_INIT_PCAT_2:
mov AX,TVALATORG/2
mov CX,AX
mov AL,0b6h ; CNT#2, L-H WORD, 方形波, binary
out BEEP_MODE_AT,AL ; AT
mov AL,CL ; 下位
out BEEP_CNT_AT,AL ; AT
mov AL,CH ; 上位, count start
out BEEP_CNT_AT,AL ; AT
jmp short B_INIT_DONE
EVEN
B_INIT_PC98_2:
;bgm_bell_mode(3, (INPB( CLOCK_CHK ) & 0x20) ? 998 : 1229);
xor AX,AX
mov ES,AX
test byte ptr ES:[0501H],80h
mov AX,TVAL8ORG/2
jnz short B_INIT_CLOCK8MHZ_2
mov AX,TVAL10ORG/2
B_INIT_CLOCK8MHZ_2:
mov CX,AX
;OUTB(BEEP_MODE, ((mode & 0x03) << 1) | 0x70);
mov AL,3
shl AL,1
or AL,70h
mov DX,BEEP_MODE
out DX,AL ; 98
;OUTB(BEEP_CNT, spval & 0x00ff);
mov AL,CL
mov DX,BEEP_CNT
out DX,AL ; 98
;OUTB(BEEP_CNT, spval >> 8);
mov AL,CH
out DX,AL ; 98
B_INIT_DONE:
mov glb.init,TRUE
xor AX,AX ; BGM_COMPLETE
MRETURN
endfunc ; }
func BGM_FINISH ; bgm_finish() {
push SI
cmp glb.init,0
je short @@NOTINITIALIZED2
nopcall BGM_STOP_PLAY
nopcall BGM_STOP_SOUND
nopcall _BGM_TIMER_FINISH
mov glb.init,0
@@NOTINITIALIZED2:
;曲バッファ解放
mov SI,offset part
@@FREEMBUF:
mov AX,word ptr [SI].mbuf+2
cmp AX,0
je short @@NOMBUF
push AX
nopcall HMEM_FREE
mov word ptr [SI].mbuf+2,0
@@NOMBUF:
add SI,type SPART
cmp SI,offset part+(type SPART*PMAX)
jne short @@FREEMBUF
;効果音バッファ解放
mov SI,offset esound
@@FREESBUF:
;if (esound[cnt].sbuf != NULL)
mov AX,word ptr [SI].sbuf+2
cmp AX,0
je short @@NOSBUF
push AX
nopcall HMEM_FREE
mov word ptr [SI].sbuf+2,0
@@NOSBUF:
add SI,type SESOUND
cmp SI,offset esound+(type SESOUND*SMAX)
jne short @@FREESBUF
pop SI
ret
endfunc ; }