mirror of
https://github.com/elliotnunn/supermario.git
synced 2024-11-22 04:31:30 +00:00
167 lines
4.2 KiB
Plaintext
167 lines
4.2 KiB
Plaintext
|
;
|
||
|
; 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):
|
||
|
;
|
||
|
; <SM2> 2/3/93 CSS Update from Horror:
|
||
|
; <H2> 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 <H2>
|
||
|
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
|
||
|
|
||
|
|