The Commodore 64/128 RAM Expansion Units used a DMA controller to move data between the REU's RAM and system RAM (or I/O space). One would set the addreses, length and direction for the transfer (or verify) operation and trigger it; the CPU would then be "paused" while the DMA controller took over the bus to do the transfer, with the CPU resuming when the transfer was complete. (The REU DMA unit would also handle the situation where DMA had to be paused so the VIC-II video chip could access memory during what were normally "CPU" memory cycles.)
I'm guessing, based on the schematics in the C64/C64C Service
Manual, that this worked something along the lines of the
DMA controller asserting D̅M̅A̅
on the cartridge port, which will bring
the CPU's RDY
("pause CPU") and CAEC
(CPU "address enable
control," tristating the address/data buses and R/W̅
) lines low when
the VIC-II is asserting BA
("bus available," also on the cartridge
port) and its AEC
line, at which point the DMA controller could do
its thing (pausing when the VIC-II needs the bus) until completion,
then releasing D̅M̅A̅
.
Does anybody know the exact details and timings of how this worked, or have a reference to documentation describing this?
digraph '/ 773
.) My notes on this give some further info and discuss various options for NOT. It works pretty well for me on a broad range of platforms (Android being the notable exception), and I like that it matches what I see all the time in data sheets, though of course Raffzahn never misses the chance to tell me I'm wrong about both of these points.