IMD 1.16: 1/06/2007 13:23:18 FOGCPM.193 --FOGCPM193QL31 COM6 QL31 DOC QL31 DOCe !"#$%&-06-21 88 -CPM193 DOCQL31 UPDB'()*+,-./QL FOR0QL$ZCPR3DOC$12345QL31SRCEARC6789:;<=>?@ABCDEQL31SRCEARCFGHIJKLMNOPQRSTUQL31SRCEARCVWXYZ[\]^_`abcdeQL31SRCEARCifghijklmnopqrsZ1 COMbtuvwxyz{|}~SETD COMfSETD HOWSETD PAS]CRC INCDRDATE INC This is the disk name. ET ; initializing table ("shadow") for data area ITABLE: DEFB 0 DEFW NOPRED DEFB 1 DEFW 0 DEFB VACANT DEFB INITW ; Initial cell width DEFB 2 DEFW 0 ITBSIZE EQU $-ITABLE ; ; end of UNC.AZM include file lize variables, pointers, limits INIT: LD HL,(XLATBL) ; Hi byte is 0 LD DE,-TBLSIZE LD A,E SUB L LD L,A LD A,D SBC Ǽ Z2)2YR ́Z)́Z(R\R\by Nick Dobrinich. Sections Copyright (c) 1986 Steven Greenberg and C.B. Falconer 201-670-8724, 203-281-1438. May be reproduced for non-profit use only.RQL v3.1 usage: QL [d:]afn.ext | QL [d:]alib ?,/ help A alt display [text<=>hex] B,- back a page [] forward a page forward a line <##> jump to page # F find string | -hexbytes R,C repeat find T trunc lines: ON I case insensitive: OFF {(>R E extract lbr member S save lbr member (no unsq/uncr) R ^C,^K,^X,X or ESC exit *~:s1>(2* "!6!"2>2A2  M !" _͆2*[":] (!] >?ʕO{R Core dump (y/N)? >22S2k!",".2l!zw<##2!]0  ':X [>2X!e6L#6B#6R*RR ++ Sorry, cannot display online .COM files ++ R ++ File Not Found ++ 1: :oŸ͆G:{{122':X(!"}N{ !f~+~C #~O #~Mʘ:Xc [!"hͬ *nf+|(;"hͬ YR Members in library :\ :@n>:n!\6g* ~((U ydy i&>:nR |yg:#~n>.n#~nR >Member (1-y2jo&R) 2U:j2SJOg:UyQ!bXQ  E(S(T!:E2'{(RExtract which member? Jg:U2!"%>_zWq *%R Wrote R sectors ((#RK) !~(.( ~(.( #>  #~ >  D !] !6<(5RFile exists; purge (y/N)? g(#] 0 ^#VS}#^#VShz .REmpty 2! RLBR read errorNc !/g!/R: :T(;R WARNING: file could NOT be read completely into RAM *.R bytes (<<$l&Rk):kgR in :S=G!(:_U:W_R lines, *!K.^# x({08 #R words ɯ2T:' :X:f(:fQ(qZ ̓X[:X !"hRReadingͬ   !:= :q *h+"h| S S *r / O!yy?O0##^#Vz( >>7{?/RUncrunching: !["rSt/ vr / r  / . (2n̓/ (![ G> nxn/ ( ] n/ *aR"v *r8[R". R !"}!  g &RLater version uncruncher needed RFile is corrupt *RNot enough memory or stack overflowRUnknown uncrunch error: 0n*r|8  !~#"r:w \̓ N{g[R)D*%#"%!}O[([vq St> >>>7*ɯ 8@!9"!.">0g">(g/g$"|g.*|:*8gz?/ / / / !0 0F Rh y!"L> 22!ͼ< ,>2> 2X !ͼ 2go"" (!~6̶:( ("88(!~6̶:( <2"8(*:~{  go"2h > 2>2>2:( :g~ w*9 :gk~ >2> 2Ͷ2~ V|g^zW:|g~|g~2O*$% (o%S $"&"( =g}S % >S *:G:x Gͼg:gOD~(|0g~( G|gn``g|gq*+"|=2r|gsK*:g:w|gs|gw*#"#:2:< (2>2*6#_@s# x }eo0 $: :g:G}/< OT]Ͱ0*:GzGKͰ |0g~# x 7ɅoWgG}oO0#z|> )))).))0 = ))))lz={0:G:Oy&O{_zW y2z7/ 7*_ ]*6#(_GL~(m*r|gs:gyg*:W|G>2xL~(!: V|gn:g~ "m*|*#"*:G|gp]))))o{g:g#*"*u{ozg"!  >2T:B>(w",[R".*~̈́( 80d~#̈́( 0 y ڐ>2k*.}|(<2SG[!ys#r# ɯ2k2x*K.>++~ ( >2x!*K.>+6 #*"y{K.!:> = s#r##: x#2W}2S*,s#r:k :x( |(p>2l:SG:l8x2l:k:l([o&+)y^#V:G:;(#j Z:G~#nh2;͛~# ( (n"*:Y()> n++"*:T(͐R..End of file..gtJG:U( 2l2U2x :<xQ!Œ`i)&^#V -ABCFI LQRTX/?     G (!"p :U(*p+"p| 0:n0G:UO2UG:S???0[S!]   < 9:X =2X!e6L#6B#6RR ++ No matching files ++ !=Ɓo&{ } o~ +~C #~O #~M( # < |(?R ++ Too many files matched ++ ++ Be more specific ++ }2Su :X2:= M!]^"w!uwR Files matching :\ :@n>:n*+R: :G R File (1-y2So&R) 2UJO:U yQ!bG:ڟg2U=2oh&)))[] :[u t!e~L#~B#~Rɯ2;!l422;͠:l= :<2l!!͠{!FF~N(!N tu:Y2Yg**:kd:lG:Sʴ~:22;:k2k*"m`Ð>2<͸:2:;(x2lÛ:TĐR * String not found * [mz(>2<͛[m:<([**,R0[M2>RFind:  :ʕG:- M(J>(E?!~#986y ''''Obk?R}2O!?>2>[:(:lG: h&)y^#V*,:k +2<R86(4DM!\:>! :N!(!6ͯͱ8U2;2Z2[*:(!"m++## QF˸  G~Qx7ȷ4:ݾ(ͯͱ8~= ÁSZo&"m!y:Gn#f#R8(>2;0:0 ag?Ʃ7?>2=~#(n2=> n> ́t 2)> PG:N :)N8 B<2)>>7x 0+ (. :)/@(!)4O*R: Page :lo&R of :So&:T(>+n> n====}0n/ 8z/W{/_y10xynG: `.[:(~: [R|.6}.6:;($:>(j Z~#.6h͛ ~#.6x :;(:> j Z~#Dh͛~#D"*> n:Y> n????0:nn 88>.na{ ~#!Z[ZR (( ( 2(:00010000FF ͯͱ8U2;2Z2[*:(!"m++## QF˸  G~Qx7ȷ4:ݾ(ͯͱ8QL31.DOC documentation and usage of QL.AZM rev 05-17-88 v3.1 Quick look typer for reasonably sized libraried or unlibraried, crunched, squeezed & normal text and binary files, with optional disk output, for z80 cpu's only under CP/M 2.0 or later. QL was written by: Nick Dobrinich 4337 West 48 Cleveland, OH 44144 Features: fast random access paging of libraried or stand-alone, crunched, squeezed or normal text files ddt-like display of binary files, crunched, squeezed or normal easy access to library members easy extraction-to-disk of library members numbered access to files/libraries on disk (sweep mode) page numbering immediate jump to any page core dumping fast simple string searching for text and hex bytes within files and core for reasonably sized files or as much as can be entirely ram resident where 'reasonably sized' means: 50k for normal text files 50k for squeezed files after unsqueezing 28k for crunched files after uncrunching in a 62k system (BDOS at 0e200h). < Release > This code is placed in the public domain. Don't sell it. Don't send money. Don't sue me. Don't claim you wrote it. The code for unsqueezing and uncrunching is copyright 1986 by Steve Greenberg & C.B. Falconer for private non-commercial use. They wrote it and I want to credit them for excellent work. Implementation time was less than 2 hours to add a working uncruncher to QL v1.6 without benefit of a linker. Features marked '{}' are user configurable by setting equates in the assembler source. < Usage > QL [d:]filename.ext for stand-alone files, crunched, squeezed or normal, text or binary QL [d:]lib for libraried files, crunched, squeezed or normal, text or binary where: QL gives the usage message and asks if you want to do a core dump, which page displays what's currently in memory in hex/ascii QL filename.ext types a normal (uncompressed) file QL filename.eqt types a squeezed file QL filename.ezt types a crunched file QL lib lists active members in library lib and allows choosing members by number to display. {If half-intensity is enabled, *.c?m files will be at half brightness.} QL afile.ext (ambiguous filename) lists all filenames that match the ambiguous filename and allows choosing a file by number. The file chosen will then be opened as a normal, squeezed, crunched, or library file. QL alib (ambigous libraryname) if no files with  blank extensions are found, collects all matching LBR files as above. If a specific file is called for, QL will read the entire file (or as much as will fit) and display page 1. If the second letter of the file extension is 'Q', QL will unsqueeze the file first, which can take 10 seconds or so. If the second letter of the extension is 'Z', QL will uncrunch it first. QL summarizes actual file size (and total line and word count for text files) on exit and on the help screen if it is able to get the whole file into memory. If the specified file is a library, QL will list all active members of that library on entry and exit and allow you to choose a member by number to display. Members may be crunched, squeezed or normal, text or binary. A member number choice of C or X will exit QL. The .LBR extension should not be added unless you want a hex/ascii display of the library file itself. If the specified file is a binary file, QL displays it in 256 byte pages in ddt-like hex/ascii format, origin assumed to be 100h. If QL is invoked without a file or library name, it will display its usage message and ask if you want a core dump. If you choose 'Y', the first 256 bytes of memory will be displayed in hex/ascii format. You can then apply all the commands below (except A to toggle the display to text), including finding text strings or hex bytes in memory. < Commands > / or ? redisplays the sign-on help screen. Shows actual number of bytes in file (and total number of lines and words if a text file). B or - backs up 1 page, where a page is {22} lines. For binary files, a page is fixed at 16 lines (256 bytes). space displays a single line forward. There is no command to display the last line backward. Go back a page and space line by line forward. any number jumps to that page or to end of file. 0 jumps immediately to top of file: to page 1 if text; to page 0 if core dumping. {If delay > 0 (see below), type '1' and wait patiently for 1 second.} F finds a text string (case sensitive) forward from: {top of file if findfrtop equ true start of current page if findfrtop equ false} and displays that entire page with all found strings marked \string\. (If reversevideo equ true, all found strings will be marked in reverse video.} If the find string is prefaced with '-', a search for hex byte(s) will be done, in either text or hex/ascii display mode. Format for Find: -cd0500 with no separators, 2 hex nibbles per byte. Up to 19 hex bytes can be searched for. Only the first byte of any matching strings will be marked in hex/ascii display mode: if a hex find string was given, on the hex side; if ascii, on the ascii side. In text mode, control characters (cr, lf, tab) can't be highlighted, but all printable characters of the found string will be. Don't search for -0d0a in text mode (you already know where they are) or the display will scroll to eof. In hex/ascii display mode, you can search for the end of file marker with -1a. R or C Repeats the find forward to the next page having an occurrence of the find string. Repeat is not circular, but you can go back to page 1 and repeat it. A repeat find will never succeed on the current page and thus can never succeed on page 1 (though Find can succeed on page 1). A alternates display between text and hex/ascii. QL decides on its own how to initially display a file, but could be mistaken. Alternating the display works fine for real text files, where you might want to see if characters have bit 7 set or something, but will probably fill the screen with garbage if you try to do a text display of a binary file. It can also crash the program, but no protection is provided for this possibility. This option is disabled when core dumping because it would display nonsense. T toggles truncation flag from the initial setting: truncate lines > columns-2 with '>' to/from: wrap long lines onto the next line if necessary. This goofs up the display a little by scrolling lines off the top of the screen if they're > 80 characters, but can be useful with assembler .PRN files since there is no command to scroll the screen horizontally. Going forward by single lines with the space bar is a good way to use this option. I toggles case insensitive flag. Initial setting is OFF. All Finds (or Repeat finds) initiated while this toggle is ON will ignore case, hex searches excepted. E extract a library member. Obviously only works when you are viewing the contents of an LBR. Disallowed if the WHEEL byte is zero; if QL is not being run on an RCP/M, this doesn't matter. When you type E, you are prompted for the number of the member to extract. If it's squeezed/crunched, it will be unsqueezed/uncrunched. The ENTIRE file will be saved to the default drive. If the file already existed, you'll be asked whether to delete it before it is deleted. S save a library member. Same as E command, except that unsqueezing/ uncrunching is disallowed. X,^X, exit QL with a summary, warm booting if the ccp was overwritten. ^C, If working from a library, the library directory is redisplayed ^K, with member numbers and you can choose another member to display. esc, {*.c?m files are displayed at half-intensity. You can still or Q choose to type them, but you will get a hex/ascii display.} {If delay > 0, does not have to be typed after the member number.} any other key displays the next page forward leaving {1} overlapping line. 'N' for next page is convenient since it's right next to the 'B' key for back a page. All the commands can be customized and QL reassembled. I too hate programs that make me work their way. ----------------------------------------------------------------------------- < Customization > There are a large number of "user customization" equates at the beginning of the QL source code. They are all fully described there, so the description will not be duplicated here. Most can be left the way they are. If your terminal has either dim and/or reverse video capability, however, it is definitely recommended that you answer YES to those two questions and fill in the appropriate sequences for your terminal where indicated for the full benefit of QL. Equates are initially set for a Kaypro 84 series machine. The supplied version of QL.COM was assembled without any of the jazzy stuff and only requires that the clear screen code be 1ah. < Assembly > ==> If you are generating the ZCPR3 compatible version, please see the file ==> QL$ZCPR3.DOC for assembly instructions. Extract and uncrunch QL.AZZ and UNC.AZZ files from the library. They will have filetype .azm after uncrunching. Also extract and uncrunch QL.0Z2 from the library. (It will become QL.002) Optionally, extract and uncrunch Z1.CZM assembler. Set user customization equates in QL assembler source to suit your terminal and personal preferences. Then assemble as follows: With "Z1" (supplied) - Leave file name "QL31.AZM" and make sure the assembler equate "M80" is set to FALSE. Type "Z1 QL31" to assemble. With "Z80ASM" (SLR) - Rename the file QL31.Z80 and set assembler equate "M80" to TRUE. Type "Z80ASM QL31" to assemble. With "M80" / "L80" or "LINK" Rename the file QL31.MAC and set assembler equate "M80" to TRUE, and delete the two semicolons near ".Z80" immediately below that. Type "M80 =QL31/N" to assemble. Then type "L80 QL31/P:100,QL24/N/E" to link, or just "LINK QL31" if you have the DRI's LINK. Z1 assembler notes: If you modify this code, the Z1 assembler requires all condition codes to be in UPPER case: ret z jr c,label ; won't assemble ret Z jr C,label ; will If you try to assemble with 'Z1 QL.AAZ', you will get an out of memory error. Just use 'Z1 QL' and everything will be oky-doke. The QL.PRN file will be quite small (symbol table only), unless you've removed the 'nlist s' statement near the top of the source file. Doctor, it hurts when I go like this. Don't go like that. < QL Error messages > File Not Found } Library Not Found } obvious No matching files } File exists; purge? } Disk full } occur only when extracting No directory space } LBR read error something is wrong with the library file: a bonged library directory or end of file encountered when reading a member. WARNING: file could NOT be read completely into RAM This is a warning message, not an error. We don't do any virtual memory stuff with this program, so if a file is too large to be read entirely into RAM, QL reads (and unsqueezes/uncrunches) as much as possible and displays what it can of the first part of the file. There is no way for QL to go beyond this without paging text to disk, which is too slow. The way to handle this for minimum disk use is to break large files up into 25k or smaller chapters, crunch them and library the crunched chapters together. Unsuccessful finds in partially read files will also give this warning. However, extraction from LBRs will never give this error; when the buffer gets full, it is simply emptied to disk and extraction continues. Empty library member has zero length, probably just for dating library creation. Later version uncruncher needed The uncruncher checks the version number with which a file was crunched. Up to version 2.0 is supported in this release. When later versions are used to crunch files, QL may fail to uncrunch them with this error. File is corrupt Bad crunched source file: try another copy. Not enough memory or stack overflow Uncruncher error. Should never, ever happen. Unknown uncrunch error: # Default uncruncher error trap. This happens if uncruncher work area gets overwritten (error #0) and for other major catastrophes. < Implementation notes > The file to display must fit mostly in ram (no virtual stuff), but this is useful for most reasonably sized files. QL.COM is around 5k and requires a 1k pointer table and 200 bytes or so for variables, leaving 50k or so in a 62k cp/m system. If a file doesn't fit, the page number display will have a trailing + sign (Page 1 of 78+). Squeezed files must fit mostly in memory when unsqueezed. They are identified by a 'Q' as the second letter of the file extension. Since unsqueezing a file is the only way to know how long it will be and that varies according to the compression ratio, which varies according to the kind of text that was squeezed, QL tries to do the right thing with big squeezed files (it shows as much of the first part of the unsqueezed file as possible when it detects the unsqueezed text smashing into the bdos). The only way to tell if a file can be completely unsqueezed by this utility is to try it. No harm can result. Crunched files must also fit mostly in memory when uncrunched, but there is a further constraint: the uncruncher efficiently occupies 24k in a work area just below the bdos. This effectively reduces the size of crunched files QL can handle: in a 62k system, about 28k is the largest uncrunched file that will fit. As in unsqueezing, QL will display as much of the first part of the file as possible. Beyond that, you need another utility. If a compressed file (like QL.AZM, which is not crunched) fails in uncrunch or unsqueeze, it is tried as a normal uncompressed file. All additional memory up to and including ccp if necessary is used as a file buffer. QL will not allow overwrite of bdos and warm boots only when ccp gets smashed. The ccp is always overwritten when working with crunched files. Once the file is loaded, there is no further disk action until exit when, if you're working from a library, all members of that library are again listed. The load and unsqueeze/uncrunch time was put up front because I don't like the disk constantly starting and stopping while I'm reading. Reading and unsqueezing/uncrunching in the background would be nice, but... QL is self-initializing. If you use a replacement version of ccp that has a 'go' command, you can just type 'go fn.ext' or 'go lib' to reuse QL without having to reload it. The only terminal capability required is erase screen and home cursor. Direct bios character output is used to speed display but may be disabled. Half- intensity can be used to display *.c?m library members at reduced intensity. Reverse video can be used to mark matches to finds. Mostly compatible with Wordstar document files. QL will fail to find a string only if the first character to find is the last character of a word, which will have its hi bit set by WS. Most normal finds work ok. If you want to type in the hex bytes, a first character with bit 7 set can also be found. If builders built buildings the way programmers wrote programs, the first woodpecker to come along would destroy civilization. In particular, the find string code is held together with chewing gum and is easy to derail. In hex/ascii core dumping, finds start on the current page and, if below page 25 or so, scan QL.COM and its data area, which will generate spurious matches. Useful core data (not QL itself or its data area) will be found above page 25. Reasoning: it was confusing to be able to see something in core and not be able to find it in a search so I left it this way, but these unexpected matches are dumb too. Beware of roaming into your roms when core dumping: if you have disk controller roms lurking in high memory, strange things, none of them good, may happen. Finds in page 255 can't succeed. The word count for text files is approximate, based on the simple definition of a word being a string of ascii masked characters >= '0' (30h) and < 80h. Needs more thought. An excellent way to use the "sweeping" ability is to say QL B*.*. Then you can go through and examine all the B*.T?T, B*.D?C, and B*.LBR files. The sweeper stores the matching filenames at the bottom of the text buffer, so if many files match, a large text file may not fit. The maximum consumed by the sweeper is 2816 bytes (for 255 files matched). < History > ver 3.1 (rjp) 06-09-88 - Working from QL26 by Bruce Morgen (4/6/88), made compatible with ZCPR3. Setting the equate ZCPR3 to TRUE should make this work; however, I have not tested it, for I do not have access to any ZCPR system. Assembly information, quoted from QL26.AZM, has been placed in the file QL$ZCPR3.DOC. - Added 'S' command to Save library members without decompressing them. - After extracting or saving a file, QL will report the file size in sectors and in K. - A check for out of disk space, omitted by some oversight, was added to the file extraction code. - ALL of the extraction code can be bypassed by setting the option equate EXTR to FALSE. This saves a few K in program size. - Added case-insensitive searching toggle, controlled by 'I' cmd. To do this required that the search be made slower; sorry. It now takes about 3.25 sec to search all of a 60K file, instead of less than .25 sec. - Added ability to select files by number. If you specify an ambiguous filename on the command line, QL will display all the filenames that match and ask you to select one. (If none were found, QL will search for libraries with matching root names, just like it does with unambiguous files. If exactly one matching file was found, it will skip the selection process.) ALL matching files, including LBRs, are available for selection. If an LBR is selected, it will be opened as a library UNLESS you specified .LBR in the ambiguous filename, in which case it will be opened as an ordinary file. When you exit from viewing a file, the selection menu pops up again. - A few cosmetic changes: cleaned up the usage message, added and removed CRLFs to neaten up the display, added "Members in d:library.LBR" message, and displayed default disk in "d>Member (1-xx)" message. ------------------------------------ Bug reports: Leave mail at one of: CRUNCH RCP/M [Steve Greenberg] (201)447-6543 Holly Park RCP/M [Dick Roberts] (201)757-1491 or US Mail: Ross Presser 209N Haddonview Apts Westmont, NJ 08108 Nights: (609)869-0298 ver 3.0 (rjp) 05-17-88 - Incorporated the fix in QL25BFIX.LBR, supplied by an anonymous programmer, which fixes what is probably the last bug in the file extraction code. Changed major revisio n level to 3. Also, if the "E" command is disallowed (no WHEEL), it will not appear in the help menu. Also included QL25B/30.DIF, a SSED script file for updating ver 2.5b to 3.0. ver 2.5b (rjp) 04-21-88 - Corrected several disastrous bugs in file extraction code. ver 2.5a (rjp) 04-11-88 - Added capability to extract (and decompress) files from libraries with E command (only if WHEEL). Member is extracted to default drive; if file already exists, user is asked whether to purge it. - Moved size of CCP from CHKSUMCCP routine (hard-coded) to CCPSIZE equate. - To recognize the fact that some reverse on/off sequences occupy space on the screen, the flag REVSPACE was added. Set it to the number of spaces to reserve for each REVON and REVOFF command. - Added two instructions in the initializing code to zero the R2 byte in the default FCB. Some CCPs (mine!) do not automatically zero this byte; if it is not zero, the first sector of uncompressed, unlibraried files that match *.?Z? or *.?Q? is not read in properly. - Added ability to display non-displayable control characters with dim-video. This is controlled by the flag CTRLDIMVID. Changed CTRLDISPLAY to CTRLWORDSTAR; added (computed) flag CTRLDUMMY = .NOT.(CTRLDIMVID.OR.CTRLWORDSTAR) - Split the source file into two parts to make it easier to edit! Note: I was going to call this QL26, but before I was finished someone had already pre-empted that name. I was NOT going to start my changes over again with QL26. Therefore I am calling this QL25A. ver 2.5 (sgg) 02-28-88 - Corrected a bug which prevented all previous versions from being able to uncrunch a file if the system's BDOS started at an address other than a page boundary or a page boundary plus six. This would cause an "unknown uncrunch error", which wasn't even the "correct" error message due to another bug in the error message reporting code (also fixed). - Eliminated the use of alternate registers and the associated EQUate. Use of the alternate registers conflicted with some systems. Removed redundant register saves and eliminated a subroutine level in the same same area (memory i/o routines). Also: - Added Wordstar-like ability to display control characters not otherwise handled (eg "02" in a file will display as "^B"). - Added ascii FF (formfeed) char to the "legitimate character" list, so documents with a leading formfeed won't come up in hex mode. - Changed most JP's to JR's in UNC.AZM, and removed the extra entrypoints and associated code not used by QL. ==> Many thanks to Ken Reid and Mike Greenhill. ver 2.4 (sgg) 01-25-88 To make QL a viable "online" utility: added BYE detect: adjusts memory limits and inhibits video attribute xmit checks wheel byte: inhibits system COM file and "core" dumps. continuously checks for ^S, etc while running remote. Stronger checking of user keyboard input some synonyms added. Added M80 EQU to allow assembly under M80 / SLR Z80ASM. Used macros so terminal attribute sequences could be relocated to the beg- inning of the file (configuration section) where they logically should be. Other misc. changes. ver 2.3 (njd) 12-27-87 fixed a nasty bug in ws doc file handling and other doc file goofs. added tab expansion to spaces option. added @ marker character for control characters we can't reliably send to a terminal. added truncation toggle command. Removed truncation logic to putc: rtn where it belonged, but not before torturing myself at length with the old scheme. ver 2.2 (njd) 12-12-87 release halted due to a nasty bug in ws doc files. added core dumping option if no file or library name is given. added filename.ext to summary. added summary word count for text files. fixed line counting in ws document files with page breaks. better eof handling for files just larger than available memory. ver 2.1 (sgg) 12-5-87 - Changed display of library member filenames. Now includes the reference #. - Eliminated "File not found" message each time a library was opened. The message will only appear if neither a plain nor .LBR file with the specified name can be found. - Added "Q", escape, and ^K as additional synonyms to existing eXit & ^C for BISHOW, LIST61, and generic compatibility reasons. - Changed code which outputs the uncrunched filename to prevent it from outputting any chars in the header beyond the filename (CR23D compat.) - Added UCHEX equate for those who prefer upper case letters in hex dump. - Took the liberty of removing my own name (and cbf's) and copyright message from the display (still embedded in the code, however). Made some changes to the main help menu as well. - Steven Greenberg ver 2.0 (njd) 12-1-87 included uncrunching capability, courtesy of Greenberg & Falconer. changed unsqueezing method to read & unsqueeze simultaneously, like uncrunch. Can handle much bigger squeezed files. What was I thinking before? added checksum verification of ccp overw rite instead of a lot of bookkeeping. added hex/ascii display of non-text files and as an alternative for text files. added partial display of files too big for available memory. changed the whole find string philosophy. added highlighted display of found strings in text and hex/ascii. added find of hex byte strings when prefaced with '-'. deleted all page tagging code, unnecessary with page number selection. eliminated most self-modifying code. ver 1.6 (njd) set fcb1 r2 field to 0 to avoid random read (bdos fn 33) error 6. capitalized jump, call and return condition codes for Z1 assembler. removed 'title' directive (unsupported by Z1 assembler). added conditional for Z1 assembler to generate a .COM file directly. ver 1.5 (njd) fixed dumb error in deleted member handling. ver 1.4 (njd) removed Member Not Found and substituted numeric choice of members from the library directory. added half-intensity option for *.c?m members. added option for DOS+ bdos call 211. ver 1.3 (njd) added library searching and directory listing capabilities. added unsqueezing and protection from squeezed files that get too big. added option to not use bios console output routine to speed display. added delay code for page number input without . eliminated scroll on forward paging. added total byte and line summary. made line overlap user configurable. use computed file size to see if file will fit below bdos and if it will overlay ccp instead of reading until collision. fixed single line forward so it adjusts current page as expected. added long line truncation flagging with '>'. ver 1.2 (njd) added page tagging. If usealtregs is true, this feature uses the z80 alternate register set, which may be incompatible with your system, particularly if it is interrupt driven. Set the usealtregs equate false to use fake memory register code (which is slightly longer) and reassemble. Page tagging can be eliminated by setting pagetags equate false. page pointer rtn now looks for lf instead of cr, which is the way it should have been written in the first place. Ah, middle age... during page number jumps, watches for sufficient number of digits for page to jump to. better command parser and clearer program structure. made reentrant for zcpr 'go' cmd by initializing storage. added version numbering. ver 1.1 original for standard text files. < Credit where it's due > QL was inspired by bishow.asm by Phil Carey, W.F. McGee, H.M. Van Tassell and many others. The unsqueeze code is adapted from lt18, copyrighted by Steven Greenberg and C.B. Falconer, which is a much more versatile program but doesn't permit random access. The uncrunch code is uncrel.mac by Greenberg and Falconer. Kudos to Neil Koozer for his speedy Z1 assembler which halved the time of the basic edit > assemble > crash cycle. The user commands are as similar to sweep and nulu as I could make them so you don't have to learn yet another set of commands. My thanks to contributors to the public domain who have taught me much. If you're so inclined, hack away at this to improve and extend the code or to suit your own preferences. I only tend to abuse a program one way and this has only been tested on Kaypro equipment. Also, I haven't tested all possible combinations of equates, although I've tried to remove any dependencies between them. Please report any significant bugs in writing or through a Cleveland BBS. QL31 update notes: - Working from QL26 by Bruce Morgen (4/6/88), made compatible with ZCPR3. Setting the equate ZCPR3 to TRUE should make this work; however, I have not tested it, for I do not have access to any ZCPR system. Assembly information, quoted from QL26.AZM, has been placed in the file QL$ZCPR3.DOC. - Added 'S' command to Save library members without decompressing them. - After extracting or saving a file, QL will report the file size in sectors and in K. - A check for out of disk space, omitted by some oversight, was added to the file extraction code. - ALL of the extraction code can be bypassed by setting the option equate EXTR to FALSE. This saves a few K in program size. - Added case-insensitive searching toggle, controlled by 'I' cmd. To do this required that the search be made slower; sorry. It now takes about 3.25 sec to search all of a 60K file, instead of less than .25 sec. - Added ability to select files by number. If you specify an ambiguous filename on th e command line, QL will display all the filenames that match and ask you to select one. (If none were found, QL will search for libraries with matching root names, just like it does with unambiguous files. If exactly one matching file was found, it will skip the selection process.) ALL matching files, including LBRs, are available for selection. If an LBR is selected, it will be opened as a library UNLESS you specified .LBR in the ambiguous filename, in which case it will be opened as an ordinary file. When you exit from viewing a file, the selection menu pops up again. - A few cosmetic changes: cleaned up the usage message, added and removed CRLFs to neaten up the display, added "Members in d:library.LBR" message, and displayed default disk in "d>Member (1-xx)" message. ------------------------------------ Bug reports: Leave mail at one of: CRUNCH RCP/M [Steve Greenberg] (201)447-6543 Holly Park RCP/M [Dick Roberts] (201)757-1491 or US Mail: Ross Presser 209N Haddonview Apts Westmont, NJ 08108 Nights: (609)869-0298 ------------------------------------------------------------------------ QL30 update notes: - Incorporated the final fix to the file extraction code, which was supplied by an "anonymous" programmer. A slight change to prevent the "E" command usage from appearing if it would not be allowed. Edited doc file somewhat. Main reason for version change was to clear up confusion between QL25A/B/... series and QL26. QL31 will definitely incorporate the Z-system capabilities of QL26. - Included in this library is QL25B/30.DIF, an SSED script file for updating QL25B.AZM to QL30.AZM. See QLDIF.DOC for details. - Ross Presser 5/88 ------------------------------------------------------------------------ QL25B update notes: - Fixed several disastrous bugs in file extraction code. - Ross Presser 4/88 ------------------------------------------------------------------------ QL25A update notes: - Added capability to extract (and decompress) files from libraries with E command (only if WHEEL). Member is extracted to default drive; if file already exists, user is asked whether to purge it. - Added two instructions in the initializing code to zero the R2 byte in the default FCB. Some CCPs (mine!) do not automatically zero this byte; if it is not zero, the first sector of uncompressed, unlibraried files that match *.?Z? or *.?Q? is not read in properly. Note: I was going to call this QL26, but before I was finished someone had already pre-empted that name. I was NOT going to start my changes over again with QL26. Therefore I am calling this QL25A. Other misc. changes: See doc file or source. - Ross Presser 3/88 ------------------------------------------------------------------------ QL25 update notes: - Corrected a bug which prevented all previous versions from being able to uncrunch a file if the system's BDOS started at an address other than a page boundary or a page boundary plus six. This would cause an "unknown uncrunch error", which wasn't even the "correct" error message due to another bug in the error message reporting code (also fixed). - Eliminated the use of alternate registers and the associated EQUate. Use of the alternate registers (without saving) conflicts with some systems. This problem reared itself as of v2.4 because earlier versions were distrib- uted with the alternate register equate set "false", and most people did not fool with the equate. Now it is foolproof. - Added Wordstar-like ability to display control characters not otherwise handled (eg "02" in a file will display as "^B"). - Other misc. changes; see doc file or source. --> Many thanks to Ken Reid and Mike Greenhill. -S. Greenberg 28 Feb 1988 ---------------------------------------------------------------------- QL24 update notes: NOTE: Many changes for this version were intended to make QL a viable online utility for RCP/M systems, allowing the user the convenience of finding, skipping, and going backwards thru crunched / libraried files as well as previewing non-text files. Most of these features are not available on current RCP/M systems. ---------------------------------------------------------------------- (Note tab expansion was added as of v2.3) v2.4 Summary of changes: 1. Checks for existence of BYE. If BYE is present, QL will limit its memory usage to 2k below the BDOS base. Previous "CCP overwrite" ver- sions had shown conflicts with some installations of BYE. Note that when existence of BYE is not detected, the full memory usage of pre- vious QL versions is retained. 2. Furthermore, it is assumed that if BYE is present, the program is being operated remotely. It is also assumed to be undesirable to send video attribute sequences to unknown remote terminals. Thus  when BYE is present, dim, reverse video, and clear screen sequences are inhib- ited. 3. Checks WHEEL byte. It is assumed it would be undesirable to allow a normal (non-wheel) user to do any of the following: a) examine .COM files, eg those on A0: of an RCP/M (for example, a user could dump the contents of a passworded WHEEL.COM program and get the password, etc.). b) examine or even acknowledge existance of files w/ SYS attribute set. c) to do a "core dump" of system memory, which could probably make him privy to all sorts of meaty information lurking around. Note all of these functions are deactivated based on WHEEL, not BYE, so a SYSOP could remotely examine his system memory. Also note that the user WOULD be allowed to examine any OBJ or CZM files which are on the system- these are presumably there for downloading anyway. This gives serious RCP/M users a new flexibility. 4. Continuous monitoring and processing for ^S (pause) and the various abort characters have been added during remote operation. 5. Annoying unintended aborts have been minimized ( eg. v2.3 aborted if "+" was hit). The user must actively type something like X, Q, ^C, or ^K to abort. 6. Additional "forward" and "backward" synonyms "+" and "-" added for EDFILE compatibility (also "C" for "R" [repeat find]). "/" for help added for ZCPR types. 7. Generalized the code so it can be assembled by any of Z1 (included), M80 or SLR Z80ASM by changing a single EQU. A change in the way memory is allocated at the end prevents generation of a large amount of excess zeroes at the end of the COM file, regardless of which assembler/linker is used. (Other small details changed to numerous to mention here. Some are cosmetic. With apologies to author Nick Dobronovich's style prefer- ence, this release has been "FORM7"'d to upper case source, lower case comments. This was done partly to avoid possible problems with the "Z1" assembler, which insists that the "condition letters" of all Z80 conditional instructions be capitalized, even if the rest of the source isn't). - Steven Greenberg 25 January 88 Fast, memory based file viewer. Features: Quick, numbered access to files on disk, and members in library Page forward/backward thru normal, WordStar, or compressed files Auto select or toggle ASCII or HEX display of file or core Library member extraction to disk with/without uncr/unsq String or hex byte search - optionally ignore case Optional dim and reverse video to enhance display Can be configured for ZCPR3 compatibility and/or RCP/M security This file contains instructions on how to create a ZCPR3-compatible version of QL31. All lines beginning with a semicolon have been quoted from QL26.AZM. The following is quoted from the history section of QL26.AZM: ;------------------------------------------------------------------------------ ; < History [recent] ==> See doc file for full history > ; ; Version 2.6 Bruce Morgen April 6, 1988 ; Introduced conditionals to create ZCPR3-compatible version which gets ; all its terminal data from the Z3 environment and accepts DU:/DIR: ; specs from the command line. This option requires assembly to a REL ; file and linkage with VLIB, Z3LIB and SYSLIB. Most linkers will ; leave a substantial vestigial DSEG at the end of the resulting COM ; file which can be safely deleted with a debugger and the SAVE command. ; The Z1 assembler (or Z80MR) cannot be used if ZCPR3 is equated TRUE. ; Use the "/6" option if using an SLR assembler, "/Z" with M80 (so you ; won't have to concern yourself at all  with the ".Z80" directive, as a ; matter of fact, "M80 =QL25.AZM/Z" will work just fine, no renaming!). ; Linkage with L80 or the non-"virtual" SLR linker is tedious and will ; require a two passes, the first to determine the end of the CSEG, the ; second to create the COM file. DRI's LINK or Echelon's ZLINK are much ; more convenient because they automatically put the DSEG after the ; CSEG. If ZCPR3 is equated FALSE, the traditional QL assembly methods ; will work as before. ; ; IF RE-ASSEMBLING with "ZCPR3 EQU TRUE": ; Note that I use a beta release of the new Z80fied LIBs soon to be ; available from Echelon - although the old 8080-compatible versions ; SHOULD link in as-is, please don't count on that! For example, ; Z3LIB 1.3's rendition of the routine GETCRT trashes the BC register ; (it doesn't have to - just careless coding), so one or more GETCRT ; calls may have to be have to be bracketed by PUSH/POPs of BC for ; QL to work. That's the only bug that I KNOW to be a problem, but ; be careful, because there are so many versions of the LIBs extant ; in the various PD archives and on RCP/Ms. b/m April 6, 1988 ------------------------------------------------------------------------ The following is quoted from the assembly instructions in QL26.AZM: ; < Assembly > ; With "Z1" (supplied) - ; Leave file name "QL25.AZM" and make sure the assembler equate "M80" is set ; to FALSE. Type "Z1 QL25" to assemble. ; With "Z80ASM" (SLR) - ; Rename the file QL25.Z80 and set assembler equate "M80" to TRUE. ; Type "Z80ASM QL25" to assemble if ZCPR3 is FALSE. Otherwise ; type "Z80ASM QL25/6" - then (if you have DRI's LINK) type ; "LINK QL25,VLIB[S],Z3LIB[S],SYSLIB[S]" making note of the end ; address of the code (program) segment. You can then use a ; debugger (DDTZ and SID are the most convenient for this chore) ; to delete any part of the COM file above that address. Use of ; Use of L80 or the non-"virtual" SLR linkers is possible, but ; you'll have to do it in two passes, the first to determine ; where CSEG ends and the second with the "/D:nnnn" command set ; to the appropriate free address. This rather awkward ; methodology is detailed in the documentation for C.B. Falconer's ; "LT" program. ; With "M80" / "L80" or "LINK" ; Rename the file QL25.MAC and set assembler equate "M80" to TRUE, and delete ; the two semicolons near ".Z80" immediately below that. If ZCPR3 is FALSE, ; type "M80 =QL25/N" to assemble. Then type "L80 QL25/P:100,QL25/N/E" to link, ; or just "LINK QL25" (if you have DRI's LINK). If ZCPR3 is TRUE, type ; "M80 =QL25" and then (if you have DRI's LINK) type the line ; "LINK QL25,VLIB[S],Z3LIB[S],SYSLIB[S]" making note of the end address of ; the code (program) segment. You can then use a debugger (DDTZ and SID are ; the most convenient for this chore) to delete any part of the COM file ; above that address. Use of L80 or the non-"virtual" SLR linkers is ; possible, but you'll have to do it in two passes, the first to determine ; where CSEG ends and the second with the "/D:nnnn" command set to the ; approriate free address. This rather awkward methodology is detailed in ; the documentation for C.B. Falconer's "LT" program. ;============================================================================== I have not been able to test this assembly procedure, because I do not have access to a Z3-system machine. QL31.002]U+ ;@ # $ x 9e@y7gq獜5i0rLC 0 Ƽi9eȀ0M= Æ:nI`⧛1yI2"7LccĆACGN1tBy"M7i昬g60qYM՝5qMoެb9ab28jwd|©cba q#2É,H'D<1#a IP )I޿ H@Wb~"m)E$p%tYʴm\N9n,ofIFXr% l!u|(ou{?!Oacq5!QZZUcQ*ihsq %%rM] \zyiebm MG0+ CgU-J4nT # .,  O,LL,7feDG˜DPH @p1uCI' CR"G070VQjR0 mHah0x@:@ M= uHh%("BC0(. -hu La3Μl! p250) o|;_dX&WvҊq Q;iC|[ʐ<6~u|d"abѭ xx#C0k)p iw)X KӏL"GRZ'KZ(^l&?i\|39P$^c{㑈KU0 ͧ2@ # UB_o!,^Xֆ͙,X p ljƘIN7;3񍏐$ȻI(}RtIbD!ο-{/Ca7% Qy$""2C:w,4lǫ/kSz<@-um;dB28U٭P\v΄n4ࠂaI<_S$ $ df  J['Ls xla:d~x-]~qn3y вVs O~-Ǘ |L $l tXDҐe"yldaVk>}L"K`,jF*@"5-aw5E_`JeUܒs5iW~R#9I v%w7>U5O@T@,aD1!CD8DTWW{2BzGy4ldx7zw3U  @6-z=PRPFDppu%?qcP(L@ A41L(auo' d'lhK5,;)d)2\   1!Yׇ rfauQSx:yUPDVx#lhgbT(wW;LWSa +epw4@-NwFxx=A"u+b5&m5be57rpzY7$Na$tq TxW|U*=K 号E(MfeR;-e0$Ea;57tK4}\+6>hn1}{_"j'}=`ܳ_`f _c%|fTo70(AQזsx~A+Aanwp{Ym 0"Xi>lUAjMyO9yt1>qrJu q{&o24"mCqYwYOGPQrY WIDёh0cqC>c-P8U[NR]Y'DArVd=`5uᘐyA| w D>Bb@+o=NxNPMP>q`%jc76U)U@I3b0#zR[UPR(ׅP @ِ T*>xAB&A 1plT` qoP7rOm$`ePj/K{ Q&˖=W>4@}*Z9ai MNVD`wo=*J9UT![I$ۊZeiaIb fڍAjYQj;AR6=n/Ay ~\'U1ʌGB`;T@{63~sSdsR"cgS s{!FZ6bFsj0b@we²Dp@jKBT2 r}呖@jaBqd(ic`*⃚C۰yc.eTw% D >{-0-CPR>|tO;1gmBϛԟb3k(:ԚEu'bnУtEպ:2dE*Go4dN7Q`;ӫ-wFb(EOz[ ,sBU$NXsrfAߛl-ؾSp]E'.P"' (12a?Q[@ {a0r21LORc6)*$ef+(0"`#ᡇ'ߣmiSpY ƶ ["+lABp%a 0" snq)+y/ƯsLuJn̸zw| Hɰ#8d] my1PlJJJp˜@ff<< Mu@<^-hX. y~ub +B| L̬k3GP" ̎V/a]8d۝A`94*XZ&& J:ltk)q̼9 E94GW7Z2S3*O@4#+.=V34˃A&mS |\d"[ޣ;P m;-}NXՙ$/tesvgaAPL@ qnm5"Ajt1'䰹z2qəlXJ*`؅:5u,;lZtT}p|Jbot $rqؓ]BCœ=7-gI[~D@[ 0z}AܥH0,νC0@Frmm X;-@L0-@R'@-GgޭM}'m* q٬< t{W"@AHDZ%]QP'{'" ~^"Nq(d.GpE/+E%Z">N WIA^"^"!$/W"^V#&.9Bn"".ʱAL&CwY e~iF{<0pL±sqXa.U4Hll,pQZDmɻI"3 &ꃵu[ />5NB+GEWE0qržע;F7NwξMPb~!BʅSL RE'TwR;}Ygr9aCr,0`=8"+VkMA^'G1?N|W"KPaaq i&hE%8the~W[%(銭>#_Ie\~(ڮSFT`מپ O =IaԼ9>g.0%j x2(OY8bhtG<5"<{L˧NR3ts~Ww>iu/hʩD!˲M@+h`+BYuL=

q2S8Lcm0F`̮fAC.(0\8ec@p=i{ &>A0aءB-\`#g/P. A`&MɸRj+壔ictQ`-Xp XQ:7WP[P`[{ÓĈpeA!c4Y<_"C.Q:S.- .sOB(i:y&1pE1EC+On4U{cavP0k6s HcPw@I+]9sPep6Mǎ|sGQ ]A]i]93w0-cPwF0B:qF@LcdTJu魀OT' TJuWM Ip2AGQ84M.x }m0ݪ5r,`կס9/3I9Z#$:ւ%LxB-gmWuJkv%׈#e,0;Ww{%-E=%<5 hP"+@*D:gn L(`\6:. PE=y8DAq,Dz b?"W Joa`O90لSp4nwxG)!qy<]OqSS)AD=$/ZB7݄SpP{kYXŐu<D9.%M]y)kgzAhPܼu]M8W@cme];@zAhP"Q!SS`b6x݄Sp4nXV6ڥ['}SpP{kXŐu<. Ps4،;s0]!s6$_?;WNP!S 0A]?:UfWwjZþkWFȨ)SD|r!،Bf|ԁ35oQ1%9!SpP|yBifC}m0ݪ5r,`]׹2Iݪ5r,`/BYA;I9Z#$:ւ%LxsPxy~<] _"z!,]@e2Mwm0$xR-C@ba͒w.%`]ȈG 5Lc%9fACgLcΛ9}9F!b9|#Bk9FN8JǪ`càf @Lc>\-C@+aCM8WP[PISe)|81I-\$_ڲ?9XR6.WP[G_kdC 1`Np.7Yac ձgb!I-*!F0BF,0믗!cqW7`7)#uQ,'+E2  -vq2)!cy[xָȋx,Z#'`b0{89\VfC 1<!I-*!WO>+N!Ic)?WP[PPZF*V ;WP[P8"'M(Z%"Wv: ku9u]}KcNm Ø F%"Wi`JL .:ê5r:\6 򧤙m/?SzJY3hnre2aj࿂WP[z7썬iNP"rx$:ȋ\.Kz,10Bv1?M-d;WP[z'QK!|+)"TPN,Z#'`h1:lLJ|s?8yO!(.zң B ;%,fn,<0r)òN<\Ě#09{l{|%3&_[Mh?re..} Vt灔/lbBr&Hyq;5A:#oE_]C@$KR,Um`Weւ'+CfnYI+CvUh?2C2S:Y饺aC@[|"9.cv!Sp%Q\Nc4l6]e !Ωc0rSp$G΋778"qqNJ eɚ3 OP>U0C2N|Y^6:\Gx-O0r7p%RF [{=;R4@=;t-7#LOǘnՒSѥvKc-thY6MF0BF!u2aQ"cfeLca!LcB\84>T&(p&g2 \fC@Lc%"0a`+6LbjLc>epHѸ-g|L|Q] RSPEXOqaC 0%9ח"LcjL\(y`0 @Y7'{ 96hC 10"F0Ba'9yeyedG䡀EyedGҍ䡀EyedG}U(rB;V[15hs P;U8u}gNi]AřgK>+J NhSuo]x;׊ z k8dzUjGJ(G~*r R `z̰Gles=+zMY2ߜlȈ ](6_g ;oe* +JLh+AR0M90<]i&l [~eESHvoE4ZirH9WY8;^ FP CQIO3.5Tk4KpEz~u b(#u]q A.WQE}.@ovbVC01+sg@.yGGlyÚI` R0$CFGopg@.{92AQB@-甽'@ F2v+['Ν׀p DE`=Լ6NpG@Tv*Ӳv+t- ЙsE/:$R4Q7da|$tNzsO~'2xU8S{*"J7ִӡj'/kra휕j0qIR6OzOR6* 5$3UXЮ-Ya !KK~]8>pDkS ËC`i؅#aOV56FbC/עCbS,N#i])CXYKs^"DNVYѥF$;mD(k/gQX{xkBus>unA`؛/Ql9XȅC <Mxi+?uQ+m* oGR0^=j󷭆|>:\)2ڦAN"1Rң# ٌ!k:$LBrDӨ4ieb7sJCB[ /gQ(g+8ZQ8R > ]]}s0k*t*=IJRT\΅#/&QNDpw<2&]"!E\#/we")P!gR8|#B =-dYzI16ahID2!/G>2R!Yե<2&qIAeD@>*fx'UDnl3ŷL1eq)!a!iSw5"<2sڠv,'s{})nS C:9q0:$IfJ~+[7'Q<t'1pE)WīyAQB@-0ACHuNY`&+}żjEÍAAzHWvY`&6+[+Q<t8'1pE us}S`kG'nALDsk0{+f; q]s{Rs(!JB$_ڛVCz rT"k \""R)j*RY*1>cDP'D+P73v,z @Φ3΀ӚCC/G)kaYQ6s1- RO'ƬRO'ƬA f=A)S3qj@m* DPs0kPLs0pb"QƪByRNtaMR >[ pҮ*< w%eÍAn` tNs1R";1QX\["'LH&2@6AYGQF,( 6g[X+[gz3żjȄd" lcuqunĂ66qP>Z6lQȓyܥYqBj>Dxo)ndT";1QXCVt <1Ҁpŗ'MCȓ!CZ C0XM"Cis2_瑑uq%RWOc`$[ 1O{=ߧ0MpH@uWGf]ZەϘzH;QC XL3{Ǜac֡'k+w "QH$ n4ʊEdܳ%rBj80J7W*RYM7!zH;Q?7{{/ZSK [c/G>q`F)C^h/K(9{(X6P7{+Ϙ [*ieu׹Ri ,LD3{r{x `z%PEjP.h!7e,^u0{`^&fW2 >1I '1pE"<2)]PJY MW{m!A{ u{8sK_h,-$c} &uf`#o0{lkM*TFPQ2>D0m6ȡQZxƱvAt1X3"vlPqNJ")P-dYz7!j<4u(ЕUaΖu fW4upL;R8`YIfcj+Veu @vn6- RCMxw펁J+BVA!'n'8I#?q)qbib!'7'!a<1+E'os A!''ufb?R,X6ηg4iD#w-n?R,

knFʵ QvS6e17aXeO,0W"n'xO6$S1@Lpb]NBxJۨxeSxNAy MS"}\`b4Q/A.*DUv8" gzEZQx}2q%n"qބ f  !f7ٰhZH5So/9˛4KpEuNgx%GqFL@M5j#Һ]mLrWn6ȼ1L@M#{6p5B SZŠ"+''s0#oB+ԇ/Wr90BY>z>l0A OO/kFWr')!E4ݱ֛pah"O $Q-vSmRVl@yf␟LZ,L|tyx4Ah`0jB6e׷s`(DW$߰&Z 8Z.>AL|/0$)b.$O%E1ɐse5eO=z{_,Ϧ.S g:q4 wCpR6K3qII%CB SZ~ts>un#DjQ/A.e.K4b*=X6|{Fs0v#1Xs b̴h2fO|LqmY4ZKi_x0 )h2ZB\KMB@dg,oP m8ѪaB“Ĩ{T/fъ~j-S0—Q+q]CMq52ic`$B1j`jL:qeҖv"۶ BRRQ,Wėq^RV߰eA5BKs0}25QE!GWDpEP. (~ZHAѩȝ  s+hp4 >WKQN' "]lƤ= 4'.Odc2d"p6ep ul B ]T/(esёB4|{F B,.89>A +RJ({I)!. Pi/GWDpEPrwM0. B9WKQwQ\D4%D ՌEH<,s[eE'hILp#r" T"r<.Op~2opmSue<%(X6roJSB$P#>U"@ rwM0>rDlr:{7i+ծʌ/GDM0R DZC5aҗa >_qHa"O7/>e.O@pSulzH0 T"O{"s[vB SZV(D{S ^qL. (cq^9z+2L{2A@3*@D( x!>|S_q0΍lE  C!zop)z%NH= wvu>t0Q.)BWqΞ>u$e: pop)Q#O@C!*@,rt'3v%O>'B98Wʤ. P RaEM  +RZɆLR96a''P]Ý9W;0͛*/=:| "2drliyBJfC.ߗܙsӘuﶾ)/=:| "2S!2Q(#@ё{+푗 &>Ǿ ;O8.Ey4c["&X+CPLwCp7qaƜJ*"FTH#=$^f=rPumvhk\i* \"w8BmCD !>'t^"P'S$U <ƾoLPR:u]6G_!1;}1xO OX0J{\K~~^UNX0gCX0zZH9(9Z}Fi*4]{obMXwqx8B[obMXf`ҭ'1'hEx-dHW|cAeB TAeL@I Bu;WFAeB TAeL@I Bu|WO8EOq(eCLrrGcI-OpDX@JgjGnrS X@Jg"%*FW9p~!'Ƭ :fNۣhAyڳ#Zȅ|B TAeL@I Bu<%Ό!:r [GpNP!q9-׌E_Xi҂ :[mʌ=+;\ȗQ,Bu^ B TǮћ&-wCpVX"B ;Z ss%[7\HH |O8Kk,b(_=^ULrRwA4k+Ō>ǾkC -6r{ÿ1`O6ZLrrGcFW9 ˛ ]SOpD? tF6K~)'1R >ͼ@Jg"%*8<ү~!'Ƭ@cvjn= Hʵ1jǦl([!:r [Gp-׌E_6ћ&-@cEݦ\'Z 1ћ&-X4O gˆLf-snI@Kf\'||0Z[pqt[jȓ{B$Z'Z"&X!qt@2 H Eh<@J9dxcjȣ[ETQ,B,>~Ww>~W B T.edDr//X(-['Pzv7ax jp`0(-` s/k2p|#;oL9 (-`ܓLd{1t3=]!ngvx>t.^gWOC`YCsprZS"D^$dԥ7SnD O:K#5xW{YF&|m0c˷2Ws/P&wno0AA[~s`bsprϫzn|8qszZlD4!{}ppq.Xr!L2{}pEhD7$6'Ƭ= -dYzAYyj1i*{}pr(d`"a:\OqĀS2+) i O8()A)8({Ôjȓ+l:ups )N3 а)s%n"qs"2"4"s aE%8|$BFh,F>s"@kRKc"ЖjL b3!A{r6Hf3<Ɔ]A{2ztpqgA)S4s>{83a9*o d-$Ö]A204..Pn,83!s},e"*!2A`G8|W#1/A+ho m,3^F${'b3!9]9:g_+񳣱gAX0s>qөO:@0ZBb|2x[/ryXwN:s>˷39˜eje3]A,N*>|W%IJ&O8|2if'˜QqEKM0s>Wexm RQqi0H9WRQ I0ABY.Zc[B @OpH|U~cBrDnO >8>AJ8-gD !jb\3<Ү 3Y훈9z+e#4")w#l`Mn҈XpP~۵Bŵw#P]zB_(/F~e]#sB4dcS ט; CnF2y.}Xpb`!(P-bE. |8$M YC[ |B_jwEPFw |x8 4&!]R`үAnKI$ȣH3.CĕY1Z+=>sF`l8#0) |7D>s(Ї9"!l-2 4>s ALDsb]m; |&!l,0Q9FC0D>sF`lfYU.9!TȅC'KZQ8D>sF`lpTDž+qpC~e߾'PB@sp1!sp1.IȱZ!G>D>sIn1U0q\8cgC 30>3ac 0q\gdJ:a0w4%1eS\s } TR0>sIn1kY)s/0E/ YH3[u0/uBjsY8;^* 3$anPK6D>wrHYQ!nD>H@+Y۸$-H|ahgҡaAsH'훈9zG(Y4@3;>sF`l"QnRH3aƆ]k#A)O$F  L¢ 3aƆ]ɻsC|/qm0g0WH#}S  3aƆ]sO1H#nei]8!a 3bt5 <. 3{B[$m)/У 3؜' aTpS 3?r﨔XT2H358;ëcPH3aG$Y>9ݥP 1;H3aƆ]9SL\zn|>n_3;2ne9z <>s A:+s3 M >>10eɚc3 Iȣ |R9=s@+QB 3"0l]_U 3aƆ]F+j磈 3$О¾$ |D>sF`lv_B\84qR!FSH3834 R0>_j~ P#C0D>MP)t2sWrĘ5.DpEH|,@!\zp7WhNH|XXCRsR2@OvWr1G 1C0>sF`lT/- MPDqi0H9Wx9>ZLjd+q^q\Qh8Qzop)A*uOq#lg( !M*TD]SK2@[SrO];T:xJb5!t)؅0^ar)@!Aj#y4)-4@35  -v TA0 4"1h|!lIEOM0a6rG+8Zz,R`+@\=Ew5Zzh糚s4()`L-gm(w)LDΥ. QL31.AZM]s2 z ;Z@j@ x@f7r"̘2ntAأSʔAfҰi":l؀@aD>  N9 f5pRa-pkҸ9RΛ6 0aBԹ 3xa,@ Cf䘯pI#f%;iS(R" IgVGSGHǐg`~*E@A&a֌T0փ)'/$3 ey8oKK7|x1 "Σ AiSX{q]kE-MFۉ! ui,TObPD<1yPUd S_mk$Hl&G7rlbpTV\efU a?Pt8e\4pDvyuJ2UDeasH4E6ms.AkR aI 9G`UbLvj_oiyA`w!"OfdؓQ^'uI2DIF_'zgHgYYfGɉRw3暫~kcXF ZF &ctCgR^eUL=zB&זFtj BEQ je𻘁:o&As@QIW\tĖ\wbʓP2I-+G60eU/|vB?*"Rb]JSynO0GkaQfHkqFmn-)fk1~_MFC aѡJ)&cGup&WF($1hqK嫈-43ʑ;.湿\yEFl-S7Л=GNa*fa=NLy:iO)U:$4a l.!Hݩc0$ P7|xjCFկq2!0Ma D&a S6*$>7ofcCu(^o w()56DD&H#0-bW,vb.Ó2-/h%X۩pIAV2 $\@0d_ 4r$\—'iä3)0#*}Ism@AA Z<`̈́˪x›1 R 7T:T$<"cQ8%^+0ދFY(`40m;f X)<)'*4Q0ҍfE뵾vJXM'y.ȆE"mtפH62rKՖUf]F  KB0`(\GZ $2dPJ<$h!5 @ nPl>fͲi8-v#@Pzg0@aGB*69"#) SBM][dhbP,Q 9Nbl'8a`[hN嚧@,A4xUMY,wJAfBdll8 ,G (E:ikz& m $2'ucmR X+9B914( KQUls \- P@p]SǼt 倾<_-wp9֥K2(A&0BqVԦ`FXECd DHB"D d#e&! ~'HSBpRH^o>rWaMyx'< .@A!.q[.zOISNJܚeM5D#:6scԤ-'1! h"ڢ!`aqO*`4 MGJ 8#54EJU[-\%D.#ebJ5S`oBl9C#tr_tp"csQW&"Zg8OXj):o/5?M SZCu^-A(B)<3,:f~t3\T(/-JUby\{#P<&J!_I2 /1,a5OzfdIBU QIE%&!S-6!ER1A2뇆de $+$*7Q .!CR Ս+$iS\\yF8/q3#!$s`#+qV!RU4a]3_w(EDR\>h`l1 a qABl!+A$rU",w9r,׍7&$%4cQy#+!A#_;ׇ8"D!R.zQ$61D/b5[&͉2wvW. br'7{ir'Qq8YA Yn`*zAb Yb,\c>##<*  8b:j/Qwv|Va=ǁfL%(s8gRM‡'@[ 0DZ UvAA ?*T NQP$'(}2[rF5vg&î.lFKQ,pd!;VD &0rM=sմXhy"50I+$[W;az@^be!< gaq7 DChb403pVA 0H O @4a!C {kM3#+Q@\9(̆VR3+^:|R QUKyh.Q[Uȡ!Bfh9t4` {c{"ělTk~V˻@\cg7ؑ_G\!8AjB{]"'ŭ^#5T""+@7D@h##6"xrG~' 0h2;;zqƦ* " :hf^-8 `Q@)m"36B"hOA'`A*F&b#AIJY0'hfΛ@[(<Nj1$M=h,zzK2^Pyj@@xQ+q `2`(EyODe 0hyz; E9g9nfr_%Z5 3t1〉Q0f~5IA`1Dw6N-+hǻxȑ%g,y Z!:W˄V1"sL2gFy*XLQm]@,-s -"-b-D3dY6=ω1yY:2kٛڤa5Tڶ XB]혴 "N"M0exHپELi&tuIRh2@!.@܆"g/e Z5 ԍf/}{jrK O : /U܁d.A*ݕ֥+6D  Lw2[!VPRan,3 N>r#<5y!e?41v P]- Й ]~k s0`{w}"Qb~A2fݚM {{r`f` sTs?w-_2O,9{^uNg ^˅.ag,p0:9NToYD:=rɎ EГ%}Q8-$B#$QM: ᛉUa['; XlirNnxN> 1jjb&BZ46{Ў[ :~ljA p!خ큎R~=3pa1?jxQΊnW< `K./`WS֊1619LPN>o\w%FΪ#c]s:ڎ`,q+}!\3qe$Ł.bb4E%<MaC&\X*^R_]}#n@y+Q1/M2p`^4AU|D3 8oCSJ S&OpD  A,v~Pj-\dcw"X_%,N@د= z.k"˄?4,p*pA3e_K?2@ܮ2ovo02OMk)hFoR,RV*'ADzf" 8!bMFr1zs)2YߘBcczהg &\$5V^!@ac-1Am*S&A?icXzs) Aۡ>WaY7{,s"P˄fS쪁%[Fg[3~T5D/Oad)kUGP5WOIenxӲPN@EF י~~ˈ6?o|' p|'ˈJ$:[ !@-zg",Jo'u6X#1 l`^)s-U6o,.Jk?1pAO3/ط`s ,f0(fb1A`3e6¤Ӑf/qn6J?'' =oE/@+_oqM0gF0J?'' =F۬8Tc/@+_nxfT^-FWO¯ME$:2;6Ec92?Yb}$",헱yx*E#Kp`^B&2}pb_Gh!YkeJՔB=Ĥ)s-U6o,.Jke/gN0J?'p4p/=0c2?I ?>EP^rFg?߭ts,pG' o`3F)#f`?>EP'nh]@ǩ]$V$àf@(3|~2?A^fT^-FWO3ڮ(@Na ڳB7wC"Lں)l0]H2tz @o,.0А Kp`R0Jٟ'' /rME$q _7I Մi $0k$Pa:'n%!s XMac-R}rf.!gtk+f/FPb̆[pq1FORGVay&Q(flAfAYs leSt:_O~ ,z<5ekB~+s+" E$Â9jlRp۱z QhJ @)[D2K,M)0 NPO0F\nNXMs3Aw% !C<c?1<=DtCeMF Tn%+ҦBQ3eb,GsF~5["R3(8 !(p5+ҦBQ3(8 yG3k($Up`΂zV//bOB!f-0(5DC<3p!N}J$6^`8PE ICfOPޙq-2 $%2#y1t0~qfҧz2`?ݾl+ՁcngQIo/'W&qu\V1m3+EHY1|B>5#0}qOdP3bRa-:_qY풬H x LU7!s'O7k"[YQY !F LC4 3u-11%3x㶃Tx3cu/*(/B4b&S4a)/Ead)fiR2˱* R8aac))]3k(s&C:<1 Q",sii"0@>4@OP.9n2ޒ97\CD(X ,RZ8I,EV3N,x=X-CjÚ0(?NH9!.9yTHZd{>3T!<39ճ-Bc6_A7Á46hd&nB/;1"Cij~YҙBji#N6Uo(ju"rJ,r֚B0 &\yׂJgr(r+AOPVu]{*S oV$33t7qAOPEPI`aؾ5ɋ\_3@!Eo~m p!>rVrYGp&w?H0EPI`!DG@blCfOPT2PO6P''U@gPPN1Pt6PS )岎O1Rp`N,X.1OTN\N(W.qHN^XJET2 qE@(3Q-T`AdQSpjO>2PNGX.됫zlY^pi\N5p`cc pi1`N+pi1,T+pi1 v+PX~1x #hl<3'+C&1h=i120~0p]_y1sx!ƦU*]N0PC7]N'0'4HPC]N''4HPC]N''4HPBpVLtBؾO*؞J]N0&F`VDZҏ10QstHP?4]N1 HӟFM~a@ӟtPPBC$EYpbNFOqNTTI@,qNTpbN)WOPT)WEP, Op,pE@WLGPTefE,pE@D,pE@FwbNOPTGPTPDPPTPD0EPI`n2@C<~+((P,pYK?KESJAAˈ <#9:NnnrGQ:јށzHQ:?I` p!د'`EVp,aEG @WPVRWL @WWPVgH=I!4EPI`:O v4b9eʸ&0gʴQHĜ:b伩C'2s T0I R RHb$!P̈ $ 09$& b% O )6Y,Ȕ \I(R!Y A$A H|C :sj'ZN-, Y s@yb 2aX< X6q,{4AɯU2LiMq G8%+&Obʰys(+@IǼqC'Gg*_hcF娂 CC7+Q-xTsAGl[*CPXM4Ext eZoeӕƈc<+$hUԢUU'ZfAdcshs^R9AiQejftBme16e_RMA{kGGEΗ[ټ GxٕWygMs 8Yv/ZGxǫ|ه_fi&K ]4DFՓ3, Xy3UxTUFsZ`gV[ɕyA]UЀU}u[[غمZÝD(Kfn#!x wĉgq18MnF`Fv2СrX$R@a iP+Wc5[ʅ$ Ex6X))NJTanŦ> C,%m{LǗP[Y J 9(? PE+([Ty"5{P9T!ښ]@IYArs4\'L$c@7,3;Qބ'h=A`pxElAClTnb jӅ2#L(R.h ƥ \$0$\Rxΐ4A KX˥(7='T(5XD؉v!>,T]Z׆P?4$鰂a(D~51"&剜]O,v'c5mz)UxP p@GC@G"ԙt2w  }IhP$%1QõR,i[re0pRjCL9נaK4:j wfؽS 408oS,gfΩt2c+gA6UGcN.Wu|ah>$";`3[:Kܥ5HyP` +".!*G@3xdsDAZP6!b 5f:L<7 gG&RM?ZN"!#i @pԝ` t"37`WD0!# D!ˎC3aF(T᪬'' b- d@(y-.p}#ziI6Ep'Ky&A@JZqYd%,mQGehQ{zD X= .}Ĕ$\/ VphxF 8=O;(X5:gP:*u Hmly 05,D_ K 4@1m: mKLLf#Y]2"|6mmMIH|pE+ORA ^I a/4 `7lC¥psA8-^ d[˻y]x@saX2 ,xay@g…^iT>řG#A7y0d=#? #{Íd|d$ {Q,Iqz*Ȋ9^{ *8a r CAPi'p=Opd+9X~΀I:0 |2Џ3vPUTKqO~dnۃ `5%篥Cd0L)*5#'I.UD'RW ` p! R~~~RISPEmw1r( Wun%rNyU7uhv$8&h[uOs/`yraا\w  n7lE./ nUC^T,*x0;5; 0L=co4cR%h?"LB&hoBdC#rT'd-E-5a&kVP*CG2JLA!h΂`x57T$3$wr&45`(Ap+xA0dB-ա_va-6UqA(!~c0!w0KhozAË tsOdD-k, 7}R}XM8t$}8ErA"C}„D!dS2q*[ט-.K,zCAwváERcH-T9*hY6 #J( 7RXPLQ Bi*Q.uDPfP-ti!M +3{Sp J9Ph!W9UjUVSbACg|!Ȕ) iiHTX,f4WԢJ46#sѱ~$Ju" %7Ҋ*,U҃te!cəTR(JB0I- -1Tikƒ3Gr*Y!I0Nps@, vmRvD X'E%K&11&?#82!9A1%=AU4F0BYBltrޙ&$"jQF:P(*U"b9#bp[9sg#)eP$0(Sky!ھi:uek 2#m/gƂd}KMqu'Th!HjKBApAaf $?;,#;b#4-= *Bf*{1a-P %#; 1@X6} |d .h?QFCA(Ф1`NPRqbր,g]lhN&(ǻ,K^v0.*dlg2, Ee'wt*Ly-?1WKMs\gPsp v' #rTZ.c4K-#rT,?t#/\jc_c AjIxq Aǀ{iZ+ PEBȲN0 Rm8qĽf,|>L,_D me_Iʼn'hF!Gszs"㡮0!ɛfXPI;Rvqp@8'@SЪZ}Wbv/P?a<Z$kKDcD!-F3R"lyPFp!0kS򜖸eoV(] #Va`5I RA(w թ?2Em_%k0\hRQ b2;{șP0bp DX@QJDxբ*i9~X0`Iµ 4LdD,Pu&Q>= `"Bz;hvFT`{2.cbd2kEXL J[u$aA~ k#΂N$mNWpW䫎ޠgrLn Wh)Dd"(' bRPd|8 /I@"鯽; l?׈9vM1< |մ[!YK/vٻ CovA߇2 -`)06iks&cPgZP+`C SWS0s)ou=1@ &ɳILB+-!h`b"Yrh8<'d29oo"I_CL1~{IoR_IWBCfC&qFhXs; w(_c`}rs~;/ ͑a,a2~[NlM@pG^Nr|dgq{oRRFm eɧ afv8>»u@ӬgB軝l<3N%2㖘6~(PEm"5 i2+lxH /_P_%ϏPt UP~?PבnUJ e2}sEA6}1< 4F 8u2bņ.+IezX$j6h0 Q^s`#EN40v .@gXSu/yA#{ A͕%]R_X?ؘ#R6ВpRjߣ۷.$r\̑1Y0YUKURssSXg!_2S0m&2dn'Nyc8 ]$0ymnt9` Mv1'sY)VS}#s! G,O JCM@qC0Īiosyu"A07$mJ<1ɣYp!Y$m(ODR!f *dL䴺ibcG(50.L$Kzh j>RvpH*`l&LHwR'9@i@|&'f>/<*N0Ȇf ém i0BP\;WY}/ϑa&f00*w~/ A- K#(YJ<9O>'<߆S`Bw&uؾ)j~=#ϡ#oGN-H$~3 &K /9 kr %(0͞iKyDWFPZMzA),N-+)ȩfLcTMiKyDٝq9L_,&S͏SV`00m ?KֶöR>./4/20"p;5*R]1*m[]@-g9>Qb F-g9H9U9KϕEBIN@)A8 3s{9rOi ,A1mHl-2Uq%5ҡҖwO8xR8hܡNw.`S]C~3N|B&y~jdN59m(v8 YUJoqxf> $9s""RڟWI,l:-c{-饕 FiUU9-wyu"sXlN59-&m YU#5=O>,QAV .@>]{?wBTz|/-M0]d6&ON B0QQ*sNP\Sg"}&H$2` va"i]WJP:QjCJi`-u﩮ٜ-#ѭ.uT \ҿNPSS2{x:{&SHY]WJP:a6=w1h?~Uׁ=NPS/:q̩{d2WU'prp6Z4?%HndB]%O(ⴉCRcOp G[Iv:( }rF$a"_)$ 1i(uV7/uX07N@wRQP @- _)$T.EB }su'a25anUJ^R,KRcgޞ~.6hy*1$5(@Wdv .@hG߈2mr”Xyg| Ag:ZO-Ra(Iez){Ԧ!L|Ck(,A󡴗Iy תs7S*m[v1u UP~Ukl\Xv .PA`hs / XuOrp5ؾrZT[@w06rA8̇=6䛥ءM@fi3G 9a)[^@?hnf}1#G#}ji}1N <گ1ʭL/'$`IJI zi-#.XR9"UJ4̣!L|CGTVVXҶ~RLHˢѭ#["vJP:fCzq`q$f$_ g_Hv1(q-(}1 UJCJyAc3-#x%i(1S XJag_Ya;CB'>a-f>B.: d@J2`j:lPZJ9ғa?o2=&Kd&M-Ruc(wPvJ A%R֪e "ޤʏ4Q]a(3^٭hp8ՌSCTG(w!*Fi0 bcSG( 86;™86=T|#5(T"$@Z98 eP~Uz@%!]>R`JPph75D͞lO/&>`1_A9]B Fi0 >aKp UP~ޟ#ot8}o5qɕ@'L 3NÀۤ36}usHK@ZaL0Rʠ~}Sw,nt#^60T۵SQH/pm&ntva0/˨Yo 4T;۷gRM:pA A~&M: t04<2b S*BSg\к}+Ȣ Rm!1 ?k"<*CsN(œYY۷ixE9]uHga`tY}+ԩY cU۷1&ċY2繿@#Sa؋g@B8wAtO&S?JT}S m.R~ lY}+!WdxA͞۷2P[F  Ȳ}S]M۷1p#69?*BSg\"RLm{V%&'s'fR,}+۷2m?Gafesc}C Bp!,Z]uh̎m{V۷4ɧg><"MܶgE,۷3p('lߦ's'fR,}+<~}m\M۷4pcL!0f]U}C 1&,մ}U0gR-HA A~&M: t04<2b S-.մ}m mgRM:(J |:f0b`sT›Fؑ0Z *`5869rVrrH0p=WЏTp'~]>Lp'Fo'WЏ} UP~mA#lmLp1ªD~K"%h4*s algpM9S@ڤʏ4QmFXWЏT0JHno}R\9ܻ=ii=1:=NPh!G5KCJ&N B0Qf1z]9Žn2$ A~3XSn XTCS u%|嗎1".BD9ԉ1]A S,1"N-S-Ncb9/ @ןhBK~\! *+I{~KȪDhbK!uy1 |nf=d{ؼ(@鿑--+eNM,K >aE`_f$QP g8ߦQ}ic 1 0P /*4Wf0br =.ɍO00!#$I7MTeN){L 29ODR!XaLDh8~A׿7IJjc 1 =8E-HTK?C 2,1zҚp<#,ڲ?$ڿ ]QsSw3=X9[RlۓϏ.M`9nnYBw&uH}N@>aЦi.L4& ҥKAنqc(T/!$[A1k %t(aNpXQ{oqWGm2c-aX@Dh1qu~ CLզ$[f%K.9=5D 2`>p65! 11[(U1[$Kf@QEAbbAS##b JRit$2`>aiNs`:(`f*WS}R.!C(+ayQ_zV/XpiMJ=ٷc_b\>R! ``l!gR1p9er$K\ *X&$>ep2CT"$rs'N5CT"aXN1.n""L"qRbR#bE2`>pb6Vhucc]!Z}w06G-|SCJa3h 2u M{ya24}b\gU8tqcU۾)j#nnpc#K-gZ>U ^n &JI+ycc]oaTNu`B|P9CT xx@bb?c#´hCw"(pAS}NipHfj#kfSP2گ6"xc];1Sbyc#=I)eS#uN 5PI986 !&XW06օt2N PaI#nnpc#K86ON0qGq,PWXpL2`>pw06[Pm=4 S0}@(c_ٙSz9s'Kebc ]Y[.RziiitB2r,ǨfRk!أI1KJEB 1տ;{)OzhW065*uaQ rtXiPQ@5[`,BD+[l rtn ZMgiU}mK~g9'Y}mXnUJء'}U0. TnPbyf|65rAhkA*S?0#0;J&zmF,9OyA"A9Ri~NgR52S Dh5?A1|=3< 9O^%&(J.Y#mFRSALCh~k}V sؖ'!>@&⡝}sA>Bd: ߷8Dh0dyWR^j$mkAz~OA1|"? b#o~P-hb@ s yAhA}Yߧ (^i D:M4QcRA[S)۩CT/ 11e R KZ'W[=/ A-کG / A-ju`!<k[@rpGhXdṲD-dB 1|n#:4W'jd/K"],U:m0i۩}-`}1AUJqTC6p)ƒa?,H-@- f.%uc(Elm@2j$j1!s{HhAJ-g9g,ɲ bN۸CK"}y;F?U8,ك1ShUQ)9\!攘A>5$V`=H zp bNC ۤ.@ sv㊑YZq"3<2bp?J #$Vʎh*Z>},畝9"qn1R*mk0N ҡ5Wz=9DH_3WR5s%~OF]W2{YA5#f|,'i 6` Da$d͞mIPҘY#?z 'i ߕ?RQ]H~L̳~2z%HLO48e#Z2gQP-Ͼ#l[@rpGhXd.jW!K'A86kP=g mV4_o4ApD$\ a$Ǧ1q@-4*j[;Hs%rKIY*훢DP%rt(y+1R0aU0SzЦi.R^ٳ6s,;a01r;~=5k 2,1ҏ)<8e m&;ӴX S0*hy%h!5i AoGm}R M:pA`JDu 8e mտ;m i0LSfGo=Q@jMҏv'JxEjXSaPdR;Uqq\`j @mY1Q@Ƈ"'OoFSdFRPMSd|,B<R%'t X9vaG@}+@%f_͒m&gq; PKR3 )C 3"?w$K}r&HmjĞC4p/:a!0#B sYrYVpҩו#4s0"tH>W"t!t-鳴gR=Zۉt2CjH+vMܶ4 YyST@K}RWI1ܬ0A~( oCP",L_NRYyST()jYo=7Q".Y@48eзYySQ Jh,SyS"BW9Lx!%6eu=,jĹFh9mxQ*77Q{vex!"+REyAqh0iyS,PFٔ%7Q xQb-fSyS"Bh]Y1D[[@ULG 05s% 5'xeRWoGJX&4e~,yS,M.Ql]Z'֞<UYRA>B-Ss9%Pt{N5,ѥu>CjYo]syS,4D[+[%u,7Q"]M7Qp,R'?o[+3d?Y(y+1R0y+A?]?TM7Q.5K7^$b?3KN^f?gH0~s KfPHKNdS 3"t{' s0"t"$M6ɍߕQL)~|NKZ"W"PZJ8G߷ЗmsJqh=QF$h!5A-qhT^jO,L)~>]ed"W"ZS/18p 8eзjݣQH:tp|8 @fQ6Uh-u-u-u-u٦>*KfPm)bC5ht^ȩ&d2 Y^[S%d8g02}&SH5hrôSmvsV[%ZD ujY2[~T-xq 3m? pfжӯ6.U0;R,}tiq j#hFXqT1A= HjYv~h= 3yfYoEqEs0"tW'z#_{1[\&1Z- 52C?CP8 5DTaжa.gxQb-#B ]z1kCPd5Χ95ųH\Vh#ILRX @4VM1AL$DT"W"LSj$'K2Z3+ykQVz#KQmvu(j[;Hs%roT_mpG(훢DP%rdS C6y+AMs}q~1Ah}b}mpT6;6ZӇgPª#GKuwa:g:!.z/,h=kVmF}_ 9A˿hRE`fW% 1}ay!Ah|8DTqf3~ /s*m D-f5C<㊱YXd} su/ZZ#sG兾a-20.)aW`f ]C89R D"b+""h@4&T;S+A`1 &"9sVhslp"'"ޤ3? P#JDuzm&3nCz΃Y 5P 2]6'JxuiUJ.&'sXóHgN>5k*5[l!GY/KEt 4A+0"UqfTp'oA ,z1*1t ,H0"0F2'dT18fU*&ms62*u!/*Y R%'t X9vaG@}+@%f_͒m&gq; Pm+h!5PgHunb[*f *[0]@*/[dAh),H0"A1S{H\se\uE>5#?O@SzMlnyO<+S!xu"LoƃsJ%tp?{^؞\1) *'d2WS*[@sg97N@Х\H 8˿h!5P h-G*]p+fH0"su'stE(E>5RN@h'kb6h"99[ $_Jy"_ O![mJ@^}fR#?O`mH0"286kP=GeK..P-4a"yC `GG1UUj` G:\30869rp0^/HBјFPG @ed6&Y6}궔ܯlU^@n8EP^آaSv}h 8h٘Ve//g}4T˾#l[@rpGhXd.*Tk0@e+TNrA uVEU25ɍ RYy(q$\:_eYhޯ%G&{8궔< ;S Cp滋) f[H sª#8hy5s% 7hJ)8tUw~|B[ 4hJ)8t 8j{_:8(5n RQI.>Cxؕ5~]?7R6{=ly+D)MR! ΆϸUayfR[1DR!Z[6(c.&CL-g9,B¡56 1"* S0xz#KQmX{q27ͤ.0t:Xp!F0#\fT1DR! u%k}U25a6Dy5QZ%+>h@&uOOJŇW>Ӹ8,5yC@Ӧ!fgWMK0H$h&Dwa:g:xG Q]~QP g8ߦ3H$MRa?̈zCi UP~m=4DR!$4ZaRyKDR!>a]%86HU&N%=B~QP g8ߦH$PWR>aUk w8hym+cm;Jb'oRj,I 0'OoFRUP~mjʓu6tpiam}ݘ.a4(5%hAP vcQVUgSCsS C3&VͳTJ!j0nɞG"1"Gx;ғ

5B' 5*LyG2%+Au{~CߎJR@.|b(6mCW>>B|cQVUgSCUw~|DJ9ғbS~8j{b@:t_hS_ Rp! gĭŽ)f@CW>w?J,|HJ#"D_mZ7FxD DT686'shulmt06ғa?RYUw~|MwAuidN5uc+5?b\u?&`;WN2jg&5ޒ8Rm!1 ?kec f8( =ъW6/H/@X'WpA A#xA 8jK TR|b,{zi8nd_*R`X|b1ңq=\Ss{HhxBq> '0pW!K'?,>W"$fq QT7b3g,'D~(y+AM 5sD*P~"p!L<6eUep=$vզ8"MH8hyIiC_?l:lP %5Y[n:oLpy=ZP8v!au5:y9x %:8*0&Lpy=Z Z$c"QZCs"Q8t=J!⑥69& ҥKAٝݦ8"Mxc*!04U %5Y[n:oLpti3 2Yљ"QAc L610 >y9x pIC'Г4՗UNC.AZM]*; HxQ ;@q3E=m(M:ed#'9y3 hf7 F)c0FI: Ls9ZmFNri@-f jt!;2\ CF4y4 YAcL9:@4)҄( Py#6e̓D9HP,N23iNR;`sL3i<FN0bؔ!B'SRD҇hʸöc0dB t 6y"OG0l؀ 0 Ŕ)Qc{A=#ۻ_mN逘M6BGdLv ʑ  FePNgUͱQGb$7DutFR'.taBAbhvcp[fGcI!G1H"y 8*AB G~(Q6 2B9%0RPJn=  PpTE٦Eh#:d' 3 P5IɉeoL8h4G-` ~rd.b(0SM | ª5EH1EO8@QT@ $eܡaGVFu %1OP1 dDا)c DLADΐ.{جr\M-R=54Js4tԝb͒KW^e}mctۍumsM-~T GHQ ߉ĿS䆐ia~K~jmPؾ/pMtmeY'|Gj7E6o0POW-oQje:tNVNV9ء$û A%=# q&v"1d(S*a C_R(Ï$HU¹R@"G-I;g o'$ WhXidC2F!B@0BE/B#3*Cv*oIЂU J2}hUoq0'l0zl |%.Gm18`8&1Lҏ( j# 6 |QK"SCiH+3ԁuO d#c\tCOvy7 DA QX xFD"q[< :cT'[p&=,Min 3RƜ5Lx Њ5Q ~bt(ȕ",Ru3EHE*@FUJ$FҎ!m)JjRLXpJ%9p1Xu& C)F0l1DŽb7 Y Z^nAyVRM̡f<棒X5u iðpRBF i t)y8gx.0Gd K>30.$_Zvmeġ:%=t˚ 6z{[P*EHA56'i'f9͹mqQ&LfLIiܛ(X9 g.cB;mPxc/5{`-"9IJ3kbx;h-%yC&$ :zpw7ל /e{Iveo_CM}K;ƭ;/΂g{Ex4"$zbaAv ldC nG W@xf@'{lS0dRJEɷ< p4X<ӆ!Y60`,TˢDh#&|ao`h[xX}q~}7q653z#: p!k x&1E_S&BgvFgMD[=QW pE`GY4CJ5qfQ-'}LP(;3>ăfXf[(uTG6#ȅsքO(QHETi)3vnHg^(`ApņФ|ǁAІG;cg^oh^8,>!ru舷#փyV,w-DX" :,lŠ}ioI`^vU A@&IP"2`AvE(NiH? 8ehHi-g:h>󋹘mYFxwrFgCR0hocDT"Hs.1{̄Fk[a"s KDDPH#+DĉH2|щGэ<fo"6X+|- qs8at>γvSQ7uUw8,+ڦFa1{g8}u}gu3l86ja3iNrsI96%m;4D7y:93F Jdga易3x(8׏Wuy7iy(;~osnL)Km'$9(Y6woȓHIEVt{&њ",@QOE,8(K C{w>ٳ=.86h7T`z$rIeGQ|s`"(Rn>l8bp73egҖ,貃 A/y C1x \3swHC-P*vIZ3JyB&3!mDY^|~8eK<5GisN4BY.jlZ|"dLdf10Wd%$Kz1|hpH&,&Pòl-£ʇq}'zc]d1a$O4z`IdKe"PTm΀L֑!QMAg`d~Lz6cwȢFkȶqwE-4OKH5l[}1^H6Ekl$s0 @(!"oJ̯9|.Gm0鹠{SL,A'hF4t>Aːwr?#V;}dXX؍=,kOh譻V{(p/T0hfϖn:T8,0$Cg:B_7s ``k蔑+od4Q/H594(љ0ݳq~Hגd3⛣ۺ Od󺅷ޭ~o6kBXCDz9$aeKTX/Έꪇz[#bh?b /Ibn192*4LkipZK1K `Ĺ6|A럔(k> |Hq( aX_X0o!f('2\Nڱjj8l@[8ٲɟpH3bF;?,W7⛣N?k*\$1{_)C)n1n}ũ΢rfHΛ,ɣ"pݨ" aM!V10 !k =nư()"ɚ\[di6hvyo,H*CZ}n~I#"}3W Bis, (`AN9suSl#OijHI4;#,#iqij't4l-k8QA0S;Lڞrזfs3\{3HV̿Ot),<.|NJB* ;Z0gp΁a7/2=8νΦ,yÛ@Ojᎂ4z)X(C8;PnFq uzAt @aNF 0tv{"z_6ݍz@qT0YKgFsheYk&&p'sz;&&R/I0gv辚kw/ aYjI0gF:^M*4;M ]"1Mߡ5.xLiHDJ10{qAIyi@lPMc`--P̡Q-BQs*4V>}H6*4;<04 ֢֡!A.FKjmn1敉!z΃_ e;k(O)tF=Ѣt2Ap=եwUrTɓ/#( e;Edn [Tqt>~#lc/,PS=K[Tp`q~+NGi e;Eq~=#z3e{#c,Ä +ȧ|̏4-0# :y`CgHq#܋kKn%?092XGg*x,u nko_ 9PS2Z/F`;E ϶&q~@K0}%`'L8C !,,PS.GF?!ǥӱwP8O# q~FJȧ||O=&9yY/TPnǮS9ϊ ڥh[ݗ4Hn\/F`;E0jBjuO%-O( 4(kiP!GZ?vL4LzrɭAJgg~*Fӊڥ@dF"/X w/c4[V[Dj[6-+~6@vzُ6eKC$Xf%30hDoN)#z>l#0`gS]hE#elIG-~QJ?Џ'C1Z9 S]B }ԧ3P8,Q[8/Ygцb!-rkhb`N|ky췦4~0d4QՅF"lrцb-mBrVC/dHm(#,n&-muU!SFՏ6цrɭAJgjцbf_9)=#Fd4QKuLtf2-p_tfkg4Hn1`[>`uLtf;m(#$ȭAwlhM@FSl'6O.hr&H1cdw0d4Q0EFSLEVC/d!)QZ/6GVvfjfs>`os>`osw@M7{An8PX9lkl[x HAG.&>Akjm NIZaXyPdϽn/XA(F:'xgHI" aOh4UTAu (Qp$ҩ:+,صr\ LqO::l)l*s+!>"R%_ad|bឿoߏ yhy+vah 0<,tB(1y`.Mp>ҷ c;M4L`{a.{=tS2:ez>0 R`sz=GmX]%Η6ݽz(4Th83'vao1# ז'3\9rGӺu KqQ [6_V/d:F SMI'fs3!Z/}Hν#3*a:#HX(? 8q g{aZ9`0s3`2aDz`T0Yh$aKgFsheYgjI0gZ@5wswd{h1"<SA%v_щh5ZH~!N,{h$anI0ggLe1p>\Nڱj'ի!/,(;\NA-\ 0yrkDyE> B8 yC> SyP> X> I yY >~#N+H8 yL> > >>ɿ8 >x ~A(=88 *<6 #"> 6 #"@>24[<:g:5*@+6+> #*B} > #:8DO*8[@"8~`8 G#+/(:~; Я:5!:4++~֠A25##:O![o0$~+~+og~+ngy!!!X ututO~ 8(~ 8~ 8~t u t u:̯O!_=(!c,h$ #: !X4q#4 #4 #44 6_> ͦ> ! > ͦ~²ÚĦF#~ͦ͟)"B*B#"B!!"Random R/W Error2k!E~0O"l=w*l~#^#V#*l:kw#s#r#>!2>"2 !Print File Write Error w#ÔPrint File Write Error*<͔*<{G~#ͦ: L: XʾLҾ!R8S<[!"< 80w#ɃUNDEFINED@@DOUBLE DEFINEDERRORREDEFINEDPUBLICEXTRN#ASEGCSEGDSEG!"~͒~#ƒ}F#N#">2>2*H*!~ ! è Symbols ͔K͔͔(w#> w#  6 #:þ*<:<226 #6 #*B|> #"8*<w:~'2~:}'2}Gþ:4(:(:5?:(:/* G!<ʄʄ:[ī'6 #6 # ¢6ɯ24ͅ2! ڢw#â͓!'2 ܰڢ'ʛw#24:*<͔` #2 :w2* :$ !U2; :w: 0 6*JC2V :w#Q {2h :w# Ͱ:|t !! w#!  :2 ! :º _At t <2 c . ! > w#w#w! c ͅ ;t [!|42 *8"6!"8 p! ! #12345678ABC Include File Open ErrorNot Enough Memorybk6 #6E#6N#6D#6 #6 #6*8"8[8ʷ!!R!   !g!bk^!g!2|*6"8:|s![8P!!r R!r rQ !g!P!g![sR|[uRU_!F~#~# ( #$> w:O![ !p6#^#VL"*<#} z { *>:<":"*B|([@[6 #6 [8[*8++"8p"*> ">A <! "8!Q!!Z6A#6Z#6M2q: Q"pInput File Open Error*n+~+ng#>"n[x*nwSx(^# 80F#~[##O2[#> F#> F#:*U\"!~G>:F#:zr#~F#O#2F#>F#!E~#^#V#ŷ$!HEXOBJCOM>C2*>2F#2#2: Z(!"F!H"n!E66@!!!!#:(!#:z(!#*2A: !"!!"xObject File Create Error>*<wR)D[>2$!"<>2$: L0!!!6P#6R#6N2: "<Print File Create Error[HRDM!"H:K;!x DM?%`iy(!0++++81%#Ĵ>O5<ͶN+1 :U$n&H>=m&:VG$ :̍&=2!&_ !~ ̊&4!b&0&!OO:&x Aڒ&:*C’&>Ķ2p"q!!:K<*H;!!9%4 Macro or Expression Nested too DeeplyStack Overrun!ܰ;̰'x(G͂+xŸҐ'Gt'"O2Ny233":O:N=Ҟ'":O*O:NGt' :'='2'q':'<2')ͥ ''%$IJeo'''!!''('2(::җ&0#&×&:O2:+(y+(:2ͤ:+(B(:B(:2:2OB(yIJ4(xIJ:2¦'2lgæ'yIJ4(xIJ:2¦'2gæ'yIJxIJæ'Ͳæ'o(x(xʦ' )(o(xʦ' |g}o(yoxg!æ'o( )})!æ'o( )+|)#)o( )|)#)o( )#)|#))o( ))#)>O>Gk)!xk)yt) É)o(~)æ'æ'o(|'!zʞ)~)ô)4( æ'O( )æ'yIJo(xIJ}/o|/gæ'o(xgyoæ'o(xgyoæ'o(xgyoæ'Ͳ!"L}(|xk)ᯰk) <*k) "Lk)"*Lk)"L*o("*æ'o("**Læ'\)*)/i*+)-)&)^)=)>))<:)NOT )RES (MOD t*SHR (SHL (AND )OR )XOR  *EQ )GT ))LT :)UGT J)ULT ])HIGH}(LOW (F#~#fo1 > w#:Y +.+!*U~+O#ѱ+###?+."+O!*~w+#F#~#foɷ####i+*_+*_+!):[!ܫͫ~@wyͫͪѯ2[2S:4s":[ͮ+![:Tʸ+:T̓%2[:,*a~+ѱw#s#r>Hģyīyѩįzį{į*>z { #~'w+~'w͑#">2y22͑#"yO:2">2: ¡,>2*Q͑#::*C :z}F#:yk,}:Q,Q,_:G:Q,*zQ,{Q,*&w!4ɀ !!-!:p(  c":?-:O~O#^#V#"Qy ( Z> _-{ZW>g->0r-ĵy! -o|gF>ʍ-AOͨ,:4{ċ"s>0ʶ-ly̨,:4zċ"sy( B*<w!:-!-̹̹̹̹̹@-̹+2-*,-!--+. (.ͮ[8Q U f':41,͘++*͓#":"q'yĤ}>2*͓}̮*}|:2*͓|̮+"*+xy"2+q'ͮ+y2*B}Ĭ*}Ģ!{4&(33!d~. #~.~#/.![:TGj%%/[J>/%*F "F![*Js#r2[y}|&"<ĵ1 !U~Aڀ/€/G: 2mq'|/}ʘ/:2:G*:O!ME""(\/>@2\/)ͥͤ/:k >&2mF/nF/:̥̪/! ~6#,0ͥ/;!ͥk >& (?0̰ܰ>.->2S+/:/0@2S: @0:aİ>.:S.>.->2S+/:/0A2S: y0:i0mo?m>>ɇ.00Ҷ0:ͥ0%.*2S:ͥ0ܰ.:S.-:S>2S0.2S+0:00O:S2S>.:S.E". T".>2S+/:İ:İ*}İ>o:S2S 1>..+>m1>l1>l12z2+M ͝1Ͱ*J~I  #~N#~P#~A#~G#~E:!1(#qO". R".>+0: 1:SF.-:00G:S.,".>0.)x.". *22>.+".>.B:+2> .B". C".+/:'+2>2S1P". A  C 24͓q':5!yĤ| !*<6 #6 #+}“2U". B>1".L>81".Rf2«2 A»2>(1CE2)1 F>7 .".L22 A> 1".S". T".+0:ĵ:ĵ*}Ǵĵ>Dž.S>61".ͰGP 2J3:E(O  2_3:NA3 2k3:ZCZCM8 Pڀ3y30BKCX3Í3͙3>.+Cҥ3>.NEt1î3E". T13 Iڮ3¼3Mt1A> .>1Dgt1R".2 C33 A> .>1A> .>1Dot1L33 C4 4 A> .1B". L  I  C +>2z1 :U ̥%*a ~w Ī,f4.İ>. .-4>O%. P%.+0:,Ҡ4(%.:2>0.Uک4%. SG4 H%.ö4U". T". Dځ0t1It1Á0>1::*C!vٷR R !wH"RRܡ|+ |+ȯF#D5R". G5f'ͮ+:p5 Ĥ5+I". Rt1".TV54 D‰5 Rt1".L". I". S". T".͓_A #G,(_N F"._F xO! q,55 _O O³5 P> .".A". M  E !564 +E;6%6 GDt1".ͬA C  R  O *B} :[(![~E #~N #~D(!h#626:(w#ï6q ̬#,ʦ66[: /!կ2^7 ( (6ͅ_E(k: Z([:(*J x8p#(p##.w# "J'6!{4ͬ2[:( *J6#"J>ī_N _D 2|7:(M(6+>."..".>.>.:,".:-ڈ7’7>Ù7/Gj1".0¹7Oj1j>.".:'".:i77>./Wj1".0 _j1j>.".:'".:i78> .G İxA8<԰O ~.#~̰.G:Sv̰.2CS"s"":@̰!c8:$8-.-.>6.--:K[*{**!1!!:@!88:0҇8:ͥ0Ғ8!8:$8-:0ڡ72S:ͥ07.:Spv̰.-+/: 8: s8:08@2S:0V8:ͥ0 8:Sp̰0I". S". T5".O C". A". L".*B|̬#Ĭ29:̬!iD,*J+6#29:(w#ï96#i  6#"J,Î9I9 Rt1t1D".m9 D99 Rt1t1+BK,ʌ3,X3PY:Ĥ:o:g++|yġ|<(=ġ}>2&"|2:S.-$%ġͰ8R".:> > 9s:2Sf':p( c"*>::%:*:O=:m}1nʂ1".& >./: >.-Py:: >€f'.-FQ.".I". Rt1t1D; Rt1t1>.>#.>N". CH0;+0:)0/0-';1;:2M:5;0:ĵ:ĵ*|ĵ}ԵF-t1Vt1^t1A". L  T>v .L". S". Et.".I> .".J;´; E". C".l".:-}1.ʂ1+x.%.(%.:(%.'>.%.+/:,%./*<;:+>.%.X!<> .X7. T!2z1 :U ̥%*a ~ʉ1".I> .".J== N". Z".+>Í:22'c= ܰ2-F='Z=È=T". A".+'F=f'-,|=A". Am=>' .Bڐ=y=D". B !6 <6My=".Sڿ=Oʡ+y|ѱw#s#r>.>+.>Eڠ=)= C=+0:)ھ0/Ҿ0-;>E> :2>1S". E  G>ʉ1O". N  DQ.A". L  L :>:>Ā:Cڤ>‘>>? .L>/ .".I> Rt1t1P>|> Dw>> Rt1t1I". T>@61".S". E  G>ʌ1.".>.:.2>). +72".-G?0?>.:-2>).D".+/:' >2S1+".>.J72D". Ck?+/:'…?>2S1Nڔ?? D>1". ܥ'?w#?q# '? ,?!;w#?'?w#? *c>+F+N=@"J"e"c*B+"B!Uj%^#V*:|:[*c*e*J>q#p#=Z@"J"e+!gD,*J"c6#:g :h ?6#"J'[*B#"B*<"@*eP~# @ A XA DA#@@ð@*cA@#@@@+33>?@@~# A@@~&°@#ð@>#@ð@G*c~#3A%Að@~#/A /A@3A"e> > [@'Bà@G> @ð@? ?>I><".".;c;:".9k6T654".)42".".".".1L S Et.C O N DQ.FQ.EJECTHEADINx INCLUD6LIST6MACLIS~+![:(6!AE8 NړA D Cڸ.ʔ.I Fʔ.!"4: Z![2?B*D![4 x2T: 2XB*E1 ͅS:-@:[:U AA".!cAo0$~#fo :1 ͅx!UAAs%+~+ng<Ͷ5!RB2B:̫G2B:BBBx$ !~(̹B4!C_ !~̴B=w!bC0C!OO:x AH":*CH"::6+fC ±B{ "z#| # "z RRġzġ{ "".".".".".".".".".QB".".".A".".".".".".".".".".".".".".".".".".QBBB".".BBB".".".".B".".".".".".".".".".".".".".".".A".".".BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB".".".".BB".BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB".".".".".".".".".".".".".".QB".".".A".".".".".".".".".".".".".".".".".".QB[B".".[B[B".".".".".".".".".".".".".".".".".".".".".A".".".[B[B[B[B[B[B[B[B[B[B[B[B[B[B[B[B[B[B[B[B[B[B[B[B[B[B[B[B".".".".[B".[B[B[B[B[B[B[B[B[B[B[B[B[B[B[B[B[B[B[B[B[B[B[B[B[B[B".".".".".͑#:1*F:1*ƌ2"}Ė#͑#">ƀ2>2*a͑#!;6~!6#w#w#6*H:z"aFFF*a "a~ N> zF>zFyzFzF#^#V:²F>'FzF"ʹ$!"B"g"i!XY 6!pq6T62[͑#*":2͖#:z!:} :~ ͷ͓$#1!{6!G"J͸F!'B:2( $eF!"8!'B:{]G!4F#4F!ͷ $eF͸F]G:0000000000  LIB͚)!~ !~!~;N/O͎!~!n&!̀}oEN3N*.* !~!h~;N00/00/00͎Er3!&3!h~;*~?,É3!&Ó3!& ;N/O͎!~!n&!̀}oEvN*.* !~!h~;N00/00/00͎Eʎ!&f3!h~;*~?,MLOAD CPM  NULU CPM (<UNCR CPM QL FOR  --FOGCPM193 QL31SRCEARC ;  w1 I L31 CZM 0 S ͫCs  { 985 BORLAND IncBNCR Decision Mate VdP= EE R(1)1~7#~=  oͦlԅ!!"~#(}:$= +*!6!*!!:(2!6:(>2!!!:O::O:!*! !45(! +/ 0y0( d!k6!{6``o&  :(͠|(  *"x2y( >28!"9!! og2"">~22!:05+:!Co&ͦͣ} [ (!e|ͧA8Q0G: x@!\w# (̓ ?(*( .( x_. _!h6# (?( *( ̓( w#>?> w#ͧ 8 !ɿ .,;:=?*[]<>{}a{ |͵};Ɛ'@'7||}>2Ͱ*Bک  "og"2>2! ""*B"[Rv*"^#V#^#V#N#FO/o&9O/o&9!9(> (G!9 w#Eͻw}8( RB0 >( RrRR!+ ͱ R!+ ͱ s!+ ͱ s!+ ͱ s!# ͱ s!+ ͱ T]KB!z> S>))0 = | |́́DMgo>jB0 7?= H͓<z5b)b<z {0Gɯgo||}||/g}/o#}o&K[xAJSJDM!b"!6J"DM'd } * W _}8(8J`9{T]=o`9y *  >( ͂ ͭ͘ }>( x‰ }} ˸T}ٕ(0D={ ,= ( ͓ 0%| , 7 ?(8ͭ x ͇ - s 8˸x ͐  ,-xG}s }مN 9s .>#n0͓ | = - nx ͈ ,-(-˸G,-s }ٕ?N 9.> 8ͭ ?= u+-(>͇ 0ͭ ͇ 8 ?x ͈ , 78ƀ8ƀ8ox٨!دoGOW_gɷɷ|لg{ً_zيWyىOxوG|ٔg{ٛ_zٚWyٙOx٘Gxٸyٹzٺ{ٻ|ټx٨ xx( ?}ٽ }ցs <(s 7| = |٤g{٣_z٢Wy١Ox٠G| ͭ ͂ }x>( ͭ}ƀ/ƀo  -͂ }0͏-͂ ͏,}l˸ 8 5 ͘ x( - 8͂ - 8,͂ }l8;*!͘ ! >5ͭ͘ ͘ ͭ---  ,,,-xGg?+2n*8t z~,->( x( ͙}. ͇͂ , ! >5,ͣ- o&0% ,͘  }gs }؉}颋.:}8c~I$I~L*ͣٷx˸ }0G,<} ,-(-͂ !>J0 ͙͘ o8 ͇ >( m.`1pF,t6|!wS<.z}[|%FXc~ur1}͇ٯx(<˸ 8 !~J 0/O!>t 8 =  o t͘ ͇ /o 0 ͏-͂ OT0 j oD,:j !I}袋.}8c~I$I~L! >ͭ͘ JØ oo ͘ = ͇ nf^VNF!DLT\I!!53!r1!͓!> x #-= o˸x͇(- }(x>8({ ,{ `iÄ!>( |s |́>)=|(DMbo˸88x(0 8> ́x(>-{(ay( z(>. ( {>E>+|(|Dg>-|/ 0:p# ~# +>0w#,-  60#~˸}րogM| .({ = ~> x0w#xG%͈ %͈ ZJDM%͈ = _~65+~hìx-Sx9?+{Η@}|{ { gZJDM0| ,7}o˸@ #yO!@9i&@  #@w#@/w#@w#!9! E9!!9~(+Fͻ!"9!(#>2*"| >"2:( ͷ *w*6 !\$![ (ͧ( #:~CONTRMKBDLSTCAUXUSR>2j:*ˮ~1:*:(@q##p[* :(  ~* < >26"!"""~>2""v>2>"!"ˮ(!~8>~O6~*"w(6(2(-()(6 (8 0 :(* y(~#+ (( 66 #6 #"*: y~o p .##~ͻ(.6w4._~ =*##55= *[R8*~#"= ͣ}== ͯ}͵}*#w+#~+>*~('l!0(ˮ]l!8ˮ!]~-#8~>27lˮw>O%7̄s #r%ͤ7̐ l ( (ˮ ql(ˮ ( l ˮ*O:~ ##~._q4((=ʦ==ʩ=ʬò*:4^q*##~6ͻ>2}*|(̈́|( ̈́6-#[RM8( G> A~#*(C! !TRUEFALSE!9N#Z~#( G~#> >    "~(lѻ(( !0 (ˮ!!>2S{:1:*6##ww#w$w#w:  ##N#F*B>2w#w#[s#r> "~ͯ*-w#ww##> ͯÂ""~>2:[R0 *4#4>2:[R> *4 #4(> >22*f(/˦:G(##~++ :O x yD!ͻ Q*:G(##~._.͛g<]=<͛*##w ͯ +4 #4x>>2:G("ͯ"*nˮ*0 S[ѷR8@* N#F#s#r- 0})jS\*##w+ N#FB ͯr+s>2!T]>)j)0 0= ^R!#^*^#V#N#F#^#V>2ͱ:1:*6 #-Nw#Fwq#p#6#w#w#w"~Â>">!DM!":*B:!>(>2>">!"2"~ʱ*w#wx(9* :O *-4 #4!*4 #4 *-N#Fq#pV+^Bq#pS[ѷR'* s#r$ s#rM <?*M!\  <( !\$>2>2M:>!(* \$\<(!4: [1ð\!(7"~> 2"S"Ns#FrB(Z#\: \<(?*"}K\! !*}#"}! x \* *>* 2""{_!"*nf}(HR0nf" ^VMDnfutqp*s#r*s#r"* vKB!1>( ~#fo{_"*R0RnfR0KqputsrNF( ^VNF^V*SutKqp R*R(~w~wnf ut"6#L*L*!""*NFy(* "*B0Cnf* [R*"*RS[s#r^#V""6#>O"w2x2*"!G"" 'z*"*>2"*"!G"""!\*: Os!~6go(\R*s#r_2x( s x(T]DMx(R0 U(͞O/o&9q# (!>F0#( ~ ( #]( ~ ( (#}(  i&T-a%ã}ͧo*!~6o&|:2!2}:__{ѯ2*|KB " z ^C User break+=  I/O Run-time error {͵, PC=*ͰNot enough memory Program aborted :m'1!~e!3z>*2!!{! !0"{! !{!n&!{!n&*{R!l"{! !{!n&!{!n&*{R"{! !{!n&!{!n&*{R"{*|&E!*{"{*{"{*{"{*{!BE!*{!d"{*{!F!̀E"!!!+!s*{!*{!̀}o*{!̀}oEV"!"| #*{!R"{*{!"{*{!F"{*{!R!*{"{*{!*{!}oE"*{!"{*{!m*{"{!*{!Rgz#"{*{!!*{+n&"{*{#"*{"|*|!|!yg)0>g>!or$s%# "{"{*{^#VK{yO!| ~W$^*{s#r͜ ͜ͻ>SETD01 by Brent B. Powers. Based on LSETDATE by CB Falconer.  ͜ͻ Examples:  ͜ͻ" B>SETD lbrname MM/DD/YY  ͜ͻ. sets all undated files in library ͜ ͜ͻ) B>SETD lbrname MM/DD/YY modulename ͜ͻ) sets selected, undated files ͜ ͜ͻ! B>SETD lbrname MM/DD/YY /O ͜ͻ.  sets ALL files, dated or not, and ͜ ͜ͻ, B>SETD lbrname MM/DD/YY modulename /O ͜ͻ. sets selected files, date or not. ͜ͻ2 Wildcards accepted. *.* equivalent to no entry ͜ͻ5 MM/DD/YY is the date to be set. Mandatory if the ͜ͻ6 system does not supply the current date, otherwise ͜ͻ7 overrides system date. The date may also be entered ͜ͻ: as EDD/MM/YY. Date separator may also be a '\' or '-'. }2{͜ͻ*** ERROR ***  *{&Rº'͜ͻ"CRC directory error, bad library: !+~;!ͫ ͜!#ͻ^C aborts, continues !ͪ!{E *{&!̀Eʷ' S(R'͜ͻNot a library: !+~;!ͫ S(R(͜ͻ Can't find !+~;!ͫ S(RS(͜ͻ%No system date or invalid date format ͜ *{&!͓Eq(v#Ã( 0123456789/-\"{*{*{n&!ÈEʷ(!"{!}2{(!"{!}2{*{#"{*{*{n&̀*{*{n&e.!u(;ͳ!̀}oE(*{*{n&̀EB)!}2{*{&}2|*|&E?)*{!!I)!}2{*{&"{!*{!n&gzʙ)"{*{*{*{*{n&s*{#k)N*}2}{"~{"{!{;!!l!m{!m{;!s{!q{*q{!̀*s{*{ͦ}o*s{*~{͹}oEA*!}2{!{;!m{;>*}{&e.>!{!{!!H*!}2{*{&"{ !{!/e.!{;ͳ!Eʅ*!/}2{ó*!-e.!{;ͳ!Eʬ*!-}2{ó*!\}2{!{;! e.> !{N 00/00/00 *{!{!!s*|&E +!"{! "{+! "{!"{!*{*{&͝)Ec+!*{*{&͝)Ec+!!c! ͝)Ec+!{;*{"h{"j{*~!)^#V*j{s#r*~!n&!̀*~!n&!}o*j{^#V!}o*j{^#V! }o*~!)^#V!̀}o}2l{*~!)^#V*h{s#r*~!)!s#r*l{&b0*D{!*D{^#V"D{!8~*D{!Ϳ -"!{*!{!"{*{!"!{*D{*!{n&!̀Ep-!"{*{#"{*{! ̀*D{*{*!{n&!5{*{+n&͓!5{*{+n&!?͓}o}oEʶ,*{! ̀Ep-*D{*{! )^#V!̀*|&}oEp-*D{*{! )*|s#r"{*{!" {*D{* {!n&!̀E-*D{* {! )^#V!̀*|&}oE-*D{* {! )*|s#r!~;N*.*͎E-.!q-!q-!q-!q-I.!o,!o,!o,!o,!8~*D{!ͻ *D{^#V"D{"z"z*zO)!"z!"z*z! ! O*z!+! s*z!͹*z*zn&͂! ͒!.͒!*͒P}o}oE/*z*z+*z*zn&s*z#"z*z#"zè.*z*zn&!*̀E_/*z!gzX/"z*z*z+!?s*z#5/*z#"z*z*zn&͂! ͒!.͒P}oEʑ/*z#"z_/*z*zn&!.̀Ea0*z#"z! "z*z! ͹*z*zn&͂! ͒!*͒P}o}oE0*z*z+*z*zn&s*z#"z*z#"z÷/*z*zn&!*̀Ea0*z! gza0"z*z*z+!?s*z#>0"N{!P{!~!5{j.!P{;!"|*~"D{!"@{!*N{+gzʶ0"B{B,*B{#á0!*D{s#r*~"D{!!gz0"B{*D{*B{n&!@{K#*B{#0l,*D{^#V"D{*D{!̀E0*@{*~͓*~!͓}oE?1!&*~"D{!"@{!!gzʀ1"B{*D{*B{n&!@{K#*B{#V1*D{^#V"D{*D{!̀EK1!8~!p *~!)*@{s#r*~"D{*D{!͓E1J.1!8~ͱ ͜~!h~!h~O)!h~;N/O͎}2|!"~N00/00/00!h~$#1͜*~EC2v#Ó3!.e.!~ͳ!̀E}2!~N.LBR > !+~Ë2!~ !+~!8~!+~;q!8~q!̀Eʌ3!~!!8~*~!Ϳ !~!~d+Eʂ3!~ !~!~r(E3!~;!h~͚)!~ !~!~;N/O͎!~!n&!̀}oEN3N*.* !~!h~;N00/00/00͎Er3!&3!h~;*~?,É3!&Ó3!& ;N/O͎!~!n&!̀}oEvN*.* !~!h~;N00/00/00͎Eʎ!&f3!h~;*~?,SETD01, by Brent B. Powers, based on LSETDATE by CB Falconer. Examples: 17 Oct 87 B>SETD libraryname MM/DD/YY sets all undated files in library B>SETD lbrname MM/DD/YY modulename sets individual, undated files B>SETD lbrname MM/DD/YY /O sets ALL files, dated or not B>SETD lbrname MM/DD/YY modulename /O sets selected files, date or not Wildcards accepted. *.* equivalent to no entry. MM/DD/YY is the date to be set. Mandatory if the system does not supply the current date, otherwise overrides system date. The date may also be entered as EDD/MM/YY. Date separator may also be a '\' or '-'. [1] B0}PROGRAM lsetdate; CONST header = 'SETD01, by Brent B. Powers, based on LSETDATE by CB Falconer.'; all = '*.*'; ovrwr = '/O'; binrcdmax = 127; { 1 sector of file } fnmsize = 12; { handles most systems } datelnsz = 15; TYPE dateln = string[datelnsz]; fname = string[fnmsize]; err = (needate, notlib, cantfind, crcerr); binchunkb = array[0..binrcdmax] of byte; binchunkw = array[0..63] of integer; binrecptr = ^binrecd; binrecd = record next : binrecptr; recd : binchunkb; end; { binrecd } binrecptw = ^binrecdw; binrecdw = record next : binrecptw; recd : binchunkw; end; { binrecw } VAR dateline : dateln; libfile : file; libfname : fname; mdlname : fname; size, { of directory } dircrc : integer; { extracted from dir[0] } minparam : integer; root : binrecptr; rootw : binrecptw absolute root; crctbl : array[0..512] of byte; ndate : integer; europe : boolean; overwrite : boolean; {$IDRDATE.INC} { contains function drdate( dateline:dateln):integer; } {$ICRC.INC} { contains procedure crcinit; } { and procedure crc(a:integer;var crcword:integer); } procedure help; begin { help } writeln; writeln(header); writeln('Examples :'); writeln(' B>SETD libraryname MM/DD/YY'); writeln(' sets all undated files in library'); writeln; writeln(' B>SETD lbrname MM/DD/YY modulename'); writeln(' sets selected, undated files'); writeln; writeln(' B>SETD lbrname MM/DD/YY /O'); writeln(' sets ALL files, dated or not, and'); writeln; writeln(' B> SETD lbrname MM/DD/YY modulename /O'); writeln(' sets selected files, date or not.'); writeln(' Wildcards accepted. *.* equivalent to no entry'); writeln(' MM/DD/YY is the date to be set. Mandatory if the'); writeln(' system does not supply the current date, otherwise'); writeln(' overrides system date. The date may also be entered'); writeln(' as EDD/MM/YY. Date separator may also be a ''\'' or ''-''.'); end; { help } procedure signal(x : err); var a : char; begin { signal } write('*** ERROR *** '); case x of crcerr: begin writeln('CRC directory error, bad library: ', libfname); write(chr(7), '^C aborts, continues'); read(kbd,a); if a = ^C then halt; end; notlib: write('Not a library: ', libfname); cantfind: write('Can''t find ', libfname); needate: write('No system date or invalid date format'); end; writeln; if x <> crcerr then help; end; { signal } function chkdate(var f):boolean; const valchar : string[13] = '0123456789/-\'; var i : integer; st : string[255] absolute f; l : byte absolute f; eur : boolean; begin if UpCase(st[i]) = 'E' then begin i := 1; eur := true; end else begin i := 0; eur := false; end; repeat i := succ(i); until (i=l) or (pos(st[i],valchar)=0); if i = l then begin chkdate := true; europe := eur; if europe then delete(st,1,1); end else chkdate := false; end; procedure cap(var f); var i : integer; st : string[255] absolute f; begin for i := 1 to ord(st[0]) do st[i] := UpCase(st[i]); end;  procedure setdate(f : fname; var d : dateln); var da,mo: integer; d1 : dateln; dl : char; function getfield(min, max : integer; delimiter : char) : boolean; var i,j: integer; st : string[3]; begin { getfield } st := copy(f,1,2); val(st,i,j); if (j = 0) and (i >= min) and (I <= max) then begin getfield := true; d1 := d1+st+delimiter; delete(f,1,3); end else getfield := false; end; { getfield } begin { setdate } if pos('/',f)>0 then dl := '/' else if pos('-',f)>0 then dl := '-' else dl := '\'; f := f + ' '; d := '00/00/00 '; { default for error } d1[0] := #0; if europe then begin mo := 31; da := 12; end else begin mo := 12; da := 31; end; if getfield(1, mo, dl) then  if getfield(1, da, dl) then if getfield(0, 99, ' ') then d := d1; end; { setdate } function verify(var size, dircrc : integer) : boolean; begin { verify } size := rootw^.recd[7]; verify := (root^.recd[0] = 0) and (root^.recd[1] < 127) and (size > 0) and (size < 8192) and (rootw^.recd[6] = 0); dircrc := rootw^.recd[8]; rootw^.recd[8] := 0; { for dir crc calc. } end; { verify } procedure revise(dateline : dateln; size : integer); type mnametype = array[1..11] of char; var current : binrecptr; currentw : binrecptw absolute current; i, crcwd : integer; mname : mnametype; procedure getchunk; var i : integer; begin { getchunk } new(current^.next); current := current^.next; BlockRead(libfile,current^.recd,1); end; { getchunk } procedure setupdate; procedure chkmatchat(ix : integer); { implements wild card matching against current^.recd[ix] } var i : integer; iy : integer; begin { chkmatchat } iy := ix*16; ix := iy*2; if current^.recd[ix] = 0 then begin { live entry } i := 0; repeat i := succ(i); until (i=11) or ( (current^.recd[i+ix] <> ord(mname[i])) and (mname[i] <> '?')); if i = 11 then { match, update the date } if (currentw^.recd[iy+9] = 0) or overwrite then currentw^.recd[iy+9] := ndate; end; end; { chkmatchat } procedure chknodateat(ix : integer); { implements setting of any unset dates current^.recd[ix] } var iy : integer; begin { chknodateat } iy := ix*16; if (current^.recd[iy*2] = 0) then if (currentw^.recd[iy + 9] = 0) or overwrite then curr!entw^.recd[iy+9] := ndate; end; { chknodateat } begin { setupdate } if mdlname = all then begin { all undated } chknodateat(0); chknodateat(1); chknodateat(2); chknodateat(3); end else begin { update the specific entry } chkmatchat(0); chkmatchat(1); chkmatchat(2); chkmatchat(3); end; end; { setupdate } procedure putchunk; begin { putchunk } BlockWrite(libfile,current^.recd,1); current := current^.next; end; { putchunk } procedure standardize(var mdlname : fname; var mname : mnametype); { input wild string format to directory format } var i, j : integer; begin { standardize } Cap(mdlname); i := 1; j := 1; fillchar(mname,12,' '); mname[0] := #11; while (i <= 8) and not (mdlname[i] in [' ', '.', '*']) do begin mname[j] := mdlname[i]; i := succ(i); j := succ(j); end; if mdlname[i] = '*' then begin for j := j to 8 do mname[j] := '?'; i := succ(i); end; while not (mdlname[i] in [' ', '.']) do i := succ(i); if mdlname[i] = '.' then begin i := succ(i); j := 9; while (j <= 11) and not (mdlname[i] in [' ', '*']) do begin mname[j] := mdlname[i]; i := succ(i); j := succ(j); end; if mdlname[i] = '*' then for j := j to 11 do mname[j] := '?'; end; end; { standardize } begin { revise } standardize(mdlname, mname); { to the directory format } ndate := drdate(dateline); current := root; crcwd := 0; for i := 1 to pred(size) do getchunk; { get the whole directory into memory } current^.next := nil; current := root; repeat for i := 0 to binrcdmax do crc(current^.recd[i], crcwd); setupdate; current := current^.next; until current = nil; if (crcwd <> dircrc) and (dircrc <> 0) then signal(crcerr); current := root; crcwd := 0; repeat for i := 0 to binrcdmax do crc(current^.recd[i], crcwd); current := current^.next; until current = nil; seek(libfile, 0); rootw^.recd[8] := crcwd; current := root; while current <> nil do putchunk; close(libfile); end; { revise } procedure initialize; begin { initialize } dateline := paramstr(paramcount); cap(dateline); overwrite := dateline = ovrwr; { with system clock } { minparam := 1; } { dater(dateline); } { without system clock } minparam := 2; dateline := '00/00/00'; { If you can get the date from your system, the routine to do that } { should be coded as procedure dater(var dl : dateln); } crcinit; end; { initialize } begin { lsetdate } initialize; if paramcount < minparam then help else begin if pos('.',paramstr(1)) = 0 then { set default .lbr } libfname := paramstr(1)+'.LBR ' else libfname := paramstr(1); assign(libfile,libfname); {$I-} reset(libfile); {$I+} if IOResult=0 then begin new(root); { file was found, make sure it is a library. } BlockRead(libfile,root^.recd,1); if verify(size, dircrc) then begin { whether or not there is a system clock, they may have entered } { the date. Check if paramstr(2) is a date } mdlname := paramstr(2); if chkdate(mdlname) then begin setdate(mdlname, dateline); mdlname := paramstr(3) { paramstr2 was date } end; if (mdlname = ovrwr) or (mdlname[0] = #0) then mdlname := all; if dateline = '00/00/00' then signal(needate) else revise(dateline, size) end else signal(notlib); end else signal(cantfind); end; end. { lsetdate } " procedure crcinit; begin inline ( $21/CRCTBL/ { LD HL,CRCTBL } $0E/00/ { LD C,0 } $EB/ {GLOOP: EX DE,HL } $21/00/00/ { LD HL,0 } $79/ { LD A,C } $C5/ { PUSH BC } $06/$08/ { LD B,8 } $AC/ { XOR H } $67/ { LD H,A } $29/ {LLOOP: ADD HL,HL } $30/$08/ { JR NC,LSKIP } $3E/$10/ { LD A,10H } $AC/ { XOR H } $67/ { LD H,A } $3E/$21/ { LD A,21H } $AD/ { XOR L } $6F/ { LD L,A } $10/$F3/ {LSKIP: DJNZ LLOOP } $C1/  { POP BC } $EB/ { EX DE,HL } $72/ { LD (HL),D } $24/ { INC H } $73/ { LD (HL),E } $25/ { DEC H } $23/ { INC HL } $0C/ { INC C } $20/$DF { JR NZ,GLOOP } ); end; procedure crc(abyte:integer;var crcwd:integer); begin inline ( $2A/CRCWD/ {CRCUPD: LD HL,(CRCWD) ; Point HL at crcwd } $5E/ { LD E,(HL) ; Put value into DE } $23/ { INC HL } $56/ { LD D,(HL) ; DE holds crcwd } $ED/$4B/ABYTE/{ LD BC,(ABYTE) ; C holds byte to be added } $79/ { LD A,C ; A holds byte to be added } $06/$00/ { LD B,0  } $AA/ { XOR D } $4F/ { LD C,A } $21/CRCTBL/ { LD HL,CRCTBL } $09/ { ADD HL,BC } $7E/ { LD A,(HL) } $AB/ { XOR E } $57/ { LD D,A } $24/ { INC H } $5E/ { LD E,(HL) } $2A/CRCWD/ { LD HL,(CRCWD) } $73/ { LD (HL),E } $23/ { INC HL } $72 { LD (HL),D } ); end;  function drdate(d : dateln) : integer; { 1 jan 1978 <--> drd = 1. assumes valid d } CONST dayspermonth : array[1..12] of byte = ( 31,28,31,30,31,30,31,31,30,31,30,31); var year, month, day, i : integer; begin i := 11*ord('0'); year := 10 * ord(d[7]) + ord(d[8]) - i + 1900; month := 10 * ord(d[1]) + ord(d[2]) - i; day := 10 * ord(d[4]) + ord(d[5]) - i; if europe then begin i := month; month := day; day := i; end; if year < 66 then year := year + 100; if ( (year mod 4) = 0) then dayspermonth[2] := 29; { doesn't take into account 1900 or 2100 } if (year < 1978) or (month = 0) or (day = 0) then drdate := 0 else begin year := (year - 1976); i := year div 4; year := year mod 4; day := day - 731 { from 1 jan 1976, -1 } + 1461 * i; if (year > 0) or (month > 2) then day := day+1; day := day + 365 * year; for i := 1 to month-1 do day := day + dayspermonth[i]; drdate := day; end; end; { drdate } # This is the release date of the disk. DRDATE INC SETD .PAS 59 16 11904 93 CRC .INC BF EE 2816 22 DRDATE .INC FA 89 1152 9  1 QL31 .COM 92 66 6912 54 QL31 .DOC A4 27 29312 229 QL31 .UPD 53 9A 8448 66 QL .FOR C4 75 512 4 QL$ZCPR3.DOC AE 60 4608 36 QL31SRCE.ARC 68 67 62592 489 Z1 .COM 43 64 12544 98 SETD .COM 73 A6 13056 102 SETD .HOW D1 FB 768 6  Fog Library Disk FOG-CPM.193 Copyright (1988) by Fog International Computer Users Group to the extent not copyrighted by the original author for the exclusive use and enjoyment of its members. Any reproduction or distribution for profit or personal gain is strictly forbidden. For information, contact FOG, P. O. Box 3474, Daly City, CA. 94015-0474. as part of the description of a file indicates that the program is distributed on a "try first, pay if you like it" basis. If you find the program(s) meet your need, please refer to the author's documentation for information on becoming a registered user. Only by registering and paying for the programs you like and use will the authors of such programs continue development. Often, more complete documentation, additional modules, and new releases are available only to registered users. Handy utilities for many users, a couple programs are especially nice if you are running a remote system which uses BYE5xx. Filename Description -06-21 .88 This is the release date of the disk. -CPM193 .DOC This is the description of the disk contents. QL31 .COM 9266 7K ver. 3.1 [Quick Look 1 of 7] Fast, memory-based file viewing utility. Go backward or forward through standard ASCII, squeezed, and crunched files as well as .COM files. Do string or byte searches, dump HEX code, view directory to .LBR files, and much more. ASseMbler source and the Z1 assembler are both included. QL31 .DOC A427 29K ver. 3.1 [Quick Look 2 of 7] QL31 .UPD 539A 9K ver. 3.1 [Quick Look 3 of 7] QL .FOR C475 1K ver. 3.1 [Quick Look 4 of 7] QL$ZCPR3.DOC AE60 5K ver. 3.1 [Quick Look 5 of 7] QL31SRCE.ARC 6867 62K ver. 3.1 [Quick Look 6 of 7] QL31 .002 43K [QL31SRCE.ARK 1 of 3] QL31 .AZM 56K [QL31SRCE.ARK 2 of 3] UNZ .ASM 21K  [QL31SRCE.ARK 3 of 3] Z1 .COM 4364 13K ver. 3.1 [Quick Look 7 of 7] Another Z80 assembler program. SETD .COM 73A6 13K ver. 01 [Set Date 1 of 5] A program to set or change the date of the members of .LBR files. Very handy with the newer releases of LUX and related programs. Turbo Pascal source code is included. SETD .HOW D1FB 1K ver. 01 [Set Date 2 of 5] SETD .PAS 5916 12K ver. 01 [Set Date 3 of 5] CRC .INC BFEE 3K ver. 01 [Set Date 4 of 5] DRDATE .INC FA89 2K ver. 01 [Set Date 5 of 5] OC This is the description of the disk contents. QL31 .COM 9266 7K ver. 3.1 [Quick Look 1 of 7] Fast, memory-based file viewing utility. Go backward or forward through standard ASCII, squeezed, and crunched files as well as .COM files. Do string or byte searches, dump HEX code, view directory to .LBR files, and much more. ASseMbler $%&'