[net.sources.mac] MacPrograms Sources 1 of 2

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