A Speccy Port or Spectrum port is the name given to a game which has been converted directly from the Sinclair Spectrum with little or no changes to the Amstrad CPC.
Mostly the Amstrad version ended up fairing worse than the original Spectrum version with the following results:
- Less colours
- Slower gameplay
These facts are not true for all "Spectrum Ports" because some ended up decent.
There is anger from Amstrad users in general, because they feel that if more time had had been taken on the Amstrad version, we could have had a version that used the abilities of the Amstrad better, looked better, perhaps sounded better, and played as well or better than the Spectrum version.
On a more positive tone, those speccy ports had the merit to exist, or else Amstrad would have a smaller games catalogue.
It is worth noting that Spectrum ports also existed on MSX, Enterprise 64/128, SAM Coupé and non-Z80 Thomson MO/TO, C64.
List of Spectrum Ports
How these should have looked
This section shows games which were made specifically for the Amstrad's abilities or Spectrum ports that were done correctly.
Here are some examples of Amstrad games done well, and how these games could have looked if more care was taken.
The following list shows how a game can be done right using the cpc capabilities. These do not necessarily share any Spectrum code, and are not necessarily recoloured from the Spectrum:
- Renegade
- Gryzor
- Xyphoes Fantasy
- Head Over Heels
- Atic Atac
Some CPC games share similarities with the Spectrum version, and probably share a lot of code, yet are in mode 0 (16 colours, lowest resolution). Ocean made a lot lilke and thanks to a more professional graphic treatment (compared to many other British companies) and actually good porting tactics this produced some of the finest CPC games.
Those games are examples:
- Robocop
- Chase HQ
Some of the games in the list below use mode 1 but fully supported the 2bpp re-coding of graphics done right (by a human, not by an automatic method) and hence got properly coloured backgrounds and sprites.
- Shadow of the Beast
- Midnight Resistance
- Wec le Mans
Reasons for a Spectrum Port
The ZX Spectrum shared similar hardware with the Amstrad CPC (see Machine comparisons).
The Spectrum was very popular and with the CPC having a much smaller market share, it made sense to develop the Spectrum version first and to save on time and money, the Spectrum code, music and graphics were re-used. (A typical port to the Amstrad is said to have been done in 3 days so was financially good).
This phenomenon was more prominent in the UK, where the Speccy was the dominant machine. In other markets, such as France or Spain, where the CPC was very popular, games were coded from scratch for the CPC, often using an Atari ST for Cross Development
Machine comparisons
General
- The Spectrum 48K was released in the UK in 1982 and was the successor of the ZX80/ZX81 with upgraded graphics and config (RAM/ROM). The Amstrad CPC464 was released in the UK in 1984 and was a Z80 based computer with AY sound and a simplified yet upgraded custom IBM PC CGA display for Video.
- Spectrum 48K sold for £99. The CPC464 with Green Screen monitor sold for £299 and with colour monitor for £399. One selling point was that the Amstrad needed only 1 plug, and that you didn't need to use the family television to use it. Also the Spectrum 48k wasn't supplied with any monitor nor storage device.
- The Spectrum was designed to be used with a television, the Amstrad was designed to be used with and was sold with either a green screen or colour monitor.
- Amstrad's monitors include the powersupply for the Amstrad CPC. A "TV connection + power supply" solution was also available : Amstrad MP1/MP2 modulator
- The Spectrum was sold as a games machine, the Amstrad was sold more as a multi purpose machine (in the UK anyway).
- The Amstrad's BASIC and firmware are said to be better than the Spectrum's BASIC and OS functions.
CPU, RAM and basic Hardware
- Spectrum 48K machine has 48K RAM, approx 6.5k of this is screen. The Amstrad CPC464 and 664 have 64K ram, approx 16K of this is screen.
- Latter Spectrum were supplied with 128K RAM (Spectrum 128, +2 and +3) and Amstrad CPC6128 was supplied with 128K RAM too (same amount of RAM used by Video as earlier machines)
- Spectrum and Amstrad both have a Z80 CPU.
- The CPU runs at a similar speed (3.5Mhz in Spectrum, 4Mhz in Amstrad) (Note, both systems do not run at optimum speed due to waits inserted by the video hardware).
- The Spectrum 48k can't do double buffering in hardware (the later 128K machines can), the Amstrad could from the start. On the Amstrad and Spectrum 128K you can use hardware double buffering, but then you need to sacrific twice as much video ram (e.g. For Amstrad: 2 x 16K).
- The Spectrum has 1 interrupt per 50Hz frame, the Amstrad has 6 in fixed locations through the frame.
- Neither have hardware sprites, therefore you have to use the CPU to both draw and erase the sprites.
- Amstrad has hardware scrolling, Spectrum does not.
- The Spectrum 48 didn't come with a joystick port, you had to buy one. There was two variants, Sinclair and Kempston, thankfully the hardware was cheap and easy to obtain, and both were well supported by software. The Amstrad came with a joystick port built in.
- The original Sinclair ZX Spectrums didn't come with a tape player, you had to buy one. The Amstrad CPC464 had a tape player built in, however neither the CPC664 or CPC6128 had a tape player built in, you had to buy one if you wanted to use tape based software with them.
- Later Amstrad's ZX Spectrums (+2 and +3...) had in-built storage devices as they shared the common Amstrad CPC design.
- Both the Spectrum and Amstrad had to use the CPU for loading or saving on cassette. The Spectrum ROM loader used the border colours to indicate loading (especially the use of striped bars in the border to indicate each data bit) a small block for a header, and then loaded the program with one larger block. The checksum/error detection was done using XOR. The Amstrad's ROM loader used many smaller blocks (so you could rewind if there was an error), it indicated loading progress with text that updated on the display, and used the better CRC for error detection. However, if the loading messages were turned off, you didn't have any indication of loading progress.
- The Spectrum 48K's keyboard was made from rubber, the CPC had a proper keyboard. The later Spectrum's had proper keyboards too.
- The Amstrad had connections for printer, stereo sound output and expansion. It had an internal speaker, with volume control. The Spectrum 48K had connections for tape player, TV aerial and expansion. It had an internal piezo electric buzzer, the volume of which couldn't be controlled.
- The Amstrad could control the cassette motor, turning it on and off under software control to pause loading of software. The Spectrum didn't have this, you had to manually stop and play the tape.
- The Amstrad had function/numeric keys. Only the later Spectrums (+2 and +3) had these.
- Later Spectrums (+2 and +3) had a RS232/Midi port, the CPC didn't have this. If you wanted this on the CPC, you needed to buy extra hardware.
Video
- Spectrum and Amstrad both have a bitmapped display.
- while ZX spectrum has a quite basic 1bpp character based colour display, Amstrad CPC can be considered an upgraded CGA display minus the Character based text modes (with a 16colours modes such as the Tandy's own custom "CGA" had... and a differently logic based palette), with a range or 4bpp low resolution, 2bpp square resolution and 1bpp high resolution Attribute free video display.
- They have a similar screen size. But Amstrad CPC actually produces smaller pixels in it's "equivalent" video mode (mode 1). The normal display resolution on the Amstrad CPC is 320x200 (mode 1) while ZX Spectrum produces "only" 256x192 pixels. Amstrad's screen can be reduced in size to match the Spectrum's (256x192, in Mode1) but then the actual display window is quite smaller than on a spectrum (on the same monitor) and has a larger border because the generated pixels are slightly smaller.
- The size and aspect of the pixels in the Spectrum's bitmapped display are comparable to the pixels in Amstrad's mode 1 bitmapped display in that both produce approximately square pixels.
- The Spectrum's video ram takes approx 6K.
- The Amstrad CPC's video ram takes 16K (approx 12K when screen is reduced to Speccie's resolution).
- The Spectrum has a fixed palette of 15 colours (8 colours with bright versions of each making 15 in total - LIGHT black is still black).
- The Amstrad has 3 different Video Modes. Mode 0 is 160x200 with 16 colours, mode 1 is 320x200 with 4 colours, mode 2 is 640x200 with 2 colours. All are bitmapped. The Spectrum only has 1 video mode, 256x192 which is bitmapped.
- Amstrad CPC has a palette of 27 colours. In mode 0 you can choose 16 of these, in mode 1 you can choose 4 of these, in mode 2 you can choose 2 of these. The Amstrad's palette includes equivalent colours that match closely the Spectrum's colours.
- The Spectrum's screen is "attribute" based. Each 8x8 cell can be assigned a background and foreground colour (and both colours must either be non-bright or bright). There is also the choice to flash the colours in each cell (the flash is a fixed rate and alternates between paper/pen and pen/paper). This colouring results in "attribute/colour clash" on the Spectrum. The Amstrad's screen doesn't have this, and there is no restriction on how the colours can be placed.
- The colours of each 8x8 "attribute" cell is defined by a block of ram following the Spectrum's bitmapped screen, each byte represents one cell and each byte defines paper colour, pen colour, flash enabled and bright enabled. The colours for the pens on the Amstrad are defined by writing to the Gate-Array's palette I/O registers. The pens are read from the pixel data and the resulting colour is looked up in the palette registers.
- The Spectrum can display all 15 colours on the screen.. With limitations (2 colours per 8x8pix squares...)
- The Amstrad can only reproduce the attributes and 15 colours at the same time as shown by the Spectrum by using Amstrad's 16 colour mode, mode 0. However, this has wider pixels (approx 2x1 ratio) and a lower horizontal resolution. If the CPC's mode 1 resolution is chosen, it is not possible because only 4 colours can be chosen.
- On the Amstrad the 6 raster interrupts allow palette colours to be changed allowing more than the theorical amount but this is also with limitations. This technique was commonly used in Speccy ports.
- Normally Spectrum graphics is stored in 2 colours, which means 8 pixels for each byte. In Amstrad mode 1, each byte defines 4 pixels. So for the same graphics you often need twice the RAM on the Amstrad. (This is a case where graphics without transparency are used). If transparency is used, then the amount of data can be the same.
- The Amstrad's screen size and position can be reprogrammed, the Spectrum's screen size and position is fixed. It is possible to program the Amstrad's screen to use the entire monitor display area (at the expensive of approx. 22K of video ram being used).
Sound
- Spectrum (128K model and later) and Amstrad both have an AY-3-8912 sound chip. (1.7Mhz clock for AY in spectrum, 1.0Mhz clock for AY in Amstrad).
- Spectrum 48K had a 1-bit beeper sound. Playing sounds through the beeper is very CPU intensive. The Amstrad doesn't have a beeper. The only way to simulate the beeper sound would be to convert it to AY sound.
Input
- Spectrum has multiple joystick standards. The common standards are Kempston, Sinclair and Cursor. Kempston was a common interface used on the Sinclair made Spectrum's. It plugged into the back of the machine and provided support for a single joystick. This type of joystick doesn't clash with the keyboard. The Sinclair standard is used on the Amstrad made Spectrums. These machines have two joystick ports. The Sinclair standard works by simulating keys pressed on the Spectrum keyboard. (Does the sinclair joystick cause keyboard clash?) All of these standard for the Spectrum supported the directions and 1 fire button. In comparison the Amstrad CPC models have a single joystick port which with a splitter cable can support two joysticks. The joysticks support the directions and up to 3 fire buttons on the CPC, but only 2 fire buttons on the later Plus machines. In addition using the joysticks and keyboard together on the Amstrad CPC causes keyboard clash where unwanted keys are pressed. Clash between joysticks and keys can be avoided with careful choice of keys. This clash was resolved on the Plus and can be resolved with diodes on the CPC joystick port. In general though, Amstrad games supported a single joystick, they didn't use key mappings that would avoid clash and many users didn't have these fixes so the games would suffer from keyboard clash. An example of this can be seen when playing two player Gauntlet where players could be fighting to move where they wanted to.
- The 48K spectrums had a rubber membrane keyboard, later versions had proper keys, and the Amstrad made Spectrum's have the best keyboards. The early Amstrad CPC464's and 664's had really good strong keyboards, comparable to those on the BBC Micro, whereas later ones were more flat and less good. Both Amstrad and Spectrum have a good selection of keys.
NOTE: Sinclair Research (the Spectrum's manufacturer) was acquired by Amstrad after the Spectrum 128K had been made.
Amstrad then improved the build quality and enhanced the Spectrum's design. The result was that the Spectrum +2, which was closer in looks and build to the CPC464/6128 (same kind of compact keyboard as CPC6128, but built-in "Datacorder"). The Spectrum +3 was also quite similar to the Amstrad CPC6128 because both had a internal 3" drive. So the Spectrum became closer in design to the CPC. However, the overall hardware of the Spectrum didn't change, the graphics were the same, the sound was the same, but those later Spectrum's had built in joysticks, built in cassette or disc, connections for printer etc, just like the CPC, but almost all of which the Amstrad had starting with the CPC464.
Disc drive
The Spectrum didn't have an official floppy disc interface so there were different interfaces. In Russia the Betadisk interface is common, this used a WD1793 disc controller and 3.5" discs. This interface is incompatible with the Amstrad's.
When Amstrad designed the +3, the used a similar disc interface to the Amstrad.
The Amstrad designed Spectrum +3 has the following in common with the CPC6128:
- same disc media (3")
- same disc controller (NEC765 compatible)
- the floppy controller is polled for data transfer
- Similar disc format (CP/M based)
However, the Spectrum+3 uses a different DOS than the Amstrad CPC6128. This means that the functions for reading/writing files are different on the Spectrum compared to the CPC.
The Spectrum's DOS is more powerful than the CPC's. It can read CPC discs, Spectrum +3 and PCW discs easily. In order for the Amstrad to read Spectrum and PCW discs, it needs to have a special XDPB (Expanded Disc Parameter Block) configuration installed.
The Spectrum +3's DOS is based on the disc functions in Locoscript the CPC's DOS is AMSDOS. The Spectrum's DOS was developed after the CPCs, so clearly they saw the weakness in the CPC's DOS design and improved it.
The Spectrum Technical wiki can be found here. This describes the Spectrum hardware in more depth:
http://scratchpad.wikia.com/wiki/ZX_Spectrum_technical_information
Consequences of a Spectrum Port
Input
The Spectrum has more joystick standards than the CPC, however reading the keyboard and joysticks and handling the input on the Spectrum is much simpler, takes less code and takes less CPU time than on the Amstrad.
On the Amstrad it is best to read the keyboard and joystick in one pass and store the data into a buffer which can then be queried later. Then read from this buffer when you need to check the inputs.
Disc Loading
The Spectrum +3's disc interface had a design that was close to the Amstrad CPC6128's. This meant that disc loading software that used the disc interface directly could be modified easily to be used on the CPC. There are disc versions of the Alkatraz, Hexagon and Speedlock loaders common to both the CPC and Spectrum.
However, the method for accessing the DOS is different.
The good thing is that both shared good disc interfaces, so a disc loading system on the Spectrum, if ported to the CPC would not be a bad thing.
Tape Loading
Both the Spectrum and Amstrad had a similar method for loading or saving on cassette. For both it is CPU intensive and for both the method of representing the 1 or 0 bits is the same.
Some CPC games used the original block loader which meant loading took much longer compared to Spectrum, some used the firmware headerless block loader (CAS READ) which was a bit faster, and some CPC games used a modified Spectrum tape loader (extracted from the Spectrum's ROM and modified for the Amstrad's hardware).
Sometimes the Spectrum loader was modified for the CPC without exact knowledge of how it worked, this resulted in some games with bad loaders that either didn't check for errors, or which didn't work in some circumstances. This lead to unreliable loading.
Loaders like this were used in a variety of games, not limited to Speccy Ports.
Two good loaders that appeared on both systems are Alkatraz and Speedlock. Both were reliable and fast.
The Amstrad's ROM loader was a bit better than the Spectrum's ROM loader because it had CRC error checking, compared to XOR based checksum and block based loading (so you could rewind and try a block again) compared to a single load.
Consequences for porting to CPC:
- If the loader was modified for CPC without good knowledge the loading would be unreliable. (e.g. errors are not detected, timings are bad, edge detection is dodgy).
- On the good side, the Spectrum utilised the border to indicate both the stage of loading (indicated by different colours used in the border) and the loading progress, so a modified loader for CPC would also indicate loading progress. If messages were turned off in the Amstrad ROM loader you didn't have any indication of loading progress.
Examples of loaders common to both Amstrad and Spectrum:
- Speedlock (commonly used by Ocean).
- Alkatraz (commonly used by US Gold).
Spectrum loader ported to Amstrad:
- Aliens (UK version, original release).
Colours
The Spectrum palette (15 colours, bright at bottom):
The Amstrad palette (27 colours):
A comparison of the palettes in CPC palette:
From the comparison you can see that the Amstrad can reproduce the Spectrum's colours well, and its additional colours can provide extra shades and some colours the Spectrum can't show (e.g. orange).
Consequences for porting to CPC:
- If the game was ported directly using only the Spectrum colours then the Amstrad version would have similar colours, when more appropiate colour's from it's palette could be used.
What they should do for CPC:
- Recolour the graphics using the Amstrad's palette to improve the look.
Colour Clash from the Cell based colouring
The cell based colouring used on the Spectrum has its disadvantages.When moving a sprite over a background, or a sprite over another sprite, and if both have colours you have to decide which colours take priority.
It is not possible to have all the colours together because of the colour limitation within each 8x8 cell.
This then means that the graphics with a lower priority then takes on the colour of the higher priority graphics.
If a sprite's colours takes priority, and it moves with pixel by pixel movement, as soon as it enters a new cell, the background will take on it's colours. The colour clash seems to extend furthur than the sprite. This is down to the 8x8 cell colouring.
The 6 raster interrupts on the CPC can be used to change the colours on the screen. You can redefine all the available colours, e.g. each interrupt you could re-program all the 4 available colours in mode 1. This can be done to increase the number of colours visible. However, while there are more visible colours, each region is still limited to the number of available colours (e.g. limited to 4 colours in mode 1).
If a sprite passes between two raster interrupt regions it will suffer from a form of colour clash, where the part in the new region takes the colours from that region, and the part in the old region remains in the colours from that region.
Various ports use the raster interrupts, but how they chose to use them differs.
Possible resolutions on Spectrum:
- Remove colour from the display so that background and sprites use the same colours, clash is eliminated but the game is monocolour..
- Move sprites in cell based movements. The colours still take priority but the clash is less of a problem.
- Add a black border around the sprites. Clash occurs, but because of the border it is not/less seen.
Consequences for porting to CPC:
- If colour priority, colour clash exists: CPC version has the colour clash simulated which is unnecessary.
- If 2 colours are used and colour clash eliminated: CPC version lacks colour, same as Spectrum
- If cell based movement is done, then CPC version has the same movement whereas it could be pixel perfect on CPC.
- If black border is used, CPC has the unnecessary black border.
- The CPC can't replicate the Spectrum's colour attribute system, this means a game converted to Amstrad's mode 1 has even less colours than the Spectrum version. The CPC version then has 4 colours, compared to up to 15 possible colours on the Spectrum.
What should be done on CPC:
- Recolour and redesign the graphics appropiately for the CPC in either mode 1 or mode 0.
- Use the Amstrad interrupts and change the colours multiple times each frame, this will give each region (between each interrupt) it's own colours increasing the number of colours on screen. Each region is 52 scanlines in height, and the whole screen in width. Note that the colours must be set for each region for each frame to maintain them, and that the pixels within each region are still limited to 4 colours in mode 1. The colour regions like this are ideal for having different colours for the HUD and for the main game area. This can be a CPU intensive technique.
Examples of colour clash ported to the CPC: (These examples show colour clash implemented on the CPC in the same way as the spectrum would show it)
- Bionic Commando
Examples of attribute based colour system ported to CPC:
- Badlands
Examples of games with little colour because attribute colours have been removed:
- Peter Pack Rat
Examples of using raster interrupts to increase colours:
- Pacmania and Black Tiger (main play area remains 2 colours)
- Strider 4 colours in game area, 4 colours in status panel.
- Super Wonder Boy (Monochrome background and monochrome sprites)
- Deflektor (main play area has one set of colours, status panel has another set)
Advantages of the cell based colouring
The Spectrum's cell based colouring has advantages.
Conveying state on a HUD
The state of a game play element on the HUD can be coloured accordingly. e.g. a bomb that is about to explode could change colour from white to red.
What should be done on CPC:
- If you have enough free palette entries, e.g. mode 0, then you can change the colour for the pen used to display the item in the palette. This is quick. However if you are using mode 1, then the number of palette entries is much more limited and you should draw the bomb in a different way. The consequence of this is that you may need to store additional graphics for this and it will take much longer to update the HUD than on the Spectrum.
General colouring
Since the background and foreground colour can be defined per cell then you can use all the Palette of the Spectrum at once.
What should be done on CPC:
- If you are using mode 0 then you are free to define the colours per pixel from the 16 colour palette. This is ok if the chunkier pixels can be used, not so good if there is detail in the graphics that needs to be retained.
- If you are using mode 1 then you will see less colour. You can set the colour palette for multiple regions on the screen, or you can use the 4 colour palette more creatively.
Sound
There is 1 sound source on 48K spectrums: its beeper, and 2 sources of sound on 128K spectrums: beeper and AY.
Beeper sound is simple. The spectrum has a speaker which you can turn on/off through a I/O port on the Spectrum's ULA. To make different sounds, you turn it on and off at different rates, all under control of the CPU. Speaker sound is CPU intensive because the timing is all done through the CPU and delay loops. The consequence on the Spectrum is that not many games have beeper music during the game, and those that do are often staccato like (e.g. Manic Miner) (the game takes some time to update, then some time for sound, and this repeats). If the sound was made for the Spectrum beeper, this would need to be converted to AY sound for the CPC, the result would not be exactly the same.
Sound written for the AY in the Spectrum can't be ported directly because it would be out of tune, this is down to the difference in master clock given to the AY (1.7Mhz on Spectrum, 1.0Mhz on Amstrad). The music would need to be altered. When this is done, the music is almost the same.
It is worth noting that mostly the 128K version of Spectrum games had AY tunes, because the 128K model of the Spectrum is when the AY was introduced.
Consequences for porting to CPC:
- No sound (if beeper only sound and it's not translated)
- Sound out of tune on CPC (if AY sound without some conversion)
- Sound is beeper like and staccato when it could be AY "native"
What they should do for the CPC:
- Compose the tune for CPC
- For AY sounds, convert the music/effects to the CPC's AY master clock so that it is in tune (the tune may loose some of it's accuracy if this is done, especially regarding the hardware envelopes and noise, and this means the sound will not be exactly the same, but is much more acceptable).
Examples of Spectrum Beeper sound converted to AY:
- Knightmare
- Last Ninja 2
- Super Hang On
Graphics
The Spectrum's graphics use 1 bit per pixel to define them. Each byte defines 8 pixels. The colour of each pixel is then defined by the attribute system.
The attribute "ram" define the background colour (where a bit is 0), a foreground colour (where a bit is 1), if the dark variant of the colours should be used, or if the colours should flash at a fixed rate.
If the background is a single colour, the sprites can be ORed on. If shading is to be used a mask is often stored with the pixels. The mask is used to remove or retain (depending on the mask type) pixels on the screen. The final result on the screen is the result of the mask then the sprite pixels.
On the Amstrad, the number of bits to define a pixel, the number of colours that can be used, and the width of the pixels is different for each mode.
- Mode 0 uses 4 bits for each pixel. Each byte defines 2 pixels. 16 colours can be used without restriction. Wide pixels. This is lower resolution than the spectrum.
- Mode 1 uses 2 bits for each pixel. Each byte defines 4 pixels. 4 colours can be used without restriction. Pixels the same size as the spectrum.
- Mode 2 uses 1 bit for each pixel. Each byte defines 8 pixels. 2 colours can be used without restrictions. Pixels are thinner than the spectrum. This is higher resolution.
Consequences:
- The pixel data and colours are stored in a different way than the CPC, so some conversion must be done before the graphics can be used. Either the graphics are remade, or often converted through some automatic process.
- There is a trade off between mode 1, keeping the same resolution as the Spectrum but having only 4 colours, or using mode 0, with half the horizontal resolution but 16 colours. The choice depends on the detail required in the graphics.
The following sections describe possible ways to handle the graphics on the Amstrad.
Techniques used for Graphics
Graphics with transparency
Storage
A common way to do this is on the Spectrum is to store 1 byte of mask, followed by 1 byte of pixel data, and to repeat this for the width of the sprite divided by 8. (Each byte representing a 8 pixel wide single line slice of the sprite).
If we consider a sprite which is 16x16. Each byte contains 8 pixels. For each line 2 bytes would be needed for pixel data and 2 bytes for mask. The total storage space required would be (2+2)*16 = 64 bytes.
If we consider mode 1 on the Amstrad, and we used the same representation, we could freely use 4 colours for the sprites. The Amstrad would also need 2 times the ram space to store the data, because in mode 1 there is half the number of pixels per byte. So, each byte contains 4 pixels. For each line 4 bytes would be needed for pixel data and 4 for mask: (4+4)*16 = 128 bytes.
However, if we sacrifice 1 colour, so we have 1 pen which is fully transparent and 3 for opaque sprite colours then we don't need the mask to be stored this way. The mask is common for all sprites and we could store this as a single 256 byte array. We would still need 4 bytes for the pixel data but the result now is: 4*16 = 64 bytes. The same weight as the Spectrum.
Mode 2 is generally not used for games on the Amstrad because of it's lack of colour. The pixels in this mode are half as wide as the Spectrum's. If the Spectrum data was used directly, which it could be, then the sprites would be half the width of the Spectrum's. In this case the data storage is the same as on the Spectrum. If we wanted to maintain the same resolution we would need to double up each pixel, effectively magnifying it in the width by 2. The result would be twice the size of the Spectrum data.
If mode 0 is used, we could either store a mask and byte, as for the Spectrum, or more commonly we use pen 0 for full transparent and leave the other 15 pens to define the sprite. We could then use half the number of pixels horizontally and lower resolution too. Each byte now contains 2 pixels. The sprite is 8x16 now = (8/2)*16 = 64 bytes. This the same storage size as for mode 1. If the size of the sprites were too small, then we would need to increase the size and the storage space.
Therefore, depending on the representation, this would determine how much ram is consumed on the Amstrad.
The best choices are to go for mode 1, and use a common mask table, with 3 colours per sprite. Or use mode 0, use a common mask table, with 15 colours per sprite. In both cases we use 256 bytes more than the Spectrum equivalent graphics.
So we show that some games could be recoloured and still use about the same amount of data as the Spectrum.
The above do not consider the size or speed of the code to clip or draw the sprite to the Amstrad's screen compared to the Spectrum code. The values above assume the Spectrum version is not storing pre-shifted sprites, or using a pre-shift table, and when drawing to pixel positions is shifting the pixel data during draw. The comparison becomes more complicated when these are involved.
Examples of games probably ported from the Spectrum (the use a Spectrum sized screen), in mode 1 and recoloured:
- HeroQuest
- Head Over Heels
- Shadow of the Beast
Examples of games where re colouring could have been done:
Graphics without transparency
Storage
Tiles are often used to define background graphics. These are opaque and don't need masks. The benefit here is that on CPC we can use all the colours in the palette, so for mode 1, all 4 colours can be used and in mode 0 all 16 colours can be used.
However on CPC generally non-transparent graphics will often take more storage space:
For the spectrum a 8x16 tile: (8/8)x16 = 16 bytes.
CPC mode 0: (4/2)x16 = 32 bytes
CPC mode 1: (8/4)x16 = 32 bytes
CPC mode 2: (8/8)x16 = 16 bytes
In mode 0 and mode 1, the tiles on the CPC will take twice as much space compared to the Spectrum. This will impact the memory used and depending on the number of tiles this is a significant memory impact.
Real-Time Conversion of Spectrum graphics
A common way to get the Speccy game running on the CPC and using the same storage space for the graphics was to perform real-time conversion from the Spectrum graphics.
- Graphics are stored on the Amstrad in the same format as on the Spectrum (2 colour, 1BPP with sprites having masks)
- Amstrad's mode 1 is used to maintain the same pixel resolution.
- A function converts the graphics on-demand, while the game is running, into the form that is displayed for the screen.
Needless to say, this enabled the port without the use of additional graphics artists. Therefore it would be cheaper and easier if a programmer was tasked with making a conversion alone.
Disadvantages:
- This process takes a lot more CPU power compared to the Spectrum version, because in addition to drawing and erasing the sprites, the pixel data must also be converted at the same time.
- This resulted in a significantly slower game.
- Amstrad version had less colours (often as little as 2 colours)
Advantages:
- Pixel data took less RAM than if it
Mode 0
When using mode 0, the screen can be reprogrammed to use the same sized screen as when using mode 1. However the resolution would be 128x192.
Using mode 0 has additional impact on the gameplay and game logic: - there are fewer pixels horizontally therefore both tiles and sprites are described by fewer pixels in width (although pixels are wider). Then any calculations that use pixel coordinates will need to be adjusted. This includes positioning sprites on the screen, sprite to sprite collision, converting sprite pixel coordinates to a tile map location, converting sprite pixel coordinates to a collision map location, determining if a sprite is moving off the right side of the screen.
If the original sprites were square on the Spectrum (e.g. 16x16), then with mode 0 they are 8x16, and we may need additional code for these calculations to handle that.
- movement per pixel will be faster horizontally than vertically. We can accept that, or if movement is meant to be the same in all directions then sprites may need to move faster vertically to ensure the movement is consistent. This then has an impact on gameplay because sprites will take less time to move over the screen and any time based goals may need to be adjusted to compensate and make the game goals consistent.
Using mode 1 is the route to a quicker port because there are less changes to the game code.
was stored in an Amstrad native form so the game could run on a 64K Ram machine (CPC464 and CPC664, 464Plus).
- If the colour attributes of the Spectrum were not simulated then the attribute data would not need to be stored for the CPC.
Mode 1
Amstrad's mode 1 is the closest mode which compares with the Spectrum's graphical abilities.
The pixels are almost the same size. The CPCs screen dimensions can be reprogrammed to re-create the Spectrum's 256x192 resolution.
However, the CPC has a different "pixel clock" compared to the Spectrum. The CPC was designed for a 320x200 display instead of a 256x192 display and in fact the the pixels are smaller on the screen when you compare mode 1 (the closest equivalent on the CPC) to the Spectrum.
So when the screen is reprogrammed you end up with a larger border on the CPC.
This (the larger border) led to the false argument that the CPC's resolution was inferior to the Spectrum one although the amount of pixels on the screen is EXACTLY the same.
Double buffering
TODO:
Screen dimensions
By setting CRTC register settings the Amstrad's screen dimensions can be reprogrammed to match the Spectrum's. The normal values used are R1=32, R6=24.
There are advantages to reprogramming the screen dimension to match the Spectrum's.
- The gameplay is similar because the player sees the same amount of map and there are the same number of enemies and they move in the same way.
- Graphics/levels would not need to be designed for a wider screen (e.g. in mode 1, 320 compared to 256)
- For a smaller screen less memory is used for the screen (16KB vs 12K). The memory used by the screen is the same regardless of CPC mode used. Unused areas can be used to store graphics, code and music. For a CPC screen at &c000, the unused areas are: c600-c7ff, ce00-cfff, d600-d7ff, de00-dfff, e600-e7ff, ee00-efff, f600-f7ff, fe00-ffff
Random numbers
Sometimes Spectrum games generate random numbers by reading from the Spectrum's ROM which is always readable in the memory range &0000-&3fff.
Consequences for CPC:
- There is often not enough memory to store the Spectrum ROM in the Amstrad's memory. If the range read could be determined then possible a smaller range could be stored.
- It would be wasteful to store part or all of the Spectrum's ROM in the memory
- It is not legal to store any part of the Spectrum's ROM in memory
Some games may use the 'R' register to generate a semi-random number.
Consequences for CPC:
- The R register value is based on the number and which instructions are executed. It is likely that the number of instructions between each read of the 'R' register could differ.
For both of these methods the consequences for CPC are:
- the numbers generated are likely to produce numbers which will differ compared to the Spectrum version and therefore the gameplay could be different. It may be subtle, it may be significant.
- reading a random number may take more CPU instructions to do this making it slightly slower.
Where possible the Spectrum and Amstrad versions should use the same random number generation based on a stored seed.
Memory arrangement
Spectrum game's often use the memory from &5500-&ffff.
Consequences for CPC: - If you are not using a custom disc or tape loader then during loading you will need to preserve the firmware memory regions. The easiest thing to do is start the game lower in memory (&0040), use the default screen at &c000-&ffff, and then once loaded copy data over these areas (provided you are not doing furthur loading/saving).
Original consequences (under construction)
The Amstrad CPC was one of the best 8-bit computers of its time in terms of graphical capabilities. But those advanced capabilities had an impact on CPU resources. As so many games were ported from the Spectrum, a machine with decidedly lower visual specs, the Amstrad range could hardly benefit from its main advantage while lack of optimization meant that aspects as scroll or playing area fared even worse than the Spectrum versions. You have to remember that Spectrum had less resources taken by Video RAM, so could handle animation or scrolling more easily. It is also a misconception to believe the screen was downsized in those games to gain processor resources. It was only done to use the Speccy graphics more easily, and we can doubt the code was (re-)designed so such a screen reduction would even gain CPU resources.
Interestingly, games in Mode 1 could have been good despite the lack of colours, if only those colours were used properly more often.
Most of them got their graphic totally unchanged, displaying some kind of colour attributes "artifacts", a tell-tale sign of a Speccy port.
On the other hand, as mentioned before, those games weren't always bad. Games with no need of scrolling and with re-coded graphics could actually be good.
Investigation into a Speccy Port
Arnoldemu attempted a Speccy Port in 2022-2023 and the result is 'Mayhem'. The documentation with this game has comparisons and describes the decisions made when making this conversion. You can read about the elements of this journey.
Lists of speccy ports
Note: these lists are by no means comprehensive, they just include the most high-profile releases.
- Mayhem - [[1]] A recent Speccy port to CPC and PCW done by a single person. Read the document to see the comparison, issues encountered, choices made, read about the journey.
Computer originals Hits
(most of them ended up being decent) :
- H.A.T.E Hostile All Terrain Encounter
- Highway encounter
- Lotus turbo Esprit challenge
- Fighting Warrior
- Vendetta
- Hard Drivin'
- Way of the Tiger
- Last Ninja2
- Myth, history in the making
- Saboteur I
- Saboteur II
- SWIV
- Shadow of the beast
The numerous CodeMaster or Hewson games are not listed. Many of them were cheap budget Speccy games to begin with, and were quite well ported or remained good...
Well known franchises
- Scooby Doo
- Thundercats.
- MASK 3 : Venom Strike Back
- Airwolf 2
- Batman: The Caped Crusader
Adult games
- Sabrina
- Samantha fox strip poker.
- Strip poker II
Movie Franchises
- Indianna Jones 3 action game.
- Back to the future 2 (half of the parts were Speccy Port)
- Big Trouble In Little China
Arcade hits
- R-Type
- Pac-Mania
- Salamander
- Dragon Breed
- Scramble Spirits
- Black Tiger - Black Tiger CPC-Spectrum Comparison
- Strider
- Bionic Commando
- Super Wonderboy
- Double Dragon 3
- Super Hang-On
- Enduro Racer
- Toobin'
- Xybots
- Pit fighter
- Cabal
- Street Fighter
- Karnov
- Dynasty Wars
- Gauntlet 3
- Midnight resistance
Best known speccy ports
All those games are frequently used in 8bit wars style videos and reviews, hence they have served as a counter-argument to the CPC's superior abilities. Those games were well known hits ported on pretty much all computers of their time and therefore constituted the very basis of comparison between most systems of the era.
- Shadow of the beast
- Myth, history in the making
- Gauntlet 3
- SWIV
- R-Type
- PacMania
- Salamander
- Dragon Breed
- Scramble Spirits
- Black Tiger
- Strider
- Bionic Commando
- SuperWonderboy
- Double Dragon3
- Super Hang-On
- Enduro Racer
- Toobin
- Xybots
- Pit fighter
- Cabal
- Last Ninja2
- Thundercats.
- Hard Drivin'
- Sabrina
- Samantha fox strip poker.
- Strip Poker II
- Airwolf 2
- Indianna Jones 3 action game.
- Back to the future 2
- Vendetta
The 3 levels of Speccy porting
Of course the level of porting could greatly depend on whatever strategy the programmers/graphists used to port the original Spectrum game.
- A monochrome game could remain monochrome or be recolored for the CPC, or only parts of it (only sprites or Tiles but not both - mostly only sprites.)
- A colored game with design-wise graphics (character based design) could be the exact same yet with even less colours.
- Or Tiles/sprites could simply be completely well re-done/re-drawn, even in Mode 0 sometimes.
Rushed and Lazy
The game is exactly as on the Spectrum, even displaying graphical artifacts as Colour attributes and/or monochrome display for the game's window but not always the HUD, which may even often feature extra colours thanks to Raster colour changes, yet this doesn't really help to see what happens on the game's window.
Also sprites may display Transparency/translucency with background's colour (=colour clash), a typical Spectrum "feature".
Probably achieved by using almost the exact Spectrum code and emulating the Spectrum attributes on the CPC.
Examples :
- PacMania
Typical example, yet it managed to be a nice game despite this. The title screen and HUD shows the color attributes and were almost completely unchanged, yet with less colours on screen than the Speccy version.
Ironically, the game manages to display 6 colours in the 4 colours Mode1 - yet the game's area remains completely monochromatic (coded in 1 bit) and colour attributes artifacts are still present.
- Black Tiger: Same as PacMania
- Super Hang On : graphics Transparency/translucency
- Enduro Racer : same as Super Hang On, even more displayed as Sprites more often cross the different colored parts of the screen (while jumping)
- Bionic Commando : there are even inverted/negative colored sprites
- Sabrina : same as Bionic commando
- Gauntlet 3 : HUD is properly recolored (3 shades) but in-game window is monochrome (1bit coded sprites and tiles)
- R-type : Monochrome background while sprites still are "coloured" as with Colour attributes, hence even featuring less colours than original Spectrum game, while the entire screen still displays more than the only 4 Mode1 colours...(HUD raster trick). This game was done in 3 weeks by only one man, who simply emulated the speccy stuff on CPC. Given that the Spectrum game was a great release the CPC port is not too bad.
An special mention must go for Mevlut "Speccy" Dinc, one of the worst offenders with nightmares as Big Trouble In Little China, Enduro Racer, Hammerfist, Knightmare, Last Ninja 2, Last Ninja 2 Remix, Prodigy, Super Hang-On and Time Machine.
Semi-lazy
Well redone graphically, but not always as would actually be needed.
Examples :
- HeroQuest: still has monochrome feeling (2 blue shades being used) while actually being properly 2 bit re-coded. Ditherings use 3-colour gradients instead of the Spectrum's 2, and the grey adds a feeling of more colour.
- Strider has recoloured sprites, displaying no attributes, but Backgrounds remains monochrome, and the game is sluggish (because the CPU must still convert 1bpp graphics into 2bpp), yet the HUD+Raster trick enable a 6 colours displayed on screen and the HUD looks good.
- Shadow of the Beast: No real 3-4 coloured ditherings or even additional colours thanks to dithering the 2 medium colours together in many graphics (exteriors or for many sprites), yet the square Spectrum attributes are not displayed, while the Spectrum version remains monochrome (in game window, not HUD) in order to simply avoid Colour clashes. Would have needed more development time and a real CPC version.
Good Job
Those games are often more to be seen as proper Cross-Dev.
Graphics, despite sharing a common ancestry, are well redone, and take into account the Amstrad power. Sometimes those games are not that well ported, yet their concept and gameplay are such that this is not that important: the game is simply too good to be annoyed by such detail as the use of Mode1, and they were still sufficiently re-done.
- Head Over Heels
- Deflektor
- Switchblade: the GX4000 cartridge version displays extra features such as large vertical ditherings in a lot of Red shades (sky) or PLUS Hardware sprites "patches" as extra coloured tiles. This is more than enough to get a properly coloured feeling.
Some Speccy ports "done right" may also use Mode 0 instead of Mode 1, hence being graphically fully CPC (yet tiles or sprites are still comparable in dimensions). The result may vary from awful (the code is not optimised enough for CPC) to great (a well optimised Z80 game management engine with a different and accurate/efficient graphic display engine). This can be seen in Space Gun: Mode 0 and even PLUS features, yet the attribute-designed-unmasked sprites remain, in a sluggish game.
Techniques used
Monochromatic playfield and Sprite Masks
Having a monochrome playfield on ZX Spectrum is a common way to have no colour clashes - simply because there are no colours to clash! Also, most of those games then had masked sprites. This meant that each set of sprites had another "sprite set" for the mask, being actually 2x1bpp (bit per pixel) sets of data.
Some games coders actually used this to get the Sprites coded in 2bpp and used one of the 4 inks in mode1 to be the mask. This then took up almsot no more RAM used by data than the original (concerning masked Graphics). As a result some of those speccy ports have sprites in another colour than the background, which is actually better in terms of playability/look.
An example of this is Super wonder boy which could have even used one more colour for the sprites, but didn't.
Needless to say, the Background Tiles and Letter fonts were still in 1bpp converted in real time so the CPU had no rest and such games weren't faster nor that much better looking.
On the other hand, some games, despite having such Masked sprite totaling 2bpp had absolutely no sprite re-code at all (although this could have easily been prevented). Black Tiger is such a case.
Nevertheless, those games had one advantage : the smooth movement of sprites.
Examples :
- Batman: The Caped Crusader
Decently ported, As it use the 2bpp for the sprites in full potential. The sprites use 3 colours and the background 2 colours, including colour the unused by sprites, this make a poor background but the differently coloured sprites enable a better visibility.
- Strider : like Batman: The Caped Crusader... sprites use 3 colours and background 2... the difference in used inks give the sprites some extra visibility.
Strider also features some raster effect to get the HUD with extra colours, yet this certainly slow down the game a bit..
- Super wonderboy (wonderboy2) : poor port... the sprites use only 2 colours while they could actually use 3 with no extra effort but some graphical job.
Yet compaired to spectrum version, the CPC version manage to have the sprite more visible thanks to their different ink.
Masked Backgrounds
Some (rare) games actually used a mask for the Bakcground tiles too. This explains why they could be fully recoded with no notable additional weight for the data. Such games are often Isometric games and are considered among the good speccy ports (or actual Cross-Dev).
Examples :
- Heroquest: the Background tiles are also in 3 colours. Yet there is a really poor use of the mask colour.
- Head over Heels: yet the colours are better used than in Heroquest. If you look carefully, there are 2 kind of "background" elements.
- Real non-masked Background (floor, walls) which use the full 4 colours,
- and masked elements such as Sprites, Doors, Platforms... which are 3 colours only.
Unmasked games and CPC colour clashes
This category includes some of the worse examples, since actual Spectrum deficiencies were ported to the CPC.
- Bionic Commando
- Enduro Racer
Attribute/Character based Sprites and Animation
The cell based colouring used on the Spectrum has it's disadvantages.
When moving a sprite over a background, or a sprite over another sprite, and if both have colours you have to decide which colours take priority.
It is not possible to have all the colours together because of the colour limitation within each 8x8 cell.
The problem then comes down to is that the graphics with a lower priority then takes the colour of the higher priority graphics.
Such games had no smooth movement of sprites. The sprite moved "character per character". As such the sprites are often unmasked, being not really more than "tile-mapped". This meant the sprites had to actually fill the character tile or there would be artifacts introduced for the unmasked character's corner.
This was a "good" other way to get rid of Attributes Clashes and having actual "colours" on ZX Spectrum. But some speccy ports were then emulating the attribute system, which can be quite bad because CPC in Mode1 has half the colours the Speccy has.
- R-Type : the background has a smooth scrolling while the sprites are fixed character grid based.
- Space gun: this game was even released for Amstrad PLUS... Although coming very late in the CPC era is not really good and was probably rushed to the release.
Yet the Character based engine enabled enormous sprites - but lacked smooth movement. Such a technique was actually used for quite a fair amount of Mode0 games. This is not "Speccy port" but it is good to to mention, as it was a common game design technique for both machines.
- AMC (Astro Marines corps) : speccy version has no attribute clashes and is great. Amstrad version is in Mode0, feature multiscroll effect and remains fast.
- Satan : this one is like R-Type, but the sprite layer is masked, so the game is monocolour on Spectrum. Still the Character system for the sprite has the advantage of giving good speed. The CPC version is fully in Mode0 and great, still the engine is clearly shared with speccy.
Rasters
A common cheat was to get some Raster interrupt colour change so you could argue that the game is actually displaying more than 4 colours on screen while being Mode1. This is only to mimic some sort or Raster based Colours attributes yet is actually not a clever move in some way as getting some raster interrupt may take lots of CPU cycles. Also, despite the game displaying more than the allowed colours on screen, the playing area was still monochrome. In the end, all this did was getting the game even slower.
On the other hand this could also be done right:
- Deflektor : Raster done right.
- Strider : Raster done right. (useless but good looking)
- Thundercats : (though there are more playing area colours)
- R-Type
- PacMania
- Black Tiger
Many (if not all) of those games can actually run faster just by getting rid of CPU-wasting rasters.
Providing a game had to deal with 1bpp to 2 bpp conversion, Software Sprites and Scrolling and complicated gameplay, adding some Raster interrupt to the equation is a really bad move and a good way to waste even more CPU time.
Amstrad interrupt positions
The following image shows where the Amstrad's interrupt positions are located relative to the screen. Here the CRTC Register values used are R1=32, R2=42, R6=24 and R7=30 and the colours are changed at the start of the interrupt.
To have different positions vertically you can change the value of R7 (and if the monitor will accept it R5) to move the screen up and down. For example Gryzor sets R7=29 to have a 1 char tall panel at the bottom in mode 1.
To change at later positions you can also use a software timing loop, or fill the time with other code to delay the colour change from a chosen interrupt position.
This image demonstrates that if you wish to use mode 1, and change palette colours for HUD and game area, then the graphics need to be arranged or re-sized so that the colour change positions are most optimal. For some games, the dimensions of the HUD or play area may not allow the palette to be changed easily.