]> git.sur5r.net Git - cc65/blob - libsrc/cbm/syschdir.s
Added more details about how the CBM exec() works.
[cc65] / libsrc / cbm / syschdir.s
1 ;
2 ; Oliver Schmidt, 2012-10-16
3 ;
4 ; unsigned char __fastcall__ _syschdir (const char* name);
5 ;
6
7         .export         __syschdir
8         .import         diskinit, fnunit, curunit, initcwd
9         .importzp       ptr1, tmp1, tmp2
10
11 ;--------------------------------------------------------------------------
12 ; __syschdir
13
14 .proc   __syschdir
15
16 ; Save name
17
18         sta     ptr1
19         stx     ptr1+1
20
21 ; Process first character
22
23         ldy     #0
24         lda     (ptr1),y
25         beq     err
26         jsr     getdigit
27         bcs     err
28         tax
29
30 ; Process second character
31
32         iny
33         lda     (ptr1),y
34         beq     init
35         jsr     getdigit
36         bcs     err
37         stx     tmp1            ; First digit
38         sta     tmp2            ; Second digit
39
40 ; Multiply first digit by 10
41
42         ldx     #8
43 @L0:    asl
44         asl     tmp1
45         bcc     @L1
46         clc
47         adc     #10
48 @L1:    dex
49         bne     @L0
50
51 ; Add second digit to product
52
53         clc
54         adc     tmp2
55         tax
56
57 ; Process third character
58
59         iny
60         lda     (ptr1),y
61         bne     err
62
63 ; Check device readiness
64
65 init:   txa
66         jsr     diskinit
67         bne     done
68
69 ; Success, update cwd
70
71         lda     fnunit          ; Set by diskinit
72         sta     curunit
73         jmp     initcwd         ; Returns with A = 0
74
75 ; Return with error in A
76
77 err:    lda     #9              ; "Ilegal device"
78 done:   rts
79
80 .endproc
81
82 ;--------------------------------------------------------------------------
83 ; getdigit
84
85 .proc   getdigit
86
87         sec
88         sbc     #'0'
89         bcs     @L0
90         sec
91         rts
92 @L0:    cmp     #10
93         rts
94
95 .endproc