From: Spiro Trikaliotis (ml-cbmhackers_at_trikaliotis.net)
Date: 2004-08-25 12:26:56
Hello, * On Wed, Aug 25, 2004 at 10:23:19AM +0100 Christopher Phillips wrote: > On 27 Jul 2004, at 19:42, Groepaz wrote: > (and I just received last night!) You're lucky. I'm just receiving now. :-( > Next question - when working the job queue, is there any point doing a > SEEK ($B0) before a READ ($80)? Yes, there is a point in doing a seek before a read. When the job IRQ loop looks for the type of the code, it gets first to $F3B1, which is the seek routine. It gets there whenever the code is not $D0 (= EXECUTE), because every other command needs a seek before it. When it is executed, we come to the following code: .8:f3ec A5 45 LDA $45 ' get the job code (- $80) .8:f3ee C9 30 CMP #$30 ' is it seek? ($D0-$80) .8:f3f0 F0 1E BEQ $F410 ' yes, we're done ' Now, check the ID of the disc if it matches the stored ID .8:f3f2 A5 3E LDA $3E ' get drive number (always 0 with 1541) .8:f3f4 0A ASL A ' *2 .8:f3f5 A8 TAY ' .8:f3f6 B9 12 00 LDA $0012,Y' this is the "expected" ID1 of the disc .8:f3f9 C5 16 CMP $16 ' compare with the just read ID1 of the header .8:f3fb D0 1E BNE $F41B ' ID1 does not match, return error .8:f3fd B9 13 00 LDA $0013,Y' this is the "expected" ID2 of the disc .8:f400 C5 17 CMP $17 ' compare with the just read ID2 of the header .8:f402 D0 17 BNE $F41B ' ID1 does not match, return error .8:f404 4C 23 F4 JMP $F423 ' Now, check for READ code ... .8:f410 A5 16 LDA $16 ' get ID1 from disc .8:f412 85 12 STA $12 ' store as new ID1 .8:f414 A5 17 LDA $17 ' get ID2 from disc .8:f416 85 13 STA $13 ' store as new ID2 .8:f418 A9 01 LDA #$01 ' 00, OK, 00, 00 .8:f41a 2C .BYTE $2C ' BIT 16 bit .8:f41b A9 0B LDA #$0B ' 29, DISK ID MISMATCH .8:f41d 2C .BYTE $2C ' BIT 16 bit .8:f41e A9 09 LDA #$09 ' 27, WRITE ERROR .8:f420 4C 69 F9 JMP $F969 ' Output message and quita And the start of the read function is here: .8:f4ca C9 00 CMP #$00 ' is the job code $80? ($80-$80) .8:f4cc F0 03 BEQ $F4D1 ' yes, jump to READ code .8:f4ce 4C 6E F5 JMP $F56E ' now, test for WRITE .8:f4d1 20 0A F5 JSR $F50A ' ... ... So, we see the big difference: While a seek is executed nevertheless if we want to read, write, or do something else, there is a little bit functionality that is only inherent in a seek: It gets the ID of the disc and stores it into the "expected" ID (F410-F416). If this ID does not match for every other command (tested in F3F2-F402), then we get a 29, DISK ID MISMATCH error code. So, if there already was some activity on the disc and the disc was not changed in between, then a seek is not needed as it is executed nevertheless if needed. Anyway, if the disc might have changed or there was no activity before, then you have to do a seek. HTH, 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.