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