[Back to TSR SWAG index] [Back to Main SWAG index] [Original]

    {
    > I am trying to avoid the runtime error in case of an attempt
    > to divide by zero.

    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]