/tests/nasm/socket.asm
Assembly | 1513 lines | 613 code | 900 blank | 0 comment | 0 complexity | ceddce4c2cacb1e82c505ffd0263414b MD5 | raw file
Possible License(s): LGPL-2.0, BSD-3-Clause, GPL-2.0
- INADDR_ANY equ 0
- INADDR_LOOPBACK equ 7F000001h
- INADDR_BROADCAST equ 0FFFFFFFFh
- INADDR_NONE equ 0FFFFFFFFh
- SOCK_STREAM equ 1
- SOCK_DGRAM equ 2
- SOCKEVENT_READ equ 01h
- SOCKEVENT_WRITE equ 02h
- SOCKEVENT_OOB equ 04h
- SOCKEVENT_ACCEPT equ 08h
- SOCKEVENT_CONNECT equ 10h
- SOCKEVENT_CLOSE equ 20h
- [absolute 0]
- SOCKADDR:
- .Port resw 1
- .Address resd 1
- SOCKADDR_size:
- [section .text]
- [absolute 0]
- HOSTENT:
- .Name resd 1
- .Aliases resd 1
- .AddrList resd 1
- HOSTENT_size:
- [section .text]
- [extern DPMI_Int]
- [extern _AllocTransferBuf]
- [extern _FreeTransferBuf]
- [extern DPMI_Regs]
- [extern DPMI_EDI]
- [extern DPMI_ESI]
- [extern DPMI_EBP]
- [extern DPMI_EBX]
- [extern DPMI_EDX]
- [extern DPMI_ECX]
- [extern DPMI_EAX]
- [extern DPMI_FLAGS]
- [extern DPMI_ES]
- [extern DPMI_DS]
- [extern DPMI_FS]
- [extern DPMI_GS]
- [extern DPMI_SP]
- [extern DPMI_SS]
- [extern _Transfer_Buf]
- [extern _Transfer_Buf_Seg]
- [extern _Transfer_Buf_Size]
- DPMI_EDI_off equ 00h
- DPMI_ESI_off equ 04h
- DPMI_EBP_off equ 08h
- DPMI_EBX_off equ 10h
- DPMI_EDX_off equ 14h
- DPMI_ECX_off equ 18h
- DPMI_EAX_off equ 1Ch
- DPMI_FLAGS_off equ 20h
- DPMI_ES_off equ 22h
- DPMI_DS_off equ 24h
- DPMI_FS_off equ 26h
- DPMI_GS_off equ 28h
- DPMI_IP_off equ 2Ah
- DPMI_CS_off equ 2Ch
- DPMI_SP_off equ 2Eh
- DPMI_SS_off equ 30h
- [extern _AllocMem]
- [extern _AllocSelector]
- [extern _FreeSelector]
- [extern _GetPhysicalMapping]
- [extern _FreePhysicalMapping]
- [extern _LockArea]
- _AllocMem_arglen equ 4
- _AllocSelector_arglen equ 4
- _FreeSelector_arglen equ 2
- _GetPhysicalMapping_arglen equ 16
- _FreePhysicalMapping_arglen equ 8
- _LockArea_arglen equ 10
- [extern _Install_Int]
- [extern _Remove_Int]
- [extern _Exit_IRQ]
- [extern _Init_IRQ]
- [extern _Restore_IRQ]
- [extern _Enable_IRQ]
- [extern _Disable_IRQ]
- _Install_Int_arglen equ 8
- _Remove_Int_arglen equ 4
- _Restore_IRQ_arglen equ 4
- _Enable_IRQ_arglen equ 4
- _Disable_IRQ_arglen equ 4
- [bits 32]
- SOCKET_INIT equ 5001h
- SOCKET_EXIT equ 5002h
- SOCKET_ACCEPT equ 5003h
- SOCKET_BIND equ 5004h
- SOCKET_CLOSE equ 5005h
- SOCKET_CONNECT equ 5006h
- SOCKET_GETPEERNAME equ 5007h
- SOCKET_GETSOCKNAME equ 5008h
- SOCKET_INETADDR equ 5009h
- SOCKET_INETNTOA equ 500Ah
- SOCKET_LISTEN equ 500Bh
- SOCKET_RECV equ 500Ch
- SOCKET_RECVFROM equ 500Dh
- SOCKET_SEND equ 500Eh
- SOCKET_SENDTO equ 500Fh
- SOCKET_SHUTDOWN equ 5010h
- SOCKET_CREATE equ 5011h
- SOCKET_GETHOSTBYADDR equ 5012h
- SOCKET_GETHOSTBYNAME equ 5013h
- SOCKET_GETHOSTNAME equ 5014h
- SOCKET_INSTALLCALLBACK equ 5015h
- SOCKET_REMOVECALLBACK equ 5016h
- SOCKET_ADDCALLBACK equ 5017h
- SOCKET_GETCALLBACKINFO equ 5018h
- STRING_MAX equ 256
- HOSTENT_ALIASES_MAX equ 16
- HOSTENT_ADDRLIST_MAX equ 16
- [section .bss]
- Callback_Address resd 1
- Callback_Int resb 1
- Multiplex_Handle resw 1
- VDD_Handle resw 1
- LastError resd 1
- NetAddr_static resb STRING_MAX
- HostEnt_Name_static resb STRING_MAX
- HostEnt_Aliases_static resd HOSTENT_ALIASES_MAX
- HostEnt_AddrList_static resd HOSTENT_ADDRLIST_MAX
- HostEnt_Aliases_data resb STRING_MAX*HOSTENT_ALIASES_MAX
- HostEnt_AddrList_data resd HOSTENT_ADDRLIST_MAX
- [section .data]
- rcsid db '$Id: socket.asm,v 1.1 2001/11/21 08:41:53 peter Exp $',0
- ALTMPX_Signature db 'ECE291 ', 'EX291 ', 0
- ALTMPX_MinVersion equ 0100h
- SOCKET_Version equ 0100h
- HostEnt_static :
- ..@44.strucstart:
- times HOSTENT.Name-($-..@44.strucstart) db 0
- dd HostEnt_Name_static
- times HOSTENT.Aliases-($-..@44.strucstart) db 0
- dd HostEnt_Aliases_static
- times HOSTENT.AddrList-($-..@44.strucstart) db 0
- dd HostEnt_AddrList_static
- times HOSTENT_size-($-..@44.strucstart) db 0
- VDD_InitData
- dw SOCKET_Version
- dd STRING_MAX
- dd HOSTENT_ALIASES_MAX
- dd HOSTENT_ADDRLIST_MAX
- dd LastError
- dd NetAddr_static
- dd HostEnt_Name_static
- dd HostEnt_Aliases_static
- dd HostEnt_AddrList_static
- dd HostEnt_Aliases_data
- dd HostEnt_AddrList_data
- [section .text]
- [global _InitSocket]
- _InitSocket
- push esi
- push edi
- push es
- cld
- xor eax, eax
- mov cx, 1
- int 31h
- jc near .error
- mov bx, ax
- mov ax, 0008h
- xor ecx, ecx
- mov dx, 0FFFFh
- int 31h
- jc near .errorfree
- xor eax, eax
- .loop:
- mov esi, eax
- mov [DPMI_EAX], eax
- push bx
- mov bx, 2Dh
- call DPMI_Int
- pop bx
- cmp byte [DPMI_EAX], 0FFh
- jne .next
- cmp word [DPMI_ECX], ALTMPX_MinVersion
- jb .next
- mov ax, 0007h
- movzx edx, word [DPMI_EDX]
- shl edx, 4
- mov ecx, edx
- shr ecx, 16
- int 31h
- jc .errorfree
- mov es, ebx
- movzx edi, word [DPMI_EDI]
- mov ecx, 16/2
- mov esi, ALTMPX_Signature
- rep cmpsw
- jz .foundmpx
- .next:
- inc ah
- jnz .loop
- jmp short .errorfree
- .foundmpx:
- mov ax, 0001h
- int 31h
- mov eax, [DPMI_EAX]
- mov [Multiplex_Handle], ax
- mov al, 10h
- mov [DPMI_EAX], ax
- push bx
- mov bx, 2Dh
- call DPMI_Int
- pop bx
- cmp byte [DPMI_EAX], 1
- jne .error
- mov dx, [DPMI_EDX]
- mov [VDD_Handle], dx
- mov ecx, VDD_InitData
- clc
- movzx eax, word [VDD_Handle]
- or eax, SOCKET_INIT<<16
- db 0C4h, 0C4h, 058h, 002h
- jc .error
- xor eax, eax
- jmp short .exit
- .errorfree:
- mov ax, 0001h
- int 31h
- .error:
- xor eax, eax
- inc eax
- .exit:
- pop es
- pop edi
- pop esi
- ret
- [global _ExitSocket]
- _ExitSocket
- clc
- movzx eax, word [VDD_Handle]
- or eax, SOCKET_EXIT<<16
- db 0C4h, 0C4h, 058h, 002h
- ret
- [global _Socket_SetCallback]
- _Socket_SetCallback: push ebp
- mov ebp, esp
- .HandlerAddress equ 8
- mov ax, [Multiplex_Handle]
- mov al, 11h
- mov [DPMI_EAX], ax
- mov bx, 2Dh
- call DPMI_Int
- cmp byte [DPMI_EAX], 1
- jne near .error
- movzx edx, byte [DPMI_EDX]
- mov [Callback_Int], dl
- mov ecx, [Callback_Address]
- mov eax, [ebp+.HandlerAddress]
- mov [Callback_Address], eax
- test eax, eax
- jz near .deinstall
- test ecx, ecx
- jnz near .ok
- push dword 4
- push dword Callback_Address
- o16 push ds
- call _LockArea
- add esp, byte _LockArea_arglen
- push dword 1
- push dword Callback_Int
- o16 push ds
- call _LockArea
- add esp, byte _LockArea_arglen
- push dword Socket_InterruptHandler_end-Socket_InterruptHandler
- push dword Socket_InterruptHandler
- o16 push cs
- call _LockArea
- add esp, byte _LockArea_arglen
- movzx edx, byte [DPMI_EDX]
- push dword Socket_InterruptHandler
- push edx
- call _Install_Int
- add esp, byte _Install_Int_arglen
- test eax, eax
- jnz .error
- movzx edx, byte [Callback_Int]
- clc
- movzx eax, word [VDD_Handle]
- or eax, SOCKET_INSTALLCALLBACK<<16
- db 0C4h, 0C4h, 058h, 002h
- test eax, eax
- jz .end
- mov dword [Callback_Address], 0
- push edx
- call _Remove_Int
- add esp, byte _Remove_Int_arglen
- jmp short .error
- .deinstall:
- clc
- movzx eax, word [VDD_Handle]
- or eax, SOCKET_REMOVECALLBACK<<16
- db 0C4h, 0C4h, 058h, 002h
- push edx
- call _Remove_Int
- add esp, byte _Remove_Int_arglen
- xor eax, eax
- jmp short .end
- .ok:
- xor eax, eax
- mov esp, ebp
- pop ebp
- ret
- .error:
- xor eax, eax
- inc eax
- .end:
- mov esp, ebp
- pop ebp
- ret
- [global _Socket_AddCallback]
- _Socket_AddCallback: push ebp
- mov ebp, esp
- .Socket equ 8
- .EventMask equ 12
- clc
- movzx eax, word [VDD_Handle]
- or eax, SOCKET_ADDCALLBACK<<16
- db 0C4h, 0C4h, 058h, 002h
- mov esp, ebp
- pop ebp
- ret
- Socket_InterruptHandler
- mov eax, [Callback_Address]
- test eax, eax
- jz .chain
- clc
- movzx eax, word [VDD_Handle]
- or eax, SOCKET_GETCALLBACKINFO<<16
- db 0C4h, 0C4h, 058h, 002h
- test eax, eax
- jnz .chain
- push edx
- push ecx
- call dword [Callback_Address]
- add esp, byte 8
- .done:
- mov al, 20h
- cmp byte [Callback_Int], 50h
- jb .lowirq
- out 0A0h, al
- .lowirq:
- out 20h, al
- xor eax, eax
- ret
- .chain:
- mov eax, 1
- ret
- Socket_InterruptHandler_end
- [global _Socket_accept]
- _Socket_accept: push ebp
- mov ebp, esp
- .Socket equ 8
- .Name equ 12
- clc
- movzx eax, word [VDD_Handle]
- or eax, SOCKET_ACCEPT<<16
- db 0C4h, 0C4h, 058h, 002h
- mov esp, ebp
- pop ebp
- ret
- [global _Socket_bind]
- _Socket_bind: push ebp
- mov ebp, esp
- .Socket equ 8
- .Name equ 12
- clc
- movzx eax, word [VDD_Handle]
- or eax, SOCKET_BIND<<16
- db 0C4h, 0C4h, 058h, 002h
- mov esp, ebp
- pop ebp
- ret
- [global _Socket_close]
- _Socket_close: push ebp
- mov ebp, esp
- .Socket equ 8
- clc
- movzx eax, word [VDD_Handle]
- or eax, SOCKET_CLOSE<<16
- db 0C4h, 0C4h, 058h, 002h
- mov esp, ebp
- pop ebp
- ret
- [global _Socket_connect]
- _Socket_connect: push ebp
- mov ebp, esp
- .Socket equ 8
- .Name equ 12
- clc
- movzx eax, word [VDD_Handle]
- or eax, SOCKET_CONNECT<<16
- db 0C4h, 0C4h, 058h, 002h
- mov esp, ebp
- pop ebp
- ret
- [global _Socket_getpeername]
- _Socket_getpeername: push ebp
- mov ebp, esp
- .Socket equ 8
- .Name equ 12
- clc
- movzx eax, word [VDD_Handle]
- or eax, SOCKET_GETPEERNAME<<16
- db 0C4h, 0C4h, 058h, 002h
- mov esp, ebp
- pop ebp
- ret
- [global _Socket_getsockname]
- _Socket_getsockname: push ebp
- mov ebp, esp
- .Socket equ 8
- .Name equ 12
- clc
- movzx eax, word [VDD_Handle]
- or eax, SOCKET_GETSOCKNAME<<16
- db 0C4h, 0C4h, 058h, 002h
- mov esp, ebp
- pop ebp
- ret
- [global _Socket_ntohl]
- _Socket_ntohl
- [global _Socket_htonl]
- _Socket_htonl: push ebp
- mov ebp, esp
- .HostVal equ 8
- mov eax, [ebp+.HostVal]
- bswap eax
- mov esp, ebp
- pop ebp
- ret
- [global _Socket_ntohs]
- _Socket_ntohs
- [global _Socket_htons]
- _Socket_htons: push ebp
- mov ebp, esp
- .HostVal equ 8
- mov ax, [ebp+.HostVal]
- xchg al, ah
- mov esp, ebp
- pop ebp
- ret
- [global _Socket_inet_addr]
- _Socket_inet_addr: push ebp
- mov ebp, esp
- .DottedAddress equ 8
- clc
- movzx eax, word [VDD_Handle]
- or eax, SOCKET_INETADDR<<16
- db 0C4h, 0C4h, 058h, 002h
- mov esp, ebp
- pop ebp
- ret
- [global _Socket_inet_ntoa]
- _Socket_inet_ntoa: push ebp
- mov ebp, esp
- .Address equ 8
- clc
- movzx eax, word [VDD_Handle]
- or eax, SOCKET_INETNTOA<<16
- db 0C4h, 0C4h, 058h, 002h
- mov eax, NetAddr_static
- mov esp, ebp
- pop ebp
- ret
- [global _Socket_listen]
- _Socket_listen: push ebp
- mov ebp, esp
- .Socket equ 8
- .BackLog equ 12
- clc
- movzx eax, word [VDD_Handle]
- or eax, SOCKET_LISTEN<<16
- db 0C4h, 0C4h, 058h, 002h
- mov esp, ebp
- pop ebp
- ret
- [global _Socket_recv]
- _Socket_recv: push ebp
- mov ebp, esp
- .Socket equ 8
- .Buf equ 12
- .MaxLen equ 16
- .Flags equ 20
- clc
- movzx eax, word [VDD_Handle]
- or eax, SOCKET_RECV<<16
- db 0C4h, 0C4h, 058h, 002h
- mov esp, ebp
- pop ebp
- ret
- [global _Socket_recvfrom]
- _Socket_recvfrom: push ebp
- mov ebp, esp
- .Socket equ 8
- .Buf equ 12
- .MaxLen equ 16
- .Flags equ 20
- .From equ 24
- clc
- movzx eax, word [VDD_Handle]
- or eax, SOCKET_RECVFROM<<16
- db 0C4h, 0C4h, 058h, 002h
- mov esp, ebp
- pop ebp
- ret
- [global _Socket_send]
- _Socket_send: push ebp
- mov ebp, esp
- .Socket equ 8
- .Buf equ 12
- .Len equ 16
- .Flags equ 20
- clc
- movzx eax, word [VDD_Handle]
- or eax, SOCKET_SEND<<16
- db 0C4h, 0C4h, 058h, 002h
- mov esp, ebp
- pop ebp
- ret
- [global _Socket_sendto]
- _Socket_sendto: push ebp
- mov ebp, esp
- .Socket equ 8
- .Buf equ 12
- .Len equ 16
- .Flags equ 20
- .To equ 24
- clc
- movzx eax, word [VDD_Handle]
- or eax, SOCKET_SENDTO<<16
- db 0C4h, 0C4h, 058h, 002h
- mov esp, ebp
- pop ebp
- ret
- [global _Socket_shutdown]
- _Socket_shutdown: push ebp
- mov ebp, esp
- .Socket equ 8
- .Flags equ 12
- mov eax, [ebp+.Flags]
- test eax, eax
- jz .done
- clc
- movzx eax, word [VDD_Handle]
- or eax, SOCKET_SHUTDOWN<<16
- db 0C4h, 0C4h, 058h, 002h
- .done:
- mov esp, ebp
- pop ebp
- ret
- [global _Socket_create]
- _Socket_create: push ebp
- mov ebp, esp
- .Type equ 8
- clc
- movzx eax, word [VDD_Handle]
- or eax, SOCKET_CREATE<<16
- db 0C4h, 0C4h, 058h, 002h
- mov esp, ebp
- pop ebp
- ret
- [global _Socket_gethostbyaddr]
- _Socket_gethostbyaddr: push ebp
- mov ebp, esp
- .Address equ 8
- clc
- movzx eax, word [VDD_Handle]
- or eax, SOCKET_GETHOSTBYADDR<<16
- db 0C4h, 0C4h, 058h, 002h
- test eax, eax
- jz .done
- mov eax, HostEnt_static
- .done:
- mov esp, ebp
- pop ebp
- ret
- [global _Socket_gethostbyname]
- _Socket_gethostbyname: push ebp
- mov ebp, esp
- .Name equ 8
- clc
- movzx eax, word [VDD_Handle]
- or eax, SOCKET_GETHOSTBYNAME<<16
- db 0C4h, 0C4h, 058h, 002h
- test eax, eax
- jz .done
- mov eax, HostEnt_static
- .done:
- mov esp, ebp
- pop ebp
- ret
- [global _Socket_gethostname]
- _Socket_gethostname: push ebp
- mov ebp, esp
- .Name equ 8
- .NameLen equ 12
- clc
- movzx eax, word [VDD_Handle]
- or eax, SOCKET_GETHOSTNAME<<16
- db 0C4h, 0C4h, 058h, 002h
- mov esp, ebp
- pop ebp
- ret
- [global _Socket_GetLastError]
- _Socket_GetLastError
- mov eax, [LastError]
- ret