; _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 (unsigned char device);
; unsigned char __fastcall__ dio_close (dhandle_t handle);
;
- .export _dio_open, _dio_close
- .export sectsizetab
- .import __oserror, __sio_call, _dio_read
- .import pushax, addysp, subysp
- .importzp ptr2, tmp1, sp
- .include "atari.inc"
+ .export _dio_open, _dio_close
+ .export sectsizetab
+ .import __oserror, __sio_call, _dio_read
+ .import pushax, addysp, subysp
+ .importzp ptr2, sp
+ .include "atari.inc"
.bss
sectsizetab:
- .res NUMDRVS * sst_size
+ .res NUMDRVS * sst_size
.code
-
-.proc _dio_open
-
- cmp #NUMDRVS ; valid drive id?
- bcs _inv_drive
- tay ; drive #
- asl a ; make index from drive id
- asl a
- tax
- 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+1,x
- sta __oserror ; success
- tya
- sta sectsizetab+sst_driveno,x
- stx tmp1
- lda #<sectsizetab
- clc
- adc tmp1
- sta tmp1
- lda #>sectsizetab
- adc #0
- tax
- lda tmp1
- jmp query_sectorsize ; query drive for current sector size
-; rts
+; code for _dio_open
_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
+ lda #NONDEV ; non-existent device
+ sta __oserror
+ lda #0
+ tax
+ rts ; return NULL
+
+_dio_open:
+
+ cmp #NUMDRVS ; valid drive id?
+ bcs _inv_drive
+ tay ; drive #
+ asl a ; make index from drive id
+ asl a
+ tax
+ lda #128 ; preset sectsize
+ sta sectsizetab+sst_sectsize,x
+ sta sectsizetab+sst_flag,x ; set flag that drive is "open"
+ lda #0
+ sta sectsizetab+sst_sectsize+1,x
+ sta __oserror ; success
+ tya
+ sta sectsizetab+sst_driveno,x
+ stx ptr2
+ lda #<sectsizetab
+ clc
+ adc ptr2
+ sta ptr2
+ lda #>sectsizetab
+ adc #0
+ tax
+ 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
+ ldy #128
+ jsr subysp ; allocate buffer on the stack
-; jsr pushax ; handle for subsequent __sio_call
+ lda sp
+ pha
+ lda sp+1
+ pha ; save sp (buffer address) on processor stack
- ldy #128
- jsr subysp ; use buffer on the stack
+ lda ptr2
+ ldx ptr2+1
+ jsr pushax ; handle
- lda sp
- pha
- lda sp+1
- pha
+ ldx #0
+ lda #4
+ jsr pushax ; sect_num
- lda ptr2
- ldx ptr2+1
+ pla
+ tax
+ pla ; AX - buffer address
- jsr pushax ; handle
- ldx #0
- lda #4
- jsr pushax ; sect_num
+ ; sst_sectsize currently 128
+ jsr _dio_read ; read sector to update status
-; 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__)
+ ldy #128
+ jsr addysp ; discard stack buffer
- jsr _dio_read ; read sector to update status
+ lda ptr2
+ ldx ptr2+1
+ jsr pushax ; handle
- ldy #128
- jsr addysp ; discard stack buffer
+ ldx #0
+ lda #4
+ 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
+ jsr pushax ; buffer address
- lda ptr2
- ldx ptr2+1
- jsr pushax ; handle for subsequent __sio_call
+ ldy #sst_sectsize
+ lda #4
+ sta (ptr2),y ; 4 bytes transfer
+ ldx #%01000000 ; direction value
+ lda #SIO_STAT ; get status
- ldx #0
- lda #4
- jsr pushax ; dummy sector #
+ jsr __sio_call
- ldx #>DVSTAT
- lda #<DVSTAT
- jsr pushax ; buffer address
+ bmi error
- ldy #sst_sectsize
- lda #4
- sta (ptr2),y ; 4 bytes transfer
+ ldy #sst_sectsize
+ lda DVSTAT
+ and #%100000
+ beq s128
- ldx #%01000000 ; direction value
- lda #SIO_STAT ; get status
+;s256
+ lda #0
+ sta (ptr2),y
+ iny
+ lda #1
- jsr __sio_call
+finish: sta (ptr2),y ; set default sector size
+fini2: lda ptr2
+ ldx ptr2+1
+ rts
- bmi error
+error: ldy #sst_sectsize
+s128: lda #128
+ bne finish
- ldy #sst_sectsize
- lda DVSTAT
- and #%100000
- beq s128
+; end of _dio_open
- 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
+.proc _dio_close
-error: ldy #sst_sectsize
-s128: lda #128
- bne finish
+ sta ptr2
+ stx ptr2+1
+ lda #0
+ ldy #sst_flag
+ sta (ptr2),y
+ sta __oserror ; success
+ tax
+ rts ; return no error
.endproc