Ruud_at_baltissen.org
Date: 2006-05-14 20:56:29
Hallo Spiro,
> My bet: You forgot point 2.
My first thought was, you win the bet. But unfortunately for both of us,
you don't.
> Anyway, the write routine ($F56E) goes as follows:
The NEW command starts at $EE0D.
At $EE3D you find the 'FormatFloppy' routine.
At $EE40 a subroutine at $F005 is called.
At $F005 a subroutine at $EF3A is called.
At $EF3E you find the 'ReadBAM' routine [F0DF]. This routine does some
things and at $F107 it jumps to $D586. There the code $80 is given to read
a sector. At $D599 the routine is waiting until the job is finished. And it
is the IRQ routine that should handle this job.
So there is a read before the actual write first. And second, the $90 code
for writing is inserted by the same routine that inserted the read code in
the job table.
I started looking for the part that does the actual reading and that part
starts at $F4CA. So I started to look for that part that jumps, branches or
whatever to this address and ended up with the following piece of code
which is a part of the IRQ routine.
J_F423 lda #$7F
sta CSECT
lda HDRSEC
clc
adc #$02
cmp SECCNT
bcc B_F432
sbc SECCNT
B_F432 sta NEXTS
ldx #$05
stx JOBN
ldx #$FF [3]
B_F43A jsr InitPntr2Buf ; set buffer pointer for disk controller
bpl B_F483
sta WORK
and #$01
cmp CURDRV
bne B_F483
ldy #$00
lda (HDRPNT),Y
cmp TRACC
bne B_F483
lda JOB ; command code
cmp #$60
beq B_F461
ldy #$01
sec
lda (HDRPNT),Y
sbc NEXTS
bpl B_F461
clc
adc SECCNT
B_F461 cmp CSECT
bcs B_F483
pha
lda JOB
beq B_F47E
pla
cmp #$09
bcc B_F483
cmp #$0C
bcs B_F483
B_F473 sta CSECT
lda JOBN
tax
adc #$03
sta BUFPNT+1
bne B_F483
B_F47E pla
cmp #$06
bcc B_F473
B_F483 dec JOBN
bpl B_F43A [1]
txa [2]
bpl B_F48D
jmp LoopDiskCntrl ; to job loop
B_F48D stx JOBN
jsr InitPntr2Buf ; get buffer number
lda JOB ; command code
jmp J_F4CA ; continue checking
The part that leads to $F4CA is only accessed when JOBN = $FF (see [1]) and
0<=X<128. The routine InitPntr2Buf at $F43A puts the job code in A. The
problem in my case is that the jobcode $80 is found when JOBN = 4. So the
BPL at [2] is taken.
When JOBN = 0 nothing is found and X is filled with $FF (see [3]). So at
[2] the Negative flag is set and the BPL following TXA is not taken.
So at the end nothing is done and at the next interrupt everything starts
over again. Question: why is the $80 code placed in the table at place 4
and not 0? This is what I'm going to find out now. But I first wanted to
share these findings first. (and also hoping that the above triggers a bell
or an AHA-Erlebnis (don't know the English word, don't even know the Dutch
one))
--
___
/ __|__
/ / |_/ Groetjes, Ruud
\ \__|_\
\___| http://Ruud.C64.org
Message was sent through the cbm-hackers mailing list
Archive generated by hypermail pre-2.1.8.