Sun's OBP and Apple's OpenFirmware have different behaviours from each other when a divide-by-zero error is encountered. Since we can't reenter Forth from a trap on all platforms, detect this case before performing the division and allow an optional defer word to be executed instead.
Signed-off-by: Mark Cave-Ayland mark.cave-ayland@ilande.co.uk --- openbios-devel/forth/bootstrap/bootstrap.fs | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-)
diff --git a/openbios-devel/forth/bootstrap/bootstrap.fs b/openbios-devel/forth/bootstrap/bootstrap.fs index 6878449..dc20caf 100644 --- a/openbios-devel/forth/bootstrap/bootstrap.fs +++ b/openbios-devel/forth/bootstrap/bootstrap.fs @@ -445,10 +445,23 @@ variable leaves 0 leaves ! \ 7.3.2.3 double number arithmetic \
+defer (div-by-zero-handler) + : s>d dup 0 < ; : dnegate 0 0 2swap d- ; : dabs dup 0 < if dnegate then ; -: um/mod mu/mod drop ; +: um/mod + dup 0 = if + \ Allow optional override of divide by zero handling + ['] (div-by-zero-handler) /n + @ 0 <> if + (div-by-zero-handler) drop + else + mu/mod drop + then + else + mu/mod drop + then + ;
\ symmetric division : sm/rem ( d n -- rem quot )