Intel 80C186XL Computer Hardware User Manual


 
11-15
MATH COPROCESSING
Example 11-1. Initialization Sequence for 80C187 Math Coprocessor
$mod186
name example_80C187_init
;
;FUNCTION: This function initializes the 80C187 numerics coprocessor.
;
;SYNTAX: extern unsigned char far 187_init(void);
;
;INPUTS: None
;
;OUTPUTS: unsigned char - 0000h -> False -> coprocessor not initialized
; ffffh -> True -> coprocessor initialized
;
;NOTE: Parameters are passed on the stack as required by
; high-level languages.
;
lib_80186 segment public ’code’
assume cs:lib_80186
public _187_init
_187_initproc far
push bp ;save caller’s bp
mov bp, sp ;get current top of stack
cli ;disable maskable interrupts
fninit ;init 80C187 processor
fnstcw [bp-2] ;get current control word
sti ;enable interrupts
mov ax, [bp-2]
and ax, 0300h ;mask off unwanted control bits
cmp ax, 0300h ;PC bits = 11
je Ok ;yes: processor ok
xor ax, ax ;return false (80C187 not ok)
pop bp ;restore caller’s bp
ret
Ok: and [bp-2], 0fffeh ;unmask possible exceptions
fldcw [bp-2]
mov ax,0ffffh ;return true (80C187 ok)
pop bp ;restore caller’s bp
ret
_187_initendp
lib_80186ends
end