?login_element?

Subversion Repositories NedoOS

Rev

Rev 1963 | 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.         ret
  25. ENDMOD
  26.  
  27. MODULE OS_NETCONNECT
  28. PUBLIC OS_NETCONNECT
  29. #include "sysdefs.asm"
  30. RSEG CODE
  31.  
  32. OS_NETCONNECT: 
  33. ;A  - Socket
  34. ;DE - Pointer to adrstruct
  35. ;------
  36. ;L - <0 err
  37. ;H - ErrNo
  38. ;CMD_WIZNETOPEN=0xdb ;A=SOCKET, L=subfunction (see sys_h.asm)
  39.         push bc
  40.         ld a, e
  41.         ld d, b
  42.         ld e, c
  43.         ex af,af'
  44.         ld c, CMD_WIZNETOPEN
  45.         ld l,0x03
  46.         push ix
  47.         push iy
  48.         call BDOS
  49.         pop iy
  50.         pop ix
  51.         ld h, l
  52.         LD l, a
  53.         pop bc
  54.         ret
  55. ENDMOD
  56.  
  57. MODULE OS_WIZNETREAD
  58. PUBLIC OS_WIZNETREAD
  59. #include "sysdefs.asm"
  60. RSEG CODE
  61. ;if TCP: A=SOCKET, de=buffer_ptr,               HL=sizeof(buffer)
  62. ;else:   A=SOCKET, de=sockaddr_in ptr,  HL=sizeof(buffer), IX=buffer_ptr,
  63. ;out: HL=count if HL < 0 then A=error
  64. OS_WIZNETREAD: 
  65.         push bc
  66.         ex de,hl
  67.         ld a, (hl)      ;socket
  68.         inc hl
  69.         ld e, (hl)      ;buffer L
  70.         inc hl
  71.         ld d, (hl)      ;buffer H
  72.         inc hl
  73.         ld c, (hl)      ;size L
  74.         inc hl
  75.         ld b, (hl)      ;size H
  76.         ld l, c
  77.         ld h, b
  78.         ld c, CMD_WIZNETREAD
  79.         push ix
  80.         push iy
  81.         ex af,af'
  82.         call BDOS
  83.         pop iy
  84.         pop ix
  85.         bit 7, h
  86.         jp z, readok    ;noerror just return
  87.         ld l, a
  88.         jp readnot
  89. readok:
  90. readnot:
  91.         pop bc
  92.         ret
  93. ENDMOD
  94.  
  95. MODULE OS_WIZNETWRITE
  96. PUBLIC OS_WIZNETWRITE
  97. #include "sysdefs.asm"
  98. RSEG CODE
  99. ;if TCP: A=SOCKET, de=buffer_ptr,               HL=sizeof(buffer)
  100. ;else:   A=SOCKET, de=sockaddr_in ptr,  HL=sizeof(buffer), IX=buffer_ptr,
  101. ;out: HL=count if HL < 0 then A=error
  102. OS_WIZNETWRITE 
  103.         push bc
  104.         ex de,hl
  105.         ld a, (hl)                      ;socket
  106.         inc hl
  107.         ld e, (hl)                      ;buffer L
  108.         inc hl
  109.         ld d, (hl)                      ;buffer H
  110.         inc hl
  111.         ld c, (hl)                      ;size L
  112.         inc hl
  113.         ld b, (hl)                      ;size H
  114.         ld l, c
  115.         ld h, b
  116.         push ix
  117.         push iy
  118.         ld c, CMD_WIZNETWRITE
  119.         ex af,af'
  120.         call BDOS
  121.         pop iy
  122.         pop ix
  123.         bit 7, h
  124.         jp z, writeok           ;noerror just return
  125.         ld l, a
  126.         jp writenot
  127. writeok:
  128. writenot:
  129.         pop bc
  130.         ret
  131. ENDMOD
  132.  
  133. /*
  134.   A - SOCKET
  135.   DE - указатель на структуру sockaddr_in, в неё помещается(ядром) IP-адрес и порт хоста отправившего данные.
  136.   IX - указатель на буфер для принятия данных
  137.   HL - размер буфера(в байтах)
  138.  Возвращаемые значения в регистрах:
  139.   HL - при отрицательном значении функция завершилась с ошибкой,
  140.    про значении больше нуля возвращается действительный размер(в байтах) принятых данных,
  141.    нулевого значения вызов не возвращает.
  142.   А - errno при ошибке.
  143.  Возможные ошибки:
  144.   ERR_NOTSOCK - не действительный дескриптор сокета
  145.   ERR_EAGAIN - входящих данных пока нет
  146.   ERR_NOTCONN - сокет с неустановленным\пропавшем соединением(при протоколе TCP/IP)
  147.  
  148. Если количество параметров неопределённо (printf(...) и т.п.), то все параметры передаются через стек.
  149. Иначе первый параметр передаётся в E, DE, CDE или BCDE, в зависимости от разрядности значения.
  150. Если первый и второй параметры не шире 16 бит каждый, то второй параметр передаётся в регистрах B или BC, иначе через стек.
  151. Возвращаемое значение из функции передаётся в регистрах A (L при банкинге), HL, CHL или BCHL, в зависимости от разрядности значения.
  152. Сохранять надо ix и iy обязательно.
  153. DE и  BC сохранять если они не юзаются в качестве параметров
  154.  
  155. struct readstructure
  156.                         {
  157.                         unsigned char   socket;
  158.                         unsigned int    BufAdr;
  159.                         unsigned int    bufsize;
  160.                         unsigned char   protocol;
  161.                         };
  162.  
  163. */
  164.  
  165.  
  166. MODULE OS_WIZNETWRITE_UDP
  167. PUBLIC OS_WIZNETWRITE_UDP
  168. #include "sysdefs.asm"
  169. RSEG CODE
  170. OS_WIZNETWRITE_UDP     
  171. ; DE - readstructure BC - sockaddr_in
  172.         ex de,hl                        ;HL - sockaddr_in, DE - garbage
  173.         ld a, (hl)                      ;A  - socket
  174.         inc hl
  175.         ld e,(hl)
  176.         inc hl
  177.         ld d,(hl)
  178.         inc hl
  179.         push de
  180.         ld (store_ix),ix
  181.         pop ix                          ;IX - BufAdr
  182.         ld e, (hl)                      ;E - Bufsize L
  183.         inc hl
  184.         ld d, (hl)                      ;D  - Bufsize H
  185.         ex de,hl                        ;HL - Bufsize
  186.         ld d,b                          ;DE - sockaddr_in
  187.         ld e,c                         
  188.         ex af,af'
  189. /*
  190.  A  - SOCKET
  191.  DE - указатель на структуру sockaddr_in, в неё необходимо поместить IP-адрес и порт хоста получателя
  192.  IX - указатель на буфер с данными
  193.  HL - размер данных(в байтах), в текущей реализации максимум 8192 байта
  194. Возвращаемые значения в регистрах:
  195.  HL - при отрицательном значении функция завершилась с ошибкой,
  196.  иначе возвращается действительный размер(в байтах) отправленных данных,
  197.  А  - errno при ошибке.
  198. */
  199.         ld c, CMD_WIZNETWRITE
  200.         push ix
  201.         push iy
  202.         call BDOS
  203.         pop iy
  204.         pop ix
  205.         bit 7, h
  206.         jp z, writeok           ;noerror just return
  207.         ld l, a
  208. writeok:
  209. writenot:
  210.         ld ix,(store_ix)
  211.         ret
  212. store_ix:
  213.         defb 0,0,0
  214.  
  215. ENDMOD
  216.  
  217. MODULE OS_WIZNETREAD_UDP
  218. PUBLIC OS_WIZNETREAD_UDP
  219. #include "sysdefs.asm"
  220. RSEG CODE
  221. OS_WIZNETREAD_UDP:     
  222. ; DE - readstructure BC - sockaddr_in
  223.         ex de,hl                        ;HL - readstructure, DE - garbage
  224.         ld a, (hl)                      ;A  - socket
  225.         inc hl
  226.         ld e,(hl)
  227.         inc hl
  228.         ld d,(hl)
  229.         inc hl
  230.         push de
  231.         ld (store_ix),ix
  232.         pop ix
  233.         ld e, (hl)                      ;E - Bufsize L
  234.         inc hl
  235.         ld d, (hl)                      ;D  - Bufsize H
  236.         ex de,hl                        ;HL - Bufsize
  237.         ld d,b                          ;DE - sockaddr_in
  238.         ld e,c                          ;
  239.         ex af,af'
  240. /*
  241.   A - SOCKET
  242.   DE - указатель на структуру sockaddr_in, в неё помещается(ядром) IP-адрес и порт хоста отправившего данные.
  243.   IX - указатель на буфер для принятия данных
  244.   HL - размер буфера(в байтах)
  245.  Возвращаемые значения в регистрах:
  246.   HL - при отрицательном значении функция завершилась с ошибкой,
  247.    про значении больше нуля возвращается действительный размер(в байтах) принятых данных,
  248.    нулевого значения вызов не возвращает.
  249.   А - errno при ошибке.
  250. */
  251.         ld c, CMD_WIZNETREAD
  252.         push ix
  253.         push iy
  254.         call BDOS
  255.         pop iy
  256.         pop ix
  257.         bit 7, h
  258.         jp z, readok    ;noerror just return
  259.         ld l, a
  260. readok:
  261. readnot:
  262.         ld ix,(store_ix)
  263.         ret
  264. store_ix:
  265.         defb 0,0,0
  266. ENDMOD
  267.  
  268. MODULE OS_BIND
  269. PUBLIC OS_BIND
  270. #include "sysdefs.asm"
  271. RSEG CODE
  272. ;  A - SOCKET
  273. ;  DE - указатель на структуру sockaddr_in содержащую номер исходящего порта.
  274. ;   (остальные поля структуры не используются, но обязаны присутствовать)
  275. ; Возвращаемые значения в регистрах:
  276. ;  L - При отрицательном значении - функция завершилась с ошибкой.
  277. ;  А - errno при ошибке
  278. OS_BIND:       
  279.         push bc
  280.         ld a, e
  281.         ld d, b
  282.         ld e, c
  283.         ld l,0x05
  284.     ld c,CMD_WIZNETOPEN
  285.         push ix
  286.         push iy
  287.         ex af,af'
  288.         call BDOS
  289.         pop iy
  290.         pop ix
  291.         ld h, l
  292.         ld l, a
  293.         pop bc
  294.         ret
  295. ENDMOD
  296.  
  297. MODULE OS_LISTEN
  298. PUBLIC OS_LISTEN
  299. #include "sysdefs.asm"
  300. RSEG CODE
  301. ; A - SOCKET
  302. ; Возвращаемые значения в регистрах:
  303. ; L - При отрицательном значении - функция завершилась с ошибкой.
  304. ; А - errno при ошибке.
  305. OS_LISTEN:     
  306.         push bc
  307.         push de
  308.         ld a, e
  309.         ld l,0x06
  310.    ld c,CMD_WIZNETOPEN
  311.         ex af,af'
  312.         push ix
  313.         push iy
  314.         call BDOS
  315.         pop iy
  316.         pop ix
  317.         pop de
  318.         pop bc
  319.         ld h, l
  320.         ld l, a
  321.         ret
  322. ENDMOD
  323.  
  324.  
  325. MODULE OS_ACCEPT
  326. PUBLIC OS_ACCEPT
  327. #include "sysdefs.asm"
  328. RSEG CODE
  329. ; A - SOCKET
  330. ; Возвращаемые значения в регистрах:
  331. ; L - SOCKET при положительном значении, при отрицательном значении  - функция завершилась с ошибкой.
  332. ; А - errno при ошибке.
  333. OS_ACCEPT:     
  334.         push bc
  335.         push de
  336.         ld a, e
  337.         ld l,0x04
  338.     ld c,CMD_WIZNETOPEN
  339.         ex af,af'
  340.         push ix
  341.         push iy
  342.         call BDOS
  343.         pop iy
  344.         pop ix
  345.         ld h, l
  346.         ld l, a
  347.         pop de
  348.         pop bc
  349.         ret
  350. ENDMOD
  351.  
  352.  
  353.  
  354. MODULE OS_NETSHUTDOWN
  355. PUBLIC OS_NETSHUTDOWN
  356. #include "sysdefs.asm"
  357. RSEG CODE
  358. ; A - SOCKET
  359. ; E - Варианты закрытия, 0 - закрыть немедленно, 1 - закрыть только если буфер отправки пуст.
  360. ; Возвращаемые значения в регистрах:
  361. ; L - SOCKET при положительном значении, при отрицательном значении  - функция завершилась с ошибкой.
  362. ; А - errno при ошибке.
  363. OS_NETSHUTDOWN:
  364.         push bc
  365.         push de
  366.         ld a, e
  367.         ld e, b
  368.         ld l,0x02
  369.    ld c,CMD_WIZNETOPEN
  370.         ex af,af'
  371.         push ix
  372.         push iy
  373.         call BDOS
  374.         pop iy
  375.         pop ix
  376.         ld h, l
  377.         ld l, a
  378.         pop de
  379.         pop bc
  380.         ret
  381. ENDMOD
  382.  
  383. MODULE OS_GETDNS
  384. PUBLIC OS_GETDNS
  385.  
  386. #include "sysdefs.asm"
  387. RSEG CODE
  388. OS_GETDNS:
  389.         ld l,0x08
  390.         push ix
  391.         push iy
  392.         ld a,c
  393.         ex af,af'
  394.         ld c,CMD_WIZNETOPEN
  395.         call BDOS
  396.         ld a,l
  397.         pop iy
  398.         pop ix
  399.         ret
  400. ENDMOD
  401.  
  402. MODULE OS_SETDNS
  403. PUBLIC OS_SETDNS
  404. #include "sysdefs.asm"
  405. RSEG CODE
  406. OS_SETDNS:
  407.         ld l,0x07
  408.         push ix
  409.         push iy
  410.         ld a,c
  411.         ex af,af'
  412.         ld c,CMD_WIZNETOPEN
  413.         call BDOS
  414.         ld a,l
  415.         pop iy
  416.         pop ix
  417.         ret
  418. ENDMOD
  419. END
  420.