]> git.sur5r.net Git - cc65/blob - libsrc/telemon30/ch376.s
Correcting spaces
[cc65] / libsrc / telemon30 / ch376.s
1
2         ; For XA65 compatibily in the future
3         .FEATURE        c_comments,labels_without_colons,pc_assignment, loose_char_term
4         .export         _ch376_set_file_name
5         .export         _ch376_file_open
6         .export         _ch376_ic_get_version
7         .export         _ch376_reset
8         .export         _ch376_check_exist
9         .export         _ch376_disk_mount
10         .export         _ch376_set_usb_mode
11
12         .export         _ch376_file_close
13         .export         _ch376_seek_file        
14         .export         _ch376_file_create      
15         .export         _ch376_fwrite
16         ; High level function
17
18         
19         .import         popax
20         .include    "zeropage.inc"
21         .include    "telemon30.inc"
22 /*
23
24 */
25 ; CODE FOR CH376_SET_USB_MODE *************************************************
26
27 CH376_SET_USB_MODE_CODE_USB_HOST_SOF_PACKAGE_AUTOMATICALLY := $06
28
29 CH376_USB_INT_SUCCESS           := $14
30 CH376_USB_INT_CONNECT           := $15
31 CH376_USB_INT_DISCONNECT        := $16
32 CH376_USB_INT_BUF_OVER          := $17
33 CH376_USB_INT_USB_READY         := $18
34 CH376_USB_INT_DISK_READ         := $1D
35 CH376_USB_INT_DISK_WRITE        := $1E
36 CH376_USB_INT_DISK_ERR          := $1F
37
38
39 CH376_ERR_OPEN_DIR                      := $41
40 CH376_ERR_MISS_FILE             := $42
41 CH376_ERR_FOUND_NAME            := $43
42 CH376_ERR_DISK_DISCON           := $82
43 CH376_ERR_LARGE_SECTOR          := $84
44 CH376_ERR_TYPE_ERROR            := $92
45 CH376_ERR_BPB_ERROR             := $A1
46 CH376_ERR_DISK_FULL             := $B1
47 CH376_ERR_FDT_OVER                      := $B2
48 CH376_ERR_FILE_CLOSE            := $B4
49
50
51
52 CH376_GET_IC_VER                := $01
53 CH376_SET_BAUDRATE              := $02
54 CH376_GET_ENTER_SLEEP   := $03
55 CH376_RESET_ALL                 := $05
56 CH376_CHECK_EXIST               := $06
57 CH376_GET_FILE_SIZE             := $0C
58
59 CH376_SET_USB_MODE              := $15
60 CH376_GET_STATUS                := $22
61 CH376_RD_USB_DATA0              := $27
62 CH376_CMD_WR_REQ_DATA   := $2d
63 CH376_SET_FILE_NAME             := $2F
64
65 CH376_DISK_CONNECT              := $30 ; check the disk connection status
66 CH376_DISK_MOUNT                := $31
67 CH376_FILE_OPEN                 := $32
68 CH376_FILE_ENUM_GO              := $33
69 CH376_FILE_CREATE               := $34
70 CH376_FILE_CLOSE                := $36
71 CH376_BYTE_LOCATE               := $39
72 CH376_BYTE_READ                 := $3A
73 CH376_BYTE_RD_GO                := $3B
74 CH376_BYTE_WRITE                := $3C
75 CH376_BYTE_WR_GO                := $3D
76 CH376_DISK_CAPACITY     := $3E
77 CH376_DISK_RD_GO                := $55
78
79 .proc _ch376_file_close
80         lda     #CH376_FILE_CLOSE
81         sta     CH376_COMMAND
82         jsr     _ch376_wait_response
83         rts     
84 .endproc
85
86 .proc _ch376_seek_file
87         ldx     #CH376_BYTE_LOCATE
88         stx     CH376_COMMAND
89         sta     CH376_DATA
90         sty     CH376_DATA
91         lda     #$00 ; Don't manage 32 bits length
92         sta     CH376_DATA
93         sta     CH376_DATA
94         jsr     _ch376_wait_response
95         rts
96 .endproc
97
98 ; void ch376_set_file_name(char *filename)
99 .proc _ch376_set_file_name
100         sta     ptr1
101         stx     ptr1+1
102         lda     #CH376_SET_FILE_NAME ;$2f
103         sta     CH376_COMMAND
104         ldy     #0
105 loop:
106         lda     (ptr1),y ; replace by bufnom
107         beq     end ; we reached 0 value
108         BRK_TELEMON     XMINMA
109         sta     CH376_DATA
110         iny
111         cpy     #13 ; because we don't manage longfilename shortname =11
112         bne     loop
113 end:    
114         sta     CH376_DATA
115         rts
116 .endproc 
117         
118 ; char _ch376_file_open();
119         
120 .proc _ch376_file_open
121         lda     #CH376_FILE_OPEN ; $32
122         sta     CH376_COMMAND
123         jsr     _ch376_wait_response
124         rts
125 .endproc 
126
127
128         
129 .proc _ch376_get_file_size
130         lda     #CH376_GET_FILE_SIZE
131         sta     CH376_COMMAND
132         lda     #$68
133         sta     CH376_DATA
134         ; store file length 32 bits
135         lda     CH376_DATA
136         sta     tmp1
137         lda     CH376_DATA
138         sta     tmp1+1
139         lda     CH376_DATA
140         sta     tmp2
141         lda     CH376_DATA
142         sta     tmp2+1
143         rts
144 .endproc 
145
146 ; void ch376_reset();
147         
148 .proc _ch376_reset
149         lda     #CH376_RESET_ALL ; 5 
150         sta     CH376_COMMAND
151         ; waiting
152         ldy     #0
153         ldx     #0
154 loop:
155         nop
156         inx
157         bne     loop
158         iny
159         bne     loop
160         rts
161 .endproc 
162
163 ; char  ch376_check_exist(char value);
164         
165 .proc _ch376_check_exist
166         sta     tmp1
167         lda     #CH376_CHECK_EXIST ; 
168         sta     CH376_COMMAND
169         lda     tmp1
170         sta     CH376_DATA
171         lda     CH376_DATA
172         rts
173 .endproc 
174         
175 ; char  ch376_ic_get_version(void)
176 .proc _ch376_ic_get_version
177         lda     #CH376_GET_IC_VER
178         sta     CH376_COMMAND
179         ldx     #0
180         lda     CH376_DATA
181         rts
182 .endproc 
183
184 ; void ch376_set_usb_mode(char mode)
185         
186 .proc _ch376_set_usb_mode
187 ; CH376_SET_USB_MODE_CODE_USB_HOST_SOF_PACKAGE_AUTOMATICALLY
188         ldx     #CH376_SET_USB_MODE ; $15
189         stx     CH376_COMMAND
190         sta     CH376_DATA
191         rts
192 .endproc 
193                 
194 ;       void ch376_set_bytes_write(int value);
195 .proc _ch376_set_bytes_write
196         ldy     #CH376_BYTE_WRITE
197         sty     CH376_COMMAND
198         sta     CH376_DATA
199         stx     CH376_DATA
200         lda     #0
201         sta     CH376_DATA
202         sta     CH376_DATA
203         jsr     _ch376_wait_response
204         rts
205 .endproc        
206         
207 .proc _ch376_set_bytes_read
208         ldy     #CH376_BYTE_READ
209         sty     CH376_COMMAND
210         ; Storing 32 bits value
211         sta     CH376_DATA
212         stx     CH376_DATA
213         lda     #0
214         sta     CH376_DATA
215         sta     CH376_DATA
216         jsr     _ch376_wait_response
217         rts
218 .endproc                
219
220 ; char  ch376_disk_mount();
221 .proc _ch376_disk_mount
222         lda     #CH376_DISK_MOUNT ; $31
223         sta     CH376_COMMAND
224         jsr     _ch376_wait_response
225         ; if we read data value, we have then length of the volume name
226         ldx     #0
227         rts     
228 .endproc 
229
230
231 ; char  ch376_wait_response();
232 .proc _ch376_wait_response
233 ; 1 return 1 if usb controller does not respond
234 ; else A contains answer of the controller
235         ldy     #$ff
236 loop3:
237         ldx     #$ff ; don't decrease this counter. Because ch376 won't respond if there is a lower value
238 loop:
239         lda     CH376_COMMAND
240         and     #%10000000
241         cmp     #128
242         bne     no_error
243         dex
244         bne     loop
245         dey
246         bne     loop3
247         ; error is here
248         rts
249 no_error:
250         lda     #CH376_GET_STATUS
251         sta     CH376_COMMAND
252         lda     CH376_DATA
253         rts
254 .endproc 
255
256 .proc _ch376_fread
257                 ; use ptr1 to count bytes
258         jsr     _ch376_set_bytes_read
259
260 continue:       
261         cmp     #CH376_USB_INT_DISK_READ  ; something to read
262         beq     we_read
263         cmp     #CH376_USB_INT_SUCCESS ; finished
264         beq     finished 
265         ; TODO  in A : $ff X: $ff
266         lda     #0
267         tax
268         rts
269 we_read:
270         lda     #CH376_RD_USB_DATA0
271         sta     CH376_COMMAND
272
273         lda     CH376_DATA ; contains length read
274         sta     tmp2; Number of bytes to read
275
276         ldy #0
277 loop:
278         lda     CH376_DATA ; read the data
279         sta     (PTR_READ_DEST),y
280
281         iny
282         cpy     tmp2
283         bne     loop
284         tya
285         clc
286         adc     PTR_READ_DEST
287         bcc     next
288         inc     PTR_READ_DEST+1
289 next:
290         sta     PTR_READ_DEST
291         
292         lda     #CH376_BYTE_RD_GO
293         sta     CH376_COMMAND
294         jsr     _ch376_wait_response
295         jmp     continue
296 finished:
297         ; TODO  return bytes read
298         lda     tmp1
299         ldx     tmp1+1
300         rts     
301 .endproc        
302
303 ; void _ch376_fwrite(void *ptr,int number)
304 .proc _ch376_fwrite
305     ; use ptr1 to count bytes
306         sta     ptr2
307         stx     ptr2+1
308         
309         jsr     popax
310         sta     PTR_READ_DEST
311         stx     PTR_READ_DEST+1
312         
313         lda     ptr2
314         ldx     ptr2+1
315         jsr     _ch376_set_bytes_write
316         ;cmp #CH376_USB_INT_SUCCESS
317         ;beq finished
318         ;jsr popax
319         
320         ;jsr _ch376_wait_response
321         
322 continue:       
323         cmp #CH376_USB_INT_DISK_WRITE  ; something to read
324         beq we_read
325         cmp #CH376_USB_INT_SUCCESS ; finished
326         beq finished 
327         ; TODO  in A : $ff X: $ff
328         lda #0
329         tax
330         rts
331 we_read:
332         lda #CH376_CMD_WR_REQ_DATA
333         sta CH376_COMMAND
334         
335         lda CH376_DATA ; contains length read
336         sta tmp2; Number of bytes to read
337
338
339         ;ldy #0
340 loop:
341         ;lda (PTR_READ_DEST),y
342         lda #65
343         sta CH376_DATA ; read the data
344         dec tmp2
345         bne loop
346
347         
348         lda #CH376_BYTE_WR_GO
349         sta CH376_COMMAND
350         jsr _ch376_wait_response
351         jmp continue
352 finished:
353         ; TODO  return bytes read
354         lda tmp1
355         ;lda #<8000
356         ldx tmp1+1
357         ;ldx #>8000
358         rts     
359 .endproc        
360
361 .proc _ch376_file_create
362         lda     #CH376_FILE_CREATE
363         sta     CH376_COMMAND
364         jsr     _ch376_wait_response
365         rts
366 .endproc