mirror of https://github.com/nmlgc/ReC98.git
287 lines
5.5 KiB
NASM
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 ; }
|