; ; File: XUnImp.a ; ; Contains: Routines to handle the Unimplemented Instruction exception ; ; Originally Written by: Motorola Inc. ; Adapted to Apple/MPW: Jon Okada ; ; Copyright: © 1990-1993 by Apple Computer, Inc., all rights reserved. ; ; This file is used in these builds: Mac32 ; ; Change History (most recent first): ; ; 2/3/93 CSS Update from Horror: ;

10/5/92 BG (for Jon Okada) Replaced one constant to fix the problem Jon ; reported to Motorola. See Jon's change log below for more info. ; <2> 3/30/91 BG Rolling in Jon Okada's latest changes. ; <1> 12/14/90 BG First checked into TERROR/BBS. ; xunimp.a ; Based upon Motorola files 'x_unimp.sa' and 'sto_res.sa' ; fpsp_unimp ; CHANGE LOG: ; 26 Aug 92 JPO Retain quotient bit field in USER_FPSR (was cleared in ; D25B fix code). ; * * x_unimp.sa 3.1 12/10/90 * * fpsp_unimp --- FPSP handler for unimplemented instruction * exception. * * Invoked when the user program encounters a floating-point * op-code that hardware does not support. Trap vector# 11 * (See table 8-1 MC68030 User's Manual). * * * Note: An fsave for an unimplemented inst. will create a short * fsave stack. * * Input: 1. Six word stack frame for unimplemented inst, four word * for illegal * (See table 8-7 MC68030 User's Manual). * 2. Unimp (short) fsave state frame created here by fsave * instruction. * * * Copyright (C) Motorola, Inc. 1990 * All Rights Reserved * * THIS IS UNPUBLISHED PROPRIETARY SOURCE CODE OF MOTOROLA * The copyright notice above does not evidence any * actual or intended publication of such source code. * X_UNIMP IDNT 2,1 Motorola 040 Floating Point Software Package fpsp_unimp: link a6,#-LOCAL_SIZE fsave -(a7) uni_2: movem.l d0-d1/a0-a1,USER_DA(a6) fmovem.x fp0-fp3,USER_FP0(a6) fmovem.l fpcr/fpsr/fpiar,USER_FPCR(a6) move.b (a7),d0 ;test for valid version num andi.b #$f0,d0 ;test for $4x cmpi.b #VER_4,d0 ;must be $4x or exit bne fpsp_fmt_error * * Temporary D25B Fix * The following lines are used to ensure that the FPSR * exception byte and condition codes are clear before proceeding * move.l USER_FPSR(a6),d0 and.l #$00FF00FF,d0 ;clear all but quotient and accrued exceptions

move.l d0,USER_FPSR(a6) fmove.l #0,FPSR ;clear all user bits fmove.l #0,FPCR ;clear all user exceptions for FPSP clr.b UFLG_TMP(a6) ;clr flag for unsupp data bsr get_op ;go get operand(s) clr.b STORE_FLG(a6) bsr do_func ;do the function fsave -(a7) ;capture possible exc state tst.b STORE_FLG(a6) bne.b no_store ;if STORE_FLG is set, no store bsr.b sto_res ;store the result in user space no_store: bra gen_except ;post any exceptions and return ; sto_res ; CHANGE LOG: ; 09 Jan 91 JPO Renamed label "fp0123" to "is_fp0123". Deleted ; label "is_fp3" (not referenced). ; * * sto_res.sa 3.1 12/10/90 * * Takes the result and puts it in where the user expects it. * Library functions return result in fp0. If fp0 is not the * users destination register then fp0 is moved to the the * correct floating-point destination register. fp0 and fp1 * are then restored to the original contents. * * Input: result in fp0 * * d2 & a0 should be kept unmodified * * Output: moves the result to the true destination reg or mem * * Modifies: destination floating point register * * Copyright (C) Motorola, Inc. 1990 * All Rights Reserved * * THIS IS UNPUBLISHED PROPRIETARY SOURCE CODE OF MOTOROLA * The copyright notice above does not evidence any * actual or intended publication of such source code. * STO_RES IDNT 2,1 Motorola 040 Floating Point Software Package sto_res: bfextu CMDREG1B(a6){6:3},d0 ;extract destination register cmpi.b #3,d0 ;check for fp0-fp3 cases ble.b is_fp0123 ; renamed label <1/9/91, JPO> fmovem.x fp0,-(a7) moveq.l #7,d1 sub.l d0,d1 ;d1 = 7- (dest. reg. no.) clr.l d0 bset.l d1,d0 ;d0 is dynamic register mask fmovem.x (a7)+,d0 rts is_fp0123: ; renamed label <1/9/91, JPO> cmpi.b #0,d0 beq.b is_fp0 cmpi.b #1,d0 beq.b is_fp1 cmpi.b #2,d0 beq.b is_fp2 ;is_fp3: ; label DELETED <1/9/91, JPO> fmovem.x fp0,USER_FP3(a6) rts is_fp2: fmovem.x fp0,USER_FP2(a6) rts is_fp1: fmovem.x fp0,USER_FP1(a6) rts is_fp0: fmovem.x fp0,USER_FP0(a6) rts