Subversion Repositories NedoOS

Rev

Rev 63 | Rev 144 | 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.                 display "wiznet_open ",$
  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.         call BDOS_setdepage
  197.                 ld bc,WIZ_BASE_ADDR+(WIZ_S_PORTR_H<<8)
  198.                 inc de
  199.                 ld a,(de)
  200.                 out (c),a
  201.                 inc b
  202.                 inc de
  203.                 ld a,(de)
  204.                 out (c),a
  205.                 xor a
  206.                 ld l,a
  207.                 ret
  208.                
  209. w53_accept:
  210.                 call w53_valid_socket
  211.                 jp z,w53_invalid_socked0
  212.                 ld l,-1
  213.                 ld b,WIZ_S_SSR         
  214.                 in a,(c)
  215.                 jr nz,w53_accept_live
  216.                 ld a,ERR_ECONNABORTED   ;ёюъхЄ ёфюї
  217.                 ret
  218. w53_accept_live:
  219.                 cp SOCK_ESTABLISHED
  220.                 jr z,w53_accept_est
  221.                 ld a,ERR_EAGAIN                 ;яюър эшъюую эхЄ
  222.                 ret
  223. w53_accept_est:
  224.                 ld b,WIZ_S_PORTR_H              ;чряюьэшь яюЁЄ
  225.                 in e,(c)
  226.                 inc b
  227.                 in d,(c)
  228.                 push ix
  229.                 push de
  230.                 ld e,SOCK_STREAM
  231.                 call w53_socket3
  232.                 pop de
  233.                 ld a,l
  234.                 or a
  235.                 jp p,w53_accept_nsoc
  236.                 pop hl  ;ёюъхЄ эхфрыш. тхЁэхь Єхъє∙шщ
  237.                 ret
  238. w53_accept_nsoc:
  239.                 ld b,WIZ_S_PORTR_H
  240.                 out (c),e
  241.                 inc b
  242.                 out (c),d
  243.                 call w53_listen_acc
  244.                 pop hl
  245.                 inc hl
  246.                 ld a,(hl)       ;яюьхэ хь ёюъхЄ√ ьхёЄрьш
  247.                 ld e,(ix+1)
  248.                 ld (hl),e
  249.                 ld (ix+1),a
  250.                 push ix
  251.                 pop hl
  252.                 xor a
  253.                 ret
  254.                
  255.                 W53FLAGSMACRO
  256. w53_listen:
  257.                 call w53_valid_socket
  258.                 jp z,w53_invalid_socked0
  259. w53_listen_acc:
  260.                 ld a,Sn_CR_OPEN
  261.                 call w53_cmd
  262.                 ld b,WIZ_S_SSR
  263. w53_listen0:
  264.                 in a,(c)
  265.                 or a
  266.                 jr z,w53_listen0
  267.                 ld a,Sn_CR_LISTEN
  268.                 call w53_cmd
  269.                 xor a
  270.                 ld l,a
  271.                 ret
  272.  
  273. w53_valid_socket:
  274.                 ex af,af'
  275.                 cp w53_socflags&0xff
  276.                 jr c,w53_invalid_socked
  277.                 cp w53_endsocflags&0xff
  278.                 jr nc,w53_invalid_socked
  279.                 ld ixl,a
  280.                 ld ixh,w53_socflags>>8
  281. w53_valid_socket1:
  282.                 ld bc,WIZ_REGAD_PORT
  283.                 ld a,(ix+1)
  284.                 out (c),a
  285.                 ld b,WIZ_S_MR
  286.                 in a,(c)
  287.                 or a   
  288.                 ret
  289. w53_invalid_socked:
  290.                 pop af
  291. w53_invalid_socked0:
  292.                 ld hl,-1
  293.                 ld a,ERR_NOTSOCK
  294.                 ret
  295.                
  296.                 W53FLAGSMACRO
  297. w53_connect:
  298. ;DE-sockaddr_in
  299.                 ld l,-1
  300.                 call w53_valid_socket
  301.                 jp z,w53_invalid_socked0
  302.                 ;dec a
  303.                 ;ld a,ERR_PROTOTYPE
  304.                 ;ret nz
  305.                 ld b,WIZ_S_SSR
  306.                 in a,(c)
  307.                 or a
  308.                 ld a,ERR_ALREADY
  309.                 ret nz
  310.                 push de
  311.                 ld de,(wizlocalport)
  312.                 inc de
  313.                 set 6,d
  314.                 set 7,d
  315.                 ld (wizlocalport),de
  316.                 ld b,WIZ_S_PORTR_H
  317.                 out (c),d
  318.                 inc b
  319.                 out (c),e
  320.                 pop de
  321.                 ld a,Sn_CR_OPEN
  322.                 call w53_cmd
  323.                 ld b,WIZ_S_SSR
  324. w53_connect0:
  325.                 in a,(c)
  326.                 or a
  327.                 jr z,w53_connect0
  328.                 call BDOS_preparedepage
  329.        call BDOS_setdepage
  330.                 ex de,hl
  331.                 inc hl  ;яЁюяєёЄшь ёхьхщёЄтю
  332.                 ld bc,WIZ_BASE_ADDR+(WIZ_S_DPORTR_L<<8)
  333.                 ld a,6
  334. w53_connect1:
  335.                 outi
  336.                 inc b
  337.                 inc b
  338.                 dec a
  339.                 jr nz,w53_connect1
  340.                 ld b,WIZ_S_MR
  341.                 in a,(c)
  342.                 cp Sn_MR_TCP
  343.                 jr nz,w53_connect3
  344.                 ld a,Sn_CR_CONNECT
  345.                 call w53_cmd
  346.                 ld b,WIZ_S_SSR
  347. w53_connect2:
  348.                 in a,(c)
  349.                 cp SOCK_ESTABLISHED
  350.                 jr z,w53_connect3
  351.                 or a
  352.                 jr nz,w53_connect2
  353.                 ld l,-1
  354.                 ld a,ERR_HOSTUNREACH
  355.                 ret
  356. w53_connect3:
  357.                 xor a
  358.                 ld l,a
  359.                 ret
  360.                
  361.                 W53FLAGSMACRO
  362. w53_close:
  363.                 call w53_valid_socket
  364.                 ld l,0
  365.                 ret z   ;ёюъхЄ єцх єсшЄ
  366.                 dec l
  367.                 ex af,af'
  368.                 ld a,e
  369.                 or a
  370.                 jr z,w53_close_nochk
  371.                 ld b,WIZ_S_FSR_H        ;яЁютхЁшь яєёЄ ыш сєЇхЁ юЄяЁртъш
  372.                 in a,(c)
  373.                 cp 0x20
  374.                 jr nz,w53_close_nochk
  375.                 inc b
  376.                 in e,(c)
  377. w53_close_nochk:
  378.                 ex af,af'
  379.                 cp Sn_MR_TCP
  380.                 jr nz,w53_close_udp
  381. w53_close_tcp:
  382.                 ld b,WIZ_S_SSR
  383.                 in a,(c)
  384.                 jr z,w53_close3         ;єцх чръЁ√Є??? тючьюцэю эхэєцэю
  385.                 cp SOCK_ESTABLISHED
  386.                 jr nz,w53_close_wait    ;w53_closewait
  387.                 ld a,e
  388.                 or a
  389.                 ld a,ERR_EAGAIN
  390.                 ret nz
  391.                 ld a,Sn_CR_DISCON
  392.                 call w53_cmd
  393.                 jr w53_close_tcp
  394. w53_close_udp:
  395.                 ld b,WIZ_S_SSR
  396.                 in a,(c)
  397.                 cp SOCK_UDP
  398.                 jr nz,w53_close_wait
  399.                 ld a,e
  400.                 or a
  401.                 ld a,ERR_EAGAIN
  402.                 ret nz
  403. w53_close_wait:
  404.                 ld a,Sn_CR_CLOSE
  405.                 call w53_cmd
  406.                 ld b,WIZ_S_SSR
  407. w53_close2:
  408.                 in a,(c)
  409.                 or a
  410.                 jr nz,w53_close2
  411. w53_close3:
  412.                 xor a
  413.                 ld b,WIZ_S_MR
  414.                 out (c),a
  415.                 ld l,a
  416.                 ret
  417.                 W53FLAGSMACRO
  418. w53_cmd:
  419.                 ld b,WIZ_S_CR
  420.                 out (c),a
  421. w53_cmd0:
  422.                 in a,(c)
  423.                 or a
  424.                 ret z
  425.                 jr w53_cmd0
  426.                
  427.                
  428. wiznet_read:    ;a'-ёюъхЄ, de-┴єЇхЁ, hl-ъюышўхёЄтю
  429.                 call w53_valid_socket
  430.                 jp z,w53_invalid_socked0
  431.                 ;call BDOS_preparedepage
  432. w53_read_min:                   ;hl-ёъюы№ъю їюЄшь срщЄ
  433.                 ld a,h
  434.                 or l
  435.                 ret z
  436. w53_read55:
  437.                 ld c,(ix+2)
  438.                 ld b,(ix+3)
  439.                 ld a,b
  440.                 or c
  441.                 jp z,w53_read_new       ;ёЄрЁ√ї фрээ√ї эхЄє, ўшЄрЄ№ эют√щ яръхЄ
  442.                
  443.                 ;ўшЄрхь ёЄрЁ√щ яръхЄ
  444.                 ;bc=min(hl,bc), datasize-=bc
  445.                 sbc hl,bc
  446.                 ld a,c
  447.                 jr nc,w53_minimum0
  448.                 add hl,bc
  449.                 ld b,h
  450.                 ld c,l
  451.                 ;ld h,0
  452.                 ;ld l,0
  453. w53_minimum0:
  454.                 ;ld a,(ix+2)
  455.                 sub c
  456.                 ld (ix+2),a
  457.                 ld a,(ix+3)
  458.                 sbc a,b
  459.                 ld (ix+3),a
  460.                
  461.                 push bc                         ;ёъюы№ъю Ёхры№эю яЁюўЄхь ёюїЁрэшь
  462.                 ex de,hl
  463.                 ld d,b
  464.                 ld e,c
  465.                  ;0x00ff => 0x00ff
  466.                  ;0x0100 => 0x0000
  467.                  dec de
  468.                  inc e
  469.                
  470.                 ld c,WIZ_BASE_ADDR
  471.                 ld b,(ix+0)
  472.                 ld a,WIZ_S_RX_L
  473.                 ;bit 0,b
  474.                 ;jr nz,w53_read_loopl
  475.                 cp b
  476.                 jr z,w53_read_loopl
  477. w53_read_loop:  ;ўЄю-Єю эрфю фюўшЄрЄ№ de-count, hl-ptr
  478.                 ini
  479.                 ld b,a
  480.                 dec e
  481.                 jr z,w53_read_looph
  482. w53_read_loopl:
  483.                 ini
  484.                 dec e
  485.                 jp nz,w53_read_loop
  486.                 dec d
  487.                 ;jp p,w53_read_loop
  488.                 jp m,w53_read_loope
  489.                 if 1==1
  490. w53_read_fastloopd:
  491.                 ld e,256/8/2
  492. w53_read_fastloop:
  493.                 dup 8
  494.                 ini
  495.                 ld b,a
  496.                 ini
  497.                 edup
  498.                 dec e
  499.                 jp nz,w53_read_fastloop
  500.                 dec d
  501.                 jp p,w53_read_fastloopd
  502.                 jp w53_read_loope
  503.                 endif
  504. w53_read_looph:
  505.                 dec d
  506.                 ;jp p,w53_read_loopl
  507.                 jp m,w53_read_loope
  508.                 if 1==1
  509. w53_read_fastloophd:
  510.                 ld e,256/8/2
  511. w53_read_fastlooph:
  512.                 dup 8
  513.                 ini
  514.                 ini
  515.                 ld b,a
  516.                 edup
  517.                 dec e
  518.                 jp nz,w53_read_fastlooph
  519.                 dec d
  520.                 jp p,w53_read_fastloophd
  521.                 ;jp w53_read_loope
  522.                 endif
  523. w53_read_loope:         ;ъюэхЎ Ўшъыр
  524.                 ld (ix+0),b     ;ёюїЁрэшь ёыхфє■∙шщ ЁхушёЄЁ RX 
  525.                 pop hl                                  ;ёъюы№ъю яЁюўшЄрыш
  526.                 ld a,(ix+2)                             ;хёыш т сєЇхЁх ўЄюЄю хёЄ№,
  527.                 or (ix+3)                               ;Єю т√їюфшь
  528.                 ret nz                                 
  529.                 bit 0,b                                 ;шэрўх ъюьрэфр - яръхЄ чрсЁрыш
  530.                 jr z,w53_read_noblanc
  531.                 in a,(c)                                ;фюўшЄрхь їюыюёЄющ срщЄ
  532. w53_read_noblanc:
  533.                 ld a,Sn_CR_RECV
  534.                 jp w53_cmd      ;т√їюфшь
  535.                
  536. w53_read_new:           ;ўшЄрЄ№ эют√щ яръхЄ
  537.                 ld bc,WIZ_BASE_ADDR+(WIZ_S_RX_RSR_L<<8)
  538.                 in a,(c)
  539.                 jr nz,w53_read_new1
  540.                 dec b
  541.                 in a,(c)
  542.                 jr nz,w53_read_new1
  543.                 ;т сєЇхЁх эшўхую. яЁютхЁшь цшт ыш ёюъхЄ
  544.                 ld h,a                  ;эшўхую эх яЁюўшЄрыш
  545.                 ld l,a
  546.                 ld b,WIZ_S_SSR         
  547.                 in a,(c)
  548.                 cp SOCK_ESTABLISHED
  549.                 ret z
  550.                 cp SOCK_ARP
  551.                 ret z
  552.                 cp SOCK_UDP
  553.                 ret nc
  554.                 ;ld h,-1
  555.                 ld a,ERR_NOTCONN
  556.                 jr wiznet_fail ;ret
  557. w53_read_new1:
  558.                 ld b,WIZ_S_SSR
  559.                 in a,(c)
  560.                 ld b,WIZ_S_RX_H
  561.                 cp SOCK_UDP
  562.                 jr nz,w53_read_new2
  563.                 in a,(c)
  564.                 inc b
  565.                 in a,(c)
  566.                 dec b
  567.                 in a,(c)
  568.                 inc b
  569.                 in a,(c)
  570.                 dec b
  571.                 in a,(c)
  572.                 inc b
  573.                 in a,(c)
  574.                 dec b  
  575. w53_read_new2:
  576.                 ld (ix+0),b
  577.                 in a,(c)
  578.                 ld (ix+3),a
  579.                 inc b
  580.                 in a,(c)
  581.                 ld (ix+2),a
  582.                 jp w53_read_min
  583.  
  584. wiznet_close:
  585. wiznet_write:   ;a'-ёюъхЄ, de-┴єЇхЁ, hl-ъюышўхёЄтю
  586.                 call w53_valid_socket
  587.                 jp z,w53_invalid_socked0
  588.                 ;call BDOS_preparedepage
  589.                 ld c,WIZ_BASE_ADDR
  590.                 ld b,WIZ_S_SSR          ;цшт ыш ёюъхЄ
  591.                 in a,(c)
  592.                 cp SOCK_ESTABLISHED
  593.                 jr z,w53_write1
  594.                 cp SOCK_UDP
  595.                 jr nc,w53_write1
  596.                 ld a,ERR_NOTCONN        ;шчфюї
  597. wiznet_fail:
  598.                 ld h,-1
  599.                 ret
  600. w53_write1:
  601.                 ld b,WIZ_S_FSR_L        ;яЁютхЁшь ьхёЄю т сєЇхЁх
  602.                 in a,(c)
  603.                 dec b
  604.                 sub l
  605.                 in a,(c)
  606.                 sbc a,h
  607.                 jr nc,w53_wr_count_valid
  608.                 ;pop de
  609.                 ;ld h,-1
  610.                 ld a,ERR_EMSGSIZE
  611.                 jr wiznet_fail ;ret
  612. w53_wr_count_valid:    
  613.                 ex de,hl
  614.                 push de         ;ўЄюс√ яюЄюь ёъюы№ъю юЄяЁртшыш тхЁэєЄ№
  615.                 dec de
  616.                 push de
  617.                 pop ix
  618.                 ld de,-2
  619.                 ld b,WIZ_S_TX_L
  620.                 ld a,WIZ_S_TX_L+1
  621. w53_wr_loop:
  622.                 outi
  623.                 ld b,a
  624.                 outi
  625.                 add ix,de
  626.                 jr c,w53_wr_loop               
  627.                 pop hl
  628.                 ld b,WIZ_S_WRSR_H
  629.                 out (c),h
  630.                 inc b
  631.                 out (c),l
  632.                 ld a,Sn_CR_SEND
  633.                 jp w53_cmd
  634.                
  635.