***************************************************************************
*                                                                         *
*   THIS CODE PERFORMS ONLY THE FUNCTION OF THE (A0) MACRO EQUIVALENT!!!  *
*                                                                         *
*           *****MC68000 AND MC68010 UNPROTECTED VERSION*****             *
*                                                                         *
*   NO CHECKING IS DONE FOR ILLEGAL FORMAT ERRORS OR COPROCESSOR          *
*   DETECTED EXCEPTIONS!                                                  *
*                                                                         *
***************************************************************************

NUMREGS  EQU       2            NUMBER OF SAVED REGISTERS


MC68881  EQU       $838000      ADDRESS OF MC68881
OPERAND  EQU       $10          MC68881 OPERAND REGISTER
COMMAND  EQU       $0A          MC68881 COMMAND REGISTER
RESPONSE EQU       $00          MC68881 RESPONSE REGISTER

* FLINE ENTERS HERE...
FLINE    MOVE.L    A1,-(SP)     SAVE A1
         MOVE.L    D1,-(SP)     SAVE D1
         MOVE.L    NUMREGS*4+2(SP),A1           A1=USER PC
         MOVE.W    (A1)+,D1     D1 = OPCODE WORD
         CMP.W     #%1111001001000000,D1        ? CPID=1 AND GENERAL TYPE
         BHS       NOTGEN       BR IF NEITHER

* GENERAL INSTRUCTION
         MOVE.W    (A1)+,D1     D1 = CP COMMAND WORD
         MOVE.W    D1,MC68881+COMMAND           PASS TO '881
FGENWAIT CMP.W     #$8900,MC68881+RESPONSE      ? IS 881 BUSY
         BEQ       FGENWAIT     LOOP IF SO TILL ITS READY
         ADD.W     D1,D1        BREAK DOWN HIGH TWO BITS
         BCS       GEN1XX       BR SPECIAL MOVES
         BPL       GEN00X       BR REG-REG (MUST BE 000)

         ADD.W     D1,D1        TST NEXT BIT
         BMI       GEN011       BR REG-MEM

* IS A MOVE IN GENERAL INSTRUCTION (INCLUDING FMOVECR)
         ROL.W     #5,D1        SHIFT TYPE INTO WORD ACCESS POSITION
         AND.W     #$000E,D1    ISOLATE JUST TYPE FIELD*2
         MOVE.W    SIZETBL(D1.W),D1    OBTAIN SPECIAL TRANSFER SIZE CODE
         BMI.S     GENTSPC      BR IF IS NONE, BYTE, OR WORD

* TRANSFER THE COUNT OF LONGWORDS
         MOVE.L    A0,-(SP)     SAVE USER'S A0
GENTINL  MOVE.L    (A0)+,MC68881+DATA   NEXT WORD IN
         DBRA      D1,GENTINL   LOOP TILL DONE
         MOVE.L   (SP)+,A0      RESTORE SAVED REGISTER
         BRA       FINI         EXIT AS WE ARE DONE

* SPECIAL COUNT OF NONE (FMOVECR), BYTE OR WORD
GENTSPC  ADD.B     #2,D1        OFFSET TO -1,0,+1
         BMI.S     GENTW        BR WORD TRANSFER
         BNE.S     FINI         BR FMOVECR (NO TRANSFER)

*MOVE BYTE IN
         MOVE.B    (A0),MC68881+DATA STORE BYTE
         BRA       FINI         EXIT

* MOVE WORD IN
GENTW    MOVE.W    (A0),MC68881+DATA STORE WORD
         BRA       FINI         EXIT

* SIZE TABLE - LONGWORDS TO COPY EXCEPT FOR NONE=-1  BYTE=-2  WORD=-3
SIZETBL  DC.W      0            .L
         DC.W      0            .S
         DC.W      2            .X
         DC.W      2            .P
         DC.W     -3            .W
         DC.W      1            .D
         DC.W     -2            .B
         DC.W     -1            FMOVECR (NONE)

* UPDATE PC AND RETURN TO CALLER
FINI     MOVE.L    A1,NUMREGS*4+2(SP)  SAVE SCAN PC
         MOVE.L    (SP)+,D1     RESTORE WORK
         MOVE.L    (SP)+,A1     REGISTERS
         RTE                    RETURN TO INVOKER

* UNEXAMPLED CODE HANDLES
GEN011   EQU       *
GEN00X   EQU       *
GEN1XX   EQU       *
NOTGEN   EQU       *

         END
