]> git.sur5r.net Git - cc65/blobdiff - libsrc/atari/siocall.s
Merge remote-tracking branch 'upstream/master'
[cc65] / libsrc / atari / siocall.s
index db71e44ec9483ef0d4f088bfb0bff703c052d509..3db37753f75ce389a17fd9dc7f28d2a928663a00 100644 (file)
@@ -1,60 +1,89 @@
 ;
 ; Christian Groessler, October 2000
 ;
-; this file provides the __sio_call function
-; the function does a SIO call, it's not completely
+; 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
+; to save space with _dio_read and _dio_write functions.
 ;
-; unsigned char __fastcall__ _sio_call(_driveid_t drive_id,
-;                                     _sectnum_t sect_num,
-;                                     void *buffer,
-;                                     unsigned int sio_val);
-; _driveid_t - 8bit
-; _sectnum_t - 16bit
-; sio_cal is (sio_command | sio_direction << 8)
+; 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
-
-.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     popa
-       cmp     #16
-       bcs     _inv_dev        ; invalid device #
-       adc     #1
-       sta     DUNIT           ; unit number (d1,d2,d3,...)
-       lda     #$31            ; D1 (drive_id == 0) has id $31
-       sta     DDEVIC
-       lda     #0
-       sta     DBYTHI          ; high byte of bytes to transfer
-       lda     #15
-       sta     DTIMLO          ; value got from DOS source
-       lda     #128
-       sta     DBYTLO          ; low byte of bytes to transfer 
-
-       jsr     SIOV            ; execute
-
-       ldx     #0
-       lda     DSTATS
-       bmi     _req_err        ; error occurred
-       txa                     ; no error occurred
+        .export         __sio_call
+        .include        "atari.inc"
+        .import         popa,popax
+        .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     popax
+        sta     ptr1
+        stx     ptr1+1
+
+        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:
-       rts
+        sta     __oserror
+        rts
 
-_inv_dev:
-       ldx     #0
-       lda     #NONDEV         ; non-existent device error
-       rts
+_inv_hand:
+        ldx     #0
+        lda     #BADIOC
+        bne     _req_err
 
 .endproc