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. LFE48: LDY #$00 TYA LFE4B: EOR ($5D),Y wait_for_DATA_HI_FE4D: BIT $DD00 BPL wait_for_DATA_HI_FE4D STA $DD01 INY EOR ($5D),Y wait_for_DATA_LO_FE58: BIT $DD00 BMI wait_for_DATA_LO_FE58 STA $DD01 ; put byte on the USER PORT INY 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 Einstein Message was sent through the cbm-hackers mailing list
Archive generated by hypermail pre-2.1.8.