casper@wacsvax.OZ (Casper A Boon) (09/19/85)
There was sufficient response to my postings of the three programs
listed below for sources to warrant my sending same so here they come.
Firstly there is an Analog Clock Desk Accessory, written in MDSystem
68000 assembler. Then (in the next file) there are sources for MWRescue
and Stripper, in Consulair MacC.
The link files for the two C programs refer to libraries hacked for the
Standard file package and various File Manager routines that were not
implemented in version 1.09 of MacC. Sources for these have also been
included.
Casper Boon,
Dept of Computer Science,
University of Western Australia,
casper@wacsvax.oz (OZNet, CSNET)
...!{decvax|seismo}!mulga!wacsvax.oz!casper (UUCP)
casper%wacsvax.oz@seismo.arpa (ARPA)
"Sorry Madam, if it's not in the computer, it doesn't exist."
------------------------- Cut Here --------------------------
#! /bin/sh
# This is a shell archive - extract with sh not csh
#
cat << \SHAR_EOF > 'AnalogClock.Link'
/Resources
AnalogClock
$
SHAR_EOF
cat << \SHAR_EOF > 'AnalogClock.asm'
;----------------------------------------------------------------
;
; Desk Ornament for displaying the clock in Analog Form.
; Written by Casper A Boon 6 June 85,
; using the MDSystem from Apple Computer Inc.
;
; (c) Casper A Boon, University of Western Australia
; This source may be distributed freely to other Educational Institutions
; on the following conditions:
; 1) This copyright notice accompanies it
; 2) No profit may be made from such distibution
;
;-----------------------------------------------------------------
Include MacTraps.D
Include SYSEQUX.D
Include ToolEquX.D
Include QuickEquX.D
RESOURCE 'DRVR' 25 'Analog Clock' 32 ;make this a resource of
;type DRVR with ID 12 and
;name "Analog Clock" and
;"purgeable attribute. The
;resource ID must be >= 12
;for the DAMover to find it.
OrnEntry
DC.W $2400 ; ctl-enable = needsTime
DC.W 60 ; take a hit every second
DC.W $0000 ; no events
DC.W 0 ; No menu
; Entry point offset table
DC.W OrnOpen - OrnEntry ; open routine
DC.W OrnDone - OrnEntry ; prime
DC.W OrnCtl - OrnEntry ; control
DC.W OrnDone - OrnEntry ; status
DC.W OrnClose - OrnEntry ; close
OrnTitle
DC.B 13 ; length of string
DC.B 'Analog Clock ' ; title
.Align 4
; Open Routine -- allocate a window, initialize the count, allocate menu
OrnOpen
MOVEM.L A3-A4,-(SP) ;preserve regs
MOVE.L A1,A4 ;keep DCE ptr in A4
TST.L DCtlWindow(A1) ;already have a window?
BNE GotAWindow ;if so, don't make a new one
;
; now allocate the new window
;
CLR.L -(SP) ; make room for the result
CLR.L -(SP) ; allocate on heap
PEA cBounds ; push the boundsRect
PEA WindowTitle ; push the title
MOVE.W #16, D0 ; defProc = 16
SWAP D0 ;
MOVE.W #0, D0 ; invisible
MOVE.L D0, -(SP)
MOVEQ #-1,D0 ; get -1
MOVE.L D0,-(SP) ; behind = -1
MOVE #$0100,-(SP) ; yes, we want a goAway
CLR.L -(SP) ; refCon is zero
_NewWindow ; allocate a new window
MOVE.L (SP)+,A0 ; get the windowPtr
MOVE.L A0,DCtlWindow(A4) ; save in the DCE
MOVE DCtlRefNum(A4),windowKind(A0) ; mark as system window
;
; Font stuff, as though we were going to write in the window.
;
MOVE #4,TxFont(A0) ; use Monaco 9
MOVE #9,TxSize(A0) ; Unlike many other desk accesories
; Monaco 9 IS in the system
MOVE #srcCopy,TxMode(A0)
GotAWindow
MOVEM.L (SP)+,A3-A4 ;restore regs
OrnDone
MOVEQ #0,D0 ;no error
RTS ;all done with open
;
; Close Routine -- to close the ornament, we dispose the window
;
OrnClose
MOVE.L A4,-(SP) ; save A4
MOVE.L A1,A4 ; save A1=DCE from Pascal routine
MOVE.L DCtlWindow(A4),-(SP) ; push the window
CLR.L DCtlWindow(A4) ; we no longer have a window
_DisposWindow ; dispose it
MOVE.L (SP)+,A4 ; restore sole saved register
BRA.S OrnDone ; all done with close
; OrnCtl handles the control messages, which are the heart of the driver. We case out on
; the "opCode" field, which is 64 for "SendEvent", 65 for "Run", 66 for "Cursor",
; and 67 for "Menu". We only want the Run so only look for 65.
OrnCtl
MOVEM.L A2-A4,-(SP) ; preserve A3 and A4
MOVE.L A1,A4 ; keep DCE ptr in A4
MOVE CSCode(A0),D0 ; get the control opCode
CMP.S #64, D0 ; compare message with 64
BEQ DoCtlEvent ; = 64 -- event request (maybe update/activate)
CMP.S #65, D0 ; compare message with 65
BEQ DoRun ; = 65 -- run request
BRA.S CtlDone ; else ignore
;------------------------------------------------
;
DoRun
MOVEQ #1, D0 ; param for DrawWindow
JSR DrawWindow ; then fall through...
;------------------------------------------------
;
CtlDone
MOVE.L A4,A1 ; return DCE ptr to A1
MOVEM.L (SP)+,A2-A4 ; A3 and A4
MOVEQ #0,D0 ; no error
RTS ; bye-bye
; DoCtlEvent handles the events received by the ornament. It handles
; update events
;
DoCtlEvent
MOVE.L A3,-(SP) ;save registers
MOVE.L CSParam(A0),A3 ;get the event pointer
MOVE.W EvtNum(A3),D0 ;get the event number
; case out on the event number. We handle event 6 (update event),
CMP #8,D0 ;is it an activate?
BEQ DoTheActivate ;if so, go handle it
CMP #6,D0 ;is it an update?
BEQ.S ItsUpdate ;if so, handle it
; its not an event we handle so ignore it
CtlEvtDone
MOVE.L (SP)+,A3 ;restore registers
BRA CtlDone
; handle the update event by redrawing the contents of the window
ItsUpdate
MOVE.L EvtMessage(A3),-(SP) ;push the window ptr
MOVE.L (SP),-(SP) ;push it again
_BeginUpdate ;set vis to update
MOVEQ #0, D0 ;param for DrawWindow
JSR DrawWindow ;draw it
_EndUpdate
BRA.S CtlEvtDone
; DoTheActivate either puts shows or hides the scroll bar, depending on
; the state of the activate bit.
DoTheActivate
MOVEQ #0, D0 ; param for DrawWindow
JSR DrawWindow
BRA CtlEvtDone ; all done
;
; DrawWindow redraws the window.
;
; D0 has the parameter as follows:
; D0 = 0 => Redraw the clock
; D0 = 1 => Just update the time
;
DrawWindow
MOVEM.L D3-D6/A2-A3,-(SP) ; save work regs
MOVE.L D0, D3 ; save a copy of the parameter
MOVE.L DCtlWindow(A4),-(SP) ; push the window ptr for setport
_SetPort ; make it the port
TST.W D3
BNE UpDtBr ;if param = 0 then DrawTheClock
JSR DrawTheClock
UpDtBr:
JSR UpdateTime
MOVEM.L (SP)+,D3-D6/A2-A3 ; save work regs
RTS
;
;------------------------------------------------
;
DrawTheClock
PEA WindowBounds
_EraseRect
PEA WindowBounds
_InverRect ;Black out the window
PEA faceBounds
_EraseOval ;White out the face
MOVEQ #11, D6 ;12 hours on the face
MOVE.L XY, D3 ;Center of Face
LEA R3Table,A3 ;Get base of R3Table
LEA R2Table,A2 ;Get base of R2Table
@10 MOVE.L (A2)+, -(SP) ;push start pt of face mark
ADDA #16, A2 ;set up ptr for next makr
_MoveTo
MOVE.L (A3)+, -(SP) ;push start pt of face mark
ADDA #16, A3
_LineTo ;draw the mark
DBRA D6, @10 ;go for next mark
LEA MINUTES2, A3 ;set last update minute to -1
MOVE.W #-1, D0 ;this forces a full time update
MOVE.W D0, (A3) ;instead of just seconds update
RTS
UpdateTime:
MOVEM.L D3-D6/A2-A3, -(SP) ;save Registers
LEA Time, A0 ;load address of time storgae
MOVE.L (A0), D0 ;Save this time
LEA DateTime, A0 ;load address of our time storgae
_Secs2Date ;and compute in real terms
;A0 contains pointer to date and time record
LEA HOURS, A0
CLR.L D0
MOVE.W (A0), D0 ;D0 has the hour
DIVU #12, D0 ;Hi Word D0 has the scaled hour 0..11
CLR.W D0 ;throw away am/pm
SWAP D0 ;hour in lo word
MOVE.W D0, (A0) ;and save
LEA MINUTES, A0
MOVE.W (A0), D0 ;Get minutes in D0
LEA MINUTES2, A0
CMP.W (A0), D0 ;is this same as last time?
BEQ @9 ;if minutes have not changed just do seconds
LEA MINUTES2, A0
MOVE.W D0, (A0) ;save this as last update
JSR DoMainClock ;Print new face
@9: JSR DoSeconds
MOVEM.L (SP)+, D3-D6/A2-A3 ;restore Registers
RTS
DoMainClock:
CLR.L D0
MOVE.W MINUTES, D0 ;Get minutes back
ROL.L #2, D0 ;multiply by 4 (for pointers)
LEA R2Table, A3 ;get minute hand pointer table
ADDA D0, A3 ;Compute offset
MOVE.L (A3), D3 ;and get the value
; D3 now contains the point to which the minute hand must be drawn
CLR.L D0 ;clear out the work register
MOVE.W MINUTES, D0 ;and get the minutes back again
DIVU #12, D0 ;get the number of 12 minute sections
CLR.L D1
MOVE.W D0, D1 ;Copy D0 to D1
CLR.L D0
MOVE.W HOURS, D0 ;Get hours back
MULU #5, D0 ;1 hour = 5 minutes
ADD D1, D0 ;add the number of 12 minute sections
ROL.L #2, D0 ;multiply by 4 (for pointers)
LEA R1Table, A3 ;get start of hour hand table
ADDA D0, A3 ;gen abs address
MOVE.L (A3), D6 ;and get the end point
; D6 now contains the point to which the hour hand must be drawn
PEA CfaceBounds ;load hands area of face
_EraseOval ;and clear it
MOVE.L XY, -(SP)
_MoveTo ;move to centre of face
MOVE.L D3, -(SP) ;draw minute hand
_LineTo
MOVE.L XY, -(SP)
_MoveTo ;move to centre of face
MOVE.L D6, -(SP) ;draw hour hand
_LineTo
PEA SecondsRect ;Frame second hands area of face
_FrameOval
RTS
DoSeconds:
PEA SecsRect2 ;clear second hands area of face
_EraseOval
CLR.L D0
MOVE.W SECONDS, D0 ;Get seconds back
ROL.L #2, D0 ;multiply by 4 (for pointers)
LEA R4Table, A3 ;get second hand pointer table
ADDA D0, A3 ;Compute offset
MOVE.L (A3), D3 ;and get the value
; D3 now contains the point to which the second hand must be drawn
MOVE.L XY, -(SP)
_MoveTo
MOVE.L D3, -(SP) ;draw second hand
_LineTo
RTS
;-----------------------------------------------------------------------
; THE DATA SPACE
;-----------------------------------------------------------------------
DateTime: ; a date time record
YEARS DC.W 0
MONTHS DC.W 0
DAYS DC.W 0
HOURS DC.W 0
MINUTES DC.W 0
SECONDS DC.W 0
WeekDays DC.W 0
MINUTES2 DC.W 0 ;last update of minutes
COLON DC.B ' :'
TimeSecs DS.L 1
windowTitle DC.B 5,'Clock'
cBounds DC.W 42,20,122,100 ;the window square
windowBounds DC.W 0,0,80,80
SecondsRect DC.W 30,30,50,50 ;Seconds hand face
SecsRect2 DC.W 31,31,49,49 ;Seconds hand face
faceBounds DC.W 10,10,70,70 ;Clock Face full
CfaceBounds DC.W 15,15,65,65 ;Just The Hands of face
X EQU 40
Y EQU 40
XY DC.W Y,X ;Center of the clock face
R1 EQU 17 ;Hour Hand Length
R2 EQU 25 ;Minute Hand Length
R3 EQU 31 ;Clock Face Radius
R4 EQU 9 ;Second Hand Length
;----------------------------------------------------------------------
; Every position on the clock face is 6 degrees from the previous
; position, so set upa SINE table of equates
;----------------------------------------------------------------------
SIN00 EQU 00000
SIN06 EQU 01045
SIN12 EQU 02079
SIN18 EQU 03090
SIN24 EQU 04067
SIN30 EQU 05000
SIN36 EQU 05878
SIN42 EQU 06691
SIN48 EQU 07431
SIN54 EQU 08090
SIN60 EQU 08660
SIN66 EQU 09135
SIN72 EQU 09511
SIN78 EQU 09781
SIN84 EQU 09945
SIN90 EQU 10000
;----------------------------------------------------------------------
; Using these SINE's we can compute the offsets depending on the radius
; There are four radii (outside of face, minute hand, hour hand and
; second hand)
;----------------------------------------------------------------------
R1OFF0 EQU ((R1 * SIN00) / SIN90)
R1OFF1 EQU ((R1 * SIN06) / SIN90)
R1OFF2 EQU ((R1 * SIN12) / SIN90)
R1OFF3 EQU ((R1 * SIN18) / SIN90)
R1OFF4 EQU ((R1 * SIN24) / SIN90)
R1OFF5 EQU ((R1 * SIN30) / SIN90)
R1OFF6 EQU ((R1 * SIN36) / SIN90)
R1OFF7 EQU ((R1 * SIN42) / SIN90)
R1OFF8 EQU ((R1 * SIN48) / SIN90)
R1OFF9 EQU ((R1 * SIN54) / SIN90)
R1OFFA EQU ((R1 * SIN60) / SIN90)
R1OFFB EQU ((R1 * SIN66) / SIN90)
R1OFFC EQU ((R1 * SIN72) / SIN90)
R1OFFD EQU ((R1 * SIN78) / SIN90)
R1OFFE EQU ((R1 * SIN84) / SIN90)
R1OFFF EQU ((R1 * SIN90) / SIN90)
R2OFF0 EQU ((R2 * SIN00) / SIN90)
R2OFF1 EQU ((R2 * SIN06) / SIN90)
R2OFF2 EQU ((R2 * SIN12) / SIN90)
R2OFF3 EQU ((R2 * SIN18) / SIN90)
R2OFF4 EQU ((R2 * SIN24) / SIN90)
R2OFF5 EQU ((R2 * SIN30) / SIN90)
R2OFF6 EQU ((R2 * SIN36) / SIN90)
R2OFF7 EQU ((R2 * SIN42) / SIN90)
R2OFF8 EQU ((R2 * SIN48) / SIN90)
R2OFF9 EQU ((R2 * SIN54) / SIN90)
R2OFFA EQU ((R2 * SIN60) / SIN90)
R2OFFB EQU ((R2 * SIN66) / SIN90)
R2OFFC EQU ((R2 * SIN72) / SIN90)
R2OFFD EQU ((R2 * SIN78) / SIN90)
R2OFFE EQU ((R2 * SIN84) / SIN90)
R2OFFF EQU ((R2 * SIN90) / SIN90)
R3OFF0 EQU ((R3 * SIN00) / SIN90)
R3OFF1 EQU ((R3 * SIN06) / SIN90)
R3OFF2 EQU ((R3 * SIN12) / SIN90)
R3OFF3 EQU ((R3 * SIN18) / SIN90)
R3OFF4 EQU ((R3 * SIN24) / SIN90)
R3OFF5 EQU ((R3 * SIN30) / SIN90)
R3OFF6 EQU ((R3 * SIN36) / SIN90)
R3OFF7 EQU ((R3 * SIN42) / SIN90)
R3OFF8 EQU ((R3 * SIN48) / SIN90)
R3OFF9 EQU ((R3 * SIN54) / SIN90)
R3OFFA EQU ((R3 * SIN60) / SIN90)
R3OFFB EQU ((R3 * SIN66) / SIN90)
R3OFFC EQU ((R3 * SIN72) / SIN90)
R3OFFD EQU ((R3 * SIN78) / SIN90)
R3OFFE EQU ((R3 * SIN84) / SIN90)
R3OFFF EQU ((R3 * SIN90) / SIN90)
R4OFF0 EQU ((R4 * SIN00) / SIN90)
R4OFF1 EQU ((R4 * SIN06) / SIN90)
R4OFF2 EQU ((R4 * SIN12) / SIN90)
R4OFF3 EQU ((R4 * SIN18) / SIN90)
R4OFF4 EQU ((R4 * SIN24) / SIN90)
R4OFF5 EQU ((R4 * SIN30) / SIN90)
R4OFF6 EQU ((R4 * SIN36) / SIN90)
R4OFF7 EQU ((R4 * SIN42) / SIN90)
R4OFF8 EQU ((R4 * SIN48) / SIN90)
R4OFF9 EQU ((R4 * SIN54) / SIN90)
R4OFFA EQU ((R4 * SIN60) / SIN90)
R4OFFB EQU ((R4 * SIN66) / SIN90)
R4OFFC EQU ((R4 * SIN72) / SIN90)
R4OFFD EQU ((R4 * SIN78) / SIN90)
R4OFFE EQU ((R4 * SIN84) / SIN90)
R4OFFF EQU ((R4 * SIN90) / SIN90)
;----------------------------------------------------------------------
; Using these offsets we now store the points, all 60 for each radius
; This facilitates a simple look up table for the next absolute position
; to draw a line to.
;----------------------------------------------------------------------
R1Table DC.W Y - R1OFFF, X + R1OFF0 ;0 MINS
DC.W Y - R1OFFE, X + R1OFF1
DC.W Y - R1OFFD, X + R1OFF2
DC.W Y - R1OFFC, X + R1OFF3
DC.W Y - R1OFFB, X + R1OFF4
DC.W Y - R1OFFA, X + R1OFF5
DC.W Y - R1OFF9, X + R1OFF6
DC.W Y - R1OFF8, X + R1OFF7
DC.W Y - R1OFF7, X + R1OFF8
DC.W Y - R1OFF6, X + R1OFF9
DC.W Y - R1OFF5, X + R1OFFA
DC.W Y - R1OFF4, X + R1OFFB
DC.W Y - R1OFF3, X + R1OFFC
DC.W Y - R1OFF2, X + R1OFFD
DC.W Y - R1OFF1, X + R1OFFE ;14 MINS
DC.W Y + R1OFF0, X + R1OFFF ;15 MINS
DC.W Y + R1OFF1, X + R1OFFE
DC.W Y + R1OFF2, X + R1OFFD
DC.W Y + R1OFF3, X + R1OFFC
DC.W Y + R1OFF4, X + R1OFFB
DC.W Y + R1OFF5, X + R1OFFA
DC.W Y + R1OFF6, X + R1OFF9
DC.W Y + R1OFF7, X + R1OFF8
DC.W Y + R1OFF8, X + R1OFF7
DC.W Y + R1OFF9, X + R1OFF6
DC.W Y + R1OFFA, X + R1OFF5
DC.W Y + R1OFFB, X + R1OFF4
DC.W Y + R1OFFC, X + R1OFF3
DC.W Y + R1OFFD, X + R1OFF2
DC.W Y + R1OFFE, X + R1OFF1 ;29 MINS
DC.W Y + R1OFFF, X - R1OFF0 ;30 MINS
DC.W Y + R1OFFE, X - R1OFF1
DC.W Y + R1OFFD, X - R1OFF2
DC.W Y + R1OFFC, X - R1OFF3
DC.W Y + R1OFFB, X - R1OFF4
DC.W Y + R1OFFA, X - R1OFF5
DC.W Y + R1OFF9, X - R1OFF6
DC.W Y + R1OFF8, X - R1OFF7
DC.W Y + R1OFF7, X - R1OFF8
DC.W Y + R1OFF6, X - R1OFF9
DC.W Y + R1OFF5, X - R1OFFA
DC.W Y + R1OFF4, X - R1OFFB
DC.W Y + R1OFF3, X - R1OFFC
DC.W Y + R1OFF2, X - R1OFFD
DC.W Y + R1OFF1, X - R1OFFE ;44 MINS
DC.W Y - R1OFF0, X - R1OFFF ;45 MINS
DC.W Y - R1OFF1, X - R1OFFE
DC.W Y - R1OFF2, X - R1OFFD
DC.W Y - R1OFF3, X - R1OFFC
DC.W Y - R1OFF4, X - R1OFFB
DC.W Y - R1OFF5, X - R1OFFA
DC.W Y - R1OFF6, X - R1OFF9
DC.W Y - R1OFF7, X - R1OFF8
DC.W Y - R1OFF8, X - R1OFF7
DC.W Y - R1OFF9, X - R1OFF6
DC.W Y - R1OFFA, X - R1OFF5
DC.W Y - R1OFFB, X - R1OFF4
DC.W Y - R1OFFC, X - R1OFF3
DC.W Y - R1OFFD, X - R1OFF2
DC.W Y - R1OFFE, X - R1OFF1 ;59 MINS
R2Table DC.W Y - R2OFFF, X + R2OFF0 ;0 MINS
DC.W Y - R2OFFE, X + R2OFF1
DC.W Y - R2OFFD, X + R2OFF2
DC.W Y - R2OFFC, X + R2OFF3
DC.W Y - R2OFFB, X + R2OFF4
DC.W Y - R2OFFA, X + R2OFF5
DC.W Y - R2OFF9, X + R2OFF6
DC.W Y - R2OFF8, X + R2OFF7
DC.W Y - R2OFF7, X + R2OFF8
DC.W Y - R2OFF6, X + R2OFF9
DC.W Y - R2OFF5, X + R2OFFA
DC.W Y - R2OFF4, X + R2OFFB
DC.W Y - R2OFF3, X + R2OFFC
DC.W Y - R2OFF2, X + R2OFFD
DC.W Y - R2OFF1, X + R2OFFE ;14 MINS
DC.W Y + R2OFF0, X + R2OFFF ;15 MINS
DC.W Y + R2OFF1, X + R2OFFE
DC.W Y + R2OFF2, X + R2OFFD
DC.W Y + R2OFF3, X + R2OFFC
DC.W Y + R2OFF4, X + R2OFFB
DC.W Y + R2OFF5, X + R2OFFA
DC.W Y + R2OFF6, X + R2OFF9
DC.W Y + R2OFF7, X + R2OFF8
DC.W Y + R2OFF8, X + R2OFF7
DC.W Y + R2OFF9, X + R2OFF6
DC.W Y + R2OFFA, X + R2OFF5
DC.W Y + R2OFFB, X + R2OFF4
DC.W Y + R2OFFC, X + R2OFF3
DC.W Y + R2OFFD, X + R2OFF2
DC.W Y + R2OFFE, X + R2OFF1 ;29 MINS
DC.W Y + R2OFFF, X - R2OFF0 ;30 MINS
DC.W Y + R2OFFE, X - R2OFF1
DC.W Y + R2OFFD, X - R2OFF2
DC.W Y + R2OFFC, X - R2OFF3
DC.W Y + R2OFFB, X - R2OFF4
DC.W Y + R2OFFA, X - R2OFF5
DC.W Y + R2OFF9, X - R2OFF6
DC.W Y + R2OFF8, X - R2OFF7
DC.W Y + R2OFF7, X - R2OFF8
DC.W Y + R2OFF6, X - R2OFF9
DC.W Y + R2OFF5, X - R2OFFA
DC.W Y + R2OFF4, X - R2OFFB
DC.W Y + R2OFF3, X - R2OFFC
DC.W Y + R2OFF2, X - R2OFFD
DC.W Y + R2OFF1, X - R2OFFE ;44 MINS
DC.W Y - R2OFF0, X - R2OFFF ;45 MINS
DC.W Y - R2OFF1, X - R2OFFE
DC.W Y - R2OFF2, X - R2OFFD
DC.W Y - R2OFF3, X - R2OFFC
DC.W Y - R2OFF4, X - R2OFFB
DC.W Y - R2OFF5, X - R2OFFA
DC.W Y - R2OFF6, X - R2OFF9
DC.W Y - R2OFF7, X - R2OFF8
DC.W Y - R2OFF8, X - R2OFF7
DC.W Y - R2OFF9, X - R2OFF6
DC.W Y - R2OFFA, X - R2OFF5
DC.W Y - R2OFFB, X - R2OFF4
DC.W Y - R2OFFC, X - R2OFF3
DC.W Y - R2OFFD, X - R2OFF2
DC.W Y - R2OFFE, X - R2OFF1 ;59 MINS
R3Table DC.W Y - R3OFFF, X + R3OFF0 ;0 MINS
DC.W Y - R3OFFE, X + R3OFF1
DC.W Y - R3OFFD, X + R3OFF2
DC.W Y - R3OFFC, X + R3OFF3
DC.W Y - R3OFFB, X + R3OFF4
DC.W Y - R3OFFA, X + R3OFF5
DC.W Y - R3OFF9, X + R3OFF6
DC.W Y - R3OFF8, X + R3OFF7
DC.W Y - R3OFF7, X + R3OFF8
DC.W Y - R3OFF6, X + R3OFF9
DC.W Y - R3OFF5, X + R3OFFA
DC.W Y - R3OFF4, X + R3OFFB
DC.W Y - R3OFF3, X + R3OFFC
DC.W Y - R3OFF2, X + R3OFFD
DC.W Y - R3OFF1, X + R3OFFE ;14 MINS
DC.W Y + R3OFF0, X + R3OFFF ;15 MINS
DC.W Y + R3OFF1, X + R3OFFE
DC.W Y + R3OFF2, X + R3OFFD
DC.W Y + R3OFF3, X + R3OFFC
DC.W Y + R3OFF4, X + R3OFFB
DC.W Y + R3OFF5, X + R3OFFA
DC.W Y + R3OFF6, X + R3OFF9
DC.W Y + R3OFF7, X + R3OFF8
DC.W Y + R3OFF8, X + R3OFF7
DC.W Y + R3OFF9, X + R3OFF6
DC.W Y + R3OFFA, X + R3OFF5
DC.W Y + R3OFFB, X + R3OFF4
DC.W Y + R3OFFC, X + R3OFF3
DC.W Y + R3OFFD, X + R3OFF2
DC.W Y + R3OFFE, X + R3OFF1 ;29 MINS
DC.W Y + R3OFFF, X - R3OFF0 ;30 MINS
DC.W Y + R3OFFE, X - R3OFF1
DC.W Y + R3OFFD, X - R3OFF2
DC.W Y + R3OFFC, X - R3OFF3
DC.W Y + R3OFFB, X - R3OFF4
DC.W Y + R3OFFA, X - R3OFF5
DC.W Y + R3OFF9, X - R3OFF6
DC.W Y + R3OFF8, X - R3OFF7
DC.W Y + R3OFF7, X - R3OFF8
DC.W Y + R3OFF6, X - R3OFF9
DC.W Y + R3OFF5, X - R3OFFA
DC.W Y + R3OFF4, X - R3OFFB
DC.W Y + R3OFF3, X - R3OFFC
DC.W Y + R3OFF2, X - R3OFFD
DC.W Y + R3OFF1, X - R3OFFE ;44 MINS
DC.W Y - R3OFF0, X - R3OFFF ;45 MINS
DC.W Y - R3OFF1, X - R3OFFE
DC.W Y - R3OFF2, X - R3OFFD
DC.W Y - R3OFF3, X - R3OFFC
DC.W Y - R3OFF4, X - R3OFFB
DC.W Y - R3OFF5, X - R3OFFA
DC.W Y - R3OFF6, X - R3OFF9
DC.W Y - R3OFF7, X - R3OFF8
DC.W Y - R3OFF8, X - R3OFF7
DC.W Y - R3OFF9, X - R3OFF6
DC.W Y - R3OFFA, X - R3OFF5
DC.W Y - R3OFFB, X - R3OFF4
DC.W Y - R3OFFC, X - R3OFF3
DC.W Y - R3OFFD, X - R3OFF2
DC.W Y - R3OFFE, X - R3OFF1 ;59 MINS
R4Table DC.W Y - R4OFFF, X + R4OFF0 ;0 SECS
DC.W Y - R4OFFE, X + R4OFF1
DC.W Y - R4OFFD, X + R4OFF2
DC.W Y - R4OFFC, X + R4OFF3
DC.W Y - R4OFFB, X + R4OFF4
DC.W Y - R4OFFA, X + R4OFF5
DC.W Y - R4OFF9, X + R4OFF6
DC.W Y - R4OFF8, X + R4OFF7
DC.W Y - R4OFF7, X + R4OFF8
DC.W Y - R4OFF6, X + R4OFF9
DC.W Y - R4OFF5, X + R4OFFA
DC.W Y - R4OFF4, X + R4OFFB
DC.W Y - R4OFF3, X + R4OFFC
DC.W Y - R4OFF2, X + R4OFFD
DC.W Y - R4OFF1, X + R4OFFE ;14 SECS
DC.W Y + R4OFF0, X + R4OFFF ;15 SECS
DC.W Y + R4OFF1, X + R4OFFE
DC.W Y + R4OFF2, X + R4OFFD
DC.W Y + R4OFF3, X + R4OFFC
DC.W Y + R4OFF4, X + R4OFFB
DC.W Y + R4OFF5, X + R4OFFA
DC.W Y + R4OFF6, X + R4OFF9
DC.W Y + R4OFF7, X + R4OFF8
DC.W Y + R4OFF8, X + R4OFF7
DC.W Y + R4OFF9, X + R4OFF6
DC.W Y + R4OFFA, X + R4OFF5
DC.W Y + R4OFFB, X + R4OFF4
DC.W Y + R4OFFC, X + R4OFF3
DC.W Y + R4OFFD, X + R4OFF2
DC.W Y + R4OFFE, X + R4OFF1 ;29 SECS
DC.W Y + R4OFFF, X - R4OFF0 ;30 SECS
DC.W Y + R4OFFE, X - R4OFF1
DC.W Y + R4OFFD, X - R4OFF2
DC.W Y + R4OFFC, X - R4OFF3
DC.W Y + R4OFFB, X - R4OFF4
DC.W Y + R4OFFA, X - R4OFF5
DC.W Y + R4OFF9, X - R4OFF6
DC.W Y + R4OFF8, X - R4OFF7
DC.W Y + R4OFF7, X - R4OFF8
DC.W Y + R4OFF6, X - R4OFF9
DC.W Y + R4OFF5, X - R4OFFA
DC.W Y + R4OFF4, X - R4OFFB
DC.W Y + R4OFF3, X - R4OFFC
DC.W Y + R4OFF2, X - R4OFFD
DC.W Y + R4OFF1, X - R4OFFE ;44 SECS
DC.W Y - R4OFF0, X - R4OFFF ;45 SECS
DC.W Y - R4OFF1, X - R4OFFE
DC.W Y - R4OFF2, X - R4OFFD
DC.W Y - R4OFF3, X - R4OFFC
DC.W Y - R4OFF4, X - R4OFFB
DC.W Y - R4OFF5, X - R4OFFA
DC.W Y - R4OFF6, X - R4OFF9
DC.W Y - R4OFF7, X - R4OFF8
DC.W Y - R4OFF8, X - R4OFF7
DC.W Y - R4OFF9, X - R4OFF6
DC.W Y - R4OFFA, X - R4OFF5
DC.W Y - R4OFFB, X - R4OFF4
DC.W Y - R4OFFC, X - R4OFF3
DC.W Y - R4OFFD, X - R4OFF2
DC.W Y - R4OFFE, X - R4OFF1 ;59 SECS
END
SHAR_EOF