333 lines
4.0 KiB
Plaintext
333 lines
4.0 KiB
Plaintext
|
|
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 fd
|
|
|
|
;IN:
|
|
;l=address_family
|
|
;h=sock_type
|
|
;c=proto
|
|
;OUT:
|
|
;a=fd/INVALID_SOCKET
|
|
socket
|
|
ex de,hl
|
|
ld hl,cmd_buffer
|
|
ld (hl),IC_CMD_SOCKET:inc hl
|
|
ld (hl),e:inc hl
|
|
ld (hl),d:inc hl
|
|
ld (hl),c
|
|
|
|
ld hl,cmd_buffer,bc,4
|
|
call uart.Write
|
|
call uart.GetChar
|
|
or a:jr nz,socket_err
|
|
call uart.GetChar
|
|
ret
|
|
|
|
socket_err
|
|
ld a,INVALID_SOCKET
|
|
ret
|
|
|
|
|
|
|
|
|
|
|
|
;bind()
|
|
;> 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]
|
|
;<? word realsent (#ffff = error)
|
|
|
|
;IN:
|
|
;a=fd
|
|
;hl=buf
|
|
;bc=len
|
|
;OUT:
|
|
;a=res (0=ok)
|
|
;bc=reallen
|
|
send
|
|
ld (send2+1),hl ;save buf addr
|
|
ld (send1+1),bc ;save data len
|
|
ld hl,cmd_buffer
|
|
ld (hl),IC_CMD_SEND: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
|
|
|
|
send1 ld bc,0
|
|
ld a,b:or c:jr z,send_skip
|
|
send2 ld hl,0
|
|
call uart.Write ;put data
|
|
|
|
send_skip
|
|
call uart.GetChar
|
|
push af
|
|
call uart.GetChar
|
|
ld b,a
|
|
pop af
|
|
ld c,a ;bc=real len
|
|
xor a
|
|
ret
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
;recv()
|
|
;> 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)
|
|
;<? long ip
|
|
|
|
;IN:
|
|
;hl=name
|
|
;bc=len
|
|
;OUT:
|
|
;a=res (0=ok)
|
|
;hl:bc=ip
|
|
gethostbyname
|
|
ld (ghbn1+1),hl ;save name addr
|
|
ld (ghbn2+1),bc ;save len
|
|
ld hl,cmd_buffer
|
|
ld (hl),IC_CMD_GETHOSTBYNAME:inc hl
|
|
ld (hl),c:inc hl
|
|
ld (hl),b:inc hl
|
|
|
|
ld hl,cmd_buffer,bc,3
|
|
call uart.Write
|
|
ghbn1 ld hl,0
|
|
ghbn2 ld bc,0
|
|
call uart.Write
|
|
|
|
call uart.GetChar
|
|
or a:ret nz ;ret if error
|
|
|
|
ld hl,cmd_buffer,bc,4
|
|
call uart.Read ;get data
|
|
|
|
ld hl,(cmd_buffer),bc,(cmd_buffer+2)
|
|
xor a
|
|
ret
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
endmodule
|
|
|