Subversion Repositories pentevo

Rev

Rev 845 | Details | Compare with Previous | Last modification | View Log | RSS feed

Rev Author Line No. Line
845 savelij 1
 
952 savelij 2
;LAST UPDATE: 27.02.2021 savelij
845 savelij 3
 
4
;               include sl811_equ.a80
5
 
6
TIMEOUT_RETRY   EQU 6
7
 
8
;bFlags
9
 BITMASK bMassDevice,           7
10
 BITMASK bData1,                6
11
 BITMASK DATA_STOP,             5
12
 BITMASK TIMEOUT_ERR,           4
13
 BITMASK SLAVE_ENUMERATED,      3
14
 BITMASK SLAVE_FOUND,           2
15
 BITMASK SLAVE_REMOVED,         1
16
 BITMASK SLAVE_IS_ATTACHED,     0
17
 
18
;室 ࠬ 騥:
19
;HL- 㧪  
20
;BCDE-32-   ᥪ
21
;A-⢮ ᥪ஢ (512 )
22
;⮫쪮  筮 /⥭
23
 
24
;  IX
25
 
26
; 窠 室  ࠡ
27
COMUSBF         EX AF,AF'
952 savelij 28
                LD (TMP_NUMHDD),A
845 savelij 29
                LD A,IYL
30
                AND A
31
                LD A,(NEXTBYTERST8)
32
                JR Z,.L1
33
                EX (SP),HL
34
                LD A,(HL)
35
                INC HL
36
                EX (SP),HL
37
.L1             ADD A,A
38
                PUSH IX
39
                PUSH IY
40
                PUSH HL
41
                LD HL,.L2
42
                EX (SP),HL
43
                PUSH HL
44
                LD HL,.TBLUSBF
45
                ADD A,L
46
                LD L,A
47
                ADC A,H
48
                SUB L
49
                LD H,A
50
                LD A,(HL)
51
                INC HL
52
                LD H,(HL)
53
                LD L,A
952 savelij 54
                LD A,(TMP_NUMHDD)
845 savelij 55
                EX AF,AF'
56
                EX (SP),HL
57
                RET
58
 
59
.L2             POP IY
60
                POP IX
61
                PUSH AF
62
                LD A,IYL
63
                AND A
64
                JR NZ,.L3
65
                LD (RREG_L),HL
66
                EX (SP),HL
67
                LD (RREG_F),HL
68
                EX (SP),HL
69
.L3             POP AF
70
                RET
71
 
72
.TBLUSBF        DW sl811_init_my
73
                DW USBOFF
74
                DW RBC_Read                     ;READ MULTI
75
                DW RBC_Write                    ;WRITE MULTI
76
                DW USBOFF
77
 
78
;=============== 樠
79
 
80
sl811_init_my   CALL sl811_reset
81
                CALL SL11HardReset
82
                LD HL,vars.bFlags
83
                LD (HL),0
84
;               RES B_SLAVE_FOUND,(HL)
85
;               RES B_SLAVE_ENUMERATED,(HL)
86
;               RES B_DATA_STOP,(HL)
87
                LD IXH,50
88
.L1             XOR A
89
                DEC IXH
90
                RET Z
91
                CALL USBReset
92
                LD HL,IntStatus << 8 + INT_CLEAR
93
                CALL SL_WRITE
94
                CALL SL_READ
95
                XOR A
96
                BIT 6,L
97
                RET NZ
98
                BIT 7,L
99
                JR Z,.L1
100
                LD HL,CtrlReg << 8 + 5
101
                CALL SL_WRITE
102
                LD HL,EP0Status << 8 + 0x50
103
                CALL SL_WRITE
104
                LD HL,EP0Counter << 8
105
                CALL SL_WRITE
106
                LD HL,EP0Control << 8 + 1
107
                CALL SL_WRITE
108
                LD HL,IntStatus << 8 + INT_CLEAR
109
                CALL SL_WRITE
110
                LD E,1
111
                CALL EnumUsbDev
112
                AND A
113
                RET Z
114
                XOR A
115
                LD HL,vars.bFlags
116
                BIT B_bMassDevice,(HL)
117
                RET Z
118
                RES B_bMassDevice,(HL)
119
                PUSH HL
120
                CALL EnumMassDev
121
                POP HL
122
                AND A
123
                RET Z
124
                SET B_SLAVE_IS_ATTACHED,(HL)
125
                LD L,(HL)
126
USBOFF          XOR A
127
                RET
128
 
129
SL11HardReset:  LD BC,UE_INT_RES
130
                IN A,(C)
131
                AND %11011111
132
                OUT (C),A
133
                LD B,HIGH (UE_CONTROL)
134
                IN A,(C)
135
                OR %01000000
136
                OUT (C),A
137
                EI
138
                HALT
139
                DI
140
                IN A,(C)
141
                AND %10101111
142
                OUT (C),A
143
                LD B,HIGH (UE_INT_RES)
144
                IN A,(C)
145
                OR %00100000
146
                OUT (C),A
147
.L1             LD B,HIGH (UE_INT_RES)
148
                IN A,(C)
149
                AND 0X10
150
                LD D,A
151
                OUT (C),A
152
                LD B,HIGH (UE_INT_RES)
153
                SET 5,D
154
                OUT (C),D
155
                LD B,HIGH (UE_MAPW5300)
156
                XOR A
157
                OUT (C),A
158
                LD HL,CtrlReg << 8
159
                CALL SL_WRITE
160
                LD HL,cDATASet << 8 + msSOFLowCountFS
161
                CALL SL_WRITE
162
                LD HL,cSOFcnt << 8 + cSOFMasterMode | cSOFFullSpeed | msSOFHighCountFS
163
                CALL SL_WRITE
164
                LD HL,IntEna << 8
165
                CALL SL_WRITE
166
                LD H,IntStatus
167
                CALL SL_READ
168
                CP 5
169
                JR Z,.L1
170
                RET
171
 
172
sl811_reset:    LD BC,UE_MAPW5300
173
                XOR A
174
                OUT (C),A
175
                LD B,HIGH (UE_INT_RES)
176
                LD A,%00100000
177
                OUT (C),A
178
 
179
USBReset:       LD H,CtrlReg
180
                CALL SL_READ
181
                LD A,L
182
                LD L,8
183
                CALL SL_WRITE
184
                EI
185
                HALT
186
;               LD L,0x18
187
;               CALL SL_WRITE
188
;               HALT
189
;               LD L,8
190
;               CALL SL_WRITE
191
;               HALT
192
                DI
193
                LD L,A
194
                JP SL_WRITE
195
 
196
;=============== ࠡ  ⠬
197
 
198
SL_READ         LD BC,SL811H_ADDR
199
                OUT (C),H
200
                LD B,HIGH (SL811H_DATA)
201
                IN L,(C)
202
.L1             LD B,HIGH (SL811H_ADDR)
203
                OUT (C),H
204
                LD B,HIGH (SL811H_DATA)
205
                IN A,(C)
206
                CP L
207
                RET Z
208
                LD L,A
209
                JR .L1
210
 
211
SL_WRITE        LD BC,SL811H_ADDR
212
                OUT (C),H
213
                LD B,HIGH (SL811H_DATA)
214
                OUT (C),L
215
                RET
216
 
217
SL_READBUF      LD BC,SL811H_ADDR
218
                OUT (C),E
219
                INC E
220
                LD B,HIGH (SL811H_DATA)
221
                INI
222
                DEC D
223
                JR NZ,SL_READBUF
224
                RET
225
 
226
SL_WRITEBUF     LD BC,SL811H_ADDR
227
                OUT (C),E
228
                INC E
229
                LD B,HIGH (SL811H_DATA) + 1
230
                OUTI
231
                DEC D
232
                JR NZ,SL_WRITEBUF
233
                RET
234
 
235
;=============== ⥭/ USB
236
 
237
EnumMassDev:    CALL SPC_Inquiry
238
                OR A
239
;               LD A,0x81
240
                RET Z
241
                CALL SPC_TestUnit
242
                OR A
243
;               LD A,0x82
244
                RET Z
245
                CALL SPC_LockMedia
246
                OR A
247
;               LD A,0x83
248
                RET Z
249
                CALL SPC_RequestSense
250
                OR A
251
;               LD A,0x84
252
                RET Z
253
                CALL SPC_TestUnit
254
                OR A
255
;               LD A,0x85
256
                RET Z
257
                CALL RBC_ReadCapacity
258
                OR A
259
;               LD A,0x86
260
                RET Z
261
                CALL SPC_RequestSense
262
                OR A
263
;               LD A,0x87
264
                RET Z
265
                CALL SPC_TestUnit
266
                OR A
267
;               LD A,0x88
268
                RET Z
269
                CALL RBC_ReadCapacity
270
                OR A
271
;               LD A,0x89
272
                RET Z
273
        IF 0
274
                LD HL,vars.DBUF
275
                LD A,1
276
                LD DE,0
277
                LD B,D
278
                LD C,E
279
                CALL RBC_Read
280
                OR A
281
;               LD A,0x8A
282
                RET Z
283
        ENDIF
284
                LD A,TRUE
285
                RET
286
 
287
SPC_Inquiry:    LD BC,0x15
288
                CALL SET_T_OUT
289
                LD C,0x1F
290
                CALL T_OUT_SEND
291
                OR A
292
                RET Z
293
                LD BC,0x24
294
                LD DE,vars.DBUF
295
                CALL epBulkRcv
296
                OR A
297
                RET Z
298
                JP T_OUT13_RECV
299
 
300
SPC_RequestSense:
301
                LD BC,0x15
302
                CALL SET_T_OUT
303
                LD A,14
304
                LD (vars.T_OUT+8),A
305
                LD A,SPC_CMD_REQUESTSENSE
306
                LD (vars.T_OUT+15),A
307
                LD A,14
308
                LD (vars.T_OUT+19),A
309
                LD C,31
310
                CALL T_OUT_SEND
311
                OR A
312
                RET Z
313
                LD BC,18
314
                CALL T_OUT_RECV
315
                OR A
316
                RET Z
317
                JP T_OUT13_RECV
318
 
319
SPC_TestUnit:   LD BC,0x15
320
                CALL SET_T_OUT
321
                XOR A
322
                LD (vars.T_OUT+8),A
323
                LD (vars.T_OUT+12),A
324
                LD (vars.T_OUT+15),A            ;SPC_CMD_TESTUNITREADY
325
                LD (vars.T_OUT+19),A
326
                LD C,0x1F
327
                CALL T_OUT_SEND
328
                OR A
329
                RET Z
330
                JP T_OUT13_RECV
331
 
332
SPC_LockMedia:  LD BC,0x15
333
                CALL SET_T_OUT
334
                XOR A
335
                LD (vars.T_OUT+8),A
336
                LD (vars.T_OUT+12),A
337
                INC A
338
                LD (vars.T_OUT+19),A
339
                LD A,5
340
                LD (vars.T_OUT+14),A
341
                LD A,SPC_CMD_PRVENTALLOWMEDIUMREMOVAL
342
                LD (vars.T_OUT+15),A
343
                LD C,0x1F
344
                CALL T_OUT_SEND
345
                OR A
346
                RET Z
347
                JP T_OUT13_RECV
348
 
349
RBC_ReadCapacity:
350
                LD BC,0x19
351
                CALL SET_T_OUT
352
                LD A,8
353
                LD (vars.T_OUT+8),A
354
                LD A,10
355
                LD (vars.T_OUT+14),A
356
                LD A,RBC_CMD_READCAPACITY
357
                LD (vars.T_OUT+15),A
358
                XOR A
359
                LD (vars.T_OUT+19),A
360
                LD C,0x1F
361
                CALL T_OUT_SEND
362
                OR A
363
                RET Z
364
                LD BC,8
365
                LD DE,vars.DBUF
366
                CALL epBulkRcv
367
                OR A
368
                RET Z
369
                JP T_OUT13_RECV
370
 
371
;HL -  
372
;BCDE -  ᥪ LBA
373
;A - ⢮ ᥪ஢
374
RBC_Read:       PUSH HL                         ; 
375
                CALL SET_LBA
376
                PUSH DE                         ;  
377
                ADC HL,HL
378
                LD (vars.T_OUT+10),HL
379
                LD A,0x80
380
                LD (vars.T_OUT+12),A
381
                LD A,10
382
                LD (vars.T_OUT+14),A
383
                LD A,RBC_CMD_READ10
384
                LD (vars.T_OUT+15),A
385
                XOR A
386
                LD (vars.T_OUT+13),A
387
                LD (vars.T_OUT+16),A
388
                LD (vars.T_OUT+21),A
389
                LD (vars.T_OUT+24),A
390
                LD BC,0x1F
391
                CALL T_OUT_SEND
392
                OR A
393
                POP BC                  ;  
394
                POP DE                  ; 
395
                RET Z
396
                CALL epBulkRcv
397
                OR A
398
                RET Z
399
                JP T_OUT13_RECV
400
 
401
SET_LBA         LD HL,vars.T_OUT+17
402
                LD (HL),B
403
                INC HL
404
                LD (HL),C
405
                INC HL
406
                LD (HL),D
407
                INC HL
408
                LD (HL),E
409
                LD BC,8
410
                LD DE,vars.T_OUT
411
                LD HL,T_DATA0
412
                LDIR
413
                LD H,A
414
                LD L,B
415
                LD (vars.T_OUT+22),HL
416
                LD D,B
417
                LD E,B
418
                ADD HL,HL
419
                LD (vars.T_OUT+8),HL
420
                EX DE,HL
421
                RET
422
 
423
;HL -  
424
;BCDE -  ᥪ LBA
425
;A - ⢮ ᥪ஢
426
RBC_Write:      PUSH HL                         ; 
427
                CALL SET_LBA
428
                PUSH DE                         ;  
429
                ADC HL,HL
430
                LD (vars.T_OUT+10),HL
431
                LD A,10
432
                LD (vars.T_OUT+14),A
433
                LD A,RBC_CMD_WRITE10
434
                LD (vars.T_OUT+15),A
435
                XOR A
436
                LD (vars.T_OUT+12),A
437
                LD (vars.T_OUT+13),A
438
                LD (vars.T_OUT+16),A
439
                LD (vars.T_OUT+21),A
440
                LD (vars.T_OUT+24),A
441
                LD BC,0x1F
442
                CALL T_OUT_SEND
443
                OR A
444
                POP BC                  ;  
445
                POP DE                  ; 
446
                RET Z
447
                CALL epBulkSend
448
                OR A
449
                RET Z
450
T_OUT13_RECV    LD BC,13
451
T_OUT_RECV      LD DE,vars.T_OUT
452
                CALL epBulkRcv
453
                OR A
454
                RET Z
455
                LD A,TRUE
456
                RET
457
 
458
T_OUT13_SEND    LD BC,13
459
T_OUT_SEND      LD DE,vars.T_OUT
460
                JP epBulkSend
461
 
462
SET_T_OUT       LD HL,T_DATA0
463
                LD DE,vars.T_OUT
464
                LDIR
465
                RET
466
 
467
;=============== ࠡ  SL811
468
 
469
;input:
470
;none
471
usbXfer:        LD HL,vars.bFlags
472
                RES B_DATA_STOP,(HL)
473
                RES B_TIMEOUT_ERR,(HL)
474
                LD A,EP0_Buf
475
                LD (vars.data0),A
476
                LD A,(usbstack_wPayload)
477
                ADD A,16
478
                LD (vars.data1),A
479
                XOR A
480
                LD (vars.timeout),A
481
                LD (vars.dataX),A
482
                LD BC,(usbstack_wPayload)
483
                LD B,A
484
                LD HL,(usbstack_wLen)
485
                LD A,L                  ;usbstack_wLen
486
                AND A
487
                SBC HL,BC
488
                JR C,.L1
489
                LD A,C                  ;usbstack_wPayload
490
.L1             LD (vars.xferLen),A
491
                LD A,(usbstack_pid)
492
                CP PID_IN
493
                JR NZ,.L2
494
                LD A,sDATA0_RD
495
                JP .L8
496
 
497
.L2             CP PID_OUT
498
                LD A,(vars.xferLen)
499
                JR NZ,.L6
500
                OR A
501
                JR Z,.L3
502
                LD DE,(vars.data0)
503
                LD D,A
504
                LD HL,(usbstack_buffer)
505
                CALL SL_WRITEBUF
506
.L3             LD A,sDATA0_WR
507
                LD (vars.cmd),A
508
                LD HL,(usbstack_endpoint)
509
                LD H,0
510
                LD D,H
511
                LD BC,uDev_bData1
512
                ADD HL,BC
513
                LD A,(vars.bFlags)
514
                AND %10111111
515
                LD B,A
516
                LD A,(HL)
517
                RRCA
518
                RRCA
519
                AND %01000000
520
                OR B
521
                LD (vars.bFlags),A
522
                LD HL,(usbstack_endpoint)
523
                LD H,D
524
                LD BC,uDev_bData1
525
                ADD HL,BC
526
                LD A,(HL)
527
                OR A
528
                LD A,1
529
                JR Z,.L5
530
                XOR A
531
.L5             LD HL,(usbstack_endpoint)
532
                LD H,D
533
                LD BC,uDev_bData1
534
                ADD HL,BC
535
                LD (HL),A
536
                LD HL,(vars.bFlags)
537
                BIT B_bData1,L
538
                JR Z,.L9
539
                LD HL,vars.cmd
540
                SET 6,(HL)
541
                JR .L9
542
 
543
.L6             OR A
544
                JR Z,.L7
545
                LD A,(usbstack_setup_wLength)
546
                LD (vars.intr),A
547
                LD HL,usbstack_setup_bmRequest
548
                LD DE,vars.SL_OUT
549
                LD BC,SetupPKG_len
550
                LDIR
551
                LD A,(vars.xferLen)
552
                LD DE,(vars.data0)
553
                LD D,A
554
                LD HL,vars.SL_OUT
555
                CALL SL_WRITEBUF
556
                LD HL,(vars.intr)
557
                LD H,0
558
                LD (usbstack_setup_wLength),HL
559
.L7             LD A,sDATA0_WR
560
.L8             LD (vars.cmd),A
561
.L9             LD A,(usbstack_endpoint)
562
                OR A
563
                JR NZ,.L10
564
                LD A,(usbstack_pid)
565
                CP PID_SETUP
566
                JR Z,.L10
567
                LD HL,vars.cmd
568
                SET 6,(HL)
569
.L10            LD HL,usbstack_pid
570
                LD A,(usbstack_endpoint)
571
                AND 0x0F
572
                OR (HL)
573
                LD L,A
574
                LD H,EP0Status
575
                CALL SL_WRITE
576
                LD HL,(usbstack_usbaddr)
577
                LD H,EP0Counter
578
                CALL SL_WRITE
579
                LD HL,(vars.data0)
580
                LD H,EP0Address
581
                CALL SL_WRITE
582
                LD HL,(vars.xferLen)
583
                LD H,EP0XferLen
584
                CALL SL_WRITE
585
                CALL S_0178
586
.L11            LD H,IntStatus
587
                CALL SL_READ
588
                LD (vars.intr),A
589
                BIT 6,A
590
                JR NZ,.L12
591
                BIT 5,A
592
                JR Z,.L13
593
.L12            LD HL,vars.bFlags
594
                SET B_DATA_STOP,(HL)
595
                XOR A
596
                RET
597
 
598
.L13            BIT 0,A
599
                JR Z,.L11
600
                LD HL,IntStatus << 8 + INT_CLEAR
601
                CALL SL_WRITE
602
                LD H,EP0Status
603
                CALL SL_READ
604
                LD (vars.result),A
605
                LD H,EP0Counter
606
                CALL SL_READ
607
                LD (vars.remainder),A
608
                LD A,(vars.result)
609
                BIT 0,A
610
                JP Z,.L20
611
                LD A,(usbstack_pid)
612
                CP PID_SETUP
613
                JP Z,.L25
614
                CP PID_OUT
615
                JP Z,.L25
616
                CP PID_IN
617
                JP NZ,.L20
618
                LD HL,(usbstack_wLen)
619
                LD BC,(vars.xferLen)
620
                XOR A
621
                LD B,A
622
                SBC HL,BC
623
                LD (usbstack_wLen),HL
624
                LD HL,vars.cmd
625
                LD A,0x40
626
                XOR (HL)
627
                LD (HL),A
628
                LD HL,vars.dataX
629
                INC (HL)
630
                LD HL,vars.xferLen
631
                LD BC,vars.remainder
632
                LD A,(BC)
633
                CP (HL)
634
                LD A,(HL)
635
                JR NZ,.L14
636
                XOR A
637
.L14            LD (vars.bufLen),A
638
                LD A,(BC)
639
                OR A
640
                JR NZ,.L17
641
                LD HL,(usbstack_wLen)
642
                LD A,H
643
                OR L
644
                JR Z,.L17
645
                LD A,(vars.dataX)
646
                BIT 0,A
647
                LD A,(vars.data0)
648
                JR Z,.L15
649
                LD A,(vars.data1)
650
.L15            LD (vars.addr),A
651
                LD BC,(usbstack_wPayload)
652
                XOR A
653
                LD B,A
654
                SBC HL,BC
655
                LD A,(usbstack_wLen)
656
                JR C,.L16
657
                LD A,(usbstack_wPayload)
658
.L16            LD (vars.xferLen),A
659
                LD HL,vars.cmd
660
                SET 5,(HL)
661
                LD L,A
662
                LD H,EP0XferLen
663
                CALL SL_WRITE
664
                LD HL,(vars.addr)
665
                LD H,EP0Address
666
                CALL SL_WRITE
667
                CALL S_0178
668
.L17            LD A,(vars.bufLen)
669
                OR A
670
                JR Z,.L19
671
                LD D,A
672
                LD A,(vars.dataX)
673
                BIT 0,A
674
                LD HL,vars.data1
675
                JR Z,.L18
676
                LD HL,vars.data0
677
.L18            LD E,(HL)
678
                LD HL,(usbstack_buffer)
679
                PUSH HL
680
                CALL SL_READBUF
681
                POP HL
682
                LD BC,(vars.bufLen)
683
                LD B,0
684
                ADD HL,BC
685
                LD (usbstack_buffer),HL
686
.L19            LD A,(vars.remainder)
687
                OR A
688
                JR NZ,.L25
689
                LD HL,(usbstack_wLen)
690
                LD A,H
691
                OR L
692
                JR Z,.L25
693
.L20            LD A,(vars.result)
694
                BIT 6,A
695
                JR Z,.L21
696
                CALL S_0178
697
                XOR A
698
                LD (vars.result),A
699
.L21            BIT 2,A
700
                JR Z,.L24
701
                LD A,(usbstack_endpoint)
702
                OR A
703
                JR NZ,.L23
704
                LD HL,vars.timeout
705
                INC (HL)
706
                LD A,(HL)
707
                CP TIMEOUT_RETRY
708
                JR C,.L22
709
                DEC (HL)
710
                JR .L25
711
 
712
.L23            LD HL,vars.bFlags
713
                SET B_TIMEOUT_ERR,(HL)
714
                JR .L25
715
 
716
.L22            CALL S_0178
717
.L24            LD A,(vars.result)
718
                LD B,A
719
                OR A
720
                LD A,TRUE
721
                RET M
722
                BIT 5,B
723
                JP Z,.L11
724
.L25            LD A,(vars.result)
725
                BIT 0,A
726
                RET Z
727
                LD A,TRUE
728
                RET
729
 
730
S_0178:         LD HL,IntStatus << 8 + INT_CLEAR
731
                CALL SL_WRITE
732
                LD HL,(vars.cmd)
733
                LD H,EP0Control
734
                JP SL_WRITE
735
 
736
;input:
737
;none
738
ep0Xfer:        XOR A
739
                LD (usbstack_endpoint),A
740
                LD A,PID_SETUP
741
                LD (usbstack_pid),A
742
                LD HL,8
743
                LD (usbstack_wLen),HL
744
                CALL usbXfer
745
                OR A
746
                RET Z
747
                LD A,PID_IN
748
                LD (usbstack_pid),A
749
                LD HL,(usbstack_setup_wLength)
750
                LD (usbstack_wLen),HL
751
                LD A,H
752
                OR L
753
                JR Z,.L1
754
                LD A,(usbstack_setup_bmRequest)
755
                OR A
756
                JP P,.L2
757
                LD A,PID_IN
758
                LD (usbstack_pid),A
759
                CALL usbXfer
760
                OR A
761
                RET Z
762
                LD A,PID_OUT
763
                JR .L3
764
 
765
.L2             LD A,PID_OUT
766
                LD (usbstack_pid),A
767
                CALL usbXfer
768
                OR A
769
                RET Z
770
                LD A,PID_IN
771
.L3             LD (usbstack_pid),A
772
.L1             LD HL,0
773
                LD (usbstack_wLen),HL
774
                CALL usbXfer
775
                OR A
776
                RET Z
777
                LD A,TRUE
778
                RET
779
 
780
;input:
781
;BC - 
782
;DE -  
783
epBulkSend:     LD A,1
784
                LD (usbstack_usbaddr),A
785
                LD A,(usbstack_epbulkout)
786
                LD (usbstack_endpoint),A
787
                LD A,PID_OUT
788
                LD (usbstack_pid),A
789
                LD A,64
790
                LD (usbstack_wPayload),A
791
                LD (usbstack_wLen),BC                   ; ।
792
                LD (usbstack_buffer),DE                 ; 
793
                LD D,B
794
                LD E,C
795
.L2             LD A,D
796
                OR E
797
                LD A,TRUE
798
                RET Z
799
                LD HL,(usbstack_wPayload)
800
                XOR A
801
                LD H,A
802
                LD (usbstack_wLen),HL
803
                SBC HL,DE
804
                JR C,.L1
805
                LD (usbstack_wLen),BC
806
.L1             PUSH DE
807
                CALL usbXfer
808
                POP HL
809
                AND A
810
                RET Z
811
                LD BC,(usbstack_wLen)
812
                SBC HL,BC
813
                EX DE,HL
814
                LD HL,(usbstack_buffer)
815
                ADD HL,BC
816
                LD (usbstack_buffer),HL
817
                JR .L2
818
 
819
;input:
820
;BC - 
821
;DE -  
822
epBulkRcv:      LD A,1
823
                LD (usbstack_usbaddr),A
824
                LD A,(usbstack_epbulkin)
825
                LD (usbstack_endpoint),A
826
                LD A,PID_IN
827
                LD (usbstack_pid),A
828
                LD A,64
829
                LD (usbstack_wPayload),A
830
                LD (usbstack_wLen),BC                   ; ।
831
                LD (usbstack_buffer),DE                 ; 
832
                LD A,B
833
                OR C
834
                LD A,TRUE
835
                RET Z
836
                CALL usbXfer
837
                AND A
838
                RET Z
839
                LD A,TRUE
840
                RET
841
 
842
;input:
843
;E-
844
SetAddress:     LD A,SET_ADDRESS
845
                LD (usbstack_setup_bRequest),A
846
                XOR A
847
                LD (usbstack_usbaddr),A
848
                LD (usbstack_setup_bmRequest),A
849
                LD L,E
850
                LD H,A
851
                LD (usbstack_setup_wValue),HL
852
                LD L,A
853
                LD (usbstack_setup_wIndex),HL
854
                LD (usbstack_setup_wLength),HL
855
                JR CALL_EP0XFER
856
 
857
;input:
858
;none
859
Set_Configuration:
860
                LD A,SET_CONFIG
861
                LD (usbstack_setup_bRequest),A
862
                XOR A
863
                LD (usbstack_setup_bmRequest),A
864
                LD H,A
865
                LD L,A
866
                LD (usbstack_setup_wIndex),HL
867
                LD (usbstack_setup_wLength),HL
868
                LD (usbstack_buffer),HL
869
                JR CALL_EP0XFER
870
 
871
;input:
872
;none
873
GetDesc:        LD A,0x80
874
                LD (usbstack_setup_bmRequest),A
875
                LD A,GET_DESCRIPTOR
876
                LD (usbstack_setup_bRequest),A
877
                LD A,(uDev_wPayLoad)
878
                LD (usbstack_wPayload),A
879
                LD HL,(usbstack_setup_wValue)
880
                LD A,L
881
                LD L,H
882
                LD H,A
883
                LD (usbstack_setup_wValue),HL
884
CALL_EP0XFER    PUSH DE
885
                CALL ep0Xfer
886
                POP DE
887
                RET
888
 
889
;input:
890
;E - usbaddr
891
EnumUsbDev:     LD HL,0x40
892
                LD (uDev_wPayLoad),HL
893
                DEC E
894
                INC E
895
                CALL Z,USBReset
896
                XOR A
897
                LD (usbstack_usbaddr),A
898
                LD HL,1
899
                LD (usbstack_setup_wValue),HL
900
                DEC L
901
                LD (usbstack_setup_wIndex),HL
902
                LD L,0x12
903
                LD (usbstack_setup_wLength),HL
904
                LD HL,vars.DBUF
905
                LD (usbstack_buffer),HL
906
                CALL GetDesc
907
                OR A
908
                RET Z
909
                LD HL,(vars.DBUF+7)
910
                LD H,0
911
                LD (uDev_wPayLoad),HL
912
                CALL SetAddress
913
                OR A
914
                RET Z
915
                LD A,E
916
                LD (usbstack_usbaddr),A
917
                LD HL,(vars.DBUF)
918
                LD H,0
919
                LD (usbstack_setup_wLength),HL
920
                LD L,1
921
                LD (usbstack_setup_wValue),HL
922
                DEC L
923
                LD (usbstack_setup_wIndex),HL
924
                LD HL,vars.DBUF
925
                LD (usbstack_buffer),HL
926
                LD IXH,A
927
                CALL GetDesc
928
                OR A
929
                RET Z
930
                LD A,(vars.DBUF+14)
931
                LD (uDev_iMfg),A
932
                LD A,(vars.DBUF+15)
933
                LD (uDev_iPdt),A
934
                LD HL,vars.DBUF+8
935
                LD C,(HL)
936
                INC HL
937
                LD B,(HL)
938
                INC HL
939
                LD (uDev_wVID),BC
940
                LD C,(HL)
941
                INC HL
942
                LD B,(HL)
943
                LD (uDev_wPID),BC
944
                LD A,IXH
945
                LD (usbstack_usbaddr),A
946
                LD HL,2
947
                LD (usbstack_setup_wValue),HL
948
                LD L,H
949
                LD (usbstack_setup_wIndex),HL
950
                LD L,0x40
951
                LD (usbstack_setup_wLength),HL
952
                LD HL,vars.DBUF
953
                LD (usbstack_buffer),HL
954
                CALL GetDesc
955
                OR A
956
                RET Z
957
                LD HL,vars.DBUF+14
958
                LD A,(HL)
959
                LD (uDev_bClass),A
960
                DEC HL
961
                LD A,MAX_EP
962
                CP (HL)
963
                JR C,.L1
964
                LD A,(HL)
965
.L1             LD (uDev_bNumOfEPs),A
966
                LD A,(uDev_bClass)
967
                CP 8
968
                JR NZ,.L2
969
                LD HL,vars.bFlags
970
                SET B_bMassDevice,(HL)
971
.L2             LD A,IXH
972
                LD (usbstack_usbaddr),A
973
                LD HL,1
974
                LD (usbstack_setup_wValue),HL
975
                CALL Set_Configuration
976
                OR A
977
                RET Z
978
                LD IXL,0
979
                LD D,1
980
.L3             LD A,(uDev_bNumOfEPs)
981
                CP D
982
                LD A,TRUE
983
                RET C
984
                LD HL,vars.DBUF+20
985
                LD C,IXL
986
                LD B,0
987
                ADD HL,BC
988
                LD A,(HL)
989
                LD HL,uDev_bEPAddr
990
                LD C,D
991
                ADD HL,BC
992
                LD (HL),A
993
                LD HL,vars.DBUF+21
994
                LD C,IXL
995
                ADD HL,BC
996
                LD A,(HL)
997
                LD HL,uDev_bAttr
998
                LD C,D
999
                ADD HL,BC
1000
                LD (HL),A
1001
                LD HL,uDev_wPayLoad
1002
                LD C,D
1003
                ADD HL,BC
1004
                ADD HL,BC
1005
                PUSH HL
1006
                LD HL,vars.DBUF+23
1007
                LD C,IXL
1008
                ADD HL,BC
1009
                POP BC
1010
                INC BC
1011
                LD A,(HL)
1012
                LD (BC),A
1013
                INC HL
1014
                DEC BC
1015
                LD A,(HL)
1016
                LD (BC),A
1017
                LD HL,vars.DBUF+24
1018
                LD C,IXL
1019
                ADD HL,BC
1020
                LD A,(HL)
1021
                LD HL,uDev_bInterval
1022
                LD C,D
1023
                LD B,0
1024
                ADD HL,BC
1025
                ADD HL,BC
1026
                LD (HL),A
1027
                INC HL
1028
                LD (HL),B
1029
                LD HL,uDev_bData1
1030
                LD C,D
1031
                ADD HL,BC
1032
                LD (HL),B
1033
                LD A,IXL
1034
                ADD A,7
1035
                LD IXL,A
1036
                INC D
1037
                LD HL,uDev_bAttr
1038
                ADD HL,BC
1039
                LD B,(HL)
1040
                DEC B
1041
                DEC B
1042
                JP NZ,.L3
1043
                LD HL,uDev_bEPAddr
1044
                ADD HL,BC
1045
                LD A,(HL)
1046
                OR A
1047
                LD HL,uDev_bEPAddr
1048
                ADD HL,BC
1049
                LD A,(HL)
1050
                LD (usbstack_epbulkout),A
1051
                JP P,.L3  
1052
                LD (usbstack_epbulkin),A
1053
                JP .L3
1054
 
1055
T_DATA0:        DB "USBC",0x60,0xA6,0x24,0xDE
1056
                DB 0x24,0,0,0,0x80,0,6
1057
                DB SPC_CMD_INQUIRY
1058
                DB 0,0,0,0x24,0,0,0,0
1059
 
1060
        IF 0
1061
vars
1062
 
1063
.bFlags         DW 0
1064
 
1065
.xferLen        DB 0
1066
.data0          DB 0
1067
.data1          DB 0
1068
.cmd            DB 0
1069
.intr           DB 0
1070
.result         DB 0
1071
.remainder      DB 0
1072
.dataX          DB 0
1073
.bufLen         DB 0
1074
.addr           DB 0
1075
.timeout        DB 0
1076
 
1077
.SL_OUT         DB 0 dup (8)
1078
.DBUF           DB 0 dup (64);512;1024
1079
.T_OUT          DB 0 dup (32)
1080
 
1081
uDev            pUSBDEV
1082
usbstack        PKG
1083
        ENDIF
1084
ECOMUSBF
1085