
       Digital Research's MP/M-80 II: Review by Kelly Smith

    Newest Release of Digital's Multi-user, Multi-Tasking OS


                         Getting It Going

     Havin alread 'brought-up MP/ version 1. an the 1.1 
 wa surprise a ho littl effor wa neede fo th require 
change t m existin softwar fo th Loade Basi Input/Outpu 
Syste (LDRBIOS an th syste dependen Residen Extende 
Input/Outpu Syste (RESXIOS) Th onl change require wer t 
edi ou th RESXIO initia jum vecto fo 'COLDSTART' an i 
it' place...inser  'JM  COMMONBASE (t terminat  runnin 
process) an th routin COMMONBAS itself whic i nothin 
more than:

COMMONBASE:    JMP  COLDSTART
;
SWTUSER:       JMP  $-$
SWTSYS:        JMP  $-$
PDISP:         JMP  $-$
XDOS:          JMP  $-$
SYSDAT:        DW
;
COLDSTART:
WBOOT:
;
               MVI  C,0  ; terminate process
               JMP  XDOS

     Th change t th LDRBIO wer mor fo 'cosmetic effec 
a signo tim (an als  'bug'!) the change actuall 
require fo upgrad t MP/M-8 I fro th tw earlie releases 
Th signo message wa fo 'use familiarity only t le th 
use kno fro 'what an 'where he/sh ha contro o th 
system...so the user would see:

                   MP/M-Net (tm), System #1

               >> Multi-user Software Access <<

                           [USER 1]

               Enter USER 0<cr>, if you require
               access to other MP/M facilities.

               ================================
                MP/M is a registered trademark
                              of
                       Digital Research
               ================================

               Booting MP/M-80 Version II now....


     Thi demonstrate  'customized signo messag tha ca b 
sen t eac use (i thi case USE 1) prio t actuall 
bootin MP/͠ int th system Thi i easil adde t you 
LDRBIOS b modifyin th intitia 'JM 322 a locatio 100 o 
MPMLDR.COM t th bas o you LDRBIO (1700H) outpu th dat 
t eac consol i th system the returnin contro t th 
MPMLDR by THEN DOING the 'JMP 322':

     Kin o  nic wa t le eac use kno tha he/sh i 
loved an tha th syste i 'comin up'...i yo don' d this 
there is this agonizing pause as the MPMLDR brings in the system.


                   MP/M-80 II System Generation

     Onc堠 yo hav produce you RESXIOS.SPҠ fil堠 (pag 
relocatabl RESXIOS wit RMAà an LINK yo ar read t 
generat you MP/ system...an thi i perhap th easies par 
o th whol proces o gettin MP/ u an running Th GENSY 
progra guide yo throug th entir configuratio o you 
system includin defaul value i yo car t accep them wit 
jus  simpl carriag return...here' ho i works:

A0>gensys<cr> <--- envoke MP/M-80 II GENSYS.COM file



MP/M II V2.0 System Generation
Copyright (C) 1981, Digital Research


Default entries are shown in (parens).
Default base is Hex, precede entry with # for decimal

Use SYSTEM.DAT for defaults (Y) ? n<cr> <--- no, want to "roll-my-own"

Top page of operating system (FF) ? ef<cr> <--- I have 60K to work with

Number of TMPs (system consoles) (#4) ? 2<cr> <--- only two terminals

Number of Printers (#1) ? <cr> <--- if this was Mike Karas, it would be 4!

Breakpoint RST (06) ? 05<cr> <--- let's use RST 5 instead

Add system call user stacks (Y) ? <cr> <--- definitely, to run '.COM' files

Z80 CPU (Y) ? n<cr> <--- still using that same old IMSAI 8080 card...

Number of ticks/second (#60) ? 40<cr> <--- 40 'ticks' (little 'bugs'?)

System Drive (A:) ? <cr> <--- it works better than my flakey B: drive!

Temporary file drive (A:) ? <cr> <--- this is where SUBMIT will be...

Maximum locked records/process (#16) ? <cr> <--- reasonable value

Total locked records/system (#32) ? <cr> <--- maximum things going on

Maximum open files/process (#16) ? <cr> <--- sure, why not?

Total open files/system (#32) ? <cr> <--- use this, but be warned that
                                          this will block other files,
                                          when things get really busy!

Bank switched memory (Y) ? n <cr> <--- just a meager 60K system...sob!

Number of user memory segments (#3) ? 2<cr> <--- three is company, too
                                                 much company in 60K!      
     
Dayfile logging at console (Y) ? <cr> <--- show me time and file executing
                                           every possible chance...

 RESERVED     F000H  1000H <--- chuga'ka chuga...GENSYS building up the
 SYSTEM  DAT  EF00H  0100H      MP/M system, for 'round one'.
 TMPD    DAT  EE00H  0100H
 USERSYS STK  ED00H  0100H
 XIOSJMP TBL  EC00H  0100H

Accept new system data page entries (Y) ? y<cr> <--- acceptable locations!


 RESBDOS SPR  E000H  0C00H <--- 'round two'...wheee, click, click.
 XDOS    SPR  BE00H  2200H

Select Resident and Banked System Processes:
 ABORT   RSP (N) ? y<cr> <--- short of 'pulling-the-plug', this may be
                              thonlwa texifrosom processes.

 MPMSTAT RSP (N) ? y<cr> <--- yah, nifty to see what the other user is doing.

 SCHED   RSP (N) ? y<cr> <--- sure, cute way to demo a task on the 'Q'.

 SPOOL   RSP (N) ? y<cr> <--- let the printer work in the background.


 ABORT   RSP  BD00H  0100H <--- 'round three'...zip, zip, burp!
 MPMSTAT RSP  BC00H  0100H
 SCHED   RSP  BB00H  0100H      (did you ever notice, that in the
 SPOOL   RSP  BA00H  0100H       movies there are always dramatic
                                 sound effects while the computer
 RESXIOS SPR  B500H  0500H       was blinking and flashing (?)...
 BNKBDOS SPR  9200H  2300H       All I ever hear working at home,
 BNKXDOS SPR  9000H  0200H       is the sound of bad spindle bearings
 TMP     SPR  8C00H  0400H       in my floppys...and the 'chirp' of
                                 my acoustic modem!)
 MPMSTAT BRS  7E00H  0E00H
 SCHED   BRS  7900H  0500H
 SPOOL   BRS  7100H  0800H

 LCKLSTS DAT  6E00H  0300H
 CONSOLE DAT  6C00H  0200H <--- Gads! My available memory is 
                                being consumed before my very
                                eyes...I had better make some   
                                VERY WISE choices as to WHO gets
                                HOW MUCH remaining memory!!!

Enter memory segment table: <--- and here's my chance...

 Base,size,attrib (6C,94,80) ? <cr> <--- MP/M gets ALL of this...Argh!

 Base,size,attrib (00,C0,00) ? 50,ff,00<cr> <--- USER 1 starts at 5000,
                                                 and goes for all the       
                                                 'gusto' he can get! 

*** Memory conflict - segment trimmed *** <--- the 'ff' forced it!
 Base,size,attrib (50,1C,00) ? <cr> <--- accept what we can get (7K!)

 Base,size,attrib (00,C0,00) ? 00,50,00<cr> <--- USER 0 gets 20K remaining


 MP/M II Sys  6C00H  9400H <--- MP/M takes up 40K bytes...Yipes!
 Memseg  Usr  5000H  1C00H <--- USER 1 gets a meager 7K bytes.
 Memseg  Usr  0000H  5000H <--- USER 0 gets to run SDIR (an 18K file!).

Accept new memory segment table entries (Y) ? y<cr> <--- do I have any choice?


** GENSYS DONE ** <--- whoopie...now we can boot'er up with MPMLDR, and play!
A0>

     Jus briefly her i  ma o th MP/ syste memor a 
generated by the co-effort of GENSYS and myself:

BA0 t EFF - Commo Memor Area BDOS XDOS XIOS DAT areas 
               and Residen Syste Processes.

6C00 to B9FF - Banked portions of the BDOS, XDOS, XIOS, DATA areas,
               TMP (consoles) and Banked Resident System Processes.

5000 to 6BFF - USER 1's play-ground (about the size of a 'cat box'!).

0000 to 4FFF - USER 0's play-ground (just enough to run SDIR for a demo!)

     A yo ca see th Commo Memor are take u fro 1 t 
16 bytes t b share b al users...th Banke Memor (Ban 0 
are take 4 t 51 bytes Thes 'sizes' ar totall dependen 
o th numbe o 'frills tha yo wan adde t you syste a 
GENSY time...i yo ca ad ban switche memory D SO Kee i 
min howeve tha eve i yo ad mor memory tha n on use 
ca acces mor tha 48 bytes Thi ca b  ver limitin 
syste fo certai application tha requir 'gobs o memor 
(suc a UCSĠ PASCA̠ whic require 56ˠ byte t compil 
programs) s kee you application memor requirement i min 
PRIO t decidin t us MP/M o yo ma b sorel disappointe 
to find out that it just "won't fit"!

     Well th momen i almos a han t se i al thi stuf 
actuall WORKS  too th optio o SYSGENin  norma CP/ 2. 
diskette whic 'autoloaded th MPMLDR.CO fil a 'col boot 
time...thi allowe m th abilit t debu th MP/ loade wit 
th Dynami Debuggin Too (DDT unde contro o CP/M i  ra 
int trouble...so her w go inser th diskett i th A 
drive hi th rese switch an watc th light blin o th 
fron o m crust ol IMSA 808 system Yep al seem t b 
ready...ɠ se thi MP/͠ syste u s tha  remot calle 
initiate th syste boot whe m mode 'hears ring-
detect...so tim t give'  call  fire-u m Osborn  wit  
communications program I wrote called 'RCPMLINK'...and, and...

Zowie  ge th 'customize signon message...the th "booting 
message and and...Super-duper!! Her come th MP/ I Loader 
jus a Digita promised  a astounded 'caus thi i th 
FIRST TIME that I had ANY VERSION of MP/M come up the FIRST TIME!

MP/M II V2.0 Loader   
Copyright (C) 1981, Digital Research

Nmb of consoles     =  2
Breakpoint RST #    =  5
Memory Segment Table:
SYSTEM  DAT  EF00H  0100H
TMPD    DAT  EE00H  0100H
USERSYS STK  ED00H  0100H
XIOSJMP TBL  EC00H  0100H
RESBDOS SPR  E000H  0C00H
XDOS    SPR  BE00H  2200H
ABORT   RSP  BD00H  0100H
MPMSTAT RSP  BC00H  0100H
Sched   RSP  BB00H  0100H
Spool   RSP  BA00H  0100H
BNKXIOS SPR  B500H  0500H
BNKBDOS SPR  9200H  2300H
BNKXDOS SPR  9000H  0200H
TMP     SPR  8C00H  0400H
Mpmstat BRS  7E00H  0E00H
Sched   BRS  7900H  0500H
Spool   BRS  7100H  0800H
LCKLSTS DAT  6E00H  0300H
CONSOLE DAT  6C00H  0200H
-------------------------
MP/M II Sys  6C00H  9400H
Memseg  Usr  5000H  1C00H
Memseg  Usr  0000H  5000H

MP/M II V2.0
Copyright (C) 1981, Digital Research

1A> <--- by golly, a system prompt!

1A>tod 12/24/81 09:36:00<cr> <--- let's see if we can set the time of day... 
00:00:31 A:TOD     .PRL
Strike key to set time<cr> <--- OK, whatever you say!


Thu 12/24/81 09:36:00 <--- Wow! It even knows what day it is!


     Her i  sampl director display firs fro USEҠ 1' 
directory the USE  switchin t USE 0' directory...notic 
th 'DAYFILE displa a th use invocatio o th DIҠ comman 
file:

1A>dir<cr>                  <--- display the Directory for USER 1
06:40:09 A:DIR     .PRL
Directory for User  1:
A USE     PR  DI      PR <--- file  kne  woul nee here,
                                    and initially put them here with
                                    Bruce Ratoff's 'DUPUSER' utility

1A>user 0<cr>               <--- switch to USER 0
06:40:19 A:USER    .PRL
User Number = 0 

0A>dir<cr>                  <--- display the Directory for USER 0
06:40:27 A:DIR     .PRL
Directory for User  0:
A: BNKBDOS  SPR : BNKXDOS  SPR : RESBDOS  SPR : TMP      SPR
A: XDOS     SPR : ABORT    RSP : MPMSTAT  RSP : SCHED    RSP
A: SPOOL    RSP : MPMSTAT  BRS : SCHED    BRS : SPOOL    BRS
A: ABORT    PRL : ASM      PRL : CONSOLE  PRL : DIR      PRL
A: DSKRESET PRL : DUMP     PRL : ED       PRL : ERA      PRL
A: ERAQ     PRL : MPMSTAT  PRL : PIP      PRL : PRINTER  PRL
A: PRLCOM   PRL : RDT      PRL : REN      PRL : SCHED    PRL
A: SDIR     PRL : SET      PRL : SHOW     PRL : SPOOL    PRL
A: STAT     PRL : STOPSPLR PRL : SUBMIT   PRL : TOD      PRL
A: TYPE     PRL : USER     PRL : MPMLDR   COM : GENHEX   COM
A: GENMOD   COM : GENSYS   COM : LOAD     COM : MPM      SYS
A: RESXIOS  SPR : SYSTEM   DAT : DDT      COM
0A>

     A impressiv arra o program available...bu notic al 
th '.PRL tha hav som ver familia CP/ name suc a REN 
ERA DIҠ an TYPE Well the ar th SAM command yo ar 
familia wit using wit on BI difference...the ar dis 
resident NOԠ 'built-in command t MP/M an the tak u 
valuabl dis spac (especiall valuabl i yo ar usin 8 
singl densit floppys!)...let' fac it MP/ wa no mean t 
ru o 8 S floppy (loo a th SDI displa furthe o i thi 
article fo th amoun o REMAININ dis space)...bu fo thi 
example the wil d unti  ge aroun t installin i o m 
20 byt har disk Th averag 'hacker ha A LEAS tha much
storag jus layin aroun waitin fo MP/M right WRONG Bu 
the MP/M-8 I i fo th 'bi boys anywa (o  BI budget!) 
s  gues tha  can' complain...bu please don' b misle 
int thinkin tha yo wil pu MP/ u o you dink 5 
'disklettes (i.e. jus lik Piglettes! an hav MP/ ru o 
you TRaSh-80...jus won' fit!



 New Utilities and Features: SDIR, SHOW, SET with HELP displays

     On reall nic NE featur tha ha bee adde t releas 
2. fo MP/M-8 i tha som o th syste utilitie hav 'built-
in HEL summaries tha giv example o variou way t envok 
them  wonde however i i migh have made sens t hav th 
HELР portion o th file a overlays tha coul b delete 
fro th director (an tak u les memor an disk afte th 
USER(s wer familia wit al o th comman options...a a 
example:

0A>sdir *.*<cr> <--- let's look at the Sorted Directory display.
06:54:23 
Relo se no fre <--- oops...what wrong Relocatio Segmen No Free??

NOTE Thi bi o ignoranc o m par tha follow wa PRIO t 
       GENSYSin fo  20 byt USE  memor allocation...jus 
       though  woul le yo se wha happens...

0A>stat sdir.*<cr> <--- let's look at SDIR info with STAT.
06:54:36 A:STAT    .PRL

 Recs  Bytes FCBs  Attributes      Name
  137    18k    2  Dir RW        A:SDIR    .PRL
-----------------------------------------------
         18k    2  (1 file, 18-1k blocks) <--- Gads! An 18K file, and this 
                                               USER has only 16K bytes for
                                               memory...need to give'm more
       Bytes Remaining On A: 14k               room to load SDIR!!!

0A>

     Th utilit SDI take u 18 byte o th syste t b abl 
t run... wa force t GENSY  20 byt are fo USE 0 jus 
t se wha i did leavin onl 7 byte fo USE 1 I woul 
hav bee nic t allo a 'eve split o memor allocatio fo 
EAC user...o well o wit th show!

     O.K. afte re-GENSYSin fo  20 byt USEҠ  memor 
allocation ɠ a abl t ge SDI t run...Let' tr SDIҠ wit 
HEL first:

0A>sdir [help]<cr> <--- give me some HELP with SDIR.
09:30:42 A:SDIR    .PRL

                        SDIR EXAMPLES

sdi file.on                   (fin  fil o curren use an defaul drive)
sdi *.co d:*.pl              (fin matchin file o defaul an d drive)
sdi [rw                       (fin file tha ar read/write)
sdir [ro dir sys]               (same for read/only, directory, system)
sdir [xfcb]                     (find files with XFCB's)
sdir [nonxfcb]                  (find files without XFCB's)
sdir [exclude] *.com            (find files that don't end in 'com')
sdir [nosort]                   (don't sort the files)
sdir [full]                     (show all file information)
sdir [size]                     (show name and size in kilobytes)
sdir [short]                    (show just the file names)
sdir [drive = all]              (search all logged in drives)
sdir [drive = (a,b,p)]          (search specified drives, 'disk' is synonym)
sdir [user = all]               (find files with any user number)
sdir [user = (0,1,15)]          (find files with specified user number)
sdir [length = n]               (print headers every n lines)
sdir [ff]                       (print form feeds between headers)
sdir [message user=all]         (show user/drive areas with no files)
sdir [help]                     (show this message)
sdir [dir sys rw ro sort xfcb nonxfcb full] d:*.*       (defaults)


     No let jus loo a th directory...kind' look lik CP/ 
'STA *.* runnin with a Chinese viewpoint (i.e., sideways):

0A>sdir<cr <--- displathSorteDirectoranfil attributes.
00:00:26 A:SDIR    .PRL

Directory For Drive A:  User  0

    Name     Bytes   Recs   Attributes      Name     Bytes   Recs   Attributes 
------------ ------ ------ ------------ ------------ ------ ------ ------------
ABORT    PRL     1k      5 Dir RW       ABORT    RSP     1k      5 Dir RW      
ASM      PRL    10k     74 Dir RW       BNKBDOS  SPR    11k     81 Dir RW      
BNKXDOS  SPR     1k      7 Dir RW       CONSOLE  PRL     1k      4 Dir RW      
DDT      COM     5k     38 Dir RW       DIR      PRL     2k     14 Dir RW      
DSKRESET PRL     1k      5 Dir RW       DUMP     PRL     1k      6 Dir RW      
ED       PRL     9k     68 Dir RW       ERA      PRL     2k     15 Dir RW      
ERAQ     PRL     4k     29 Dir RW       GENHEX   COM     1k      6 Dir RW      
GENMOD   COM     2k     10 Dir RW       GENSYS   COM     9k     68 Dir RW      
LOAD     COM     2k     14 Dir RW       MPM      SYS    32k    254 Dir RW      
MPMLDR   COM     7k     54 Dir RW       MPMSTAT  BRS     5k     33 Dir RW      
MPMSTAT  PRL     5k     33 Dir RW       MPMSTAT  RSP     1k      3 Dir RW      
PIP      PRL    10k     77 Dir RW       PRINTER  PRL     1k      8 Dir RW      
PRLCOM   PRL     3k     21 Dir RW       RDT      PRL     7k     50 Dir RW      
REN      PRL     3k     19 Dir RW       RESBDOS  SPR     4k     29 Dir RW      
RESXIOS  SPR     2k     13 Dir RW       SCHED    BRS     2k     12 Dir RW      
SCHED    PRL     3k     20 Dir RW       SCHED    RSP     1k      3 Dir RW      
SDIR     PRL    18k    137 Dir RW       SET      PRL     8k     60 Dir RW      
SHOW     PRL     8k     60 Dir RW       SPOOL    BRS     3k     20 Dir RW      
SPOOL    PRL     3k     17 Dir RW       SPOOL    RSP     1k      5 Dir RW      
STAT     PRL    10k     78 Dir RW       STOPSPLR PRL     1k      5 Dir RW      
SUBMIT   PRL     6k     42 Dir RW       SYSTEM   DAT     1k      2 Dir RW      
TMP      SPR     2k     11 Dir RW       TOD      PRL     3k     20 Dir RW      
TYPE     PRL     2k     11 Dir RW       USER     PRL     1k      8 Dir RW      
XDOS     SPR    10k     79 Dir RW      

Total Bytes     =    226k  Total Records =    1633  Files Found =   47
Total 1k Blocks =    226   Used/Max Dir Entries For Drive A:   52/  64

0A>


     Th nex fil o interes i SHOW als a upgrad o th 
CP/ STA utility SHOW' HEL option ar displaye a follows 

0A>show [help]<cr> <--- give me some HELP with SHOW.
09:30:20 A:SHOW    .PRL

Drive Status    : SHOW DRIVE:  SHOW d:DRIVE:
User Status     : SHOW USERS:  SHOW d:USERS:
Directory Label : SHOW LABEL:  SHOW d:LABEL:
Free Disk Space : SHOW SPACE:  SHOW d:SPACE:

     So let's try a few, just to see what happens...

0A>show drive<cr> <--- SHOW the Drive Characteristics
06:52:24 A:SHOW    .PRL

        A: Drive Characteristics
    1,944: 128 Byte Record Capacity
      243: Kilobyte Drive  Capacity
       64: 32 Byte  Directory Entries
       64: Checked  Directory Entries
      128: Records / Directory Entry
        8: Records / Block
       26: Sectors / Track
        2: Reserved  Tracks

0A>show users<cr> <--- SHOW the USER and ACTIVE files.
06:52:47 A:SHOW    .PRL

A: Active User :  0
A: Active Files:  0  1

0A>show space<cr> <--- SHOW the remaining disk SPACE.
06:53:04 A:SHOW    .PRL

A: RW, Space:        14k
0A>


     Finally th SE utilit contain som o th feature o 
CP/M' STA utilit fo settin variou fil o dis attributes 
bu goe wa beyon jus th simpl $R/ o $R/ an $SY o $DI 
attributes of STAT:

0A>set [help]<cr> <--- give me some HELP with SET.
09:31:56 A:SET     .PRL

                        SET EXAMPLES

FOR FILES

set *.asm [rw, dir]                     (File Attributes)
set *.prl [ro, sys]
set *.dat [archive=on,f1=off,f2=on,f3=on]
set *.asm [time]                        (Time Stamping on ASM files)
set *.asm [password = xyz]              (Password Protection)
set *.asm [protect  = read]             (read, write, delete or none)

FOR DRIVES

set [password = xyz]                    (Label Password)
set [protect  = on]                     (Password Protection)
set [update   = on]                     (Update Time Stamps - on or off)
set [create   = on]                     (Creation Time Stamps - on or off)
set [access   = on]                     (Access Time Stamps - on or off)
set [make     = on]                     (Make XFCBs - on or off)
set [default  = xyz]                    (Default Password)
set a:[rw],   b:[ro]                    (Drive Status)

0A>

     It' wort noting tha th MP/ I User' Guid describe 
 dis attribut contro calle NAM (se Sectio 7.4. Namin 
Disks pag 63)...'SE [NAME=labelname.typ] doe no appea i 
th HEL display an i fac i attempted yo ge th followin 
response:

0A>set [name=mp/m-net.sys]
09:48:49 A:SET     .PRL

ERROR:  ?
Invalid Value, Use ON or OFF

0A> 

     Curiou tha Digta Researc describe thi featur i th 
SEԠ documentation bu tha i doe no i actualit appea t 
work...i thi  'bug'?

     S let' tr th 'tim stamping feature tha WER 
describe i th SE HEL command...

0A>set *.prl [time]<cr> <--- SET all '.PRL' files for time stamping
09:45:14 A:SET     .PRL

A:ABORT   .PRL  Time Stamps ON
A:ASM     .PRL  Time Stamps ON
A:CONSOLE .PRL  Time Stamps ON
A:DIR     .PRL  Time Stamps ON
A:DSKRESET.PRL  Time Stamps ON
:
: <--- and on and on 'ad nauseum'...
:

0A>set [access = on]<cr> <--- SET time stamping to any file accessed
09:46:19 A:SET     .PRL

Label for drive A:

Directory       Passwds  Make     Stamp    Stamp    Stamp
Label           Reqd     XFCBs    Create   Access   Update
--------------  -------  -------  -------  -------  -------
A:Label   .       off      on       off      on       off  


0A>dir stat.*<cr> <--- access DIR as an experiment for time stamp 
09:46:52 A:DIR     .PRL
Directory for User  0:
A: STAT     PRL
0A>stat<cr>       <--- also access STAT for time stamping...
09:47:12 A:STAT    .PRL

A: RW, Space:        24k

0A>sdir *.prl<cr> <--- SDIR should tell us if the two files were 'stamped'!
09:47:36 A:SDIR    .PRL

Directory For Drive A:  User  0

    Name     Bytes   Recs   Attributes   Prot      Update          Access    
------------ ------ ------ ------------ ------ --------------  --------------
ABORT    PRL     1k      5 Dir RW       None                   
ASM      PRL    10k     74 Dir RW       None                   
CONSOLE  PRL     1k      4 Dir RW       None                   
DIR      PRL     2k     14 Dir RW       None                   12/24/81 09:46
DSKRESET PRL     1k      5 Dir RW       None                   
DUMP     PRL     1k      6 Dir RW      
ED       PRL     9k     68 Dir RW      
ERA      PRL     2k     15 Dir RW      
ERAQ     PRL     4k     29 Dir RW      
MPMSTAT  PRL     5k     33 Dir RW      
PIP      PRL    10k     77 Dir RW      
PRINTER  PRL     1k      8 Dir RW      
PRLCOM   PRL     3k     21 Dir RW      
RDT      PRL     7k     50 Dir RW      
REN      PRL     3k     19 Dir RW      
SCHED    PRL     3k     20 Dir RW      
SDIR     PRL    18k    137 Dir RW      
SEND-MSG PRL     1k      5 Dir RW       None                   12/24/81 09:38
SET      PRL     8k     60 Dir RW      
SHOW     PRL     8k     60 Dir RW      
SPOOL    PRL     3k     17 Dir RW      
STAT     PRL    10k     78 Dir RW      
STOPSPLR PRL     1k      5 Dir RW      
SUBMIT   PRL     6k     42 Dir RW      
TOD      PRL     3k     20 Dir RW      
TYPE     PRL     2k     11 Dir RW      
USER     PRL     1k      8 Dir RW      

Total Bytes     =    124k  Total Records =     891  Files Found =   27
Total 1k Blocks =    124   Used/Max Dir Entries For Drive A:   64/  64

0A>; Nifty! This 'time stamping' also works on CREATE and UPDATE,
0A>; when new files are created, or when a file is modified!!!



    A User Application: SEND-MSG for Intra-user Communication

     ɠ though i migh b interestin t b abl t communicat 
betwee multipl user a  'messag drop fo poste mai 
(poste o th 'Q' an visabl t othe user vi MPMSTA a  
'pendin message i the car t rea it) an suc a i is 
doe demonstrat wha ca b don fo intra-use communicatio i 
 commo use syste environement...nothin fancy bu i get 
th jo done allowin u t 8 character i  messag string 
I yo wan t se i yo hav an 'mail' jus ente MPMSTAT<cr 
t se i  SEND-MS i attache t you consol fro anothe 
user...i so jus ente Control- t attac SEND-MS t you 
console an t finis th executio o th pendin messag fro 
fro MP/M' CL (Contro Lin Interpreter buffe storage I yo 
want to send a message (say to USER 0, from USER 1), just enter:

A1>send-ms  Hell yo lovel child what you phon number?<cr>

     Well that' ho i i suppose t wor a leas i 
theory...I guess we better try it, and see what happens!

0A>send-msg 1 Hello from USER 0...Whats up?<cr> <--- set-up 1st message 
09:37:45 A:SEND-MSG.PRL

0A>send-msg 1 I hope you got my message, BYE!<cr> <--- set-up 2nd message
09:38:11 A:SEND-MSG.PRL

0A>mpmstat<cr> <--- let's see if the messages are 'posted'
09:38:20 Msg Qued
:
: <--- I removed some info from MPMSTAT for brevity!
:
Process(es) Attached to Consoles:
  [0] - Tmp0    
  [1] - MPMSTAT 
Process(es) Waiting for Consoles:
  [1] -  Tmp1    [1] SEND-MSG[1] SEND-MSG[1] <--- there they are!
:
Memory Allocation:
  Base = 6C00H  Size = 9400H  Allocated to MP/M-80 [0]
  Base = 5000H  Size = 1C00H  Allocated to SEND-MSG[1] <--- 1st message
  Base = 0000H  Size = 5000H  Allocated to SEND-MSG[1] <--- 2nd message

0A>user 1<cr> <--- switch to USER 1...
09:39:04 
Reloc seg not free <-- oops...no room to execute USER.PRL file!
0A  <--- can' se it bu thi i  Control- t 'GET th messages
Attach:SEND-MSG

This message is from console number: 1
HELLO FROM USER 0...WHATS UP?
  <--- another Control-D to get the remaining message
Attach:Tmp1    

Attach:SEND-MSG

This message is from console number: 1
I HOPE YOU GOT MY MESSAGE, BYE!

Attach:Tmp1    


0A>user 1<cr> <--- now that message are 'flushed' this should work!
09:39:29 A:USER    .PRL
User Number = 1 <--- and it does!!!

1A>


     Yo ca continu 'stacking a man SEND-MSG a YOUҠ use 
memor allocatio allow (ɠ obviousl didn' hav堠 enoug 
memory!)...an don' blam me i th 'blin date yo arrang 
usin thi metho i UUUUGGGGLLLYYYY Yo ar o you own 

     Her i th program an ma b assembl wit RMA an LINK 
o a REL an REL '.HEX file usin GENMOD:

base	equ	0		; MP/M system absolute base address
xdos	equ	base+5h		; MP/M XDOS entry address
buff	equ	base+80h	; temporary command buffer

system$reset	equ	000h	; MP/M system reset
print$string	equ	009h	; MP/M print string function
raw$con$out	equ	004h	; MP/M raw console output function
attach$con	equ	092h	; MP/M attach console function
detach$con	equ	093h	; MP/M detach console function
procc$desc$addr	equ	09ch	; MP/M return process descriptor address

bel	equ	07h		; ASCII bell code
lf	equ	0ah		; ASCII line feed character
cr	equ	0dh		; ASCII carriage return character

begin:	lxi	sp,stack; set system stack
	lxi	h,buff	; point to CLI command buffer
	mov	a,m
	cpi	4	; message string < 4 characters?
	jc	errexit
	inx	h	; now point to console destination number
	push	h	; save the pointer...
	mov	e,a	; save string length in [e]
	mvi	d,0	; put total string length in [hl]
	dad	d
	mvi	m,'$'	; tag the end of string with string delimeter
	pop	h	; point to console user number...
	inx	h
	mov	a,m	; and get it
	cpi	'0'	; < user 0?
	jc	errexit
	cpi	':'	; > user 9?
	jnc	errexit
	sui	'0'	; subtract ASCII bias, and make hex digit
	mov	e,a	; save for now in [de]
	push	d
	mvi	c,detach$con	; detach console function
	call	xdos
	mvi	c,procc$desc$addr	; get process descriptor address
	call	xdos
	lxi	d,14
	dad	d
	pop	d
	mov	a,m
	adi	'0'
	sta	usernum
	mov	m,e
	mvi	b,4	; set counter to issue 4 bells to user console
sendch:	push	b
	mvi	e,bel	; ASCII bell code
	mvi	c,raw$con$out	; do raw console output
	call	xdos
	pop	b
	dcr	b
	jz	notify
	mvi	c,80	; kill some time between bells...
delay1:	mvi	a,255
delay2:	dcr	a
	jnz	delay2
	dcr	c
	jnz	delay1
	jmp	sendch	; send next bell character
;
notify:	mvi	c,attach$con	; attach console function
	call	xdos
	lxi	d,crlfmsg
	mvi	c,print$string	; print string function
	call	xdos
	lxi	d,usermsg
	mvi	c,print$string	; print string function
	call	xdos
	lxi	d,buff+4	; get destination console user number
	mvi	c,print$string	; print string function
	call	xdos
	lxi	d,crlfmsg
	mvi	c,print$string	; print string function
	call	xdos
exit:	mvi	c,system$reset	; system reset (terminate calling program)
	jmp	xdos
;
errexit:mvi	c,print$string	; print string function
	lxi	d,errmsg
	call	xdos
	jmp	exit
;
errmsg:	db	cr,lf,'>>> Error in message line <<<',cr,lf,'$'

crlfmsg:db	cr,lf,'$'

usermsg:db	'This message is from console number: '

usernum:ds	1
	db	cr,lf,'$'

	ds	32	; 16 level stack area
stack:	equ	$

	db	0	; end of page relocatable module

	end


                         Conclusion

     Use documentatio i perhap th bes tha yo coul 
desire includin  comprehensiv User' Guide Programmer' 
Guide an Syste Guide al wit complet glossary an indexes 
an eve a acronym an convention list... fa cr fro th 
origina (terrible CP/ 1. documentation Als include ar 
manual fo th LINK-8 linkage-editor an MA (a  referenc 
documen t th RMAà relocatin macr assemble facilitys 
Incidentally LINK-80 RMA (an LIB-8 a wel a XREF ar wel 
worth the price of the diskette WITHOUT MP/M-80 II!

     MP/M-8 Iɠ i no fo everyone...especiall th casua 
'hacker o  tigh budget...I th hand o  reall goo 
Systems-typ programmer an give th hardwar resource t 
properl suppor AL o th feature o MP/M...thi i TH Multi-
User/Multi-Taskin Operatin System t b usin fo runnin th 
meria numbe o CP/ compatibl application program tha ar 
available  strongl recommen tha yo purchas bot th 'MP/ 
Iɠ User' Guide an MP/M-I Syste Guide manual PRIO t th 
purchas o th MP/ diskette themselves...yo reall nee t 
ge th 'bi picture o i al t mak th bes possibl choic 
i applyin MP/ t  particula applicatio environement.

CP/M is a registered trademark of Digital Research
MP/M, MP/M II, RMAC and LINK-80 are trademarks of Digtal Research
