User Tools

Site Tools


mmbasic_original:analog_clock

Analog Clock

clock_bitmaps.zip

This module is part of the original MMBasic library. It is reproduced here with kind permission of Hugh Buckle and Geoff Graham. Be aware it may reference functionality which has changed or is deprecated in the latest versions of MMBasic.

Original code by Eugene Villar (for the clock) and Ray Thomas (for the day of week).

Modified for Maximite BASIC v2.4 by Bob Devries, June, 2011

http://geoffg.net/maximite.html
http://www.thebackshed.com/forum/forum_topics.asp?FID=16

Regards, Bob Devries Dalby, QLD, Australia

Original code:

   ' ANALOG CLOCK
   ' Case Study Problem B3: Program 1
   ' ---------------------------------------------------------------------------
   ' written by Eugene Villar http://seavsoftwares.codedgraphic.com/home_page.html
   ' ~ This program draws a very simple analog clock.
   ' modified for Maximite BASIC by Bob Devries
   '*** modified by Hugh Buckle in Dec 2011 to request and verify current date and time
   Timer = Val(Left$(Time$,2)) * 3600 + Val(Mid$(Time$,4,2)) * 60 + Val(Right$(Time$,2))
   '*** Get current date and time
   '*** days in each month used in the date/time request subroutine
   Data 31,29,31,30,31,30,31,31,30,31,30,31
   GoSub L004
   ' Clock border
   Cls
   Line(0,0)-(480,432),1,BF:Line(11,12)-(469,421),0,BF
   GoSub L001
   Locate 20,20:Print"MAXIMITE"
   Locate 20,30:Print"MMBASIC v";:GoSub L002 :Print version$;
   start=(MM.HRes/2)-((prtlen*6)/2):stop=(MM.HRes/2)+((prtlen*6)/2)-1
   For xx=start To stop:For yy=1 To 11: Pixel(xx,yy)=Not(Pixel(xx,yy)): Next yy,xx
   Circle(240,216), 200, 1
   Circle(240,216),199,1
   For i=0 To 59
   rads=i*3.14159265/30
   If i Mod 5 <> 0 Then
   x1=Sin(rads)*195+240
   y1=-Cos(rads)*195+216
   Else
   x1=Sin(rads)*190+240
   y1=-Cos(rads)*190+216
   EndIf
   x2=Sin(rads)*200+240
   y2=-Cos(rads)*200+216
   Line(x1,y1)-(x2,y2),1
   Next i
   ' Previous hand positions
   PHrX = 240: PHrY = 216
   PMnX = 240: PMnY = 216
   PScX = 240: PScY = 216
   ' Clock display loop
   Do
     ' Wait for a second to elapse
   t$=Time$: Timed = Val(Left$(t$,2)) * 3600 + Val(Mid$(t$,4,2)) * 60 + Val(Right$(t$,2))
   Do
   Pin(0)=0
   Pause 999
   Pin(0)=1
   Loop Until Int(Timer)/1000 <> Timed
     ' Calculate the time values
   T$=Time$:TimeNow = Val(Left$(T$,2)) * 3600 + Val(Mid$(t$,4,2)) * 60 + Val(Right$(t$,2))
   Second = TimeNow Mod 60
   Minute = (TimeNow \ 60) Mod 60
   Minute = Minute + Second \ 60
   Hour = TimeNow / 3600
     If Hour >= 12 Then Hour = Hour - 12
     ' Compute the angles (converted to radians)
     HrAng = .523599 * Hour
     MnAng = .10472 * Minute
     ScAng = .10472 * Second
     ' Compute the hands' endpoints
   HrX = Sin(HrAng) * 120 + 240: HrY = 0 - Cos(HrAng) * 120 + 216
   MnX = Sin(MnAng) * 180 + 240: MnY = 0 - Cos(MnAng) * 180 + 216
   ScX = Sin(ScAng) * 190 + 240: ScY = 0 - Cos(ScAng) * 190 + 216
     ' Erase the previous hands
   Line(240, 216)-(PHrx, PHry),0
   Line(240, 216)-(PMnx, PMny),0
   Line(240, 216)-(PScx, PScy),0
     ' Draw the current hands
   Line(240, 216)-(HrX, HrY),1
   Line(240, 216)-(MnX, MnY),1
   Line(240, 216)-(ScX, ScY),1
     ' Save the hands' position
     PHrX = HrX: PHrY = HrY
     PMnX = MnX: PMnY = MnY
     PScX = ScX: PScY = ScY
   Loop Until Inkey$ = Chr$(27)
   End
L001: 'WeekDay.bas    Ray Thomas      September 2000
   Dim TxtDay$(7)
   Dim TxtMonth$(12)
   Data "Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"
   Data "January","February","March","April","May","June","July"
   Data "August","September","October","November","December"
   For Count = 0 To 6
          Read TxtDay$(Count)
   Next Count
   For Count = 0 To 11
          Read TxtMonth$(Count)
   Next Count
   UserDate$ = Date$
   '*** Split out the day, month and year ***
   Day = Val(Left$(UserDate$, 2))
   Month = Val(Mid$(UserDate$, 4, 2))
   Year = Val(Right$(UserDate$, 4))
   OldYear = Year
   OldMonth=Month
   '*** start the print out
   Suffix$ = "th"
   If Day Mod 10 = 1 Then Suffix$ = "st"
   If Day Mod 10 = 2 Then Suffix$ = "nd"
   If Day Mod 10 = 3 Then Suffix$ = "rd"
   If Day > 10 And Day < 14 Then Suffix$ = "th"
   '*** For any date in Jan or Feb add 12 to the month and
   '*** subtract 1 from the year
   If Month < 3 Then
          Month = Month + 12
          Year = Year - 1
   EndIf
   '*** Add 1 to the month and multiply by 2.61
   '*** Drop the fraction (not round) afterwards
   Month = Month + 1
   Month = Fix(Month * 2.61)
   '*** Add Day, Month and the last two digits of the year
   NewYear$ = Str$(Year)
   Year = Val(Right$(NewYear$, 2))
   DMY = Day + Month + Year
   Century = Val(Left$(NewYear$, 2))
   '*** Add a quarter of the last two digits of the year
   '*** (truncated not rounded)
   Year = Fix(Year / 4)
   DMY = DMY + Year
   '*** Add the following factors for the year
   If Century = 18 Then Century = 2
   If Century = 19 Then Century = 0
   If Century = 20 Then Century = 6
   If Century = 21 Then Century = 4
   DMY = DMY + Century
   '*** The day of the week is the modulus of DMY divided by 7
   DMY = DMY Mod 7
   prt$=TxtDay$(DMY)+", "+Str$(Day)+Suffix$+" of "+TxtMonth$(OldMonth-1)+", "+Str$(OldYear)
   prtlen=Len(prt$)
   Locate (480-(prtlen*6))/2,1:Print prt$
   Return
L002: ver$=Str$(MM.Ver)
L003: verpos=Instr(ver$,".")
   If verpos = 0 Then ver$=ver$+".0":GoTo L003
   ver1$=Left$(ver$,verpos-1)
   ver2$=Mid$(ver$,verpos+1,2)
   ver3$=Right$(ver$,Len(ver$)-verpos)
   ver4$=Str$(Val(Left$(ver3$,2)))
   If Len(ver3$)>2 Then ver5=Val(Right$(ver3$,2)):ver5$=Chr$(ver5+64)
   version$=ver1$+"."+ver4$+ver5$
   Return
   '***
L004: '*** Subroutine to request and verify the current date and time - Hugh Buckle 12/2011
   Cls
   '*** days in each month
   Dim DaysInMth(12)
   For i = 1 To 12
     Read DaysInMth(i)
   Next
   '***
L005: '*** Ask if date and time to be entered
   Print "System date & time are " Date$ " " Time$
   Input "Do you wish to change them (y/n)"; Reply$
   If LCase$(Reply$) = "n" Then
     Return
   ElseIf LCase$(Reply$) <> "y" Then
     Print " Sorry I didn't understand your reply. Please answer Y or N"
     GoTo L005
   EndIf
   '***
L006: '*** ask for current date
   Input "Enter date dd-mm-yyyy"; reply$
   i = Instr(1,reply$,"-")
   If i > 1 Then
     day = Val(Left$(reply$,i-1))
   Else
     Print "Please use format dd-mm-yy."
     Print
     GoTo L006
   EndIf
   j = Instr(i+1,reply$,"-")
   If j > i + 1 Then
     month = Val(Mid$(reply$,i+1,j-i-1))
     year = Val(Right$(reply$, Len(reply$) - j))
   EndIf
   If Month < 1 Or Month > 12 Then
     Print "Month error. Please use format dd-mm-yyyy"
     Print
     GoTo L006
   EndIf
   If day < 1 Or day > DaysInMth(Month) Then
      Print "Day error. Please use format dd-mm-yyyy"
      Print
      GoTo L006
   EndIf
   '*** leap years are evenly divisible by 4
   '*** however those evenly divisible by 100 are not unless they are evenly divisible by 400
   If month = 2 And day > 28 Then
     If year Mod 4 <> 0 Or year/100 Mod 4 <> 0 Then
       Print year " is not a leap year."
       Print
       GoTo L006
     EndIf
   EndIf
   Date$ = reply$
   '***
L007: '*** Ask for current time
   Input "Enter time hh:mm[:ss] "; reply$
   i  = Instr(1,reply$,":")
   If i > 1 Then
     hour = Val(Left$(reply$,i-1))
   Else
     Print "Please use format hh:mm[:ss]"
     Print
     GoTo L007
   EndIf
   j = Instr(i+1,reply$,":")
   '*** if no second colon then seconds have been omitted
   If j = 0 Then
     minute = Val(Right$(Reply$, Len(reply$) - i))
     second = 0
   Else
     minute = Val(Mid$(reply$,i+1,j-i-1))
     second = Val(Right$(reply$, Len(reply$) - j))
   EndIf
   If hour < 0 Or Hour > 24 Or minute < 0  Or minute > 59 Or second < 0 Or second > 59 Then
     Print "Time error. Please use format hh:mm[:ss] where seconds are optional."
     Print
     GoTo L007
   EndIf
   Time$ = reply$
   Return
   '*** End HB mod 12/2011

Modified code:

   ' ANALOG CLOCK
   ' Case Study Problem B3: Program 1
   ' ---------------------------------------------------------------------------
   ' written by Eugene Villar http://seavsoftwares.codedgraphic.com/home_page.html
   ' ~ This program draws a very simple analog clock.
   ' modified for Maximite BASIC by Bob Devries
   ' modified for colour by Geoff Graham

   If MM.Device$ <> "Colour Maximite" Then
      Print "This program requires the Colour Maximite"
      End
   EndIf

   Timer = Val(Left$(Time$,2)) * 3600 + Val(Mid$(Time$,4,2)) * 60 + Val(Right$(Time$,2))
   ' Clock border
   Mode 3
   Cls
   Line(0,0)-(480,432),Cyan,BF:Line(11,12)-(469,421),0,BF
   GoSub L001
   Colour Green
   Locate 20,20:Print "MAXIMITE"
   Locate 20,30:Print "MMBASIC v";:GoSub L002 :Print version$;
   Colour White
   Circle(240,216), 200, Yellow
   Circle(240,216),199, Yellow
   For i=0 To 59
   rads=i*3.14159265/30
   If i Mod 5 <> 0 Then
   x1=Sin(rads)*195+240
   y1=-Cos(rads)*195+216
   Else
   x1=Sin(rads)*190+240
   y1=-Cos(rads)*190+216
   EndIf
   x2=Sin(rads)*200+240
   y2=-Cos(rads)*200+216
   Line(x1,y1)-(x2,y2),Yellow
   Next i
   ' Previous hand positions
   PHrX = 240: PHrY = 216
   PMnX = 240: PMnY = 216
   PScX = 240: PScY = 216
   ' Clock display loop
   Do
     ' Wait for a second to elapse
   t$=Time$: Timed = Val(Left$(t$,2)) * 3600 + Val(Mid$(t$,4,2)) * 60 + Val(Right$(t$,2))
   Do
   Pin(0)=0
   Pause 999
   Pin(0)=1
   Loop Until Int(Timer)/1000 <> Timed
     ' Calculate the time values
   T$=Time$:TimeNow = Val(Left$(T$,2)) * 3600 + Val(Mid$(t$,4,2)) * 60 + Val(Right$(t$,2))
   Second = TimeNow Mod 60
   Minute = (TimeNow \ 60) Mod 60
   Minute = Minute + Second \ 60
   Hour = TimeNow / 3600
     If Hour >= 12 Then Hour = Hour - 12
     ' Compute the angles (converted to radians)
     HrAng = .523599 * (Hour + Minute/60)
     MnAng = .10472 * (Minute + Second/60)
     ScAng = .10472 * Second
     ' Compute the hands' endpoints
   HrX = Sin(HrAng) * 120 + 240: HrY = 0 - Cos(HrAng) * 120 + 216
   MnX = Sin(MnAng) * 180 + 240: MnY = 0 - Cos(MnAng) * 180 + 216
   ScX = Sin(ScAng) * 190 + 240: ScY = 0 - Cos(ScAng) * 190 + 216

     ' make the tick sound
     Sound 3000, 5, 1

     ' Draw the current hands
     ' we erase then immediately redraw to avoid flicker
     ' then one final redraw incase the hands overlapped
   Line(240, 216)-(PScx, PScy),0     ' Erase the previous second hand
   Line(240, 216)-(ScX, ScY),Red     ' Draw the second hand
   Line(240, 216)-(PMnx, PMny),0     ' Erase the previous minute hand
   Line(240, 216)-(MnX, MnY),Purple  ' Draw the minute hand
   Line(240, 216)-(PHrx, PHry),0     ' Erase the previous hour hand
   Line(240, 216)-(HrX, HrY),Purple  ' Draw the hour hand

     ' Save the hands' position
     PHrX = HrX: PHrY = HrY
     PMnX = MnX: PMnY = MnY
     PScX = ScX: PScY = ScY
   Loop Until Inkey$ = Chr$(27)
   End
L001: 'WeekDay.bas    Ray Thomas      September 2000
   Dim TxtDay$(7)
   Dim TxtMonth$(12)
   Data "Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"
   Data "January","February","March","April","May","June","July"
   Data "August","September","October","November","December"
   For Count = 0 To 6
          Read TxtDay$(Count)
   Next Count
   For Count = 0 To 11
          Read TxtMonth$(Count)
   Next Count
   UserDate$ = Date$
   '*** Split out the day, month and year ***
   Day = Val(Left$(UserDate$, 2))
   Month = Val(Mid$(UserDate$, 4, 2))
   Year = Val(Right$(UserDate$, 4))
   OldYear = Year
   OldMonth=Month
   '*** start the print out
   Suffix$ = "th"
   If Day Mod 10 = 1 Then Suffix$ = "st"
   If Day Mod 10 = 2 Then Suffix$ = "nd"
   If Day Mod 10 = 3 Then Suffix$ = "rd"
   If Day > 10 And Day < 14 Then Suffix$ = "th"
   '*** For any date in Jan or Feb add 12 to the month and
   '*** subtract 1 from the year
   If Month < 3 Then
          Month = Month + 12
          Year = Year - 1
   EndIf
   '*** Add 1 to the month and multiply by 2.61
   '*** Drop the fraction (not round) afterwards
   Month = Month + 1
   Month = Fix(Month * 2.61)
   '*** Add Day, Month and the last two digits of the year
   NewYear$ = Str$(Year)
   Year = Val(Right$(NewYear$, 2))
   DMY = Day + Month + Year
   Century = Val(Left$(NewYear$, 2))
   '*** Add a quarter of the last two digits of the year
   '*** (truncated not rounded)
   Year = Fix(Year / 4)
   DMY = DMY + Year
   '*** Add the following factors for the year
   If Century = 18 Then Century = 2
   If Century = 19 Then Century = 0
   If Century = 20 Then Century = 6
   If Century = 21 Then Century = 4
   DMY = DMY + Century
   '*** The day of the week is the modulus of DMY divided by 7
   DMY = DMY Mod 7
   prt$=TxtDay$(DMY)+", "+Str$(Day)+Suffix$+" of "+TxtMonth$(OldMonth-1)+", "+Str$(OldYear)
   prtlen=Len(prt$)
   Locate (480-(prtlen*6))/2,0:Print CLR$(Black, Cyan) prt$
   Return
L002: ver$=Str$(MM.Ver)
L003: verpos=Instr(ver$,".")
   If verpos = 0 Then ver$=ver$+".0":GoTo L003
   ver1$=Left$(ver$,verpos-1)
   ver2$=Mid$(ver$,verpos+1,2)
   ver3$=Right$(ver$,Len(ver$)-verpos)
   ver4$=Str$(Val(Left$(ver3$,2)))
   If Len(ver3$)>2 Then ver5=Val(Right$(ver3$,2)):ver5$=Chr$(ver5+64)
   version$=ver1$+"."+ver4$+ver5$
   Return
mmbasic_original/analog_clock.txt · Last modified: 2024/01/29 17:54 by gerry