IMD 1.18: 22/01/1996 7:22:45 micro cornucopia kaypro user group disk 25 z80 macro assembler     25-DISK DOCAZM-COM DOC CRC COM CRC DOCCRCKLISTCRCMAC-AZM DOC#PHASE DOCEPHASE1 AZM README ZQ0; !"#$%&'UNSQ COM`()*+,-./0123Z80 COM@456789:;Z80 ZQ0$<=>?@Z80A ZQ0+ABCDEFZ80B ZQ0GHIJKLMNOPQRSTUVZ80B ZQ0WXYZZ80C1 ZQ0][\]^_`abcdef Kaypro Disk #25 Z80 Macro Assembler This disk contains a Z80 macro assembler that is the nicest I've seen in the public domain. We spent quite a bit of time documenting this to find all the syntax requirements so you didn't have to find them out the hard way (assembler errors). We intend to make this the target assembler for all asembly language source files we put out on disk from now on. If you find any 'GOTCHA's' with this assembler please send them in so we can keep this assemblZ80C2 ZQ0ghijklmnopqrstuvZ80C2 ZQ0wZ80D ZQ0nxyz{|}~Z80E ZQ0JZ80F Z80Z80F ZQ0BZ80MR COMiZ80MR DOCZ80MR DOCLer fully documented. We are also going to put together a macro library for this assembler. If you've got some that you'd like to donate, send them in. Z80MR.COM The Z80 macro assembler itself. Z80MR.DOC This is our documentation file crammed with examples and as much information as I could come up with on this assembler. AZM-COM.DOC How to get from an assembly language source file to a .COM file. Includes options for output control. PHASE.DOC How to get around the phase and dephase   operators found in M80 files. MAC-AZM.DOC What you need to know to change .MAC (MicroSoft's M80 assembler source files to .AZM files. ........................................................................... Example Z80MR source files PHASE1.AZM Sample program described in PHASE.DOC ........................................................................... Z80.COM *.ZQ0 This is the Crowe assembler extensivly modified to do conditionals, as well as a number of other new trl have the same filename as the source file but will have a .HEX extension. This format must be translated into the actual machine executable binary values in order to be run on a computer. This can be done with LOAD.COM or DDT.COM which came with your CP/M. (described later). Many EPROM burners only except the program to be burned in Hex format. The listing file is the other ouput by the assembler. It is ascii representation of the code actually produced by the assembler. There are many optionsthe object file and may be A-D as above or Z if the file is not desired. The letter in the 'l' position tells the assembler what to do with the listing file. It can be any drive letter from A-D or Z if the file is not desired. In addition the listing file may be sent to the console if an X is in that position. Loading Hex Files.......................................................... The object file must be translated from Hex format to machine executable values by another program. If the prograicks. To view the source and documentation files, create a blank formatted disk with system tracks and place it in drive A, with a copy of user K25 in B. Make sure you are logged onto drive A and then enter B:UNSQ B:*.ZQ0 and the file unsqueezer will do the rest. The assembler itself is Z80.COM (not squeezed) and the documentation for it is in the file README.Z80 (after it has been unsqueezed). Yes it assembles itself! ............................................................................  available for controlling what is included in the listing file as described in Z80MR.DOC. The listing file will have the same filename as the source file but will have a .PRN extension. Invoking the Assembler..................................................... To assemble the file TEST.AZM the following command can be used: Z80MR TEST The assembler will read in the file TEST.AZM from the current drive and create an object file TEST.HEX and a listing file TEST.PRN. Cont The Z80MR creates two output files from an assembly language source file with a .AZM extention. The assembly language file can be any combination of Z80 mnemonics or assembler commands and pseudo-ops in the correct form as described in the file Z80MR.DOC. Each line of the source program is seperated by a carriage return linefeed and can be created on any editor. The object file is the executable machine code represented by ascii characters in a form known as Intel Hex Format. The object file wilm was written to ORG at 100H the program may be loaded with the CP/M utility LOAD.COM. All of the programs on this disk with a .COM extension are ORGed at 100H. This is where CPM loads its transient programs. To load TEST.HEX with LOAD.COM just enter LOAD TEST The extention of .HEX is assumed. If you have a program that does not ORG at 100H you must use DDT to read in the .HEX file which it does by translating the Hex format to binary as it reads it into memory. Once in memory you may manipul To verify the files on this disk enter: CRC ............................................................................ rolling Output......................................................... Either of the output files (or both) may be omitted. In addition, the files may be located on different drives. Since the source file must always have a .AZM extention we may use the extention to control the output. Z80MR TEST.sol The letter in the 's' position tells the assembler where to find the source file and may be any disk drive letter from A to D. The letter in the 'o' position tells the assembler where to locate   ate it with DDT even SAVE an image of the program in memory actually creating a .COM file. If you write a program that ORGs where CP/M resides you can wipe out CP/M and have to reset the computer to recover. See the file PHASE.DOC for some more information on ORGing files at High memory locations. ::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: *#"ɯ2i2}! "!"]]2 s : ~# ++FILE NOT FOUND++$: F*}’">͇†]<  CANNOT CLOSE CRCFILE$CRCKLISTCRCSK FULL: CRCFILE$  w# !]͐ DONE$!e S!]Q !eZ @ --> FILE: XXXXXXXX.XXX CRC = oS) \<‘@ ++OPEN FAILED++ !" !" * | ʹ) \!~2 #" Ý: ) > T : ) @ ++FILE READ Eth file - ! ~T #M M 2 2 2 2 ! >2 3o: : @ ***No CRC Files found***$> ʉ ʉw#: <2 P6: .6@ Can not parse string ! ~ʽT #ñM ! > 6 #6^#6! ~T #! 4M #x] #e w~ T #>2 @ - s M@ File not found ! 4 >2 o: G: „: G: „@ *Match* 2 ! 4@ <-- is, was --> : ) > T : ) M 2 ! 4<2 ~# @ Not a space between CRC values<2 G-CATALOG??? Using CRC Type CRC to verify all the files on this disk. Type CRC *.* F to generate CRC's for an entire disk and create a CRC file (CRCKLIST.CRC) for checking the CRC's of a copy of the disk etc. Omitting the F will suppress creation of a CRCKLIST.CRC file. *.* can be replaced with an unambiguous file name for checking just one file. RROR++ <* |): o% |g}o" 2  ; 0T ~T #~A > T > _h : F{͇2h2|: ʲ !\   :\2 ! \  \ ! \  \! \  \<7=Ɓo&   ]  2h2|2   ~$#~# x  : F} *}= ">͇1 ].”#””͡”››tK››͸›* =: =͔="  ʳ ª~#.  ¿~  #~  .+~#0:0~#!A.O.Gy~#0M0 K MMɷ:m2 FSÄCRCKLIST$$$››tK›, › **}|!"*{z*~]*"Ü  DISK FULL: CRCFILE$!"*~#CRC.COM 5.0 6/18/82CRCKFILE???!9" 1 M @ CRC Ver 5.0 CTL-S pauses, CTL-C aborts :] O@ ++Searching for CRCKLIST file++@ Now searching for "CRCKFILE" file++ !  1 .) F!  ͡]͸! ͔0CRCKLIST???CRCKFILE???!9" M à*,*.}|ډ!".*,{z{** u*.".G*.",!".***,}>*.#".ɯ22)! ",". <  NO FILECRC FILE$!   >. @ Checking wi match - : ̓ : J M @ Quantity of lines failed parse test - : ̓ : ~ M @ Quantity of file(s) not found - : ̓ * d͔  ͔ 0T  Җ Wyʩ 0T 0ztiil   --> FILE: CRC .COM CRC = B2 07 --> FILE: CRC .DOC CRC = E5 81 --> FILE: Z80MR .COM CRC = 1F 31 --> FILE: Z80 .ZQ0 CRC = 71 8F --> FILE: AZM-COM .DOC CRC = 4D 2C --> FILE: Z80MR .DOC CRC = F7 0C --> FILE: Z80A .ZQ0 CRC = 97 38 --> FILE: PHASE1 .AZM CRC = A4 AA --> FILE: Z80B .ZQ0 CRC = C8 AA --> FILE: PHASE .DOC CRC = EA FB --> FILE: Z80C1 .ZQ0 CRC = 49 95 --> FILE: MAC-AZM .DOC CRC = 2F F2 --> FILE: 25-DISK .DOC CRC = A6 86 --> FILE: Z80C2erating any output files (see AZM-COM.DOC) and still get the error report on the console. A ^P before running the assembler will dump to the printer as well. Now you can go back into the file and fix the syntax where the assembler generated errors. Dual mnemonic files........................................................ XLATE2 is a great translator on 8080 only files. It also will only translate the 8080 mnemonics in a file that has both. Unfortunately there are a couple of Z80 mnemonics that which when used to its full advantage contains some pseudo-ops and directives that Z80MR does not understand. I will reveal the most common of these and provide some help on getting around them in this file. First things first......................................................... Rename the file to have a .AZM extension. Edit the file. Near the beginning of the file you will see the pseudo op that tells M80 what mnemonics you will be using. M80 can handle both Z80 and 8080 mnemonics. You can ike to see is someone rework XLATE2 so that it would stop translating when it saw .Z80 (and also comment the pseudo-op out) and start again when it saw .8080 (and comment it out as well). Also some of the other minor syntax changes could be fixed as well. Yes XLATE2 can be assembled with Z80MR (it is a .MAC file). After removing the .Z80 at the beginning of the file the only error I got was for the MOD operation on the version number (MOD not supported by this assembler). My solution, just enter the  .ZQ0 CRC = 66 09 --> FILE: Z80D .ZQ0 CRC = D8 28 --> FILE: Z80E .ZQ0 CRC = 98 7B --> FILE: Z80F .ZQ0 CRC = 86 CA --> FILE: README .ZQ0 CRC = D8 03 --> FILE: UNSQ .COM CRC = 2E 55 --> FILE: Z80 .COM CRC = 89 49 are the same as 8080 mnemonics and will be dutifully translated by XLATE2. The problem is that the mnemonics are the same but the instructions they represent are not. So the file will assemble OK but will run with unpredictable results. An example. JP is a valid Z80 mnemonic. It is also widely used since it is an unconditional jump (JMP in 8080) JP is also a valid 8080 mnemonic. It is the jump on parity instruction. So a Z80 JP is translated as if it was the 8080 JP which will make it even switch in the middle of the program. Two pseudo-ops .Z80 and .8080 tell the assembler which mnemonics to recognize. If there is a .Z80 there delete it. If there is a .8080 there you will need to run the program through an 8080 to Z80 translator (like XLATE2.COM on disk K17). At this point what I usually do is run the program through the assembler. The assembler is very good at finding errors, so I let it tell me what it doesn't like. You can run the program through the assembler without genversion number there. Having the assembler figure out the ascii just wasn't that important. Macros..................................................................... The M80 macros go through Z80MR pretty well for the most part. There are some syntax changes to be made. Precede the parameters with # signs (including locals). Also there are some macro pseudo-ops that are not supported (also not widely used). If some one writes Z80MR macros to substitute for these (and a MOD operator) please Most of the assembly language programs released on Micro Cornucopuia disks are set up for the M80 assembler. If you've been wondering what the .MAC extension is for, those are M80 source code programs. Many of the people that got this disk did so to assemble the Kaypro Tinkerkit (source of the rom monitor and bios) without spending $150 for M80. It can be done. For the most part .MAC files can easily be translated to .AZM with very few changes. Unfortunately M80 is as extremely versatile assembler JP P in the output file. Bad news. This in itself is enough to make it too undependable to use on dual mnemonic files. To avoid the grief you can do one of two things: Translate the 8080 sections by hand if they are small enough. Split the file into smaller files where the mnemonics change. Run the 8080 sections through the translator. You can let the assembler rejoin the files using the *INCLUDE statement or use pip or your editor to rejoin and assemble the whole mess. What I'd really l   send it in and we'll include it in the macro library that we are developing for this assembler. .phase and .dephase........................................................ These are used to make the assembler generate label addresses for some other part of memory than where the file will be loaded. The file PHASE.DOC offers some alternative ways of doing this.  re-loads your monitor ROM from the ROM to RAM illustrates this. ;************************************************************************** ;** Rom Save Program ** ;** Run and then enter SAVE 16 ROM.COM ** ;** ROM.COM will contain object code of your monitor ROM ** ;************************************************************************** ORG 100h TRUE EQU 0FFH FALSE EQU 0 OLD EQU TRUE ; TRUE IF Nm to be saved resulting in a huge .COM file when loaded with LOAD.COM. There are many ways to phase code and still end up with a reasonable sized .COM file. Here I will present two of the most common methods. Label+OFFSET Method........................................................ In order for code to be assembled in one area to run in another, our only concern is how the addresses are calculated by the assembler. Normally, an assembler sets a location counter when it sees an ORG pseudo-oes source LD DE,100H ; move to TPA start LD BC,1000H ; 4K bytes to move LDIR RET HIEND EQU $+OFFSET ; end of code to be relocated END Assemble this program (the source is on the disk as phase1.azm so you don't have to type it in). Examine the listing file. Notice that the assembler generated high memory addresses though the program loads low. Using DDT.COM.............................................................. With this method you would split the above program into two partOT 10 OR 4-84 IF OLD SYSPRT EQU 1CH ; old kaypro 2's and fours ELSE SYSPRT EQU 14H ; tens, 4-84's, 2-84's ENDIF OFFSET EQU 8000h ; offset for calculating high addresses LD DE,HISTRT ; the destination of the High memory code LD HL,LODEND+1 ; the source code is just beyond this loader LD BC,HIEND-HISTRT ; the number of bytes to move (end - start) LDIR ; move it up there JP HISTRT ; jump to it LODEND: NOP ; to calculate end of loader/start of high ; memory code segment p. As it produces each byte of the it increments the location counter to calculate the next address. If it finds a label, it sets the label's address according to this location counter. The programmer has another method of setting the address of labels, with EQU. If every label in the program takes the form of Label+OFFSET where the offset is a constant, then the assembler will produce the code to run in high memory while creating a file that will load in low memory. The following short program whichs, the loader and the code that is to be relocated. You can assemble the loader and pick an arbitrary source address for the code to be relocated (say 200h). Then you can assemble the relocatable portion with an high ORG. (8000H say). Now you can join the two HEX files together with DDT.COM reading in the high portion with an OFFSET. To get the offset use DDT's Hex sum and difference command in the form of: H, The second number will be the OFFSET. The program PHASED code One of the limitations of this assembler is the lack of a .PHASE directive. This directive causes the assembler to generate addresses for a different section of memory for labels than the actual place the code is to be loaded. This is important for the Kaypro since when the ROM is called, the lower 32K of memory is no longer available. Simply ORGing at higher location later in the program and jumping there will cause the entire area of memory between 100H and the end point of the progra HISTRT EQU $+OFFSET ; BEGIN USING OFFSET IN A,(SYSPRT) ; get present sysport data SET 7,A ; bank select bit OUT (SYSPRT),A CALL MOVIT ; move the code routine IN A,(SYSPRT) RES 7,A ; back to ram bank OUT (SYSPRT),A CALL TPAMOV ; now move to 100H for save JP 0 ; back to CP/M MOVIT EQU $+OFFSET LD HL,0 ; Source is at 0 (in ROM ) LD DE,OFFSET+1000H ; Load above us LD BC,1000h ; pick up 4K (2732) LDIR RET TPAMOV EQU $+OFFSET LD HL,OFFSET+1000H ; destination becom  we wrote above would go together like this. ;************************************************************************** ;** Loader.azm Loads relocating code to its destination *** ;************************************************************************** ORG 100H BYTCNT EQU 100H ; we can either supply a value here that we ; know will load enough code or assemble ; the high code first and let the assembler ; give us this value (examine print file) HISTRT Eimage with the modified section and re-SYSGENing. Lets say you wrote a new BIOS for your Kaypro. The BIOS for the old Kaypros ORGed at FA00H. You assemble it with the assembler with the ORG at FA00H. The object file is KBIOS.HEX If you want to overlay the present bios with your new bios immediately to see if it works it is done as follows: Enter DDT by entering DDT IKBIOS.HEX ; this sets up DDT for a file read R ; actually reads the file in and overlays ; your,A ; back to ram bank OUT (SYSPRT),A CALL TPAMOV ; now move to 100H for save JP 0 ; back to CP/M MOVIT: LD HL,0 ; Source is at 0 (in ROM ) LD DE,9000H ; load above us LD BC,1000h ; pick up 4K (2732) LDIR RET TPAMOV: LD HL,9000H ;destination becomes source LD DE,100H ; move to TPA start LD BC,1000H ; 4K bytes to move LDIR RET HIEND EQU $ END Now we can use DDT to join the two files. DDT LOADER.HEX H200,8000 8200 8200 ; in this case both numbers are the sam ; offset ikbios.hex r ^C Now when we return to CP/M we run sysgen to save the new image to system tracks. SYSGEN KAYPPRO SYSGEN V2.2 SOURCE DRIVE (OR RETURN TO SKIP) ;enter return (use the memory image) DESTINATION DRIVE (OR RETURN TO REBOOT) ;we will put it on B DESTINATION ON B THEN RETURN ; another return FUNCTION COMPLETE DESTINATION DRIVE (OR RETURN TO REBOOT) ; one more return Now when when we boot with the disk in drive B the new system will be loadeQU 8000H ; where the relocation code goes HILOAD EQU 200H ; where the other file goes LD DE,HISTRT ; the destination of the High memory code LD HL,HILOAD ;the source code is just beyond this loader LD BC,BYTCNT ;the number of bytes to move (end - start) LDIR ; move it up there JP HISTRT ; jump to it ; memory code segment END ;************************************************************************** ;** Phase2.azm ***  old bios with the binary code ^C ; returns you to CPM and if all is well ; with your new bios you will warm boot Now you want a permanent copy of your new bios on your system tracks. Once done you will be able to copy your new system onto any disk with SYSGEN. SYSGEN copies the system into memory but not at the same place the system runs. The BIOS image actually begins at 1F80H in the SYSGEN image. We must read the file in at 1F80H even though it ORGs at FA00H. We can do this with DDT alsoe (we want ; second IPHASE2.HEX ; prepare to load file R8200 ; read in with offset ^C ; exit to CPM SAVE 1 PHASE3.COM ; and the com file is created ORGing High ( CP/M modifications )......................................... DDT.COM can be used to load .HEX files anywhere in memory despite where the load point (ORG) was set. It does this by reading the file in with a negative offset with the R command. Usually CPM is modified by saving the SYSGEN image and then overlaying the d.  ;** Relocate with DDT *** ;************************************************************************** TRUE EQU 0FFH FALSE EQU 0 OLD EQU FALSE IF OLD SYSPRT EQU 1CH ; old kaypro 2's and fours ELSE SYSPRT EQU 14H ; tens, 4-84's, 2-84's ENDIF BYTCNT EQU HIEND-HISTRT ORG 8000h HISTRT: IN A,(SYSPRT) ; get present sysport data SET 7,A ; bank select bit OUT (SYSPRT),A CALL MOVIT ; move the code routine IN A,(SYSPRT) RES 7. First we must save the SYSGEN image to a file. sysgen KAYPRO SYSGEN V2.2 SOURCE DRIVE (OR RETURN TO SKIP)a ; get the system from A: SOURCE ON A THEN RETURN ; enter a carriage return DESTINATION DRIVE (OR RETURN TO REBOOT) ; enter a carriage return save 40 cpm.com ; save it to a file Now we use DDT to work on it ddt cpm.com h1f80,fa00 ; we ask for the sum and difference ; of desired address - load address ; DDT prints this. The second number is the    ORG 100h OLD EQU 0 IF OLD SYSPRT EQU 1CH ; old kaypro 2's and fours ELSE SYSPRT EQU 14H ; tens, 4-84's, 2-84's ENDIF OFFSET EQU 8000h ; offset for calculating high addresses LD DE,HISTRT ; the destination of the High memory code LD HL,LODEND+1 ; the source code is just beyond this loader LD BC,HIEND-HISTRT ; the number of bytes to move (end - start) LDIR ; move it up there JP HISTRT ; jump to it LODEND: NOP ; to calculate end of loader/start of high ; memory code sLӭ)n6F֡̀HB5]zqJ'Qjtuu:zjvrӬo#% 4iNJԺ4|\g\|`HCaw 4`w#UDh=4uzTim@ߦ_3kn;[ g'bqXQu`啕#Mk=}ۮRG!/jFRtj ZfFkN.RbXyQClڭCq tk} Xsuo-H$qIIJ jk _suR\ݢKq6FԚkf7D#ncC8?XnhHt5Wgcn*X31juEIJ>ꢡ3~!n;ѭ%Xsu%5Cf(qؖ|` ؒB,q-Ԑ[U\::*fֵAOdsJYvxlG&9/l"/&pdwN"\ k)Xs?T1&hJc\s?8}HJ-6kgAC>WjPc\s?89oFԢ:dеu-ruZMZP[%7:ݶ̒i.y*%[2+q!gxAC4kΒ$ݥm=5w;gnCą83<|Ac,I]fSs\ei|+ i[2~gx8NMٹSȽ[gIT5Wmk Fڨ{wՏ6tO0)5~}sc2>2D ҔA(N 皳\Qu`'`vG7g"p 1|ٽ53;h GLZ?{:3"g<;)ug$WhfcLgBZ젭+\n#_]GGl)GG8+m@} egment HISTRT EQU $+OFFSET ; BEGIN USING OFFSET IN A,(SYSPRT) ; get present sysport data SET 7,A ; bank select bit OUT (SYSPRT),A CALL MOVIT ; move the code routine IN A,(SYSPRT) RES 7,A ; back to ram bank OUT (SYSPRT),A CALL TPAMOV ; now move to 100H for save JP 0 ; back to CP/M MOVIT EQU $+OFFSET LD HL,0 ; Source is at 0 (in ROM ) LD DE,OFFSET+1000H ; Load above us LD BC,1000h ; pick up 4K (2732) LDIR RET TPAMOV EQU $+OFFSET LD HL,OFFSET+1000H ; destinat:CϚ;.9퓠"P# EԚ)357}5H㣁z,qԒұR{wؒ: Nt1*os:9k:9AC?899e,7Mxps߮ƨ:T0}sRECRIPRkbM`zȈےg?}:)]HuĤ:y͒-)'֓,Ednb%gk!tMl# ~ u'`HQ8;h ¦ۦ[subgDvnoR[4IRJi=AM͎ںcᠭ+~s==A8#5WBZg>kp~5psW)躰\uNqG|_r,A\ÊlڭC. [:A4DZ8~F!VBS kC]=B¡ VUQoct&nj vREADME.Z80_  ! "#%$'&)(*+,-./0123546789:;<=>?@ABCDEGFHIJKoLNMOPRQTSUWVXZY[]\^- ȟ]}99k8*;q%UOy_ oJwkfud8YW ~I̯Ѩƭlծ5O>5Wg) hmn"5WST24~{: 6/~Q?k\suM}3ukrͬk.,ϳ@œ铔0MjW X@򁥸f̠񁃳_z-/'yku͵m I-XkؒUK)8+W1jion becomes source LD DE,100H ; move to TPA start LD BC,1000H ; 4K bytes to move LDIR RET HIEND EQU $+OFFSET END 8*hp[򱩥f> W!ږ$ߎ=A[WM "M[3k.uR)-uڷ:;@~ d89M޶df>[su1j,w7HWƨ:Tj# J6q~]CCjӚh[]DfLvZcKǃ_4d g?glT3R GJ?>fT@"-\_gqy/$֙Ϻ&HȦgQW$֙ϠSO"o#C4lg-Ix-ٖ?8-I5t-pc$1M1pB<$f()&p sqgQ^C*Hnpꐤiᢛ>mP?MBJ-p#HRIdKG؋ *H {? tRepspA!I $1  oqS [3k.@*r u$Md}Rju\ $t-5g$OS>/~5WGoun=eRYO-:5.`ZS0q7WIPmWcزgO' EW\kP߶p0y>ɧ*~ 5W}u)Μ+u [Vo kOq1]6Cq雦>&IIJÖ j{Ond 7oٯo-z(OS> Q œHےKqB/=/rUfr/>/5W7 tW}[3~k) H5W# k{WkymSgQeշ-UlڭC-}R \k4.yocn*ulg/We^SO7J\]Tu3vԿ8N'uKqMA7y۔{j_u%/.UObU_{9K^K;;sxd}^gwBUl_²̵*;*{׹Nx}r%z]zOp}#ȋZ-|ŝw_{SW++r%oݗ,sgRt'B]=b^LD)&KwXb0tr_r˅NӋNKgJ|~9XX»p䰪: \_^5ɻ/̻/O] ܸ}nΤJB9dsCIUᜫ\؋{ʅBaƭ|zy/y2x#hqwrwK/yBvZ-;ʻ/ySO/8_X;,*3'lM!>g};\+ _%Kq͘AKDECRRRj?@X)L~ Ԁ#] ,_ڨfݺ1]fGGҺw1c@m G̐^3 tn{wg?g- A=DdL@Is/I%~q&ߗ N̯ھʧ}ɻBagRI}_B8A/B(bsggK_r}^`!31u ]9_:Ά.Xt_::s:ׄZe)R3$|Wp82gUYgxD |YgxD |YgxD |YgxD |YgxD |gKv»,=sש +.BaacwQ*ky;O(Vm_wNUxEg}:ceP(41t.UE}|q&/s& pgIW=}SU~q gYʼSd$Ͻzo=eu/⮞pq:7qI_=}+gq%;\R3~Wkw ^!,ITy%{s_N:^9&8{,*$λY\Xy-{q޹{P\!'gŝw_{%z't avNB/\2O^jMPcw&pgx:ׄZLz^I*$e&{yq_,XX=;tLʽ8ƙ$:: p&/:ׄZUU\eqY|`Lz^Ljg_8r/> I [V zg Kʌ%߀ڦl\,+Y܋z3%Xw~ƭzʛJ%{pu]O'1*5i WOy-EUvZ}[ă_, W)œ45ZL^g`Mc8Ւvr1&zjf(fSދ6:ÖURܼiw~z<)>I㚫{OTsg>)kGҰ- ypK9,9喎7} nUjSsR 䣂Ԓof ؒÖ|6oAo[;nk)*ْ3"gHqIIJml3~Rk&qP?mƯ /כ/~k}@\"]GF)Ll`[su~, ~ml-L8IK6-6 Z=5wk뛶p0y=-%,w_ʰ'$8¢gR$WOy.z 9yQj}ypwU|H}!;./Oa'?SˎS8gU-3lY}!a\Y\) <>q?/&7tb~]㬳^|^yMoZYgUN̯-2tg{^;jg_.We:1G@^|^y-Xt#Xt]gZv)e8pgx:ׄZLz^I*$e&{yq_,XX=;tLʽ8ƙ$:: p&/:ׄZUU\eqY|`Lz^Ljg_8r/> I,:8rY~KgqekUvF( aUuy)6yA; '/˪ϜkB{ݗ*Be8[%N8󫶯˳ZrSʋ~zswZ!SW3gRgB)N) g]6tkBDBξ.™\Ξ~%z|pekUvV=br'wܫpV N+;wԲN_&/w {^3ax/O_tZU 2׾'g%UTUq׫>}v;/;Nᔸ}EuOeBvš gbP A1(ŠbUČ#JqCW3C3z[,E_uZ:z\aP A1(ŠbP A'Wm_WE reN*jNx_3 A1(ŠbP A1(ŠbP A1(ŠbUČ#A1(ŠbP A1(Š3z{gxx_=彪UO˃3Τ2Z},_:Ά;gq6t9 e&WY(31u wBUlsL̯jg i'] , i/m7z Cס8zFFG׹p"My2Df g?gY[T"mSju젶`ɯ:54|SlqCQ>}ƭmu&5@\gn y|6qPg4lu q{Oha[#)5 58KՙϚS @e89DfÖ%7oͮKÖMg1t[;YIC r's{woHC?ꚫ{fAoqi(;EZ)`NgD'xJ?+ <8g-O%g>n_ BZazflY]=^& gWO;'W5<.CW qC'Wm_\Uj}g7^Q{r%A~*촫K' g ]=𖙘_:: pƙWOysߗ\y T^(UOy?5gR7g]5pB8t}! ]5; 'X.w V kB-wyp 57tqg<|:oNCi0ueF̕~hQ9}WOMSм+:M[L>qߗWQU_z2+H>:2,H>2-H`i6#6`i~#fo! ~#fo%! ~#fo`i~#fo)~#foM `i^#Vr+s! ~#fo| *@}w! !% !Ͳ!{ !Ͳ! !Ͳ! !Ͳ!J !Ͳ`iw#w`i~#fo| ! s#rz³! 6 #6`i~#fo! ! ~#fos{ `i~#fo! 6`i^#Vr+sÊ! n} ! M !9!9DM`iw#w*.L#".L|u! ~#fo!"0L#|F!!".L`i~#fo)).H*0L|g}o)~#fo`is#rä`i~#fo)).H*0L"0L|g}o)~#fo`is#r`i~#fo|`i~#fo#`is#r`i~#fo|!`i~#fo`is#r`i~#fo!9!9DM*##s*#s*s! ~#fo! ~#fo~#fo)*s#r! 6#6`i6#6`i~#fo! ~#fo~#foq*##n}kq! ~#fo`i~#fo)~#fon}<ʚ|N+>Z! ~#fo`i~#fo)~#fo#n}º*! ~#fo`i~#fo)~#fo#X!#|! ~#fo`i~#fo)~#fo#!z#z/W{/_!9~#fo! ! ! ! ! ! !9~#A"s!`*"!"!Y">2>2>22!"!"!@"!" ʞ!F#x±~#±!b2r~# "2r+}|~#G:rx"2r+w# +6#!6#2w2x*s!>r<o&F=-` r'~h6!+`W?_!~7z?` :>ª@w#G.¶ww#?*>?w#> w#.7:77!6L! ͹"! ! ~#fo!3!`i͘!! s#r! ~#fo|U ! ~#fo|o ! ~#fo!!Ͳû!".H!"0H!  w#w!  ~#fo! ~#fo !  ~#fo)).H`i͘!s#r!  ~#fo)).H##`i͘!s#r!  ^#Vr+sà *7M|ʦ! ͹`iv! s#rzʓ! ~#fo*7Mғ! ~#fo|g}o! s! n&|P! n&|ڄ! n} m p { {~Ð! ^#Vr+sÄ! 6.! n&͹ *9M}ʣ! ͹û! ! ##|! !"!ͲÄ`iv! s#rzP*)H! ~#fo")H*:M}!! n}w!91.9 6-12-82File unsqueezer version %s by Richard Greenlaw 251 Colony Ct. Gahanna, Ohio 43230 Accepts redirection and pipes. Usage: usq [-count][-Fcount][-N] [file ...] Parameters are from command line or one-at-a-time from standard input and are output drives and input file names. Empty to quit. *!9DM! ~#fon}- ! ~#fo#n&|… !:M4 ! ~#fo#n& |͝}29M}ʳ ! ^#Vr+s!"7M! ~#fo#n} ! ~#fo#H "7M| ! ~#fo#! !Ͳ ! ~#f!Ͳ͍,*6!! ~#fo`i~#fo)~#fo%|K*n&|g}osÅ*##4! ~#fo`i~#fo)~#fo#*###s#r! ~#fo`i~#fo)~#fo#n}! ~#fo`i~#fo)!s#r! ~#fo`i~#fo)*s#r*#n&|g}os! ~#fo`i~#fo)~#fo#n}!!Ͳ͍,! ~#fo`i~#fo)~#fo#͐,*#! ~#fo`i~#fo)~#fo###|€! ~#fo`i~#fo)~#fo#!!Ͳ͍,*#4*##n}%`i~#fo! s#r! ~#fo! ~#fo~#fo! ~#fo! ~#fo)! ~#fo! ~#fo#)~#fos#r! ^#Vr+sÞ! ~!a{   `OE!y6$ -7rBo&))T])))!y n}x! ! n}!91.9 6-12-82File unsqueezer version %s by Richard Greenlaw 251 Colony Ct. Gahanna, Ohio 43230 Accepts redirection and pipes. Usage: usq [-count][-Fcount][-N] [file ...] Parameters are from command line or one-at-a-time from standard input and are output drives and input file names. Empty to quit. *(;s ~#fo|! ! m#! ! ~#fom##|M! !3!ͲÄ! ~#fo*)Hʄ! !m#! !F!Ͳ! ~#fo|ʩ! !m#Ä! ͕$! %`i%! 9Can't open %s %s is not a squeezed file %s -> %s: %s has invalid decode tree size Can't create %s Write error in %s ERROR - checksum error in %s !"2L!c".L!9DM*2L|ښ*2L+"2L*4L! ~#fo `is#r!p|`i~#fo"4L*4L#|!0u"2L*4L! ~#fo "2L|!*2L++"2L*4L  #fo^#Vr+s`i^#Vr+s*^#Vr+sW! ~#fo! ~#fos#r! ~#fo! ~#fo~#fo)w#we! ^#Vr+s`i^#Vr+sC!9Can't open %s ! ^#Vr+s`in}.;>͐n`is{f! ^#Vr+s`in}.cf>Í`in! ^#Vr+sn}‡þÍ!éþ͐n}£!éé!é!9!y9DM! `i'͐`iq*!9!9DM! n&*| ! n&  ! n&&!9DM! n&+|; ! n&B ! n&&!9DM`iw#w! 6#6͐ n! s{ { ! n} ‰ ! ^#Vr+s_ ! n}-¨ ! 6#6! ^#Vr+s! ^#Vr+sn! s3+| ͐ ?! nѯg`is#rè ͐͐? !9Bͤ! ~#fo͐)!. ͌&#J-s#rz8!×!. ! ~#fo`i^#Vr+s)~#fo&ó!n n&!9-!o ^#Vr+sG!o w#w͐o͐lu!q 6#6͐q͐g!n n&! ~#fo͐q)~#fo͐o)!D ~#fo|Y͐q`i^#Vr+sY͐q!s s#r͐s͐V! ~#fo͐s)! ~#fo͐s#)~#fos#r!s ^#Vr+s ñ!q ^#Vr+sá!o ^#Vr+sÈ͐y͐s#r͐{͐s#r!×!u9*.*!9DM! w#w`i6#6͐|! ~#fo͐n} ! ~#fo! ^#Vr+s! ~#͐%!%͐+?`is#r͐##~#fo|ʤ%!͐͐͐.͐##~#fo͐s#r͐~#fo͐s#r!!͐~#fo6/%͐##6#6͐͐s#r!%!9!9DM͐%!͐~#fo͛/!9DM`iw#w! ~#fo͐n! ~#fo͐n}W&! ~#fo`i^#Vr+sn}T&!Ã& &! ~#fo͐n! ~#fo͐nѯgWÃ&!9!9DM`iw#w! ^#Vr+sn}ʹ&`i^#Vr+sÚ&͐&!9!9DM͐`is#r! ^#Vr+s! ^#Vr+sns{'roken pipe !9DM*n}M*!`is#r!|J*!`is#rf!9-`is#rzf͍,`i~#fo|{!ð`i~#fo|§`i6 #6*n}§! !9-`i~#foð!9!9DM!`is#r*#n}O! n} `i~#fon} *#! m#`i~#fo! ns*#! n&m##|7!!Ͳ͍,*#n&|g}o|Oô! 9-|o!9-+++|o͍,! n} ”`i~#fon} ʔ! !9-! n&!9-`i~#fo! ns!9File output error; disk full? !9DM!9-!n s͐{~#fo! !9DM! n&*|ͣ/!! n&+|ͣ!y9DM! `i'`ib+!9!9DM͐!͐͛-s#rz҂!!͐##w#w͐~#fo!9DM͐!`is#rz!͐!! s#rz!͐?͐!!!!9!9DM͐|" ð"͐+++|"!9-ð"͐##^#Vr+s|™"!͐͐~#fo-`is#r!|l"͐##^#Vr+sð"͐##͐?+s#r͐͐s#r͐^#Vr+sn&ð"!9!9DM͐`is#r͐n}"! ^#Vr+s"! ^#Vr+s͐ns! ^#Vfo͐ns`i^#Vr+sû! ~#fo n} F! ~#fo! ^#Vr+s6.`i6 #6͐|ҫ! ~#fo͐n} së! ~#fo! ^#Vr+s! ~#fo͐ns`i^#Vr+sM! ~#fo͐6͐!9!9DM! ^#Vr+sn`is{`in}*`in}?! ! !9!9DM! ~#fo#n}:w! ~#fo#n}:t! ~#fon&! n&n! ~#fo##s#rt!éþ! ~#fo#n}:ʾ! ~#fon&! n&¸! ~#fo##s#rþ!é! ^#Vr+sn`is{ʐ`in}? ! ^#Vr+sn`is{`in}.þ&͐'!9!h9DM! ^#Vr+s~#fo! s#r͐! s#r! ^#Vr+sn`is{b*`in}%L*! ! s#r! 6#6! s! s! s͐n}-¡'! ^#Vr+s! 4͐n}0±'! 4͐n&3+}'! 0,'!! s#r! ^#Vr+sn`is{.(! 0,! s#r! 4! ^#Vr+sn`is`in& }DE(Uʁ(Xʊ(Oʓ(C(S )6*͐~#fo|ҁ(! ^#Vr+s6-͐͐~#fos#r! ^#Vr+s! 6 Ù(! 6Ù(! 6! ~#fo! n&! ^#Vr+s~#fo! ͎+ѯgs#rÂ)! ^#Vr+s! ^#Vr+s~#fos! s#r͐y~#fo! s#r`i6#6!l w#w!J-! s#rz>!×!o 6#6͐o͐Ҁ! ~#fo͐o)~#fon}!͐o+| ! ~#fo͐)!s#r! ^#Vr+s!l ^#Vr+s)!D ! ~#fo͐o)~#fo#s#rr! ~#fo͐o)~#fo|$! ~#fo`i^#Vr+s)! ~#fo͐o)~#fos#rr! ~#fo͐o)~#fo! {-!. !B s#r! ~#fo͐o)~#fo#n!/ s{:­! ~#fo͐o)~#fon!. s!0 !B s#r!. n&!9-!- 6! !- n}!!9-!, s!, n}a!- 6!, n& ?͐r+sn}"͐#!9!9DM͐͐U.s#rz@#!͐͐s#r͐##6#6͐~#fo!9DM͐$͐>#>ʷ#>œ#>#>¨#>#>´#>#$! n&͹! n&!9-! n&!9-! n} $! !9-! n&!9-͐##^#Vr+s|u$!͐͐~#fo}.|T$!͐##6#6͐͐s#r͐^#Vr+s! ns&!9DM͐ڮ$!%͐##~#fo|$!%͐##~#fo`is#r͐͐͐~#fo}.  ^#Vr+sÂ)! n})! 6#6! ^#Vr+s~#fo! s#r͐n}ʂ)͐|ʂ)! ^#Vr+s! ^#Vr+sns! ^#Vr+s! ^#Vr+s8)͐6! ! s#r! n})! ^#Vr+s!|)! ^#Vr+s! n})!0)! sÞ)͐! ^#Vr+sns{*! ^#Vr+s)! n}3*! ^#Vr+s!|3*! ^#Vr+s6 *I*! ^#Vr+s`ins_*! ^#Vr+s`ins@'͐6!9!9DM! ^#Vr+sn`is{*`in} §*͐! m#͐`in&m##|*!*y*!*!9!9DM! n&|ͯ+! n&|ͩ) #+>!~0  #y a' # y2=!(S!!͚(DOq :!(y %~+(- yO(V@("!""!ѧR @(9@("!"!x(!~#((#N#y@(2!2!Ú<ͻůG2!2!Rʽ~8+8+.(G'(([((ʖ]()ʥ$(͝+' E[S!#l:!( @(]2! =8@(_:!G{0{:!(pˀ{=(g#>(Yˀ#(T(=(G( (9=(0!():! #H(A<IV!OS</~# x/ ><$/~+ x$/|}7:,*͹0:*X/}|2q ʉ//:qwz/! {w#7*!9& 6C#6O#6M/*|/!\&/!\&*|/!!l&!9~#fo%0> +͆0#~0##0xSO070 /EXECL: Too much text $!p0!*w#[0*:1u0*~0!~0!a{ ѷ! , FNxg>Goy0$?!(!(|(:+!(!(|(#+!(8!(2˰˸|d  |m ٧Zz p(x(!(>!(8˰˸z |  | R p x(!(!( zW{_!(!( zW{_!(!( zW{_!(!( R !(!(zƀW|ƀgR0!(!(zƀW|ƀgR0!(!( R0!(!( R0S|; }$0>$2L!oT!!!DM :! 5~ 1( !9DM! n&|ͯ/+! n&|ͩ!9DM! n&|ͯ^+! n&|ͩ!9DM͐n}ʌ+! ^#Vr+sn&͹j+!9DM͐͐ +͐^#Vr+s͐+͐0+͐7s!&',͐ ͐͐ ͉͎͐+`is͐ ͐͐ )͎͐+`in&#&',!9!9DM`iw#w͐~#fon&3+}},͐ ?͐^#Vr+snѯg`is#r>,͐Ä,!9  !\&!7*!,&*!,&,!&="&! BL<"e=LB~0#+~B(D(hHʸO(.Q(*Y~020 0O#B #~7~0800O #O(Q #~7~0:00OBK#D #~~0G00 8O #H #~7A8GH( O(Q(7)V 0V =!W ^#VU#` ^#` V#` 7ɧ~' #~'ɯ#~0 =!W#. :=!0!!͚F#b((2!= ~* >52!#!!:! 0O <2!w<ɯ!!:!( =2!O <~g  _ 1>"o6^Ew: <2 8>2!!1͎͍͍8(88(͕(C e:!O(ɯ2/2!2R!<2 !/"!! w#p>|2N!>2I!2J!:R!(2!>O2L!2K!2!2!2Q!2!2S!2T!: :!2!2H!<2G!d* 6!~ # (=;(9A8 [0W~:(P #~ ( (;(ͻ * 26!" <*  (E;(A0B>!#>84~8x2=!~ ( (; !!͚(:!7(" ͻ* , @# ; ˰~' p +~F(x@G ( (,(; p(#x˸~( ~:!(G~(x w>(w/͹ ; T}2N!; :O!9:I!>2O!*  ʹ W :w#~+: ~@w##{ y. #~08#NO> !:!2I!:!ʹ ; }ʹ 2K!*  ʹ y 8͹ !y(` >2Q!!R!4*  ($y([!A `~# y2\!(͹ ' '#T]` ~ (#  ( ;(͹ <͹ :!(:! :!G:!O*![!:!(ME:!_! ^#V5G~#(&(/( ͹ "(##N#fi! &Eͻ     ! ( / / 3 @ M Q [ e o v z =7*^#V#z -x28-+V+^+-*͞/:8-o&9!7:O* *p-+*|/g}/o#9t-p-#"z{7*~# ʂ- ʂ-+*&!7,2q*&:q):-=-=r:qo&7:)~:,"s!"u*|5.**s:.! ~5.6*u*+"*"*u#"u.7*͐,\!*͛-7:)~:,"s!"u*|*u.*~#º."*s*u.#"u*+"ç.7*|DM**/>!!:!0O 2!s#r<ɯ!!:!(2!O ^#VN}zQ%1wCyWtp{pwyt{vr}"g2IBVmG'B׷t{yw# . 8 :!_! ^#V C 5 *!"S!TJS:!( T5( S*S!DM(50( jSc (: (PHmC: (.##N(M/ +p+q#+V+^B(q#pP## F "!T!!b}͙w|ͦ}ͦ:!O:!G(2!:O!<2O!9Wx2!CROWE (TH/DC/JGO) Z80 1.3e. Page  d!1͎!M͎͜2O! ͠!!͎~(O#!H!ͮ+ͮoͻoͻoG B 0Ox*G!}'o|'g"G!SYMBOL TABLE OVERFLOW! :!Ww!͎!O!44(:O!TT!/~(SG#N# C ͠#~ͦ+~ͦ##  N#(M(  ͠:O!90 <2O!T :!G>2!!!N(5EF(<:\!G(3*U!:! "!#"U!*!Y~!!:!_w{<2!  :y͙b}͙>@qHy͙x yA H>͙:!G:!X>P(>͙Xb}͙|(<(VGyGyGy}͙|͙*!:\!_~(Lw{2\!*S!:\!_"S!:!S*!  z2\!:J!(T̓%ɯ2!2!!"!"!"!!!ˆˎ*S!"U!!M!4* " " ^> " ~ >2J!{7?!!7ɯ2J!2]!2\!2[!!^!"!1w#=w2M!*S!"W!> 2P!!!˞P! ! " O(x (v:N!y-R C ((('(;(c` )IB J(ˊxP0+~# ('(, qyJ a8{0AF'@HLPa`qʺξ#$1ZORzEQGTLTNOTLOW'RES.MODMSHRUSHL]ANDsXORUGTULTHIGHb+-\*=/E&s^z=>< Z80 Z80DIF TITLECHAINNLIST PRN LISTW!AwBpCqDrE HEXR!AFBCDEHLSPIXIYN!!6!\w~ (=Q0@2w~ (-Q8@2~ (Q8X @2ͬ: :!GWij: :!G}Wr u (ͦu CO!'"CO!+" !w w ww ͐[S!"S!J:! (>͙:!͙:!Hq͙:!͙b}͙H:!͙WH:!y͙H:!4͙Wx HH:!͙̈́| } (͙>Fy͙>͙H:!q͙H>͙W:!͙} >͙:!qMy͙} AH>͙MW:!y͙H>͙H>y͙͐>͙͐P H^> y͙}͙^>͙}͙^>͙}͙[S!R}怴(}/(Ry͙͐>͙͐>͙H>y͙}Ǵ }͙xw z>͙{͙>͙H>@y͙>͙>Ay͙yw |>͙}͙:!!(,G: xͦ*!ͦ!!~ͦ# zͦ2!: Wͦ*!ͦzͦ#x( ~8p~0#A8[08:?(_(7?7:=!G_~#fo>!~(# ~ ~# xŁ=_!/N ()!=!F##~8 ## ((( >O  :6!( ww#6 ZLJ R J ˂q> Ñq> !!"U!:M!"Y!>2[!: ̖*!\! _"!!]!{w͓:!O:J!G:P!O x(3({w:K! *W!:]!W!^!:[!(*Y!= z(3~ͦ##(${  _=( ͠:!_(͠C ͠_:Q!(:!. }2!-͠!!͎2Q!! :L!_~O#( ( (   > 2 GOxOzW 007  :!G oUM!!:I!:! u <(!'"!5 ( u NO SOURCE: $u u TDISK ERROR,ASSEMBLY ABORTED $'* +*}(6ŷR <E(ͯu u u O}ƀo0$*|/(q#"n !+ͯ!+*|+(q#"n !'ͯ!'*|'( ~n #"n #>u u ( {_0 !#:G:yr _ HH:!͙̈́Ay H>͙x >͙x y >͙xw :!q͙xw :!͙b}͙xw AH:!͙Wx y >͙:!B͙̈́xw >q͙xw >͙b}͙xw AH>͙Wx y y H> ͙̈́xw > ͙̈́xw >͙>Wy͙xw >:͙͐yw H>͙̈́H>6͙Wb}͙x HH>͙̈́͐xH ( >͙>K̈́H>*͙͐H>pq͙Wyw H>͙>Gy͙yw >2͙͐yA ( >͙>C̈́H>"͙͐xAOH>Fy͙WH>CP 8INOR 0DI EI IMRLRRJREXIF INC DEC OUTAND ORGEQUENDEXX DAA 'CPL /CCF ?SCF 7NOP RLA RRA LDI LDD CPI CPD NEG DRLD oRRD gINI IND XOR (RLCSLA RRCSRA(SRL8BIT@SETRESRETRSTPOPADCSBCADDSUB CALLDEFLDEFBDEFWDEFSDEFMHALT vRLCA RRCA LDIR LDDR CPIR CPDR RETI MRETN EINIR INDR OUTI OTIR OUTD OTDR DJNZPUSHLISTELSE ENDIF TITLECHAINNLISTSUBLNEJECT LISTW!AwBpCqDrEsHtLuZPMI R!AFBCDEHLSPIXIYNCNZPEPO  vZ80.Z80W  "!#%$'&(o)+*,-/.1023457689:;<>=?A@BCDEFHGIJKMLONPRQSTUV7Kwu#ss[gZ%7ga+_۾λqYX#[>sY‡"(~ /:&ܚwnqtup\n­EH"­yvGoM&( H?pk޹QQ߄};P n;8};D /6>sC5n(mM&(tZPDeg%ҏ!ܚwnѾ᥉ثíET6%ҏ!ܚwnѾi.f.>QUH?pk޹ѽ\EMD1[6%;\ެEJC5n-,tF,Y TpCYrn|mb;,K_4Dװn焧kZPTG1%J:(t-tV>1~ xVyb=r~LEW"՝?mިzzH.C[6>NKxVwzǫ[:?X>q0U+x&22~guwӿC *c8WQ±nLV I% }FXpƹ@C=3(%~P[jGFtMWs !Z0Xy7wo۹_\9Khccލ|ONQ}JGaŁ1u2b"9^QcK[຺D* ZS?5\L$+OMW i?b"9^JO\"ٿ}1K-ƨHWDMW ٺYWY'ed\L$+ZJMW ٺYWY'edI.&&+alLwŘD飼?QjI.&W0  R7Ji eX$O&aA \L$+hc̾abe-Gz?eX SC;Z$oQ7fҲNH.qISsOK?cvg"}? j.F_4ҖUJy~u5&b[.OWtwqnD0ӈmxou_=T))խ's1L@r̯s1L=a*wybr18Goɹ@9Vsd9c/ۜ]~ G1:"oߍ*zsF\}U6b5+CH?]sny791Ο6oj.`dP\H?s%w#,8Ο6o4s%Ç"$G1%݈OAmuS>\C aoO`~b (ĶyEIEHankO\V׷EH"}unkXr>!aW75s1ғnDZ۳\qٮ՝F;b@qS`ø>y7*kbεr_V \`>z.5 wQs18-F?aܖcFr1\M*vOjݭ^ιpRJ.B󝗋_{Db~ZY݉yށ X'\L|]P675۩91.\Laۥ }zJ_bG\L.&HZA-ȼ_e2u*%;b+o:\Lt23|(B*A\ [PD+~ kQֳ:h=ETM@PD%ҏz-*Jx\ ETMln8.NPD%ҏz-vqN.=CR%ҏz-NETMc^؏E[Q"j55C ۡC4xSspkC;KH?pk޹Fxʋ:f+Gh.ZߎÇ"JC5n/XË:f+Gh.#S"o5r!ܚ˲mEHP9!ڹ~ 6͏xx |սg~ 'p1'[.qp;ޭ*'puy7wrmKwNnk@eY7Cm_—KʩnE pNm(88[}:K{٭r搋\ ;+Do\L$UGǎr,  !o"$#%'&(*)+,-./0213456789;:=<%zoSU[[syU*։Yn wQ27cLgotYse:A(֕o\r` "(seY0lN]!\gie\z0Wb+o0:ʀ.CgT8C6cozm+:RqtI{{D3 l8޾Bp,^\rY0 z3}q, 8cL'`3}/ͯC Ѭ g\%:._D#ۛ5Gs7wd9,oi됢DBzܸ;'[ވuH Xzܸ;'[vd"K8#: ___됢DBߜqwN*P\>+bˀ]1̵#W77n?EyĖ"KBpԐP!'5/ͯC :!VH3 !|u=_%8CߜύsUk^\Ɩeט}RV-v0̮pٸz9٪R`zѬd-oOc:(1]ߜύsuH1ppb-g&ވb:(2o9S]#"BI(fP!?ETr]֌'`3}6}RDuc `ۮΧgzBq}RauP.XYY0 zzrK됢\s0͂u=}~RkZ:ܚzzrg_#~_cCr=pi]Tߜ7?\(s3 :q0:YsBZ_%87͸O!8b2~_cuHWb Xir,z,k$HsbP7FZk_F|ho9wu>z{#~ko9wu>z{#>O͍:VY"gy%&?ETG YVu=p&34G>3g#'eCo?ӛۛ5p&}Rp&[1K^~s>7|S[fI8ⲣ\~_#aGc0$[{{#Ov\_%|`U|nܝf4o:p&o*^;'3!Ůg~DuE!E(B$Qȧ{w$k$HsbWs2rwiވW(o9F||~s9*;'}k4_o3I/U5Mo7H_@o팝f\:0Bpq%1boo֜k~R\3P%1(7sl)"Bgn̾)n ,zܸ;'Y~'p*eۣ4)TT(ʅ,:XY7! AOo9;'9ɪY~'p*mۣ4)TT(ʅ& Y0 dv$hyDBo`gT _7:0SׁY1̵13/1io9sl)"BoI&mwNdXެ9_+6}R >W&LF4)YʉQ,0:2oܸϕz1:_v D0ۗk^_u8*auz}L>Wf?]sbU|nʪF|) [zߜύ\Yވϯ!EqE\Uo9o}Zoos zk}Zoo֜GB(feb9&drDAt=VhUo9?]ߜύ\Yވ|o9se,o֜.uHq4TTDaqYcoo֜fuH&qtພޞ!ETl@7c됢DǂauUqwN6*PD<R⠨7onܝ?h|<%ld-{cuHQ" \;zUo9wTbXʀ>b&$Z\OosU|uH!\3FZߜߝSůCu& (nBY;jA^_Qu= 6auz{b zx =޾\!E` XY7E k̾)JDqlQPۯ~oo7sl)GDEç?}R ;ː#~_#)kDqD_Az{#>O77^o?ӯPmS$ֈЛ@mTF|~;oܸ;'{}TcuHՑeH\;Eۗk)M0\.>"mwN,/(}!~R\3,z{I(fP!?E^OE 1IzAu!}f:ofOY OFuu|u7fg0׷GiS$cȂa庞ۮǾ͚e)F=H:`:.|͚Wڬc)VѱR:#0\:a s#(BϺ $&ThN65uS XWuz3Io.S28en덮`o*wGTh XWr\ǩ\m0vDu]*wΨp8l4(,?Ks$r]\E .3}6}R u }]E>;ːc\;[0׾d7kΏFuHͺpPNt\b:(ű`j]U͍sYC 7AzMUF|nܝ?Q~}5:5 %1}]LGfo9wdOz>+vcuH1ppd`gTo93=S.OWr@Q.ru`smwN2 u(*kra ,nB CosٳLorݙOLҋzI&|VɎ!Q";ːcUo9wdS\gziiFka$5$k4Bpg9,?ӯ C] $}uH!\3Z:Iz{uӯCL ;TqwNjr#.;,GD =gkooěCQe&k™ߜύsO!8bgsE޾\:\Wg~s~wN6v$#3 :8*2 g^+.uYP'[{r! `(wM.`vdY~_:RLҋrqtj庎GNck7se,?Ks$r):z8x f:_\N,=~'̕e= \q}{?ER8f 庞ޞ!rz\{o_>WVg⨘(,>io/X4{%z3Id\#XY2`]6MG8b݄5Q.8)FJ\32kp=`g9YUbq r5R;tF3a1n퍢pn4"BϺ ݷFQWk,kN e!}kouon4Xs29M[{dCo: \q}bP7zY" AOo:͚Q|RD.1/XFauzT?]됢Dt=֪~s>7|lCQy7sO`a}koo֜!E(zzkTr],zތv_9= #v$LF4)u#aHfk i}RXꮧߜfܝ~'$Wo_yuHQ90\ _yi~R \{r'g5ވ77IfoΉC +K†z∝{ \3XP8cZވ:gD(|Uo9sLOH=C*Q.`嚗!r0:xN&Wۗk|RkZ: {۝Suk4_"p\D5 ~'D5 q__e%|nܝ_;Z&(XJ$~M~],@R99> $L/͑iFgU(:!B3Iooo֜™+o9uH eeTNOMLouHW™Fq&}R8bSoܸ;'Hl  ,=}Vb&BϺߜύsz)s)T8\ȢMȂa7wdl6N۶OW™vX܄,vdoyDBpJtT /~#~wNC!Wgvdhy"__f:a s}WosٳQmwNj7kOE:XBMH:`:.|͚Wڬc)VѱR:#0\7wd[ooUs!՛r\u޶Hml)"Bgn̾)n ,zܸ;'Y~'p*eۣ4)TT(ʅ,:XY7! AOo9;'9ɪY~}" G.﻾L-dy7[G-G^?Pg$Α+$J@W4^WE_c28,GG;ÊÃҴ( _>?*i?Z}@4_cagR-Jin߯Z}>y9pqEd\h⪔z"/[^z}Y3L`'c͸}h96< ҖD*}^/Sag\iKZ\F$D:l.?3L#feq}~ СZ\iI˦-sU$8awWx >?,ageSv*}_= kA{KEJ}^L-N!⪔ywC:TR#(>nhoi. a PvIQf}a1.o[ $Ol^?Il2ɨڴO:韍}. }Y? m+N(I6Xۛf}"7f0gSRi>o};ÒDS7^c>24a1.?꣙c>24y,Zv>ߗU= 2)CER-Jin10χaI,AL}^/> 2ϑj)h}Zbt; {/J͒n2Jk|< Kbb@1Y=4ߗ͕VvHF{[ %\]c;PٗWZ~|y"gkIa;kƽ3Dnk~fyvܘy|s~00mRϯ3L!۟j|ߏk,;< ;nPc]d >V#%"q*iYݶHq\|$Uqc,uF۪cc8`>ѤmI4rqgccch1&m+Nq9,w}`mNFq1`SE⎹:Ś$vs ƽc"KB0\ж$.1ɸ¦8cgO#EaEu("̍Y<},kw5>_\}4vHm+N(.Š,ҳE@4>;C2⍫Q9qdhX8jmm+NR+lH>_cVHTōɊ%f2*ag*n\0gc>cveGz?2P%M{ G$D:TR}^/ܘ? eU0mwɇa1.1s$`e}>}^o?rc.BacbqujqaghvU)}Y3L`'c͸}^_-o P-Ji1ɨ}L>g384X cm/+wG6WҴ;BipT]bsTRcQ~_1u&U˖fa>< q# WC5H/[^>1{1dҊ拫>w1ۦmjqUJsL2v"7fvXg\9\ ƽ\I> KbJ>_ǜWv6jZ\>ߗEnL;v2֌{J+ ;C`{sWZ|4L!̑+SV|҂Ӽ~_vWZy#em57suW3,E1y.wև!8RFVY{9['U4_ǜoSU;C{[8Sq V4n>⪔y,rcbyxV4.vy}}f1YaghoG,w}^YI``:|jo}Fcη#ՇFJl#R:O]}dPa] '̍a k[ ]K384X cm/+wo}u^z5ܘ= 110mwf|s]|< sc.A?ü[!2ɨ}^o/ܘ? eU0mwa)9pqE0Ts| ~jzߏܘ=Ui9Uz}Y3L`'c͸}4? TIx⪔(Mn\iv%iQ˼2}}H1j0;C 2b3D,w}40y̶*;VeL"q}. kl3lU,w}^;Ccr;>}FJ\7.H11PcWi. > o%IܴO>~;:c\`GUq=Gf!ŠQ=3̍Y<,w^]WLzv1gq\7.H~}^̮'3 GPWō }9?agPQBdcx6BF|q|Woᄶ'q).Š}8WagXѸtM*.,EYaz/z狫)m ZXѸ?2P4? aqu(,K.g^UqX4oUo>vU\oOUveZ80B.Z80C o !#"$%'&()*+,-./0132456789:;=<?>@AB%>"3ӗ~<#A[M퍔Jsܘː\>t$`CܘːpRins8Xci[q8$h\6X)1_8IŠPۨYSb;kƽc!'rcj. a $y$z%_}~~Þ}0gSRinh|smjyfW4$jy,Z{vh7W4jiy,rcags{UTRȍagNƚqo~X-=cηaen%X}}Y3L`'c͸]&U@ǭNVUˢdT-]aVp>ȍ05vX }>}~U{P" UbU^}YX0OX:݇aq!q \\5>b u?vuƸۨ}cm|mWu;}1h~`yȍ}"7fokav1`>?{HźkB5d}"7kiaQlj6ƽ3DnL  =0{T2mw߷cjVeL"q`CmU4o~UGagXg\5۪h~(vx+wcG07f,H1{fUWc3̍YyW;C\ *J!y}חVdcxBE(>3,^Vĥ4X +w߷J>Uj0;ÊƥkV,Ei^~_f[j 3,Eх﻾̶*XJo/>;Cp'FkaEßGf!",}9;ܘųqYg^VEwfUmUj>U0O:S˸}^߶*cacm5RZ193 cj. gX]:[*I]_fG ,dh6AquJ V4.cGagh[qBitV4>_ǜ۲3tV4.l)kiy}חّ*ȿ~,bj3P4? :%狫жb-h}9߷eagb-h\RP$z/#UCX#ͧi1{ ǎTA4?3tqoqYǽ}c!}oju-M"S]E`qLr9XѸJ\6EApMQPpZ>f;f/6prIۊ!t csu Ǡp,IxEߖ ZD>6ŊCti~(vx+w10χaI,A]K﻾̷ePE5狫жb-h}@3CXd10χaI,A]KߐymL!TqySU4D/x)u o>>&>8C {*¼NmocR110mEt10Ih|G7&TpHi}~xhfh~ yWv{S Y>o~Uvu Θ brƽ09>_ǜfUsU)>S110mEt10CvIWu|}#VagEJs|G፴LjT->j6VG>? < aj,Η:$a1ǽ3VGm ` Y)>]cU8_>>WKB|G>?~Vum `jVms0UST"1 `6)c5#7d1Gl 4oUh~;C<ҴTI7m8Jӆ <GJ> Kbb(0 6v/ `Y]}~(vx]Wlΰ$!kw}MUo_ˢbmi " G.YoiolGag8gq:pΰ}q>oSUcSUX4n0/n4K{ǦzӼm}< o9jy>C1%!Z)jqUJsL26K8D$IZ\>&ɨZ$, mKfS1IFrT˜`_F5))1E1'Z4o͇a $y$ʆ< ⪔L%> gI6$j9?2PU7CdT-k[}`U> KbQT˜y}W3dkӿΰ=X*Qk>G?2P4? V4>_ǜbanYg^QAj[0yy,qG,kw5>*>cav\\HJ㪸q_O>o~U}~Yu M;C\dcOhxuW;C\S}9?agkm;҅}ucU}< ,.t ^d/>;CۊJqy}c}TW]_f}T,|qagub|s>y>C1ذcm5R"Q 0&gccaǢXk. ӿΰ=X*Qk>źG@3CXѸ|s>v1gqEkw5(ֽ>Fa3̍Y< 5g^EmO10;\.pZ w:c,s$IPg}ݰΖ&oJWx"h|m `CH2UѸTR4pr}̣IۊDiT&aE)U)1-4XcMV$JcEr(K*9&WҴ9%JӆjjqUJsۨBe>},PЯ0\^M]z|q|VP+CI\b1?2P4? Ǵh< Kbkw5@U=eL`'c͸}~%0ZԿa mI\JcEux;Cjf@ `YSɥ4Jӆ <5CR~Uvi7$nYEZ'ҘMux;C< n8 JcEvI| Z'XѸJ2>_ǜ?[;CUg+dy}חV= Ռ^(v@sc.AiW}~(y} dG0 agX/uH8ƽuqo#3L!~21&0Ѽm|ްs $y>?33e>Ci8]Jcq!ALn%0{`jđj)E⎙!u̍b%GqG)k1MV$Jcq&i.4i[q(ˡ$.l)kiヵ9%\bCxL5¢>vGagXg\5>384V4.Ե4}9߷ea6vv4˦dT>?~Vag(Ͳ)&U>_\3, em73IA:̍>* 3CW4ը}~E6vvIIZ\x/n狫?Zz4oU}ްs $y죹ߐ}ͯ3L!ۨ dT-2g}^.j`C|c Z\4Z1,W` 6GAA*9&U˒1YI }~UIl>?~Vu_agXg˾j|/ag0ɨZJQ>GqUܸ}yYk}>- L^~z},5}~_e= *J37J"cQh9?cQ3EoL(I]_fQuW;=]>_\}4v@8mI\Jqy}bݳEM>avKׄ(,EA^,5C3Gh[qBitqdh!,8jQ=3̍Y<+]"(ֺk6ߐ},5VͧiBXǽ`v[k1ذcP=ϒXѸ,V,qp;f>{L!,(/v+ >(|s/xaBX[u1 =|Q7>_cfP=W2k>FfP={4?3tMbM_uƸ^>CA8%>?׬agCipy'8K}9Yiڇ!Bip²;¾X/uH0-PUoX*ͯ3L!(Rv@UX4o}4@Ui6>y>C1jT>K*}Ls '<8IB*9V4>9ƺfhҶ$Q+CI\U)ͱqAS}+iڜiQK*}mTsL!,qolcSUKB;4rxI7vI}*EmNʘTR狫Pzi}~zv)mI\J,IO#agp$ '< Kbmy̦< y6Yd,.7f>+wW;C`HExWo>Oi e6U3/eQTWΰ SRжb- '_ߦzv5M  _Շ ;G S>o}4>. Qq")IFcu,>XPx6'b3n$jY]ږRY4pJ`Q\Eq82gFA1}q8Kb asu} 6%GagF.xO]U4qh gI6$j9?2qxemj둴;ÒdT-2g}^.>@fagX` JlIF*lUv,bQ,hΰz'mq+0{Ӯq7LnЅsc.X$>??]6'IFGsA}~a1.69}cѼmWu> .>@4n0/n'hn}^.>z1PclTBJeQFAAi:z6GAq T&U)YIiGA@Hlj69} 6쵏4< qrql:Ts=ag*8W| `^*96Nʐ`^X[%GagF.xO]z|sm>vxcm 'TL2vT;C=`Y-dT-c>24vv6NXm3Cť[U\G~_bmu(&Udagk\8a_ko>2ko_ˢӿagx#-Suv3KB,dT>bmuGh~U{ams.!%yLڂ< `Y]}~{H:|x%!asL2vWbmA4_ǜo;C$DAAX[,Q͇zk\8aI,¾e*ֶ~,bj|s]|< u>+`P:|>+}އy}(W }އy勝>Ϋ>Cjwt^}(Wkt^P:>Ϋ}އyL`ǨU)hnRi1ذwQSvI}< o|sm>v)E17QX`sL2v7/eQtM1aghUdT> pvh6>v75xo>>F-Ji@s×J%ca8%3L#}. =|sm>vxsc.-dT>ߗ)PE1+}~G33F4a1.ϧU}43;ô*̍m~;C<72>_ǜo;C$ըZ6$jQ\mo);}cac⪔ca\%3L;4rxI7vI}ux!%WRTbQ~_|< `Yc>24vvG4:||< +> E2Kag_ˢ>_ǜKag}ɕTۇP1'av3KBԵ4)ᄠG6'IF|h6>v75x/I}6h7d >F-Ji@llQ@KB0\^M]z|sm>vx}ɕ.m-dT>ߗ)~,bV|G.>_ǜo!B_rŇT E243/eQ xc%3􍂂J*~;C<7Qccη]bs8n$jQ@=; ;G Ki> `C%W|cĴn[`I\RxT8/#W`q,j#(dT-uFbV`_ܶQs,)1E1Pc%GagF.xO]U4qh gI6$j9?2qxempΰ$&U{}m>zag^&U'qt6 L#tܘKΰ6.fUo?٪dhfdT->_\}4ghx/n狫?Gm;v}Gs!lW pP-Jink1?XQ\`mTRǼ4m<[-fn%11E4k)7H\E8ڸ] gClX1TR#L)v1Ću,S4o͇a $y$>v]Uc= q;9||sm>vxsc.Auq &Ue X`7/eQ x_gagX>>_ǜ2âZF8gm}0Q́~|sm>vxk27TL2vLo_ˢ>*ΰ$a^]_oXS 3y7LwTspΰu Ӫ>Dv9ҵ}~xhf>v2Y2LU0cθ)=,UX ͇aW`}L#ux!̍m-dT>ߗ)פag_ˢ>?? k >_}~Y}~luv3KB\esbQ(פG3ax>C1ذw1jqUJsDG\ K)/@8H)lػ(Tpy$>vi7$nm3Cs [1ɨ}^/S0mE1+}~? "DG\%X}ӿuv3KB)lAL2v z4;}cac⪔8N>,%ΦXMq\| G⍴L`Gͦy$>vi7$nm3Cs [1ɨ}^/S< vY{ΦXM0o|s]|< Wjy#-SQh6>v75xO `^媔x#-S1uSPPҤ}Lq<o8}L* \ER*KcǗЯ0\^M|]z#33ƥ A=F7vmqy7 nRk[cWED_rŇ+y̗\PE5c~aWgq LU~O!,v҈\0ܱ)Fq>>>z4*ΰ$+>g^1绾߰(F8gq0&%0qUc>24vIgXU}v%ї\I2\]_oXS |Hp8üW/u-MJ8a*aI%WRz~/%3/eQtMf>ṔK+06 v:}~G33!ux#-S>?=GaG> Fi %XiX\s`HL2S KqcNXM0BJlxTRK;8c-RdTm}У3L#}. }. ;C? |G>?jϿasƌpB*9ˍ*%탢ڣy>o}mo>&fW4Ycjs2K8(jqUJsn[H+0ӲĨU>FX/70-:jln#(s 6EAq }Z\icnQI4C pۇCrMyJ*8}(W>Ϋit^.B`R,u8⸪_OhfvuƸD]Z`!e aI)z~})(JBtaBE } :~f Xo_ˢ{pΰu 燯f;=eJ<.S)X `Y[.MҸ*y}W3,Sz7/eQt-Ҹ*(`E^?0t=jz,Sz|02Yp3wjW2ag8[(`c>24vxoe WjY}^?0LiU0\WE_;CP{_0ܱ8>>_ǜ2}9.>vvI6Tas8n$jQ2c~ ;G S>o}|mWu;}6h7d }Z\}l|i. =  m}~zOs|< *JKv9C 'e2w-NZ>FmKdW533ƥI 'sU%Ei;ÄZpJ;ϧ;~;:c\q/xOhf>viYUKvnKp~߯/v,"e%wT)_ՇaW`qRҤ}^ߗMG33aXHiYUJs]^?Gs`m}G}z﻾̗lͲ(&TŕӿV;C%&%P}#|G0 K"7Qz0OC.bj|G0 ըZUՇaIԵ4)y>_ǜ2C`QLm_rX57 e%wT)~;C<72>< ;nPc=+>da7/eQ+)cV;i¼"H+*{/SCXy} t6AquJ ƖfG8,_g፴La^Ȩ3 FyL8 `Y]}/M){0t ړ0QNwz0OäS"Wj:|x%!H6q &UpX5o};v}6h7d >F-Ji} 6Tx K]z4:||< \6IF}< `Yc>24:||<  6Aqs}^/S~,bQ x?23=X*Rp~?NicGp>?G#CaghaO\}96;C< 37~_|aQ qo|43errA5XW}FzagW.7>[= A|?23\5A̍Db^z6Sٳz0OCp)UļrScV|N}/vh~z \"1oϷ~2勝 |4GʘBj\Ṕ){XQ a1.L5_pxOAA\"^z@|>*XFZ0o2勝;{{\\5>;h~U{yLb(_M){0tQةcc>24vxoe }9.>vvI721ɨ}/vbռm}Gs!l1jqUJseR } 6(_yܘK82 PE1ɨZ`O#;=v"dygcG,>?l;:c\q/xOhf>vv`n%>?= oe cf ~,kBƐ4y}< :%oenW> 1. FZ9&UDGagxQ7f>C101jqUJs y$>vi7%Gscηan%n8n$jyLMy(&UX ͇]1`qDscη`1`qej PE1ɨZ`O#;=v"dygcG,>?l~;ä3,]Kpΰu Ӫ>am7sO>~< o9j^Mm}^_}caǸ}c)ӗ>$Xp}c 3pTpG5Nӳ8"췏e%GagF.>?{S]xcx㲎{|ZG33LJBT}dh> H'>XiX`g6Ta*a WEXת;?Xy죹ߐ} 6D*9&TI>}TBWvI}< o)KB>_ǜo!ܘKPp"IF}Jbyƽ(`}dh> :%",hux!̍qL( e*ag_ˢpƸ}TBGP" Ѥj}q>χpuƸ^>ߗ.PE5*JtaBE } ~>36:|x%!H6$jQf͇ ;G >o};r!l*9jWvI}< o)KB>_ǜo!ܘKPp"IF}jag_ˢdT-c>24vvG4:||<  6Aqs}^/S< `YeV?23=X*Rd|vMc}6v72>?,vdccη]⍴LasL2vnmoi;}cǨU)1u.cGռ]z;4rxУ1ag07TbQ~_< `YeV|G.",hux!l27~_< `YeV?23=X*ulhr8OG3$h> o)KBccη!PS0ɨ}^/S뿡~,bVvX ͇]}96;C>?;C$LwliY(LCXżrO#CpP" S"Pz6SPE)6k[*Lw<̻klj6ږRYc&?n5lL!>Bag\06c/GO#C;C$Lwl@qK8z@|ȿ~,bSlֶT$ üƖfӡm)Ռ}>ybcmJx >BkcG8}dh> e%wp}~8agXg:iU;i胠.{fjJPE5ጔ(h}G};&(NIiճң:|x%!H6$jQS@4o}4v75xOm}7d >F-JiKw`CZpѼ]z;4rxУ1ag07TbQ~_\@v,IF2+}>#Cscη`1`qejag_ˢdT-?vuƸ^>V|< kܘK}~{HGvw5S .=, CRp>vMP\72E7̫gң:|x%!H6$jQ . >;v}6>~W4ť ~LѼ]z;4rxУ1ag07TbQ~_Q/]gSL(I*3}TBDuv3KB)\esL2vŢy3axmc!lc⪔PQJ1G%45o0\y$hux!̍m-dT>ߗ&~,bVvX ͇!ܘK81ag07U0$>ߗ&a.bVfDI.}ݟ;v %JU}h> }K*Jo>W ͞l cη]⍴LasbQ&f͇ ;G S>o} `ǨU)їKHin c勝KB0\^M]z|sm>vx{07Upx~˔/vb7L2XŸ}>),>dϯO}9.>vvI72q"IFh6h> o9jyo>}Z\C2f`ú ]KBagF.xO]z4:||< \6AL2vTy(&UX ͇]EXm3C8\1`qe*t< `YeVpΰu Ӫ>am7sO>~;i胠.{/Sag_ˢsDׄksQΰ SRpFZyBWaghx#-SG.f͇ ;G yo>>F-Ji!q)h} 6}.KBagF.xO]z4:||< \6AL2v. ;CX$j>1agPP   ) ;CX$j>307,hux!l27,>yL-S@v,IF2+}>#Cagtk)x㲎{|ZG33 sc.!~{HGvw5S˔CXE8#% nQΰ SRFZy죖)=~s]|< oe cQe moi;}W4{L_΄l}yc}z'w;an%n8n$jyLMy(&UX ͇]1`qDscη`1`qejjX2W,wbk-ז֟.20Ne+ ==*+S%k1'SY:0✜햅z3婒?8 NBb?^kKexzz*9U?fé[baS%NOКeNeiόOb}|s2|3Tɱ=?XyWbsed?jLq*T1~>l힟Q!3X*Jݒ?N0W$JU{($S~4MۏxΖ}Md+x/akK!j Oy8=Ѿx,aпHxPsCkZ[L2[{z3'Ø+#XQe`k7̐d*%̐ Ck^[ T00)!*T;2cQA}|_qNNж^~Z5Jn-v(N $8P.F{~FQ0ݲ}U]/SF}q;gy[SyFl힟S m^UN}q^[ qm O븞2k+3yNQ]L9b2?+-ꝌDF!j 2=? d%NJ9cQGX\}9WKOdrPAxAƁʤ%+2Ge{~F|Ø+#8P"~eZY=~=De[as2/>avS,9ŋa✴-w3>ө/Ny[g 1W^ ݘaVfq/-+g'J.$}h-[N;\0F?ө/NԱ;WFqRKFۖhN BO[8'GhICk23+v(N1WFqRKFۖ_{~}Wz%12k˱km So:_So: 2'zzUT W"*=x2nCdSoug]z/WlmH=ڒtf5r}U%{U dh~nKgN~)TNڭ\[w:S:7)w!yyT) [8gF{5_n-vQOrFxy}IK&!LzUKL?z [[L?z [U$t[*XA"Ȼwzbx*}+cK֙r$A8ckY^cKZSfFp^[*: LY}9WKgS9Yl힟Q,4*a G @XįL"~*cQS_ckb%1WFqRK,Weʏ*Ql힟Q,\Ɓʤ%?{ ϣ\Y>gI ,/a٧uT2e BO[gW#-},s>l✴-pF=ө/NԱ{~Fq2lgV@I cR$x~hr][:c: "j0[BUBomyeyxoiB!M<2^{~Fbsed*&{ ~3ZMuJe3ZLh~vϯ:@@՘u ]|ݒR5^㕅psrDEdY~y-dzӱ{~S|]1*],R% QT/p;-_5=Vԛ5+P11'So:U"QXbk˗9=s8sraNS99zKyPsEPsr2kKXR֧7݊T,|*Mw|0n UN}U%[F%eOk˱sm w#d^c2'zzUT W"*=x2umߍ: Ɨ+̉~~mw:3g9Ҿ=Qg4?%hY'5^SN_[2@?@ACBDFEGIHJKLMNOPQRSTUVXWY[]Z\ʾԛN-ki鿓ȸ;Q%rklc*LSٷ;@RH^<ך+F䅭-(`H5׵זcChm )T'ebYa-M(_7itcko~1Yղ|_f{&WXZR=z2W5^+(p`&Wg];=-գQsZfăz'-[Ckk˃z'|^*ŧ5^+s;Huum/lo~9Kk[.vԾofg6h [{ힿKb\Uڭ\@o~_{ힿ/|RKDz'3x=]7i|}%DWJJxakE ,0^nI#dKb\UVFo啅ӫSL?z [b AH-aV1>~7~Alm[}X #hTj ;Df!|jWlힿ?OJb\זSǃz'cQGei΄ ̆  /D*R=ڨg;W7Ilh_U \sv0[D5W)Ӿ~svpd׵{.~aKk]W,GWFshzD!cP0(\;[c^ӞSk}9gй[ZX Fϱ{bdWF^gNuί$ƖWDLtV-vtڭsT.JϫnZtUzzX1^M[@/U]`L3gGvliQfF?$J_w?^gz^ye4=lힿ^?[Z)ck@m- sRY|Nl/ lam)ך+"w;X[|累-sWkK0,_uhWf5̉~~mYg2:ce6Cc||ɮ-aZ?*@"Z̉z/׵eLze'-|(S%1WFqRK0ֺ*k-S~ֺ*=?X Sb/He^0V˔O"XvT@iWNO%Y cQgEX$rkUXοxR$D3,sDXw!Ƶ{b9!%!gT=_b\sUzR$D3T9*kb9r[~J}ힿX S1Cʗ vˀn/<\D2 |7T m^8gn˭包ϵ GGk7D&i>guЮg_!j.{b9(L[Ǘo`svpF `6WN_=S43,[MgNM*k=S3<s0>@aXF&gPHgPAF> LJ 1krH _<J-kTZ[s0tf,`0q4NkN#r|ch9С!Ne|G b11p8ǵ 1֖!kL_Zj 嘃8&c 9&&@CjBi0ܸ&D3CaXgPC;\8P ˀ ECCе~]CSi8&ΠRsq jBCS: # е8ÈBth0 sG u*uѬ-3tj=z&WzڗM2sd4kwsi=|7IOn=#&kwsinan=wpnzwMr*pT͡}wn+͡}U BȔטzw/:IY=23_COW7ɘ>sQ -Z͡}MR߯9$pn=nu^vFzVi\COFnzXݮ͡}Q7v7;IԵ9o$HZkwsi(|7+ιv7vpӾ$}kwsiJkwsiH7Ɍ9oM$pn=n~v7n_ŵv7n}U%[[2@xJ)3^g*ѾdWFS $2uFsh9uZZ[2@\khrK/kum9v0mda7I{ė1D ylnR=F pk@%Wwpz#z2Gn>g7IUz|ɏ3ֵ{MF}NUz^sힿKwpZ۾:wWFuj2=WF ;Iz̆U@c]j'-ѾMrB*C;s:Ix ;I*K8WXZ}5|7T mvt9;ItUڭW7ɘ>=P۾:&9skW}9^nFG)'Zu`UMR9W!\jkUk[@ D&iҋGZsYU@v_qFn*}uz#z0.n}5_n-3>*U9f0>d2AUL^ˬ}*͞],MGUz^*]}ε{bۏxn}T\8gM ?aT{.MF}NX _=G|R7Iũ>_xYȩ[U$U*01g7+ a΃z'=}fé죙\jken>TLQ_BTNkn&X&F]L)C+2ezRvkn[e֌>\S -2lKk@m- @^{`?;Iz̆SG]ZsJ9M{vs0vpT+>K/ku __ @&ye!2=P[K/;IBHe(:n>g7IUz|ɏ_xZUk@m2`M2ϙ3\ @}s:Ĭu jk- 2h|0T1@5!ڡC T{0:9BsxpAX[h a8a|J'h8 }0T{|84Fv(5!!!kchkR;t(sH 5։)CK 5N3TrP'h֖CLJC8xL"CqC1j:qcj…im9&DP\"q4S.!|hȰ`kc#v(PPqcS!qVnq@5C98݇ 0Å@CuhCN< !c ]:~,-ԁCm@C4M8CuC4T3p8dpPp_kc85ڲ@CuhCN zLСԭv0chB֖8cSp<6u q!it ԭ&:p4k9o;Iοv7yʨ% -v7Lh1v7!߻9y--ii_B'ϵ% =wSd͡Axv7E#nV%p:Uzz]C~n-ii!g7`ZCpm§1g˲rzR>=imH }w t?;I~7v7ȵ)n̹}w`|7E#nߍeZCv7E?זXMA0~7iZZkL_ǩ)-Sf^c[C:S'2Mev7E?ΨG5WlmHkOHnFҪNg^cge}2ef5o9ʤv7E?OZs֖X^)M2ef5v7XƜkK,@Z{}kǵ[]m_ +pM*ҾȔMF}knfAMZs-_HY5 Tԡ}!ÈB4s8t&d0t =.p1Cp(q4!81q4<bm9q8݇ !Аac19֖Uzhu|q8:~m+пuO@|I'থkX[v3 DÃƂ:!_,߯ڲeg:<:~a,-cb|wS0C1}]0MK-b-ZԌ>|m e3@wS=$d8c0ehKĥq3txg0t jB֖14e ᘃ8Èƙ2%rm Ks:LMHpD4cvtׄhȰ`+˃%":3i0ЌSÈՄR;t(uF\[-jFJNSSٷvt9;1@`ힿO|=OZ!j>g7I*Q0VGk}N - Q{CkbgsYTyeM2+I~SK/kUdgPk×}9 vp5_n-s+pƢ$rk9csk@m2xm2@?8g?M2>+^յۏ:@@:rV 3Za}9n?:Z w;K/kum;&ϙ*5_n--ZԌ>ܮ-?&ST-jFJNeN[[&ϗ!2Tt^:Y[FZ\؁m׊+?eh;Izzn":Sv֖X xm kZf5\b1rzQ%uk2 BOעES9}vm2a͗[K}Zf5\ ֌B-@0׉  w |?;IfXY _ wS4&aeZC~!Mg7 +,Q Jkwsh/kwS$3,#A[Vz~in %xns-ii)~vp̰͡Ax):&ae%ܲ:*ᖕ^in G^&aeY %ܲKkwsh?=$3pn v7Eߍ9זX_{ww|7E#nJȴv71 kOMdun »Mg7 +,Q Jkwsh r7rndeu$pJO/͡Ax7kwSݘsm};nVb]CptMHnVb%ܲ:*ᖕ^in ynF*nVbY %ܲTZCptG^ƜkK,kOo|M_ I(Dz.h 9 [~7µ3鋓3ʱ Złan:Jkv_gT/dn3j_#LK[{, \GHg7Y=g })$g) }kwS4g7Y.n{Ikwsh~):;IrJ%1͡A8qmwSnRIpn /hg7Y>g JeWZCp)8;I*Ց_-+=Av7_kwS40Mr~V1͡A8n>;I*ֵ94G&9?-ωpo1Т#wS\gs T`ՙטZ>/3^H9ݙҿg[:g*]Y$^d)vV!n, gNUo̵?sbҕy&g*޻~{mwKE;+x؟b;+D0wV~=p8=s;k_ۍkV gE`ga 3-3jׁkwwq"E\S5ufen؟nuA暱3?VZp_H,}h7=̵u7WY0]3-3ʟׯFHl~E{7ұ?*+ZH})q*3̵?sbFU:3WXl^Y$>s\ }_}Z\𺏛+,{7ұ?sׁk6\cŽW,םu%sgs&gnb}{o"73GƴF#|7E$ ,Q Jkwsh&9y]bJkwshFkwS4&9)n̹Ă!=!)Z?MrD_CpSIkwsh#Mwcε% ov|Z80C2.Z80@ o !"#$&%(')*,+-./0123546789:;<=>?Y397nUJWoU%BT .[00l5}Ꙍ=qfRq0_zU-BE}bNE83YUYP`"=83Q*gh[/G_KH~fZKx9 6"\*qiL;m(p2=3Q*Nx9 6"\*13S<*Lp 'h#?pg&ʵ &kG˚ѧe z'ugf5o}# dh1[kLϴhTBbkwSn d,l3C1}WN_=S,)x ws>W˔טH4]9}TNqz=C)t?əטǩAwbkwSnZ[~hk||*Sf^cV$j֯ڲ{lr˴>z>u3VB[[9M=ZG֕AO^2V}f4}~8:я;\0F?Zr,3 󷋱Y?ugfhQ||SF[/"sb%Qd,ukۏxn#w:խs:I0^[ZSO_tQe]Т/ wsSL3-3, 2|0sxa~OتwgA|BPU̵{P+@5E;s;oEbwpپN3׾o̽ULτXzHQ̑"1s<̽U̕K|0sx؟b;/ [nb,OʞW=sұ?ׁkvhWבu%eyh\ǪŽWo؟EuA暱3Z"1G &uk_^t&gbzeX`nzn,`gxKM4\3q۽Eb`Ьzgnjݜv^3/gT3?j+V.+8A3,KlX# ŽW,\p~vX/}eX`q4&aekwsh1 \{7nF8:;Is#\v7(葟$ш͡A8kwShtvp#~Ϲv7( ^ƜkK,@piߨwS40M2(ֵ94GhnF:;IfXŴv7@^ß$3b%ܲ:*ᖕ^in Q!xn.nVFnY 94G)z4:;IfXyNڵ94GE)n̹Ă=]n>;Iźv7MHg7? ]kwS4pdQ,[VG%ܲ+͡A8MM2(Ց_-+=Av7v7EFg7?ωpX  ]1 `,\{7n&9?X.n{in Mg7E[xBWL=B{ߣu'h#\b8\I!3әI!3f]_>/+q{_Y$Wg.ƞ ЌEb ė?Mx8s;s-k+Dcٝ9/+{^tlTw Ya]hPwKlETa/|m~ﻉ 㟹ǃHq4>O _=s}qe(r_'da[9yRLlT+ZH})q*ퟹgbRb5ve8s}>3oօ`;/r=+{I!3?S"Q8s1?s15Oh4unb ?G@+D*;[| ^H> xYWUbze8s{b?s}Ҟ7B#-@j>3)=Da/xZPgEbo>! ~/:;s^?s;ox+\cUޫ̤pf߬ Aڜ,Q{^Y$ڻۛg-4T9+ć#x{hÙk~t53׾!H|U4g}/da"!zB؟uA\pvا_?n6z7ȱJ8s_jn r6 ̵}f,Gh|Bm >L Lu!h>B ^HU[}fR|f* 4?3)d>DUV]bC`Kg]&ƙ#S{O+D\0Mms_"*oMJNmg5npw 2Ma澲H|U4&kg}C4Oh4mjnb ȱJ8s}^,mӘ,<ęaW8i\z ˕Em3<ęk_XY$>Ds4ǙI!gjyI_{uE C.r6>3)UR}3|/W9 ,<ęk_XY$>Ds4ǙI!͙-@jꐋ\uT\mP}fRHsfZPXzEb\\{ gn}E㦩oSwKl Y˫4y/jr9s_VUVkvKp6 ̵}f,Gh4A]?s}! 3V#5_gqfRHsf* Z%sUHr!L i,Q Vl}YY$>@~W u_Y$ڻۛ5_k[G7: sDqς mh4A]?s3B3f]f /֫L i,Qa~_Y[s_*3g3b_ y뿷t Y(, 2׌gZBk"1G[3W.L g&ͺC,Q{k_C"!z'6p̤pf߬ AZ-@jCU,Qb;,~{mws^h|k8u3^<^jk\DM>>! ʺ̤pf߬ p̤pfZS폛M,}g[DNԵ3Kb;/7M}ZX`C#ߙk_XY$|  &383)$7BEi?!"0( Z[}fRH83H%I!VMSߦV&>94y%68%j1h9X:H5_ !?3EXUN+ X)Uq&W{o"@5EvX3׾7Gze=s"~ssWa澲H| /m'~sՙk_8s;"#U "A8k_ YH|+Oh4mjnb ȱJ8s_jn r6 ̵\Y$ڦ19:s^Cь383)dyf߬ kE[T3Bg&,LoRUyɋ{U!9\}fRUYT}o"!z^E^*߯3>]W~_Y$>D׹u̵}fǙI!3S[TU^Z=3Bx&<},M,=sq-]\3S4^]jeZXzmg}o"1Gig}C4ce=Gh8MPgqfRHsf߬ m!m!;/>3)93HmK3B,Q[a澲H|U4g}C4ce8@i>s;"@N9Ҟ폛MM,}!9Wig}o˕Eb2&q>D3̤T [K^{uE C.r6>3)9Dm tퟹgnUV忱]kᾲH| /mh4A]?s}g}C +ć}Lu!}-@W>3)$LoR/L g^It"!z6 u̵}fǙI!T +֞,QRvXEb &<*s=s;UU+oM4A+D4&Gm-!\z߇h"!z63Zݬ,mӘK<ęk_mUT& w`K\z߇h"!z~AOm4A]?s3B™-@j-/L gJa~i~B#ǒ&q涿jn r6 ̵}f,G`Om4A]~+!7gbO+D s^g|Bm k_8s3B3S[Z^ޫC.rmPr÷AI!%jmk_#`H,=Ù#x{t߯3>qԷջ6,F%MmUTFUf7^~&2k_܇hW#p4>!u}Bf,G dWk~̤̄Y9pˋ3B3S[/L i,Q jvX3>qԷջ6,FU<aR9՜InSZh܁ /m?sӶyig}C4ce=^hzՂH,}03׾!EC-4Mx}>3HU%c<3)d}fZivاkmEClxi8G k_8s}bhXY$>D̤ .?/T}fR̤-@JV3Bg*kX%ݬ,MBC0Ds^[G7: sMtퟹfe`ON9Ҟ^,KlqxJg},Vu7g]qJekS376]Uvf7^~f^,mӘE#Hk_XY$>Ds4}eX dYxg}C4ce=G }LoRU%̤~fRZbeh_A Y`5ǙT&a>Qؑ   u>L g&ͺb-@_}fRH8D+V.1j^-0Sr%{Z=DI{QRRi%3>,M3ʯg`?s_UU,TY3׸.M4\3ʯg8s;"^~涿* s>D3V#p4ǙI!̄Y9-@L g&3S[TCOg&3KTCanV6pg 꾲Hb8o^׸.M4\3oOEbKb8,*]aߙT&a>Qؑ[D3̤pf* j(^̤pfj(O:W#muh4A]?s}gnYY$>hé2GgZML iLu!xQ U[}fRH{fRH{f* %L i,QjvاEb &D3V#p4ǙI!황-@|z,L i,QJanV6pg 꾲Hb8o^׸.M4\3oOۿ,G`K\z߇h}eX`K̑~V,Jf-44gn}z_Y$>D9MP\z߇hƙ}T UK>ޫC.rmPr÷AI!U[ivاEb &L g&ͺ|`C( >3)$jxɧ3B™%FtH,}!ЄS=s-nPE&y̽ƍtnuA暱 gn}E㦩oSwKl,F%M}V+ U+1/5OdgnjejeavM;mg}o˕Em{O8s}+ćh9MP̤vLoR5I!%Fb;"@N̵BW@ w37E8ׁk6tퟹ폛MM,}'d1r,igZYZM|y&8s_UjUYhn r6 ̵}f,Gh4A]?sj{_Y$>?s佟~+ĺЬӰ3|1|vاECqxn{y^[G7: s؆N3Zݬ,1l4T#aW՚Dlxik_HMcrt~//<ęk_XY$>Ds4ǙI!황-@K^{uE C.r6I!%p^Y$>D\hvاWz3׾!H| /m?s}! 3V#@p߯3׫\Eb9/3Gk_k7[H+*{ 7 aW#0FԵ3׾!q~g&g/ilxȽ U!9xfRH{f*~vاEb &]j5&63+D4&G&q>D3VgqfRH83oօ` /ZII!̤pf* j%䅭I!JԊO:W#muh4A]?s}+3>]jTh܁ /m?s}3|/WiL%M̵}f,Gh4A]?s3B3S[T+%/bL i,QDb;"@N3 u_Y$j1h7 ~/kxK&^d8s;+DM ʢҕn}JekS376] W#m&kg}C4O+ć?G k_8s3B3f]b !ؐoR3B3KTb;/V&>héWHѿ&p^E8gnYY$>hé2G3׾7G4g5npktH`!ЄS9Ҝ9+ć#x{k~JnH| /mh4A]?s}gW-~+! dK̑~Bf,G`5_gqfRH83HBrXxfRH8D*_feX`C 3EXU5+DM CrUHW՚37E8ׁk6tퟹveX`C ҙ"Eb̃ƆD\\pvاk2VDlxik_HMcrt~//<ęk_8s3B™ .;-@P}fRH83)$ />3)$Y jvاEb &YU8Bf,G dYxqx韹+>L g^ucCC=DI!U|vاEb &qԷջ6,F%M63׫\Eb9/3Gk_C"!z8~g&g/ilxȽ U!9_X}fRH{f*tH,}!ЄS=s;"i\,5m8_}^E8ׁk,tퟹ/ªYY$u\gUfe8{U!9Lg[z*Rw 2׼\gn}ᾲH|U4g}C4OתZUUh܁ /m?s}WiL%O8sB(3KT!Z9+ć#x{k~tw_Y$>Ds4Y *־!qzՂH,}0{?s}bhXY$>D̤pf* *^rnꐋ fRH8D*XzECU5_gn}VV*cvM;mg}oze=s"~ssWa~i~B#*M̵K\Y$ڦ19:ė?M̵}f,Gh4A]?s3B™ .oR}g&3B™-@X{H 3B™%OktH,} s=s;"l+DM CrUHW̽ƍtnuA暱 g}o"!z^E^*߯3>]W#m&kgr}+383)$왩-@|g&3KTRvاEb &=3B™%TfeX`C zZP+DM ƻ{o"@5c:t}e={h9MP\z߇hOתZU& w`K\z ˕Em{IǙk_XY$>Ds4ǙI!aLoR^1V,QJ+>ݬ,Kl4T\*}e Ġqx7D̤g/yaluxL ganW6p*7T"QA  ˕Em{I8s}+ć6pFԵ3׾0ce=G ?sW}LoR^2|,Q+tH,}!ЄS̵BW@ w37E8ׁk6tퟹfe`C it}e={h\z߇hƙaUPeavM;mg}o"6̵}f,G`K̤pf* *1V̤pf*O+Mx8\*}e Ġqx7D3\z߇V#0383)$ ="j{Br̤pf*O+Mx8ktH`0G3⪡+DM c4W׸tnuAy0 gZM5EuoEb'/UeyQg[lk36B7*XY$q: g_\z_3fՊņk";gƞǙI!ߙ)GP["=83Q*gi[/G_3rr &\lƮ,ckrtg{?3oօȱoyQUYTs49ڙ ;1݁_=3ZWQqfTѶ8^lE 'L ilfT,Ʈ,ū4Oh`ZX*haH 4gZ{_Y$jɆ_Ș~oJe=׃9B4y3;sm"Ѷ(ml"gC/™+oX Mx8s;sHYgqfRHsf*=Ù#xY u ?3H+LQxfub|  sܝ]=s;kW l5@,_b0hG;s;Ńﵭ}7|~ig.6\Ew:ņ{gqfRHsf_c̤L Ev/b{j^lW6[b5H{)a~CXY$پ8^\z_3޻~# keYTq$KګgnU΄RZ̻d ha9Zޯ-۠kp߾NxAq337G)GKۂ8v}88x{7!jW<tMpSyB\=s;b&ͻ 3p\lƮ,cW3_{V%ZHJVJWϼ=Hq{+ć[h3׾!qvاW#;MxjV`>=$WkqU9sKTׁ97x!*$){O:W#׹&<̵}fZU+QUh܁ /m?s}WiL%O8sQ:DZ9+ć#x{k~t%"3G3KT(U}C4ce=^~>аH|9/ǙI!3S[TŽW\۠:"o3BgtHE=s;a\zECU5_gn}VBUf7^~f^,mӘK<ęk_XY$>D^,Kqx9\z_ŒEC,&<+>L Y I!3KT*Zݬ,1l4T#aSUM4A+D4&GVUvN94A9ҜveX`C/Mx84gZy;Uf7QM~/Y[Lzp4E~/M[ݮ,KlE g}V+oD7b'Y[Lzp4%Ol"}gw涿feh ǝx%M8sHYgqfRH{fz'kLwm4A]?3)=!O+ć[h3׾!qvاW#;Mx&kY0W}3B3s+䱕fe>sX3[+؈\\3~DNԵ383)93ٻۛl׽fT!7kvfRHslub k"QNc"%mcIlBdӝgoe-M3-o&q>D3V#m&kgW-~+s^g3׾ozeXWU_o3>,G`K&kg}C4>L Y I!3KT+>]j5&63׾7"6)Z{I8s;͙k_{HMcrt%M̵}f,G`K̤~f* *{U!9|fRH?DO7+Mx83⪕W@ 37E8ׁk6tퟹveX`C ҙanW Hsfe Ġq{H 3Zs^[G7: s؆N3׾7Gze=s"~ssWaH| /mh4A]?s}gqfRH{f*} ?3SsU\etg"8M4g&˘lE`k_8s3B3C4Oט@ifRH{C4b1Ex,qb ~zվZ ,ū&<98s;OX0z7Q Fq}g]b|Bm OxBlջވ*Mxh3úV vehO8s޻H|r{ބ73}g[Cj7W@?ABCFDEGIHJKe.H//EqFصM|X+ v+p.]Ro\*0 x>=Xc%Ċ%ƺ<C9\*Eb\6 ;A4!вJb\4n;GltF5Խ,26X8%26rse cXm@JkT RpR8~8l꿢ag\6J t~Zųb!] o.Chp.uvwÐ.K ¹>_ :z>{N%s}b\i?mi}4_ѩ0I\W?~ZzxN햹>/Ts=< GәIe=Ј)p?&tW ՒAhP\SS U@#BD!#\i}׽rqh+F]@(T:ziOxų g\s}#toXG71s͎:[!Jذnp?*-k̵ѽ jbEb&tWg ʻH Jb#뫥]$`øn;E#>55s}>/(\irߺjľƭ?uoeO ¹?p5^`Υrlf[ Ѷ bvzN|,+,~{<^_k1MC v*v P:\ٚ^ jc ^_K=ճ5 ' wniWCFD8{}mNŚ^yOjg< re zyC]_Q*Ү-K\SU*zhVv5[dGv>b#~P{|3ǰKPiWmYPp#.;rh8W>Y<rMC*vlz8s}@wE@Wd8{}嚆؈CbӮ\MC#+"ù_h+U`uXVڰ iGl4s:՚ks|PzG͝9 ptFz14*,ac^Jh/׼MK>a|,r(2 jZ*@sۑ e&gm+.ot : ^AQth/l|&sͥ Ձn!j;j̉aAbqy:ݤϥ2xOb rAB.CN(lh =+|Puy>re9lba}5[=ý723wmp| &T{}-՚4jY%1Pph#W.6|L\\?Lpق2.\NŚWe]Bù+) 7( TiU7As0k.ϥr(qVX+!0~b}^-}z*_u2NADiv߯eحV%Q1M8ozq+wD. uC>`;"A\oEݢ@Ob\6  s׿RO5W b]"n"m^?N T~v{D`c6YẼSsݽקFk1\\i'2vzNSKx>Υ9N.Xt\6¹>Dx>sOd'r|tWuw9<C>Y2y}¹>~MesR5uK哥;AN'K&=;ȉuy>ΕOw_\iUrlЩ۲\RP\/o"z54Jn4 :6e ,뽾v||=@\j_%7],ù_P~XF{_%7|,STZECgA(5[,+{+wM>*wlf[,D7A%KF <]#+t m.4iSd{5 EgAdSQiOܼҽb]\ B 5HnPS)E8 |"U4,jGv{$k7WwM`SU7{Gg 8G4_Bb?pOvp&sSUL5D7 g zOsͥ=TEjbIs9wkT euq¹>+lrQ{@ùTIkpԻ j\lDQ^ŚP^\ktb#|¹>^_{ F\&Qt=De>߸pMW7|@\?LzB/W<\vӀNkYlx>q[N'nq+`6=࢑wRT|r '@ocQFG>R.6=+|Ǎe̥dR$۽ V,b# TUP)6@(f.eݛ|M@=W2.;VO'nfU-lp{>q[Zq9EX\/o<-_{zh6¹↍rxO^_{#Wl# bAoc]sׯMīZDJs)wMMp &yp RD/=3f1[,K=P7}7A.lstMMdo>Qqшk\q+rm  1z!l=¹?x>wG~.F8{+ A ľS+&$Ι4zxN:{}jOt}zXc(`C\I1dH Jb#9M6|,>58izo +]\k񯪡POpZڿwE@K=ոkٚpZ]\e@=ոs}OsIпJn4@=ճùzS*0х)aj 8[w KQ]K>Glp7ٯصMVu<1]iGP] 0v+X8{}j_Tz^k/4^tEzgk¹D]yܥ#SKs"c\Rt\gȆ^٩:aWgs}"΋ʫyx;bp&sͥ\s v ݢKD]9<k V,\]ܽקFk1+;x='rx>ci&Wg Hv}!PWW1!rG}dlG\S9קT_b^ 's^JYM`6G65s}O*f&ӫjsͥt\*,MW[ <]z8wh2nBU8K81\.ǐ.F8Wཌྷ>6=s=4ȈW< uɕOqlҽb]\8MxCa\?DSհnBU8K8{}m.4_V0AIl q zO*c|HzS$7sƺ<ChP7|RC acx{gȦҁ~kĆczC'r9+i?ҽb0<޺| Թ>\s)8+K+X$WP%CQO5~̥nm4࢑w!W>AGvTr%`.K>AJ>֑ ;n(cuRzV1.Atp=KuI\uX塀}$6 SCaA  >5Z#nK+7)ȇ˺`c쁸-K\SCJ8'Qu6l=t^_&SS*Wg#K{@] i¹~ wI&S?JD_{6vmAswӿ:^tY*\s=H\S%^|Q>_hj] #!v ]@Ya\zgkbyb^C]m:{\Pin 꽆H\srDvc np*F.S1rG7 zO6wb\\iz (X/TFTAQ$r.Tz(S?WL {m#\?F~DsDsM! )g\VLR^?57nEGP+'>5 b(|z:#oz'DZ\|>\6A=ˊz^aZl s#ƕܿx^7B`F['\tY*\zˠ$8v1Ol1dHl ØS2 a2 o4WU|}dD^!eCEA6qY\RsGTSSQ8|ȻZB*Qa2 og.[ahLa4| YlccI ոr2mׄs4,{4{Ԥ1'r={x9'r=׳>Ns0k.VΥv+166s)r}^NA׼JK>Js}/+.74NҵU.Qw>.+n\8+^:]\qj"^PW!";v+.p.v/Eƭ}^qy#YDQ$rw邹>;j^{P^,64 Jn4 Ycc)犊p;fE6CPl3P&sͥh.[a #vc| q[6 WԍV\Lb^rs\"U}*$G 5x>րvnPp.Fsm?qy™`mP E~_ްq⶜뽂4(ƈ+ =s \ˊoO nsWXC( kr Ȇ5v{εe{}jkzzv+%K8'B]IUbQة%c4O\FBA.%ƺ<؈C?l?qY\vPe5%( 4~ F%㏘]ZB{G\_?bjwk^*rQeTù꾌ݳ_ Â>׳_맦#Zֹ>>_Fur'@n^s=4׳~5@};U,Ht[EC>Y2y}¹.:_ް˨߻tyF> Q^]D]ܟ#20 6¹>ث|Ұ\_ pZ4 ^?5(~6'rJ^|3Jù_H-G;ұKH7mYژw2'růކc茒pO5 /a2\Ky.#AF&1Tɴ]ΥʹKgm>N+t2 .]"S\7B`Bht b]P͇d\iKsO MK- GeO{'+䓆f|Q8܏n˻Yۯ7mp\=w7ցae8׳;\ʎepﲃAJ6\G錒MF>(\|$Ddx>;bawA: (D>]*vBs }"/s׷FTD|lԿ:d|dSzxN]o 2wy^m.M W^ 6 uO7"zWIW' ؀l+<>MOH{ !bX Ұ{V}< j %bX9wۿ2g[)sקW`# ݰԧ?p'_Fre맦3J6'rJܑ;%/s)B$tH% z+ (l `-kgmW s^V Jù>ޥ+]Pf7s}"?Y8{O>}aZ1'riҞf\?LK7sn/+ mG'l) \42n\e4;t z*=xZ/)KF&8VKxt&ڳ v+M32 v렲\%{/>{}ju{ͫԻEc5x)=zOvNA׼ LO] kSù?p"~+܅{}j>{\>{\?LRoϥ<CiVQ] Bn1f 䲃 k%kj p'. *\"w¹ZBEQ~"#^}$Pù+js?E"wo`W7 k)qܿxڭV !]4(pPQi#^Q] #poG爻Z#H=l?qf ̻'j8\O\{FEZ6Nܖ^س 1x>-K\l\60Lq:.~l#H\4s= (f`!Ns0k.R E!ldC5l.ڭOoz#\_4[Ky'6Jpِ'|@)A6 zy.uY1UK9JtѠ$6:TVX+rYt.%ldC5L5\J.CC eP(ǎB\2gH;Z1RF{8~Ksyݳ_:q}qC+t2<1xEGlޥK 7˻t)xl ØS2 \?LRo\|\#YۯozN\aAYۯ6{jM ɍj SqF^Q`E?;Rs}ܟ)XmWƜaXz_>Txs)6DA> ou.v` ~xqDώoz6j߸0Nc>'rv+Pse^-pr~̥[KPse.\H 8MЉ0,~ ,H=2z:#k?ABȂs}#7|plls=4H H tAwh gplS0;RwqM! )맆W`#A>ؑ|^xg}WƜaX0[K哆Ej pEaŠ'*rtpqSpO|ro3JùS)WT.Z{Gi¹>:74sGWg`c'^?ntW'XǍ^?5Q>V  ED%Wl#X8{1dmqf_mgs0K7s(0$Aڧo76Sq$z>6SRg H:{ q6"~DQ_sWP,64(=@( p;\sWPݥS5( &2엇%탹N(DEp.upo^O".Clv*;aG6yp.VY{0,]ls}"ixYg.[SqztЩz2;wIhSݥS5sO ^NA^?nU'.Cjǰ#)\O~/62엇ޥ̮ a<.i\i4_ ǐv{$eTms^_S5 ^c>4{}c^y>]| :"Es}b<뺸*a˨Q\14{`u]zOM*0ALA>)\^:]Ыa]0xp4mqWe>_Vù~5~˨>ոr.zrݧ~(뫕s'R'E*(뫕/ jeZ.N #0p%ĺ(1 uBKE20.E2FaX8W+  ù[+We^F(0ͿB`FlhuCT5sקW' xCWC(vQ%s0yοRر sͥ:/oPe}/wxp#~y]>TF>}-뽾rMCr[SQw^s>{.seG'z͎q[+;[mY^_etd T뽾54SySoz;2 t{\oOeCe bJz\ t*1;c%AܖSc+&1iG| aQ;,shWƜ!\K=sWB(aXڣ옿uo 2'r]̻aZA%! K{Թv:|ҧIâv+Ү-K#c>^Z8Ds=[Tl}=70 Â>׳;\6a2~ R * aXڣΥv+JBh{>ŽˊZQԎiWCGd.̵t_7B'.ðWYۯ\h]"ue9өO+,:zxNT_Fr1{ ߛݽקF_!0c8;{Xx(v FOj~e%IO+wC>i1^_D_x΋n+Щ\yQ'r l#`.jc΋n+Щ΋FF}"ixY'jɕsOMGs}"/s0KqKoI[as)f# kĎiWC !1K]VLRc|Kr( e0,QvRD3p.c{}jt fee^]V kE\?LYۯoz Â>׳__mgm>Nsק&2엇_ux^_S5 "f#¹_P;Snc|d\3swm!8[D7kOPIuOۆX{%=\cUe5kvZ80E.Z80F  !"o#%$&')(+*,-/.0123547689:;<=>@?CEDABTF;`$gm8eXSE1r_ɳt-IޏT&{"ej[mRd Y0G&D2<;ۤjr5Ug[mRd zD_1.'aS-Mer&{ o'iVy"uUg4CIZ/}egyxf'y\Oz嚹>5jEQC| :坧s΋'rU7NA166Ĝ;`ī[a45{}ji^VX+!]$| $:=D8MWM݀|@p."w=_Rt^4-wI (txs0yοF<} zxA8\yQWMoz60 Q1wܽ׿鼨Pv>t^4m.Hv^6|S%:/o`6\yQ>55+&H ԧrGplls=<΋FF+(C.w;P6{X+H=|^ߚ^3J֑v{|_7B>isGyx\yQ{h/M ]4\  dsT|_7B>iX+H=|^?5w+VX+(0'r7l ոr&ozFTQ PzOM7n'#s}"%遹_h%C[a`Xڣjs}"܅\_  =* \=we7;mM Ǝq[6uX{Or  * !sX|_7B>is} @푹?p]ߛ!8[zOM^aZA,mtO2'rs}xW&8;.:q[1{}鈦v =70 Â>׳;\6a2~s kv*v2aXڣΥv+;D0,Q!=B5l.|#S1ߒ#J2~smWejs=kq~j WحV0,QQ`],h/M@>O)@71s+(C.qaoz֞t=\cv:߽OM ɍؑ٠+Ү-KsקFK=ճ5 txyb^v5s׏^ ԧ86vߺ=<1 6ʐKpl_h܇_!0:Psg \>{}j;#:<<|c%Aܖ s=7\8͎~e%뽾vX:4 ݐ6j3 [)#TkIT@͝aX0{}-՚4"SA1O QPiWCܖ\+21ߒ n\/oS_|$Hv{E¹[W`zH, jsׯM\OMҎV Ȁl<1{@^ژ>55+&ybs? +t2*$cy"uUG.=V&zdT67;U̱<^᭫:rӬCU 0G#lz 59NyV#TzT1vx*6nMVS*0lst+nPe iaVY6'}'~nGcst\lTW04^9E7W ]ҜbeJwlG ѩB!rOst1Z!+nK+̄}]&߷yan޸f3@!mnN+}ćNrq7W$*k+jTiN13͹WiN}'؎ *斿D r_4߿4K0G_Sg방JY=4[=޿JWul6JY=4[=޿bׄP+R9E:h4xl[;pҜ"}gJ*)_9Eo~߉]w-s}7B4%C:2jt@:2zi󢢓ߛ!8[Peuqc+&茒u~j:d+ЩحV  D[I+Q>IȀlp6{}jkWL {'6׳__ozN\js}"%v+ˊj/^|$𰇈ybsקF{ozYDK,+VX+l70 |_7dDF[1<>^?5Qv+:ds}"/sOMgoznPC.茒qlkWt Mtozm>i|Ćf4yQ~e%Ζ맦0Z7B(d0Z8w^T^aZAh׿΋1#s=<΋m!\S%^v+Dg^?n zxHp7O,]{/ozF:TQhA^64'r]b^aZFC푹_hPC :D տTVX+2*J cقaiHM8'r]b>5oz kTѹ>{\k^l ØS2 \6js=/\s}(//B" ]sru_:̻aZA%! K{Թv  ^<^ҜUS$>t] ?Ҝm~}'~nW9d1nR9]o=1xG4x%y+USE c\fzeVbR<0fNz*<[rJF2W̳-jidI5é\&UG.߿bmRd \TE ̑5[gJFMLȚխReTZcO5UgYJLGU*T$_1ZLա2߿b} pM Qsp*AޟۚՇul7Wlkd`#kV$;G;1 ݯzEMLHٯ*r ;G/;o'i07WY*e:lԊ3hkPEz͓Z+<'y"Ve\*B*Y}i7r {w;}׈nmRzdͰ9F905t;G;1õ+9c&T1"5з9+7Yg4Aܼ}z:h޿mV2j=#2MVk#u5<^*UN4\}, ѩB!r].'wB53!!CU.;ۜ+eJwf 3j=#2{<^aYu(MaE©\;G|7j.M5é\Y~9:ۑ<^!gVgj} rLss}b'u9+ۤjȚLrsnH]Q3¬2TE6F*斻yRϪNfT2k,NsZ zLer>9މ q7Wج7=::m.fN4d<^Ysx߉s;>nz<lnyY=d'#g@*斻yRϪNfT2SSŜV̙+ld#u#lz߉H{߱7Wوl=maVyR}'~n';ʚ3N4OFJWy >Cf^wv|2Rnz1'^"B͹}7ϼ\"{킝mR"DԡossZ+Tx9; wtOзyan޸fossx߷ya67~߷{WTA߿$*kFuŊ*rӬì_Sg[6Tlkt]_1϶<ۤjC*ffx:h):G;1<^!zlsinP#7ͺ}ru Qse: Sr7WbV+ۤjx߉Ku/fUBdY=BU4c_TFZ=H"{1 9I޿Շ6 g;7;>wWB~G5߬&<^QsZ=vac_6 %1r*1/ s4TDaz}d/f@סo~߉R]m~+!H t}n@.az>z4ǘ#9UyZT5I޿J5_1faS-Msw[st\}|<^<ۤjɬ6h"-:U&Sޟۚc.'os$J jid$Ʉ0 UkPEx9މY. W¬NJ5<^2tŨ}'~n75I_ٷܥfB8YM>pn GGY=w{W8*斻yB&U|ߩb Wvs[ zȨҕ=BY3+VZ߱7WC+{yR}z'f+^aVh:ۚd+fY3l֛os<^Q3fY3l֛ossl7Wj ̓]MVhy6OjȚխRN=Hޟۚg:G;1w.-n);U-ߩbc3g;pun75xߩb<^aȹ35}<0if5C慹y$WҬ}Yh[©\Df ѩB!j!CU.+}ߵBnPrǬ}'~nNjd+Dz ȹ4ߩb<^ш!gͨS]z+Za ]*};I떻y"uUJSgB.wnRN~E:Z#ץy ѱwr__-W6FH)';G:<˕5#\Y3r_SN=pnl)'ljPmn W4?u ,ߵ+Za U};G\|;U-9;[-2e}Y=޿JWuʨs,*j.K!Vo[+Ks_11 ¦Z*c0 Ys j9Yg;jǘce[e;jǘ#Tk>Ezi$I&{ǘ9FԲp#:BFs;G;@ WTʄsܸg4}g3K꺣eJ]>z9kߒ$8TH9lg7Wj]ݹMBBzҽϪ$brӬIOrӬw4k7W ]ёf]N4\0d$9"=´Tt*sxer׬#BM1GBl:G1 w}:hkp*Wkf#-:U&S¦Z*k/U|43z˜-kVz#WNLW\*BN$)Ҙz5G4?5AӚޕ=9_kV 9&O3sJ\бA yMVNC?5]qxE#ft6OjUg^S3fu+)^99kS5mn^wzwl};GǝkD|&U*B֌NJ5;Y} ͪb&}!ЪVLlG2y.w_sdc4[|,|2T9BTi+ٲ`1r_Cee@t<;lY3r2!ؿsDҋP%{,:U)S+lgn=# ">y7Wh$Ʉ0|߱A cqz5G8+tp1Ϭ|V{U J >|?PxG6F6}?P&d!Pb`Cmw`Cl`C`C;B,F6}?Pl(1l(9o unw`Cm`C:w;B6BĀb6Թi}G6m#J þls~G6`#JȆ}?Pl(1F6 unqG6& %a6Թl(!k!Pb`C!Pb %F5ӕ=Eðq`C*vG6h#J þlsc;B@!Pb!Pb`C[+#J f#J ~=l(16B0:wWtG66BuxEn;6?ðnM}dždux}dž⤑+b;6'wl(Na<^+L}džcCqC1&cCqi wl(nm<^ wl(nn}%(cCqцuxEP@úy"wl(nV Tf'h8)TT.f_k;tlgql "^38c H_3 :67ޯ:6~qP\;6~wemwl&}dž}džomwl(n_38Pwl(NewlS~߱8(cChyP }džоP-wl(~}džoicC3оP;6u޾P]1cC}dža;674پP}~߱E H:6~[J sSE!Pb!Pbb~M;B(6B(ھlsӢw`CQl`C u#Jb#Jr޾ls;B(6Bžlsυl(1l(9P:7sw`C l(1 ~ν#JȢm`CΰܜuG6l`C`6Թ˾#J(Y-J b~ȵz$qơ_Tfu=JSW~ ) %֬v!Pb`C{l(ij %*6ԹT %}džΰ;6~WcCqQ ߤ~߱(mwl&cC ߤ{P\4پP];6-ھPx}gVSW+̄;`4ɹgYPƾ#$PB&nfN%3!s s9JuEp*s!l(!Ql(e %7#$P"l6xGHD}?Pr!Ql(Eʾl(!Qg %;B %D %vGH@ %w}GH %7#$PBl %#$PBLJ þ?j un wJȢ:wawJȆ}?Pƾ#$PB& un 6: 6 unZqGH:7l(!}?PV쎐`Cm6Թչ;B % u 6@~ν;B %}?PbU?|?Pp ~0A߿Ь.3Za8j.סcCq2ux2+bP+}džX7Wh m<^b1߱8o a moderately reasonable ;CP/M interface. Along the way, the sentimentally appealing ;but time-consuming four passes have been reduced to the more ;pedestrian two. ;"CHAIN" COMMAND REQUIRES UNDISTORTED COPY OF ORIGINAL ;FILE NAME WHICH GOES HERE. ORGFCB: DEFB 0 ORGFN: DEFM ' ' DEFM 'Z80' ; ; SRCFCB: DEFB 0 ;FCB STARTS WITH 0 FOR DEFAULT DRIVE SRCFN: DEFM ' ' ;RESERVE 8 CHARS FOR FILE NAME DEFM 'Z80' ;USE EXTENSION OF Z80 DEFB 0 ;START WITH EXTENT 0 DEFS 23 ;23 BYTES 6Թe;Bl`C{#JȆl(9` ul(}l(1 ~=#JȤðh!Pb0}?Pr %~- #JF6 ~έ2 %a6Թ % %dþl(1 6Թl(MF6}?P~G6m`Ca unl(w`Cql(1 ~΍ "w`CAl(1 ~΍ l(1DðP %|צkFlO>Lvܖ?(bü6->5#6&Fn>(bLü6N1 $rT#m8hO; !}5zGmע񡈌҇h-~5>뭒I2h%Ioømm帶m҇i ɣN+IZHȒa^5SK}#!}hLz7mL"9rT2H҇b0kVI(_N.+Ed>>"ac&gT5/EdZ%kwj^HfNjnc,?V?|P}$"UbnpuZB(JVh#I$}ƦDR#&ge^J{:jߥK\)].eI4[RvwHj:2M_GVOjRܡK)/mݓ}&#.R!E`u)?+[=;t.Vv.i_JR}Ly)to>C.JRdoUخ]\IۧY%ee/mRӤ$uRi[Ҟ:J!E$PYؑ4)v)ɤtRevH+Re]Ӥ4);LrZ]:@ri:Aʔ{ SL*M+ >MǮ㒲uԡK.gWۧ9i[b/%Ki@ʪՑ}]RZCKI );rȲVXxo,v+2Iyqq]{Kcdt7-*e%M*4~U~tA}kiQϨ!x] ~kQ}*j^H0n^z釛ޛU30ٽ7Ebk?}ajü6HЭ~Ʀeì\l2wr\]E>Yia)}n^nɣ Xg2!}0+ػ535Sl+^Vfa^:\30 :b7j؆E xüfևY>V. ;ɛLYo2-jg6 kccDKݍgü66&aF!ъؘEe5ìT˶r\-Kn^:\30ٽ7fa^y&& m?y܇^+'Qa^2ݪEr:1ʂ޿?|Wk?WZ$_5/;9%C0M Wü64dyͬڵ}19|j^.b A..P A..P A..P :DRIVE. ; X: CONSOLE ; ELSE: DEFAULT SKIP SKIP ;"DEFAULT" IS EITHER THE STANDARD DEFAULT DRIVE, ;OR THE DRIVE NAMED IN THE INVOCATION, IF ANY. DOFILS: LD IY,OFLAGS ;POINT AT OUTPUT FLAG VAR. LD (IY),+(1.SHL.HEXFIL).OR.(1.SHL.LSTFIL) ;SET DEFAULT OUTPUT. LD HL,DFCB ;POINT AT DEFAULT FCB CREATED BY CPM ;FROM COMMAND LINE. LD DE,ORGFCB ;MOVE THE FILE NAME INTO ALL OF PUSH HL ;OUR FCBS. CALL MDRNM POP HL LD DE,LSTFCB PUSH HL CALL MDRNM POP HL LDw>VNKZ%ktH&[JC>hOa뭒NQ҇!҇bh?Bjyq("K>(_N,y!}8ۘ=hŠc뭒NQH^t$?.B0<9ۘ=cUT+'寚"w?kck*ݬ}C X{xlѨeŅ (}Pq{" 6e7ٽ7+`Mmj^׵7?yCHdü6N? ?{W6 N8#J>ktRK凡D5OwH\XllŇ:(}Qĸay<ݍzyqec&? Aj}Pr Q?2}.7SW0A9߮k|a!nr{V$ r,>oqpX~,aVQpo|\2W~7-<L;jƲvw uռ80-(B jg{/ѽ>!L_s|>6rHT׸0"2IŽPrwT5/Czq|s]ז *븏ky'G;8mKvls~Oj1{z%q(9sɳun^E:2y̦{7YhaRૌݴt0-*W?L*֗ò~U$M*4GaZT:y}ΫEGe݈ i16-,fz+?k7Yma{oÈ"Ňy.jތ> +LJ>4Lvڵc-zMU6,\.*b[?ݴhԋb흣eq4iQaZT:~UmZk?Cޝ~mr}҇\n^C[Q-N!n/տxry[+<_0C(Ѯfzղ. ;^#3!|#U{ڎOGݼv->t3*Yxuya^6}$/Ѭ~Pd[k7NUog+rYh|sk8ߎL$ч^LJQ޾a^;v~Z80F.Z80Z   !#"%$&(')+*-,/.10o23546789:;=<>?@ABCDEGFIHJKLMNPOQRSVTUWYX c/F-JvD;RpQYؑl2@g?(k5T <.c$$k.;t#~PcվUt>mvpGҤIA]סK{RD#C+z xDÇymnSsIյw˥PG#6{ćE\݇z? Aj-/SRcղ.ϫ9߮[RjXy+Kw܊$ކѤŻCÈ ߇ymN&cyqȎ{qz;(9}/{'V J>LvM28amޏ*aBgQrnDӿ#F14QĸaVP!kus&& m? qdȶ(ƕ\WJ&+*"5SìpG<${>JrgOJ0!i?(Q#Ur;JN>|ޛU3c>ndW3=ǁ҇)—GaZc-f_ok@>|צC[0C,  Y_ËROv+ 3*q7b~hQlj'x}΍Sn]vk}Qٽ|:ǁgѭXz݊yFz~_w+nE.qp|Qذ3Ew5>koF8_^wGZca^cp݇BFdwtn>(bZ̨dLO:r!gϻiQqȣ&XW==lG{h{l0އt*3҇մMC7ƺR/nqg~Mv!Ňt* 3{+u5_ZAy7-*y; rduI|WϰAq~]ޭgqC/>ru5|ʙzrYq;F qã9AqoD&wϽW<[L>dԊ\Vq{.j|R!LߞWnZT((3>Nv+5:8 G;.a4 TgMvŠMCMg|dCE h:[=_MڊwӢGөεVXsݺ3vg@;+yZ2jlcS'xEkt0e>nE.}ü66-,uaĆ0b~h0]1dd!a^:\30]WkFp|$VڇBFÈ"#&#SOyq0u\A}1N8MƵvN }u>뭤}E>:NՊv+rY 0"(_\<Wn럎+ӭ(d䇱^urNݼvN?3*|IWVutJ= ^x^{浣MJXy~6$-g+]qsfPre݈ g/"icnh\ U}a?->ذ}(dވsԇdQoF%rVղνwѥ#iaDCY>syBwTYؑ/_6̦ݴ8K8LM: rɇriQqS@v9u7-*Nh:!zuXqÔH$MRrI鵦Nސ-Od-on}Ppeݴ8tb 2nZTr:1}$VwӢӉ)|PpOfGwӢ⤏SɴcG_\+!s>L6*|Ro[z琯gwK_!L_˥ѭX6vtHanwӢGüvYQ]8 3?LvM2~PsT|$~kq~_ok}PF1->(baDCaZfh:nE.u]9a^;Z;f&؝(s=}u>ѭ}zM}tw>>W6_.rB r_6ލذ?ذFlO>k?ݦe9Vkxa^;TMZ[HN'C$Mt{V|uzEQ޾NZc]>kg?K=o4[oȇ\V\0M R߇ ?M}$v#66.n}׎Fө݊\V;üvHЭ( ղ>ڵHL?LvM}tԇE 3*|w˩GnuF!h$'%zMܯJ8# ɫ!݈ È iaĆ\.X\knZTs@fPW6KknZTkG7 ݻ|ecnZT ݻq9 6tm%vӢGo&;3Ku4|MCuHW=R!L_˥ ݻ>҇/iQqȣa.эohG!_Xl,}pݴ8.S4!L_˥ѭX6vtHanwӢGb<Z^ɎMba4!m>aݴ8l;E:6Vk'oiQqT'\vɴcG_|(SiMCM"b9.븤?,vӢGөmwdǦQ&E!S]oVkQ&E!S]oVkݴ8t+"|m4㙸8NuErֽ->\wӢGel˨;v\. mYh=)!ߊA%dm!}bh>Ol_ĆH$>L$UU}b\=/dd!HڳD}8WuW&D׿D>Q|v_$fP5ZN>\2έpEpM EE!S]o} u9▓,km}їݴ8t&XnZTh:Չb<:.[>ݴ8Q|$p8GZcInZT(Qry[+<ng=Vk,3nu7-*Σ->f=Vkbyݴ8VܷhQ'|t59JDTwt5ܓVwӢGөdZѭXKnZTh: E:VnZTV ҇(MCk|tg|-üvmea^;&ytDҖvI8nYaMFmPrn^;YyF!{3vѭX|MDs'üv6Ya$ïCCލذ?kGnTt5uwnE.y?d㣑40] !LgTjYdGA}Q<ǽ+/nu9üv2Z㣑40krµ>˶r\5/-_>gh҇ՖCÈ ߇yʂJ|ϱ>kdq62ݪEr:"i(/|>}W^nFrˊOpn^;rF%/n},F%>}=~jk?\׸duѐ*v6ֹ3^0߇ylpeRߌBg'XI_\yݼv4!La4VG _km]3gs:jGxFcaupOǎb^}.a4VG AGx <ךt`.^\RPsIMCU6Ȧ/5}$yl>Jvq}$l,6><\ېG=|_. CMX q3Wlvռ>\wעG=l|PD6dǦxuCyG E!2~x-C >aEvmE!S >ںR|tJٵvӢGө->:jY ߴWDP5nZTh:j/GZc}\RnZTh:g6"ic}nZTh:g6˩9ևGvT_W7.~p+{MCM: rɇry-  1!\ !2*.+"{46![5+ ~y!"y4!4w_#~ ʸ A:4~~# ¼ > \ ?ʻ w# !ͼ ? !ͼ !)ͼ !ͼ :5͡ :6:6͡ :71!\ !2*.+"{46![5+ ~y!"y4!4w_#~ ʸ A:4~~# ¼ > \ ?ʻ w# !ͼ ? !ͼ !)ͼ !ͼ :5͡ :6:6͡ :7' " m&!K z' {'* >\   O >X !4 ! ~#" !" !  !2! 6A#6Z#6M2 : @ڞ ʞ Ҟ 2  ͭ  ø INPUT FILE OPEN ERROR ! > ~ 4 6_' " m&!K z' {'* >\   O >X !4 ! ~#" !" !  !2! 6A#6Z#6M2 : @ڞ ʞ Ҟ 2  ͭ  ø INPUT FILE OPEN ERROR ! > ~ 4 6_&!4933w#93 LIBH# 4^#V*_~ ##.!ʡ ʃw# o>GxPWʡ v6 #6 #622"_:=!6 #6E#6N#6D#Ã2R :# Æ   ;&!4933w#93 LIBH# 4^#V*_ : E: X E k:_J :I :H *}>+ʉ2Y :J ʩ:B '2B :A '2A G:B:8/*C *}o:</P!J >6 #=2I 6 #6 #6!P " : X :0  LUDE FILE OPEN ERROR !/ø OBJECT WRITE ERROR >2D: ZZ>22! !2!>r!22: @ڒ*>ʿ:ʲ>û!—!:~#"!"29ͭ ! 2ø 12345678ABC INCLUDE FILE OPEN ERROR !/ø OBJECT WRITE ERROR >2D: ZZ>22! !2!>r!22: @ڒ*>ʿ:ʲ>û!—!:~#"!"29ͭ ! 2ø 12345678ABC INC1/Rͣ:Z !H 4~?! 2rGD͑$%*."p&:.2r&%:C[!:A ' :B ' Gï Z80MR VER 1.2 FILE 12345678 ?ʻ w# !ͼ ? !ͼ !) 0000 ERROR(S) ASSEMBLY COMPLETE !"*y4~!}! ~# Nwy#" j ͆go2Z22C "D "F "A 2&"&"&"&!+~m~#d^F#N#">2>2*y4*!~̢! Ã:<2*:> > > >2> ' " m&!K z' {'* >\   O >X !4 ! ~#" !" !  !2! 6A#6Z#6M2 : @ڞ ʞ Ҟ 2  ͭ  ø INPUT FILE OPEN ERROR ! > ~ 4 6_' " m&!K z' {'* >\   O >X !4 ! ~#" !" !  !2! 6A#6Z#6M2 : @ڞ ʞ Ҟ 2  ͭ  ø INPUT FILE OPEN ERROR ! > ~ 4 6_>*!' " m&!K z' {' *  8 0w2I #: E: X E k:_J :I :H *}>+ʉ2Y :J ʩ:B '2B :A '2A G:B j D͆ ! > ~ 4 6_' " m&!K z' {'* >\   O >X !4 ! ~#" !" !  !2! 6A#6Z#6M2 : @ڞ ʞ Ҟ 2  ͭ  ø INPUT FILE OPEN ERROR ! > ~ 4 6_LUDE FILE OPEN ERROR !/ø OBJECT WRITE ERROR >2D: ZZ>22! !2!>r!22: @ڒ*>ʿ:ʲ>û!—!:~#"!"29ͭ ! 2ø 12345678ABC INCLUDE FILE OPEN ERROR !/ø OBJECT WRITE ERROR >2D: ZZ>22! !2!>r!22: @ڒ*>ʿ:ʲ>û!—!:~#"!"29ͭ ! 2ø 12345678ABC INC:PG $0ɃUNDEFINED@@DOUBLE DEFINEDERRORREDEFINEDPUBLICEXTRN#ASEGCSEGDSEG SYMBOLS!Z w#”!I 4͌*!͏n!.:C !.*_: : #':C ; &m:C !2"_!.EJECT AHEADIN:INCLUDLIST WMACLIS^2I I:H rPe2Be2<ɗ2I 2"_!|.&>OFF ON >>:!!w# !# 2: 2!:93A<2.!"> w#w#w!" ;w#"!/ø OBJECT WRITE ERROR >2D: ZZ>22! !2!>r!22: @ڒʒҒ2!"ø OBJECT FILE CREATE ERROR HEXOBJ>~ 4 6_>*w#"!/ø OBJECT WRITE ERROR >2D: ZZ>22! !2!>r!22: @ڒ*>ʿ:ʲ>û!—!:~#"!"29ͭ ! 2ø 12345678ABC INC!  LUDE FILE OPEN ERROR !/ø OBJECT WRIT>*W7w#"7!rø PRINT WRITE ERROR >2: Eڜ>2:2! !2!6P#6R#6N26: @2!"ø PRINT FILE CREATE ERROR >:W!/ø OBJECT WRIT>*W7w#"7!rø PRINT WRITE ERROR >2: Eڜ>2:2! !2!6P#6R#6N26COND \ELSE END ENDC ENDIF IF \ASEG rCSEG wDATA ~2 #^#V*_'!Y$~':AQQo&)^#V!bʅ;E<͔# T&~`j G#b+/{:~; З/ʙ*_bE"_ͩ}͔#;™^.ͮ;0 ڼ))))oͪ-:.&$@$,:. 8&&G: 2 ͪ-:.&: ͔##!>;ͪ-,: :. 8&& 2 ͜-:.&:AS *.:.Ok &:.&:.o:.g++|&y&|<~ =&}>2.&".|2.: ͔#͆$$%&͜->͔#:.':.'*.|'}''>F-#>Vʔ#>^Ô#z-:.!@2 :. !:.a&>͔#: 'w##~'w+~'w*{4~ k*{4*y4!w#xLyL*y4 "y4*{4 "{4!2*4s#r̓:4<*y454!9%ø MACRO OR EXPRESSION NESTED TOO DEEP-STACK OVERRUN #!"""*}4"4*{4~ 6#6#R.:J y&|%!!I 4m+}%ɗ2I 2! ڈw#HÈ!'2 &ڈ'ʁw&#f'u6 #6 # ˆ6!2#'#'>2j2:33 &3*w4 ~w& &93,í#'>2j2:33 &3*w4 ~w9.%$%:*&%:*&ƌ2r&"p&}%%"p&>ƀ2r&>2o&*w4s&2:H :>y»%}:o&ʡ%ҡ%_:&G:r&¡%*p&&z¡%{¡%s&*o&&w!o&4%&"p&>2o&y2r&2s&%"s&yO:&2r&&"p&>2o&:r& %>2o&*}$u&2%:o&*p&U\"p&!o&~G>::j6&~O#&2o&~W&#O6&2o&W&> > Z& h&0:&G:r&¡%*p&&&#͐&A&ʲ&"&:&ڨ&:&"&&"&"&:&&:&"&:H &*&ME*&*&*&DB DDB DEFB DEFL JDEFM DEFS 5DEFW $DS 5DSEG |DW $EJEC AENDM EQU QEXTRN LIST LOCAL MACRO NAME NLIST ORG XPUBLICSPAC TITLE X*}&: &!&!# 933w#q &#,62R͌m͏!Xzs*4 UxBp#@\p##̐w# @"4̓!Z4&*46#"4*_: &!~ʽ~~#Ô&ʺ33$YM &!&!# 933w#q Ô#̓#&&>͔#Æ$z-:.!A2 :. 9!:. >͔#$͜-:.̓#a!:.["$: *2 5#G: Ô#͜-:.':.'*.}Ǵ': Ô#z-:.&:.&*.}&>o: 2 !͜-:.̓#!O: 2 >͔#: Ô#: >2 5#Ô#z-:. l":. ʾ":.̓#2"@2 :.̓#ұ":.["$: p&5#:.̓#$2 :.["$͔#: pv&͔#$mo?m>>:.@!#Œ":.̓#Җ":.["Ң"!#:."#ɇ͔#͆$͔#>6͔#$͆$G: v&Ô#:.@&!%#:."#G &x"&<&O ~Ĕ##~3,93AO!0 q93,Mͳ'M0'M͠':&g &O͐&#'>~>~>2&ʈ2j#'2: "_!.&INPAGEPAGE û:&&!#=q: &#''M͆$,2.2.'  &2.͆$'!Y$6 $6#'M#,'#'My&&͐&!&;&R.*D #"D :C "F R.y&}>2C *D }&*F }|:C 2C *D |&+"D *F +xy"F 2C #'R.͠'y2.*}&*D }&!Z4#'!,#:J '++~A2J 2I ## : 3'͍'͠'ͪ'3:H l'*w4y_'ѱw#s#r&~@w>H&y&yѩ&z&{&!P z' {' y&: &͍'͠'ͪ'3*w4~'O_'y|ѱw#s#r())4))))))@*e*e*++$+L+++g,,,,,,,,ADC:HL,BC/ED4A;ADC:HL,DE/ED5A;ADC:HL,HL/ED6A;ADC:HL,SP/ED7A;ADD:HL,BC/9;ADD:HL,DE/19;ADD:HL,HL/29;ADD:HL,SP/39;ADD:IX,BC/DD09;ADD:IX,DE/DD19;ADD:IX,IX/DD29;ADD:IX,SP/DD39;ADD:IY,BC/FD09;ADD:IY,DE/FD19;ADD:IY,IY/FD29;ADD:IY,SP/FD39;&#,62R&*|&#&933&!*4+6#933Qw#A6# '  ' 6#"4,"^#V*_|:C ***4>q#p#=œ"4"#'!*4"6#:' :' 6#"4̓*#"*P~#Z{  ʟ# ͵*Q#,+33>?͵͵~#F͵9~&#>#͵*>+F+N=_"4""*+"G*~#ʎ€~# ڊ͵Î> > "ͣ G> ͵q# '93,!;w# &'w#&Ô#:K[*{**!1!!2CS"s"":.["&͔#: ͔#͆$͜-:. d#: F͔#͆$:.̓#5#G: Ô#z-:.'P#$kŠ#>& (?*I-̥#2#!#Ê$@Ҵ#''''''!.#!.:Y$O~O#^#V#"}$p$> ${ZW> $>0$'y!Z$o|gF>0$'AON%{̈́&>0Q$lyN%z̈́&f$ yB2X y z$ZP!.Ê$!.#*y4:j"w4ͩ$%$%!~s&2!o&6#w#w#6*w4 "w4~ N> $>$y$$#^#V:1%>"  CCF/3F;CPD/EDA9;CPDR/EDB9;CPI/EDA1;CPIR/EDB1;CPL/2F;DAA/27;DEC:BC/B;DEC:DE/1B;DEC:HL/2B;DEC:IX/DD2B;DEC:IY/FD2B;DEC:SP/3B;DI/F3;EI/FB;EX:(SP),HL/E3;EX:(SP),IX/DDE3;EX:(SP),IY/FDE3;EX:AF,AF'/8;EX:DE,HL/EB;EXX/D9;HALT/76;INC:BC/3;INC:DE/13;INC:HL/23;INC:IX/DD23;INC:IY/FD23;INC:SP/33;IND/EDAA;INDR/EDBA;INI/EDA2;INIR/EDB2;JP:(HL)/E9;JP:(IX)/DDE9;JP:(IY)/FDE9;LD:(BC),A/2;LD:(DE),A/12;LD:A,(BC)/A;LD:A,(DE)/1A;LD:A,I/ED57;LD:A,R/ED5F;LD:I,A/ED47;LD:R,A/ED4F;LD:SP,HL/F9;LD:SP,IX/DDF9;LD:SP,IY/FDF9;LDD/EDA8;LDDR/EDB 3w #9333_Z?139013%$!ɿK2(g` >O>GͶ393Hʈ3͡393Oʈ3Qʈ3͎393Bʈ3393Dʈ33&33!930)oÑ3!930)))oä3!930 3 ))))où3!930  o& 33!3!33" 4*y4"w433~O4+4#4*w4N#~#fo*w4 4;4ø NOT ENOUGH MEMORY *y4"w4"y4:4<54w#f46#p#p44[544B C D E H L A AF BC DE HL SP IX IY 2:73 ?/.?/!l/33~>/O#/ѱ6/###/F#~#fo\0*1/1+0-0&1^"1=\0>u0<0NOT 0RES 0MOD 1SHR F0SHL .0AND 1OR "1XOR 01EQ \0GT u0LT 0UGT 0ULT 0HIGH/LOW /y&>1x&:.2.‡.2.lgÇ.y&>1x&:.2.‡.2.gÇ.y&x&Ç.ͅ1x0xʇ. )<0ͅ1xʇ. |g}oM0ͅ10}o0!Ç.!Ç.ͅ10+|o0i0ͅ10|o0i0ͅ10i0|i0o0ͅ10o0i0ͅ1|'.!z0͞10Ç.&Ç.>1 Ç.O10Ç.yoxgy Documentation for Z80MR............................A Z80 Macro Assembler ::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: Introduction ::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: Z80MR is a Z80 macro assembler with syntax closely following RMAC and MAC. It assembles standard Z80 mnemonics into an Intel Hex format. The resulting file (which has a .HEX extension) can be translated to a .COM file with LOAD.COM (on your CP/M disk that you r8;LDI/EDA0;LDIR/EDB0;NEG/ED44;NOP/0;OTDR/EDBB;OTIR/EDB3;OUTD/EDAB;OUTI/EDA3;POP:AF/F1;POP:BC/C1;POP:DE/D1;POP:HL/E1;POP:IX/DDE1;POP:IY/FDE1;PUSH:AF/F5;PUSH:BC/C5;PUSH:DE/D5;PUSH:HL/E5;PUSH:IX/DDE5;PUSH:IY/FDE5;RET:C/D8;RET:M/F8;RET:NC/D0;RET:NZ/C0;RET:P/F0;RET:PE/E8;RET:PO/E0;RET:Z/C8;RET/C9;RETI/ED4D;RETN/ED45;RLA/17;RLCA/7;RLD/ED6F;RRA/1F;RRCA/F;RRD/ED67;SBC:HL,BC/ED42;SBC:HL,DE/ED52;SBC:HL,HL/ED62;SBC:HL,SP/ED72;SCF/37;+:;BIT @!CALLDJNZ7 IM IN JP JR  OUT !RES !SET !RLC !RRC I R NZ Z NC PO PE P M $ &ͅ1x&}/o|/gÇ.ͅ1xgyoÇ.ͅ1xgyoÇ.ͅ1xgyoÇ.:.|1y|1o1:.|1o1:.o1:.2.:.2.&:.O2.:.2.Oo1ͅ1͞1Ç.!x@3yʳ1 é1@3ͅ11Ç.ͅ11*.Ç.}1&!".|x@3ᯰ@3 1@3 ".@3".*.@3".*.93!'K2(g23:҇20I3Ç2 '_2%$&eoK2'U2:2=222R.:2<22)& 2–2:33$&3yʲ2y &>&>O!33.2~# y2!2:!2!93+6 2933:30eceived with your Kaypro) if it ORG's at 100 (hex). If it ORG's elsewhere the .HEX file may be read into memory and manipulated with DDT.COM. Why Z80.................................................................... The assembler you received with your Kaypro (ASM.COM) is an 8080 assembler. The Kaypro actually runs a Z80 c.p.u. The reason this is possible is that the Z80 actually runs all of the 8080 instructions but in addition there are more instructions unknown to the 8080. The extra instruc!RL !RR !SLA !SRA (!SRL 8!LD @!ADC u#ADD u#AND M#CP M#OR M#SBC u#SUB M#XOR M#RST l!INC A!DEC A!ͪ-!.. ~6#†-,ʜ-&ͪ-;!&-:.k·->&2.m-n-:.&&y}'|&".<'!ME".".(.>@2..)&2:33A..3y ..:. 2.R.|>.}F.:.2.:.G*.:.O̓x(2G.xŸq.GU.".2.y2.33".:.O:.ʒ..".:.O*.:.GU.-:.k&2.*.*.!0..O!C/~.#F#~#foɷ####.#  tions were designed for increased speed, easier programming, and more compact code. For this reason it is to your best advantage to program in Z80 code for the Kaypro. Z80 Mnemonics.............................................................. Z80 mnemonics are a great improvement to 8080. Thought was given to logical, universal mnemonics that are much easier to remember and use. I learned assembly language on the 8080 and resisted the change to Z80 at first. But after using Z80 mnemonics for a....... Assemblers are almost always field oriented some to a greater degree than others. A field is a flexible position in the line of code with respect to the right margin. This assembler recognizes 4 fields in an assembly language source line. label operation operand comment The assembler knows when it has reached the end of a field when it sees a 'field delimiter'. This can be a space or a tab for this assembler though some require tabs so it is a good habit to always use tab characassembly time. This is called expanding the macro. By using the *MACLIST ON option, the lines of code produced by the expansion of a macro are listed in the .PRN file. Then the code can be examined and at times optimized in certain locations. ::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: Assembler Syntax ::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: Components and General Form of Assembly Language Programs.................. The strucr code more readable. This assembler only examines the first six characters of any label or symbol so that if the following labels were used in the same program FINISH1 EQU 1000H FINISH2 EQU 2000H A 'D' error (duplicate symbols) would be generated. Operation and Operand Fields............................................... The operation field follows the label field and may either contain a Z80 op code mnemonic, an assembler directive (or pseudo op), or a macro call. Assembler directives  short time I became very unwilling to do anything with 8080 code. Now I run almost every 8080 program that comes in through a 8080 to Z80 translating program (XLATE2.COM on Kaypro disk #17). Even if you are writing programs for the 8080 it is still far easier to write in Z80 mnemonics. There is a special listing command that flags Z80- only instructions for this very reason (described later). Macros..................................................................... Macros are a way of writiters as delimiters. Label Field................................................................ A symbol is a word used to represent a number. Symbols that refer to addresses are called labels. The assignment of a number to a label can either be defined as the lines below TEN EQU 10 START EQU 100H or calculated by the assembler as an address for branching instructions. START: JP FINISH NOP NOP FINISH: JP START Also notice that the label is optional and is only for the programmersture of an assembly language program is more important to an assembler than the actual instructions you write. A program that would run beautifully can fail to assemble if the syntax is not correct. A program with no errors at assembly time is not guaranteed to run correctly ( or as expected ). The assemblers report of 0 errors means that it understood all of the instructions you entered, not that your program is logically correct. Fields..............................................................and macros are described later in this file. This field will usally contain the mnemonic for a Z80 instruction. Some Z80 instructions only use this field while others contain an operand which will be located in the operand field. GOBACK: OR A RET Z LD A,0FFH RET The way Z80 mnemonics were designed, the number of nmenonics in the operation portion of instructions is kept to a minimum since the operands really distinguish the differences between similar instructions. The first line above ing subroutines in assembly language and then calling the subroutine by entering the 'macro name' into the source. The macro may be called as many times as necessary anywhere in the program. When the assembler is operated, the lines of source code that make up the macro will be inserted into the file by the assembler. Note that using a macro does not reduce the size of the object code that is produced since all the lines of code that make up the macro definition are assembled into the object file at  conveniance. Labels must appear in the label field. Some assemblers allow you to indent labels but this one won't. START EQU 100H START: JP FINISH Will give you a problem. The EQU must be in the operation field and the label in the label field. Most assemblers require that the undefined labels be terminated in a colon but this assembler does not require a colon for symbols in column 1. START JP FINISH will not generate an error but colons are another good habit and also make you$  s a good example of this. The operation is an 'OR' operation on the number in the accumulator (implied) with another register. It makes sense that the operand should be the register containing the other number in the 'OR' operation. In Z80 assembly language this is the case. The first line OR's the accumulator with the accumualator (used to see if the accumulator contains a 0). Notice that the second line uses the operand field to contain the condition for a conditional jump (in this case the zero fl....................................................... The assembler will accept numbers in HEX (base 16) BINARY (base 2) or DECIMAL. Hex numbers must end with an H and binary numbers must end in a B. Decimal numbers should have no suffix letter. When a HEX digit begins with a letter, the letter should be preceded with a 0. LD A,0F3H OR 01001000B LD HL,4000H+28 ::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: Commanding the Assembler ::::::::::::::::::: the beginning of a comment and most ignore the rest of the line. For compatability between assemblers it is a good to begin comments with a semicolon. But for this assembler the following methods of inserting comments are good syntax. 1. Beginning a line with an '*' in column one causes the assembler to ignore therest of the line except if one of the assembler commands (described below) immediately follows the asterisk (no embedded spaces). 2. A semicolon will cause the assembler to consider evit ; values are called words. Addresses are assembled with the ; most significant byte (MSB) following the least significant ; byte (LSB) because this is how the microprocessor handles ; these values. The DW pseudo-op allows us to describe these ; values in the way we are used to (MSB first) and still ; assemble correctly for the processor. ; DW 8000H ; will assemble the same as ; DB 00H ; DB 80H ; ; If more than one word is to follow a DW following values ; shoulag). The third line uses the operand field to contain both the target register for a load and the number to load. The last line is an unconditional return which uses the same operator (RET) as the conditional return but does not use the operand field because there are no conditons to place there. This structure makes Z80 programs much more readable than 8080 programs as well as making the instructions easier to remember. The following is the same code written with 8080 mnemonics. Notice the different:::::::::::::::::::::::::::::::::::::::::::::::::::::::: The primary responsibility of the assembler is to translate Z80 mnemonics into object code. The assembler also recognizes certain commands and directives that the programmer can use to manipulate the assembler's output. These are often referred to as 'pseudo-ops'. This assembler requires these pseudo-ops to be in upper case. A description of these commands follows: ORG ; Sets the origin of the code or section of code. Actually ;erything following it to be considered a comment. 3. The first blank encountered following the beginning of the operand field will cause the assembler to consider the rest of the line to be considered a comment. ****************************************** ;An adventure in Comments * A short tale START: JP FINISH ; finish this story NOP ASM can't handle this FINISH: RET Thats all folks Would assemble with no errors. Comments do not appear in the object code. Numbers and Bases...d be seperated by commas ; e.g. DW 8000H,0F000H,0000H ; The wordlist can also be symbols ; e.g. START: JP FINISH ; DW START,FINISH ; FINISH: JP START DDB wordlist ; This pseudo-op is a way of assembling 16 bit values with ; the MSB first (opposite of DW). ; DDB 8000H ; will assemble the same as ; DB 80H ; DB 00H DB bytelist DEFB bytelist DEFM bytelist DATA bytelist ; These four pseudo-ops have identical meanings. The bytelist ; can be one byte or multiple philosophy on the use of the fields. GOBACK: ORA RETZ MVI A,0FFH RET Also the LD command in the Z80 is used for all data moves while 8080 users must remember a different mnemonic for different types of moves. 8080 Z80 MOV H,A LD H,A MVI H,00 LD H,00 LXI H,0000 LD HL,0000 The Comment Field.......................................................... Comments are not limited to the comment field and can actually be the entire line. All assemblers recognize the semicolon as it sets the reference number that the assembler uses to ; generate addresses for labels and instructions. ; could be a number or a previously defined symbol. ; e.g. ORG 0 ; ORG START END ; Determines the end of an assembly language program. ; if present describes the first executable instruction of ; the program. DW wordlist DEFW wordlist ; Both of these have identical meanings. In assembly language ; programs, 8 bit values are called bytes and 16 b%   bytes seperated with commas. ; The bytes can be any mix of symbols, ascii characters in ; quotes, or numbers on the same line. This is familiar ; code in Kaypro programs: ; ;ESC EQU 1BH ;CLRSCR EQU 1AH ;CRLF DDB 0D0AH ; ; ORG 100H ; ; LD DE,MES ; LD C,9 ; CALL 5 ; RET ; ;MES: DB CLRSCR ; DB ESC,'=',12+20H,12+20H ; DB '*Your Message Here *',CRLF ; DB '*Or Here*','$' ; ; END ; ; If you've been waiting for an example to enter assemble be redefined later in the program. *INCLUDE ; This pseudo-op causes the assembler to stop assembling ; lines in the file it is presently in and read in the ; file . It then begins assembling lines in this ; included file until it reaches the end of the file when ; it returns to the original file and resumes assembling ; lines in it once more. The can be any CPM ; filename.ext though if the extent is left off it looks ; for the given filename with an DS n DEFS n ; Reserve data space ( n bytes ). This is used to position ; allocate or label data storage space in a program. n is ; a number describing the number of bytes reserved. ; DS 16 ; Reserves 16 bytes. The next instruction will be located ; 16 bytes from the location counter when the DS was ; encountered. label EQU ; ; The EQU sets the label equal to the expression. The ; label should not be terminated with a colon when used ; with an EQU pseudo-op. The an ENDIF. Any of these pseudo-ops must appear in the operation field. TRUE EQU 0FFH FALSE EQU 0 KPRO2 EQU TRUE KPRO10 EQU FALSE IF KPRO2 BITPRT EQU 1CH ELSE BITPRT EQU 14H ENDIF Operators.................................................................. Operators allow the programmer to make the assembler do arithmetic and logical operations. They are usually used to manipulate operands or generate symbols. Some of them are used to create tests for conditional assem ; and run, try this one out. Just enter it (with out the ; semicolons of course) assemble it and run it as described ; in AZM-COM.DOC. ; ; The program clears the screen, positions the cursor at ; row 12 column 12 and prints the message using the BDOS ; function 9 (print string). ; ; The symbol CLRSCR is defined by an EQU to the hex code to ; clear the screen on the Kaypro (^Z). ; ; The cursor positioning sequence on the Kaypro consists of ; the two lead-in characters  extent of .LIB. The asterisk ; must appear in column 1 with the word INCLUDE immediately ; following with no embedded spaces. ; ;*INCLUDE DRIVER.AZM ; will begin assembly on ; the file DRIVER.AZM ;*INCLUDE Z80MACRO ; will begin assembly on ; the file Z80MACRO.LIB ; Conditional Assembly Pseudo-Ops............................................ IF ELSE ENDIF Conditional assembly is a way of writing a single program so that it can be assembled different ways or with dlabel can be any symbol ; (byte or word) and the a number in any of the ; following forms: ; SWEET EQU 16 ;decimal ; SWEET EQU 10H ;hex ; SWEET EQU 00010000B ;binary ; ; With this assembler the EQU must be located in the ; operation field. ; A label defined with an EQU cannot be redefined later ; in the program. label DEFL ; ; This assigns the value of the to the label like ; the EQU pseudo-op but a label defined with a DEFL can ; bly. There should be no embedded spaces when using these operators as the first blank encountered terminates the operand field. The operands may be symbols or numbers in any of the bases. The operators supported by this assembler are: Arithmetic Operators + ; arithmetic addition. - ; arithmetic subtraction * ; arithmetic multiplication / ; arithmetic division (truncating the result) Logical Operators (Bit Manipulation) & ( or .AND. ) ; logical AND operation ^ ( or .(escape and an equals sign) and ; then the row+20H and the column+20H. ; ; Since the next bytes are just a carriage return, line feed ; pair the second part of the message will appear at the ; left side of the screen. We could include extra DB's to ; position the cursor anywhere on the screen if we like. ; ; BDOS function 9 (summoned by loading a 9 in the C register ; and calling 0005H) prints the characters it finds at the ; address in the DE registers until it sees a '$'. ifferent options by only changing a couple of lines of codes. When the assembler encounters an IF pseudo-op it evaluates the symbol . IF is non-zero it assembles the following lines until it reaches an ELSE or an ENDIF. If is 0 the lines are ignored until the assembler encounters an ELSE or an ENDIF. If the ELSE is encounter the assembler begins assembling lines again. The ENDIF pseudo-op causes the assembler to resume assembling all lines. You can not have an IF without &  OR. ) ; logical OR operation .XOR. ; logical exclusive OR operation \ ( or .NOT. ) ; logical inversion .SHR. ; shift left operand to right by right operand .SHL. ; shift left operand to left by right operand .HIGH. ; byte value is assigned the high byte of a ; 16 bit value .LOW. ; byte value is assigned the low byte of a 16 ; bit value Conditional Assembly Operators ( return TRUE or FALSE to IF ) = ( or .EQU. ) ; logical equivalence > ( or .GT. ) ; grted symbols into object files ; I (on); List lines of conditional code following a false ; ; conditional. If off only the code actually ; ; assembled is listed. ; M (on); Expand macros in listing files ; O (on); Produce an object module. That is show the bytes ; ; being generated by the assembler otherwise just ; ; the source and (optionally) macro expansions. ; R ; use absolute displacement for JR and DJNZ ; S (on); List source code in listing file ; T (le with out using a page break. *LIST ON *LIST OFF ; Turn the listing on or off. This is usually used to omit ; long comments or certain sections from the .PRN file. *MACLIST ON *MACLIST OFF ; Turn the expansion of macros on or off. Seeing how the ; macros are being expanded is handy for optimizing code ; but can waste paper when that is no longer the area of ; interest. LIST options NLIST options ; These pseudo-ops allow you to turn any of the supported ; listing file options on identical to the assembler. ; Assigning a different value to a symbol that was ; previously defined with a EQU pseudo-op. ; If you are going to reassign use DEFL. E ; Relocation error. I believe this occurs if the assembler ; cannot reassign an address as expected. F ; Format Error. You will see this if you break any of the ; rules regarding field use and macro format. K ; Keyword error. This means you tried to use one of the ; assemblers reserved words or pseudo-ops as a symeater than .UGT. ; unsigned greater than < ( or .LT. ) ; less than .ULT. ; unsigned less than Listing Options Pseudo-Ops................................................. There are a number of listing options. All of these options only effect the print file (.PRN). The options include some for debugging as well as some for the actual format of the file on the page. The .PRN file is the basic tool assembly language programmers have for examining the output of the assembler. The pon); List symbol table in listing file ; X ; Generate and list cross references in listing file ; Z ; Generate an error for Z80 only opcodes. Allows you ; ; to write in Z80 mnemonics for an 8080 processor. ::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: Error Reporting ::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: When the assembler is unable to understand what you are instructing it to do it generates an error message. These are a(LIST) or off (NLIST) without ; changing the other options. Both of these pseudo-ops ; must be followed with one or more of the following option ; letters. If these pseudo-ops is used some options are ; on by default ( marked with (on) in the following list. ; ; A ; List all bytes in DB, DW, DDB, etc. Otherwise ; ; only the bytes that can fit in one line are ; ; included in the listing ( others are implied ). ; B ; Place symbol table into object file. ; G ; Place system generabol. ; ORG: JP END ; NOP ; END: JP ORG ; is in very bad taste. L ; Label error. The attempt to assign a value to a lable was ; unsuccessful. Also remember that labels do not end in a ; colon when preceding EQU. ; START: EQU 100H ; is bad news ; START EQU 100H ; is perfect M ; Missing label. The symbol you are using was never defined. N ; Macro nesting error. Macros can be nested (that is a macro ; can call another macro) but if the nesting gets to deep ; the asseseudo-ops beginning with an asterisk must begin in column 1. *EJECT ( or EJEC ) ; The next line of the listing should be placed at the top ; of the next page. *HEADING ; Place the text ( following this command ) on the top of ; each page. Usually used to date the listing file. TITLE 'text' ; Place the text in the quotation marks (either double or ; single on the top of each page in the listing file. SPAC n ; Leave n blank lines in the listing. Used to leave white ; space in the filmost always due to typo's or bad form. It displays the error code below and the line the error was found on to the console and also displays the error codes in the listing file. D ; Duplicate symbol definition. You will see this error ; message if you do any of the following: ; Use the same symbol twice. ; FORMATX ; FORMATC ; will generate an error (only 6 significant ; characters). ; Upper and lower case symbols with the same letters ; FORMAT: ; format: ; are '  mbler will quit and give you one of these. Also, ; you can only call macros that were previously defined. O ; Op code error. If you see this, look in the operation and ; operand fields. Consult the mnemonic table. People ; switching over from 8080 will see a few of these. P ; Phase error. A 2 pass assembler builds a symbol table on ; the first pass and generates the object code on the second. ; If a number that it calculates for a symbol on the first ; pass does not agree with a nn macros and they are seperated by commas. The instruction can be Z80 instructions, or any of the assembler commands listed above incuding conditionals. The instruction can also be another macro call (called nested macros) but only if the nested macro has been already defined. The ENDM keyword tells the assembler that it has reached the end of the code that must be assembled when this macro is called. Do not use a colon behind the macro name. The previous message program example can be rewritten to languages. In fact by creating a library of macros you are in essence creating your own language, and your own compiler. Often times in assembly language (particularly writing for CP/M) each program contains source lines that are used again and again in other programs. By using macros the routines only need to be written once and then may be called in any program. The best thing about a macro library is that only the macros that are called produce object code. So there is no penalty in having a maca program. Following the word LOCAL ( which must be on the second line of the macro ) are the symbols we want the compiler to generate unique labels for. These symbols must also be proceded with a '#' sign. AJUMP MACRO LOCAL #ADR_Z,#BACK OR A JR Z,#ADR_Z LD A,40H JR #BACK #ADR_Z: LD A,04H #BACK: LD DE,0 ENDM The macro itself is not really useful but it is correct and shows the use of local labels. ::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: umber it generates in the ; pass this error is shown check the symbols in the line ; the error appeared. Q ; Questionable operand. Actually theres no question about it ; it is a bad operand. Typo's give you these as well as ; blowing op code format. Usally easy to find your mistake. S ; Syntax error. You broke one of the syntax rules described ; above. T ; Symbol table full. Not much you can do with this except ; pare down the code. U ; Undefined symbol. You used a symbol  look like this with macros. ORG 100H *INCLUDE Z80MACRO BDOS PRNSTR,MES RET MES: DB ESC,'=',12+20H,12+20H DB '*Your message here*' DDB CRLF DB '*Or here*' END With the following macro library called Z80MACRO.LIB ;Call Bdos function #FUNCT using paramater contained in #DE ESC EQU 1BH ; ascii escape CRLF EQU 0D0AH ; ascii carriage return line feed PRNSTR EQU 9 BDOS MACRO #FUNCT,#DE LD C,#FUNCT ; FUNCTION NUMBER GOES TO C LD DE,#DE ; GET PARAMETER CALL 5 ;ro library that is large and complete even if you are only going to call one macro. Macros have a form that is unique and must be followed closely for correct results. The general form of a macro is name MACRO #parameter1,#parameter2,.... instruction instruction instruction . . . ENDM The name is the symbol that will be used to invoke the macro. MACRO is a keyword that will indicate to the assembler that a macro is being defined. The parameters always must begin with a '#' sign ibut forgot to define ; it in with an EQU. V ; Value error. Usually means you are trying to do a 16 ; bit operation with an 8 bit number or the other way ; around. ::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: Macros ::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: The macro is a powerful method of writing assembly language programs. It makes it possible to write assembly language programs in a way that resembles higher level CALL BDOS ENDM We could also rewrite the cursor positioning sequence into a macro. Note how just this small example can save us time in future programs. Also, the macro library is a great place to keep frequently used symbols like ESC and CRLF. But what about using address symbols in macros? How can we avoid the 'D' error if we call the macro more than once. The other keyword unique to macros is LOCAL. This makes the assembler generate its own unique label every time the macro is expanded in