The following example shows a typical real-mode initialization procedure:
;*********************************************************************
; Real-mode initialization code
;*********************************************************************
VxD_REAL_INIT_SEG
BeginProc ebios_init
mov ah, 0C0h
int 15h
test es:[bx.SD_feature1], EBIOS_allocated
jz short no_ebios_fnd
mov ah, 0C1h ; get segment adr of EBIOS
int 15h
jc short no_ebios_fnd
mov ax, es ; get EBIOS segment address
shr ax, 8 ; convert to a page number
movzx edx, ax ; return EBIOS page as reference
; data
mov bx, OFFSET exc_ebios_page ; pointer to exclusion table
mov [bx], ax ; 1 entry, to exclude EBIOS page
; from memory manager use
xor si, si ; no instance data to declare
mov ax, Device_Load_Ok ; go ahead and load the device
jmp short init_exit ; return to loader
no_ebios_fnd:
mov ah, 9
mov dx, OFFSET no_ebios_msg ; print message through MS-DOS
int 21h
xor bx, bx ; no exclusion table
xor si, si ; no instance data table
xor edx, edx ; no reference data
mov ax, Abort_Device_Load + No_Fail_Message
; don't load protected-mode
; portion and don't display a
; failure message
init_exit:
ret
exc_ebios_page dw 0, 0
no_ebios_msg db 'PS/2 type EBIOS not detected', 13, 10, '$'
EndProc ENDP
VxD_REAL_INIT_ENDS