X-Git-Url: https://git.sur5r.net/?a=blobdiff_plain;f=libsrc%2Fatari%2Fdiopncls.s;h=2cdeba78b673d8fae74550a1c2ce2547fa6c24ef;hb=aac88eac53e3a0dc178a7711741e12f021850de1;hp=8995e79e615e7621b3c6459deff87f84f0e18e99;hpb=fcf1a05454aa8a25996e75223ee29e43e9fc09dc;p=cc65 diff --git a/libsrc/atari/diopncls.s b/libsrc/atari/diopncls.s index 8995e79e6..2cdeba78b 100644 --- a/libsrc/atari/diopncls.s +++ b/libsrc/atari/diopncls.s @@ -8,170 +8,156 @@ ; _dio_write functions. To query the sector size, the _dio_open ; accesses the disk drive. ; -; dhandle_t __fastcall__ dio_open (driveid_t drive_id); +; dhandle_t __fastcall__ dio_open (unsigned char device); ; unsigned char __fastcall__ dio_close (dhandle_t handle); ; - .export _dio_open, _dio_close - .export sectsizetab - .import __oserror, __sio_call, _dio_read - .import pushax, addysp, subysp - .importzp ptr2, tmp1, sp - .include "atari.inc" + .export _dio_open, _dio_close + .export sectsizetab + .import __oserror, __sio_call, _dio_read + .import pushax, addysp, subysp + .importzp ptr2, sp + .include "atari.inc" .bss sectsizetab: - .res NUMDRVS * sst_size + .res NUMDRVS * sst_size .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 - sta __oserror - lda #0 - tax - rts ; return NULL - -.endproc - -.proc _dio_close - - sta ptr2 - stx ptr2+1 - lda #0 - ldy #sst_flag - sta (ptr2),y - sta __oserror ; success - tax - rts ; return no error - -.endproc + lda #NONDEV ; non-existent device + sta __oserror + lda #0 + tax + rts ; return NULL + +_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 + 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 -; -; AX - handle +; - 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; ; -.proc query_sectorsize - sta ptr2 - stx ptr2+1 ; remember pointer to sectsizetab entry + ldy #128 + jsr subysp ; allocate buffer on the stack -; jsr pushax ; handle for subsequent __sio_call + lda sp + pha + lda sp+1 + pha ; save sp (buffer address) on processor stack - ldy #128 - jsr subysp ; use buffer on the stack + lda ptr2 + ldx ptr2+1 + jsr pushax ; handle - lda sp - pha - lda sp+1 - pha + ldx #0 + lda #4 + jsr pushax ; sect_num - lda ptr2 - ldx ptr2+1 + pla + tax + pla ; AX - buffer address - jsr pushax ; handle - ldx #0 - lda #4 - jsr pushax ; sect_num + ; sst_sectsize currently 128 + jsr _dio_read ; read sector to update status -; 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__) + ldy #128 + jsr addysp ; discard stack buffer - jsr _dio_read ; read sector to update status + lda ptr2 + ldx ptr2+1 + jsr pushax ; handle - ldy #128 - jsr addysp ; discard stack buffer + ldx #0 + lda #4 + 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 #DVSTAT - lda #