How did people program for Consoles with multiple CPUs? Announcing the arrival of Valued Associate #679: Cesar Manara Planned maintenance scheduled April 23, 2019 at 23:30 UTC (7:30pm US/Eastern)How were analytics gathered on software built for retrocomputing platforms?Did Apple not originally allow anyone to develop software for the Macintosh?How did software engineers test their code in 19xx?Did any major corporation ever successfully sue Microsoft for intellectual property theft?Instruction set support for multiplication with a constantBack in the late 1980s, how was commercial software for 8-bit home computers developed?Why did some CPUs use two Read/Write lines, and others just one?
How do I deal with an erroneously large refund?
Who can become a wight?
Why doesn't the university give past final exams' answers?
Why do C and C++ allow the expression (int) + 4*5?
Why aren't these two solutions equivalent? Combinatorics problem
Why not use the yoke to control yaw, as well as pitch and roll?
Are bags of holding fireproof?
Who's this lady in the war room?
How is an IPA symbol that lacks a name (e.g. ɲ) called?
Compiling and throwing simple dynamic exceptions at runtime for JVM
Converting a text document with special format to Pandas DataFrame
Is "ein Herz wie das meine" an antiquated or colloquial use of the possesive pronoun?
Raising a bilingual kid. When should we introduce the majority language?
What is the definining line between a helicopter and a drone a person can ride in?
How to ask rejected full-time candidates to apply to teach individual courses?
Should man-made satellites feature an intelligent inverted "cow catcher"?
Protagonist's race is hidden - should I reveal it?
Can a Wizard take the Magic Initiate feat and select spells from the Wizard list?
Is it OK if I do not take the receipt in Germany?
Can the van der Waals coefficients be negative in the van der Waals equation for real gases?
Are there any AGPL-style licences that require source code modifications to be public?
xkeyval -- read keys from file
What is the evidence that custom checks in Northern Ireland are going to result in violence?
2 sample t test for sample sizes - 30,000 and 150,000
How did people program for Consoles with multiple CPUs?
Announcing the arrival of Valued Associate #679: Cesar Manara
Planned maintenance scheduled April 23, 2019 at 23:30 UTC (7:30pm US/Eastern)How were analytics gathered on software built for retrocomputing platforms?Did Apple not originally allow anyone to develop software for the Macintosh?How did software engineers test their code in 19xx?Did any major corporation ever successfully sue Microsoft for intellectual property theft?Instruction set support for multiplication with a constantBack in the late 1980s, how was commercial software for 8-bit home computers developed?Why did some CPUs use two Read/Write lines, and others just one?
I'm specifically interested in the Sega Mega Drive/Genesis, which used a 68000 CPU, but also a Z80, mainly used to control the sound hardware and provide backward compatibility with the Master System.
There was also the Atari Jaguar, with it's Tom and Jerry RISC chips, the Sega Saturn, Featuring a total of eight processors, and probably a lot more.
When writing code (assuming ASM), how would these additional processors be used/accessed? Did one write regular 68000 code (even for sound) and the 68000 itself handled talking to the Z80? Did one need to write two different programs, one for each CPU? If yes, how did they communicate with each other? Or is memory mapping used, which would require a binary that has both 68000 and Z80 instructions in them, making sure that the Z80 code is in a specific memory region?
(This isn't about "regular" multi-processing, like on newer consoles with multi-core CPUs that are all the same. This is about consoles with a main CPU and specialized co-processors for e.g., Sound. Basically, the Sega Genesis, though I'm looking at building my own custom system, so I'm more interested in the basic principles.)
software-development cpu sega-genesis
|
show 1 more comment
I'm specifically interested in the Sega Mega Drive/Genesis, which used a 68000 CPU, but also a Z80, mainly used to control the sound hardware and provide backward compatibility with the Master System.
There was also the Atari Jaguar, with it's Tom and Jerry RISC chips, the Sega Saturn, Featuring a total of eight processors, and probably a lot more.
When writing code (assuming ASM), how would these additional processors be used/accessed? Did one write regular 68000 code (even for sound) and the 68000 itself handled talking to the Z80? Did one need to write two different programs, one for each CPU? If yes, how did they communicate with each other? Or is memory mapping used, which would require a binary that has both 68000 and Z80 instructions in them, making sure that the Z80 code is in a specific memory region?
(This isn't about "regular" multi-processing, like on newer consoles with multi-core CPUs that are all the same. This is about consoles with a main CPU and specialized co-processors for e.g., Sound. Basically, the Sega Genesis, though I'm looking at building my own custom system, so I'm more interested in the basic principles.)
software-development cpu sega-genesis
3
"CPU" probably isn't the best term here, though I'm not certain what the idiomatic one of the time is; while you could have a 68k and a Z80, it was also common to see more specialized support chips. The general concept is called asymmetric multiprocessing.
– chrylis
Mar 29 at 3:29
1
Although not a console, in the 1980's, the ATR8000 was a Z80 CP/M system that had an option of replacing the socketed Z80 with a socketed small board that contained a Z80 and a 8088 and 512KB of ram. The 8088 could run MSDOS 2.11, using the Z80 to interface with the peripherals, floppy disks, serial port, printer, and a second serial port used for the ASCII terminal. In CP/M mode, the 512KB of ram could be used as a ramdisk. There was an 8 bit bus used to communicate between the Z80 and the 8088.
– rcgldr
Mar 29 at 8:59
1
The ATR8000 could also be used with an 8 bit Atari 400/800/65XE/130XE, with the Atari used as a terminal, or with the ATR8000 used as a peripheral controller for the Atari, adding a 6502 cpu into the mix, although even if present, the 8088 would not be used if using the ATR8000 as an Atari controller.
– rcgldr
Mar 29 at 9:05
1
Fun fact: New Phones have a similar model; they have a set of several processors of varying power needs/capabilities (at face value, to keep lower-need tasks on lower-power cores to save battery life). Could be worth looking into those for a modern approach to the given problem. IIRC in phones' case, though, it's all handled by the OS.
– Delioth
Mar 29 at 20:58
2
@Delioth While new phones have multiple cores of different speed (i.e. big.LITTLE), they all run the exact same ISA and are completely coherent, so it is transparent to the programmer. The modern equivalent to this problem is more like GPU vs CPU computing.
– user71659
Mar 30 at 7:03
|
show 1 more comment
I'm specifically interested in the Sega Mega Drive/Genesis, which used a 68000 CPU, but also a Z80, mainly used to control the sound hardware and provide backward compatibility with the Master System.
There was also the Atari Jaguar, with it's Tom and Jerry RISC chips, the Sega Saturn, Featuring a total of eight processors, and probably a lot more.
When writing code (assuming ASM), how would these additional processors be used/accessed? Did one write regular 68000 code (even for sound) and the 68000 itself handled talking to the Z80? Did one need to write two different programs, one for each CPU? If yes, how did they communicate with each other? Or is memory mapping used, which would require a binary that has both 68000 and Z80 instructions in them, making sure that the Z80 code is in a specific memory region?
(This isn't about "regular" multi-processing, like on newer consoles with multi-core CPUs that are all the same. This is about consoles with a main CPU and specialized co-processors for e.g., Sound. Basically, the Sega Genesis, though I'm looking at building my own custom system, so I'm more interested in the basic principles.)
software-development cpu sega-genesis
I'm specifically interested in the Sega Mega Drive/Genesis, which used a 68000 CPU, but also a Z80, mainly used to control the sound hardware and provide backward compatibility with the Master System.
There was also the Atari Jaguar, with it's Tom and Jerry RISC chips, the Sega Saturn, Featuring a total of eight processors, and probably a lot more.
When writing code (assuming ASM), how would these additional processors be used/accessed? Did one write regular 68000 code (even for sound) and the 68000 itself handled talking to the Z80? Did one need to write two different programs, one for each CPU? If yes, how did they communicate with each other? Or is memory mapping used, which would require a binary that has both 68000 and Z80 instructions in them, making sure that the Z80 code is in a specific memory region?
(This isn't about "regular" multi-processing, like on newer consoles with multi-core CPUs that are all the same. This is about consoles with a main CPU and specialized co-processors for e.g., Sound. Basically, the Sega Genesis, though I'm looking at building my own custom system, so I'm more interested in the basic principles.)
software-development cpu sega-genesis
software-development cpu sega-genesis
asked Mar 29 at 0:49
Michael Stum♦Michael Stum
25336
25336
3
"CPU" probably isn't the best term here, though I'm not certain what the idiomatic one of the time is; while you could have a 68k and a Z80, it was also common to see more specialized support chips. The general concept is called asymmetric multiprocessing.
– chrylis
Mar 29 at 3:29
1
Although not a console, in the 1980's, the ATR8000 was a Z80 CP/M system that had an option of replacing the socketed Z80 with a socketed small board that contained a Z80 and a 8088 and 512KB of ram. The 8088 could run MSDOS 2.11, using the Z80 to interface with the peripherals, floppy disks, serial port, printer, and a second serial port used for the ASCII terminal. In CP/M mode, the 512KB of ram could be used as a ramdisk. There was an 8 bit bus used to communicate between the Z80 and the 8088.
– rcgldr
Mar 29 at 8:59
1
The ATR8000 could also be used with an 8 bit Atari 400/800/65XE/130XE, with the Atari used as a terminal, or with the ATR8000 used as a peripheral controller for the Atari, adding a 6502 cpu into the mix, although even if present, the 8088 would not be used if using the ATR8000 as an Atari controller.
– rcgldr
Mar 29 at 9:05
1
Fun fact: New Phones have a similar model; they have a set of several processors of varying power needs/capabilities (at face value, to keep lower-need tasks on lower-power cores to save battery life). Could be worth looking into those for a modern approach to the given problem. IIRC in phones' case, though, it's all handled by the OS.
– Delioth
Mar 29 at 20:58
2
@Delioth While new phones have multiple cores of different speed (i.e. big.LITTLE), they all run the exact same ISA and are completely coherent, so it is transparent to the programmer. The modern equivalent to this problem is more like GPU vs CPU computing.
– user71659
Mar 30 at 7:03
|
show 1 more comment
3
"CPU" probably isn't the best term here, though I'm not certain what the idiomatic one of the time is; while you could have a 68k and a Z80, it was also common to see more specialized support chips. The general concept is called asymmetric multiprocessing.
– chrylis
Mar 29 at 3:29
1
Although not a console, in the 1980's, the ATR8000 was a Z80 CP/M system that had an option of replacing the socketed Z80 with a socketed small board that contained a Z80 and a 8088 and 512KB of ram. The 8088 could run MSDOS 2.11, using the Z80 to interface with the peripherals, floppy disks, serial port, printer, and a second serial port used for the ASCII terminal. In CP/M mode, the 512KB of ram could be used as a ramdisk. There was an 8 bit bus used to communicate between the Z80 and the 8088.
– rcgldr
Mar 29 at 8:59
1
The ATR8000 could also be used with an 8 bit Atari 400/800/65XE/130XE, with the Atari used as a terminal, or with the ATR8000 used as a peripheral controller for the Atari, adding a 6502 cpu into the mix, although even if present, the 8088 would not be used if using the ATR8000 as an Atari controller.
– rcgldr
Mar 29 at 9:05
1
Fun fact: New Phones have a similar model; they have a set of several processors of varying power needs/capabilities (at face value, to keep lower-need tasks on lower-power cores to save battery life). Could be worth looking into those for a modern approach to the given problem. IIRC in phones' case, though, it's all handled by the OS.
– Delioth
Mar 29 at 20:58
2
@Delioth While new phones have multiple cores of different speed (i.e. big.LITTLE), they all run the exact same ISA and are completely coherent, so it is transparent to the programmer. The modern equivalent to this problem is more like GPU vs CPU computing.
– user71659
Mar 30 at 7:03
3
3
"CPU" probably isn't the best term here, though I'm not certain what the idiomatic one of the time is; while you could have a 68k and a Z80, it was also common to see more specialized support chips. The general concept is called asymmetric multiprocessing.
– chrylis
Mar 29 at 3:29
"CPU" probably isn't the best term here, though I'm not certain what the idiomatic one of the time is; while you could have a 68k and a Z80, it was also common to see more specialized support chips. The general concept is called asymmetric multiprocessing.
– chrylis
Mar 29 at 3:29
1
1
Although not a console, in the 1980's, the ATR8000 was a Z80 CP/M system that had an option of replacing the socketed Z80 with a socketed small board that contained a Z80 and a 8088 and 512KB of ram. The 8088 could run MSDOS 2.11, using the Z80 to interface with the peripherals, floppy disks, serial port, printer, and a second serial port used for the ASCII terminal. In CP/M mode, the 512KB of ram could be used as a ramdisk. There was an 8 bit bus used to communicate between the Z80 and the 8088.
– rcgldr
Mar 29 at 8:59
Although not a console, in the 1980's, the ATR8000 was a Z80 CP/M system that had an option of replacing the socketed Z80 with a socketed small board that contained a Z80 and a 8088 and 512KB of ram. The 8088 could run MSDOS 2.11, using the Z80 to interface with the peripherals, floppy disks, serial port, printer, and a second serial port used for the ASCII terminal. In CP/M mode, the 512KB of ram could be used as a ramdisk. There was an 8 bit bus used to communicate between the Z80 and the 8088.
– rcgldr
Mar 29 at 8:59
1
1
The ATR8000 could also be used with an 8 bit Atari 400/800/65XE/130XE, with the Atari used as a terminal, or with the ATR8000 used as a peripheral controller for the Atari, adding a 6502 cpu into the mix, although even if present, the 8088 would not be used if using the ATR8000 as an Atari controller.
– rcgldr
Mar 29 at 9:05
The ATR8000 could also be used with an 8 bit Atari 400/800/65XE/130XE, with the Atari used as a terminal, or with the ATR8000 used as a peripheral controller for the Atari, adding a 6502 cpu into the mix, although even if present, the 8088 would not be used if using the ATR8000 as an Atari controller.
– rcgldr
Mar 29 at 9:05
1
1
Fun fact: New Phones have a similar model; they have a set of several processors of varying power needs/capabilities (at face value, to keep lower-need tasks on lower-power cores to save battery life). Could be worth looking into those for a modern approach to the given problem. IIRC in phones' case, though, it's all handled by the OS.
– Delioth
Mar 29 at 20:58
Fun fact: New Phones have a similar model; they have a set of several processors of varying power needs/capabilities (at face value, to keep lower-need tasks on lower-power cores to save battery life). Could be worth looking into those for a modern approach to the given problem. IIRC in phones' case, though, it's all handled by the OS.
– Delioth
Mar 29 at 20:58
2
2
@Delioth While new phones have multiple cores of different speed (i.e. big.LITTLE), they all run the exact same ISA and are completely coherent, so it is transparent to the programmer. The modern equivalent to this problem is more like GPU vs CPU computing.
– user71659
Mar 30 at 7:03
@Delioth While new phones have multiple cores of different speed (i.e. big.LITTLE), they all run the exact same ISA and are completely coherent, so it is transparent to the programmer. The modern equivalent to this problem is more like GPU vs CPU computing.
– user71659
Mar 30 at 7:03
|
show 1 more comment
2 Answers
2
active
oldest
votes
It varies machine to machine; at the simplest end is the Neo Geo — its 68000 and Z80 have completely independent buses. You write one program for the 68000 and one for the Z80 and a single pipe of communication joins the two: post a byte to the Z80 and it'll trigger an NMI; the Z80 can read the command byte from a certain port and write a response to another, the 68000 can poll for the response. Neo Geo also supplied a sample set of Z80 code so you could just treat it as an advanced sound generator and not worry about the implementation if you prefer.
The Mega Drive has a more complicated system of shared buses; the Z80 has some memory on a private bus but the cartridge bus is a shared resource and I think the Z80 can also share some RAM. In that system the VDP can also act as a bus master so in net it's the Z80 getting access to the shared resources only when nobody else is attempting an access, the 68000 having priority only when it doesn't chose to start a VDP transfer, and the VDP having top priority for those periods when the 68000 has command it to do something.
If you ever hear scratchy sampled audio in a Mega Drive game then it's likely to be the Z80 trying to stream from the cartridge but frequently losing out on access slots.
The Saturn is like a more advanced Mega Drive except that the main CPUs have caches that can also be configured as small local memory pools. So if you're careful you can mostly keep them off the shared bus, gaining a significant performance benefit — Virtua Fighter 2 manages to keep most of the data for each player local to a single CPU for most of a frame, the laziest PlayStation ports do nothing in particular and either end up only using a single CPU or effectively doing so as a result of collection.
The Jaguar is supposed to work similarly to the Saturn but, quelle surprise, Atari rushed it to market so there's a significant bug affecting the RISC CPU's accesses to RAM when performing certain types of jump. That's how it often ends up being treated as a machine with a 68000 central processor when really the 68000 was intended just to be an intelligent scheduler.
So: across these systems one generally writes a different program for each processor, and either nominates one as a coordinator or uses a series of ad hoc means of point-to-point communication.
If it sounds hard to get right, that's because it is — programmers much prefer systems like the original PlayStation with a single CPU that just goes quickly.
Thank you for pointing out the Neo Geo, I found this article about the communication and this makes a lot of sense - basically two independent CPUs, with the 68k in the drivers seat, and literally different ROMs for each CPU. This looks more elegant than the shared memory approach that e.g., the C64 used, though I'm still doing research.
– Michael Stum♦
Mar 31 at 5:02
1
Yeah — if you check out the connector on a Neo Geo cartridge e.g. hit930.sakura.ne.jp/hitjapan/NeoGeoAES2/17011308023.jpg you'll notice it has two exposed PCBs rather than the usual one; that's because of the three independent buses in the system (the video system being the third) so there's a lot more than usual to connect.
– Tommy
Mar 31 at 18:46
add a comment |
There are two basic techniques: shared memory and dedicated communication ports.
Shared memory simply allows both processors to access the same memory bus. There are some issues, as the bus has to be shared and one CPU has to get priority so code must be designed to take unpredictable extra delays into account. The Megadrive is a good example of that, with the Z80 CPU losing cycles to the 68000 and the graphics subsystem.
It's actually a quite awkward system but they wanted the Z80 for backwards compatibility with Master System games. The system has a dedicated sound chip and the overhead for playing back music and sound effects is so low that there is little benefit to offloading it from the 68000.
The other issue with shared memory is that if one CPU is writing to it while the other is reading it, the reading CPU can end up with corrupt data. Therefore some kind of arbitration is needed, often based on atomic update operations.
Communication ports allow two CPUs on separate buses to communicate. Each CPU has its own bus, its own RAM, its own peripherals and a single I/O port that lets it communicate with the other CPU(s). The port usually allows commands and small amounts of data to be sent, often one way, from one CPU to another and an acknowledgement to be sent back. The Neo Geo is an example of a system that works that, or more common in the west was BBC Micro with its optional second processor via the "tube".
Software for each CPU was written and debugged separately.
add a comment |
Your Answer
StackExchange.ready(function()
var channelOptions =
tags: "".split(" "),
id: "648"
;
initTagRenderer("".split(" "), "".split(" "), channelOptions);
StackExchange.using("externalEditor", function()
// Have to fire editor after snippets, if snippets enabled
if (StackExchange.settings.snippets.snippetsEnabled)
StackExchange.using("snippets", function()
createEditor();
);
else
createEditor();
);
function createEditor()
StackExchange.prepareEditor(
heartbeatType: 'answer',
autoActivateHeartbeat: false,
convertImagesToLinks: false,
noModals: true,
showLowRepImageUploadWarning: true,
reputationToPostImages: null,
bindNavPrevention: true,
postfix: "",
imageUploader:
brandingHtml: "Powered by u003ca class="icon-imgur-white" href="https://imgur.com/"u003eu003c/au003e",
contentPolicyHtml: "User contributions licensed under u003ca href="https://creativecommons.org/licenses/by-sa/3.0/"u003ecc by-sa 3.0 with attribution requiredu003c/au003e u003ca href="https://stackoverflow.com/legal/content-policy"u003e(content policy)u003c/au003e",
allowUrls: true
,
noCode: true, onDemand: true,
discardSelector: ".discard-answer"
,immediatelyShowMarkdownHelp:true
);
);
Sign up or log in
StackExchange.ready(function ()
StackExchange.helpers.onClickDraftSave('#login-link');
);
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
StackExchange.ready(
function ()
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fretrocomputing.stackexchange.com%2fquestions%2f9458%2fhow-did-people-program-for-consoles-with-multiple-cpus%23new-answer', 'question_page');
);
Post as a guest
Required, but never shown
2 Answers
2
active
oldest
votes
2 Answers
2
active
oldest
votes
active
oldest
votes
active
oldest
votes
It varies machine to machine; at the simplest end is the Neo Geo — its 68000 and Z80 have completely independent buses. You write one program for the 68000 and one for the Z80 and a single pipe of communication joins the two: post a byte to the Z80 and it'll trigger an NMI; the Z80 can read the command byte from a certain port and write a response to another, the 68000 can poll for the response. Neo Geo also supplied a sample set of Z80 code so you could just treat it as an advanced sound generator and not worry about the implementation if you prefer.
The Mega Drive has a more complicated system of shared buses; the Z80 has some memory on a private bus but the cartridge bus is a shared resource and I think the Z80 can also share some RAM. In that system the VDP can also act as a bus master so in net it's the Z80 getting access to the shared resources only when nobody else is attempting an access, the 68000 having priority only when it doesn't chose to start a VDP transfer, and the VDP having top priority for those periods when the 68000 has command it to do something.
If you ever hear scratchy sampled audio in a Mega Drive game then it's likely to be the Z80 trying to stream from the cartridge but frequently losing out on access slots.
The Saturn is like a more advanced Mega Drive except that the main CPUs have caches that can also be configured as small local memory pools. So if you're careful you can mostly keep them off the shared bus, gaining a significant performance benefit — Virtua Fighter 2 manages to keep most of the data for each player local to a single CPU for most of a frame, the laziest PlayStation ports do nothing in particular and either end up only using a single CPU or effectively doing so as a result of collection.
The Jaguar is supposed to work similarly to the Saturn but, quelle surprise, Atari rushed it to market so there's a significant bug affecting the RISC CPU's accesses to RAM when performing certain types of jump. That's how it often ends up being treated as a machine with a 68000 central processor when really the 68000 was intended just to be an intelligent scheduler.
So: across these systems one generally writes a different program for each processor, and either nominates one as a coordinator or uses a series of ad hoc means of point-to-point communication.
If it sounds hard to get right, that's because it is — programmers much prefer systems like the original PlayStation with a single CPU that just goes quickly.
Thank you for pointing out the Neo Geo, I found this article about the communication and this makes a lot of sense - basically two independent CPUs, with the 68k in the drivers seat, and literally different ROMs for each CPU. This looks more elegant than the shared memory approach that e.g., the C64 used, though I'm still doing research.
– Michael Stum♦
Mar 31 at 5:02
1
Yeah — if you check out the connector on a Neo Geo cartridge e.g. hit930.sakura.ne.jp/hitjapan/NeoGeoAES2/17011308023.jpg you'll notice it has two exposed PCBs rather than the usual one; that's because of the three independent buses in the system (the video system being the third) so there's a lot more than usual to connect.
– Tommy
Mar 31 at 18:46
add a comment |
It varies machine to machine; at the simplest end is the Neo Geo — its 68000 and Z80 have completely independent buses. You write one program for the 68000 and one for the Z80 and a single pipe of communication joins the two: post a byte to the Z80 and it'll trigger an NMI; the Z80 can read the command byte from a certain port and write a response to another, the 68000 can poll for the response. Neo Geo also supplied a sample set of Z80 code so you could just treat it as an advanced sound generator and not worry about the implementation if you prefer.
The Mega Drive has a more complicated system of shared buses; the Z80 has some memory on a private bus but the cartridge bus is a shared resource and I think the Z80 can also share some RAM. In that system the VDP can also act as a bus master so in net it's the Z80 getting access to the shared resources only when nobody else is attempting an access, the 68000 having priority only when it doesn't chose to start a VDP transfer, and the VDP having top priority for those periods when the 68000 has command it to do something.
If you ever hear scratchy sampled audio in a Mega Drive game then it's likely to be the Z80 trying to stream from the cartridge but frequently losing out on access slots.
The Saturn is like a more advanced Mega Drive except that the main CPUs have caches that can also be configured as small local memory pools. So if you're careful you can mostly keep them off the shared bus, gaining a significant performance benefit — Virtua Fighter 2 manages to keep most of the data for each player local to a single CPU for most of a frame, the laziest PlayStation ports do nothing in particular and either end up only using a single CPU or effectively doing so as a result of collection.
The Jaguar is supposed to work similarly to the Saturn but, quelle surprise, Atari rushed it to market so there's a significant bug affecting the RISC CPU's accesses to RAM when performing certain types of jump. That's how it often ends up being treated as a machine with a 68000 central processor when really the 68000 was intended just to be an intelligent scheduler.
So: across these systems one generally writes a different program for each processor, and either nominates one as a coordinator or uses a series of ad hoc means of point-to-point communication.
If it sounds hard to get right, that's because it is — programmers much prefer systems like the original PlayStation with a single CPU that just goes quickly.
Thank you for pointing out the Neo Geo, I found this article about the communication and this makes a lot of sense - basically two independent CPUs, with the 68k in the drivers seat, and literally different ROMs for each CPU. This looks more elegant than the shared memory approach that e.g., the C64 used, though I'm still doing research.
– Michael Stum♦
Mar 31 at 5:02
1
Yeah — if you check out the connector on a Neo Geo cartridge e.g. hit930.sakura.ne.jp/hitjapan/NeoGeoAES2/17011308023.jpg you'll notice it has two exposed PCBs rather than the usual one; that's because of the three independent buses in the system (the video system being the third) so there's a lot more than usual to connect.
– Tommy
Mar 31 at 18:46
add a comment |
It varies machine to machine; at the simplest end is the Neo Geo — its 68000 and Z80 have completely independent buses. You write one program for the 68000 and one for the Z80 and a single pipe of communication joins the two: post a byte to the Z80 and it'll trigger an NMI; the Z80 can read the command byte from a certain port and write a response to another, the 68000 can poll for the response. Neo Geo also supplied a sample set of Z80 code so you could just treat it as an advanced sound generator and not worry about the implementation if you prefer.
The Mega Drive has a more complicated system of shared buses; the Z80 has some memory on a private bus but the cartridge bus is a shared resource and I think the Z80 can also share some RAM. In that system the VDP can also act as a bus master so in net it's the Z80 getting access to the shared resources only when nobody else is attempting an access, the 68000 having priority only when it doesn't chose to start a VDP transfer, and the VDP having top priority for those periods when the 68000 has command it to do something.
If you ever hear scratchy sampled audio in a Mega Drive game then it's likely to be the Z80 trying to stream from the cartridge but frequently losing out on access slots.
The Saturn is like a more advanced Mega Drive except that the main CPUs have caches that can also be configured as small local memory pools. So if you're careful you can mostly keep them off the shared bus, gaining a significant performance benefit — Virtua Fighter 2 manages to keep most of the data for each player local to a single CPU for most of a frame, the laziest PlayStation ports do nothing in particular and either end up only using a single CPU or effectively doing so as a result of collection.
The Jaguar is supposed to work similarly to the Saturn but, quelle surprise, Atari rushed it to market so there's a significant bug affecting the RISC CPU's accesses to RAM when performing certain types of jump. That's how it often ends up being treated as a machine with a 68000 central processor when really the 68000 was intended just to be an intelligent scheduler.
So: across these systems one generally writes a different program for each processor, and either nominates one as a coordinator or uses a series of ad hoc means of point-to-point communication.
If it sounds hard to get right, that's because it is — programmers much prefer systems like the original PlayStation with a single CPU that just goes quickly.
It varies machine to machine; at the simplest end is the Neo Geo — its 68000 and Z80 have completely independent buses. You write one program for the 68000 and one for the Z80 and a single pipe of communication joins the two: post a byte to the Z80 and it'll trigger an NMI; the Z80 can read the command byte from a certain port and write a response to another, the 68000 can poll for the response. Neo Geo also supplied a sample set of Z80 code so you could just treat it as an advanced sound generator and not worry about the implementation if you prefer.
The Mega Drive has a more complicated system of shared buses; the Z80 has some memory on a private bus but the cartridge bus is a shared resource and I think the Z80 can also share some RAM. In that system the VDP can also act as a bus master so in net it's the Z80 getting access to the shared resources only when nobody else is attempting an access, the 68000 having priority only when it doesn't chose to start a VDP transfer, and the VDP having top priority for those periods when the 68000 has command it to do something.
If you ever hear scratchy sampled audio in a Mega Drive game then it's likely to be the Z80 trying to stream from the cartridge but frequently losing out on access slots.
The Saturn is like a more advanced Mega Drive except that the main CPUs have caches that can also be configured as small local memory pools. So if you're careful you can mostly keep them off the shared bus, gaining a significant performance benefit — Virtua Fighter 2 manages to keep most of the data for each player local to a single CPU for most of a frame, the laziest PlayStation ports do nothing in particular and either end up only using a single CPU or effectively doing so as a result of collection.
The Jaguar is supposed to work similarly to the Saturn but, quelle surprise, Atari rushed it to market so there's a significant bug affecting the RISC CPU's accesses to RAM when performing certain types of jump. That's how it often ends up being treated as a machine with a 68000 central processor when really the 68000 was intended just to be an intelligent scheduler.
So: across these systems one generally writes a different program for each processor, and either nominates one as a coordinator or uses a series of ad hoc means of point-to-point communication.
If it sounds hard to get right, that's because it is — programmers much prefer systems like the original PlayStation with a single CPU that just goes quickly.
answered Mar 29 at 1:27
TommyTommy
16.3k14780
16.3k14780
Thank you for pointing out the Neo Geo, I found this article about the communication and this makes a lot of sense - basically two independent CPUs, with the 68k in the drivers seat, and literally different ROMs for each CPU. This looks more elegant than the shared memory approach that e.g., the C64 used, though I'm still doing research.
– Michael Stum♦
Mar 31 at 5:02
1
Yeah — if you check out the connector on a Neo Geo cartridge e.g. hit930.sakura.ne.jp/hitjapan/NeoGeoAES2/17011308023.jpg you'll notice it has two exposed PCBs rather than the usual one; that's because of the three independent buses in the system (the video system being the third) so there's a lot more than usual to connect.
– Tommy
Mar 31 at 18:46
add a comment |
Thank you for pointing out the Neo Geo, I found this article about the communication and this makes a lot of sense - basically two independent CPUs, with the 68k in the drivers seat, and literally different ROMs for each CPU. This looks more elegant than the shared memory approach that e.g., the C64 used, though I'm still doing research.
– Michael Stum♦
Mar 31 at 5:02
1
Yeah — if you check out the connector on a Neo Geo cartridge e.g. hit930.sakura.ne.jp/hitjapan/NeoGeoAES2/17011308023.jpg you'll notice it has two exposed PCBs rather than the usual one; that's because of the three independent buses in the system (the video system being the third) so there's a lot more than usual to connect.
– Tommy
Mar 31 at 18:46
Thank you for pointing out the Neo Geo, I found this article about the communication and this makes a lot of sense - basically two independent CPUs, with the 68k in the drivers seat, and literally different ROMs for each CPU. This looks more elegant than the shared memory approach that e.g., the C64 used, though I'm still doing research.
– Michael Stum♦
Mar 31 at 5:02
Thank you for pointing out the Neo Geo, I found this article about the communication and this makes a lot of sense - basically two independent CPUs, with the 68k in the drivers seat, and literally different ROMs for each CPU. This looks more elegant than the shared memory approach that e.g., the C64 used, though I'm still doing research.
– Michael Stum♦
Mar 31 at 5:02
1
1
Yeah — if you check out the connector on a Neo Geo cartridge e.g. hit930.sakura.ne.jp/hitjapan/NeoGeoAES2/17011308023.jpg you'll notice it has two exposed PCBs rather than the usual one; that's because of the three independent buses in the system (the video system being the third) so there's a lot more than usual to connect.
– Tommy
Mar 31 at 18:46
Yeah — if you check out the connector on a Neo Geo cartridge e.g. hit930.sakura.ne.jp/hitjapan/NeoGeoAES2/17011308023.jpg you'll notice it has two exposed PCBs rather than the usual one; that's because of the three independent buses in the system (the video system being the third) so there's a lot more than usual to connect.
– Tommy
Mar 31 at 18:46
add a comment |
There are two basic techniques: shared memory and dedicated communication ports.
Shared memory simply allows both processors to access the same memory bus. There are some issues, as the bus has to be shared and one CPU has to get priority so code must be designed to take unpredictable extra delays into account. The Megadrive is a good example of that, with the Z80 CPU losing cycles to the 68000 and the graphics subsystem.
It's actually a quite awkward system but they wanted the Z80 for backwards compatibility with Master System games. The system has a dedicated sound chip and the overhead for playing back music and sound effects is so low that there is little benefit to offloading it from the 68000.
The other issue with shared memory is that if one CPU is writing to it while the other is reading it, the reading CPU can end up with corrupt data. Therefore some kind of arbitration is needed, often based on atomic update operations.
Communication ports allow two CPUs on separate buses to communicate. Each CPU has its own bus, its own RAM, its own peripherals and a single I/O port that lets it communicate with the other CPU(s). The port usually allows commands and small amounts of data to be sent, often one way, from one CPU to another and an acknowledgement to be sent back. The Neo Geo is an example of a system that works that, or more common in the west was BBC Micro with its optional second processor via the "tube".
Software for each CPU was written and debugged separately.
add a comment |
There are two basic techniques: shared memory and dedicated communication ports.
Shared memory simply allows both processors to access the same memory bus. There are some issues, as the bus has to be shared and one CPU has to get priority so code must be designed to take unpredictable extra delays into account. The Megadrive is a good example of that, with the Z80 CPU losing cycles to the 68000 and the graphics subsystem.
It's actually a quite awkward system but they wanted the Z80 for backwards compatibility with Master System games. The system has a dedicated sound chip and the overhead for playing back music and sound effects is so low that there is little benefit to offloading it from the 68000.
The other issue with shared memory is that if one CPU is writing to it while the other is reading it, the reading CPU can end up with corrupt data. Therefore some kind of arbitration is needed, often based on atomic update operations.
Communication ports allow two CPUs on separate buses to communicate. Each CPU has its own bus, its own RAM, its own peripherals and a single I/O port that lets it communicate with the other CPU(s). The port usually allows commands and small amounts of data to be sent, often one way, from one CPU to another and an acknowledgement to be sent back. The Neo Geo is an example of a system that works that, or more common in the west was BBC Micro with its optional second processor via the "tube".
Software for each CPU was written and debugged separately.
add a comment |
There are two basic techniques: shared memory and dedicated communication ports.
Shared memory simply allows both processors to access the same memory bus. There are some issues, as the bus has to be shared and one CPU has to get priority so code must be designed to take unpredictable extra delays into account. The Megadrive is a good example of that, with the Z80 CPU losing cycles to the 68000 and the graphics subsystem.
It's actually a quite awkward system but they wanted the Z80 for backwards compatibility with Master System games. The system has a dedicated sound chip and the overhead for playing back music and sound effects is so low that there is little benefit to offloading it from the 68000.
The other issue with shared memory is that if one CPU is writing to it while the other is reading it, the reading CPU can end up with corrupt data. Therefore some kind of arbitration is needed, often based on atomic update operations.
Communication ports allow two CPUs on separate buses to communicate. Each CPU has its own bus, its own RAM, its own peripherals and a single I/O port that lets it communicate with the other CPU(s). The port usually allows commands and small amounts of data to be sent, often one way, from one CPU to another and an acknowledgement to be sent back. The Neo Geo is an example of a system that works that, or more common in the west was BBC Micro with its optional second processor via the "tube".
Software for each CPU was written and debugged separately.
There are two basic techniques: shared memory and dedicated communication ports.
Shared memory simply allows both processors to access the same memory bus. There are some issues, as the bus has to be shared and one CPU has to get priority so code must be designed to take unpredictable extra delays into account. The Megadrive is a good example of that, with the Z80 CPU losing cycles to the 68000 and the graphics subsystem.
It's actually a quite awkward system but they wanted the Z80 for backwards compatibility with Master System games. The system has a dedicated sound chip and the overhead for playing back music and sound effects is so low that there is little benefit to offloading it from the 68000.
The other issue with shared memory is that if one CPU is writing to it while the other is reading it, the reading CPU can end up with corrupt data. Therefore some kind of arbitration is needed, often based on atomic update operations.
Communication ports allow two CPUs on separate buses to communicate. Each CPU has its own bus, its own RAM, its own peripherals and a single I/O port that lets it communicate with the other CPU(s). The port usually allows commands and small amounts of data to be sent, often one way, from one CPU to another and an acknowledgement to be sent back. The Neo Geo is an example of a system that works that, or more common in the west was BBC Micro with its optional second processor via the "tube".
Software for each CPU was written and debugged separately.
answered Mar 29 at 9:52
useruser
4,281819
4,281819
add a comment |
add a comment |
Thanks for contributing an answer to Retrocomputing Stack Exchange!
- Please be sure to answer the question. Provide details and share your research!
But avoid …
- Asking for help, clarification, or responding to other answers.
- Making statements based on opinion; back them up with references or personal experience.
To learn more, see our tips on writing great answers.
Sign up or log in
StackExchange.ready(function ()
StackExchange.helpers.onClickDraftSave('#login-link');
);
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
StackExchange.ready(
function ()
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fretrocomputing.stackexchange.com%2fquestions%2f9458%2fhow-did-people-program-for-consoles-with-multiple-cpus%23new-answer', 'question_page');
);
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function ()
StackExchange.helpers.onClickDraftSave('#login-link');
);
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function ()
StackExchange.helpers.onClickDraftSave('#login-link');
);
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function ()
StackExchange.helpers.onClickDraftSave('#login-link');
);
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
3
"CPU" probably isn't the best term here, though I'm not certain what the idiomatic one of the time is; while you could have a 68k and a Z80, it was also common to see more specialized support chips. The general concept is called asymmetric multiprocessing.
– chrylis
Mar 29 at 3:29
1
Although not a console, in the 1980's, the ATR8000 was a Z80 CP/M system that had an option of replacing the socketed Z80 with a socketed small board that contained a Z80 and a 8088 and 512KB of ram. The 8088 could run MSDOS 2.11, using the Z80 to interface with the peripherals, floppy disks, serial port, printer, and a second serial port used for the ASCII terminal. In CP/M mode, the 512KB of ram could be used as a ramdisk. There was an 8 bit bus used to communicate between the Z80 and the 8088.
– rcgldr
Mar 29 at 8:59
1
The ATR8000 could also be used with an 8 bit Atari 400/800/65XE/130XE, with the Atari used as a terminal, or with the ATR8000 used as a peripheral controller for the Atari, adding a 6502 cpu into the mix, although even if present, the 8088 would not be used if using the ATR8000 as an Atari controller.
– rcgldr
Mar 29 at 9:05
1
Fun fact: New Phones have a similar model; they have a set of several processors of varying power needs/capabilities (at face value, to keep lower-need tasks on lower-power cores to save battery life). Could be worth looking into those for a modern approach to the given problem. IIRC in phones' case, though, it's all handled by the OS.
– Delioth
Mar 29 at 20:58
2
@Delioth While new phones have multiple cores of different speed (i.e. big.LITTLE), they all run the exact same ISA and are completely coherent, so it is transparent to the programmer. The modern equivalent to this problem is more like GPU vs CPU computing.
– user71659
Mar 30 at 7:03