Subversion Repositories NedoOS

Rev

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