[Coco] GIME DRAM address mappings

RETRO Innovations go4retro at go4retro.com
Sat Sep 30 12:06:44 EDT 2017


On 9/28/2017 10:10 PM, RETRO Innovations wrote:
>
> The quick answer is that bit 10 is stuck high or something, but I 
> don't see that on the logic analyzer.  And, no matter what multiple of 
> 512 I write to, the screen gets a copy within the 512 byte range of 
> the screen.  So, for example, if I wrote to 2048+148, a phantom write 
> goes to $494 (1024+148)  I have verified that if I write a 99 to 
> location 1504+512, I see the same 99 at location 1504 (low left of 
> screen memory)
>
> At first I thought the RAM was just limited to 512 bytes, but if I 
> write 99 to 1504+1024, 1504 has 99, but 1504+512 does not.
>
> And so, I continue to debug... :-(

And, now, I have found success! \o/

For reference, here is what happens:

  * Right in the middle of the high part of the E cycle (and right
    before Q goes low), one the respective *WE lines is pulled low, to
    signal to the DRAM which bank of RAM will receive a byte of data. 
    Essentially, *WE0 is low during a write to an even location, *WE1 is
    for odd addresses
  * At the same exact time, the *RAS (row address strobe) line goes low,
    latching the row address into the DRAM (the low part of the address,
    along with bit 4 of the MMU bank as the high bit)
  * ****BUT****, and this is what I was seeing but not comprehending,
    the *CAS line has not fallen, so the high partof the address is
    still showing the *OLD* address, the one just fetched (which is, as
    you can expect), the screen memory
  * Then, a bit later, *CAS falls, latching the high part of the
    address, while *WE is low.
  * Then, WE goes high again.

Thus, from the RAM's point of view:

  * read screen ram
  * ah, I see new data on address lines on 0-8 and a command to write data
  * Whoa!  It's 40nS later, and now I see new data on address lines
    9-17, so write the same data there as well, but I can't promise the
    old location got the data stored (my speed is 55nS, Mr. Designer)
  * Ah, 120nS later, *WE has been turned off, I will now read some data
    from the location I just wrote  (which is unneeded, but hurts nothing)
  * Repeat cycle

I kept wondering why I did not see a second write cycle, and why they 
were always doubled to the screen.  Luckily, the screen and low ram are 
in the same "bank" of 64kB in the MMU, and you cna see the screen, or it 
would have been hard to notice there was an issue for some time.

The fix (for those caring) was to gate *WE with *CAS.  Thus, the *WE 
line only becomes active once both parts of the address are latched to 
the SRAM.

I suspect my goof is not reading the DRAM specs, where it probably 
states that the the write won't commit until the CAS goes low, or 
something like that.

Jim





More information about the Coco mailing list