IMD 1.16: 29/05/2007 18:21:12 FOGCPM.052 ååååååååååååååå--FOGCPM052MAXLETTRDOCMAX12 NSLMAX13 NSL MAX14 NSL MAX15 NSL$MEMTEST COM MEMTEST DOCSETIO COM SETIO DOCSETIO MACF !"TURNKEY COM#TURNKEY DOC$TURNKEY MAC %&VFUZZY BAS'VSMALL BAS(VFUZZ-SMDOC)WSKB COM*WSKB DOC+WSKB MAC,XFUNC ASM-./XFUNC DOC0ZCPR-MAXHEX*123456READZCPRDOC7ZCPR ASM€89:;<=>?@ABCDEFGZCPR ASM€HIJKLMNOPQRSTUVWZCPR ASM€XYZ[\]^_`abcdefgZCPR ASMhij-06-00 86 ­-CPM052 DOC®¯°±ZCPR DOC€klmnopqrstuvwxyzZCPR DOC€{|}~€�‚ƒ„…†‡ˆ‰ŠZCPR DOCb‹Œ�Ž��‘’“”•–—ZCPR HLPs˜™š›œ�žŸ ¡¢£¤¥¦ZCPR MSG0§¨©ª«¬ååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååThis is the disk name. ååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååMAXLETTR is a series of newsletters from MAXIMUL concerning MAX. All MAX owners should have access to these and any others which are written... I got them thru a bulletin board. ååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååWell I guess every body has MAXLETTER #5 from Lobo by now. I just talked with Dennis Wade, who is now running LOBO and he says Maxletter #6 is ready to mail, and may be shipped now. They are going to get a newsletter out every 2 to 4 weeks. Now if I could only get Maximul on a regular schedule. Well here is the LOBO story as I understand it . Dennis is running Lobo and he has been there for 8 to 10 weeks as the person responsible to the new financial backers. The group didn't bring money to LOBO as everyone was expecting, but instead assumed the liabilities. Then the group worked to get a private stock placement to raise the required funds. They hope to raise between 1 and 1 1/2 million, as Lobo's problems are all cash related. As to the long awaited and often rumored CPM Plus, a mid-December release looks likely. Again the problems are cash related. The licensing problems alluded to earlier were just that. Pay the money, and you can have the license. Only after the required payments are made to DRI could the official version be finished. And until that happens(ed) the manuals could not be fishished. Dennis tells me that at the moment there are 4 to 6 weeks of in house work needed before PLUS will be ready to ship. On other software, LOBO is making the PerfectSoft software available. These are the Perfect Writer, PerfectCalc, et al. There are other software packages being negotiated. The Max is doing well in foreign markets with a few distributors being set up overseas. Some Eureopean countries have 50 or more Maxes in use. As to this country, since Max was designed as mail order, there is just no way to sell at a price to a dealer and keep the mail order price the same, so LOBO has about 6 to 8 distributors, who are really systems integrators set up in this country. They make their profit on the software and integration and not on the machine. Now, how about the hard drive. The $995 hard drive is now using the Xebec control and is shipping in the next few weeks. However this is NOT the Max80 version. Delivery date of the new Max hard drives is not available at the moment. The hard drive that is avaiable is for non-Max systems. For those of you who havent seen the new LOBO ad in BYTE the headline reads "The computer Tandy should have built", and underneath is a picture of the Max. Beneath that is the phrase, "At the price Tandy should have charged. Hopefully things are back on course now and we will get more information, and accuarte information in a timely manner. Other computer mfrs. who have had problem in the past year arent around today. But let's hope this is a new beginning for a great machine. Bill Vermillion [70270,214] Maximul Box 19525 Orlando, FL, 32814 et's hope this is a new begireally systems integrators set up in this country. They make their profit on the software and integration and not on the machine. Now, how about the hard drive. The $995 hard drive is now using the Xebec control and is shipping in the next few weeks. HWell LOBO is getting ready to go to COMDEX in Las Vegas. One interesting thing they will be showing, but probably wont be operational, is a new half height 3 1/2 inch hard drive. That's right 3 and 1/2 inches, not 5 1/2. Dave says it is amazing to have 5 megs space in something so small. . On the subject of things you can buy now, or shortly, LOBO is packaging the Perfect series of software. They have also reached an agreement with Hayden software to sell their and they are getting that finalized right now. . Modems are the next thing they added to their line. After looking over several modems, LOBO has decided to offer the Signalman Mark 12 to their customers. This is a 1200 baud Hayes compatible modem. After testing all of the popular modems they feel this is the best value for their customers and will be selling it at $350. . Lobo will also be selling the Gorilla Monitor from Leading Edge. This will be in addtion to their Amdek monitors but will priced at $89. . CPM 3.0 does NOT have an official release date. It is still being worked on. The Max specific manuals are not finished as Greg is still putting the finishing touches on 3.0. Dave says he has added a lot of nice features. Getting all the money together is part of the problem. . In discussing this with Dave we figured out that just the 3.0 package, the manuals, binders, disks, license, etc is costing LOBO over $60 per package without counting the time and labor and writing the Max specific version. This is just raw, no labor costs. Getting the package for $30 is going to be a real bargain. . The Max CPM 3.0 format will be identical to the IBM-PC format. That is 512 byte sectors. It will give about 385k per DSDD 5 inch disk. Perhaps with the influence that IBM has had on the marketplace we are heading for a 5" standard. Let's hope so. I just saw a program the other day specifically for my now somewhat retired S-100 system. It does translations between about 50 different formats. But I digress. . LOBO will be at Comdex but since they made the decision late they will be sharing a booth. Nothing more to report for the Max at the moment, but one item they will be showing is a hard disk drive for the IBM-PC. No, they are not abandoning the Max, but they go a good deal on the Winchesters from Shugart and are going to make a competitively price drive for the PC. . All in all things are starging to happen now that they have the re-organization finished. And the ads that have just started appearing are starting to bring in sales, although not as much from the Tandy crowd as they had anticipated. . One growth area for Lobo is overseas distribution, both in Europe and South America. Dave says Tandy has pulled out of the South American market, and the Max being able to run the I/III software looks very attractive to them down there. . Well that's it for now. Probably not another newsletter until after Comdex. . Bill Vermillion [70270,214], or % SYSOP QSD/Powersoft Sig Maximul box 19525 Orlando,Fla, 32814 r until after Comdex. . Bill Vermillion [70270,214], or % SYSOP QSD/Powersoft Sig Maximul box 195 at the moment, but one item they will be showing is a hard disk drive for the IBM-PC. No, they are not abandoning the Max, but they go a good deal on the Winchesters from Shugart and are going to make a competitively price drive for the PC. . All in all things are starging to happen now that they have the re-organization finished. And the ads that have just started appearing are starting to bring in sales, although not as much from the Tandy crowd as they had anticipated. . One growth area for Lobo is overseas distribution, both in Europe and South America. Dave says Tandy has pulled out of the South American market, and the Max being able to run the I/III software looks very attractive to them down there. . Well that's it for now. Probably not another newsletter until after Comdex. . Bill Vermillion [70270,214], or % SYSOP QSD/Powersoft Sig Maximul box 195Comdex, Las Vegas, Lobo and cold weather. That's what I experienced last week. It was windy, with highs in the 50's and lows in the 30's and I'll tell you it was nice to step off the plane Sunday night at 11pm and find 75 degree weather. But this is about last week, Max-80 and Lobo, and not the weather. Lobo showed a couple of new products, as well as showing the operating CPM-plus. I was in Las Vegas for the show, and worked 2 to 3 hours per day in the LOBO booth. It was nice putting some faces with names, and I'm sorry I missed a few who stopped by. The item that caught most everyones eye in the Lobo display was the 3 1/2" 5meg hard disk. Shipping is probably in April. Price will be $1095. 10 meg version is not priced yet. Currentadd-on hard drives are shipping but th Max hard dive wont be ready until January. Five Meg 5 1/2 inch at $995. 10 meg version is not priced. Lobo will also be shipping hard disks for the Apple, and an IBM PC version ships in spring.  For OEM's LOBO is offering the board set from the Max for integration into custom installations. They are going after the OEM market to spread their base a bit, and hopefully keep a more even cash-flow. It was the first time I had a chance to talk to Dennis Waid, the new president of Lobo, for more than a few minutes on the phone, and I am impressed with the direction the company is heading. Things were tough last spring and summer, but now that the hurdles have been cleared I think we will see a lot of good things from the company. I expect to see CPM Plus shipping in January from what I saw happening, but LOBO is not giving any dates for release. That is probably for the good. Also as things now stand we wont be seeing LDOS 6.0 anytime but things have happened that wont make that as great a loss as we once thought. At the moment I have a BETA test copy of DOSPLUS IV, which is to say that it is DOSPLUS for the Model 4. It is media compatible with 6.0, and there should be no problems in writing software for the 4 on the Max and plugging it in and running with it. There are however a few problems, for most users minor, but should be noted. The software packages for the 4 run on Max but anything that uses inverse video gives graphics on the Max. The reason is the Max doesnt have an alternate character set. The solution is probably to use installable character sets or patch the programs. Since Max has software definable characters it may not be that bad. Inverse video can be had at the expense of graphics. Another problem is that while the 4 has a full 128k of RAM and video memory is outside that area, the Max is totally memory mapped, and therefore Max can act only as a 64K model 4. Only 1 serial port is supported. Max's hardware clock is supported, but I found a small bug in it's initialization routine earlier today. Hopefully within the next couple of weeks MSS can make their OS into as good an implementation that the hardware will allow. This is my first venture outside the 2.0-2.3 Trsdos, 3.0-3.0.1 thru 4.0 -4.0.2 VTOS, and the 5.x series of LDOS. There are many similarities between those and DOSPLUS, and I havent thoroughly digested the manual yet. Since it is TRSDOS 6.0 compatible and uses the standard SVC's there should be no problems. It has 8" support built in and the ability to define up to 16 logical drives. I will let you know how it progresses. The system features and enhanced Basic with the DU and DI commands that first appeared in Newdos. There is a global search and replace, sort for arrays. Also and OPTION parameter that allows conversions of Model III compressed basic when saved in ASCII and converted from a model III type disk. Mark, Larry, and all at MSS as well as the Lobo staff are quite excited about this. There is no final release date as yet, but I'll keep you posted. Bill Vermillion Maximul Box 19525 Orlando, FL, 32814-9525  is no final release date as yet, but IMAXIMUL Elctronic Newsletter #15. 1/4/84 . Well things are fairly busy around Lobo these days. Money problems arent over, but things are doing well and we can be sure they are going to stay in business now. That's more than I could have said about 6 months ago, however. . The good news for CPM fans, is that 3.0 is now being shipped. Not in great volume, but they are shipping it. So far about 10 have left this week. And I didnt ask, but I assume some of the machines that were recently shipped had 3.0 in it. . I assume that because it wasnt until some owners got their manuals that it was noticed that SRI didn't include chapter five in the manuals. It is the one on sysgening the system. It will be a couple of weeks before the missing chapter fives show up and get shipped to those that lack them. I guess that is one thing we can thank IBM for - the "new standard" in manuals, all three ring, small, and easily updateable. . The 5meg Winchesters, the small unit in a case, the "shoebox"  model goes into production the end of this month. That is the unit that sells for $995. The drives, using the Xebec controller, were on display and running CPM 3.0 at Comdex. The drivers for LDOS are not done yet, but again I stressed the importance of keeping the LDOS stuff up to date. This is even more important with the current thrust of their ads going to Tandy customers. . Maxes are available for shipment now, but almost everything else is on a backorder basis, including 8" drives, and LDOS from LSI. Sales are good, and there are prospects for some rather substantial orders. . Lobo is talking with another distributor to handle all the distribution on their hard drives for the Apple and IBM. Both of those units are production around April. This makes sense going to someone who know those computers better than the folks in Goleta. Along with manufacturing those hard drives, Lobo has entered into a contract to build several thousand floppies for another company. I guess their reputation for quality work has done well for them. . One of the reasons for the slowness in 3.0 and getting things "together", is that contrary to what was implied in one of Lobo's letters to we users earlier this year, the "venture capitalists" did not bring money to Lobo. In actuallity they took over the debts, and kept Lobo afloat, while looking for source of money, and a then restructured the company. . In many ways this is probably for the better, but I for one would have liked to have known a little more about it. The money problems were part of the reason for the 3.0 delay. . I guess it was the "optimism" of the staff that caused some of that, and expecting that things would go a lost faster with the new organization. I guess that is good in a way but it leads us to expect more sooner than they were able to deliver. . Along with that thought, since they have just started shipping 3.0, and in light of the fact that money is still tight, I dont think that they will hit their self-imposed" deadline of the end of the month to get all the 3.0 shipped. I do expect that they will have all the back-orders and be current with 3.0 by the end of February however. . My Max is approaching 15 months old now. ( My model I celebrated it's 6th year with me by logging in the 27,000th phone call the week after Christmas ). I also run an IBM PC and there is a permanent RS232 link between the two. There are many things the IBM can do with its large memory and extended addressing, but if I had to make a choice and have only one machine, the Max would win hands down. . When you have them side by side you can realize just how slow the PC's screen is. And the keyboard is "hideously" slow too! If you get in the least bit used to a Max and and then try the IBM you think that it takes forever to get the cursor to move across the screen. . Because of this in Basic the screen editing on the PC is slow, and I can get more done faster on the Max. If I didnt have a Max now, I think I'd have to go buy one. If anyone is reading this that isnt a Max owner, you owe it to yourself to check the machine out. . (End of non-sponsored commercial ) . P.S. I have a couple of pages on a newsletter done. I guess if they can get things shaped up in Goleta, I can do the same in Orlando. . Bill Vermillion Maximul (Max80 Independant Microcmputer Users League) Box 19525 Orlando, FL, 32814-9525 me in Orlando. . Bill Vermillion Maximul (Max80 Independant Microcmputer Users League) Box 1952 had to make a choice and have only one machine, the Max would win hands down. . When you have them side by side you can realize just how slow the PC's screen is. And the keyboard is "hideously" slow too! If you get in the least bit used to a Max and and then try the IBM you think that it takes forever to get the cursor to move across the screen. . Because of this in Basic the screen editing on the PC is slow, and I can get more done faster on the Max. If I didnt have a Max now, I think I'd ha!0€í°!€í°*." €. " €. "€."€Ã€ÃÃÃÃͱ„Í€ÍЄþ ó!½ƒÍûƒ!ŸƒÍn„!ÿÍn„1 …GƒÍ‰„!" …" …!ÿ"…!+ü6-+~þ00>0<þ:860+ïw+~þ08þ:8ö6->12™ü>@2ü÷:…<Äö€Í´�Íøƒ>22™ü!€€óí°û>2ü÷:…<Äö€!€€óí°û> 2™ü>12Iü>`2ü÷:…<Äö€>22Iü>p2ü÷:…<Äö€> 2Iü* …#" …+í[…§íRÂO€Ã@€Íý€ÍO�É*…í[ …§íR#"…DM* …6# y° ø* …6ÿÍ¡�* …í[ …íK…~2…§ÊH�|º }» :…/§(2…Í:„# x± ÝÉ*…í[ …§íR#"…DM* …6ÿ# y° ø* …6Í¡�* …í[ …íK…~2…<Êš�|º }» :…§(/2…Í3„# x± ÝÉó¯íOíOüíO<íO ñûÉóͺ�ûɯ2…!ü…í°>ò2Ü÷!ðí°>ô2Ü÷!ðí°>ö2Ü÷!ðí°¯2…!ü>̓>ò2Ü÷!ð>̓>ô2Ü÷!ð>̓>ö2Ü÷!ð>̓!ü>Í.ƒ>ò2Ü÷!ð>Í.ƒ>ô2Ü÷!ð>Í.ƒ>ö2Ü÷!ð>Í.ƒ:…Æ92…Òô�!•>ö2Ü÷ÿóí¸>ô2Ü÷ÿóí¸>ò2Ü÷ÿóí¸ÿÿí¸:…§ÈþÒ¥‚!±‚ ÿ1í°É!â‚pÿ:í°ÉPROBLEM WITH VIDEO REFRESH RAM (UPPER 6116 CHIP)PROBLEM WITH PROGRAMMABLE CHARACTER RAM (LOWER 6116 CHIP)_:…„�‹w# x± óÉ_:…„�‹®#  x± ñÉ{2…É0*[MAX-80 memory test 1.2]= XBank B: ........=!XBank A: ........=" Address range: XXXX-XXXX T Starting time: XX/XX/XX XXX XX:XX:XX XX Current time: $ Ouch! 1$!PýåÍœ„á§(þ ôìƒÍ‰„!€í°Ãåͱ„Í€ÍЄáþÈþ 8ìw#è:…/2…åÕÅ:ü÷Ëo�ü!…(@ü!…:…¶wë06X6.#ôÁÑáþÿÀÉ|Ís„}õÍ|„ñæö0þ:8ÆÉþ$ÈOͱ„ÕÍ€ÑÍЄíͱ„Í€ÍЄ§Èͱ„Í €ÍЄÉåÕÅõ!ä„í°!€í°ñÁÑáÉåÕÅõ!ä„í°ñÁÑáÉЄíͱ„Í€ÍЄ§Èͱ„Í €ÍЄÉåÕÅõ!ä„í°!€í°ñÁÑáÉ…í[ …§íR#"…DM* …6ÿ# y° ø* …6Í¡�* …í[ …íK…~2…<Êš�|º }» :…§(/2…Í3„# x± ÝÉó¯íOíOüíO<íO ñûÉóͺ�ûɯ2…!ü…í°>ò2Ü÷!ðí°>ô2Ü÷!ðí°>ö2Ü÷!ðí°¯2…!ü>̓>ò2Ü÷!ð>̓>ô2Ü÷!ð>̓>ö2Ü÷!ð>̓!ü>Í.ƒ>ò2Ü÷!ð>Í.ƒ>ô2Ü÷!ð>Í.ƒ>ö2Ü÷!ð>Í.ƒ:…Æ92…Òô�!•>ö2Ü÷ÿóí¸>ô2Ü÷ÿóí¸>ò2Ü÷ÿóí¸ÿÿí¸:…§ÈþÒ¥‚!±‚ ÿ1í°É!â‚pÿ:í°ÉPROBLEM WITH VIDEO REFRESH RAM (UPPER 6116 CHIP)PROBLEM WITH PROGRAMMABLE CHARACTER RAM (LOWER 6116 CHIP)_:…„�‹w# x± óÉ_:…„�‹®#  x± ñÉ{2…É0*[MAX-80 memory test 1.2]= XBank B: ........=!XBank A: ........=" Address range: XXXX-XXXX T Starting time: XX/XX/XX XXX XX:XX:MEMTEST.COM is the memory tester used by Lobo. MAX14 NSL MAX15 NSL$MEMTEST COM MEMTEST $$$ååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååÍÍÍCÍ_ø:Ð÷29:Ô÷2>É_ÍTÍhÍBK>ͧ¯² ô³Àì:DG:CO>ͧÉ:DG:CO>ͧÉÿÍ·(öþÊ*þ Ê�þÊzþʇþÊDþÊMþAÊ•þaÊ•þBÊžþbÊžÂ:92Ð÷:>2Ô÷>2å÷::Ë'ü2å÷>2å÷:<·(ËÁ±O:;<Ë'Ë'±2å÷>2å÷::Ë'üO:=·(Ëyy2å÷>2ç÷:?Ë'ü2ç÷>2ç÷:A·(ËÁ±O:@<Ë'Ë'±2ç÷>2ç÷:?Ë'üO:B·(Ëyy2ç÷ƒÍÃ0Íd~·È=wÉÍd~+:DG#ýÉÍQ:D·È=2DÉÍQ:DþÈ<2DÉÍQ>2CÉÍQ>2CÉÕåb·(eÍ!9y·>(!>>22ð+>H#<ü2ïË!~!J ^#VëW>$ÿí±¯² õëÕÍøÑÍáÑÉÙá>Í>=Í~Æ Í#~Æ Í#åÙÉÙOÍ ÜÙÉõÅå ÍáÁñÉnÍkÍÕöÿ SETIO 2.0 For the Lobo MAX-80 Control-C to abort, RETURN to install changes. A and B select port, up and down control cursor, right and left increment and decrement value.=(4Port A=(RPort B Baud Rate: Bits/Character: Stop Bits: Parity: Hardware Protocol:$*$)$($0$1$=7 Program aborted.$=7 Changes made.$$50 $75 $110 $134.5$150 $300 $600 $1200 $1800 $2000 $2400 $3600 $4800 $7200 $9600 $19200$$5$6$7$8$$1 $1.5$2 $$None$Odd $Even$$None $DTR/CTS$$150 $300 $600 $1200 $1800 $2000 $2400 $3600 $4800 $7200 $9600 $19200$$5$6$7$8$$DþÊMþAÊ•þaÊ•þBÊžþbÊžÂ:92Ð÷:>2Ô÷>2å÷::Ë'ü2å÷>2å÷:<·(ËÁ±O:;<Ë'Ë'±2å÷>2å÷::Ë'üO:=·(Ëyy2å÷>2ç÷:?Ë'ü2ç÷>2ç÷:A·(ËÁ±O:@<Ë'Ë'±2ç÷>2ç÷:?Ë'üO:B·(Ëyy2ç÷ƒÍÃ0Íd~·È=wÉÍd~+:DG#ýÉÍQ:D·È=2DÉÍQ:DþÈ<2DÉÍQ>2CÉÍQ>2CÉÕåb·(eÍ!9y·>(!>>22ð+>H#<ü2ïË!~!J ^#VëW>$ÿí±¯² õëÕÍøÑÍáÑÉÙá>Í>=Í~Æ Í#~Æ Í#åÙÉÙOÍ ÜÙÉõÅå ÍáÁñÉnÍkÍÕöÿ SETIO 2.0 For the Lobo MAX-80 Control-C to abort, RETURN to install changes. A and B select port, up and down control cursor, right and left increment and decrement value.=(4Port A=(RPort B Baud Rate: Bits/Character: Stop Bits: Parity: Hardware Protocol:$*$)$($0$1$=7 Program aborted.$=7 Changes made.$$50 $75 $110 $134.5$150 $300 $600 $1200 $1800 $2000 $2400 $3600 $4800 $7200 $9600 $19200$$5$6$7$8$$SETIO.ASM allows the user to set the serial ports (A and B) to any configuration that the MAX allows. It is an extremely good program which is helpful quite often. The program source is self-documented. SETIO COM SETIO $$$åååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååå; SETIO 2.0 ; Routine to change MAX-80 serial I/O ports directly ; ; Written by Ken Kasmar on March 17, 1984 ; ; .Z80 ASEG ORG 100H ; ; Assorted addresses ; BRATEA EQU 0F7D0H ;Port A baud rate BRATEB EQU 0F7D4H ;Port B baud rate SIOCA EQU 0F7E5H ;Port A status port SIOCB EQU 0F7E7H ;Port B status port CONOUT EQU 0DC0CH ;print character to screen BDOS EQU 0005H ;entry vector WMSTRT EQU 0000H ;CP/M warmstart ; ; Misc. data ; INPUT EQU 06 ;Console input PRNT EQU 09 ;Print string ACOLMN EQU 20 ;column port A data will be in BCOLMN EQU 50 ;column port B data will be in TOPROW EQU 9 ;top row that all data will be in ESC EQU 27 ;ESCAPE DIMC EQU ')' ;dim character BRITEC EQU '(' ;bright character CR EQU 13 ;Carriage return LF EQU 10 ;Line feed EQUAL EQU '=' ;Position cursor CNTLC EQU 'C'-40H ;Control C UP EQU '\'-40H ;up arrow DOWN EQU ']'-40H ;down arrow RIGHT EQU '_'-40H ;right arrow LEFT EQU '^'-40H ;left arrow ; ; ; CALL LOAD ;load in initial values CALL INIT MAIN: CALL CURSOR CALL GETCMD ;get command from keyboard JR MAIN ; ; Load initial port values ; LOAD: LD A,(BRATEA) LD (BAUDA),A LD A,(BRATEB) LD (BAUDB),A RET ; ; Initialization routine ; INIT: LD DE,CLS ;Clear screen CALL PRINT LD DE,SIGNON ;Print signon message CALL PRINT LD DE,CUROFF ;turn cursor character off CALL PRINT LD E,0 ;do port A first STINIT: LD D,5 ;number of values per port INITLP: DEC D ;decrement counter LD B,D ;value number LD C,E ;port number LD A,0 ;set for DIM CALL DSPDTA ;print value for port XOR A OR D JR NZ,INITLP ;continue looping OR E ;done port B yet RET NZ ;yup, so return LD E,1 JR STINIT ; ; Make value at cursor position bright ; CURSOR: LD A,(CROW) LD B,A LD A,(CPORT) LD C,A LD A,1 CALL DSPDTA RET ; ; Make value at cursor position dim ; DIMIT: LD A,(CROW) LD B,A LD A,(CPORT) LD C,A LD A,0 CALL DSPDTA RET ; ; Get valid command from operator ; GETCMD: LD C,INPUT ;get input from keyboard LD E,0FFH CALL BDOS OR A JR Z,GETCMD CP CNTLC ;abort program JP Z,EXIT CP CR ;make changes and exit program JP Z,CHANGE CP UP ;move cursor up one row JP Z,DUP CP DOWN ;move cursor down one row JP Z,DDOWN CP LEFT ;decrement value under cursor JP Z,DLEFT CP RIGHT ;increment value under cursor JP Z,DRIGHT CP 'A' ;change to port A JP Z,GOA CP 'a' JP Z,GOA CP 'B' ;change to port B JP Z,GOB CP 'b' JP Z,GOB JR GETCMD ; ; Install changes made ; CHANGE: LD A,(BAUDA) LD (BRATEA),A LD A,(BAUDB) LD (BRATEB),A LD A,3 ;register 3 LD (SIOCA),A LD A,(BITSA) LD B,6 LP1: SLA A DJNZ LP1 LD (SIOCA),A LD A,4 LD (SIOCA),A LD C,0 LD A,(PRITYA) OR A JR Z,NOPRTY SET 0,C OR C LD C,A NOPRTY: LD A,(STOPA) INC A SLA A SLA A OR C LD (SIOCA),A LD A,5 LD (SIOCA),A LD A,(BITSA) LD B,5 LP2: SLA A DJNZ LP2 LD C,A LD A,(PROTOA) OR A JR Z,NOPRTO BIT 7,C NOPRTO: LD A,C LD (SIOCA),A ;stuff for port B LD A,3 ;register 3 LD (SIOCB),A LD A,(BITSB) LD B,6 LP3: SLA A DJNZ LP3 LD (SIOCB),A LD A,4 LD (SIOCB),A LD C,0 LD A,(PRITYB) OR A JR Z,NOPRTI SET 0,C OR C LD C,A NOPRTI: LD A,(STOPB) INC A SLA A SLA A OR C LD (SIOCB),A LD A,5 LD (SIOCB),A LD A,(BITSB) LD B,5 LP4: SLA A DJNZ LP4 LD C,A LD A,(PROTOB) OR A JR Z,NOPROT BIT 7,C NOPROT: LD A,C LD (SIOCB),A LD DE,NORMAL CALL PRINT JP BYE ;say bye bye ; ; Decrement value at cursor by one ; DLEFT: CALL GETDTA LD A,(HL) OR A RET Z ;value is already zero DEC A LD (HL),A ;store new value RET ; ; Increment value at cursor by one ; DRIGHT: CALL GETDTA LD A,(HL) INC A LD C,A PUSH HL LD HL,MAXS LD A,(CROW) LD E,A LD D,0 ADD HL,DE LD A,(HL) POP HL CP C RET Z LD (HL),C RET ; GETDTA: LD HL,BAUDA LD A,(CPORT) OR A ;port A or B JR Z,ITSA ;do port A LD HL,BAUDB ITSA: DEC HL LD A,(CROW) LD B,A INC B CONTLP: INC HL DJNZ CONTLP RET ; ; Move  cursor up one position ; DUP: CALL DIMIT LD A,(CROW) OR A ;already zero? RET Z DEC A ;decrement position LD (CROW),A RET ; ; Move cursor down one position ; DDOWN: CALL DIMIT LD A,(CROW) CP 4 ;lower than maximum? RET Z INC A ;increment position LD (CROW),A RET ; ; Change to port A ; GOA: CALL DIMIT LD A,0 LD (CPORT),A ;change current port to A RET ; ; Change to port B ; GOB: CALL DIMIT LD A,1 LD (CPORT),A ;change current port to B RET ; ; Display specified value in proper position ; Input parameters: ; A : 1=bright, 0=dim ; B : number of value to be displayed ; C : 0=port A, 1=port B ; DSPDTA: PUSH DE PUSH HL LD DE,DIM OR A ;bright or dim JR Z,ITDIM LD DE,BRITE ITDIM: CALL PRINT ;set intensity to proper mode LD HL,BAUDA LD A,C OR A ;port A or B LD A,ACOLMN JR Z,ITISA ;do port A LD HL,BAUDB LD A,BCOLMN ;change for port B ITISA: LD (PLCE+1),A DEC HL LD A,TOPROW-1 LD C,B INC B CNTLP: INC HL INC A DJNZ CNTLP  LD (PLCE),A SLA C ;multiply by 2 LD A,(HL) ;get number value LD HL,TXTTBL ADD HL,BC LD E,(HL) INC HL LD D,(HL) EX DE,HL LD D,A INC D FNDLP: LD A,'$' LD B,0FFH CPIR ;find correct message for value DEC D XOR A OR D JR NZ,FNDLP ;not done yet! EX DE,HL ;move address into DE PUSH DE CALL POSCUR PLCE: DB 0,0 ;data for cursor positioning POP DE CALL PRINT ;print value POP HL POP DE RET ; ; Position cursor on screen ; POSCUR: EXX ;hide registers away EX AF,AF' ;save acc and flags for a better day POP HL ;get address where data should be LD A,ESC CALL CONSOL LD A,EQUAL ;setup cursor position command CALL CONSOL ;tell cursor to get ready to move LD A,(HL) ;get new Y position ADD A,20H ;the screen driver wants Y+20H CALL CONSOL ;send it to screen INC HL ;next byte LD A,(HL) ;get new X position ADD A,20H ;the screen driver wants X+20H CALL CONSOL ;send it to screen INC HL ;correct return address PUSH HL ;put it back where it belongs EX AF,AF' ;recall forgotten information EXX ;search for those hidden registers RET ; ; Write ASCII character to screen ; CONSOL: EXX ;save registers LD C,A ;output byte to proper register CALL CONOUT ;actually write byte to console EXX ;restore registers RET ; ; Print a string of characters pointed to by DE ; PRINT: PUSH AF PUSH BC PUSH HL LD C,PRNT CALL BDOS POP HL POP BC POP AF RET ; ; Exit program and abort changes ; EXIT: LD DE,QUIT ;print exiting message CALL PRINT BYE: LD DE,CURON ;turn cursor back on CALL PRINT JP WMSTRT ;re-enter CP/M ; ; Asst. storage ; BAUDA: DB 0 ;current baud for port A BITSA: DB 3 ;8 bits/character for port A STOPA: DB 0 ;1 stop bits for port A PRITYA: DB 0 ;no parity for port A PROTOA: DB 0 ;no protocol for port A ; BAUDB: DB 0 ;current baud for port B BITSB: DB 3 ;8 bits/character for port B STOPB: DB 0 ;1 stop bit for port B PRITYB: DB 0 ;no parity for port B PROTOB: DB 1 ;DTR protocol for port B ; CPORT: DB 0 ;port cursor is on CROW: DB 0 ;row cursor is on ; ; Assorted data tables ; MAXS: DB 16,4,3,3,2 ;maximum settings TXTTBL: DW BAUDT,BITST,STOPT,PRTYT,PROTOT ;positions of text tables ; ; Messages to be printed out ; SIGNON: DB 'SETIO 2.0',CR,LF ;Sign on messages DB 'For the Lobo MAX-80',CR,LF,LF DB 'Control-C to abort, RETURN to install changes. ' DB 'A and B select port,',CR,LF DB 'up and down control cursor, right and left ' DB 'increment and decrement value.' DB ESC,EQUAL,28H,ACOLMN+20H DB 'Port A' DB ESC,EQUAL,28H,BCOLMN+20H DB 'Port B',CR,LF DB 'Baud Rate:',CR,LF DB 'Bits/Character:',CR,LF DB 'Stop Bits:',CR,LF DB 'Parity:',CR,LF DB 'Hardware Protocol:' DB '$' ; CLS: DB ESC,'*$' ;Clear screen DIM: DB ESC,DIMC,'$' ;set to dim mode BRITE: DB ESC,BRITEC,'$' ;set to brite mode CUROFF: DB ESC,'0$' ;turn cursor character off CURON: DB ESC,'1$' ;turn cursor character on ; QUIT: DB ESC,EQUAL,23+20H,20H,'Program aborted.$' ;Exit message NORMAL: DB ESC,EQUAL,23+20H,20H,'Changes made.$' ; BAUDT: DB '$' DB '50 $' ;Table of baud rates DB '75 $' DB '110 $' DB '134.5$' DB '150 $' DB '300 $' DB '600 $' DB '1200 $' DB '1800 $' DB '2000 $' DB '2400 $' DB '3600 $' DB '4800 $' DB '7200 $' DB '9600 $' DB '19200$' ; BITST: DB '$' DB '5$' ;Table of bits/character DB '6$' DB '7$' DB '8$' ; STOPT: DB '$' DB '1 $' ;Table of stop bits DB '1.5$' DB '2 $' ; PRTYT: DB '$' DB 'None$' ;Table of parity DB 'Odd $' DB 'Even$' ; PROTOT: DB '$' DB 'None $' ;Table of hardware protocol DB 'DTR/CTS$' ; END  ESC,'*$' ;Clear screen DIM: DB ESC,DIMC,'$' ;set to dim mode BRITE: DB ESC,BRITEC,'$' ;set to brite mode CUROFF: DB ESC,'0$' ;turn cursor character off CURON: DB ESC,'1$' ;turn cursor character on ; QUIT: DB ESC,EQUAL,23+20H,20H,'Program aborte :2H2N2Q2e2E2@!‚�í°!€5ò(4~ÖÒ}G~#_6# ú´Í$ÍÍÍ!Í'§Â›!€»í°Í*§Â›u ÍÃDone. $ˆ ÍÃString too long. $¦ ÍÃDisk error! $6# ú´Í$ÍÍÍ!Í'§Â›!€»í°Í*§Â›u ÍÃDone. $ˆSETIO COM SETIO DOCSETIO MACF !"TURNKEY $$$ååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååTURNKEY.COM (and .MAC) is a nice utility that allows you to specify a startup command for MAX; just type TURNKEY command and that command will happen whenever you cold boot. To remove the command, just type TURNKEY. Very useful!! TURNKEY $$$åååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååå; ;TURNKEY utility October 31, 1982 ; .Z80 ASEG ORG 100H ; LENGTH EQU 16 ;ALLOWABLE STRING LENGTH IN CCP SECTOR ; BDOS EQU 5 STRING EQU 0080H ; LD A,(0002H) ;FIX BIOS JUMPS LD (X1+2),A LD (X2+2),A LD (X3+2),A LD (X4+2),A LD (X5+2),A LD (X6+2),A ; LD HL,STRING+2 LD DE,STRING+1 LD BC,LENGTH-1 LDIR ;EAT ONE SPACE ; LD HL,STRING ;GET INPUT STRING LENGTH DEC (HL) ;WE STRIPPED A SPACE JP P,DIDOK ;IF NON-ZERO INC (HL) ;OH NO WE DIDN'T! DIDOK: LD A,(HL) ;LENGTH OF STRING SUB LENGTH ;LEAVE ONE BYTE FOR ZERO JP NC,TOOLNG ;STRING TOO LONG TO FIT IN TURNKEY LD B,A ;-NUMBER OF CHARACTERS TO CLEAR LD A,(HL) INC HL ;FIRST BYTE OF STRING LD E,A LD D,0 ADD HL,DE ;PAST THE STRING FILLSP: LD (HL),0 ;FILL END OF STRING INC HL INC B JR NZ,FILLSP ; LD BC,BUFFER X6: CALL 0024H ;SETDMA LD C,0 X5: CALL 001BH ;SELECT, DRIVE A: X1: CALL 0018H ;HOME LD BC,2 X2: CALL 0021H ;SETSEC, SECTOR 2 X3: CALL 0027H ;READ AND A JP NZ,ERR ; LD HL,STRING LD DE,BUFFER+7 LD BC,LENGTH+1 ;STRING PLUS LENGTH BYTE LDIR LD C,1 X4: CALL 002AH ;WRITE AND A JP NZ,ERR ; LD DE,DUNM LD C,9 CALL BDOS JP 0 DUNM: DB 'Done.',0DH,0AH,'$' ; TOOLNG: LD DE,TOOLM LD C,9 CALL BDOS JP 0 TOOLM: DB 'String too long.',0DH,0AH,'$' ; ERR: LD DE,ERRM LD C,9 CALL BDOS JP 0 ERRM: DB 'Disk error!',0DH,0AH,'$' ; BUFFER EQU $ ; END  ;LENGTH OF STRING SUB LENGTH ;LEAVE ONE BYTE FOR ZERO JP NC,TOOLNG ;STRING TOO LONG TO FIT IN TURNKEY LD B,A ;-NUMBER OF CHARACTERS TO CLEAR LD A,(HL) INC HL ;FIRST BYTE OF STRING LD E,A LD D,0 ADD HL,DE ;PAST THE STRING FILLSP: LD (HL),0 ;FILL END OF STRING INC HL INC B JR NZ,FILLSP ; LD BC,BUFFER X6: CALL 0024H ;SETDMA LD C,0 X5: CALL 001BH ;SELECT, DRIVE A: X1: CALL 0018H ;HOME LD BC,2 X2: CALL 0021H ;SETSEC, SECTOR 2 X3: CALL 0027H ;READ AND A10 WIDTH 255 30 FOR X=0 TO 9:READ N:POKE &HF7E0,X:POKE &HF7E1,N:NEXT 40 DATA 119,80,97,6,27,10,25,26,1,8 50 REM 119,80,97,6,27,10,25,26,0,8 OR X=0 TO 9:READ N:POKE &HF7E0,X:POKE &HF7E1,N:NEXT 40 DATA 119,80,97,6,27,10,25,26,1,8 50 REM 119,80,97,6,SETIO COM SETIO DOCSETIO MACF !"TURNKEY COM#TURNKEY DOC$TURNKEY MAC %&VFUZZY $$$åååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååå 10 WIDTH 255 20 PRINT CHR$(27);"*"; 30 FOR X=0 TO 9:READ N:POKE &HF7E0,X:POKE &HF7E1,N:NEXT 40 DATA 119,80,97,6,24,10,13,23,3,9 50 REM 119,80,97,6,27,10,25,26,0,8 OR X=0 TO 9:READ N:POKE &HF7E0,X:POKE &HF7E1,N:NEXT 40 DATA 119,80,97,6,24,10,13,23,3SETIO COM SETIO DOCSETIO MACF !"TURNKEY COM#TURNKEY DOC$TURNKEY MAC %&VFUZZY BAS'VSMALL $$$ååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååVFUZZY.BAS and VSMALL.BAS are two programs demonstrating the programmable character set of MAX. You have to see these to believe them... Don't adjust your monitor when you run these; the only way to remove them is to cold boot. Be prepared for a shock!! TURNKEY DOC$TURNKEY MAC %&VFUZZY BAS'VSMALL BAS(VFUZZ/SM$$$åååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååå!í[fí°Éã0v¬ PÀL 8žMAX14 NSL MAX15 NSL$MEMTEST COM MEMTEST DOCSETIO COM SETIO DOCSETIO MACF !"TURNKEY COM#TURNKEY DOC$TURNKEY MAC %&VFUZZY BAS'VSMALL BAS(VFUZZ/SMDOC)WSKB $$$ååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååWSKB.COM (and .MAC) is a utility which reconfigures your MAX arrow keys for WordStar (tm). Again, useful, but I did it with XCONFIG myself. You might try them for size... SETIO COM SETIO DOCSETIO MACF !"TURNKEY COM#TURNKEY DOC$TURNKEY MAC %&VFUZZY BAS'VSMALL BAS(VFUZZ/SMDOC)WSKB COM*WSKB $$$åååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååå; .Z80 ASEG ORG 100H ; LD HL,NEWKEY LD DE,(0001H) ;BIOS ADDRESS LD E,66H ;POINT TO CURSOR CONTROL KEY LIST LD BC,4 LDIR RET ; NEWKEY: DB 05H,18H,13H,04H ;CTRL/E, CTRL/X, CTRL/S, CTRL/D ; END SETIO COM SETIO DOCSETIO MACF !"TURNKEY COM#TURNKEY DOC$TURNKEY MAC %&VFUZZY BAS'VSMALL BAS(VFUZZ/SMDOC)WSKB COM*WSKB DOC+WSKB $$$åååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååå ;******************************************************** ;* This program allows the Lobo Max-80 F3 and F4 keys ;* to be reprogrammed to anything the user likes. ;* ;* Ver 1.0 -- Tom Marazita 8/14/83 ;******************************************************** ; ;General equates ; BDOS EQU 0005 ;BDOS VECTOR CONIN EQU 01H ;CONSOLE INPUT FUNCTION DCONIN EQU 06H ;DIRECT CONSOLE INPUT FUNCTION CONOUT EQU 02H ;CONSOLE OUT FUNCTION F3 EQU 0DC6EH ;ADDRESS OF F3'S CHARACTER IN BIOS F4 EQU 0DC6FH ;ADDRESS OF F4'S CHARACTER IN BIOS CR EQU 0DH ;A CARRIAGE RETURN... LF EQU 0AH ;...AND A LINE FEED ; ;Program starts here, naturally. ; ORG 100H ;YES,ANOTHER PROGRAM THAT STARTS AT 100H START LXI D,SIGNON ;POINT TO SIGN ON MESSAGE CALL PUTMSG ;SAY HELLO TO USER... MVI C,CONIN CALL BDOS ;GET KEY CHOICE FROM USER CPI '1' ;IS IT KEY CHOICE 1? JZ ONE CPI '2' ;OR CHOICE TWO? JZ TWO LXI D,BADKEY ;NEITHER, PRINT BADKEY MESSAGE AND EXIT CALL PUTMSG RET ;RETURN TO CPM ONE LXI H,F3 ;POINT TO F3 ADDRESS JMP SKIP2 ;SKIP OVER KEY TWO STUFF TWO LXI H,F4 ;POINT TO F4 ADDRESS SKIP2 SHLD SAVEKEY ;SAVE IT FOR LATER, 'CAUSE BDOS MIGHT EAT IT. LXI D,QMSG ;POINT TO QUERY MESSAGE CALL PUTMSG WAIT MVI C,DCONIN ;GET NEW CHAR FROM USER MVI E,0FFH ;FF MEANS GET A CHAR. CALL BDOS ORA A JZ WAIT ;IF ZERO, THEN NO CHAR YET LHLD SAVEKEY ;RESTORE KEY ADDRESS MOV M,A ;OTHERWISE, STORE CHAR AT KEY ADDRESS CALL ECHO ;ECHO KEY TO CONSOLE LXI D,EMSG ;PRINT ENDING MSG CALL PUTMSG RET ;RETURN TO CPM ; ;Call this with a char in A and it will be printed. ; ECHO STA SAVECHR ;SAVE IT FOR LATER CPI 20H ;IF A CTRL CHAR, PRINT '^CHAR' CC CTRLCHR ;YES, A WAS LESS THAN 20 SO ITS A CTRL CHAR LDA SAVECHR ;GET NEW CHAR INTO E FOR BDOS MOV E,A MVI C,CONOUT ;ECHO NEW CHAR TO USER CALL BDOS RET CTRLCHR ADI '@' ;FOLD TO PRINTABLE CHAR STA SAVECHR ;SAVE NEW CHAR FOR LATER PRINTING MVI E,'^' ;PRINT THIS NEAT THING TO SHOW IT IS CTRL  MVI C,CONOUT CALL BDOS RET ; ;Enter here with DE pointing to a string to be printed ; PUTMSG MVI C,9 ;BDOS FUNCTION TO PRINT A STRING TO CON: CALL BDOS ;PRINT THE STRING RET ; ;Nothing but messages and storage past this point. ; SIGNON DB 'Which function key is it your desire to change:' DB CR,LF,LF DB ' (1) F3 or (2) F4' DB CR,LF,LF,'Hit 1 or 2, Oh soft one... $' QMSG DB CR,LF,'Now, hit the key corresponding to the new value: $' EMSG DB CR,LF,LF,'The key has been reprogrammed, soft one.$' BADKEY DB CR,LF,LF,'Illegal choice, program terminated.$' SAVEKEY DS 2 SAVECHR DS 1 END CHR ;SAVE IT FOR LATER CPI 20H ;IF A CTRL CHAR, PRINT '^CHAR' CC CTRLCHR ;YES, A WAS LESS THAN 20 SO ITS A CTRL CHAR LDA SAVECHR ;GET NEW CHAR INTO E FOR BDOS MOV E,A MVI C,CONOUT ;ECHO NEW CHAR TO USER CALL BDOS RET CTRLCHR ADI '@' ;FOLD TO PRINTABLE CHAR STA SAVECHR ;SAVE NEW CHAR FOR LATER PRINTING MVI E,'^' ;PRINT THIS NEAT THING TO SHOW IT IS CTRL XFUNC.ASM is a program which allows you to reprogram your F3 and F4 function keys. MAX14 NSL MAX15 NSL$MEMTEST COM MEMTEST DOCSETIO COM SETIO DOCSETIO MACF !"TURNKEY COM#TURNKEY DOC$TURNKEY MAC %&VFUZZY BAS'VSMALL BAS(VFUZZ/SMDOC)WSKB COM*WSKB DOC+WSKB MAC,XFUNC ASM-./XFUNC $$$åååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååå:10C60000C305C7C301C750002020202020202020C0 :08C61000202020202020200042 :04C6590008C617C632 :10C67700434F4D01242424202020202053554200DD :01C6870000B2 :10C6BC001600004449522084CA4C4953545DCB5453 :10C6CC0059504561CB55534552C0CC44465520CAB0 :10C6DC00CC474F2020D7CC4552412035CB53415627 :10C6EC0045FACB52454E207CCC4745542081CD4A4F :10C6FC00554D50D2CCAF3207C63177C6C5791F1F06 :10C70C001F1FE60F5FCD48C8CD0BC8322AC7C179B1 :10C71C00E60F325CC82803CD10C8117AC63E00B7AC :10C72C002FC42AC82F322AC73A07C6B72029317717 :10C73C00C6CDAAC7CD00C8C641CDB1C7CD46C8B776 :10C74C002812FE0A3809D60AF53E31CDB1C7F1C61A :10C75C0030CDB1C7CD6AC8CDCBC8CD04C8CD00C8CB :10C76C00325CC8CDE3C9C4F2C8118BC7D53ADAC95B :10C77C00B7C2DCCCCD62CAC2DCCC7E23666FE9CDFD :10C78C00CFC9CDE3C93A9CC6D62021DAC9B6C2F2CC :10C79C00C8189BCDE8C74E6F2046696CE5C93E0DA5 :10C7AC00CDB1C73E0AC50E025FE5CD0500E1C1C99A :10C7BC000E01CDE1C7C361C8F53E00B72806F1C52F :10C7CC000E0518E4F1F5CDB1C7F1FE0ACAE1CBC9EB :10C7DC00119BC60E14C5CD0500C1B7C9F5CDAAC7AE :10C7EC00F1E3F 5CDF5C7F1E3C97ECDB1C77E23B733 :10C7FC00C8F818F50E1918091180000E1A18020E37 :10C80C000DC305005F0E0E18F8AF32BBC6119BC6E8 :10C81C000E0FCD05003CC90E1018F7119BC60E115A :10C82C0018F00E1218EC212AC77EB7C83600117A00 :10C83C00C60E1318CC3E005F18021EFF0E2018C146 :10C84C00CD46C887878787215CC8B6320400C93EAD :10C85C0000320400C9FE61D8FE7BD0E65FC93A2ADB :10C86C00C7B72845117AC6D5CD1CC8D1283B3A8903 :10C87C00C63D329AC6CDDFC7202F1107C6218000D6 :10C88C00015000EDB02188C636002335117AC6CD93 :10C89C0023C828153E24CDB1C72108C6CDF5C7CD78 :10C8AC00E1C8C8CD32C8C33AC7CD32C8CD4CC83E9A :10C8BC007DCDB1C70E0A1106C6CD0500C35BC821DC :10C8CC0007C64604237ECD61C87710F836002108D0 :10C8DC00C62259C6C9D50E0BCDE1C7C4BCC7D1C938 :10C8EC00CD3EC9FE10D8CDAAC72A5BC67EFE213824 :10C8FC0008E5CDB1C7E12318F3CDEDC7BFCD32C8E4 :10C90C00C33AC71AB7C8FE2038DCC8FE3DC8FE5F64 :10C91C00C8FE2EC8FE3AC8FE3BC8FE3CC8FE3EC947 :10C92C00ED5B59C61AB7C8FE20C01318F7856FD037 :10C93C0024C9CDE3C921A6C6060B7E2BFE202004FC :10C94C0010F81804FE48282B219CC60100117EFE0D :10C95C0020281823D630FE0A301357790707078191 :10C96C00380B8138088238054F10E379C9C3F2C8F7 :10C97C00CDE3C9219CC6110000060B7EFE20282D9C :10C98C00FE482829D63038E5FE0A3806D607FE10B0 :10C99C0030DB234F7A07070707E6F0577B070707BB :10C9AC00075FE60FB2577BE6F0B15F10CEEB7DC9A7 :10C9BC0021800081CD39C97EC9AF329BC6CDD9C982 :10C9CC00C81807CDD9C9C83A5CC8C310C83E00B74F :10C9DC00C83D215CC8BEC9219BC6AF32DAC9CD2C7B :10C9EC00C9ED535BC61AB7280ADE4047131AFE3A44 :10C9FC0028071B3A5CC87718067832DAC97013AF6F :10CA0C0032BEC60608CD33CA0603FE2E200613CD51 :10CA1C0033CA1803CD54CA060423360010FBED5359 :10CA2C0059C63ABEC6B7C9CD0FC9281C23FE2A2049 :10CA3C0007363FCD5ACA18077713FE3FCC5ACA1097 :10CA4C00E6CD0FC9C81318F923362010FBC93ABE1E :10CA5C00C63C32BEC6C921BFC60E0B119CC606040D :10CA6C001ABE200A132310F81AFE202004C9231022 :10CA7C00FD23230D20E50CC93E80F5CDE3C9CDC5C2 :10CA8C00C9219CC67EFE20CC2DCBCD2CC9060028FE :10CA9C0016FE412806FE53200E068013ED5359C690 :10CAAC00FE532803F1AFF5F1571E00D57832D4CAE6 :10CABC00CD27C8CC9FC728673D0F0F0FE6604F3EB0 :10CACC000ACDBCC9D1D5A2FE00204AD17B1CD5E62B :10CADC0003F52005CDAAC71808CDEDC720207C2072 :10CAEC00A0060178CDBCC9E67FFE202013F1F5FE2F :10CAFC0003200B3E09CDBCC9E67FFE2028163E2044 :10CB0C00CDB1C70478FE0C300BFE0920D63E2ECDDD :10CB1C00B1C718CFF1CDE1C82005CD2EC81897D1DB :10CB2C00C9060B363F2310FBC9CDE3C9FE0B2012FF :10CB3C00CDE8C7416C6CBFCDBCC7FE59C23AC7CD5E :10CB4C00AAC7CDC5C9AF47CDB4CA119BC6CD3DC888 :10CB5C00C93EFF1801AF32C6C7CDE3C9C2F2C8CD7A :10CB6C002CC932EBCB280513EB2259C6CDC5C9CD48 :10CB7C0015C8CADECBCDAAC73E1732BCC621BDC66E :10CB8C0036FF060021BDC67EFE803809E5CDDCC728 :10CB9C00E1203DAF7734218000CD39C97EE67FFEA0 :10CBAC001AC8FE0D280EFE0A280AFE09280DCDC44F :10CBBC00C7041812CDC4C70600180B3E20CDC4C73D :10CBCC000478E60720F5CDE1C828B9FE03C818B4EF :10CBDC003DC8C37BCDE521BCC635201036163E00C2 :10CBEC00FE502808CDBCC7FE03CA8BC7E1C9CD3E99 :10CBFC00C96F2600E5CD4DCC0E16CD1EC8E1283AE6 :10CC0C00AF32BBC6CD2CC913FE5328021B29ED53E2 :10CC1C0059C61100017CB528182BE521800019E5B7 :10CC2C00CD07C8119BC60E15CDE1C7D1E1200B185D :10CC3C00E4119BC6CD23C83C2003CDE1CDCD04C867 :10CC4C00C9CDE3C9C2F2C8CDC5C9CD27C8119BC691 :10CC5C00C8D5CDE8C744656C6574652046696C65BC :10CC6C00BFCDBCC7D1FE59C28BC7D5CD3DC8D1C92C :10CC7C00CD4DCC3ADAC9F5219BC611ABC6011000DB :10CC8C00EDB0CD2CC9FE3D2028EB232259C6CDE3B7 :10CC9C00C9201EF14721DAC97EB72804B8702011CB :10CCAC0070AF329BC6119BC60E17CD1EC8C0CD9F50 :10CCBC00C7C37BCDCDECC85FCD48C8C38EC7CDEC08 :10CCCC00C832A9CD18F5CD7CC9183C210001183704 :10CCDC003A9CC6FE2020143ADAC9B7CA8EC73D3238 :10CCEC005CC8CD5BC8CD10C8C38EC73AA4C6FE20A5 :10CCFC00C2F2C82177C611A4C6010300EDB0210011 :10CD0C0001E5CD8BCDE1C02269CDCDCFC9CDE3C935 :10CD1C0021DAC9E57E329BC621ABC6CDE6C9E17EE0 :10CD2C0032ABC6AF32BBC6115C00219BC6012100E1 :10CD3C00EDB02108C67EB72807FE2028032318F57E :10CD4C0006001181007E12B7280504231318F6780B :10CD5C00328000CDAAC7CD04C8CD4CC8CD0001CDC2 :10CD6C0004C8CD5BC8CD10C8C33AC7E1CD41C8CD0E :10CD7C00CFC9C3F2C8CD7CC9E5CDE3C9E120F3CD61 :10CD8C0094CDF5CD41C8F1C922C4CDCD46C83242AF :10CD9C00C832ABCDCDC5C9CD15C8201B3E00FE0099 :10CDAC00280932ABCD5FCD48C818E921DAC9AFB636 :10CDBC00C277CD360118DD2100013EC5BC3816E521 :10CDCC00EBCD07C8119BC6CDDFC7E1200611800053 :10CDDC001918E73DC8CDE8C746756CEC3E01B7C9DC :0000000000 0CD2CC9FE3D2028EB232259C6CDE3B7 :10CC9C00C9201EF14721DAC97EB72804B8702011CB :10CCAC0070AF329BC6119BC60E17CD1EC8C0CD9F50 :10CCBC00C7C37BCDCDECC85FCD48C8C38EC7CDEC08 :10CCCC00C832A9CD18F5CD7CC9183C210001183704 :10CCDC003A9CC6FE2020143ADAC9B7CA8EC73D3238 :10CCEC005CC8CD5BC8CD10C8C38EC73AA4C6FE20A5 :10CCFC00C2F2C82177C611A4C6010300EDB0210011 :10CD0C0001E5CD8BCDE1C02269CDCDCFC9CDE3C935 :10CD1C0021DAC9E57E329BC621ABC6CDE6C9E17EE0 :10CD2C0032ABC6AF32BBC6115C00219BC6012100E1 :10CD3C00EDB02108C67EB72807FE2028032318F57E :10CD4C0006001181007E12B7280504231318F6780B :10CD5C00328000CDAAC7CD04C8CD4CC8CD0001CDC2 :10CD6C0004C8CD5BC8CD10C8C33AC7E1CD41C8CD0E :10CD7C00CFC9C3F2C8CD7CC9E5CDE3C9E120F3CD61 :10CD8C0094CDF5CD41C8F1C922C4CDCD46C83242AF :10CD9C00C832ABTherå  ió á filå oî thió disë calleä ZCPR-MAX.HEX¬  thió ió  whaô � yoõ  neeä tï instalì zcpò intï youò operatinç systeí oî thå  MAX-� 80®  Witè  thió disë iî drivå  anä youò SYSTEÍ disë iî drivå  A¬ � herå ió ho÷ tï gï abouô it: B>a:ddt a:cpm60.com <--- Iæ  yoõ havå alreadù XCONFIGeä youò � DDT VERS 2.0                  CPM60.COM and saved it under a NEXT PC                      different name, then use that file. 3480 0100 -izcpr-max.hex -r4480 NEXT PC 3480 0000 -^C B>save 52 cpmz.com B>a:xconfiç cpmz.coí <--- follo÷ promptó tï writå thå filå to the system tracks on this disk. Afteò  yoõ  finisè  witè thå installatioî oæ  cpmz.coí  witè  thå � xconfiç prograí above¬  yoõ maù theî booô thå disk® Yoõ wilì kno÷ � thaô  thå changå waó successfuì wheî yoõ seeº  Aý aó thå  signoî � prompt after booting. Enjoy! Jim Smith åååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååå 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) ; 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 - Richard 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 Table 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 COMLOG 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 ; ; 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 of 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 PROM 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 ways. The first way is to set MSIZE and BIOSEX ; as described above using the following three lines: ; ;MSIZE EQU 56 ;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: ; CPRLOC EQU 0C600H ;MAX-80 (FILL IN WITH BDOSLOC SUPPLIED VALUE) ; ; 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 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 0A80H-CPRLOC ;DDT LOAD OFFSET FOR MAX-80 ENDIF ; RAS EQU FALSE ;SET TO TRUE IF CPR IS FOR A REMOTE-ACCESS SYSTEM ; ; The following is presented as an 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 CCP ; 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 SUBMIT ; 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: is 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. ; SUBA equ TRUE ; 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 placing 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 [NOTE: The C register MUST contain ; a valid User/Disk Flag (see location 4) at this time.] ; CLEVEL3 equ TRUE ;ENABLE COMMAND LEVEL 3 PROCESSING ; ; ;*** TERMINAL AND 'TYPE' CUSTOMIZATION EQUATES ; NLINES EQU 24 ;NUMBER OF LINES ON CRT SCREEN WIDE EQU TRUE ;TRUE IF WIDE DIR DISPLAY FENCE EQU '|' ;SEP CHAR BETWEEN DIR FILES ; PGDFLT EQU TRUE ;SET TO FALSE 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 TRUE ;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 INDICATING USER COMMAND ; NUMBASE EQU 'H' ;CHARACTER USED TO SWITCH FROM DEFAULT ; NUMBER BASE ; SECTFLG EQU 'S' ;OPTION CHAR FOR SAVE COMMAND TO SAVE SECTORS ; ; 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 TPA ; ; ; 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 DISPLACEMENTS ; @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-$-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 EXTENSIONS ; ; ;**** 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 register 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 (Command 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 ; The 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 character (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 has 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). ; BUFLEN 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 CONTROL 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 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 ; CMDTBL: 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 PROCESS 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 DISK 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 ;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 ;IF 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 COMMAND 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 A,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 Error Message ; PRNNF: CALL PRINTC ;NO FILE MESSAGE DB 'No Fil','e'+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 ON 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 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 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 A ;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 ;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 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 NEXT 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 NEW 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 CONOUT 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 CALL 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 ;PT 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 ; ; 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 ' '+1 ;SIMPLE '?' IF OR LESS JRC 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 ;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 ; ; ADVANCE 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 PLACE 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, 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 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 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 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 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 LOGIN 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 ZERO 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 INX D ;PT TO NEXT CHAR LDAX D ;SEE IF IT IS A COLON (:) CPI ':' JRZ SCAN3 ;YES, WE HAVE A DRIVE SPEC 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 ':' ; ; EXTRACT 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 SCAN15: 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 FIELD 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 '?' ;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 ; 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 (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 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 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 DIRPR 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 ;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 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 ;PRINT 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 TYPE 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: CALL 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 ;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 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: 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? JRZ 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 ERROR? 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 ; PGDFLG 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 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 ;LOOK 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 CALL 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, and 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 ;RAS ; ;Section 5F ;Command: REN ;Function: To change the name of an existing file ;Forms: ; REN = 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 REN1: 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: 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: ; 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 ; ;Section 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 processing ;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 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 (SUBROUTINE) 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 FCB 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 CRLF ;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 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 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 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 ; ; ERROR 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: 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 JRNZ 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 'Ful','l'+80H MVI A,1 ;SET NON-ZERO TO INDICATE ERROR ORA A ;SET FLAG RET ; END R 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: 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 JRNZ ML3 ;READ ERROR OR EOF? LXI D,128 ;MOVE 128 BYTES PER SECTOR DAD D  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 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  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 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 ió á replacemenô foò thå CP/Í Consolå Commanä Processoò � (CCP©  whicè  ió  designeä tï ruî aó parô oæ  CP/Í  oî  Z80-baseä � microcomputers®  Iî mosô caseó iô ió upward-compatible witè  thå � originaì CP/Í Versioî 2.² CCP. ZCPR¬  however¬  provideó  manù extensionó tï thå CP/Í  CCP® � Includeä iî theså extensionó arå thå followinç features: ® Thå TYPÅ functioî caî bå madå tï pagå oò noô pagå itó � outpuô aô thå user'ó discretion ®  Á LISÔ functioî ió availablå whicè sendó itó  outpuô � tï thå CP/Í LSTº Devicå anä doeó NOÔ page ®  Thå  DIÒ commanä haó beeî extendeä tï allo÷ thå dis-� plaù oæ thå systeí fileó oò alì files ® Thå ERÁ commanä no÷ printó ouô thå nameó oæ thå fileó � iô ió erasing ®  Thå  currenô useò numbeò maù bå includeä aó parô  oæ � thå commanä prompt»  iæ thå useò ió undeò á numbeò otheò thaî  0¬ � thå prompô ió oæ thå forí 'du>§ (likå 'A2>§ oò 'B10>')¬  and¬  iæ � thå  useò ió undeò 0¬  thå prompô maù bå 'd>§ oò 'd0>§ aó peò hió � choice  ®  Thå  SUBMIÔ facilitù haó beeî changeä iî  twï  basiã � ways: - thå  prompô  changeó tï 'du$§ oò 'd$§  wheî  thå � SUBMIÔ commanä ió printed - thå $$$.SU ió executeä froí drivå Aº (notå thaô � thå  originaì  SUBMIÔ  probleí no÷ exists¬  buô thå  ne÷  SUB.COÍ � facilitù  correctó it)»  thå CCP-GROUÐ definitioî oæ aî  Indirecô � Commanä  Filå  no÷  applies¬  anä thió  definitioî  ió  thaô  anù � sequencå oæ commandó whicè maù bå issueä froí thå consolå ió alsï � á  valiä  sequencå  oæ commandó foò executioî  froí  aî  Indirecô � Command File; hence, the sequence: DIR B: DIR A: maù  bå  issueä  froí eitheò thå consolå oò aî  Indirecô  Commanä � File¬  anä thå resultó oæ thå executioî oæ thió sequencå arå  thå � same®  Basically¬  thió  sayó  thaô Indirecô Commanä  Fileó  arå � upward-compatiblå  tï thå consolå inpuô (buô noô necessarilù thaô �  thå  contentó  oæ aî Indirecô Commanä Filå maù bå issueä  aô  thå � consolå withouô modification). Š Page 2 ZCPR - A Z80 Replacement for the CP/M CCP ®  Á command-searcè hierarchù ió no÷ implementeä  whicè � ió executeä roughlù aó follows: - thå  user'ó commanä ió checkeä againsô thå  CPR-� residenô commandó anä executeä immediatelù iæ á matcè ió found - failinç  that¬  thå  currenô useò numbeò oî  thå � currenô disë ió scanneä foò thå COÍ file»  thå COÍ filå ió loadeä � anä executeä iæ found - failinç that¬ á defaulô useò numbeò (initiallù ° � buô  caî bå reseô witè thå DFÕ CPR-residenô command© oî thå  cur-� renô disë ió scanneä foò thå COÍ file» thå COÍ filå ió loadeä anä � executeä iæ found - finally¬  failinç that¬  thå defaulô useò numbeò � oî disë Aº  ió scanneä foò thå COÍ file»  thå COÍ filå ió  loadeä � anä executeä iæ founä oò aî erroò messagå (COMMAND?¬ wheî COMMANÄ � waó thå user'ó commanä name© ió printed ®  Thå  numeriã  argumenô foò thå SAVÅ commanä caî  bå � specifieä  iî hexadecimaì sï thaô thå useò maù emploù thå  valueó � presented by tools such as DDT exactly as they are given ®  Á  GEÔ  commanä whicè loadó á filå  aô  á  specifieä � memorù addresó anä á JUMÐ commanä whicè "calls¢ thå subroutinå aô � á  specifieä memorù addresó havå beeî added»  á GÏ commanä  whicè � "calls¢  thå  subroutinå aô 100È (subseô oæ thå JUMР capability© � has also been added Thió  documenô provideó thå useò oæ ZCPR witè thå  followinç � 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 Replacement for the CP/M CCP Part A Installation Instructions Iî  ordeò tï instalì ZCPR oî á targeô microcomputeò (musô bå � currently running CP/M 2.2), the user must know two basic things: 1) Where his CCP is currently running in memory 2©  Wherå hió CCÐ ió locateä iî thå SYSGEΠ image¬  or¬ � foò systemó whicè don'ô supporô SYSGEÎ (sucè aó P&Ô CP/Í 2.²  foò � thå TRS-8° Modeì II)¬ wherå hió CCÐ ió locateä oî disë anä ho÷ tï � place the new ZCPR on top of it Thå  firsô questioî ió answereä relativelù easily®  Á  pro-� gram¬  knowî  aó eitheò BDOSLOà oò BDLOà (foò BDOÓ  Locator)¬  ió � provideä  witè ZCPR®  Yoõ shoulä assemblå thió prograí foò  youò � particulaò  computeò (changå thå baså ORÇ iæ yoõ arå runninç non-� ORG-° CP/M© anä executå it®  Upoî execution¬ iô wilì providå yoõ � witè  thå baså addresó oæ (1© thå BDOÓ anä (2© thå CCР foò  youò � particulaò system®  BDOSLOà haó workeä correctlù foò alì systemó � testeä sï far¬  buô therå ió alwayó á chancå thaô iô maù NOÔ worë � foò somå non-testeä system®  Foò thå timå being¬  assumå thaô iô � workó correctlù anä recorä thå startinç baså pagå addresó oæ youò � CCP. Thå  seconä questioî ió noô answereä nearlù sï  easily®  Iæ � yoõ  havå  thå abilitù tï SYSGEÎ youò system¬  iô ió mucè  easieò � (commonly© thaî iæ yoõ dï not®  Yoõ must¬  afteò assemblinç  thå � ZCPR  properly¬  integratå iô intï thå sysgeî (oò disk© imagå  oæ � CP/M®  Thió  caî  bå  donå bù obtaininç á SYSGEÎ imagå  oæ  youò � system¬ scanninç iô viá á debuggeò sucè aó DDÔ tï finä thå offseô � foò thå CCP¬  readinç thå ne÷ CPR iî oî toð oæ thå olä  one¬  anä � finallù  runninç  SYSGEÎ agaiî tï placå thå resultanô  systeí  oî � disk®  Iæ  yoõ  DÏ NOÔ havå SYSGEÎ capability¬  á  Disë  Utilitù � prograí  ió requireä tï locatå thå CCÐ oî disë anä theî writå thå � ne÷  ZCPR  oî  toð  oæ thå olä  one®  Thå  neô  resulô  oæ  thió � integratioî  ió  thå placemenô oæ thå ne÷ ZCPR ontï disë  iî  thå � propeò  placå sï thaô iô wilì bå loadeä witè thå resô oæ CP/Í  oî � colä booô anä executeä properly. Tï finä thå originaì CCP¬ yoõ typicallù havå tï locatå iô bù � itó appearance®  Iô ió probablù storeä contiguouslù oî disk¬ so¬ � oncå iô ió found¬ á sequentiaì overwritå ió alì thaô ió required® � Probabilitù  ió extremelù higè thaô iô ió storeä contiguouslù  iî � thå SYSGEÎ image®  Thå CCÐ startó witè twï (2© anä ONLÙ TWÏ jumð � instructionó  followeä  bù á buffeò areá (possiblù containinç  aî � initiaì  commanä and/oò thå Digitaì Researcè  copyrighô  notice)® � Thå  Digitaì  Researcè manualó sho÷ thå CCÐ tï residå aô  addresó � 980È  iî thå SYSGEÎ image¬  buô thió maù varù  witè  system®  Tï � finä  thió image¬  uså DDÔ oò somå otheò sucè debugger¬  loaä thå � SYSGEÎ imagå yoõ caî geô viá SYSGEN¬  anä examinå memorù startinç � aô arounä 900È foò thå twï (anä ONLÙ two© jumpó describeä  above® � Iæ  yoõ finä aî areá witè morå thaî twï jumpó (á grouð oæ  them)¬ � yoõ  arå probablù lookinç aô thå BIOÓ anä shoulä gï loweò foò thå � CCP®  Thå  CCÐ wilì probablù starô oî aî eveî pagå oò  half-pagå � address (like 900H, 980H, 1100H, etc). Š Page 4 ZCPR - A Z80 Replacement for the CP/M CCP No÷ thaô thå locatioî oæ thå CCÐ haó beeî found¬ recorä thió � addresó foò later® Yoõ arå no÷ readù foò thå integratioî oæ ZCPR � intï youò system®  Tï dï this¬ perforí thå followinç stepó usinç � thå  informatioî  oæ thå pagå addresó oæ thå CCР (obtaineä  froí � BDOSLOà anä  calleä  CPRLOà withiî ZCPR© anä  thå  SYSGEΠ imagå � address of the CCP (called IMAGE for reference in this document). 1®  Ediô  ZCPÒ  anä seô thå CPRLOà equatå tï thå  valuå � obtaineä froí above® Alsï seô anù flagó anä valueó aó yoõ desirå � (seå thå sectioî oî ZCPÒ Customizatioî below)®  Wheî  satisfied¬ � enä thå ediô session. 2®  Assemblå  ZCPR  witè MAà (oò  equivalent)®  Thió � assembleò  ió  requireä  becauså oæ thå MACROó  used®  Onlù  thå � resultant HEX file is required. 3®  Assuminç thaô yoõ caî uså SYSGEN¬  obtaiî á SYSGEÎ � image of your current CP/M system and save it on disk. 4®  Loaä  thå  SYSGEÎ imagå intï memorù witè  DDÔ  (oò � equivalent)® Oncå loaded¬ verifù thaô thå originaì CCÐ ió aô thå � IMAGÅ  addresó  founä abovå anä computå  thå  integratioî  offseô � using the DDT H command: H, Thå  seconä numbeò displayeä giveó yoõ thå OFFSEÔ valuå  requireä � for step 5. 5®  Integratå  ZCPR intï youò SYSGEÎ imagå viá DDT'ó É � anä ROFFSEÔ commands® Uså IZCPR.HEØ (oò thå namå oæ youò versioî � oæ  ZCPR© tï loaä thå FC anä ROFFSEÔ (wherå OFFSEÔ waó  computeä � iî  steð 4© tï loaä thå ZCPR.HEØ filå intï memorù aô  thå  propeò � location®  Checë  tï seå thaô ZCPR ió indeeä properlù loadeä  bù � examining the SYSGEN IMAGE area. 6®  Placå thå ne÷ systeí oî disë bù runninç SYSGEÎ anä � NOT loading the system from disk (use the memory image). Foò   furtheò  clarificatioî  oæ  thå  abovå  process¬   thå � followinç  ió á samplå terminaì sessioî whicè outlineó thå  stepó � 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 SOURCE 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: Non-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 Remaining 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 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 ................ -- Detail Left Out -- -^à <-- Returî tï CP/M» É kno÷ thaô CPRLOà wilì be BD00H and the IMAGE offset is 1100H B>eä cpr.así {ediô ZCPR herå anä placå 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  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 <-- 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  Setting the ZCPR Inline Options Thå  followinç  arå thå fouò basiã optionó availablå tï  thå � 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 CP/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 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 Command 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 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 Leveì ³ Processing® Iæ seô tï TRUE¬ extended Command Level 3 Processing is enabled and the user command line is automatically capitalized, the terminatinç zerï ió placeä aô thå enä oæ thå 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 Thå followinç symboló arå provideä foò furtheò customizatioî � of ZCPR to a user's 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 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 in 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 for 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 '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 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 a 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 NUMBASÅ Thió ió thå escapå characteò useä bù thoså commands which require 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 default 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.COÍ  maù bå patcheä tï ruî witè ZCPÒ bù thå followinç � procedurå  (thió  ió  recommendeä  iæ  thå  useò  doeó  noô  havå � SUB.COM)®  Thió  patcè simplù makeó iô alwayó placå thå  $$$.SU � filå oî Drivå A:® Illustrative terminaì sessioî follows: A>ddt b:submit.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 Page 10 ZCPR - A Z80 Replacement for the CP/M CCP Part B Usage Instructions and Explanation of Commands Thå  followinç instructionó arå writteî witè thå  assumptioî � thaô  thå  readeò ió quitå familiaò witè ho÷ tï uså CP/Í 2.²  anä � itó CCP®  ZCPR ió writteî aó á logicaì extensioî oæ thå CP/Í 2.² � CCÐ philosophù anä shoulä bå addresseä aó such. The ZCPR Command Hierarchy Search Thå first¬  anä mosô basiã thing¬ tï learî abouô ZCPR ió thå � ordeò iî whicè ió searcheó foò á COÍ filå foò executioî oò á filå � specifieä  bù thå GEÔ command®  Undeò thå CP/Í 2.² CCP¬  iæ  thå � specifieä  COÍ filå commanä waó noô founä oî thå currenô drivå iî � thå  currenô useò area¬  thå CCÐ aborteä witè aî  erroò  message® � ZCPR¬  however¬  continueó searchinç froí thió poinô á maximuí oæ � twï  morå  levels®  Thió commanä hierarchù searcè  waó  outlineä � abovå anä ió describeä herå iî furtheò detail. 1®  Iæ  thå  commanä ió oæ thå forí 'COMMAND§ anä  NOÔ � 'd:COMMAND'¬  thå  CPR-residenô  commanä lisô ió searcheä  foò  á � match®  Iæ  thå  matcè ió found¬  thå  CPR-residenô  commanä  ió � immediatelù processed®  Iæ thå matcè ió noô founä oò thå commanä � ió  oæ thå forí 'd:COMMAND'¬  thå nexô steð ió taken®  Notå thaô � thå  'd:COMMAND§  forí ió gooä foò executinç á commanä  COÍ  filå � whicè  haó thå samå namå aó á CPR-residenô commanä (sucè aó  SAVÅ � or DIR). 2®  Iæ  thå commanä ió oæ thå forí  'd:COMMAND'¬  disë � drivå  'd:§  ió  temporarilù loggeä iî foò  thå  purposå  oæ  thå � commanä  search®  Otherwise¬  thå  currentlù logged-iî drivå  ió � used. 3® No÷ thå filå nameä COMMAND.COÍ ió searcheä for® Iæ � found¬  iô  ió loadeä intï memorù startinç aô 100È anä  executed® � If not, proceed to step 4. 4®  No÷  thaô  thå firsô searcè  foò  COMMAND.COÍ  haó � failed¬  thå  CPR checkó tï seå iæ thå useò ió undeò thå  currenô � Defaulô Useò Number®  Thå Defaulô Useò Numbeò maù bå thaô seô bù � thå  DEFUSÒ equatå iî thå CPR oò thaô seô bù thå useò viá thå DFÕ � command®  DEFUSÒ  ió iî effecô iæ DFÕ haó noô beeî issueä  sincå � thå lasô Warí oò Colä Boot¬ anä DFÕ ió iî effecô iæ iô waó issueä � sincå thå lasô Warí oò Colä Boot®  Iæ thå useò ió NOÔ undeò  thå � currenô  Defaulô Useò Number¬  ZCPR temporarilù logó hií intï  iô � anä  searcheó  thå directory®  Iæ COMMAND.COÍ ió  found¬  iô  ió � loadeä aó describeä abovå anä executed® Iæ not¬ ZCPR proceedó tï � the next step. Page 11 ZCPR - A Z80 Replacement for the CP/M CCP 5®  Thå useò ió no÷ iî thå Defaulô Useò Number¬ anä aô � thió  point¬  ZCPR checkó tï seå iæ thå useò ió oî disë drivå A:® � Iæ not¬ iô temporarilù logó intï Aº anä searcheó thå defaulô useò � numbeò  oæ  Aº  foò  COMMAND.COM®  Iæ found¬  iô  ió  loadeä  aó � describeä abovå anä executed®  Iæ not¬  ZCPR printó thå  commanä � namå  aó  aî  erroò messagå anä returnó tï  commanä  inpuô  mode¬ � aborting the SUBMIT file if COMMAND came from it. Iî  alì caseó oæ thå searcè above¬  iæ COMMAND.COÍ ió found¬ � afteò  iô  ió loadeä intï memory¬  ZCPR resetó thå  useò  tï  hió � originaì disë drivå anä useò number® Hence¬ thå fileó referenceä � by the user by default are obtained from this environment. Tï  illustratå thió commanä hierarchù search¬  consideò  thå � 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 equ 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 point, 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  Another Example: Foò  example¬  iæ thå useò ió loggeä intï Drivå  Bº  iî � Useò Areá 10¬ thå Defaulô Useò Numbeò ió 0¬ anä thå followinç COÍ � fileó arå presenô aó indicateä -- 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 theî  thå  followinç  happenó wheî  thå  followinç  commandó  arå � 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 searcheó Bº  Useò 10¬ Bº Useò 0¬ anä Aº Useò ° foò � WM.COM»  iô findó WM.COÍ iî Aº  Useò 0¬  loadó it¬  logó thå useò � back into B: User 10, and executes it. B10>MBASIC \ \__ Invoke the MBASIC.COM file (MBASIC Interpreter) \__ User is on Drive B: in User Area 10 Results: ZCPR searcheó Bº  Useò 1° anä Bº Useò ° foò MBASIC.COM» � iô findó MBASIC.COÍ iî Bº Useò 0¬ sï iô doesn'ô botheò tï looë oî � Aº  Useò 0®  MBASIC.COÍ ió theî loadeä anä executeä aó describeä � in the previous example. B10>TEST \ \__ Invoke the TEST.COM file (TEST program) \__ User is on Drive B: in User Area 10 Results: ZCPR  searcheó  Bº  Useò  1°  foò  TEST.COM»  iô  findó � TEST.COÍ iî Bº  Useò 0¬  sï iô doesn'ô botheò tï looë furtheò (iæ � iô had¬  iô woulä havå founä TEST.COÍ iî Bº Useò 0)® TEST.COÍ ió � 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 searcheó Bº  Useò 10¬ Bº Useò 0¬ anä Aº Useò ° foò � TEST2.COM»  iô  doesn'ô finä it¬  sï iô issueó thå erroò  messagå � 'TEST2?', which says it couldn't find TEST2.COM. Š  Page 13 ZCPR - A Z80 Replacement for the CP/M CCP The ZCPR-Resident Commands Thå  followinç  pageó describå thå  ZCPR-Residenô  Commands® � Theså  arå commandó locateä withiî ZCPR itselæ whicè arå executeä � froí withiî ZCPR® Thå phraseó <-- 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: Iæ  á  filå ió scanneä foò anä nï sucè namå existó oî  disk¬ � thå  'Nï  Files§ messagå wilì appear®  However¬  iæ  á  filå  ió � scanneä foò anä thå namå existó aó á $SYÓ filå anä $DIÒ fileó arå � beinç  scanneä for¬  nï filå namå ió displayeä buô thå 'Nï Files§ � messagå doeó NOÔ appear® Foò example¬ iæ TEST.COÍ ió á $SYÓ filå � anä  'DIÒ  TEST.COM§ ió issued¬  nï  messagå  appears®  Iæ  'DIÒ � TEXT.COM§ ió issueä anä TEXT.COÍ doeó noô exisô oî disk¬  thå 'Nï � Files' message is displayed. Command: ERA Function: To Erase the 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: Iæ á $R/Ï filå ió encountered¬  á BDOÓ erroò messagå wilì bå � displayeä  anä thå procedurå ió stopped®  Thå useò ió unsurå  aô � thió  timå aó tï whicè fileó havå beeî eraseä anä whicè havå  noô � anä shoulä check® Sorrù foò thió problem¡ Thå ERASÅ commanä (tï � bå  giveî  tï SIG/Í bù RLà iî thå neaò future© ió á  solutioî  tï � 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 <-- Print TEST.TXT on LST: Notes: Iæ  thå filå haó á $SYÓ attribute¬  iô wilì bå founä aó welì � as those with $DIR attributes. Command: TYPE Function: To Print the specified file on the CP/M CON: device Forms: TYPÅ P <-- Print the file with the paging deflt negated Customization Variables: NLINES PGDFLT PGDFLG Examples: TYPE TEST.TXT TYPE TEST.TXT P Notes: Wheî  thå  displaù pauseó durinç paging¬  typå anù  chaò  tï � 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 Customization 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: Iæ thå filå namå tï bå saveä alreadù exists¬  theî SAVÅ wilì � exiô witè thå messagå 'Delete File?'» iæ thå useò REALLÙ wantó tï � savå  undeò  thió name¬  hå maù theî typå Ù oò ù anä thå  currenô � filå wilì bå deleteä anä theî recreateä containinç thå  specifieä � 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: Iæ . 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  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 Command: 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: JUMÐ performó á subroutinå "call"¬ sï thå calleä routinå maù � return to the ZCPR by either a RET or a Warm Boot. Command: GO  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: Thió  commanä ió identicaì iî functioî tï JUMР 100H»  JUMP¬ � however¬ leaveó thå addresó aó thå firsô entrù iî CP/Í BASÅ « 80È � (the input line buffer), while GO has no such address. 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 GEÔ 10° TEST.8° oò GEÔ 100È TEST.8° <-- Loaä TEST.8° starting at 100H GEÔ ° TEST.8° <-- Loaä TEST.8° startinç aô 000H Notes: GEÔ  searcheó foò thå specifieä filå accordinç tï  thå  samå � commanä  hierarchù  searcè employeä bù thå ZCPR commanä  scanner® � Hence¬  iæ thå useò ió oî B:/1° anä thå filå ió oî A:/° witè  thå � currenô  defaulô useò numbeò aô 0¬  GEÔ wilì searcè froí B:/1° tï � B:/0 to A:/0 in looking for the file. Page 17 ZCPR - A Z80 Replacement for the CP/M CCP ZCPR Error Messages Thå  followinç  arå thå erroò messageó issueä  bù  ZCPR  anä � 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 charac 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? Froí REÎ oò SAVE¬ meanó thaô thå filå specifieä alreadù � existó oî disë anä thå useò maù typå Ù oò ù tï deletå � it and proceed with the 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  Versioî 1.° anä beyonä supportó threå distincô commanä leveló iî itó implementation® Eacè leveì constituteó á differenô � way to issue a command for ZCPR to process. Commanä Leveló ± anä ² arå commoî tï alì implementationó  oæ � CP/Í  anä CP/ZÍ froí CP/Í Versioî 1.4®  Commanä Leveì ± ió  thaô � commanä leveì iî whicè thå commanä ió issueä bù thå useò froí hió � consolå  terminal®  Thå  prompô  'd>§ oò 'du>§  appearó  oî  thå � terminal¬  anä  thå  useò  ió alloweä tï enteò thå  commanä  witè � editinç froí thå terminal® Commanä Leveì ² ió thaô commanä leveì � in which the command is entered from an executing $$$.SUB file. Iî  botè cases¬  thå commanä ió storeä iî thå internaì  ZCPR � buffeò calleä CIBUFÆ (Commanä Inpuô BUFFer)®  Undeò botè Commanä � Leveló  ±  anä 2¬  thå commanä ió placeä intï  thió  buffer¬  thå � characteró oæ thå commanä linå arå capitalized¬ á characteò counô � whicè  indicateó thå numbeò oæ characteró iî thå commanä linå  ió � storeä iî CBUFÆ (thå bytå beforå CIBUFF)¬  aî endinç binarù °  ió � placeä  afteò  thå lasô characteò iî thå commanä  line¬  anä  thå � internaì  pointeò CIBPTÒ (Commanä Inpuô Buffeò PoinTeR© ió seô tï � point to CIBUFF (the first character of the command line). Commanä  Leveì ³ ió aî extendeä concepô tï Commanä Leveló  ± � anä  ²  whicè ió specificallù supporteä bù ZCPÒ Versioî  1.°  anä � beyond® Thió commanä leveì allowó á transienô prograí tï placå á � commanä  linå intï CIBUFÆ anä thå characteò counô intï CBUFÆ  anä � havå thió commanä linå executeä bù ZCPR®  Oncå controì ió trans-� ferreä tï ZCPÒ tï executå thå commanä line¬ thå transienô prograí � whicè  placeä  thå commanä linå loseó controì anä thå commanä  ió � executeä  exactlù aó thougè iô haä beeî typeä bù thå useò aô  hió � consolå terminal. Iî  ordeò  foò  á transienô prograí tï utilizå  thå  Commanä � Leveì ³ facility¬ thió prograí MUSÔ dï thå following: 1® Locatå thå ZCPR® Sincå thå ZCPÒ ió ALWAYÓ 2Ë byteó � iî  sizå anä locateä directlù undeò thå BDOS¬  thå transienô  caî � locatå  thå  ZCPÒ  bù examininç thå BDOÓ entrù  pagå  addresó  aô � locatioî  ·  anä  subtractinç ¸ froí thió numbeò (¸  pageó  ½  2Ë � bytes)® Thå resultinç numbeò ió thå baså pagå addresó oæ ZCPR. 2®  Storå thå commanä linå iî CIBUFÆ anä thå characteò � counô  iî  CBUFF®  Knowinç thå baså pagå addresó  oæ  ZCPR¬  thå � following information is useful in doing this: Page 19 ZCPR - A Z80 Replacement for the CP/M CCP ORG CPRLOC ;Base Address of ZCPR 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®  Obtaiî  thå User/Disë Flag®  Locatioî ´  containó �  thió number¬  buô thå useò maù selecô á flaç oæ hió choice® Thió � flaç  ió  onå  bytå  long¬  anä thå high-ordeò  nybblå  (´  bits© � containó  thå useò numbeò anä thå low-ordeò nybblå  containó  thå � disë  numbeò tï procesó thå commanä from®  Thå User/Disë Flaç ió � to be passed to ZCPR in the C Register. 4® Wheî ready¬ transfeò controì tï ZCPR tï procesó thå � commanä bù JMPinç tï thå baså addresó oæ ZCPR®  Thå firsô JMÐ iî � thå JMÐ Tablå giveî abovå ió aô thió address® Aô thió time¬ ZCPR � wilì  loç iî thå useò anä disë iî thå User/Disë Flaç anä  procesó � the Command Level 3 Command Line. Page 20 ZCPR - A Z80 Replacement for the CP/M CCP Thå  followinç  ió á samplå prograí  whicè  illustrateó  thå � steps outlined above: ; ; Demonstration of Command Level 3 Facility by RLC ; udflag equ 4 ! ;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 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? $' Enjoy using ZCPR! -- RLC Page 21 ;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 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? Summary of the New Features of ZCPR The ZCPR Command Hierarchy Search ZCPR-Resident Command DIR ZCPR-Resident Command ERA ZCPR-Resident Command LIST ZCPR-Resident Command TYPE ZCPR-Resident Command SAVE ZCPR-Resident Command REN ZCPR-Resident Command USER ZCPR-Resident Command DFU ZCPR-Resident Command JUMP ZCPR-Resident Command GO ZCPR-Resident Command GET ZCPR Error Messages :Summary of the New Features of ZCPR ZCPR (Z80 Command Processor Replacement) is a replacement of the CP/M CCP which is designed to run as part of CP/M on Z80- based microcomputers. In most cases it is upward-compatible to the original CP/M Version 2.2 CCP. ZCPR, however, provides many extensions over the CP/M CCP. Included in these extensions are: . 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 does 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 . 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: only (note that the original SUBMIT problem now exists, but the new SUB.COM facility corrects it); Indirect Command Files now perform according to the basic philosophy that any command sequence that can be input from the console may be used in an Indirect Command File as well; the ZCPR.DOC file also gives details as to how to patch SUBMIT.COM if SUB.COM is not available . A command-search hierarchy is now implemented which is executed as follows: - the user's command is checked against the CPR- resident commands and executed immediately if a match is found - failing that, the 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 executed if found or an error message (COMMAND?, when COMMAND was the user's command name) is printed . The numeric argument for the SAVE CPR-resident com- mand (viz the number of 256-byte pages to save)" can be input in HEX rather than decimal . 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 "calls" the subroutine starting at 100H is also added (this is redundant with JUMP 100H) :The ZCPR Command Hierarchy Search The first, and most basic thing, to learn about ZCPR is the order in which it 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 in 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 COM file which has the same name as a CPR-resident command (such as SAVE 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 if 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 found, it is loaded as described above and executed. If not, ZCPR proceeds to the next step. 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 loaded 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 command 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 equ 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 point, 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 :ZCPR-Resident Command DIR Command: DIR Function: To Display a listing of the names of the files on disk Forms: DIR <-- Displays $DIR files DIR S <-- Displays $SYS files DIR A <-- Displays both $DIR and $SYS files 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 exists 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. :ZCPR-Resident Command ERA Command: ERA Function: To Erase the specified $R/W files from disk Forms: ERA <-- Erase both $DIR and $SYS files 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. 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. :ZCPR-Resident Command LIST Command: LIST Function: To Print the specified file on the CP/M LST: device Forms: LIST <-- Print the file (no paging) Examples: LIST TEST.TXT <-- Print TEST.TXT on LST: Notes: If the file has a $SYS attribute, it will be found as well as those with $DIR attributes. :ZCPR-Resident Command TYPE 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 Examples: TYPE 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. :ZCPR-Resident Command SAVE Command: SAVE Function: To Copy the TPA starting at 100H to disk Forms: SAVE <-- in DEC SAVE H <-- in HEX SAVE S <-- in DEC SAVE H S <-- in HEX Examples: SAVE FH MYFILE.TXT <-- 15 pages saved SAVE 15 MYFILE.TXT <-- 15 pages saved SAVE 10H MYFILE.TXT S <-- 16 sectors (8 pages) saved Notes: The error message 'Delete File?' is printed if already exists. To go ahead and SAVE, type Y or y to erase the file and proceed with the SAVE. :ZCPR-Resident Command REN Command: REN Function: To Change the name of a disk file Forms: REN = Examples: REN NEWFILE.TXT=OLDFILE.TXT Notes: The error message 'Delete File?' is printed if the already exists. To go ahead and complete the REN, type Y or y to erase the current file and then will be renamed to . :ZCPR-Resident Command USER Command: USER Function: To Change the current user number Forms: USER <-- in DEC USER H <-- in HEX Examples: USER 15 USER FH USER 0 USER <-- Same as USER 0 Notes: -None- :ZCPR-Resident Command DFU Command: DFU Function: To Temporarily Change the default user number for the command hierarchy search Forms: DFU <-- in DEC DFU H <-- in HEX Examples: DFU 15 DFU 0 DFU FH DFU <-- Same as DFU 0 Notes: -None- :ZCPR-Resident Command JUMP Command: JUMP Function: To "call" the subroutine at the specified page address Forms: JUMP
<--
in HEX Examples: JUMP E000 or JUMP E000H <-- Jump to E000H JUMP 100 <-- Jump to 100H JUMP 0 <-- Jump to 000H  JUMP <-- Same as JUMP 0 Notes: JUMP performs a subroutine "call", so the called routine may return to the ZCPR by either a RET or a Warm Boot. :ZCPR-Resident Command GO Command: GO Function: To "call" the subroutine at address 100H Forms: GO <-- Routine at 100H Examples: GO *.ASM <-- Execute TPA-resident prog with *.ASM passed Notes: This is identical in function to JUMP 100H. :ZCPR-Resident Command GET Command: GET Function: To load a file from disk into memory starting at the specified page Forms: GET
<--
in HEX Examples: GET 8000 TEST.80 <-- Load TEST.80 starting at 8000H GET 100 TEST.80 or GET 100H TEST.80 <-- Load TEST.80 start- ing at 100H GET 0 TEST.80 <-- Load TEST.80 starting at 000H Notes: 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. :ZCPR Error Messages 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 character input is required (Y or y for yes and anything else for no) with NO to end the line Message Meaning 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 erase it and continue with the procedure or any other character to abort  ? 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 character input is required (Y or y for yes and anything else for no) with NO to end the line Message Meaning Full From SAVE, means that there is not enough space on disk From GET or comman ZCPR Version 1.0 Release Notice Greetings, Everyone, É  aí  verù pleaseä tï announcå (appropriatelù aô  Christmaó � time¬  sï  Merrù Christmas© thå formaì releaså oæ ZCPÒ -- á  Z80-� baseä Commanä Processoò Replacement®  Thió prograí replaceó  thå � CP/M CCP and greatly extends its capabilities. Somå  oæ yoõ maù havå hearä oæ CCPÚ anä MCPÚ durinç  variouó � discussions® Foò thoså whï havå hearä oæ theså programs¬ ZCPÒ ió � thå  Baselinå Systeí tï bå releaseä intï thå publiã  domain®  Iô � waó deriveä froí CCPÚ Versioî 4.0¬ anä ió aî enhancemenô oæ this® � Iô  containó  manù  internaì differenceó whicè  arå  noô  readilù � noticablå  tï thå CCPÚ user¬  anä somå ne÷ keù humaî  engineerinç � desigî  changeó oveò CCPÚ Versioî 4.° (specificallù iî  thå  SAVÅ � anä  REÎ commands)®  Foò thoså oæ yoõ whï havå beeî  considerinç � desigî  changes¬  includinç  thå  unsanctioneä  Versioî  4.±  anä � numerouó  Versioî  4.²  implementationó (theså felì  ouô  oæ  thå � controì oæ CCP-GROUP)¬  ZCPÒ Versioî 1.° ió thå releaseä baselinå � whicè  CCP-GROUÐ haó decideä upoî foò publiã release®  Therå arå � severaì internaì "problems¢ witè CCPÚ Versioî 4.° whicè havå beeî � resolveä  tï thå satisfactioî oæ thå recenô workinç  majoritù  oæ � CCP-GROUP®  Hence¬  É  (anä É believå thå majoritù oæ thå above-� nameä  CCP-GROUР subset© stronglù recommenä backinç uð  tï  ZCPÒ � Versioî 1.° anä implementinç youò modificationó froí that. Now¬ gettinç bacë tï everyonå iî general¬ ZCPÒ ió thå resulô � oæ  á Grouð Efforô bù CCP-GROUP¬  á somewhaô closely-niô grouð oæ � individuals®  Foò thå individuaì credits¬  theù arå listeä iî thå � ASÍ anä DOà files¬ anä É sincerelù apologizå iæ É omitteä anyone® � Iæ É did¬ thå correctionó wilì bå issueä later. ZCPÒ  ió thå resulô oæ severaì monthó oæ ratheò diligenô anä � fascinatinç  work®  Iô completelù replaceó thå  Consolå  Commanä � Processoò   oæ   CP/Í  anä  wilì  onlù  ruî  oî  Z80-baseä   CP/Í � microcomputeò  systems®  CP/Í  ió requireä iî ordeò tï  ruî  it¬ � sincå  á "heart¢ oæ CP/M¬  thå BDOS¬  ió NOÔ provideä witè  ZCPR® � Thå MAà Assembleò ió requireä tï assemblå it® Sï far¬ baseä upoî � botè useò feedbacë anä ouò owî experiences¬  wå feeì thaô ZCPÒ ió � á significanô contributioî tï thå Publiã Domain¬ anä everyonå whï � has used it greatly prefers it over standard CP/M. ZCPÒ  ió beinç releaseä foò Publiã Distributioî througè  thå � SIG/Í User'ó Grouð oæ thå Amateuò Computeò Grouð oæ NJ®  Iî  thå � spiriô oæ Publiã Domaiî software¬  ZCPÒ ió bù nï meanó á panacea¬ � buô  iô IÓ á verù nicå steppinç stone¬  anä yoõ arå encourageä tï � feeì freå tï modifù iô tï pleaså yourselves®  Futurå releaseó oæ � ZCPÒ arå quitå possible¬  buô saiä releaseó froí CCP-GROUÐ shoulä � noô happeî foò somå time® ZCPÒ haó beeî extensivelù tested¬ and¬ � althougè  nï softwarå caî bå claimeä tï bå perfecô unlesó  iô  ió � absolutelù  trivial¬  CCP-GR%OUÐ knowó oæ nï functionaì erroró  iî � ZCPÒ Versioî 1.0. Page 1 ZCPR Version 1.0 Release Notice Foò   thoså  interesteä  iî  pursuinç  acquisitioî  oæ  ZCPÒ � further¬  É  recommenä reviewinç thå HELÐ Filå (ZCPR.HLР iî  thå � SIG/Í  Release)®  Thå  openinç Informatioî Sectioî giveó á  faiò � descriptioî  oæ some¬  buô noô all¬  oæ thå interestinç  featureó � supporteä bù ZCPÒ anä NOÔ founä iî thå CP/Í CCP®  Iô ió  roughlù � 16Ë lonç anä shoulä noô takå toï lonç tï prinô out. Thå  nexô pagå oæ thió messagå presentó severaì displayó anä � somå informatioî oî whaô fileó composå thå ZCPÒ system® CCP-GROUÐ hopeó yoõ enjoù usinç ZCPR. Richard Conn Page 2 ZCPR Version 1.0 Release Notice XDIR2 Listing of All Relevant Files ZCPR FILES ... ET AL XDIR II Version 4.8, Vertical Listing by File Type User Number: 0, File Attributes: Non-System Filename.Typ Size K Filename.Typ Size K Filename.Typ Size K -------- --- ------ -------- --- ------ -------- --- ------ 0 MAC .COM 12 ZCPR .MSG 6 BDOSLOC .ASM 2 SYSGEN .COM 2 ZCPR .WS 40 ZCPR .ASM 52 ZCPR .DOC 46 ZCPRMSG .WS 6 CPM .BIN 12 ZCPR .HLP 16 B: 34 Entries & 14 Files - 172K Bytes Remaining File Data: 11 Files - 194K Bytes Displayed CRCK Values for Key Files File: ZCPR .WS CRC = A2 C2 File: ZCPR .DOC CRC = 94 B7 File: ZCPR .HLP CRC = 26 9D File: ZCPR .ASM CRC = 7A 46 File: BDOSLOC .ASM CRC = EB D4  Explanation of Files ZCPR.ASÍ  -- Sourcå  tï  ZCPR»  musô  bå  assembleä  bù  MAà anä � customized by user for his particular system ZCPR.HLР -- HELÐ Filå foò ZCPR»  caî bå reaä bù HELÐ Versioî 2.° � oò  simplù  TYPEä out»  reaä thió tï  seå  á  faiò � summary of what ZCPR can do ZCPR.DOà  -- Fulì   Documentatioî   oî   ZCPR»   thió   includeó � installatioî  notes¬   customizatioî  notes¬   anä � detaiì whicè expands upon the ZCPR.HLP File ZCPR.WÓ -- WordStaò Filå froí whicè ZCPR.DOà waó created ZCPR.MSG -- Introductory message on ZCPR ZCPRMSG.WS -- WordStar File from which ZCPR.MSG was created BDOSLOC.ASÍ -- BDOÓ anä CCÐ Locator» thió prograí ió handù durinç � initiaì  installatioî  oæ  ZCPÒ  anä  itó  uså  ió � documented in ZCPR.DOC Page 3  This is the release date of the disk. MAX12 NSL € MAX13 NSL €€ MAX14 NSL € MAX15 NSL €MEMTEST COM €€MEMTEST DOC €€SETIO COM €€SETIO DOC €SETIO MAC €#TURNKEY COM €#TURNKEY DOC €$€TURNKEY MAC €%VFUZZY BAS €'VSMALL BAS €(SETIO .MAC D5 95 8960 70 TURNKEY .COM 5D 28 256 2 TURNKEY .DOC 86 91 384 3 TURNKEY .MAC C7 F7 1536 12 VFUZZY .BAS 5B F6 256 2 VSMALL .BAS 0A 0B 256 2 VFUZZ/SM.DOC 49 4F 384 3 WSKB .COM 98 3A 128 1 WSKB .DOC 95 FB 256 2 WSKB .MAC 11 BA 256 2 XFUNC .ASM 82 65 2688 21 XFUNC .DOC DC 66 128 1 ZCPR-MAX Fog Library Disk FOG-CPM.052 Copyright (1986) by Fog International Computer Users Group to the extent not copyrighted by the original author for the exclusive use and enjoyment of its members. Any reproduction or distribution for profit or personal gain is strictly forbidden. For information, contact FOG, P. O. Box 3474, Daly City, CA. 94015-0474. as part of the description of a file indicates that the program is distributed on a "try first, pay if you like it" basis. If you find the program(s) meet your need, please refer to the author's documentation for information on becoming a registered user. Only by registering and paying for the programs you like and use will the authors of such programs continue development. Often, more complete documentation, additional modules, and new releases are available only to registered users. Lobo Max-80 programs. Filename Description -06-00 .86 This is the release date of the disk. -CPM052 .DOC &This is the description of the disk contents. MAXLETTR.DOC 3CC0 1K [MAXIMUL Electronic 1 of 5] Newsletters for Lobo Max-80 users. MAX12 .NSL 012C 3K [MAXIMUL Electronic 2 of 5] MAX13 .NSL 3CB2 4K [MAXIMUL Electronic 3 of 5] MAX14 .NSL EEF0 4K [MAXIMUL Electronic 4 of 5] MAX15 .NSL F1B0 5K [MAXIMUL Electronic 5 of 5] MEMTEST .COM 21C7 2K [Memory tester 1 of 2] For the Lobo Max-80 computer. MEMTEST .DOC 39F8 1K [Memory tester 2 of 2] SETIO .COM C57F 2K ver. 2.0 [SETIO 1 of 3] Set Lobo Max-80 serial port A & B configuration. MAC source is included. SETIO .DOC BDAF 1K ver. 2.0 [SETIO 2 of 3] SETIO .MAC D595 9K ver. 2.0 [SETIO 3 of 3] TURNKEY .COM 5D28 1K [TURNKEY 1 of 3] Allows Lobo Max-80 user to specify a startup command. MAC source coded is included. TURNKEY .DOC 8691 1K [TURNKEY 2 of 3] TURNKEY .MAC C7F7 2K [TURNKEY 3 of 3] VFUZZY .BAS 5BF6 1K [VFUZZY/VSMALL 1 of 3] MBasic programs to demonstrate the Lobo Max-80 programmable character set. Rebooting is the only way out of these. VSMALL .BAS 0A0B 1K [VFUZZY/VSMALL 2 of 3] VFUZZ-SM.DOC 494F 1K [VFUZZY/VSMALL 3 of 3] WSKB .COM 983A 1K [WSKB 1 of 3] Configure Lobo Max-80 arrow keys for WordStar. MAC source code is included. WSKB .DOC 95FB 1K [WSKB 2 of 3] WSKB .MAC 11BA 1K [WSKB 3 of 3] XFUNC .ASM 8265 3K ver. 1.0 [XFUNC 1 of 2] ASseMbler source for a program which allows Lobo Max-80 users to configure the and keys. XFUNC .DOC DC66 1K ver. 1.0 [XFUNC 2 of 2] ZCPR-MAX.HEX 6684 6K [ZCPR1 1 of 6] ZCPR1 for the Lobo Max-80 with on-line help (designed to work with HELP) and installation instructions. READZCPR.DOC 019C 1K [ZCPR1 2 of 6] ZCPR .ASM B20D 51K [ZCPR1 3 of 6] ZCPR .DOC 0D2D 45K [ZCPR1 4 of 6] ZCPR .HLP FF8E 15K [ZCPR1 5 of 6] ZCPR .MSG 8FFE 6K [ZCPR1 6 of 6]  [MAXIMUL Electronic 4 of 5] MAX15 .NSL F1B0 5K [MAXIMUL Electronic 5 of 5] MEMTEST .COM 21C7 2K [Memory tester 1 of 2] For the Lobo Max-8åååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååå'ååååå