?login_element?

Subversion Repositories NedoOS

Rev

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