?login_element?

Subversion Repositories NedoOS

Rev

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