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