blob: 57345e503ec7efa1f4a06c01a1c50bf61a07e6db [file] [log] [blame]
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