IMD 1.18: 22/01/1996 7:15:22 micro cornucopia kaypro user group disk 22 zcpr (again)     -22-DISKDOCJ 10GINSTLSUB10INSTALSUB2INSTALLSUB4INSTALLSUBCRC COMCRC DOCCRCKLISTCRCEX14 COMEX14 DOC/GINSTALLSUB GXINSTALSUB!README TXT"ZCPR ASM#$%&'()*+,-./012ZCPR ASM3456789:;<=>?@ABZCPR ASMCDEFGHIJKLMNOPQR Kaypro Disk #22 ZCPR This disk provides a version of ZCPR for the older Kaypro 2's and 4's and versions for the Kaypro 10 and the new 4/84 and 2/84. The new Kaypro 4's and 2's (2/84's & 4/84's) can be identified by their non-glare screens and 63K CP/M cold boot sign-on. The older 4's still have a 64K system and owners of these machines should follow the directions for the Kaypro 2 in the paragraphs that follow. Enhancements::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::ZCPR ASM#STUVWZCPR DOC!XYZ[\ZCPR MAN]^_`abcdefghijklZCPR MANmnopqrstuvwxyz{|ZCPR MANb}~ZCPR10 HEX*ZCPR10S HEX+ZCPR2 HEX*ZCPR2S HEX+ZCPR4 HEX*ZCPR4S HEX+ZCPRGX HEX*ZCPRGXS HEX+:::: This version of ZCPR differs from the version on disk #9 in a couple of ways. Mainly it fixes the bugs in the way the old version handled control charac- ters. The most common complaint on the old ZCPR was that you could not pass control character strings through to the console (or the printer with a ^P). This version fixes that. The installation procedure has also been changed to use SYSGEN rather than MOVCPM. The problem with MOVCPM is that many people got the BIOS update from Kaypro but did   not incorporate it into their MOVCPM. The result was erratic keypad operation. The problem with SYSGEN is that some people don't know what they have on their system tracks. Ah well, can't win them all. If you do the installation and then can't boot chances are that your system is not the original size shipped with your Kaypro. Read the ZCPR manual to determine how to reassemble for your custom system; You are on your own from that point on. The other improvement is that you may use a semi colon sed to install ZCPR with the above files. Don't forget old 4's use the Kaypro 2 files. Kaypro 4 files are for the new Kaypro 4's and 2's with a 63K signon message. In addition there are three versions of the 63K CP/M. Versions F and earlier use the standard 4INSTALL.SUB. Kaypro's running version G need to use GINSTALL.SUB. If ZCPR doesn't install properly, then use G2INSTALL.SUB. To find out what version you have, hit the reset button and boot CP/M. The version letter will follow the "2on option ZCPR4S.HEX ZCPR for the Kaypro 4 w/semicolon option ZCPR4.HEX Same but without semicolon option ZCPRGXS.HEX ZCPR for the Kaypro running new CP/M 2.2G (GXINSTALL uses this file) ZCPRGX.HEX Same but without semicolon option ZCPR10S.HEX ZCPR for the Kaypro 10 w/semicolon option ZCPR10.HEX Same but without semicolon option *.SUB Installation SUBMIT files each one set up for a specific computer including................. 2INSTALL.SUB Installationaypro 4's and 2's Version G ::::::::::::::::::::::::::::::::::::::::::: Follow the directions for the Version F and earlier except substitute GINSTALL.SUB for 4INSTALL.SUB. (You will still use ZCPR4S.HEX). Kaypro 10 :::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: Since ZCPR lives on your system tracks and your system tracks live on the hard disk be very careful when installing ZCPR on your 10. Please observe the following precautions. 1. Your Kaypro 10 must be running CP/Mas well as a colon to log on to a drive. In other words, A; has the same effect as A:. This will only be true when you are comunicating with the CCP ( actually the ZCPR ) or in other words when the A> prompt or B> is on your screen and you are entering commands to CP/M. The semi colon WILL NOT work with PIP. If you don't want to use this feature there are hex files that do not implement it. ( Described later ) THE FILES ON THIS DISK **************************************************** ZCPR.DOC.2" in the sign-on message. If you have a 64K CP/M there will be no version letter. Follow the directions for the Kaypro 2 for 64K CP/M. INSTALLATION ************************************************************** Kaypro 2..... and old 4's:::::::::::::::::::::::::::::::::::::::::::::::::: Format and sysgen a disk from your CP/M master and pip the following files onto this disk: From your CP/M system disk: SYSGEN.COM DDT.COM From this disk: ZCPR2S.HEX EX14.COM 2INSTALL commands for Kaypro 2 4INSTALL.SUB Installation commands for Kaypro 4 running CP/M version F and lower. GINSTALL.SUB Installation commands for Kaypro 4 running CP/M version G. GXINSTAL.SUB Installation commands for Kaypro 4 running the new CP/M version G (use this if GINSTALL doesn't work). 10INSTAL.SUB Installation commands for Kaypro 10 version F. 10GINSTL.SUB Installation commands for Kaypro 10 version G. EX14.COM A fantastic replacement for SUBMIT.COM. U version F or G. This is not the monitor version but the BIOS version and is displayed in the cold boot sign-on. If you are running version F, use 10INSTAL.SUB. If you are running version G use 10GINSTL.SUB. 2. You should be able to boot your 10 from a floppy. In case there is a problem putting ZCPR on the system tracks, you will be able to recover by booting from a floppy and running PUTSYS.COM to restore the system tracks to the hard disk. Create a floppy disk that you can boot A users guide to the new commands and enhancements provided by ZCPR. ZCPR.MAN An extensive manual on ZCPR written by its creators. Describes custom installation and assembly of source. ZCPR.ASM The assembly language source for ZCPR. Requires MAC.COM (( 8080 macro assembler ) ASM.COM won't work ). *.HEX Assembled ZCPR files each one set up for a specific computer including................. ZCPR2S.HEX ZCPR for the Kaypro 2 w/semicolon option ZCPR2.HEX Same but without semicol.SUB Boot the disk you created in A: and enter EX14 2INSTALL The disk drives will jump to life and after a bit of grinding you will get a message that says that ZCPR is installed. From now on ZCPR will be trans- ferred to any disk you sysgen from this disk. New Kaypro 4's and 2's Version F and earlier :::::::::::::::::::::::::::::: Follow the directions for the Kaypro 2 and old 4 except substitute ZCPR4S.HEX for ZCPR2S.HEX and 4INSTALL.SUB for 2INSTALL.SUB. New K   from by using GENFLPY.COM. To use GENFLPY enter GENFLPY . It will ask for a source drive. Respond to this question with a carriage return and answer C for the destination drive. Now make sure you can boot the 10 from a floppy by having the floppy in the disk drive and hitting the reset button. The floppy drive becomes drive A: and the hard disk becomes drives B, and C. If you are successful with this also practice reinstalling your system tracks by running semicolon for drive select you will need to edit the INSTALL.SUB file that you will use for the installation procedure. (i.e. if you have a Kaypro 2 you will need to edit 2INSTALL.SUB). The line you need to edit is the iZCPR??.HEX line. (i.e. if you have a Kaypro 2 the line will be iZCPR2S.HEX). Delete the "S" in that line. (in the example the line will now read iZCPR2.HEX). Now follow the installation instructions above using the .SUB file you just edited and the .HEX file for your machine (only won of 1.4. Version G has a PUTSYS version of 1.4G. You will be able to abort the operation at this point if the version of your PUTSYS is not correct. You will be prompted to enter a carriage return to continue or control C to abort. If you continue.............. You will notice some activity then the phrase and then the A0> prompt. Examine the directory and you should see a file called ZPUTSYS.COM This file will do the same thing as PUTSYS.COM (namely write system tracks to yourddt putsys.com d01f3,01fb ^< The characters on the right of the above line should read VER 1.4G ^> ^< If they don't, enter a control-C to abort operation and re-read^> ^< the file -22-DISK.DOC. If you see VER 1.4G, enter a carriage return ^> ^< to continue ^> ^? izcpr10s.hex r3580 a2096 JMP EB28 . ^C save 40 zputsys.com PUTSYS. If you can boot from the floppy and restore your system tracks you are ready to continue. But first put a copy of PUTSYS.COM on the floppy as well (just in case). 3. Verify that you have a good copy of the files on this disk by entering CRC . This program will do a cyclic redundancy check on all the files and display *MATCH* for all the good files. If you do not get a match on all the files, return the disk for a new copy and do not install ZCPR with this ithout the "S"). ::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: To verify files on this disk enter: CRC  hard disk) but will write ZCPR instead of the CCP when run. To complete the ZCPR installation enter: ZPUTSYS When the A0> prompt returns hit the reset button on the back of your computer to make sure it will still boot from the hard disk and enjoy ZCPR. If it will not boot, boot from the floppy and run PUTSYS to restore your original system tracks to the hard disk. ::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: If you do not want to use the disk. To begin the procedure, pip the following files onto your A: drive user 0 from this disk: EX14.COM 10INSTAL.SUB for version F or 10GINSTL.SUB for version G ZCPR10S.HEX The following files should already be there (if you didn't erase or move them): DDT.COM PUTSYS.COM Enter: EX14 10INSTAL for version F or EX14 10GINSTL for version G The program will display the version number of your PUTSYS.COM. Version F of CP/M has a PUTSYS versi  ddt putsys.com d01f3,01fb ^< The characters on the right of the above line should read VER 1.4 ^> ^< If they don't, enter a control-C to abort operation and re-read^> ^< the file -22-DISK.DOC. If you see VER 1.4 , enter a carriage return ^> ^< to continue ^> ^? izcpr10s.hex r3580 ^C save 40 zputsys.com @ ++ Now searching for "-CATALOG" file++ !  ) .) ! ”>.”#””͡”››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 wisysgen a | | save 40 cpmzz.com ddt cpmzz.com izcpr4s.hex r2980 ^C sysgen | a | | ^C era cpmzz.com ^<******** ZCPR +++++++++++++++++++++++> Installed ***********^> *#"ɯ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 Esysgen a | | save 40 cpmzz.com ddt cpmzz.com izcpr2s.hex r2580 ^C sysgen | a | | ^C era cpmzz.com ^<********* ZCPR ++++++++++++++++++++++++> Installed ***********^> th 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???  RROR++ <* |): o% |g}o" 2  ; 0T ~T #~A > T > _h : F{͇2h2|: ʲ !\   :\2 ! \  \ ! \  \! \  \<7=Ɓo&   ]  2h2|2   ~$#~# x  : F} *}= ">͇1 ] FILE: CRC .COM CRC = B2 07 --> FILE: CRC .DOC CRC = E5 81 --> FILE: 4INSTALL.SUB CRC = 41 0F --> FILE: ZCPR .DOC CRC = 42 D4 --> FILE: GINSTALL.SUB CRC = 26 CA --> FILE: 10INSTAL.SUB CRC = 8D A9 --> FILE: ZCPRGXS .HEX CRC = 63 71 --> FILE: ZCPRGX .HEX CRC = 37 C0w+#~!A:+P_^#V{P w#&*2#"2!)6!86kb"0"9 :(:&:8<28", ʜ os#r#:*b ʜ ‰o>  ~ µ> #_ê!ͤ@ͤ*2*0~# 6 ~#_   |{0_~#'_x{ w#0SUB error line # $ (Ex Already Present)$ Text buffer empty$ Input/EX Buffer Overlap$ No parameter or default parameter$ Parameter$ File filename.typ$ not there$ Control character$ Too man match - : ̓ : J M @ Quantity of lines failed parse test - : ̓ : ~ M @ Quantity of file(s) not found - : ̓ * d͔  ͔ 0T  Җ Wyʩ 0T 0ztiil!9"$1>2ͤ*?*}_|W!x< ~#/bkxp :/<2/Z~#2.:.2.lA+";#:o&6 !S0> 2*h:!"2>2!"4*2#"2:  G*4H'6 #6 #"4òe!='2|\<%!]&6.#e&6$z*4!"4\%*46"6}|q2&2'2(28!"2*;"9"= „2u| > 2O:&yʯ;A^$2) O:8yuNu͒:; ?|$%.ʘ#ʓ<ʪ> --> FILE: ZCPR2S .HEX CRC = 1F D2 --> FILE: ZCPR2 .HEX CRC = 6B 45 --> FILE: ZCPR10S .HEX CRC = F4 04 --> FILE: ZCPR10 .HEX CRC = 1B 0E --> FILE: ZCPR4S .HEX CRC = 68 99 --> FILE: ZCPR4 .HEX CRC = 4A 0E --> FILE: -22-DISK.DOC CRC = 1D 89 --> FILE: GXINSTAL.SUB CRC = D1 3A --> FILE: ZCPR .ASM CRC = C7 92 --> FILE: 2INSTALL.SUB CRC = 45 6E --> FILE: EX14 .COM CRC = 02 E3 --> FILE: ZCPR .MAN CRC = 9D E1 --> FILE: 10GINSTL.SUB CRC = D6 B4 --> FILE: EX14 y arguments - $EX 1.4 11-22-82$ $ppppppppppppppppppppppppppppppppI"""~+"21*|g."*" *! 1*~*"*"#^#V!_:O*AâÐu!9"!ͥ͢ʽ½ͥ*#w">*:2́a OC[[ 2> O:y½ͨÚ*"222Úͥ͢ʽ 7ͨO 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. ù>ù>ù>ù> > 2)u!A0> 2*h> ~!)w¹O:(yʹ:&yʹ#!):8=28ʏ jw:8ʉ> > ~> ~>ù>!(£w>ù>2)!&u2&2'ù>2)!'u2'2&ù*6}|ʉw+*###>E#>X#>Oͤ*$:6+6} %. 6+6X+6E+:w+:w+6*'ͤͤͤͤ*,ͪ fͤ ͤͤ zͤ|`ڣ{G @;:?$.#<>G@G$^|1Y:Y12+!U _^#V{   u u!Kw!Ww2*"x: :y2è*~+"*#"**{z­og"!m*å1!J!m*! (~#:!0:A[a{2:~$#Oͨ!A!!u >>>Ex Aborted<<< $ (Ex Active)$ (Ex Completed) >$ßâåèBDOS>   "IH! !B"$$HB!$BD$$$$H"D $$I """~+"21*|teeger [70315,1120] on CompuServe [note: The changes from file EXFIX.DOC have been incorporated into EX12.*] EX is a nifty and fast way of executing .SUB files, (uses ram as the SUB file buffer rather than spreading it out on disk). EX also allows batch entry of a series of commands which it stores in memory for subsequent continuous execution. EX relocates itself and its buffer to high memory just below CCP and adjusts the CP/M BDOS entry to protect itself. - Resolution: See next problem resolution. Problem: Unpredictable results when executing MBASIC under EX. Reason: MBASIC (and others) were not subtracting 6 from the BDOS+1 address when determining available memory. Resolution: EX now refreshes the storage in the 6 bytes below the BDOS+1 address during any warmboot request. The enhancements added with EX 1.2 are: ^: EX runtime re-execution function ^? EX runtime wait for carriage return `Xsub Already Presend `:' for each command line to be executed. A carriage return entered by itself terminates the prompting and starts execution of the command lines that have been entered. 2. EX14 cr This form will cause EX to load the into memory and perform substitution the same as SUBMIT, with the addition of the `^$' support for missing parameters. After all parameters have been substituted the text from the file is exe-Stan Hanson 05/24/82 EX replaces the functions of both SUBMIT.COM and XSUB.COM from Digital Research, Inc. --Larry Steeger 08/06/82 The files used to assemble EX14.ASM using EX14.SUB are: ED.COM EX14.ASM EX14.SUB MAC.COM RELS.UTL (or REL.UTL see note in EX14.SUB) SID.COM SUBMIT.COM and XSUB.COM (or a previous version of EX.COM may be used) [note: REL.UTL is available on CP/MUG Volume #38] [note: RELS.UTL is availt' logic Input/EX buffer overlap detection EX runtime recursion prevention (Ex Already Present) EX runtime prompt mode character logic The enhancements added with EX 1.1 are: ;; EX only comment support ^. Print suppression toggle ^<..^> Immediate print function ^# EX message suppression toggle ^| Carriage return/line feed function ^$ Default parameters' support Logic to prevent ZCPR re-entrance to EX.COM (EX.COM is not reentrant) --Larry Scuted as if was entered from the console. EX14.COM may be terminated during execution by entering control-C from the console. EX14.COM submit file conventions are: [note: unless otherwise stated, the `<.......>' sequences are used only to indicate character strings that must be replaced with the values described.] ^ generates the corresponding control character. Lowercase letters a thru z are conver EX 1.4 - 11/20/82 Thanks to Joe Cutler, Stan Hanson, and Ron Fowler for EX.* and the information used to create this version. This file and the source for EX14 are based upon the previous EX*.* files. EX 1.4 is a maintenance update to EX 1.2 and EX 1.3 (never released). Problem: BASCOM would not execute under EX. Reason: BASCOM is doing system integrity checks using the BDOS+1 address. EX was not preserving the required information so that BASCOM would execute. able on CP/MIG XA1 ACCESS database] The files used to test EX14.COM are: EX14.COM EX14.TST (must be renamed to .SUB before executing test) XSUB.COM The files used to execute EX14.COM are: EX14.COM SUB.COM (used to generate simple *.SUB files) [note: Any good CP/M editor may be used to create *.SUB files] (cr is carriage return) EX14.COM may be invoked two ways: 1. EX14 cr This form will cause EX to prompt with a line number an  ted to uppercase. $<1 thru 9> generates parameter <1 thru 9> substitution the same as SUBMIT, unless `^$' is being used as described below. ^$ will generate a list of parameters that will be used in the $<1 thru 9> parameter substitution if the user does not provide any parameters or only some of the parameters on the EX command line. ;; generates an EX only comment (the ;; and the remainder of the ce console. Control-C will terminate EX at this point also. $$ generates the $ (dollar-sign). $^ generates the ^ (caret or up-arrow). $| generates the | (broken vertical bar). EX14.COM(.BIN or .OBJ) was generated from EX14.ASM using EX14.SUB and the files mentioned above. --Larry Steeger 11/20/82 BIN or .OBJ) was generated from EX14.ASM usingThe files named .CPM are actually .COM files for CP/M. If you copy the files to a CP/M system without using 22DISK, just rename all *.CPM to .COM urrent line are not moved to the EX command buffer.). | generates a Carriage Return. ^| generates a Carriage Return and Line Feed. |,cr,lf,1AH(EOF) will eliminate all characters from the last | thru this sequence. ^. toggles print suppression for characters from SUBMIT file. (Example: DIR ^.*.COM^. will execute DIR *.COM but only DIR will be echoed to the console.) ^< forces immediate display of the characters following it until ^> is encountered.sysgen a | | save 40 cpmgx.com ddt cpmgx.com izcprgxs.hex r2B80 a2090 JMP F522 . ^C sysgen | a | | ^C ^<******** ZCPR +++++++++++++++++++++++> Installed ***********^> era cpmgx.com sysgen a | | save 40 cpmgg.com ddt cpmgg.com izcpr4s.hex r2980 a2090 JMP F722 . ^C sysgen | a | | ^C ^<******** ZCPR +++++++++++++++++++++++> Installed ***********^> era cpmgg.com  ^ control support, $<1 thru 9> parameter substitution, and $ escape support continues during this display mode. (Example: ^<^[ETest EX 1.4^|^> will generate the sequence to clear the screen on the H/Z19 terminal and display `Test EX 1.4' at the upper-lefthand corner of the screen and the cursor will be on the next line.) ^: causes EX to re-execute the .SUB file from the beginning. ^? causes EX to wait for a carriage return response from th  ;MODIFICATIONS by Bill Kennedy ; 104 Madrona Park Drive ; Steilacoom, WA 98388 ; voice 206-581-7212 ; data 206-581-2337 ; 1. Added conditionals for Kaypro 2 and 10 and Heath H89 ; 2. Altered msgs and FENCE so high bit doesn't turn on ; Kaypro 10 graphic characters. ; Example: DB ' '+80H is now DB ' ',80H or ; DB 'All','?'+80H is now DB 'All?',80H ; 3. Assembled code is added to PUTSYS, GENFLPY, and SYSGEN to ; ease user installation problems. ; ;***** into CPR ; ; 1 Buffers ; ; 2 CPR Starting Modules ; CPR1 CPR RESTRT RSTCPR RCPRNL ; PRNNF ; ; 3 Utilities ; CRLF CONOUT CONIN LCOUT LSTOUT ; READF READ BDOSB PRINTC PRINT ; GETDRV DEFDMA DMASET RESET BDOSJP ; LOGIN OPENF OPEN GRBDOS CLOSE ; SEARF SEAR1 SEARN SUBKIL DELETE ; RESETUSR GETUSR SETUSR ; ; 4 CPR Utilities ; SETUD SETU0D UCASE REDBUF CNVBUF ; BREAK USRNUM ERROR SDELM ADVAN ; SBLANK ADDAH NUMBER NUMERR HEXNUM ; DIRPTR SLOGIN DLOGIN COMLO FURTHER MODIFIED BY RLC AS V2.5 ; FURTHER MODIFIED BY RLC AS V2.6 ; FURTHUR MODIFIED BY SBB AS V2.7 ; FURTHER MODIFIED BY RLC AS V2.8 ; FURTHER MODIFIED BY RLC AS V2.9 ; FURTHER MODIFIED BY RLC AS V3.0 ; FURTHER MODIFIED BY RLC AS V3.1 ; FURTHER MODIFIED BY RLC AS V4.0 ; ZCPR VERSION 1.0 CREATED FROM CCPZ VERSION 4.0 BY RLC IN ; A COORDINATED EFFORT WITH CCP-GROUP ; ; ZCPR is a group effort by CCP-GROUP, whose active membership involved ; in this project consists of the following: ; RLC - Ri TO DISABLE PAGING BY DEFAULT PGDFLG EQU 'P' ;FOR TYPE COMMAND: PAGE OR NOT (DEP ON PGDFLT) ;THIS FLAG REVERSES THE DEFAULT EFFECT ; MAXUSR EQU 15 ;MAXIMUM USER NUMBER ACCESSABLE ; SYSFLG EQU 'A' ;FOR DIR COMMAND: LIST $SYS AND $DIR ; SOFLG EQU 'S' ;FOR DIR COMMAND: LIST $SYS FILES ONLY ; SUPRES EQU FALSE ;SUPRESSES USER # REPORT FOR USER 0 ; DEFUSR EQU 0 ;DEFAULT USER NUMBER FOR COM FILES ; SPRMPT EQU '$' ;CPR PROMPT INDICATING SUBMIT COMMAND CPRMPT EQU '>' ;CPR PROMPT INDICA********************************************************************* ;** Micro Cornucopia Magazine PO Box 223 Bend, Oregon 97709 ** ;************************************************************************** ; ; MICRO C'S MODIFICATIONS TO BILL KENNEDY'S MODIFICATION ; ; 1. FIXED PROBLEM WITH ERROR HANDLING ROUTINE THAT ; WOULD NOT PARSE ENTIRE STRING TO CONOUT ; 2. ADDED CONDITIONAL FOR USING SEMICOLON FOR LOGGING ; ON DRIVES ; 3. ADDED CONDITIONALS FOR NEW KAYPRO 4 (63K SYSTEM) ANG SCANER ; CMDSER ; ; 5 CPR-Resident Commands and Functions ; 5A DIR DIRPR FILLQ ; 5B ERA ; 5C LIST ; 5D TYPE PAGER ; 5E SAVE ; 5F REN ; 5G USER ; 5H DFU ; 5I JUMP ; 5J GO ; 5K COM CALLPROG ERRLOG ERRJMP ; 5L GET MEMLOAD PRNLE ; ; FALSE EQU 0 TRUE EQU NOT FALSE ; ;*** TERMINAL AND 'TYPE' CUSTOMIZATION EQUATES ; KPRO2 EQU FALSE ;TRUE IF KAYPRO 2 OR OLD 4 KPRO10 EQU FALSE ;TRUE IF KAYPRO 10 NEW4 EQU false ;TRUE IF Nchard Conn ; RGF - Ron Fowler ; KBP - Keith Peterson ; FJW - Frank Wancho ; The following individual also provided a contribution: ; SBB - Steve Bogolub ; ; ;******** Structure Notes ******** ; ; This CPR is divided into a number of major sections. The following ; is an outline of these sections and the names of the major routines ; located therein. ; ; Section Function/Routines ; ------- ----------------- ; ; -- Opening Comments, Equates, and Macro Definitions ; ; 0 JMP TableTING USER COMMAND ; NUMBASE EQU 'H' ;CHARACTER USED TO SWITCH FROM DEFAULT ; NUMBER BASE ; SECTFLG EQU 'S' ;OPTION CHAR FOR SAVE COMMAND TO SAVE SECTORS ; ; OTHER CUSTOMIZATION EQUATES ; ; The following equates may be used to customize this CPR for the user's ; system and integration technique. The following constants are provided: ; ; REL - TRUE if integration is to be done via MOVCPM ; - FALSE if integration is to be done via DDT and SYSGEN ; ; BASE - Base Address oD ; MORROW COMPUTERS ; 4. We do not add to putsys etc because they also contain CP/M ; 5. THIS VERSION WILL PASS CONTROL CODES FROM CONSOLE ; TO SCREEN OR PRINTER...............................DmC. ; ; ; TITLE 'ZCPR Version 1.0' ; ; CP/M Z80 Command Processor Replacement (CPR) Version 1.0 ; CCPZ CREATED AND CUSTOMIZED FOR ARIES-II BY RLC ; FURTHER MODIFIED BY RGF AS V2.0 ; FURTHER MODIFIED BY RLC AS V2.1 ; FURTHER MODIFIED BY KBP AS V2.2 ; FURTHER MODIFIED BY RLC AS V2.4 (V2.3 skipped) ;EW KAYPRO 4 smallg equ true ;true if kaypro 62.5k cp/m 2.2g MORROW EQU FALSE ;TRUE IF MORROW MICRO DECISION H89 EQU FALSE ;TRUE IF HEATH/ZENITH-89 OTHER EQU FALSE ;TRUE IF NOT ONE OF THE ABOVE ; NLINES EQU 24 ;NUMBER OF LINES ON CRT SCREEN WIDE EQU TRUE ;TRUE IF WIDE DIR DISPLAY FENCE EQU '|' ;SEP CHAR BETWEEN DIR FILES ; SEMICO EQU true ;TRUE TO ALLOW SEMICOLON FOR DRIVE SELECT ; A; is the same as A: when logging on to ; New drive when true ; PGDFLT EQU TRUE ;SET TO FALSE  f user's CP/M system (normally 0 for DR version) ; This equate allows easy modification by non-standard CP/M(eg,H89) ; ; CPRLOC - Base Page Address of CPR; this value can be obtained by running ; the BDOSLOC program on your system, or by setting the ; MSIZE and BIOSEX equates to the system memory size in ; K-bytes and the "extra" memory required by your BIOS ; in K-bytes. BIOSEX is zero if your BIOS is normal size, ; and can be negative if your BIOS is in Pn option, but is not generally user-customiz- ; able. A basic design choice had to be made in the design of ZCPR concerning ; the execution of SUBMIT files. The original CCP had a problem in this sense ; in that it ALWAYS looked for the SUBMIT file from drive A: and the SUBMIT ; program itself (SUBMIT.COM) would place the $$$.SUB file on the currently ; logged-in drive, so when the user was logged into B: and he issued a SUBMIT ; command, the $$$.SUB was placed on B: and did not execute because the ENDIF ; IF H89 CPRLOC EQU 0CE00H ENDIF ; IF NEW4 CPRLOC EQU 0E000H ENDIF ; if smallg cprloc equ 0de00h endif ; IF MORROW CPRLOC EQU 0DC00H ENDIF ; IF OTHER CPRLOC EQU ????H ;FILL IN WITH BDOSLOC SUPPLIED VALUE ENDIF ; ; Note that you should only use one method or the other. ; Do NOT define CPRLOC twice! ; ; The following gives the required offset to load the CPR into the ; CP/M SYSGEN Image through DDT (the Roffset command); Note that this ; value conforms the choice for said drive. ; With this facility engaged as such, Indirect Command Files like: ; DIR ; A: ; DIR ; can be executed, even though the currently logged-in drive is changed ; during execution. If the $$$.SUB file was present on the currently ; logged-in drive, the above series of commands would not work since the ; ZCPR would be looking for $$$.SUB on the logged-in drive, and switching ; logged-in drives without moving the $$$.SUB file as well would cause ; processing to abort. ; ROM or in ; non-contiguous memory. ; ; RAS - Remote-Access System; setting this equate to TRUE disables ; certain CPR commands that are considered harmful in a Remote- ; Access environment; use under Remote-Access Systems (RBBS) for ; security purposes ; REL EQU FALSE ;SET TO TRUE FOR MOVCPM INTEGRATION ; BASE EQU 0 ;BASE OF CP/M SYSTEM (SET FOR STANDARD CP/M) ; IF REL CPRLOC EQU 0 ;MOVCPM IMAGE ELSE ; ; If REL is FALSE, the value of CPRLOC may be set in one ; of two wayCCP ; looked for it on A: and never found it. ; After much debate it was decided to have ZCPR perform the same type of ; function as CCP (look for the $$$.SUB file on A:), but the problem with ; SUBMIT.COM still exists. Hence, RGF designed SuperSUB and RLC took his ; SuperSUB and designed SUB from it; both programs are set up to allow the ; selection at assembly time of creating the $$$.SUB on the logged-in drive ; or on drive A:. ; A final definition of the Indirect Command File ($$$.SUB or SUBMITs with the standard value presented in the CP/M reference ; manuals, but it may not necessarily conform with the location of the ; CPR in YOUR CP/M system; several systems (Morrow Designs, P&T, Heath ; Org-0 to name a few) have the CPR located at a non-standard address in ; the SYSGEN Image ; CPRR EQU 0980H-CPRLOC ;DDT LOAD OFFSET ;CPRR EQU 0D00H-CPRLOC ;DDT LOAD OFFSET FOR MORROW DESIGNS ENDIF ; RAS EQU FALSE ;SET TO TRUE IF CPR IS FOR A REMOTE-ACCESS SYSTEM ; ; The following is presented as a SUBA equ FALSE ; Set to TRUE to have $$$.SUB always on A: ; Set to FALSE to have $$$.SUB on the logged-in drive ; ; The following flag enables extended processing for user-program supplied ; command lines. This is for Command Level 3 of ZCPR. Under the CCPZ Version ; 4.0 philosophy, three command levels exist: ; (1) that command issued by the user from his console at the '>' prompt ; (2) that command issued by a $$$.SUB file at the '$' prompt ; (3) that command issued by a user program by pls. The first way is to set MSIZE and BIOSEX ; as described above using the following three lines: ; ;MSIZE EQU 64 ;SIZE OF MEM IN K-BYTES ;BIOSEX EQU 0 ;EXTRA # K-BYTES IN BIOS ;CPRLOC EQU 3400H+(MSIZE-20-BIOSEX)*1024 ;CPR ORIGIN ; ; The second way is to obtain the origin of your current ; CPR using BDSLOC or its equivalent, then merely set CPRLOC ; to that value as as in the following line: ; IF KPRO2 CPRLOC EQU 0E400H ENDIF ; IF KPRO10 CPRLOC EQU 0D400H  ; File) is presented as follows: ; "An Indirect Command File is one which contains ; a series of commands exactly as they would be ; entered from a CP/M Console. The SUBMIT Command ; (or SUB Command) reads this files and transforms ; it for processing by the ZCPR (the $$$.SUB File). ; ZCPR will then execute the commands indicated ; EXACTLY as if they were typed at the Console." ; Hence, to permit this to happen, the $$$.SUB file must always ; be present on a specific drive, and A: i  acing the command into ; CIBUFF and setting the character count in CBUFF ; Setting CLEVEL3 to TRUE enables extended processing of the third level of ; ZCPR command. All the user program need do is to store the command line and ; set the character count; ZCPR will initialize the pointers properly, store ; the ending zero properly, and capitalize the command line for processing. ; Once the command line is properly stored, the user executes the command line ; by reentering the ZCPR through CPRLOC [NOIONS ; ; ;**** Section 0 **** ; ORG CPRLOC ; ; ENTRY POINTS INTO ZCPR ; If the ZCPR is entered at location CPRLOC (at the JMP to CPR), then ; the default command in CIBUFF will be processed. If the ZCPR is entered ; at location CPRLOC+3 (at the JMP to CPR1), then the default command in ; CIBUFF will NOT be processed. ; NOTE: Entry into ZCPR in this way is permitted under ZCPR Version 4.0, ; but in order for this to work, CIBUFF and CBUFF MUST be initialized properly ; AND the C regisLACEMENTS ; @GENDD MACRO ?DD ;;USED FOR CHECKING RANGE OF 8-BIT DISPLACEMENTS IF (?DD GT 7FH) AND (?DD LT 0FF80H) DB 100H ;Displacement Range Error on Jump Relative ELSE DB ?DD ENDIF ENDM ; ; ; Z80 MACRO EXTENSIONS ; JR MACRO ?N ;;JUMP RELATIVE DB 18H @GENDD ?N-$-1 ENDM ; JRC MACRO ?N ;;JUMP RELATIVE ON CARRY DB 38H @GENDD ?N-$-1 ENDM ; JRNC MACRO ?N ;;JUMP RELATIVE ON NO CARRY DB 30H @GENDD ?N-$-1 ENDM ; JRZ MACRO ?N ;;JUMP RELATIVE ON ZERO DB 28H @GENDD ?N-$-e command line to be executed is stored here. This command line ; is generated in one of three ways: ; (1) by the user entering it through the BDOS READLN function at ; the du> prompt [user input from keyboard] ; (2) by the SUBMIT File Facility placing it there from a $$$.SUB ; file ; (3) by an external program or user placing the required command ; into this buffer ; In all cases, the command line is placed into the buffer starting at ; CIBUFF. This command line is terminated by the last charaTE: The C register MUST contain ; a valid User/Disk Flag (see location 4) at this time.] ; CLEVEL3 equ TRUE ;ENABLE COMMAND LEVEL 3 PROCESSING ; ; END OF CUSTOMIZATION SECTION ; ; CR EQU 0DH LF EQU 0AH TAB EQU 09H ; WBOOT EQU BASE+0000H ;CP/M WARM BOOT ADDRESS UDFLAG EQU BASE+0004H ;USER NUM IN HIGH NYBBLE, DISK IN LOW BDOS EQU BASE+0005H ;BDOS FUNCTION CALL ENTRY PT TFCB EQU BASE+005CH ;DEFAULT FCB BUFFER TBUFF EQU BASE+0080H ;DEFAULT DISK I/O BUFFER TPA EQU BASE+0100H ;BASE OF TPAter MUST contain a valid User/Disk Flag (see Location 4: the ; most significant nybble contains the User Number and the least significant ; nybble contains the Disk Number). ; Some user programs (such as SYNONYM3) attempt to use the default ; command facility. Under the original CPR, it was necessary to initialize ; the pointer after the reserved space for the command buffer to point to ; the first byte of the command buffer. Under Version 4.x of ZCPR, this is ; no longer the case. The CIBPTR (1 ENDM ; JRNZ MACRO ?N ;;JUMP RELATIVE ON NO ZERO DB 20H @GENDD ?N-$-1 ENDM ; DJNZ MACRO ?N ;;DECREMENT B AND JUMP RELATIVE ON NO ZERO DB 10H @GENDD ?N-$-1 ENDM ; LDIR MACRO ;;LDIR DB 0EDH,0B0H ENDM ; LDED MACRO ?N ;;LOAD DE DIRECT DB 0EDH,05BH DW ?N ENDM ; LBCD MACRO ?N ;;LOAD BC DIRECT DB 0EDH,4BH DW ?N ENDM ; SDED MACRO ?N ;;STORE DE DIRECT DB 0EDH,53H DW ?N ENDM ; SBCD MACRO ?N ;;STORE BC DIRECT DB 0EDH,43H DW ?N ENDM ; ; END OF Z80 MACRO EXTENScter (NOT Carriage ; Return), and a character count of all characters in the command line ; up to and including the last character is placed into location CBUFF ; (immediately before the command line at CIBUFF). The placed command line ; is then parsed, interpreted, and the indicated command is executed. ; If CLEVEL3 is permitted, a terminating zero is placed after the command ; (otherwise the user program has to place this zero) and the CIBPTR is ; properly initialized (otherwise the user program h ; ; ; MACROS TO PROVIDE Z80 EXTENSIONS ; MACROS INCLUDE: ; $-MACRO ;FIRST TURN OFF THE EXPANSIONS ; ; JR - JUMP RELATIVE ; JRC - JUMP RELATIVE IF CARRY ; JRNC - JUMP RELATIVE IF NO CARRY ; JRZ - JUMP RELATIVE IF ZERO ; JRNZ - JUMP RELATIVE IF NO ZERO ; DJNZ - DECREMENT B AND JUMP RELATIVE IF NO ZERO ; LDIR - MOV @HL TO @DE FOR COUNT IN BC ; LXXD - LOAD DOUBLE REG DIRECT ; SXXD - STORE DOUBLE REG DIRECT ; ; ; ; @GENDD MACRO USED FOR CHECKING AND GENERATING ; 8-BIT JUMP RELATIVE DISPCommand Input Buffer PoinTeR) is located ; to be compatable with such programs (provided they determine the buffer ; length from the byte at MBUFF [CPRLOC + 6]), but under Version 4.x of ZCPR ; this is no longer necessary. ZCPR Version 4.x automatically initializes ; this buffer pointer in all cases. ; ENTRY: JMP CPR ; Process potential default command JMP CPR1 ; Do NOT process potential default command ; ;**** Section 1 **** ; BUFFERS ET AL ; ; INPUT COMMAND LINE AND DEFAULT COMMAND ; Th  as to init this ptr). ; If the command is placed by a user program, entering at CPRLOC is enough ; to have the command processed. Again, under CCPZ Version 4.0, it is not ; necessary to store the pointer to CIBUFF in CIBPTR; ZCPR will do this for ; the calling program if CLEVEL3 is made TRUE. ; WARNING: The command line must NOT exceed BUFLEN characters in length. ; For user programs which load this command, the value of BUFLEN can be ; obtained by examining the byte at MBUFF (CPRLOC + 6). ; BUESS DEFAULT COMMAND ; ; NOTE ON MODIFICATION BY RGF: BDOS RETURNS 0FFH IN ; ACCUMULATOR WHENEVER IT LOGS IN A DIRECTORY, IF ANY ; FILE NAME CONTAINS A '$' IN IT. THIS IS NOW USED AS ; A CLUE TO DETERMINE WHETHER OR NOT TO DO A SEARCH ; FOR SUBMIT FILE, IN ORDER TO ELIMINATE WASTEFUL SEARCHES. ; CPR: LXI SP,STACK ;RESET STACK PUSH B MOV A,C ;C=USER/DISK NUMBER (SEE LOC 4) RAR ;EXTRACT USER NUMBER RAR RAR RAR ANI 0FH MOV E,A ;SET USER NUMBER CALL SETUSR CALL RESET ;RESET DI FCBFT: DS 3 ;FILE TYPE DS 1 ;EXTENT NUMBER DS 2 ;S1 AND S2 DS 1 ;RECORD COUNT FCBDM: DS 16 ;DISK GROUP MAP FCBCR: DS 1 ;CURRENT RECORD NUMBER ; ; OTHER BUFFERS ; PAGCNT: DB NLINES-2 ;LINES LEFT ON PAGE CHRCNT: DB 0 ;CHAR COUNT FOR TYPE QMCNT: DB 0 ;QUESTION MARK COUNT FOR FCB TOKEN SCANNER ; ; CPR BUILT-IN COMMAND TABLE ; NCHARS EQU 4 ;NUMBER OF CHARS/COMMAND ; ; CPR COMMAND NAME TABLE ; EACH TABLE ENTRY IS COMPOSED OF THE 4-BYTE COMMAND AND 2-BYTE ADDRESS ; CMIF SUPPRESSING USR # REPORT FOR USR 0 ORA A JRZ RS000 ENDIF ; CPI 10 ;USER < 10? JRC RS00 SUI 10 ;SUBTRACT 10 FROM IT PUSH PSW ;SAVE IT MVI A,'1' ;OUTPUT 10'S DIGIT CALL CONOUT POP PSW RS00: ADI '0' ;OUTPUT 1'S DIGIT (CONVERT TO ASCII) CALL CONOUT ; ; READ INPUT LINE FROM USER OR $$$.SUB ; RS000: CALL REDBUF ;INPUT COMMAND LINE FROM USER (OR $$$.SUB) ; ; PROCESS INPUT LINE ; RS1: ; IF CLEVEL3 ;IF THIRD COMMAND LEVEL IS PERMITTED CALL CNVBUF ;CAPITALIZE COMMANFLEN EQU 80 ;MAXIMUM BUFFER LENGTH MBUFF: DB BUFLEN ;MAXIMUM BUFFER LENGTH CBUFF: DB 0 ;NUMBER OF VALID CHARS IN COMMAND LINE CIBUFF: DB ' ' ;DEFAULT (COLD BOOT) COMMAND CIBUF: DB 0 ;COMMAND STRING TERMINATOR DS BUFLEN-($-CIBUFF)+1 ;TOTAL IS 'BUFLEN' BYTES ; CIBPTR: DW CIBUFF ;POINTER TO COMMAND INPUT BUFFER CIPTR: DW CIBUF ;CURRENT POINTER ; DS 26 ;STACK AREA STACK EQU $ ;TOP OF STACK ; ; FILE TYPE FOR COMMAND ; COMMSG: DB 'COM' ; ; SUBMIT FILE CONTROSK SYSTEM STA RNGSUB ;SAVE SUBMIT CLUE FROM DRIVE A: POP B MOV A,C ;C=USER/DISK NUMBER (SEE LOC 4) ANI 0FH ;EXTRACT DEFAULT DISK DRIVE STA TDRIVE ;SET IT JRZ NOLOG ;SKIP IF 0...ALREADY LOGGED CALL LOGIN ;LOG IN DEFAULT DISK ; IF NOT SUBA ;IF $$$.SUB IS ON CURRENT DRIVE STA RNGSUB ;BDOS '$' CLUE ENDIF ; NOLOG: LXI D,SUBFCB ;CHECK FOR $$$.SUB ON CURRENT DISK RNGSUB EQU $+1 ;POINTER FOR IN-THE-CODE MODIFICATION MVI A,0 ;2ND BYTE (IMMEDIATE ARG) IS THE RNGSUB FLAG ORA A ;DTBL: DB 'DIR ' DW DIR DB 'LIST' DW LIST DB 'TYPE' DW TYPE DB 'USER' DW USER DB 'DFU ' DW DFU ; IF NOT RAS ;FOR NON-RAS DB 'GO ' DW GO DB 'ERA ' DW ERA DB 'SAVE' DW SAVE DB 'REN ' DW REN DB 'GET ' DW GET DB 'JUMP' DW JUMP ENDIF ; NCMNDS EQU ($-CMDTBL)/(NCHARS+2) ; ; ;**** Section 2 **** ; CPR STARTING POINTS ; ; START CPR AND DON'T PROCESS DEFAULT COMMAND STORED ; CPR1: XRA A ;SET NO DEFAULT COMMAND STA CBUFF ; ; START CPR AND POSSIBLY PROCD LINE, PLACE ENDING 0, ; AND SET CIBPTR VALUE ENDIF ; CALL DEFDMA ;SET TBUFF TO DMA ADDRESS CALL GETDRV ;GET DEFAULT DRIVE NUMBER STA TDRIVE ;SET IT CALL SCANER ;PARSE COMMAND NAME FROM COMMAND LINE CNZ ERROR ;ERROR IF COMMAND NAME CONTAINS A '?' LXI D,RSTCPR ;PUT RETURN ADDRESS OF COMMAND PUSH D ;ON THE STACK LDA TEMPDR ;IS COMMAND OF FORM 'D:COMMAND'? ORA A ;NZ=YES JNZ COM ; IMMEDIATELY CALL CMDSER ;SCAN FOR CPR-RESIDENT COMMAND JNZ COM ;NOT CPR-RESIDENT MOV AL BLOCK ; SUBFCB: IF SUBA ;IF $$$.SUB ON A: DB 1 ;DISK NAME SET TO DEFAULT TO DRIVE A: ENDIF ; IF NOT SUBA ;IF $$$.SUB ON CURRENT DRIVE DB 0 ;DISK NAME SET TO DEFAULT TO CURRENT DRIVE ENDIF ; DB '$$$' ;FILE NAME DB ' ' DB 'SUB' ;FILE TYPE DB 0 ;EXTENT NUMBER DB 0 ;S1 SUBFS2: DS 1 ;S2 SUBFRC: DS 1 ;RECORD COUNT DS 16 ;DISK GROUP MAP SUBFCR: DS 1 ;CURRENT RECORD NUMBER ; ; COMMAND FILE CONTROL BLOCK ; FCBDN: DS 1 ;DISK NAME FCBFN: DS 8 ;FILE NAME SET FLAGS ON CLUE CMA ;PREPARE FOR COMING 'CMA' CNZ SEAR1 CMA ;0FFH IS RETURNED IF NO $$$.SUB, SO COMPLEMENT STA RNGSUB ;SET FLAG (0=NO $$$.SUB) LDA CBUFF ;EXECUTE DEFAULT COMMAND? ORA A ;0=NO JRNZ RS1 ; ; PROMPT USER AND INPUT COMMAND LINE FROM HIM ; RESTRT: LXI SP,STACK ;RESET STACK ; ; PRINT PROMPT (DU>) ; CALL CRLF ;PRINT PROMPT CALL GETDRV ;CURRENT DRIVE IS PART OF PROMPT ADI 'A' ;CONVERT TO ASCII A-P CALL CONOUT CALL GETUSR ;GET USER NUMBER ; IF SUPRES ;  ,M ;FOUND IT: GET LOW-ORDER PART INX H ;GET HIGH-ORDER PART MOV H,M ;STORE HIGH MOV L,A ;STORE LOW PCHL ;EXECUTE CPR ROUTINE ; ; ENTRY POINT FOR RESTARTING CPR AND LOGGING IN DEFAULT DRIVE ; RSTCPR: CALL DLOGIN ;LOG IN DEFAULT DRIVE ; ; ENTRY POINT FOR RESTARTING CPR WITHOUT LOGGING IN DEFAULT DRIVE ; RCPRNL: CALL SCANER ;EXTRACT NEXT TOKEN FROM COMMAND LINE LDA FCBFN ;GET FIRST CHAR OF TOKEN SUI ' ' ;ANY CHAR? LXI H,TEMPDR ORA M JNZ ERROR JR RESTRT ; ; No File E ;SET ZERO FLAG FOR ERROR RETURN RET ; CLOSE: MVI C,10H JR GRBDOS ; SEARF: LXI D,FCBDN ;SPECIFY FCB SEAR1: MVI C,11H JR GRBDOS ; SEARN: MVI C,12H JR GRBDOS ; ; CHECK FOR SUBMIT FILE IN EXECUTION AND ABORT IT IF SO ; SUBKIL: LXI H,RNGSUB ;CHECK FOR SUBMIT FILE IN EXECUTION MOV A,M ORA A ;0=NO RZ MVI M,0 ;ABORT SUBMIT FILE LXI D,SUBFCB ;DELETE $$$.SUB ; DELETE: MVI C,13H JR BDOSJP ;SAVE MORE SPACE ; ; RESET USER NUMBER IF CHANGED ; RESETUSR: TMPUSR EQU $+1  POP B ORA A RET ; ; PRINT STRING (ENDING IN 0) PTED TO BY RET ADR;START WITH ; PRINTC: PUSH PSW ;SAVE FLAGS CALL CRLF ;NEW LINE POP PSW ; PRINT: XTHL ;GET PTR TO STRING PUSH PSW ;SAVE FLAGS CALL PRIN1 ;PRINT STRING POP PSW ;GET FLAGS XTHL ;RESTORE HL AND RET ADR RET ; ; PRINT STRING (ENDING IN 0) PTED TO BY HL ; PRIN1: MOV A,M ;GET NEXT BYTE CALL CONOUT ;PRINT CHAR MOV A,M ;GET NEXT BYTE AGAIN FOR TEST INX H ;PT TO NEXT BYTE ORA A ;SET FLAGS T COMMAND TO CPR ; This routine determines if a SUBMIT file is being processed ; and extracts the command line from it if so or from the user's console ; REDBUF: LDA RNGSUB ;SUBMIT FILE CURRENTLY IN EXECUTION? ORA A ;0=NO JRZ RB1 ;GET LINE FROM CONSOLE IF NOT LXI D,SUBFCB ;OPEN $$$.SUB PUSH D ;SAVE DE CALL OPEN POP D ;RESTORE DE JRZ RB1 ;ERASE $$$.SUB IF END OF FILE AND GET CMND LDA SUBFRC ;GET VALUE OF LAST RECORD IN FILE DCR A ;PT TO NEXT TO LAST RECORD STA SUBFCR ;SAVE rror Message ; PRNNF: CALL PRINTC ;NO FILE MESSAGE DB 'No File',80H RET ; ;**** Section 3 **** ; I/O UTILITIES ; ; OUTPUT CHAR IN REG A TO CONSOLE AND DON'T CHANGE BC ; ; ; OUTPUT ; CRLF: MVI A,CR CALL CONOUT MVI A,LF ;FALL THRU TO CONOUT ; CONOUT: PUSH B MVI C,02H OUTPUT: MOV E,A PUSH H CALL BDOS POP H POP B RET ; CONIN: MVI C,01H ;GET CHAR FROM CON: WITH ECHO CALL BDOSB JMP UCASE ;CAPITALIZE ; LCOUT: PUSH PSW ;OUTPUT CHAR TO CON: OR LST: DEP O;POINTER FOR IN-THE-CODE MODIFICATION MVI A,0 ;2ND BYTE (IMMEDIATE ARG) IS TMPUSR MOV E,A ;PLACE IN E JR SETUSR ;THEN GO SET USER GETUSR: MVI E,0FFH ;GET CURRENT USER NUMBER SETUSR: MVI C,20H ;SET USER NUMBER TO VALUE IN E (GET IF E=FFH) JR BDOSJP ;MORE SPACE SAVING ; ; END OF BDOS FUNCTIONS ; ; ;**** Section 4 **** ; CPR UTILITIES ; ; SET USER/DISK FLAG TO CURRENT USER AND DEFAULT DISK ; SETUD: CALL GETUSR ;GET NUMBER OF CURRENT USER ADD A ;PLACE IT IN HIGH NYBBLE ADD  RZ ;DONE IF ZERO RM ;DONE IF MSB SET JR PRIN1 ; ; BDOS FUNCTION ROUTINES ; ; ; RETURN NUMBER OF CURRENT DISK IN A ; GETDRV: MVI C,19H JR BDOSJP ; ; SET 80H AS DMA ADDRESS ; DEFDMA: LXI D,TBUFF ;80H=TBUFF DMASET: MVI C,1AH JR BDOSJP ; RESET: MVI C,0DH BDOSJP: JMP BDOS ; LOGIN: MOV E,A MVI C,0EH JR BDOSJP ;SAVE SOME CODE SPACE ; OPENF: XRA A STA FCBCR LXI D,FCBDN ;FALL THRU TO OPEN ; OPEN: MVI C,0FH ;FALL THRU TO GRBDOS ; GRBDOS: CALL BDOS INR ANEW VALUE OF LAST RECORD IN $$$.SUB CALL READ ;DE=SUBFCB JRNZ RB1 ;ABORT $$$.SUB IF ERROR IN READING LAST REC LXI D,CBUFF ;COPY LAST RECORD (NEXT SUBMIT CMND) TO CBUFF LXI H,TBUFF ; FROM TBUFF LXI B,BUFLEN ;NUMBER OF BYTES LDIR LXI H,SUBFS2 ;PT TO S2 OF $$$.SUB FCB MVI M,0 ;SET S2 TO ZERO INX H ;PT TO RECORD COUNT DCR M ;DECREMENT RECORD COUNT OF $$$.SUB LXI D,SUBFCB ;CLOSE $$$.SUB CALL CLOSE JRZ RB1 ;ABORT $$$.SUB IF ERROR MVI A,SPRMPT ;PRINT SUBMIT PROMPT CALL CONOUTN PRFLG PRFLG EQU $+1 ;POINTER FOR IN-THE-CODE MODIFICATION MVI A,0 ;2ND BYTE (IMMEDIATE ARG) IS THE PRINT FLAG ORA A ;0=TYPE JRZ LC1 POP PSW ;GET CHAR ; ; OUTPUT CHAR IN REG A TO LIST DEVICE ; LSTOUT: PUSH B MVI C,05H JR OUTPUT LC1: POP PSW ;GET CHAR PUSH PSW CALL CONOUT ;OUTPUT TO CON: POP PSW CPI LF ;CHECK FOR PAGING JZ PAGER RET ; READF: LXI D,FCBDN ;FALL THRU TO READ READ: MVI C,14H ;FALL THRU TO BDOSB ; ; CALL BDOS AND SAVE BC ; BDOSB: PUSH B CALL BDOS A ADD A ADD A LXI H,TDRIVE ;MASK IN DEFAULT DRIVE NUMBER (LOW NYBBLE) ORA M ;MASK IN STA UDFLAG ;SET USER/DISK NUMBER RET ; ; SET USER/DISK FLAG TO USER 0 AND DEFAULT DISK ; SETU0D: TDRIVE EQU $+1 ;POINTER FOR IN-THE-CODE MODIFICATION MVI A,0 ;2ND BYTE (IMMEDIATE ARG) IS TDRIVE STA UDFLAG ;SET USER/DISK NUMBER RET ; ; CONVERT CHAR IN A TO UPPER CASE ; UCASE: CPI 61H ;LOWER-CASE A RC CPI 7BH ;GREATER THAN LOWER-CASE Z? RNC ANI 5FH ;CAPITALIZE RET ; ; INPUT NEX   LXI H,CIBUFF ;PRINT COMMAND LINE FROM $$$.SUB CALL PRIN1 CALL BREAK ;CHECK FOR ABORT (ANY CHAR) ; IF CLEVEL3 ;IF THIRD COMMAND LEVEL IS PERMITTED RZ ;IF (NO ABORT), RETURN TO CALLER AND RUN ENDIF ; IF NOT CLEVEL3 ;IF THIRD COMMAND LEVEL IS NOT PERMITTED JRZ CNVBUF ;IF (NO ABORT), CAPITALIZE COMMAND ENDIF ; CALL SUBKIL ;KILL $$$.SUB IF ABORT JMP RESTRT ;RESTART CPR ; ; INPUT COMMAND LINE FROM USER CONSOLE ; RB1: CALL SUBKIL ;ERASE $$$.SUB IF PRESENT CALADVANCE INPUT PTR TO FIRST NON-BLANK AND FALL THROUGH TO SBLANK ; ADVAN: LDED CIBPTR ; ; SKIP STRING PTED TO BY DE (STRING ENDS IN 0) UNTIL END OF STRING ; OR NON-BLANK ENCOUNTERED (BEGINNING OF TOKEN) ; SBLANK: LDAX D ORA A RZ CPI ' ' RNZ INX D JR SBLANK ; ; ADD A TO HL (HL=HL+A) ; ADDAH: ADD L MOV L,A RNC INR H RET ; ; EXTRACT DECIMAL NUMBER FROM COMMAND LINE ; RETURN WITH VALUE IN REG A;ALL REGISTERS MAY BE AFFECTED ; NUMBER: CALL SCANER ;PARSE NUMBER AND  ; ; GET THE REQUESTED USER NUMBER FROM THE COMMAND LINE AND VALIDATE IT. ; USRNUM: CALL NUMBER CPI MAXUSR+1 RC ; ; INVALID COMMAND -- PRINT IT ; ERROR: CALL CRLF ;NEW LINE LHLD CIPTR ;PT TO BEGINNING OF COMMAND LINE ERR2: MOV A,M ;GET CHAR CPI 20H ;GET OUT OF LOOP IF SPACE JRZ ERR1 ORA A ; GET OUT OF LOOP IF 0 JRZ ERR1 PUSH H ;SAVE PTR TO ERROR COMMAND CHAR CALL CONOUT ;PRINT COMMAND CHAR POP H ;GET PTR INX H ;PT TO NEXT JR ERR2 ;CONTINUE ERR1: CALL PRINT DOWN ; ; RETURN FROM NUMBER ; NUM2: MOV A,C ;GET ACCUMULATED VALUE RET ; ; NUMBER ERROR ROUTINE FOR SPACE CONSERVATION ; NUMERR: JMP ERROR ;USE ERROR ROUTINE - THIS IS RELATIVE PT ; ; EXTRACT HEXADECIMAL NUMBER FROM COMMAND LINE ; RETURN WITH VALUE IN REG A; ALL REGISTERS MAY BE AFFECTED ; HEXNUM: CALL SCANER ;PARSE NUMBER AND PLACE IN FCBFN HNUM0: LXI H,FCBFN ;PT TO TOKEN FOR CONVERSION LXI D,0 ;DE=ACCUMULATED VALUE MVI B,11 ;B=CHAR COUNT HNUM1: MOV A,M ;GET CHAR L SETUD ;SET USER AND DISK MVI A,CPRMPT ;PRINT PROMPT CALL CONOUT MVI C,0AH ;READ COMMAND LINE FROM USER LXI D,MBUFF CALL BDOS ; IF CLEVEL3 ;IF THIRD COMMAND LEVEL IS PERMITTED JMP SETU0D ;SET CURRENT DISK NUMBER IN LOWER PARAMS ENDIF ; IF NOT CLEVEL3 ;IF THIRD COMMAND LEVEL IS NOT PERMITTED CALL SETU0D ;SET CURRENT DISK NUMBER IF LOWER PARAMS ; AND FALL THRU TO CNVBUF ENDIF ; ; CAPITALIZE STRING (ENDING IN 0) IN CBUFF AND SET PTR FOR PARSING ; CNVBUF: LXI H,CBUFF ;PPLACE IN FCBFN LXI H,FCBFN+10 ;PT TO END OF TOKEN FOR CONVERSION MVI B,11 ;11 CHARS MAX ; ; CHECK FOR SUFFIX FOR HEXADECIMAL NUMBER ; NUMS: MOV A,M ;GET CHARS FROM END, SEARCHING FOR SUFFIX DCX H ;BACK UP CPI ' ' ;SPACE? JRNZ NUMS1 ;CHECK FOR SUFFIX DJNZ NUMS ;COUNT DOWN JR NUM0 ;BY DEFAULT, PROCESS NUMS1: CPI NUMBASE ;CHECK AGAINST BASE SWITCH FLAG JRZ HNUM0 ; ; PROCESS DECIMAL NUMBER ; NUM0: LXI H,FCBFN ;PT TO BEGINNING OF TOKEN LXI B,1100H ;C=ACCUMULATED VALUE, ;PRINT '?' DB '?',80H CALL SUBKIL ;TERMINATE ACTIVE $$$.SUB IF ANY JMP RESTRT ;RESTART CPR ; ; CHECK TO SEE IF DE PTS TO DELIMITER; IF SO, RET W/ZERO FLAG SET ; SDELM: LDAX D ORA A ;0=DELIMITER RZ CPI ' ' ;ERROR IF < JRC ERROR RZ ;=DELIMITER CPI '=' ;'='=DELIMITER RZ CPI 5FH ;UNDERSCORE=DELIMITER RZ CPI '.' ;'.'=DELIMITER RZ CPI ':' ;':'=DELIMITER RZ CPI ';' ;';'=DELIMITER RZ CPI '<' ;'<'=DELIMITER RZ CPI '>' ;'>'=DELIMITER RET ; ; CPI ' ' ;DONE? JRZ HNUM3 ;RETURN IF SO CPI NUMBASE ;DONE IF NUMBASE SUFFIX JRZ HNUM3 SUI '0' ;CONVERT TO BINARY JRC NUMERR ;RETURN AND DONE IF ERROR CPI 10 ;0-9? JRC HNUM2 SUI 7 ;A-F? CPI 10H ;ERROR? JRNC NUMERR HNUM2: INX H ;PT TO NEXT CHAR MOV C,A ;DIGIT IN C MOV A,D ;GET ACCUMULATED VALUE RLC ;EXCHANGE NYBBLES RLC RLC RLC ANI 0F0H ;MASK OUT LOW NYBBLE MOV D,A MOV A,E ;SWITCH LOW-ORDER NYBBLES RLC RLC RLC RLC MOV E,A ;HIGH NYBBLE OF E=NEW T TO USER'S COMMAND MOV B,M ;CHAR COUNT IN B INR B ;ADD 1 IN CASE OF ZERO CB1: INX H ;PT TO 1ST VALID CHAR MOV A,M ;CAPITALIZE COMMAND CHAR CALL UCASE MOV M,A DJNZ CB1 ;CONTINUE TO END OF COMMAND LINE CB2: MVI M,0 ;STORE ENDING LXI H,CIBUFF ;SET COMMAND LINE PTR TO 1ST CHAR SHLD CIBPTR RET ; ; CHECK FOR ANY CHAR FROM USER CONSOLE;RET W/ZERO SET IF NONE ; BREAK: PUSH D ;SAVE DE MVI C,11 ;CSTS CHECK CALL BDOSB CNZ CONIN ;GET INPUT CHAR BRKBK: POP D RET  B=CHAR COUNT ; (C=0, B=11) NUM1: MOV A,M ;GET CHAR CPI ' ' ;DONE IF JRZ NUM2 INX H ;PT TO NEXT CHAR SUI '0' ;CONVERT TO BINARY (ASCII 0-9 TO BINARY) CPI 10 ;ERROR IF >= 10 JRNC NUMERR MOV D,A ;DIGIT IN D MOV A,C ;NEW VALUE = OLD VALUE * 10 RLC RLC RLC ADD C ;CHECK FOR RANGE ERROR JRC NUMERR ADD C ;CHECK FOR RANGE ERROR JRC NUMERR ADD D ;NEW VALUE = OLD VALUE * 10 + DIGIT JRC NUMERR ;CHECK FOR RANGE ERROR MOV C,A ;SET NEW VALUE DJNZ NUM1 ;COUNT  HIGH OF E, ; LOW NYBBLE OF E=NEW LOW OF D ANI 0FH ;GET NEW LOW OF D ORA D ;MASK IN HIGH OF D MOV D,A ;NEW HIGH BYTE IN D MOV A,E ANI 0F0H ;MASK OUT LOW OF E ORA C ;MASK IN NEW LOW MOV E,A ;NEW LOW BYTE IN E DJNZ HNUM1 ;COUNT DOWN ; ; RETURN FROM HEXNUM ; HNUM3: XCHG ;RETURNED VALUE IN HL MOV A,L ;LOW-ORDER BYTE IN A RET ; ; PT TO DIRECTORY ENTRY IN TBUFF WHOSE OFFSET IS SPECIFIED BY A AND C ; DIRPTR: LXI H,TBUFF ;PT TO TEMP BUFFER ADD C ;PT TO 1ST BYTE OF ACT FILENAME FROM POSSIBLE FILENAME.TYP ; SCAN4: XRA A ;A=0 STA QMCNT ;INIT COUNT OF NUMBER OF QUESTION MARKS IN FCB MVI B,8 ;MAX OF 8 CHARS IN FILE NAME CALL SCANF ;FILL FCB FILE NAME ; ; EXTRACT FILE TYPE FROM POSSIBLE FILENAME.TYP ; MVI B,3 ;PREPARE TO EXTRACT TYPE CPI '.' ;IF (DE) DELIMITER IS A '.', WE HAVE A TYPE JRNZ SCAN15 ;FILL FILE TYPE BYTES WITH INX D ;PT TO CHAR IN COMMAND LINE AFTER '.' CALL SCANF ;FILL FCB FILE TYPE JR SCAN16 ;SKIP TO NEXT PROCESSING SZERO FLAG IS RESET ; IF '?' IS IN TOKEN ; ; ENTRY POINTS: ; SCANER - LOAD TOKEN INTO FIRST FCB ; SCANX - LOAD TOKEN INTO FCB PTED TO BY HL ; SCANER: LXI H,FCBDN ;POINT TO FCBDN SCANX: XRA A ;SET TEMPORARY DRIVE NUMBER TO DEFAULT STA TEMPDR CALL ADVAN ;SKIP TO NON-BLANK OR END OF LINE SDED CIPTR ;SET PTR TO NON-BLANK OR END OF LINE LDAX D ;END OF LINE? ORA A ;0=YES JRZ SCAN2 SBI 'A'-1 ;CONVERT POSSIBLE DRIVE SPEC TO NUMBER MOV B,A ;STORE NUMBER (A:=0, B:=1, ETC) IN B CHECK FOR QUESTION MARK (WILD) CZ SCQ ;SCANNER COUNT QUESTION MARKS SCANF2: DJNZ SCANF ;DECREMENT CHAR COUNT UNTIL 8 ELAPSED SCANF3: CALL SDELM ;8 CHARS OR MORE - SKIP UNTIL DELIMITER RZ ;ZERO FLAG SET IF DELIMITER FOUND INX D ;PT TO NEXT CHAR IN COMMAND LINE JR SCANF3 ; ; FILL MEMORY POINTED TO BY HL WITH SPACES FOR B BYTES ; SCANF4: INX H ;PT TO NEXT BYTE IN FCBDN MVI M,' ' ;FILL FILENAME PART WITH DJNZ SCANF4 RET ; ; INCREMENT QUESTION MARK COUNT FOR SCANNER ; DIR ENTRY CALL ADDAH ;PT TO DESIRED BYTE IN DIR ENTRY MOV A,M ;GET DESIRED BYTE RET ; ; CHECK FOR SPECIFIED DRIVE AND LOG IT IN IF NOT DEFAULT ; SLOGIN: XRA A ;SET FCBDN FOR DEFAULT DRIVE STA FCBDN CALL COMLOG ;CHECK DRIVE RZ JR DLOG5 ;DO LOGIN OTHERWISE ; ; CHECK FOR SPECIFIED DRIVE AND LOG IN DEFAULT DRIVE IF SPECIFIED<>DEFAULT ; DLOGIN: CALL COMLOG ;CHECK DRIVE RZ ;ABORT IF SAME LDA TDRIVE ;LOG IN DEFAULT DRIVE ; DLOG5: JMP LOGIN ; ; ROUTINE COMMON TO BOTH LOGINCAN15: CALL SCANF4 ;SPACE FILL ; ; FILL IN EX, S1, S2, AND RC WITH ZEROES ; SCAN16: MVI B,4 ;4 BYTES SCAN17: INX H ;PT TO NEXT BYTE IN FCBDN MVI M,0 DJNZ SCAN17 ; ; SCAN COMPLETE -- DE PTS TO DELIMITER BYTE AFTER TOKEN ; SDED CIBPTR ; ; SET ZERO FLAG TO INDICATE PRESENCE OF '?' IN FILENAME.TYP ; LDA QMCNT ;GET NUMBER OF QUESTION MARKS ORA A ;SET ZERO FLAG TO INDICATE ANY '?' RET ; ; SCANF -- SCAN TOKEN PTED TO BY DE FOR A MAX OF B BYTES; PLACE IT INTO ; FILE NAME FIE INX D ;PT TO NEXT CHAR LDAX D ;SEE IF IT IS A COLON (:) CPI ':' JRZ SCAN3 ;YES, WE HAVE A DRIVE SPEC ; IF SEMICO CPI ';' ;NOW TRY A SEMICOLON JRZ SCAN3 ;YES, WE HAVE A DRIVE SPEC ENDIF ; DCX D ;NO, BACK UP PTR TO FIRST NON-BLANK CHAR SCAN2: LDA TDRIVE ;SET 1ST BYTE OF FCBDN AS DEFAULT DRIVE MOV M,A JR SCAN4 SCAN3: MOV A,B ;WE HAVE A DRIVE SPEC STA TEMPDR ;SET TEMPORARY DRIVE MOV M,B ;SET 1ST BYTE OF FCBDN AS SPECIFIED DRIVE INX D ;PT TO BYTE AFTER ':' ; ; EXTR THIS ROUTINE INCREMENTS THE COUNT OF THE NUMBER OF QUESTION MARKS IN ; THE CURRENT FCB ENTRY ; SCQ: LDA QMCNT ;GET COUNT INR A ;INCREMENT STA QMCNT ;PUT COUNT RET ; ; CMDTBL (COMMAND TABLE) SCANNER ; ON RETURN, HL PTS TO ADDRESS OF COMMAND IF CPR-RESIDENT ; ON RETURN, ZERO FLAG SET MEANS CPR-RESIDENT COMMAND ; CMDSER: LXI H,CMDTBL ;PT TO COMMAND TABLE MVI C,NCMNDS ;SET COMMAND COUNTER CMS1: LXI D,FCBFN ;PT TO STORED COMMAND NAME MVI B,NCHARS ;NUMBER OF CHARS/COMMAND ( ROUTINES; ON EXIT, Z SET MEANS ABORT ; COMLOG: TEMPDR EQU $+1 ;POINTER FOR IN-THE-CODE MODIFICATION MVI A,0 ;2ND BYTE (IMMEDIATE ARG) IS TEMPDR ORA A ;0=NO RZ DCR A ;COMPARE IT AGAINST DEFAULT LXI H,TDRIVE CMP M RET ;ABORT IF SAME ; ; EXTRACT TOKEN FROM COMMAND LINE AND PLACE IT INTO FCBDN; ; FORMAT FCBDN FCB IF TOKEN RESEMBLES FILE NAME AND TYPE (FILENAME.TYP); ; ON INPUT, CIBPTR PTS TO CHAR AT WHICH TO START SCAN; ; ON OUTPUT, CIBPTR PTS TO CHAR AT WHICH TO CONTINUE AND LD PTED TO BY HL; EXPAND AND INTERPRET WILD CARDS OF ; '*' AND '?'; ON EXIT, DE PTS TO TERMINATING DELIMITER ; SCANF: CALL SDELM ;DONE IF DELIMITER ENCOUNTERED - FILL JRZ SCANF4 INX H ;PT TO NEXT BYTE IN FCBDN CPI '*' ;IS (DE) A WILD CARD? JRNZ SCANF1 ;CONTINUE IF NOT MVI M,'?' ;PLACE '?' IN FCBDN AND DON'T ADVANCE DE IF SO CALL SCQ ;SCANNER COUNT QUESTION MARKS JR SCANF2 SCANF1: MOV M,A ;STORE FILENAME CHAR IN FCBDN INX D ;PT TO NEXT CHAR IN COMMAND LINE CPI '?' ;  8 MAX) CMS2: LDAX D ;COMPARE AGAINST TABLE ENTRY CMP M JRNZ CMS3 ;NO MATCH INX D ;PT TO NEXT CHAR INX H DJNZ CMS2 ;COUNT DOWN LDAX D ;NEXT CHAR IN INPUT COMMAND MUST BE CPI ' ' JRNZ CMS4 RET ;COMMAND IS CPR-RESIDENT (ZERO FLAG SET) CMS3: INX H ;SKIP TO NEXT COMMAND TABLE ENTRY DJNZ CMS3 CMS4: INX H ;SKIP ADDRESS INX H DCR C ;DECREMENT TABLE ENTRY NUMBER JRNZ CMS1 INR C ;CLEAR ZERO FLAG RET ;COMMAND IS DISK-RESIDENT (ZERO FLAG CLEAR) ; ;**** Section  IF 4 ENTRIES PRINTED IN LINE PUSH PSW JRNZ DIR4 CALL CRLF ;NEW LINE JR DIR5 DIR4: CALL PRINT ; IF WIDE DB ' ' ;2 SPACES DB FENCE ;THEN FENCE CHAR DB ' ',80H ;THEN 2 MORE SPACES ENDIF ; IF NOT WIDE DB ' ' ;SPACE DB FENCE ;THEN FENCE CHAR DB 80H ;THEN SPACE ENDIF ; DIR5: MVI B,01H ;PT TO 1ST BYTE OF FILE NAME DIR6: MOV A,B ;A=OFFSET CALL DIRPTR ;HL NOW PTS TO 1ST BYTE OF FILE NAME ANI 7FH ;MASK OUT MSB CPI ' ' ;NO FILE NAME? JRNZ DIR8 ;PRINTRPR TO PRINT DIRECTORY ; THEN RESTART CPR ; ; DIRECTORY PRINT ROUTINE; ON ENTRY, MSB OF A IS 1 (80H) IF SYSTEM FILES EXCL ; DIRPR: MOV D,A ;STORE SYSTEM FLAG IN D MVI E,0 ;SET COLUMN COUNTER TO ZERO PUSH D ;SAVE COLUMN COUNTER (E) AND SYSTEM FLAG (D) MOV A,B ;SYS ONLY SPECIFIER STA SYSTST CALL SEARF ;SEARCH FOR SPECIFIED FILE (FIRST OCCURRANCE) CZ PRNNF ;PRINT NO FILE MSG;REG A NOT CHANGED ; ; ENTRY SELECTION LOOP; ON ENTRY, A=OFFSET FROM SEARF OR SEARN ; DIR3: JRZ DIR11 L SCANER ;PARSE FILE SPECIFICATION CPI 11 ;ALL WILD (ALL FILES = 11 '?')? JRNZ ERA1 ;IF NOT, THEN DO ERASES CALL PRINTC DB 'All?',80H CALL CONIN ;GET REPLY CPI 'Y' ;YES? JNZ RESTRT ;RESTART CPR IF NOT CALL CRLF ;NEW LINE ERA1: CALL SLOGIN ;LOG IN SELECTED DISK IF ANY XRA A ;PRINT ALL FILES (EXAMINE SYSTEM BIT) MOV B,A ;NO SYS-ONLY OPT TO DIRPR CALL DIRPR ;PRINT DIRECTORY OF ERASED FILES LXI D,FCBDN ;DELETE FILE SPECIFIED CALL DELETE RET ;REENTER CPR ; ENDIF 5 **** ; CPR-Resident Commands ; ; ;Section 5A ;Command: DIR ;Function: To display a directory of the files on disk ;Forms: ; DIR Displays the DIR files ; DIR S Displays the SYS files ; DIR A Display both DIR and SYS files ; DIR: MVI A,80H ;SET SYSTEM BIT EXAMINATION PUSH PSW CALL SCANER ;EXTRACT POSSIBLE D:FILENAME.TYP TOKEN CALL SLOGIN ;LOG IN DRIVE IF NECESSARY LXI H,FCBFN ;MAKE FCB WILD (ALL '?') IF NO FILENAME.TYP MOV A,M ;GET FIRST CHAR OF FILENAME.TYP  FILE NAME IF PRESENT POP PSW PUSH PSW CPI 03H JRNZ DIR7 MVI A,09H ;PT TO 1ST BYTE OF FILE TYPE CALL DIRPTR ;HL NOW PTS TO 1ST BYTE OF FILE TYPE ANI 7FH ;MASK OUT MSB CPI ' ' ;NO FILE TYPE? JRZ DIR9 ;CONTINUE IF SO DIR7: MVI A,' ' ;OUTPUT DIR8: CALL CONOUT ;PRINT CHAR INR B ;INCR CHAR COUNT MOV A,B CPI 12 ;END OF FILENAME.TYP? JRNC DIR9 ;CONTINUE IF SO CPI 09H ;END IF FILENAME ONLY? JRNZ DIR6 ;PRINT TYP IF SO MVI A,'.' ;PRINT DOT BETWEEN FILE NAME AND ;DONE IF ZERO FLAG SET DCR A ;ADJUST TO RETURNED VALUE RRC ;CONVERT NUMBER TO OFFSET INTO TBUFF RRC RRC ANI 60H MOV C,A ;OFFSET INTO TBUFF IN C (C=OFFSET TO ENTRY) MVI A,10 ;ADD 10 TO PT TO SYSTEM FILE ATTRIBUTE BIT CALL DIRPTR POP D ;GET SYSTEM BIT MASK FROM D PUSH D ANA D ;MASK FOR SYSTEM BIT SYSTST EQU $+1 ;POINTER TO IN-THE-CODE BUFFER SYSTST CPI 0 JRNZ DIR10 POP D ;GET ENTRY COUNT (= COUNTER) MOV A,E ;ADD 1 TO IT INR E PUSH D ;SAVE IT ANI 03H ;OUTPUT;RAS ; ;Section 5C ;Command: LIST ;Function: Print out specified file on the LST: Device ;Forms: ; LIST Print file (NO Paging) ; LIST: MVI A,0FFH ;TURN ON PRINTER FLAG JR TYPE0 ; ;Section 5D ;Command: TYPE ;Function: Print out specified file on the CON: Device ;Forms: ; TYPE Print file ; TYPE P Print file with paging flag ; TYPE: XRA A ;TURN OFF PRINTER FLAG ; ; ENTRY POINT FOR CPR LIST FUNCTION (LIST) ; TYPE0: STA PRFLG ;SET FLAG CALL SCANER ;EXTRACT  CPI ' ' ;IF , ALL WILD CZ FILLQ CALL ADVAN ;LOOK AT NEXT INPUT CHAR MVI B,0 ;SYS TOKEN DEFAULT JRZ DIR2 ;JUMP; THERE ISN'T ONE CPI SYSFLG ;SYSTEM FLAG SPECIFIER? JRZ GOTSYS ;GOT SYSTEM SPECIFIER CPI SOFLG ;SYS ONLY? JRNZ DIR2 MVI B,80H ;FLAG SYS ONLY GOTSYS: INX D SDED CIBPTR CPI SOFLG ;SYS ONLY SPEC? JRZ DIR2 ;THEN LEAVE BIT SPEC UNCHAGNED POP PSW ;GET FLAG XRA A ;SET NO SYSTEM BIT EXAMINATION PUSH PSW DIR2: POP PSW ;GET FLAG DIR2A: ;DROP INTO DITYPE CALL CONOUT JR DIR6 DIR9: POP PSW DIR10: CALL BREAK ;CHECK FOR ABORT JRNZ DIR11 CALL SEARN ;SEARCH FOR NEXT FILE JR DIR3 ;CONTINUE DIR11: POP D ;RESTORE STACK RET ; ; FILL FCB @HL WITH '?' ; FILLQ: MVI B,11 ;NUMBER OF CHARS IN FN & FT FQLP: MVI M,'?' ;STORE '?' INX H DJNZ FQLP RET ; ;Section 5B ;Command: ERA ;Function: Erase files ;Forms: ; ERA Erase Specified files and print their names ; IF NOT RAS ;NOT FOR REMOTE-ACCESS SYSTEM ; ERA: CAL  FILENAME.TYP TOKEN JNZ ERROR ;ERROR IF ANY QUESTION MARKS CALL ADVAN ;GET PGDFLG IF IT'S THERE STA PGFLG ;SAVE IT AS A FLAG JRZ NOSLAS ;JUMP IF INPUT ENDED INX D ;PUT NEW BUF POINTER XCHG SHLD CIBPTR NOSLAS: CALL SLOGIN ;LOG IN SELECTED DISK IF ANY CALL OPENF ;OPEN SELECTED FILE JZ TYPE4 ;ABORT IF ERROR CALL CRLF ;NEW LINE MVI A,NLINES-1 ;SET LINE COUNT STA PAGCNT LXI H,CHRCNT ;SET CHAR POSITION/COUNT MVI M,0FFH ;EMPTY LINE MVI B,0 ;SET TAB CHAR COUNTER TYPE1:  Sectors> S ; Like SAVE above, but numeric argument specifies ; number of sectors rather than pages ; IF NOT RAS ;NOT FOR REMOTE-ACCESS SYSTEM ; SAVE: CALL NUMBER ;EXTRACT NUMBER FROM COMMAND LINE MOV L,A ;HL=PAGE COUNT MVI H,0 PUSH H ;SAVE PAGE COUNT CALL EXTEST ;TEST FOR EXISTENCE OF FILE AND ABORT IF SO MVI C,16H ;BDOS MAKE FILE CALL GRBDOS POP H ;GET PAGE COUNT JRZ SAVE3 ;ERROR? XRA A ;SET RECORD COUNT FIELD OF NEW FILE'S FCB STA FCBCR CALL ADVAN ;LOO? RZ ;RESTART CPR TYPE4: JMP ERRLOG ; ; PAGING ROUTINES ; PAGER COUNTS DOWN LINES AND PAUSES FOR INPUT (DIRECT) IF COUNT EXPIRES ; PAGSET SETS LINES/PAGE COUNT ; PAGER: PUSH H LXI H,PAGCNT ;COUNT DOWN DCR M JRNZ PGBAK ;JUMP IF NOT END OF PAGE MVI M,NLINES-2 ;REFILL COUNTER ; PGFLG EQU $+1 ;POINTER TO IN-THE-CODE BUFFER PGFLG MVI A,0 ;0 MAY BE CHANGED BY PGFLG EQUATE CPI PGDFLG ;PAGE DEFAULT OVERRIDE OPTION WANTED? ; IF PGDFLT ;IF PAGING IS DEFAULT JRZ PGBAK ; PGDd abort if he ; choses not to ; EXTEST: CALL SCANER ;EXTRACT FILE NAME JNZ ERROR ;'?' IS NOT PERMITTED CALL SLOGIN ;LOG IN SELECTED DISK CALL SEARF ;LOOK FOR SPECIFIED FILE LXI D,FCBDN ;PT TO FILE FCB RZ ;OK IF NOT FOUND PUSH D ;SAVE PTR TO FCB CALL PRINTC DB 'Delete File?',80H CALL CONIN ;GET RESPONSE POP D ;GET PTR TO FCB CPI 'Y' ;KEY ON YES JNZ RSTCPR ;RESTART IF NO PUSH D ;SAVE PTR TO FCB CALL DELETE ;DELETE FILE POP D ;GET PTR TO FCB RET ; ENDIF LXI H,CHRCNT ;PT TO CHAR POSITION/COUNT MOV A,M ;END OF BUFFER? CPI 80H JRC TYPE2 PUSH H ;READ NEXT BLOCK CALL READF POP H JRNZ TYPE3 ;ERROR? XRA A ;RESET COUNT MOV M,A TYPE2: INR M ;INCREMENT CHAR COUNT LXI H,TBUFF ;PT TO BUFFER CALL ADDAH ;COMPUTE ADDRESS OF NEXT CHAR FROM OFFSET MOV A,M ;GET NEXT CHAR ANI 7FH ;MASK OUT MSB CPI 1AH ;END OF FILE (^Z)? RZ ;RESTART CPR IF SO ; ; OUTPUT CHAR TO CON: OR LST: DEVICE WITH TABULATION ; CPI CR ;RESET TAB COUNT? K FOR 'S' FOR SECTOR OPTION INX D ;PT TO AFTER 'S' TOKEN CPI SECTFLG JRZ SAVE0 DCX D ;NO 'S' TOKEN, SO BACK UP DAD H ;DOUBLE IT FOR HL=SECTOR (128 BYTES) COUNT SAVE0: SDED CIBPTR ;SET PTR TO BAD TOKEN OR AFTER GOOD TOKEN LXI D,TPA ;PT TO START OF SAVE AREA (TPA) SAVE1: MOV A,H ;DONE WITH SAVE? ORA L ;HL=0 IF SO JRZ SAVE2 DCX H ;COUNT DOWN ON SECTORS PUSH H ;SAVE PTR TO BLOCK TO SAVE LXI H,128 ;128 BYTES PER SECTOR DAD D ;PT TO NEXT SECTOR PUSH H ;SAVE ON STACK CFLG MEANS NO PAGING, PLEASE ELSE ;IF PAGING NOT DEFAULT JRNZ PGBAK ; PGDFLG MEANS PLEASE PAGINATE ENDIF ; CALL CONIN ;GET CHAR TO CONTINUE CPI 'C'-'@' ;^C JZ RSTCPR ;RESTART CPR PGBAK: POP H ;RESTORE HL RET ; ;Section 5E ;Command: SAVE ;Function: To save the contents of the TPA onto disk as a file ;Forms: ; SAVE ; Save specified number of pages (start at 100H) ; from TPA into specified file; is in DEC ; SAVE = Perform function ; IF NOT RAS ;NOT FOR REMOTE-ACCESS SYSTEM ; REN: CALL EXTEST ;TEST FOR FILE EXISTENCE AND RETURN ; IF FILE DOESN'T EXIST; ABORT IF IT DOES LDA TEMPDR ;SAVE CURRENT DEFAULT DISK PUSH PSW ;SAVE ON STACK REN0: LXI H,FCBDN ;SAVE NEW FILE NAME LXI D,FCBDM LXI B,16 ;16 BYTES LDIR CALL ADVAN ;ADVANCE CIBPTR CPI '=' ;'=' OK JRNZ REN4 RJRZ TABRST CPI LF ;RESET TAB COUNT? JRZ TABRST CPI TAB ;TAB? JRZ LTAB CALL LCOUT ;OUTPUT CHAR INR B ;INCREMENT CHAR COUNT JR TYPE2L TABRST: CALL LCOUT ;OUTPUT OR MVI B,0 ;RESET TAB COUNTER JR TYPE2L LTAB: MVI A,' ' ; CALL LCOUT INR B ;INCR POS COUNT MOV A,B ANI 7 JRNZ LTAB ; ; CONTINUE PROCESSING ; TYPE2L: CALL BREAK ;CHECK FOR ABORT JRZ TYPE1 ;CONTINUE IF NO CHAR CPI 'C'-'@' ;^C? RZ ;RESTART IF SO JR TYPE1 TYPE3: DCR A ;NO ERRORALL DMASET ;SET DMA ADDRESS FOR WRITE (ADDRESS IN DE) LXI D,FCBDN ;WRITE SECTOR MVI C,15H ;BDOS WRITE SECTOR CALL BDOSB ;SAVE BC POP D ;GET PTR TO NEXT SECTOR IN DE POP H ;GET SECTOR COUNT JRNZ SAVE3 ;WRITE ERROR? JR SAVE1 ;CONTINUE SAVE2: LXI D,FCBDN ;CLOSE SAVED FILE CALL CLOSE INR A ;ERROR? JRNZ SAVE4 SAVE3: CALL PRNLE ;PRINT 'NO SPACE' ERROR SAVE4: CALL DEFDMA ;SET DMA TO 0080 RET ;RESTART CPR ; ; Test File in FCB for existence, ask user to delete if so, an  EN1: XCHG ;PT TO CHAR AFTER '=' IN HL INX H SHLD CIBPTR ;SAVE PTR TO OLD FILE NAME CALL SCANER ;EXTRACT FILENAME.TYP TOKEN JRNZ REN4 ;ERROR IF ANY '?' POP PSW ;GET OLD DEFAULT DRIVE MOV B,A ;SAVE IT LXI H,TEMPDR ;COMPARE IT AGAINST CURRENT DEFAULT DRIVE MOV A,M ;MATCH? ORA A JRZ REN2 CMP B ;CHECK FOR DRIVE ERROR MOV M,B JRNZ REN4 REN2: MOV M,B XRA A STA FCBDN ;SET DEFAULT DRIVE LXI D,FCBDN ;RENAME FILE MVI C,17H ;BDOS RENAME FCT CALL GRBDOS RNZ REN3:  CPI ' ' JNZ ERROR LXI H,COMMSG ;PLACE DEFAULT FILE TYPE (COM) INTO FCB LXI D,FCBFT ;COPY INTO FILE TYPE LXI B,3 ;3 BYTES LDIR LXI H,TPA ;SET EXECUTION/LOAD ADDRESS PUSH H ;SAVE FOR EXECUTION CALL MEMLOAD ;LOAD MEMORY WITH FILE SPECIFIED IN CMD LINE POP H ;GET EXECUTION ADDRESS RNZ ;RETURN (ABORT) IF LOAD ERROR ; ; CALLPROG IS THE ENTRY POINT FOR THE EXECUTION OF THE LOADED ; PROGRAM;ON ENTRY TO THIS ROUTINE, HL MUST CONTAIN THE EXECUTION ; ADDRESS OF THE PROGRAM (SUBROUTn 5J ;Command: GO ;Function: To Call the program in the TPA without loading ; loading from disk. Same as JUMP 100H, but much ; more convenient, especially when used with ; parameters for programs like STAT. Also can be ; allowed on remote-access systems with no problems. ; ;Form: ; GO ; IF NOT RAS ;ONLY IF RAS ; GO: LXI H,TPA ;Always to TPA JR CALLPROG ;Perform call ; ENDIF ;END OF GO FOR RAS ; ;Section 5K ;Command: COM file procesLF ;NEW LINE CALL DEFDMA ;SET DMA TO 0080 CALL SETUD ;SET USER/DISK ; ; EXECUTION (CALL) OF PROGRAM (SUBROUTINE) OCCURS HERE ; EXECADR EQU $+1 ;CHANGE ADDRESS FOR IN-LINE CODE MODIFICATION CALL TPA ;CALL TRANSIENT CALL DEFDMA ;SET DMA TO 0080, IN CASE ;PROG CHANGED IT ON US CALL SETU0D ;SET USER 0/DISK CALL LOGIN ;LOGIN DISK JMP RESTRT ;RESTART CPR ; ; TRANSIENT LOAD ERROR ; COM8: POP H ;CLEAR RETURN ADDRESS CALL RESETUSR ;RESET CURRENT USER NUMBER ; RESET MUST CALL PRNNF ;PRINT NO FILE MSG REN4: JMP ERRLOG ; ENDIF ;RAS ; ;Section 5G ;Command: USER ;Function: Change current USER number ;Forms: ; USER Select specified user number; is in DEC ; USER: CALL USRNUM ;EXTRACT USER NUMBER FROM COMMAND LINE MOV E,A ;PLACE USER NUMBER IN E CALL SETUSR ;SET SPECIFIED USER RSTJMP: JMP RCPRNL ;RESTART CPR ; ;Section 5H ;Command: DFU ;Function: Set the Default User Number for the command/file scanner ; (MEMLOAD) ;Forms: ;INE) TO EXECUTE ; CALLPROG: SHLD EXECADR ;PERFORM IN-LINE CODE MODIFICATION CALL DLOGIN ;LOG IN DEFAULT DRIVE CALL SCANER ;SEARCH COMMAND LINE FOR NEXT TOKEN LXI H,TEMPDR ;SAVE PTR TO DRIVE SPEC PUSH H MOV A,M ;SET DRIVE SPEC STA FCBDN LXI H,FCBDN+10H ;PT TO 2ND FILE NAME CALL SCANX ;SCAN FOR IT AND LOAD IT INTO FCBDN+16 POP H ;SET UP DRIVE SPECS MOV A,M STA FCBDM XRA A STA FCBCR LXI D,TFCB ;COPY TO DEFAULT FCB LXI H,FCBDN ;FROM FCBDN LXI B,33 ;SET UP DEFAULT FCBsing ;Function: To load the specified COM file from disk and execute it ;Forms: ; ; COM: LDA FCBFN ;ANY COMMAND? CPI ' ' ;' ' MEANS COMMAND WAS 'D:' TO SWITCH JRNZ COM1 ;NOT , SO MUST BE TRANSIENT OR ERROR LDA TEMPDR ;LOOK FOR DRIVE SPEC ORA A ;IF ZERO, JUST BLANK JZ RCPRNL DCR A ;ADJUST FOR LOG IN STA TDRIVE ;SET DEFAULT DRIVE CALL SETU0D ;SET DRIVE WITH USER 0 CALL LOGIN ;LOG IN DRIVE JMP RCPRNL ;RESTART CPR COM1: LDA FCBFT ;FILE TYPE MUST BE BLANK  BE DONE BEFORE LOGIN ERRLOG: CALL DLOGIN ;LOG IN DEFAULT DISK ERRJMP: JMP ERROR ; ;Section 5L ;Command: GET ;Function: To load the specified file from disk to the specified address ;Forms: ; GET Load the specified file at the specified page; ; is in HEX ; IF NOT RAS ;NOT FOR REMOTE-ACCESS SYSTEM ; GET: CALL HEXNUM ;GET LOAD ADDRESS IN HL PUSH H ;SAVE ADDRESS CALL SCANER ;GET FILE NAME POP H ;RESTORE ADDRESS JRNZ ERRJMP ;MUST BE UNAMBIGUOUS ; ; FALL  DFU Select Default User Number; is in DEC ; DFU: CALL USRNUM ;GET USER NUMBER STA DFUSR ;PUT IT AWAY JR RSTJMP ;RESTART CPR (NO DEFAULT LOGIN) ; ;Section 5I ;Command: JUMP ;Function: To Call the program (subroutine) at the specified address ; without loading from disk ;Forms: ; JUMP Call at ; is in HEX ; IF NOT RAS ;NOT FOR REMOTE-ACCESS SYSTEM ; JUMP: CALL HEXNUM ;GET LOAD ADDRESS IN HL JR CALLPROG ;PERFORM CALL ; ENDIF ;RAS ; ;Sectio LDIR LXI H,CIBUFF COM4: MOV A,M ;SKIP TO END OF 2ND FILE NAME ORA A ;END OF LINE? JRZ COM5 CPI ' ' ;END OF TOKEN? JRZ COM5 INX H JR COM4 ; ; LOAD COMMAND LINE INTO TBUFF ; COM5: MVI B,0 ;SET CHAR COUNT LXI D,TBUFF+1 ;PT TO CHAR POS COM6: MOV A,M ;COPY COMMAND LINE TO TBUFF STAX D ORA A ;DONE IF ZERO JRZ COM7 INR B ;INCR CHAR COUNT INX H ;PT TO NEXT INX D JR COM6 ; ; RUN LOADED TRANSIENT PROGRAM ; COM7: MOV A,B ;SAVE CHAR COUNT STA TBUFF CALL CR  THRU TO MEMLOAD ; ENDIF ;RAS ; ; LOAD MEMORY WITH THE FILE WHOSE NAME IS SPECIFIED IN THE COMMAND LINE ; ON INPUT, HL CONTAINS STARTING ADDRESS TO LOAD ; MEMLOAD: CALL MLOAD ;USER MEMORY LOAD SUBROUTINE PUSH PSW ;SAVE RETURN STATUS CALL RESETUSR ;RESET USER NUMBER POP PSW ;GET RETURN STATUS RET ; ; MEMORY LOAD SUBROUTINE ; EXIT POINTS ARE A SIMPLE RETURN WITH THE ZERO FLAG SET IF NO ERROR, ; A SIMPLE RETURN WITH THE ZERO FLAG RESET (NZ) IF MEMORY FULL, OR A JMP TO ; COM8 IF : MVI M,1 ;SELECT DRIVE A: JR MLA ; ; FILE FOUND -- PROCEED WITH LOAD ; MLA1: LOADADR EQU $+1 ;MEMORY LOAD ADDRESS (IN-LINE CODE MOD) LXI H,TPA ;SET START ADDRESS OF MEMORY LOAD ML2: MVI A,ENTRY/256-1 ;GET HIGH-ORDER ADR OF JUST BELOW CPR CMP H ;ARE WE GOING TO OVERWRITE THE CPR? JRC PRNLE ;ERROR IF SO PUSH H ;SAVE ADDRESS OF NEXT SECTOR XCHG ;... IN DE CALL DMASET ;SET DMA ADDRESS FOR LOAD LXI D,FCBDN ;READ NEXT SECTOR CALL READ POP H ;GET ADDRESS OF NEXT SECTOR J filename with a P. TYPE ZCPR.DOC will page TYPE ZCPR.DOC P will not page LIST------------------------------------------------------------------------- This is an added function that comes with ZCPR. LIST will send the specified file to the LST: device without paging. This is intended to be easier to use than PIP LST:= etc. and not as uncaring as ^P. LIST ZCPR.DOC sends ZCPR.DOC to the LST: device ERA------------------------------------------------------------------------COM FILE NOT FOUND ; MLOAD: SHLD LOADADR ;SET LOAD ADDRESS CALL GETUSR ;GET CURRENT USER NUMBER STA TMPUSR ;SAVE IT FOR LATER STA TSELUSR ;TEMP USER TO SELECT ; ; MLA is a reentry point for a non-standard CP/M Modification ; This is the return point for when the .COM (or GET) file is not found the ; first time, Drive A: is selected for a second attempt ; MLA: CALL SLOGIN ;LOG IN SPECIFIED DRIVE IF ANY CALL OPENF ;OPEN COMMAND.COM FILE JRNZ MLA1 ;FILE FOUND - LOAD IT ; ; ERRO ZCPR I USERS GUIDE ZCPR is a Z80 replacement for CP/M's CCP. This guide explains the differences and provides an introduction to the commands and utilities available in a ZCPR environment. TYPE------------------------------------------------------------------------- Under the old system, when the CCP received a TYPE command, it went merrily along writing to the screen as quickly as the video section would allow. On a KayPro running 2.5 MHz the display can be easily RNZ ML3 ;READ ERROR OR EOF? LXI D,128 ;MOVE 128 BYTES PER SECTOR DAD D ;PT TO NEXT SECTOR IN HL JR ML2 ; ML3: DCR A ;LOAD COMPLETE RZ ;OK IF ZERO, ELSE FALL THRU TO PRNLE ; ; LOAD ERROR ; PRNLE: CALL PRINTC DB 'Full',80H MVI A,1 ;SET NON-ZERO TO INDICATE ERROR ORA A ;SET FLAG RET ; END -- ERA has been improved when erasing files with ambiguous file names. ERA under ZCPR lists each file to the screen as it is erased. SAVE------------------------------------------------------------------------- With the CCP, whenever DDT was used to modify a file the SAVE command needed to have a decimal file size. This was unfortunate since DDT provides hex file size information. SAVE under ZCPR will allow the size to be either decimal or hex. In addition, SAVE will also accept the size to be R ROUTINE TO SELECT USER 0 IF ALL ELSE FAILS ; DFUSR EQU $+1 ;MARK IN-THE-CODE VARIABLE MVI A,DEFUSR ;GET DEFAULT USER TSELUSR EQU $+1 ;MARK IN-THE-CODE VARIABLE CPI DEFUSR ;SAME? JRZ MLA0 ;JUMP IF STA TSELUSR ;ELSE PUT DOWN NEW ONE MOV E,A CALL SETUSR ;GO SET NEW USER NUMBER JR MLA ;AND TRY AGAIN ; ; ERROR ROUTINE TO SELECT DRIVE A: IF DEFAULT WAS ORIGINALLY SELECTED ; MLA0: LXI H,TEMPDR ;GET DRIVE FROM CURRENT COMMAND XRA A ;A=0 ORA M JNZ COM8 ;ERROR IF ALREADY DISK A controlled with ^S. My KayPro is now running 5 MHz and the text on the screen is often scrolling to fast to stop where I want with ^S. ZCPR automatically "pages" (i.e. displays a screen-full of text) and then politely waits for any character from the console before displaying the next page. When using this command, entering a regular character may have the undesirable effect of printing that character. I usually use the up- cursor key since it is not printable. To disable paging merely follow the  expressed in sectors. SAVE 16 A.COM saves 16 pages SAVE 10H A.COM saves 16 pages SAVE 16 B.COM S saves 16 sectors SAVE 10H B.COM S saves 16 sectors Also, if SAVE sees a file in the directory with the same name as the file it is SAVEing it will prompt the user "Delete File?". The user may answer "Y" and the original file will be over-written or "N" and the SAVE attempt will be aborted. REN----------------------------------------------------------n of the program at 1000H The address must be in hex. GO--------------------------------------------------------------------------- This command is similar to jump but it does not allow an address specification. GO will simply begin execution of whatever program resides at 100H (the beginning of the TPA). GO is functionally equivalent to JUMP 100. Once installed, ZCPR may be moved to other disks using SYSGEN. Micro Cornucopia P.O. Box 223  SECTFLG, FENCE 10 Patching SUBMIT.COM 10 Part B: Usage Instructions and Explanation of Commands 11 The ZCPR Command Hierarchy Search 11 The ZCPR-Resident Commands 14 DIR, ERA 14 LIST, TYPE, SAVE 15 REN, USER, DFU---------------- This file renaming program is also improved by ZCPR. Like SAVE it will prompt the user if the new name requested is already present in the directory. DIR-------------------------------------------------------------------------- Under ZCPR, DIR can be made to show only non-system files, system files or both. DIR *.ASM will show non-system .ASM files DIR *.ASM S will show system .ASM files DIR *.ASM A will show all .ASM files Exclusive ZCPR  ZCPR - A Z80 Replacement for the CP/M CCP Documentation on ZCPR - A Z80 Replacement for the CP/M CCP ZCPR is a Group Project By the CCP-GROUP: RLC - Richard Conn FJW - Frank Wancho KBP - Keith Peterson RGF - Ron Fowler ZCPR Documentation By RLC Table of Contents ----- -- -------- Introduction  Bend, OR 97709 :::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::  16 JUMP, GO, GET 17 ZCPR Error Messages 18 Part C: ZCPR Command Levels and How to Use Them 19 Page 1 ZCPR - A Z80 Replacement for the CP/M CCP Documentation on ZCPR - A Z80 Replacement for the CP/M CCP ZCPR is a replacement for the CP/M Console Command Processor (CCCommands GET
ufn ----------------------------------------------------------- This command allows the user to load a file from disk into memory at a specific address, regardless of what may be at that memory location. GET 1000 A.COM will load A.COM at 1000H The address must be in hex. JUMP
-------------------------------------------------------------- This command will "call" a routine at the memory location specified. JUMP 1000 will begin executio 2 Part A: Installation Instructions 4 ZCPR Integration Example 5 Setting the ZCPR Inline Options 8 REL, BASE, CPRLOC, RAS, SUBA, CLEVEL3 8 Customization Symbols 8 NLINES, WIDE, PGDFLT 8 PGDFLG, MAXUSR, SYSFLG, SOFLG, SUPRES, DEFUSR, SPRMPT, CPRMPT, NUMBASE, 9   P) which is designed to run as part of CP/M on Z80-based microcomputers. In most cases it is upward-compatible with the original CP/M Version 2.2 CCP. ZCPR, however, provides many extensions to the CP/M CCP. Included in these extensions are the following features: . The TYPE function can be made to page or not page its output at the user's discretion . A LIST function is available which sends its output to the CP/M LST: Device and de current user number on the current disk is scanned for the COM file; the COM file is loaded and executed if found - failing that, a default user number (initially 0 but can be reset with the DFU CPR-resident command) on the cur- rent disk is scanned for the COM file; the COM file is loaded and executed if found - finally, failing that, the default user number on disk A: is scanned for the COM file; the COM file is loaded and executedle is also a valid sequence of commands for execution from an Indirect Command File; hence, the sequence: DIR B: DIR A: may be issued from either the console or an Indirect Command File, and the results of the execution of this sequence are the same. Basically, this says that Indirect Command Files are upward-compatible to the console input (but not necessarily that nt for the CP/M CCP Part A Installation Instructions In order to install ZCPR on a target microcomputer (must be currently running CP/M 2.2), the user must know two basic things: 1) Where his CCP is currently running in memory 2) Where his CCP is located in the SYSGEN image, or, for systems which don't support SYSGEN (such as P&T CP/M 2.2 for the TRS-80 Model II), where his CCP is located on oes NOT page . The DIR command has been extended to allow the dis- play of the system files or all files . The ERA command now prints out the names of the files it is erasing . The current user number may be included as part of the command prompt; if the user is under a number other than 0, the prompt is of the form 'du>' (like 'A2>' or 'B10>'), and, if the user is under 0, the prompt may be 'd>' or 'd0>' as per his choice  if found or an error message (COMMAND?, when COMMAND was the user's command name) is printed . The numeric argument for the SAVE command can be specified in hexadecimal so that the user may employ the values presented by tools such as DDT exactly as they are given . A GET command which loads a file at a specified memory address and a JUMP command which "calls" the subroutine at a specified memory address have been added; a GO command which  the contents of an Indirect Command File may be issued at the console without modification). Page 2 ZCPR - A Z80 Replacement for the CP/M CCP . A command-search hierarchy is now implemented which is executed roughly as follows: - the user's command is checked against the CPR- resident commands and executed immediately if a match is found - failing that, thdisk and how to place the new ZCPR on top of it The first question is answered relatively easily. A pro- gram, known as either BDOSLOC or BDLOC (for BDOS Locator), is provided with ZCPR. You should assemble this program for your particular computer (change the base ORG if you are running non- ORG-0 CP/M) and execute it. Upon execution, it will provide you with the base address of (1) the BDOS and (2) the CCP for your particular system. BDOSLOC has work . The SUBMIT facility has been changed in two basic ways: - the prompt changes to 'du$' or 'd$' when the SUBMIT command is printed - the $$$.SUB is executed from drive A: (note that the original SUBMIT problem now exists, but the new SUB.COM facility corrects it); the CCP-GROUP definition of an Indirect Command File now applies, and this definition is that any sequence of commands which may be issued from the conso "calls" the subroutine at 100H (subset of the JUMP capability) has also been added This document provides the user of ZCPR with the following information: Part A: Installation Instructions Part B: Usage Instructions and Explanation of Commands Part C: ZCPR Command Levels and How to Use Them Page 3 ZCPR - A Z80 Replaceme  ed correctly for all systems tested so far, but there is always a chance that it may NOT work for some non-tested system. For the time being, assume that it works correctly and record the starting base page address of your CCP. The second question is not answered nearly so easily. If you have the ability to SYSGEN your system, it is much easier (commonly) than if you do not. You must, after assembling the ZCPR properly, integrate it into the sysgen (orR into your system. To do this, perform the following steps using the information of the page address of the CCP (obtained from BDOSLOC and called CPRLOC within ZCPR) and the SYSGEN image address of the CCP (called IMAGE for reference in this document). 1. Edit ZCPR and set the CPRLOC equate to the value obtained from above. Also set any flags and values as you desire (see the section on ZCPR Customization below). When satisfied, end the edit se TWO jump instructions followed by a buffer area (possibly containing an initial command and/or the Digital Research copyright notice). The Digital Research manuals show the CCP to reside at address 980H in the SYSGEN image, but this may vary with system. To find this image, use DDT or some other such debugger, load the SYSGEN image you can get via SYSGEN, and examine memory starting at around 900H for the two (and ONLY two) jumps described above. If yooaded by examining the SYSGEN IMAGE area. 6. Place the new system on disk by running SYSGEN and NOT loading the system from disk (use the memory image). For further clarification of the above process, the following is a sample terminal session which outlines the steps taken. ZCPR Integration Example B>; Sample terminal session for integrating ZCPR B>sysgen SYSGEN VER 2.2 SOURCE DRIVE NAME (OR RETURN TO SKIP)b  disk) image of CP/M. This can be done by obtaining a SYSGEN image of your system, scanning it via a debugger such as DDT to find the offset for the CCP, reading the new CPR in on top of the old one, and finally running SYSGEN again to place the resultant system on disk. If you DO NOT have SYSGEN capability, a Disk Utility program is required to locate the CCP on disk and then write the new ZCPR on top of the old one. The net result of this ission. 2. Assemble ZCPR with MAC (or equivalent). This assembler is required because of the MACROs used. Only the resultant HEX file is required. 3. Assuming that you can use SYSGEN, obtain a SYSGEN image of your current CP/M system and save it on disk. 4. Load the SYSGEN image into memory with DDT (or equivalent). Once loaded, verify that the original CCP is at the IMAGE address found above and compute the integrau find an area with more than two jumps (a group of them), you are probably looking at the BIOS and should go lower for the CCP. The CCP will probably start on an even page or half-page address (like 900H, 980H, 1100H, etc). Page 4 ZCPR - A Z80 Replacement for the CP/M CCP Now that the location of the CCP has been found, record this address for later. You are now ready for the integration of ZCPSOURCE ON B, THEN TYPE RETURN <-- I hit the RETURN key here FUNCTION COMPLETE / DESTINATION DRIVE NAME (OR RETURN TO REBOOT) <-- and here B>save 44 cpm56.com <-- We now have a SYSGEN image of CP/M to work with Page 5 ZCPR - A Z80 Replacement for the CP/M CCP B>xdir XDIR Version 2.6 User Number: 0, Double Density File Attributes: Nontegration is the placement of the new ZCPR onto disk in the proper place so that it will be loaded with the rest of CP/M on cold boot and executed properly. To find the original CCP, you typically have to locate it by its appearance. It is probably stored contiguously on disk, so, once it is found, a sequential overwrite is all that is required. Probability is extremely high that it is stored contiguously in the SYSGEN image. The CCP starts with two (2) and ONLYtion offset using the DDT H command: H, The second number displayed gives you the OFFSET value required for step 5. 5. Integrate ZCPR into your SYSGEN image via DDT's I and ROFFSET commands. Use IZCPR.HEX (or the name of your version of ZCPR) to load the FCB and ROFFSET (where OFFSET was computed in step 4) to load the ZCPR.HEX file into memory at the proper location. Check to see that ZCPR is indeed properly l  n-System Filename.Typ Size K Filename.Typ Size K Filename.Typ Size K -------- --- ------ -------- --- ------ -------- --- ------ !TEXTWRK.-12 0 CPR .DOC 8 EE687 .TXT 4 CPR .AQM 34 TFS .HLP 6 EE687PRE.TXT 4 CPR .ASM 50 CONTENTS.T01 6 SW1 .TXT 10 CPR .BAK 4 CONTENTS.T02 4 SW2 .TXT 2 CPM56 .COM 12 CONTENTS.T03 4 B: 30 Entries & 22 Files -- 338K Bytes Rema <-- Now to SYSGEN onto disk SYSGEN VER 2.2 SOURCE DRIVE NAME (OR RETURN TO SKIP) <-- Use memory image DESTINATION DRIVE NAME (OR RETURN TO REBOOT)b <-- onto B: DESTINATION ON B, THEN TYPE RETURN FUNCTION COMPLETE DESTINATION DRIVE NAME (OR RETURN TO REBOOT) <-- Done for now B> Page 7 ZCPR - A Z80 Replacement for the CP/M CCP ............. -- Detail Left Out -- -^C <-- Return to CP/M; I know that CPRLOC will be BD00H and the IMAGE offset is 1100H B>ed cpr.asm {edit ZCPR here and place CPRLOC=BD00H}# -- Detail Left Out -- B>mac cpr $pz sz <-- Now to assemble the CPR CP/M MACRO ASSEM 2.0 C4F0 <-- Note that CPR MUST end before BDOS begins! 014H USE FACTOR END OF ASSEMBLY an equate which masks out selected ZCPR command functions for security purposes on Remote Access Systems such as Bulletin Boards; the masked out functions currently include SAVE, ERA, REN, JUMP, GO, and GET; set RAS to TRUE to mask these out or FALSE to leave them in SUBA This is an equate which determines the drive onto which ZCPR will look for an executing Indirect Cining File Data: 14 Files -- 154K Bytes Displayed B>bdosloc <-- Now to locate the CCP's address The Base Page Address of this system's BDOS is C5 The Base Page Address of this system's CCP is BD <-- This is it B>ddt cpm56.com <-- Now to find the CCP in the SYSGEN image DDT VERS 2.0 NEXT PC 2D00 0100 -d900,90f <-- Start looking around here 0900 31 80 E7 3E 06 3C 3C FE 1B CA 00 C2 DA 11 E7 D6 1..>.<<......... -da00,a0f 0A00 31 00 01 01 01 0C C5 CD Setting the ZCPR Inline Options The following are the four basic options available to the user under ZCPR for customization of his package. Option Name Function REL Configures CPRLOC (CPRLOC equ 0) for integration via MOVCPM rather than the DDT/SYSGEN technique outlined above; set to TRUE for MOVCPM integra- tion or FALSE for DDT/SYSGEN integration BASE Base address of your C Page 6 ZCPR - A Z80 Replacement for the CP/M CCP B>ddt cpm56.com <-- Now to integrate! DDT VERS 2.0 NEXT PC 2D00 0100 -h1100,bd00 <-- Compute offset for new CPR CE00 5400 <-- Offset is 5400H -icpr.hex <-- Init FCB -r5400 <-- Read in new CPR with offset NEXT PC 2D00 0000 -^C <-- Done! B>sysgen ommand File. If the basic philosophy of the Indirect Command File described above is to be maintained, this symbol should be set to TRUE (look on drive A: for the $$$.SUB file); if not, this symbol should be set to FALSE (look on the default drive from the $$$.SUB file). To review, the basic philosophy of the Indirect Command File is that any sequence of commands  0F E4 21 00 BE 11 00 04 1.........!..... -db00,b0f 0B00 31 00 01 01 01 11 C5 CD 0F E4 21 00 C0 11 00 02 1.........!..... -db80,b8f 0B80 31 00 01 01 09 01 CD A8 00 21 00 D2 11 00 C2 0E 1........!...... -- Detail Left Out -- -d1100 <-- I found it at 1100H; note the 2 JMP's 1100 C3 FF BD C3 FB BD 50 10 20 20 20 20 20 20 20 20 ......P. 1110 20 20 20 20 20 20 20 20 00 00 00 00 00 00 00 00 ........ 1120 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ...P/M system; standard CP/M has a base of 0, but some CP/M systems (such as for the TRS-80 Model I and Heath/Zenith H89/Z89) start physical RAM memory at a higher address; equate BASE to the starting RAM memory address of your system CPRLOC This is the starting address of ZCPR; set the second CPRLOC equate to the address you obtain from BDOSLOC RAS This is   which may be issued from the console (within reason, which means NOT to erase a $$$.SUB file) may also be issued from within an Indirect Command File, and the resultant execution should be identical (same functions performed). CLEVEL3 This equate enables or disables extended Command Level 3 Processing. If set to TRUE, extended Command Level 3 Processing is enabled and the user or MAXUSR SYSFLG This is the option character for the DIR command line which is used to specify that DIR search All Files (both $SYS and $DIR) for its display; the distributed default for this is 'A' SOFLG This is the option character for the DIR command line which is used to specify that DIR search ONLY the $SYS files for its display; the distri- buted default for this is 'one more space PGDFLT This is the Paging Default flag for the TYPE command; if PGDFLT is set to TRUE, the TYPE command will page its output by default and the P option on the TYPE command (see below) will prohibit paging; if PGDFLT is set to FALSE, the TYPE command will NOT page its output by default and the P option will enable paging PGDFLG This sets the option character ina SUBMIT file is in execution; by default it is set to '$', so prompts like 'A$' appear during SUBMIT file execution CPRMPT This is the CPR prompt character which indicates that the CPR is awaiting a user console command; by default it is set to '>', so prompts like 'A>' appear during user input to the CPR NUMBASE This is the escape character used by those commands which requi command line is automatically capitalized, the terminating zero is placed at the end of the buffer, and the internal CIBPTR is set correctly (see later for more information). Page 8 ZCPR - A Z80 Replacement for the CP/M CCP Customization Symbols The following symbols are provided for further customization of ZCPR to a user'S' SUPRES Set SUPRES to TRUE to suppress printing the user number when the user is under User Number 0 or set SUPRES to FALSE to ALWAYS display the User Number with the CPR prompt; with SUPRES set to TRUE, a user on B: in user 0 sees 'B>' as the prompt, but with SUPRES set to FALSE, a user on B: in user 0 sees 'B0>' as the prompt Page the command line for the TYPE command (the 'P' mentioned above); if the user wishes to change this option character, he need only change this equate MAXUSR This is the largest user number recognized by the USER command; if the user wishes to protect the higher user areas, he may set this symbol to the highest area normally accessable; 15 is the largest permitted value fre a DECIMAL number as an argument; placing this character after the number argument switches the base to HEXADECIMAL; for example, 'SAVE 15 MYFILE' can be expressed as 'SAVE FH MYFILE' if NUMBASE is set to 'H' (the default) SECTFLG This character constant is the suffix option for the SAVE command which specifies that sectors, as opposed to pages, are to be saved; the defs particular tastes and hardware facilities. Option Name Function NLINES Number of lines on the user's CRT for paging WIDE This equate is used to select a narrow or wide display under the DIR command; if WIDE is equated to TRUE, each file name is separated by two spaces, a FENCE, and two more spaces; if WIDE is equated to FALSE, each file name is separated by one space, a FENCE, and  9 ZCPR - A Z80 Replacement for the CP/M CCP DEFUSR This is the CPR-default user number which is searched in the command hierarchy for the COM files (distributed as 0); the DFU changes this temporarily until a Warm Boot or Cold Boot is done, at which time the search reverts to this value SPRMPT This is the CPR prompt character which indicates that   ault value is 'S' FENCE This is the character printed to separate entries in a directory listing; it's default value is '|' Patching SUBMIT.COM SUBMIT.COM may be patched to run with ZCPR by the following procedure (this is recommended if the user does not have SUB.COM). This patch simply makes it always place the $$$.SUB file on Drive A:. Illustrative terminal session follows: A>ddt b:su or DIR). 2. If the command is of the form 'd:COMMAND', disk drive 'd:' is temporarily logged in for the purpose of the command search. Otherwise, the currently logged-in drive is used. 3. Now the file named COMMAND.COM is searched for. If found, it is loaded into memory starting at 100H and executed. If not, proceed to step 4. 4. Now that the first search for COMMAND.COM has failed, the CPR checks to see e first, and most basic thing, to learn about ZCPR is the order in which is searches for a COM file for execution or a file specified by the GET command. Under the CP/M 2.2 CCP, if the specified COM file command was not found on the current drive in the current user area, the CCP aborted with an error message. ZCPR, however, continues searching from this point a maximum of two more levels. This command hierarchy search was outlined above and is described here ded as described above and executed. If not, ZCPR prints the command name as an error message and returns to command input mode, aborting the SUBMIT file if COMMAND came from it. In all cases of the search above, if COMMAND.COM is found, after it is loaded into memory, ZCPR resets the user to his original disk drive and user number. Hence, the files referenced by the user by default are obtained from this environment. To illustrate this commanbmit.com DDT VERS 2.0 NEXT PC 0600 0100 -s5bb <-- Patch is at 5BB Hex 05BB 00 1 <-- Change 0 (default drive) to 1 (drive A:) 05BC 24 . <-- That's it! -d5b0 5cf <-- See change 05B0 00 00 00 00 00 00 30 30 31 20 24 01 24 24 24 20 ......001 $.$$$ 05C0 20 20 20 20 53 55 42 00 00 00 1A 1A 1A 1A 1A 1A SUB......... -^C <-- Done A>save 5 newsubmt.com <-- Save new SUBMIT.COM file Paif the user is under the current Default User Number. The Default User Number may be that set by the DEFUSR equate in the CPR or that set by the user via the DFU command. DEFUSR is in effect if DFU has not been issued since the last Warm or Cold Boot, and DFU is in effect if it was issued since the last Warm or Cold Boot. If the user is NOT under the current Default User Number, ZCPR temporarily logs him into it and searches the directory. If COMMAND.COM is fouin further detail. 1. If the command is of the form 'COMMAND' and NOT 'd:COMMAND', the CPR-resident command list is searched for a match. If the match is found, the CPR-resident command is immediately processed. If the match is not found or the command is of the form 'd:COMMAND', the next step is taken. Note that the 'd:COMMAND' form is good for executing a command COM file which has the same name as a CPR-resident command (such as SAVE d hierarchy search, consider the following examples: Example 1: DEFUSR equ 0 {default user number is 0} B10> <-- User is on Drive B:, User Number 10 B10>ASM TEST.BBZ <-- User wishes to assemble TEST.ASM in Drive B:, User 10 <-- At this point, ZCPR looks on B:/10 for ASM.COM, fails, looks on B:/0, fails, and finally looks on A:/0; it finds ASM.COM here and goes back to B:/10 for the file Example 2: DEFUSR ege 10 ZCPR - A Z80 Replacement for the CP/M CCP Part B Usage Instructions and Explanation of Commands The following instructions are written with the assumption that the reader is quite familiar with how to use CP/M 2.2 and its CCP. ZCPR is written as a logical extension of the CP/M 2.2 CCP philosophy and should be addressed as such. The ZCPR Command Hierarchy Search Thnd, it is loaded as described above and executed. If not, ZCPR proceeds to the next step. Page 11 ZCPR - A Z80 Replacement for the CP/M CCP 5. The user is now in the Default User Number, and at this point, ZCPR checks to see if the user is on disk drive A:. If not, it temporarily logs into A: and searches the default user number of A: for COMMAND.COM. If found, it is loa  qu 0 and DFU issued B10> <-- User is on Drive B:, User Number 10 B10>DFU 5 <-- User Selects User 5 as default B10>ASM TEST.BBZ <-- As above <-- At this point, ZCPR looks on B:/10 for ASM.COM, fails, look on B:/5, fails, and finally looks on A:/5; it fails here also and prints ASM? as an error message Example 3: DEFUSR equ 0 B> <-- User is on Drive B:, User Number 0 B>ASM TEST.BBZ <-- As above <-- At this po User 0, so it doesn't bother to look further (if it had, it would have found TEST.COM in B: User 0). TEST.COM is then loaded and executed as described above. B10>TEST2 \ \__ Invoke the TEST2.COM file (TEST2 program) \__ User is on Drive B: in User Area 10 Results: ZCPR searches B: User 10, B: User 0, and A: User 0 for TEST2.COM; it doesn't find it, so it issues the error message 'TEST2?', which says it couldn't find TEST2.COM. nds are issued from the console (or Indirect Command File): B10>WM TEST2.TXT \ \ \__ File to be edited \ \__ Invoke the WM.COM file (Word Master editor) \__ User is on Drive B: in User Area 10 Results: ZCPR searches B: User 10, B: User 0, and A: User 0 for WM.COM; it finds WM.COM in A: User 0, loads it, logs the user back into B: User 10, and executes it. B10>MBASIC \ \__ Invoke the MBASIC.COM file (MBASIC Interpreter) \__ s on disk, the 'No Files' message will appear. However, if a file is scanned for and the name exists as a $SYS file and $DIR files are being scanned for, no file name is displayed but the 'No Files' message does NOT appear. For example, if TEST.COM is a $SYS file and 'DIR TEST.COM' is issued, no message appears. If 'DIR TEXT.COM' is issued and TEXT.COM does not exist on disk, the 'No Files' message is displayed. Command: ERA Function: To Erase the int, ZCPR looks on B:/0 for ASM.COM, fails, looks on A:/0, fails, and prints error message Example 4: DEFUSR equ 0 A10> <-- User is on Drive A:, User Number 10 A10>ASM TEST.AAZ <-- As above, but file on A: <-- At this point, ZCPR looks on A:/10 for ASM.COM, fails, looks on A:/0, fails, and prints error message Page 12 ZCPR - A Z80 Replacement for the CP/M CCP  Page 13 ZCPR - A Z80 Replacement for the CP/M CCP The ZCPR-Resident Commands The following pages describe the ZCPR-Resident Commands. These are commands located within ZCPR itself which are executed from within ZCPR. The phrases and refer to ambiguous file name and unambigous file name as per the CP/M convention. Command: DIR Function: To Display a listing of thUser is on Drive B: in User Area 10 Results: ZCPR searches B: User 10 and B: User 0 for MBASIC.COM; it finds MBASIC.COM in B: User 0, so it doesn't bother to look on A: User 0. MBASIC.COM is then loaded and executed as described in the previous example. B10>TEST \ \__ Invoke the TEST.COM file (TEST program) \__ User is on Drive B: in User Area 10 Results: ZCPR searches B: User 10 for TEST.COM; it finds TEST.COM in B:specified $R/W files from disk Forms: ERA <-- Erase both $DIR and $SYS files Customization Variables: WIDE FENCE Examples: ERA *.ASM <-- Erase all .ASM files ERA *.* <-- Erase all files Notes: If a $R/O file is encountered, a BDOS error message will be displayed and the procedure is stopped. The user is unsure at this time as to which files have been erased and which have not and should check.  Another Example: For example, if the user is logged into Drive B: in User Area 10, the Default User Number is 0, and the following COM files are present as indicated -- WM.COM on Drive A: in User 0 MBASIC.COM on Drive A: in User 0 and on Drive B: in User 0 TEST.COM on Drive B: in User 10 and Drive B: in User 0 then the following happens when the following commae names of the files on disk Forms: DIR <-- Displays $DIR files DIR S <-- Displays $SYS files DIR A <-- Displays both $DIR and $SYS files Customization Variables: WIDE SYSFLG SOFLG FENCE Examples: DIR *.ASM <-- All $DIR .ASM files DIR *.COM S <-- All $SYS .COM files DIR *.COM A <-- All .COM files Notes: If a file is scanned for and no such name exist  Sorry for this problem! The ERASE command (to be given to SIG/M by RLC in the near future) is a solution to this problem. Page 14 ZCPR - A Z80 Replacement for the CP/M CCP Command: LIST Function: To Print the specified file on the CP/M LST: device Forms: LIST <-- Print the file (no paging) Customization Variables: -None- Examples: LIST TEST.TXT the current and then rename to . Command: USER Function: To Change the current user number Forms: USER <-- in DEC USER H <-- in HEX Customization Variables: -None- Examples: USER 15 USER FH USER 0 USER <-- Same as USER 0 Notes: -None- Command: DFU Function: To Temporarily Change the default user number for the omization Variables: NUMBASE RAS Examples: SAVE 15 MYFILE.TXT <-- 15 pages saved SAVE FH MYFILE.TXT <-- 15 pages saved SAVE 10H MYFILE.TXT S <-- 16 sectors (8 pages) saved Notes: If the file name to be saved already exists, then SAVE will exit with the message 'Delete File?'; if the user REALLY wants to save under this name, he may then type Y or y and the current file will be deleted and then recreated containing the specif Function: To "call" the subroutine starting at 100H Forms: GO <-- Execute reentrant at 100H Customization Variables: RAS Examples: GO *.ASM <-- Assuming XDIR is loaded, gives directory of *.ASM Notes: This command is identical in function to JUMP 100H; JUMP, however, leaves the address as the first entry in CP/M BASE + 80H (the input line buffer), while GO has no such addres <-- Print TEST.TXT on LST: Notes: If the file has a $SYS attribute, it will be found as well as those with $DIR attributes. Command: TYPE Function: To Print the specified file on the CP/M CON: device Forms: TYPE <-- Print the file with the paging deflt TYPE P <-- Print the file with the paging deflt negated Customization Variables: NLINES PGDFLT PGDFLG Examples: TYPE  command hierarchy search Forms: DFU <-- in DEC DFU H <-- in HEX Customization Variables: -None- Examples: DFU 15 DFU FH DFU 0 DFU <-- Same as DFU 0 Notes: See above for explanation. Page 16 ZCPR - A Z80 Replacement for the CP/M CCP Commied part of the TPA. Page 15 ZCPR - A Z80 Replacement for the CP/M CCP Command: REN Function: To Change the name of a disk file Forms: REN = Customization Variables: RAS Examples: REN NEWFILE.TXT=OLDFILE.TXT Notes: If already exists, the message 'Delete File?' will be printed and the user may respond with Y or y to delete s. Command: GET Function: To load a file from disk into memory starting at the specified page Forms: GET
<--
in HEX Customization Variables: NUMBASE RAS Examples: GET 8000 TEST.80 <-- Load TEST.80 starting at 8000H GET 100 TEST.80 or GET 100H TEST.80 <-- Load TEST.80 starting at 100H GET 0 TEST.80 <-- Load TEST.80 starting at 000H Notes:TEST.TXT TYPE TEST.TXT P Notes: When the display pauses during paging, type any char to continue or ^C to abort. ^S also works. Command: SAVE Function: To Copy the TPA starting at 100H to disk Forms: SAVE <-- in DEC SAVE H <-- in HEX SAVE S <-- Number of sectors SAVE H S <-- Number of sectors Custand: JUMP Function: To "call" the subroutine at the specified page address Forms: JUMP
<--
in HEX Customization Variables: NUMBASE RAS Examples: JUMP E000 or JUMP E000H <-- Jump to E000H JUMP <-- Jump to 000H JUMP 0 <-- Jump to 000H Notes: JUMP performs a subroutine "call", so the called routine may return to the ZCPR by either a RET or a Warm Boot. Command: GO    GET searches for the specified file according to the same command hierarchy search employed by the ZCPR command scanner. Hence, if the user is on B:/10 and the file is on A:/0 with the current default user number at 0, GET will search from B:/10 to B:/0 to A:/0 in looking for the file. Page 17 ZCPR - A Z80 Replacement for the CP/M CCP ZCPR Error Messages is stored in the internal ZCPR buffer called CIBUFF (Command Input BUFFer). Under both Command Levels 1 and 2, the command is placed into this buffer, the characters of the command line are capitalized, a character count which indicates the number of characters in the command line is stored in CBUFF (the byte before CIBUFF), an ending binary 0 is placed after the last character in the command line, and the internal pointer CIBPTR (Command Input Buffer PoinTeR) e REN or SAVE function Page 18 ZCPR - A Z80 Replacement for the CP/M CCP Part C ZCPR Command Levels and How to Use Them ZCPR Version 1.0 and beyond supports three distinct command levels in its implementation. Each level constitutes a different way to issue a command for ZCPR to process. Commanting 8 from this number (8 pages = 2K bytes). The resulting number is the base page address of ZCPR. 2. Store the command line in CIBUFF and the character count in CBUFF. Knowing the base page address of ZCPR, the following information is useful in doing this: Page 19 ZCPR - A Z80 Replacement for the CP/M CCP ORG CPRLOC ;Base Address of ZCPR  The following are the error messages issued by ZCPR and their meanings. Message Meaning ? Printed after a command or an argument means that such was invalid No File From DIR, this means that DIR did not locate any files Also from ERA with the same meaning All? Issued in response ERA *.*, asks the user is he really wants to erase all the files. Unlike under the original CP/M 2.2 CCP, single characis set to point to CIBUFF (the first character of the command line). Command Level 3 is an extended concept to Command Levels 1 and 2 which is specifically supported by ZCPR Version 1.0 and beyond. This command level allows a transient program to place a command line into CIBUFF and the character count into CBUFF and have this command line executed by ZCPR. Once control is trans- ferred to ZCPR to execute the command line, the transient program which placed d Levels 1 and 2 are common to all implementations of CP/M and CP/ZM from CP/M Version 1.4. Command Level 1 is that command level in which the command is issued by the user from his console terminal. The prompt 'd>' or 'du>' appears on the terminal, and the user is allowed to enter the command with editing from the terminal. Command Level 2 is that command level in which the command is entered from an executing $$$.SUB file. In both cases, the command  JMP CPR ;Enter ZCPR and Execute Default Cmd JMP CPR1 ;Enter ZCPR and Don't Execute MBUFF: DB BUFLEN ;Size of CIBUFF in bytes CBUFF: DS 1 ;Number of Bytes in Command Line CIBUFF: DS BUFLEN ;Buffer for Command Line DS 1 ;Buffer for Ending 0 (set by ZCPR) CIBPTR: DS 2 ;Address of CIBUFF (set by ZCPR) 3. Obtain the User/Disk Flag. Location 4 contains ter input is required (Y or y for yes and anything else for no) with NO to end the line Full From SAVE, means that there is not enough space on disk From GET or command load by CPR, means that there is not enough space in memory Delete File? From REN or SAVE, means that the file specified already exists on disk and the user may type Y or y to delete it and proceed with ththe command line loses control and the command is executed exactly as though it had been typed by the user at his console terminal. In order for a transient program to utilize the Command Level 3 facility, this program MUST do the following: 1. Locate the ZCPR. Since the ZCPR is ALWAYS 2K bytes in size and located directly under the BDOS, the transient can locate the ZCPR by examining the BDOS entry page address at location 7 and subtrac   this number, but the user may select a flag of his choice. This flag is one byte long, and the high-order nybble (4 bits) contains the user number and the low-order nybble contains the disk number to process the command from. The User/Disk Flag is to be passed to ZCPR in the C Register. 4. When ready, transfer control to ZCPR to process the command by JMPing to the base address of ZCPR. The first JMP in the JMP Table given above is at this address. lxi d,6 ;Point to command line buffer dad d ;HL points to command line buffer xchg ;DE points to command line buffer mvi c,10 ;READLN into this buffer call bdos lhld cpr ;Get Address of CPR lda udflag ;Get User/Disk Flag mov c,a ; ... in C pchl ;Run Command Line cpr: ds 2 ;CPR Address buffer prmpt: db 'User Command? 3F5CDF6D5F1E3C97ECDB2D57E23E9 :10D5FC00B7C8F818F50E1918091180000E1A180280 :10D60C000E0DC305005F0E0E18F8AF32BBD4119B84 :10D61C00D40E0FCD05003CC90E1018F7119BD40E7B :10D62C001118F00E1218EC212DD57EB7C83600114A :10D63C007AD40E1318CC3E005F18021EFF0E201871 :10D64C00C1CD47D687878787215DD6B6320400C9FE :10D65C003E00320400C9FE61D8FE7BD0E65FC93AB9 :10D66C002DD5B72845117AD4D5CD1DD6D1283B3A26 :10D67C0089D43D329AD4CDE0D5202F1107D4218006 :10D68C0000015000EDB02188D436002335117AD436 :10D69C00CD24D628153E24CDB2D521 At this time, ZCPR will log in the user and disk in the User/Disk Flag and process the Command Level 3 Command Line. Page 20 ZCPR - A Z80 Replacement for the CP/M CCP The following is a sample program which illustrates the steps outlined above: ; ; Demonstration of Command Level 3 Facility by RLC ; udflag equ 4 :10D40000C305D5C301D55000202020202020202096 :08D41000202020202020200034 :04D4590008D417D408 :10D47700434F4D00242424202020202053554200D0 :01D4870000A4 :10D4BC001600004449522089D84C49535463D9541E :10D4CC0059504567D955534552C7DA44465520D172 :10D4DC00DA474F2020DEDA455241203AD9534156E3 :10D4EC004500DA52454E2083DA4745542088DB4A02 :10D4FC00554D50D9DAAF3207D43177D4C5791F1FC7 :10D50C001F1FE60F5FCD49D6CD0CD6322DD5C17974 :10D51C00E60F325DD62806CD11D6322DD5117AD430 :10D52C003E00B72FC42BD62F322DD53A07D4B720B$' Enjoy using ZCPR! -- RLC Page 21 08D4CDF6D52F :10D6AC00CDE2D6C8CD33D6C33DD5CD33D6CD4DD6B0 :10D6BC003E3ECDB2D50E0A1106D4CD0500C35CD6C4 :10D6CC002107D44604237ECD62D67710F83600218C :10D6DC0008D42259D4C9D50E0BCDE2D5C4BDD5D1B1 :10D6EC00C9CD43D7FE10D8CDABD52A5BD47EFE2056 :10D6FC00280BB72808E5CDB2D5E12318F0CDEED52F :10D70C003F80CD33D6C33DD51AB7C8FE2038D8C814 :10D71C00FE3DC8FE5FC8FE2EC8FE3AC8FE3BC8FEE2 :10D72C003CC8FE3EC9ED5B59D41AB7C8FE20C013E5 :10D73C0018F7856FD024C9CDE8D721A6D4060B7E67 :10D74C002BFE20200410F81804FE48282B219CD412 :10 ;Address of User/Disk Flag bdos equ 5 ;Address of BDOS Entry Point org 100h lxi d,prmpt ;Print User Prompt mvi c,9 ;PRINT function call bdos lhld bdos+1 ;Get address of BDOS mov a,h ;High-Order Address in A sui 8 ;A=High-Order Address of CPR mov h,a ;HL=Address of CPR mvi l,0 shld cpr ;Save address in buffer 7 :10D53C00263177D4CDABD5CD01D6C641CDB2D5CD24 :10D54C0047D6FE0A3809D60AF53E31CDB2D5F1C61A :10D55C0030CDB2D5CD6BD6CDCCD6CD05D6CD01D672 :10D56C00325DD6CDE8D7C4F3D6118BD5D53ADFD7FB :10D57C00B7C2E3DACD67D8C2E3DA7E23666FE9CDB2 :10D58C00D4D7CDE8D73A9CD4D62021DFD7B6C2F376 :10D59C00D6189ECDE9D54E6F2046696C6580C93E84 :10D5AC000DCDB2D53E0AC50E025FE5CD0500E1C139 :10D5BC00C90E01CDE2D5C362D6F53E00B72806F1FF :10D5CC00C50E0518E4F1F5CDB2D5F1FE0ACAE7D9BE :10D5DC00C9119BD40E14C5CD0500C1B7C9F5CDAB8F :10D5EC00D5F1E  D75C000100117EFE20281823D630FE0A30135704 :10D76C007907070781380B8138088238054F10E399 :10D77C0079C9C3F3D6CDE8D7219CD4110000060B90 :10D78C007EFE20282DFE482829D63038E5FE0A38A2 :10D79C0006D607FE1030DB234F7A07070707E6F0A3 :10D7AC00577B070707075FE60FB2577BE6F0B15FC1 :10D7BC0010CEEB7DC921800081CD3ED77EC9AF3222 :10D7CC009BD4CDDED7C81807CDDED7C83A5DD6C3FB :10D7DC0011D63E00B7C83D215DD6BEC9219BD4AF42 :10D7EC0032DFD7CD31D7ED535BD41AB7280ADE40E0 :10D7FC0047131AFE3A28071B3A5DD677180678327B :10D80C00DFD77013AF3 :10DAEC00D7B7CA8ED53D325DD6CD5CD6CD11D6C357 :10DAFC008ED53AA4D4FE20C2F3D62177D411A4D467 :10DB0C00010300EDB0210001E5CD92DBE1C02270F4 :10DB1C00DBCDD4D7CDE8D721DFD7E57E329BD4211E :10DB2C00ABD4CDEBD7E17E32ABD4AF32BBD4115CEE :10DB3C0000219BD4012100EDB02108D47EB7280729 :10DB4C00FE2028032318F506001181007E12B72849 :10DB5C000504231318F678328000CDABD5CD05D64D :10DB6C00CD4DD6CD0001CD05D6CD5CD6CD11D6C3CD :10DB7C003DD5E1CD42D6CDD4D7C3F3D6CD81D7E5B3 :10DB8C00CDE8D7E120F3CD9BDBF5CD42D6F1C92210 :10DB9C00CBDBCD59D4CDCAD7CD16D6CAE4D9CDABD53E171E :10D98C0032BCD421BDD436FF060021BDD47EFE802E :10D99C003809E5CDDDD5E1203DAF7734218000CDD0 :10D9AC003ED77EE67FFE1AC8FE0D280EFE0A280A18 :10D9BC00FE09280DCDC5D5041812CDC5D506001805 :10D9CC000B3E20CDC5D50478E60720F5CDE2D62850 :10D9DC00B9FE03C818B43DC8C382DBE521BCD435FD :10D9EC00201036163E00FE502808CDBDD5FE03CAC9 :10D9FC008BD5E1C9CD43D76F2600E5CD53DA0E1692 :10DA0C00CD1FD6E1283AAF32BBD4CD31D713FE535C :10DA1C0028021B29ED5359D41100017CB528182B71 :10DA2C00E521800019E5CD08D:10D40000C305D5C301D55000202020202020202096 :08D41000202020202020200034 :04D4590008D417D408 :10D47700434F4D00242424202020202053554200D0 :01D4870000A4 :10D4BC00160000444952208DD84C49535467D95416 :10D4CC005950456BD955534552CBDA44465520D566 :10D4DC00DA474F2020E2DA455241203ED9534156DB :10D4EC004504DA52454E2087DA474554208CDB4AF6 :10D4FC00554D50DDDAAF3207D43177D4C5791F1FC3 :10D50C001F1FE60F5FCD49D6CD0CD6322DD5C17974 :10D51C00E60F325DD62806CD11D6322DD5117AD430 :10D52C003E00B72FC42BD62F322DD53A07D4B720B2BED40608CD38D80603FE6E :10D81C002E200613CD38D81803CD59D8060423363C :10D82C000010FBED5359D43ABED4B7C9CD14D72848 :10D83C001C23FE2A2007363FCD5FD818077713FE2E :10D84C003FCC5FD810E6CD14D7C81318F923362077 :10D85C0010FBC93ABED43C32BED4C921BFD40E0B86 :10D86C00119CD406041ABE200A132310F81AFE20A9 :10D87C002004C92310FD23230D20E50CC93E80F59F :10D88C00CDE8D7CDCAD7219CD47EFE20CC32D9CDC1 :10D89C0031D706002816FE412806FE53200E0680BE :10D8AC0013ED5359D4FE532803F1AFF5F1571E0075 :10D8BC00D57832D9D8CD28D6CC9FD528673D47D63243D632B2DBCDCAD7CD168E :10DBAC00D6201B3E00FE00280932B2DB5FCD49D6E1 :10DBBC0018E921DFD7AFB6C27EDB360118DD2100B4 :10DBCC00013ED3BC3816E5EBCD08D6119BD4CDE085 :10DBDC00D5E120061180001918E73DC8CDE9D546DE :08DBEC00756C6C803E01B7C9A5 :0000000000 6119BD40E15CDE269 :10DA3C00D5D1E1200B18E4119BD4CD24D63C200386 :10DA4C00CDE8DBCD05D6C9CDE8D7C2F3D6CDCAD744 :10DA5C00CD28D6119BD4C8D5CDE9D544656C657459 :10DA6C00652046696C653F80CDBDD5D1FE59C28B12 :10DA7C00D5D5CD3ED6D1C9CD53DA3ADFD7F5219BDA :10DA8C00D411ABD4011000EDB0CD31D7FE3D202820 :10DA9C00EB232259D4CDE8D7201EF14721DFD77EC6 :10DAAC00B72804B870201170AF329BD4119BD40EE0 :10DABC0017CD1FD6C0CD9FD5C382DBCDEDD65FCDA4 :10DACC0049D6C38ED5CDEDD632B0DB18F5CD81D786 :10DADC00183C21000118373A9CD4FE2020143ADF607 :10D53C00263177D4CDABD5CD01D6C641CDB2D5CD24 :10D54C0047D6FE0A3809D60AF53E31CDB2D5F1C61A :10D55C0030CDB2D5CD6BD6CDCCD6CD05D6CD01D672 :10D56C00325DD6CDE8D7C4F3D6118BD5D53ADFD7FB :10D57C00B7C2E7DACD6BD8C2E7DA7E23666FE9CDA6 :10D58C00D4D7CDE8D73A9CD4D62021DFD7B6C2F376 :10D59C00D6189ECDE9D54E6F2046696C6580C93E84 :10D5AC000DCDB2D53E0AC50E025FE5CD0500E1C139 :10D5BC00C90E01CDE2D5C362D6F53E00B72806F1FF :10D5CC00C50E0518E4F1F5CDB2D5F1FE0ACAEBD9BA :10D5DC00C9119BD40E14C5CD0500C1B7C9F5CDAB8F :10D5EC00D5F1E0F0F37 :10D8CC000FE6604F3E0ACDC1D7D1D5A2FE00204A4B :10D8DC00D17B1CD5E603F52005CDABD51808CDEED4 :10D8EC00D520207C2080060178CDC1D7E67FFE2094 :10D8FC002013F1F5FE03200B3E09CDC1D7E67FFEC8 :10D90C002028163E20CDB2D50478FE0C300BFE0933 :10D91C0020D63E2ECDB2D518CFF1CDE2D62005CDF6 :10D92C002FD61897D1C9060B363F2310FBC9CDE86B :10D93C00D7FE0B2013CDE9D5416C6C3F80CDBDD506 :10D94C00FE59C23DD5CDABD5CDCAD7AF47CDB9D891 :10D95C00119BD4CD3ED6C93EFF1801AF32C7D5CDF1 :10D96C00E8D7C2F3D6CD31D732F1D9280513EB2243 :10D97C00  3F5CDF6D5F1E3C97ECDB2D57E23E9 :10D5FC00B7C8F818F50E1918091180000E1A180280 :10D60C000E0DC305005F0E0E18F8AF32BBD4119B84 :10D61C00D40E0FCD05003CC90E1018F7119BD40E7B :10D62C001118F00E1218EC212DD57EB7C83600114A :10D63C007AD40E1318CC3E005F18021EFF0E201871 :10D64C00C1CD47D687878787215DD6B6320400C9FE :10D65C003E00320400C9FE61D8FE7BD0E65FC93AB9 :10D66C002DD5B72845117AD4D5CD1DD6D1283B3A26 :10D67C0089D43D329AD4CDE0D5202F1107D4218006 :10D68C0000015000EDB02188D436002335117AD436 :10D69C00CD24D628153E24CDB2D5210513EB2259D4CDCAD7CD16D6CAE8D9CDCA :10D98C00ABD53E1732BCD421BDD436FF060021BD29 :10D99C00D47EFE803809E5CDDDD5E1203DAF77346E :10D9AC00218000CD3ED77EE67FFE1AC8FE0D280EE4 :10D9BC00FE0A280AFE09280DCDC5D5041812CDC5BE :10D9CC00D50600180B3E20CDC5D50478E60720F50A :10D9DC00CDE2D628B9FE03C818B43DC8C386DBE532 :10D9EC0021BCD435201036163E00FE502808CDBD83 :10D9FC00D5FE03CA8BD5E1C9CD43D76F2600E5CD43 :10DA0C0057DA0E16CD1FD6E1283AAF32BBD4CD3142 :10DA1C00D713FE5328021B29ED5359D41100017C56 :10DA2C00B528182BE5218000177013AF32BED40608CD3C81 :10D81C00D80603FE2E200613CD3CD81803CD5DD8B8 :10D82C00060423360010FBED5359D43ABED4B7C9C5 :10D83C00CD14D7281C23FE2A2007363FCD63D818D9 :10D84C00077713FE3FCC63D810E6CD14D7C8131856 :10D85C00F923362010FBC93ABED43C32BED4C921C0 :10D86C00BFD40E0B119CD406041ABE200A1323102D :10D87C00F81AFE202004C92310FD23230D20E50CEB :10D88C00C93E80F5CDE8D7CDCAD7219CD47EFE20E9 :10D89C00CC36D9CD31D706002816FE412806FE53CA :10D8AC00200E068013ED5359D4FE532803F1AFF527 :10D8BC00F1571E00D57832DDD8CD28D6CC9F22CFDBCD47D63243D632B6DBCD58 :10DBAC00CAD7CD16D6201B3E00FE00280932B6DBA4 :10DBBC005FCD49D618E921DFD7AFB6C282DB36017B :10DBCC0018DD2100013ED3BC3816E5EBCD08D6118B :10DBDC009BD4CDE0D5E120061180001918E73DC893 :0CDBEC00CDE9D546756C6C803E01B7C9D0 :0000000000 08D4CDF6D52F :10D6AC00CDE2D6C8CD33D6C33DD5CD33D6CD4DD6B0 :10D6BC003E3ECDB2D50E0A1106D4CD0500C35CD6C4 :10D6CC002107D44604237ECD62D67710F83600218C :10D6DC0008D42259D4C9D50E0BCDE2D5C4BDD5D1B1 :10D6EC00C9CD43D7FE10D8CDABD52A5BD47EFE2056 :10D6FC00280BB72808E5CDB2D5E12318F0CDEED52F :10D70C003F80CD33D6C33DD51AB7C8FE2038D8C814 :10D71C00FE3DC8FE5FC8FE2EC8FE3AC8FE3BC8FEE2 :10D72C003CC8FE3EC9ED5B59D41AB7C8FE20C013E5 :10D73C0018F7856FD024C9CDE8D721A6D4060B7E67 :10D74C002BFE20200410F81804FE48282B219CD412 :109E5CD08D6119BD41B :10DA3C000E15CDE2D5D1E1200B18E4119BD4CD24E9 :10DA4C00D63C2003CDECDBCD05D6C9CDE8D7C2F34F :10DA5C00D6CDCAD7CD28D6119BD4C8D5CDE9D544BF :10DA6C00656C6574652046696C653F80CDBDD5D10C :10DA7C00FE59C28BD5D5CD3ED6D1C9CD57DA3ADFBA :10DA8C00D7F5219BD411ABD4011000EDB0CD31D71B :10DA9C00FE3D2028EB232259D4CDE8D7201EF14798 :10DAAC0021DFD77EB72804B870201170AF329BD419 :10DABC00119BD40E17CD1FD6C0CD9FD5C386DBCD01 :10DACC00EDD65FCD49D6C38ED5CDEDD632B4DB18AD :10DADC00F5CD81D7183C21000118373A9CD4FE2093D5288F :10D8CC00673D0F0F0FE6604F3E0ACDC1D7D1D5A2F1 :10D8DC00FE00204AD17B1CD5E603F52005CDABD547 :10D8EC001808CDEED520207C2080060178CDC1D73C :10D8FC00E67FFE202013F1F5FE03200B3E09CDC17F :10D90C00D7E67FFE2028163E20CDB2D50478FE0C3B :10D91C00300BFE0920D63E2ECDB2D518CFF1CDE27C :10D92C00D62005CD2FD61897D1C9060B363F23101C :10D93C00FBC9CDE8D7FE0B2013CDE9D5416C6C3F6C :10D94C0080CDBDD5FE59C23DD5CDABD5CDCAD7AF57 :10D95C0047CDBDD8119BD4CD3ED6C93EFF1801AFE3 :10D96C0032C7D5CDE8D7C2F3D6CD31D732F5D928C9 :10D97C00D75C000100117EFE20281823D630FE0A30135704 :10D76C007907070781380B8138088238054F10E399 :10D77C0079C9C3F3D6CDE8D7219CD4110000060B90 :10D78C007EFE20282DFE482829D63038E5FE0A38A2 :10D79C0006D607FE1030DB234F7A07070707E6F0A3 :10D7AC00577B070707075FE60FB2577BE6F0B15FC1 :10D7BC0010CEEB7DC921800081CD3ED77EC9AF3222 :10D7CC009BD4CDDED7C81807CDDED7C83A5DD6C3FB :10D7DC0011D63E00B7C83D215DD6BEC9219BD4AF42 :10D7EC0032DFD7CD31D7ED535BD41AB7280EDE40DC :10D7FC0047131AFE3A280BFE3B28071B3A5DD677D7 :10D80C0018067832DFD :10DAEC0020143ADFD7B7CA8ED53D325DD6CD5CD681 :10DAFC00CD11D6C38ED53AA4D4FE20C2F3D621774D :10DB0C00D411A4D4010300EDB0210001E5CD96DBC6 :10DB1C00E1C02274DBCDD4D7CDE8D721DFD7E57EA9 :10DB2C00329BD421ABD4CDEBD7E17E32ABD4AF3228 :10DB3C00BBD4115C00219BD4012100EDB02108D491 :10DB4C007EB72807FE2028032318F5060011810054 :10DB5C007E12B7280504231318F678328000CDAB5B :10DB6C00D5CD05D6CD4DD6CD0001CD05D6CD5CD6C7 :10DB7C00CD11D6C33DD5E1CD42D6CDD4D7C3F3D646 :10DB8C00CD81D7E5CDE8D7E120F3CD9FDBF5CD42B4 :10DB9C00D6F1C9  :10E40000C305E5C301E55000202020202020202066 :08E41000202020202020200024 :04E4590008E417E4D8 :10E47700434F4D00242424202020202053554200C0 :01E487000094 :10E4BC001600004449522089E84C49535463E954EE :10E4CC0059504567E955534552C7EA44465520D142 :10E4DC00EA474F2020DEEA455241203AE9534156A3 :10E4EC004500EA52454E2083EA4745542088EB4AC2 :10E4FC00554D50D9EAAF3207E43177E4C5791F1F87 :10E50C001F1FE60F5FCD49E6CD0CE6322DE5C17934 :10E51C00E60F325DE62806CD11E6322DE5117AE4E0 :10E52C003E00B72FC42BE62F322DE53A07E4B72072BEE40608CD38E80603FE2E :10E81C002E200613CD38E81803CD59E8060423360C :10E82C000010FBED5359E43ABEE4B7C9CD14E72808 :10E83C001C23FE2A2007363FCD5FE818077713FE0E :10E84C003FCC5FE810E6CD14E7C81318F923362047 :10E85C0010FBC93ABEE43C32BEE4C921BFE40E0B46 :10E86C00119CE406041ABE200A132310F81AFE2089 :10E87C002004C92310FD23230D20E50CC93E80F58F :10E88C00CDE8E7CDCAE7219CE47EFE20CC32E9CD71 :10E89C0031E706002816FE412806FE53200E06809E :10E8AC0013ED5359E4FE532803F1AFF5F1571E0055 :10E8BC00D57832D9E8CD28E6CC9FE528673D08E4CDF6E5DF :10E6AC00CDE2E6C8CD33E6C33DE5CD33E6CD4DE650 :10E6BC003E3ECDB2E50E0A1106E4CD0500C35CE684 :10E6CC002107E44604237ECD62E67710F83600215C :10E6DC0008E42259E4C9D50E0BCDE2E5C4BDE5D161 :10E6EC00C9CD43E7FE10D8CDABE52A5BE47EFE2016 :10E6FC00280BB72808E5CDB2E5E12318F0CDEEE5FF :10E70C003F80CD33E6C33DE51AB7C8FE2038D8C8E4 :10E71C00FE3DC8FE5FC8FE2EC8FE3AC8FE3BC8FED2 :10E72C003CC8FE3EC9ED5B59E41AB7C8FE20C013C5 :10E73C0018F7856FD024C9CDE8E721A6E4060B7E37 :10E74C002BFE20200410F81804FE48282B219CE4F2 :106119BE40E15CDE239 :10EA3C00E5D1E1200B18E4119BE4CD24E63C200346 :10EA4C00CDE8EBCD05E6C9CDE8E7C2F3E6CDCAE7E4 :10EA5C00CD28E6119BE4C8D5CDE9E544656C657419 :10EA6C00652046696C653F80CDBDE5D1FE59C28BF2 :10EA7C00E5D5CD3EE6D1C9CD53EA3ADFE7F5219B8A :10EA8C00E411ABE4011000EDB0CD31E7FE3D2028E0 :10EA9C00EB232259E4CDE8E7201EF14721DFE77E86 :10EAAC00B72804B870201170AF329BE4119BE40EB0 :10EABC0017CD1FE6C0CD9FE5C382EBCDEDE65FCD54 :10EACC0049E6C38EE5CDEDE632B0EB18F5CD81E726 :10EADC00183C21000118373A9CE4FE2020143ADF407 :10E53C00263177E4CDABE5CD01E6C641CDB2E5CDD4 :10E54C0047E6FE0A3809D60AF53E31CDB2E5F1C6EA :10E55C0030CDB2E5CD6BE6CDCCE6CD05E6CD01E612 :10E56C00325DE6CDE8E7C4F3E6118BE5D53ADFE79B :10E57C00B7C2E3EACD67E8C2E3EA7E23666FE9CD72 :10E58C00D4E7CDE8E73A9CE4D62021DFE7B6C2F326 :10E59C00E6189ECDE9E54E6F2046696C6580C93E54 :10E5AC000DCDB2E53E0AC50E025FE5CD0500E1C119 :10E5BC00C90E01CDE2E5C362E6F53E00B72806F1CF :10E5CC00C50E0518E4F1F5CDB2E5F1FE0ACAE7E98E :10E5DC00C9119BE40E14C5CD0500C1B7C9F5CDAB6F :10E5EC00E5F1E0F0FF7 :10E8CC000FE6604F3E0ACDC1E7D1D5A2FE00204A2B :10E8DC00D17B1CD5E603F52005CDABE51808CDEEB4 :10E8EC00E520207C2080060178CDC1E7E67FFE2064 :10E8FC002013F1F5FE03200B3E09CDC1E7E67FFEA8 :10E90C002028163E20CDB2E50478FE0C300BFE0913 :10E91C0020D63E2ECDB2E518CFF1CDE2E62005CDC6 :10E92C002FE61897D1C9060B363F2310FBC9CDE84B :10E93C00E7FE0B2013CDE9E5416C6C3F80CDBDE5C6 :10E94C00FE59C23DE5CDABE5CDCAE7AF47CDB9E841 :10E95C00119BE4CD3EE6C93EFF1801AF32C7E5CDB1 :10E96C00E8E7C2F3E6CD31E732F1E9280513EB22F3 :10E97C00E75C000100117EFE20281823D630FE0A301357F4 :10E76C007907070781380B8138088238054F10E389 :10E77C0079C9C3F3E6CDE8E7219CE4110000060B50 :10E78C007EFE20282DFE482829D63038E5FE0A3892 :10E79C0006D607FE1030DB234F7A07070707E6F093 :10E7AC00577B070707075FE60FB2577BE6F0B15FB1 :10E7BC0010CEEB7DC921800081CD3EE77EC9AF3202 :10E7CC009BE4CDDEE7C81807CDDEE7C83A5DE6C3AB :10E7DC0011E63E00B7C83D215DE6BEC9219BE4AF02 :10E7EC0032DFE7CD31E7ED535BE41AB7280ADE40A0 :10E7FC0047131AFE3A28071B3A5DE677180678325B :10E80C00DFE77013AF3 :10EAEC00E7B7CA8EE53D325DE6CD5CE6CD11E6C3F7 :10EAFC008EE53AA4E4FE20C2F3E62177E411A4E407 :10EB0C00010300EDB0210001E5CD92EBE1C02270D4 :10EB1C00EBCDD4E7CDE8E721DFE7E57E329BE421BE :10EB2C00ABE4CDEBE7E17E32ABE4AF32BBE4115C9E :10EB3C0000219BE4012100EDB02108E47EB72807F9 :10EB4C00FE2028032318F506001181007E12B72839 :10EB5C000504231318F678328000CDABE5CD05E61D :10EB6C00CD4DE6CD0001CD05E6CD5CE6CD11E6C37D :10EB7C003DE5E1CD42E6CDD4E7C3F3E6CD81E7E553 :10EB8C00CDE8E7E120F3CD9BEBF5CD42E6F1C922D0 :10EB9C00CBEBCD3F5CDF6E5F1E3C97ECDB2E57E23A9 :10E5FC00B7C8F818F50E1918091180000E1A180270 :10E60C000E0DC305005F0E0E18F8AF32BBE4119B64 :10E61C00E40E0FCD05003CC90E1018F7119BE40E4B :10E62C001118F00E1218EC212DE57EB7C83600112A :10E63C007AE40E1318CC3E005F18021EFF0E201851 :10E64C00C1CD47E687878787215DE6B6320400C9CE :10E65C003E00320400C9FE61D8FE7BD0E65FC93AA9 :10E66C002DE5B72845117AE4D5CD1DE6D1283B3AE6 :10E67C0089E43D329AE4CDE0E5202F1107E42180B6 :10E68C0000015000EDB02188E436002335117AE406 :10E69C00CD24E628153E24CDB2E52159E4CDCAE7CD16E6CAE4E9CDABE53E17BE :10E98C0032BCE421BDE436FF060021BDE47EFE80EE :10E99C003809E5CDDDE5E1203DAF7734218000CDB0 :10E9AC003EE77EE67FFE1AC8FE0D280EFE0A280AF8 :10E9BC00FE09280DCDC5E5041812CDC5E5060018D5 :10E9CC000B3E20CDC5E50478E60720F5CDE2E62820 :10E9DC00B9FE03C818B43DC8C382EBE521BCE435CD :10E9EC00201036163E00FE502808CDBDE5FE03CAA9 :10E9FC008BE5E1C9CD43E76F2600E5CD53EA0E1652 :10EA0C00CD1FE6E1283AAF32BBE4CD31E713FE531C :10EA1C0028021B29ED5359E41100017CB528182B51 :10EA2C00E521800019E5CD08E  47E63243E632B2EBCDCAE7CD162E :10EBAC00E6201B3E00FE00280932B2EB5FCD49E6A1 :10EBBC0018E921DFE7AFB6C27EEB360118DD210084 :10EBCC00013EE3BC3816E5EBCD08E6119BE4CDE045 :10EBDC00E5E120061180001918E73DC8CDE9E546AE :08EBEC00756C6C803E01B7C995 :0000000000 08E4CDF6E5DF :10E6AC00CDE2E6C8CD33E6C33DE5CD33E6CD4DE650 :10E6BC003E3ECDB2E50E0A1106E4CD0500C35CE684 :10E6CC002107E44604237ECD62E67710F83600215C :10E6DC0008E42259E4C9D50E0BCDE2E5C4BDE5D161 :10E6EC00C9CD43E7FE10D8CDABE52A5BE47EFE2016 :10E6FC00280BB72808E5CDB2E5E12318F0CDEEE5FF :10E70C003F80CD33E6C33DE51AB7C8FE2038D8C8E4 :10E71C00FE3DC8FE5FC8FE2EC8FE3AC8FE3BC8FED2 :10E72C003CC8FE3EC9ED5B59E41AB7C8FE20C013C5 :10E73C0018F7856FD024C9CDE8E721A6E4060B7E37 :10E74C002BFE20200410F81804FE48282B219CE4F2 :107 :10E53C00263177E4CDABE5CD01E6C641CDB2E5CDD4 :10E54C0047E6FE0A3809D60AF53E31CDB2E5F1C6EA :10E55C0030CDB2E5CD6BE6CDCCE6CD05E6CD01E612 :10E56C00325DE6CDE8E7C4F3E6118BE5D53ADFE79B :10E57C00B7C2E7EACD6BE8C2E7EA7E23666FE9CD66 :10E58C00D4E7CDE8E73A9CE4D62021DFE7B6C2F326 :10E59C00E6189ECDE9E54E6F2046696C6580C93E54 :10E5AC000DCDB2E53E0AC50E025FE5CD0500E1C119 :10E5BC00C90E01CDE2E5C362E6F53E00B72806F1CF :10E5CC00C50E0518E4F1F5CDB2E5F1FE0ACAEBE98A :10E5DC00C9119BE40E14C5CD0500C1B7C9F5CDAB6F :10E5EC00E5F1EE5284F :10E8CC00673D0F0F0FE6604F3E0ACDC1E7D1D5A2D1 :10E8DC00FE00204AD17B1CD5E603F52005CDABE527 :10E8EC001808CDEEE520207C2080060178CDC1E70C :10E8FC00E67FFE202013F1F5FE03200B3E09CDC16F :10E90C00E7E67FFE2028163E20CDB2E50478FE0C0B :10E91C00300BFE0920D63E2ECDB2E518CFF1CDE25C :10E92C00E62005CD2FE61897D1C9060B363F2310EC :10E93C00FBC9CDE8E7FE0B2013CDE9E5416C6C3F3C :10E94C0080CDBDE5FE59C23DE5CDABE5CDCAE7AF07 :10E95C0047CDBDE8119BE4CD3EE6C93EFF1801AFA3 :10E96C0032C7E5CDE8E7C2F3E6CD31E732F5E92869 :10E97C00E75C000100117EFE20281823D630FE0A301357F4 :10E76C007907070781380B8138088238054F10E389 :10E77C0079C9C3F3E6CDE8E7219CE4110000060B50 :10E78C007EFE20282DFE482829D63038E5FE0A3892 :10E79C0006D607FE1030DB234F7A07070707E6F093 :10E7AC00577B070707075FE60FB2577BE6F0B15FB1 :10E7BC0010CEEB7DC921800081CD3EE77EC9AF3202 :10E7CC009BE4CDDEE7C81807CDDEE7C83A5DE6C3AB :10E7DC0011E63E00B7C83D215DE6BEC9219BE4AF02 :10E7EC0032DFE7CD31E7ED535BE41AB7280EDE409C :10E7FC0047131AFE3A280BFE3B28071B3A5DE677B7 :10E80C0018067832DFE3F5CDF6E5F1E3C97ECDB2E57E23A9 :10E5FC00B7C8F818F50E1918091180000E1A180270 :10E60C000E0DC305005F0E0E18F8AF32BBE4119B64 :10E61C00E40E0FCD05003CC90E1018F7119BE40E4B :10E62C001118F00E1218EC212DE57EB7C83600112A :10E63C007AE40E1318CC3E005F18021EFF0E201851 :10E64C00C1CD47E687878787215DE6B6320400C9CE :10E65C003E00320400C9FE61D8FE7BD0E65FC93AA9 :10E66C002DE5B72845117AE4D5CD1DE6D1283B3AE6 :10E67C0089E43D329AE4CDE0E5202F1107E42180B6 :10E68C0000015000EDB02188E436002335117AE406 :10E69C00CD24E628153E24CDB2E5210513EB2259E4CDCAE7CD16E6CAE8E9CD7A :10E98C00ABE53E1732BCE421BDE436FF060021BDE9 :10E99C00E47EFE803809E5CDDDE5E1203DAF77343E :10E9AC00218000CD3EE77EE67FFE1AC8FE0D280EC4 :10E9BC00FE0A280AFE09280DCDC5E5041812CDC59E :10E9CC00E50600180B3E20CDC5E50478E60720F5DA :10E9DC00CDE2E628B9FE03C818B43DC8C386EBE502 :10E9EC0021BCE435201036163E00FE502808CDBD63 :10E9FC00E5FE03CA8BE5E1C9CD43E76F2600E5CD03 :10EA0C0057EA0E16CD1FE6E1283AAF32BBE4CD3102 :10EA1C00E713FE5328021B29ED5359E41100017C26 :10EA2C00B528182BE52180001:10E40000C305E5C301E55000202020202020202066 :08E41000202020202020200024 :04E4590008E417E4D8 :10E47700434F4D00242424202020202053554200C0 :01E487000094 :10E4BC00160000444952208DE84C49535467E954E6 :10E4CC005950456BE955534552CBEA44465520D536 :10E4DC00EA474F2020E2EA455241203EE95341569B :10E4EC004504EA52454E2087EA474554208CEB4AB6 :10E4FC00554D50DDEAAF3207E43177E4C5791F1F83 :10E50C001F1FE60F5FCD49E6CD0CE6322DE5C17934 :10E51C00E60F325DE62806CD11E6322DE5117AE4E0 :10E52C003E00B72FC42BE62F322DE53A07E4B720777013AF32BEE40608CD3C51 :10E81C00E80603FE2E200613CD3CE81803CD5DE878 :10E82C00060423360010FBED5359E43ABEE4B7C995 :10E83C00CD14E7281C23FE2A2007363FCD63E818A9 :10E84C00077713FE3FCC63E810E6CD14E7C8131826 :10E85C00F923362010FBC93ABEE43C32BEE4C92190 :10E86C00BFE40E0B119CE406041ABE200A132310FD :10E87C00F81AFE202004C92310FD23230D20E50CDB :10E88C00C93E80F5CDE8E7CDCAE7219CE47EFE20A9 :10E89C00CC36E9CD31E706002816FE412806FE539A :10E8AC00200E068013ED5359E4FE532803F1AFF507 :10E8BC00F1571E00D57832DDE8CD28E6CC9F!  9E5CD08E6119BE4EB :10EA3C000E15CDE2E5D1E1200B18E4119BE4CD24B9 :10EA4C00E63C2003CDECEBCD05E6C9CDE8E7C2F3FF :10EA5C00E6CDCAE7CD28E6119BE4C8D5CDE9E5445F :10EA6C00656C6574652046696C653F80CDBDE5D1EC :10EA7C00FE59C28BE5D5CD3EE6D1C9CD57EA3ADF7A :10EA8C00E7F5219BE411ABE4011000EDB0CD31E7CB :10EA9C00FE3D2028EB232259E4CDE8E7201EF14768 :10EAAC0021DFE77EB72804B870201170AF329BE4E9 :10EABC00119BE40E17CD1FE6C0CD9FE5C386EBCDB1 :10EACC00EDE65FCD49E6C38EE5CDEDE632B4EB184D :10EADC00F5CD81E7183C21000118373A9CE4FE20637 :10E13C00263177E0CDABE1CD01E2C641CDB2E1CDE8 :10E14C0047E2FE0A3809D60AF53E31CDB2E1F1C6F6 :10E15C0030CDB2E1CD6BE2CDCCE2CD05E2CD01E22A :10E16C00325DE2CDE8E3C4F3E2118BE1D53ADFE3B3 :10E17C00B7C2E3E6CD67E4C2E3E67E23666FE9CD82 :10E18C00D4E3CDE8E33A9CE0D62021DFE3B6C2F33A :10E19C00E2189ECDE9E14E6F2046696C6580C93E60 :10E1AC000DCDB2E13E0AC50E025FE5CD0500E1C121 :10E1BC00C90E01CDE2E1C362E2F53E00B72806F1DB :10E1CC00C50E0518E4F1F5CDB2E1F1FE0ACAE7E59A :10E1DC00C9119BE00E14C5CD0500C1B7C9F5CDAB77 :10E1EC00E1F1EE35C000100117EFE20281823D630FE0A301357F8 :10E36C007907070781380B8138088238054F10E38D :10E37C0079C9C3F3E2CDE8E3219CE0110000060B60 :10E38C007EFE20282DFE482829D63038E5FE0A3896 :10E39C0006D607FE1030DB234F7A07070707E6F097 :10E3AC00577B070707075FE60FB2577BE6F0B15FB5 :10E3BC0010CEEB7DC921800081CD3EE37EC9AF320A :10E3CC009BE0CDDEE3C81807CDDEE3C83A5DE2C3BF :10E3DC0011E23E00B7C83D215DE2BEC9219BE0AF12 :10E3EC0032DFE3CD31E3ED535BE01AB7280ADE40B0 :10E3FC0047131AFE3A28071B3A5DE2771806783263 :10E40C00DFE37013AF3 :10EAEC0020143ADFE7B7CA8EE53D325DE6CD5CE631 :10EAFC00CD11E6C38EE53AA4E4FE20C2F3E62177FD :10EB0C00E411A4E4010300EDB0210001E5CD96EB86 :10EB1C00E1C02274EBCDD4E7CDE8E721DFE7E57E59 :10EB2C00329BE421ABE4CDEBE7E17E32ABE4AF32D8 :10EB3C00BBE4115C00219BE4012100EDB02108E451 :10EB4C007EB72807FE2028032318F5060011810044 :10EB5C007E12B7280504231318F678328000CDAB4B :10EB6C00E5CD05E6CD4DE6CD0001CD05E6CD5CE667 :10EB7C00CD11E6C33DE5E1CD42E6CDD4E7C3F3E6E6 :10EB8C00CD81E7E5CDE8E7E120F3CD9FEBF5CD4274 :10EB9C00E6F1C93F5CDF6E1F1E3C97ECDB2E17E23B9 :10E1FC00B7C8F818F50E1918091180000E1A180274 :10E20C000E0DC305005F0E0E18F8AF32BBE0119B6C :10E21C00E00E0FCD05003CC90E1018F7119BE00E57 :10E22C001118F00E1218EC212DE17EB7C836001132 :10E23C007AE00E1318CC3E005F18021EFF0E201859 :10E24C00C1CD47E287878787215DE2B6320400C9DA :10E25C003E00320400C9FE61D8FE7BD0E65FC93AAD :10E26C002DE1B72845117AE0D5CD1DE2D1283B3AF6 :10E27C0089E03D329AE0CDE0E1202F1107E02180CA :10E28C0000015000EDB02188E036002335117AE012 :10E29C00CD24E228153E24CDB2E121:10E00000C305E1C301E15000202020202020202072 :08E01000202020202020200028 :04E0590008E017E0E4 :10E07700434F4D00242424202020202053554200C4 :01E087000098 :10E0BC001600004449522089E44C49535463E554FA :10E0CC0059504567E555534552C7E644465520D14E :10E0DC00E6474F2020DEE6455241203AE5534156B3 :10E0EC004500E652454E2083E64745542088E74AD2 :10E0FC00554D50D9E6AF3207E03177E0C5791F1F97 :10E10C001F1FE60F5FCD49E2CD0CE2322DE1C17944 :10E11C00E60F325DE22806CD11E2322DE1117AE0F4 :10E12C003E00B72FC42BE22F322DE13A07E0B72082BEE00608CD38E40603FE3E :10E41C002E200613CD38E41803CD59E40604233618 :10E42C000010FBED5359E03ABEE0B7C9CD14E32818 :10E43C001C23FE2A2007363FCD5FE418077713FE16 :10E44C003FCC5FE410E6CD14E3C81318F923362053 :10E45C0010FBC93ABEE03C32BEE0C921BFE00E0B56 :10E46C00119CE006041ABE200A132310F81AFE2091 :10E47C002004C92310FD23230D20E50CC93E80F593 :10E48C00CDE8E3CDCAE3219CE07EFE20CC32E5CD85 :10E49C0031E306002816FE412806FE53200E0680A6 :10E4AC0013ED5359E0FE532803F1AFF5F1571E005D :10E4BC00D57832D9E4CD28E2CC9FE128673D22CFEBCD47E63243E632B6EBCDF8 :10EBAC00CAE7CD16E6201B3E00FE00280932B6EB64 :10EBBC005FCD49E618E921DFE7AFB6C282EB36013B :10EBCC0018DD2100013EE3BC3816E5EBCD08E6115B :10EBDC009BE4CDE0E5E120061180001918E73DC863 :0CEBEC00CDE9E546756C6C803E01B7C9B0 :0000000000 08E0CDF6E1F3 :10E2AC00CDE2E2C8CD33E2C33DE1CD33E2CD4DE268 :10E2BC003E3ECDB2E10E0A1106E0CD0500C35CE294 :10E2CC002107E04604237ECD62E27710F836002168 :10E2DC0008E02259E0C9D50E0BCDE2E1C4BDE1D175 :10E2EC00C9CD43E3FE10D8CDABE12A5BE07EFE2026 :10E2FC00280BB72808E5CDB2E1E12318F0CDEEE10B :10E30C003F80CD33E2C33DE11AB7C8FE2038D8C8F0 :10E31C00FE3DC8FE5FC8FE2EC8FE3AC8FE3BC8FED6 :10E32C003CC8FE3EC9ED5B59E01AB7C8FE20C013CD :10E33C0018F7856FD024C9CDE8E321A6E0060B7E43 :10E34C002BFE20200410F81804FE48282B219CE0FA :10"  0F0F07 :10E4CC000FE6604F3E0ACDC1E3D1D5A2FE00204A33 :10E4DC00D17B1CD5E603F52005CDABE11808CDEEBC :10E4EC00E120207C2080060178CDC1E3E67FFE2070 :10E4FC002013F1F5FE03200B3E09CDC1E3E67FFEB0 :10E50C002028163E20CDB2E10478FE0C300BFE091B :10E51C0020D63E2ECDB2E118CFF1CDE2E22005CDD2 :10E52C002FE21897D1C9060B363F2310FBC9CDE853 :10E53C00E3FE0B2013CDE9E1416C6C3F80CDBDE1D6 :10E54C00FE59C23DE1CDABE1CDCAE3AF47CDB9E455 :10E55C00119BE0CD3EE2C93EFF1801AF32C7E1CDC1 :10E56C00E8E3C2F3E2CD31E332F1E5280513EB2207 :10E57C00 :10E6EC00E3B7CA8EE13D325DE2CD5CE2CD11E2C30F :10E6FC008EE13AA4E0FE20C2F3E22177E011A4E01F :10E70C00010300EDB0210001E5CD92E7E1C02270DC :10E71C00E7CDD4E3CDE8E321DFE3E57E329BE021D6 :10E72C00ABE0CDEBE3E17E32ABE0AF32BBE0115CB2 :10E73C0000219BE0012100EDB02108E07EB7280705 :10E74C00FE2028032318F506001181007E12B7283D :10E75C000504231318F678328000CDABE1CD05E229 :10E76C00CD4DE2CD0001CD05E2CD5CE2CD11E2C391 :10E77C003DE1E1CD42E2CDD4E3C3F3E2CD81E3E56B :10E78C00CDE8E3E120F3CD9BE7F5CD42E2F1C922E0 :10E79C00CBE7CD3F5CDF6E1F1E3C97ECDB2E17E23B9 :10E1FC00B7C8F818F50E1918091180000E1A180274 :10E20C000E0DC305005F0E0E18F8AF32BBE0119B6C :10E21C00E00E0FCD05003CC90E1018F7119BE00E57 :10E22C001118F00E1218EC212DE17EB7C836001132 :10E23C007AE00E1318CC3E005F18021EFF0E201859 :10E24C00C1CD47E287878787215DE2B6320400C9DA :10E25C003E00320400C9FE61D8FE7BD0E65FC93AAD :10E26C002DE1B72845117AE0D5CD1DE2D1283B3AF6 :10E27C0089E03D329AE0CDE0E1202F1107E02180CA :10E28C0000015000EDB02188E036002335117AE012 :10E29C00CD24E228153E24CDB2E12159E0CDCAE3CD16E2CAE4E5CDABE13E17D6 :10E58C0032BCE021BDE036FF060021BDE07EFE80FE :10E59C003809E5CDDDE1E1203DAF7734218000CDB8 :10E5AC003EE37EE67FFE1AC8FE0D280EFE0A280A00 :10E5BC00FE09280DCDC5E1041812CDC5E1060018E1 :10E5CC000B3E20CDC5E10478E60720F5CDE2E2282C :10E5DC00B9FE03C818B43DC8C382E7E521BCE035D9 :10E5EC00201036163E00FE502808CDBDE1FE03CAB1 :10E5FC008BE1E1C9CD43E36F2600E5CD53E60E1662 :10E60C00CD1FE2E1283AAF32BBE0CD31E313FE532C :10E61C0028021B29ED5359E01100017CB528182B59 :10E62C00E521800019E5CD08E:10E00000C305E1C301E15000202020202020202072 :08E01000202020202020200028 :04E0590008E017E0E4 :10E07700434F4D00242424202020202053554200C4 :01E087000098 :10E0BC00160000444952208DE44C49535467E554F2 :10E0CC005950456BE555534552CBE644465520D542 :10E0DC00E6474F2020E2E6455241203EE5534156AB :10E0EC004504E652454E2087E6474554208CE74AC6 :10E0FC00554D50DDE6AF3207E03177E0C5791F1F93 :10E10C001F1FE60F5FCD49E2CD0CE2322DE1C17944 :10E11C00E60F325DE22806CD11E2322DE1117AE0F4 :10E12C003E00B72FC42BE22F322DE13A07E0B720847E23243E232B2E7CDCAE3CD1646 :10E7AC00E2201B3E00FE00280932B2E75FCD49E2B1 :10E7BC0018E921DFE3AFB6C27EE7360118DD210090 :10E7CC00013EDFBC3816E5EBCD08E2119BE0CDE055 :10E7DC00E1E120061180001918E73DC8CDE9E146BA :08E7EC00756C6C803E01B7C999 :0000000000 08E0CDF6E1F3 :10E2AC00CDE2E2C8CD33E2C33DE1CD33E2CD4DE268 :10E2BC003E3ECDB2E10E0A1106E0CD0500C35CE294 :10E2CC002107E04604237ECD62E27710F836002168 :10E2DC0008E02259E0C9D50E0BCDE2E1C4BDE1D175 :10E2EC00C9CD43E3FE10D8CDABE12A5BE07EFE2026 :10E2FC00280BB72808E5CDB2E1E12318F0CDEEE10B :10E30C003F80CD33E2C33DE11AB7C8FE2038D8C8F0 :10E31C00FE3DC8FE5FC8FE2EC8FE3AC8FE3BC8FED6 :10E32C003CC8FE3EC9ED5B59E01AB7C8FE20C013CD :10E33C0018F7856FD024C9CDE8E321A6E0060B7E43 :10E34C002BFE20200410F81804FE48282B219CE0FA :102119BE00E15CDE245 :10E63C00E1D1E1200B18E4119BE0CD24E23C200356 :10E64C00CDE8E7CD05E2C9CDE8E3C2F3E2CDCAE3FC :10E65C00CD28E2119BE0C8D5CDE9E144656C657429 :10E66C00652046696C653F80CDBDE1D1FE59C28BFA :10E67C00E1D5CD3EE2D1C9CD53E63ADFE3F5219B9E :10E68C00E011ABE0011000EDB0CD31E3FE3D2028F0 :10E69C00EB232259E0CDE8E3201EF14721DFE37E96 :10E6AC00B72804B870201170AF329BE0119BE00EBC :10E6BC0017CD1FE2C0CD9FE1C382E7CDEDE25FCD68 :10E6CC0049E2C38EE1CDEDE232B0E718F5CD81E33E :10E6DC00183C21000118373A9CE0FE2020143ADF487 :10E13C00263177E0CDABE1CD01E2C641CDB2E1CDE8 :10E14C0047E2FE0A3809D60AF53E31CDB2E1F1C6F6 :10E15C0030CDB2E1CD6BE2CDCCE2CD05E2CD01E22A :10E16C00325DE2CDE8E3C4F3E2118BE1D53ADFE3B3 :10E17C00B7C2E7E6CD6BE4C2E7E67E23666FE9CD76 :10E18C00D4E3CDE8E33A9CE0D62021DFE3B6C2F33A :10E19C00E2189ECDE9E14E6F2046696C6580C93E60 :10E1AC000DCDB2E13E0AC50E025FE5CD0500E1C121 :10E1BC00C90E01CDE2E1C362E2F53E00B72806F1DB :10E1CC00C50E0518E4F1F5CDB2E1F1FE0ACAEBE596 :10E1DC00C9119BE00E14C5CD0500C1B7C9F5CDAB77 :10E1EC00E1F1E#  E35C000100117EFE20281823D630FE0A301357F8 :10E36C007907070781380B8138088238054F10E38D :10E37C0079C9C3F3E2CDE8E3219CE0110000060B60 :10E38C007EFE20282DFE482829D63038E5FE0A3896 :10E39C0006D607FE1030DB234F7A07070707E6F097 :10E3AC00577B070707075FE60FB2577BE6F0B15FB5 :10E3BC0010CEEB7DC921800081CD3EE37EC9AF320A :10E3CC009BE0CDDEE3C81807CDDEE3C83A5DE2C3BF :10E3DC0011E23E00B7C83D215DE2BEC9219BE0AF12 :10E3EC0032DFE3CD31E3ED535BE01AB7280EDE40AC :10E3FC0047131AFE3A280BFE3B28071B3A5DE277BF :10E40C0018067832DFE :10E6EC0020143ADFE3B7CA8EE13D325DE2CD5CE245 :10E6FC00CD11E2C38EE13AA4E0FE20C2F3E2217711 :10E70C00E011A4E0010300EDB0210001E5CD96E796 :10E71C00E1C02274E7CDD4E3CDE8E321DFE3E57E6D :10E72C00329BE021ABE0CDEBE3E17E32ABE0AF32EC :10E73C00BBE0115C00219BE0012100EDB02108E061 :10E74C007EB72807FE2028032318F5060011810048 :10E75C007E12B7280504231318F678328000CDAB4F :10E76C00E1CD05E2CD4DE2CD0001CD05E2CD5CE27F :10E77C00CD11E2C33DE1E1CD42E2CDD4E3C3F3E2FE :10E78C00CD81E3E5CDE8E3E120F3CD9FE7F5CD4284 :10E79C00E2F1C90513EB2259E0CDCAE3CD16E2CAE8E5CD8E :10E58C00ABE13E1732BCE021BDE036FF060021BDF9 :10E59C00E07EFE803809E5CDDDE1E1203DAF77344A :10E5AC00218000CD3EE37EE67FFE1AC8FE0D280ECC :10E5BC00FE0A280AFE09280DCDC5E1041812CDC5A6 :10E5CC00E10600180B3E20CDC5E10478E60720F5E6 :10E5DC00CDE2E228B9FE03C818B43DC8C386E7E50E :10E5EC0021BCE035201036163E00FE502808CDBD6B :10E5FC00E1FE03CA8BE1E1C9CD43E36F2600E5CD13 :10E60C0057E60E16CD1FE2E1283AAF32BBE0CD3112 :10E61C00E313FE5328021B29ED5359E01100017C32 :10E62C00B528182BE52180001:10DE0000C305DFC301DF5000202020202020202078 :08DE100020202020202020002A :04DE590008DE17DEEA :10DE7700434F4D00242424202020202053554200C6 :01DE8700009A :10DEBC001600004449522089E24C49535463E35400 :10DECC0059504567E355534552C7E444465520D154 :10DEDC00E4474F2020DEE4455241203AE3534156BB :10DEEC004500E452454E2083E44745542088E54ADA :10DEFC00554D50D9E4AF3207DE3177DEC5791F1F9F :10DF0C001F1FE60F5FCD49E0CD0CE0322DDFC1794C :10DF1C00E60F325DE02806CD11E0322DDF117ADEFE :10DF2C003E00B72FC42BE02F322DDF3A07DEB720837013AF32BEE00608CD3C5D :10E41C00E40603FE2E200613CD3CE41803CD5DE488 :10E42C00060423360010FBED5359E03ABEE0B7C9A1 :10E43C00CD14E3281C23FE2A2007363FCD63E418B5 :10E44C00077713FE3FCC63E410E6CD14E3C8131832 :10E45C00F923362010FBC93ABEE03C32BEE0C9219C :10E46C00BFE00E0B119CE006041ABE200A13231009 :10E47C00F81AFE202004C92310FD23230D20E50CDF :10E48C00C93E80F5CDE8E3CDCAE3219CE07EFE20B9 :10E49C00CC36E5CD31E306002816FE412806FE53A6 :10E4AC00200E068013ED5359E0FE532803F1AFF50F :10E4BC00F1571E00D57832DDE4CD28E2CC9F22CFE7CD47E23243E232B6E7CD10 :10E7AC00CAE3CD16E2201B3E00FE00280932B6E774 :10E7BC005FCD49E218E921DFE3AFB6C282E736014B :10E7CC0018DD2100013EDFBC3816E5EBCD08E21167 :10E7DC009BE0CDE0E1E120061180001918E73DC86F :0CE7EC00CDE9E146756C6C803E01B7C9B8 :0000000000 9E5CD08E2119BE0F7 :10E63C000E15CDE2E1D1E1200B18E4119BE0CD24C5 :10E64C00E23C2003CDECE7CD05E2C9CDE8E3C2F313 :10E65C00E2CDCAE3CD28E2119BE0C8D5CDE9E14477 :10E66C00656C6574652046696C653F80CDBDE1D1F4 :10E67C00FE59C28BE1D5CD3EE2D1C9CD57E63ADF8A :10E68C00E3F5219BE011ABE0011000EDB0CD31E3DF :10E69C00FE3D2028EB232259E0CDE8E3201EF14774 :10E6AC0021DFE37EB72804B870201170AF329BE0F5 :10E6BC00119BE00E17CD1FE2C0CD9FE1C386E7CDC5 :10E6CC00EDE25FCD49E2C38EE1CDEDE232B4E71865 :10E6DC00F5CD81E3183C21000118373A9CE0FE206FF :10DF3C00263177DECDABDFCD01E0C641CDB2DFCDF2 :10DF4C0047E0FE0A3809D60AF53E31CDB2DFF1C6FC :10DF5C0030CDB2DFCD6BE0CDCCE0CD05E0CD01E036 :10DF6C00325DE0CDE8E1C4F3E0118BDFD53ADFE1BF :10DF7C00B7C2E3E4CD67E2C2E3E47E23666FE9CD8A :10DF8C00D4E1CDE8E13A9CDED62021DFE1B6C2F344 :10DF9C00E0189ECDE9DF4E6F2046696C6580C93E66 :10DFAC000DCDB2DF3E0AC50E025FE5CD0500E1C125 :10DFBC00C90E01CDE2DFC362E0F53E00B72806F1E1 :10DFCC00C50E0518E4F1F5CDB2DFF1FE0ACAE7E3A0 :10DFDC00C9119BDE0E14C5CD0500C1B7C9F5CDAB7B :10DFEC00DFF1EE1285F :10E4CC00673D0F0F0FE6604F3E0ACDC1E3D1D5A2D9 :10E4DC00FE00204AD17B1CD5E603F52005CDABE12F :10E4EC001808CDEEE120207C2080060178CDC1E318 :10E4FC00E67FFE202013F1F5FE03200B3E09CDC173 :10E50C00E3E67FFE2028163E20CDB2E10478FE0C17 :10E51C00300BFE0920D63E2ECDB2E118CFF1CDE264 :10E52C00E22005CD2FE21897D1C9060B363F2310F8 :10E53C00FBC9CDE8E3FE0B2013CDE9E1416C6C3F48 :10E54C0080CDBDE1FE59C23DE1CDABE1CDCAE3AF1B :10E55C0047CDBDE4119BE0CD3EE2C93EFF1801AFB3 :10E56C0032C7E1CDE8E3C2F3E2CD31E332F5E52881 :10E57C00$  3F5CDF6DFF1E3C97ECDB2DF7E23C1 :10DFFC00B7C8F818F50E1918091180000E1A180276 :10E00C000E0DC305005F0E0E18F8AF32BBDE119B70 :10E01C00DE0E0FCD05003CC90E1018F7119BDE0E5D :10E02C001118F00E1218EC212DDF7EB7C836001136 :10E03C007ADE0E1318CC3E005F18021EFF0E20185D :10E04C00C1CD47E087878787215DE0B6320400C9E0 :10E05C003E00320400C9FE61D8FE7BD0E65FC93AAF :10E06C002DDFB72845117ADED5CD1DE0D1283B3AFE :10E07C0089DE3D329ADECDE0DF202F1107DE2180D4 :10E08C0000015000EDB02188DE36002335117ADE18 :10E09C00CD24E028153E24CDB2DF2159DECDCAE1CD16E0CAE4E3CDABDF3E17E2 :10E38C0032BCDE21BDDE36FF060021BDDE7EFE8006 :10E39C003809E5CDDDDFE1203DAF7734218000CDBC :10E3AC003EE17EE67FFE1AC8FE0D280EFE0A280A04 :10E3BC00FE09280DCDC5DF041812CDC5DF060018E7 :10E3CC000B3E20CDC5DF0478E60720F5CDE2E02832 :10E3DC00B9FE03C818B43DC8C382E5E521BCDE35DF :10E3EC00201036163E00FE502808CDBDDFFE03CAB5 :10E3FC008BDFE1C9CD43E16F2600E5CD53E40E166A :10E40C00CD1FE0E1283AAF32BBDECD31E113FE5334 :10E41C0028021B29ED5359DE1100017CB528182B5D :10E42C00E521800019E5CD08E2BEDE0608CD38E20603FE46 :10E21C002E200613CD38E21803CD59E2060423361E :10E22C000010FBED5359DE3ABEDEB7C9CD14E12820 :10E23C001C23FE2A2007363FCD5FE218077713FE1A :10E24C003FCC5FE210E6CD14E1C81318F923362059 :10E25C0010FBC93ABEDE3C32BEDEC921BFDE0E0B5E :10E26C00119CDE06041ABE200A132310F81AFE2095 :10E27C002004C92310FD23230D20E50CC93E80F595 :10E28C00CDE8E1CDCAE1219CDE7EFE20CC32E3CD8F :10E29C0031E106002816FE412806FE53200E0680AA :10E2AC0013ED5359DEFE532803F1AFF5F1571E0061 :10E2BC00D57832D9E2CD28E0CC9FDF28673D47E03243E032B2E5CDCAE1CD1652 :10E5AC00E0201B3E00FE00280932B2E55FCD49E0B9 :10E5BC0018E921DFE1AFB6C27EE5360118DD210096 :10E5CC00013EDDBC3816E5EBCD08E0119BDECDE05D :10E5DC00DFE120061180001918E73DC8CDE9DF46C0 :08E5EC00756C6C803E01B7C99B :0000000000 08DECDF6DFFD :10E0AC00CDE2E0C8CD33E0C33DDFCD33E0CD4DE074 :10E0BC003E3ECDB2DF0E0A1106DECD0500C35CE09C :10E0CC002107DE4604237ECD62E07710F83600216E :10E0DC0008DE2259DEC9D50E0BCDE2DFC4BDDFD17F :10E0EC00C9CD43E1FE10D8CDABDF2A5BDE7EFE202E :10E0FC00280BB72808E5CDB2DFE12318F0CDEEDF11 :10E10C003F80CD33E0C33DDF1AB7C8FE2038D8C8F6 :10E11C00FE3DC8FE5FC8FE2EC8FE3AC8FE3BC8FED8 :10E12C003CC8FE3EC9ED5B59DE1AB7C8FE20C013D1 :10E13C0018F7856FD024C9CDE8E121A6DE060B7E49 :10E14C002BFE20200410F81804FE48282B219CDEFE :100119BDE0E15CDE24B :10E43C00DFD1E1200B18E4119BDECD24E03C20035E :10E44C00CDE8E5CD05E0C9CDE8E1C2F3E0CDCAE108 :10E45C00CD28E0119BDEC8D5CDE9DF44656C657431 :10E46C00652046696C653F80CDBDDFD1FE59C28BFE :10E47C00DFD5CD3EE0D1C9CD53E43ADFE1F5219BA8 :10E48C00DE11ABDE011000EDB0CD31E1FE3D2028F8 :10E49C00EB232259DECDE8E1201EF14721DFE17E9E :10E4AC00B72804B870201170AF329BDE119BDE0EC2 :10E4BC0017CD1FE0C0CD9FDFC382E5CDEDE05FCD72 :10E4CC0049E0C38EDFCDEDE032B0E518F5CD81E14A :10E4DC00183C21000118373A9CDEFE2020143ADF4C0F0F0F :10E2CC000FE6604F3E0ACDC1E1D1D5A2FE00204A37 :10E2DC00D17B1CD5E603F52005CDABDF1808CDEEC0 :10E2EC00DF20207C2080060178CDC1E1E67FFE2076 :10E2FC002013F1F5FE03200B3E09CDC1E1E67FFEB4 :10E30C002028163E20CDB2DF0478FE0C300BFE091F :10E31C0020D63E2ECDB2DF18CFF1CDE2E02005CDD8 :10E32C002FE01897D1C9060B363F2310FBC9CDE857 :10E33C00E1FE0B2013CDE9DF416C6C3F80CDBDDFDE :10E34C00FE59C23DDFCDABDFCDCAE1AF47CDB9E25F :10E35C00119BDECD3EE0C93EFF1801AF32C7DFCDC9 :10E36C00E8E1C2F3E0CD31E132F1E3280513EB2211 :10E37C00E15C000100117EFE20281823D630FE0A301357FA :10E16C007907070781380B8138088238054F10E38F :10E17C0079C9C3F3E0CDE8E1219CDE110000060B68 :10E18C007EFE20282DFE482829D63038E5FE0A3898 :10E19C0006D607FE1030DB234F7A07070707E6F099 :10E1AC00577B070707075FE60FB2577BE6F0B15FB7 :10E1BC0010CEEB7DC921800081CD3EE17EC9AF320E :10E1CC009BDECDDEE1C81807CDDEE1C83A5DE0C3C9 :10E1DC0011E03E00B7C83D215DE0BEC9219BDEAF1A :10E1EC0032DFE1CD31E1ED535BDE1AB7280ADE40B8 :10E1FC0047131AFE3A28071B3A5DE0771806783267 :10E20C00DFE17013AF3 :10E4EC00E1B7CA8EDF3D325DE0CD5CE0CD11E0C31B :10E4FC008EDF3AA4DEFE20C2F3E02177DE11A4DE2B :10E50C00010300EDB0210001E5CD92E5E1C02270E0 :10E51C00E5CDD4E1CDE8E121DFE1E57E329BDE21E2 :10E52C00ABDECDEBE1E17E32ABDEAF32BBDE115CBC :10E53C0000219BDE012100EDB02108DE7EB728070B :10E54C00FE2028032318F506001181007E12B7283F :10E55C000504231318F678328000CDABDFCD05E02F :10E56C00CD4DE0CD0001CD05E0CD5CE0CD11E0C39B :10E57C003DDFE1CD42E0CDD4E1C3F3E0CD81E1E577 :10E58C00CDE8E1E120F3CD9BE5F5CD42E0F1C922E8 :10E59C00CBE5CD%  :10DE0000C305DFC301DF5000202020202020202078 :08DE100020202020202020002A :04DE590008DE17DEEA :10DE7700434F4D00242424202020202053554200C6 :01DE8700009A :10DEBC00160000444952208DE24C49535467E354F8 :10DECC005950456BE355534552CBE444465520D548 :10DEDC00E4474F2020E2E4455241203EE3534156B3 :10DEEC004504E452454E2087E4474554208CE54ACE :10DEFC00554D50DDE4AF3207DE3177DEC5791F1F9B :10DF0C001F1FE60F5FCD49E0CD0CE0322DDFC1794C :10DF1C00E60F325DE02806CD11E0322DDF117ADEFE :10DF2C003E00B72FC42BE02F322DDF3A07DEB720817013AF32BEDE0608CD3C63 :10E21C00E20603FE2E200613CD3CE21803CD5DE290 :10E22C00060423360010FBED5359DE3ABEDEB7C9A7 :10E23C00CD14E1281C23FE2A2007363FCD63E218BB :10E24C00077713FE3FCC63E210E6CD14E1C8131838 :10E25C00F923362010FBC93ABEDE3C32BEDEC921A2 :10E26C00BFDE0E0B119CDE06041ABE200A1323100F :10E27C00F81AFE202004C92310FD23230D20E50CE1 :10E28C00C93E80F5CDE8E1CDCAE1219CDE7EFE20C1 :10E29C00CC36E3CD31E106002816FE412806FE53AC :10E2AC00200E068013ED5359DEFE532803F1AFF513 :10E2BC00F1571E00D57832DDE2CD28E0CC9F08DECDF6DFFD :10E0AC00CDE2E0C8CD33E0C33DDFCD33E0CD4DE074 :10E0BC003E3ECDB2DF0E0A1106DECD0500C35CE09C :10E0CC002107DE4604237ECD62E07710F83600216E :10E0DC0008DE2259DEC9D50E0BCDE2DFC4BDDFD17F :10E0EC00C9CD43E1FE10D8CDABDF2A5BDE7EFE202E :10E0FC00280BB72808E5CDB2DFE12318F0CDEEDF11 :10E10C003F80CD33E0C33DDF1AB7C8FE2038D8C8F6 :10E11C00FE3DC8FE5FC8FE2EC8FE3AC8FE3BC8FED8 :10E12C003CC8FE3EC9ED5B59DE1AB7C8FE20C013D1 :10E13C0018F7856FD024C9CDE8E121A6DE060B7E49 :10E14C002BFE20200410F81804FE48282B219CDEFE :109E5CD08E0119BDEFD :10E43C000E15CDE2DFD1E1200B18E4119BDECD24CB :10E44C00E03C2003CDECE5CD05E0C9CDE8E1C2F31D :10E45C00E0CDCAE1CD28E0119BDEC8D5CDE9DF4483 :10E46C00656C6574652046696C653F80CDBDDFD1F8 :10E47C00FE59C28BDFD5CD3EE0D1C9CD57E43ADF92 :10E48C00E1F5219BDE11ABDE011000EDB0CD31E1E9 :10E49C00FE3D2028EB232259DECDE8E1201EF1477A :10E4AC0021DFE17EB72804B870201170AF329BDEFB :10E4BC00119BDE0E17CD1FE0C0CD9FDFC386E5CDCF :10E4CC00EDE05FCD49E0C38EDFCDEDE032B4E51871 :10E4DC00F5CD81E1183C21000118373A9CDEFE2075F :10DF3C00263177DECDABDFCD01E0C641CDB2DFCDF2 :10DF4C0047E0FE0A3809D60AF53E31CDB2DFF1C6FC :10DF5C0030CDB2DFCD6BE0CDCCE0CD05E0CD01E036 :10DF6C00325DE0CDE8E1C4F3E0118BDFD53ADFE1BF :10DF7C00B7C2E7E4CD6BE2C2E7E47E23666FE9CD7E :10DF8C00D4E1CDE8E13A9CDED62021DFE1B6C2F344 :10DF9C00E0189ECDE9DF4E6F2046696C6580C93E66 :10DFAC000DCDB2DF3E0AC50E025FE5CD0500E1C125 :10DFBC00C90E01CDE2DFC362E0F53E00B72806F1E1 :10DFCC00C50E0518E4F1F5CDB2DFF1FE0ACAEBE39C :10DFDC00C9119BDE0E14C5CD0500C1B7C9F5CDAB7B :10DFEC00DFF1EDF2867 :10E2CC00673D0F0F0FE6604F3E0ACDC1E1D1D5A2DD :10E2DC00FE00204AD17B1CD5E603F52005CDABDF33 :10E2EC001808CDEEDF20207C2080060178CDC1E11E :10E2FC00E67FFE202013F1F5FE03200B3E09CDC175 :10E30C00E1E67FFE2028163E20CDB2DF0478FE0C1D :10E31C00300BFE0920D63E2ECDB2DF18CFF1CDE268 :10E32C00E02005CD2FE01897D1C9060B363F2310FE :10E33C00FBC9CDE8E1FE0B2013CDE9DF416C6C3F4E :10E34C0080CDBDDFFE59C23DDFCDABDFCDCAE1AF25 :10E35C0047CDBDE2119BDECD3EE0C93EFF1801AFBB :10E36C0032C7DFCDE8E1C2F3E0CD31E132F5E3288D :10E37C00E15C000100117EFE20281823D630FE0A301357FA :10E16C007907070781380B8138088238054F10E38F :10E17C0079C9C3F3E0CDE8E1219CDE110000060B68 :10E18C007EFE20282DFE482829D63038E5FE0A3898 :10E19C0006D607FE1030DB234F7A07070707E6F099 :10E1AC00577B070707075FE60FB2577BE6F0B15FB7 :10E1BC0010CEEB7DC921800081CD3EE17EC9AF320E :10E1CC009BDECDDEE1C81807CDDEE1C83A5DE0C3C9 :10E1DC0011E03E00B7C83D215DE0BEC9219BDEAF1A :10E1EC0032DFE1CD31E1ED535BDE1AB7280EDE40B4 :10E1FC0047131AFE3A280BFE3B28071B3A5DE077C3 :10E20C0018067832DFE :10E4EC0020143ADFE1B7CA8EDF3D325DE0CD5CE04F :10E4FC00CD11E0C38EDF3AA4DEFE20C2F3E021771B :10E50C00DE11A4DE010300EDB0210001E5CD96E59E :10E51C00E1C02274E5CDD4E1CDE8E121DFE1E57E77 :10E52C00329BDE21ABDECDEBE1E17E32ABDEAF32F6 :10E53C00BBDE115C00219BDE012100EDB02108DE69 :10E54C007EB72807FE2028032318F506001181004A :10E55C007E12B7280504231318F678328000CDAB51 :10E56C00DFCD05E0CD4DE0CD0001CD05E0CD5CE08B :10E57C00CD11E0C33DDFE1CD42E0CDD4E1C3F3E00A :10E58C00CD81E1E5CDE8E1E120F3CD9FE5F5CD428C :10E59C00E0F1C93F5CDF6DFF1E3C97ECDB2DF7E23C1 :10DFFC00B7C8F818F50E1918091180000E1A180276 :10E00C000E0DC305005F0E0E18F8AF32BBDE119B70 :10E01C00DE0E0FCD05003CC90E1018F7119BDE0E5D :10E02C001118F00E1218EC212DDF7EB7C836001136 :10E03C007ADE0E1318CC3E005F18021EFF0E20185D :10E04C00C1CD47E087878787215DE0B6320400C9E0 :10E05C003E00320400C9FE61D8FE7BD0E65FC93AAF :10E06C002DDFB72845117ADED5CD1DE0D1283B3AFE :10E07C0089DE3D329ADECDE0DF202F1107DE2180D4 :10E08C0000015000EDB02188DE36002335117ADE18 :10E09C00CD24E028153E24CDB2DF210513EB2259DECDCAE1CD16E0CAE8E3CD98 :10E38C00ABDF3E1732BCDE21BDDE36FF060021BD01 :10E39C00DE7EFE803809E5CDDDDFE1203DAF773450 :10E3AC00218000CD3EE17EE67FFE1AC8FE0D280ED0 :10E3BC00FE0A280AFE09280DCDC5DF041812CDC5AA :10E3CC00DF0600180B3E20CDC5DF0478E60720F5EC :10E3DC00CDE2E028B9FE03C818B43DC8C386E5E514 :10E3EC0021BCDE35201036163E00FE502808CDBD6F :10E3FC00DFFE03CA8BDFE1C9CD43E16F2600E5CD1B :10E40C0057E40E16CD1FE0E1283AAF32BBDECD311A :10E41C00E113FE5328021B29ED5359DE1100017C38 :10E42C00B528182BE52180001&  22CFE5CD47E03243E032B6E5CD1C :10E5AC00CAE1CD16E0201B3E00FE00280932B6E57C :10E5BC005FCD49E018E921DFE1AFB6C282E5360153 :10E5CC0018DD2100013EDDBC3816E5EBCD08E0116D :10E5DC009BDECDE0DFE120061180001918E73DC875 :0CE5EC00CDE9DF46756C6C803E01B7C9BC :0000000000 '