***************************************************************************
*                                                                         *
*   THIS CODE PERFORMS ONLY THE FUNCTION OF THE (A0) MACRO EQUIVALENT!!!  *
*                                                                         *
*                   *****MC68010 PROTECTED VERSION*****                   *
*                                                                         *
*   NO CHECKING IS DONE FOR ILLEGAL FORMAT ERRORS OR COPROCESSOR          *
*   DETECTED EXCEPTIONS!                                                  *
*                                                                         *
***************************************************************************
NUMREGS  EQU       2              NUMBER OF SAVED REGISTERS
UPAS     EQU       2              USER PROGRAM FUNCTION CODE VALUE
UDAS     EQU       1              USER DATA FUNCTION CODE VALUE

MC68881  EQU       $838000        ADDRESS OF MC68881
OPERAND  EQU       $10            MC68881 OPERAND REGISTER
COMMAND  EQU       $0A            MC68881 COMMAND REGISTER
RESPONSE EQU       $00            MC68881 RESPONSE REGISTER
         ORG       $2000
* 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.L    #UPAS,D1       SET UP
         MOVEC     D1,SFC         USER PROGRAM ACCESS
         MOVE.L    #UDAS,D1       SET UP
         MOVEC     D1,DFC         USER DATA ACCESS
         MOVES.W   (A1)+,D1       D1 = OPCODE WORD
         CMP.W     #%1111001001000000,D1   ? CPID=1 AND GENERAL TYPE
         BHS       NOTGEN         BR IF NEITHER

* GENERAL INSTRUCTION
         MOVES.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
         MOVEM.L   D2/A0,-(SP)    SAVE USER'S A0 AND A WORK REGISTER
GENTINL  MOVES.L   (A0)+,D2       NEXT WORD IN
         MOVE.L    D2,MC68881+DATA   NEXT WORD OUT
         DBRA      D1,GENTINL     LOOP TILL DONE
         MOVEM.L   (SP)+,D2/A0    RESTORE SAVED REGISTERS
         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
         MOVES.B   (A0),D1        LOAD BYTE
         MOVE.B    D1,MC68881+DATA   STORE BYTE
         BRA       FINI           EXIT

* MOVE WORD IN
GENTW    MOVES.W   (A0),D1        LOAD WORD
         MOVE.W    D1,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
