' This program exported from BASIC Anywhere Machine (Version [5.2.3].[2024.09.09.00.00]) on 2026.02.22 at 15:23 (Coordinated Universal Time)
' This program by Charlie Veniot
' A rapid-fire no-fuss-no-muss programming session 

_TITLE "Clock"

' 🟠 Build "pixel maps" of digit and AM/PM characters
  DIM CharMap$( 0 TO 12 )
  FOR d% = 0 TO 9
      LET CharMap$( d% ) = GETCHR$( 48 + d% )
  NEXT d%
  CharMap$(10) = GETCHR$(ASC("A"))
  CharMap$(11) = GETCHR$(ASC("P"))
  CharMap$(12) = GETCHR$(ASC("M"))

radius% = 420
SCREEN _NEWIMAGE( radius% * 2 + 1, radius% * 2 + 1, 17 )

  â–¶StartEndlessLoop:

    LET h% = VAL( LEFT$( TIME$, 2 ) )
    GOSUB PutAmPm
    LET h% = IFF( h% = 0, 12, IFF( h% > 12, h% - 12, h% ) )
    
    FOR n% = 1 TO 12
      LET c% = 9
      IF n% = h% THEN
         LET c% = 31
      ELSEIF ABS( n% - h% ) > 1 AND NOT ABS( n% - h% ) > 10 THEN
         IF ABS( n% - h% ) < 4 OR ABS( n% - h% ) > 8 THEN c% = 1 ELSE c% = 8
      END IF
      COLOR c%
      PRESET ( radius% + 1, radius% + 1 )
      DRAW "BTA" + ( 360 - n% * 30 ) + "U320"
      CIRCLE( POINT(0), POINT(1) ), 70, , , , ,T
      CIRCLE( POINT(0), POINT(1) ), 69, , , , ,T
      IF n% = h% THEN CIRCLE( POINT(0), POINT(1) ), 72, 63, , , ,T : CIRCLE( POINT(0), POINT(1) ), 71, 63, , , ,T
      GOSUB PutHourDigits
      IF n% = h% THEN PRESET ( radius% + 1, radius% + 1 ) : DRAW "TA" + ( 360 - n% * 30 ) + "BU250 R8 D250 L16 U250 R8 BD15" : PAINT( POINT(0), POINT(1) ),c%,c%
    NEXT d%
    CIRCLE( radius% + 1, radius%+ 1 ), 25, 31, , , ,F

    LET n% = MID$( TIME$, 4, 2 )
    LET c% = 55
    COLOR c%
    PRESET( radius% + 1, radius% + 1 )
    DRAW "TA" + ( 360 - n% * 6 ) + "BU229 R6 D229 L12 U229 R6 BD15" : PAINT( POINT(0), POINT(1) ),c%,c%
    PRESET( radius% + 1, radius% + 1 )
    DRAW "BTA" + ( 360 - n% * 6 ) + "U210"
    GOSUB MmSsHand
    CIRCLE( radius% + 1, radius% + 1 ), 15, c%, , , ,F

    LET n% = RIGHT$( TIME$, 2 )
    LET c% = 47
    COLOR c%
    PRESET( radius% + 1, radius% + 1 )
    DRAW "TA" + ( 360 - n% * 6 ) + "BU95 BD90 BU90 R4 D90 L8 U90 R4 BD10" : PAINT( POINT(0), POINT(1) ),c%,c%
    PRESET( radius% + 1, radius% + 1 )
    DRAW "BTA" + ( 360 - n% * 6 ) + "U125"
    GOSUB MmSsHand
    CIRCLE( radius% + 1, radius% + 1 ), 8, c%, , , ,F

    SLEEP 0.05
    CLS
GOTO â–¶StartEndlessLoop

PutDigit:
   FOR x% = 1 TO 8
       FOR y% = 0 TO 7
           IF MID$( CharMap$( d% ), x% + y% * 8  , 1 ) = "X" THEN
              CIRCLE ( centerX% - adjX% + x% * psize%, centerY% - adjY% + y% * psize% ), (psize% - 1), , , ,0.6
              CIRCLE ( centerX% - adjX% + x% * psize%, centerY% - adjY% + y% * psize% ), (psize% - 1), , , ,0.5,F
           END IF
       NEXT y%
   NEXT y%
RETURN

PutHourDigits:
   LET centerX% = POINT(0), centerY% = POINT(1)
   LET psize% = 8
   LET adjY% = 21 + psize%
   LET tadjX% = 28 + psize%
   IF BETWEEN( n%, 1, 9 ) THEN
      LET adjX% = tadjX% 
      LET d% = n%
      GOSUB PutDigit
   ELSE
      LET adjX% = tadjX% + 30
      LET d% = n% / 10
      GOSUB PutDigit
      LET adjX% = tadjX% - 30
      LET d% = n% - 10
      GOSUB PutDigit
   END IF
RETURN

PutOtherDigits:
   centerX% = POINT(0) : centerY% = POINT(1)
   psize% = 4
   adjY% = 12 + psize%
   tadjX% = 14 + psize%
   IF BETWEEN( n%, 0, 9 ) THEN
      adjX% = tadjX% 
      d% = n%
      GOSUB PutDigit
   ELSE
      adjX% = tadjX% + 14
      d% = n% / 10
      GOSUB PutDigit
      adjX% = tadjX% - 14
      d% = n% MOD 10
      GOSUB PutDigit
   END IF
RETURN

PutAmPm:
       COLOR 59
       LET psize% = 5
       LET adjY% = 0
       LET adjX% = 0
       LET centerY% = 20
    IF h% < 12 THEN
     ' AM
       LET centerX% = 20
       LET d% = 10
       GOSUB PutDigit
       LET centerX% = centerX% + 40
       LET d% = 12
       GOSUB PutDigit
       LINE ( 0, 0 ) TO ( 130, 80 ), ,B
    ELSE
     ' PM
       LET centerX% = 730
       LET d% = 11
       GOSUB PutDigit
       LET centerX% = centerX% + 40
       LET d% = 12
       GOSUB PutDigit
       LINE ( XMAX - 130, 0 ) TO ( XMAX, 80 ), ,B
    END IF
RETURN

MmSsHand:
    CIRCLE (POINT(0), POINT(1)),40,2, , , ,F    
    CIRCLE (POINT(0),POINT(1)),40,0, , , ,F
    CIRCLE (POINT(0), POINT(1)),40, , , , ,t
    CIRCLE (POINT(0), POINT(1)),39, , , , ,t
    GOSUB PutOtherDigits
RETURN