?login_element?

Subversion Repositories NedoOS

Rev

Rev 1933 | Go to most recent revision | Blame | Compare with Previous | Last modification | View Log | Download

  1. MODULE OS_NETSOCKET
  2. PUBLIC OS_NETSOCKET
  3. #include "sysdefs.asm"
  4. RSEG CODE
  5.  
  6. OS_NETSOCKET:  
  7. ;D - AF_INET
  8. ;E - (0x01 tcp/ip, 0x02 icmp, 0x03 udp/ip
  9. ;------
  10. ;L - SOCKET
  11. ;A - ErrNo
  12.         push bc
  13.         ld l,0x01
  14.         ld c, CMD_WIZNETOPEN
  15.         ex af,af'
  16.         push ix
  17.         push iy
  18.         call BDOS
  19.         pop iy
  20.         pop ix
  21.         pop bc
  22.         ld h, l
  23.         ld l, a
  24.        
  25.         ret
  26. ENDMOD
  27.  
  28. MODULE OS_NETCONNECT
  29. PUBLIC OS_NETCONNECT
  30. #include "sysdefs.asm"
  31. RSEG CODE
  32.  
  33. OS_NETCONNECT: 
  34. ;A  - Socket
  35. ;DE - Pointer to adrstruct
  36. ;------
  37. ;L - <0 err
  38. ;H - ErrNo
  39. ;CMD_WIZNETOPEN=0xdb ;A=SOCKET, L=subfunction (see sys_h.asm)
  40.         push bc
  41.         ld a, e
  42.         ld d, b
  43.         ld e, c
  44.         ex af,af'
  45.         ld c, CMD_WIZNETOPEN
  46.         ld l,0x03
  47.         push ix
  48.         push iy
  49.         call BDOS
  50.         pop iy
  51.         pop ix
  52.         ld h, l
  53.         LD l, a
  54.         pop bc
  55.         ret
  56. ENDMOD
  57.  
  58. MODULE OS_WIZNETREAD
  59. PUBLIC OS_WIZNETREAD
  60. #include "sysdefs.asm"
  61. RSEG CODE
  62. ;if TCP: A=SOCKET, de=buffer_ptr,               HL=sizeof(buffer)
  63. ;else:   A=SOCKET, de=sockaddr_in ptr,  HL=sizeof(buffer), IX=buffer_ptr,
  64. ;out: HL=count if HL < 0 then A=error
  65. OS_WIZNETREAD: 
  66.         push bc
  67.         ld b, e
  68.         ld a, e
  69.         add a, 05       ; protocol
  70.         ld e, a        
  71.         ld a, (de)      ;(0x01 tcp/ip, 0x02 icmp, 0x03 udp/ip  
  72.         cp 01
  73.         jp z, tcpread
  74.         cp 02
  75.         jp z, icmpread
  76.         cp 03
  77.         jp z, udpread
  78.  
  79.  
  80. tcpread:
  81.         ld e, b        
  82.         ex de,hl
  83.         ld a, (hl)      ;socket
  84.         inc hl
  85.         ld e, (hl)      ;buffer L
  86.         inc hl
  87.         ld d, (hl)      ;buffer H
  88.         inc hl
  89.         ld c, (hl)      ;size L
  90.         inc hl
  91.         ld b, (hl)      ;size H
  92.         ld l, c
  93.         ld h, b
  94.         ld c, CMD_WIZNETREAD
  95.         push ix
  96.         push iy
  97.         ex af,af'
  98.         call BDOS
  99.         pop iy
  100.         pop ix
  101.         bit 7, h
  102.         jp z, readok    ;noerror just return
  103.         ld l, a
  104.         jp readnot
  105.  
  106. icmpread:
  107. udpread:
  108.         ld e, b        
  109.         ex de,hl
  110.         ld a, (hl)      ;socket
  111.         inc hl
  112.         ld (store_ix1), hl
  113.         ld IX, (store_ix1)      ; buffer HL
  114.         inc hl
  115.         inc hl
  116.         ld c, (hl)                      ;size L
  117.         inc hl
  118.         ld b, (hl)                      ;size H
  119.         ld l, c
  120.         ld h, b
  121.         ex af,af'
  122.         ld c, CMD_WIZNETREAD
  123.         push ix
  124.         push iy
  125.         call BDOS
  126.         pop iy
  127.         pop ix
  128.         bit 7, h
  129.         jp z, readok    ;noerror just return
  130.         ld l, a
  131.  
  132. readok:
  133. readnot:
  134.         pop bc
  135.         ret
  136. store_ix1:
  137. defb 0,0,0,0,0,0,0,0
  138. ENDMOD
  139.  
  140. MODULE OS_WIZNETWRITE
  141. PUBLIC OS_WIZNETWRITE
  142. #include "sysdefs.asm"
  143. RSEG CODE
  144. ;if TCP: A=SOCKET, de=buffer_ptr,               HL=sizeof(buffer)
  145. ;else:   A=SOCKET, de=sockaddr_in ptr,  HL=sizeof(buffer), IX=buffer_ptr,
  146. ;out: HL=count if HL < 0 then A=error
  147. OS_WIZNETWRITE 
  148.         push bc
  149.         ld b, e
  150.         ld a, e
  151.         add a, 05       ; protocol
  152.         ld e, a        
  153.         ld a, (de)      ;(0x01 tcp/ip, 0x02 icmp, 0x03 udp/ip  
  154.         cp 01
  155.         jp z, tcpsend
  156.         cp 02
  157.         jp z, icmpsend
  158.         cp 03
  159.         jp z, udpsend
  160.  
  161. tcpsend:       
  162.         ld e, b
  163.         ex de,hl
  164.         ld a, (hl)                      ;socket
  165.         inc hl
  166.         ld e, (hl)                      ;buffer L
  167.         inc hl
  168.         ld d, (hl)                      ;buffer H
  169.         inc hl
  170.         ld c, (hl)                      ;size L
  171.         inc hl
  172.         ld b, (hl)                      ;size H
  173.         ld l, c
  174.         ld h, b
  175.         push ix
  176.         push iy
  177.         ld c, CMD_WIZNETWRITE
  178.         ex af,af'
  179.         call BDOS
  180.         pop iy
  181.         pop ix
  182.         bit 7, h
  183.         jp z, writeok           ;noerror just return
  184.         ld l, a
  185.         jp writenot
  186.        
  187. udpsend:
  188. icmpsend:
  189.         ld e, b
  190.         ex de,hl
  191.         ld a, (hl)                      ; socket
  192.         inc hl
  193.         ld (store_ix), hl
  194.         ld IX, (store_ix)       ; buffer HL
  195.         inc hl
  196.         inc hl
  197.         ld c, (hl)                      ; size L
  198.         inc hl
  199.         ld b, (hl)                      ; size H
  200.         inc hl                          ; protocol
  201.         inc hl
  202.         ex de,hl                        ; DE-HL now point at sockaddr_in
  203.         ex af,af'
  204.         ld c, CMD_WIZNETWRITE
  205.         push ix
  206.         push iy
  207.         call BDOS
  208.         pop iy
  209.         pop ix
  210.         bit 7, h
  211.         jp z, writeok           ;noerror just return
  212.         ld l, a
  213. writeok:
  214. writenot:
  215.         pop bc
  216.         ret
  217. store_ix:
  218. defb 0,0,0,0,0,0,0,0
  219. ENDMOD
  220.  
  221. MODULE OS_BIND
  222. PUBLIC OS_BIND
  223. #include "sysdefs.asm"
  224. RSEG CODE
  225. ;  A - SOCKET
  226. ;  DE - указатель на структуру sockaddr_in содержащую номер исходящего порта.
  227. ;   (остальные поля структуры не используются, но обязаны присутствовать)
  228. ; Возвращаемые значения в регистрах:
  229. ;  L - При отрицательном значении - функция завершилась с ошибкой.
  230. ;  А - errno при ошибке
  231. OS_BIND:       
  232.         push bc
  233.         ld a, e
  234.         ld d, b
  235.         ld e, c
  236.         ld l,0x05
  237.     ld c,CMD_WIZNETOPEN
  238.         push ix
  239.         push iy
  240.         ex af,af'
  241.         call BDOS
  242.         pop iy
  243.         pop ix
  244.         ld h, l
  245.         ld l, a
  246.         pop bc
  247.         ret
  248. ENDMOD
  249.  
  250. MODULE OS_LISTEN
  251. PUBLIC OS_LISTEN
  252. #include "sysdefs.asm"
  253. RSEG CODE
  254. ; A - SOCKET
  255. ; Возвращаемые значения в регистрах:
  256. ; L - При отрицательном значении - функция завершилась с ошибкой.
  257. ; А - errno при ошибке.
  258. OS_LISTEN:     
  259.         push bc
  260.         push de
  261.         ld a, e
  262.         ld l,0x06
  263.    ld c,CMD_WIZNETOPEN
  264.         ex af,af'
  265.         push ix
  266.         push iy
  267.         call BDOS
  268.         pop iy
  269.         pop ix
  270.         pop de
  271.         pop bc
  272.         ld h, l
  273.         ld l, a
  274.         ret
  275. ENDMOD
  276.  
  277.  
  278. MODULE OS_ACCEPT
  279. PUBLIC OS_ACCEPT
  280. #include "sysdefs.asm"
  281. RSEG CODE
  282. ; A - SOCKET
  283. ; Возвращаемые значения в регистрах:
  284. ; L - SOCKET при положительном значении, при отрицательном значении  - функция завершилась с ошибкой.
  285. ; А - errno при ошибке.
  286. OS_ACCEPT:     
  287.         push bc
  288.         push de
  289.         ld a, e
  290.         ld l,0x04
  291.     ld c,CMD_WIZNETOPEN
  292.         ex af,af'
  293.         push ix
  294.         push iy
  295.         call BDOS
  296.         pop iy
  297.         pop ix
  298.         ld h, l
  299.         ld l, a
  300.         pop de
  301.         pop bc
  302.         ret
  303. ENDMOD
  304.  
  305.  
  306.  
  307. MODULE OS_NETSHUTDOWN
  308. PUBLIC OS_NETSHUTDOWN
  309. #include "sysdefs.asm"
  310. RSEG CODE
  311. ; A - SOCKET
  312. ; E - Варианты закрытия, 0 - закрыть немедленно, 1 - закрыть только если буфер отправки пуст.
  313. ; Возвращаемые значения в регистрах:
  314. ; L - SOCKET при положительном значении, при отрицательном значении  - функция завершилась с ошибкой.
  315. ; А - errno при ошибке.
  316. OS_NETSHUTDOWN:
  317.         push bc
  318.         push de
  319.         ld a, e
  320.         ld e, b
  321.         ld l,0x02
  322.    ld c,CMD_WIZNETOPEN
  323.         ex af,af'
  324.         push ix
  325.         push iy
  326.         call BDOS
  327.         pop iy
  328.         pop ix
  329.         ld h, l
  330.         ld l, a
  331.         pop de
  332.         pop bc
  333.         ret
  334. ENDMOD
  335.  
  336. MODULE OS_GETDNS
  337. PUBLIC OS_GETDNS
  338. #include "sysdefs.asm"
  339. RSEG CODE
  340. OS_GETDNS:
  341.         ld l,0x08
  342.         push ix
  343.         push iy
  344.         ld a,c
  345.         ex af,af'
  346.         ld c,CMD_WIZNETOPEN
  347.         call BDOS
  348.         ld a,l
  349.         pop iy
  350.         pop ix
  351.         ret
  352. ENDMOD
  353.  
  354. MODULE OS_SETDNS
  355. PUBLIC OS_SETDNS
  356. #include "sysdefs.asm"
  357. RSEG CODE
  358. OS_SETDNS:
  359.         ld l,0x07
  360.         push ix
  361.         push iy
  362.         ld a,c
  363.         ex af,af'
  364.         ld c,CMD_WIZNETOPEN
  365.         call BDOS
  366.         ld a,l
  367.         pop iy
  368.         pop ix
  369.         ret
  370. ENDMOD
  371.  
  372. MODULE LIB_DNS_RESOLVER
  373.         PUBLIC DNS_RESOLVER
  374.         EXTERN errno, OS_NETSOCKET, OS_NETSHUTDOWN, YIELD
  375.         EXTERN OS_NETCONNECT, OS_WIZNETREAD, OS_WIZNETWRITE
  376.         EXTERN OS_GETDNS
  377.                
  378.         RSEG    CODE
  379. DNS_RESOLVER:           ;DE-domain name
  380.         push ix
  381.         push de
  382.     ld de,dns_ia + 3
  383.     call OS_GETDNS
  384.         ld hl,dns_head
  385.         ld de,dnsbuf
  386.         ld bc,6
  387.         ldir
  388.         ex de,hl
  389.         ld de,dnsbuf+7
  390.         ld (hl),0
  391.         ld bc,256-7
  392.         ldir
  393.         ld de,dnsbuf+12
  394.         ld h,d
  395.         ld l,e
  396.         pop bc
  397. name_loop:
  398.         inc hl
  399.         ld a,(bc)
  400.         ld (hl),a
  401.         inc bc
  402.         cp '.'
  403.         jr z,is_dot
  404.         or a
  405.         jr nz,name_loop
  406. is_dot:
  407.         sbc hl,de
  408.         ex de,hl
  409.         dec e
  410.         ld (hl),e
  411.         inc e
  412.         add hl,de
  413.         ld d,h
  414.         ld e,l
  415.         or a
  416.         jr nz,name_loop
  417.         inc a
  418.         inc hl
  419.         inc hl
  420.         ld (hl),a
  421.         inc hl
  422.         inc hl
  423.         ld (hl),a
  424.         inc hl
  425.         push hl
  426.        
  427.         ld de,0x0203
  428.         call OS_NETSOCKET
  429.         ld (dnssoc),a
  430.         or a
  431.         jp m,exiterr
  432.         ;LD     C,A
  433.         ;LD     DE,dns_ia
  434.         ;CALL   OS_NETCONNECT
  435.         ;or a
  436.         ;jp m,exiterr
  437.        
  438.         pop hl
  439.         push hl
  440.         ld de,0xffff&(-dnsbuf)
  441.         add hl,de
  442.         PUSH    HL
  443.         LD      bc,(dnssoc)
  444.         LD      ix,dnsbuf
  445.         ld      de,dns_ia
  446.         CALL    OS_WIZNETWRITE
  447.         pop af
  448.         bit 7,h
  449.         jr nz,exitcode
  450.         ld b,50
  451.         push bc
  452.         jr recv_wait1
  453. recv_wait:
  454.         push bc
  455.         call YIELD
  456. recv_wait1:
  457.         ld hl,256
  458.         PUSH    HL
  459.         LD      bc,(dnssoc)
  460.         LD      DE,dnsbuf
  461.         LD      ix,dnsbuf
  462.         CALL    OS_WIZNETREAD
  463.         pop af
  464.         pop bc
  465.         ;ld a,h
  466.         ;or l
  467.         bit 7,h
  468.         jr z,recv_wait_end
  469.         djnz recv_wait
  470.         ld a,54 ;ERR_CONNRESET
  471.         ld (errno),a
  472.         jr exiterr
  473. recv_wait_end:
  474.         ld a,65         ;ERR_HOSTUNREACH
  475.         ld (errno),a
  476.         bit 7,h
  477.         jr nz,exitcode
  478.         ld a,(dnsbuf+3)
  479.         and 0x0f       
  480.         jr nz,exiterr
  481. exitcode:
  482.         LD      BC,(dnssoc)
  483.         LD      E,0
  484.         CALL    OS_NETSHUTDOWN
  485.         pop hl
  486.         pop ix
  487. reqpars_l
  488.         inc hl
  489.         inc hl
  490.         inc hl
  491.         ld a,(hl)
  492.         ld de,7
  493.         add hl,de
  494.         ld b,(hl)
  495.         inc hl
  496.         ld c,(hl)
  497.         inc hl
  498.         dec a
  499.         ret z
  500.         cp 4
  501.         jr nz,exiterr1
  502.         add hl,bc
  503.         jr reqpars_l
  504.        
  505. exiterr:
  506.         pop af
  507.         ld a,(errno)
  508.         push af
  509.         LD      BC,(dnssoc)
  510.         LD      E,0
  511.         CALL    OS_NETSHUTDOWN
  512.         pop af
  513.         ld (errno),a
  514.         pop ix
  515. exiterr1:
  516.         ld hl,0
  517.         ret
  518.        
  519.         RSEG    CONST
  520. dns_head
  521.         defb 0x11,0x22,0x01,0x00,0x00,0x01
  522. dns_ia:
  523.         defb 0,0,53,8,8,8,8
  524.         RSEG    NO_INIT
  525. dnssoc:
  526.         DEFS 1 
  527. dnsbuf:
  528.         DEFS 256
  529.        
  530. ENDMOD
  531.  
  532.  
  533. END
  534.