Files
Digital-Research-Source-Code/CPM OPERATING SYSTEMS/CPM 86/CONCURRENT/CCPM-86 3.1 SOURCE/D5/NP_8087.A86
Sepp J Morris 31738079c4 Upload
Digital Research
2020-11-06 18:50:37 +01:00

135 lines
3.0 KiB
Plaintext
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

title '8087 module'
;******************************************
; *
; 8087 MODULE *
; Last changed : 1/30/84 *
; *
;******************************************
cseg
public np_8087_int ; extrn in pic.a86
public np_8087_test
extrn sysdat:word ; public in header.a86
extrn reset_8087_pic:near ; public in pic.a86
NP_8087_OFF equ 0120H ; interrupt vector offset (COMPUPRO)
NP_8087_OWNER equ 08cH ; 8087 owner(SYSDAT)
IV_SEG_8087 equ 0a2H ; address of Interrupt Vector for
IV_OFF_8087 equ 0a0H ; interupt handler (SYSDAT)
IH_SEG_8087 equ 0a6H ; address of system's interrupt
IH_OFF_8087 equ 0a4H ; handler (SYSDAT)
status equ byte ptr 02H ; status word location in 8087
; environment
p_flag equ word ptr 06H ; PD flag field
pf_keep equ 02H ; KEEP bit in p_flag
pf_term equ 80H ; TERMINATE bit in p_flag
severe equ 05H ; Zero divide and invalid operation
;========
np_8087_int:
;========
;
push ds ; setup the system's date segment
mov ds, sysdat
mov np_8087_ss, ss ; establish a stack
mov np_8087_sp, sp
mov ss, sysdat
mov sp, offset np_8087_tos
push ax ; save registers that we
push bx ; will be using
push si
FNSTENV np_8087_env ; save 8087 environment
FCLEX
FDISI
call reset_8087_pic ; COMPUPRO specific
; We can now check what 8087 exception caused the interrupt
mov bx, word ptr .NP_8087_OWNER
test bx,bx ; has owner already terminated
jz exit1 ; yes
mov si, offset np_8087_env
mov al, status[si]
test al, not severe ; Is it a severe error
jnz exit1 ; no
and p_flag[bx],not pf_keep ; terminate user even if
or p_flag[bx],pf_term ; keep flag was on
exit1:
;
mov status[si],0H ; Clear status word for env. restore
pop si
pop bx
pop ax
mov ss, np_8087_ss
mov sp, np_8087_sp
FLDENV np_8087_env ; restore 8087
FWAIT
pop ds
iret
;========
np_8087_test:
;========
;
; Checks for presence of 8087 and place a zero in np_8087_owner
; location of SYSDAT if 8087 is present. The SUP init routine
; has placed 0ffffH there as the default of no 8087.
;
FNINIT ; init to see if 8087 is present
FSTCW control ; get 8087 control word
mov bx, NP_8087_OWNER
xor ax,ax
FWAIT ; let 8087 finish
or ax,control ; is 8087 present
jz exit2 ; no
mov word ptr [bx],0 ; record that 8087 is present
mov bx, IV_SEG_8087 ; init SYSDAT with segment and
mov word ptr [bx],0 ; offset of interrupt vector for
mov bx, IV_OFF_8087 ; 8087 exception handler
mov word ptr [bx], NP_8087_OFF
mov bx, IH_SEG_8087 ; init SYSDAT with segment and
mov word ptr [bx],ds ; offset of system's execption handler
mov bx, IH_OFF_8087
mov word ptr [bx], offset np_8087_int
exit2:
dseg
rw 18H ; Local stack
np_8087_tos:
np_8087_ss rw 1
np_8087_sp rw 1
np_8087_env rw 7 ; 8087 environment stored here
control rw 1 ; control word for test stored here
end