Rev 2046 | Details | Compare with Previous | Last modification | View Log
Rev | Author | Line No. | Line |
---|---|---|---|
1601 | kulich | 1 | MODULE Wifi |
2 | macro OS_NETSOCKET ;D=address family (2=inet, 23=inet6), E=socket type (0x01 tcp/ip, 0x02 icmp, 0x03 udp/ip) ;out: L=SOCKET (if L < 0 then A=error) |
||
3 | ld l,0x01 |
||
4 | ld c,nos.CMD_WIZNETOPEN |
||
5 | call nos.BDOS |
||
6 | endm |
||
7 | macro OS_NETCONNECT;A=SOCKET, DE=sockaddr ptr {unsigned char sin_family /*net type*/; unsigned short sin_port; struct in_addr sin_addr /*4 bytes IP*/; char sin_zero[8];}; out: if HL < 0 then A=error |
||
8 | ld l,0x03 |
||
9 | ld c,nos.CMD_WIZNETOPEN |
||
10 | ex af,af' |
||
11 | call nos.BDOS |
||
12 | endm |
||
13 | macro OS_WIZNETWRITE;A=SOCKET, de=buffer_ptr, HL=sizeof(buffer) ; out: HL=count if HL < 0 then A=error |
||
14 | ld c,nos.CMD_WIZNETWRITE |
||
15 | ex af,af' |
||
16 | call nos.BDOS |
||
17 | endm |
||
18 | macro OS_WIZNETREAD;A=SOCKET, de=buffer_ptr, HL=sizeof(buffer) ; out: HL=count if HL < 0 then A=error |
||
19 | ld c,nos.CMD_WIZNETREAD |
||
20 | ex af,af' |
||
21 | call nos.BDOS |
||
22 | endm |
||
23 | macro OS_NETSHUTDOWN;A=SOCKET ; out: if HL < 0 then A=error |
||
24 | ld l,0x02 |
||
25 | ld c,nos.CMD_WIZNETOPEN |
||
26 | ex af,af' |
||
27 | call nos.BDOS |
||
28 | endm |
||
29 | |||
30 | macro OS_GETDNS;DE= ptr to DNS buffer(4 bytes) |
||
31 | ld l, 0x08 |
||
32 | ld c, nos.CMD_WIZNETOPEN |
||
33 | ex af,af' ;' |
||
34 | call nos.BDOS ;c=CMD |
||
35 | endm |
||
1654 | kulich | 36 | |
37 | macro OS_YIELD |
||
38 | push bc |
||
39 | ld c,nos.CMD_YIELD |
||
40 | call nos.BDOS |
||
41 | pop bc |
||
42 | endm |
||
43 | |||
1606 | kulich | 44 | init: |
1869 | kulich | 45 | ; Nothing to init there |
1606 | kulich | 46 | ret |
1869 | kulich | 47 | |
1601 | kulich | 48 | host_ia: |
49 | .curport=$+1 |
||
50 | defb 0,0,80,8,8,8,8 |
||
51 | |||
52 | tcpSendZ |
||
53 | push hl |
||
54 | pop de |
||
55 | push de |
||
56 | call strLen |
||
57 | pop de |
||
58 | ld a,(sock_fd) |
||
59 | OS_WIZNETWRITE |
||
60 | ld hl,2 |
||
61 | ld de,.rn |
||
62 | ld a,(sock_fd) |
||
63 | OS_WIZNETWRITE |
||
64 | ret |
||
65 | .rn defb "\r\n" |
||
66 | |||
67 | getPacket |
||
1857 | kulich | 68 | ;if A = op8 then the C flag is reset, and Z is set. |
69 | ;If A < op8, C is set and Z is reset. |
||
70 | ;If A > op8 then both C and Z are reset |
||
1601 | kulich | 71 | ld de,(buffer_pointer) |
1616 | kulich | 72 | ld a,0xfb |
1612 | kulich | 73 | cp d |
1857 | kulich | 74 | jp nc, letsgo |
1612 | kulich | 75 | ld hl, .errMem : call DialogBox.msgBox |
76 | ld a,1 |
||
77 | ld (closed),a |
||
78 | xor a |
||
79 | ld (bytes_avail),a |
||
80 | ret |
||
81 | .errMem: |
||
82 | db "Out of memory. Page loading error.",0 |
||
83 | letsgo: |
||
84 | ld de,(buffer_pointer) |
||
2046 | kulich | 85 | ld hl,TCP_BUFFER_SIZE |
1601 | kulich | 86 | ld a,(sock_fd) |
87 | OS_WIZNETREAD |
||
88 | BIT 7,H |
||
89 | JR Z,RECEIVED ;ошибок нет |
||
1654 | kulich | 90 | CP 35 ;ERR_EAGAIN |
1869 | kulich | 91 | jp z, letsgo |
1601 | kulich | 92 | ;обработка ошибки |
93 | ld a,1 |
||
94 | ld (closed), a |
||
95 | LD a,(sock_fd) |
||
96 | LD E,0 |
||
97 | OS_NETSHUTDOWN |
||
98 | ld hl,(buffer_pointer) |
||
99 | ld de,outputBuffer |
||
100 | or a |
||
101 | sbc hl,de |
||
102 | ld (bytes_avail),HL |
||
103 | ret |
||
104 | RECEIVED |
||
105 | ex hl,de |
||
106 | ld hl,(buffer_pointer) |
||
107 | add hl,de |
||
108 | ld (buffer_pointer),hl |
||
109 | ld de,outputBuffer |
||
110 | or a |
||
111 | sbc hl,de |
||
112 | ld (bytes_avail),HL |
||
113 | ret |
||
114 | |||
115 | |||
116 | openTCP ;DE - port_str, HL - domain name |
||
117 | push hl |
||
118 | call atohl |
||
119 | ld a,h,h,l,l,a |
||
120 | ld (host_ia.curport),hl |
||
121 | pop de |
||
122 | call dns_resolver |
||
123 | ld a,h : or l : jp z,reqErr |
||
124 | ld de,host_ia+3 |
||
125 | ld bc,4 |
||
126 | ldir |
||
127 | ld de,1+(2<<8) |
||
128 | OS_NETSOCKET |
||
129 | ld a,l : or a : jp m,reqErr |
||
130 | ld (sock_fd),a |
||
131 | ld de,host_ia |
||
132 | OS_NETCONNECT |
||
133 | ld a,l : or a : jp m,reqErr |
||
134 | xor a : ld (closed), a |
||
135 | ret |
||
136 | |||
137 | closed |
||
138 | defb 1 |
||
139 | bytes_avail |
||
140 | defw 0 |
||
141 | buffer_pointer |
||
142 | defw 0 |
||
143 | |||
144 | reqErr |
||
145 | ld hl, .errMsg : call DialogBox.msgBox |
||
146 | scf |
||
147 | ret |
||
148 | .errMsg db "Socket failed!",0 |
||
149 | |||
150 | dns_resolver: ;DE-domain name |
||
151 | ld (.httphostname),de |
||
1654 | kulich | 152 | ld a,254 |
1601 | kulich | 153 | ld (.dns_err_count),a |
154 | .dns_err_loop |
||
155 | ;push de |
||
156 | ld hl,.dns_head |
||
157 | ld de,outputBuffer |
||
158 | ld bc,6 |
||
159 | ldir |
||
160 | ex de,hl |
||
161 | ld de,outputBuffer+7 |
||
162 | ld (hl),b;0 |
||
163 | ld c,256-7 |
||
164 | ldir |
||
165 | ld de,outputBuffer+12 |
||
166 | ld h,d |
||
167 | ld l,e |
||
168 | ld bc,.httphostname ;pop bc |
||
169 | .httphostname=$-2 |
||
170 | .name_loop: |
||
171 | inc hl |
||
172 | ld a,(bc) |
||
173 | ld (hl),a |
||
174 | inc bc |
||
175 | cp '.' |
||
176 | jr z,.is_dot |
||
177 | or a |
||
178 | jr nz,.name_loop |
||
179 | .is_dot: |
||
180 | sbc hl,de |
||
181 | ex de,hl |
||
182 | dec e |
||
183 | ld (hl),e |
||
184 | inc e |
||
185 | add hl,de |
||
186 | ld d,h |
||
187 | ld e,l |
||
188 | or a |
||
189 | jr nz,.name_loop |
||
190 | inc a |
||
191 | inc hl |
||
192 | inc hl |
||
193 | ld (hl),a |
||
194 | inc hl |
||
195 | inc hl |
||
196 | ld (hl),a |
||
197 | inc hl |
||
198 | push hl |
||
199 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; |
||
200 | ld a, (.dns_ia2) |
||
201 | cp 0 |
||
202 | jp nz, .skipgetdns |
||
203 | ld de, .dns_ia2;DE= ptr to DNS buffer(4 bytes) |
||
204 | OS_GETDNS |
||
205 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; |
||
206 | .skipgetdns: |
||
207 | ld de,0x0203 |
||
208 | OS_NETSOCKET |
||
209 | ld a,l |
||
210 | ld (sock_fd),a |
||
211 | or a |
||
212 | jp m,.dns_exiterr |
||
213 | pop hl |
||
214 | push hl |
||
215 | ld de,0xffff&(-outputBuffer) |
||
216 | add hl,de |
||
217 | LD a,(sock_fd) |
||
218 | LD IX,outputBuffer |
||
219 | LD DE,.dns_ia |
||
220 | OS_WIZNETWRITE |
||
221 | bit 7,h |
||
222 | jr nz,.dns_exitcode |
||
223 | .dns_err_count=$+1 |
||
224 | ld b,32 |
||
225 | jr .recv_wait1 |
||
226 | .recv_wait: |
||
227 | push bc |
||
228 | ld c,nos.CMD_YIELD |
||
229 | call nos.BDOS |
||
230 | pop bc |
||
231 | .recv_wait1: |
||
232 | push bc |
||
233 | ld hl,256 |
||
234 | LD a,(sock_fd) |
||
235 | LD DE,outputBuffer |
||
236 | LD IX,outputBuffer |
||
237 | OS_WIZNETREAD |
||
238 | pop bc |
||
239 | bit 7,h |
||
240 | jr z,.recv_wait_end |
||
241 | djnz .recv_wait |
||
242 | jr .dns_exiterr |
||
243 | .recv_wait_end: |
||
244 | ld a,(outputBuffer+3) |
||
245 | and 0x0f |
||
246 | jr nz,.dns_exiterr |
||
247 | .dns_exitcode: |
||
248 | LD a,(sock_fd) |
||
249 | LD E,0 |
||
250 | OS_NETSHUTDOWN |
||
251 | pop hl |
||
252 | .reqpars_l |
||
253 | inc hl |
||
254 | inc hl |
||
255 | inc hl |
||
256 | ld a,(hl) |
||
257 | ld de,7 |
||
258 | add hl,de |
||
259 | ld b,(hl) |
||
260 | inc hl |
||
261 | ld c,(hl) |
||
262 | inc hl |
||
263 | dec a |
||
264 | ret z |
||
265 | cp 4 |
||
266 | jr nz,.exiterr1 |
||
267 | add hl,bc |
||
268 | jr .reqpars_l |
||
269 | .dns_exiterr: |
||
270 | pop af |
||
271 | LD a,(sock_fd) |
||
272 | LD E,0 |
||
273 | OS_NETSHUTDOWN |
||
274 | ld a,(.dns_err_count) |
||
275 | add a,a |
||
276 | ld (.dns_err_count),a |
||
1654 | kulich | 277 | OS_YIELD |
1601 | kulich | 278 | jp nc,.dns_err_loop |
279 | .exiterr1: |
||
280 | ld hl,0 |
||
281 | ret |
||
282 | .dns_head |
||
283 | defb 0x11,0x22,0x01,0x00,0x00,0x01 |
||
284 | |||
285 | ;struct sockaddr_in {unsigned char sin_family;unsigned short sin_port; |
||
286 | ; struct in_addr sin_addr;char sin_zero[8];}; |
||
287 | .dns_ia: |
||
288 | defb 0 |
||
289 | db 0,53 ;port (big endian) |
||
290 | .dns_ia2: |
||
291 | db 0,0,0,0 ;ip (big endian) |
||
292 | |||
293 | sock_fd defb 0 |
||
294 | ENDMODULE |