*      MCLOCK 
*   
*          copyright by Roger Fischlin
*   Dieses Programm ist Public-Domain-Soft!
*   Assembler : Devpac Assembler

_AbsExecBase equ 4

**** exec *****

_LVOForbid       equ -$84
_LVOPermit       equ -$8a
_LVOAvailMem     equ -$d8
_LVOGetMsg       equ -$174
_LVOReplyMsg     equ -$17a
_LVOWaitPort     equ -$180
_LVOCloseLibrary equ -$19e
_LVOOpenLibrary  equ -$228

**** intuition ****

_LVOCloseWindow equ -$48
_LVOOpenWindow  equ -$cc

**** graphics ******

_LVOText      equ -$3c
_LVOSetFont   equ -$42
_LVOOpenFont  equ -$48
_LVOCloseFont equ -$4e
_LVOMove      equ -$f0
_LVODraw      equ -$f6
_LVOSetAPen   equ -$156

***** dos *****

_LVODateStamp equ -$c0
_LVODelay     equ -$c6

CALLEXEC macro
         movea.l _AbsExecBase,a6
         jsr     _LVO\1(a6)
         endm

INTNAME  macro
         dc.b 'intuition.library',0
         even
         endm

CALLINT  macro
         movea.l _IntuitionBase(pc),a6
         jsr     _LVO\1(a6)
         endm

GRAFNAME macro
         dc.b 'graphics.library',0
         even
         endm

CALLGRAF macro
         movea.l _GfxBase(pc),a6
         jsr     _LVO\1(a6)
         endm

DOSNAME  macro
         dc.b 'dos.library',0
         even
         endm

CALLDOS  macro
         movea.l _DOSBase(pc),a6
         jsr     _LVO\1(a6)
         endm

PRINT   macro      ; Macro zur Ausgabe eines Textes
   moveq    #\1,d0
   moveq    #\2,d1
   movea.l   RPort(pc),a1
   CALLGRAF Move
   moveq    #\3,d0
   movea.l   RPort(pc),a1
   jsr      _LVOSetAPen(a6)
   lea      \4(pc),a0   
   moveq    #\5,d0
   move.l   RPort(pc),a1
   jsr      _LVOText(a6)
   endm

SMART_REFRESH    equ 0
WBENCHSCREEN     equ 1
WINDOWSIZING     equ 1
MEMF_PUBLIC      equ 1
TOPAZ_EIGHTY     equ 2
WINDOWDRAG       equ 2
MEMF_CHIP        equ 2
WINDOWDEPTH      equ 4
WINDOWCLOSE      equ 8
FPF_ROMFONT      equ 8
CUSTOMSCREEN     equ $f
wd_RPort         equ $32
wd_UserPort      equ $56
pr_MsgPort       equ $5c
FS_NORMAL        equ $80
pr_CLI           equ $ac
ThisTask         equ $114
CLOSEWINDOW      equ $200
ACTIVATE         equ $1000


_main      moveq   #0,d0
           movea.l _AbsExecBase,a6
           movea.l ThisTask(a6),a0
           tst.l   pr_CLI(a0)
           bne.s   isCLI

           lea     pr_MsgPort(a0),a0 for WB get WB Message
           jsr     _LVOWaitPort(a6)
           jsr     _LVOGetMsg(a6)
isCLI      move.l  d0,-(a7)

   lea   dosname(pc),a1    ; Öffnen der DOS-Library
   moveq   #0,d0
   jsr     _LVOOpenLibrary(a6)
   move.l   d0,_DOSBase
   beq      abbruch
   lea   intname(pc),a1     ; Öffnen der INTUITION-Library                 
   moveq   #0,d0      
   jsr     _LVOOpenLibrary(a6)
   move.l   d0,_IntuitionBase
   beq      closedos
   lea   grafname(pc),a1     ; Öffnen der GRAPHICS-Library
   moveq   #0,d0
   jsr     _LVOOpenLibrary(a6)
   move.l   d0,_GfxBase
   beq      closeint  
   lea   windowdef(pc),a0      ; Window öffnen 
   CALLINT   OpenWindow   
   move.l   d0,Window
   beq      closegraf
   lea      FONT(pc),a0            ; Topaz-80 (ROM-Zeichensatz)
   CALLGRAF   OpenFont           ; öffnen und benutzen
   move.l   d0,Font
   beq      closewindow
   movea.l   d0,a0
   movea.l   Window(pc),a1
   movea.l   wd_RPort(a1),a1
   move.l    a1,RPort
   CALLGRAF   SetFont

Schleife   PRINT   5,18,3,Text1,4     ; Texte (RAM,Chip, etc.) ausgeben
   PRINT   5,28,3,Text2,4
   PRINT   5,39,3,Text3,4
   PRINT   5,49,3,Text4,4
   moveq   #MEMF_PUBLIC,d1     ; Freies RAM feststellen 
   CALLEXEC    AvailMem      
   move.l     d0,d2
   lea   buffer(pc),a0
   bsr   makeASCII            ;Zahl in ASCII-Code umwandeln
   PRINT   45,18,1,buffer,8
   moveq   #MEMF_CHIP,d1       ; dasselbe wie oben, nur mit Chip-RAM 
   CALLEXEC    AvailMem      
   move.l     d0,d2
   lea   buffer(pc),a0   
   bsr   makeASCII
   PRINT   45,28,1,buffer,8
   move.l   #Zeit,d1         ; Zeit holen
   CALLDOS   DateStamp
   move.l   Zeit+8(pc),d0         ; 1/50 sec in dieser Minute in Sekunden 
   divu   #50,d0               ; umwandeln
   and.l   #$ff,d0
   lea.l   Time+6(pc),a0
   bsr   Convert          ; in ASCII umwandeln
   move.l   Zeit+4(pc),d0
   divu   #60,d0                ; Minuten in Stunden umwandeln 
   and.l   #$ff,d0
   lea     Time(pc),a0
   bsr     Convert           ;und in ASCII umwandeln 
   move.l  Zeit+4(pc),d0           ; Minuten in dieser Stunde holen
   divu   #60,d0
   lsr.l   #8,d0           ; Teilerrest nehmen
   lsr.l   #8,d0   
   and.l   #$ff,d0
   lea     Time+3(pc),a0               ; und in ASCII
   bsr     Convert
   move.l  Zeit(pc),d0                 ;vergangene Tage set 1.1.78
   lea     Jahre(pc),a0
   move.l   #77,d1            ; Jahreszahl feststellen
label1   addq   #1,d1
   sub.w   (a0)+,d0
   bpl.s   label1
   add.w   -(a0),d0
   move.l   d0,d5
   move.l   (a0),d6
   andi.l   #$ff,d1
   cmpi.w   #99,d1                  ; nur die letzten zwei Ziffern
   bls.s   label2
   subi.w   #100,d1
label2   move.l   d1,d0
   andi.l   #$ff,d0
   lea     Date+6(pc),a0
   bsr     Convert              ; in ASCII
   btst    #0,d6
   beq.s   label3
   lea     KeinSJahr(pc),a0              ; Schaltjahr (gerade Zahl der Tage) ?
   bra.s   label4
label3   lea   Schaltjahr(pc),a0
label4   moveq  #-1,d1               ; Monat feststellen
label5   addq   #1,d1
   sub.w   (a0)+,d5
   bpl.s   label5
   add.w   -(a0),d5
   move.l   d1,d0
   and.l   #$ff,d0
   lea     Date+3(pc),a0
   bsr     Convert      ; in ASCII
   move.l  d5,d0
   andi.l   #$ff,d0
   lea     Date+0(pc),a0
   bsr     Convert      ; Tag des Monats in ASCII
   PRINT   45,39,1,Time,8      ; Texte ausgeben
   PRINT   45,49,1,Date,8
   moveq    #0,d0      ; Linie ziehen   
   moveq    #31,d1   
   move.l   RPort(pc),a1
   CALLGRAF   Move      
   moveq   #1,d0   
   move.l   RPort(pc),a1
   jsr    _LVOSetAPen(a6)
   move    #135,d0
   moveq   #31,d1   
   move.l   RPort(pc),a1
   jsr      _LVODraw(a6)

   move.l   Window(pc),a0      ; CloseWindow ?
   move.l   wd_UserPort(a0),a0
   CALLEXEC    GetMsg
   tst.l   d0   
   bne.s   ende

   moveq     #40,d1      ; anderen  Task Zeit lassen
   CALLDOS   Delay   
   bra   Schleife   

ende   move.l   d0,a1      
   CALLEXEC    ReplyMsg
   move.l   Font(pc),a1      ; alles schließen
   CALLGRAF   CloseFont
closewindow   move.l   Window(pc),a0      
   CALLINT   CloseWindow
closegraf   move.l   _GfxBase(pc),a1      
   CALLEXEC    CloseLibrary
closeint   move.l   _IntuitionBase(pc),a1
   CALLEXEC    CloseLibrary
closedos   move.l   _DOSBase(pc),a1
   CALLEXEC    CloseLibrary
abbruch move.l  _AbsExecBase,a6
      move.l  (a7)+,d4
      beq.s   exit
      jsr     _LVOForbid(a6)    reply to WB
      movea.l d4,a1
      jsr     _LVOReplyMsg(a6)
      jsr     _LVOPermit(a6)

exit moveq   #0,d0
   rts            

makeASCII   moveq   #7,d0      ; Zahl (d2) in ASCII umwandeln
   lea   buffer(pc),a0
   lea   Potenzen(pc),a1
next   move   #"0",d1
labela   addq   #1,d1   
   sub.l   (a1),d2   
   bcc.s   labela   
   subq    #1,d1   
   add.l   (a1),d2   
   move.b   d1,(a0)+   
   tst.l   (a1)+
   dbra    d0,next
   moveq   #6,d0   
   lea     buffer(pc),a0
clear cmp.b   #'0',(a0)
   bne.s   fini
   move.b   #' ',(a0)+
   dbra     d0,clear   
fini   rts

RPort   ds.l 1
Potenzen   dc.l   10000000
   dc.l   1000000
   dc.l   100000
   dc.l   10000
   dc.l   1000
   dc.l   100
   dc.l   10
   dc.l   1
   dc.l   0

W_Gadgets equ   WINDOWDRAG!WINDOWDEPTH!WINDOWCLOSE!WINDOWSIZING
W_Extras  equ   SMART_REFRESH!ACTIVATE
Text1   dc.b   "RAM "
   even
Text2   dc.b   "Chip"
   even
Text3   dc.b   "Time"
   even
Text4   dc.b   "Date"
   even
Time   dc.b   "xx:xx:xx"
   even
Date   dc.b   "xx.xx.xx"
   even

windowdef      dc.w   500,140
   dc.w   135,53
   dc.b   -1,-1   
   dc.l   CLOSEWINDOW   
           dc.l       W_Gadgets!W_Extras  
   dc.l   0   
   dc.l   0   
   dc.l   0
   dc.l   0   
   dc.l   0   
   dc.w   135,21   
   dc.w       135,53
   dc.w   WBENCHSCREEN   

intname   INTNAME   
grafname   GRAFNAME
dosname   DOSNAME   
buffer   ds.b   10
Zeit   ds.l   3
_IntuitionBase   ds.l   1   
_GfxBase   ds.l   1
_DOSBase   ds.l   1
Window   ds.l   1
TEXT   ds.b   2
Font   dc.l   0
FONT   dc.l   fontname
   dc.w   TOPAZ_EIGHTY
   dc.b   FS_NORMAL
   dc.b   FPF_ROMFONT
   even 
fontname   dc.b   "topaz.font",0
   even
Convert   move.l   d0,d4    ; Zahl (d0) in ASCII (2 Zeichen)
   divu   #10,d0
   move.l   d0,d2
   mulu   #10,d2
   add.w   #"0",d0
   move.b   d0,(a0)+
   sub.w   d2,d4
   add.w   #"0",d4
   move.b   d4,(a0)+
   rts
Jahre   dc.w   365,365      ; Anzahl der Tage im Jahr (seit 1978)
   dc.w   366,365,365,365,365
   dc.w   366,365,365,365,365
   dc.w   366,365,365,365,365
   dc.w   366,365,365,365,365
   dc.w   366,365,365,365,365
   dc.w   365,365,365,365,365
   dc.w   366,365,365,365,365
   dc.w   366,365,365,365,365
   dc.w   366,365,365,365,365
   dc.w   366,365,365,365,365
   dc.w   366,365,365,365,365
   dc.w   366,365,365,365,365
   dc.w   366,365,365,365,365
   dc.w   366,365,365,365,365
   dc.w   366,365,365,365,365
   dc.w   366,365,365,365,365
KeinSJahr   dc.w   31,28,31,30,31,30,31,31,30,31,30,31   ; Anzahl der Tage im Jahr
Schaltjahr   dc.w   31,29,31,30,31,30,31,31,30,31,30,31   ;    "    "    "   " Schaltjahr 
   end


   
   
   

