mirror of
https://github.com/SEPPDROID/Digital-Research-Source-Code.git
synced 2025-10-26 01:44:21 +00:00
135 lines
3.0 KiB
Plaintext
135 lines
3.0 KiB
Plaintext
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 |