]> git.sur5r.net Git - cc65/blobdiff - libsrc/atari/diopncls.s
The spans do now contain the size of a span, no longer the end offset.
[cc65] / libsrc / atari / diopncls.s
index 8995e79e615e7621b3c6459deff87f84f0e18e99..09398b9acf6f8c2a496d4e0b8c1779dceb41f0ab 100644 (file)
@@ -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,8 +27,16 @@ sectsizetab:
 
 .code
 
+; code for _dio_open
 
-.proc  _dio_open
+_inv_drive:
+       lda     #NONDEV         ; non-existent device
+       sta     __oserror
+       lda     #0
+       tax
+       rts                     ; return NULL
+
+_dio_open:
 
        cmp     #NUMDRVS        ; valid drive id?
        bcs     _inv_drive
@@ -36,7 +44,7 @@ sectsizetab:
        asl     a               ; make index from drive id
        asl     a
        tax
-       lda     #128            ; preset sectsize, will be overridden by query_sectorsize
+       lda     #128                            ; preset sectsize
        sta     sectsizetab+sst_sectsize,x
        sta     sectsizetab+sst_flag,x          ; set flag that drive is "open"
        lda     #0
@@ -44,99 +52,64 @@ sectsizetab:
        sta     __oserror                       ; success
        tya
        sta     sectsizetab+sst_driveno,x
-       stx     tmp1
+       stx     ptr2
        lda     #<sectsizetab
        clc
-       adc     tmp1
-       sta     tmp1
+       adc     ptr2
+       sta     ptr2
        lda     #>sectsizetab
        adc     #0
        tax
-       lda     tmp1
-       jmp     query_sectorsize                ; query drive for current sector size
-;      rts
-
-_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
+       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
-
-;      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     #<DVSTAT
@@ -158,12 +131,11 @@ _inv_drive:
        and     #%100000
        beq     s128
 
+;s256
        lda     #0
        sta     (ptr2),y
        iny
        lda     #1
-;      sta     (ptr2),y
-;      bne     fini2
 
 finish:        sta     (ptr2),y        ; set default sector size       
 fini2: lda     ptr2
@@ -174,4 +146,18 @@ error:     ldy     #sst_sectsize
 s128:  lda     #128
        bne     finish
 
+; end of _dio_open
+
+
+.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