?login_element?

Subversion Repositories NedoOS

Rev

Rev 1969 | Blame | Compare with Previous | Last modification | View Log | Download | RSS feed

  1. ;я драйвер визнета
  2. WIZ_BASE_ADDR EQU 0x00ab
  3. WIZ_SOCK0_HNDL EQU 8
  4. WIZ_REGAD_PORT EQU 0x8100+WIZ_BASE_ADDR
  5. WIZ_CFG_PORT EQU 0x8200+WIZ_BASE_ADDR
  6.  
  7. WIZ_S_MR EQU 0x01
  8. WIZ_S_CR EQU 0x03
  9. WIZ_S_SSR EQU 0x09
  10. WIZ_S_PORTR_H EQU 0x0a
  11. WIZ_S_PORTR_L EQU 0x0b
  12. WIZ_S_DPORTR_H EQU 0x12
  13. WIZ_S_DPORTR_L EQU 0x13
  14. WIZ_S_DIPR0 EQU 0x14
  15. WIZ_S_DIPR1 EQU 0x15
  16. WIZ_S_DIPR2 EQU 0x16
  17. WIZ_S_DIPR3 EQU 0x17
  18. WIZ_S_PROTOR EQU 0x1b
  19. WIZ_S_WRSR_H EQU 0x22
  20. WIZ_S_WRSR_L EQU 0x23
  21. WIZ_S_FSR_H EQU 0x26
  22. WIZ_S_FSR_L EQU 0x27
  23. WIZ_S_RX_RSR_H EQU 0x2a
  24. WIZ_S_RX_RSR_L EQU 0x2b
  25. WIZ_S_TX_H EQU 0x2e
  26. WIZ_S_TX_L EQU 0x2f
  27. WIZ_S_RX_H EQU 0x30
  28. WIZ_S_RX_L EQU 0x31
  29.  
  30.  
  31. IPPROTO_ICMP EQU 1
  32. IPPROTO_IGMP EQU 2
  33. IPPROTO_TCP EQU 6
  34. IPPROTO_UDP EQU 17
  35.  
  36.  
  37. AF_UNSPEC EQU 0
  38. AF_INET EQU 2
  39. AF_INET6 EQU 23
  40.  
  41. SOCK_STREAM EQU 0x01    ;tcp/ip
  42. SOCK_ICMP       EQU 0x02                ;icmp
  43. SOCK_DGRAM      EQU 0x03                ;udp/ip
  44.  
  45. SHUT_RDWR               EQU 2
  46. ERR_EAGAIN              EQU 35          ;/* Try again */
  47. ERR_EWOULDBLOCK EQU ERR_EAGAIN  ;/* Operation would block */
  48. ERR_INTR                EQU 4
  49. ERR_NFILE               EQU 23
  50. ERR_ALREADY     EQU 37
  51. ERR_NOTSOCK     EQU 38
  52. ERR_EMSGSIZE    EQU 40    ;/* Message too long */
  53. ERR_PROTOTYPE   EQU 41
  54. ERR_AFNOSUPPORT EQU 47
  55. ERR_HOSTUNREACH EQU 65
  56. ERR_ECONNABORTED EQU    53      /* Software caused connection abort */
  57. ERR_CONNRESET   EQU 54
  58. ERR_NOTCONN     EQU 57
  59. ;struct sockaddr_in {unsigned char sin_family;unsigned short sin_port;
  60. ;       struct in_addr sin_addr;char sin_zero[8];};
  61.  
  62. ;/***************************************/
  63. ;/* The bit of Sn_MR regsiter defintion */
  64. ;/***************************************/
  65. Sn_MR_ALIGN         EQU (1 << 8)             ;< Alignment bit of Sn_MR. */
  66. Sn_MR_MULTI         EQU (1 << 7)             ;< Multicasting bit of Sn_MR. */
  67. Sn_MR_MF            EQU (1 << 6)             ;< MAC filter bit of Sn_MR. */
  68. Sn_MR_IGMPv         EQU (1 << 5)             ;< IGMP version bit of Sn_MR. */
  69. Sn_MR_ND            EQU (1 << 5)             ;< No delayed ack bit of Sn_MR. */
  70. Sn_MR_CLOSE         EQU 0x00                 ;< Protocol bits of Sn_MR. */
  71. Sn_MR_TCP           EQU 0x01                     ;< Protocol bits of Sn_MR. */
  72. Sn_MR_UDP           EQU 0x02                 ;< Protocol bits of Sn_MR. */
  73. Sn_MR_IPRAW         EQU 0x03                 ;< Protocol bits of Sn_MR. */
  74. Sn_MR_MACRAW        EQU 0x04                 ;< Protocol bits of Sn_MR. */
  75. Sn_MR_PPPoE         EQU 0x05                 ;< Protocol bits of Sn_MR. */
  76.  
  77. ;/******************************/
  78. ;/* The values of CR defintion */
  79. ;/******************************/
  80.  
  81. Sn_CR_OPEN          EQU 0x01                 ;< OPEN command value of Sn_CR. */
  82. Sn_CR_LISTEN        EQU 0x02                 ;< LISTEN command value of Sn_CR. */
  83. Sn_CR_CONNECT       EQU 0x04                 ;< CONNECT command value of Sn_CR. */
  84. Sn_CR_DISCON        EQU 0x08                 ;< DISCONNECT command value of Sn_CR. */
  85. Sn_CR_CLOSE         EQU 0x10                 ;< CLOSE command value of Sn_CR. */
  86. Sn_CR_SEND          EQU 0x20                 ;< SEND command value of Sn_CR. */
  87. Sn_CR_SEND_MAC      EQU 0x21                 ;< SEND_MAC command value of Sn_CR. */
  88. Sn_CR_SEND_KEEP     EQU 0x22                 ;< SEND_KEEP command value of Sn_CR */
  89. Sn_CR_RECV          EQU 0x40                 ;< RECV command value of Sn_CR */
  90. Sn_CR_PCON          EQU 0x23                 ;< PCON command value of Sn_CR */
  91. Sn_CR_PDISCON       EQU 0x24                 ;< PDISCON command value of Sn_CR */
  92. Sn_CR_PCR           EQU 0x25                 ;< PCR command value of Sn_CR */
  93. Sn_CR_PCN           EQU 0x26                 ;< PCN command value of Sn_CR */
  94. Sn_CR_PCJ           EQU 0x27                 ;< PCJ command value of Sn_CR */
  95.  
  96. ;/**********************************/
  97. ;/* The values of Sn_SSR defintion */
  98. ;/**********************************/
  99. SOCK_CLOSED         EQU 0x00                 ;< SOCKETn is released */
  100. SOCK_ARP            EQU 0x01                 ;< ARP-request is transmitted in order to acquire destination hardware address. */
  101. SOCK_INIT           EQU 0x13                 ;< SOCKETn is open as TCP mode. */
  102. SOCK_LISTEN         EQU 0x14                 ;< SOCKETn operates as "TCP SERVER" and waits for connection-request (SYN packet) from "TCP CLIENT". */
  103. SOCK_SYNSENT        EQU 0x15                 ;< Connect-request(SYN packet) is transmitted to "TCP SERVER". */
  104. SOCK_SYNRECV        EQU 0x16                 ;< Connect-request(SYN packet) is received from "TCP CLIENT". */
  105. SOCK_ESTABLISHED    EQU 0x17                 ;< TCP connection is established. */
  106. SOCK_FIN_WAIT       EQU 0x18                 ;< SOCKETn is closing. */
  107. SOCK_CLOSING        EQU 0x1A                 ;< SOCKETn is closing. */
  108. SOCK_TIME_WAIT      EQU 0x1B                 ;< SOCKETn is closing. */
  109. SOCK_CLOSE_WAIT     EQU 0x1C                 ;< Disconnect-request(FIN packet) is received from the peer. */
  110. SOCK_LAST_ACK       EQU 0x1D                 ;< SOCKETn is closing. */
  111. SOCK_UDP            EQU 0x22                 ;< SOCKETn is open as UDP mode. */
  112. SOCK_IPRAW          EQU 0x32                 ;< SOCKETn is open as IPRAW mode. */
  113. SOCK_MACRAW         EQU 0x42                 ;< SOCKET0 is open as MACRAW mode. */
  114. SOCK_PPPoE          EQU 0x5F                 ;< SOCKET0 is open as PPPoE mode. */
  115.                
  116. wizlocalport:
  117.                 defw 0xc000
  118.                
  119. w53_socflags=$-1: ;+0 - RXreg, +1 - Nsoc, +2..3 - RXcount, +4 procID
  120.         defb 0,WIZ_SOCK0_HNDL+0,0,0,0,0,WIZ_SOCK0_HNDL+1,0,0,0,0,WIZ_SOCK0_HNDL+2,0,0,0
  121.                 defb 0,WIZ_SOCK0_HNDL+3,0,0,0,0,WIZ_SOCK0_HNDL+4,0,0,0,0,WIZ_SOCK0_HNDL+5,0,0,0
  122.         defb 0,WIZ_SOCK0_HNDL+6,0,0,0,0,WIZ_SOCK0_HNDL+7,0,0,0
  123. w53_endsocflags:
  124.                
  125. w53_drop_socs
  126.                 ld ix,w53_socflags+1-5
  127. w53_drop_socs_loop
  128.                 ld bc,5
  129.                 add ix,bc
  130.                 ld a,ixl
  131.                 cp 0xff&w53_endsocflags
  132.                 ret z
  133.                 ld a,(ix+4)
  134.                 cp (iy+app.id)
  135.                 jr nz,w53_drop_socs_loop
  136.                 call w53_valid_free
  137.                 ld e,0
  138.                 call w53_close_valid
  139.                 jr w53_drop_socs_loop
  140.                
  141. wiznet_open
  142. ;L-subfunction
  143.                 dec l
  144.                 jr z,w53_socket
  145.                 dec l
  146.                 jp z,w53_close
  147.                 dec l
  148.                 jp z,w53_connect
  149.                 dec l
  150.                 jp z,w53_accept
  151.                 dec l
  152.                 jp z,w53_bind
  153.                 dec l
  154.                 jp z,w53_listen
  155.                 dec l
  156.                 jp z,w53_setdns
  157.                 dec l
  158.                 jp z,w53_getdns
  159.                 ld a,ERR_INTR   ;функция не существует
  160.                 ld hl,-1
  161.                 ret
  162. w53_setdns:     ;DE-указатель на 4 байта dns
  163.                 call BDOS_preparedepage
  164.                 call BDOS_setdepage
  165.                 ld hl,.dns
  166.                 ex de,hl
  167. .dnsldi
  168.                 ldi
  169.                 ldi
  170.                 ldi
  171.                 ldi
  172.                 ret
  173. .dns   
  174.                 defb 8,8,4,4
  175. w53_getdns:     ;DE-указатель на 4 байта dns
  176.                 call BDOS_preparedepage
  177.                 call BDOS_setdepage
  178.                 ld hl,w53_setdns.dns
  179.                 jr w53_setdns.dnsldi
  180.  
  181.                 display "w53_socket", w53_socket
  182. w53_socket:
  183. ;E-socket type, D-address family
  184. ;ищем свободный сокет
  185.                 ld l,-1 ; по умолчаню ошибка
  186.                 ld a,AF_INET
  187.                 cp d
  188.                 ld a,ERR_AFNOSUPPORT
  189.                 ret nz
  190. w53_socket3:
  191.                 ld ix,w53_socflags + 1 - 5
  192.                 ld bc, 5
  193.                 ld d,8 + 1
  194. w53_socket0:
  195.                 dec d
  196.                 jr nz,w53_socket1
  197.                 ld a,ERR_NFILE ;все сокеты заняты
  198.                 ret
  199. w53_socket1:
  200.                 add ix,bc
  201.                 ld a,(ix+4)
  202.                 or a
  203.                 jr nz,w53_socket0
  204.                 call w53_valid_free
  205.                 ld a,e
  206.                 ld d,Sn_MR_TCP
  207.                 cp SOCK_STREAM
  208.                 jr z,w53_socket2
  209.                 ld d,Sn_MR_UDP
  210.                 cp SOCK_DGRAM
  211.                 jr z,w53_socket2
  212.                 ld d,Sn_MR_IPRAW
  213.                 cp SOCK_ICMP
  214.                 jr z,w53_socket2_icmp
  215.                 ld a,ERR_PROTOTYPE
  216.                 ret
  217. w53_socket2:
  218.                 ld b,WIZ_S_MR
  219.                 out (c),d
  220.                 ld a,(iy+app.id)
  221.                 ld (ix+4),a
  222.                 ld de,(wizlocalport)
  223.                 inc de
  224.                 set 6,d
  225.                 set 7,d
  226.                 ld (wizlocalport),de
  227.                 ld b,WIZ_S_PORTR_H
  228.                 out (c),d
  229.                 inc b
  230.                 out (c),e
  231.                 ld a,ixl
  232.                 sub w53_socflags & 0xff
  233.                 ld l,a
  234.                 xor a
  235.                 ld (ix+2),a
  236.                 ld (ix+3),a
  237.                 ret
  238. w53_socket2_icmp:
  239.                 ld b,WIZ_S_PROTOR
  240.                 ld a,IPPROTO_ICMP
  241.                 out (c),a
  242.                 jr w53_socket2
  243.  
  244.                
  245. w53_bind:
  246.                 call w53_valid_socket
  247.                 jp z,w53_invalid_socked0
  248.                 call BDOS_preparedepage
  249.                 call BDOS_setdepage
  250.                 ld bc,WIZ_BASE_ADDR+(WIZ_S_PORTR_H<<8)
  251.                 inc de
  252.                 ld a,(de)
  253.                 out (c),a
  254.                 inc b
  255.                 inc de
  256.                 ld a,(de)
  257.                 out (c),a
  258.                 xor a
  259.                 ld l,a
  260.                 ret
  261.                
  262. w53_accept:
  263.                 call w53_valid_socket
  264.                 jp z,w53_invalid_socked0
  265.                 ld l,-1
  266.                 ld b,WIZ_S_SSR         
  267.                 in a,(c)
  268.                 jr nz,w53_accept_live
  269.                 ld a,ERR_ECONNABORTED   ;сокет сдох
  270.                 ret
  271. w53_accept_live:
  272.                 cp SOCK_ESTABLISHED
  273.                 jr z,w53_accept_est
  274.                 ld a,ERR_EAGAIN                 ;пока никого нет
  275.                 ret            
  276. w53_accept_est:
  277.                 ld b,WIZ_S_PORTR_H              ;запомним порт
  278.                 in e,(c)
  279.                 inc b
  280.                 in d,(c)
  281.                 push ix
  282.                 push de
  283.                 ld e,SOCK_STREAM
  284.                 call w53_socket3
  285.                 pop de
  286.                 ld a,l
  287.                 or a
  288.                 jp p,w53_accept_nsoc
  289.                 pop hl  ;сокет недали. вернем текущий
  290.                 ret
  291. w53_accept_nsoc:
  292.                 ld b,WIZ_S_PORTR_H
  293.                 out (c),e
  294.                 inc b
  295.                 out (c),d
  296.                 call w53_listen_acc
  297.                 pop hl
  298.                 inc hl
  299.                 ld a,(hl)       ;поменяем сокеты местами
  300.                 ld e,(ix+1)
  301.                 ld (hl),e
  302.                 ld (ix+1),a
  303.                 ld a,ixl
  304.                 sub 0xff&w53_socflags
  305.                 ld l,a
  306.                 xor a
  307.                 ret
  308.                
  309.                
  310. w53_listen:
  311.                 call w53_valid_socket
  312.                 jp z,w53_invalid_socked0
  313.                 ld b,WIZ_S_SSR
  314.                 in a,(c)
  315.                 or a
  316.                 ld a,ERR_ALREADY
  317.                 ret nz
  318. w53_listen_acc:
  319.                 ld a,Sn_CR_OPEN
  320.                 call w53_cmd
  321.                 ld b,WIZ_S_SSR
  322. w53_listen0:
  323.                 in a,(c)
  324.                 or a
  325.                 jr z,w53_listen0
  326.                 ld a,Sn_CR_LISTEN
  327.                 call w53_cmd
  328.                 xor a
  329.                 ld l,a
  330.                 ret
  331.  
  332. w53_valid_socket:
  333.                 ex af,af'
  334.                 or a
  335.                 jr z,w53_invalid_socked
  336.                 cp 37
  337.                 jr nc,w53_invalid_socked
  338. w53_valid_socket1:
  339.                 add a,0xff&w53_socflags
  340.                 ld ixl,a
  341.                 ld a,0
  342.                 adc a,0xff&(w53_socflags>>8)
  343.                 ld ixh,a
  344.                 ld a,(ix+4)
  345.                 cp (iy+app.id)
  346.                 jr nz,w53_invalid_socked
  347. w53_valid_free:
  348.                 ld bc,WIZ_CFG_PORT
  349.                 in a,(c)
  350.                 and 0x40
  351.                 or 0x10
  352.                 out (c),a
  353.                 ld b,0xff&(WIZ_REGAD_PORT>>8) ;bc,WIZ_REGAD_PORT
  354.                 ld a,(ix+1)
  355.                 out (c),a
  356.                 ld b,WIZ_S_MR
  357.                 in a,(c)
  358.                 and 0x0f       
  359.                 ret
  360. w53_invalid_socked:
  361.                 pop af
  362. w53_invalid_socked0:
  363.                 ld hl,-1
  364.                 ld a,ERR_NOTSOCK
  365.                 ret
  366.  
  367. w53_open_cmd
  368.                 ld a,Sn_CR_OPEN
  369.                 call w53_cmd
  370.                 ld b,WIZ_S_SSR
  371. w53_op_cmd1:
  372.                 in a,(c)
  373.                 or a
  374.                 jr z,w53_op_cmd1
  375.                 ret
  376.                
  377. w53_connect:
  378. ;DE-sockaddr_in
  379.                 ld l,-1
  380.                 call w53_valid_socket
  381.                 jp z,w53_invalid_socked0
  382.                 ;dec a
  383.                 ;ld a,ERR_PROTOTYPE
  384.                 ;ret nz
  385.                 ld b,WIZ_S_SSR
  386.                 in a,(c)
  387.                 or a
  388.                 ld a,ERR_ALREADY
  389.                 ret nz
  390.                 call w53_open_cmd
  391.                 call w53_cpy_ia
  392.                 ld a,Sn_CR_CONNECT
  393.                 call w53_cmd
  394.                 ld b,WIZ_S_SSR
  395. w53_connect2:
  396.                 in a,(c)
  397.                 cp SOCK_ESTABLISHED
  398.                 jr z,w53_connect3
  399.                 or a
  400.                 jr nz,w53_connect2
  401.                 ld l,-1
  402.                 ld a,ERR_HOSTUNREACH
  403.                 ret
  404. w53_connect3:
  405.                 xor a
  406.                 ld l,a
  407.                 ret
  408.                
  409. w53_cpy_ia
  410.                 call BDOS_preparedepage
  411.                 call BDOS_setdepage
  412. w53_cpy_ia2
  413.                 ex de,hl
  414.                 inc hl  ;пропустим семейство
  415.                 ld bc,WIZ_BASE_ADDR+(WIZ_S_DPORTR_L<<8)
  416.                 ld a,6
  417. w53_cpy_ia1:
  418.                 outi
  419.                 inc b
  420.                 inc b
  421.                 dec a
  422.                 jr nz,w53_cpy_ia1
  423.                 ex de,hl
  424.                 ret
  425.                
  426. w53_close:
  427.                 call w53_valid_socket
  428. w53_close_valid:
  429.                 ld l,0
  430.                 ld (ix+4),l
  431.                 ret z   ;сокет уже убит
  432.                 dec l
  433.                 ex af,af'
  434.                 ld a,e
  435.                 or a
  436.                 jr z,w53_close_nochk
  437.                 ld b,WIZ_S_FSR_H        ;проверим пуст ли буфер отправки
  438.                 in a,(c)
  439.                 cp 0x20
  440.                 jr nz,w53_close_nochk
  441.                 inc b
  442.                 in e,(c)        ;????что то не так????
  443.                                         ;восстановить ID
  444. w53_close_nochk:
  445.                 ex af,af'
  446.                 cp Sn_MR_TCP
  447.                 jr nz,w53_close_udp
  448. w53_close_tcp:
  449.                 ld b,WIZ_S_SSR
  450.                 in a,(c)
  451.                 jr z,w53_close3         ;уже закрыт??? возможно ненужно
  452.                 cp SOCK_CLOSE_WAIT
  453.                 jr nc,w53_close_discon
  454.                 ;jr nc,w53_close_tcp
  455.                 cp SOCK_ESTABLISHED
  456.                 jr nz,w53_close_wait    ;w53_closewait
  457.                 ld a,e
  458.                 or a
  459.                 ld a,ERR_EAGAIN
  460.                 ret nz
  461. w53_close_discon
  462.                 ld a,Sn_CR_DISCON
  463.                 call w53_cmd
  464.                 jr w53_close_tcp
  465. w53_close_udp:
  466.                 ld b,WIZ_S_SSR
  467.                 in a,(c)
  468.                 cp SOCK_UDP
  469.                 jr c,w53_close_wait
  470.                 ld a,e
  471.                 or a
  472.                 ld a,ERR_EAGAIN
  473.                 ret nz
  474. w53_close_wait:
  475.                 ld a,Sn_CR_CLOSE
  476.                 call w53_cmd
  477.                 ld b,WIZ_S_SSR
  478. w53_close2:
  479.                 in a,(c)
  480.                 or a
  481.                 jr nz,w53_close2
  482. w53_close3:
  483.                 xor a
  484.                 ld b,WIZ_S_MR
  485.                 out (c),a
  486.                 ld l,a
  487.                 ret
  488.                
  489. w53_cmd:
  490.                 ld b,WIZ_S_CR
  491.                 out (c),a
  492. w53_cmd0:
  493.                 in a,(c)
  494.                 or a
  495.                 ret z
  496.                 jr w53_cmd0
  497.  
  498. w53_rd_nontcp:
  499.                 ld b,WIZ_S_SSR
  500.                 in a,(c)
  501.                 call z,w53_open_cmd
  502.                 ld bc,WIZ_BASE_ADDR+(WIZ_S_RX_RSR_L<<8)
  503.                 in a,(c)
  504.                 jr nz,w53_rd_udp_full
  505.                 dec b
  506.                 in a,(c)
  507.                 jr nz,w53_rd_udp_full
  508. w53_eagain
  509.                 ld hl,-1
  510.                 ld a,ERR_EAGAIN
  511.                 ret    
  512. w53_rd_udp_full
  513. ;               ld a,d
  514. ;               or e
  515. ;               jr nz,w53_rd_ia
  516. ;               ld de,w53_ia_buf               
  517. ;w53_rd_ia:
  518.                 ex de,hl
  519.                 inc hl
  520.                 push hl
  521.                 inc hl
  522.                 inc hl
  523.                 ld b,WIZ_S_SSR
  524.                 in a,(c)
  525.                 ld b,WIZ_S_RX_H
  526.                 ini
  527.                 ld b,WIZ_S_RX_L
  528.                 ini
  529.                 ini
  530.                 ld b,WIZ_S_RX_L
  531.                 ini
  532.                 pop hl
  533.                 cp SOCK_IPRAW
  534.                 jr z,w53_rd_ipraw
  535.                 ini
  536.                 ld b,WIZ_S_RX_L
  537.                 ini
  538. w53_rd_ipraw:
  539.                 in h,(c)
  540.                 inc b
  541.                 in l,(c)
  542.                 or a
  543.                 sbc hl,de
  544.                 bit 7,h
  545.                 ex de,hl
  546.                 jr z,w53_rd_udpbuf
  547.                 add hl,de
  548.                 ld de,0
  549. w53_rd_udpbuf; читать hl, пропустить de
  550.                 push de
  551. w53_rd_ix=$+1
  552.                 ld de,0
  553.                 call BDOS_preparedepage
  554.                 call BDOS_setdepage
  555.                 ld (w53_rdudp_cnt),hl
  556.                 push hl
  557.                 pop ix
  558.                 ex de,hl
  559.                 ld bc,WIZ_BASE_ADDR+(WIZ_S_RX_H<<8)
  560.                 ld de, -2
  561.                 jp w53_rd_udp_loop1
  562.                 ;IX = count, DE = -2, HL = ptr
  563. w53_rd_udp_loop
  564.                 ini
  565.                 ld b,WIZ_S_RX_L
  566.                 ini
  567. w53_rd_udp_loop1
  568.                 add ix,de
  569.                 jp c,w53_rd_udp_loop
  570.                 ld a,xl
  571.                 rra
  572.                 jr nc,w53_rd_udp_odd
  573.                 ini
  574.                 ld b,WIZ_S_RX_L
  575.                 in a,(c)
  576.                 dec b
  577. w53_rd_udp_odd
  578.                 pop hl
  579.                 jp .l2
  580. .l1
  581.                 in a,(c)
  582.                 inc b
  583.                 in a,(c)
  584.                 dec b
  585. .l2
  586.                 add hl,de
  587.                 jp c,.l1
  588. w53_rdudp_cnt=$+1
  589.                 ld hl,0
  590.                 ld a,Sn_CR_RECV
  591.                 jp w53_cmd      ;выходим
  592.                        
  593. wiznet_read:    ;a'-сокет, de-Буфер, hl-количество
  594.                 ld (w53_rd_ix),ix
  595.                 call w53_valid_socket
  596.                 jp z,w53_invalid_socked0
  597.                 and 0x02
  598.                 jp nz,w53_rd_nontcp
  599. w53_read_min:   ;hl-сколько хотим байт
  600.                 ld a,h
  601.                 or l
  602.                 ret z
  603. w53_read55:
  604.                 ld c,(ix+2)
  605.                 ld b,(ix+3)
  606.                 ld a,b
  607.                 or c
  608.                 jp z,w53_read_new       ;старых данных нету, читать новый пакет
  609.                
  610.                 ;читаем старый пакет
  611.                 ;bc=min(hl,bc), datasize-=bc
  612.                 sbc hl,bc
  613.                 ld a,c
  614.                 jr nc,w53_minimum0
  615.                 add hl,bc
  616.                 ld b,h
  617.                 ld c,l
  618.                 ;ld h,0
  619.                 ;ld l,0
  620. w53_minimum0:
  621.                 ;ld a,(ix+2)
  622.                 sub c
  623.                 ld (ix+2),a
  624.                 ld a,(ix+3)
  625.                 sbc a,b
  626.                 ld (ix+3),a
  627.                
  628.                 push bc                         ;сколько реально прочтем сохраним
  629.                 ex de,hl
  630.                 ld d,b
  631.                 ld e,c
  632.                  ;0x00ff => 0x00ff
  633.                  ;0x0100 => 0x0000
  634.                  dec de
  635.                  inc e
  636.                
  637.                 ld c,WIZ_BASE_ADDR
  638.                 ld b,(ix+0)
  639.                 ld a,WIZ_S_RX_L
  640.                 ;bit 0,b
  641.                 ;jr nz,w53_read_loopl
  642.                 cp b
  643.                 jr z,w53_read_loopl
  644. w53_read_loop:  ;что-то надо дочитать de-count, hl-ptr
  645.                 ini
  646.                 ld b,a
  647.                 dec e
  648.                 jr z,w53_read_looph
  649. w53_read_loopl:
  650.                 ini
  651.                 dec e
  652.                 jp nz,w53_read_loop
  653.                 dec d
  654.                 ;jp p,w53_read_loop
  655.                 jp m,w53_read_loope
  656.                 if 1==1
  657. w53_read_fastloopd:
  658.                 ld e,256/8/2
  659. w53_read_fastloop:
  660.                 dup 8
  661.                 ini
  662.                 ld b,a
  663.                 ini
  664.                 edup
  665.                 dec e
  666.                 jp nz,w53_read_fastloop
  667.                 dec d
  668.                 jp p,w53_read_fastloopd
  669.                 jp w53_read_loope
  670.                 endif
  671. w53_read_looph:
  672.                 dec d
  673.                 ;jp p,w53_read_loopl
  674.                 jp m,w53_read_loope
  675.                 if 1==1
  676. w53_read_fastloophd:
  677.                 ld e,256/8/2
  678. w53_read_fastlooph:
  679.                 dup 8
  680.                 ini
  681.                 ini
  682.                 ld b,a
  683.                 edup
  684.                 dec e
  685.                 jp nz,w53_read_fastlooph
  686.                 dec d
  687.                 jp p,w53_read_fastloophd
  688.                 ;jp w53_read_loope
  689.                 endif
  690. w53_read_loope:         ;конец цикла
  691.                 ld (ix+0),b     ;сохраним следующий регистр RX 
  692.                 pop hl                                  ;сколько прочитали
  693.                 ld a,(ix+2)                             ;если в буфере чтото есть,
  694.                 or (ix+3)                               ;то выходим
  695.                 ret nz                                 
  696.                 bit 0,b                                 ;иначе команда - пакет забрали
  697.                 jr z,w53_read_noblanc
  698.                 in a,(c)                                ;дочитаем холостой байт
  699. w53_read_noblanc:
  700.                 ld a,Sn_CR_RECV
  701.                 jp w53_cmd      ;выходим
  702.                
  703. w53_read_new:           ;читать новый пакет
  704.                 ld bc,WIZ_BASE_ADDR+(WIZ_S_RX_RSR_L<<8)
  705.                 in a,(c)
  706.                 jr nz,w53_read_new1
  707.                 dec b
  708.                 in a,(c)
  709.                 jr nz,w53_read_new1
  710.                 ;в буфере ничего. проверим жив ли сокет
  711.                 ld h,a                  ;ничего не прочитали
  712.                 ld l,a
  713.                 ld b,WIZ_S_SSR         
  714.                 in a,(c)
  715.                 cp SOCK_ESTABLISHED
  716.                 jp z,w53_eagain
  717.                 ld a,ERR_NOTCONN
  718.                 jr wiznet_fail ;ret
  719. w53_read_new1:
  720.                 ld b,WIZ_S_RX_H
  721.                 ld (ix+0),b
  722.                 in a,(c)
  723.                 ld (ix+3),a
  724.                 inc b
  725.                 in a,(c)
  726.                 ld (ix+2),a
  727.                 jp w53_read_min
  728.  
  729. wiznet_close:  
  730. wiznet_write:   ;a'-сокет, de-Буфер, hl-количество
  731.                 ld (w53_wr_ix),ix
  732.                 call w53_valid_socket
  733.                 jp z,w53_invalid_socked0
  734.                 and 0x02
  735.                 ld a,WIZ_S_SSR
  736.                 in a,(WIZ_BASE_ADDR)    ;чтоп не трогать флаги
  737.                 jr nz,wiz_wr_isudp
  738.                 cp SOCK_ESTABLISHED
  739.                 jr z,w53_write1
  740. wiznet_fail_1
  741.                 ld a,ERR_NOTCONN        ;издох
  742. wiznet_fail:
  743.                 ld h,-1
  744.                 ret    
  745. wiz_wr_isudp:
  746.                 cp SOCK_UDP
  747.                 jr nc,w53_wr_set_addr
  748.                 or a
  749.                 jr nz,wiznet_fail_1
  750.                 call w53_open_cmd
  751. w53_wr_set_addr
  752.                 call w53_cpy_ia2       
  753. w53_wr_ix=$+1
  754.                 ld de,0
  755.                 call BDOS_preparedepage
  756.                 call BDOS_setdepage
  757.                 ld c,WIZ_BASE_ADDR
  758. w53_write1:
  759.                 ld b,WIZ_S_FSR_L        ;проверим место в буфере
  760.                 in a,(c)
  761.                 dec b
  762.                 sub l
  763.                 in a,(c)
  764.                 sbc a,h
  765.                 jr nc,w53_wr_count_valid
  766.                 ;pop de
  767.                 ;ld h,-1
  768.                 ld a,ERR_EMSGSIZE
  769.                 jr wiznet_fail ;ret
  770. w53_wr_count_valid:    
  771.                 ex de,hl
  772.                 push de         ;чтобы потом сколько отправили вернуть
  773.                 dec de
  774.                 push de
  775.                 pop ix
  776.                 ld de,-2
  777.                 ld b,WIZ_S_TX_L
  778.                 ld a,WIZ_S_TX_L+1
  779. w53_wr_loop:
  780.                 outi
  781.                 ld b,a
  782.                 outi
  783.                 add ix,de
  784.                 jr c,w53_wr_loop
  785.                 pop hl
  786.                 ld b,WIZ_S_WRSR_H
  787.                 out (c),h
  788.                 inc b
  789.                 out (c),l
  790.                 ld a,Sn_CR_SEND
  791.                 jp w53_cmd
  792.        
  793. ;w53_ia_buf:
  794. ;       defs 7
  795.