.export sectsizetab
.import __oserror, __sio_call, _dio_read
.import pushax, addysp, subysp
- .importzp ptr2, tmp1, sp
+ .importzp ptr2, sp
.include "atari.inc"
.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
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
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
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
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