Subversion Repositories NedoOS

Rev

Rev 61 | Rev 140 | Go to most recent revision | Blame | Compare with Previous | Last modification | View Log | Download

  1. ;  фЁрщтхЁ тшчэхЄр
  2. WIZ_BASE_ADDR EQU 0x00ab
  3. WIZ_SOCK0_HNDL EQU 8
  4. WIZ_REGAD_PORT EQU 0x8100+WIZ_BASE_ADDR
  5.  
  6. WIZ_S_MR EQU 0x01
  7. WIZ_S_CR EQU 0x03
  8. WIZ_S_SSR EQU 0x09
  9. WIZ_S_PORTR_H EQU 0x0a
  10. WIZ_S_PORTR_L EQU 0x0b
  11. WIZ_S_DPORTR_H EQU 0x12
  12. WIZ_S_DPORTR_L EQU 0x13
  13. WIZ_S_DIPR0 EQU 0x14
  14. WIZ_S_DIPR1 EQU 0x15
  15. WIZ_S_DIPR2 EQU 0x16
  16. WIZ_S_DIPR3 EQU 0x17
  17. WIZ_S_WRSR_H EQU 0x22
  18. WIZ_S_WRSR_L EQU 0x23
  19. WIZ_S_FSR_H EQU 0x26
  20. WIZ_S_FSR_L EQU 0x27
  21. WIZ_S_RX_RSR_H EQU 0x2a
  22. WIZ_S_RX_RSR_L EQU 0x2b
  23. WIZ_S_TX_H EQU 0x2e
  24. WIZ_S_TX_L EQU 0x2f
  25. WIZ_S_RX_H EQU 0x30
  26. WIZ_S_RX_L EQU 0x31
  27.  
  28. IPPROTO_TCP EQU 6
  29. IPPROTO_UDP EQU 17
  30.  
  31. AF_UNSPEC EQU 0
  32. AF_INET EQU 2
  33. AF_INET6 EQU 23
  34.  
  35. SOCK_STREAM EQU 0x01    ;tcp/ip
  36. SOCK_DGRAM      EQU 0x03                ;udp/ip
  37.  
  38. SHUT_RDWR               EQU 2
  39. ERR_EAGAIN              EQU 35          ;/* Try again */
  40. ERR_EWOULDBLOCK EQU ERR_EAGAIN  ;/* Operation would block */
  41. ERR_INTR                EQU 4
  42. ERR_NFILE               EQU 23
  43. ERR_ALREADY     EQU 37
  44. ERR_NOTSOCK     EQU 38
  45. ERR_EMSGSIZE    EQU 40    ;/* Message too long */
  46. ERR_PROTOTYPE   EQU 41
  47. ERR_AFNOSUPPORT EQU 47
  48. ERR_HOSTUNREACH EQU 65
  49. ERR_ECONNABORTED EQU    53      /* Software caused connection abort */
  50. ERR_CONNRESET   EQU 54
  51. ERR_NOTCONN     EQU 57
  52. ;struct sockaddr_in {short sin_family;unsigned short sin_port;
  53. ;       struct in_addr sin_addr;char sin_zero[8];};
  54.  
  55. ;/***************************************/
  56. ;/* The bit of Sn_MR regsiter defintion */
  57. ;/***************************************/
  58. Sn_MR_ALIGN         EQU (1 << 8)             ;< Alignment bit of Sn_MR. */
  59. Sn_MR_MULTI         EQU (1 << 7)             ;< Multicasting bit of Sn_MR. */
  60. Sn_MR_MF            EQU (1 << 6)             ;< MAC filter bit of Sn_MR. */
  61. Sn_MR_IGMPv         EQU (1 << 5)             ;< IGMP version bit of Sn_MR. */
  62. Sn_MR_ND            EQU (1 << 5)             ;< No delayed ack bit of Sn_MR. */
  63. Sn_MR_CLOSE         EQU 0x00                 ;< Protocol bits of Sn_MR. */
  64. Sn_MR_TCP           EQU 0x01                 ;< Protocol bits of Sn_MR. */
  65. Sn_MR_UDP           EQU 0x02                 ;< Protocol bits of Sn_MR. */
  66. Sn_MR_IPRAW         EQU 0x03                 ;< Protocol bits of Sn_MR. */
  67. Sn_MR_MACRAW        EQU 0x04                 ;< Protocol bits of Sn_MR. */
  68. Sn_MR_PPPoE         EQU 0x05                 ;< Protocol bits of Sn_MR. */
  69.  
  70. ;/******************************/
  71. ;/* The values of CR defintion */
  72. ;/******************************/
  73.  
  74. Sn_CR_OPEN          EQU 0x01                 ;< OPEN command value of Sn_CR. */
  75. Sn_CR_LISTEN        EQU 0x02                 ;< LISTEN command value of Sn_CR. */
  76. Sn_CR_CONNECT       EQU 0x04                 ;< CONNECT command value of Sn_CR. */
  77. Sn_CR_DISCON        EQU 0x08                 ;< DISCONNECT command value of Sn_CR. */
  78. Sn_CR_CLOSE         EQU 0x10                 ;< CLOSE command value of Sn_CR. */
  79. Sn_CR_SEND          EQU 0x20                 ;< SEND command value of Sn_CR. */
  80. Sn_CR_SEND_MAC      EQU 0x21                 ;< SEND_MAC command value of Sn_CR. */
  81. Sn_CR_SEND_KEEP     EQU 0x22                 ;< SEND_KEEP command value of Sn_CR */
  82. Sn_CR_RECV          EQU 0x40                 ;< RECV command value of Sn_CR */
  83. Sn_CR_PCON          EQU 0x23                 ;< PCON command value of Sn_CR */
  84. Sn_CR_PDISCON       EQU 0x24                 ;< PDISCON command value of Sn_CR */
  85. Sn_CR_PCR           EQU 0x25                 ;< PCR command value of Sn_CR */
  86. Sn_CR_PCN           EQU 0x26                 ;< PCN command value of Sn_CR */
  87. Sn_CR_PCJ           EQU 0x27                 ;< PCJ command value of Sn_CR */
  88.  
  89. ;/**********************************/
  90. ;/* The values of Sn_SSR defintion */
  91. ;/**********************************/
  92. SOCK_CLOSED         EQU 0x00                 ;< SOCKETn is released */
  93. SOCK_ARP            EQU 0x01                 ;< ARP-request is transmitted in order to acquire destination hardware address. */
  94. SOCK_INIT           EQU 0x13                 ;< SOCKETn is open as TCP mode. */
  95. SOCK_LISTEN         EQU 0x14                 ;< SOCKETn operates as "TCP SERVER" and waits for connection-request (SYN packet) from "TCP CLIENT". */
  96. SOCK_SYNSENT        EQU 0x15                 ;< Connect-request(SYN packet) is transmitted to "TCP SERVER". */
  97. SOCK_SYNRECV        EQU 0x16                 ;< Connect-request(SYN packet) is received from "TCP CLIENT". */
  98. SOCK_ESTABLISHED    EQU 0x17                 ;< TCP connection is established. */
  99. SOCK_FIN_WAIT       EQU 0x18                 ;< SOCKETn is closing. */
  100. SOCK_CLOSING        EQU 0x1A                 ;< SOCKETn is closing. */
  101. SOCK_TIME_WAIT      EQU 0x1B                 ;< SOCKETn is closing. */
  102. SOCK_CLOSE_WAIT     EQU 0x1C                 ;< Disconnect-request(FIN packet) is received from the peer. */
  103. SOCK_LAST_ACK       EQU 0x1D                 ;< SOCKETn is closing. */
  104. ;фЁрщтхЁ тшчэхЄр
  105. SOCK_UDP            EQU 0x22                 ;< SOCKETn is open as UDP mode. */
  106. SOCK_IPRAW          EQU 0x32                 ;< SOCKETn is open as IPRAW mode. */
  107. SOCK_MACRAW         EQU 0x42                 ;< SOCKET0 is open as MACRAW mode. */
  108. SOCK_PPPoE          EQU 0x5F                 ;< SOCKET0 is open as PPPoE mode. */
  109.                
  110. wizlocalport:
  111.                 defw 0xc000
  112.                
  113. W53SOCTABLE=0
  114.                 MACRO W53FLAGSMACRO
  115.                 if W53SOCTABLE==0
  116.                 if ((($-1)&0xff)<=95)
  117. W53SOCTABLE=1
  118. w53_socflags: ;+0 - RXreg, +1 - Nsoc, +2..3 - RXcount
  119.         defb 0,WIZ_SOCK0_HNDL+0,0,0,0,WIZ_SOCK0_HNDL+1,0,0,0,WIZ_SOCK0_HNDL+2,0,0
  120.                 defb 0,WIZ_SOCK0_HNDL+3,0,0,0,WIZ_SOCK0_HNDL+4,0,0,0,WIZ_SOCK0_HNDL+5,0,0
  121.         defb 0,WIZ_SOCK0_HNDL+6,0,0,0,WIZ_SOCK0_HNDL+7,0,0
  122. w53_endsocflags:
  123.                 endif
  124.                 endif
  125.                 ENDM
  126.                
  127.                 W53FLAGSMACRO
  128.                
  129. wiznet_open
  130. ;L-subfunction
  131.                 dec l
  132.                 jr z,w53_socket
  133.                 dec l
  134.                 jp z,w53_close
  135.                 dec l
  136.                 jp z,w53_connect
  137.                 dec l
  138.                 jp z,w53_accept
  139.                 dec l
  140.                 jp z,w53_bind
  141.                 dec l
  142.                 jp z,w53_listen
  143.                 ld a,ERR_INTR   ;ЇєэъЎш  эх ёє∙хёЄтєхЄ
  144.                 ld hl,-1
  145.                 ret
  146.                 W53FLAGSMACRO
  147. w53_socket:
  148. ;E-socket type, D-address family
  149. ;ш∙хь ётюсюфэ√щ ёюъхЄ
  150.                 ld l,-1
  151.                 ld a,AF_INET
  152.                 cp d
  153.                 ld a,ERR_AFNOSUPPORT
  154.                 ret nz
  155. w53_socket3:
  156.                 ld ix,w53_socflags-4
  157. w53_socket0:
  158.                 inc ix
  159.                 inc ix
  160.                 inc ix
  161.                 inc ix
  162.                 ld a,ixl
  163.                 cp w53_endsocflags&0xff
  164.                 jr nz,w53_socket1
  165.                 ld l,-1
  166.                 ld a,ERR_NFILE ;тёх ёюъхЄ√ чрэ Є√
  167.                 ret
  168. w53_socket1:
  169.                 call w53_valid_socket1
  170.                 jr nz,w53_socket0
  171.                 ld a,e
  172.                 ld d,Sn_MR_TCP
  173.                 cp SOCK_STREAM
  174.                 jr z,w53_socket2
  175.                 ld d,Sn_MR_UDP
  176.                 cp SOCK_DGRAM
  177.                 jr z,w53_socket2
  178.                 ld a,ERR_PROTOTYPE
  179.                 ld l,-1
  180.                 ret
  181. w53_socket2:
  182.                 ld b,WIZ_S_MR
  183.                 out (c),d
  184.                 ld a,ixl
  185.                 ld l,a
  186.                 xor a
  187.                 ld (ix+2),a
  188.                 ld (ix+3),a
  189.         ret
  190.  
  191.                 W53FLAGSMACRO
  192. w53_bind:
  193.                 call w53_valid_socket
  194.                 jp z,w53_invalid_socked0
  195.                 call BDOS_preparedepage
  196.                 ld bc,WIZ_BASE_ADDR+(WIZ_S_PORTR_H<<8)
  197.                 inc de
  198.                 ld a,(de)
  199.                 out (c),a
  200.                 inc b
  201.                 inc de
  202.                 ld a,(de)
  203.                 out (c),a
  204.                 xor a
  205.                 ld l,a
  206.                 ret
  207.                
  208. w53_accept:
  209.                 call w53_valid_socket
  210.                 jp z,w53_invalid_socked0
  211.                 ld l,-1
  212.                 ld b,WIZ_S_SSR         
  213.                 in a,(c)
  214.                 jr nz,w53_accept_live
  215.                 ld a,ERR_ECONNABORTED   ;ёюъхЄ ёфюї
  216.                 ret
  217. w53_accept_live:
  218.                 cp SOCK_ESTABLISHED
  219.                 jr z,w53_accept_est
  220.                 ld a,ERR_EAGAIN                 ;яюър эшъюую эхЄ
  221.                 ret
  222. w53_accept_est:
  223.                 ld b,WIZ_S_PORTR_H              ;чряюьэшь яюЁЄ
  224.                 in e,(c)
  225.                 inc b
  226.                 in d,(c)
  227.                 push ix
  228.                 push de
  229.                 ld e,SOCK_STREAM
  230.                 call w53_socket3
  231.                 pop de
  232.                 ld a,l
  233.                 or a
  234.                 jp p,w53_accept_nsoc
  235.                 pop hl  ;ёюъхЄ эхфрыш. тхЁэхь Єхъє∙шщ
  236.                 ret
  237. w53_accept_nsoc:
  238.                 ld b,WIZ_S_PORTR_H
  239.                 out (c),e
  240.                 inc b
  241.                 out (c),d
  242.                 call w53_listen_acc
  243.                 pop hl
  244.                 inc hl
  245.                 ld a,(hl)       ;яюьхэ хь ёюъхЄ√ ьхёЄрьш
  246.                 ld e,(ix+1)
  247.                 ld (hl),e
  248.                 ld (ix+1),a
  249.                 push ix
  250.                 pop hl
  251.                 xor a
  252.                 ret
  253.                
  254.                 W53FLAGSMACRO
  255. w53_listen:
  256.                 call w53_valid_socket
  257.                 jp z,w53_invalid_socked0
  258. w53_listen_acc:
  259.                 ld a,Sn_CR_OPEN
  260.                 call w53_cmd
  261.                 ld b,WIZ_S_SSR
  262. w53_listen0:
  263.                 in a,(c)
  264.                 or a
  265.                 jr z,w53_listen0
  266.                 ld a,Sn_CR_LISTEN
  267.                 call w53_cmd
  268.                 xor a
  269.                 ld l,a
  270.                 ret
  271.  
  272. w53_valid_socket:
  273.                 ex af,af'
  274.                 cp w53_socflags&0xff
  275.                 jr c,w53_invalid_socked
  276.                 cp w53_endsocflags&0xff
  277.                 jr nc,w53_invalid_socked
  278.                 ld ixl,a
  279.                 ld ixh,w53_socflags>>8
  280. w53_valid_socket1:
  281.                 ld bc,WIZ_REGAD_PORT
  282.                 ld a,(ix+1)
  283.                 out (c),a
  284.                 ld b,WIZ_S_MR
  285.                 in a,(c)
  286.                 or a   
  287.                 ret
  288. w53_invalid_socked:
  289.                 pop af
  290. w53_invalid_socked0:
  291.                 ld hl,-1
  292.                 ld a,ERR_NOTSOCK
  293.                 ret
  294.                
  295.                 W53FLAGSMACRO
  296. w53_connect:
  297. ;DE-sockaddr_in
  298.                 ld l,-1
  299.                 call w53_valid_socket
  300.                 jp z,w53_invalid_socked0
  301.                 ;dec a
  302.                 ;ld a,ERR_PROTOTYPE
  303.                 ;ret nz
  304.                 ld b,WIZ_S_SSR
  305.                 in a,(c)
  306.                 or a
  307.                 ld a,ERR_ALREADY
  308.                 ret nz
  309.                 push de
  310.                 ld de,(wizlocalport)
  311.                 inc de
  312.                 set 6,d
  313.                 set 7,d
  314.                 ld (wizlocalport),de
  315.                 ld b,WIZ_S_PORTR_H
  316.                 out (c),d
  317.                 inc b
  318.                 out (c),e
  319.                 pop de
  320.                 ld a,Sn_CR_OPEN
  321.                 call w53_cmd
  322.                 ld b,WIZ_S_SSR
  323. w53_connect0:
  324.                 in a,(c)
  325.                 or a
  326.                 jr z,w53_connect0
  327.                 call BDOS_preparedepage
  328.                 ex de,hl
  329.                 inc hl  ;яЁюяєёЄшь ёхьхщёЄтю
  330.                 ld bc,WIZ_BASE_ADDR+(WIZ_S_DPORTR_L<<8)
  331.                 ld a,6
  332. w53_connect1:
  333.                 outi
  334.                 inc b
  335.                 inc b
  336.                 dec a
  337.                 jr nz,w53_connect1
  338.                 ld b,WIZ_S_MR
  339.                 in a,(c)
  340.                 cp Sn_MR_TCP
  341.                 jr nz,w53_connect3
  342.                 ld a,Sn_CR_CONNECT
  343.                 call w53_cmd
  344.                 ld b,WIZ_S_SSR
  345. w53_connect2:
  346.                 in a,(c)
  347.                 cp SOCK_ESTABLISHED
  348.                 jr z,w53_connect3
  349.                 or a
  350.                 jr nz,w53_connect2
  351.                 ld l,-1
  352.                 ld a,ERR_HOSTUNREACH
  353.                 ret
  354. w53_connect3:
  355.                 xor a
  356.                 ld l,a
  357.                 ret
  358.                
  359.                 W53FLAGSMACRO
  360. w53_close:
  361.                 call w53_valid_socket
  362.                 ld l,0
  363.                 ret z   ;ёюъхЄ єцх єсшЄ
  364.                 dec l
  365.                 ex af,af'
  366.                 ld a,e
  367.                 or a
  368.                 jr z,w53_close_nochk
  369.                 ld b,WIZ_S_FSR_H        ;яЁютхЁшь яєёЄ ыш сєЇхЁ юЄяЁртъш
  370.                 in a,(c)
  371.                 cp 0x20
  372.                 jr nz,w53_close_nochk
  373.                 inc b
  374.                 in e,(c)
  375. w53_close_nochk:
  376.                 ex af,af'
  377.                 cp Sn_MR_TCP
  378.                 jr nz,w53_close_udp
  379. w53_close_tcp:
  380.                 ld b,WIZ_S_SSR
  381.                 in a,(c)
  382.                 jr z,w53_close3         ;єцх чръЁ√Є??? тючьюцэю эхэєцэю
  383.                 cp SOCK_ESTABLISHED
  384.                 jr nz,w53_close_wait    ;w53_closewait
  385.                 ld a,e
  386.                 or a
  387.                 ld a,ERR_EAGAIN
  388.                 ret nz
  389.                 ld a,Sn_CR_DISCON
  390.                 call w53_cmd
  391.                 jr w53_close_tcp
  392. w53_close_udp:
  393.                 ld b,WIZ_S_SSR
  394.                 in a,(c)
  395.                 cp SOCK_UDP
  396.                 jr nz,w53_close_wait
  397.                 ld a,e
  398.                 or a
  399.                 ld a,ERR_EAGAIN
  400.                 ret nz
  401. w53_close_wait:
  402.                 ld a,Sn_CR_CLOSE
  403.                 call w53_cmd
  404.                 ld b,WIZ_S_SSR
  405. w53_close2:
  406.                 in a,(c)
  407.                 or a
  408.                 jr nz,w53_close2
  409. w53_close3:
  410.                 xor a
  411.                 ld b,WIZ_S_MR
  412.                 out (c),a
  413.                 ld l,a
  414.                 ret
  415.                 W53FLAGSMACRO
  416. w53_cmd:
  417.                 ld b,WIZ_S_CR
  418.                 out (c),a
  419. w53_cmd0:
  420.                 in a,(c)
  421.                 or a
  422.                 ret z
  423.                 jr w53_cmd0
  424.                
  425.                
  426. wiznet_read:    ;a'-ёюъхЄ, de-┴єЇхЁ, hl-ъюышўхёЄтю
  427.                 call w53_valid_socket
  428.                 jp z,w53_invalid_socked0
  429.                 ;call BDOS_preparedepage
  430. w53_read_min:                   ;hl-ёъюы№ъю їюЄшь срщЄ
  431.                 ld a,h
  432.                 or l
  433.                 ret z
  434. w53_read55:
  435.                 ld c,(ix+2)
  436.                 ld b,(ix+3)
  437.                 ld a,b
  438.                 or c
  439.                 jp z,w53_read_new       ;ёЄрЁ√ї фрээ√ї эхЄє, ўшЄрЄ№ эют√щ яръхЄ
  440.                
  441.                 ;ўшЄрхь ёЄрЁ√щ яръхЄ
  442.                 ;bc=min(hl,bc), datasize-=bc
  443.                 sbc hl,bc
  444.                 ld a,c
  445.                 jr nc,w53_minimum0
  446.                 add hl,bc
  447.                 ld b,h
  448.                 ld c,l
  449.                 ;ld h,0
  450.                 ;ld l,0
  451. w53_minimum0:
  452.                 ;ld a,(ix+2)
  453.                 sub c
  454.                 ld (ix+2),a
  455.                 ld a,(ix+3)
  456.                 sbc a,b
  457.                 ld (ix+3),a
  458.                
  459.                 push bc                         ;ёъюы№ъю Ёхры№эю яЁюўЄхь ёюїЁрэшь
  460.                 ex de,hl
  461.                 ld d,b
  462.                 ld e,c
  463.                  ;0x00ff => 0x00ff
  464.                  ;0x0100 => 0x0000
  465.                  dec de
  466.                  inc e
  467.                
  468.                 ld c,WIZ_BASE_ADDR
  469.                 ld b,(ix+0)
  470.                 ld a,WIZ_S_RX_L
  471.                 ;bit 0,b
  472.                 ;jr nz,w53_read_loopl
  473.                 cp b
  474.                 jr z,w53_read_loopl
  475. w53_read_loop:  ;ўЄю-Єю эрфю фюўшЄрЄ№ de-count, hl-ptr
  476.                 ini
  477.                 ld b,a
  478.                 dec e
  479.                 jr z,w53_read_looph
  480. w53_read_loopl:
  481.                 ini
  482.                 dec e
  483.                 jp nz,w53_read_loop
  484.                 dec d
  485.                 ;jp p,w53_read_loop
  486.                 jp m,w53_read_loope
  487.                 if 1==1
  488. w53_read_fastloopd:
  489.                 ld e,256/8/2
  490. w53_read_fastloop:
  491.                 dup 8
  492.                 ini
  493.                 ld b,a
  494.                 ini
  495.                 edup
  496.                 dec e
  497.                 jp nz,w53_read_fastloop
  498.                 dec d
  499.                 jp p,w53_read_fastloopd
  500.                 jp w53_read_loope
  501.                 endif
  502. w53_read_looph:
  503.                 dec d
  504.                 ;jp p,w53_read_loopl
  505.                 jp m,w53_read_loope
  506.                 if 1==1
  507. w53_read_fastloophd:
  508.                 ld e,256/8/2
  509. w53_read_fastlooph:
  510.                 dup 8
  511.                 ini
  512.                 ini
  513.                 ld b,a
  514.                 edup
  515.                 dec e
  516.                 jp nz,w53_read_fastlooph
  517.                 dec d
  518.                 jp p,w53_read_fastloophd
  519.                 ;jp w53_read_loope
  520.                 endif
  521. w53_read_loope:         ;ъюэхЎ Ўшъыр
  522.                 ld (ix+0),b     ;ёюїЁрэшь ёыхфє■∙шщ ЁхушёЄЁ RX 
  523.                 pop hl                                  ;ёъюы№ъю яЁюўшЄрыш
  524.                 ld a,(ix+2)                             ;хёыш т сєЇхЁх ўЄюЄю хёЄ№,
  525.                 or (ix+3)                               ;Єю т√їюфшь
  526.                 ret nz                                 
  527.                 bit 0,b                                 ;шэрўх ъюьрэфр - яръхЄ чрсЁрыш
  528.                 jr z,w53_read_noblanc
  529.                 in a,(c)                                ;фюўшЄрхь їюыюёЄющ срщЄ
  530. w53_read_noblanc:
  531.                 ld a,Sn_CR_RECV
  532.                 jp w53_cmd      ;т√їюфшь
  533.                
  534. w53_read_new:           ;ўшЄрЄ№ эют√щ яръхЄ
  535.                 ld bc,WIZ_BASE_ADDR+(WIZ_S_RX_RSR_L<<8)
  536.                 in a,(c)
  537.                 jr nz,w53_read_new1
  538.                 dec b
  539.                 in a,(c)
  540.                 jr nz,w53_read_new1
  541.                 ;т сєЇхЁх эшўхую. яЁютхЁшь цшт ыш ёюъхЄ
  542.                 ld h,a                  ;эшўхую эх яЁюўшЄрыш
  543.                 ld l,a
  544.                 ld b,WIZ_S_SSR         
  545.                 in a,(c)
  546.                 cp SOCK_ESTABLISHED
  547.                 ret z
  548.                 cp SOCK_ARP
  549.                 ret z
  550.                 cp SOCK_UDP
  551.                 ret nc
  552.                 ;ld h,-1
  553.                 ld a,ERR_NOTCONN
  554.                 jr wiznet_fail ;ret
  555. w53_read_new1:
  556.                 ld b,WIZ_S_SSR
  557.                 in a,(c)
  558.                 ld b,WIZ_S_RX_H
  559.                 cp SOCK_UDP
  560.                 jr nz,w53_read_new2
  561.                 in a,(c)
  562.                 inc b
  563.                 in a,(c)
  564.                 dec b
  565.                 in a,(c)
  566.                 inc b
  567.                 in a,(c)
  568.                 dec b
  569.                 in a,(c)
  570.                 inc b
  571.                 in a,(c)
  572.                 dec b  
  573. w53_read_new2:
  574.                 ld (ix+0),b
  575.                 in a,(c)
  576.                 ld (ix+3),a
  577.                 inc b
  578.                 in a,(c)
  579.                 ld (ix+2),a
  580.                 jp w53_read_min
  581.  
  582. wiznet_close:
  583. wiznet_write:   ;a'-ёюъхЄ, de-┴єЇхЁ, hl-ъюышўхёЄтю
  584.                 call w53_valid_socket
  585.                 jp z,w53_invalid_socked0
  586.                 ;call BDOS_preparedepage
  587.                 ld c,WIZ_BASE_ADDR
  588.                 ld b,WIZ_S_SSR          ;цшт ыш ёюъхЄ
  589.                 in a,(c)
  590.                 cp SOCK_ESTABLISHED
  591.                 jr z,w53_write1
  592.                 cp SOCK_UDP
  593.                 jr nc,w53_write1
  594.                 ld a,ERR_NOTCONN        ;шчфюї
  595. wiznet_fail:
  596.                 ld h,-1
  597.                 ret
  598. w53_write1:
  599.                 ld b,WIZ_S_FSR_L        ;яЁютхЁшь ьхёЄю т сєЇхЁх
  600.                 in a,(c)
  601.                 dec b
  602.                 sub l
  603.                 in a,(c)
  604.                 sbc a,h
  605.                 jr nc,w53_wr_count_valid
  606.                 ;pop de
  607.                 ;ld h,-1
  608.                 ld a,ERR_EMSGSIZE
  609.                 jr wiznet_fail ;ret
  610. w53_wr_count_valid:    
  611.                 ex de,hl
  612.                 push de         ;ўЄюс√ яюЄюь ёъюы№ъю юЄяЁртшыш тхЁэєЄ№
  613.                 dec de
  614.                 push de
  615.                 pop ix
  616.                 ld de,-2
  617.                 ld b,WIZ_S_TX_L
  618.                 ld a,WIZ_S_TX_L+1
  619. w53_wr_loop:
  620.                 outi
  621.                 ld b,a
  622.                 outi
  623.                 add ix,de
  624.                 jr c,w53_wr_loop               
  625.                 pop hl
  626.                 ld b,WIZ_S_WRSR_H
  627.                 out (c),h
  628.                 inc b
  629.                 out (c),l
  630.                 ld a,Sn_CR_SEND
  631.                 jp w53_cmd
  632.                
  633.