170 lines
2.3 KiB
Plaintext
170 lines
2.3 KiB
Plaintext
device zxspectrum128
|
|
|
|
org #c000
|
|
|
|
include "sockets.mac"
|
|
|
|
|
|
start_
|
|
jp init
|
|
jp get
|
|
|
|
|
|
|
|
init
|
|
;init uart
|
|
ld hl,2 ;BaudRate = 115200 / divfq;
|
|
call uart.SetBaud
|
|
|
|
;init uart
|
|
ld a,uart.WLSB1+uart.WLSB0 ;8 bit word, no parity
|
|
call uart.SetLineControl
|
|
|
|
ret
|
|
|
|
; BUFFER equ 0
|
|
; BUFFER_SIZE equ 1
|
|
|
|
GET_HDR dw 0
|
|
GET_HDR_LEN dw 0
|
|
GET_PAGE db 0
|
|
host_addr_len dw 0
|
|
host_addr dw 0
|
|
|
|
;in:
|
|
;a=page
|
|
;hl=get hdr
|
|
;out:
|
|
;a=0 - ok
|
|
;hl=len_l
|
|
;bc=len_h
|
|
get
|
|
ld (GET_HDR),hl
|
|
ld (GET_PAGE),a
|
|
;get host name
|
|
g1 ld a,(hl)
|
|
or a:jp z,get_err
|
|
cp 'H':jr z,get_h1
|
|
inc hl:jr g1
|
|
|
|
get_h1 inc hl
|
|
ld a,(hl):cp 'o':jr nz,g1:inc hl
|
|
ld a,(hl):cp 's':jr nz,g1:inc hl
|
|
ld a,(hl):cp 't':jr nz,g1:inc hl
|
|
ld a,(hl):cp ':':jr nz,g1:inc hl
|
|
ld a,(hl):cp ' ':jr nz,g1:inc hl
|
|
|
|
ld (host_addr),hl
|
|
ld bc,0
|
|
gh1 ld a,(hl):cp 13:jr z,ghe
|
|
cp ":":jr z,ghe
|
|
cp "/":jr z,ghe ;?
|
|
inc hl,bc:jr gh1
|
|
|
|
ghe ld (host_addr_len),bc
|
|
|
|
;get HDR len
|
|
g2 ld a,(hl)
|
|
or a:jr z,g3
|
|
inc hl:jr g2
|
|
|
|
g3 ld de,(GET_HDR):or a:sbc hl,de:ld (GET_HDR_LEN),hl
|
|
|
|
;gethostbyname
|
|
ld hl,(host_addr),bc,(host_addr_len)
|
|
call sockets.gethostbyname
|
|
or a:jp nz,get_err
|
|
ld (server_addr),hl,(server_addr+2),bc
|
|
|
|
;create socket
|
|
socket AF_INET,SOCK_STREAM,0
|
|
cp INVALID_SOCKET:jp z,get_err
|
|
ld (fd),a
|
|
|
|
;bind my socket
|
|
bind fd,my_addr
|
|
or a:jp nz,get_err
|
|
|
|
;connect to host
|
|
connect fd,server_addr
|
|
or a:jr nz,get_err
|
|
|
|
;send HTTP request
|
|
send fd,(GET_HDR),(GET_HDR_LEN)
|
|
or a:jr nz,get_err
|
|
|
|
ld ix,0 ;full pages got
|
|
ld hl,#4000
|
|
get_loop
|
|
ld a,(GET_PAGE)
|
|
ld bc,#11af:out (c),a
|
|
ld de,#8000:ex de,hl:or a:sbc hl,de:ex de,hl ;de=len,hl=start
|
|
;recv data
|
|
; recv fd,BUFFER,BUFFER_SIZE
|
|
push hl
|
|
ld b,d,c,e
|
|
ld a,(fd)
|
|
call sockets.recv
|
|
pop hl
|
|
or a:jr nz,get_end
|
|
; ld a,b:or c:jr z,get_end
|
|
|
|
add hl,bc
|
|
bit 7,h
|
|
jr z,get_loop
|
|
|
|
ld hl,GET_PAGE:inc (hl)
|
|
ld hl,#4000
|
|
inc ixl
|
|
jr get_loop
|
|
|
|
get_end res 6,h:res 7,h
|
|
ld de,0,b,0,c,ixl
|
|
srl c:rr d:rr e
|
|
srl c:rr d:rr e
|
|
add hl,de ;bc:hl=len
|
|
|
|
|
|
get_e ld a,(fd):cp #ff:jr z,noclose
|
|
push hl,bc
|
|
;close socket
|
|
close fd
|
|
pop bc,hl
|
|
noclose ld a,#ff,(fd),a
|
|
xor a
|
|
ret
|
|
|
|
|
|
get_err call get_e
|
|
inc a
|
|
ret
|
|
|
|
|
|
;-----------------------------------------------------------
|
|
|
|
|
|
|
|
|
|
|
|
fd db #ff ;socket fd
|
|
my_addr db 0,0,0,0:dw 0 ;my ip+port
|
|
|
|
|
|
|
|
|
|
server_addr db 93,158,134,3:dw 80
|
|
|
|
;code
|
|
include "uart.a80"
|
|
include "sockets.a80"
|
|
|
|
|
|
end_
|
|
|
|
|
|
;save snap
|
|
SAVEBIN "_spg/zificom.bin",start_, end_-start_
|
|
|
|
|
|
|