gigatron/rom/Contrib/at67/gbas/apps/Clock.gbas
2025-01-28 19:17:01 +03:00

184 lines
4.0 KiB
Plaintext

_runtimePath_ "../runtime"
_codeRomType_ ROMv1
'Keeping time using the
'59.98 Hz frame counter
const TICKS = 60
const SECSX = &h60A0
const SECSY = &h61A0
const MINSX = &h62A0
const MINSY = &h63A0
const HOURX = &h64A0
const HOURY = &h65A0
const CENTERX = 80
const CENTERY = 59
const SECS_LEN = 45
const MINS_LEN = 37
const HOUR_LEN = 29
const BACK_COLOUR = &h30
const DIAL_COLOUR = &h10
const DIAL_RADIUS = 43
'Seconds
def byte(SECSX, x, -90.0, 270.0, TICKS) = cos(x)*SECS_LEN + CENTERX
def byte(SECSY, y, -90.0, 270.0, TICKS) = sin(y)*SECS_LEN + CENTERY
'Minutes
def byte(MINSX, x, -90.0, 270.0, TICKS) = cos(x)*MINS_LEN + CENTERX
def byte(MINSY, y, -90.0, 270.0, TICKS) = sin(y)*MINS_LEN + CENTERY
'Hours
def byte(HOURX, x, -90.0, 270.0, TICKS) = cos(x)*HOUR_LEN + CENTERX
def byte(HOURY, y, -90.0, 270.0, TICKS) = sin(y)*HOUR_LEN + CENTERY
restart:
' disable video, (except last line so that we don't lose sync), for fast cls
set VIDEO_TOP, 238
set BG_COLOUR, BACK_COLOUR
set FG_COLOUR, &h0F
cls
set VIDEO_TOP, 0 'enable video
scroll off
at 2, 119 : print "Press Enter to reset clock";
at 2, 0 : input "Enter Time ", H,"H:";2;, M,"M:";2;, S,"S:";2;
B=get("FRAME_COUNT")
scroll off
at 2,0 : print " ";
at 2,119 : print " ";
H = H % 13 : if H &&= 0 then H = 12
M = M % 60
S = S % 60
HH=H : MM=M : SS=S
Hm12=H%12
Md12=M/12 : MMd12=Md12
' disable video, (except last line so that we don't lose sync), for fast dial draw
set VIDEO_TOP, 238 'disable video
gosub drawDial
gosub drawClock
set VIDEO_TOP, 0 'enable video
20 T=S*60 : V=3599 : goto &50
30 if T &&>= V then T=T-V : inc M
40 if M &&> 59 then M=M-60 : inc H
50 if H &&> 12 then H=H-12
60 S=T/60 : if S &&<> SS then gosub drawClock : SS=S
70 A=B : B=get("FRAME_COUNT") : A=B-A
80 if A &&< 0 then A=A+256
90 T=T+A
'restart
if get("SERIAL_RAW") <> 255
goto restart
endif
goto &30 'use T=T+2500 for debugging
drawClock:
gosub drawDigits
gosub drawSeconds
gosub drawMinutes
gosub drawHours
return
drawDigits:
set FGBG_COLOUR, &h0C00
at 57,82 : print H/10;H%10;":";M/10;M%10;":";S/10;S%10;
set BG_COLOUR, DIAL_COLOUR
return
drawSeconds:
gosub eraseSecondHand
i=SS : gosub drawTicks
gosub drawSecondHand
return
drawMinutes:
if M &<> MM
gosub eraseMinuteHand
MM=M : Md12=M/12
if Md12 &<> MMd12
gosub eraseHourHand
MMd12=Md12
endif
endif
gosub drawMinuteHand
return
drawHours:
if H &<> HH
HH=H : Hm12=H%12
endif
Hx5=(Hm12 LSL 2)+Hm12
gosub drawHourHand
return
drawTicks:
x = peek(SECSX + i)
y = peek(SECSY + i) + 8
poke (y LSL 8) + x, &h3F
return
drawDial:
set FG_COLOUR, DIAL_COLOUR
circlef CENTERX, CENTERY, DIAL_RADIUS
ox=CENTERX : oy=CENTERY
cr=DIAL_RADIUS + 1 : cc=&h00 : gosub jitterCircle
cr=DIAL_RADIUS + 3 : cc=&h00 : gosub jitterCircle
cr=DIAL_RADIUS + 5 : cc=&h01 : gosub jitterCircle
cr=DIAL_RADIUS + 9 : cc=&h03 : gosub jitterCircle
cr=DIAL_RADIUS + 7 : cc=&h02 : gosub jitterCircle
for i=0 &to TICKS-1
gosub drawTicks
next i
return
eraseSecondHand:
set FG_COLOUR, DIAL_COLOUR
line CENTERX,CENTERY, peek(SECSX + SS),peek(SECSY + SS)
return
drawSecondHand:
set FG_COLOUR, &h3F
line CENTERX,CENTERY, peek(SECSX + S),peek(SECSY + S)
return
eraseMinuteHand:
set FG_COLOUR, DIAL_COLOUR
line CENTERX,CENTERY, peek(MINSX + MM),peek(MINSY + MM)
return
drawMinuteHand:
set FG_COLOUR, &h2A
line CENTERX,CENTERY, peek(MINSX + M),peek(MINSY + M)
return
eraseHourHand:
set FG_COLOUR, DIAL_COLOUR
line CENTERX,CENTERY, peek(HOURX + Hx5 + MMd12),peek(HOURY + Hx5 + MMd12)
return
drawHourHand:
set FG_COLOUR, &h15
line CENTERX,CENTERY, peek(HOURX + Hx5 + Md12),peek(HOURY + Hx5 + Md12)
return
jitterCircle:
for oxx=ox-1 to ox+1
for oyy=oy-1 to oy+1
set FG_COLOUR, cc
circle oxx, oyy, cr
next oyy
next oxx
return