?login_element?

Subversion Repositories NedoOS

Rev

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