File: siocall.s

package info (click to toggle)
cc65 2.19-2
  • links: PTS
  • area: main
  • in suites: forky, sid, trixie
  • size: 20,268 kB
  • sloc: ansic: 117,151; asm: 66,339; pascal: 4,248; makefile: 1,009; perl: 607
file content (87 lines) | stat: -rw-r--r-- 2,351 bytes parent folder | download | duplicates (2)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
;
; 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