Rev 1963 | Show entire file | Regard whitespace | Details | Blame | Last modification | View Log
Rev 1963 | Rev 2106 | ||
---|---|---|---|
Line 19... | Line 19... | ||
19 | pop iy |
19 | pop iy |
20 | pop ix |
20 | pop ix |
21 | pop bc |
21 | pop bc |
22 | ld h, l |
22 | ld h, l |
23 | ld l, a |
23 | ld l, a |
24 | |
- | |
25 | ret |
24 | ret |
26 | ENDMOD |
25 | ENDMOD |
27 | 26 | ||
28 | MODULE OS_NETCONNECT |
27 | MODULE OS_NETCONNECT |
29 | PUBLIC OS_NETCONNECT |
28 | PUBLIC OS_NETCONNECT |
Line 62... | Line 61... | ||
62 | ;if TCP: A=SOCKET, de=buffer_ptr, HL=sizeof(buffer) |
61 | ;if TCP: A=SOCKET, de=buffer_ptr, HL=sizeof(buffer) |
63 | ;else: A=SOCKET, de=sockaddr_in ptr, HL=sizeof(buffer), IX=buffer_ptr, |
62 | ;else: A=SOCKET, de=sockaddr_in ptr, HL=sizeof(buffer), IX=buffer_ptr, |
64 | ;out: HL=count if HL < 0 then A=error |
63 | ;out: HL=count if HL < 0 then A=error |
65 | OS_WIZNETREAD: |
64 | OS_WIZNETREAD: |
66 | push bc |
65 | push bc |
67 | ld b, e |
- | |
68 | ld a, e |
- | |
69 | add a, 05 ; protocol |
- | |
70 | ld e, a |
- | |
71 | ld a, (de) ;(0x01 tcp/ip, 0x02 icmp, 0x03 udp/ip |
- | |
72 | cp 01 |
- | |
73 | jp z, tcpread |
- | |
74 | cp 02 |
- | |
75 | jp z, icmpread |
- | |
76 | cp 03 |
- | |
77 | jp z, udpread |
- | |
78 | - | ||
79 | - | ||
80 | tcpread: |
- | |
81 | ld e, b |
- | |
82 | ex de,hl |
66 | ex de,hl |
83 | ld a, (hl) ;socket |
67 | ld a, (hl) ;socket |
84 | inc hl |
68 | inc hl |
85 | ld e, (hl) ;buffer L |
69 | ld e, (hl) ;buffer L |
86 | inc hl |
70 | inc hl |
Line 100... | Line 84... | ||
100 | pop ix |
84 | pop ix |
101 | bit 7, h |
85 | bit 7, h |
102 | jp z, readok ;noerror just return |
86 | jp z, readok ;noerror just return |
103 | ld l, a |
87 | ld l, a |
104 | jp readnot |
88 | jp readnot |
105 | - | ||
106 | icmpread: |
- | |
107 | udpread: |
- | |
108 | ld e, b |
- | |
109 | ex de,hl |
- | |
110 | ld a, (hl) ;socket |
- | |
111 | inc hl |
- | |
112 | ld (store_ix1), hl |
- | |
113 | ld IX, (store_ix1) ; buffer HL |
- | |
114 | inc hl |
- | |
115 | inc hl |
- | |
116 | ld c, (hl) ;size L |
- | |
117 | inc hl |
- | |
118 | ld b, (hl) ;size H |
- | |
119 | ld l, c |
- | |
120 | ld h, b |
- | |
121 | ex af,af' |
- | |
122 | ld c, CMD_WIZNETREAD |
- | |
123 | push ix |
- | |
124 | push iy |
- | |
125 | call BDOS |
- | |
126 | pop iy |
- | |
127 | pop ix |
- | |
128 | bit 7, h |
- | |
129 | jp z, readok ;noerror just return |
- | |
130 | ld l, a |
- | |
131 | - | ||
132 | readok: |
89 | readok: |
133 | readnot: |
90 | readnot: |
134 | pop bc |
91 | pop bc |
135 | ret |
92 | ret |
136 | store_ix1: |
- | |
137 | defb 0,0,0,0,0,0,0,0 |
- | |
138 | ENDMOD |
93 | ENDMOD |
139 | 94 | ||
140 | MODULE OS_WIZNETWRITE |
95 | MODULE OS_WIZNETWRITE |
141 | PUBLIC OS_WIZNETWRITE |
96 | PUBLIC OS_WIZNETWRITE |
142 | #include "sysdefs.asm" |
97 | #include "sysdefs.asm" |
Line 144... | Line 99... | ||
144 | ;if TCP: A=SOCKET, de=buffer_ptr, HL=sizeof(buffer) |
99 | ;if TCP: A=SOCKET, de=buffer_ptr, HL=sizeof(buffer) |
145 | ;else: A=SOCKET, de=sockaddr_in ptr, HL=sizeof(buffer), IX=buffer_ptr, |
100 | ;else: A=SOCKET, de=sockaddr_in ptr, HL=sizeof(buffer), IX=buffer_ptr, |
146 | ;out: HL=count if HL < 0 then A=error |
101 | ;out: HL=count if HL < 0 then A=error |
147 | OS_WIZNETWRITE |
102 | OS_WIZNETWRITE |
148 | push bc |
103 | push bc |
149 | ld b, e |
- | |
150 | ld a, e |
- | |
151 | add a, 05 ; protocol |
- | |
152 | ld e, a |
- | |
153 | ld a, (de) ;(0x01 tcp/ip, 0x02 icmp, 0x03 udp/ip |
- | |
154 | cp 01 |
- | |
155 | jp z, tcpsend |
- | |
156 | cp 02 |
- | |
157 | jp z, icmpsend |
- | |
158 | cp 03 |
- | |
159 | jp z, udpsend |
- | |
160 | - | ||
161 | tcpsend: |
- | |
162 | ld e, b |
- | |
163 | ex de,hl |
104 | ex de,hl |
164 | ld a, (hl) ;socket |
105 | ld a, (hl) ;socket |
165 | inc hl |
106 | inc hl |
166 | ld e, (hl) ;buffer L |
107 | ld e, (hl) ;buffer L |
167 | inc hl |
108 | inc hl |
Line 181... | Line 122... | ||
181 | pop ix |
122 | pop ix |
182 | bit 7, h |
123 | bit 7, h |
183 | jp z, writeok ;noerror just return |
124 | jp z, writeok ;noerror just return |
184 | ld l, a |
125 | ld l, a |
185 | jp writenot |
126 | jp writenot |
- | 127 | writeok: |
|
- | 128 | writenot: |
|
- | 129 | pop bc |
|
- | 130 | ret |
|
- | 131 | ENDMOD |
|
186 | |
132 | |
187 | udpsend: |
133 | /* |
188 | icmpsend: |
134 | A - SOCKET |
- | 135 | DE - указатель на структуру sockaddr_in, в неё помещается(ядром) IP-адрес и порт хоста отправившего данные. |
|
- | 136 | IX - указатель на буфер для принятия данных |
|
- | 137 | HL - размер буфера(в байтах) |
|
- | 138 | Возвращаемые значения в регистрах: |
|
- | 139 | HL - при отрицательном значении функция завершилась с ошибкой, |
|
- | 140 | про значении больше нуля возвращается действительный размер(в байтах) принятых данных, |
|
- | 141 | нулевого значения вызов не возвращает. |
|
- | 142 | А - errno при ошибке. |
|
- | 143 | Возможные ошибки: |
|
- | 144 | ERR_NOTSOCK - не действительный дескриптор сокета |
|
- | 145 | ERR_EAGAIN - входящих данных пока нет |
|
- | 146 | ERR_NOTCONN - сокет с неустановленным\пропавшем соединением(при протоколе TCP/IP) |
|
- | 147 | ||
- | 148 | Если количество параметров неопределённо (printf(...) и т.п.), то все параметры передаются через стек. |
|
- | 149 | Иначе первый параметр передаётся в E, DE, CDE или BCDE, в зависимости от разрядности значения. |
|
- | 150 | Если первый и второй параметры не шире 16 бит каждый, то второй параметр передаётся в регистрах B или BC, иначе через стек. |
|
- | 151 | Возвращаемое значение из функции передаётся в регистрах A (L при банкинге), HL, CHL или BCHL, в зависимости от разрядности значения. |
|
- | 152 | Сохранять надо ix и iy обязательно. |
|
- | 153 | DE и BC сохранять если они не юзаются в качестве параметров |
|
- | 154 | ||
189 | ld e, b |
155 | struct readstructure |
190 | ex de,hl |
156 | { |
191 | ld a, (hl) ; socket |
157 | unsigned char socket; |
- | 158 | unsigned int BufAdr; |
|
- | 159 | unsigned int bufsize; |
|
- | 160 | unsigned char protocol; |
|
192 | inc hl |
161 | }; |
- | 162 | ||
- | 163 | */ |
|
- | 164 | ||
- | 165 | ||
193 | ld (store_ix), hl |
166 | MODULE OS_WIZNETWRITE_UDP |
194 | ld IX, (store_ix) ; buffer HL |
167 | PUBLIC OS_WIZNETWRITE_UDP |
- | 168 | #include "sysdefs.asm" |
|
195 | inc hl |
169 | RSEG CODE |
- | 170 | OS_WIZNETWRITE_UDP |
|
- | 171 | ; DE - readstructure BC - sockaddr_in |
|
- | 172 | ex de,hl ;HL - sockaddr_in, DE - garbage |
|
- | 173 | ld a, (hl) ;A - socket |
|
196 | inc hl |
174 | inc hl |
197 | ld c, (hl) ; size L |
175 | ld e,(hl) |
198 | inc hl |
176 | inc hl |
199 | ld b, (hl) ; size H |
177 | ld d,(hl) |
200 | inc hl ; protocol |
- | |
201 | inc hl |
178 | inc hl |
- | 179 | push de |
|
- | 180 | ld (store_ix),ix |
|
- | 181 | pop ix ;IX - BufAdr |
|
- | 182 | ld e, (hl) ;E - Bufsize L |
|
- | 183 | inc hl |
|
- | 184 | ld d, (hl) ;D - Bufsize H |
|
- | 185 | ex de,hl ;HL - Bufsize |
|
202 | ex de,hl ; DE-HL now point at sockaddr_in |
186 | ld d,b ;DE - sockaddr_in |
- | 187 | ld e,c |
|
203 | ex af,af' |
188 | ex af,af' |
- | 189 | /* |
|
- | 190 | A - SOCKET |
|
- | 191 | DE - указатель на структуру sockaddr_in, в неё необходимо поместить IP-адрес и порт хоста получателя |
|
- | 192 | IX - указатель на буфер с данными |
|
- | 193 | HL - размер данных(в байтах), в текущей реализации максимум 8192 байта |
|
- | 194 | Возвращаемые значения в регистрах: |
|
- | 195 | HL - при отрицательном значении функция завершилась с ошибкой, |
|
- | 196 | иначе возвращается действительный размер(в байтах) отправленных данных, |
|
- | 197 | А - errno при ошибке. |
|
- | 198 | */ |
|
204 | ld c, CMD_WIZNETWRITE |
199 | ld c, CMD_WIZNETWRITE |
205 | push ix |
200 | push ix |
206 | push iy |
201 | push iy |
207 | call BDOS |
202 | call BDOS |
208 | pop iy |
203 | pop iy |
Line 210... | Line 205... | ||
210 | bit 7, h |
205 | bit 7, h |
211 | jp z, writeok ;noerror just return |
206 | jp z, writeok ;noerror just return |
212 | ld l, a |
207 | ld l, a |
213 | writeok: |
208 | writeok: |
214 | writenot: |
209 | writenot: |
215 | pop bc |
210 | ld ix,(store_ix) |
216 | ret |
211 | ret |
217 | store_ix: |
212 | store_ix: |
- | 213 | defb 0,0,0 |
|
- | 214 | ||
- | 215 | ENDMOD |
|
- | 216 | ||
- | 217 | MODULE OS_WIZNETREAD_UDP |
|
- | 218 | PUBLIC OS_WIZNETREAD_UDP |
|
- | 219 | #include "sysdefs.asm" |
|
- | 220 | RSEG CODE |
|
- | 221 | OS_WIZNETREAD_UDP: |
|
- | 222 | ; DE - readstructure BC - sockaddr_in |
|
- | 223 | ex de,hl ;HL - readstructure, DE - garbage |
|
- | 224 | ld a, (hl) ;A - socket |
|
- | 225 | inc hl |
|
- | 226 | ld e,(hl) |
|
- | 227 | inc hl |
|
- | 228 | ld d,(hl) |
|
- | 229 | inc hl |
|
- | 230 | push de |
|
- | 231 | ld (store_ix),ix |
|
- | 232 | pop ix |
|
- | 233 | ld e, (hl) ;E - Bufsize L |
|
- | 234 | inc hl |
|
- | 235 | ld d, (hl) ;D - Bufsize H |
|
- | 236 | ex de,hl ;HL - Bufsize |
|
- | 237 | ld d,b ;DE - sockaddr_in |
|
- | 238 | ld e,c ; |
|
- | 239 | ex af,af' |
|
- | 240 | /* |
|
- | 241 | A - SOCKET |
|
- | 242 | DE - указатель на структуру sockaddr_in, в неё помещается(ядром) IP-адрес и порт хоста отправившего данные. |
|
- | 243 | IX - указатель на буфер для принятия данных |
|
- | 244 | HL - размер буфера(в байтах) |
|
- | 245 | Возвращаемые значения в регистрах: |
|
- | 246 | HL - при отрицательном значении функция завершилась с ошибкой, |
|
- | 247 | про значении больше нуля возвращается действительный размер(в байтах) принятых данных, |
|
- | 248 | нулевого значения вызов не возвращает. |
|
- | 249 | А - errno при ошибке. |
|
- | 250 | */ |
|
- | 251 | ld c, CMD_WIZNETREAD |
|
- | 252 | push ix |
|
- | 253 | push iy |
|
- | 254 | call BDOS |
|
- | 255 | pop iy |
|
- | 256 | pop ix |
|
- | 257 | bit 7, h |
|
- | 258 | jp z, readok ;noerror just return |
|
- | 259 | ld l, a |
|
- | 260 | readok: |
|
- | 261 | readnot: |
|
- | 262 | ld ix,(store_ix) |
|
- | 263 | ret |
|
- | 264 | store_ix: |
|
218 | defb 0,0,0,0,0,0,0,0 |
265 | defb 0,0,0 |
219 | ENDMOD |
266 | ENDMOD |
220 | 267 | ||
221 | MODULE OS_BIND |
268 | MODULE OS_BIND |
222 | PUBLIC OS_BIND |
269 | PUBLIC OS_BIND |
223 | #include "sysdefs.asm" |
270 | #include "sysdefs.asm" |
Line 333... | Line 380... | ||
333 | ret |
380 | ret |
334 | ENDMOD |
381 | ENDMOD |
335 | 382 | ||
336 | MODULE OS_GETDNS |
383 | MODULE OS_GETDNS |
337 | PUBLIC OS_GETDNS |
384 | PUBLIC OS_GETDNS |
- | 385 | ||
338 | #include "sysdefs.asm" |
386 | #include "sysdefs.asm" |
339 | RSEG CODE |
387 | RSEG CODE |
340 | OS_GETDNS: |
388 | OS_GETDNS: |
341 | ld l,0x08 |
389 | ld l,0x08 |
342 | push ix |
390 | push ix |
Line 366... | Line 414... | ||
366 | ld a,l |
414 | ld a,l |
367 | pop iy |
415 | pop iy |
368 | pop ix |
416 | pop ix |
369 | ret |
417 | ret |
370 | ENDMOD |
418 | ENDMOD |
371 | - | ||
372 | MODULE LIB_DNS_RESOLVER |
- | |
373 | PUBLIC DNS_RESOLVER |
- | |
374 | EXTERN errno, OS_NETSOCKET, OS_NETSHUTDOWN, YIELD |
- | |
375 | EXTERN OS_NETCONNECT, OS_WIZNETREAD, OS_WIZNETWRITE |
- | |
376 | EXTERN OS_GETDNS |
- | |
377 | - | ||
378 | RSEG CODE |
- | |
379 | DNS_RESOLVER: ;DE-domain name |
- | |
380 | push ix |
- | |
381 | push de |
- | |
382 | ld de,dns_ia + 3 |
- | |
383 | call OS_GETDNS |
- | |
384 | ld hl,dns_head |
- | |
385 | ld de,dnsbuf |
- | |
386 | ld bc,6 |
- | |
387 | ldir |
- | |
388 | ex de,hl |
- | |
389 | ld de,dnsbuf+7 |
- | |
390 | ld (hl),0 |
- | |
391 | ld bc,256-7 |
- | |
392 | ldir |
- | |
393 | ld de,dnsbuf+12 |
- | |
394 | ld h,d |
- | |
395 | ld l,e |
- | |
396 | pop bc |
- | |
397 | name_loop: |
- | |
398 | inc hl |
- | |
399 | ld a,(bc) |
- | |
400 | ld (hl),a |
- | |
401 | inc bc |
- | |
402 | cp '.' |
- | |
403 | jr z,is_dot |
- | |
404 | or a |
- | |
405 | jr nz,name_loop |
- | |
406 | is_dot: |
- | |
407 | sbc hl,de |
- | |
408 | ex de,hl |
- | |
409 | dec e |
- | |
410 | ld (hl),e |
- | |
411 | inc e |
- | |
412 | add hl,de |
- | |
413 | ld d,h |
- | |
414 | ld e,l |
- | |
415 | or a |
- | |
416 | jr nz,name_loop |
- | |
417 | inc a |
- | |
418 | inc hl |
- | |
419 | inc hl |
- | |
420 | ld (hl),a |
- | |
421 | inc hl |
- | |
422 | inc hl |
- | |
423 | ld (hl),a |
- | |
424 | inc hl |
- | |
425 | push hl |
- | |
426 | - | ||
427 | ld de,0x0203 |
- | |
428 | call OS_NETSOCKET |
- | |
429 | ld (dnssoc),a |
- | |
430 | or a |
- | |
431 | jp m,exiterr |
- | |
432 | ;LD C,A |
- | |
433 | ;LD DE,dns_ia |
- | |
434 | ;CALL OS_NETCONNECT |
- | |
435 | ;or a |
- | |
436 | ;jp m,exiterr |
- | |
437 | - | ||
438 | pop hl |
- | |
439 | push hl |
- | |
440 | ld de,0xffff&(-dnsbuf) |
- | |
441 | add hl,de |
- | |
442 | PUSH HL |
- | |
443 | LD bc,(dnssoc) |
- | |
444 | LD ix,dnsbuf |
- | |
445 | ld de,dns_ia |
- | |
446 | CALL OS_WIZNETWRITE |
- | |
447 | pop af |
- | |
448 | bit 7,h |
- | |
449 | jr nz,exitcode |
- | |
450 | ld b,50 |
- | |
451 | push bc |
- | |
452 | jr recv_wait1 |
- | |
453 | recv_wait: |
- | |
454 | push bc |
- | |
455 | call YIELD |
- | |
456 | recv_wait1: |
- | |
457 | ld hl,256 |
- | |
458 | PUSH HL |
- | |
459 | LD bc,(dnssoc) |
- | |
460 | LD DE,dnsbuf |
- | |
461 | LD ix,dnsbuf |
- | |
462 | CALL OS_WIZNETREAD |
- | |
463 | pop af |
- | |
464 | pop bc |
- | |
465 | ;ld a,h |
- | |
466 | ;or l |
- | |
467 | bit 7,h |
- | |
468 | jr z,recv_wait_end |
- | |
469 | djnz recv_wait |
- | |
470 | ld a,54 ;ERR_CONNRESET |
- | |
471 | ld (errno),a |
- | |
472 | jr exiterr |
- | |
473 | recv_wait_end: |
- | |
474 | ld a,65 ;ERR_HOSTUNREACH |
- | |
475 | ld (errno),a |
- | |
476 | bit 7,h |
- | |
477 | jr nz,exitcode |
- | |
478 | ld a,(dnsbuf+3) |
- | |
479 | and 0x0f |
- | |
480 | jr nz,exiterr |
- | |
481 | exitcode: |
- | |
482 | LD BC,(dnssoc) |
- | |
483 | LD E,0 |
- | |
484 | CALL OS_NETSHUTDOWN |
- | |
485 | pop hl |
- | |
486 | pop ix |
- | |
487 | reqpars_l |
- | |
488 | inc hl |
- | |
489 | inc hl |
- | |
490 | inc hl |
- | |
491 | ld a,(hl) |
- | |
492 | ld de,7 |
- | |
493 | add hl,de |
- | |
494 | ld b,(hl) |
- | |
495 | inc hl |
- | |
496 | ld c,(hl) |
- | |
497 | inc hl |
- | |
498 | dec a |
- | |
499 | ret z |
- | |
500 | cp 4 |
- | |
501 | jr nz,exiterr1 |
- | |
502 | add hl,bc |
- | |
503 | jr reqpars_l |
- | |
504 | - | ||
505 | exiterr: |
- | |
506 | pop af |
- | |
507 | ld a,(errno) |
- | |
508 | push af |
- | |
509 | LD BC,(dnssoc) |
- | |
510 | LD E,0 |
- | |
511 | CALL OS_NETSHUTDOWN |
- | |
512 | pop af |
- | |
513 | ld (errno),a |
- | |
514 | pop ix |
- | |
515 | exiterr1: |
- | |
516 | ld hl,0 |
- | |
517 | ret |
- | |
518 | - | ||
519 | RSEG CONST |
- | |
520 | dns_head |
- | |
521 | defb 0x11,0x22,0x01,0x00,0x00,0x01 |
- | |
522 | dns_ia: |
- | |
523 | defb 0,0,53,8,8,8,8 |
- | |
524 | RSEG NO_INIT |
- | |
525 | dnssoc: |
- | |
526 | DEFS 1 |
- | |
527 | dnsbuf: |
- | |
528 | DEFS 256 |
- | |
529 | - | ||
530 | ENDMOD |
- | |
531 | - | ||
532 | - | ||
533 | END |
419 | END |