*************************************
* Assembly Program: AmigaBench.asm  *
*             Al Aburto             *
*            03 Aug 1989            *
*     Must Link with TWStartup.o    *
*************************************

      INCLUDE  "exec/types.i"
      INCLUDE  "exec/execbase.i"
      INCLUDE  "exec/nodes.i"
      INCLUDE  "exec/memory.i"
      INCLUDE  "libraries/dos.i"
      INCLUDE  "libraries/dosextens.i"

      XREF  _LVORawDoFmt
      XREF  _LVOForbid
      XREF  _LVOPermit
      XREF  _LVODisable
      XREF  _LVOEnable
      XREF  _LVOSupervisor

      XREF  _LVOOpen
      XREF  _LVOExamine
      XREF  _LVOClose
      XREF  _LVOWrite
      XREF  _LVORead
      XREF  _LVODateStamp

      XREF  _DOSBase
      XREF  _SysBase
      XREF  _stdin
      XREF  _stdout
      XREF  _stderr

      XDEF  _main
      XDEF  _TWspec

*************************************************************************

_main:
         MOVE.L   A7,SaveA7

         MOVE.L   A4,ThisTCB
         MOVE.L   #TaskName,LN_NAME(A4)

         JSR      CPU_FPU_Type

         MOVE.L   _stdout,crtFile      ;Save _stdout File Handle.
         LEA.L    _Buffer,A0
         MOVE.L   A0,PrgCmdBuf

         MOVEQ.L  #$00,D0

M001:    PEA.L    Title                ;Print Title.
         JSR      _printf
         ADDQ.L   #$04,A7

         PEA.L    STR102
         JSR      _printf
         ADDQ.L   #$04,A7
M004:

M005:    LEA.L    CmdPrompt,A0
         BSR      Command

         CLR.B    -$01(A0,D0.L)        ;Clear the Line Feed at String End.
                                       ;String Length Includes NULL 
                                       ;Character At The End Now.

         MOVE.W   (A0),D0
         TST.B    D0
         BNE      M006

         ORI.W    #$2000,D0            ;Convert Command to Lower Case.

         CMPI.W   #$3F00,D0            ;'?'<cr> Input?
         BEQ      Command_List         ;Yes --- Show Command List.

         CMPI.W   #$7100,D0            ;'q'<cr> Input?
         BEQ      EndRun               ;Yes --- Quit Run.

         CMPI.W   #$3100,D0            ;'1'<cr> Input?
         BEQ      DhryStd00            ;Yes --- Do Dhrystone Std 68000.

         CMPI.W   #$3200,D0            ;'2'<cr> Input?
         BEQ      DhryOpt00            ;Yes --- Do Dhrystone Opt 68000.

         CMPI.W   #$3300,D0            ;'3'<cr> Input?
         BEQ      DhryOpt20            ;Yes --- Do Dhrystone Opt 68020.
         BRA      M007

M006:    OR.W     #$2020,D0

         CMPI.W   #$6361,D0            ;'ca'<cr> Input?
         BEQ      Check_Addr           ;Yes --- Check Routine Addresses.

         CMPI.W   #$6373,D0            ;'cs'<cr> Input?
         BEQ      Read_Cache           ;Yes --- Read Cache.

         CMPI.W   #$7763,D0            ;'wc'<cr> Input?
         BEQ      Write_Cache          ;Yes --- Write Cache.
M007:
         PEA.L    CmdRepeat
         JSR      _printf
         ADDQ.L   #$04,A7
         BRA      M004


DhryStd00:

         PEA.L    Title
         JSR      _printf
         ADDQ.L   #$04,A7

         PEA.L    STR101
         JSR      _printf
         ADDQ.L   #$04,A7

         PEA.L    STR107
         JSR      _printf
         ADDQ.L   #$04,A7

         JSR      PrtCPUFPU

         PEA.L    LineFeed
         JSR      _printf
         ADDQ.L   #$04,A7

         LEA.L    _A4Ref,A4

         BSR      _Proc0

         PEA.L    LineFeed
         JSR      _printf
         ADDQ.L   #$04,A7

         BRA      M005

DhryOpt00:

         PEA.L    Title
         JSR      _printf
         ADDQ.L   #$04,A7

         PEA.L    STR101
         JSR      _printf
         ADDQ.L   #$04,A7

         PEA.L    STR108
         JSR      _printf
         ADDQ.L   #$04,A7

         JSR      PrtCPUFPU

         PEA.L    LineFeed
         JSR      _printf
         ADDQ.L   #$04,A7

         LEA.L    _A4Ref,A4

         BSR      Proc0Opt00

         PEA.L    LineFeed
         JSR      _printf
         ADDQ.L   #$04,A7

         BRA      M005

DhryOpt20:

         MOVE.L   CPU_Type,D0
         CMPI.W   #$0002,D0
         BLT.S    Error01

         PEA.L    Title
         JSR      _printf
         ADDQ.L   #$04,A7

         PEA.L    STR101
         JSR      _printf
         ADDQ.L   #$04,A7

         PEA.L    STR109
         JSR      _printf
         ADDQ.L   #$04,A7

         JSR      PrtCPUFPU

         PEA.L    LineFeed
         JSR      _printf
         ADDQ.L   #$04,A7

         LEA.L    _A4Ref,A4

         BSR      Proc0Opt20

         PEA.L    LineFeed
         JSR      _printf
         ADDQ.L   #$04,A7

         BRA      M005

Error01:
         LEA.L    STR116,A2
         JSR      PrintError
         BRA      M005


Command_List:

         PEA.L    Title
         JSR      _printf
         ADDQ.L   #$04,A7

         PEA.L    STR110
         JSR      _printf
         ADDQ.L   #$04,A7

         PEA.L    LineFeed
         JSR      _printf
         ADDQ.L   #$04,A7

         BRA      M005

Check_Addr:
         PEA.L    Title
         JSR      _printf
         ADDQ.L   #$04,A7

         MOVE.L   #Proc0Opt00,-(A7)
         MOVE.L   #_main,-(A7)
         PEA.L    Dump01
         JSR      _printf
         LEA.L    $0C(A7),A7

         MOVE.L   #Proc1Opt00,-(A7)
         MOVE.L   #Proc0Opt20,-(A7)
         PEA.L    Dump02
         JSR      _printf
         LEA.L    $0C(A7),A7

         MOVE.L   #Proc6Opt00,-(A7)
         MOVE.L   #Proc2Opt00,-(A7)
         PEA.L    Dump03
         JSR      _printf
         LEA.L    $0C(A7),A7

         MOVE.L   #Proc8Opt00,-(A7)
         MOVE.L   #Proc8Opt20,-(A7)
         PEA.L    Dump04
         JSR      _printf
         LEA.L    $0C(A7),A7

         MOVE.L   #_A4Ref,-(A7)
         MOVE.L   #Func2Opt00,-(A7)
         PEA.L    Dump05
         JSR      _printf
         LEA.L    $0C(A7),A7

         PEA.L    LineFeed
         JSR      _printf
         ADDQ.L   #$04,A7

         BRA      M005

Read_Cache:
         PEA.L    Title
         JSR      _printf
         ADDQ.L   #$04,A7

         JSR      Cache_Status

         BRA      M005

Write_Cache:
         PEA.L    Title
         JSR      _printf
         ADDQ.L   #$04,A7

         PEA.L    STR119
         JSR      _printf
         ADDQ.L   #$04,A7

         PEA.L    STR120
         JSR      _printf
         ADDQ.L   #$04,A7

         LEA.L    EntPrompt,A0
         BSR      Command

         CLR.B    -$01(A0,D0.L)        ;Clear the Line Feed at String End.

         JSR      Write_To_CACR

         BRA      M007

EndRun:
         PEA.L    LineFeed
         JSR      _printf
         ADDQ.L   #$04,A7

QuitC:
         MOVEA.L  SaveA7,A7
         MOVEQ.L  #$00,D0
         RTS

*<<<<<<<<<<<<<<<<<<<<<<<< Subroutines >>>>>>>>>>>>>>>>>>>>>>>>>>>*

****************** Standard 68000 _Proc0 *************************
_Proc0:
         LINK     A5,#-$50
         MOVEM.L  D4-D7,-(A7)

         JSR      _dtime                 ;Time Empty FOR Loop (nulltime).
         MOVE.L   D0,-$48(A5)            ;starttime

         MOVEQ.L  #$00,D7
         BRA      P0004
P0002:
         ADDQ.L   #$01,D7
P0004:
         CMPI.W   #$C350,D7
         BCS      P0002

         JSR      _dtime                 ;StopTime
         SUB.L    -$48(A5),D0            ;D0 = StopTime - StartTime
         MOVE.L   D0,-$4C(A5)            ;D0 = NullTime 

;   PtrGlbNext = (RecordPtr) malloc(sizeof(RecordType));

         MOVE.L   #Buf01,$14D0(A4)        ;_PtrGlbNext = ($976C,A4)

;   PtrGlb = (RecordPtr) malloc(sizeof(RecordType));

         MOVE.L   #Buf02,$14CC(A4)        ;_PtrGlb     = ($9768,A4)

;   PtrGlb->PtrComp = PtrGlbNext;

         MOVEA.L  $14CC(A4),A0
         MOVE.L   $14D0(A4),(A0)

;   PtrGlb->Discr = Ident1;               ;Ident1 is $0000

         MOVEA.L  $14CC(A4),A0
         CLR.W    $04(A0)

;   PtrGlb->EnumComp = Ident3;

         MOVEA.L  $14CC(A4),A0            ;Ident3 is $0002
         MOVE.W   #$0002,$06(A0)

;   PtrGlb->IntComp = 40;

         MOVEA.L  $14CC(A4),A0
         MOVE.W   #$0028,$08(A0)

;   strcpy(PtrGlb->StringComp, "DHRYSTONE PROGRAM, SOME STRING")

         PEA.L    STR103
         MOVEA.L  $14CC(A4),A0
         PEA.L    $0A(A0)
         JSR      _strcpy
         ADDQ.L   #$08,A7


;   Array2Glob[8][7] = 10;   /* Was missing in published Version  */

         MOVE.W   #$0A,$03B6(A4)         ;_Array2Glob+830

*******************
*-- Start Timer --*
*******************

         JSR      _dtime
         MOVE.L   D0,-$48(A5)            ;StartTime

         MOVEQ.L  #$00,D7                ;MAIN FOR LOOP
         BRA      P0024
P0006:

         JSR      _Proc5

         JSR      _Proc4

         MOVE.W   #$0002,-$02(A5)        ;IntLoc1 = 2

         MOVEQ.L  #$03,D4                ;IntLoc2 = 3

;   strcpy(String2Loc, "DHRYSTONE PROGRAM, 2'ND STRING");

         PEA.L    STR104
         PEA.L    -$44(A5)               ;String2Loc
         JSR      _strcpy
         ADDQ.L   #$08,A7

         MOVE.W   #$0001,-$06(A5)        ;EnumLoc = Ident2
                                         ;Ident2 = $0001

;   BoolGlob = ! Func2(String1Loc, String2Loc);

         PEA.L    -$44(A5)               ;String2Loc
         PEA.L    -$25(A5)               ;String1Loc
         JSR      _Func2
         ADDQ.L   #$08,A7

         TST.W    D0
         BNE      P0008

         MOVE.W   #$0001,$0004(A4)       ;_BoolGlob
         BRA      P0010
P0008:
         CLR.W    $0004(A4)              ;_BoolGlob
P0010:

P0012:                                  ;While (IntLoc1 < IntLoc2)
         MOVE.W   -$02(A5),D0
         CMP.W    D4,D0
         BGE      P0014

         MOVE.W   -$02(A5),D0          ;IntLoc3 = 5 * IntLoc1 - IntLoc2
         MULS.W   #$0005,D0
         SUB.W    D4,D0
         MOVE.W   D0,-$04(A5)

;      Proc7(IntLoc1, IntLoc2, &IntLoc3);

         PEA.L    -$04(A5)
         MOVE.W   D4,-(A7)
         MOVE.W   -$02(A5),-(A7)
         JSR      _Proc7
         ADDQ.L   #$08,A7

         ADDQ.W   #$0001,-$02(A5)      ;++IntLoc1

         BRA      P0012
P0014:


;   Proc8(Array1Glob, Array2Glob, IntLoc1, IntLoc3);

         MOVE.W   -$04(A5),-(A7)
         MOVE.W   -$02(A5),-(A7)
         PEA.L    $0078(A4)            ;_Array2Glob
         PEA.L    $0010(A4)            ;_Array1Glob
         JSR      _Proc8
         LEA.L    $0C(A7),A7

;   Proc1(PtrGlb);

         MOVE.L   $14CC(A4),-(A7)      ;_PtrGlb
         JSR      _Proc1
         ADDQ.L   #$04,A7

;   for (CharIndex = 'A'; CharIndex <= Char2Glob; ++CharIndex)

         MOVEQ.L  #$41,D6
         BRA      P0022
P0018:

;      if (EnumLoc == Func1(CharIndex, 'C'))
;         Proc6(Ident1, &EnumLoc);

         MOVE.W   #$0043,-(A7)
         MOVE.B   D6,D0
         EXT.W    D0
         MOVE.W   D0,-(A7)
         JSR      _Func1
         ADDQ.L   #$04,A7

         CMP.W    -$06(A5),D0
         BNE      P0020

         PEA.L    -$06(A5)
         CLR.W    -(A7)
         JSR      _Proc6
         ADDQ.L   #$06,A7


;   IntLoc3 = IntLoc2 * IntLoc1;

P0020:

         ADDQ.B   #$01,D6
P0022:
         CMP.B    $000C(A4),D6         ;_Char2Glob = ($000C,A4)
         BLE      P0018

         MOVE.W   D4,D0
         MULS.W   -$02(A5),D0
         MOVE.W   D0,-$04(A5)

;   IntLoc2 = IntLoc3 / IntLoc1;

         MOVE.W   -$04(A5),D4
         EXT.L    D4
         DIVS.W   -$02(A5),D4

;   IntLoc2 = 7 * (IntLoc3 - IntLoc2) - IntLoc1;

         MOVE.W   -$04(A5),D0
         SUB.W    D4,D0
         MULS.W   #$0007,D0
         MOVE.W   D0,D4
         SUB.W    -$02(A5),D4

;   Proc2(&IntLoc1);

         PEA.L    -$02(A5)
         JSR      _Proc2
         ADDQ.L   #$04,A7

         ADDQ.L   #$01,D7
P0024:
         CMPI.W   #$C350,D7
         BCS      P0006


******************
*-- Stop Timer --*
******************

;   benchtime = dtime() - starttime - nulltime;

         JSR      _dtime               ;StopTime
         SUB.L    -$48(A5),D0          ;StopTime - StartTime
         SUB.L    -$4C(A5),D0          ;StopTime - StartTime - NullTime
         MOVE.L   D0,-$50(A5)          ;BenchTime

;   printf("   Time(sec) for %ld passes = %f\n", (long) LOOPS,
;             (float)benchtime/50.0);

         MOVE.L   -$50(A5),D0          ;BenchTime = Time in TICKS

         JSR      FFPFlt

         MOVE.L   #$C8000046,D1        ;50.00
         JSR      FFPDiv               ;Time in SECONDS.

         MOVE.L   -$50(A5),-(A7)       ;benchtime / 50.00
         PEA.L    $0000C350            ;50000
         PEA.L    STR105
         JSR      _printf
         LEA.L    $0C(A7),A7

;   printf("   This System Benchmarks at %ld dhrystones/second\n",
;      ((long) LOOPS) * 50L / benchtime);

         MOVE.L   #$002625A0,D0        ;50000 * 50
         MOVE.L   -$50(A5),D1          ;BenchTime
         JSR      LDivs                ;D0 = D0 / D1

         MOVE.L   D0,-(A7)             ;Dhrystones / Sec
         PEA.L    STR106
         JSR      _printf
         ADDQ.L   #$08,A7

P0026:
         MOVEM.L  (A7)+,D4-D7
         UNLK     A5
         RTS


****************** Optimized 68000 _Proc0 *******************************
Proc0Opt00:
         LINK     A5,#-$50
         MOVEM.L  D4-D7,-(A7)

         JSR      _dtime                 ;Time Empty FOR Loop (nulltime).
         MOVE.L   D0,-$48(A5)            ;starttime

         MOVEQ.L  #$00,D7
         BRA      Q0004
Q0002:
         ADDQ.L   #$01,D7
Q0004:
         CMPI.W   #$C350,D7
         BCS      Q0002

         JSR      _dtime                 ;StopTime
         SUB.L    -$48(A5),D0            ;D0 = StopTime - StartTime
         MOVE.L   D0,-$4C(A5)            ;D0 = NullTime 

;   PtrGlbNext = (RecordPtr) malloc(sizeof(RecordType));

         MOVE.L   #Buf01,$14D0(A4)       ;_PtrGlbNext = ($14D0,A4)

;   PtrGlb = (RecordPtr) malloc(sizeof(RecordType));

         MOVE.L   #Buf02,$14CC(A4)       ;_PtrGlb     = ($14CC,A4)

;   PtrGlb->PtrComp = PtrGlbNext;

         MOVEA.L  $14CC(A4),A0
         MOVE.L   $14D0(A4),(A0)

;   PtrGlb->Discr = Ident1;

         MOVEA.L  $14CC(A4),A0
         CLR.W    $04(A0)

;   PtrGlb->EnumComp = Ident3;

         MOVEA.L  $14CC(A4),A0
         MOVE.W   #$0002,$06(A0)

;   PtrGlb->IntComp = 40;

         MOVEA.L  $14CC(A4),A0
         MOVE.W   #$0028,$08(A0)

;   strcpy(PtrGlb->StringComp, "DHRYSTONE PROGRAM, SOME STRING")

         PEA.L    STR103
         MOVEA.L  $14CC(A4),A0
         PEA.L    $0A(A0)
         JSR      _strcpy
         ADDQ.L   #$08,A7


;   Array2Glob[8][7] = 10;   /* Was missing in published Version  */

         MOVE.W   #$000A,$03B6(A4)       ;_Array2Glob+830

*******************
*-- Start Timer --*
*******************
         MOVEQ.L  #$00,D3
         MOVEQ.L  #$00,D5

         JSR      _dtime
         MOVE.L   D0,-$48(A5)            ;StartTime

         MOVEQ.L  #$00,D7                ;MAIN FOR LOOP
         JMP      Q0024
Q0006:
         MOVE.B   #$41,$08(A4)           ;_Proc5 Inlined.
         CLR.W    $04(A4)

         MOVE.B   #$42,$0C(A4)           ;_Proc4 Inlined And Optimized!

         MOVE.W   #$0002,D5              ;IntLoc1 = 2

         MOVEQ.L  #$03,D4                ;IntLoc2 = 3

;   strcpy(String2Loc, "DHRYSTONE PROGRAM, 2'ND STRING");

         LEA.L    -$44(A5),A0            ;_strcpy Inlined.
         LEA.L    STR104,A1
         MOVE.L   A0,D0

I0002:   MOVE.B   (A1)+,(A0)+
         BNE.S    I0002

         MOVE.W   #$0001,-$06(A5)        ;EnumLoc = Ident2

;   BoolGlob = ! Func2(String1Loc, String2Loc);

         PEA.L    -$44(A5)
         PEA.L    -$25(A5)
         JSR      Func2Opt00
         ADDQ.L   #$08,A7

         TST.W    D0
         BNE      Q0008

         MOVE.W   #$0001,$04(A4)         ;_BoolGlob
         JMP      Q0010
Q0008:
         CLR.W    $04(A4)                ;_BoolGlob
Q0010:

Q0012:                                   ;While (IntLoc1 < IntLoc2)
         MOVE.W   D5,D0
         CMP.W    D4,D0
         BGE      Q0014

         MOVE.W   D5,D0                  ;IntLoc3 = 5 * IntLoc1 - IntLoc2
         MULS.W   #$0005,D0
         SUB.W    D4,D0
         MOVE.W   D0,D3

;      Proc7(IntLoc1, IntLoc2, &IntLoc3);

         MOVE.W   D5,D1                  ;_Proc7 Inlined!
         ADDQ.W   #$02,D1
         MOVE.W   D4,D0
         ADD.W    D1,D0
         MOVE.W   D0,D3

         ADDQ.W   #$0001,D5              ;++IntLoc1

         JMP      Q0012
Q0014:


;   Proc8(Array1Glob, Array2Glob, IntLoc1, IntLoc3);

         MOVE.W   D3,-(A7)
         MOVE.W   D5,-(A7)
         PEA.L    $78(A4)
         PEA.L    $10(A4)                ;_Array1Glob = ($0010,A4)
         JSR      Proc8Opt00
         LEA.L    $0C(A7),A7

;   Proc1(PtrGlb);

         MOVE.L   $14CC(A4),-(A7)
         JSR      Proc1Opt00
         ADDQ.L   #$04,A7

;   for (CharIndex = 'A'; CharIndex <= Char2Glob; ++CharIndex)

         MOVEQ.L  #$41,D6
         JMP      Q0022
Q0018:

;      if (EnumLoc == Func1(CharIndex, 'C'))
;         Proc6(Ident1, &EnumLoc);

         MOVE.B   D6,D0                  ;_Func1 Inlined And Optimized!
         EXT.W    D0

         CMPI.B   #$43,D0
         BEQ.S    I0004
         MOVEQ.L  #$00,D0
         JMP      I0006
I0004:
         MOVEQ.L  #$01,D0
I0006:

         CMP.W    -$06(A5),D0
         BNE      Q0020

         PEA.L    -$06(A5)
         CLR.W    -(A7)
         JSR      Proc6Opt00
         ADDQ.L   #$06,A7


;   IntLoc3 = IntLoc2 * IntLoc1;

Q0020:

         ADDQ.B   #$01,D6
Q0022:
         CMP.B    $0C(A4),D6              ;_Char2Glob = ($000C,A4)
         BLE      Q0018

         MOVE.W   D4,D0
         MULS.W   D5,D0
         MOVE.W   D0,D3

;   IntLoc2 = IntLoc3 / IntLoc1;

         MOVE.W   D3,D4
         EXT.L    D4
         DIVS.W   D5,D4

;   IntLoc2 = 7 * (IntLoc3 - IntLoc2) - IntLoc1;

         MOVE.W   D3,D0
         SUB.W    D4,D0
         MULS.W   #$0007,D0
         MOVE.W   D0,D4
         SUB.W    D5,D4

;   Proc2(&IntLoc1);
                                          ;_Proc2 Inlined.
         MOVE.W   D5,D1
         ADDI.W   #$000A,D1
         MOVEQ.L  #$00,D2                 ;This makes me think the subr
                                          ;is wrong somehow.
I0008:
         CMPI.B   #$41,$08(A4)
         BNE      I0010
         SUBQ.W   #$01,D1
         MOVE.W   D1,D0
         SUB.W    (A4),D0
         MOVE.W   D0,D5
I0010:

         TST.W    D2
         BEQ      I0012                   ;Break (But D2 _IS_ ZERO!)
         JMP      I0008
I0012:

         ADDQ.L   #$01,D7
Q0024:
         CMPI.W   #$C350,D7
         BCS      Q0006


******************
*-- Stop Timer --*
******************

;   benchtime = dtime() - starttime - nulltime;

         JSR      _dtime                 ;StopTime
         SUB.L    -$48(A5),D0            ;StopTime - StartTime
         SUB.L    -$4C(A5),D0            ;StopTime - StartTime - NullTime
         MOVE.L   D0,-$50(A5)            ;BenchTime

;   printf("   Time(sec) for %ld passes = %f\n", (long) LOOPS,
;             (float)benchtime/50.0);

         MOVE.L   -$50(A5),D0            ;BenchTime = Time in TICKS

         JSR      FFPFlt

         MOVE.L   #$C8000046,D1          ;50.00
         JSR      FFPDiv                 ;Time in SECONDS.

         MOVE.L   -$50(A5),-(A7)         ;benchtime / 50.00
         PEA.L    $0000C350              ;50000
         PEA.L    STR105
         JSR      _printf
         LEA.L    $0C(A7),A7

;   printf("   This System Benchmarks at %ld dhrystones/second\n",
;      ((long) LOOPS) * 50L / benchtime);

         MOVE.L   #$002625A0,D0          ;50000 * 50
         MOVE.L   -$50(A5),D1            ;BenchTime
         JSR      LDivs                  ;D0 = D0 / D1

         MOVE.L   D0,-(A7)               ;Dhrystones / Sec
         PEA.L    STR106
         JSR      _printf
         ADDQ.L   #$08,A7

Q0026:
         MOVEM.L  (A7)+,D4-D7
         UNLK     A5
         RTS

****************** Optimized 68020 _Proc0 *******************************
Proc0Opt20:
         LINK     A5,#-$50
         MOVEM.L  D4-D7,-(A7)

         JSR      _dtime                 ;Time Empty FOR Loop (nulltime).
         MOVE.L   D0,-$48(A5)            ;starttime

         MOVEQ.L  #$00,D7
         BRA      U0004
U0002:
         ADDQ.L   #$01,D7
U0004:
         CMPI.W   #$C350,D7
         BCS      U0002

         JSR      _dtime                 ;StopTime
         SUB.L    -$48(A5),D0            ;D0 = StopTime - StartTime
         MOVE.L   D0,-$4C(A5)            ;D0 = NullTime 

;   PtrGlbNext = (RecordPtr) malloc(sizeof(RecordType));

         MOVE.L   #Buf01,$14D0(A4)       ;_PtrGlbNext = ($14D0,A4)

;   PtrGlb = (RecordPtr) malloc(sizeof(RecordType));

         MOVE.L   #Buf02,$14CC(A4)       ;_PtrGlb     = ($14CC,A4)

;   PtrGlb->PtrComp = PtrGlbNext;

         MOVEA.L  $14CC(A4),A0
         MOVE.L   $14D0(A4),(A0)

;   PtrGlb->Discr = Ident1;

         MOVEA.L  $14CC(A4),A0
         CLR.W    $04(A0)

;   PtrGlb->EnumComp = Ident3;

         MOVEA.L  $14CC(A4),A0
         MOVE.W   #$0002,$06(A0)

;   PtrGlb->IntComp = 40;

         MOVEA.L  $14CC(A4),A0
         MOVE.W   #$0028,$08(A0)

;   strcpy(PtrGlb->StringComp, "DHRYSTONE PROGRAM, SOME STRING")

         PEA.L    STR103
         MOVEA.L  $14CC(A4),A0
         PEA.L    $0A(A0)
         JSR      _strcpy
         ADDQ.L   #$08,A7


;   Array2Glob[8][7] = 10;   /* Was missing in published Version  */

         MOVE.W   #$000A,$03B6(A4)       ;_Array2Glob+830

*******************
*-- Start Timer --*
*******************
         MOVEQ.L  #$00,D3
         MOVEQ.L  #$00,D5

         JSR      _dtime
         MOVE.L   D0,-$48(A5)            ;StartTime

         MOVEQ.L  #$00,D7                ;MAIN FOR LOOP
         JMP      U0024
U0006:
         MOVE.B   #$41,$08(A4)           ;_Proc5 Inlined.
         CLR.W    $04(A4)

         MOVE.B   #$42,$0C(A4)           ;_Proc4 Inlined And Optimized!

         MOVE.W   #$0002,D5              ;IntLoc1 = 2

         MOVEQ.L  #$03,D4                ;IntLoc2 = 3

;   strcpy(String2Loc, "DHRYSTONE PROGRAM, 2'ND STRING");

         LEA.L    -$44(A5),A0            ;_strcpy Inlined.
         LEA.L    STR104,A1
         MOVE.L   A0,D0

J0002:   MOVE.B   (A1)+,(A0)+
         BNE.S    J0002

         MOVE.W   #$0001,-$06(A5)        ;EnumLoc = Ident2

;   BoolGlob = ! Func2(String1Loc, String2Loc);

         PEA.L    -$44(A5)
         PEA.L    -$25(A5)
         JSR      Func2Opt00
         ADDQ.L   #$08,A7

         TST.W    D0
         BNE.S    U0008

         MOVE.W   #$0001,$04(A4)         ;_BoolGlob
         JMP      U0010
U0008:
         CLR.W    $04(A4)                ;_BoolGlob
U0010:

U0012:                                   ;While (IntLoc1 < IntLoc2)
         MOVE.W   D5,D0
         CMP.W    D4,D0
         BGE.S    U0014

         MOVE.W   D5,D0                  ;IntLoc3 = 5 * IntLoc1 - IntLoc2
         MULS.W   #$0005,D0
         SUB.W    D4,D0
         MOVE.W   D0,D3

;      Proc7(IntLoc1, IntLoc2, &IntLoc3);

         MOVE.W   D5,D1                  ;_Proc7 Inlined!
         ADDQ.W   #$02,D1                
         MOVE.W   D4,D0
         ADD.W    D1,D0
         MOVE.W   D0,D3

         ADDQ.W   #$0001,D5              ;++IntLoc1

         JMP      U0012
U0014:

;   Proc8(Array1Glob, Array2Glob, IntLoc1, IntLoc3);

         MOVE.W   D3,-(A7)
         MOVE.W   D5,-(A7)
         PEA.L    $78(A4)
         PEA.L    $10(A4)                ;_Array1Glob = ($0010,A4)
         JSR      Proc8Opt20
         LEA.L    $0C(A7),A7

;   Proc1(PtrGlb);

         MOVE.L   $14CC(A4),-(A7)
         JSR      Proc1Opt00
         ADDQ.L   #$04,A7

;   for (CharIndex = 'A'; CharIndex <= Char2Glob; ++CharIndex)

         MOVEQ.L  #$41,D6
         JMP      U0022
U0018:

;      if (EnumLoc == Func1(CharIndex, 'C'))
;         Proc6(Ident1, &EnumLoc);

         MOVE.B   D6,D0                  ;_Func1 Inlined And Optimized!
         EXT.W    D0

         CMPI.B   #$43,D0
         BEQ.S    J0004
         MOVEQ.L  #$00,D0
         JMP      J0006
J0004:
         MOVEQ.L  #$01,D0
J0006:

         CMP.W    -$06(A5),D0
         BNE.S    U0020

         PEA.L    -$06(A5)
         CLR.W    -(A7)
         JSR      Proc6Opt00
         ADDQ.L   #$06,A7


;   IntLoc3 = IntLoc2 * IntLoc1;

U0020:

         ADDQ.B   #$01,D6
U0022:
         CMP.B    $0C(A4),D6              ;_Char2Glob = ($000C,A4)
         BLE.S    U0018

         MOVE.W   D4,D0
         MULS.W   D5,D0
         MOVE.W   D0,D3

;   IntLoc2 = IntLoc3 / IntLoc1;

         MOVE.W   D3,D4
         EXT.L    D4
         DIVS.W   D5,D4

;   IntLoc2 = 7 * (IntLoc3 - IntLoc2) - IntLoc1;

         MOVE.W   D3,D0
         SUB.W    D4,D0
         MULS.W   #$0007,D0
         MOVE.W   D0,D4
         SUB.W    D5,D4

;   Proc2(&IntLoc1);
                                          ;_Proc2 Inlined.
         MOVE.W   D5,D1
         ADDI.W   #$000A,D1
         MOVEQ.L  #$00,D2                 ;This makes me think the subr
                                          ;is wrong somehow.
J0008:
         CMPI.B   #$41,$08(A4)
         BNE.S    J0010
         SUBQ.W   #$01,D1
         MOVE.W   D1,D0
         SUB.W    (A4),D0
         MOVE.W   D0,D5
J0010:

         TST.W    D2
         BEQ.S    J0012                   ;Break (But D2 _IS_ ZERO!)
         JMP      J0008
J0012:

         ADDQ.L   #$01,D7
U0024:
         CMPI.W   #$C350,D7
         BCS      U0006


******************
*-- Stop Timer --*
******************

;   benchtime = dtime() - starttime - nulltime;

         JSR      _dtime                 ;StopTime
         SUB.L    -$48(A5),D0            ;StopTime - StartTime
         SUB.L    -$4C(A5),D0            ;StopTime - StartTime - NullTime
         MOVE.L   D0,-$50(A5)            ;BenchTime

;   printf("   Time(sec) for %ld passes = %f\n", (long) LOOPS,
;             (float)benchtime/50.0);

         MOVE.L   -$50(A5),D0            ;BenchTime = Time in TICKS

         JSR      FFPFlt

         MOVE.L   #$C8000046,D1          ;50.00
         JSR      FFPDiv                 ;Time in SECONDS.

         MOVE.L   -$50(A5),-(A7)         ;benchtime / 50.00
         PEA.L    $0000C350              ;50000
         PEA.L    STR105
         JSR      _printf
         LEA.L    $0C(A7),A7

;   printf("   This System Benchmarks at %ld dhrystones/second\n",
;      ((long) LOOPS) * 50L / benchtime);

         MOVE.L   #$002625A0,D0          ;50000 * 50
         MOVE.L   -$50(A5),D1            ;BenchTime
         JSR      LDivs                  ;D0 = D0 / D1

         MOVE.L   D0,-(A7)               ;Dhrystones / Sec
         PEA.L    STR106
         JSR      _printf
         ADDQ.L   #$08,A7

U0026:
         MOVEM.L  (A7)+,D4-D7
         UNLK     A5
         RTS

****************** _Proc1 **************************************
_Proc1:
         LINK      A5,#$0000
         MOVE.L    A2,-(A7)

         MOVEA.L   $08(A5),A2

;#define   NextRecord   (*(PtrParIn->PtrComp))
;   structassign(NextRecord, *PtrGlb);

         MOVEA.L   (A2),A0               ;
         MOVEA.L   $14CC(A4),A1          ;_PrtGlb = ($14CC,A4)
         MOVEQ.L   #$09,D0
P0102:
         MOVE.L    (A1)+,(A0)+
         DBRA      D0,P0102

         MOVE.W    (A1)+,(A0)+

;   PtrParIn->IntComp = 5;

         MOVE.W    #$0005,$08(A2)

;   NextRecord.IntComp = PtrParIn->IntComp;

         MOVEA.L   (A2),A0
         MOVE.W    $08(A2),$08(A0)

;   NextRecord.PtrComp = PtrParIn->PtrComp;

         MOVEA.L   (A2),A0
         MOVE.L    (A2),(A0)

;   Proc3(NextRecord.PtrComp);

         MOVEA.L   (A2),A0
         MOVE.L    (A0),-(A7)
         JSR       _Proc3
         ADDQ.L    #$04,A7

;   if (NextRecord.Discr == Ident1)

         MOVEA.L   (A2),A0
         TST.W     $04(A0)
         BNE       P0104

;      NextRecord.IntComp = 6;

         MOVEA.L   (A2),A0
         MOVE.W    #$0006,$08(A0)

;      Proc6(PtrParIn->EnumComp, &NextRecord.EnumComp);

         MOVEA.L   (A2),A0
         ADDQ.L    #$06,A0
         MOVE.L    A0,-(A7)
         MOVE.W    $06(A2),-(A7)
         JSR       _Proc6
         ADDQ.L    #$06,A7

;      NextRecord.PtrComp = PtrGlb->PtrComp;

         MOVEA.L   $14CC(A4),A0          ;_PtrGlb = ($14CC,A4)
         MOVEA.L   (A2),A1
         MOVE.L    (A0),(A1)

;      Proc7(NextRecord.IntComp, 10, &NextRecord.IntComp);

         MOVEA.L   (A2),A0
         ADDQ.L    #$08,A0
         MOVE.L    A0,-(A7)
         MOVE.W    #$000A,-(A7)

         MOVEA.L   (A2),A0
         MOVE.W    $08(A0),-(A7)
         JSR       _Proc7
         ADDQ.L    #$08,A7

         BRA       P0108
P0104:

;      structassign(*PtrParIn, NextRecord);

         MOVEA.L   A2,A0
         MOVEA.L   (A2),A1
         MOVEQ.L   #$09,D0
P0106:
         MOVE.L    (A1)+,(A0)+
         DBRA      D0,P0106

         MOVE.W    (A1)+,(A0)+
P0108:
         MOVE.L    (A7)+,A2
         UNLK      A5
         RTS

         DC.W     $0000

****************** _Proc1 With _Proc7 Inlined ***************************
Proc1Opt00:
         MOVE.L   A2,-(A7)

         MOVEA.L  $08(A7),A2

;#define   NextRecord   (*(PtrParIn->PtrComp))
;   structassign(NextRecord, *PtrGlb);

         MOVEA.L  (A2),A0                ;
         MOVEA.L  $14CC(A4),A1           ;_PrtGlb = ($14CC,A4)
         MOVEQ.L  #$09,D0
Q0102:
         MOVE.L   (A1)+,(A0)+
         DBRA     D0,Q0102

         MOVE.W   (A1)+,(A0)+

;   PtrParIn->IntComp = 5;

         MOVE.W   #$0005,$08(A2)

;   NextRecord.IntComp = PtrParIn->IntComp;

         MOVEA.L  (A2),A0                 ;Reset A0
         MOVE.W   $08(A2),$08(A0)

;   NextRecord.PtrComp = PtrParIn->PtrComp;

         MOVE.L   (A2),(A0)

;   Proc3(NextRecord.PtrComp);            ;_Proc3 and _Proc7 Inlined.

         MOVEA.L  $14CC(A4),A0
         TST.L    $14CC(A4)
         BEQ.S    I0302
         MOVEA.L  (A0),A1
         MOVE.L   (A0),(A1)
         JMP      I0304
I0302:
         MOVE.W   #$0064,(A4)
I0304:
         ADDQ.L   #$08,A0
         MOVE.W   #$000C,D1
         MOVE.W   (A4),D0
         ADD.W    D1,D0
         MOVE.W   D0,(A0)

;   if (NextRecord.Discr == Ident1)

         MOVEA.L  (A2),A0                 ;Reset A0 as Subr may/does alter
         TST.W    $04(A0)
         BNE.S    Q0104

;      NextRecord.IntComp = 6;

         MOVE.W   #$0006,$08(A0)

;      Proc6(PtrParIn->EnumComp, &NextRecord.EnumComp);

         ADDQ.L   #$06,A0
         MOVE.L   A0,-(A7)
         MOVE.W   $06(A2),-(A7)
         JSR      Proc6Opt00
         ADDQ.L   #$06,A7

;      NextRecord.PtrComp = PtrGlb->PtrComp;

         MOVEA.L  $14CC(A4),A0            ;_PtrGlb = ($14CC,A4)
         MOVEA.L  (A2),A1
         MOVE.L   (A0),(A1)

;      Proc7(NextRecord.IntComp, 10, &NextRecord.IntComp);

         MOVEA.L  (A2),A0                 ;_Proc7 Inlined!
         ADDQ.L   #$08,A0

         MOVEA.L  (A2),A1
         MOVE.W   $08(A1),D1
         ADDQ.W   #$02,D1
         MOVE.W   #$000A,D0
         ADD.W    D1,D0
         MOVE.W   D0,(A0)
         JMP      Q0108
Q0104:

;      structassign(*PtrParIn, NextRecord);

         MOVEA.L  A2,A1
         MOVEQ.L  #$09,D0
Q0106:
         MOVE.L   (A0)+,(A1)+
         DBRA     D0,Q0106

         MOVE.W   (A0)+,(A1)+
Q0108:
         MOVE.L   (A7)+,A2
         RTS

****************** _Proc2 *****************************************
_Proc2:
         LINK     A5,#$0000
         MOVEM.L  D4/D5,-(A7)

;   IntLoc = *IntParIO + 10;

         MOVEA.L  $08(A5),A0
         MOVE.W   (A0),D4
         ADD.W    #$000A,D4              ;D4 = IntLoc
         MOVEQ.L  #$00,D5                ;Could be garbage otherwise.

;   for(;;)

P0202:

;      if (Char1Glob == 'A')

         CMPI.B   #$41,$0008(A4)         ;_Char1Glob = ($0008,A4)
         BNE      P0204

         SUBQ.W   #$01,D4                ;--IntLoc

;         *IntParIO = IntLoc - IntGlob;

         MOVEA.L  $08(A5),A0
         MOVE.W   D4,D0
         SUB.W    $0000(A4),D0           ;_IntGlob
         MOVE.W   D0,(A0)

;         EnumLoc = Ident1;

         MOVEQ.L  #$00,D5


;      if (EnumLoc == Ident1)

P0204:

;         break;

         TST.W    D5
         BEQ      P0206

         BRA      P0202
P0206:
         MOVEM.L  (A7)+,D4/D5
         UNLK     A5
         RTS

****************** Optimized _Proc2 *************************************
Proc2Opt00:
         MOVEM.L  D4/D5,-(A7)

;   IntLoc = *IntParIO + 10;

         MOVEA.L  $0C(A7),A0
         MOVE.W   (A0),D4
         ADD.W    #$000A,D4              ;D4 = IntLoc
         MOVEQ.L  #$00,D5                ;Could be garbage otherwise.

;   for(;;)

Q0202:

;      if (Char1Glob == 'A')

         CMPI.B   #$41,$0008(A4)         ;_Char1Glob = ($0008,A4)
         BNE.S    Q0204

         SUBQ.W   #$01,D4                ;--IntLoc

;         *IntParIO = IntLoc - IntGlob;

         MOVE.W   D4,D0
         SUB.W    (A4),D0                ;_IntGlob
         MOVE.W   D0,(A0)

;         EnumLoc = Ident1;

         MOVEQ.L  #$00,D5


;      if (EnumLoc == Ident1)

Q0204:

;         break;

         TST.W    D5
         BEQ.S    Q0206
         JMP      Q0202

Q0206:
         MOVEM.L  (A7)+,D4/D5
         RTS

****************** _Proc3 *****************************************
_Proc3:
         LINK     A5,#$0000

;   if (PtrGlb != NULL)
;      *PtrParOut = PtrGlb->PtrComp;

         TST.L    $14CC(A4)
         BEQ      P0302
         MOVEA.L  $14CC(A4),A0          ;_PrtGlb = ($14CC,A4)
         MOVE.L   $08(A5),A1
         MOVE.L   (A0),(A1)

         BRA      P0304
P0302:

         MOVE.W   #$0064,$0000(A4)    ;_IntGlob
P0304:

;   Proc7(10, IntGlob, &PtrGlb->IntComp);

         MOVEA.L  $14CC(A4),A0        ;_PrtGlb = ($9768,A4)
         ADDQ.L   #$08,A0
         MOVE.L   A0,-(A7)
         MOVE.W   $0000(A4),-(A7)     ;_IntGlob
         MOVE.W   #$0A,-(A7)
         JSR      _Proc7
         ADDQ.L   #$08,A7

         UNLK     A5
         RTS

****************** _Proc4 ****************************************
** This looks like it can be optimized to almost nothing
**
_Proc4:
         LINK      A5,#$0000
         MOVE.L    D4,-(A7)

;   BoolLoc = Char1Glob == 'A';
                                        ;
         CMPI.B    #$41,$0008(A4)       ;_Char1Glob = ($82AE,A4)
         SEQ.B     D4
         AND.W     #$0001,D4

;   BoolLoc |= BoolGlob;
                                        ;
         OR.W      $0004(A4),D4         ;_BoolGlob

;   Char2Glob = 'B';
                                        ;
         MOVE.B    #$42,$000C(A4)       ;_Char2Glob = ($82AF,A4)

         MOVE.L    (A7)+,D4
         UNLK      A5
         RTS


****************** _Proc5 ***************************************
_Proc5:
         LINK      A5,#$0000
;   Char1Glob = 'A';
                                        ;
         MOVE.B    #$41,$0008(A4)       ;_Char1Glob = ($82AE,A4)

;   BoolGlob = FALSE;

         CLR.W     $0004(A4)            ;_BoolGlob = ($82AC,A4)
         UNLK      A5
         RTS

****************** _Proc6 *****************************************
_Proc6:
         LINK      A5,#$0000
         MOVEM.L   D4/A2,-(A7)

         MOVE.W    $08(A5),D4
         MOVE.L    $0A(A5),A2

;   *EnumParOut = EnumParIn;

         MOVE.W    D4,(A2)

;   if (! Func3(EnumParIn) )
;      *EnumParOut = Ident4;

         MOVE.W    D4,-(A7)
         JSR       _Func3
         ADDQ.L    #$02,A7

         TST.W     D0
         BNE.S     P0602

         MOVE.W    #$0003,(A2)

;   switch (EnumParIn)

P0602:
         MOVE.W    D4,D0
         EXT.L     D0
         BRA.S     P0620

;   case Ident1:   *EnumParOut = Ident1; break;

P0604:
         CLR.W     (A2)
         BRA.S     P0624

;   case Ident2:   if (IntGlob > 100) *EnumParOut = Ident1;

P0606:                                 ;
         CMPI.W    #$0064,$0000(A4)    ;_IntGlob
         BLE.S     P0608

         CLR.W     (A2)

;         else *EnumParOut = Ident4;

         BRA.S     P0610
P0608:
         MOVE.W    #$0003,(A2)
P0610:

;         break;

         BRA.S     P0624

;   case Ident3:   *EnumParOut = Ident2; break;

P0612:
         MOVE.W    #$0001,(A2)
         BRA.S     P0624

;   case Ident4:   break;

P0614:
         BRA.S     P0624

;   case Ident5:   *EnumParOut = Ident3;

P0616:
         MOVE.W    #$0002,(A2)

         BRA.S     P0624
P0618:

         DC.W      $FFC2
         DC.W      $FFC6
         DC.W      $FFD8
         DC.W      $FFDE
         DC.W      $FFE0

P0620:
         CMP.L    #$5,D0
         BCC.S    P0624

         ASL.L    #$01,D0
         DC.W     $303B,$00EA
P0622:
         DC.W     $4EFB,$0000
P0624:
         MOVEM.L  (A7)+,D4/A2
         UNLK     A5
         RTS

         DC.W     $0000

****************** _Proc6 With _Func3 Inlined ***************************
Proc6Opt00:
         MOVEM.L  D4/A2,-(A7)

         MOVE.W   $0C(A7),D4
         MOVE.L   $0E(A7),A2

;   *EnumParOut = EnumParIn;

         MOVE.W   D4,(A2)

;   if (! Func3(EnumParIn) )
;      *EnumParOut = Ident4;

         CMPI.W   #$0002,D4            ;_Func3 Inlined and Optimized!
         BNE      R0602
         MOVEQ.L  #$01,D0
         JMP      R0604
R0602:
         MOVEQ.L  #$00,D0
R0604:
         TST.W    D0
         BNE.S    Q0602

         MOVE.W   #$0003,(A2)

;   switch (EnumParIn)

Q0602:
         MOVE.W   D4,D0
         EXT.L    D0
         BRA.S    Q0620

;   case Ident1:   *EnumParOut = Ident1; break;

Q0604:
         CLR.W    (A2)
         BRA.S    Q0624

;   case Ident2:   if (IntGlob > 100) *EnumParOut = Ident1;

Q0606:                                 ;
         CMPI.W   #$0064,(A4)          ;_IntGlob
         BLE.S    Q0608

         CLR.W    (A2)

;         else *EnumParOut = Ident4;

         BRA.S    Q0610
Q0608:
         MOVE.W   #$0003,(A2)
Q0610:

;         break;

         BRA.S    Q0624

;   case Ident3:   *EnumParOut = Ident2; break;

Q0612:
         MOVE.W   #$0001,(A2)
         BRA.S    Q0624

;   case Ident4:   break;

Q0614:
         BRA.S    Q0624

;   case Ident5:   *EnumParOut = Ident3;

Q0616:
         MOVE.W   #$0002,(A2)

         BRA.S    Q0624
Q0618:

         DC.W     $FFC2
         DC.W     $FFC6
         DC.W     $FFD8
         DC.W     $FFDE
         DC.W     $FFE0

Q0620:
         CMP.L    #$5,D0
         BCC.S    Q0624

         ASL.L    #$01,D0
         DC.W     $303B,$00EA
Q0622:
         DC.W     $4EFB,$0000
Q0624:
         MOVEM.L  (A7)+,D4/A2
         RTS


****************** _Proc7 ***************************************
_Proc7:
         LINK     A5,#$0000
         MOVE.L   D4,-(A7)

;   IntLoc = IntParI1 + 2;

         MOVE.W   $08(A5),D4
         ADDQ.W   #$02,D4

;   *IntParOut = IntParI2 + IntLoc;

         MOVEA.L  $0C(A5),A0
         MOVE.W   $0A(A5),D0
         ADD.W    D4,D0
         MOVE.W   D0,(A0)

         MOVE.L   (A7)+,D4
         UNLK     A5
         RTS


****************** Std 68000 _Proc8 *************************************
_Proc8:
         LINK     A5,#$0000
         MOVEM.L  D4/D5,-(A7)

;   IntLoc = IntParI1 + 5;

         MOVE.W   $10(A5),D4
         ADDQ.W   #$05,D4

;   Array1Par[IntLoc] = IntParI2;

         MOVE.W   D4,D0
         EXT.L    D0
         ASL.L    #$01,D0

         MOVE.L   $08(A5),A0
         MOVE.W   $12(A5),$00(A0,D0.L)

;   Array1Par[IntLoc+1] = Array1Par[IntLoc];

         MOVE.W   D4,D0
         EXT.L    D0
         ASL.L    #$01,D0

         MOVE.L   $08(A5),A0
         MOVE.W   D4,D1
         ADDQ.W   #$01,D1
         EXT.L    D1
         ASL.L    #$01,D1
         MOVE.L   $08(A5),A1
         MOVE.W   $00(A0,D0.L),$00(A1,D1.L)

;   Array1Par[IntLoc+30] = IntLoc;

         MOVE.W   D4,D0
         ADD.W    #$001E,D0

         EXT.L    D0
         ASL.L    #$01,D0
         MOVE.L   $08(A5),A0
         MOVE.W   D4,$00(A0,D0.L)

;   for (IntIndex = IntLoc; IntIndex <= (IntLoc+1); ++IntIndex)

         MOVE.W   D4,D5
         BRA      P0804
P0802:

;      Array2Par[IntLoc][IntIndex] = IntLoc;

         MOVE.W   D4,D0
         MULS.W   #$66,D0
         MOVE.W   D5,D1
         EXT.L    D1
         ASL.L    #$01,D1
         ADD.L    D1,D0
         MOVE.L   $0C(A5),A0
         MOVE.W   D4,$00(A0,D0.L)

         ADDQ.W   #$01,D5
P0804:
         MOVE.W   D4,D0
         ADDQ.W   #$01,D0
         CMP.W    D0,D5
         BLE      P0802

;   ++Array2Par[IntLoc][IntLoc-1];
         
         MOVE.W   D4,D0
         MULS.W   #$66,D0
         MOVE.W   D4,D1
         SUBQ.W   #$01,D1
         EXT.L    D1
         ASL.L    #$01,D1
         ADD.L    D1,D0
         MOVEA.L  $0C(A5),A0
         ADD.W    #$01,$00(A0,D0.L)

;   Array2Par[IntLoc+20][IntLoc] = Array1Par[IntLoc];

         MOVE.W   D4,D0
         EXT.L    D0
         ASL.L    #$01,D0

         MOVE.L   $08(A5),A0
         MOVE.W   D4,D1
         ADD.W    #$14,D1
         MULS.W   #$66,D1

         MOVE.W   D4,D2
         EXT.L    D2
         ASL.L    #$01,D2
         ADD.L    D2,D1
         MOVE.L   $0C(A5),A1
         MOVE.W   $00(A0,D0.L),$00(A1,D1.L)

;   IntGlob = 5;

         MOVE.W   #$05,$0000(A4)     ;_IntGlob

         MOVEM.L  (A7)+,D4/D5
         UNLK     A5
         RTS

****************** Standard 68020 Proc8 *********************************
Proc8Opt20:
         MOVEM.L  D4/D5,-(A7)

;   IntLoc = IntParI1 + 5;

         MOVE.W   $14(A7),D4
         ADDQ.W   #$05,D4

;   Array1Par[IntLoc] = IntParI2;

         MOVEA.L  $0C(A7),A0
         MOVEA.L  $10(A7),A1
         DC.W     $31AD,$0012,$4200

;   Array1Par[IntLoc+1] = Array1Par[IntLoc];

         MOVE.W   D4,D0

         ADDQ.W   #$01,D0
         DC.W     $31B0,$4200,$0200

;   Array1Par[IntLoc+30] = IntLoc;

         MOVE.W   D4,D0
         ADD.W    #$001E,D0

         DC.W     $3184,$0200

;   for (IntIndex = IntLoc; IntIndex <= (IntLoc+1); ++IntIndex)

         MOVE.W   D4,D5
         JMP      P0904
P0902:

;      Array2Par[IntLoc][IntIndex] = IntLoc;

         MOVE.W   D4,D0
         MULS.W   #$66,D0
         MOVE.W   D5,D1
         EXT.L    D1
         ASL.L    #$01,D1
         ADD.L    D1,D0
         MOVE.W   D4,$00(A1,D0.L)

         ADDQ.W   #$01,D5
P0904:
         MOVE.W   D4,D0
         ADDQ.W   #$01,D0
         CMP.W    D0,D5
         BLE.S    P0902

;   ++Array2Par[IntLoc][IntLoc-1];
         
         MOVE.W   D4,D0
         MULS.W   #$66,D0
         MOVE.W   D4,D1
         SUBQ.W   #$01,D1
         EXT.L    D1
         ASL.L    #$01,D1
         ADD.L    D1,D0
         ADD.W    #$01,$00(A1,D0.L)

;   Array2Par[IntLoc+20][IntLoc] = Array1Par[IntLoc];

         MOVE.W   D4,D0
         ADD.W    #$0014,D0
         MULS.W   #$0066,D0

         MOVE.W   D4,D1
         EXT.L    D1
         ASL.L    #$01,D1
         ADD.L    D1,D0
         DC.W     $33B0,$4200,$0800

;   IntGlob = 5;

         MOVE.W   #$05,(A4)            ;_IntGlob

         MOVEM.L  (A7)+,D4/D5
         RTS

****************** Optimized 68000 _Proc8 *******************************
Proc8Opt00:
         MOVEM.L  D4/D5,-(A7)

;   IntLoc = IntParI1 + 5;

         MOVE.W   $14(A7),D4
         ADDQ.W   #$0005,D4

;   Array1Par[IntLoc] = IntParI2;

         MOVE.W   D4,D0
         EXT.L    D0
         ASL.L    #$01,D0

         MOVEA.L  $0C(A7),A0
         MOVEA.L  $10(A7),A1
         MOVE.W   $16(A7),$00(A0,D0.L)

;   Array1Par[IntLoc+1] = Array1Par[IntLoc];

         MOVE.W   D4,D0
         EXT.L    D0
         ASL.L    #$01,D0

         MOVE.W   D4,D1
         ADDQ.W   #$01,D1
         EXT.L    D1
         ASL.L    #$01,D1
         MOVE.W   $00(A0,D0.L),$00(A0,D1.L)

;   Array1Par[IntLoc+30] = IntLoc;

         MOVE.W   D4,D0
         ADD.W    #$001E,D0

         EXT.L    D0
         ASL.L    #$01,D0
         MOVE.W   D4,$00(A0,D0.L)

;   for (IntIndex = IntLoc; IntIndex <= (IntLoc+1); ++IntIndex)

         MOVE.W   D4,D5
         JMP      P1004
P1002:

;      Array2Par[IntLoc][IntIndex] = IntLoc;

         MOVE.W   D4,D0
         MULS.W   #$0066,D0
         MOVE.W   D5,D1
         EXT.L    D1
         ASL.L    #$01,D1
         ADD.L    D1,D0
         MOVE.W   D4,$00(A1,D0.L)

         ADDQ.W   #$01,D5
P1004:
         MOVE.W   D4,D0
         ADDQ.W   #$01,D0
         CMP.W    D0,D5
         BLE      P1002

;   ++Array2Par[IntLoc][IntLoc-1];
         
         MOVE.W   D4,D0
         MULS.W   #$0066,D0
         MOVE.W   D4,D1
         SUBQ.W   #$01,D1
         EXT.L    D1
         ASL.L    #$01,D1
         ADD.L    D1,D0
         ADD.W    #$0001,$00(A1,D0.L)

;   Array2Par[IntLoc+20][IntLoc] = Array1Par[IntLoc];

         MOVE.W   D4,D0
         EXT.L    D0
         ASL.L    #$01,D0

         MOVE.W   D4,D1
         ADD.W    #$0014,D1
         MULS.W   #$0066,D1

         MOVE.W   D4,D2
         EXT.L    D2
         ASL.L    #$01,D2
         ADD.L    D2,D1
         MOVE.W   $00(A0,D0.L),$00(A1,D1.L)

;   IntGlob = 5;

         MOVE.W   #$05,(A4)          ;_IntGlob

         MOVEM.L  (A7)+,D4/D5
         RTS

****************** _Func1 ******************************************
_Func1:
         LINK     A5,#$0000
         MOVEM.L  D4/D5,-(A7)

;   CharLoc1 = CharPar1;

         MOVE.B   $09(A5),D4

;   CharLoc2 = CharLoc1;

         MOVE.B   D4,D5

;   if (CharLoc2 != CharPar2)
;      return (Ident1);

         CMP.B    $0B(A5),D5
         BEQ      F0104

         MOVEQ.L  #$00,D0
F0102:
         MOVEM.L  (A7)+,D4/D5
         UNLK     A5
         RTS

F0104:

;      return (Ident2);

         MOVEQ.L  #$01,D0
         BRA      F0102


****************** _Func2 ***************************************
_Func2:
         LINK     A5,#$0000
         MOVEM.L  D4/D5,-(A7)

;   IntLoc = 1;

         MOVEQ.L  #$01,D4

;   while (IntLoc <= 1)

F0202:
         CMPI.W   #$0001,D4
         BGT      F0206

;      if (Func1(StrParI1[IntLoc], StrParI2[IntLoc+1]) == Ident1)

         MOVE.W   D4,D0
         ADDQ.W   #$01,D0
         MOVEA.L  $0C(A5),A0
         MOVE.B   $00(A0,D0.W),D1
         EXT.W    D1
         MOVE.W   D1,-(A7)
         MOVEA.L  $08(A5),A0
         MOVE.B   $00(A0,D4.W),D0
         EXT.W    D0

         MOVE.W   D0,-(A7)
         JSR      _Func1
         ADDQ.L   #$04,A7

         TST.W    D0
         BNE      F0204

;         CharLoc = 'A';

         MOVEQ.L  #$41,D5

;         ++IntLoc;
 
         ADDQ.W   #$01,D4


;   if (CharLoc >= 'W' && CharLoc <= 'Z')

F0204:
         BRA      F0202
F0206:

;      IntLoc = 7;

         CMPI.B   #$57,D5
         BLT      F0208
         CMPI.B   #$5A,D5
         BGT      F0208
         MOVEQ.L  #$07,D4

;   if (CharLoc == 'X')

F0208:

;      return(TRUE);

         CMPI.B   #$58,D5
         BNE      F0212
         MOVEQ.L  #$01,D0
F0210:
         MOVEM.L  (A7)+,D4/D5
         UNLK     A5
         RTS


F0212:

;      if (strcmp(StrParI1, StrParI2) > 0)

         MOVE.L   $0C(A5),-(A7)
         MOVE.L   $08(A5),-(A7)
         JSR      _strcmp
         ADDQ.L   #$08,A7
         TST.W    D0
         BLE      F0214

;         IntLoc += 7;

         ADDQ.W   #$07,D4

;         return (TRUE);

         MOVEQ.L  #$01,D0
         BRA      F0210

F0214:

;         return (FALSE);

         MOVEQ.L  #$00,D0
         BRA      F0210


****************** _Func3 ****************************************
_Func3:
         LINK     A5,#$0000
         MOVEM.L  D4/D5,-(A7)

         MOVE.W   $08(A5),D4

;   EnumLoc = EnumParIn;

         MOVE.W   D4,D5

;   if (EnumLoc == Ident3) return (TRUE);

         CMPI.W   #$0002,D5
         BNE      F0304

         MOVEQ.L  #$01,D0
F0302:
         MOVEM.L  (A7)+,D4/D5
         UNLK     A5
         RTS

;   return (FALSE);

F0304:
         MOVEQ.L  #$00,D0
         BRA      F0302

         DC.W     $0000

****************** _Func2 With _Func1 and _strcmp Inlined ***************
Func2Opt00:
         MOVEM.L  D4/D5,-(A7)

;   IntLoc = 1;

         MOVEQ.L  #$01,D4

;   while (IntLoc <= 1)

F0402:
         CMPI.W   #$0001,D4
         BGT.S    F0406

;      if (Func1(StrParI1[IntLoc], StrParI2[IntLoc+1]) == Ident1)

         MOVE.W   D4,D0
         ADDQ.W   #$01,D0
         MOVEA.L  $10(A7),A0
         MOVE.B   $00(A0,D0.W),D1
         EXT.W    D1

         MOVEA.L  $0C(A7),A0
         MOVE.B   $00(A0,D4.W),D0
         EXT.W    D0

         CMP.B    D1,D0                ;_Func1 Inlined and Optimized.
         BEQ.S    G0402
         MOVEQ.L  #$00,D0
         JMP      G0404
G0402:
         MOVEQ.L  #$01,D0
G0404:
         TST.W     D0
         BNE.S    F0404

;         CharLoc = 'A';

         MOVEQ.L  #$41,D5

;         ++IntLoc;
 
         ADDQ.W   #$01,D4


;   if (CharLoc >= 'W' && CharLoc <= 'Z')

F0404:
         JMP      F0402
F0406:

;      IntLoc = 7;

         CMPI.B   #$57,D5
         BLT.S    F0408
         CMPI.B   #$5A,D5
         BGT.S    F0408
         MOVEQ.L  #$07,D4

;   if (CharLoc == 'X')

F0408:

;      return(TRUE);

         CMPI.B   #$58,D5
         BNE.S    F0412
         MOVEQ.L  #$01,D0
F0410:
         MOVEM.L  (A7)+,D4/D5
         RTS
F0412:

;      if (strcmp(StrParI1, StrParI2) > 0)


         MOVE.W   #$7FFF,D0
G0406:
         SUBQ.W   #$01,D0
         BMI.S    G0410

         MOVEA.L  $0C(A7),A0
         MOVEA.L  $10(A7),A1
G0408:
         CMPM.B   (A1)+,(A0)+
         BNE.S    G0412

         SUBQ.W   #$01,A0
         TST.B    (A0)+
         DBEQ     D0,G0408
G0410:
         MOVEQ.L  #$00,D0
         MOVEM.L  (A7)+,D4/D5
         RTS
G0412:
         BLS.S    F0414
         MOVEQ.L  #$01,D0
G0418:
;         IntLoc += 7;

         ADDQ.W   #$07,D4

;         return (TRUE);

         MOVEQ.L  #$01,D0
         MOVEM.L  (A7)+,D4/D5
         RTS
F0414:
;         return (FALSE);

         MOVEQ.L  #$00,D0
         MOVEM.L  (A7)+,D4/D5
         RTS

****************** _dtime ****************************************
_dtime:
         LINK      A5,#-$000C

         PEA.L     -$0C(A5)
         JSR       DTG
         ADDQ.L    #$04,A7

;   return (tt.ticks + (tt.minutes * 60L * 50L));

         MOVE.L    #$00000BB8,D1
         MOVE.L    -$08(A5),D0
         JSR       LMulu
         ADD.L     -$04(A5),D0

         UNLK      A5
         RTS

****************** AmigaDOS DateStamp ********************************
DTG:
         MOVE.L    $04(A7),D1
         MOVEA.L   _DOSBase,A6
         JMP       _LVODateStamp(A6)

****************** _strcpy *******************************************
_strcpy:
         MOVE.L    $04(A7),A0
         MOVE.L    A0,D0
         MOVE.L    $08(A7),A1

S0102:   MOVE.B    (A1)+,(A0)+
         BNE       S0102
         RTS

****************** _strcmp *******************************************
_strcmp:
         MOVE.W    #$7FFF,D0
         BRA       S0202

         MOVE.W    $0C(A7),D0
S0202:
         SUBQ.W    #$01,D0
         BMI       S0206

         MOVEA.L   $04(A7),A0
         MOVEA.L   $08(A7),A1
S0204:
         CMPM.B    (A1)+,(A0)+
         BNE       S0208

         SUBQ.W    #$01,A0
         TST.B     (A0)+
         DBEQ      D0,S0204
S0206:
         MOVEQ.L   #$00,D0
         RTS

S0208:
         BLS       S0210
         MOVEQ.L   #$01,D0
         RTS

S0210:   MOVEQ.L   #-$01,D0
         RTS

************************ _printf ****************************************
_printf:
         MOVEM.L  D1-D3/A0-A3/A6,-(A7)
         MOVEA.L  $24(A7),A0
         LEA.L    $28(A7),A1
         LEA.L    S0303,A2

         LEA.L    -$200(A7),A7
         MOVEA.L  A7,A3

         MOVEA.L  _SysBase,A6
         JSR      _LVORawDoFmt(A6)

         MOVEQ.L  #-$01,D0
S0301:   TST.B    (A3)+
         DBEQ     D0,S0301

         NOT.L    D0
         BEQ      S0302

         MOVE.L   _stdout,D1
         MOVE.L   A7,D2
         MOVE.L   D0,D3
         MOVEA.L  _DOSBase,A6
         JSR      _LVOWrite(A6)

S0302:   LEA.L    $200(A7),A7
         MOVEM.L  (A7)+,D1-D3/A0-A3/A6
         RTS

S0303:   MOVE.B   D0,(A3)+
         RTS

************************* Input Command *********************************
Command:
         MOVEM.L  D1-D3/A1-A6,-(A7)
         MOVE.L   crtFile,_stdout

         MOVE.L   A0,-(A7)
         JSR      _printf
         LEA.L    $04(A7),A7

         MOVEA.L  PrgCmdBuf,A0
         MOVEQ.L  #$4F,D1

S0401:   CLR.B    (A0)+
         SUBQ.L   #$01,D1
         BPL      S0401

         MOVEA.L  PrgCmdBuf,A0
         MOVE.L   _stdin,D1
         MOVE.L   A0,D2
         MOVEQ.L  #$50,D3
         MOVEA.L  _DOSBase,A6
         JSR      _LVORead(A6)

         MOVE.L   D0,PrgCmdLen
         MOVE.L   PrgCmdBuf,A0

         MOVEM.L  (A7)+,D1-D3/A1-A6
         RTS

****************** FFP Float *****************************************
FFPFlt:

         RTS

****************** FFP Divide ****************************************
FFPDiv:

         RTS

****************** Long Signed Divide ***********************************
LDivs:
         MOVEM.L  D1/D4,-(A7)
         MOVEQ.L  #$00,D4
         TST.L    D0
         BPL.S    S0702

         NEG.L    D0
         ADDQ.W   #$01,D4
S0702:
         TST.L    D1
         BPL.S    S0704
         NEG.L    D1
         EORI.W   #$0001,D4
S0704:
         BSR      Div32
         TST.W    D4
         BEQ.S    S0706
         NEG.L    D0
S0706:
         MOVEM.L  (A7)+,D1/D4
         TST.L    D0
         RTS

****************** Div32 *********************************************
Div32:
         MOVEM.L  D2/D3,-(A7)
         SWAP     D1
         TST.W    D1
         BNE.B    S0802
         SWAP     D1
         MOVE.W   D1,D3
         MOVE.W   D0,D2
         CLR.W    D0
         SWAP     D0
         DIVU.W   D3,D0
         MOVE.L   D0,D1
         SWAP     D0
         MOVE.W   D2,D1
         DIVU.W   D3,D1
         MOVE.W   D1,D0
         CLR.W    D1
         SWAP     D1
         MOVEM.L  (A7)+,D2/D3
         RTS

S0802:   SWAP     D1
         MOVE.L   D1,D3
         MOVE.L   D0,D1
         CLR.W    D1
         SWAP     D1
         SWAP     D0
         CLR.W    D0
         MOVEQ.L  #$0F,D2
S0804:
         ADD.L    D0,D0
         ADDX.L   D1,D1
         CMP.L    D1,D3
         BHI.S    S0806
         SUB.L    D3,D1
         ADDQ.W   #$01,D0
S0806:
         DBF      D2,S0804

         MOVEM.L  (A7)+,D2/D3
         RTS

****************** Long Unsigned Multiply *******************************
LMulu:
         MOVEM.L  D1-D3,-(A7)
         MOVE.W   D1,D2
         MULU.W   D0,D2
         MOVE.L   D1,D3
         SWAP     D3
         MULU.W   D0,D3
         SWAP     D3
         CLR.W    D3
         ADD.L    D3,D2
         SWAP     D0
         MULU.W   D1,D0
         SWAP     D0
         CLR.W    D0
         ADD.L    D2,D0
         MOVEM.L  (A7)+,D1-D3
         RTS

******************** Print CPU and FPU Types ****************************
PrtCPUFPU:
         MOVEM.L  D0/A0-A1,-(A7)

         MOVE.L   CPU_Type,D0
         LSL.L    #$03,D0
         LEA.L    STR501,A0
         ADDA.L   D0,A0

         MOVE.L   FPU_Type,D0
         LSL.L    #$03,D0
         LEA.L    STR502,A1
         ADDA.L   D0,A1

         MOVE.L   A1,-(A7)
         MOVE.L   A0,-(A7)
         PEA.L    STR500
         JSR      _printf
         LEA.L    $0C(A7),A7

         MOVEM.L  (A7)+,D0/A0-A1
         RTS

******************** Print Cache Control Register Status ****************
Cache_Status:
         MOVE.L   CPU_Type,D0
         CMPI.W   #$0000,D0
         BEQ      S1160
         CMPI.W   #$0001,D0
         BEQ      S1170

         MOVE.L   #$00000002,D0     ;D0.W = CNTRL REG (GURU if not right)
         BSR      ReadCR            ;D0 Contains CACR Value.

         MOVE.L   D0,D4

         LEA.L    ITS_OFF,A1
         BTST.L   #$0000,D4
         BEQ      S1102
         LEA.L    ITS_ON,A1

S1102:   LEA.L    ICacheE,A2
         JSR      S1180

         LEA.L    ITS_OFF,A1
         BTST.L   #$0001,D4
         BEQ      S1104
         LEA.L    ITS_ON,A1

S1104:   LEA.L    ICacheF,A2
         JSR      S1180

         MOVE.L   CPU_Type,D0
         CMPI.W   #$0002,D0
         BEQ      S1150

         LEA.L    ITS_OFF,A1
         BTST.L   #$0004,D4
         BEQ      S1106
         LEA.L   ITS_ON,A1

S1106:   LEA.L    ICacheB,A2
         JSR      S1180

         LEA.L    ITS_OFF,A1
         BTST.L   #$0008,D4
         BEQ      S1108
         LEA.L    ITS_ON,A1

S1108:   LEA.L    DCacheE,A2
         JSR      S1180

         LEA.L    ITS_OFF,A1
         BTST.L   #$0009,D4
         BEQ      S1110
         LEA.L    ITS_ON,A1

S1110:   LEA.L    DCacheF,A2
         JSR      S1180

         LEA.L    ITS_OFF,A1
         BTST.L   #$000C,D4
         BEQ      S1112
         LEA.L    ITS_ON,A1

S1112:   LEA.L    DCacheB,A2
         JSR      S1180

         LEA.L    ITS_OFF,A1
         BTST.L   #$000D,D4
         BEQ      S1114
         LEA.L    ITS_ON,A1

S1114:   LEA.L    WriteAlloc,A2
         JSR      S1180

S1150:
         PEA.L    LineFeed
         JSR      _printf
         ADDQ.L   #$04,A7
         RTS

S1160:   LEA.L    STR117,A2
         JSR      PrintError
         RTS

S1170:   LEA.L    STR118,A2
         JSR      PrintError
         RTS

S1180:   MOVE.L   A1,-(A7)
         MOVE.L   A2,-(A7)
         JSR      _printf
         ADDQ.L   #$08,A7
         RTS

*************************************************************************
Write_To_CACR:
         MOVE.L   CPU_Type,D5
         CMPI.W   #$0000,D5
         BEQ      S1160
         CMPI.W   #$0001,D5
         BEQ      S1170

         MOVE.W   (A0),D2

         MOVEQ.L  #$00,D3
         MOVE.B   D2,D3
         ANDI.W   #$0001,D3
         ANDI.W   #$FF00,D2

         CMPI.W   #$3000,D2
         BEQ      S1202
         CMPI.W   #$3100,D2         ;ICache
         BEQ      S1204
         CMPI.W   #$3200,D2
         BEQ      S1206
         CMPI.W   #$3300,D2
         BEQ      S1208
         CMPI.W   #$3400,D2
         BEQ      S1210
         CMPI.W   #$3500,D2
         BEQ      S1212
         BRA      S1250

S1202:   MOVEQ.L  #$00,D0
         BRA      S1230
S1204:   MOVEQ.L  #$00,D4
         BRA      S1220
S1206:   MOVEQ.L  #$04,D4
         BRA      S1220
S1208:   MOVEQ.L  #$08,D4
         BRA      S1220
S1210:   MOVEQ.L  #$0C,D4
         BRA      S1220
S1212:   MOVEQ.L  #$0D,D4

S1220:
         MOVE.L   #$00000002,D0     ;D0.W = CNTRL REG (GURU if not right)
         BSR      ReadCR            ;D0 Contains Current CACR Value.

         BSET.L   #$0003,D0
         CMPI.W   #$0003,D5
         BNE      S1226
         BSET.L   #$000B,D0
S1226:
         TST.B    D3
         BNE      S1228
         BCLR.L   D4,D0
         BRA      S1230
S1228:   BSET.L   D4,D0

S1230:
         MOVE.L   #$00000002,D1     ;D1.W = CNTRL REG (GURU if not right)
         BSR      WriteCR
S1250:
         RTS

*************************************************************************
PrintError:
         MOVE.L   A2,-(A7)
         PEA.L    STR115
         JSR      _printf
         ADDQ.L   #$04,A7
         MOVEA.L  (A7)+,A2
         RTS

******************** Control Registers **********************************
*** D0.W defines the Control Register (CR) to Read.
*** Result in D0.L
ReadCR:
         MOVEM.L  A5/A6,-(A7)
         MOVEA.L  _SysBase,A6
         JSR      _LVODisable(A6)

         LEA.L    XCode,A5
         MOVE.W   #$4E7A,$00(A5)    ;MOVEC.L CR,D0
         MOVE.W   D0,$02(A5)
         MOVE.W   #$4E73,$04(A5)    ;RTE

         MOVEA.L  _SysBase,A6
         JSR      _LVOSupervisor(A6)

         JSR      _LVOEnable(A6)
         MOVEM.L  (A7)+,A5/A6
         RTS

*************************************************************************
*** D1.W defines the Control Register (CR) to Write.
*** D0.L is the data to Write.
WriteCR:
         MOVEM.L  A5/A6,-(A7)
         MOVEA.L  _SysBase,A6
         JSR      _LVODisable(A6)

         LEA.L    XCode,A5
         MOVE.W   #$4E7B,$00(A5)    ;MOVEC.L D0,CR
         MOVE.W   D1,$02(A5)
         MOVE.W   #$4E73,$04(A5)    ;RTE

         MOVEA.L  _SysBase,A6
         JSR      _LVOSupervisor(A6)

         JSR      _LVOEnable(A6)
         MOVEM.L  (A7)+,A5/A6
         RTS

*************************************************************************
*** Result in D0.W
ReadSR:
         MOVEM.L  A5/A6,-(A7)
         LEA.L    XCode,A5
         MOVE.W   #$40C0,$00(A5)    ;MOVE.W SR,D0
         MOVE.W   #$4E73,$02(A5)    ;RTE

         MOVEA.L  _SysBase,A6
         JSR      _LVOSupervisor(A6)

         MOVEM.L  (A7)+,A5/A6
         RTS

***********************************************************
*** D0.W defines the MMU Control Register (CR) to Read.
*** Result in (A0), where A0 --> XData.
ReadMMUCR:
         MOVEM.L  A5/A6,-(A7)
         MOVEA.L  _SysBase,A6
         JSR      _LVODisable(A6)

         LEA.L    XCode,A5
         LEA.L    XData,A0
         MOVE.W   #$F010,$00(A5)    ;PMOVE.SZ MMUCR,(A0)
         MOVE.W   D0,$02(A5)
         MOVE.W   #$4E73,$04(A5)    ;RTE

         MOVEA.L  _SysBase,A6
         JSR      _LVOSupervisor(A6)

         JSR      _LVOEnable(A6)
         MOVEM.L  (A7)+,A5/A6
         RTS

XCode:   DC.W     $0000,$0000
         DC.W     $0000,$0000

XData:   DC.W     $0000,$0000
         DC.W     $0000,$0000
         DC.W     $0000,$0000

****************** CPU and FPU Types **********************
CPU_FPU_Type:
         MOVEM.L  D0/D1/A0/A6,-(A7)
         MOVEA.L  _SysBase,A6
         LEA.L    AttnFlags(A6),A0
         LEA.L    $01(A0),A0

         MOVEQ.L  #$00,D0
         MOVE.B   (A0),D0

         MOVE.L   D0,D1
         ANDI.B   #$0F,D1
         MOVE.L   D1,CPU_Type

         CMPI.B   #$03,D1
         BNE      S1402
         MOVE.L   #$00000002,CPU_Type
         BRA      S1404

S1402:   CMPI.B   #$07,D1
         BNE      S1404
         MOVE.L   #$00000003,CPU_Type

S1404:   MOVE.L   D0,D1
         ANDI.W   #$00F0,D1
         LSR.L    #$04,D1
         MOVE.L   D1,FPU_Type

         CMPI.B   #$03,D1
         BNE      S1406
         MOVE.L   #$00000002,FPU_Type
         BRA      S1408

S1406:   CMPI.B   #$07,D1
         BNE      S1408
         MOVE.L   #$00000003,FPU_Type

S1408:
         MOVEM.L  (A7)+,D0/D1/A0/A6
         RTS

****************** Strings *******************************************
            CNOP  0,2
TaskName:   DC.B  'AmigaBench',$00

            CNOP  0,2
_TWspec:    DC.B  'CON:0/0/640/200/ AmigaBench',$00

            CNOP  0,2
Dump01      DC.B  '   Program Subroutine And Global Data Addresses:',$0A,$0A
            DC.B  '   _main:       $%08lx',$0A
            DC.B  '   Proc0Opt00:  $%08lx',$0A
            DC.B  $00

            CNOP  0,2
Dump02      DC.B  '   Proc0Opt20:  $%08lx',$0A
            DC.B  '   Proc1Opt00:  $%08lx',$0A
            DC.B  $00

            CNOP  0,2
Dump03      DC.B  '   Proc2Opt00:  $%08lx',$0A
            DC.B  '   Froc6Opt00:  $%08lx',$0A
            DC.B  $00

            CNOP  0,2
Dump04      DC.B  '   Proc8Opt20:  $%08lx',$0A
            DC.B  '   Proc8Opt00:  $%08lx',$0A
            DC.B  $00

            CNOP  0,2
Dump05      DC.B  '   Func2Opt00:  $%08lx',$0A
            DC.B  '   _A4Ref:      $%08lx',$0A
            DC.B  $0A,$00

            CNOP  0,2
PrtReg      DC.B  '   CACR = $%08lx',$0A,$00

            CNOP  0,2
CmdRepeat   DC.B  $0A,$0A
            DC.B  $9B,$30,$33,$41
            DC.B  $9B,$4A
            DC.B  $00

            CNOP  0,2
CmdPrompt   DC.B  'Command:> ',$00

            CNOP  0,2
EntPrompt   DC.B  'Enter Cache Command:> ',$00

            CNOP  0,2
LineFeed    DC.B  $0A
            DC.B  $00

            CNOP  0,2
Title       DC.B  $0C,$9B,$33,$33,$6D
            DC.B  '   ****<<<'
            DC.B  $9B,$37,$3B,$33,$31,$6D
            DC.B  ' Amiga Assembly Benchmark Programs, 03 Aug 1989, By ALA '
            DC.B  $9B,$30,$3B,$33,$33,$6D
            DC.B  '>>>****'
            DC.B  $9B,$33,$31,$6D
            DC.B  $0A,$0A,$00

            CNOP  0,2
ITS_OFF     DC.B  'OFF',$00

            CNOP  0,2
ITS_ON      DC.B  $9B,$33,$33,$6D
            DC.B  'ON '
            DC.B  $9B,$33,$31,$6D
            DC.B  $00

            CNOP  0,2
ICacheE     DC.B  '   Cache Status:',$0A,$0A
            DC.B  '   Instruction Cache:         %s',$0A,$00

            CNOP  0,2
ICacheF     DC.B  '   Freeze Instruction Cache:  %s',$0A,$00

            CNOP  0,2
ICacheB     DC.B  '   Instruction Burst:         %s',$0A,$00

            CNOP  0,2
DCacheE     DC.B  '   Data Cache:                %s',$0A,$00

            CNOP  0,2
DCacheF     DC.B  '   Freeze Data Cache:         %s',$0A,$00

            CNOP  0,2
DCacheB     DC.B  '   Data Burst:                %s',$0A,$00

            CNOP  0,2
WriteAlloc  DC.B  '   Write Allocate:            %s',$0A,$00


            CNOP  0,2
STR101      DC.B  $9B,$33,$33,$6D
            DC.B  '   Dhrystone Benchmark Program',$0A
            DC.B  $9B,$33,$31,$6D
            DC.B  $00

            CNOP  0,2
STR102      DC.B  '   Enter ',$27,' ?<cr> ',$27,' For Command List.'
            DC.B  $0A,$0A,$00

            CNOP  0,4
            DC.L  $00000000

STR103      DC.B  'DHRYSTONE PROGRAM, SOME STRING',$00

            CNOP  0,4
            DC.L  $00000000

STR104      DC.B  'DHRYSTONE PROGRAM, 2',$27,'ND STRING',$00

            CNOP  0,2
STR105      DC.B  $9B,$33,$33,$6D
            DC.B  '   BenchTime (50*Seconds) for %ld Passes ='
            DC.B  $9B,$33,$31,$6D
            DC.B  ' %ld '
            DC.B  $0A,$0A,$00

            CNOP  0,2
STR106      DC.B  $9B,$33,$33,$6D
            DC.B  '   This System Benchmarks at'
            DC.B  $9B,$33,$31,$6D
            DC.B  ' %ld '
            DC.B  $9B,$33,$33,$6D
            DC.B  'Dhrystones/sec.',$0A
            DC.B  $9B,$33,$31,$6D
            DC.B  $00

            CNOP  0,2
STR107:     DC.B  '   Standard  68000 Assembly Version.',$0A,$0A,$0A,$00

            CNOP  0,2
STR108:     DC.B  '   Optimized 68000 Assembly Version.',$0A,$0A,$0A,$00

            CNOP  0,2
STR109      DC.B  '   Optimized 68020 Assembly Version',$0A,$0A,$0A,$00

            CNOP  0,2
STR110      DC.B  '   Command List:',$0A,$0A
            DC.B  '   ?     ;This Command List',$0A
            DC.B  '   q     ;Quit',$0A
            DC.B  '   ca    ;Check Subr and Global Data Addresses.',$0A
            DC.B  '   cs    ;Cache Status.',$0A
            DC.B  '   wc    ;Write Cache.',$0A,$0A
            DC.B  '   1     ;Std 68000 Assembly Dhrystone',$0A
            DC.B  '   2     ;Opt 68000 Assembly Dhrystone',$0A
            DC.B  '   3     ;Opt 68020 Assembly Dhrystone',$0A
            DC.B  $00

            CNOP  0,2
STR115      DC.B  $9B,$30,$32,$41
            DC.B  $9B,$4A
            DC.B  $9B,$30,$3B,$33,$33,$6D
            DC.B  '   %s',$0A
            DC.B  $9B,$30,$3B,$33,$31,$6D
            DC.B  $00

            CNOP  0,2
STR116:     DC.B  'Error, 68000 and 68010 Can Not Run 68020 Code.',$00

            CNOP  0,2
STR117:     DC.B  'Error, The 68000 Has No Internal Cache.',$00

            CNOP  0,2
STR118:     DC.B  'Error, The 68010 Has No Internal Cache.',$00

            CNOP  0,2
STR119:     DC.B  '   Command:',$0A,$0A
            DC.B  '   0         ;Clear ALL Cache Bits.',$0A
            DC.B  '   11[0]     ;Instruction Cache ON[OFF].',$0A
            DC.B  '   21[0]     ;Instruction Burst ON[OFF].',$0A
            DC.B  '   31[0]     ;Data        Cache ON[OFF].',$0A
            DC.B  '   41[0]     ;Data        Burst ON[OFF].',$0A
            DC.B  '   51[0]     ;Write_Allocate    ON[OFF].',$0A
            DC.B  $00

            CNOP  0,2
STR120:     DC.B  $0A
            DC.B  '   E.G., 11 Turns ICache ON, 10 Turns ICache OFF',$0A
            DC.B  $0A,$00

            CNOP  0,2
STR500:     DC.B  $9B,$33,$33,$6D
            DC.B  '   CPU / FPU:  '
            DC.B  $9B,$33,$31,$6D
            DC.B  '%s/%s',$0A,$00

STR501:     DC.B  '68000',$00,$00,$00
            DC.B  '68010',$00,$00,$00
            DC.B  '68020',$00,$00,$00
            DC.B  '68030',$00,$00,$00
            DC.B  '68040',$00,$00,$00
            DC.B  '?????',$00,$00,$00

STR502:     DC.B  '-----',$00,$00,$00
            DC.B  '68881',$00,$00,$00
            DC.B  '68882',$00,$00,$00
            DC.B  '?????',$00,$00,$00
            DC.B  '?????',$00,$00,$00
            DC.B  '?????',$00,$00,$00

****************** Fixed Constants ************************************

ThisTCB:    DS.L  $01
CPU_Type:   DS.L  $01
FPU_Type:   DS.L  $01
SaveA7:     DS.L  $01
crtFile:    DS.L  $01
PrgCmdBuf:  DS.L  $01
PrgCmdLen:  DS.L  $01

_A4Ref:
_IntGlb:    DS.B  $04               ;$0000

_BoolGlb:   DS.B  $04               ;$0004

_Char1Glb:  DS.B  $04               ;$0008

_Char2Glb:  DS.B  $04               ;$000C

_Array1Glb: DS.B  $68               ;$0010

_Array2Glb: DS.B  $1454             ;$0078

_PtrGlb:    DS.B  $04               ;$14CC

_PrtGlbNxt: DS.B  $04               ;$14D0

_Buffer:    DS.B  $140

Buf01:      DS.B  $30

Buf02:      DS.B  $30

************************* Thats All Folks! *******************************

      END
