Advertisement
DimkaM

w5300_nedoos

Mar 18th, 2020
1,393
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  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. w53_listen_acc:
  287.         ld a,Sn_CR_OPEN
  288.         call w53_cmd
  289.         ld b,WIZ_S_SSR
  290. w53_listen0:
  291.         in a,(c)
  292.         or a
  293.         jr z,w53_listen0
  294.         ld a,Sn_CR_LISTEN
  295.         call w53_cmd
  296.         xor a
  297.         ld l,a
  298.         ret
  299.  
  300. w53_valid_socket:
  301.         ex af,af'
  302.         or a
  303.         jr z,w53_invalid_socked
  304.         cp 37
  305.         jr nc,w53_invalid_socked
  306. w53_valid_socket1:
  307.         add a,0xff&w53_socflags
  308.         ld ixl,a
  309.         ld a,0
  310.         adc a,0xff&(w53_socflags>>8)
  311.         ld ixh,a
  312.         ld a,(ix+4)
  313.         or a
  314.         jr z,w53_valid_free
  315.         cp (iy+app.id)
  316.         ret nz
  317.         ;jr nz,w53_invalid_socked0
  318. w53_valid_free:
  319.         ld bc,WIZ_CFG_PORT
  320.         in a,(c)
  321.         and 0x40
  322.         or 0x10
  323.         out (c),a
  324.         ld b,0xff&(WIZ_REGAD_PORT>>8) ;bc,WIZ_REGAD_PORT
  325.         ld a,(ix+1)
  326.         out (c),a
  327.         ld b,WIZ_S_MR
  328.         in a,(c)
  329.         and 0x0f   
  330.         ret
  331. w53_invalid_socked:
  332.         pop af
  333. w53_invalid_socked0:
  334.         ld hl,-1
  335.         ld a,ERR_NOTSOCK
  336.         ret
  337.  
  338. w53_open_cmd
  339.         ld a,Sn_CR_OPEN
  340.         call w53_cmd
  341.         ld b,WIZ_S_SSR
  342. w53_op_cmd1:
  343.         in a,(c)
  344.         or a
  345.         jr z,w53_op_cmd1
  346.         ret
  347.        
  348. w53_connect:
  349. ;DE-sockaddr_in
  350.         ld l,-1
  351.         call w53_valid_socket
  352.         jp z,w53_invalid_socked0
  353.         ;dec a
  354.         ;ld a,ERR_PROTOTYPE
  355.         ;ret nz
  356.         ld b,WIZ_S_SSR
  357.         in a,(c)
  358.         or a
  359.         ld a,ERR_ALREADY
  360.         ret nz
  361.         call w53_open_cmd
  362.         call w53_cpy_ia
  363.         ld b,WIZ_S_MR
  364.         in a,(c)
  365.         cp Sn_MR_TCP
  366.         jr nz,w53_connect3
  367.         ld a,Sn_CR_CONNECT
  368.         call w53_cmd
  369.         ld b,WIZ_S_SSR
  370. w53_connect2:
  371.         in a,(c)
  372.         cp SOCK_ESTABLISHED
  373.         jr z,w53_connect3
  374.         or a
  375.         jr nz,w53_connect2
  376.         ld l,-1
  377.         ld a,ERR_HOSTUNREACH
  378.         ret
  379. w53_connect3:
  380.         xor a
  381.         ld l,a
  382.         ret
  383.        
  384. w53_cpy_ia
  385.         call BDOS_preparedepage
  386.         call BDOS_setdepage
  387.         ex de,hl
  388.         inc hl  ;пропустим семейство
  389.         ld bc,WIZ_BASE_ADDR+(WIZ_S_DPORTR_L<<8)
  390.         ld a,6
  391. w53_cpy_ia1:
  392.         outi
  393.         inc b
  394.         inc b
  395.         dec a
  396.         jr nz,w53_cpy_ia1
  397.         ex de,hl
  398.         ret
  399.        
  400. w53_close:
  401.         call w53_valid_socket
  402. w53_close_valid:
  403.         ld l,0
  404.         ld (ix+4),l
  405.         ret z   ;сокет уже убит
  406.         dec l
  407.         ex af,af'
  408.         ld a,e
  409.         or a
  410.         jr z,w53_close_nochk
  411.         ld b,WIZ_S_FSR_H    ;проверим пуст ли буфер отправки
  412.         in a,(c)
  413.         cp 0x20
  414.         jr nz,w53_close_nochk
  415.         inc b
  416.         in e,(c)    ;????что то не так????
  417.                     ;восстановить ID
  418. w53_close_nochk:
  419.         ex af,af'
  420.         cp Sn_MR_TCP
  421.         jr nz,w53_close_udp
  422. w53_close_tcp:
  423.         ld b,WIZ_S_SSR
  424.         in a,(c)
  425.         jr z,w53_close3     ;уже закрыт??? возможно ненужно
  426.         cp SOCK_ESTABLISHED
  427.         jr nz,w53_close_wait    ;w53_closewait
  428.         ld a,e
  429.         or a
  430.         ld a,ERR_EAGAIN
  431.         ret nz
  432.         ld a,Sn_CR_DISCON
  433.         call w53_cmd
  434.         jr w53_close_tcp
  435. w53_close_udp:
  436.         ld b,WIZ_S_SSR
  437.         in a,(c)
  438.         cp SOCK_UDP
  439.         jr c,w53_close_wait
  440.         ld a,e
  441.         or a
  442.         ld a,ERR_EAGAIN
  443.         ret nz
  444. w53_close_wait:
  445.         ld a,Sn_CR_CLOSE
  446.         call w53_cmd
  447.         ld b,WIZ_S_SSR
  448. w53_close2:
  449.         in a,(c)
  450.         or a
  451.         jr nz,w53_close2
  452. w53_close3:
  453.         xor a
  454.         ld b,WIZ_S_MR
  455.         out (c),a
  456.         ld l,a
  457.         ret
  458.        
  459. w53_cmd:
  460.         ld b,WIZ_S_CR
  461.         out (c),a
  462. w53_cmd0:
  463.         in a,(c)
  464.         or a
  465.         ret z
  466.         jr w53_cmd0
  467.  
  468. w53_rd_nontcp:
  469.         ld b,WIZ_S_SSR
  470.         in a,(c)
  471.         call z,w53_open_cmd
  472.         ld bc,WIZ_BASE_ADDR+(WIZ_S_RX_RSR_L<<8)
  473.         in a,(c)
  474.         jr nz,w53_rd_udp_full
  475.         dec b
  476.         in a,(c)
  477.         jr nz,w53_rd_udp_full
  478. w53_eagain
  479.         ld hl,-1
  480.         ld a,ERR_EAGAIN
  481.         ret
  482. w53_rd_udp_full
  483.         ld a,d
  484.         or e
  485.         jr nz,w53_rd_ia
  486.         ld de,w53_ia_buf       
  487. w53_rd_ia:
  488.         ex de,hl
  489.         inc hl
  490.         inc hl
  491.         inc hl
  492.         ld b,WIZ_S_SSR
  493.         in a,(c)
  494.         ld b,WIZ_S_RX_H
  495.         cp SOCK_IPRAW
  496.         jr z,w53_rd_ipraw
  497.         dec hl
  498.         dec hl
  499.         ini
  500.         inc b
  501.         inc b
  502.         ini
  503. w53_rd_ipraw:
  504.         ini
  505.         inc b
  506.         inc b
  507.         ini
  508.         ini
  509.         inc b
  510.         inc b
  511.         ini
  512.         in h,(c)
  513.         inc b
  514.         in l,(c)
  515.         or a
  516.         sbc hl,de
  517.         bit 7,h
  518.         ex de,hl
  519.         jr z,w53_rd_udpbuf
  520.         add hl,de
  521.         ld de,0
  522. w53_rd_udpbuf; читать hl, пропустить de
  523.         push de
  524. w53_rd_ix=$+2
  525.         ld de,0
  526.         call BDOS_preparedepage
  527.         call BDOS_setdepage
  528.         ex de,hl
  529.         ld bc,WIZ_BASE_ADDR+(WIZ_S_RX_H<<8)
  530.         bit e,0
  531.        
  532.         ret
  533.        
  534.        
  535. wiznet_read:    ;a'-сокет, de-Буфер, hl-количество
  536.         ld (w53_rd_ix),ix
  537.         call w53_valid_socket
  538.         jp z,w53_invalid_socked0
  539.         and 0x02
  540.         jr nz,w53_rd_nontcp
  541. w53_read_min:   ;hl-сколько хотим байт
  542.         ld a,h
  543.         or l
  544.         ret z
  545. w53_read55:
  546.         ld c,(ix+2)
  547.         ld b,(ix+3)
  548.         ld a,b
  549.         or c
  550.         jp z,w53_read_new   ;старых данных нету, читать новый пакет
  551.        
  552.         ;читаем старый пакет
  553.         ;bc=min(hl,bc), datasize-=bc
  554.         sbc hl,bc
  555.                 ld a,c
  556.         jr nc,w53_minimum0
  557.         add hl,bc
  558.         ld b,h
  559.         ld c,l
  560.         ;ld h,0
  561.         ;ld l,0
  562. w53_minimum0:
  563.         ;ld a,(ix+2)
  564.         sub c
  565.         ld (ix+2),a
  566.         ld a,(ix+3)
  567.         sbc a,b
  568.         ld (ix+3),a
  569.        
  570.         push bc             ;сколько реально прочтем сохраним
  571.         ex de,hl
  572.         ld d,b
  573.         ld e,c
  574.                  ;0x00ff => 0x00ff
  575.                  ;0x0100 => 0x0000
  576.                  dec de
  577.                  inc e
  578.                
  579.         ld c,WIZ_BASE_ADDR
  580.         ld b,(ix+0)
  581.         ld a,WIZ_S_RX_L
  582.                 ;bit 0,b
  583.                 ;jr nz,w53_read_loopl
  584.         cp b
  585.         jr z,w53_read_loopl
  586. w53_read_loop:  ;что-то надо дочитать de-count, hl-ptr
  587.         ini
  588.         ld b,a
  589.         dec e
  590.         jr z,w53_read_looph
  591. w53_read_loopl:
  592.         ini
  593.         dec e
  594.         jp nz,w53_read_loop
  595.         dec d
  596.         ;jp p,w53_read_loop
  597.         jp m,w53_read_loope
  598.                 if 1==1
  599. w53_read_fastloopd:
  600.                 ld e,256/8/2
  601. w53_read_fastloop:
  602.                 dup 8
  603.                 ini
  604.                 ld b,a
  605.                 ini
  606.                 edup
  607.                 dec e
  608.                 jp nz,w53_read_fastloop
  609.                 dec d
  610.                 jp p,w53_read_fastloopd
  611.         jp w53_read_loope
  612.                 endif
  613. w53_read_looph:
  614.         dec d
  615.         ;jp p,w53_read_loopl
  616.         jp m,w53_read_loope
  617.                 if 1==1
  618. w53_read_fastloophd:
  619.                 ld e,256/8/2
  620. w53_read_fastlooph:
  621.                 dup 8
  622.                 ini
  623.                 ini
  624.                 ld b,a
  625.                 edup
  626.                 dec e
  627.                 jp nz,w53_read_fastlooph
  628.                 dec d
  629.                 jp p,w53_read_fastloophd
  630.         ;jp w53_read_loope
  631.                 endif
  632. w53_read_loope:     ;конец цикла
  633.         ld (ix+0),b ;сохраним следующий регистр RX 
  634.         pop hl                  ;сколько прочитали
  635.         ld a,(ix+2)             ;если в буфере чтото есть,
  636.         or (ix+3)               ;то выходим
  637.         ret nz                 
  638.         bit 0,b                 ;иначе команда - пакет забрали
  639.         jr z,w53_read_noblanc
  640.         in a,(c)                ;дочитаем холостой байт
  641. w53_read_noblanc:
  642.         ld a,Sn_CR_RECV
  643.         jp w53_cmd  ;выходим
  644.        
  645. w53_read_new:       ;читать новый пакет
  646.         ld bc,WIZ_BASE_ADDR+(WIZ_S_RX_RSR_L<<8)
  647.         in a,(c)
  648.         jr nz,w53_read_new1
  649.         dec b
  650.         in a,(c)
  651.         jr nz,w53_read_new1
  652.         ;в буфере ничего. проверим жив ли сокет
  653.         ld h,a          ;ничего не прочитали
  654.         ld l,a
  655.         ld b,WIZ_S_SSR     
  656.         in a,(c)
  657.         cp SOCK_ESTABLISHED
  658.         ret z
  659.         cp SOCK_ARP
  660.         ret z
  661.         cp SOCK_UDP
  662.         ret nc
  663.         ;ld h,-1
  664.         ld a,ERR_NOTCONN
  665.         jr wiznet_fail ;ret
  666. w53_read_new1:
  667.         ld b,WIZ_S_SSR
  668.         in a,(c)
  669.         ld b,WIZ_S_RX_H
  670.         cp SOCK_IPRAW
  671.         jr z,w53_read_skip4
  672.         cp SOCK_UDP
  673.         jr c,w53_read_new2
  674.         in a,(c)
  675.         inc b
  676.         in a,(c)
  677.         dec b
  678. w53_read_skip4:
  679.         in a,(c)
  680.         inc b
  681.         in a,(c)
  682.         dec b
  683.         in a,(c)
  684.         inc b
  685.         in a,(c)
  686.         dec b  
  687. w53_read_new2:
  688.         ld (ix+0),b
  689.         in a,(c)
  690.         ld (ix+3),a
  691.         inc b
  692.         in a,(c)
  693.         ld (ix+2),a
  694.         jp w53_read_min
  695.  
  696. wiznet_close:
  697. wiznet_write:   ;a'-сокет, de-Буфер, hl-количество
  698.         ld (w53_wr_ix),ix
  699.         call w53_valid_socket
  700.         jp z,w53_invalid_socked0
  701.         and 0x02
  702.         ld a,WIZ_S_SSR
  703.         in a,(WIZ_BASE_ADDR)    ;чтоп не трогать флаги
  704.         jr nz,wiz_wr_isudp
  705.         cp SOCK_ESTABLISHED
  706.         jr z,w53_write1
  707. wiznet_fail_1
  708.         ld a,ERR_NOTCONN    ;издох
  709. wiznet_fail:
  710.         ld h,-1
  711.         ret
  712. wiz_wr_isudp:
  713.         cp SOCK_UDP
  714.         jr nc,w53_wr_set_addr
  715.         or a
  716.         jr nz,wiznet_fail_1
  717.         call w53_open_cmd
  718. w53_wr_set_addr    
  719.         push de
  720. w53_wr_ix=$+2
  721.         ld de,0
  722.         call w53_cpy_ia
  723.         pop de
  724.         call BDOS_preparedepage
  725.         call BDOS_setdepage
  726.         ld c,WIZ_BASE_ADDR
  727. w53_write1:
  728.         ld b,WIZ_S_FSR_L    ;проверим место в буфере
  729.         in a,(c)
  730.         dec b
  731.         sub l
  732.         in a,(c)
  733.         sbc a,h
  734.         jr nc,w53_wr_count_valid
  735.         ;pop de
  736.         ;ld h,-1
  737.         ld a,ERR_EMSGSIZE
  738.         jr wiznet_fail ;ret
  739. w53_wr_count_valid:
  740.         ex de,hl
  741.         push de     ;чтобы потом сколько отправили вернуть
  742.         dec de
  743.         push de
  744.         pop ix
  745.         ld de,-2
  746.         ld b,WIZ_S_TX_L
  747.         ld a,WIZ_S_TX_L+1
  748. w53_wr_loop:
  749.         outi
  750.         ld b,a
  751.         outi
  752.         add ix,de
  753.         jr c,w53_wr_loop
  754.         pop hl
  755.         ld b,WIZ_S_WRSR_H
  756.         out (c),h
  757.         inc b
  758.         out (c),l
  759.         ld a,Sn_CR_SEND
  760.         jp w53_cmd
  761.    
  762. w53_ia_buf:
  763.     defs 6
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement