Subversion Repositories NedoOS

Rev

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