+; 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