Difference between revisions of "CP/M 2.2"

From CPCWiki - THE Amstrad CPC encyclopedia!
Jump to: navigation, search
(Technical information)
(Memory Map)
Line 58: Line 58:
 
=== Memory Map ===
 
=== Memory Map ===
  
CP/M runs with ram selection 0 (i.e. 7FC0) and assumes the upper ROM is selected (in this case AMSDOS). Therefore if you patch and need to change the ROM, then you should store and re-store the upper ROM using the firmware functions. It seems that AMSDOS doesn't use all it's work ram.  
+
CP/M runs with ram selection 0 (i.e. LD BC,&7FC0:OUT (C),C ) and assumes the upper ROM is enabled and is the one with the CPM BIOS in it (i.e. AMSDOS.)
  
The alternate register set is setup for the firmware.
+
Therefore if you patch CPM you need to:
 
+
- ensure the RAM selection state is as expected
IY = &ac48?? - is this the base of AMSDOS??
+
- the upper ROM is enabled and AMSDOS ROM is selected (this can be done using firmware functions to get the current rom state and number and restore it).
 +
- avoid touching AMSDOS/firmware areas unless you are also patching it.
 +
- restore the alternative registers if you modify them.
  
 
The lower firmware jumpblock exists at &0000-&0040 because it is needed by the firmware jumpblock to call into the OS rom. The following changes are made for CP/M 2.2:
 
The lower firmware jumpblock exists at &0000-&0040 because it is needed by the firmware jumpblock to call into the OS rom. The following changes are made for CP/M 2.2:
Line 77: Line 79:
 
* &ad00 - &ad32 => CPM BIOS jumpblock.  
 
* &ad00 - &ad32 => CPM BIOS jumpblock.  
  
Each entry is a JP instruction.  
+
Each entry is a JP instruction. (The address of this can be calculated from CP/M if you need to patch it. Take the address at &0001/&0002 and subtract 3 to give the address of the boot JP instruction). These jumps including enter/exit firmware can be patched.
(The address of this can be calculated from CP/M if you need to patch it. Take the address at &0001/&0002 and subtract 3 to give the address of the boot JP instruction). These jumps including enter/exit firmware can be patched.
+
  
 
If you plan to patch it for additional hardware and need memory then you will need to use MOVCPM to reduce the TPA size.
 
If you plan to patch it for additional hardware and need memory then you will need to use MOVCPM to reduce the TPA size.
Line 110: Line 111:
 
* &b900 - &be00 => main firmware jumpblock
 
* &b900 - &be00 => main firmware jumpblock
 
* &be40 - &be7f => used by AMSDOS and locates the XDPB for each drive.
 
* &be40 - &be7f => used by AMSDOS and locates the XDPB for each drive.
* &be80 - &bebf => CP/M 2.1 BIOS extended jumpblock. (functions here used by conin, conout, lstst, list, punch, reader, const and action depends on iobyte. These can also be patched. )
+
* &be80 - &bebf => CP/M 2.1 BIOS extended jumpblock. (functions here used by conin, conout, lstst, list, punch, reader, const and action depends on iobyte. )
 
* &bec0 - &bfff => stack
 
* &bec0 - &bfff => stack
 
* &c000 - &ffff => screen
 
* &c000 - &ffff => screen

Revision as of 13:04, 5 May 2018

CP/M 2.2 after boot

Operating system for the Intel 8080 and Zilog Z80 based computers by Digital Research

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.

Implementations

Vortex's implementation of CP/M 2.2

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 discs. It provided 41K TPA.

Contents

CPM 2.2 with DDI-1

  • Single 3" disk, two sides.
  • CPM 2.2 only
  • Side A is bootable, starts CPM 2.2 but stops at command prompt, and has AMSDOS.COM, ASM.COM, BOOTGEN.COM, CHKDISC.COM, CLOAD.COM, COPYDISC.COM, CSAVE.COM, DDT.COM, DISCCHK.COM, DISCCOPY.COM, DUMP.ASM, DUMP.COM, ED.COM, FILECOPY.COM, LOAD.COM, MOVCPM.COM, PIP.COM, ROINTIME.DEM, SETUP.COM, STAT.COM, SUBMIT.COM, SYSGEN.COM, XSUB.COM
  • Side B is bootable, starts CPM 2.2 and automatically starts LOGO and has AMSDOS.COM, LOGO.COM, SETUP.COM

Details of files:

  • AMSDOS.COM will reset the CPC and return back to BASIC.
  • ROINTIME.DEM is a demo of "ROLAND IN TIME" from Amsoft.
  • LOGO.COM is Logo v1.1
  • the AMSDOS rom contains part of LOGO

Technical information

CP/M 2.2 uses the firmware. There are 2 BIOS jumpblocks in RAM and the "ENTER FIRMWARE" which can be patched. The normal CPM BIOS jumpblock and an extended one.

CP/M uses the firmware extensively and enters it via "ENTER FIRMWARE".

The BIOS is in the AMSDOS ROM, and this uses the jumpblocks in RAM.

The AMSDOS ROM also uses part of the RAM for XDPB storage and a sector buffer.

By having the BIOS in ROM, using the firmware and having the screen at &c000-&ffff this gives 33KB TPA for a CPC system which is OK.

  • Amstrad CPM2.2 uses Amstrad's "System" format. This is 40 tracks, 1 side, 9 sectors per track numbered &41-&49. Each sector holds 512Bytes. There are two reserved tracks, then the directory which has 64 entries, and then the data area.
  • CP/M is booted by a RSX command "|CPM" which is implemented by the AMSDOS ROM (the standard disc ROM in the DDI-1, CPC664, CPC6128 and 6128Plus).

1. The |CPM command loads track 0, side 0, sector 41 into ram at &100 and jumps to it. This is the boot sector. (The boot sector occupies &100-&2ff).

2. The boot code copies the BIOS jumpblock from the AMSDOS rom to &500. (In the AMSDOS ROM this is located at &C17F. The actual address is passed to the boot rom in BC).

3. The boot code then loads track 0, side 0, sector 42 into ram at &300 which is the "configuration" sector which defines colours, mode, and keyboard translation tables. (The configuration sector occupies &300-&4ff).

4. Finally the boot code calls CPM "WBOOT".

  • WBOOT loads multiple sectors from the reserved tracks, this is the platform independent CPM system (BDOS etc).

Memory Map

CP/M runs with ram selection 0 (i.e. LD BC,&7FC0:OUT (C),C ) and assumes the upper ROM is enabled and is the one with the CPM BIOS in it (i.e. AMSDOS.)

Therefore if you patch CPM you need to: - ensure the RAM selection state is as expected - the upper ROM is enabled and AMSDOS ROM is selected (this can be done using firmware functions to get the current rom state and number and restore it). - avoid touching AMSDOS/firmware areas unless you are also patching it. - restore the alternative registers if you modify them.

The lower firmware jumpblock exists at &0000-&0040 because it is needed by the firmware jumpblock to call into the OS rom. The following changes are made for CP/M 2.2:

  • &0000-&0002 => WBOOT (JP &AD03)
  • &0003 => IOBYTE
  • &0004 => user number/drive number
  • &0005 => &0007 - BDOS (JP &9F06)

TPA is from &100-&96ff (38400 bytes, 37KB TPA). Then:

  • &9700 - &acff => CPM 2.2 CCP/BDOS
  • &ad00 - &ad32 => CPM BIOS jumpblock.

Each entry is a JP instruction. (The address of this can be calculated from CP/M if you need to patch it. Take the address at &0001/&0002 and subtract 3 to give the address of the boot JP instruction). These jumps including enter/exit firmware can be patched.

If you plan to patch it for additional hardware and need memory then you will need to use MOVCPM to reduce the TPA size.

For CPC AMSDOS the BIOS jumpblock has the following addresses in it:

boot - C1B2 wboot - C2BE const - C2E1 conin - C2C3 conout - C2C8 list - C2D2 punch - C2D7 reader - C2DC home - CDE9 seldsk - c2f2 settrk - c524 setsec - c529 setdma - c51a read - c2f7 write - c2fc listst - c2cd sectran - c55a "enter firmware" - c0fa


  • &ad33 - &ad42 => used by "enter firmware" for storage of registers etc for transitioning to firmware and restoring back.
  • &ad43 - &bb00 => used by AMSDOS.
  • &b900 - &be00 => main firmware jumpblock
  • &be40 - &be7f => used by AMSDOS and locates the XDPB for each drive.
  • &be80 - &bebf => CP/M 2.1 BIOS extended jumpblock. (functions here used by conin, conout, lstst, list, punch, reader, const and action depends on iobyte. )
  • &bec0 - &bfff => stack
  • &c000 - &ffff => screen

Download

Manual