?login_element?

Subversion Repositories NedoOS

Rev

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

  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. ; Возвращаемые значения в регистрах:
  313. ; L - SOCKET при положительном значении, при отрицательном значении  - функция завершилась с ошибкой.
  314. ; А - errno при ошибке.
  315. OS_NETSHUTDOWN:
  316.         push bc
  317.         push de
  318.         ld a, e
  319.         ld l,0x02
  320.    ld c,CMD_WIZNETOPEN
  321.         ex af,af'
  322.         push ix
  323.         push iy
  324.         call BDOS
  325.         pop iy
  326.         pop ix
  327.         ld h, l
  328.         ld l, a
  329.         pop de
  330.         pop bc
  331.         ret
  332. ENDMOD
  333.  
  334. MODULE OS_GETDNS
  335. PUBLIC OS_GETDNS
  336. #include "sysdefs.asm"
  337. RSEG CODE
  338. OS_GETDNS:
  339.         ld l,0x08
  340.         push ix
  341.         push iy
  342.         ld a,c
  343.         ex af,af'
  344.         ld c,CMD_WIZNETOPEN
  345.         call BDOS
  346.         ld a,l
  347.         pop iy
  348.         pop ix
  349.         ret
  350. ENDMOD
  351.  
  352. MODULE OS_SETDNS
  353. PUBLIC OS_SETDNS
  354. #include "sysdefs.asm"
  355. RSEG CODE
  356. OS_SETDNS:
  357.         ld l,0x07
  358.         push ix
  359.         push iy
  360.         ld a,c
  361.         ex af,af'
  362.         ld c,CMD_WIZNETOPEN
  363.         call BDOS
  364.         ld a,l
  365.         pop iy
  366.         pop ix
  367.         ret
  368. ENDMOD
  369.  
  370. MODULE LIB_DNS_RESOLVER
  371.         PUBLIC DNS_RESOLVER
  372.         EXTERN errno, OS_NETSOCKET, OS_NETSHUTDOWN, YIELD
  373.         EXTERN OS_NETCONNECT, OS_WIZNETREAD, OS_WIZNETWRITE
  374.         EXTERN OS_GETDNS
  375.                
  376.         RSEG    CODE
  377. DNS_RESOLVER:           ;DE-domain name
  378.         push ix
  379.         push de
  380.     ld de,dns_ia + 3
  381.     call OS_GETDNS
  382.         ld hl,dns_head
  383.         ld de,dnsbuf
  384.         ld bc,6
  385.         ldir
  386.         ex de,hl
  387.         ld de,dnsbuf+7
  388.         ld (hl),0
  389.         ld bc,256-7
  390.         ldir
  391.         ld de,dnsbuf+12
  392.         ld h,d
  393.         ld l,e
  394.         pop bc
  395. name_loop:
  396.         inc hl
  397.         ld a,(bc)
  398.         ld (hl),a
  399.         inc bc
  400.         cp '.'
  401.         jr z,is_dot
  402.         or a
  403.         jr nz,name_loop
  404. is_dot:
  405.         sbc hl,de
  406.         ex de,hl
  407.         dec e
  408.         ld (hl),e
  409.         inc e
  410.         add hl,de
  411.         ld d,h
  412.         ld e,l
  413.         or a
  414.         jr nz,name_loop
  415.         inc a
  416.         inc hl
  417.         inc hl
  418.         ld (hl),a
  419.         inc hl
  420.         inc hl
  421.         ld (hl),a
  422.         inc hl
  423.         push hl
  424.        
  425.         ld de,0x0203
  426.         call OS_NETSOCKET
  427.         ld (dnssoc),a
  428.         or a
  429.         jp m,exiterr
  430.         ;LD     C,A
  431.         ;LD     DE,dns_ia
  432.         ;CALL   OS_NETCONNECT
  433.         ;or a
  434.         ;jp m,exiterr
  435.        
  436.         pop hl
  437.         push hl
  438.         ld de,0xffff&(-dnsbuf)
  439.         add hl,de
  440.         PUSH    HL
  441.         LD      bc,(dnssoc)
  442.         LD      ix,dnsbuf
  443.         ld      de,dns_ia
  444.         CALL    OS_WIZNETWRITE
  445.         pop af
  446.         bit 7,h
  447.         jr nz,exitcode
  448.         ld b,50
  449.         push bc
  450.         jr recv_wait1
  451. recv_wait:
  452.         push bc
  453.         call YIELD
  454. recv_wait1:
  455.         ld hl,256
  456.         PUSH    HL
  457.         LD      bc,(dnssoc)
  458.         LD      DE,dnsbuf
  459.         LD      ix,dnsbuf
  460.         CALL    OS_WIZNETREAD
  461.         pop af
  462.         pop bc
  463.         ;ld a,h
  464.         ;or l
  465.         bit 7,h
  466.         jr z,recv_wait_end
  467.         djnz recv_wait
  468.         ld a,54 ;ERR_CONNRESET
  469.         ld (errno),a
  470.         jr exiterr
  471. recv_wait_end:
  472.         ld a,65         ;ERR_HOSTUNREACH
  473.         ld (errno),a
  474.         bit 7,h
  475.         jr nz,exitcode
  476.         ld a,(dnsbuf+3)
  477.         and 0x0f       
  478.         jr nz,exiterr
  479. exitcode:
  480.         LD      BC,(dnssoc)
  481.         LD      E,0
  482.         CALL    OS_NETSHUTDOWN
  483.         pop hl
  484.         pop ix
  485. reqpars_l
  486.         inc hl
  487.         inc hl
  488.         inc hl
  489.         ld a,(hl)
  490.         ld de,7
  491.         add hl,de
  492.         ld b,(hl)
  493.         inc hl
  494.         ld c,(hl)
  495.         inc hl
  496.         dec a
  497.         ret z
  498.         cp 4
  499.         jr nz,exiterr1
  500.         add hl,bc
  501.         jr reqpars_l
  502.        
  503. exiterr:
  504.         pop af
  505.         ld a,(errno)
  506.         push af
  507.         LD      BC,(dnssoc)
  508.         LD      E,0
  509.         CALL    OS_NETSHUTDOWN
  510.         pop af
  511.         ld (errno),a
  512.         pop ix
  513. exiterr1:
  514.         ld hl,0
  515.         ret
  516.        
  517.         RSEG    CONST
  518. dns_head
  519.         defb 0x11,0x22,0x01,0x00,0x00,0x01
  520. dns_ia:
  521.         defb 0,0,53,8,8,8,8
  522.         RSEG    NO_INIT
  523. dnssoc:
  524.         DEFS 1 
  525. dnsbuf:
  526.         DEFS 256
  527.        
  528. ENDMOD
  529.  
  530.  
  531. END
  532.