?login_element?

Subversion Repositories NedoOS

Rev

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