*  BTPS CLOCK time and date window *
*  @1987 by Richard L. Anderson Jr.
   include  "exec/types.i"
   include  "intuition/intuition.i"
   xref  _AbsExecBase,_LVOOpenLibrary
   xref  _LVOGetMsg,_LVODateStamp,_LVODelay
   xref  _LVOOpenWindow,_LVOCloseWindow,_LVOWindowToFront,_LVOPrintIText
   move.l _AbsExecBase,a6           ;open DOS librarry
   move.l #dos_name,a1
   clr.l d0
   jsr _LVOOpenLibrary(a6)
   cmp.l    #0,d0
   beq   abort
   movea.l  d0,a5                   ;set dos pointer to a5
   movea.l  #intuitionname,a1
   move.l   #29,d0
   movea.l  _AbsExecBase,a6         ;open INTUITION library
   jsr   _LVOOpenLibrary(a6)
   cmp.l    #0,d0
   beq   abort
   movea.l  d0,a4                   ;set intuition pointer to a4
   movea.l  #demowindow,a0          ;open a window
   movea.l  a4,a6
   jsr   _LVOOpenWindow(a6)
   move.l   d0,newwindow
   beq   abort
   movea.l  newwindow,a0
   movea.l  wd_RPort(a0),a3         ;set rastport pointer to a3
   move.l   #200,d1                 ;wait 4 seconds
   movea.l  a5,a6
   jsr   _LVODelay(a6)
   bra   goloop
looper:
   move.l   #50,d1                  ;wait 1 second
   movea.l  a5,a6
   jsr   _LVODelay(a6)
goloop:                             ;get date & time
   move.l   #dtvector,d1
   movea.l  a5,a6
   jsr _LVODateStamp(a6)
   beq abort
   movea.l  d0,a1
   move.l   (a1),d4
   move.l   4(a1),d5
   move.l   8(a1),d6
   movea.l  #datetime,a2            ;convert time
   move.b   #32,(a2)+
   move.b   #32,(a2)+
   divs     #60,d5
   move.w   d5,d1
   swap     d5
   move.w   d5,d2
   ext.l    d1
   divs     #10,d1
   move.b   d1,(a2)
   add.b    #48,(a2)+
   swap     d1
   move.b   d1,(a2)
   add.b    #48,(a2)+
   move.b   #58,(a2)+
   ext.l    d2
   divs     #10,d2
   move.b   d2,(a2)
   add.b    #48,(a2)+
   swap     d2
   move.b   d2,(a2)
   add.b    #48,(a2)+
   move.b   #58,(a2)+
   divs     #50,d6
   ext.l    d6
   divs     #10,d6
   move.b   d6,(a2)
   add.b    #48,(a2)+
   swap     d6
   move.b   d6,(a2)
   add.b    #48,(a2)+
   move.b   #32,(a2)+
   move.b   #32,(a2)+
   move.b   #0,(a2)
   movea.l  a3,a0
   movea.l  #textblock,a1
   move.l   #32,d0
   move.l   #0,d1
   movea.l  a4,a6
   jsr   _LVOPrintIText(a6)
   movea.l  newwindow,a0
   movea.l  wd_UserPort(a0),a0
   move.l   _AbsExecBase,a6
   jsr   _LVOGetMsg(a6)
   cmp.l    #0,d0
   beq   noclose
   movea.l  newwindow,a0
   movea.l  a4,a6
   jsr   _LVOCloseWindow(a6)
abort:
   clr.l    d0
   rts
noclose:
   movea.l  #datetime,a2            ;check for 1,21,41 seconds
   cmpi.b   #49,9(a2)
   bne   looper
   cmpi.b   #48,8(a2)
   beq   dateloop
   cmpi.b   #50,8(a2)
   beq   dateloop
   cmpi.b   #52,8(a2)
   bne   looper
dateloop:                           ;convert to day of week
   move.l   d4,d0
   divs     #7,d0
   swap     d0
   mulu     #9,d0
   move.l   #day_of_week,a0
   adda.w   d0,a0
   move.b   #32,(a2)+
   move.l   #8,d3
dayloop:
   move.b   (a0)+,(a2)+
   dbra  d3,dayloop
   move.b   #32,(a2)+
   move.b   #0,(a2)+
   movea.l  a3,a0
   movea.l  #textblock,a1
   move.l   #32,d0
   move.l   #0,d1
   movea.l  a4,a6
   jsr   _LVOPrintIText(a6)
   move.l   #100,d1                 ;wait 2 seconds
   movea.l  a5,a6
   jsr _LVODelay(a6)
   movea.l  #datetime,a2
   move.l   d4,d0                   ;convert month & year
   divu     #365,d0
   move.w   d0,d3
   move.w   d0,d4
   swap     d0
   addq.w   #2,d3
   move.w   d3,d5
   addi.w   #1,d0
   lsr.w    #2,d3
   move.w   #0,CCR
   sub.w    d3,d0
   andi.w   #3,d5
   bne noleap
   addi.w   #1,d0
   bra leap
noleap:
   cmpi.w   #60,d0
   bmi leap
   addq.w   #1,d0
leap:
   cmpi.w   #1,d0
   bpl yearok
   move.w   #0,CCR
   addi.w   #366,d0
   subq.w   #1,d4
yearok:
   addi.w   #1978,d4
   move.w   #11,d6
   move.l   #montable,a1
   move.l   #month,a0
chkmon:
   adda.l   #3,a0                      ;convert day to month
   cmp.w    (a1)+,d0
   dblt     d6,chkmon                  ;display month
   adda.l   #22,a1
   move.w   #0,CCR
   sub.w    (a1),d0
   move.b   (a0)+,(a2)+
   move.b   (a0)+,(a2)+
   move.b   (a0)+,(a2)+
   move.b   #32,(a2)+
   ext.l    d0
   divs     #10,d0
   move.b   d0,(a2)
   add.b    #48,(a2)+
   swap     d0
   move.b   d0,(a2)
   add.b    #48,(a2)+
   move.b   #32,(a2)+
   ext.l    d4                         ;display year
   divs     #100,d4
   move.w   d4,d5
   swap     d4
   ext.l    d5
   divs     #10,d5
   move.b   d5,(a2)
   add.b    #48,(a2)+
   swap     d5
   move.b   d5,(a2)
   add.b    #48,(a2)+
   ext.l    d4
   divs     #10,d4
   move.b   d4,(a2)
   add.b    #48,(a2)+
   swap     d4
   move.b   d4,(a2)
   add.b    #48,(a2)+
   move.b   #0,(a2)+
   movea.l  a3,a0
   movea.l  #textblock,a1
   move.l   #32,d0
   move.l   #0,d1
   movea.l  a4,a6
   jsr   _LVOPrintIText(a6)
   move.l   #100,d1                    ;wait 2 seconds
   movea.l  a5,a6
   jsr _LVODelay(a6)
   movea.l  newwindow,a0
   movea.l  a4,a6
   jsr   _LVOWindowToFront(a6)
   bra   goloop
   SECTION  data,DATA
intuitionname:
   dc.b  'intuition.library',0
windowflg equ   WINDOWCLOSE!WINDOWDRAG
newflags  equ   windowflg!SIMPLE_REFRESH!BORDERLESS!NOCAREREFRESH
title dc.b ' BTPS CLOCK ',0
demowindow  dc.w  456,0,128,10          ;window description
   dc.b  3,2
   dc.l  CLOSEWINDOW,newflags,0,0,title,0,0
   dc.w  128,10,128,10,WBENCHSCREEN
textblock dc.b 3,2,RP_JAM2             ;intuitext node header
   dc.w  0,1
   dc.l  0,datetime,0
dos_name:
   dc.b 'dos.library',0
montable:
   dc.w  32,61,92,122,153,183,214,245,275,306,336,367
   dc.w  0,31,60,91,121,152,182,213,244,274,305,335
day_of_week:
   dc.b ' Sunday   Monday   Tuesday Wednesday'
   dc.b 'Thursday  Friday  Saturday '
month:
   dc.b '   JanFebMarAprMayJunJulAugSepOctNovDec'
   SECTION  mem,BSS
newwindow ds.l 1
datetime  ds.b 16
dtvector  ds.l 4
    END
