?login_element?

Subversion Repositories NedoOS

Rev

Rev 2046 | 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_BUFFER_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.     ret
  114.        
  115.        
  116. openTCP ;DE - port_str, HL - domain name
  117.         push hl
  118.         call atohl
  119.         ld a,h,h,l,l,a
  120.         ld (host_ia.curport),hl      
  121.         pop de
  122.         call dns_resolver
  123.         ld a,h : or l : jp z,reqErr
  124.         ld de,host_ia+3
  125.         ld bc,4
  126.         ldir
  127.         ld de,1+(2<<8)
  128.         OS_NETSOCKET
  129.         ld a,l : or a : jp m,reqErr
  130.         ld (sock_fd),a
  131.         ld de,host_ia
  132.         OS_NETCONNECT
  133.     ld a,l : or a : jp m,reqErr
  134.     xor a : ld (closed), a
  135.         ret
  136.        
  137. closed
  138.     defb 1
  139. bytes_avail
  140.     defw 0
  141. buffer_pointer
  142.     defw 0
  143.        
  144. reqErr
  145.     ld hl, .errMsg : call DialogBox.msgBox
  146.     scf
  147.     ret
  148. .errMsg db "Socket failed!",0
  149.        
  150. dns_resolver:           ;DE-domain name
  151.     ld (.httphostname),de
  152.     ld a,254
  153.     ld (.dns_err_count),a
  154. .dns_err_loop
  155.         ;push de
  156.         ld hl,.dns_head
  157.         ld de,outputBuffer
  158.         ld bc,6
  159.         ldir
  160.         ex de,hl
  161.         ld de,outputBuffer+7
  162.         ld (hl),b;0
  163.         ld  c,256-7
  164.         ldir
  165.         ld de,outputBuffer+12
  166.         ld h,d
  167.         ld l,e
  168.         ld bc,.httphostname ;pop bc
  169. .httphostname=$-2
  170. .name_loop:
  171.         inc hl
  172.         ld a,(bc)
  173.         ld (hl),a
  174.         inc bc
  175.         cp '.'
  176.         jr z,.is_dot
  177.         or a
  178.         jr nz,.name_loop
  179. .is_dot:
  180.         sbc hl,de
  181.         ex de,hl
  182.         dec e
  183.         ld (hl),e
  184.         inc e
  185.         add hl,de
  186.         ld d,h
  187.         ld e,l
  188.         or a
  189.         jr nz,.name_loop
  190.         inc a
  191.         inc hl
  192.         inc hl
  193.         ld (hl),a
  194.         inc hl
  195.         inc hl
  196.         ld (hl),a
  197.         inc hl
  198.         push hl
  199. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  200.         ld a, (.dns_ia2)
  201.         cp 0
  202.         jp nz, .skipgetdns
  203.         ld de, .dns_ia2;DE= ptr to DNS buffer(4 bytes)
  204.         OS_GETDNS
  205. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  206. .skipgetdns:
  207.         ld de,0x0203
  208.     OS_NETSOCKET
  209.         ld a,l
  210.         ld (sock_fd),a
  211.         or a
  212.         jp m,.dns_exiterr
  213.         pop hl
  214.         push hl
  215.         ld de,0xffff&(-outputBuffer)
  216.         add hl,de
  217.         LD      a,(sock_fd)
  218.         LD      IX,outputBuffer
  219.         LD      DE,.dns_ia
  220.         OS_WIZNETWRITE
  221.         bit 7,h
  222.         jr nz,.dns_exitcode
  223. .dns_err_count=$+1
  224.         ld b,32
  225.         jr .recv_wait1
  226. .recv_wait:
  227.         push bc
  228.         ld c,nos.CMD_YIELD
  229.         call nos.BDOS
  230.         pop bc
  231. .recv_wait1:
  232.         push bc
  233.         ld hl,256
  234.         LD      a,(sock_fd)
  235.         LD      DE,outputBuffer
  236.         LD      IX,outputBuffer
  237.         OS_WIZNETREAD
  238.         pop bc
  239.         bit 7,h
  240.         jr z,.recv_wait_end
  241.         djnz .recv_wait
  242.         jr .dns_exiterr
  243. .recv_wait_end:
  244.         ld a,(outputBuffer+3)
  245.         and 0x0f       
  246.         jr nz,.dns_exiterr
  247. .dns_exitcode:
  248.         LD      a,(sock_fd)
  249.         LD      E,0
  250.         OS_NETSHUTDOWN
  251.         pop hl
  252. .reqpars_l
  253.         inc hl
  254.         inc hl
  255.         inc hl
  256.         ld a,(hl)
  257.         ld de,7
  258.         add hl,de
  259.         ld b,(hl)
  260.         inc hl
  261.         ld c,(hl)
  262.         inc hl
  263.         dec a
  264.         ret z
  265.         cp 4
  266.         jr nz,.exiterr1
  267.         add hl,bc
  268.         jr .reqpars_l
  269. .dns_exiterr:
  270.         pop af
  271.         LD      a,(sock_fd)
  272.         LD      E,0
  273.         OS_NETSHUTDOWN
  274.     ld a,(.dns_err_count)
  275.     add a,a
  276.     ld (.dns_err_count),a
  277.         OS_YIELD
  278.     jp nc,.dns_err_loop
  279. .exiterr1:
  280.     ld hl,0
  281.         ret
  282. .dns_head
  283.         defb 0x11,0x22,0x01,0x00,0x00,0x01
  284.  
  285. ;struct sockaddr_in {unsigned char sin_family;unsigned short sin_port;
  286. ;       struct in_addr sin_addr;char sin_zero[8];};
  287. .dns_ia:
  288.         defb 0
  289.         db 0,53 ;port (big endian)
  290. .dns_ia2:
  291.         db 0,0,0,0 ;ip (big endian)
  292.  
  293. sock_fd     defb 0
  294.     ENDMODULE