;==============================================================================
;	<< 386ASM V2.0 >>  for  FM TOWNS
;==============================================================================
.386p
		PAGE		60,132
		NAME		RBIOSCALL
		TITLE		REAL BIOS CALL PROCEDURE
;==============================================================================
;	リアルBIOSコール
;
;	CREATE : 1990.03.17
;	FINISH : 1990.03.17
;
;	< note > : TABS = 4
;
;	< History >
;	1990.03.17 : CREATE
;	1991.04.23 : 清書
;
;	Programmed by Y.Hirata ( Nifty-ID : NAB03321 )
;==============================================================================
;
INCLUDE	hc.inc								;
;
CGROUP	GROUP pmcode, CODE					;
DGROUP	GROUP pmdata, DATA					;
;
;--------------------------------------------
		public	Make_bufs					; ﾘｱﾙ-ﾈｲﾃｨﾌﾞ用ﾊﾞｯﾌｧ確保
		public	RBIOS_call					; ﾘｱﾙBIOS呼出し
		public	RBIOS_rmseg					; ﾘｱﾙｾｸﾞﾒﾝﾄ
		public	RBIOS_rmoff					; ﾘｱﾙｵﾌｾｯﾄ
		public	RBIOS_pmseg					; ﾈｲﾃｨﾌﾞｾｸﾞﾒﾝﾄ
		public	RBIOS_pmoff					; ﾈｲﾃｨﾌﾞｵﾌｾｯﾄ
;--------------------------------------------
;
;////////////////////////////////////////////
;			ネイティブ部
;////////////////////////////////////////////
;
;********************************************
;	ﾘｱﾙ/ﾈｲﾃｨﾌﾞ通信用ﾃﾞｰﾀ領域
;********************************************
pmdata	SEGMENT								;
		ASSUME	ds:DGROUP					;
;
RBIOS_rmseg		DD	?						; REAL MODE DATA SEGMENT
RBIOS_rmoff		DD	?						;
RBIOS_pmseg		DD	?						; PROTECTED MODE DATA SEGMENT
RBIOS_pmoff		DD	?						;
;
pmdata		ENDS							;
;
pmcode	SEGMENT								;
		ASSUME	cs:pmcode					;
;
;********************************************
;		共通ルーチン
;********************************************
;--------------------------------------------
;	ﾘｱﾙBIOS呼出し準備
;--------------------------------------------
		ALIGN	4							; dword boundary
Make_bufs	PROC	NEAR					;
			push	eax						;
			push	ebx						;
			push	ecx						;
			push	edx						;
			push	es						;
;
			mov		ax,250Dh				;
			int		INT_DOS					;
			mov		word PTR RBIOS_rmoff,bx	; ﾃﾞｰﾀﾊﾞｯﾌｧのﾘｱﾙﾓｰﾄﾞｱﾄﾞﾚｽ
			shr		ebx,16					; 16bit right shift
			mov		dword PTR RBIOS_rmseg,ebx
											; ﾘｱﾙﾓｰﾄﾞｾｸﾞﾒﾝﾄ
			mov		dword PTR RBIOS_pmoff,edx
											; ﾃﾞｰﾀﾊﾞｯﾌｧのﾈｲﾃｨﾌﾞｱﾄﾞﾚｽ
			mov		ax,es					;
			mov		word PTR RBIOS_pmseg,ax	; ﾈｲﾃｨﾌﾞﾓｰﾄﾞｾｸﾞﾒﾝﾄ
;
			pop	es							;
			pop	edx							;
			pop	ecx							;
			pop	ebx							;
			pop	eax							;
			ret								;
Make_bufs	ENDP							;
;
RMINT		STRUC							;
RMI_INUM		DW	?						; INTERRUPT NUMBER
RMI_DS			DW	?						; REAL MODE DS
RMI_ES			DW	?						; REAL MODE ES
RMI_FS			DW	?						; REAL MODE FS
RMI_GS			DW	?						; REAL MODE GS
RMI_EAX			DD	?						; EAX
RMI_EDX			DD	?						; EDX
RMINT		ENDS							;
;
;--------------------------------------------
;	ﾘｱﾙBIOSの呼出し
;--------------------------------------------
		ALIGN	4							; dword boundary
RBIOS_call	PROC	NEAR					;
#INTNO		EQU	(word PTR 8[ebp])			; INTERRUPT NUMBER
#RMDS		EQU	(word PTR 12[ebp])			; DS (REAL MODE)
#RMES		EQU	(word PTR 16[ebp])			; ES (REAL MODE)
#RMI		EQU	(dword PTR [ebp - (size RMINT)])
											;
			push	ebp						;
			mov		ebp,esp					;
			sub		esp,size RMINT			; ﾛｰｶﾙ変数の割り当て
;
			mov		#RMI.RMI_EAX,eax  		; EAX
			mov		#RMI.RMI_EDX,edx		; EDX
			mov		ax,#RMDS				;
			mov		#RMI.RMI_DS,ax			; DS
			mov		ax,#RMES				;
			mov		#RMI.RMI_ES,ax			; ES
			mov		ax,#INTNO				;
			mov		#RMI.RMI_INUM,ax		; F-BIOS割り込み番号
			push	edx						;
			push	ds						; ﾘｱﾙﾓｰﾄﾞ割り込みの発行
			mov		ax,ss					; DS:EDX = 割り込みﾃﾞｰﾀﾌﾞﾛｯｸ
			mov		ds,ax					;
			lea		edx,#RMI				;
			mov		ax,2511h				; 割り込みの発行
			int		INT_DOS					;
			pop		ds						;
			pop		edx						;
;
			add		esp,size RMINT			;
			pop		ebp						; ﾚｼﾞｽﾀ復帰〜終了
			ret								;
RBIOS_call	ENDP							;
;
pmcode		ENDS							;
;
		END

