;
; Christian Groessler, October 2000
;
; This file provides the __sio_call function
; The function does a SIO call, it's not completely
; generic (e.g. transfer size is fixed), it's used
; to save space with _dio_read and _dio_write functions.
;
; unsigned char __fastcall__ _sio_call(dhandle_t handle,
;                                      unsigned sect_num,
;                                      void *buffer,
;                                      unsigned sio_val);
; dhandle_t - 16bit (ptr)
; sio_val is (sio_command | sio_direction << 8)
;

        .export         __sio_call
        .include        "atari.inc"
        .import         popa,popax,popptr1
        .import         sectsizetab,__oserror
        .importzp       ptr1

.proc   __sio_call

        sta     DCOMND          ; set command into DCB
        stx     DSTATS          ; set data flow directon
        jsr     popax           ; get buffer address
        sta     DBUFLO          ; set buffer address into DCB
        stx     DBUFHI
        jsr     popax
        sta     DAUX1           ; set sector #
        stx     DAUX2

        jsr     popptr1

        ldy     #sst_flag
        lda     (ptr1),y
        and     #128
        beq     _inv_hand       ; handle not open or invalid

        ldy     #sst_driveno
        lda     (ptr1),y

        clc
        adc     #1
        sta     DUNIT           ; unit number (d1,d2,d3,...)

        lda     DAUX2           ; high byte sector #
        bne     _realsz
        lda     DAUX1
        cmp     #4              ; sectors 1 to 3 are special (always 128 bytes)
        bcs     _realsz

        lda     #$80
        sta     DBYTLO
        asl     a
        sta     DBYTHI
        beq     _cont

_realsz:ldy     #sst_sectsize
        lda     (ptr1),y
        sta     DBYTLO
        iny
        lda     (ptr1),y
        sta     DBYTHI

_cont:  lda     #DISKID         ; SIO bus ID of diskette drive
        sta     DDEVIC
        lda     #15
        sta     DTIMLO          ; value got from DOS source

        jsr     SIOV            ; execute

        ldx     #0
        lda     DSTATS
        bmi     _req_err        ; error occurred
        txa                     ; no error occurred
_req_err:
        sta     __oserror
        rts

_inv_hand:
        ldx     #0
        lda     #BADIOC
        bne     _req_err

.endproc
