From: Spiro Trikaliotis (ml-cbmhackers_at_trikaliotis.net)
Date: 2004-09-09 19:24:12
Hello,
* On Thu, Sep 09, 2004 at 10:53:46AM +0200 Baltissen, GJPAA (Ruud) wrote:
> Having had some good help from Spiro I thought it was time to shift my
> brain into a higher gear. And I got this: M-R and M-W both have an
> option to tell how many bytes I want to read/write. The question is if
> the last byte is sent with an active EOI but that is something that
> can be tested quite easy.
From my understanding: Yes, it should be sent with an EOI.
> But the docs state that one can only read from 1 up to 255 bytes. I
> need to read 256. I could try if 0 is translated as 256 otherwise I
> have to do it in two batches.
I think: No, a zero should not (!) be interpreted as a 256.
The memory (M-xxx) commands start at $CAF8, after the "M" (which is
stored at $0200) has already been recognized
' The command can be found at $0200-$0229
.8:caf8 AD 01 02 LDA $0201 ' Check if the 2nd char is a '-'
.8:cafb C9 2D CMP #$2D
.8:cafd D0 4C BNE $CB4B ' No, output 31,SYNTAX ERROR
.8:caff AD 03 02 LDA $0203 ' Now, store low address at $6F
.8:cb02 85 6F STA $6F
.8:cb04 AD 04 02 LDA $0204 ' ... and high address at $70
.8:cb07 85 70 STA $70
.8:cb09 A0 00 LDY #$00
.8:cb0b AD 02 02 LDA $0202 ' Which command do we have?
.8:cb0e C9 52 CMP #$52 ' 'R'?
.8:cb10 F0 0E BEQ $CB20 ' Yes, execute M-R
.8:cb12 20 58 F2 JSR $F258 ' This is just a RTS
.8:cb15 C9 57 CMP #$57 ' 'W'?
.8:cb17 F0 37 BEQ $CB50 ' Yes, execute M-W
.8:cb19 C9 45 CMP #$45 ' 'E'?
.8:cb1b D0 2E BNE $CB4B ' No, output 31,SYNTAX ERROR
.8:cb1d 6C 6F 00 JMP ($006F) ' Execute at the given address
M-R starts at $CB20:
.8:cb20 B1 6F LDA ($6F),Y ' Get 1st byte ...
.8:cb22 85 85 STA $85 ' ... and store it at $85
.8:cb24 AD 74 02 LDA $0274 ' Get length of command string
.8:cb27 C9 06 CMP #$06 ' less than 6?
.8:cb29 90 1A BCC $CB45 ' yes, jump: Output just 1 byte
.8:cb2b AE 05 02 LDX $0205 ' Get number of bytes to read
.8:cb2e CA DEX ' subtract 1
.8:cb2f F0 14 BEQ $CB45 ' if it was 1, jump: Output just that 1 byte
.8:cb31 8A TXA
' Now, add the (number of bytes - 1) to the start of the output
' area
.8:cb32 18 CLC
.8:cb33 65 6F ADC $6F ' Now, A contains the pointer to the
' last byte to be read
.8:cb35 E6 6F INC $6F ' start at one byte higher than given
' remember: We already stored the 1st
' byte in $85!
.8:cb37 8D 49 02 STA $0249 ' remember the last byte to be read
.8:cb3a A5 6F LDA $6F ' now, store the start at $A5/$A6
.8:cb3c 85 A5 STA $A5 ' $A5/$A6 is the address of the error buffer!
.8:cb3e A5 70 LDA $70
.8:cb40 85 A6 STA $A6
.8:cb42 4C 43 D4 JMP $D443 ' Output the buffer
' From here, we output just the one byte given (in $85)
.8:cb45 20 EB D0 JSR $D0EB
.8:cb48 4C 3A D4 JMP $D43A
.8:cb4b A9 31 LDA #$31 ' Output 31,SYNTAX ERROR
.8:cb4d 4C C8 C1 JMP $C1C8
(8:$cb50)
Interestingly, you see that you cannot cross a page boundary with M-R!
Thus, M-R starting at $02FF with length 2 will give the bytes at address
$02FF and $0200, respectively!
> More worrying is the fact that I only can write up to 34 byte. Is the
> computer to blame or the drive?
Surely, it is the drive. $0200-$0229 is the input buffer. Thus, the
complete M-W command has to fit inside of the buffer:
$0200-$0229 42 byte buffer
M-Wxyz is 6 bytes - 6 byte
---------
36 bytes
Now, I'm not sure how the difference of 2 bytes is determined. It could
be related to a trailing CR and Null-Byte, but I'm not sure.
BTW: The M-W command is rather simple:
.8:cb50 B9 06 02 LDA $0206,Y ' get byte
.8:cb53 91 6F STA ($6F),Y ' store at destination
.8:cb55 C8 INY
.8:cb56 CC 05 02 CPY $0205 ' have we reached the count?
.8:cb59 90 F5 BCC $CB50 ' no, continue
.8:cb5b 60 RTS
Thinking about what I already commented here on the drive's code, I ask
myself if it isn't time for a 1541 ROM Disassembly project? ;-)
Regards,
Spiro.
--
Spiro R. Trikaliotis
http://www.trikaliotis.net/
Message was sent through the cbm-hackers mailing list
Archive generated by hypermail pre-2.1.8.