]> git.sur5r.net Git - cc65/blob - libsrc/telemon30/ch376.s
Adding ch376.h header, correcting some bugs
[cc65] / libsrc / telemon30 / ch376.s
1         .export         _ch376_set_file_name
2         .export         _ch376_file_open
3         .export         _ch376_ic_get_version
4         .export         _ch376_reset
5         .export         _ch376_check_exist
6         .export         _ch376_disk_mount
7         .export         _ch376_set_usb_mode
8         .import         popax
9         .importzp       sp,tmp2,tmp3,tmp1
10         .include    "telemon30.inc"
11
12 ; CODE FOR CH376_SET_USB_MODE *************************************************
13
14 CH376_SET_USB_MODE_CODE_USB_HOST_SOF_PACKAGE_AUTOMATICALLY := $06
15
16 CH376_USB_INT_DISK_READ := $1d
17 CH376_USB_INT_SUCCESS   := $14
18 CH376_ERR_MISS_FILE     := $42
19         
20 CH376_DATA              :=$340
21 CH376_COMMAND   :=$341
22
23 CH376_GET_IC_VER                := $01
24 CH376_SET_BAUDRATE              := $02
25 CH376_GET_ENTER_SLEEP   := $03
26 CH376_RESET_ALL                 := $05
27 CH376_CHECK_EXIST               := $06
28 CH376_GET_FILE_SIZE             := $0C
29 CH376_SET_USB_MODE              := $15
30 CH376_GET_STATUS                := $22
31 CH376_RD_USB_DATA0              := $27
32 CH376_SET_FILE_NAME             := $2f
33 CH376_DISK_CONNECT              := $30 ; check the disk connection status
34 CH376_DISK_MOUNT                := $31
35 CH376_FILE_OPEN                 := $32
36 CH376_FILE_ENUM_GO              := $33
37 CH376_FILE_CLOSE                := $36
38 CH376_BYTE_READ                 := $3A
39 CH376_BYTE_RD_GO                := $3b
40 CH376_BYTE_WRITE                := $3C
41 CH376_DISK_CAPACITY     := $3E
42 CH376_DISK_RD_GO                := $55
43
44
45
46 ; void ch376_set_file_name(char *filename)
47 .proc _ch376_set_file_name
48         sta tmp1
49         stx tmp1+1
50         lda #CH376_SET_FILE_NAME ;$2f
51         sta CH376_COMMAND
52         ldy #0
53 loop:
54         lda (tmp1),y ; replace by bufnom
55         beq end ; we reached 0 value
56         sta CH376_DATA
57         iny
58         cpy #13 ; because we don't manage longfilename shortname =11
59         bne loop
60 end:    
61         sta CH376_DATA
62         rts
63 .endproc 
64         
65 ; void _ch376_file_open();
66         
67 .proc _ch376_file_open
68         lda #CH376_FILE_OPEN ; $32
69         sta CH376_COMMAND
70         jsr _ch376_wait_response
71         rts
72 .endproc 
73
74         ;CMD_GET_FILE_SIZE
75         
76 .proc _ch376_get_file_size
77         lda #CH376_GET_FILE_SIZE
78         sta CH376_COMMAND
79         lda #$68
80         sta CH376_DATA
81         ; store file leng
82         lda CH376_DATA
83         sta tmp1
84         lda CH376_DATA
85         sta tmp1+1
86         lda CH376_DATA
87         sta tmp2
88         lda CH376_DATA
89         sta tmp2+1
90         rts
91 .endproc 
92
93 ; void ch376_reset();
94         
95 .proc _ch376_reset
96         lda #CH376_RESET_ALL ; 5 
97         sta CH376_COMMAND
98         ; waiting
99         ldy #0
100         ldx #0
101 loop:
102         nop
103         inx
104         bne loop
105         iny
106         bne loop
107         rts
108 .endproc 
109
110 ; char  ch376_check_exist(char value);
111         
112 .proc _ch376_check_exist
113         sta tmp1
114         lda #CH376_CHECK_EXIST ; 
115         sta CH376_COMMAND
116         lda tmp1
117         sta CH376_DATA
118         lda CH376_DATA
119         rts
120 .endproc 
121         
122 ; char  ch376_ic_get_version(void)
123 .proc _ch376_ic_get_version
124         lda #CH376_GET_IC_VER
125         sta CH376_COMMAND
126         ldx #0
127         lda CH376_DATA
128         rts
129 .endproc 
130
131 ; void ch376_set_usb_mode(char mode)
132         
133 .proc _ch376_set_usb_mode
134 ; CH376_SET_USB_MODE_CODE_USB_HOST_SOF_PACKAGE_AUTOMATICALLY
135         pha
136         lda #CH376_SET_USB_MODE ; $15
137         sta CH376_COMMAND
138         pla
139         sta CH376_DATA
140         rts
141 .endproc 
142         
143         
144 ;       void ch376_set_bytes_write(int value);
145 .proc _ch376_set_bytes_write
146         sta tmp1
147         stx tmp1+1
148         ldx #CH376_BYTE_WRITE
149         stx CH376_COMMAND
150         lda tmp1
151         sta CH376_DATA
152         lda tmp1+1
153         sta CH376_DATA
154         jsr _ch376_wait_response
155         rts
156 .endproc        
157         
158 .proc _ch376_set_bytes_read
159         ldx #CH376_BYTE_READ
160         stx CH376_COMMAND
161         sta CH376_DATA
162         sty CH376_DATA
163         jsr _ch376_wait_response
164         rts
165 .endproc                
166
167 ; char  ch376_disk_mount();
168 .proc _ch376_disk_mount
169         lda #CH376_DISK_MOUNT ; $31
170         sta CH376_COMMAND
171         jsr _ch376_wait_response
172         ; if we read data value, we have then length of the volume name
173         ldx #0
174         rts     
175 .endproc 
176
177
178 ; char  ch376_wait_response();
179 .proc _ch376_wait_response
180 ; 1 return 1 if usb controller does not respond
181 ; else A contains answer of the controller
182         ldy #$ff
183 loop3:
184         ldx #$ff ; merci de laisser une valeur importante car parfois en mode non debug, le controleur ne rĂ©pond pas tout de suite
185 loop:
186         lda CH376_COMMAND
187         and #%10000000
188         cmp #128
189         bne no_error
190         dex
191         bne loop
192         dey
193         bne loop3
194         ; error is here
195         rts
196 no_error:
197         lda #CH376_GET_STATUS
198         sta CH376_COMMAND
199         lda CH376_DATA
200         rts
201 .endproc 
202