PL( H ԍh@H2D ԍЩ ԍh@H ֍ ԍЩ ԍЩ2 ԍh@c`H hld { L `]Z[  ] fddeL gfg㩰]ZФl~8AL ȱfȱgL(L ɀ0`iȥdȥel~Șe[[\\Ń [łl~[dde[\he]]L e[[\[ɀ) d[\\Ń [l~deL fgfgɷ[\[ł0\Ń0L 80p11qp0q1`fp0gq1`@i ``8@`ɀ`i `8@`l~ [!L 28 i` u"L ȥdfȥeg& ɹ L( u" )8dfȥeg揈8f& ɰ l~ ȩ ABCDEFGHIJKLMNOPQLWB H D LSB MSB MEMORY START-END TARGETS DENSITY INSERTDELETE USER MEMORY X"Y#g&'R @! "i"#&&o n+`LLLLLL LLMLLLLLLL L(LPLGL'LL(L0* i@ `8 ɀɠ`XYXiPY惥XiY慥i(懥i`LT q ňʼn`ͩ Π q (  q L* ꥆiLx 挥(ׅ )捩l| ~  ~  l{ ~| } L*  ө̩Π˅̦͑0˭1̠˙ȩ™ȩ ȩȩAȩj01Y>67 * z (+ H $d%e0˭1̩ԩ$% * z * * Xi恠 ꙰I  怊 z LYc r"ɛ4~ c0cc c IccČ p ~ * i? j8kl򩰅 `v`HH Dک ٥ԅfՅghh`HH Dڠ dԥe آ0ȹ. ) q hh`c  q cńŅ_8(^_ (c 1 q q [^\_cZ`8[([\ * (c q ńŅ^_Zc`[\`cZ (Zc8cƃc8^(^_ƃƂc` 1 !"#L*1N@   Y R@    Y t$%`h~h~Ω͠[ZL L ɀL L Lx"L{"0 Z0L 0 Z0L LLL#L5LFL L"L2 L~ L L8!L!LL"LL#]e]ɆL>ɔL;ɗ]L;ɓLeɥLqɘLɪLqɝLɖLɤL L-p^dq_e 1 q c"epd 1pqqs prL v` q c8ƍ q 0 q q `ꩆjpьi捥l0饌k0 DLP Dȱ M q LP q c G M q c G q c G M"Cȱ)<^id_ee^Ɂedde 1LP)^8^^d^dee^e^d89 q 1 q ȱ q 0LP 1 q ] V kL   A frgsrsr srs ] h(c JvLbc  q cńŅ] V (cо@Q(N 9 >NRUTER< TLUAFED ESU RO SEDOC NOITAZILAITINI RETNIRP RETNE >NRUTER< TLUAFED ESU RO SEDOC RETNIRP RETNE !$#i!$#e!$#8u!$#m!$#8}!$#9y!$#8 a!$# 9q!.$)!.$%!.$85!.$-!.$8=!.$99!.$8 !!.$ 91!3,! !3,!3,8!3,!3,8"##"#3"%1")4$")4,"-)0".%"0,"2+"6#P"63p#,##,$#,)X#,6#-0#-0#-08#-0#-08#-09#-08 #-0 9#08#08#08#09#09#09$%#$%#8$%#$%#8$%8$%9%/2I%/2E%/28U%/2M%/28]%/29Y%/28 A%/2 9Q).#).#8).#).#8).8).9*-0L*-0 l*32 ,$!,$!,$!8,$!,$!8,$!9,$!8 ,$! 9,$8,$8,$89,$8,$89,$9,$9,$98,$9,$98,32!J,32F,328V,32N,328^./0/2! /2!/2!8/2! /2!8/2!9/2!8 /2! 90(!H0(00,!h0,0(2/,!*2/,&2/,862/,.2/,8>2/2!j2/2f2/28v2/2n2/28~24)@243`3"#3"#3"#83"#3"#83"#93"#8 3"# 93%#83%$3%)x34!34!834!34!834!934!8 34! 9348348934834934983494!84!943848!48349!LLLLnLLLLALLLLLLLLLLLL'LLL * (c q ńŅ8(ƃ`,&-' xc q (ec惩(cde 1ुiȅ惠c pcɛ~ ) ӱ)i(惥Ņ0ń0iȅ惠c  cf(ci(惠cӥ(")#!W , ,()LnL (   )(@W Y`iP恩@ (i(恩@W   ( Y䥁ŃŃł` * z * (),-L_()L\()L\ R @!"#L_ * z * ? ij8kl] fdge {  `"  w zɛ~),cъ  q ij ] cЪL $|%}ԩύ$ % { ԭ|$}%` * z * `  I `O ` `  R@! W!L- f&g'- ,- f,g- ]8("p)#qL- *B'-&, +/ L-&'"e$"#e%#rpsq W ]@!R "r#s"# L-p] "rpL !W r"p L-L x  XL , o" n+Xldxh ҍ@@LA ԍ˩̘Hȑ˥̥e̐dː㈱ȑˈdTh`ԍdԥeթ˩̘HԈեɳ0˩Th` " #h&' #&&q` R @! ` W ! `ꥇi } z f"g# f(g)`  "#()]@       L $"]"&")'8(]()) &'(e]]]"ppe]pq&Я'Ы`$v8(包t)卅uwx8tvtwxuu xL- w` t uuvt ɀvv@0L-titɀtu` ) *  j  ʊ ȱ ʊ `@tȥwtȥxtȥ tȥ tȢ. t t `W !"# & '$8(包t)卅u$ʥutt]" ]"H h "v  ""] И Д` wȱ xR @!"#wt&xu'  ȱ 芑 8ttȰu8*t0 $"w")xбwЭ t u]tit]ɀtu穀t`L%L%Ln&Ln)L_%L((L$LfLL ]@L- &ȱ ' "p#q"#()8(p()q) L  ] .  ɀ i  ` ] i ɀп ɼг`%-!.|32/4#%3|'!,&|48%92!-)20|432)&|,!4/4|4!43|%,)&/0%.$,4$53%$##  $ ] P/# q R( q (c]de q q 1c! q ) )@%# q # q  # q c q  dȱ e 1c q  dȱ e 1c q  q q q c q  i ɀ ɼL Ņń] $l# q q ]l#ɛ~ {  o"`XL `HHɀ)Iɀ)I(Lc":Lf"9Li" ɀI)nᄌ { ~ Ɉɛ ` I ␩ ( Dک l" ՅԤ )8fԈ ԅ آ轀.ʠ0 jjjj)iiIȥ)iiIhh` (  l" )   gjjjj)iiIȥg fg ԅfՅg8 آ轀.ʤ0 ꥌ 'g԰f*f hh`R @!"#0`O   YS@ YL-`XXYHcH `"hch` ͩΠ"Jȱ)C8ffgg8ge8fdfgfdffgdffffgiijikjlL 0ȱiggѠiddeL ȥ]fgi)fdde L fdgddeL l~ (  l"Ԇդ ?)08) ****e((ՠ  آ轀.ʠ0 ꩀ   L& (c q _ q ȱdȱe 1c q 3 * }* q (L TARGETS IN INVERSE ARE UNRESOLVED '&$% $% & '  Y`'&8p逅rqs`8prqs`& 'p`pp`"#@,Q&'R @! "i&&g`@,Э XY`,/8̭3ii AN ERROR HAS OCCURRED ----------------------- Common Errors are 1. Typographical 2. Disk is write protected 3. Targets used up 4. Directory or Disk full 5. GRIP altered , q 捥P쥍-L COMMAND SUMMARY ESCAPE or BREAK = RETURN TO COMMAND B#/--!.$35--!29",).+).'!34%2)3+#/--!.$"!2%3#!0%or"2%!+2%452.4/#/--!.$"!2232%!$3%#4/2eg 7372)4%3%#4/2 2&2%!$&),% 7&72)4%&),% $3$)3!33%-",%4/3#2%%. $0$)3!33%-",%4/02).4%2 !%!33%-",% %$)4 0#02).4%2#/$%3 2$2%!$$)2%#4/29 404!2'%40!'% 4!"+%9#/.6%23)/.3"($-%-/2934!24 %.$3/52#%/2$%34).!4)/.offilesorsectors02%3334!24&/2.%840!'%02%33/04)/.&/2,!340!'%02%333%,%#44/2%452.4/7/2+3#2%%.!33%-",9#/--!.$3/.%#/--!.$490%/.,9!,,/7%$0%2,).%period /.%"94%$%#)-!,6!,5%3separatedbycommastofollowquestionmark 5.+./7."2!.#(4!2'%4named!to1tofollowcolon .!-%$4!2'%4$%&).%$!3thisaddressquotationmark 3#2%%.6!,5%3tofollow!3#))6!,5%334/2%$eg   ".%#"-%33!'%#/.42/,)or$).3%24or$%,%4%"94%02%33/04)/.&/2,!340!'%02%3334!24&/2.%840!'%02%333%,%#44/2%452.4/7/2+3#2%%.'%.%2!,).&/2-!4)/.53%2-%-/29istheareaofmemorythatisnotusedby'2)0orthe/perating3ystem4hisistheamountofmemoryavailableforwritingoreditingassemblylanguageprograms$%.3)49isautomaticallydeterminedandset$isksmustbefomattedbeforeuse4!2'%43arecountedonlyifnotdefined'2)0484isafileincludedonthisdiskwhichissuitableforprintingwithawordprocessor)tcontainsmoredetailedcommanddescriptionsandexamples02%33/04)/.&/2,!340!'%02%333%,%#44/2%452.4/7/2+3#2%%.'2)0!33%-",%2RRRRRRRRRRRRRR'2)0)3!&2%%7!2%02/'2!-4()30%2-)435.,)-)4%$#/09).'!.$$)3 42)"54)/.7)4(/54&%%)&4(%53%2&).$36!,5%).4()302/'2!- !'2!45)49#!."%3%.44/"25#%(%.29 0/"/87//$34/#+ /.4!2)/#!.!$! .37).3%2402/'2!-34/2!'%$)3+).$2)6%/.%!.$02%3334!24&/2!#/--!.$35--!29!.$'%.%2!,).&/2-!4)/.02%33(%,0!4!.94)-%#/092)'(4c "25#%(%.29 ______________ GRIP ASSEMBLER ______________ This program documentation can be found }on the Grip disk as an ASCII file (suitable for word processing) named GRIP.TXT. Grip is meant for those with experience }in 6502 Assembly Language programming. GRIP is an assembler that will assemble machine language instructions in memory a}s each line of Assembly Language is entered. Further compiling is unnecessary and the assembled code can then be written  }to disk as a file or as sector(s). Furthermore, files or sectors of machine language code can be read into memory, edited }, and disassembled onscreen or to a printer. To demonstrate the speed of GRIP, try this simple exercise. Boot the disk a }nd when the opening screen appears, press the Start key. Now the work screen appears and near the lower right corner is a } blinking asterisk. This indicates the Command Bar and readiness. Enter the following :"DS50851" without the quote marks.  }After the Return key has been pressed, the screen will fill with assembly language for the code found at that address whi}ch happens to be the Operating System disk handler initialization routine. Now, press the Start key. Another screen of co}ntiguous disassembly appears. Press it again, or, press the Option key. The option key backs-up the disassembly seventeen} bytes. This allows for overlap and some degree of control over what section of code appears on screen. Press the Break ke}y or Escape key and once again the asterisk at the command bar begins to blink, signalling readiness to accept a new comm}and. Grip has some unusual features which will be described, followed by a listing of available commands, in turn follow}ed by detailed descriptions of these commands complete with examples. Perhaps the most unusual aspect of Grip is the a}vailability of it's code to the user. The program starts at memory address 1536 (decimal) and is found in it's various pi}eces and and parts until memory address 14200. Any or all of it can be disassembled, changed, copied or saved as a file t}o incorporate into other programs. From 14210 to 45820 (User Memory) is memory available for programming or storage of ot}her programs or data for editing or manipulation. Part of this 30K is created by shutting off BASIC and using the Ram opti}on. Unfortunatly this precludes easy access to BASIC routines for study or alteration.If, however, a file of peeked valu}es was made by BASIC of BASIC, this file would serve the same purposes. Of more interest and readily accessible is the en}tire Operating System located from address 49152 to 65535. Note that memory locations and values referred to are in decim}al. Also note that hexadecimal modes are not supported, although hexadecimal or binary conversions are available at the t}ouch of the Tab key. Finally, Grip determines disk density automatically, pemitting reading from single density disks an}d writing to double density disks, or visa-versa. PERIPHERAL SERVICES ___________________ (a) Help Ke}y ------------ The Help key summons onscreen Help pages and is available at any time except during disk drive operation}. There are three pages available which give brief summaries of available features. The Start key pages ahead through the } three pages and the Option key pages back. To return to the program at the same point as before the Help key was pressed,!} press the Select key. (b) Tab Key ----------- The Tab key can be pressed at any time except during disk drive opera"}tion or while using the Help pages. Immediately the cursor will start travelling across the first row of screen display. T#}he bars on this row represent from left to right Binary, Hexadecimal, Decimal, Least Significant Byte, and Most Significa$}nt Byte. Press a "B" and the cursor will stop at the first bar and wait for a binary representation (ones and/or zeros) t%}o be entered. When the Return key is hit, a hexadecimal conversion will appear in the Hex bar, and a decimal conversion wi&}ll appear in the decimal bar. Nothing will appear in the LSB or MSB bars since the LSB would be the same as the decimal v'}alue and the MSB is not required. If an "H" is pressed and a hexadecimal value is entered, all the bars will be filled wi(}th values, the Binary bar containing the binary representation of the LSB. The same is true if a decimal is converted by )}pressing "D" and entering a decimal value. In all cases the Delete/Backspace key provides normal backspacing. Once this s*}ervice is no longer required, press Escape or Break and continue from the same point as before the Tab key was pressed.+} ESCAPE or BREAK _______________ Any operation or function can be aborted at any time by pressing the Br,}eak or Escape key. This will return you to the Command Bar cue. COMMAND SUMMARY _______________ (one) -} Read sector (two) Write sector (three) Read file (four) Write file (five) Disassemble to Screen (six) Disassembl.}e to Printer (seven) Printer Configuration codes (eight) Read Directory (nine) Target Page (ten) Assemble-Edi/}t (1) READ SECTOR --------------- This command allows a single or multiple disk sectors to be stored in User Memory. 0}The format requires the first letters of the command in capitals "RS" followed by the number of the sector to be read eg.1} "RS107". If more than one sector is desired, consecutive sectors can be read if separated by a hyphen eg. "RS107-124". 2}This will read sectors 107 to 124 inclusive. When the Return key is hit, the disk drive will start and do an initial chec3}k to determine density, changing density if required. Then the cursor will start to blink at the MEMORY START-END bar. Thi4}s is a request for the memory location that the desired sectors are to be read into eg. "20000-21005". If less or more me5}mory is allocated than is required by the number of sectors, the smaller requirement will be chosen. This means that if n6}ot enough memory is provided for the number of sectors to be read (this also applies to files too long for the amount of m7}emory space provided), the extra sectors/file will be discarded. Therefore precise blending of program segments is possib8}le. When the memory locations have been entered in the Memory Start-End bar, the disk drive will start again and read th9}e required sector(s) into memory. The Command Bar cue activates when the operation is complete. (2) WRITE SECTOR -----:}----------- This command follows the same format as Read Sector except that this permits writing specific sectors on a d;}isk from the memory location you describe. As always, the first letters of the command in capitals, followed by the perti<}nent sector(s) are required eg. "WS107-124" and then the memory locations in the Memory Start-End bar eg. "20000-21005".=} Sectors can be rewritten in whole or part as long as they are started at the beginning. (3) READ FILE ------------- >}This command follows the same format as Read Sector except that this permits reading of any file eg. "DOS.SYS" into the me?}mory location described. As always, the first letters of the command in capitals, followed by the file name, are required@} eg. "RFDOS.SYS" and then the memory locations in the Memory Start-End bar eg. "20000-21005". (4) WRITE FILE ---------A}----- This command follows the same format as Read File except that this permits writing of any file eg. "NEW.SYS" from B}the memory locations provided. As always, the first letters of the command in capitals, followed by the file name, are reC}quired eg. "WFNEW.SYS" and then the memory locations in the Memory Start-End bar eg. "20000-21005". (5) DISASSEMBLE to D}SCREEN ------------------------- The commands to disassemble will examine the machine language code at chosen memory locE}ations and convert it to assembly language. If a section of disassembly on screen seems nonsensical, press the Option keyF} and the disassembly will start seventeen bytes farther back in memory, possibly picking up instructions which rationalizeG} the original section. Pressing the Start key will present the next screen of disassembly without skipping or overlappiH}ng bytes. Line numbers are not used since actual memory addresses are provided. The command format requires only a startiI}ng address for disassembly, although it will obey an ending address if one is supplied eg. "DS1536" or "DS1536-1556". J}(6) DISASSEMBLE to PRINTER -------------------------- The commands to disassemble will examine the machine language codeK} at chosen memory locations and convert it to assembly language. In this case the disassembly will be sent to the printer L}in the same format as it would appear on screen. Line numbers are not used since actual memory addresses are provided. A M}starting and an ending address must be provided eg. "DP1536-1780". The Option and Start keys will have no effect while dN}isassembling to printer. However if a problem is encountered, press the Escape or Break key to abort the operation. The dO}isassembly is also presented on screen so that the printer can be monitored. In order to control the printed page length P}or type style and other printer options, read heading seven Printer Configuration codes. (7) PRINTER CONFIGURATION CODESQ} ------------------------------- Since all printers have options in the way that the printed page is formatted, Grip allR}ows full advantage to be taken of these by sending fourteen bytes of printer codes before and after each disassembly. TheS}se codes are written by entering "PC" at the command bar prompt. A screen will appear which asks for Printer InitializatiT}on codes. (NOTE : Printer configurization codes are written directly back to the disk therefore be sure the copy of Grip U}does not have a write-protection tab applied.) These are the codes which will be sent to the printer to set it up before iV}t receives data eg. The default codes are for an Epson LX80 and send (a) the reset code (b) set the right margin to 40 cW}olumns (c) set skip over perforation to 10 lines (d) enable the paper out sensor . Each byte must either be changed orX} accepted at it's default setting by hitting the return key. When the last byte is entered, these codes will be written asY} a permanent record and the Printer Termination codes will be presented for editing. The default in this instance is simpZ}ly a form feed to top of next page while forcing the printer buffer to the printer. This fourteen byte group (in this ins[}tance containing only one instruction) is sent at the end of each disassembly before control is returned to the command b\}ar. (8) READ DIRECTORY ------------------ If files are to be read or written to disk a look at the directory is neces]}sary. The command is "RD". This will present the Directory on the disk or garbage if the disk does not have a Dos compatib^}le Directory. The first sector used by the file is presented as well as the total number of sectors used to facilitate re_}building of files if accidentally erased. Grip will read or write to locked files as well as unprotected files but other `}Dos commands are not supported since the Directory can be manipulated directly by reading the VTOC (Volume Table Of Contea}nts) and the Directory into User Memory (Sectors 360 to 368 inclusive). Since all the Directory will not fit on one screb}en, press the Start key for the next screen or Escape/Break to return to the command bar. A feature of Grip permits filenc}ames to be used containing any characters. Therefore, files can be written to a Dos diskette that are unrecognized by Dosd} and unable to be erased by Dos. (9) TARGET PAGE --------------- The Target Page is a record of Branch Targets used ie}n assembly. Targets are named "A" to "Q" and are used as substitutes for addresses when the desired branching address is f}unknown. The command "TP" presents the Targets on screen. If unused, each Target will be capitalized followed by zeros. Ig}f it has been used but is presently unused, it will be followed by the address it represented last. If it is presently beq}(BrGRIP TXTBBGRIP BASSEMBLER BCOPYRIGHT B (c) 1986 BBRUCE HENRYBing used and waiting to be defined, the capital will be inverted followed by zeros or the address it represented last. Inr} this case it will also be counted in the Target bar at the lower right side of the work screen. Finally, if the target is}s displayed as lowercase inverted, this means the target has been pre-defined as the address which follows it. This target}t will not be counted in the Target bar since it has not been put into effect. It can also be re-pre-defined without haviu}ng been used. The use of Targets will be discussed further in the following section on Assembling-Editing. (10) ASSEMBLv}E-EDIT ------------------ When Assembly Language programming is necessary, the command format requires a starting addresw}s in User Memory where the assembled Machine Language can be stored eg."AE20000". It is called assemble-edit because ex}xisting programs or program segments can be read into memory and altered. This can be accomplished by overwriting Machiny}e Language instructions or by using two basic editing aids (a) CONTROL D which will delete a byte at the present memory z}location and pull every value from the top of user memory one byte closer. It also switches the large dot between the word{}s Insert - Delete on and off to indicate when the job has been completed (b) CONTROL I which will insert a NOP [no opera|}tion] instruction at the present memory location and push every value to the top of user memory one byte farther. If the }}top of user memory contains instructions, the last byte will be lost. It also switches the large dot on and off to indica~}te when the job has been completed. When Assembly-Edit is chosen, the address will appear at the top of the work screen }followed by a visible cursor. Assembly language insructions can now be entered one line at a time with the Delete/Backspa}ce key offering normal editing control over that line. Only one instruction may be used per line. When the return key is }hit the appropriate Machine Language instructions will be stored at those memory locations up to the next available memory} location which is then displayed on the next line down on the screen. Spaces can be ignored and commas preceding offset }X or Y are not used. To become familiar with Grip assembly conventions, disassemble thru the Operating System until all t}he addressing modes have appeared. Grip also supports special assembly commands which will now be described. }ASSEMBLY COMMANDS _________________ As well as the complete set of 6502 instructions, Grip also supports five sp}ecial commands. These commands can not be mixed on any one line with each other or with 6502 instructions (except for the} colon and question mark which are used exclusivly with Branch instructions). If they are mixed, the first special command} will be given precedence and all else will be ignored. This does not include CONTROL D or CONTROL I which can be used at} any time during assembly to delete or insert bytes. (a) QUOTATION MARK ["] ---------------------- - This is the comm}and to poke into memory the screen (internal) value of each character that follows until the place where the return key w}as hit. eg. (at address two thousand) 20000 "A screen message This would use 16 bytes and the next available address w}ould be 20016. (b) PERIOD [.] -------------- - This is the command to to poke into memory the value which follows. I}t must not be larger than 256. Consecutive values can be presented if separated by commas eg. (at address two thousand)} 20000 256,255,254,1,2,3,4,5,6 This would use nine bytes and the next available address would be 20009. (c) INVERT}ED ------------ - If Ascii values are required switch on the inverse key and enter the characters. The value of each ch}aracter in inverse will be poked into memory. Since most printers normally don't print inverted characters, this example }will substitute normal letters for inverted eg. (at address 20000) 20000 Remember inverted equals Ascii. This examp}le would use 31 bytes and the next available address would be 20031. (d) QUESTION MARK [?] --------------------- - Th}is command and the next are used exclusively with 6502 Branch instructions. One letter names can be given to undetermined }Branch destination addresses (Targets) and later defined as the addresses are reached. Also, in the case of backwards Bra}nching, the Target can be pre-defined as it is passed (using the colon command) and later resolved as the Branching instr}uction is entered. There are 17 Targets named A to Q. Their status can be checked by entering "TP" in the command bar an}d by the count kept in the Target bar near the lower right of the screen. Targets are named by following the Branch instru}ction with a "?" and the chosen name "A" to "Q" eg. "?F" Targets can be used again once they have been defined. Examples} will be found following a description of the Colon command (next). (e) COLON [:] ------------- - The Colon command }defines those Targets named by Branch instructions. As mentioned, the Targets can also be pre-defined if the address is p}assed before the Branch instruction is reached. This will not prevent it from being pre-defined again if a poor choice wa}s made. The colon followed by the Target name also will define the address named by an earlier Branch instruction (forwar}d branching). This will subtract one from the Target bar count. Targets are defined by entering a ":" followed by the Tar}get name when the desired address has been reached eg. ":B". A short example of assembly language using Targets is shown.} The pre-defined and later named Target will be Target "A" while the Target named and later defined will be Target "H". T}his assembly will start at token address 20000. Note the byte count. 20000 LDY #155 20002 :A 20002 DEY 20003 BE}Q ?B 20005 BNE ?A 20007 :B 20007 JMP (30000) At address 20002 "A" is pre-defined as that address. At address 20003,} "B" is named as the unknown destination of the Branch on Equal instruction. At address 20005, "A" is called up and defin}ed as address 20002 and at address 20007 "B" is defined. If this program segment was now disassembled it would appear as }follows : 20000 LDY #155 20002 DEY 20003 BEQ 20007 20005 BNE 20002 20007 JMP (30000) ------------------------}---------- This covers all the GRIP ASSEMBLER commands and features. If any questions remain that are not covered by this} summary, specific questions can be sent along with a stamped self-addressed envelope to: Bruce Henry, } P.O. Box 172, Woodstock, Ontario, Canada N4S 7W8elope to: Bruce Henry, R