Re: drive-side routine
Date: 2005-10-04 00:49:15

On 2005-10-03, at 19:53, Spiro Trikaliotis wrote:
> The port A if the VIA ($1801) has a "handshaked mode", that is, if you
> read $1801, it shows the last contents of it when a specific line  
> (would
> have to look it up) was set/reset, or that line was last read. For
> details, you would need to look up a 6522 data sheet.

Hm, shall have to check this.

> BTW: An unbuffered access to port A is available at $180F.

That's another interesting thing. You mean the status of the port  
bits on $1801 is a kind of "latched" one and the same bits are real- 
time accessible at $180f? I only looked up the 1541 mappings and  
don't recall noticing any description of that. One more reason to  
look-up the datasheet.

> Now, the first EOR $1801 reads the last content AND clears the buffer
> for the next value.

Clears the "latch" you mean?

> This way, the next LDA $1801 clears A,


> but performs the handshake for
> the C64 side to input the next data.

The handshake seems to be done explicitly over the DATA line here,  
isn't it so?

> While the floppy perform the BVC *,
> the C64 has enough time to put the next value into the port which is
> read by the 1541 via the EOR $1801 again.

The weak point for me here is the LDA $1801. It happens immediately  
after sending the handshake, for which the 64 waits. What is then  
being read? Since 1541 is faster than the 64, chances are that the  
port is being read before 64 puts the next value on the port, am I  
right? Race condition comes to mind...

> Of course, this can be used in another way, too. The C64 does not need
> to specifically write 0 into the buffer. The important thing is  
> that the
> C64 has enough time between the LDA $1801 and the EOR $1801 to change
> the value

Yes - that's what I am suspecting that the timing might be enough  
here but just don't feel like understanding completely how it is done.

> - and it will, depending on how the VIA is programmed (have a
> look at the contents of $180C) - generate handshakes on CA2, which the
> C64 can recognize.

Good to learn something new every day :-) Actually I didn't know  
about the more advanced features of the VIA chip. In this case though  
I don't think those are used.

> Because there is some time in between the two commands, which  
> leaves the
> C64 enough time to alter the value.

Yes. The problem was twofold though. 1. I was expecting regular bytes  
here rather then EORed ones (after deeper digging I realised that I  
was looking at the wrong part of 64s code). 2. I didn't see the clear  
handshake or something to make me sure what's being read off the port  
with LDA. Oh, and 3. WTH so, rather than some clear LDA:STA as it  
does when transferring the other way.

> To be more precise, you would have to show us the C64 side.

     LDY #$00
     EOR ($5D),Y

     BIT $DD00
     BPL wait_for_DATA_HI_FE4D
     STA $DD01
     EOR ($5D),Y

     BIT $DD00
     BMI wait_for_DATA_LO_FE58
     STA $DD01    ; put byte on the USER PORT
     BNE LFE4B

So now I found that it also does the EORing. This at least makes some  
sense in terms how come it actually works at all. But still don't  
fully understand "how", and completely don't understand "why". Might  
have something to do with the 6522 peculiarities but will have to  
look for the datasheet to check what's more in there.

I have no special talents. I am only passionately curious. - Albert  

       Message was sent through the cbm-hackers mailing list

Archive generated by hypermail pre-2.1.8.