; CPU_TIME.INC
;******************************************************************************
;* Zeitmessmodul fr TLCS 90                                                  *
;*                                                                            *
;* Originale fr den TLCS 900 von Oli(ver Sellke)                             *
;* Implementierung TLCS 90 von Alfred Arnold, Dezember 1993                   *
;*                                                                            *
;*  Routine     Funktion                Eingabe Ausgabe  Stack    L„nge       *
;*                                                                            *
;* InitTimer    Timer initialisieren     ----    ----    0 Byte   6 Byte      *
;* StartTimer   Timer starten            ----    ----    0 Byte   7 Byte      *
;* StopTime     Timer stoppen & Ausgabe  ----    ----    6 Byte 117 Byte *)   *
;*                                                                            *
;*      *) bei hoher Aufl”sung                                                *
;*                                                                            *
;* - Die Routinen benutzen Timer 4, dieser darf nicht von der Anwendung       *
;*   benutzt werden!!                                                         *
;* - Die Aufl”sung kann ber das Symbol BigTime umgeschaltet werden:          *
;*                                                                            *
;*       BigTime       Aufl”sung    Maximalzeit                               *
;*       definiert      0,8 us       52,428 ms                                *
;*       undefiniert   12,8 us      838,848 ms                                *
;*                                                                            *
;* - Die Datei MON.INC wird fr die Einsprnge des TDBTMP90-Monitors ben”tigt.*
;* - MACROS.INC muá vorher eingebunden werden                                 *
;*                                                                            *
;******************************************************************************

                section CPU_Time

;------------------------------------------------------------------------------
; Monitoreinsprungadressen laden

                include "mon.inc"

;------------------------------------------------------------------------------
; Timer vorinitialisieren

                proc    InitTimer
                ifdef   BigTime
                 ld      (T4MOD),00100010b ; nur Software-Capture, Phi16
                elseif
                 ld      (T4MOD),00100001b ; nur Software-Capture, Phi1
                endif
                set     5,(TRUN)        ; Vorteiler starten
                res     4,(TRUN)        ; Timer steht noch
                ret
                endp

;------------------------------------------------------------------------------
; Timer starten

                proc    StartTimer
                set     2,(T4MOD)       ; Timer l”schen
                res     2,(T4MOD)
                set     4,(TRUN)        ; Timer starten
                ret
                endp

;------------------------------------------------------------------------------
; Timer stoppen & Wert auf Konsole ausgeben

                subproc Div24

                ld      b,16            ; A-HL : B = HL und A
DivLoop:        sll     l               ; Divident hochschieben
                rl      h
                rla
                srl     h               ; fr nachher
                rr      l
                sub     a,c             ; paát Divisor hinein ?
                jr      nc,DivOK
                add     a,c             ; nein, zurcknehmen
                scf                     ; ins Ergebnis 0 einschieben
DivOK:          ccf                     ; neues Ergebnisbit
                rl      l               ; Ergebnis in HL einschieben
                rl      h
                djnz    DivLoop
                ret

                endp


                proc    StopTimer

                push    af              ; Register retten
                push    hl
                push    de
                push    bc

                res     5,(T4MOD)       ; Wert im CAP1 latchen
                res     4,(TRUN)        ; Timer wieder anhalten
                ld      hl,(CAP1L)      ; Wert auslesen

                ifdef   BigTime
                 ld     a,h             ; groáe Periode: x128...
                 ld     h,l
                 ld     l,0
                 srla
                 rr     h
                 rr     l
                 ld     c,100           ; ...Teilen durch 100
                elseif
                 ld     a,0             ; kleine Periode: x8...
                 rept   3
                  sll   l
                  rl    h
                  rla
                 endm
                 ld     c,10            ; ...Teilen durch 10
                endif
                call    Div24           ; Division durchfhren
                ifdef   BigTime         ; Kommatrennung fr groáe Periode
                 ld     a,0
                 call   Div24
                 ld     d,a             ; Rest merken
                endif
                ld      e,0             ; Zeichenz„hler nullen
                ld      c,10            ; Teilerfaktor konstant
InLoop:         ld      a,0             ; Erweiterung auf 24 Bit
                call    Div24           ; einmal teilen
                push    af              ; Zeichen auf LIFO merken
                inc     e               ; ein Zeichen mehr
                or      hl,hl           ; noch etwas brig ?
                jr      nz,InLoop
                ld      a,5             ; Leerzeichen fr Ausrichtung
                sub     a,e             ; Zahl berechnen
                jr      z,OutErg        ; Nullschleife abfangen
                ld      b,a             ; ansonsten passende Zahl Leerzeichen
BlankLoop:      call    BLAUS           ; voranstellen
                djnz    BlankLoop
OutErg:         ld      b,e             ; jetzt die Zeichen ausgeben
OutLoop:        pop     af
                add     a,'0'
                call    CONOUT
                djnz    OutLoop
                ifdef   BigTime         ; bei groáer Aufl”sung Nachkommastellen
                 ld     a,'.'
                 call   CONOUT
                 ld     l,d             ; Zehner/Einerzerlegung
                 ld     h,0
                 div    hl,c
                 add    hl,'00'
                 ld     a,l
                 call   CONOUT
                 ld     a,h
                 call   CONOUT
                 call   BLAUS
                 ld     a,'m'
                elseif
                 ld     a,' '
                 call   CONOUT
                 ld     a,'u'
                endif
                call    CONOUT          ; Ausgabe Einheit
                ld      a,'s'
                call    CONOUT

                pop     bc              ; Register zurck
                pop     de
                pop     hl
                pop     af

                ret
                endp

;------------------------------------------------------------------------------
; gemeinsames Ende

                endsection
