It is worth noting that Spectrum ports also existed on [[MSX]], [[Enterprise]] 64/128, [[SAM Coupé]] and non-[[Z80]] [[Thomson]] MO/TO, [[Commodore 64|C64]].
==List of Spectrum Ports==
[[List of Speccy Ports]]
==How these should have looked==
* 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.
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.
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.
* Aliens (UK version, original release).
====Colours====
The Spectrum palette (15 colours, bright at bottom):
* 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. [[image:clash.png|right|thumb|Colour clashing in Knight Tyme. Observe the appearance of the character sprite as it merges with the background. (Background colours have priority here in this game.)]]
* [[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.
* 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.
* 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.
* 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 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).
* [[Pacmania]]
=====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.
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.
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.
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.
=====Mode 0=Double buffering====
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.TODO:
=====Screen dimensions=====
By setting CRTC register settings the Amstrad's screen dimensions can be reprogrammed to match the Spectrum's.
* 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 generated 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 not enough memory to store the Spectrum ROM in the Amstrad's memory therefore the same method can't be used. It may be possible to store a small part of the ROM depending on the memory range read by the program. It is possible to use the CPC's ROM when paged in but it's contents will differ so the random numbers will also differ and therefore the gameplay will be different (although maybe not enough to be an issue). An alternative on the CPC is to use a function to generate a random number - which may result in more CPU instructions compared to the Spectrum random number generation method - or worse read the R register which is not really random enough.
=====Double buffering=====* 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
TODO: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.
- 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.
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]] - [[https://www.cpc-power.com/index.php?page=detail&num=18884]] 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'''==
*Salamander
*Dragon Breed
*Scramble spiritSpirits
*[[Black Tiger]] - [[Black Tiger CPC-Spectrum Comparison]]
*Strider
*Salamander
*Dragon Breed
*Scramble spiritSpirits
*Black Tiger
*Strider
[[File:Interrupt_positions_spectrum_sized_screen.png|Screenshot of Amstrad interrupt positions showing where mode and colours can be changed quickly relative to pixel graphics. R1=32, R2=42, R6=24,R7=30]]
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.
[[Category: Games| ]][[Category:Programming]][[Category:Games Programming]][[Category:CrossDev]][[Category:CPC History]][[Category:Non CPC Computers]]