DEVICE ZXSPECTRUM128
ORG 0x8000
START
;ЁхушёЄЁ√ ўшяр
WIZ_BASE_ADDR = 0xc000
W_MR = WIZ_BASE_ADDR+0x0000
W_SHAR = WIZ_BASE_ADDR+0x0008
S0_MR = WIZ_BASE_ADDR+0x0201 ;ьы.срщЄ
S0_CR = WIZ_BASE_ADDR+0x0203 ;ьы.срщЄ
S0_SSR = WIZ_BASE_ADDR+0x0209 ;ьы.срщЄ
S0_PORTR = WIZ_BASE_ADDR+0x020a
S0_DPORTR = WIZ_BASE_ADDR+0x0212
S0_DIPR = WIZ_BASE_ADDR+0x0214
S0_TX_WRSR = WIZ_BASE_ADDR+0x0222 ;ьы.ёыютю
S0_RX_RSR = WIZ_BASE_ADDR+0x022a
S0_TX_FAKE = WIZ_BASE_ADDR+0x2000
S0_RX_FAKE = WIZ_BASE_ADDR+0x3000
;/***************************************/
;/* The bit of Sn_MR regsiter defintion */
;/***************************************/
Sn_MR_CLOSE = 0x00 ;/**< Protocol bits of Sn_MR. */
Sn_MR_TCP = 0x01 ;/**< Protocol bits of Sn_MR. */
Sn_MR_UDP = 0x02 ;/**< Protocol bits of Sn_MR. */
Sn_MR_IPRAW = 0x03 ;/**< Protocol bits of Sn_MR. */
Sn_MR_MACRAW = 0x04 ;/**< Protocol bits of Sn_MR. */
Sn_MR_PPPoE = 0x05 ;/**< Protocol bits of Sn_MR. */
/******************************/
/* The values of CR defintion */
/******************************/
Sn_CR_OPEN = 0x01 ;/**< OPEN command value of Sn_CR. */
Sn_CR_LISTEN = 0x02 ;/**< LISTEN command value of Sn_CR. */
Sn_CR_CONNECT = 0x04 ;/**< CONNECT command value of Sn_CR. */
Sn_CR_DISCON = 0x08 ;/**< DISCONNECT command value of Sn_CR. */
Sn_CR_CLOSE = 0x10 ;/**< CLOSE command value of Sn_CR. */
Sn_CR_SEND = 0x20 ;/**< SEND command value of Sn_CR. */
Sn_CR_SEND_MAC = 0x21 ;/**< SEND_MAC command value of Sn_CR. */
Sn_CR_SEND_KEEP = 0x22 ;/**< SEND_KEEP command value of Sn_CR */
Sn_CR_RECV = 0x40 ;/**< RECV command value of Sn_CR */
Sn_CR_PCON = 0x23 ;/**< PCON command value of Sn_CR */
Sn_CR_PDISCON = 0x24 ;/**< PDISCON command value of Sn_CR */
Sn_CR_PCR = 0x25 ;/**< PCR command value of Sn_CR */
Sn_CR_PCN = 0x26 ;/**< PCN command value of Sn_CR */
Sn_CR_PCJ = 0x27 ;/**< PCJ command value of Sn_CR */
;/**********************************/
;/* The values of Sn_SSR defintion */
;/**********************************/
SOCK_CLOSED = 0x00 ;< SOCKETn is released */
SOCK_ARP = 0x01 ;< ARP-request is transmitted in order to acquire destination hardware address. */
SOCK_INIT = 0x13 ;< SOCKETn is open as TCP mode. */
SOCK_LISTEN = 0x14 ;< SOCKETn operates as "TCP SERVER" and waits for connection-request (SYN packet) from "TCP CLIENT". */
SOCK_SYNSENT = 0x15 ;< Connect-request(SYN packet) is transmitted to "TCP SERVER". */
SOCK_SYNRECV = 0x16 ;< Connect-request(SYN packet) is received from "TCP CLIENT". */
SOCK_ESTABLISHED = 0x17 ;< TCP connection is established. */
SOCK_FIN_WAIT = 0x18 ;< SOCKETn is closing. */
SOCK_CLOSING = 0x1A ;< SOCKETn is closing. */
SOCK_TIME_WAIT = 0x1B ;< SOCKETn is closing. */
SOCK_CLOSE_WAIT = 0x1C ;< Disconnect-request(FIN packet) is received from the peer. */
SOCK_LAST_ACK = 0x1D ;< SOCKETn is closing. */
SOCK_UDP = 0x22 ;< SOCKETn is open as UDP mode. */
SOCK_IPRAW = 0x32 ;< SOCKETn is open as IPRAW mode. */
SOCK_MACRAW = 0x42 ;< SOCKET0 is open as MACRAW mode. */
SOCK_PPPoE = 0x5F ;< SOCKET0 is open as PPPoE mode. */
di
ld sp,0xc000
ld hl,0x4000
ld (hl),0
ld de,0x4001
ld bc,192*256/8-1
ldir
;фхырхь їрЁфЁхёхЄ ўшяр
;┬ёх Єрщьшэуш юъЁєуыхэ√ фю 50ьё
ei
halt
ld bc,0x83ab
in a,(c)
and 0xee
out (c),a ; ЁхёхЄ
halt
or 0x10
out (c),a ; ёэ Єшх ЁхёхЄр
halt
;╧ЁюхЎшЁютрэшх ЁхушёЄЁют т рфЁхёэюх яЁюёЄЁрэёЄтю z80.
;─ы яЁшьхЁр яЁюхЎшЁєхь т рфЁхёр 0xc000-0xffff (т єёыютш ї ZX-Evo baseconf).
;╧ЁюхЎшЁютрэшх сєфхЄ яЁюшёїюфшЄ№ Єюы№ъю яЁш яюфъы■ўхээюь ╧╟╙ т чрфрээюь рфЁхёэюь юъэх.
;╤ЄЁрэшЎр ╧╟╙ эх шьххЄ чэрўхэш
ld a,1
out (0xbf),a
ld bc,0xfff7
ld a,0x3f
out (c),a
;╥хяхЁ№ тъы■ўрхь яЁюхЎшЁютрэшх
ld bc,0x82ab
ld a,7
out (c),a
;фрыхх ёюЇЄЁхёхЄ ўшяр(эрёў╕Є эєцэюёЄш эхєтхЁхэ, эю эхяюьх°рхЄ)
ld a,0x80
ld (W_MR+1),a
halt
ld a,0x3c
ld (W_MR),a
di
;чръшф√трхь MAC, °ы■ч, ьрёъє ш ╚╧. ╧юьхэ Є№ яюф ёхс !!!
ld hl,mac
ld de,W_SHAR
ld bc,20
ldir
;╤ ¤Єюую ьюьхэЄр ўшя сєфхЄ яшэуютрЄ№ё ш эрёЄЁющъш ьюцэю ёўшЄрЄ№ чртхЁ°╕ээ√ьш.
;▌ёЄхЄрь ьюцэю яюўшЄрЄ№ яфЇъє ш эрёЄЁюшЄ№ ў╕эшЄ№ х∙╕, эю фы яЁшьхЁр ш ¤Єюую фюёЄрЄюўэю.
;----------------------------------------------------------
;ЄхяхЁ№ яюфъы■ўшьё ъ TCP(═╥╥╨) ёхЁтхЁє ш ўхуюэшЄ№ яюыєўшь
;----------------------------------------------------------
;эрёЄЁюшь ёюъхЄ
soc_noinit
ld a,Sn_CR_CLOSE ;чръЁюхь ёюхфшэхэшх
ld (S0_CR),a
ld a,Sn_MR_TCP ;Ёхцшь ёюъхЄр TCP
ld (S0_MR),a
ld hl,(source_port) ;яЁшЁр∙штхь тэєЄЁхээшщ яюЁЄ, ўЄюя ё яЁхф√фє∙шь эх яхЁхёхўё
inc hl
ld (source_port),hl
ld e,h ;сшухэфшрэ, ьхэ хь срщЄ√ ьхёЄрьш
ld d,l
ld (S0_PORTR),de
ld a,Sn_CR_OPEN ;фрхь ъюьрэфє юЄъЁ√Єш ёюъхЄр
ld (S0_CR),a
wait_cr0
ld a,(S0_CR) ;юцшфрхь шёяюыэхэш ъюьрэф√
or a
jr nz,wait_cr0
ld a,(S0_SSR) ;хёыш эх шэшЎшрышчшЁютрыё , Єю чрэютю
cp SOCK_INIT
jr nz,soc_noinit
;--------------------
;ъюэхъЄшьё ъ ёхЁтхЁє
;--------------------
ld hl,S0_DPORTR ;яюЁЄ ёхЁтхЁр !сшухэфшрэ!
ld (hl),0
inc hl
ld (hl),80
ld hl,S0_DIPR ;ip ёхЁтхЁр ьрЁючр1999 217.146.69.13
ld (hl),217
inc hl
ld (hl),146
inc hl
ld (hl),69
inc hl
ld (hl),13
ld a,Sn_CR_CONNECT ;фрхь ъюьрэфє ъюэхъЄр
ld (S0_CR),a
wait_cr1
ld a,(S0_CR) ;юцшфрхь шёяюыэхэш ъюьрэф√
or a
jr nz,wait_cr1
;юцшфрхь ъюээхъЄр ё ёхЁтхЁюь
wait_con
ld a,(S0_SSR)
or a
jp z,soc_noinit ;╤хЁтхЁ ў╕щЄр чръЁ√ы(эхюЄъЁ√ы) ъюээхъЄ
cp SOCK_ESTABLISHED ;тююс∙х Єю ЄєЄ эрфю яЁютхЁ Є№ ш эрёў╕Є Єрщь рєЄр, ш фЁєующ Їшуэш
jr nz,wait_con ;эю ь√ чрс№╕ь эр ¤Єю фхыю
wait_con_end
;яЁшъюэхъЄшышё№, юЄю°ы╕ь GET чряЁюё
;--------------------
;юЄяЁртър яръхЄр
;--------------------
ld hl,get_str ;чръшф√трхь фрЄє т сєЇхЁ ўшяр
ld de,S0_TX_FAKE
ld bc,get_str_end-get_str
inc bc ;чръшф√трЄ№ эрфю ў╕Єэюх ъюышўхёЄтю срщЄ
res 0,c ;яю¤Єюьє юъЁєуышь фю ў╕Єэюую
ldir ;рїЄєэу уютэюъюф!!! ldir'шЄ№ ьюцэю эх сюыхх 512 срщЄ, ёьюЄЁш юяшёрэшх яырЄъш,
;эю ь√ юяєёЄшь ¤ЄюЄ ьюьхэЄ, Є.ъ. ёЄЁюър є эрё тэю ъюЁюўх
ld a,high (get_str_end-get_str)
ld (S0_TX_WRSR),a ;чръшф√трхь фышээє фрЄ√, эх чрс√тр яЁю сшу¤эфшрэ
ld a,low (get_str_end-get_str)
ld (S0_TX_WRSR+1),a ;р тюЄ ёфхё№ эєцэю єърч√трЄ№ Єюўэюх ъюы-тю срщЄ, эхтчшЁр эр эхў╕ЄэюёЄ№
ld a,Sn_CR_SEND ;фрхь ъюьрэфє юЄяЁртъш
ld (S0_CR),a
wait_cr2
ld a,(S0_CR) ;юцшфрхь шёяюыэхэш ъюьрэф√
or a
jr nz,wait_cr2
;--------------------
;юцшфрхь яръхЄ юЄ ёхЁтхЁр
;--------------------
ld de,0
wait_pack0
ld de,(S0_RX_RSR) ;ўшЄрхь фышээє яръхЄр
ld a,d
or e ;хёыш эєыхтр , Єю цф╕ь фры№°х
jr z,wait_pack0
wait_pack1
ld hl,(S0_RX_RSR) ;юур, яЁш°ыю
ex de,hl ;ЄхяхЁ№ цф╕ь єёЄрърэштрэш фрЄ√
xor a ;яютЄюЁэю ўшЄрхь ш хёыш эх ёїюфшЄё , Єю ўшЄрхь х∙╕ Ёрч фышээє
sbc hl,de
ld a,h
or l
jr nz,wait_pack1
;яръхЄ яюыєўхэ ўшяюь яюыэюёЄ№■, эрфю хую т√ўшЄрЄ№
;Є.ъ. т S0_RX_RSR фышээр ъЁрЄэр фтєь, Єю...
;--------------------
;ёхщўрё яЁюўшЄрхь Ёхры№эє■ фышээє, юэр ыхцшЄ т яхЁт√ї фтєї срщЄрї сєЇхЁр яЁшхьр
;--------------------
ld hl,(S0_RX_FAKE)
ld b,l ;фюысрээ√щ сшухэфшрэ
ld c,h
;--------------------
;ўшЄрхь яръхЄ, т de є эрё ыхцшЄ фышээр ъЁрЄэр фтєь(сшухэфшрэ)
;--------------------
;т√╕цштрЄё ё ыфшЁюь эхсєфхь
ld b,e
ld c,d
dec bc ;т ЁхушёЄЁх фышээр яръхЄр с√ыр ё єў╕Єюь фтєї яхЁт√ї срщЄ,
dec bc ;ъюЄюЁ√х фюсртшы ёрь тшчэхЄ(Єюўэр фышээр яръхЄр)
ld hl,S0_RX_FAKE
ld de,buf_rx
loop_read
ld l,0
ld a,c
or b
jr z,end_read
ldi
ldi
jr loop_read
end_read
ld a,Sn_CR_RECV ;фрхь чэрЄ№ ўЄю яръхЄ чрсЁрыш
ld (S0_CR),a
wait_cr3
ld a,(S0_CR) ;юцшфрхь шёяюыэхэш ъюьрэф√
or a
jr nz,wait_cr3
;Єшяр тё╕, фрыхх ЁрчсшЁрхь яръхЄ, яюыєўрхь ёыхфє■∙шщ, юЄяЁрты хь. ═ю ¤Єю єцх ёрьш, чръЁ√тр■ ёюхфшэхэшх.
;--------------------
;чръЁюхь ёюхфшэхэшх
;--------------------
ld a,Sn_CR_CLOSE ;чръЁюхь ёюхфшэхэшх
ld (S0_CR),a
;--------------------
;┬ё╕, яЁшьхЁ юъюэўхэ.
;--------------------
ld bc,768 ;═х ьэюую яю уютэюъюфшь.
ld hl,buf_rx+478 ;▌Єр ЎшЇЁр яюыєўхэр тр °рЁъюь(юўхэ№ Ёхъюьхэфє■, ўЄюя эруы фэю с√ыю ш яючэртрЄхы№эю)
ld de,0x5800 ;└ тююс∙хс√ ЄєЄ эрфю ЁрёярЁёшЄ№ HTTP ЁхътхёЄ
ldir
di
halt
;ъюэЇшу ёхЄш(!!!▌Єш чэрўхэш шчьхэшЄх яюф ъюэЇшутр°хщ ёхЄш!!!)
mac
db 0x00,0x08,0xDC,0x01,0x02,0x03 ;ЎшЇЁ√ юЄ срыф√ тч ы, шч тшчэхЄютющ фюъш
reserved
db 0x00,0x00 ;¤Єю фы Єюую, ўЄюс юфэшь ыфшЁюь чръшэєЄ№
gateway
db 192,168,0,1
mask
db 255,255,255,0
ip
db 192,168,0,77
;тэєЄЁхээшщ яюЁЄ
source_port dw 0
;http://zx.maros.pri.ee/file/id/15733/filename/Yerzmyey_-_Cat_42_%282009%29_%28_International_Vodka_Party_5%2C_4%29.atr
get_str
db "GET /file/id/15733/filename/Yerzmyey_-_Cat_42_%282009%29_%28_International_Vodka_Party_5%2C_4%29.atr HTTP/1.1",13,10
db "Host: zx.maros.pri.ee",13,10
db 13,10,0
get_str_end
buf_rx
ENDPROG
SAVEHOB "s1.$C","s1.C",START,ENDPROG-START
SAVEBIN "s1",START,ENDPROG-START