?login_element?

Subversion Repositories NedoOS

Rev

Rev 569 | Go to most recent revision | 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. w53_socket:
  182. ;E-socket type, D-address family
  183. ;ищем свободный сокет
  184.                 ld l,-1
  185.                 ld a,AF_INET
  186.                 cp d
  187.                 ld a,ERR_AFNOSUPPORT
  188.                 ret nz
  189. w53_socket3:
  190.                 ld a,1-5
  191. w53_socket0:
  192.                 add 5
  193.                 cp 37
  194.                 jr c,w53_socket1
  195.                 ld l,-1
  196.                 ld a,ERR_NFILE ;все сокеты заняты
  197.                 ret
  198. w53_socket1:
  199.                 ld l,a
  200.                 call w53_valid_socket1
  201.                 ld a,l
  202.                 jr nz,w53_socket0
  203.                 ld a,e
  204.                 ld d,Sn_MR_TCP
  205.                 cp SOCK_STREAM
  206.                 jr z,w53_socket2
  207.                 ld d,Sn_MR_UDP
  208.                 cp SOCK_DGRAM
  209.                 jr z,w53_socket2
  210.                 ld d,Sn_MR_IPRAW
  211.                 cp SOCK_ICMP
  212.                 jr z,w53_socket2_icmp
  213.                 ld a,ERR_PROTOTYPE
  214.                 ld l,-1
  215.                 ret
  216. w53_socket2:
  217.                 ld b,WIZ_S_MR
  218.                 out (c),d
  219.                 ld a,(iy+app.id)
  220.                 ld (ix+4),a
  221.                 ld de,(wizlocalport)
  222.                 inc de
  223.                 set 6,d
  224.                 set 7,d
  225.                 ld (wizlocalport),de
  226.                 ld b,WIZ_S_PORTR_H
  227.                 out (c),d
  228.                 inc b
  229.                 out (c),e
  230.                 xor a
  231.                 ld (ix+2),a
  232.                 ld (ix+3),a
  233.                 ret
  234. w53_socket2_icmp:
  235.                 ld b,WIZ_S_PROTOR
  236.                 ld a,IPPROTO_ICMP
  237.                 out (c),a
  238.                 jr w53_socket2:
  239.  
  240.                
  241. w53_bind:
  242.                 call w53_valid_socket
  243.                 jp z,w53_invalid_socked0
  244.                 call BDOS_preparedepage
  245.                 call BDOS_setdepage
  246.                 ld bc,WIZ_BASE_ADDR+(WIZ_S_PORTR_H<<8)
  247.                 inc de
  248.                 ld a,(de)
  249.                 out (c),a
  250.                 inc b
  251.                 inc de
  252.                 ld a,(de)
  253.                 out (c),a
  254.                 xor a
  255.                 ld l,a
  256.                 ret
  257.                
  258. w53_accept:
  259.                 call w53_valid_socket
  260.                 jp z,w53_invalid_socked0
  261.                 ld l,-1
  262.                 ld b,WIZ_S_SSR         
  263.                 in a,(c)
  264.                 jr nz,w53_accept_live
  265.                 ld a,ERR_ECONNABORTED   ;сокет сдох
  266.                 ret
  267. w53_accept_live:
  268.                 cp SOCK_ESTABLISHED
  269.                 jr z,w53_accept_est
  270.                 ld a,ERR_EAGAIN                 ;пока никого нет
  271.                 ret            
  272. w53_accept_est:
  273.                 ld b,WIZ_S_PORTR_H              ;запомним порт
  274.                 in e,(c)
  275.                 inc b
  276.                 in d,(c)
  277.                 push ix
  278.                 push de
  279.                 ld e,SOCK_STREAM
  280.                 call w53_socket3
  281.                 pop de
  282.                 ld a,l
  283.                 or a
  284.                 jp p,w53_accept_nsoc
  285.                 pop hl  ;сокет недали. вернем текущий
  286.                 ret
  287. w53_accept_nsoc:
  288.                 ld b,WIZ_S_PORTR_H
  289.                 out (c),e
  290.                 inc b
  291.                 out (c),d
  292.                 call w53_listen_acc
  293.                 pop hl
  294.                 inc hl
  295.                 ld a,(hl)       ;поменяем сокеты местами
  296.                 ld e,(ix+1)
  297.                 ld (hl),e
  298.                 ld (ix+1),a
  299.                 ld a,ixl
  300.                 sub 0xff&w53_socflags
  301.                 ld l,a
  302.                 xor a
  303.                 ret
  304.                
  305.                
  306. w53_listen:
  307.                 call w53_valid_socket
  308.                 jp z,w53_invalid_socked0
  309.                 ld b,WIZ_S_SSR
  310.                 in a,(c)
  311.                 or a
  312.                 ld a,ERR_ALREADY
  313.                 ret nz
  314. w53_listen_acc:
  315.                 ld a,Sn_CR_OPEN
  316.                 call w53_cmd
  317.                 ld b,WIZ_S_SSR
  318. w53_listen0:
  319.                 in a,(c)
  320.                 or a
  321.                 jr z,w53_listen0
  322.                 ld a,Sn_CR_LISTEN
  323.                 call w53_cmd
  324.                 xor a
  325.                 ld l,a
  326.                 ret
  327.  
  328. w53_valid_socket:
  329.                 ex af,af'
  330.                 or a
  331.                 jr z,w53_invalid_socked
  332.                 cp 37
  333.                 jr nc,w53_invalid_socked
  334. w53_valid_socket1:
  335.                 add a,0xff&w53_socflags
  336.                 ld ixl,a
  337.                 ld a,0
  338.                 adc a,0xff&(w53_socflags>>8)
  339.                 ld ixh,a
  340.                 ld a,(ix+4)
  341.                 or a
  342.                 jr z,w53_valid_free
  343.                 cp (iy+app.id)
  344.                 ret nz
  345.                 ;jr nz,w53_invalid_socked0
  346. w53_valid_free:
  347.                 ld bc,WIZ_CFG_PORT
  348.                 in a,(c)
  349.                 and 0x40
  350.                 or 0x10
  351.                 out (c),a
  352.                 ld b,0xff&(WIZ_REGAD_PORT>>8) ;bc,WIZ_REGAD_PORT
  353.                 ld a,(ix+1)
  354.                 out (c),a
  355.                 ld b,WIZ_S_MR
  356.                 in a,(c)
  357.                 and 0x0f       
  358.                 ret
  359. w53_invalid_socked:
  360.                 pop af
  361. w53_invalid_socked0:
  362.                 ld hl,-1
  363.                 ld a,ERR_NOTSOCK
  364.                 ret
  365.  
  366. w53_open_cmd
  367.                 ld a,Sn_CR_OPEN
  368.                 call w53_cmd
  369.                 ld b,WIZ_S_SSR
  370. w53_op_cmd1:
  371.                 in a,(c)
  372.                 or a
  373.                 jr z,w53_op_cmd1
  374.                 ret
  375.                
  376. w53_connect:
  377. ;DE-sockaddr_in
  378.                 ld l,-1
  379.                 call w53_valid_socket
  380.                 jp z,w53_invalid_socked0
  381.                 ;dec a
  382.                 ;ld a,ERR_PROTOTYPE
  383.                 ;ret nz
  384.                 ld b,WIZ_S_SSR
  385.                 in a,(c)
  386.                 or a
  387.                 ld a,ERR_ALREADY
  388.                 ret nz
  389.                 call w53_open_cmd
  390.                 call w53_cpy_ia
  391.                 ld a,Sn_CR_CONNECT
  392.                 call w53_cmd
  393.                 ld b,WIZ_S_SSR
  394. w53_connect2:
  395.                 in a,(c)
  396.                 cp SOCK_ESTABLISHED
  397.                 jr z,w53_connect3
  398.                 or a
  399.                 jr nz,w53_connect2
  400.                 ld l,-1
  401.                 ld a,ERR_HOSTUNREACH
  402.                 ret
  403. w53_connect3:
  404.                 xor a
  405.                 ld l,a
  406.                 ret
  407.                
  408. w53_cpy_ia
  409.                 call BDOS_preparedepage
  410.                 call BDOS_setdepage
  411. w53_cpy_ia2
  412.                 ex de,hl
  413.                 inc hl  ;пропустим семейство
  414.                 ld bc,WIZ_BASE_ADDR+(WIZ_S_DPORTR_L<<8)
  415.                 ld a,6
  416. w53_cpy_ia1:
  417.                 outi
  418.                 inc b
  419.                 inc b
  420.                 dec a
  421.                 jr nz,w53_cpy_ia1
  422.                 ex de,hl
  423.                 ret
  424.                
  425. w53_close:
  426.                 call w53_valid_socket
  427. w53_close_valid:
  428.                 ld l,0
  429.                 ld (ix+4),l
  430.                 ret z   ;сокет уже убит
  431.                 dec l
  432.                 ex af,af'
  433.                 ld a,e
  434.                 or a
  435.                 jr z,w53_close_nochk
  436.                 ld b,WIZ_S_FSR_H        ;проверим пуст ли буфер отправки
  437.                 in a,(c)
  438.                 cp 0x20
  439.                 jr nz,w53_close_nochk
  440.                 inc b
  441.                 in e,(c)        ;????что то не так????
  442.                                         ;восстановить ID
  443. w53_close_nochk:
  444.                 ex af,af'
  445.                 cp Sn_MR_TCP
  446.                 jr nz,w53_close_udp
  447. w53_close_tcp:
  448.                 ld b,WIZ_S_SSR
  449.                 in a,(c)
  450.                 jr z,w53_close3         ;уже закрыт??? возможно ненужно
  451.                 cp SOCK_ESTABLISHED
  452.                 jr nz,w53_close_wait    ;w53_closewait
  453.                 ld a,e
  454.                 or a
  455.                 ld a,ERR_EAGAIN
  456.                 ret nz
  457.                 ld a,Sn_CR_DISCON
  458.                 call w53_cmd
  459.                 jr w53_close_tcp
  460. w53_close_udp:
  461.                 ld b,WIZ_S_SSR
  462.                 in a,(c)
  463.                 cp SOCK_UDP
  464.                 jr c,w53_close_wait
  465.                 ld a,e
  466.                 or a
  467.                 ld a,ERR_EAGAIN
  468.                 ret nz
  469. w53_close_wait:
  470.                 ld a,Sn_CR_CLOSE
  471.                 call w53_cmd
  472.                 ld b,WIZ_S_SSR
  473. w53_close2:
  474.                 in a,(c)
  475.                 or a
  476.                 jr nz,w53_close2
  477. w53_close3:
  478.                 xor a
  479.                 ld b,WIZ_S_MR
  480.                 out (c),a
  481.                 ld l,a
  482.                 ret
  483.                
  484. w53_cmd:
  485.                 ld b,WIZ_S_CR
  486.                 out (c),a
  487. w53_cmd0:
  488.                 in a,(c)
  489.                 or a
  490.                 ret z
  491.                 jr w53_cmd0
  492.  
  493. w53_rd_nontcp:
  494.                 ld b,WIZ_S_SSR
  495.                 in a,(c)
  496.                 call z,w53_open_cmd
  497.                 ld bc,WIZ_BASE_ADDR+(WIZ_S_RX_RSR_L<<8)
  498.                 in a,(c)
  499.                 jr nz,w53_rd_udp_full
  500.                 dec b
  501.                 in a,(c)
  502.                 jr nz,w53_rd_udp_full
  503. w53_eagain
  504.                 ld hl,-1
  505.                 ld a,ERR_EAGAIN
  506.                 ret    
  507. w53_rd_udp_full
  508. ;               ld a,d
  509. ;               or e
  510. ;               jr nz,w53_rd_ia
  511. ;               ld de,w53_ia_buf               
  512. ;w53_rd_ia:
  513.                 ex de,hl
  514.                 inc hl
  515.                 push hl
  516.                 inc hl
  517.                 inc hl
  518.                 ld b,WIZ_S_SSR
  519.                 in a,(c)
  520.                 ld b,WIZ_S_RX_H
  521.                 ini
  522.                 ld b,WIZ_S_RX_L
  523.                 ini
  524.                 ini
  525.                 ld b,WIZ_S_RX_L
  526.                 ini
  527.                 pop hl
  528.                 cp SOCK_IPRAW
  529.                 jr z,w53_rd_ipraw
  530.                 ini
  531.                 ld b,WIZ_S_RX_L
  532.                 ini
  533. w53_rd_ipraw:
  534.                 in h,(c)
  535.                 inc b
  536.                 in l,(c)
  537.                 or a
  538.                 sbc hl,de
  539.                 bit 7,h
  540.                 ex de,hl
  541.                 jr z,w53_rd_udpbuf
  542.                 add hl,de
  543.                 ld de,0
  544. w53_rd_udpbuf; читать hl, пропустить de
  545.                 push de
  546. w53_rd_ix=$+1
  547.                 ld de,0
  548.                 call BDOS_preparedepage
  549.                 call BDOS_setdepage
  550.                 ld (w53_rdudp_cnt),hl
  551.                 push hl
  552.                 pop ix
  553.                 ex de,hl
  554.                 ld bc,WIZ_BASE_ADDR+(WIZ_S_RX_H<<8)
  555.                 ld de, -2
  556.                 jp w53_rd_udp_loop1
  557.                 ;IX = count, DE = -2, HL = ptr
  558. w53_rd_udp_loop
  559.                 ini
  560.                 ld b,WIZ_S_RX_L
  561.                 ini
  562. w53_rd_udp_loop1
  563.                 add ix,de
  564.                 jp c,w53_rd_udp_loop
  565.                 ld a,xl
  566.                 rra
  567.                 jr nc,w53_rd_udp_odd
  568.                 ini
  569.                 ld b,WIZ_S_RX_L
  570.                 in a,(c)
  571.                 dec b
  572. w53_rd_udp_odd
  573.                 pop hl
  574.                 jp .l2
  575. .l1
  576.                 in a,(c)
  577.                 inc b
  578.                 in a,(c)
  579.                 dec b
  580. .l2
  581.                 add hl,de
  582.                 jp c,.l1
  583. w53_rdudp_cnt=$+1
  584.                 ld hl,0
  585.                 ld a,Sn_CR_RECV
  586.                 jp w53_cmd      ;выходим
  587.                        
  588. wiznet_read:    ;a'-сокет, de-Буфер, hl-количество
  589.                 ld (w53_rd_ix),ix
  590.                 call w53_valid_socket
  591.                 jp z,w53_invalid_socked0
  592.                 and 0x02
  593.                 jp nz,w53_rd_nontcp
  594. w53_read_min:   ;hl-сколько хотим байт
  595.                 ld a,h
  596.                 or l
  597.                 ret z
  598. w53_read55:
  599.                 ld c,(ix+2)
  600.                 ld b,(ix+3)
  601.                 ld a,b
  602.                 or c
  603.                 jp z,w53_read_new       ;старых данных нету, читать новый пакет
  604.                
  605.                 ;читаем старый пакет
  606.                 ;bc=min(hl,bc), datasize-=bc
  607.                 sbc hl,bc
  608.                 ld a,c
  609.                 jr nc,w53_minimum0
  610.                 add hl,bc
  611.                 ld b,h
  612.                 ld c,l
  613.                 ;ld h,0
  614.                 ;ld l,0
  615. w53_minimum0:
  616.                 ;ld a,(ix+2)
  617.                 sub c
  618.                 ld (ix+2),a
  619.                 ld a,(ix+3)
  620.                 sbc a,b
  621.                 ld (ix+3),a
  622.                
  623.                 push bc                         ;сколько реально прочтем сохраним
  624.                 ex de,hl
  625.                 ld d,b
  626.                 ld e,c
  627.                  ;0x00ff => 0x00ff
  628.                  ;0x0100 => 0x0000
  629.                  dec de
  630.                  inc e
  631.                
  632.                 ld c,WIZ_BASE_ADDR
  633.                 ld b,(ix+0)
  634.                 ld a,WIZ_S_RX_L
  635.                 ;bit 0,b
  636.                 ;jr nz,w53_read_loopl
  637.                 cp b
  638.                 jr z,w53_read_loopl
  639. w53_read_loop:  ;что-то надо дочитать de-count, hl-ptr
  640.                 ini
  641.                 ld b,a
  642.                 dec e
  643.                 jr z,w53_read_looph
  644. w53_read_loopl:
  645.                 ini
  646.                 dec e
  647.                 jp nz,w53_read_loop
  648.                 dec d
  649.                 ;jp p,w53_read_loop
  650.                 jp m,w53_read_loope
  651.                 if 1==1
  652. w53_read_fastloopd:
  653.                 ld e,256/8/2
  654. w53_read_fastloop:
  655.                 dup 8
  656.                 ini
  657.                 ld b,a
  658.                 ini
  659.                 edup
  660.                 dec e
  661.                 jp nz,w53_read_fastloop
  662.                 dec d
  663.                 jp p,w53_read_fastloopd
  664.                 jp w53_read_loope
  665.                 endif
  666. w53_read_looph:
  667.                 dec d
  668.                 ;jp p,w53_read_loopl
  669.                 jp m,w53_read_loope
  670.                 if 1==1
  671. w53_read_fastloophd:
  672.                 ld e,256/8/2
  673. w53_read_fastlooph:
  674.                 dup 8
  675.                 ini
  676.                 ini
  677.                 ld b,a
  678.                 edup
  679.                 dec e
  680.                 jp nz,w53_read_fastlooph
  681.                 dec d
  682.                 jp p,w53_read_fastloophd
  683.                 ;jp w53_read_loope
  684.                 endif
  685. w53_read_loope:         ;конец цикла
  686.                 ld (ix+0),b     ;сохраним следующий регистр RX 
  687.                 pop hl                                  ;сколько прочитали
  688.                 ld a,(ix+2)                             ;если в буфере чтото есть,
  689.                 or (ix+3)                               ;то выходим
  690.                 ret nz                                 
  691.                 bit 0,b                                 ;иначе команда - пакет забрали
  692.                 jr z,w53_read_noblanc
  693.                 in a,(c)                                ;дочитаем холостой байт
  694. w53_read_noblanc:
  695.                 ld a,Sn_CR_RECV
  696.                 jp w53_cmd      ;выходим
  697.                
  698. w53_read_new:           ;читать новый пакет
  699.                 ld bc,WIZ_BASE_ADDR+(WIZ_S_RX_RSR_L<<8)
  700.                 in a,(c)
  701.                 jr nz,w53_read_new1
  702.                 dec b
  703.                 in a,(c)
  704.                 jr nz,w53_read_new1
  705.                 ;в буфере ничего. проверим жив ли сокет
  706.                 ld h,a                  ;ничего не прочитали
  707.                 ld l,a
  708.                 ld b,WIZ_S_SSR         
  709.                 in a,(c)
  710.                 cp SOCK_ESTABLISHED
  711.                 jp z,w53_eagain
  712.                 ld a,ERR_NOTCONN
  713.                 jr wiznet_fail ;ret
  714. w53_read_new1:
  715.                 ld b,WIZ_S_RX_H
  716.                 ld (ix+0),b
  717.                 in a,(c)
  718.                 ld (ix+3),a
  719.                 inc b
  720.                 in a,(c)
  721.                 ld (ix+2),a
  722.                 jp w53_read_min
  723.  
  724. wiznet_close:  
  725. wiznet_write:   ;a'-сокет, de-Буфер, hl-количество
  726.                 ld (w53_wr_ix),ix
  727.                 call w53_valid_socket
  728.                 jp z,w53_invalid_socked0
  729.                 and 0x02
  730.                 ld a,WIZ_S_SSR
  731.                 in a,(WIZ_BASE_ADDR)    ;чтоп не трогать флаги
  732.                 jr nz,wiz_wr_isudp
  733.                 cp SOCK_ESTABLISHED
  734.                 jr z,w53_write1
  735. wiznet_fail_1
  736.                 ld a,ERR_NOTCONN        ;издох
  737. wiznet_fail:
  738.                 ld h,-1
  739.                 ret    
  740. wiz_wr_isudp:
  741.                 cp SOCK_UDP
  742.                 jr nc,w53_wr_set_addr
  743.                 or a
  744.                 jr nz,wiznet_fail_1
  745.                 call w53_open_cmd
  746. w53_wr_set_addr
  747.                 call w53_cpy_ia2       
  748. w53_wr_ix=$+1
  749.                 ld de,0
  750.                 call BDOS_preparedepage
  751.                 call BDOS_setdepage
  752.                 ld c,WIZ_BASE_ADDR
  753. w53_write1:
  754.                 ld b,WIZ_S_FSR_L        ;проверим место в буфере
  755.                 in a,(c)
  756.                 dec b
  757.                 sub l
  758.                 in a,(c)
  759.                 sbc a,h
  760.                 jr nc,w53_wr_count_valid
  761.                 ;pop de
  762.                 ;ld h,-1
  763.                 ld a,ERR_EMSGSIZE
  764.                 jr wiznet_fail ;ret
  765. w53_wr_count_valid:    
  766.                 ex de,hl
  767.                 push de         ;чтобы потом сколько отправили вернуть
  768.                 dec de
  769.                 push de
  770.                 pop ix
  771.                 ld de,-2
  772.                 ld b,WIZ_S_TX_L
  773.                 ld a,WIZ_S_TX_L+1
  774. w53_wr_loop:
  775.                 outi
  776.                 ld b,a
  777.                 outi
  778.                 add ix,de
  779.                 jr c,w53_wr_loop
  780.                 pop hl
  781.                 ld b,WIZ_S_WRSR_H
  782.                 out (c),h
  783.                 inc b
  784.                 out (c),l
  785.                 ld a,Sn_CR_SEND
  786.                 jp w53_cmd
  787.        
  788. ;w53_ia_buf:
  789. ;       defs 7
  790.