mirror of
https://github.com/SEPPDROID/Digital-Research-Source-Code.git
synced 2025-10-27 02:14:19 +00:00
Upload
Digital Research
This commit is contained in:
@@ -0,0 +1,135 @@
|
||||
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
|
||||
Reference in New Issue
Block a user