	page	100, 132
	title	ESR_setupInfo
;
;	int	ESR_setupInfo(char *out_buf);
;
;	機能
;		FMR-BIOS拡張サービスルーチン(Int 8EH)
;			システム情報の取得(Function 00H)を呼び出す
;
;	パラメタ
;		out_buf	: システム情報通知領域(200バイト)へのポインタ
;
;	復帰値
;		0 : 正常終了
;
;	アセンブル時には大文字／小文字識別オプション -twocase を指定すること
;		例	386asm setup -twocase
;
;	リンク時にはオプション -callbufs を指定すること
;		例	386link setup -callbufs 2
;
;	参考文献
;		FM-TOWNSテクニカルデータブック	pp.287〜pp.289
;
	.386p
pmdata	segment	dword public use32 'DATA'
pmdata	ends
pmcode	segment	byte public use32 'CODE'
pmcode	ends

	public	ESR_setupInfo
	
	assume	ds:pmdata
pmdata	segment
rmseg	dd	?	; 共有バッファのリアルモード用セグメント
rmoff	dd	?	; 共有バッファのリアルモード用オフセット
pmseg	dd	?	; 共有バッファのネイティブモード用セグメント
pmoff	dd	?	; 共有バッファのネイティブモード用オフセット
pmdata	ends

	assume	cs:pmcode
pmcode	segment
	db	'ESR_setupInfo',13
ESR_setupInfo	proc	near

FUNCTION	equ	00h	; Function 00H : システム情報の取得
INT_NO		equ	8eh	; 拡張サービスルーチン
datasize	equ	200	; 転送するデータのバイト数

#out_buf	equ	SS:[ebp+8]	; C言語I/F第1パラメタアドレス

	enter	0, 0
	cld
	push	ds
	push	es
	push	esi
	push	edi
	push	ebx
	push	ecx
	call	mak_buffs		; 共有バッファを確保
	mov	ah, FUNCTION
;	mov	al, 入力パラメタ	; ALへの設定情報は無し
	mov	di, word ptr rmoff	; DS:DIで通知領域を指定
	push	dword ptr rmseg		; ES
	push	dword ptr rmseg		; DS
	push	dword ptr INT_NO
	call	BIOS_call
	add	esp, 12
	mov	ecx, datasize		; 共有バッファのバイト数をセット
	push	ds
	pop	es
	mov	edi, #out_buf		; 転送先をセット
	mov	esi, dword ptr pmoff	; 転送元をセット
	mov	ds, word ptr pmseg
rep	movsb				; データを転送
	movzx	eax, ah			; BIOSコールの復帰値をAXへセット
	pop	ecx
	pop	ebx
	pop	edi
	pop	esi
	pop	es
	pop	ds
	leave
	ret
ESR_setupInfo	endp

mak_buffs	proc	near
	mov	ax, 250dh
	int	21h
	mov	word ptr rmoff, bx
	shr	ebx, 16
	mov	dword ptr rmseg, ebx
	mov	dword ptr pmoff, edx
	mov	ax, es
	mov	word ptr pmseg, ax
	ret
mak_buffs	endp

RMINT	struc
RMI_INUM	dw	?
RMI_DS		dw	?
RMI_ES		dw	?
RMI_FS		dw	?
RMI_GS		dw	?
RMI_EAX		dd	?
RMI_EDX		dd	?
RMINT	ends

BIOS_call	proc	near
#INTNO	equ	(word ptr 8[ebp])
#RMDS	equ	(word ptr 12[ebp])
#RMES	equ	(word ptr 16[ebp])
#RMI	equ	(dword ptr [ebp - (size RMINT)])
	enter	0, 0
	sub	esp, size RMINT
	mov	#RMI.RMI_EAX, eax
	mov	#RMI.RMI_EDX, edx
	mov	ax, #RMDS
	mov	#RMI.RMI_DS, ax
	mov	ax, #RMES
	mov	#RMI.RMI_ES, ax
	mov	ax, #INTNO
	mov	#RMI.RMI_INUM, ax
	push	ds
	mov	ax, ss
	mov	ds, ax
	lea	edx, #RMI
	mov	ax, 2511h
	int	21h
	pop	ds
	add	esp, size RMINT
	pop	ebp
	ret
BIOS_call	endp
pmcode	ends
	end
