184 lines
		
	
	
		
			4.0 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
			
		
		
	
	
			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 |