Subversion Repositories pentevo

Rev

Rev 845 | Blame | Compare with Previous | Last modification | View Log | Download | RSS feed | ?url?

  1.  
  2. ;LAST UPDATE: 27.02.2021 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'
  28.                 LD (TMP_NUMHDD),A
  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
  54.                 LD A,(TMP_NUMHDD)
  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.  
  1086.