?login_element?

Subversion Repositories NedoOS

Rev

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