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
8 .export _ch376_check_exist
9 .export _ch376_disk_mount
10 .export _ch376_set_usb_mode
12 .export _ch376_file_close
13 .export _ch376_seek_file
14 .export _ch376_file_create
20 .include "zeropage.inc"
21 .include "telemon30.inc"
25 ; CODE FOR CH376_SET_USB_MODE *************************************************
27 CH376_SET_USB_MODE_CODE_USB_HOST_SOF_PACKAGE_AUTOMATICALLY := $06
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
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
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
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
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
79 .proc _ch376_file_close
82 jsr _ch376_wait_response
86 .proc _ch376_seek_file
87 ldx #CH376_BYTE_LOCATE
91 lda #$00 ; Don't manage 32 bits length
94 jsr _ch376_wait_response
98 ; void ch376_set_file_name(char *filename)
99 .proc _ch376_set_file_name
102 lda #CH376_SET_FILE_NAME ;$2f
106 lda (ptr1),y ; replace by bufnom
107 beq end ; we reached 0 value
111 cpy #13 ; because we don't manage longfilename shortname =11
118 ; char _ch376_file_open();
120 .proc _ch376_file_open
121 lda #CH376_FILE_OPEN ; $32
123 jsr _ch376_wait_response
129 .proc _ch376_get_file_size
130 lda #CH376_GET_FILE_SIZE
134 ; store file length 32 bits
146 ; void ch376_reset();
149 lda #CH376_RESET_ALL ; 5
163 ; char ch376_check_exist(char value);
165 .proc _ch376_check_exist
167 lda #CH376_CHECK_EXIST ;
175 ; char ch376_ic_get_version(void)
176 .proc _ch376_ic_get_version
177 lda #CH376_GET_IC_VER
184 ; void ch376_set_usb_mode(char mode)
186 .proc _ch376_set_usb_mode
187 ; CH376_SET_USB_MODE_CODE_USB_HOST_SOF_PACKAGE_AUTOMATICALLY
188 ldx #CH376_SET_USB_MODE ; $15
194 ; void ch376_set_bytes_write(int value);
195 .proc _ch376_set_bytes_write
196 ldy #CH376_BYTE_WRITE
203 jsr _ch376_wait_response
207 .proc _ch376_set_bytes_read
210 ; Storing 32 bits value
216 jsr _ch376_wait_response
220 ; char ch376_disk_mount();
221 .proc _ch376_disk_mount
222 lda #CH376_DISK_MOUNT ; $31
224 jsr _ch376_wait_response
225 ; if we read data value, we have then length of the volume name
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
237 ldx #$ff ; don't decrease this counter. Because ch376 won't respond if there is a lower value
250 lda #CH376_GET_STATUS
257 ; use ptr1 to count bytes
258 jsr _ch376_set_bytes_read
261 cmp #CH376_USB_INT_DISK_READ ; something to read
263 cmp #CH376_USB_INT_SUCCESS ; finished
265 ; TODO in A : $ff X: $ff
270 lda #CH376_RD_USB_DATA0
273 lda CH376_DATA ; contains length read
274 sta tmp2; Number of bytes to read
278 lda CH376_DATA ; read the data
279 sta (PTR_READ_DEST),y
292 lda #CH376_BYTE_RD_GO
294 jsr _ch376_wait_response
297 ; TODO return bytes read
303 ; void _ch376_fwrite(void *ptr,int number)
305 ; use ptr1 to count bytes
315 jsr _ch376_set_bytes_write
316 ;cmp #CH376_USB_INT_SUCCESS
320 ;jsr _ch376_wait_response
323 cmp #CH376_USB_INT_DISK_WRITE ; something to read
325 cmp #CH376_USB_INT_SUCCESS ; finished
327 ; TODO in A : $ff X: $ff
332 lda #CH376_CMD_WR_REQ_DATA
335 lda CH376_DATA ; contains length read
336 sta tmp2; Number of bytes to read
341 ;lda (PTR_READ_DEST),y
343 sta CH376_DATA ; read the data
348 lda #CH376_BYTE_WR_GO
350 jsr _ch376_wait_response
353 ; TODO return bytes read
361 .proc _ch376_file_create
362 lda #CH376_FILE_CREATE
364 jsr _ch376_wait_response