>>>>>>>>>>>>>>>>>>>>> CP/M-Net News <<<<<<<<<<<<<<<<<<<<<<<< ============================================================ Number 4 May, 1981 Volume 1, Issue 5 ============================================================ In This Issue ============= RCPM Midwest Update by: Ben Bronson Computer Widows: To the wifes, girlfriends, etc. by: Jane Smith, Wife of "SYSOP" MP/M: A User's Comments and Implementation Methods by: Kelly Smith CP/M-Net "Tip-of-the-Month" Seven Byte Program to Discourage TRACE with DDT or SID by: Kelly Smith, CP/M-Net "SYSOP" ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ RCPM Midwest Update =================== by Ben Bronson The big news in these parts as far as programs go is (1) MicroTelnet (MTN21.OBJ, DOC, MSG, & MTNMSGS.OVR), a splendid new terminal program by one of your California people, Frank Wancho (Maybe not a Californian, come to think of it); (2) FINDBD52, Ron Fowler's long-awaited "universal" FINDBAD [he has used the tricks he invented for DU-V75 to make it work for just about any controller without bothering about assembly options]; and (3) RUN80, which came here from Dick's system and you know about already. Also an assortment of smaller programs. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Computer Widows: To the wifes, girlfriends, etc. ================================================ by Jane Smith, Wife of "SYSOP" When Kelly asked me if I would be interested in writing an article for his "newspaper", my first response was "NO!". First of all, I have no training in article writing and secondly being a housewife, hanging around with the kids, dog, cats, etc., all day doesn't tend to increase ones vocabulary. Well, I take that back...I've learned lots of four letter words, mostly in self-defense! But then, after thinking it over, I thought "What the hell" (there's one of those four letter words!). I think this "home computer" thing started when Pertec (where Kelly works) loaned us a TRS-80 to play with at home. [Editor Comment: they were having me evaluate it, to see if we could make one better and cheaper!]. We had lots of fun playing games on it and even kind of missed it when it went back to Pertec. So Kelly put together a little system for us at home...It has ballooned from there to the point of adding a room onto our house for the computers, complete with it's own air conditioning unit (God forbid, it should get too hot!). I probably wouldn't be too far off to say that 85% of the time that Kelly is home, he is with the computers, another 5% is spent thinking about it (you can always tell by that blank stare into space), probably 7% devoted to eating, sleeping, etc., and maybe I get 3%. I get the impression that the computer doesn't like me...it usually plans on breaking about the time Kelly and I are going to spend some time together. An example of it's dislike for me was the time Kelly went on a business trip for two weeks and left me in charge of running the computer. As soon as it figured out that Kelly had gone (and had not taken it along), it decided to throw a fit and not talk to anyone when they called! So everytime the phone would ring, I had to run in "it's room" and re- boot the system...a good friend of Kelly's kindly came over to have a look at it. It ran fine for him all day, but as soon as he was in his car it said "DISK BOOT ERROR". The last thing I did before going out the door to pick up Kelly, was to re-boot the system. The minute Kelly stepped in the door, it straightend right up and never to my knowledge did it do that again. I beleive its jealous and that was one of its little plots to make Kelly think that I'm the one with the loose screw... I also find it difficult to join in conversations when Kelly's friends come to visit. They sit around and talk in a foreign language! I've tried to join in once or twice, and usually come up with some intelligent phrase (just to get your foot in the door) like "Boy, something really funny happened on the way to the grocery store!"...at which point (if they even heard you), you get a blank stare as if you're the one talking in a foreign language! Then without even asking "what was funny?" the conversation goes back to "SYSGEN" this, or "PIP" that, or "star-dot-doc". Do you remember when we were teenagers and we'd invent some language such as "pig-latin" to talk to our friends, so our parents wouldn't understand what we were saying? Sometimes I think that's what these guys are doing, and they're planning a "Stepford" community...what they're really spending so much time doing is making "Stepford Wives"! I, for one, have warned my friends to keep a close eye one me for any changes along those lines... I'm also watching for the program "star-dot-sex". That'll mean it's finally programmed for sex, and there goes my 3%! I'm sure that this isn't what Kelly had in mind when he asked for an article, but maybe some of the wives, girlfriends, etc., can identify with this... To sum up, I must say that I am glad that you're at home Kelly...even if you are with the computer. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ MP/M: A User's Comments and Implementation Methods ================================================== by Kelly Smith, CP/M-Net "SYSOP" Up front, let me recommend that MP/M is NOT for someone who doesn't know the difference between a 'NOP' and an 'XTHL'! All those that fail this test, please read the next article...this is definetely not for you. MP/M is NOT for someone that has NOT PURCHASED CP/M 2.2, and MP/M is NOT for someone who has purchased CP/M 2.2 but does NOT have a copy of the ENTIRE BIOS (i.e., that means ANYONE who has taken the "easy way out" by buying a ready to run CP/M 2.2 from Lifeboat Associates). Also, I suspect that MP/M is NOT for someone who has ALREADY purchased a microprocessor system! "What?" you ask...well since I have your attention this far, read on. MP/M is a powerful multi-tasking/multi-user operating system that in the hands of the skillful user, a system-wise ('wise' meaning darned smart!) implementor, and the PROPER hardware environment, can be a very useful software tool. As always, Digital Research provides less than adequate documentation for explaining "how to get it running" for anyone with less than a Master's Degree in Computer Sciences...it can be done, but you better really "dig in", learn to "read between the lines", and CAREFULLY EXAMINE the program examples given (the MP/M 1.0 release documentation had a few "bugs" that if used, would not work!). Digital Research has done an excellent job on their PL/I-80 and BT- 80, manuals however...but I always wondered why they kept putting those PL/M examples in their CP/M manuals (as if everyone programmed in PL/M and had an Intel MDS-800...oh well). O.K., so you ARE an expert, and (let's hope) you have NOT purchased a microcomputer system (Oh yeah, forgot to mention: it MUST BE a 8080/Z80 based system!). Let's examine my implementation of MP/M on a typical "semi-roll-your-own" microcomputer...in this case, an IMSAI 8080 with 56 kilobytes of RAM, two floppies, one "local user" with a terminal, and one "remote user" (via an auto-answer modem). The system "boot and signon" will best illustrate WHY you should NOT purchase a microcomputer system...so here is what USER 1 (remote) will see at signon: MP/M-Net (tm), System #1 <--- (autoload under CP/M 2.2) >> Multi-user Software Access << [USER 1] <--- (your user number) Enter USER 0, if you require access to other MP/M facilities. =============================== MP/M is a registered trademark of <--- (giving credit!) Digital Research =============================== Booting MP/M Version 1.1 now.... <--- (a slight pause) MP/M 1.1 Loader <--- (MP/M "boot loader", MPMLDR.COM) =============== Number of consoles = 2 <--- (indicates 2 user configuration) Breakpoint RST # = 5 <--- (SID or DDT "break-point" vector) Top of memory = DFFFH <--- (56 Kilo-bytes of memory) Memory Segment Table: SYSTEM DAT DF00H 0100H <--- (system configuration data) CONSOLE DAT DD00H 0200H <--- (system user console data) USERSYS STK DC00H 0100H <--- (system user stack area) XIOS SPR D800H 0400H <--- (extended I/O system process's) BDOS SPR C400H 1400H <--- (basic disk operating system) XDOS SPR A500H 1F00H <--- (extended disk operating system) ABORT RSP A400H 0100H <--- (resident system process, abort) MPMSTAT RSP 9700H 0D00H <--- (resident system process, MP/M status) Sched RSP 9200H 0500H <--- (resident system process, scheduler) ------------------------- Memseg Usr 8000H 1200H <--- (memory for user 0, 4 Kilo-bytes) Memseg Usr 0000H 8000H <--- (memory for user 1, 32 Kilo-bytes) MP/M 1.1 <--- (MP/M "sign-on") 1A> <--- (MP/M prompt for user 1) Now examine the signon carefully...EGADS! A 56k system, and only 36 kilobytes left BETWEEN USER 0 and USER 1...and whats worse, is that resident system process's for TIME and SPOOLER can't be included without giving up some meaningful amount of memory for user application programs! ARGH...here I sit with $8,000 worth of hardware and I can't run diddely! So get the picture? Now it's the old "whip-out-the-wallot- time-again-folks" syndrome..."let's see, just how much bank- switched memory can I get for...oh heck, got'ta pay Ma'Bell first, for that three hour modem transfer from Bruce!". Well, as I said...DO NOT purchase the computer FIRST! Make some strong considerations as to WHY you think you need MP/M then start configuring a system (on paper) with what your requirements will be and, of course the final problem: will my wife let me buy it? (!). I would suggest that for a meaningful environment for MP/M to "live in", you want about 128 Kilobytes of bank-switched memory...that's for just two "hackers" on the system...and maybe, JUST MAYBE, allowing one of you to be zapping Klingons while the other is going "Oooh Aaah" with Wordstar. But then, things get worse: So you've got memory "up-the-kazoo" huh? Great, so we just rip along (both users hacking away), and you got the TOD (time of day) set and you "schedule" an assembly for your wiz-bang newest program...but wait, that means a real-time clock...ARGH again! Well let's see, maybe if I turn in ALL the Coke bottles, and... Now we have a real-time clock board, and it includes a "tick-toc" interrupt that we had to have anyway for "round- robin" polling of all the darned hardware...couldn't afford to go fully interrupt driven (in fact I scrounged a MITS 88- VI/RTC board from a friend!). Oh yah...change the XIOS to disable interrupts during floppy disk DMA (we got one of those (GAG) Tarbell Double Density disk controllers). So back to scheduling that assembly...Hmmm, we seem to be running a little late...let's look at the system with MPMSTAT...no, the suckers on the queue...must be coming up soon. Well let's see what time it is according to the system...(we type in TOD). WHAT THE HECK??? The darned clock is late! NOW WHAT (mumble, mumble)? Well SON-OF-A...Oops, won't go to heaven if we keep this up! Turns out that to run the disk, we had to turn of the interrupts, and since we did that, the clock lost time, and we can't run the schedular properly...now comes ARGH #3. Where do I find a disk controller that doesn't DMA or hog the buss, or...worst yet, if I find one, HOW will I pay for it!?! Let's see, could I sell my wife to the mo'cycle gang down the street? O.k., got a heck of a deal on her for $3,500...just enough to pay for a "buffered" (read "grab data at our leisuer, not at the disk data rate" here) double density disk controller from Pertec (An OBVIOUS plug: Model FD3812 or single density FD3712)...but, OH CRAP (and diddely-squat!)! Now I have to rewrite my MPMLDR and XIOS...(weep, ARGH #4). Now I've developed the MPMLDR and XIOS (and of course I've also developed this annoying 'tick' and people wonder why I keep jamming the fork into my forehead when I eat)...but this is part of the FUN OF IT ALL...Right? So now we fire the turkey computer up again...WOW! FAR OUT! Time of day clicking right along, schedular bashing programs, on time, keyboard getting overrun...WHAT? KEYBOARD OVERRUN??? Now WHAT???? We examine the system with MPMSTAT again...Hmmm, that jerk on USER 1 is still playing Startrek. Well what could be going on? Let's think about Startrek for a minute...let's see, setting up arrays, figuring navigation, just plain old compute bound stuff...Ooops! COMPUTE BOUND! That's IT! One piddely little 8080 CPU (beating it's heart out) trying to handle some heavy-weight computations while I sit here slogging it out with this text editor...ARGH #5. Well this ones a "tuffy", 'cause now I have to go totally interrupt driven...and the story goes on, and on and... So that story summarizes the agony of the potential for disaster if you DON'T PLAN AHEAD. So what did we learn from all this? Well I figure that we spent about $7,000, my wife is living with a bunch of Harley Freaks, and I got canned at work because of the obscene things I was doing with a fork in the company cafeteria. I could have had two SEPERATE computers and REALLY IMPRESSED the guys at the computer club! Well in any case, let's see what we can do with MP/M, so first we'll see whats going on in the system with MPMSTAT: 1A>mpmstat <--- ( we type this in...) ***** MP/M 1.1 Status Display ****** <--- (MP/M responds) Top of memory = DFFFH <--- (yah, 56k; it was just a story!) Number of consoles = 02 Debugger breakpoint restart # = 05 Stack is swapped on BDOS calls Ready Process(es): MPMSTAT Idle Process(es) DQing: [ABORT ] ABORT [Sched ] Sched [CliQ ] cli [ATTACH ] ATTACH Process(es) NQing: Delayed Process(es): Polling Process(es): Tmp0 Process(es) Flag Waiting: 01 - Tick 02 - Clock Flag(s) Set: 03 Queue(s): ABORT MPMSTAT Sched CliQ ATTACH MXParse MXList MXDisk Process(es) Attached to Consoles: [0] - Tmp0 [1] - MPMSTAT Process(es) Waiting for Consoles: [1] - Tmp1 Memory Allocation: Base = 0000H Size = 8000H * Free * <--- FREE Hell! 56k cost Base = 8000H Size = 1200H * Free * me almost $1,600!!! 1A> <--- (MP/M waiting to do your bidding) "Well, what does it all mean?" you ask. So here is a brief explanation: Ready Process(es) - process(es) that are ready to execute, and waiting for the system (CPU) to relinquish time. In this case MPMSTAT has the highest priority and momentarily has control. Process(es) DQing - processes that are waiting for 'messages' from the queues that are in brackets, and displayed from highest to lowest system priority. Process(es) NQing - processes writing to queues, but none at this time in progress. Delayed Process(es) - processes waiting for a specified amount of clock 'ticks' on the basic system time unit, but none waiting at this time. Polling Process(es) - Terminal Message Process USER 0, is polling the console device. Process(es) Flag Waiting - processes that set and alter "syncronization flags" for task building. Flag(s) Set - the flag indicating that the "one minute interval" is set. Queue(s) - all the present queues on the system; the queues in upper case letters may receive messages from the Command Line interpreter (e.g., ABORT followed by a filename). Process(es) Attached to Consoles - processes 'attached' to the console, listed by console number (user) and process name...USER 0 has gone to sleep. Process(es) Waiting for Consoles - Terminal Mesage Processor USER 1 is waiting for console 1, from which it was 'detached'. Memory Allocation - unallocated user memory segments; will indicate which programs are activly executing and to which user it is assigned. Currently non-active, but then what can you do in 38k anyway with two users? If you care to set the "time of day", then enter the month, day, year, hour, minute, and second, as follows: 1A>TOD 10/04/81 07:35:00 <--- (you enter this) Strike key to set time <--- (MP/M responds, you do ) Sat 10/04/81 07:35:00 <--- (the current "time of day") Now you may want to "schedule" a task to be executed at some later time by MP/M. For example, schedule the "time of day" to be displayed exactly two minutes from now by entering the following scheduler command: 1A>SCHED 10/04/81 07:37:00 TOD Two minutes "tick" by... 1A>Sun 10/04/81 07:37:01 <--- ("time of day" is executed) The SCHEDuler works with all file and resident system process's, and allows the user to "stack" a multitude of tasks on the system for later (and unattended) execution. Keeping in mind that you are USER 1, you may display the directory for the diskette in drive A as follows: 1A>dir <--- (you type DIR, carriage return) Directory for User 1: A: MESSAGE X12 : KILLED : MESSAGE X08 : MESSAGE X06 A: MESSAGE X02 : MESSAGE X04 : MESSAGE X00 : CBBS COM A: WELCOME : SCANHELP : PASSWORD : LOG A: MESSAGE X10 : HELP : FIRSTIME : ENTRHELP A: ENTINTRO : BULLETIN : NEXT : MESSAGE X20 A: NOT-FOR YOU : USER ASM : DUPUSR ASM : FILE-XT2 ASM A: SYSTEM'S DOC : XMODEM COM : MESSAGE X14 : MESSAGE X16 A: MESSAGE X18 : SUMMARY Now you may wish to see what's "on file" in other user areas. For example, all the MP/M "system" files are in the USER 0 area of the diskette in drive A: 1A>user 0 <--- (you type USER 0, carriage return) User Number = 0 0A>dir <--- (...and DIR, carriage return again) Directory for User 0: A: MPM SYS : LDRBIOS ASM : ODOS SPR : BDOS SPR A: BNKBDOS SPR : XIOS ASM : ABORT RSP : SPOOL RSP A: MPMSTAT RSP : SCHED RSP : CONSOLE PRL : DIR PRL A: DSKRESET PRL : ERA PRL : ERAQ PRL : MPMSTAT PRL A: PRLCOM PRL : REN PRL : SUBMIT PRL : TOD PRL A: TYPE PRL : USER PRL : SPOOL PRL : STOPSPLR PRL A: SCHED PRL : ABORT PRL : ED PRL : PIP PRL A: STAT PRL : RDT PRL : ASM PRL : GENMOD COM A: GENHEX COM : LOAD COM : GENSYS COM : SUBMIT COM A: XDOS SPR : MAC COM : MPMLDR COM : SYSTEM DAT A: XIOS SPR : DISKDEF LIB : ASMPRL SUB : ASMSPR SUB A: MACPRL SUB : MACSPR SUB 0A> Now, stop and consider this: ALL those "built in" commands that you used in CP/M 1.4 and 2.2 are now DISK RESIDENT. That means they take up ROOM on your diskette! And precious little room there is, 'cause the resident system processes also have to be on the disk, and in addition it would be nice to have some applications programs to run when two users are on the same diskette...I sure hope that was double density that we bought for the system...a standard 8 inch floppy can just about hack it with two users. In conclusion, I would NOT suggest MP/M for the average "hacker"...the cost-versus-performance on a low budget system is something of a disappointment if you are not prepared to empty your checking account (or sell your wife!) to add the hardware that is essential to make MP/M really "shine". Your hardware/software dollars would probably be better spent on a second system, as the "work-horse" for printing and number crunching while you edit and assemble programs on the first. In any case, it was a fun experience and I did learn alot about system planning/design, interrupt driven software environments, and just how far you can push one 8080 CPU! I hope that my experience is of some help to you......now where's that CP/Net manual? ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ CP/M-Net "Tip-of-the-Month" =========================== Seven Byte Program to Discourage TRACE with DDT or SID ====================================================== by Kelly Smith, CP/M-Net "SYSOP" Here's a simple routine to add to any program to discourage anyone from tracing (and revealing) your program's internal operation. In it's simplist form: check$ddt$or$sid: ; check if program is being looked at ; lda 6 ; get content of address 6 ora a ; set flags jz banzai ; use what ever means you think fit to ; clobber this guy... ; ... ; continue normal execution of program This short routine works as follows: Address 6 is the (normally) least significant byte of the address to be called for any operations of the CP/M BDOS (the CALL is at address 5), and as such it's value is 06 Hex. Digital Research's DDT and SID debugger programs, when present in the system, always leave a CALLing address on an EVEN page boundry in memory at address 6...this means that address 6 will have a 00 Hex byte for the least significant byte of the address...so this routine simply checks to see if the address is 0! Now if it is, you can BANZAI the continued operation of the TRACE by...hmmm, erase the disk directory (?), or erase ALL of memory (?), or...well you get the point. To be really clever with this, save the result of address 6...let the jerk trace for awhile to lose track of why you did the LDA 6, then set the flags, run awhile longer, then (after he/she has forgotten that also) check the result of the flags... P.S. This will not work with FAST running in conjunction with your program, so watch out! Also, my prefered method to BANZAI the person trying to "tear apart" my software, is to scramble the program, then write it back out to disk...remember, that BDOS CALL's cannot be traced anyway, so about the time that the "tracer" realizes that file open/write/close occurs...it's just to late!