From nprdc!W8SDZ@Mit-Mc  Thu Apr 29 00:31:46 1982
Mail-from: ARPAnet host brl rcvd at Thu Apr 29 00:24:46 1982
Date: 29 April 1982 02:44-EDT
From: Keith B Petersen <W8SDZ@Mit-Mc>
Subject: Microsoft News - March '82
To: info-cpm at BRL
Via:  Mit-Mc; 29 Apr 82 2:59-EDT


                   --------------------------------
                         MICROSOFT NEWSLETTER
                           MARCH-APRIL 1982
                   --------------------------------

   How do Microsoft Products Interface with CP/M Disk Files?  We've 
had a lot of requests for more information regarding the manner in 
which Microsoft products function with CP/M when dealing with files.  
In the next few months we'll attempt to explain in detail how we deal 
with various types of files. First, a few ground rules: We're going to 
discuss version 2.2 and later of CP/M.  Older versions (or the so 
called "look-alikes", including MP/M,) may behave differently! We'll 
begin with a review of CP/M's disk allocation schemes. While most of 
the disk file access routines are up to the manufacturer of the 
particular system you're using; there are some basic facts to keep in 
mind.  The most important is that CP/M ALWAYS deals with files as 
collections of 128 byte records.  CP/M ALLOCATES files in larger 
blocks, which may range from 256 bytes to 16K bytes.  This "block" is 
the smallest unit of disk space that CP/M will allocate for any file. 
Finally, there is a unit of storage called an "extent", which is a 
multiple of the minimum allocation.  For example, with a 1K 
allocation, the extent size might be 16K. When you run the CP/M 
program STAT (type STAT *.*), the program will tell you the size of 
each of the files on your disk, in terms of the number of records, the 
number of extents, and the size of the file in bytes (always a 
multiple of the minimum allocation block). CP/M handles the "mapping" 
of physical sectors to logical 128 byte records through a 
"blocking/deblocking" algorithim, which can be treated as a "black 
box" for all but the most esoteric applications. Finally, when we 
start trying to compute how much space we have remaining on a given 
disk; we're also limited by the number of "directory entries";  since 
the CP/M system allocates a fixed space on the disk for the directory.  
To obtain information about the physical characterisics of your 
particular disk system you can use the STAT DSK:  command. I hope this 
provides a good introduction to the CP/M file system.  Next month, 
we'll discuss sequential files and how they are handled by MBASIC, 
FORTRAN, and COBOL.  



From nprdc!W8SDZ@Mit-Mc  Thu Apr 29 00:48:16 1982
Mail-from: ARPAnet host brl rcvd at Thu Apr 29 00:35:54 1982
Date: 29 April 1982 02:45-EDT
From: Keith B Petersen <W8SDZ@Mit-Mc>
Subject: Microsoft News - April '82
To: info-cpm at BRL
Via:  Mit-Mc; 29 Apr 82 3:01-EDT


                      MICROSOFT NEWSLETTER

                           APRIL, 1982

                ================================

                         16 BIT PRODUCTS
                         ---------------

  There appears to be some confusion about our 16 bit products.  
I hope this will explain our current policies and procedures.
  First, at this time, *NONE* of our 16 bit products (8086, 8088, 
Z8000, 68000) are available as Microsoft Corporation End User 
Products.  Instead, these products (MS-DOS, Xenix, Fortran, 
Cobol, Pascal, etc) are licensed to a number of commercial 
customers who then market them in conjunction with their own 
hardware and/or systems.  We often refer to these customers as 
"OEMs".   Since the marketing of a product licensed in this 
manner is strictly up to the OEM, we cannot answer any questions 
regarding the availability (or price) of these products.  In 
addition, since the product may have been modified for the 
specific hardware involved, we cannot answer any questions 
regarding a particular implementation.
  In summary, our 16 bit products are "custom" products; for 
information regarding these products, one should contact a 
particular OEM, and NOT Microsoft. 

      FILE ACCESS (CONT'D)
      --------------------
  Last issue we talked a bit about files, and the way CP/M 
allocates file space on disk. This issue, let's look at 
sequential file access as performed by MBasic/Bascom, Fortran and 
Cobol.
  First, a quick review.  A sequential file is a file that is 
accessed in sequence.  This "sequence" is the order in which the 
records were entered.  If we write a file that contains 100 
records;  and then attempt to read that file, if we want the 98th 
record, we first have to read past records 1 thru 97. There is no 
way to access a record "out of sequence" or randomly.  Usually, 
if we want to update a sequential file, we read the old file as 
input and write a new file containing the changed information.
  Now let's look at how each language handles sequential files. 

  MBASIC/BASCOM 
  The commands Basic uses for sequential I/O include OPEN, CLOSE, 
LINE INPUT#, INPUT#, PRINT#, and WRITE#, and PRINT# USING.  When 
we OPEN a sequential file in Basic, it must be OPENed as either 
an input (I) or output (O) file.  
  A file is then written by using a PRINT or WRITE statement for 
each record you wish to write.  For example, the following code 
segment opens a file, and writes 100 records to the file: 
     OPEN "O",1,"TEST.DAT"
     FOR I= 1 TO 100
     J = I + I
     PRINT #1,"RECORD # ";I;J
     NEXT I
     CLOSE 
  Note that we wrote both a string variable and a numeric 
variable.  The resulting file will look something like this: 
 RECORD # 1  2
 RECORD # 2  4
 ... 
  The file will contain 100 records and each record will be 
terminated with a carriage return/line feed pair.  The file 
itself is terminated with a control-Z (Hexadecimal 1A).  
  In the example above, we used the PRINT statement.  If we had 
used the WRITE statement, the string would have been placed in 
quotes, and there would have been a comma between the values of I 
and J.  This is particularly useful when we attempt to read the 
file again, as we'll see below.  PRINT# USING will produce 
formatted output to a file, just a PRINT USING produces formatted 
output to your terminal.
  Just as we have the WRITE and PRINT statements for output, we 
have two corresponding statements for input:  LINE INPUT, and 
INPUT.  The difference is the manner in which data is delimited.  
LINE INPUT will read an entire record, up to (but not including) 
the CR/LF (carriage return/line feed) pair.  This allows us to 
input entire strings of data at one time. The INPUT statement 
expects each numeric data item to be delimited by commas, and 
strings contained in quotes.  
  On input, the end of a file is detected by the EOF function, as 
illustrated below: 
     WHILE NOT E0F(1)
     .
     .
     WEND
  Here, we're checking file number 1 for end of file.  
  To summarize, the file I/O statements in Basic format output 
just as they would to the screen or printer.  The WRITE statement 
writes a file that can be read easily with the INPUT statement;  
and PRINT will generate data readable by the LINE INPUT 
statement.

  FORTRAN 
  Like Basic, FORTRAN uses the same I/O statements for sequential 
disk files as it does for I/O to the console. However, in FORTRAN 
we have a few extensions.  First, we can make use of UNFORMATTED 
I/O to and from disk.  We also have access to the END= branch in 
the READ statement, and the ERR= branch in the READ and WRITE 
statements.  Finally, one should remember that FORTRAN limits 
disk records to 128 characters of less.
  Let's look at formatted I/O first.  Sequential disk I/O in 
FORTRAN is performed in the same manner as console I/O, with one 
important difference.  When FORTRAN reads or writes a disk 
record, the record is terminated with a carriage return ONLY (no 
line feed).  Similarly, when FORTRAN reads a disk file, it 
assumes that the records are terminated with only a carriage 
return, and the line feed is treated as data.  
  This idiosyncrasy can be annoying, but is fairly easy to deal 
with.  On input, we can simply skip the first character of the 
second thru last records. On output, define a LOGICAL variable as 
the line feed character and write in an A1 format, as below: 
     LOGICAL LF
     LF=10
     DO 10 I=1,10
     WRITE(6, 20) I,LF 10   CONTINUE 20   FORMAT(I4,A1)
  This will write a line feed character at the end of each line 
of output.  Notice that we do not need to allow one character at 
the beginning of the record for carriage control, as we would if 
we were writing to a printer.   Unformatted I/O is performed in 
the same manner as formatted I/O, but without the FORMAT 
statement.  This allows us to write records to disk files in 
"memory image" or binary format, which saves disk space, and is 
faster.  Files written in this manner may be read only by another 
FORTRAN program, also using unformatted I/O.
  As mentioned earlier, we can use the END= and ERR= branches 
with disk I/O statements.  The format of these statements is as 
shown in your FORTRAN manual.  The END= will transfer control to 
the specified statement number when an end of file is 
encountered.  The ERR= will transfer control to the specified 
statement when a physical I/O error occurs.  Note that ERR= will 
NOT trap "logical" errors, such as errors in format width or 
specification.   FORTRAN allows us to use a file name other than 
the standard "FORTnn.DAT";  by using the OPEN subroutine.  This 
statement is formatted as follows: 
 CALL OPEN(filenumber,filename,  drivenumber) 
  Where filenumber is the LUN (6-10) of the file, filename is the 
name of the file (in quotes), and drivenumber is the drive number 
according to the following table: 
   drivenumber    drive
   -----------    -----
          0       currently 
                  logged 
          1         A:
          2         B:
             etc.
  An example of this statement is shown below.  Note that the 
filename is filled to 8 spaces, and the extension to 3 spaces. 
Also, the period separating the filename and the extension is 
also left out. 
    CALL OPEN(6,'TEST    DAT',0) 
  This statement will open the file TEST.DAT on the default 
drive, for use as logical unit (LUN) 6. 

  COBOL 
  COBOL has two different formats for sequential files.  
  The first (and default) is SEQUENTIAL.  In the SEQUENTIAL 
format, records are considered variable length, and each record 
begins with several characters of control information.  Files 
written with the SEQUENTIAL organization can be read only by 
another COBOL program.
  The second format is called LINE SEQUENTIAL, and is the 
familiar CP/M "text" file format.  Each record is variable 
length, terminated by a carriage return/ line feed pair, and 
consists of a string of ASCII characters.
  Like BASIC, COBOL sequential files may be opened for input or 
output.  There is also a special mode allowed for COBOL files, 
called EXTEND.  A file that is OPENed EXTEND may have records 
added to it at the end of the file.
  While COBOL code is a bit to lengthy for an example here, watch 
the public access space for examples of COBOL file and screen 
handling in the near future.

  That's all for this issue.  In the next issue we'll talk about 
random access files and how they are implemented in the various 
Microsoft languages.




