]> git.sur5r.net Git - cc65/commitdiff
add query_sectorsize: query sector size of disk by reading sector #4
authorcpg <cpg@b7a2c559-68d2-44c3-8de9-860c34a00d81>
Sat, 19 Feb 2005 01:04:41 +0000 (01:04 +0000)
committercpg <cpg@b7a2c559-68d2-44c3-8de9-860c34a00d81>
Sat, 19 Feb 2005 01:04:41 +0000 (01:04 +0000)
and making a status command ($53) to the drive: initial check-in,
needs cleanup

git-svn-id: svn://svn.cc65.org/cc65/trunk@3394 b7a2c559-68d2-44c3-8de9-860c34a00d81

libsrc/atari/diopncls.s

index 7826e0cc19a1c4faa5fea3c7fcdd3d39c8a8f7bc..8995e79e615e7621b3c6459deff87f84f0e18e99 100644 (file)
@@ -1,20 +1,22 @@
 ;
 ;
-; Christian Groessler, October 2000
+; Christian Groessler, February 2005
 ;
 ;
-; This file provides the __dio_open and __dio_close functions
+; This file provides the _dio_open and _dio_close functions
 ; Since on the Atari no real open and close is necessary, they
 ; Since on the Atari no real open and close is necessary, they
-; do not much. The __dio_open sets the sector size of the
-; drive which is later used by the _dio_read and _dio_write
-; functions.
+; do not open or close something. The _dio_open sets the sector
+; size of the drive which is later used by the _dio_read and
+; _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  (driveid_t drive_id);
 ; unsigned char __fastcall__ dio_close (dhandle_t handle);
 ;
 
 ; unsigned char __fastcall__ dio_close (dhandle_t handle);
 ;
 
-       .export         _dio_open,_dio_close
+       .export         _dio_open, _dio_close
        .export         sectsizetab
        .export         sectsizetab
-       .import         __oserror
-       .importzp       ptr1,tmp1
+       .import         __oserror, __sio_call, _dio_read
+       .import         pushax, addysp, subysp
+       .importzp       ptr2, tmp1, sp
        .include        "atari.inc"
 
 
        .include        "atari.inc"
 
 
@@ -34,7 +36,7 @@ sectsizetab:
        asl     a               ; make index from drive id
        asl     a
        tax
        asl     a               ; make index from drive id
        asl     a
        tax
-       lda     #128            ; currently hardcoded (until I get an 815 :-)
+       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,x
        sta     sectsizetab+sst_flag,x          ; set flag that drive is "open"
        lda     #0
@@ -42,8 +44,6 @@ sectsizetab:
        sta     __oserror                       ; success
        tya
        sta     sectsizetab+sst_driveno,x
        sta     __oserror                       ; success
        tya
        sta     sectsizetab+sst_driveno,x
-;      lda     #SSTIDVAL
-;      sta     sectsizetab+sst_id+1,x
        stx     tmp1
        lda     #<sectsizetab
        clc
        stx     tmp1
        lda     #<sectsizetab
        clc
@@ -53,7 +53,8 @@ sectsizetab:
        adc     #0
        tax
        lda     tmp1
        adc     #0
        tax
        lda     tmp1
-       rts
+       jmp     query_sectorsize                ; query drive for current sector size
+;      rts
 
 _inv_drive:
        lda     #NONDEV         ; non-existent device
 
 _inv_drive:
        lda     #NONDEV         ; non-existent device
@@ -66,14 +67,111 @@ _inv_drive:
 
 .proc  _dio_close
 
 
 .proc  _dio_close
 
-       sta     ptr1
-       stx     ptr1+1
+       sta     ptr2
+       stx     ptr2+1
        lda     #0
        ldy     #sst_flag
        lda     #0
        ldy     #sst_flag
-       sta     (ptr1),y
+       sta     (ptr2),y
        sta     __oserror       ; success
        tax
        rts                     ; return no error
 
 .endproc
 
        sta     __oserror       ; success
        tax
        rts                     ; return no error
 
 .endproc
 
+; 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
+;
+.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
+
+       lda     sp
+       pha
+       lda     sp+1
+       pha
+
+       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__)
+
+       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
+
+
+       ldx     #0
+       lda     #4
+       jsr     pushax          ; dummy sector #
+
+       ldx     #>DVSTAT
+       lda     #<DVSTAT
+       jsr     pushax          ; buffer address
+
+       ldy     #sst_sectsize
+       lda     #4
+       sta     (ptr2),y        ; 4 bytes transfer
+
+       ldx     #%01000000      ; direction value
+       lda     #SIO_STAT       ; get status
+
+       jsr     __sio_call
+
+       bmi     error
+
+       ldy     #sst_sectsize
+       lda     DVSTAT
+       and     #%100000
+       beq     s128
+
+       lda     #0
+       sta     (ptr2),y
+       iny
+       lda     #1
+;      sta     (ptr2),y
+;      bne     fini2
+
+finish:        sta     (ptr2),y        ; set default sector size       
+fini2: lda     ptr2
+       ldx     ptr2+1
+       rts
+
+error: ldy     #sst_sectsize
+s128:  lda     #128
+       bne     finish
+
+.endproc