
;fixed Values are: a5 -> IntuitionBase
;                  a4 -> DosBase
;                  d4 -> window UserPort
;                  d5 -> ExecBase
;                  d6 -> window handle
;                  d7 -> last seconds


ExecBase    = 4
OpenLib     = -552
CloseLib    = -414
OpenWorkBench = -210
OpenWindow  = -204
CloseWindow = -72
GetMsg      = -372
AvailMem    = -216
SetWindowTitles = -276
Delay       = -198
DateStamp   = -192
FindTask    = -294
SetTaskPri  = -300

;Test68020+
     movea.l ExecBase,a6   ;ExecBase nach a6
     move.l  a6,d5         ;ExecBase nach d5
     btst    #1,$128+1(a6) ;128 = AttnFlags (+1, da Byte-Zugriff)
     bne.b   run           ;Ist CPU >= 68020 vorhanden?
     moveq   #20,d0        ;Fehlercode 20 setzen
     rts                   ;und beenden

run
     movea.l #0,a1
     jsr     FindTask(a6)  ;Task-Pointer holen
     movea.l d0,a1
     moveq   #-5,d0
     jsr     SetTaskPri(a6)  ;Task-Priorität setzen

     clr.l   d0            ;Version egal
     lea     IntName,a1    ;Name der Intuition-Bibliothek
     jsr     OpenLib(a6)   ;Intuition öffnen
     movea.l d0,a5         ;IntuitionBase retten

     clr.l   d0            ;Version egal
     lea     DosName,a1    ;Name der Intuition-Bibliothek
     jsr     OpenLib(a6)   ;dos.library öffnen
     movea.l d0,a4         ;DosBase retten

WorkbenchOpen
     movea.l a5,a6         ;IntuitionBase nach a6
     jsr     OpenWorkBench(a6)  ;Hole WorkBenchScreen-Handle
     tst.l   d0
     beq     CloseDos      ;wenn Workbench Screen nicht gefunden
     movea.l d0,a1
     move.w  $0c(a1),d2    ;Screen-Breite nach d2
     subi.w  #375,d2       ;Fenster-X-Position ausrechnen
     move.w  d2,window_defs  ;Fenster-X-Position setzen

windopen
     lea     window_defs,a0  ;Zeiger auf Fenster-Definition
     jsr     OpenWindow(a6) ;Fenster öffnen
     move.l  d0,d6         ;Fenster-Handle retten

SetScreenTitle
     movea.l d0,a0         ;Fenster-Handle nach a0
     move.l  86(a0),d4     ;User-Port-Zeiger nach d4 für späteren Gebrauch
     movea.l #-1,a1        ;Window-Titel beibehalten
     lea     ScreenTitle,a2
     jsr     SetWindowTitles(a6)

     moveq   #-1,d7        ;Sekunden auf ungültig setzen

GetCurrentTime
     movea.l a4,a6         ;DosBase nach a6
     move.l  #Time,d1      ;Zeiger auf DateStamp nach d1
     jsr     DateStamp(a6) ;aktuelle Zeit holen
Ticks
     move.l  Time+8,d1     ;Ticks holen
     divu.w  #50,d1        ;Ticks in Sekunden umrechnen
     cmp.b   d7,d1         ;Ist bereits eine Sekunde vergangen?
     beq     Wait          ;wenn nicht, dann warte noch
     move.b  d1,d7         ;Sekunden merken
     swap    d1
     clr.w   d1            ;Divisions-Rest löschen
     swap    d1
     lea     Uhr+6,a0
     divu.w  #10,d1        ;Zehnerstelle berechnen
     jsr     .ziffer
     add.w   #$30,d1       ;in ASCII umwandeln
     move.b  d1,(a0)+      ;schreiben
.Minutes
     move.l  Time+4,d1     ;Minuten holen
     lea     Uhr,a0
     divu.w  #600,d1       ;Zehnerstelle der Stunden berechnen
     jsr     .ziffer
     divu.w  #60,d1        ;Einerstelle der Stunden berechnen
     jsr     .ziffer
     addq    #1,a0         ;Doppelpunkt überspringen
     divu.w  #10,d1        ;Zehnerstelle der Minuten holen
     jsr     .ziffer
     pea     AvailChipMem(pc)  ;schneller als 'jsr .ziffer' + 'jmp AvailChipMem'

.ziffer
     add.w   #$30,d1       ;in ASCII umwandeln
     move.b  d1,(a0)+      ;schreiben
     clr.w   d1            ;unteres Wort löschen
     swap    d1            ;Rest nach unten holen
     rts

AvailChipMem
     movea.l d5,a6         ;ExecBase nach a6
     moveq.l #2,d1         ;Chip-Ram
     lea     ChipValue,a2  ;Ausgabe-Speicher
     moveq   #4-1,d3       ;Anzahl der Stellen -1
     lea     Pot4,a3
     jsr     GetAvailMem
AvailFastMem
     moveq.l #4,d1         ;Fast-Ram
     lea     FastValue,a2  ;Ausgabe-Speicher
     moveq   #6-1,d3       ;Anzahl der Stellen -1
     lea     Pot6,a3
     jsr     GetAvailMem
     
SetWindowTitle
     movea.l a5,a6         ;IntuitionBase nach a6
     movea.l d6,a0         ;Fenster-Handle nach a0
     lea     windowname,a1
     movea.l #-1,a2        ;Screen-Titel beibehalten
     jsr     SetWindowTitles(a6)

Wait
     movea.l a4,a6         ;DosBase nach a6
     moveq.l #10,d1
     jsr     Delay(a6)

GetMessage
     movea.l d4,a0         ;User-Port-Zeiger nach a0
     movea.l d5,a6         ;ExecBase nach a6
     jsr     GetMsg(a6)    ;Message holen
     tst.l   d0            ;Prüfen auf Ereignis
     beq     GetCurrentTime

windclose
     movea.l a5,a6         ;IntuitionBase nach a6
     movea.l d6,a0         ;Fenster-Handle nach a0
     jsr     CloseWindow(a6)  ;Fenster schließen


CloseDos
     movea.l d5,a6
     movea.l a4,a1         ;DosBase nach a1
     jsr     CloseLib(a6)
CloseInt
     movea.l a5,a1         ;IntBase nach a1
     jsr     CloseLib(a6)
     rts
;---------------------------------------------
GetAvailMem

     jsr     AvailMem(a6)
     moveq.l #10,d1        ;für Division durch 1024 (->lsr.l #10,d0)
     lsr.l   d1,d0         ;Division durch 1024 - jetzt KByte

bin_dez  ;Unterprogramm zur Umwandlung von Binärzahlen in Dezimalzahlen
         ;a2 = Zeiger auf Ausgabespeicher
         ;a3 = Zeiger auf Potenzen
         ;d0 = Umzuwandelnde Zahl
         ;d3 = Anzahl der Stellen -1
         ;d2 = wenn null, dann Leerzeichen statt Null ausgeben

     clr.b   d2
.next
     moveq   #'0'-1,d1
.loop
     addq.b  #1,d1
     sub.l   (a3),d0
     bcc     .loop         ;ist die Zahl durch Potenz teilbar ?
     add.l   (a3)+,d0
     cmpi.b  #'0',d1       ;prüfen auf '0'
     bne     .skip1
     tst.b   d2
     bne     .skip2
     moveq   #' ',d1
     jmp     .skip2
.skip1
     moveq   #1,d2
.skip2
     move.b  d1,(a2)+      ;Ziffer ausgeben
     dbf     d3,.next      ;werden weitere Stellen benötigt ?
     rts
;---------------------------------------------
IntName
     dc.b    'intuition.library',0
 even
DosName
     dc.b    'dos.library',0
 even

Pot6 dc.l     100000
     dc.l     10000
Pot4 dc.l     1000
     dc.l     100
Pot2 dc.l     10
     dc.l     1
     

window_defs
     dc.w    10            ;X-Position
     dc.w     0            ;Y-Position
     dc.w   353            ;Breite
     dc.w    10            ;Höhe
     dc.b     1            ;Schriftfarbe
     dc.b     3            ;Hintergrundfarbe
     dc.l  $200            ;IDCMP-Flags
     dc.l    $e            ;Flags
     dc.l     0            ;Zeiger auf Gadget-Liste
     dc.l     0            ;Zeiger auf Checkmark-Image
     dc.l windowname       ;Zeiger auf Fenster-Titel
     dc.l     0            ;Zeiger auf Screen-Handle
     dc.l     0            ;Zeiger auf Bitmap
     dc.w     0            ;Mindestbreite
     dc.w     0            ;Mindesthöhe
     dc.w     0            ;maximale Breite
     dc.w     0            ;maximale Höhe
     dc.w     1            ;Screen-Typ

windowname
     dc.b     'Chip:'
ChipValue
     dc.b     'xxxx  Fast:'
FastValue
     dc.b     'xxxxxx  Time:'
Uhr
     dc.b     'xx:xx:xx',0

     dc.b     '$VER:'
ScreenTitle
     dc.b     'mclk32 1.1 (7.1.99)',0
 even
Time
     dc.l     0,0,0   ;Days,Minutes,Ticks

