]> git.sur5r.net Git - cc65/commitdiff
Read number of total blocks from ProDOS 8 volume directory header - and fall back...
authorol.sc <ol.sc@b7a2c559-68d2-44c3-8de9-860c34a00d81>
Sat, 17 Jul 2010 19:16:25 +0000 (19:16 +0000)
committerol.sc <ol.sc@b7a2c559-68d2-44c3-8de9-860c34a00d81>
Sat, 17 Jul 2010 19:16:25 +0000 (19:16 +0000)
git-svn-id: svn://svn.cc65.org/cc65/trunk@4750 b7a2c559-68d2-44c3-8de9-860c34a00d81

doc/apple2.sgml
doc/apple2enh.sgml
libsrc/apple2/diosectcount.s

index 7b4bd722615936058e780a18b4fc9e2474927b53..16ea35dd7c34e606f8ca5af4e4d8ced0aff08b1e 100644 (file)
@@ -433,13 +433,6 @@ BASIC.SYSTEM) there are some limitations for DOS 3.3:
 </descrip><p>
 
 
-<sect1>DIO<p>
-
-Although <htmlurl url="dio.html" name="DIO"> generally works with all ProDOS 8
-devices, the function <htmlurl url="dio-3.html" name="dio_query_sectcount()">
-simply always return 280 (which is only correct for a 140 KB disk).
-
-
 <sect1>Direct console I/O<p>
 
 <descrip>
@@ -493,15 +486,27 @@ name="assembler manual">.
 
 <sect1>DIO<p>
 
-The function <htmlurl url="dio-1.html" name="dio_open()"> has the single parameter
-<tt/drive_id/ to identify the drive to be opened. Therefore an Apple&nbsp;II
-slot and drive pair is mapped to that <tt/drive_id/ according to the formula
+<descrip>
 
-<verb>
+  <tag/Drive ID/
+  The function <htmlurl url="dio-1.html" name="dio_open()"> has the single
+  parameter <tt/drive_id/ to identify the drive to be opened. Therefore an
+  Apple&nbsp;II slot and drive pair is mapped to that <tt/drive_id/ according
+  to the formula
+
+  <verb>
     drive_id = slot * 16 + (drive - 1) * 128
-</verb>
+  </verb>
+
+  so that for example slot 6 drive 2 is mapped to <tt/drive_id/ 224.
 
-so that for example slot 6 drive 2 is mapped to <tt/drive_id/ 224.
+  <tag/Sector count/
+  The function <htmlurl url="dio-3.html" name="dio_query_sectcount()"> returns
+  the correct sector count for all ProDOS 8 disks. However for any non-ProDOS 8
+  disk it simply always return 280 (which is only correct for a 140 KB disk).
+  This condition is indicated by the _oserror value 82.
+
+</descrip><p>
 
 
 
index 70fdcf4e71a49a36e06155897105d659d357f57c..9286005f5591469bf3a1db27128ad1e58a3aa33e 100644 (file)
@@ -434,13 +434,6 @@ BASIC.SYSTEM) there are some limitations for DOS 3.3:
 </descrip><p>
 
 
-<sect1>DIO<p>
-
-Although <htmlurl url="dio.html" name="DIO"> generally works with all ProDOS 8
-devices, the function <htmlurl url="dio-3.html" name="dio_query_sectcount()">
-simply always return 280 (which is only correct for a 140 KB disk).
-
-
 <sect1>Direct console I/O<p>
 
 <descrip>
@@ -499,15 +492,27 @@ name="assembler manual">.
 
 <sect1>DIO<p>
 
-The function <htmlurl url="dio-1.html" name="dio_open()"> has the single parameter
-<tt/drive_id/ to identify the drive to be opened. Therefore an Apple&nbsp;II
-slot and drive pair is mapped to that <tt/drive_id/ according to the formula
+<descrip>
 
-<verb>
+  <tag/Drive ID/
+  The function <htmlurl url="dio-1.html" name="dio_open()"> has the single
+  parameter <tt/drive_id/ to identify the drive to be opened. Therefore an
+  Apple&nbsp;II slot and drive pair is mapped to that <tt/drive_id/ according
+  to the formula
+
+  <verb>
     drive_id = slot * 16 + (drive - 1) * 128
-</verb>
+  </verb>
+
+  so that for example slot 6 drive 2 is mapped to <tt/drive_id/ 224.
 
-so that for example slot 6 drive 2 is mapped to <tt/drive_id/ 224.
+  <tag/Sector count/
+  The function <htmlurl url="dio-3.html" name="dio_query_sectcount()"> returns
+  the correct sector count for all ProDOS 8 disks. However for any non-ProDOS 8
+  disk it simply always return 280 (which is only correct for a 140 KB disk).
+  This condition is indicated by the _oserror value 82.
+
+</descrip><p>
 
 
 
index 7492482325f002d2d4a65bed99e02910b0a4b7e5..41bcb30451ca9c46552fa45a3e6021d7ef75bfb0 100644 (file)
@@ -5,8 +5,91 @@
 ;
 
         .export        _dio_query_sectcount
+        .import        _dio_query_sectsize, _malloc, _free
+
+        .include       "zeropage.inc"
+        .include       "errno.inc"
+        .include       "mli.inc"
 
 _dio_query_sectcount:
-        lda    #<280
-        ldx    #>280
+
+        ; Set handle
+        sta    mliparam + MLI::ON_LINE::UNIT_NUM
+
+        ; Get ProDOS 8 block size (clears __oserror)
+        jsr    _dio_query_sectsize
+
+        ; Alloc buffer
+        jsr    _malloc
+        sta    ptr4
+        stx    ptr4+1
+
+        ; Set buffer
+        sta    mliparam + MLI::ON_LINE::DATA_BUFFER
+        stx    mliparam + MLI::ON_LINE::DATA_BUFFER+1
+
+        ; Check buffer (hibyte is enough)
+        txa
+        beq    nomem
+
+        ; Get device state
+        lda    #ON_LINE_CALL
+        ldx    #ON_LINE_COUNT
+        jsr    callmli
+        bcs    check
+
+        ; UNIT_NUM already set
+        .assert MLI::RW_BLOCK::UNIT_NUM = MLI::ON_LINE::UNIT_NUM, error
+
+        ; DATA_BUFFER already set
+        .assert MLI::RW_BLOCK::DATA_BUFFER = MLI::ON_LINE::DATA_BUFFER, error
+
+        ; Read volume directory key block
+        tax                    ; A = 0
+        lda    #$02
+        sta    mliparam + MLI::RW_BLOCK::BLOCK_NUM
+        stx    mliparam + MLI::RW_BLOCK::BLOCK_NUM+1
+        lda    #READ_BLOCK_CALL
+        ldx    #RW_BLOCK_COUNT
+        jsr    callmli
+        bcs    oserr
+
+        ; Get and save total blocks from volume directory header
+        ldy    #$29
+        lda    (ptr4),y
+        pha
+        iny
+        lda    (ptr4),y
+        pha
+
+        ; Cleanup buffer
+done:   lda    ptr4
+        ldx    ptr4+1
+        jsr    _free
+
+        ; Restore total blocks and return
+        pla
+        tax
+        pla
         rts
+
+nomem:  lda    #$FF            ; Error code for sure not used by MLI
+oserr:  sta    __oserror
+
+        ; Save total blocks for failure
+        lda    #$00
+        pha
+        pha
+        beq    done            ; Branch always
+
+        ; Check for non-ProDOS disk
+check:  cmp    #$52            ; "Not a ProDOS volume"
+        bne    oserr
+        sta    __oserror
+
+        ; Save total blocks for a 16-sector disk
+        lda    #<280
+        pha
+        lda    #>280
+        pha
+        bne    done            ; Branch always