home *** CD-ROM | disk | FTP | other *** search
/ CBM Funet Archive / cbm-funet-archive-2003.iso / cbm / csbruce / lrr100.uua < prev    next >
Encoding:
Text File  |  1993-12-25  |  40.6 KB  |  719 lines

  1. little red reader  vERSION 1.00  [mARCH 7, 1993]
  2.  
  3. ms-dos FILE READER/WRITER FOR THE c128 AND 1571/81.
  4.  
  5. BY cRAIG bRUCE  (CSBRUCE@NEUMANN.UWATERLOO.CA)
  6.  
  7. 1. introduction
  8.  
  9. tHIS ARTICLE PRESENTS A PROGRAM THAT READS AND WRITES ms-dos FILES AND THE
  10. ROOT DIRECTORY OF ms-dos DISKS.  tHE PROGRAM COPIES ONLY FROM DRIVE TO DRIVE
  11. WITHOUT BUFFERING FILE DATA INTERNALLY.  tHIS IS SIMPLER AND IMPOSES NO LIMITS
  12. ON THE SIZE OF THE FILES TRANSFERRED, ALTHOUGH IT REQUIRES THE USE OF TWO DISK
  13. DRIVES (OR A LOGICAL DRIVE).  tHE USER-INTERFACE CODE IS WRITTEN IN basic AND
  14. PRESENTS A FULL-SCREEN FILE SELECTION MENU.  tHE GRUNT-WORK CODE IS WRITTEN IN
  15. ASSEMBLY LANGUAGE AND OPERATES AT MAXIMUM VELOSITY.
  16.  
  17. tHE PROGRAM ALSO ALLOWS ms-dos FILES TO BE DELETED AND TO ALLOWS THE COPYING OF
  18. cOMMODORE-dos FILES BETWEEN cbm-dos DISKS (THIS MAKES IT MORE CONVENIENT TO
  19. USE THE PROGRAM WITH A TEMPORARY LOGICAL DRIVE LIKE ramdos).  aLSO, SINCE i
  20. HAVE RECENTLY ACQUIRED A cmd fd-4000 FLOPPY DISK DRIVE, i KNOW THAT THIS
  21. PROGRAM WORKS WITH ms-dos DISKS WITH THIS DRIVE (BUT ONLY FOR THE 720k
  22. FORMAT).
  23.  
  24. tHE bURST cOMMAND iNSTRUCTION sET OF THE 1571/81 IS USED TO READ THE ms-dos
  25. DISK BLOCKS AND THE STANDARD KERNEL ROUTINES ARE USED FOR OUTPUTTING THE
  26. DATA.  (i AM AN OPERATING SYSTEMS SPECIALIST, SO i CALL IT A KERNeL!)  tHUS,
  27. THE ms-dos FILES MUST BE READ FROM A 1571 OR 1581 DISK DRIVE, BUT THE OUTPUT
  28. DEVICE MAY BE ANY DISK DRIVE TYPE, THE SCREEN OR A PRINTER, OR A VIRTUAL DRIVE
  29. TYPE SUCH AS ramlINK, ramdRIVE, OR ramdos (FOR THE reu).  iT IS INTERESTING TO
  30. NOTE THAT THE DATA CAN BE READ IN FROM AN ms-dos DISK FASTER THAN IT CAN BE
  31. WRITTEN OUT TO A 1571, 1581, OR EVEN A ramdos FILE.  a ramlINK CAN SWALLOW THE
  32. DATA ONLY SLIGHTLY FASTER THAN IT CAN BE READ.
  33.  
  34. lITTLE rED rEADER (lrr) SUPPORTS DOUBLE DENSITY 3.5" DISKS FORMATTED WITH 80
  35. TRACKS, 9 SECTORS PER TRACK, AND 2 SIDES WITH A 1581 AND 5.25" DOUBLE DENSITY
  36. DISKS FORMATTED WITH 40 TRACKS, 9 SECTORS PER TRACK, AND 2 SIDES WITH A 1571.
  37. a LIMIT OF 128 DIRECTORY ENTRIES AND 3 fILE aLLOCATION tABLE (fat) SECTORS IS
  38. IMPOSED.  tHERE MUST BE 2 COPIES OF THE fat AND THE CLUSTER SIZE MAY BE 1 OR 2
  39. SECTORS.  tHE SECTOR SIZE MUST BE 512 BYTES.
  40.  
  41. tHE PROGRAM RUNS ON EITHER THE 40 OR 80-COLUMN SCREENS, BUT YOU WILL GET
  42. MUCH BETTER PERFORMANCE FROM THE basic PORTION OF THE PROGRAM BY BEING
  43. IN 80-COLUMN MODE AND fast MODE.  a MODIFICATION THAT SOMEONE MIGHT WANT
  44. TO MAKE WOULD BE TO SPREAD-OUT THE DISPLAY FOR THE 80-COLUMN SCREEN AND ADD
  45. COLOR TO THE RATHER BLAND DISPLAY.
  46.  
  47. oH, ABOUT THE NAME.  iT IS A PLAY ON THE NAME OF ANOTHER ms-dos FILE COPIER
  48. AVAILABLE FOR THE c-128.  "lITTLE" MEANS THAT IT IS SMALLER IN SCOPE THAN THE
  49. OTHER PROGRAM, AND "rED" IS A DIFFERENT PRIMARY COLOR TO AVOID ANY LEGAL
  50. COMPLICATIONS.  iT IS ALSO THE NON-WHITE COLOR OF THE FLAG OF THE COUNTRY OF
  51. ORIGIN OF THIS PROGRAM (NO, i AM NOT jAPANESE).  aLSO, THIS PROGRAM IS pUBLIC
  52. dOMAIN sOFTWARE, AS IS ALL SOFTWARE i DEVELOP FOR 8-BIT cOMMODORE cOMPUTERS.
  53. fEEL FREE TO e-MAIL ME IF YOU HAVE QUESTIONS OR COMMENTS ABOUT THIS ARTICLE.
  54.  
  55. 2. user guide
  56.  
  57. load AND run THE "LRR.128" basic PROGRAM FILE.  wHEN THE PROGRAM IS FIRST RUN,
  58. IT WILL DISPLAY AN "INITIALIZING" MESSAGE AND WILL LOAD IN THE BINARY MACHINE
  59. LANGUAGE PACKAGE FROM THE "CURRENT" cOMMODORE dos DRIVE (THE CURRENT DRIVE IS
  60. OBTAINED FROM peek(186) - THE LAST DEVICE ACCESSED).  tHE BINARY PACKAGE IS
  61. LOADED ONLY ON THE FIRST RUN AND IS NOT RELOADED ON SUBSEQUENT RUNS IF THE
  62. PACKAGE id FIELD IS IN PLACE.
  63.  
  64. tHE SYSTEM IS DESIGNED TO HAVE TWO FILE SELECTION MENUS: ONE FOR THE ms-dos
  65. DISK DRIVE, AND ONE FOR THE cOMMODORE-dos DISK DRIVE (WHICH MAY BE A LOGICAL
  66. DISK DRIVE).  tHE IDEA FOR COPYING IS THAT YOU SELECT THE FILES IN ONE OF
  67. THESE MENUS, AND THEN PROGRAM KNOWS TO COPY THEM TO THE DISK FOR THE OTHER
  68. MENU.
  69.  
  70. 2.1. ms-dos menu
  71.  
  72. tHE MAIN SCREEN OF THE PROGRAM IS THEN DISPLAYED.  tHE MAIN SCREEN OF THE
  73. PROGRAM WILL LOOK SOMETHING LIKE THIS:
  74.  
  75.    ms-dev=9    ms-type=1581    cbm-dev=8
  76.  
  77.    num  s  trn  typ  filename  ext  length
  78.    ---  -  ---  ---  --------  ---  ------
  79.      1  *  asc  seq  hack4     txt  120732
  80.      2     bin  prg  ramdos    sfx   34923
  81.  
  82.    d=directory  m=ms-dev  f=cbm-dev q=quit
  83.    t=toggle-column, c=copy-files, +/- page
  84.  
  85. EXCEPT THAT IMMEDIATELY AFTER STARTING UP, "<DIRECTORY NOT LOADED>" WILL BE
  86. DISPLAYED RATHER THAN FILENAMES.  tHE "ms-dev" AND "ms-type" FIELDS GIVE THE
  87. DEVICE NUMBER AND TYPE OF THE DRIVE CONTAINING THE ms-dos DISK TO COPY FROM,
  88. AND THE "cbm-dev" GIVES THE DEVICE NUMBER OF THE DRIVE/VIRTUAL DRIVE/CHARACTER
  89. DEVICE TO COPY FILE DATA TO.  tHE NUMBER OF BYTES FREE ON THE DRIVE ARE ALSO
  90. DISPLAYED (WHICH IS USEFUL TO KNOW WHEN WRITING FILES) AND THERE ARE SOME MORE
  91. COMMANDS.
  92.  
  93. iNFORMATION ABOUT ALL ms-dos FILES IN THE ROOT DIRECTORY OF THE ms-dos DISK IS
  94. DISPLAYED IN COLUMNS BELOW THE DRIVE INFORMATION.  "num" GIVES THE NUMBER OF
  95. THE ms-dos FILE IN THE DIRECTORY LISTING, AND "s" INDICATES WHETHER THE FILE
  96. IS "SELECTED" OR NOT.  iF THE FILE IS SELECTED, AN ASTERISK (*) IS DISPLAYED;
  97. OTHERWISE, A BLANK IS DISPLAYED.  wHEN YOU LATER ENTER cOPY mODE, ONLY THE
  98. FILES THAT HAVE BEEN "SELECTED" ARE COPIED.
  99.  
  100. tHE "trn" FIELD INDICATES THE CHARACTER TRANSLATION SCHEME TO BE USED WHEN THE
  101. FILE IS COPIED.  a VALUE OF "bin" (BINARY) MEANS NO TRANSLATION AND A VALUE OF
  102. "asc" (ASCII) MEANS THE FILE CHARACTERS ARE TO BE TRANSLATED FROM ms-dos ascii
  103. (OR "ascii-cRlF") TO petscii.  tHE "typ" FIELD INDICATES THE TYPE OF
  104. cOMMODORE-dos FILE TO CREATE FOR WRITING THE ms-dos FILE CONTENTS INTO.  tHE
  105. POSSIBLE VALUES ARE "seq" (SEQUENTIAL) AND "prg" (PROGRAM).  tHE VALUES OF THE
  106. trn AND typ FILEDS ARE SET INDEPENDENTLY, SO YOU CAN COPY BINARY DATA TO seq
  107. FILES AND ASCII DATA TO prg FILES IF YOU WISH.
  108.  
  109. tHE "filename" AND "ext" FIELDS GIVE THE FILENAME AND EXTENSION TYPE OF THE
  110. ms-dos FILES AND "length" GIVES THE EXACT LENGTH OF THE FILES IN BYTES.  nOTE
  111. THAT IF YOU PERFORM "asc" TRANSLATION ON A FILE, ITS petscii VERSION WILL HAVE
  112. A SHORTER LENGTH.
  113.  
  114. 2.2. user commands
  115.  
  116. tHE BOTTOM OF THE SCREEN GIVES THE COMMAND SUMMARY.  aFTER STARTING THE
  117. PROGRAM, YOU WILL WANT TO SETUP THE ms-dos AND cbm-dos DRIVES WITH THE "m" AND
  118. "f" COMMANDS.  sIMPLY PRESS THE (LETTER) KEY CORRESPONDING TO THE COMMAND
  119. NAME TO ACTIVATE THE COMMAND.  pRESSING m WILL PROMPT YOU FOR THE ms-dos dRIVE
  120. nUMBER AND THE ms-dos dRIVE tYPE.  iN BOTH CASES, TYPE THE NUMBER AND PRESS
  121. return.  (sORRY FOR INSULTING ALL NON-NOVICES OUT THERE, BUT i WANT TO BE
  122. COMPLETE).  tHE ms-dos DRIVE NUMBER CANNOT BE THE SAME AS THE cbm-dos DRIVE
  123. NUMBER (SINCE THE PROGRAM COPIES FROM DRIVE-TO-DRIVE WITHOUT INTERNAL
  124. BUFFERING).  fOR THE DRIVE TYPE, ENTER AN "8", "81", OR "1581" FOR A 1581
  125. DRIVE OR ANYTHING ELSE FOR A 1571 DRIVE.
  126.  
  127. pRESSING f WILL PROMPT YOU FOR THE cbm-dos DEVICE NUMBER.  yOU MAY ENTER A
  128. NUMBER FROM 0 TO 30, EXCEPT THAT IT MUST NOT BE THE ms-dos DRIVE NUMBER.
  129. eNTER A "1" FOR cASSETTE dRIVE (gOD FORBID!), A "3" FOR THE SCREEN, A "4" FOR
  130. THE PRINTER (WITH AN AUTOMATIC SECONDARY ADDRESS OF 7 (LOWERCASE)), ANY NUMBER
  131. ABOVE 7 FOR A cOMMODORE DISK DRIVE OR SPECIAL VIRTUAL DRIVE, OR A VALUE OF "0"
  132. FOR THE SPECIAL "NULL" DRIVE.  a cbm-dev VALUE OF 0 WILL CASE THE PROGRAM TO
  133. READ ms-dos FILES AND DO NOTHING WITH THE OUTPUT.  yOU CAN USE THIS FEATURE TO
  134. CHECK OUT THE RAW READING SPEED OF THE PROGRAM.
  135.  
  136. aFTER SETTING UP THE DRIVES, PRESS d TO READ IN THE ROOT DIRECTORY OFF THE
  137. ms-dos DISK.  tHE DATA WILL COME BLAZING IN FROM THE DISK BUT basic WILL TAKE
  138. ITS GOOD OLE TIME SIFTING THROUGH IT.  fILENAMES ARE DISPLAYED ON THE SCREEN
  139. AS THEY ARE SCANNED IN.  tHE PROGRAM WILL (EVENTUALLY) RETURN TO THE MAIN
  140. SCREEN AND DISPLAY THE FORMATTED FILE INFORMATION.  oNE NOTE: THE PROCESS OF
  141. LOGGING IN A 1581 ms-dos DISK TAKES ABOUT 12 SECONDS (ON MY 1581, ANYWAY), SO
  142. BE PATIENT.  aN ms-dos DISK WILL HAVE TO BE "LOGGED IN" EVERY TIME YOU CHANGE
  143. ms-dos DISKS.  (dISKS ARE LOGGED IN AUTOMATICALLY).
  144.  
  145. a COUPLE OF NOTES ABOUT ACCESSING ms-dos DISKS: DON'T TRY TO ACCESS A DEVICE
  146. THAT IS NOT PRESENT BECAUSE THE MACHINE LANGUAGE ROUTINES CANNOT HANDLE THIS
  147. ERROR FOR SOME REASON AND WILL LOCK UP, REQUIRING A stop+restore.  aLSO, MAKE
  148. SURE THAT AN ACTUAL ms-dos DISK IS LOADED INTO THE DRIVE.  iF YOU ACCIDENTALLY
  149. PLACE cOMMODORE-dos DISK INTO THE ms-dos DRIVE, THE 1581 WILL REPORT AN
  150. INVALID BOOT PARAMETERS ERROR (#60), BUT A 1571 WILL LOCK UP (SINCE i DON'T
  151. CHECK THE SECTOR SIZE AND MY BURST ROUTINES ARE EXPECTING 512 BYTES TO COME
  152. OUT OF A SECTOR WHEREAS cOMMODORE DISKS HAVE ONLY 256 BYTES PER SECTOR).
  153.  
  154. nOW YOU ARE READY TO PICK WHAT FILES YOU WANT COPIED AND HOW YOU WANT THEM
  155. COPIED.  yOU WILL NOTICE THAT A "CURSOR" APPEARS IN THE "s" COLUMN OF THE
  156. FIRST FILE.  yOU MAY MOVE THE CURSOR AROUND WITH THE CURSOR KEYS: up, down,
  157. left, right, home, AND clr.  clr (shift-home) WILL MOVE THE CURSOR BACK TO THE
  158. FIRST FILE ON THE FIRST SCREEN.  yOU CAN MOVE THE CURSOR AMONG THE SELECT,
  159. TRANSLATION, AND FILE-TYPE COLUMNS OF ALL THE FILES.  pRESSING A space OR A
  160. return WILL TOGGLE THE VALUE OF THE FIELD THAT THE CURSOR IS ON.  tO TOGGLE
  161. ALL OF THE VALUES OF THE "CURSOR" COLUMN (INCLUDING FILES ON ALL OTHER
  162. SCREENS), PRESS t.  yOU WILL NOTICE THAT MOVING THE CURSOR AROUND AND TOGGLING
  163. FIELDS IS A BIT SLUGGISH, ESPECIALLY IF YOU ARE IN sLOW MODE ON THE 40-COLUMN
  164. SCREEN.  dID i MENTION THAT THIS PROGRAM WILL RUN ON EITHER THE 40 OR
  165. 80-COLUMN SCREEN?  tOGGLING AN ENTIRE COLUMN CAN TAKE A COUPLE OF SECONDS.
  166.  
  167. iF THERE ARE MORE THAN 18 ms-dos FILES, YOU CAN PRESS THE "+" AND "-" KEYS TO
  168. MOVE AMONG ALL OF THE SCREENS OF FILES.  tHE CURSOR MOVEMENT KEYS WILL WRAP
  169. AROUND ON THE CURRENT SCREEN.  "+" IS PAGE FORWARD, AND "-" IS PAGE BACKWARD.
  170. tHE SCREENS WRAP AROUND TOO.
  171.  
  172. aFTER YOU HAVE SELECTED ALL OF THE FILES YOU WANT TO COPY AND THEIR TRANSLATION
  173. AND FILE-TYPE FIELDS HAVE BEEN SET, PRESS THE c KEY TO GO INTO cOPY mODE (NEXT
  174. SECTION).  aFTER COPYING, YOU ARE RETURNED TO THE MAIN SCREEN WITH ALL OF THE
  175. FIELD SETTINGS STILL INTACT.  tO EXIT FROM THE PROGRAM, PRESS q.
  176.  
  177. aDDITIONAL COMMANDS ARE: "r" (REMOVE == DELETE), "/" (CHANGE MENU), AND "x"
  178. (COPY cbm FILES == "xEROX").
  179. tHE REMOVE COMMAND IS USED TO DELETE SELECTED FILES FROM THE ms-dos DISK.
  180. aFTER SELECTING THIS OPTION, YOU WILL GET AN ANNOYING "ARE YOU SURE" QUESTION
  181. AND THE THE SELECTED FILES WILL QUICKLY DISAPPEAR AND THE CHANGES WILL FINALLY
  182. BE WRITTEN TO DISK.  dELETING A BATCH OF ms-dos FILES IS MUCH QUICKER THAN
  183. DELETING cOMMODORE-dos FILES SINCE ms-dos DISKS USE A fILE aLLOCATION tABLE
  184. RATHER THAN THE LINKED LIST OF BLOCKS ORGANIZATION THAT cbm USES.  iN ORDER TO
  185. MAKE THE basic PROGRAM EXECUTE QUICKER, AFTER DELETING, THE ORIGINAL ORDER OF
  186. THE FILENAMES IN THE DIRECTORY LISTING WILL BE CHANGED.  bE FOREWARNED THAT
  187. THE DELETE OPERATION IS NON-RECOVERABLE.
  188.  
  189. tHE CHANGE MENU COMMAND IS USED TO MOVE BACK AND FORTH BETWEEN THE cOMMODORE-
  190. dos AND ms-dos MENUS.
  191.  
  192. 2.3. copying ms-dos to cbm-dos
  193.  
  194. wHEN YOU ENTER COPY MODE, THE SCREEN WILL CLEAR AND THE NAME OF EACH SELECTED
  195. FILE IS DISPLAYED AS IT IS BEING COPIED.  iF AN ERROR IS ENCOUNTERED ON EITHER
  196. THE ms-dos OR cbm-dos DRIVE DURING COPYING, AN ERROR MESSAGE WILL BE DISPLAYED
  197. AND COPYING WILL CONTINUE (AFTER YOU PRESS A KEY FOR ms-dos ERRORS).
  198.  
  199. tO GENERATE A cbm-dos FILENAME FROM AN ms-dos FILENAME, THE EIGHT FILENAME
  200. CHARACTERS ARE TAKEN (INCLUDING SPACES) AND A DOT (.) AND THE THREE CHARACTERS
  201. OF THE EXTENSION ARE APPENDED.  tHEN, ALL SPACES ARE REMOVED, AND IF THE NAME
  202. ENDS WITH A DOT (.) CHARACTER, THEN THAT DOT CHARACTER IS REMOVED AS WELL.  i
  203. THINK THIS IS FAIRLY REASONABLE.
  204.  
  205. iF THERE ALREADY IS A FILE WITH THE SAME FILENAME ON THE cbm-dos DISK, THEN
  206. YOU WILL BE PROMPTED IF YOU WANT TO OVERWRITE THE FILE OR NOT.  eNTERING AN
  207. "N" WILL ABORT THE COPYING OF THAT FILE AND GO ON TO THE NEXT FILE, AND
  208. ENTERING A "Y" (OR ANYTHING ELSE) WILL CAUSE THE cbm-dos FILE TO BE
  209. "SCRATCHED" AND THEN RE-WRITTEN.
  210.  
  211. tHE PHYSICAL COPYING OF THE FILE IS DONE COMPLETELY IN MACHINE LANGUAGE AND
  212. NOTHING IS DISPLAYED ON THE SCREEN WHILE THIS IS HAPPENING, BUT YOU CAN FOLLOW
  213. THINGS BY LOOKING AT DAS BLINKIN LICHTES AND LISTENING FOR CLICKS AND GRINDS.
  214. yOU WILL PROBABLY BE SURPRISED BY THE ms-dos FILE READING SPEED (i MEAN IN A
  215. GOOD WAY).  tHE DISK DATA IS READ IN WHOLE TRACKS AND CACHED IN MEMORY AND THE
  216. DIRECTORY INFORMATION AND THE fat ARE RETAINED IN MEMORY AS WELL.  tHE RESULT
  217. IS THAT MINIMAL TIME IS SPENT READING DISK DATA, AND NO COSTLY SEEKS ARE
  218. REQUIRED FOR OPENING A NEW ms-dos FILE.  a RESULT IS THAT SMALL FILES ARE
  219. COPIED ONE AFTER ANOTHER VERY QUICKLY.  yOU WILL HAVE TO WAIT, HOWEVER, ON THE
  220. RELATIVELY SLOW STANDARD KERNEL/cOMMODORE-dos FILE WRITING.
  221.  
  222. a FEW CHANGES HAD TO BE MADE TO THE PROGRAM TO ACCOMODATE THE ramdos PROGRAM.
  223. ramdos USES MEMORY FROM $2300 TO $3fff OF ram0, WHICH IS NOT REALLY A GOOD
  224. PLACE FOR A DEVICE DRIVER, AND IT USES SOME OF THE ZERO-PAGE LOCATIONS THAT i
  225. WANTED TO USE.  bUT, DIFFICULTIES WERE OVERCOME.  tHE IMPORTANCE OF ramdos
  226. COMPATIBILITY IS THAT IF YOU ONLY HAVE ONE DISK DRIVE BUT YOU HAVE AN reu, YOU
  227. CAN USE ramdos TO STORE THE ms-dos FILES TEMPORARILY.  iF YOU ONLY HAVE ONE
  228. DISK DRIVE AND NO reu, YOU ARE sol (oUT OF lUCK) UNLESS YOU CAN GET A
  229. rAMdISK-TYPE PROGRAM FOR AN UNEXPANDED 128.  tHE ramdos PROGRAM IS AVAILABLE
  230. FROM ftp SITE "CCOSUN.CALTECH.EDU" IN FILE "/PUB/RKNOP/UTIL128/RAMDOSII.SFX".
  231. oNE NOTE i FOUND OUT ABOUT ramdos: YOU CANNOT USE A
  232.  
  233. dopen#1,(cf$),u(cd),w
  234.  
  235. WITH IT LIKE YOU ARE SUPPOSED TO BE ABLE TO; YOU HAVE TO USE A
  236.  
  237. dopen#1,(cf$+",w"),u(cd)
  238.  
  239. hERE IS A TABLE OF COPYING SPEEDS FOR COPYING FROM 1571S AND 1581S WITH asc
  240. AND bin TRANSLATION MODES.  aLL FIGURES ARE IN BYTES/SECOND.  tHESE RESULTS
  241. WERE OBTAINED FROM COPYING A 127,280 BYTE TEXT FILE (THE TEXT OF c= hACKING
  242. iSSUE #3).
  243.  
  244.    from  \ to: "NULL"     ramlINK     ramdos     jd1581     jd1571
  245.    -------+    ------     -------     ------     ------     ------
  246.    81-BIN {$7c}      5772        3441       2146        N/A        644
  247.    81-ASC {$7c}      5772        3434       2164        N/A        661
  248.    71-BIN {$7c}      4323        2991       1949       1821        N/A
  249.    71-ASC {$7c}      4323        2982       1962       1847        N/A
  250.  
  251. tHE "NULL" DEVICE IS THAT "0" cbm-dos DEVICE NUMBER, AND A COUPLE OF ENTRIES
  252. ARE "N/A" SINCE i ONLY HAVE ONE 1571 AND ONE 1581.  nOTE THAT MY 71 AND 81 ARE
  253. jIFFYdos-IFIED, SO THE PERFORMANCE OF A STOCK 71/81 WILL BE POORER.  jIFFYdos
  254. GIVES ABOUT A 2X PERFORMANCE IMPROVEMENT FOR THE STANDARD FILE ACCESSING CALLS
  255. (OPEN, CLOSE, CHRIN, CHROUT).  ramdos DOESN'T SEEM TO BE AS SNAPPY AS YOU
  256. MIGHT THINK.
  257.  
  258. tHE "NULL" FIGURES ARE QUITE IMPRESSIVE, BUT THE RAW SECTOR READING SPEED
  259. WITHOUT THE OVERHEAD OF MUCKING AROUND WITH FILE ORGANIZATION IS 6700
  260. BYTES/SEC FOR A 1581 AND 4600 b/S FOR A 71.  tHE REASON THAT THE 1571 OPERATES
  261. SO QUICKLY IS THAT i USE A SECTOR INTERLEAVE OF 4 (WHICH IS OPTIMAL) FOR
  262. READING THE TRACKS.  i THINK THAT OTHER ms-dos FILE COPIER PROGRAM USES AN
  263. INTERLEAVE OF 1 (WHICH IS NOT OPTIMAL).  i LOSE SOME OF THE RAW PERFORMANCE
  264. BECAUSE i COPY THE FILE DATA INTERNALLY ONCE BEFORE OUTPUTTING IT (TO SIMPLIFY
  265. SOME OF THE CODE).
  266.  
  267. iN A COUPLE OF PLACES YOU WILL NOTICE THAT asc TRANSLATION GIVES SLIGHTLY
  268. BETTER OR SLIGHTLY WORSE PERFORMANCE THAN bin.  tHIS IS BECAUSE ALTHOUGH
  269. SLIGHTLY MORE WORK IS REQUIRED TO TRANSLATE THE CHARACTERS, SLIGHTLY FEWER
  270. CHARACTERS WILL HAVE TO BE WRITTEN TO THE cbm-dos FILE, SINCE petscii USES
  271. ONLY cr WHERE ms-dos ascii USES cr AND lf TO REPRESENT END-OF-LINE.
  272. tRANSLATION IS DONE BY USING A TABLE (THAT YOU CAN CHANGE IF YOU WISH).  mANY
  273. ENTRIES IN THIS TABLE CONTAIN A VALUE OF ZERO, WHICH MEANS THAT NO CHARACTER
  274. WILL BE OUTPUT ON TRANSLATION.  mOST OF THE CONTROL CHARACTERS AND ALL OF THE
  275. CHARACTERS OF VALUE 128 (0X80) OR GREATER ARE THROWN AWAY ON BEING
  276. TRANSLATED.  tHE TABLE IS SET UP SO THAT cr CHARACTERS ARE THROWN AWAY AND THE
  277. lf CHARACTER IS TRANSLATED TO A cbm-dos cr CHARACTER.  tHUS, BOTH ms-dos ascii
  278. FILES AND unix ascii FILES CAN BE TRANSLATED CORRECTLY.
  279.  
  280. 2.4. commodore-dos menu
  281.  
  282. tHE cOMMODORE-dos MENU, WHICH DISPLAYS THE NAMES OF THE cOMMODORE FILES
  283. SELECTED FOR VARIOUS OPERATIONS, LOOKS AND WORKS PRETTY MUCH THE SAME AS
  284. THE ms-dos MENU:
  285.  
  286.    cbmdos  ms=10:1581  cbm=8  free=3211476
  287.  
  288.    num  s  trn  filename         t  length
  289.    ---  -  ---  ---------------- -  ------
  290.      1  *  bin  lrr-128          p    9876
  291.      2     asc  com-hacking-005  s  175412
  292.  
  293.    d=dir m=msdev f=cbmdev c=copy q=quit
  294.    t=toggle r=remove x=cbmcpy /=menu +-=pg
  295.  
  296. yOU'LL NOTICE, HOWEVER, THAT THE FILETYPE FIELD ("t" HERE) IS MOVED AND IS
  297. UNCHANGABLE.  aLSO, THE FILE LENGTHS ARE NOT EXACT; THEY ARE REPORTED AS THE
  298. BLOCK COUNT OF THE FILE MULTIPLIED BY 254.  tHIS MENU IS NOT MAINTAINED FOR
  299. FILES BEING COPIED TO THE cbm-dos DISK FROM AN ms-dos DISK.  yOU'LL
  300. HAVE TO RE-EXECUTE THE dIRECTORY INSTRUCTION TO GET AN UPDATED LISTING.
  301.  
  302. tHE "d" (DIRECTORY) COMMAND HAS LOCAL EFFECT WHEN IN THIS MENU.  tHE
  303. cOMMODORE-dos DIRECTORY WILL BE LOADED FROM THE CURRENT cbm DEVICE NUMBER.
  304. nOTE THAT IN ORDER FOR THIS TO WORK, THE cbm DEVICE MUST BE NUMBER EIGHT
  305. OR GREATER (A DISK DRIVE).  oRIGINALLY, THE SUBROUTINE FOR THIS COMMAND WAS
  306. WRITTEN USING ONLY get#'S FROM THE DISK AND WAS VERY SLOW.  iT WAS MODIFIED,
  307. HOWEVER, TO CALL A MACHINE LANGUAGE SUBROUTINE TO READ THE INFORMATION FOR
  308. A DIRECTORY ENTRY FROM THE DIRECTORY LISTING, AND HENCE THE SUBROUTINE NOW
  309. OPERATES AT A TOLERABLE SPEED.
  310.  
  311. tHE "c" (COPY) COMMAND ALSO HAS A DIFFERENT MEANING WHEN IN THIS MENU.  iT
  312. MEANS TO COPY THE SELECTED cbm FILES TO THE ms-dos DISK.  sEE DETAILS BELOW.
  313.  
  314. tHE COPY cbm FILES ("x") COMMAND IS USED TO COPY THE FILES IN THE cbm-dos MENU
  315. TO ANOTHER cbm-dos DISK UNIT.  sELECT THE FILES YOU WANT TO COPY AND THEN
  316. PRESS x.  yOU WILL THEN BE ASKED WHAT DEVICE NUMBER YOU WANT TO COPY THE FILES
  317. TO.  tHE DEVICE CAN BE ANOTHER DISK DRIVE OR ANY OTHER DEVICE (EXCEPT THE
  318. KEYBOARD).  uSING DEVICE NUMBER 0 DOES NOT MEAN THE "NULL" DEVICE AS IT DOES
  319. WITH COPYING ms-dos TO cbm.  iF YOU ARE COPYING TO A DISK DEVICE AND THE FILE
  320. ALREADY EXISTS, THEN YOU WILL BE ASKED IF YOU WISH TO OVERWRITE THE FILE.  yOU
  321. CANNOT COPY TO THE SAME DISK UNIT.  aLSO, ALL FILES ARE COPIED IN BINARY MODE
  322. (REGARDLESS OF WHAT TRANSLATION YOU HAVE SELECTED FOR A FILE).
  323.  
  324. tHE COPY cbm FILES COMMAND WAS INCLUDED SINCE ALL OF THE LOW-LEVEL GEAR
  325. NEEDED TO IMPLEMENT IT (SPECIFICALLY "COMMIEiN" AND "COMMIEoUT" BELOW) WAS
  326. ALSO REQUIRED BY OTHER FUNCTIONS.  tHIS COMMAND CAN BE VERY CONVENIENT WHEN
  327. WORKING WITH ramdos.  fOR EXAMPLE, IF YOU ONLY HAD A 1571 AS DEVICE 8 BUT YOU
  328. HAVE A ram EXPANDER AND HAVE INSTALLED ramdos AS DEVICE 9, THEN YOU WOULD
  329. COPY ms-dos FILES TO ramdos USING THE ms-dos MENU, AND THEN YOU WOULD GO TO
  330. THE cOMMODORE-dos MENU ("/"), READ THE DIRECTORY, SELECT ALL FILES, INSERT AN
  331. cOMMODORE-dos DISKETTE INTO YOUR 1571, AND THEN USE "x" TO COPY FROM THE
  332. ramdos DEVICE TO THE 1571.
  333.  
  334. tHE REMOVE COMMAND ("r") DOES NOT WORK FOR THIS DIRECTORY.  yOU CAN scratch
  335. YOUR cbm-dos FILES YOUR DAMN SELF.
  336.  
  337. 2.5. copy cbm-dos to ms-dos
  338.  
  339. bEFORE YOU CAN COPY SELECTED cbm-dos FILES TO AN ms-dos DISK, THE ms-dos DISK
  340. DIRECTORY MUST BE ALREADY LOADED (FROM THE ms-dos MENU).  tHIS IS REQUIRED
  341. SINCE THE DIRECTORY AND fat INFORMATION ARE KEPT IN MEMORY AT ALL TIMES DURING
  342. THE EXECUTION OF THIS PROGRAM.
  343.  
  344. wHEN YOU ENTER COPY MODE, THE SCREEN WILL CLEAR AND THE NAME OF EACH SELECTED
  345. FILE IS DISPLAYED AS IT IS BEING COPIED.  iF AN ERROR IS ENCOUNTERED ON EITHER
  346. THE ms-dos OR cbm-dos DRIVE DURING COPYING, AN ERROR MESSAGE WILL BE DISPLAYED
  347. AND COPYING WILL CONTINUE (AFTER YOU PRESS A KEY FOR ms-dos ERRORS).  pLEASE
  348. NOTE THAT NOT A WHOLE LOT OF EFFORT WAS PUT INTO ERROR RECOVERY.
  349.  
  350. tO GENERATE AN ms-dos FILENAME FROM AN cbm-dos FILENAME, THE FOLLOWING
  351. ALGORITHM IS USED.  tHE FILENAME IS SEARCHED FROM RIGHT TO LEFT FOR THE LAST
  352. "." CHARACTER.  iF THERE IS NO "." CHARACTER, THEN THE ENTIRE FILENAME, UP TO
  353. 11 CHARACTERS, IS USED AS THE ms-dos FILENAME.  cHARACTERS 9 TO 11 WILL BE
  354. USED AS THE EXTENSION.  iF THERE IS A "." CHARACTER, THE ALL CHARACTERS BEFORE
  355. IT, UP TO EIGHT, WILL BE USED AS THE ms-dos FILENAME AND ALL CHARACTERS AFTER
  356. THE FINAL ".", UP TO THREE, WILL BE USED AS THE ms-dos EXTENSION.
  357.  
  358. tHEN, THE NEWLY GENERATED ms-dos FILENAME IS SCANNED FOR ANY EXTRA "."
  359. CHARACTERS OR EMBEDDED SPACES.  iF ANY ARE FOUND, THEY ARE REPLACED BY THE
  360. UNDERSCORE CHARACTER ("_", WHICH IS THE BACKARROW CHARACTER ON A cOMMODORE
  361. DISPLAY).  fINALLY, ALL TRAILING UNDERSCORES ARE REMOVED FROM THE END OF BOTH
  362. THE FILENAME AND EXTENSION PORTIONS OF THE ms-dos FILENAME.  aLSO, ALL
  363. CHARACTERS ARE CONVERTED TO LOWERCASE petscii (WHICH IS UPPERCASE ascii) WHEN
  364. THEY ARE COPIED INTO THE ms-dos FILENAME.  nOTE THAT IF THE cOMMODORE FILENAME
  365. IS NOT IN THE 8/3 FORMAT OF ms-dos, THEN SOMETHING IN THE NAME MAY BE LOST.
  366. sOME EXAMPLES OF FILENAME CONVERSION FOLLOW:
  367.  
  368. cbm-dos filename       ms-dos filename
  369. ----------------       ---------------
  370. "LRR.BIN"              "LRR.BIN"
  371. "LRR.128.BIN"          "LRR_128.BIN"
  372. "HELLO THERE.TEXT"     "HELLO_TH.TEX"
  373. "LONG_FILENAME"        "LONG_FIL.ENA"
  374. "FILE 1..3.S__5"       "FILE_1.S"
  375.  
  376. iT WOULD HAVE BEEN TIME-CONSUMING TO HAVE THE PROGRAM SCAN THE ms-dos
  377. DIRECTORY FOR A FILENAME ALREADY EXISTING ON THE DISK, SO lrr WILL PUT
  378. MULTIPLE FILES ON A DISK WITH THE SAME FILENAME WITHOUT COMPLAINING.  tHIS
  379. ALSO GETS RID OF THE PROBLEM OF ASKING YOU IF YOU WANT TO OVERWRITE THE OLD
  380. FILE OR GENERATE A NEW NAME.  hOWEVER, IN ORDER TO RETRIEVE THE FILE FROM
  381. DISK ON AN ms-dos MACHINE, YOU WILL PROBABLY HAVE TO USE THE rename COMMAND TO
  382. RENAME THE FIRST VERSIONS OF THE FILE ON THE DISK TO SOMETHING ELSE SO ms-dos
  383. WILL SCAN FURTHER IN THE DIRECTORY FOR THE LAST VERSION OF THE FILE WITH THE
  384. SAME FILENAME.  tHERE IS NO RENAME COMMAND IN lrr BECAUSE i NEVER THOUGHT OF
  385. IT IN TIME.  iT WOULD HAVE BEEN FAIRLY EASY TO PUT IN.
  386.  
  387. tHE DATE GENERATED FOR A NEW ms-dos FILE WILL BE ALL ZEROS.  sOME SYSTEMS
  388. INTERPRET THIS AS 12:00 AM, 01-jAN-80 AND OTHERS DON'T DISPLAY A DATE AT ALL
  389. FOR THIS VALUE.
  390.  
  391. tHE PHYSICAL COPYING OF THE FILE IS DONE COMPLETELY IN MACHINE LANGUAGE AND
  392. NOTHING IS DISPLAYED ON THE SCREEN WHILE THIS IS HAPPENING, BUT YOU CAN FOLLOW
  393. THINGS BY LOOKING AT THE BLINKING LIGHTS AND LISTENING FOR CLICKS AND GRINDS.
  394.  
  395. sINCE THE fat AND DIRECTORY ARE MAINTAINED IN ram DURING THE ENTIRE COPYING
  396. PROCESS AND ARE ONLY FLUSHED TO DISK AFTER THE ENTIRE BATCH OF FILES ARE
  397. COPIED, COPYING IS MADE MORE EFFICIENT, SINCE THERE WILL BE NO COSTLY SEEK
  398. BACK TO TRACK 0 AFTER WRITING EACH FILE (LIKE ms-dos DOES).  iF YOU HAVE A
  399. NUMBER OF SMALL FILES TO COPY, THEN THEY WILL BE KNOCKED OFF IN QUICK
  400. SUCCESSION, FASTER THAN MANY ms-dos MACHINES WILL COPY THEM.
  401.  
  402. tO SIMPLIFY THE IMPLEMENTATION, THE CURRENT TRACK OF DISK BLOCKS FOR WRITING
  403. IS NOT MAINTAINED LIKE IT IS FOR READING.  aLSO, A WRITING INTERLEAVE OF 1:1
  404. IS USED FOR A 1571, WHICH IS NOT OPTIMAL.  hOWEVER, SINCE WRITING IS SUCH A
  405. SLOW OPERATION ANYWAY, AND SINCE THE 1571 IS PARTICULARLY BAD BY INSISTING ON
  406. VERIFYING BLOCKS, NOT MUCH MORE OVERHEAD IS INTRODUCED THAN IS ALREADY
  407. PRESENT.
  408.  
  409. aN INTERESTING NOTE ABOUT WRITING ms-dos DISKS IS THAT YOU CAN TERMINATE lrr
  410. IN THE MIDDLE OF A COPY (WITH stop+restore) OR IN THE MIDDLE OF COPYING A
  411. BATCH OF FILES, AND THE ms-dos DISK WILL REMAIN IN A PERFECTLY CONSISTENT
  412. STATE AFTERWARDS.  tHE STATE WILL BE AS IF NONE OF THE FILES WERE COPIED.  tHE
  413. REASON IS THAT THE CONTROL INFORMATION (THE fat AND DIRECTORY) IS MAINTAINED
  414. INTERNALLY AND IS FLUSHED ONLY AFTER COPYING IS ALL COMPLETED.  bUT DON'T
  415. TERMINATE lrr WHILE IT IS FLUSHING THE CONTROL INFORMATION.
  416.  
  417. hERE IS A TABLE OF COPYING SPEEDS FOR COPYING TO 1571, 1581, AND cmd fd-4000
  418. DISK UNITS WITH asc AND bin TRANSLATION MODES.  aLL FIGURES ARE IN BYTES/
  419. SECOND, WHICH INCLUDES BOTH READING THE BYTE FROM A c= DISK AND WRITING IT TO
  420. THE ms-dos DISK.  tHE AVERAGE SPEED FOR EITHER THE READ OR WRITE OPERATION
  421. INDIVIDUALLY WILL BE TWICE THE SPEED GIVEN BELOW.  tHESE RESULTS WERE OBTAINED
  422. FROM COPYING A 156,273 BYTE TEXT FILE (THE TEXT OF c= hACKING iSSUE #4).
  423.  
  424.    from   \ to: fd-BIN     fd-ASC     81-BIN     81-ASC     71-BIN     71-ASC
  425.    --------+    ------     ------     ------     ------     ------     ------
  426.    ramlINK {$7c}     2,332      2,200      2,332      2,200      1,594      1,559
  427.    ramdos  {$7c}     1,070      1,053      1,604      1,600      1,561      1,510
  428.    fd4000  {$7c}         -          -      1,645      1,597      1,499      1,464
  429.    jd1581  {$7c}     1,662      1,619          -          -      1,474      1,440
  430.    jd1571  {$7c}     1,050      1,024        953        933          -          -
  431.  
  432. tHESE FIGURES ARE FOR TRANSFER SPEED ONLY, NOT COUNTING THE COUPLE OF SECONDS
  433. OF OPENING FILES AND FLUSHING THE DIRECTORY.  nOTE THAT ALL MY PHYSICAL DRIVES
  434. ARE jIFFYdos-IFIED, SO YOUR PERFORMANCE MAY BE SLOWER.  i AM AT A LOSS TO
  435. EXPLAIN WHY AN fd-4000 IS SO MUCH SLOWER THAN A 1581 FOR COPYING FROM A
  436. ramdos FILE, BUT THE SAME SPEED OR BETTER FOR COPYING FROM ANYTHING ELSE.
  437.  
  438. 3. uuencoded files
  439.  
  440. hERE ARE THE BINARY EXECUTABLES IN UUENCODED FORM.  tHE crc32S OF THE TWO
  441. FILES ARE AS FOLLOWS:
  442.  
  443. CRC32 = 3896271974 FOR "LRR-128"
  444. CRC32 = 2918283051 FOR "LRR.BIN"
  445.  
  446. tHE "LRR.128" FILE IS THE MAIN basic PROGRAM AND THE "LRR.BIN" FILE CONTAINS
  447. THE MACHINE LANUGAGE DISK-ACCESSING ROUTINES.
  448.  
  449. BEGIN 640 LRR-128
  450. m{$60}1ps'{$60}h{$60}f2#'*#$t-rd[(dq)5%1,12!2140@4d5!1$52(#$r."!615)324].
  451. m(#$n,#{$60}b{$60}&d<"p"9(#h@f2)"62!#4d%)1r!"4e5#12{$60}p.2u&14(m.3,@1d]2
  452. m($,]2$%#2te.1r(@.b"9{$60}&\<#{$60}{$60}z{$60}*l<%{$60}!#1++"*#$x-bdzbr!#1+,x(*<@
  453. m0t2r."{$60}z((\@*bh@1$5&055,5"!#0dtm1$]3($12259%("hj{$60}.8<&0!$5k(y
  454. m.d14lc{$60}@.b{$60}@cr{$60}j*b!-4ru$3u,@1%))5d4l(%194$4@*#{$60}],34w,2pr-34]
  455. m,34x,2d{$60}'!t:{$60}(l@1%:r0t0@ir!$5k(x.d14lc{$60}@.b"/("hj($%,5$523d%4
  456. m12!-4ru$3u,@1%))5d4{$60}(at;{$60}#h{$60}/at>{$60})d@(de.251)04q)6de.1rxn+b(@
  457. m.b"9{$60}&{$60}=*{$60}#^{$60}c{$60}@.b!02[+1*"(x,#{$60}p(bd@.b!05k)02zhs,{$60}")'3({$60}br#"
  458. m*%!6jc{$60}ilm$h(d-"(bd@kr#"*%!6jc$ilc$s,b"g(#8p{$60},d=-p"9(dq/041)
  459. m3d<@34%#2$e.12!,04y'54%'12!23u5424y%4rxn+b(@.b#^$2),4e(n0de.
  460. m(bq5*$-$*0#j'3p{$60}er!05jhs+$16(#h@er!05jht+$14(#h@gb!02p{$60}.'d8{$60}
  461. mab!4+%(l0bq)+$$d+$,l1%0d+$9,)"q)3"0l6"q8){$60}!('d<{$60}0ttdlb)$3494
  462. m0rlm42{$60}bjl<h,3,ijl<h,30u*:k'*#$w*:k'*#$u-rfjqr@r.2fjqr@q.2d{$60}
  463. m:!y({$60}$--)+)#322jqr@q-#<ijb(o4dy8(jk'*#dr*0"/'dl{$60}1$rrjs$@.b!#
  464. m1k*k,2{$60}z($u%lc{$60}@.b!#0;(p(#h@34&r,{$60}#!'e{$60}{$60}ab!$220h,2ps,#{$60}i+$-,
  465. m*#$r."dl4uhh,3(x*2q$4"@q,c@i+$-.)"@s,#{$60}i{$60}.d>6@"+($14lc(u-2"g
  466. m($14)+(b,34x,2(@.m4@1%0dlb(q-3<q(@{$60}/'v0{$60}1dpdll<h,3dijl<h,3<i
  467. mjl<h,3<ijl<h,3<ijl<h,3<i{$60}#,?;@!)3"2r1dpd.h%)lc&d,3dz24pdlde,
  468. m)*k'*#$w*3j"{$60}#t?>{$60}")(#4p,{$60}!#'x({$60}.@!e'x,{$60}cr{$60}j*b!,3t%$($u3+41/
  469. m4r!$25)%0u1/4ed@*bh{$60}c!^,{$60})db3$]!1$e.1r!-4ru$3u,@1$e214-43u)9
  470. m+bxn(b{$60}z()d{$60}ga^6{$60})x@4$l@.b">(%!+jc,{$60}iq^@{$60}$1,lc{$60}{$60}q1^j{$60}/x)($),
  471. m+$1#+$)(+%,@.b!%ll(h4%:j,bd{$60}yq^t{$60}(l@*%,@kr{$60}q*2"g((t@,s@p(#h@
  472. m1$rrjs$@.b".{$60}{$60}\@o@"9(e-#04y.24y'($u3+41/4r!$25)%0u1/4edn+bxb
  473. m(#h@f0{$60}@(,@{$60}1$*r0drj,c4vk$)({$60}%{$60}@s0">(%!+jc(q(#h@_@d@0dpl6"q"
  474. m2"{$60}z($u!ld),jd)(k#(u-ji8k#8u-3,v{$60}&$@t@"+($1#lc{$60}@ir{$60}s-c{$60}{$60}@2#<
  475. m{$60}($@1%"r1$(@i"!$0jhs,jph1$.k,2d@j2{$60}s,@"a(.8{$60}br#"*$10*;(p(+{$60}@
  476. mpba$4"fr,c(y(*<@,s4p{$60}+l@\{$60}"+(,(h1%"j,3$i(*\@,c0@ir{$60}s-3{$60}{$60}qr#z
  477. m{$60}$1,ld1,jc${$60}"r$${$60}40dlldh(b{$60}bjl0h1$pi+#,ijb(@("{$60}@($%30r{$60}@4t51
  478. m("{$60}b(#h@cr{$60}j*b!$149!54q4(%-%3"]44b]&5"{$60}j*@{$60}v(0x!022r(b(@.b"!
  479. m2;(pi#$p(#h@022r022jqrc"*$10jddi*2{$60}z((({$60}4b$8{$60}4$dll@h020l."fj
  480. m(b{$60}@(jk)*$$d+#,i{$60}%\a(@&9($1,.r!!){$60}!q(2p!1"2r1"2j022j(b{$60}@(@"2
  481. m(38!0tph1$pill(h1%"j,c8ijc(u-js"*$10jc(w*0"^(4{$60}!4ujrpba$4*hr
  482. m."fj,c4vk,(h1%"j,cdijc8u-3,vk,(h1%"j,s{$60}i{$60}.$a2@%$220h,"q$3"fr
  483. m1"2jr2@b("{$60}@("*jq"a36bdl-bd{$60}[r%/{$60}410*$1,*;)$4{$60}#](50!4uhh1$pi
  484. mle-:{$60}{$60}8b7@&"($10{$60}{$60}pb:{$60}&.{$60}!(b<@$z{$60}#<b<p&/("hj(%)%4$]25"!-4ru$
  485. m3u,@1$e32r!%4e)/4b{$60}j*@!d(gp!f2#'*#$x*3lb35,m1$]3($1)4tl@15)2
  486. m3u(@(r([rbc$*$4i+#(i.p"1(h8!f2{$60}b("@d(co**-(h12dl,rd[(bdl(%!2
  487. m15-3($m%62xb.\<h,30v*0"?(i{$60}!h?d@020@.b".{$60}*4bf@$z{$60},{$60}bfp&/("hj
  488. m(%-#4d5%3b!(14%$24y'("hj{$60}-0bi{$60}&9(,<h,30w*3o'*#$x*3l{$60}{$60}r.e{$60}8l@
  489. m346r,""g()db35,m1$]3(clz6+)-03k5()db0t)-1$]3(clz6+)#00{$60}l(z8!
  490. mf2#'*#$t-bd[(b{$60}@35,](co**,0h1%8i+#(i.r(z(cm$5"0[{$60}%dck@&9(b{$60}@
  491. m0t)-/2([rbc$*$-$*2pr*3lb("!&4d5%/2([rbc$*%@i+#(i{$60}&,cn{$60}&9(#h@
  492. mc@!i(\(!.@"$(\,!cr{$60}j*b!30u)%14x@1d]/5$e.1r{$60}j*@"x(\p!f2!)3"0[
  493. m(d0]1$e2($t]35-$158@1cu#0du$158@0su#3u!9(%$]455)5"{$60}@("({$60}[2/6
  494. m{$60}9d@("{$60}@(")4/51/1t=,12!2/5)%34]612!8/4-"34-062{$60}o/4u%3e4@*rt]
  495. m4$<b.p#s(^{$60}!c@#y(^h!.@{$60}2).l!cr{$60}j*b!-04e.(%)/551)3d4@*bh{$60}("3t
  496. m{$60}52r,2{$60}z($.r,{$60}{$60}h)/4!4k(p{$60}$\d_@&+($u%lc{$60}@ir!-1k)$3#i-0[(r(#h@
  497. mu2!-1k)#1ci-0[(q{$60}%dd"{$60}*-(#0r,{$60}!k){$60}d"br!-1;.q,""g(#4t,@";)!("
  498. mf2{$60}b3e5-("!3("!44dx@(%194"{$60}@1de,14y!344@($585"{$60}@3$5.1u1((@#+
  499. m)!p"f2{$60}b+2tm("{$60}m("{$60}m+2t@("tm+2{$60}@+2tm+2tm+2t@("tm+2{$60}@+2tm+2tm
  500. m(@#5)!t"b2{$60}u-3{$60}{$60}!24>{$60}id@(dy532{$60}@4r{$60}@5%).("!&24q%3d%-12{$60}@("{$60}@
  501. m("{$60}@(%0@($q%3d=42"({$60}-24?{$60}id@(btm+2{$60}@+2{$60}@+2tm("{$60}m+2tm+2tm+2tm
  502. m+2tm+2tm("t@("tm+2tm+2({$60}/r4f{$60}ht@-#8p{$60}%he,{$60})"le2j,3<@.b"+($*q
  503. m348@ir!"ldu&{$60}',e.@*9($9,)#lz((l@5+%-1b"g(#4y,{$60}"3)40"@2!)le0@
  504. mi"!"(#h@f2!$220h344l22d@.b""{$60},@e3@*+($u&ls{$60}@ir"9(,<h,3@i.r(\
  505. m1$e214-43u)9($y/5"!,3t%$140^(co'*#$t-bd{$60}\25/{$60}hl@34:r,""g()d@
  506. mqr@q."d[(cq.3r!&24q%4sxb.\<h,30v*0{$60}#)e@"br!-1k.r,""g(#8v,{$60}{$60};
  507. m)f("f2#(*$e,)"q2jc4i.\<h,3@i.p{$60}s)fp"d2!#jc$@b2{$60}v,s{$60}l-c0p+#8u
  508. m,{$60}!8)g8"f2"f-"d[rba$220h344l5*i2*2pu+#,i(#h@b2{$60}v-c{$60}{$60}?2:{$60}{$60}id@
  509. mic<i.\hh1$dd*$u%+%2j4bdl."pu*2{$60}z((d@-c8p{$60}*0fb@*9(*8q,bd[rba$
  510. m220h344l5*i2*2pq,rpu*2{$60}z((d@-c8p{$60}*xfe{$60}*a^2!!){$60}"^)ix"2;+4*$--
  511. m)"q!)"d{$60}y":h{$60}hl@34:q,""g()d@r"a)3"0l4jhu*3m$220h344l5*i2*0#t
  512. m)k("br!)lc{$60}@ir{$60}v,#{$60}{$60}/r>\{$60}i$@22")(#<v,"pq,#4p+#$q,3{$60}l.34p+#$q
  513. m-3{$60}l,3{$60}p,"pq,#(p+#<s,"px-c{$60}l.#8p+#<w,"pw.3{$60}l.#$p+#@s,"px-3{$60}{$60}
  514. m9b?!{$60}i$@2:lq-2")(#4p,"pw,3,l,30p,"pw,3,l,34p,"pw,3,{$60};"?&{$60}i{$60}{$60}
  515. m<b?'{$60}ch{$60}dr?({$60}h\@*bh@5d%224]54r!-14y5($]05$e/3e,@*bh{$60}hb?){$60}du%
  516. mljlh346r,"d{$60}jr?*{$60}hdu,#{$60}{$60}ub?:{$60}id@qr@q-#<i.r)(059%($%.($%715-/
  517. m344@1$%9+b(@.b#^{$60}c$u{$60}-pgy{$60}*{$60}{$60}{$60}{$60}h^{$60}*+($u%lc$@ir"-(#0r,"{$60}z((t@
  518. m,c4p,"{$60}z((d@-3{$60}p{$60}!hh_0*-(#0r,"{$60}z((t@,30p(#h@b2{$60}u,#{$60}{$60}-"@"{$60}u*r
  519. m4jlq(#h@br!2ls{$60}@ir!2ld*k5{$60}{$60}^*{$60}p#b2{$60}v,#{$60}{$60}6"@6{$60}u*r4jhq(#h@br!4
  520. mje*q0b"g(%*r,{$60}!b*"{$60}#b2{$60}v,#{$60}{$60}>r@j{$60}t.r0zlq(#h@br!#ls{$60}@ir!#ldu#
  521. m{$60}(4h-{$60}.)(#8p,{$60}">*#x#0[)#jc$@.b"+($.q34,@ir!#lc{$60}{$60}j"a({$60}xd@-c{$60}p
  522. m{$60}+xh4@-2lc{$60}@.b!#lc{$60}@.b")(#8p,{$60}#0*%p#br!-1k.r,""g(#8p,{$60}#p*&8#
  523. m6+)4je(@.b"1($.j,2"-(#@y,"py,3{$60}l.3,p{$60}!,i<{$60}.9(,@h24pd+%*j-2d[
  524. m1$dd*$u%+%@i(#h@b2{$60}v,#{$60}{$60}02ez{$60}xl@rba$220h344l6"dl-bpq*;(b("(@
  525. mir!8)+(b*b(@.m4@6"2r(b{$60}b{$60}%tia{$60}/**$1))"a-12q8*2pv+#$ile@d(#h@
  526. mc@"/*8x#br#**$1))"a-12q8*2py+#$ilb)!(b"g(%@dlb)"24xb(#k5(%@d
  527. mlb)!4t,b{$60}*lif{$60}/**$1))"a-12q8*2py+#,ile@d(#h@c@#>*:(#br#**$1)
  528. m)"a-12q8*2pq-"pq*;(b4r(@ir!8)+(b4%)'(b{$60}zu2!8)+(b4t51(@#[*:p#
  529. mrba$220h344l6"dl,30l,rfr6"0@.b".{$60}{$60}tjm@.+($u&l[(p(*<@-c{$60}p{$60}!pj
  530. mp{$60}.!(%br,2"d($u&{$60}#0jr@.1($.j,2"-(#@y,"py,3{$60}l.3,p{$60}#pju{$60}."(%@{$60}
  531. m1bk>{$60}xd@-3(p{$60}&,jz{$60}-2lc{$60}zbr!"ldu&(*<@5+(q(#h@b2{$60}u,3{$60}{$60}=bkr{$60}u2r
  532. m5*hq."{$60}z((d@-3$p{$60}(@j_{$60}.+($u&l[(p(*<@-c8p{$60},{$60}j{$60}012lc{$60}zbr!4lc$@
  533. mir!4ldu&jra-1jnu*$u&k3$x*:pq."fj,2{$60}z((l@5+.r348@ir{$60}u,3{$60}{$60}v2h&
  534. m!%2r5*lq."{$60}z((l@5+,q(*<@5+(q{$60}.,j${$60}2)(#4q,{$60}#x*ah$f2!)3"0[qr@r
  535. m-rd[(d{$60}b.p{$60}>*r0$a2)-4ru$3u,@1$5624-%($y534)%4b{$60}h."ts,"db.t16
  536. m{$60}&(k)02+($-$ld16(*>9(du3+41/4r!!3d0@0t)-+41/4r!$159)0t53($u5
  537. m4u0@0d4@1$e&1d5214y4(2(zb3$p-c{$60}{$60}cbln!%br-s$@.b"%(du3+41/4r!$
  538. m159)0t4@5%e012{$60}@*#<q+s@q*2([6{$60}#/*s@$br!8lc@@l"!8lc@q(+{$60}@6+(q
  539. m-3@q(*<@1%2r,c4u.d14)+(b,34x,2(@.m4@1%2r,#i$5"2r(c$u-s$b{$60}/\k
  540. m0@27(%!6jc,l1%8@.b"7(%!6jc0l1%0@.b">(%!+(#h@1$rrjs$@.b!-0;(p
  541. m{$60}{$60}dl3{$60}2)(#4p,{$60}{$60}>+%8$f2!)3"0[qr@r-rd[(d{$60}b.p!&+&{$60}$a2{$60}b0t)-+41/
  542. m4r!$159)0t4@3e5-0d52("@p+3,p*2([0t0{$60}bbqj!(l@0t2r1%8@iydb35,m
  543. m1$]3($%.1"!#0dtm1$]3($1%5de#15,@35535"!"12!$249&15)%3e0a(cj)
  544. m,3$r,{$60}"c+'0$0t:rjs$@.b!#0;(p(#h@b2{$60}u,#{$60}{$60}j2qu!#h{$60}p"qv!(\@*bh@
  545. m0t]062!&24q%4r{$60}j*@#2+'x$br!-1;(q(*<@,c{$60}p,{$60}#\+'\$f2#'*#$t-rd[
  546. m(d-/4%d@35,m1$]3("t^($-"32u$3u,b.idzf0{$60}8+8@$br!$3+.r,""g($9#
  547. mlc{$60}@.b")(#$q.3{$60}{$60}3rv2!$9#lc{$60}@.b"!($:r,2"d($1,(#h@br#**$1))"@p
  548. m+$8i+#8l,2fr(bhb(*<@c2{$60}q,c{$60}p{$60}%<mg{$60}2"($8{$60}@rvf!)d@.b"9(d9)3$53
  549. m($-/4$e%1"{$60}](cm&0slb("t@4%)%4u,@2t59(@"5+:<$h?d@020@.b")(#4r
  550. m,{$60}"a+;{$60}$1d.r1d.j,0#.+;h$6"2rrba$220h,"q&*2pq.2px*:hb+b*jrba$
  551. m220h,"q&*2pr.2ps*0{$60})+l0$0t8dlb(b.h%)lc&dpra8)"dzbr#**%@d+$dl
  552. m,2fsl2(@(b"g($-&)+)#1b2jrba8)"q)+#$i{$60}{$60}\ns@2"{$60}#@nsp2+(,dh0t8d
  553. m+#$ilb(n(b"g($-&)++(*$-&)"s#*$-&)"fk,2d{$60}62[0!$-&)+)#1b2j(bpb
  554. mjlhh1$dd*#{$60}l1bdl,30l,2d{$60}c2[8!)d@q"a&0rd[(bx@(co'*#,t*3m#1b0[
  555. mqr@s-"d[hs(p*3m36ba&*2)"651%4r([{$60}*@nw029(*,s-2d[rba$220h,"q&
  556. m*2py+#,i{$60}-<nx@1#3+)#3"a&*2{$60}z($q"le-:*$8i(*l@m2a36ba&*:tv-34s
  557. m-bfl-c4u,s8{$60}$2_l!(l@0t2qlc@@ir#^#2,q+"a#1b2j(bq7(bdl52a#1"d@
  558. m.m4@br!#1+.q,""g()\@,2q#1"pw{$60}",o\02+($-$ls@@ir{$60}q,c@x{$60}#<o]@2+
  559. m($13l[$v,r"g(#$r.#@{$60}:b_[!%@dlb)9(b{$60}z()d@(d-"32!&24q%($5825-4
  560. m4sl@3u9%4e=2251%("a9+txi(cl{$60}db\{$60}!:{$60}@,2{$60}z((4@6"0@.b"+(%@dlb).
  561. m(b"g($9#ld9#js$@.b".{$60}*,o!07r*$-&)"dl52a#1"d{$60}o2\&!?x-(s$l*$-&
  562. m)*hb+%<b*2q5*$-$*0#/+p@%br!#1+,x(*<@,3,r,{$60}#b+q0%br!$4[,r,""g
  563. m(#$s,c{$60}{$60}&#{$60}>!9d@qr@q."fj(d-"32!$25-+($524d]2.b{$60}bjd13)"{$60}z($9#
  564. mld9#js$@.b"@,2{$60}z((x{$60}0c{$60}h!9<@4%:j-bq#3*tr-38@.b"7(%!6jc4l0trk
  565. mpba05jhv*:pr-38{$60};#{$60}r!9<@4%:j."q,0jtr-38@.b"7(%!6jc<l3$*kpba0
  566. m5jhx*:pr-38{$60}ec{$60}\!512lc{$60}@.b"+(,hh1$dd*#{$60}l1bdl.2pq*;(b02(@ir!4
  567. m4k(r-34{$60}k3!"!5br,2{$60}z((l@0t2r,""g(%br,{$60}"],$8%gb!02zhv+%12+%@{$60}
  568. mv#!+!?x)(%@l6"q8+%,@.b!%ll(h4%:j,bd{$60}^#!,!8l@*%,@kr{$60}q*2"g((t@
  569. m,s@p(#h@1d.r1d.k,0{$60}0,5{$60}%br!#1+.q,""o($-$ls@@ir"@,0{$60}u,5h%br!#
  570. m1+&r.""g(/x/(s$@.b"+($13l;(r,""g(#$s,3{$60}{$60}.s%d!8x{$60}03%v!3h{$60}8#%w
  571. m!8\@*bh@4d5-3u9%($u3+41/4r!&24q%("hj{$60})@q>{$60}69(,<h,30w*3lb4d5-
  572. m3u9%("a$14q%5$4i(%-%3$5#5$5$($u3+41/4r!&24q%4shb.id{$60}ss%y!8l@
  573. m346sl3{$60}@ir"9(du3+41/4r!-14y5($u54u0@0d4@4t5,14-4140a(b{$60}z((dr
  574. m,#,p{$60}{$60},r>@5!)+(b62(za2)!4d4@64]5($q)2t4@4u5212!!0d]55"!42$e3
  575. m("a9+txi(cm!){$60}{$60}:,gl%f3j+($$dlb).(b"g((d@-3(p{$60}#8r@@6+($1,l[(p
  576. m(*<@1d.r,"{$60}z((d@,30t,{$60}!%,hp%1d.r,"{$60}z($:r,0!z,i$%br#**$1))"@p
  577. m+$8i+#8l,2fr(bhb(*<@c2{$60}q-#<p(#h@1d.r1d.j,2{$60}z($:r1jlq{$60})4re@5&
  578. mld:j,2{$60}z((l@1k.r1$p@ir{$60}q-#(u{$60}*@rf@69(d9,55-(24y'+bxn(@"t,il%
  579. mgb!02zhq,@#a,j{$60}%f2{$60}z()db1de,15,@4d5-3u9%1"{$60}](cm&0slb("t@4%)%
  580. m4u,@2t59(@{$60}-,z4%gb!02zhr,2{$60}z(/x)($$l6"q9(#h@34&r0:i9k#(u-ji8
  581. mk#8u-3,v{$60}!\sj@6a^2!!)"{$60}z((d@-3{$60}p{$60}$xso@69(e)%34]624y'("([qr@s
  582. m-"d[rba$220h,"q&*2pq.2pq,rd[qr@s-"d{$60}@#/2!9<@4%:j,3{$60}l1%{$60}h1bfm
  583. m,c4v(#h@er!05jhy+$10*$8ij\(h4%:j,3{$60}ik#(u-@",,]0%gb!02zhq-0#*
  584. m,]8%1$dd*#{$60}l1bfr1$dd*#{$60}l1$pi.e-:*$8ile-:*$1,*3i$4"a&*;)$4"a$
  585. m3"dz0tph1bfr0tph1$pi{$60}-8sup5$3+)$3*lq{$60}-psv{$60}6.{$60}.(sv@4z{$60}/tsvp6/
  586. m("hj($-/4%d@0t)-($9)3$53("hj{$60}"<tw{$60}69(,<h,30w*3lb0t]062!#0dtm
  587. m1$]3(%1/($-"32u$3u,z(cj9{$60}&{$60}tw06+($-&l[(p(*<@f2)#3tu-3t1/4d4@
  588. m1$e214-43u)9($y/5"!,3t%$140b(#h@b2{$60}r,#,p{$60}(ptw@58lc{$60}@.b"%(d1%
  589. m5de#12!.54u"15(@5$\@0t]062!43r([6"{$60}z()d{$60}p#3?!8l@6+.r,""p(%bq
  590. mlc8t(*<@f2)"040@1$5624-%($y534)%4b$b(#h@b2{$60}r,#,p{$60}/0tx{$60}6+(%br
  591. m0t0@ir"9(d-!3dy/5"!#3u!9(%1/(%-!344@1$5624-%(b{$60}z((d@,c{$60}s,{$60}{$60}c
  592. m->$%@2!&lc$@i"!#1b{$60}z((l@rba$220h,2q&*2pv+#$il[$b*b(@ir{$60}q-3<p
  593. m{$60}$@ux@69($1))"@q+$8i(#h@gs$l0t0l,bq#3b0h1bfj(bq2(@!d->,%br!8
  594. mls@@ir"?(#(l6"pw(#h@b3$u-3{$60}{$60}c37d!4-&)+)#3b0h1bfj(bpbjlhh1$dd
  595. m*#$l1bdl,s$l,2fj(bq7(@"<->4%gs(l6"ps+$-&){$60}"p->8%br!$4[.q-c,@
  596. mir{$60}q-3,p{$60}+<uyp6@,@#w->@%6"2r(edb.h4b1de,12!%6$e35%,z($]615)7
  597. m4de412{$60}h62].*2([6"0@.b"+(%@dlb).(b"g(#$u-c{$60}{$60}"c;p!?(h0txd*$8i
  598. m*2q5*%@i{$60}!dv]06?,bq8+#,l0t8d{$60}$tv^@6+($13l3(p(*<@f2#'*#$x*3lb
  599. m0t)-($1/4r!%4e)/4ch@(cm$4r0@.b"),34v,{$60}!=-@x&gb!02zhr-"pq+#({$60}
  600. m:388!j{$60}q(#h@h#({$60}<38b!h(@1@"b-bp&f2{$60}z()db1de.25-(140@+2!04d53
  601. m4r!!($m%62(@.b"a^2!!)"{$60}z((du,3{$60}{$60}j#;.!sh{$60}rs;/!x\@*bh@0t]062!#
  602. m0dtm1$]3(%1/($u3+41/4r{$60}j*@#z-m{$60}'f2#'*#$t-rd[(d-/4%d@0t)-+41/
  603. m4r!43r!-4ru$3u,z(b{$60}z()d@.b"9{$60}{$60}twv@>+($1,l;(p(*<@,c{$60}s-0{$60}z-^0'
  604. mf2)-4ru$3u,@1$e214-43u)9($u54u0@0d4@3$]!1$5$($9)4e-4(@!c-^x'
  605. mf2{$60}z()db4%)%4u,@04y9($m%62(@.b"a^2!!)"{$60}z((d@-3$p{$60}&pw\p=&0[(p
  606. m{$60})lw]{$60}>!($:r,2"d($-&(#h@br#**$1))"@q+$8i+#8l,2fsl2(j(b"g(#(p
  607. m-#4{$60}ls?x!t9#ld9#jc$@.b!#)+)#3b0h1bd{$60}[3?y!yg**,0h1d,i+#(i.r(@
  608. m(co**$1))"@q+$8i+#$t+#$v*3o**$1))"@q+$8i+#,t*3lb.b([{$60}{$60}\x^@>-
  609. m,c{$60}u,"{$60}z()d@r"a-)"px*3lb+b([r2a-)"ps*0{$60}y./l'5%*r,"{$60}z((l@rba$
  610. m220h,2q&*2py+#$ilb)!(b"g(%12lc(u-0!#./p'c3(q,#{$60}{$60}23c]!x({$60}9cc^
  611. m!ydb1dq54ta)3d<n+bxb(#h@gb!02zhq,@"2./\'gb!02zhr,2{$60}z(/x)($$l
  612. m6"q9(#h@34&r0:i9k#(u-ji8k#8u-3,v{$60}+8x{$60}{$60}b9.b"9(d9)3$53($-/4$e%
  613. m1"{$60}](cm&0r{$60}z((dr,#,p{$60}+px{$60}0@z{$60}/(x{$60}@a8lm0h0r0l(bxb*2{$60}z((l@6+(p
  614. m(*<@322r0r2j(b{$60}@("{$60}@("{$60}@("{$60}@(b{$60}z((dr,#dp{$60}"{$60}y!pa8ll,h0r0ijc$@
  615. m.b#k(#h@6+)8js$@.b#l(/p@rba#)"q8+#$ilb(n(@!!.0p(322rr"c(*$,d
  616. m+%bk,2fj(b{$60}@("{$60}@("{$60}@(bpx*0!8.18(6"2rrba#)"q8jc$ijb(@("{$60}b{$60}&4y
  617. m({$60}a-)+)-)*i8){$60}!u.2h(322rr"a-)"pq,2d{$60}l3dk"(%)lc&d,3$z6"2rqrc&
  618. m*,hh320l22pq*2fo,3(w*3j+(%@dlb(n(k!8)+(b("(@ir!8)+(b7r({$60}r#dl
  619. m",hh320l22pq*;)8)"{$60}z(((@20{$60}&.bt(2;(x(#h@zr#]($fq,2"o(,hh320l
  620. m22pq*;(b7r(@.b#**$td+$dl,2fr(b{$60}b(#h@2;))js$@.b#l{$60}$4z+@a)lc$q
  621. m(#h@zr#]($fq.""o(,hh320l22pq*;(b7r(@.b#**$td+$dl,2fr(b{$60}b(#h@
  622. m2;))js$@.b#l{$60}$lz,@b.{$60}%$z,p@z{$60}%pz-{$60}b!2;(pi#{$60}{$60}?#hy"($@1%"r1$(@
  623. mi"!$0jhs,jph1$.k,2d@j2{$60}s,@"=.cx(br#"*$10*;(p(+{$60}@pba$4"fr,c(y
  624. m(*<@,c$t,{$60}"f.d@(@b!$4{$60}#2.e((f2).3r!&4d5%($u3+41/4r!$25)%0u1/
  625. m4ed@14y425)%4r(@.b".{$60}-hz7{$60}b"($d{$60}!cmp"(%)lc&dpra-)"dzet10jdfk
  626. m,2s&*,hh320l22pq*2d@kr{$60}q,c<z@@{$60}>.wh(@4fr,3&d,s$zer!$4*i)+#{$60}z
  627. m@@{$60}w.x0(et10jc(v+#(u-3j71%"j,c<l,34{$60}83n.")<@4%:j,3{$60}l1%"m,c4v
  628. m.i<@4%:j.2q$4*o"*%!6jc$p*:pr-38{$60}<#n8")\q+$-$+#(l0r0{$60}c3o\")x@
  629. m4$nj.2q44bpq(#h@_@d@6"q8+%@l4p"4._t(h#${$60}msl!"8l@4r"o(#$@ir!%
  630. mll(h4%:j,bd@.b"-,s@p(#h@c@#n.p8)6"2r(b{$60}@("{$60}@05-#("!315$@("(z
  631. mbr!44k(p(*<@6"2r(b{$60}@("{$60}@0de.("!04d<@("({$60}$3p0"41,ld1,jc$@.b!$
  632. m)++)*"(@(jk$*$1,*2ps*:i8){$60}{$60}p/!h)1"2r1"2jr"a-)"px*:hb("{$60}bjldh
  633. m320l,rd{$60}43pd"4-,*$1,*;+"*$10jc(v*:hr-3:lpba$4*hr-rd{$60}?3pn"5-:
  634. mll(h1%"j,c@ijc(u-js"*$10jc(y*:hv-34s-js"*$10jc,p*0"d/#@)1$dd
  635. m*#{$60}l1$pild0djldh(b{$60}@("{$60}@("{$60}@(jk$*%-:*2px*0"r/$()1%{$60}h1$pild10
  636. m{$60},{$60}\3{$60}e36ba$3"fr4uh{$60}qcq;"8x{$60}s#s""3h{$60}]3s#"8\@*bh@3$]!1"!#3tu-
  637. m3t1/4d4@1$]3($1)4d5#5$]262{$60}j*@{$60}c/<0)f2),3t%$24y'($-/34u/1$]2
  638. m12!$3u,@1$e214-43u)9+bxn(b{$60}z()d{$60}5sw%"8l@0t2s.""g()db0t)-1$]3
  639. m($1%5de#12!-55-4($)%(#x](#@a(b{$60}z((dr,#,p{$60}(4]r0f?,2q#1"pp+"(d
  640. m,"(zh2,q+$$d+$$d(#h@0t:rjs$@.b!1)++'*#,t*0"+/<h)zp#$/<l)gb!0
  641. m2zhr-rpq(#h@0k+"*%!6jc$q*:hr-3:lpba05jhq,bd@.b!4)++'*,(h4%:j
  642. m,3,i*0#3/<x)6++"*%!6jc$t*0#a/=@)br!8lc{$60}@ir#m{$60}!<^x@e8)+(b(b{$60}z
  643. m(($@2;)05jhq-2"d(%!6jc$ujebk,2{$60}z(%@dle@djl<hpba)*2d@.b""{$60}",^
  644. m#pi#1k)#1jhq{$60}$l^'@j+($-&lc{$60}@ir"9(d1)4tl](e$d6"11)"{$60}z()d@.b")
  645. m,c8u,{$60}!:/b@*0txd*$-&*;)8){$60}"9/c(*022rr"a8)*hb("{$60}@("{$60}@("{$60}@("{$60}@
  646. m("{$60}@("{$60}b+#$w*:i4)*k)*"(@("{$60}@("{$60}@(jk$*$*l,c4t*2px*0#'/cp*1$dd
  647. m*#$l0t8illdh(b{$60}@(jk$*$-&*2ps*:hb("{$60}@("!!4t,@("*j020{$60}[cy!"hl@
  648. m5"2sl2)3(b"g(,hh1$dd*#$l0t8i+#dl,rfr(d))3b({$60}_cy&"id@1$dd*#$l
  649. b0t8i{$60}{$60}0_6@kl{$60}!h_;@i#0;)"k#(u-b{$60}z(*{$60}q(#h@c@{$60}{$60}{$60}{$60}{$60}{$60}
  650. {$60}
  651. END
  652. BEGIN 640 LRR.BIN
  653. m{$60}(!,#(),7(-,a89,\x=,,(5,z(1,/8!,hx5,2xa,@(c+a{$60}{$60}{$60}{$60}{$60}{$60}{$60}{$60}{$60}{$60}{$60}{$60}{$60}{$60}{$60}
  654. m{$60}{$60}{$60}{$60}{$60}{$60}{$60}{$60}{$60}{$60}{$60}{$60}{$60}{$60}{$60}{$60}{$60}{$60}{$60}{$60}{$60}{$60}{$60}{$60}{$60}{$60}{$60}{$60}{$60}{$60}{$60}{$60}{$60}{$60}{$60}{$60}{$60}{$60}{$60}{$60}{$60}{$60}{$60}{$60}{$60}{$60}{$60}{$60}{$60}{$60}{$60}{$60}{$60}{$60}{$60}{$60}{$60}{$60}{$60}{$60}
  655. m{$60}{$60}{$60}{$60}2*d{$60}a9"m(8{$60}@l?^i;r"3_ze5(*c_)){$60}p#zdp(*c_:""h_r20,{$60}(88*d%
  656. mc2"{$60}.&"m{$60}-u)$(t{$60}w6"i""p-w/#[8""3@*x,w""*@(i@j1h@6x"0{$60}6{$60}@ko\d
  657. md##.&"!'_rp-w""*@"";@(t@@"d/r0*p):{$60}{$60}()n{$60}f56{$60}r,{$60}&d/48j0@@6x"0
  658. m{$60}6"i{$60}2pb@#{$60}"j00@j/\@ko]@2(hi{$60}0h*"@hl(h{$60}0{$60}dd0(%n{$60}:){$60}!8""h_zd!
  659. m(*c_j0d@j/\@ko]x&"!'_rp-w""*@*gvh(j%{$60}h0#j0"%!"pb@#{$60}#($:!(%z!
  660. ml{$60}gf!*4$r0f0zqa88*gva0*f!!bibgu5@84#8{$60}{$60}(${$60}8.!{$60}p""b";@(t@@"d/
  661. mr0*0{$60}6"b{$60}j{$60}{$60}j0@l#=sp^zt{$60}w4d0c0#=k0s<d0+(t.gf{$60}\k0y&!(a{$60}2**0$*
  662. m"@h*"0(l(h{$60}0{$60}dd0(%n{$60}:){$60}!8""h_z4$(*c_j0$@j/\@ko]xj4"%!3@@1_]x
  663. m+{$60}w<h@*@{$60}*t{$60}w<t{$60}w=#x104i0/#rl0*-#-re!4e{$60}a06i""p-w/#[r-#=y@/*
  664. mt-@8($?_+{$60}w<((j{$60}().{$60}k@s<((j{$60}bht@@"d/r0)88*d.c0#_j?^-2h"-2x"b
  665. m!yu-@,h0^hu,@!a@s4j{$60}t!#l2x#0"xb8"aaibjbi]aa@c4j{$60}cdn{$60}a{$60}4@\8"0
  666. m&:t@@"d/r0op{$60}ca@(*:{$60}k4j{$60}kdn{$60}i{$60}60vv"m2h"n2x"d!4pf@j+_z#ci$k#z
  667. mb!#w&&d2r*b*8"!l@j({$60}p{$60}f0"$b8z0fh:*(!r&"&"r!^@h4(a@f$"j4(i@fd
  668. m"b{$60}f@i{$60}!8(4,a{$60}vb{$60}j{$60}{$60}l0r1!lbq#)$&r-#ty@wf!\k0[>8*i0k)"i{$60}2j0&%
  669. m"n8)i0g){$60}i{$60}&j0"%">8(q@o0nqa@..d"l{$60}&(kcz{$60}x{$60}'p!pj$!r8'i{$60}<8;42{$60}
  670. md{$60}'(8"#c@j+va@:bg(8'kcz{$60}3)&"('z"s4j{$60}t{$60}_l2x#0"dbi_xu*@(u+@&@@
  671. mc(%@{$60}{$60}{$60}@xx*b]h8"hir&{$60}xtk@xpl@r{$60}0@y{$60}!8*t^@,d"l{$60}%@k2n#k"r#&&d!
  672. md{$60}'((!"#8*d.c0#_j0"@{$60}"!^@b{$60}f@i{$60}!8(4"a{$60}.@#;$"c3z{$60}r0.0!zd\c2"{$60}
  673. m.&"@$+$"r0+0\:{$60}6l0*-/x#)!+#fh!&q{$60}hu!@,f!l-m*2di*c4"{$60}h!.q{$60}hu"
  674. m@,bq{$60}hu#@*{$60}8l0+)"="_h!jq{$60}ld"t+>@#k$"r0'0kzt_@{$60}h8:0&-18{$60}8;4"{$60}
  675. mc42{$60}k4*{$60}k$.{$60}..u$@+{$60}!b(u&@(q'@*t^@,d"t{$60}9.1x!n1h{$60}8k4:{$60}:0*-2("m
  676. m1x!i{$60}(u)@*gvh*"%!h0'j0&@{$60}*x_@""1@i{$60}!8*gvh*:%!h0'k46{$60}h{$60}"n0({$60}@
  677. md8*0{$60}6"i]j"fkd&{$60}&&"%!80#1@-ja02f{$60}phf{$60}qae!(4"bf4#a0,8i0)i]h4"
  678. mi0-ih(4#h{$60}*q{$60}id&{$60}(@0^&{$60}@1(2e!2d!t{$60}be!rd/j*4&8*4'h@1&"&k*t/jd
  679. m"&{$60}@1(2e"bd/a0je!2d!t{$60}^e"84&i0<i\{$60}4*a0=,q82b!{$60}8))@k*t/fe"h4(
  680. mi0<i#p4)a0>@{$60}kd&{$60})$"b!#xc$r{$60}8#bm)x#i]jth@.ff2bd'jjg_g4v{$60}8*{$60}.
  681. mc{$60}#_k2>{$60}k"b{$60}a0*${$60}zgeh{$60}"1{$60}j{$60}:l0*%#lbq{$60}h4/i0_)!9{$60}#3-.$j*4.('2$
  682. m2)a(j0"%"84*i0zd#r"2a&b%#vb%#dp(a:d.c0#_k4r{$60}\"zi{$60}(u,@*d"a6&i
  683. m{$60}84.k3^{$60}a6"i]j"@a0*${$60}z4.h{$60}{$60}@$(.0{$60}6#f#l9@t/#&8=#?k46{$60}a0zm0("%
  684. m8*d{$60}a6&i]j"fa0*${$60}z9ao4v{$60}\!"i{$60})u-@*4.h{$60}{$60}@$(/&{$60}\8#y@[f8>8#y@/&
  685. m8-#=&&"@#hp{$60}_zd"h{$60}"%#h0/a&"$8:4.i{$60}\@=(2${$60}@4"t{$60};f8-{$60}"yf'f#m{$60}"
  686. my@^e#lu(@*4/[4f{$60}d-nn/h{$60}&8"9arm#yj0"d8*9a8*5di&4@_x*0{$60}6"i]j"<
  687. ma6"$8:d{$60}a6*m/h{$60}*a6.e9*1e('2$a62$9<{$60}%d!rm)8"%8jd!kcz{$60}x{$60}'p{$60}jd#
  688. m+2:{$60}t{$60}6n)8#p{$60}h5c(#6&8*8/t{$60}(88"#)_y{$60}$c2"{$60}8*g_if/0{$60}j5ba6:@{$60}+%@
  689. m){$60}x0!jj]]hcp{$60}r#2_\c$9m#l&*5@96:%8){$60}"yf$xi6+e9h5bl{$60}+&8z5b!6/0
  690. mq"#,_qa@h{$60}z,{$60}/^%#h8/k2.{$60}k"2{$60}a62$94raab#ja9{$60}!8*5er060]!a@a0z&
  691. m4*d{$60}a5&%5(558*d{$60}a6*%8z94\{$60}2i{$60}!a@ie{$60}@qo^0!(t@@&"i_z93t{$60}*e4h5f
  692. mh{$60}{$60}@((>0{$60}6#p!y%@r,1ft/&$9abe8&5fa6"0{$60}n9a&*5b96:%8i{$60}"yf,xi5+e
  693. m9h52l{$60}+&4z54t{$60}:e4@53t+@@s/^e8@5c&&"e5/{$60}!{$60}*51\{$60}bi{$60}(51j0h88*55
  694. m*4#p"*g_a52i{$60}!a@(,__ii"&59{$60}'c2"{$60}(,s_8"0.${$60}rjo?:)\,?)#={$60}"a5&b
  695. m_qa@i5k-2("e6^u)@){$60}!8*5:i%l@=(2${$60}@4"t{$60}:e6j1;&&#f6m#<yem,8x<@
  696. m8x>0{$60}6"%"80*i60%9?{$60}2i62d9:8)af2f"h9e()*$3,>'k2>{$60}k"b{$60}a0*${$60}z{$60}:
  697. mi0f1{$60}h5dr*4*d0*%9:g_h{$60}^%"80*i62d92"2a*5di&4@+8.0{$60}6{$60}8i5qe8h5<
  698. mi5ue8x5=d{$60}+f7aa@h{$60}z,{$60}/\@j8:i{$60}(5da66%6x5<a5v%7jd"a5ji]j"<a6"$
  699. m8:t^@{$60}jhj0"%4h13(+:&d{$60}%@\{$60}8@c(>0x&"m)x"l*("%{$60}h0#h@"@'+5<d0+(
  700. mz.{$60}#d/8@tx088*{$60}.c{$60}#_a@^jj0{$60}@j8:i]j"<a6"$8:d{$60}h{$60}2%4h13(+:&l!+p
  701. m$*gvh)r%8(1a(#6&l{$60}-,6(a@h{$60}z,{$60}/^j(,;_d{$60}ri{$60}(tl@(ti@(tj@&{$60}@y(@@
  702. my(@@y(b-*8{$60}@y(b-*h"i{$60}(tl@"#db,db\{$60}c)0m#u(,s_8*{$60}{$60}(.2(r2+p!idm
  703. m@,c0\xpl@"#db,d@\/f-*x{$60}@y(c){$60}-#y(,s_8"#/_[{$60}%))!p{$60}6!h:"#,_tr+
  704. mb{$60}{$60}{$60}{$60}{$60}{$60}{$60}{$60}{$60}{$60}{$60}%{$60}d-{$60}),{$60}{$60}{$60}{$60}{$60}{$60}{$60}{$60}{$60}{$60}{$60}{$60}{$60}{$60}{$60}{$60}{$60}{$60}{$60}{$60}{$60}{$60}{$60}{$60}{$60}("$b(r0e)b<h*2hk
  705. m+"tn+s{$60}q,c,t-38w.#dz.sp]/c]{$60}p<+#q,7&q\c)rlo,s<[/t-'2t]35um?8
  706. mv=i;7%u>7\!!0d-$149'2$e*2tq-3d]045)35%565ua96mo<w=[?{$60}{$60}{$60}{$60}{$60}{$60}{$60}{$60}
  707. m{$60}{$60}{$60}{$60}{$60}{$60}{$60}{$60}{$60}{$60}{$60}{$60}{$60}{$60}{$60}{$60}{$60}{$60}{$60}{$60}{$60}{$60}{$60}{$60}{$60}{$60}{$60}{$60}{$60}{$60}{$60}{$60}{$60}{$60}{$60}{$60}{$60}{$60}{$60}{$60}{$60}{$60}{$60}{$60}{$60}{$60}{$60}{$60}{$60}{$60}{$60}{$60}{$60}{$60}{$60}{$60}{$60}{$60}{$60}{$60}
  708. m{$60}{$60}{$60}{$60}{$60}{$60}{$60}{$60}{$60}{$60}{$60}{$60}{$60}{$60}{$60}{$60}{$60}{$60}{$60}{$60}{$60}{$60}{$60}{$60}{$60}{$60}{$60}{$60}{$60}{$60}{$60}{$60}{$60}{$60}{$60}{$60}{$60}{$60}{$60}{$60}{$60}{$60}{$60}{$60}{$60}{$60}{$60}{$60}{$60}{$60}{$60}{$60}{$60}{$60}{$60}{$60}{$60}{$60}{$60}{$60}
  709. m{$60}{$60}{$60}{$60}{$60}{$60}{$60}{$60}{$60}{$60}{$60}{$60}{$60}{$60}{$60}{$60}{$60}{$60}{$60}{$60}{$60}{$60}{$60}{$60}{$60}{$60}{$60}{$60}{$60}{$60}{$60}{$60}{$60}{$60}{$60}{$60}{$60}{$60}{$60}{$60}{$60}{$60}{$60}{$60}{$60}{$60}{$60}{$60}{$60}{$60}{$60}{$60}{$60}{$60}{$60}){$60}{$60}{$60}{$60}
  710. m#0{$60}{$60}{$60}{$60}{$60}{$60}{$60}{$60}@{$60}{$60}{$60}{$60}{$60}{$60}{$60}{$60}{$60}{$60}{$60}{$60}{$60}{$60}"{$60}a(b,d)28g*"dj*rpm+b\p,3(s-#4v-s@y
  711. m.cl\/3x_0&%b8v1e9f=h:6ik;&un;w!q<g-t=79w>'ez6uq=7e\{$60}{$60}{$60}{$60}{$60}{$60}{$60}{$60}{$60}
  712. m{$60}{$60}{$60}{$60}{$60}{$60}{$60}{$60}{$60}{$60}{$60}{$60}{$60}{$60}{$60}{$60}{$60}{$60}{$60}{$60}{$60}{$60}{$60}{$60}{$60}{$60}{$60}{$60}{$60}{$60}{$60}{$60}{$60}{$60}{$60}{$60}{$60}{$60}{$60}{$60}{$60}{$60}{$60}{$60}{$60}{$60}{$60}{$60}{$60}{$60}{$60}{$60}{$60}{$60}{$60}{$60}{$60}{$60}{$60}{$60}
  713. m{$60}{$60}{$60}{$60}{$60}{$60}{$60}{$60}{$60}{$60}{$60}{$60}{$60}{$60}{$60}{$60}{$60}{$60}{$60}{$60}{$60}{$60}{$60}{$60}{$60}{$60}{$60}{$60}{$60}{$60}{$60}{$60}{$60}{$60}{$60}{$60}{$60}{$60}{$60}{$60}{$60}{$60}{$60}{$60}{$60}{$60}{$60}{$60}{$60}{$60}{$60}{$60}{$60}{$60}{$60}{$60}{$60}{$60}!@
  714. m04)#1$5&1ta)2dm,34y/4%%24u155e=865i[?'u^?p{$60}{$60}{$60}{$60}{$60}{$60}{$60}{$60}{$60}{$60}{$60}{$60}{$60}{$60}{$60}{$60}{$60}{$60}
  715. 2{$60}{$60}{$60}{$60}{$60}{$60}{$60}{$60}{$60}{$60}{$60}{$60}{$60}{$60}{$60}{$60}{$60}{$60}{$60}{$60}{$60}{$60}!^{$60}{$60}{$60}{$60}
  716. {$60}
  717. END
  718. -----------------------------------------eND-OF-LRR100.UUA---
  719.