; ; ********** FOOTNOTE #1 ********** ; ; --- A general note about the rewrite of this BIOS. The initial reason for ; the rewrite was to clarify (ie. comment) some of the original code as well as ; changes and additions that had been made in later releases. In the process, ; much "deadweight code", or code which never took effect was discovered. ; Ironically, the bulk of this code came from the examples given by ; the Digital Research blocking/deblocking algorythms found in the standard ; CP/M 2.2 (aka CP/M-80) manuals themselves. The result you will find here ; does not conform with those outlines, but instead utilizes the fact that the ; largest physical sector permitted is 1024 bytes, the same value as the ; minimum logical block size. Under these conditions, a disk read or write ; involving blocking/deblocking is triggered according to the physical size ; only, and no accounting of the logical blocking is required. This technique ; actually will function better, in a more clearly documented manner than the ; "skeletal outline". The overall result has been a noticable (20-100%) speed ; increase with absolutely no loss of compatibility or functionality as ; specified in the CP/M 2.2 documentation. ; ; --- ADDITIONAL INFORMATION ABOUT DIFFERENCES IN THE COMPUPRO CBIOS --- ; ; 1000h is the offset for CompuPro CP/M rev level 2.2J MOVCPM utility, ; but this will vary with the letter version of CP/M that you purchased. ; This BIOS offset was selected to comply with the "J" release, but you must ; move the offset for the "K" release, and others may be different. Digital ; Research manuals show an offset of 0600h for their nominal 20K BIOS, which ; means that for the "J" version CompuPro system a "MOVCPM 64 *" will actually ; generate a "true" CP/M 61.5K system. This is no real problem, because the ; CompuPro boot loads a CBIOS of 22 (or with special BOOT, 24) 128 byte ; sectors, which is 2.75 or 3K bytes (length 0B00h or 0C00h), both of which ; are much larger than would be permitted with a "true" 64K system. CP/M can ; actually be generated by Digital Research to run on any page boundary ; (increments of 256 bytes), but once delivered it can only be "moved" with ; MOVCPM by 1Kbyte amounts. Far better to have room in the CBIOS for expansion ; than follow Digital Research too literally. This information is included ; for reference purposes only. aep ; ; ********* FOOTNOTE #2 ********** ; ; I/O device initialization is performed upon cold boot only, and some ; of the routines for this are located at the end of the BIOS. The bulk of ; the UARTs, interrupt controllers, timer/counters, etc. are initialized by ; a program called the Initial Program Loader (IPL for short). This program ; also performs the task of loading the CBIOS and initializing high RAM for ; the 8088 to function. By inspecting the CP/M file titled "HMFBOOT.ASM", you ; will see some of the reasoning behind placing the initialization routines ; there. The program has quite a few "absolute location" requirements, and ; this made it easy to assign fixed locations to the important I/O initial ; settings. You will also see that it is quite easy alter or "poke" additional ; I/O port initialization sequences into the allotted memory area. If you ; opt to change the source program, be extremely careful not to inadvertantly ; alter the absolute location assignments -- this will nearly always cause ; the program to become non-functional and the system will play dead. ; ; More on the BIOS -- Since the cold boot routine is utilized only once, ; it is placed at the upper end of RAM. This permits the RAM used by these ; initialization routines to be "recycled" for use by CP/M as a portion of the ; general workspace. Since the cold boot routine is executed prior to any ; CP/M BDOS calls, there is no conflict in performing this reclamation. ; ; For individual logical to physical device assignments (I/O redirection ; performed usually thru the STAT utility), see the individual logical device ; vectors. These are located between the Warm Boot and Cold Boot routines, ; again to permit them to be overlayed by other routines as needed. This will ; usually take the form of input/output interrupt driven routines, which are ; generally larger than the normal CBIOS boot track would permit on a cold ; boot. ; ; *********** FOOTNOTE #3 ************ ; ;--- As a side note, for those of you who never got a chance to work ; with one of the earliest (and possibly the slowest) operating systems ; implemented on a micro, the expression "CIOPB" used here comes from the Intel ; ISIS software. It stands for "Command Input/Output Parameter Block", which ; itself is a derivative of the method used by the larger mainframes for ; communicating with their I/O channel controllers. ; Since all of the versions of the CP/M operating system thru at least ; version 2.0 were developed using Intel MDS systems, ISIS and PL/M initially, ; there are many artifacts in CP/M that reflect that evolutionary process. ; The most obvious holdover from the MDS system is the IOBYTE, which is ; implemented in CP/M in exactly the same manner defined by the MDS monitor. ; (In the very early days of micros, there were no operating systems--just ; "monitor" programs that provided the barest necessities for making the thing ; behave vaguely like a computer). The choice of retaining the flavor of ; the older Intel disk controllers by naming the variable here "CIOPB" came ; originally from work done at SORCIM, but I thought you might be interested ; in some of its related history. aep ; ; ************* FOOTNOTE #4 ************ ; ; The following routine is a quick way to effectively implement the ; ETX/ACK software transmission protocol utilized in printers with "Diablo" ; type control sequences. It takes advantage of the fact that every line ; of text transmitted to the printer will eventually be followed by a line ; feed character, or an ESCAPE sequence which has a line feed as its ; terminating character. This is used instead of counting characters to ; determine when the buffer is full because the "last" character of the count ; may be the first or second of an "ESCAPE" control sequence. The transmission ; of the ETX character at that time is usually interpreted as a valid "value" ; in the escape sequence, and not be recognized as an "end of transmission" ; as intended. ; Since even at 1200 baud the printer is "using" characters from it's ; storage buffer at a fast enough rate (especially with word processing ; ESCAPE sequences stuck in the text stream,) that usually nearly twice the ; number of characters that the printer buffer can hold can be transmitted ; before the protocol is activated. This scheme works particularly well in ; that it insures that the ETX character is never transmitted in the middle ; of a control sequence, but often enough to not overflow the printer buffer. ; ; --- As a final note, DON'T USE THIS PROTOCOL UNLESS YOU ABSOLUTELY MUST. ; It is subject to a number of flaws generally, and a full blown software ; driver for this protocol is both a great memory consumer and it is quite ; difficult to develope a driver that absolutely, positively, under all the ; unusual conditions that may exist, does not either get "hung up" in a ; wait loop or overflow the printer's buffer. Either the XON/XOFF protocol ; (in software) or the "REVERSE CHANNEL" or "DTR" (Data Terminal Ready) ; hardware handshaking is far more reliable, faster, and easier to implement. ; ; The hardware handshaking is usually found on either pin 19 or 20 of ; the printer EIA RS-232C connector, and is cross connected in the cable ; to the "Clear to Send" (CTS, usually pin 4 on the connector input to the ; computer). The hardware protocol usually gives the most satisfactory ; results in that it tends to be independent of any changes in the operating ; software. ; ;--------------- end of footnotes -------------