
;******** Taktzyklen bestimmen *********
;*-------------------------------------*
;* Prog.name:     taktik.s             *
;*-------------------------------------*
;* Autor:         Gerald Steffens      *
;* Copyright:     bei mir              *
;* Assembler:     A68k                 *
;* Hardware:      512K,Kickstart1.2    *
;***************************************

ExecBase:         equ      4
OldOpenLibrary:   equ   -408
CloseLibrary:     equ   -414
Output:           equ    -60
Write:            equ    -48
Disable:          equ   -120
Enable:           equ   -126
RawDoFmt:         equ   -522
Umlauf:           equ     99  ; für 100 Umläufe

start:            equ      0  ; Register d6 läuft
ende:             equ     20  ; von start bis ende
; hängt die Testschleife nicht von d6 ab, so reicht start=ende=0


;***** hier beginnt der Spaß *****
   move.l   ExecBase,a6       ; es wird
   lea      dosname,a1        ; die Dos-Library
   jsr      OldOpenLibrary(a6); geöffnet
   move.l   d0,dosbase        ; ging alles gut
   beq      abgang            ; nein, dann Abgang

   move.l   d0,a6             ; DosBase
   jsr      Output(a6)        ; Output-handle
   move.l   d0,handle         ; Ausgabe-Datei

   move.l   #start,count
loop:
   move.l   ExecBase,a6       ; Interrupts
   jsr      Disable(a6)       ; sperren
warte:
   move.l   $dff004,d7        ; um ein Flackern
   andi.l   #$0001ffff,d7     ; des Monitor zu
   lsr.l    #8,d7             ; unterbinden wird
   cmpi.l   #310,d7           ; auf Zeile 310
   bne.s    warte             ; gewartet

   move     #$0200,$dff096    ; DMA aus
   move.l   count(pc),d6      ; 
   move     #Umlauf,d7
   lea      $bfd000,a6        ; Hardwarebasis
   move.b   #$00,$e00(a6)     ; Timer A stop
   move.b   #$ff,$400(a6)     ; Low
   move.b   #$ff,$500(a6)     ; High  und speichern
   move.b   #$01,$e00(a6)     ; start


;************* Testschleife *************
;*                                      *
;*           d0-d5 und a0-a6            *
;*    stehen zur freien Verfügung       *
;* d6 durchläuft die Werte start - ende *
;*    d7 nicht benutzen, weil Zähler    *
;****************************************

testloop:
;*** hier Testbefehle einfügen ***

      mulu    d6,d0

; weitere interessante Befehle und passende Werte    
;     mulu    #640,d0         ;  0-0
;     bset    d6,d0           ;  0-20
;     lsl     d6,d0           ;  0-70
;     move.b   $bfdd00,d0

;*********************************
   dbra     d7,testloop

   lea      $bfd000,a6
   move.b   #$00,$e00(a6)     ; Timer A stop
   move     $500(a6),d7       ; High holen
   move.b   $400(a6),d7       ; Low holen
   move     #$8200,$dff096    ; DMA ein
   movem.l  d0-d5/a0-a6,-(a7) ; sichern
   move.l   ExecBase,a6       ; Interrupts
   jsr      Enable(a6)        ; erlauben

   addi     #107,d7           ; Zeit einer Leerschleife
   neg      d7                ;
   add      #2,d7             ; Korrektur ( Rundung )
   ext.l    d7
   divu     #10,d7            ; Taktzahl justieren
   lea      datas,a1          ; Puffer für die Werte
   move.l   count(pc),(a1)+   ; Zählerwert
   ext.l    d7                ; und
   move.l   d7,(a1)           ; Taktzahl
                              ; eintragen
   move.l   ExecBase,a6
   lea      formatstr(pc),a0  ; Formatstring
   lea      datas(pc),a1      ; Data-Puffer
   lea      prog(pc),a2       ; Hilfsroutine
   lea      buffer(pc),a3     ; Ausgabepuffer
   jsr      RawDoFmt(a6)      ; Werte verarbeiten
   move.l   handle(pc),d1     ; Output-handle
   move.l   #buffer,d2        ; Ausgabepuffer
   move.l   textend(pc),d3
   sub.l    #buffer,d3        ; textlänge
   move.l   dosbase(pc),a6
   jsr      Write(a6)         ; Text ausgeben
   movem.l  (a7)+,d0-d5/a0-a6 ; restaurieren

   addq.l   #1,count          ; Zähler + 1
   move.l   count(pc),d6      ;
   cmpi.l   #ende,d6          ; Zähler<=ende?
   ble      loop              ; weiter->

   move.l   dosbase(pc),a1    ; Dos-Library
   move.l   ExecBase,a6       ; wieder
   jsr      CloseLibrary(a6)  ; schließen
abgang:
   moveq    #0,d0
   rts

; *** Hilfsroutine *** wird von RawDoFmt aufgerufen
prog:
   move.b   d0,(a3)+
   clr.b    (a3)
   move.l   a3,textend
   rts


count:      dc.l  0
dosbase:    dc.l  0
handle:     dc.l  0
textend:    dc.l  0
datas:      dc.l  0
            dc.l  0
buffer:     ds.b  100

dosname:    dc.b  "dos.library",0
   even
formatstr:  dc.b  "nr: %8ld  takte= %5ld",10,0

   end
