TurboCircle - MC680x0

*** Die Weltschnellste Kreisroutine in 680x0-Assembler ***

Mich haben schon einige Leute gefragt wie ich so schnell Kreise zeichnen kann, hier des Rätsels Lösung.
Keine Multiplikationen, komplett asynchrones Design, passt auch in den Cache des 68030.
*** Download ***
;
;$VER: TurboCircle.asm 1.3 am 7.2.95 (c) Holger.Hippenstiel.org - lynxx@uni.de
;
;Geschrieben weil die orginal EGS-Funktion so furchtbar langsam war,
;610 Kreise mit (68030/50Mhz/WSpeed/EGS-Spektrum Zorro II) getestet.
;Mit dieser Routine 111111 Kreise d.h diese Routine ist 182 mal schneller.
;Später folgten noch einige andere Routinen, die dann alle zusammen in EGS-Turbo
;(siehe Aminet) landeten. Die Routine kann bei jeglichen Chunky-Screens verwendet werden.
;Gib mir Credits falls Du sie verwenden willst.
;
;Assembler-Kompabilität:
;+AsmOne, AsmPro, DevPac [Default Type = word], MasterSeka & Profimat
;+Mindest 68010-Assemblier-Modi erforderlich.
;-Ungetestet: A68k
;

;d0=X, d1=Y, d2=Color, d5=Size (max 2048), d6=ScreenWidth, d7=ScreenHeight (max 2048), a0=Screen
TurboCircle:
        movem.l d0-d7/a0-a6,-(a7)
        add     d0,a0             ;X
        move    d1,a2             ;Y
        ext.l   d5
        lea     Multab(pc),a1
        move.l  (a1),d4
        subq    #1,d7
        bmi.b   .MulTabOk

        cmp     -4(a1),d7         ;Multab-Height = ScreenHeight ?
        bne.b   .NotSameHeight

        cmp     d4,d6             ;Multab-Width = ScreenWidth ?
        beq.b   .MulTabOk

.NotSameHeight:
        move    d7,-4(a1)         ;Store new Screen-Height
        ext.l   d6
        move.l  a1,a3
        move.l  d6,d0

.MakeMul:
        move.l  d0,(a3)+          ;Make new Multab
        add.l   d6,d0
        dbf     d7,.MakeMul

        move.l  d6,d4

.MulTabOk:
        lea     (a1,a2.w*4),a1
        move.l  a0,a3
        moveq   #0,d7
        add.l   (a1,d5.w*4),a3
        move.l  a0,a4
        moveq   #0,d0
        add.l   (a1),a4
        move.l  d5,d3
        move.l  a0,a6
        neg.l   d3
        add.l   (a1,d3.w*4),a6
        lea     .IncX0(pc),a5
        moveq   #2,d1
        add.l   (a1),a0
        move.l  d3,d6
        sub.l   d5,d1
        jmp     (a5)

        cnop    0,4

.IncX0: move.l  a0,a1
.IncX1: add.l   d5,a1
        move.b  d2,(a1)           ;X+,Y-
        move.l  a4,a1
        add.l   d0,d1             ;X inc
        add.l   d5,a1
        move.b  d2,(a1)           ;X+,Y+
        move.l  a0,a1
        add.l   d3,a1
        move.b  d2,(a1)           ;X-,Y-
        move.l  a4,a1
        addq.l  #1,d6
        add.l   d3,a1
        move.b  d2,(a1)           ;X-,Y+
        move.l  a6,a1
        add.l   d4,a4
        add.l   d0,a1
        move.b  d2,(a1)           ;X+,Y-
        move.l  a6,a1
        sub.l   d4,a0
        add.l   d7,a1
        move.b  d2,(a1)           ;X-,Y-
        move.l  a3,a1
        add.l   d7,a1
        subq.l  #1,d7
        move.b  d2,(a1)           ;X-,Y+
        move.l  a3,a1
        add.l   d0,a1
        addq.l  #1,d0
        move.b  d2,(a1)           ;X+,Y+
        move.l  a0,a1
        addq.l  #1,d1
        bmi.b   .IncX1

.CircleLoop:
        addq.l  #2,d6
        cmp.l   d0,d5
        ble.b   .CircEnd
        move.l  a0,a1
        subq.l  #1,d5
        add.l   d5,a1
        move.b  d2,(a1)           ;X+,Y-
        move.l  a4,a1
        addq.l  #1,d3
        add.l   d5,a1
        move.b  d2,(a1)           ;X+,Y+
        move.l  a0,a1
        sub.l   d4,a3
        add.l   d3,a1
        move.b  d2,(a1)           ;X-,Y-
        move.l  a4,a1
        add.l   d4,a6
        add.l   d3,a1
        move.b  d2,(a1)           ;X-,Y+
        move.l  a6,a1
        add.l   d4,a4
        add.l   d0,a1
        move.b  d2,(a1)           ;X+,Y-
        move.l  a6,a1
        sub.l   d4,a0
        add.l   d7,a1
        move.b  d2,(a1)           ;X-,Y-
        move.l  a3,a1
        add.l   d7,a1
        move.b  d2,(a1)           ;X-,Y+
        move.l  a3,a1
        subq.l  #1,d7
        add.l   d0,a1
        addq.l  #1,d0
        move.b  d2,(a1)           ;X+,Y+
        add.l   d6,d1
        bpl.b   .CircleLoop
        jmp     (a5)              ;Else bra.w

.CircEnd:
        movem.l (a7)+,d0-d7/a0-a6
        rts

        cnop    0,4

        dc.l 0                    ;Multab-Height
Multab: dc.l 0                    ;Multab-Width
        ds.l 2048