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