diff --git a/libsrc/atari/diopncls.s b/libsrc/atari/diopncls.s index 8995e79e6..09398b9ac 100644 --- a/libsrc/atari/diopncls.s +++ b/libsrc/atari/diopncls.s @@ -16,7 +16,7 @@ .export sectsizetab .import __oserror, __sio_call, _dio_read .import pushax, addysp, subysp - .importzp ptr2, tmp1, sp + .importzp ptr2, sp .include "atari.inc" @@ -27,34 +27,7 @@ sectsizetab: .code - -.proc _dio_open - - cmp #NUMDRVS ; valid drive id? - bcs _inv_drive - tay ; drive # - asl a ; make index from drive id - asl a - tax - lda #128 ; preset sectsize, will be overridden by query_sectorsize - sta sectsizetab+sst_sectsize,x - sta sectsizetab+sst_flag,x ; set flag that drive is "open" - lda #0 - sta sectsizetab+sst_sectsize+1,x - sta __oserror ; success - tya - sta sectsizetab+sst_driveno,x - stx tmp1 - lda #sectsizetab - adc #0 - tax - lda tmp1 - jmp query_sectorsize ; query drive for current sector size -; rts +; code for _dio_open _inv_drive: lda #NONDEV ; non-existent device @@ -63,80 +36,80 @@ _inv_drive: tax rts ; return NULL -.endproc +_dio_open: -.proc _dio_close - - sta ptr2 - stx ptr2+1 - lda #0 - ldy #sst_flag - sta (ptr2),y - sta __oserror ; success + cmp #NUMDRVS ; valid drive id? + bcs _inv_drive + tay ; drive # + asl a ; make index from drive id + asl a tax - rts ; return no error - -.endproc + lda #128 ; preset sectsize + sta sectsizetab+sst_sectsize,x + sta sectsizetab+sst_flag,x ; set flag that drive is "open" + lda #0 + sta sectsizetab+sst_sectsize+1,x + sta __oserror ; success + tya + sta sectsizetab+sst_driveno,x + stx ptr2 + lda #sectsizetab + adc #0 + tax + stx ptr2+1 ; ptr2: pointer to sectsizetab entry ; query drive for current sector size ; procedure: -; - read sector #4 (SIO command $54) to update drive status -; read length is 128 bytes, buffer is below the stack pointer, -; sector data is ignored -; command status is ignored, we will get an error with a DD disk -; anyway (read size 128 vs. sector size 256) -; - issue SIO command $53 (get status) to retrieve the sector size -; if the command returns with an error, we set sector size to 128 -; bytes +; - read sector #4 (SIO command $54) to update drive status; +; read length is 128 bytes, buffer is allocated on the stack, +; sector data is ignored; +; returned command status is ignored, we will get an error with +; a DD disk anyway (read size 128 vs. sector size 256); +; - issue SIO command $53 (get status) to retrieve the sector size; +; use the DVSTAT system area as return buffer; +; if the command returns with an error, set sector size to 128 +; bytes; ; -; AX - handle -; -.proc query_sectorsize - - sta ptr2 - stx ptr2+1 ; remember pointer to sectsizetab entry - -; jsr pushax ; handle for subsequent __sio_call ldy #128 - jsr subysp ; use buffer on the stack + jsr subysp ; allocate buffer on the stack lda sp pha lda sp+1 - pha + pha ; save sp (buffer address) on processor stack lda ptr2 ldx ptr2+1 - jsr pushax ; handle + ldx #0 lda #4 jsr pushax ; sect_num -; ldy #128 -; jsr subysp ; use buffer on the stack -; lda sp -; ldx sp+1 pla tax - pla -; jsr pushax ; buffer address (not pushed, _dio_read is __fastcall__) + pla ; AX - buffer address + ; sst_sectsize currently 128 jsr _dio_read ; read sector to update status ldy #128 jsr addysp ; discard stack buffer - lda ptr2 ldx ptr2+1 - jsr pushax ; handle for subsequent __sio_call - + jsr pushax ; handle ldx #0 lda #4 - jsr pushax ; dummy sector # + jsr pushax ; dummy sector #, ignored by this SIO command, + ; but set to circumvent the special 1-3 sector + ; handling in __sio_call ldx #>DVSTAT lda #