ruud.baltissen_at_apg.nl
Date: 2008-03-07 11:59:02
Hallo allemaal, Trying to understand/optimize some of the original source code I ran into this piece of code located at $F7D9: J_F7D9 pla cmp #$AF bne A_F7E4 jsr P_FB64 ; $FB64 cli lda #$93 A_F7E4 pha rts I ran into some code before where values were pushed to the stack and pulled off again. But it is the first time I see the "PHA RTS" combination in Commodore code. I know that the IBM XT uses this trick to change the return address of a subroutine as well so the phenomene itself isn't unfamiliar to me. But going backwards in the code I expected to find another PHA but instead I ran into the above. IMHO this code checks were the subroutine is called from and calls $FB64 if the return address is $??AF+1. The above code is only jumped to from a routine found at $EF5F: ;** Mark block as free FreeSector ; [EF5F] jsr GetBitBAM ; get state of bit for sector in BAM ; ==> Jiffydos bne A_EF85 ....... inc NDBH,X ; increment number of blocks hi A_EF85 jmp J_F7D9 ; $EF85 , $F7D9 ; Jiffydos <== FreeSector on its turn is only called at three places: ;** Erase file DelSectorChain ; [C87D] jsr FreeSector ; free block in BAM jsr ReadSeqFile jsr GetBufNumBAM ; get buffer number in BAM lda BUF0CH1zp,X cmp #$FF ; buffer not used? beq J_C894 ; yes, -> lda WBAM ora #$40 sta WBAM J_C894 lda #$00 jsr SetBufPointer3 ; buffer pointer to zero jsr RdNxtBlock2 ; get track sta TRACK jsr RdNxtBlock2 ; get sector sta SECTOR lda TRACK ; track number bne B_C8AD ; not equal to zero jsr WriteBam ; write BAM jmp CloseChannel ; close channel B_C8AD jsr FreeSector ; free block in BAM jsr RdNxtBlock ; read next block jmp J_C894 ; and continue and ;** B-F block free E_CCF5 jsr P_CDF5 ; get track, sector and drive number jsr FreeSector ; free block jmp Out_Err_Msg ; done, prepare error message The call at $C8AD is obviously the candidate were the code at $F7D9 is meant for. So instead of returning to $C8B0 the CPU returns to $C894. But what I don't understand is: wouldn't it have been much more simple by replacing "jsr RdNxtBlock" by "jmp J_C894" or NOPs? More weird, if "jsr RdNxtBlock" is skipped, where is the next block read? Not reading the next block means the contents of the buffer isn't changed and the routine stays in an eternal loop. But I haven't seen my drive acting like this so my argument is wrong. But again: where? If you wonder what the changes are in FreeSector, two bytes have been removed so the "jmp J_F7D9" fits on the place of the original RTS. Also weird, I discovered this code only yesterday. So it can be found as-is in my code for 1541IDE. But remember, I removed quite some obselete code and the above routines are all found at other places. And yet I didn't experience any problem. Comment is more then welcome! -- ___ / __|__ / / |_/ Groetjes, Ruud \ \__|_\ \___| URL: Ruud.C64.org APG NV te Heerlen is ingeschreven in het handelsregister Limburg onder nummer 14099617. Message was sent through the cbm-hackers mailing list
Archive generated by hypermail pre-2.1.8.