; dump clock to mousepointer

        INCLUDE "includes/MACS.ASM"
        INCLUDE "includes/FpMacs.ASM"

       INIT_AMIGA

      BSR            PRINT
      DC.B           '(C) 07.88 by RAKO',10,0
      NOP
LOOP:
      LEA            PREFSTRUCT,A0
      MOVE.L         #232,D0           ;length of default preferences
      LINKSYS        GetPrefs,intuition ; get actual preferences
      STO            D0,Length

; reset mousepointer to empty clock

      LEA            PREFSTRUCT,A0
      MOVE.W         #$F8F9,100(A0) ; set marker at x=8 / y=8
      LEA            DefClock,A1
      ADD.L          #32,A0         ; now we have the mouse pointer address
      MOVEQ          #15,D0
CopyClock:
      MOVE.W         (A1)+,(A0)+    ; copy empty clock to first plane
      CLR.W          (A0)+          ; and clear second plane
      DBRA           D0,CopyClock
; get actual time

      LEA            TimSto,A0
      MOVE.L         A0,D1
      LINKSYS        DateStamp,dos
      MOVE.L         D1,A0          ; get vector to time table
      MOVE.L         4(A0),D0       ; get minutes since midnight

; show time on clock

      MOVE.L         D0,D1
      DIVU           #60,D0         ; get hours from minutes
      AND.L          #$FFFF,D0      ; dont bother with remainder
      MOVE.L         D0,D2
      MULU           #60,D2         ; get full hours in minutes
      SUB.L          D2,D1          ; get minutes in actual hour
      CMP.W          #12,D0         ; more than 12 hours are boring
      BLT.S          GO_ON_1
      SUB.W          #12,D0
GO_ON_1:
      STO            D0,Hours
      STO            D1,Minutes
      PUSH           Hours(PC)
      FP_FLT
      PUSH           Minutes(PC)
      FP_FLT
      PUSH           #60
      FP_FLT
      FP_DIV
      FP_ADD
; H = H + M / 60
      PUSH           #FP_2PI
      PUSH           #12
      FP_FLT
      FP_DIV
; 2 Pi / 12
      FP_MUL
; * H
      FP_DUP
      FP_SIN
      PUSH           #5
; factor for Hour pointer
      FP_FLT
      FP_MUL
      FP_ROUND
; we need only integer
      FP_STO         XH
; store X - value for line
      FP_COS
      PUSH           #5
; again factor for Hour pointer
      FP_FLT
      FP_MUL
      FP_ROUND
; We need only integer
      FP_STO         YH
; store Y - value fo line

      PUSH           Minutes(PC)
      FP_FLT
      PUSH           #FP_2PI
      PUSH           #60
      FP_FLT
      FP_DIV
; 2 Pi / 60
      FP_MUL
; * M
      FP_DUP
      FP_SIN
      PUSH           #7
; factor for Minute pointer
      FP_FLT
      FP_MUL
      FP_ROUND
; we need only integer
      FP_STO         XM
; store X - value for line
      FP_COS
      PUSH           #7
; again factor for Minute pointer
      FP_FLT
      FP_MUL
      FP_ROUND
; we need only integer
      FP_STO         YM
; store Y - value for line

      MOVEQ          #0,D4          ; X1=0
      MOVEQ          #0,D5          ; Y1=0
      RCL            XH,D6
      RCL            YH,D7
      BSR            LINE

      RCL            XM,D6
      RCL            YM,D7
      BSR            LINE
; now load preferences

      LEA            PREFSTRUCT,A0
       RCL           Length,D0 ; size
       MOVE.L        #0,D1   ; flag
       LINKSYS       SetPrefs,intuition
      MOVE.L         #3000,D1     ; one minute
      LINKSYS        Delay,dos
      BRA            LOOP

Minutes:    DS.L           1
Hours:      DS.L           1
YH:         DS.L           1
YM:         DS.L           1
XH:         DS.L           1
XM:         DS.L           1
Length:     DS.L           1
TimSto:     DS.L           3
PREFSTRUCT: DS.B           256

DefClock:
      DC.W           %0000000100000000
      DC.W           %0001000100010000
      DC.W           %0000000000000000
      DC.W           %0000000000000000
      DC.W           %0100000000000100
      DC.W           %0000000000000000
      DC.W           %0000000000000000
      DC.W           %1100000100000110
      DC.W           %0000000000000000
      DC.W           %0000000000000000
      DC.W           %0100000000000100
      DC.W           %0000000000000000
      DC.W           %0000000000000000
      DC.W           %0001000100010000
      DC.W           %0000000100000000
      DC.W           %0000000000000000
Quit:
      MOVEQ          #0,D0
      EXIT_AMIGA
      RTS

; ------------------------------------------------
; Subroutines to plot a line in the desired format
; ------------------------------------------------

; draw line from X=D4, Y=D5 to X=D6, Y=D7
; range from -7 to 7
LINE:   MOVEM.L D0-D7/A0-A6,-(A7)
        ADDQ.W  #7,D4   ; convert to format 0 < X < 15
        ADDQ.W  #8,D5   ; convert to format 0 < Y < 15
        ADDQ.W  #7,D6   ; convert...
        ADDQ.W  #8,D7   ; convert...
        AND.L   #$F,D6
        AND.L   #$F,D4
        AND.L   #$F,D7
        AND.L   #$F,D5
        MOVEQ   #1,D0           ;X Increment
        MOVEQ   #1,D1           ;Y Increment
        MOVE.L  D6,D2
        SUB.L   D4,D2           ;A0=X2-X1
        BCC.S   RIGHT
        NEG.L   D2              ;A0=ABS(X2-X1)
        SUBQ.W  #2,D0           ;X Decrement
RIGHT:  MOVE.L  D2,A0
        MOVE.L  D7,D2
        SUB.L   D5,D2           ;A1=Y2-Y1
        BCC.S   DOWN
        NEG.L   D2              ;A1=ABS(Y2-Y1)
        SUBQ.W  #2,D1           ;Y Decrement
DOWN:   MOVE.L  D2,A1
        MOVE.L  A0,A2           ;Counter X
        MOVE.L  A1,A3           ;Counter Y
LINLOP:
        BSR     SETPIXEL
        MOVE.W  D6,D2
        SUB.W   D4,D2           ;X2-X
        CMP.W   #-1,D2          ;-1 ?
        BEQ.S   XEQX2
        LSR.W   #1,D2           ;1 or 0 ?
        BNE.S   NXTLIN
XEQX2:  MOVE.W  D7,D2
        SUB.W   D5,D2           ;Y2-Y
        CMP.W   #-1,D2          ;-1 ?
        BEQ.S   YEQY2
        LSR.W   #1,D2           ;1 or 0 ?
        BEQ.S   YEQY2
NXTLIN: MOVE.L  A2,D2
        SUB.L   A3,D2
        BCC.S   XINC
        ADD.W   D1,D5
        ADD.L   A0,A2
        BRA.S   LINLOP
XINC:   ADD.W   D0,D4
        ADD.L   A1,A3
        BRA.S   LINLOP
YEQY2:  MOVEM.L (A7)+,D0-D7/A0-A6
        RTS

; Set Pixel at X=D4, Y=D5 in Sprite definition

SETPIXEL:
        MOVEM.L   D4-D6/A0,-(A7)
        LEA       PREFSTRUCT,A0
        ADD.L     #34,A0         ; start address of sprite (second plane)
        ANDI.L    #15,D4         ; only X-values between 0 and 15
        ANDI.L    #15,D5         ; only Y-values between 0 and 15
        MOVEQ     #15,D6
        SUB.B     D5,D6          ; invert Y axis
        MOVE.L    D6,D5
        LSL.W     #2,D5          ; Y*4 (2 bytes per plane, skip other plane)
        MOVEQ     #15,D6
        SUB.B     D4,D6          ; invert X axis
        MOVEQ     #0,D4
        BSET      D6,D4
        OR.W      D4,0(A0,D5.W)  ; now set pixel
        MOVEM.L   (A7)+,D4-D6/A0
        RTS

      END
