It is easy to modify for different graphics terminals. you can even make a text version.
This is setup to work with the FABGL ANSI Terminal. You need a 4:3 monitor otherwise the clock will appear a little squished.
It will work under MBASIC or you can compile it with BASCOM and it will work smoother.
You can add anything to it, even set an alarm if you want and have it play a song.
I had problems getting things to work with BASCOM as far as checking the seconds 7th bit flag to see if the RTC was ready
so i fudged it with a for/next loop.
in assembler I'm sure it would work correctly but something was preventing it from working when compiling.
i tried to make the program as easy to follow as possible.
with the 3 programs i posted you will have a nice base of utilities for telling time.
CLOCK.BAS
-------------------
10 ' Make a Analog Clock 7/7/2024 FABGL ANSI TERMINAL By John Galt
15 ' SETUP THE GRAPHICS FUNCTIONS FOR THE ANSI TERMINAL
20 DEF FNPEN$(R%, G%, B%) = CHR$(27)+"_GPEN"+STR$(R%)+";"+STR$(G%)+";"+STR$(B%)+"$"
30 DEF FNBRUSH$(R%, G%, B%) = CHR$(27)+"_GBRUSH"+STR$(R%)+";"+STR$(G%)+";"+STR$(B%)+"$"
40 DEF FNPIXEL$(X%, Y%) = CHR$(27)+"_GPIXEL"+STR$(X%)+";"+STR$(Y%)+"$"
50 DEF FNDRAWL$(X1%,Y1%,X2%,Y2%)=CHR$(27)+"_GLINE"+STR$(X1%)+";"+STR$(Y1%)+";"+STR$(X2%)+";"+STR$(Y2%)+"$"
60 DEF FNRECT$(X1%, Y1%, X2%, Y2%) = CHR$(27)+"_GRECT"+STR$(X1%)+";"+STR$(Y1%)+";"+STR$(X2%)+";"+STR$(Y2%)+"$"
70 DEF FNFILLRECT$(X1%, Y1%, X2%, Y2%) = CHR$(27)+"_GFILLRECT"+STR$(X1%)+";"+STR$(Y1%)+";"+STR$(X2%)+";"+STR$(Y2%)+"$"
80 DEF FNELLIPSE$(X%, Y%, W%, H%) = CHR$(27)+"_GELLIPSE"+STR$(X%)+";"+STR$(Y%)+";"+STR$(W%)+";"+STR$(H%)+"$"
90 DEF FNFILLELLIPSE$(X%, Y%, W%, H%) = CHR$(27)+"_GFILLELLIPSE"+STR$(X%)+";"+STR$(Y%)+";"+STR$(W%)+";"+STR$(H%)+"$"
110 DEF FNPATH$(POINTS$) = CHR$(27)+"_GPATH"+POINTS$+"$"
120 DEF FNFILLPATH$(POINTS$) = CHR$(27)+"_GFILLPATH"+POINTS$+"$"
130 DEF FNSCROLL$(X%, Y%) = CHR$(27)+"_GSCROLL"+STR$(X%)+";"+STR$(Y%)+"$"
140 DEF FNCLR$ = CHR$(27)+"_GCLEAR$"
150 DEF FNCURSORON$ = CHR$(27)+"_E1$"
160 DEF FNCURSOROFF$ = CHR$(27)+"_E0$"
170 DEF FNCLRTERM$ = CHR$(27)+"_B$"
175 HOME$=CHR$(27)+"[H"
176 CLS$=CHR$(27)+"[2J"
180 PRINT CLS$;FNCURSOROFF$;FNCLR$;
190 O=0:PIE=3.141592:PM=0
195 ' DRAW THE CLOCK FACE WITH BORDER AND TICKS.
210 X%=256
220 Y%=192
230 W%=170
240 H%=170
250 PRINT FNPEN$(255,255,255);HOME$;
260 PRINT FNELLIPSE$(X%, Y%, W%, H%);HOME$;
310 X%=256
320 Y%=192
330 W%=175
340 H%=175
350 PRINT FNPEN$(255,255,255);HOME$;
360 PRINT FNELLIPSE$(X%, Y%, W%, H%);HOME$;
400 FOR i = 0 TO 60
410 x = COS(i * pie / 30) * 85
420 y = SIN(i * pie / 30) * 85
430 ass = i MOD 5 = 0
440 x1 = x * (.95 + ass * .1)
450 y1 = y * (.95 + ass * .1)
460 'LINE (x + 160, y + 100)-(x1 + 160, y1 + 100)
470 X1%=x + 256
480 Y1%=y + 192
490 X2%=x1 + 256
500 Y2%=y1 + 192
510 PRINT FNPEN$(255,255,255);HOME$;
520 PRINT FNDRAWL$(X1%, Y1%, X2%, Y2%);HOME$;
530 NEXT
550 ' MAIN LOOP START
600 WHILE INKEY$=""
620 GOSUB 7000 ' READ TIME
775 ' DRAW THE SECONDS HAND
780 IF (O <> S) THEN GOTO 5000
790 IF (O=S) THEN GOTO 6000
800 X = COS(r) * 70
810 Y = SIN(r) * 70
830 X1%=256
840 Y1%=192
850 X2%=X+256
860 Y2%=Y+192
866 PRINT FNPEN$(0,0,0);HOME$;FNDRAWL$(PREVSECX1%, PREVSECY1%, PREVSECX2%, PREVSECY2%);HOME$; 'ERASE
880 PRINT FNPEN$(255,0,0);HOME$;FNDRAWL$(X1%, Y1%, X2%, Y2%);HOME$; 'REDRAW
882 PREVSECX1%=X1%
883 PREVSECY1%=Y1%
884 PREVSECX2%=X2%
885 PREVSECY2%=Y2%
886'DRAW THE MINUTES HAND
890 x = COS((M * 2 + S / 30 - 30) * pie / 60) * 60
900 y = SIN((M * 2 + S / 30 - 30) * pie / 60) * 60
920 X1%=256
930 Y1%=192
940 X2%=X+256
950 Y2%=Y+192
969 PRINT FNPEN$(0,0,0);HOME$;FNDRAWL$(PREVMINX1%, PREVMINY1%, PREVMINX2%, PREVMINY2%);HOME$; 'ERASE
970 PRINT FNPEN$(255,255,255);HOME$;FNDRAWL$(X1%, Y1%, X2%, Y2%);HOME$; 'REDRAW
976 PREVMINX1%=X1%
977 PREVMINY1%=Y1%
978 PREVMINX2%=X2%
979 PREVMINY2%=Y2%
980 ' DRAW THE HOURS HAND
982 x = COS((H * 10 + M * 4 / 30 - 30) * pie / 60) * 40
990 y = SIN((H * 10 + M * 4 / 30 - 30) * pie / 60) * 40
1010 X1%=256
1020 Y1%=192
1030 X2%=X+256
1040 Y2%=Y+192
1055 PRINT FNPEN$(0,0,0);HOME$;FNDRAWL$(PREVHORX1%, PREVHORY1%, PREVHORX2%, PREVHORY2%);HOME$; 'ERASE
1060 PRINT FNPEN$(255,255,255);HOME$;FNDRAWL$(X1%, Y1%, X2%, Y2%);HOME$; 'REDRAW
1071 PREVHORX1%=X1%
1072 PREVHORY1%=Y1%
1073 PREVHORX2%=X2%
1074 PREVHORY2%=Y2%
1080 ' REDRAW THE CENTER HUB MOVE THIS TO AFTER THE NEW HOURS, MINUTES, SECONDS IS REDRAWN
1100 X%=256
1200 Y%=192
1210 W%=5
1220 H%=5
1240 PRINT FNPEN$(255,255,255);HOME$;FNELLIPSE$(X%, Y%, W%, H%);HOME$; 'REDRAW
1270 WEND
1280 PRINT FNCLR$;FNCLRTERM$;FNCURSORON$;HOME$;
1300 END
5000 'ADJUST THE ARC OF THE SECONDS HAND TICK AND MINUTES AND HOURS
5010 O=S
5100 R=(S-15)*PIE/30
5150 DD=1
5200 GOTO 800
6000 R=R+.01
6050 DD=0
6100 GOTO 800
7000 ' READ THE TIME FUNCTION
7001 ' READ SECONDS
7010 OUT 96,129 ' DELAY REQUIRED TO KEEP READ FROM FLIPPING OUT CHECKING THE 7TH BIT DID NOT WORK RIGHT
7020 FOR DELAY=O TO 1:NEXT DELAY:D=INP(97)
7030 D=INT(D/16)*10+(D AND 15)
7040 S=D
7050 'READ MINUTES
7060 OUT 96,131 ' DELAY REQUIRED TO KEEP READ FROM FLIPPING OUT CHECKING THE 7TH BIT DID NOT WORK RIGHT
7070 FOR DELAY=O TO 1:NEXT DELAY:D=INP(97)
7080 D=INT(D/16)*10+(D AND 15)
7090 M=D
7100 'READ HOURS
7110 OUT 96,133 ' DELAY REQUIRED TO KEEP READ FROM FLIPPING OUT CHECKING THE 7TH BIT DID NOT WORK RIGHT
7120 FOR DELAY=O TO 1:NEXT DELAY:D=INP(97)
7130 D=INT(D/16)*10+(D AND 15)
7140 H=D
7150 IF (H>12) THEN H=H-12:PM=1
7160 IF (H=12) THEN PM=1
7170 IF (H=0) THEN H=12
7171 ' READ SECONDS AGAIN ROLL OVER CHECK
7172 OUT 96,129 ' DELAY REQUIRED TO KEEP READ FROM FLIPPING OUT
7173 FOR DELAY=O TO 1:NEXT DELAY:D=INP(97)
7174 D=INT(D/16)*10+(D AND 15)
7175 IF D<S THEN GOTO 7000
7180 RETURN