[Back to TSR SWAG index] [Back to Main SWAG index] [Original]
(*
Date : Dec 27 '94, 13:49
From : Arne de.Bruijn 2:281/705.8
To : Bert Kremer
Subj : Math Error
*)
{ No divide by zero, Arne de Bruijn, 1994, PD }
{ Works not for longints, they've a check inside the runtime lib, }
{ and not for floating point math }
uses Dos;
procedure NewInt0(Flags, CS, IP, AX, BX,
CX, DX, SI, DI, DS, ES, BP: Word); interrupt; assembler;
const
InsLen:array[0..3] of byte=(2,3,4,2);
asm
les di,dword ptr [IP] { Get address of instruction }
xor ax,ax { Test for 808x }
push ax
popf
pushf
pop ax
and ax,0f000h
cmp ax,0f000h
je @Fixed { Jump if it's a 808x, no update needed }
mov bl,[es:di+1] { Get address mode byte }
and bx,0c7h
cmp bl,6
jne @NoImm
add IP,4
jmp @Fixed
@NoImm:
mov cl,6
shr bx,cl
mov bl,byte ptr [InsLen+bx]
add IP,bx
@Fixed:
{ Change result to 0 }
mov &AX,0
cmp byte ptr [es:di],0f7h {Change DX only if word operand }
jne @NoWord
mov &DX,0
@NoWord:
end;
var
W:word;
L:longint;
R:real;
begin
{ No need to save Int 0, already done in RTL }
SetIntVec(0,@NewInt0);
W:=0;
WriteLn(1 div W); { Displays 0 }
L:=0;
WriteLn(1 div L); { Runtime error 200 .... }
R:=0.0;
WriteLn(1.0/R); { Runtime error 200 .... }
end.
[Back to TSR SWAG index] [Back to Main SWAG index] [Original]