AMSTRAD PCW HARDWARE REFERENCE GUIDE
This is an incomplete hardware guide for the original Amstrad PCW series: 8256/8512, 9256/9512, and 10. It does not cover the PCW16.
Sources include “Everything you ever wanted to know…” by CP Software, John Elliott, Jacob Nevins (and his excellent web pages), Cliff Lawson (who kindly performed OCR on the original Amstrad documentation), Howard Fisher (who lent me a KeyMouse), Paul Hunt, and Kevin Thacker's CPC resource, which contains Z80 and FDC information relevant to the PCW. Thanks, guys. Any additional information is always welcome.
Richard Fairhurst, 1996-1997
INTRODUCTION
The PCW operating system is CP/M, which consists of two main parts.
The BDOS (Basic Disc Operating System) is the operating system code, written by Digital Research. It should remain virtually the same on any machine running CP/M.
The BIOS (Basic Input/Output System) provides a set of routines that access the machine's hardware and was written in the case of the PCW by Locomotive/Amstrad. The BDOS invokes BIOS routines for all screen, disk, and printer operations.
Also relevant is the CCP (Console Command Processor), the interface that accepts commands entered at the A> prompt. The CP/M implementation on the PCW only loads it at system startup, so it must not be overwritten.
The TPA (Transient Program Area) is the memory area, starting at &0100 in a 64k address space, where user programs (.COM files) are loaded and executed.
I/O PORTS
- External Hardware/FDC
| &00 | I | FDC Status Register |
| &01 | I/O | FDC Data Register |
| &88-&8F | Parallel Ports | |
| &9F | I | Kempston Joystick |
| &A0 | I | AMX Mouse. Vertical movement: b0-3 4-bit up counter, b4-7 down counter. |
| &A1 | I | AMX Mouse. Horizontal movement: b0-3 4-bit right counter, b4-7 left counter. |
| &A2 | I | AMX Mouse. Button states: b2 right, b1 middle, b0 left (0 if pressed, 1 if not). |
| &A0-&A2 | EMR MIDI Interface | |
| &A8-&AF | Hard Drive | |
| &C8-&CF | I/O | Fax Link Interface (compatible circuit with CPS8256). |
| &D0-&D4 | Kempston Mouse (similar to AMX) | |
| &DF | I | MasterScan: ink b0 under the scan head. |
| &E0 | I | Cascade/Spectravideo Joystick. b4 right, b3 up, b2 left, b1 fire, b0 down. |
| &E0-&EF | I/O | Serial Ports (click for more info) |
- Internal Ports
| &F0 | OUT | Select bank for &0000 |
| &F1 | OUT | Select bank for &4000 |
| &F2 | OUT | Select bank for &8000 |
| &F3 | OUT | Select bank for &C000. Usually, &87. |
| &F4 | OUT | b7-b4: when set, forces memory reads to access the same bank as writes for &C000, &0000, &8000, and &4000 respectively |
| &F4 | I | Same as &F8, provided that b3-0 is reset upon reading the port. Therefore, read to reactivate interrupts. |
| &F5 | OUT | Roller RAM address. b7-5: bank (0-7). b4-1: address / 512. |
| &F6 | OUT | Vertical screen position |
| &F7 | OUT | b7: inverse video. b6: screen enable. |
| &F8 | OUT | 0 end boot, 1 reset, 2/3/4 connect FDC to NMI/standard interrupts/none, 5/6 set/clear FDC terminal count, 7/8 turn screen on/off (for external video), 9/10 turn disk motor on/off, 11/12 turn beep on/off |
| &F8 | I | b6: 1-line flyback, reading twice in a row indicates frame flyback. b5: FDC interrupt. b4: indicates 32-line screen. b3-0: 300 Hz interrupt counter: remains at 1111 until reset with in a,(&F4)(see above). |
| &FC-&FD | Parallel port (PCW9512) | |
| &FC | I/O | Dot matrix printer data |
| &FD | OUT | Dot matrix printer commands |
| &FD | I | Dot matrix printer status. b7 safety bar (0 out), b2 paper found. |
Unlike the CPC, the PCW uses the standard Z80 method for accessing I/O ports. The port is stored as a (single byte) number in C and an instruction like out ( c ),a is used [insert number], or it is passed as part of the out (&port),a instruction.
INTERRUPTS/CLOCK SPEED
Interrupts occur 300 times per second, or 6 times per frame (as in the CPC), at 2 scan lines of the frame flyback and every 52 lines thereafter. Frame flyback can be detected by reading port &F8 twice consecutively. Only if b6 is set both times is the PCW in frame flyback.
The PCW clock speed is 3.4 MHz, lower than a 4 MHz CPU. However, video hardware access slows down memory access to the first 128k (banks 0-7). The BIOS interrupt is also slow and should be disabled for time-critical operations where tasks such as keyboard scanning or disk access are not required.
MEMORY MAP
The PCW 8256 has 16 banks of 16k each. 512k and expanded machines obviously contain more. The default content is:
| 0 | &0000-&3FFF: | BIOS, extended jumpblock |
| 1 | &0000-&192F: | BIOS |
| &1930-&3FFF: | screen | |
| 2 | &0000-&332F: | screen |
| &3600-&37FF: | roller RAM | |
| &3800-&3FFF: | character set | |
| 3 | &0000-&3FEF: | BIOS, BDOS |
| &3FF0-&3FFF: | Keyboard DMA map | |
| 4 | &0000-&00FF: | workspace and BIOS/BDOS jumps |
| &0100-&3FFF: | TPA | |
| 5 | &0000-&3FFF: | TPA |
| 6 | &0000-&3FFF: | TPA |
| 7 | &0000-&2FFF: | common RAM (available for use in all configurations) |
| &3000-&3FFF: | CP/M workspace | |
| 8 | &0000-&3FFF: | CCP, hash tables, data buffers |
| 9-16 | &0000-&3FFF: | RAM disk (drive M:) |
Roller RAM and screen memory can be stored in any of the banks 0 to 7. Therefore, the access requirements of the video circuitry slow down access to code/data in these banks.
Any bank can be mapped into any of the four 16k segments of the Z80 address space via ports &F0-&F3. In CP/M, the following (named) configurations are standard:
| Screen | BDOS (0) | Extra (n+2) | TPA (1) |
|---|
| &C000 (&F3) | 7 common | 7 common | 7 common | 7 common |
| &8000 (&F2) | 2 screen | 3 BDOS/BIOS | 3 BDOS/BIOS | 6 TPA |
| &4000 (&F1) | 1 screen/BIOS | 1 screen/BIOS | 8+n CCP or M: | 5 TPA |
| &0000 (&F0) | 0 BIOS | 0 BIOS | 0 BIOS | 4 TPA |
By sending the bank number (with b7 set) to one of the ports &F0-&F3, that bank is selected for both reading and writing. By sending the bank number for writing to b0-2 of a port and the bank for reading to b4-b6 (with b7 reset), separate banks are assigned for reading and writing: this can only be used for the first 8 banks.
As an example of read/write access, to map bank 5 into memory from &4000, you would use ld a,&85: out (&F1),a.
SCREEN MEMORY
The PCW screen on 50Hz (non-US) models has a resolution of 90 x 32 characters or 720 x 256 pixels. Each pixel line can start at any address within the first 128 kB of memory: the address of each line is stored in a 512-byte memory area known as Roller RAM. By default, the Roller RAM is located at &3600 (mapped to &B600) in bank 2, but this can be changed via port &F5. It contains 256 consecutive addresses, stored in the usual Z80 format, low byte first: b16-14 control which bank the line is in, b13-3 the address in the bank (in units of 16 bytes), and b2-0 the offset. Thus, a Roller RAM address bbbxxxxxxxxxxxyyy indicates bank bbb, address 00xxxxxxxxxxx0yyy.
Each line has a length of 720 bytes, not 90. This is because the PCW takes every eighth byte starting from the address indicated by the Roller RAM. In this way, eight screen lines can be interleaved as follows to facilitate character writing (assuming a consecutive Roller RAM layout):
(a+0) (a+8) (a+16) ... (a+1) (a+9) (a+17) (a+2) (a+10) (a+18) (a+3) (a+11) (a+19) (a+4) (a+12) (a+20) (a+5) (a+13) (a+21) (a+6) (a+14) (a+22) (a+7) (a+15) (a+23)
The vertical position of the screen on the monitor can be altered by increasing or decreasing port &F6.
KEYBOARD MAPPING
The PCW keyboard is mapped directly to the last 16 bytes of bank 3, even with interrupts disabled. Each key is reflected by a bit in bytes &3FF0-&3FFA.
| b7: | k2 k1 [+] . , space VXZ del< alt |
| b6: | k3 k5 1/2 / MNBC k. lock |
| b5: | k6 k4 shift ; KJFDA enter |
| b4: | k9 k8 k7 ¤ LHGS tab f8 |
| b3: | paste copy # PIYTWQ [-] |
| b2: | f2 cut return [ OURE stop can |
| b1: | k0 ptr ] - 9 7 5 3 2 extra |
| b0: | f4 exit del> = 0 8 6 4 1 f6 |
| &3FF0 &3FF1 &3FF2 &3FF3 &3FF4 &3FF5 &3FF6 &3FF7 &3FF8 &3FF9 &3FFA |
Bytes &3FFB-&3FFF reflect the keyboard differently and incompletely. These bytes are also used by the Creative Technology KeyMouse (in its standard MicroDesign mode) and the Teqniche 102-key keyboard to provide additional functionality, which leads to some incompatibilities. Among the most interesting mappings are the following:
| &3FFB | Standard keyboard | b7-b0 unused (0) |
| KeyMouse | b6-b0 horizontal movement counter. | |
| &3FFC | KeyMouse | b7-b6 high bits of vertical movement counter. |
| &3FFD | All | b7 always set; b6 current state of SHIFT LOCK |
| standard keyboards | b3-b0 cursor keys, b4 matrix key | |
| KeyMouse | b3-b0 low bits of vertical movement counter. | |
| &3FFE | KeyMouse | b7 left button, b6 right button. |
