?login_element?

Subversion Repositories NedoOS

Rev

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

  1.     MODULE Wifi
  2.         macro OS_NETSOCKET ;D=address family (2=inet, 23=inet6), E=socket type (0x01 tcp/ip, 0x02 icmp, 0x03 udp/ip) ;out: L=SOCKET (if L < 0 then A=error)
  3.                 ld l,0x01
  4.                 ld c,nos.CMD_WIZNETOPEN
  5.                 call nos.BDOS
  6.         endm
  7.         macro OS_NETCONNECT;A=SOCKET, DE=sockaddr ptr {unsigned char sin_family /*net type*/; unsigned short sin_port; struct in_addr sin_addr /*4 bytes IP*/; char sin_zero[8];}; out: if HL < 0 then A=error
  8.                 ld l,0x03
  9.                 ld c,nos.CMD_WIZNETOPEN
  10.                 ex af,af'
  11.                 call nos.BDOS
  12.         endm   
  13.         macro OS_WIZNETWRITE;A=SOCKET, de=buffer_ptr, HL=sizeof(buffer) ; out: HL=count if HL < 0 then A=error
  14.                 ld c,nos.CMD_WIZNETWRITE
  15.                 ex af,af'
  16.                 call nos.BDOS
  17.         endm
  18.         macro OS_WIZNETREAD;A=SOCKET, de=buffer_ptr, HL=sizeof(buffer) ; out: HL=count if HL < 0 then A=error
  19.                 ld c,nos.CMD_WIZNETREAD
  20.                 ex af,af'
  21.                 call nos.BDOS
  22.         endm
  23.         macro OS_NETSHUTDOWN;A=SOCKET ; out: if HL < 0 then A=error
  24.                 ld l,0x02
  25.                 ld c,nos.CMD_WIZNETOPEN
  26.                 ex af,af'
  27.                 call nos.BDOS
  28.         endm
  29. host_ia:
  30. .curport=$+1
  31.         defb 0,0,80,8,8,8,8
  32.        
  33. tcpSendZ
  34.         push hl
  35.         pop de
  36.         push de
  37.         call strLen
  38.         pop de
  39.         ld a,(sock_fd)
  40.         OS_WIZNETWRITE
  41.         ld hl,2
  42.         ld de,.rn
  43.         ld a,(sock_fd)
  44.         OS_WIZNETWRITE
  45.         ret
  46. .rn defb "\r\n"
  47.        
  48. getPacket
  49.     ld de,(buffer_pointer)
  50.     ld hl,2048
  51.     ld a,(sock_fd)
  52.         OS_WIZNETREAD
  53.     BIT 7,H
  54.     JR Z,RECEIVED       ;ошибок нет
  55.     CP 35   ;ERR_EAGAIN
  56.     jp z, getPacket
  57.     ;обработка ошибки
  58.     ld a,1
  59.     ld (closed), a
  60.     LD  a,(sock_fd)
  61.     LD  E,0
  62.         OS_NETSHUTDOWN
  63.         ld hl,(buffer_pointer)
  64.         ld de,outputBuffer
  65.         or a
  66.         sbc hl,de
  67.     ld (bytes_avail),HL
  68.     ret
  69. RECEIVED
  70.         ex hl,de
  71.     ld hl,(buffer_pointer)
  72.         add hl,de
  73.         ld (buffer_pointer),hl
  74.         ld de,outputBuffer
  75.         or a
  76.         sbc hl,de
  77.     ld (bytes_avail),HL
  78. continue
  79.     ret
  80.        
  81.        
  82. openTCP ;DE - port_str, HL - domain name
  83.         push hl
  84.         call atohl
  85.         ld a,h,h,l,l,a
  86.         ld (host_ia.curport),hl      
  87.         pop de
  88.         call dns_resolver
  89.         ld a,h : or l : jp z,reqErr
  90.         ld de,host_ia+3
  91.         ld bc,4
  92.         ldir
  93.         ld de,1+(2<<8)
  94.         OS_NETSOCKET
  95.         ld a,l : or a : jp m,reqErr
  96.         ld (sock_fd),a
  97.         ld de,host_ia
  98.         OS_NETCONNECT
  99.     ld a,l : or a : jp m,reqErr
  100.     xor a : ld (closed), a
  101.         ret
  102.        
  103. closed
  104.     defb 1
  105. bytes_avail
  106.     defw 0
  107. buffer_pointer
  108.     defw 0
  109.        
  110. reqErr
  111.     ld hl, .errMsg : call DialogBox.msgBox
  112.     scf
  113.     ret
  114. .errMsg db "Socket failed!",0
  115.        
  116. dns_resolver:           ;DE-domain name
  117.     ld (.httphostname),de
  118.     ld a,254;3
  119.     ld (.dns_err_count),a
  120. .dns_err_loop
  121.         ;push de
  122.         ld hl,.dns_head
  123.         ld de,outputBuffer
  124.         ld bc,6
  125.         ldir
  126.         ex de,hl
  127.         ld de,outputBuffer+7
  128.         ld (hl),b;0
  129.         ld  c,256-7
  130.         ldir
  131.         ld de,outputBuffer+12
  132.         ld h,d
  133.         ld l,e
  134.         ld bc,.httphostname ;pop bc
  135. .httphostname=$-2
  136. .name_loop:
  137.         inc hl
  138.         ld a,(bc)
  139.         ld (hl),a
  140.         inc bc
  141.         cp '.'
  142.         jr z,.is_dot
  143.         or a
  144.         jr nz,.name_loop
  145. .is_dot:
  146.         sbc hl,de
  147.         ex de,hl
  148.         dec e
  149.         ld (hl),e
  150.         inc e
  151.         add hl,de
  152.         ld d,h
  153.         ld e,l
  154.         or a
  155.         jr nz,.name_loop
  156.         inc a
  157.         inc hl
  158.         inc hl
  159.         ld (hl),a
  160.         inc hl
  161.         inc hl
  162.         ld (hl),a
  163.         inc hl
  164.         push hl
  165.        
  166.         ld de,0x0203
  167.     OS_NETSOCKET
  168.         ld a,l
  169.         ld (sock_fd),a
  170.         or a
  171.         jp m,.dns_exiterr
  172.        
  173.         pop hl
  174.         push hl
  175.         ld de,0xffff&(-outputBuffer)
  176.         add hl,de
  177.         LD      a,(sock_fd)
  178.         LD      IX,outputBuffer
  179.         LD      DE,.dns_ia
  180.         OS_WIZNETWRITE
  181.         bit 7,h
  182.         jr nz,.dns_exitcode
  183. .dns_err_count=$+1
  184.         ld b,32
  185.         jr .recv_wait1
  186. .recv_wait:
  187.         push bc
  188.         ld c,nos.CMD_YIELD
  189.         call nos.BDOS
  190.         pop bc
  191. .recv_wait1:
  192.         push bc
  193.         ld hl,256
  194.         LD      a,(sock_fd)
  195.         LD      DE,outputBuffer
  196.         LD      IX,outputBuffer
  197.         OS_WIZNETREAD
  198.         pop bc
  199.         bit 7,h
  200.         jr z,.recv_wait_end
  201.         djnz .recv_wait
  202.         jr .dns_exiterr
  203. .recv_wait_end:
  204.         ld a,(outputBuffer+3)
  205.         and 0x0f       
  206.         jr nz,.dns_exiterr
  207. .dns_exitcode:
  208.         LD      a,(sock_fd)
  209.         LD      E,0
  210.         OS_NETSHUTDOWN
  211.         pop hl
  212. .reqpars_l
  213.         inc hl
  214.         inc hl
  215.         inc hl
  216.         ld a,(hl)
  217.         ld de,7
  218.         add hl,de
  219.         ld b,(hl)
  220.         inc hl
  221.         ld c,(hl)
  222.         inc hl
  223.         dec a
  224.         ret z
  225.         cp 4
  226.         jr nz,.exiterr1
  227.         add hl,bc
  228.         jr .reqpars_l
  229. .dns_exiterr:
  230.         pop af
  231.         LD      a,(sock_fd)
  232.         LD      E,0
  233.         OS_NETSHUTDOWN
  234.     ld a,(.dns_err_count)
  235.     add a,a
  236.     ld (.dns_err_count),a
  237.     jp nc,.dns_err_loop
  238. .exiterr1:
  239.     ld hl,0
  240.         ret
  241. .dns_head
  242.         defb 0x11,0x22,0x01,0x00,0x00,0x01
  243.  
  244. ;struct sockaddr_in {unsigned char sin_family;unsigned short sin_port;
  245. ;       struct in_addr sin_addr;char sin_zero[8];};
  246. .dns_ia:
  247.         defb 0
  248.         db 0,53 ;port (big endian)
  249.         db 8,8,8,8 ;ip (big endian)
  250.  
  251. sock_fd     defb 0
  252.     ENDMODULE