February 24, 1981 R. L. Plouffe (703) 527-3215 GENEUSYS.DOC a description of: GENEUSER.ASM and GENESYS.ASM * * * * * * * 12/14/81 GENEUSER.ASM rev 3.0 is a major re-write which extends the CCP and allows N additional user-defined commands. As distributed, it contains CCP-included code for BYE, LOGIN, ORIG, ANSWR, and PASS. It has three password levels (0, 1, & 2) which permit certain commands at each level. Transient commands have the same three levels by placing transients in user 13, 14, or 15 respectively on drive A. Files are universal in all user areas on drive A only if they are in one of these three user areas and depending on password level achieved. * * * * * * * The purpose of the files on this disk is to create a user area in cp/m as distributed by Lifeboat associates for north star double density controller oriented systems that is expanded by either 1 or 2 kb. This is done by writing to and reading from the first four sectors of the north star disk. This is where the additional user code is made to reside. The key to the process is GENESYS.COM which initially loads at 100H but immediately moves itself to just above the 'sysgen' image (2D00H), thus leaving the ram space from 100H to 08FFH available to write user code. When a cpm.com file is SAVEd after patching in user code with DDT, the second area of user code is saved along with the rest of cp/m. GENESYS is then used to write this cp/m system to the system tracks starting from the first sector of the first track and from RAM starting at 100H. The code in the first block in the 100H page must contain a special ORG at 05CH of that page and a DS 1 placed there. This is to provide storage space for the format byte which the lifeboat bios checks there. This special ORG is contained in GENEUSER.ASM in its INIT routine. GENESYS patches into your system a completely new coldboot loader that loads all 10 sectors of both system tracks except that it skips sector four of the first track since the boot prom will have already loaded that code. The coldboot loader is made to run at CCP-100H as before and it loads the rest of the code to ram starting at CCP-900H. Thus, the cp/m system is in it's normal location with additional code from CCP-900H to CCP-100H (2kB). The scheme in GENEUSER.ASM is to run the user INIT routine here since it is throw away code anyhow and will get clobbered since this is in the top of the TPA. The INIT routine in GENEUSER contains a mover which moves the second user area code which is also now in ram between CCP-100 and CCP-900H to just above the running cp/m system. A feature of the new cold boot loader is that in the event of a bad disk read, the loader will permit a reboot only eight times and then reset the controller and halt the computer if still not successful instead of rebooting endlessly as the loader in your distribution version will do. This is important if you have implemented auto power up and power down using the PMMI modem auxiliary interface and your computer is activated remotely. Who wants the possibility of endless head loading, unloading, stepping and disks whirring until you get home - yuk. GENESYS also patches your cp/m system so that it is boot PROM independent. This is done by having the coldboot loader patch all of the PROM dependent bytes in the BIOS regardless of where your PROM is located. The coldboot loader is made to point to a table already in your cp/m system that contains the addresses of these bytes. Someone put an error in each of these tables for each version that GENESYS knows about so it simply patches out the error prior to writing out a system. The error is apparently an introduced bug to prevent the system from working when you relocate your disk controller PROM. The coldboot loader then uses the table to patch all of the prom dependent bytes using knowledge of the prom location passed to it by the boot prom firmware itself. GENESYS and GENEUSER will work with Lifeboat's cp/m 1.45, 2.01, 2.2, 2.21A & 2.22. The tables, prom info storage locations, and exit to bios addresses are different from one version to the other, however GENESYS knows about all of that and tests for version number in the second byte of the serial number. That byte is 0EH (14 decimal) for version 1.45, 20H for version 2.0 and 22H for version 2.2. If anyone has modified the serial number (who would do that?) and changed the second byte, then GENESYS won't work and will give a bad version message. Once the second byte is tested, then GENESYS patches the cold boot loader to contain the proper addresses before writing out your system to either a file or to your system tracks. Oh yes, I forgot to mention that GENESYS (unlike Sysgen) has an option which you will see in the prompts to make and write a cpm.com file or to write to the system tracks on the selected destination drive. When writing a cpm.com file with GENESYS, writing a system from one disk to another, or taking a cpm.com file from one disk and writing either a system or a file to another drive, GENESYS will always check the format byte of the destination drive and patch that byte into the image before writing to that disk. So the format byte which the files on that drive were written for is assured not to be changed. This is especially important for cp/m 2.2 which can read or write from or to any of the defined lifeboat formats. Since GENESYS initially loads at 100H (but not above 8FFH), it will not permit you to skip the source drive prompt as 'Sysgen' will in order to write out a system that had been brought in with DDT. This is because GENESYS first loads at 100H and would clobber any code from 100H to 08FFH that DDT would have written. So, you must bring in the image with GENESYS from either a file or system tracks and not with DDT. You can bring in a cp/m.com file on the command line with GENESYS, but it must be 40 North Star blocks in length because GENESYS tests such a file to see if it is complete. So, when you save a cpm.com file that has been patched with DDT always save it as SAVE 40 (Dr:)CPMxx.COM (xx=sysize). Even if the SAVE prompt as a result of making a new system with MOVCPM under 1.45 says to SAVE 36 do a SAVE 40 instead. When patching in a revised user area with DDT use the overlay offset computed in the GENEUSER.PRN file but first fill 100H to 8FFH and 2700H to 28FFH to zero (2400H to 28FFH when using version 1.45). All of the code will appear in the right places from 100H to 2900H. **************************IMPORTANT****************************** Start out fresh with a cpm.com file made from MOVCPM with the prom dependent bytes unchanged and at the standard location (0E800H). Then overlay the user code from GENEUSER using DDT. Then SAVE this image as a cpm.com file. Then use GENESYS to write to the system tracks. The prom dependent bytes will be changed only in the running system and not in the cpm.com file although other clean up to the cpm.com file will be done when making such a file with GENESYS. If you have already changed the prom dependent bytes in MOVCPM manually, then you must change the PROM equate in the coldboot loader of GENESYS.ASM as well as the disk read command (0EB40H) in the bios options area of GENEUSER.ASM for version 1.45 in spite of the admonitions in those files not to do so. Then perform the four steps just covered above in this paragraph. Either procedure will then give you a disk that will boot up and run on any North Star regardless of where it's disk controller PROM is located. Procedure 1 is preferred but any other procedure will invite DISASTER since the coldboot loader is going to add the difference between the actual prom hi byte and the value contained in the coldboot loader to all of the prom dependent bytes in the bios. So if you had already patched these bytes manually and don't start fresh (procedure 1) or follow procedure 2, the new coldboot loader will add an additional offset to all of the prom dependent bytes and your system wont run. So, a word to the wise - be careful and make sure you understand this procedure. Once you have started fresh (either procedure) as outlined above, you can always make your CPMxx.COM file using GENESYS prior to patching in a new or revised user code using GENEUSER and DDT provide that the image brought in is one that originated from a fresh start. If you change the user code in GENEUSER, keep the same skeletal organization. Key parts of the skeletal are the movers, the orgs including the special org at INIT+5CH. You may add code in front of USR1END and USR2END to the extent that you have space in the two areas available and have properly allocated space above cp/m by sizing your system appropriately. Also any code in an area that has labels followed by EQU $+OFFSET must be similarly labelled and equated. The GENEUSER file provides for USER1 to be 256 bytes to be compatible with version 1.45 without the buffer being moved (you can make USER1 an additional 1k bytes resident on the system tracks with 1.45 by moving the buffer up by 1k or to any place else out of the way). USER2 can be either 1 or 2 kB and you must make space above cp/m by appropriately sizing your system. Actually USER2 in its running location will be less than 2 kB by the amount of code in the INIT routine since that code doesn't get moved but gets thrown away, so if you make a 2kB USER2 area there will be some space at the top which you can use as a scratch area for other purposes. GENESYS is written using only 8080 mnemonics. GENEUSER uses Z-80 code stored as DB's so that it will assemble with an 8080 assembler. The Z-80 implementation saves considerable space but you should easily be able to convert it if your computer is 8080 based. Just keep the same skeletal arrangement. GENEUSER contains a number of goodies such as full IOBYTE implementation, PMMI modem routines, Computime T-102 clock routine, and North Star parity memory error detection and ram parity error message. Look through it carefully to check all of the conditional assemblies, port assignments and equates for your system including clear screen, mode byte and selection of drive characteristics in the bios options area, and configuration byte also in the bios options area. You don't need to know controller PROM location for parity memory option since GENEUSER will get this as a passed parameter either from the bios in 2.0/2.2 or the coldboot loader for 1.45. Now, what the heck is all of this good for. Well aside from GENESYS cleaning up your system so that it will be disk controller PROM independent, work with any version in conjunction with GENEUSER and provide for expansion of user space resident on the system tracks, the reason this project got started was to provide for substantial amounts of space for communication networking and file transfer software to be resident at the user's beck and call and available remotely as well upon auto start up and answer using the PMMI modem. The next project is to get that code in there. SPECIAL NOTE If you have version 2.21A by Lifeboat, there are a couple of bugs which you should know about. First, the user area code on the distribution diskette has an IOBYTE implementation but contains a serious flaw. The author apparently forgot to save and restore registers in the routine that maps logical to physical devices. If you wish to use that code, it is recommended that you change the mapping routine to the one contained in GENEUSER.ASM that is on this disk as a companion to GENESYS. Otherwise you will find that the user code on the distibution diskette will not work with software such as BYE.COM and MODEM.COM by Ward Christianson as well as MBASIC ver 4.4 although it will work with MBASIC 4.51. It is suspected that plenty of other software that is not expecting registers to be corrupted would not work either. Of course GENEUSER will work with all of the above. The second bug has to do with the MODE byte. The bios on the distribution diskette has a stack imbalance in the routine that tests the MODE byte and POPs the PSW once too many times if the 40H bit (READ AFTER WRITE) is set high. This is corrected in the FIX221A subroutine of GENESYS by setting the extra POP PSW byte to NOP. Without this correction, the read-after-write function does not work properly and FORMAT.COM as well as PIP.COM do not work. So a system that is 'gened' with GENESYS has this bug fixed and you can set the read-after-write function in the MODE byte without fear. These bugs were fixed by Lifeboat in ver 2.22. ****** C A U T I O N ****** ONCE YOU USE GENESYS TO 'GEN' YOUR SYSTEM, DO NOT USE 'SYSGEN' ANYMORE SINCE IT WILL NOT READ OR WRITE THE FIRST FOUR SECTORS OF THE FIRST TRACK. RETIRE 'SYSGEN' TO THE ARCHIVES, SINCE GENESYS WILL DO THE SAME AND MORE EVEN ON SYSTEMS THAT HAVE BEEN 'GENED' USING 'SYSGEN'. Have fun and let me know how you make out, but no complaints please. r.l.plouffe