;***********************************************
; Blitter-"Benchmark"
; written by Peter Simons
; (C) by MAXON-Computer GmbH
;***********************************************

;---------------------------------- Switches ---
WIDTH           equ     16   ; Mit der Variable
HEIGHT          equ     16   ; OBJECTS kann die
DEPTH           equ      5   ; Anzahl der Test-
OBJECTS         equ     75   ; elemente bestimmt
                             ; werden

;---------------------------------- Exec -------
_LVOAllocMem            equ     -198
_LVOFreeMem             equ     -210
_LVOOldOpenLibrary      equ     -552
_LVOCloseLibrary        equ     -414

PUBLIC          equ     1<<0
CHIP            equ     1<<1
FAST            equ     1<<2
CLEAR           equ     1<<16
LARGEST         equ     1<<17

;---------------------------------- Hardware ---
DMACONR         equ     $002
VPOSR           equ     $004
INTENAR         equ     $01C
BLTCON0         equ     $040
BLTCON1         equ     $042
BLTAFWM         equ     $044
BLTALWM         equ     $046
BLTAPTH         equ     $050
BLTDPTH         equ     $054
BLTSIZE         equ     $058
BLTAMOD         equ     $064
BLTDMOD         equ     $066
DMACON          equ     $096
INTENA          equ     $09A
COLOR           equ     $180
CIAPRA          equ     $BFE000+1

;---------------------------------- Macros -----
WaitBeam        MACRO
.Loop\@         move.l  VPOSR(a6),d0
                and.l   #$0001FF00,d0
                cmp.l   #\1,d0
                bne.s   .Loop\@
                ENDM

WaitBlitterFinish       MACRO
.Wait\@         btst    #14,DMACONR(a6)
                bne.s   .Wait\@
                ENDM


;****************** Programm *******************

START           move.l  4.w,a6
                move.l  #WIDTH/8*HEIGHT*DEPTH,d0
                move.l  #CHIP,d1
                jsr     _LVOAllocMem(a6)
                lea     _BitMap1(PC),a5
                move.l  d0,(a5)
                beq.w   Exit

                move.l  #WIDTH/8*HEIGHT*DEPTH,d0
                move.l  #CHIP,d1
                jsr     _LVOAllocMem(a6)
                move.l  d0,4(a5)
                beq.w   FreeMem1

                lea     $DFF000,a6
                lea     DMACON_BUF(PC),a0
                move.w  DMACONR(a6),(a0)
                move.w  INTENAR(a6),2(a0)
                or.l    #$80008000,(a0)

                move.w  #$7FFF,DMACON(a6)
                move.w  #$7FFF,INTENA(a6)

                move.w  #$8640,DMACON(a6)

;------------------- Mainloop ------------------

MAIN            btst    #6,CIAPRA
                beq.s   RestoreSystem

                WaitBeam $02500
                move.w  #$000F,COLOR(a6)
                moveq   #OBJECTS-1,d2
.loop           bsr.w   Blit_Fast       ; blau
                dbra    d2,.loop
                move.w  #$0000,COLOR(a6)

                move.w  #$0F00,COLOR(a6)
                moveq   #OBJECTS-1,d2
.loop2          bsr.s   Blit_Normal     ; rot
                dbra    d2,.loop2
                move.w  #$0000,COLOR(a6)

                bra.s   MAIN

;-------------- Exit gracefully ----------------

RestoreSystem:
                move.w  #$7FFF,DMACON(a6)
                move.w  #$7FFF,INTENA(a6)

                move.w DMACON_BUF(PC),DMACON(a6)
                move.w INTENA_BUF(PC),INTENA(a6)

                move.l  4.w,a6
                move.l  _BitMap2(PC),a1
                move.l  #WIDTH/8*HEIGHT*DEPTH,d0
                jsr     _LVOFreeMem(a6)

FreeMem1        move.l  _BitMap1(PC),a1
                move.l  #WIDTH/8*HEIGHT*DEPTH,d0
                jsr     _LVOFreeMem(a6)

Exit            rts

;****************** Unterprogramme *************

Blit_Normal     WaitBlitterFinish
                move.w  #$FFFF,BLTAFWM(a6)
                move.w  #$FFFF,BLTALWM(a6)
                move.w  #$0000,BLTAMOD(a6)
                move.w  #$0000,BLTDMOD(a6)
                move.w  #$09F0,BLTCON0(a6)
                move.w  #$0000,BLTCON1(a6)
                moveq   #DEPTH-1,d1
                move.w  #HEIGHT*64+WIDTH/16,d0

.loop           WaitBlitterFinish
                move.l  _BitMap1(PC),BLTAPTH(a6)
                move.l  _BitMap2(PC),BLTDPTH(a6)
                move.w  d0,BLTSIZE(a6)
                dbra    d1,.loop
                rts


Blit_Fast       WaitBlitterFinish
                move.w  #$FFFF,BLTAFWM(a6)
                move.w  #$FFFF,BLTALWM(a6)
                move.w  #$0000,BLTAMOD(a6)
                move.w  #$0000,BLTDMOD(a6)
                move.w  #$09F0,BLTCON0(a6)
                move.w  #$0000,BLTCON1(a6)
                move.l  _BitMap1(PC),BLTAPTH(a6)
                move.l  _BitMap2(PC),BLTDPTH(a6)
                move.w  #HEIGHT*DEPTH*64+WIDTH/16,BLTSIZE(a6)
                rts

;********************* Daten *******************

DMACON_BUF      ds.w    1
INTENA_BUF      ds.w    1
_BitMap1        ds.l    1
_BitMap2        ds.l    1

