Re: DMA successes with Verilog

From: Mia Magnusson <mia_at_plea.se>
Date: Fri, 15 Jun 2018 00:56:58 +0200
Message-ID: <20180615005658.00005d66@plea.se>
Den Thu, 14 Jun 2018 23:47:12 +0100 skrev smf <smf@null.net>:
> 
> On 14/06/2018 22:29, Mia Magnusson wrote:
> >
> > Why does the badlines work while you supposedly cant DMA any time
> > you want? (Assuming DMA is synchronised to the clock)?
> Supposedly this
> 
> https://groups.google.com/d/msg/comp.sys.cbm/wdVBsz16qLw/CcxIRuZF8xgJ
> 
>  > Pull the DMA line low (pin 13 on the expansion port), then the 6510
>  > puts it's bus lines into a high impedance state, no need to worry
>  > about the 6510 executing anything!
> 
> But think twice before pulling down DMA. The C64's memory management
> system is well designed for non-external-DMA operation, but if using
> external DMA it isn't 100% bug free!
> 
> The problem is the handling of the three phi2 cycles after the 6510's
> READY input is pulled down. In read mode the NMOS6510/8500 will stop
> immediately, in write mode it will stop after the last write cycle,
> but not without setting its address lines to the next address!
> 
> No problem if the next address is a RAM/ROM location, but big problem
> if this address refers to an IO chip, especially an interrupt flag
> register. In worst case this register is read 3 times by the frozen
> 6510 and 1 time after the DMA when the 6510 fetches the data.
> 
> To avoid any problems with this IO insecurity the C64 developers used
> a brilliant but ugly hack: They advised the PLA to redirect any IO
> read accesses to the internal RAM regardless of $01 in these 3 cycles!
> 
> But the PLA hasn't the ability to count 3 cycles (it's a dump logic
> array), so they implemented this protection for the VIC's DMA only.
> There's a simple way to detect these 3 cycles - just when R/-W is
> high, BA is low and AEC is high. That's the only reason why BA is
> connected to the PLA.
> 
> So external DMA hasn't such protection and if you pull down DMA just
> before the 6510 wants to read something from an IFR the IFR is read
> before and after DMA. For 'normal' applications this may never be a
> problem, but if you want the C64 to do highly sophisticated interrupt
> stuff combined with external DMA you will risk a systematic failure.
> 
> This is a brain dead design failure of the C64. Almost so brain dead
> like the 6502/10's failure to forget the BRK opcode jump when IRQ/NMI
> goes down executing the first few cycles of BRK.
> 
> MfG Andreas

Thanks, now I understand the problem!

-- 
(\_/) Copy the bunny to your mails to help
(O.o) him achieve world domination.
(> <) Come join the dark side.
/_|_\ We have cookies.
Received on 2018-06-15 01:02:29

Archive generated by hypermail 2.2.0.