;
;			1994 1 高速サイン計算
;

	.386p


;	SIN
;input	eax = angle ( rate 10000H = 3.141592…/2 )
;output	eax = sin ( eax ) * 10000H

cseg	segment	dword public use32 'CODE'
	assume	cs:cseg,ds:cseg

	public	hiSpeedSin
	db	'hiSpeedSin',10
hiSpeedSin	proc	near

	push	ebx
	mov eax,[esp].8		; 1番目の引数
	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	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

hiSpeedSin	endp

cseg	ends
	end
