]> git.sur5r.net Git - cc65/blob - libsrc/cbm/devicedir.s
Better stick to the "high level" errno helpers as done everywhere else.
[cc65] / libsrc / cbm / devicedir.s
1 ;
2 ; Oliver Schmidt, 2012-09-10
3 ;
4 ; char* __fastcall__ getdevicedir (unsigned char device, char* buf, size_t size);
5 ;
6
7         .export         _getdevicedir
8
9         .import         opencmdchannel, closecmdchannel
10         .import         writefndiskcmd, readdiskerror
11         .import         isdisk, fnunit, fncmd, devicestr
12         .import         popa, popax
13         .importzp       ptr2, ptr3
14
15         .include        "errno.inc"
16
17 ;------------------------------------------------------------------------------
18 ; _getdevicedir
19
20 .proc   _getdevicedir
21
22 ; Save size
23
24         sta     ptr3
25         stx     ptr3+1
26
27 ; Save buf
28
29         jsr     popax
30         sta     ptr2
31         stx     ptr2+1
32
33 ; Save device
34
35         jsr     popa
36         sta     fnunit
37
38 ; Check for disk device
39
40         tax
41         jsr     isdisk
42         bcs     erange
43
44 ; Open channel
45
46         jsr     opencmdchannel
47         bne     oserr
48
49 ; Write command
50
51         lda     #'i'            ; Init command
52         sta     fncmd
53         jsr     writefndiskcmd
54         bne     close
55
56 ; Read error
57
58         ldx     fnunit
59         jsr     readdiskerror
60
61 ; Close channel
62
63 close:  pha
64         ldx     fnunit
65         jsr     closecmdchannel
66         pla
67         bne     oserr
68
69 ; Check for sufficient buf size
70
71         lda     ptr3+1
72         bne     okay            ; Buf >= 256
73         lda     ptr3
74         cmp     #3
75         bcs     okay            ; Buf >= 3
76
77 erange: lda     #<ERANGE
78         jsr     __directerrno
79         bne     fail            ; Branch always
80
81 oserr:  jsr     __mappederrno
82
83 fail:   lda     #0              ; Return NULL
84         tax
85         rts
86
87 ; Copy device string representation into buf
88
89 okay:   lda     fnunit
90         jsr     devicestr       ; Returns 0 in A
91         sta     __oserror       ; Clear _oserror
92
93 ; Success, return buf
94
95         lda     ptr2
96         ldx     ptr2+1
97         rts
98
99 .endproc