module sockets ; command codes IC_CMD_SOCKET equ 0x01 IC_CMD_BIND equ 0x02 IC_CMD_CONNECT equ 0x03 IC_CMD_LISTEN equ 0x04 IC_CMD_ACCEPT equ 0x05 IC_CMD_CLOSE equ 0x06 IC_CMD_GETHOSTBYNAME equ 0x20 IC_CMD_GETHOSTBYADDR equ 0x21 IC_CMD_SEND equ 0x10 IC_CMD_RECV equ 0x11 IC_CMD_SENDTO equ 0x18 IC_CMD_RECVFROM equ 0x19 IC_CMD_RES_OK equ 0x00 IC_CMD_RES_FAIL equ 0xff ; buffers cmd_buffer ds 10 ;------------------------------------------------------------------------ ;socket() ;> byte #01 ; byte address_family ; byte type ; byte protocol ;< byte res (0=ok) ; byte #02 ; byte fd ; long my_addr ; word port ;< byte res (0=ok) ;IN: ;a=fd ;hl=address of ip and port (db a,b,c,d:dw port) ;OUT: ;a=res (0=ok) bind ex de,hl ld hl,cmd_buffer ld (hl),IC_CMD_BIND:inc hl ld (hl),a:inc hl ex de,hl ld bc,6:ldir ;copy ip+port ld hl,cmd_buffer,c,8 call uart.Write call uart.GetChar ret ;connect() ;> byte #03 ; byte fd ; long serv_addr ; word port ;< byte res (0=ok) ;IN: ;a=fd ;hl=address of ip and port (db a,b,c,d:dw port) ;OUT: ;a=res (0=ok) connect ex de,hl ld hl,cmd_buffer ld (hl),IC_CMD_CONNECT:inc hl ld (hl),a:inc hl ex de,hl ld bc,6:ldir ;copy ip+port ld hl,cmd_buffer,c,8 call uart.Write call uart.GetChar ret ;close() ;> byte #06 ; byte fd ;< byte res (0=ok) ;IN: ;a=fd ;OUT: ;a=res (0=ok) close push af ld a,IC_CMD_CLOSE:call uart.PutChar pop af:call uart.PutChar call uart.GetChar ret ;send() ;> byte #10 ; byte fd ; word buflen ; byte flags ;< byte res (0=ok) ;>? byte buf[buflen] ; byte #11 ; byte fd ; word len ; byte flags ;< byte res (0=ok) ;>? word reallen ;>?? byte buf[reallen] ;IN: ;a=fd ;hl=buf ;bc=len ;OUT: ;a=res (0=ok) ;bc=reallen recv ld (recv1+1),hl ;save buf addr ld hl,cmd_buffer ld (hl),IC_CMD_RECV:inc hl ld (hl),a:inc hl ld (hl),c:inc hl ld (hl),b:inc hl ld (hl),0 ;flags, skipped now ld hl,cmd_buffer,bc,5 call uart.Write call uart.GetChar or a:ret nz ;ret if error call uart.GetChar push af call uart.GetChar ld b,a pop af ld c,a ;bc=real len ld a,b or c jr z,recv_skip push bc recv_skip_header ld a,0 or a jr nz,recv1 push bc pop hl ; skip http header 2 call uart.GetChar dec hl cp #0d jr nz,2b call uart.GetChar dec hl cp #0a jr nz,2b call uart.GetChar dec hl cp #0d jr nz,2b call uart.GetChar dec hl cp #0a jr nz,2b ld b,h ld c,l ld (recv_skip_header+1),a pop hl push bc recv1 ld hl,0 call uart.Read ;get data pop bc recv_skip xor a ret ;gethostbyname ;> byte #20 ;> word name_len ;> ascii hostname ;< byte res (0=ok) ;