Changes

Jump to: navigation, search

CP/M 2.2

3,659 bytes added, 12:05, 15 December 2019
/* Console Output */
CP/M 2.2 was the first CP/M avaiable for the Amstrad CPC. A minimum requirement to run CP/M was a disc drive therefore CP/M 2.2 came bundled with the Amstrad [[DDI-1]] discdrive with the BIOS in the AMSDOS ROM, making it possible to run CP/M 2.2 on the Amstrad CPC 464. Later when the Amstrad CPC 664 was released, CP/M 2.2 came together with this machine as the 664 had a built in discdrive. With the CPC6128 it was on one of the two system discs, with CPM+ on the other.
 
== Tips ==
 
CPM 2.2 doesn't allow a program to handle BDOS errors itself like CPM+ does therefore you need to take additional steps to avoid them if you wish your program to continue:
 
=== Deleting a file that doesn't exist ===
 
First check if a file exists before deleting it:
 
ld c,&11 ;; search for first
ld de,fcb
call BDOS
cp 255
jr z,doesnt_exist
ld c,&13 ;; delete file
ld de,fcb
call BDOS
doesnt_exist:
 
=== Disc change ===
 
If the disc is changed, e.g. another disc is inserted into drive A in a single disc system, then the disc will be marked as read-only. Any modification operations (e.g. delete or write) will fail and the program will be aborted with a BDOS read-only error.
 
To avoid this reset the disk system and re-select the current drive:
 
ld c,&19 ;; get current disk
call BDOS
push af
ld c,&0d ;; reset disk system
call BDOS
pop af
ld e,a
ld c,&0e ;; select disk restoring it to read/write state
call BDOS
== Implementations ==
* [[Vortex CPM]]
 
=== Dk'Tronics 61K TPA CPM 2.2 ===
 
* [[DkTronics_CPM|Dk'Tronics CP/M]]
=== Amstrad's implementation of CPM 2.2 ===
CP/M 2.2 was distributed with the DDI-1 disc interface, the CPC664, and on side 1 of the CPC6128 system [[System_Disk]] discs. It provided 41K TPA. Details of the implementation are in the [[Soft158A:_DDI-1_Firmware_-_The_Complete_CPC_464_DOS_ROM_Specification|DDI-1 Firmware SOFT158A]].  The following attempts to give more detail than described there. ==== Creating a minimal system ==== To create a minimal CPM2.2 boot disc follow these steps: * Boot into CPM2.2 from system discs* Use disckit2 to format a blank vendor format disc.* Use BOOTGEN to put the boot sector onto your new disc.* Use SYSGEN to put CPM2.2 into the system tracks.* Your minimal CPM2.2 boot disc is ready. You can then add additional files using FILECOPY. ==== Extra memory ==== CPM2.2 doesn't use any extra memory, and since it runs in configuration 'C0' accessing extra memory is much quicker and easier than under CPM3.0.You should ensure your code (within the TPA) is in a safe region (0000-3fff, 8000-ffff), you can then page in the memory and copy it out to your destination directly as long as the destination is also within the safe area. It is much safer and simpler to use. NOTE: This can't be used on other CPM2.2 variants on the CPC. ==== Console Input ==== Console input (via BDOS functions) uses firmware functions and returns firmware key codes when a key is pressed. i.e. &f0 is cursor up. ==== Console Output ==== Console output (via BDOS functions) ultimately uses TXT OUTPUT so has the potential to execute firmware control codes and display CPC firmware characters.  However, BDOS function 2 (Console output), which has control before TXT OUTPUT, looks for some specific characters and will perform specific processing regardless of whether it is part of a control character sequence or not.  Fore example, Console Output looks for TAB (&09). Therefore use BDOS function 6 (Direct console input/output) to avoid this processing. With this function you can use the control codes to define windows, change modes, change colours etc.
==== Serial number ====
The CPM2.2 serial number appears to be stored on the disc. This is the number that is in the box on the label. Not the one with "serial number" next to it.
It's a 6 byte number stored after 'USER' (in CCP) on the discand before BDOS in memory. D0 seems to be Amstrad's manufacturer code. ==== TPA ==== The top address of TPA can be found by reading the byte at 0007 (which is the top byte of the BDOS JP). This is the start of BDOS. CCP lives below this. If you wish to include CCP subtract &A from this. e.g.  0005 JP &8C06 0007 is &8C. So up to &8C00 can be used. Subtract &A to include CCP. &8C-&0A = &82. So up to &8200 can be used. When writing a COM program you should setup the stack before execution like this:  ld hl,(&0006) ld sp,hl otherwise you're using the stack set for CCP.
==== MOVCPM .COM ====
MOVCPM .COM is used to change the size of the TPA which is the area used by programs. This relocates CCP and BDOS. SYSGEN then writes this to a disc so that when this disc is booted CP/M has a different sized TPA. By reducing the TPA, memory is freed up which is not touched by CPM and which can be used by the user.
CPM 2.2 is generated using MOVCPM on the CPM 2.2 disc as follows:
This method installs a persistent program inside CP/M and uses TPA when it's installed.
- See above how XSUB installs itself. X-Sub allows the CCP to be active.- GSX will install itself, and the appropiate drivers and then runs your program. It doesn't allow the CCP to be active. [[File:Cpm22_driver_xsub_method.zip]] is a template driver that install's itself like X-SUB. However, since it doesn't overwrite CCP, this means TPA is reduced more than necessary.
=== Links ===
2,541
edits