        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
