;	PCM SOUND TREMOLO
;
;	call from F-BASIC386
;	callm address,varptr(snd.data),varptr(para),varptr(work area)
;
;
;		1990 3  Hiroshi TODA
;
;		1993 12 High C 用に改造
;
;	para:mix1(main)*256,mix2(tremolo)*256,speed,start-phase
;
; 


	.386p


param	struc

	dd	?
	dd	?
sndadd	dd	?		; snd.data address
paradd	dd	?		; para. address
wadd	dd	? 		; work address

param   ends


work	struc

;data area

mix1	dd	?		; main mix rate
mix2	dd	?		; tremolo mix rate
sp1	dd	?		; speed (90 = 10000H)
ang1	dd	?		; phase

buf1	dd	?		; buf.
buf2	dd	?

work	ends


cseg	segment	dword public use32 'CODE'
	assume	cs:cseg,ds:cseg

	public	sndTremolo
	db	'sndTremolo',10
sndTremolo	proc	near
	push	ebp
	mov	ebp,esp
	push	esi
	push	edi
	push	ebx

	mov	esi,[ebp].wadd		; esi <-- work area top add
	mov	edi,[ebp].sndadd	; edi <-- snd.data add.
	mov	ecx,[ebp].paradd	; ecx <-- para. add.
	xor	edx,edx			; edx=count
main01:	mov	eax,[ecx][edx*4]	; para. --> work area
	mov	[esi][edx*4],eax
	inc	edx
	cmp	edx,4
	jb	main01
	mov	ecx,[edi+12]		; length
	cmp	ecx,0
	je	mainE
	add	edi,32

main02:	call	red			; read
	mov	[esi].buf1,eax
	mov	eax,[esi].ang1		; cal. sin
	call	sin			; eax = sin(eax)*10000H
	add	eax,10000H
	sar	eax,1
	jns	main03
	xor	eax,eax
main03:	imul	eax,[esi].buf1
	sar	eax,16
	imul	eax,[esi].mix2
	mov	[esi].buf2,eax
	mov	eax,[esi].buf1
	imul	eax,[esi].mix1
	add	eax,[esi].buf2
	sar	eax,8
	js	main04			; eax --> pcm data
	je	main04
	cmp	eax,128			; +
	jb	main05
	mov	eax,127
	jmp	main05
main04:	mov	edx,eax			; -
	mov	eax,128
	sub	eax,edx
	cmp	eax,256-1	; data255はloopStopの意味があるから除外 1993 12
	jb	main05
	mov	eax,255-1	; data255はloopStopの意味があるから除外 1993 12
main05:	mov	[edi],al

	mov	eax,[esi].sp1
	add	[esi].ang1,eax
	inc	edi
	dec	ecx
	jne	main02

mainE:
	pop	ebx
	pop	edi
	pop	esi
	mov	esp,ebp
	pop	ebp
	ret

;	READ PCM DATA [edi]--> eax(sign)

red:	mov	al,[edi]
	and	eax,0ffH
	cmp	eax,128
	jb	red01
	mov	edx,eax
	mov	eax,128
	sub	eax,edx
red01:	ret

;	SIN	10000H*sin(eax/10000H*3.14/2) --> eax(sign)

sin:	push	ebx
	push	ecx
	push	edx
	mov	edx,eax
	and	edx,30000H
	cmp	edx,10000H
	je	sin01
	cmp	edx,30000H
	je	sin01
	jmp	sin02
sin01:	mov	bx,ax
	mov	ax,0ffffH
	sub	ax,bx
sin02:	and	eax,0ffffH
	call	sin03
sin03:	pop	ecx
	add	ecx,sintb-sin03
	push	eax
	shr	eax,8
	mov	bx,cs:[ecx][eax*2]
	mov	cx,cs:[ecx+2][eax*2]
	and	ebx,0ffffH
	and	ecx,0ffffH
	sub	ecx,ebx
	pop	eax
	and	eax,0ffH
	imul	eax,ecx
	shr	eax,8
	add	eax,ebx
	cmp	edx,20000H
	jb	sin04
	mov	ebx,eax
	xor	eax,eax
	sub	eax,ebx
sin04:	pop	edx
	pop	ecx
	pop	ebx
	ret

sintb	dw	00000H,00192H,00324H,004B6H,00648H,007DAH,0096CH,00AFDH
	dw	00C8FH,00E21H,00FB2H,01143H,012D5H,01465H,015F6H,01787H
	dw	01917H,01AA7H,01C37H,01DC6H,01F56H,020E5H,02273H,02402H
	dw	0250FH,0271DH,028AAH,02A37H,02BC3H,02D4FH,02EDBH,03066H
	dw	031F1H,0337BH,03505H,0368EH,03816H,0399EH,03B26H,03CADH
	dw	03E33H,03FB9H,0413EH,042C3H,04447H,045CAH,0474CH,048CEH
	dw	04A4FH,04BD0H,04D4FH,04ECEH,0504DH,051CAH,05347H,054C3H
	dw	0563EH,057B8H,05931H,05AAAH,05C21H,05D98H,05F0EH,06083H
	dw	061F7H,0636AH,064DCH,0664DH,067BDH,0692CH,06A9AH,06C07H
	dw	06D73H,06EDEH,07048H,071B1H,07319H,0747FH,075E5H,07749H
	dw	078ACH,07A0FH,07B64H,07CCFH,07E2EH,07F8DH,080E7H,08242H
	dw	0839BH,084F3H,0864AH,087A0H,088F5H,08A48H,08B99H,08CEAH
	dw	08E39H,08F86H,090D3H,0921EH,09367H,094AFH,095F6H,0973BH
	dw	0987FH,099C1H,09B02H,09C41H,09D7FH,09EBBH,09FF6H,0A12FH
	dw	0A266H,0A39CH,0A4D1H,0A604H,0A735H,0A865H,0A993H,0AABFH
	dw	0ABEAH,0AD13H,0AE3BH,0AF60H,0B085H,0B1A7H,0B2C8H,0B3E6H
	dw	0B504H,0B61FH,0B739H,0B851H,0B967H,0BA7BH,0BB8EH,0BC9FH
	dw	0BDAEH,0BEBBH,0BFC6H,0C0D0H,0C1D7H,0C2DDH,0C3E1H,0C4E3H
	dw	0C5E3H,0C6E1H,0C7DDH,0C8D7H,0C9D0H,0CAC6H,0CBBBH,0CCADH
	dw	0CD9EH,0CE8CH,0CF79H,0D063H,0D14CH,0D232H,0D317H,0D3F9H
	dw	0D4DAH,0D5B8H,0D695H,0D76FH,0D847H,0D91DH,0D9F1H,0DAC3H
	dw	0DB93H,0DC60H,0DD2CH,0DDF5H,0DEBDH,0DF82H,0E045H,0E106H
	dw	0E1C4H,0E281H,0E33BH,0E3F3H,0E4A9H,0E55DH,0E60EH,0E6BDH
	dw	0E76AH,0E815H,0E8BEH,0E964H,0EA08H,0EAAAH,0EB4AH,0EBE7H
	dw	0EC82H,0ED1BH,0EDB1H,0EE45H,0EED7H,0EF67H,0EFF4H,0F07FH
	dw	0F108H,0F18EH,0F212H,0F293H,0F313H,0F390H,0F40AH,0F483H
	dw	0F4F9H,0F56CH,0F5DDH,0F64CH,0F6B9H,0F723H,0F78AH,0F7F0H
	dw	0F852H,0F8B3H,0F911H,0F96DH,0F9C6H,0FA1DH,0FA72H,0FAC4H
	dw	0FB13H,0FB60H,0FBABH,0FBF4H,0FC3AH,0FC7DH,0FCBEH,0FCFDH
	dw	0FD39H,0FD73H,0FDAAH,0FDDFH,0FE12H,0FE42H,0FE6FH,0FE9AH
	dw	0FEC3H,0FEE9H,0FF0DH,0FF2EH,0FF2EH,0FF4DH,0FF83H,0FF9BH
	dw	0FFB0H,0FFC2H,0FFD2H,0FFE0H,0FFEBH,0FFF3H,0FFFAH,0FFFDH
	dw	0FFFFH

sndTremolo	endp

cseg	ends
	end
