?login_element?

Subversion Repositories NedoOS

Rev

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