Rev 416 | Go to most recent revision | Details | Compare with Previous | Last modification | View Log | RSS feed
Rev | Author | Line No. | Line |
---|---|---|---|
405 | serge | 1 | |
2 | ;new_app_base equ 0x60400000 |
||
3 | ;PROC_BASE equ OS_BASE+0x0080000 |
||
4 | |||
5 | |||
6 | { .handle dd ? |
||
7 | .io_code dd ? |
||
8 | .input dd ? |
||
9 | .inp_size dd ? |
||
10 | .output dd ? |
||
11 | .out_size dd ? |
||
12 | } |
||
13 | |||
14 | |||
15 | |||
16 | ;public service_proc |
||
17 | ;public version |
||
18 | |||
19 | |||
20 | |||
21 | |||
22 | DRV_EXIT equ -1 |
||
23 | |||
24 | |||
413 | serge | 25 | IER_REG equ 1; x3f9 ;interrupt enable |
26 | IIR_REG equ 2; x3fA ;interrupt info |
||
27 | LCR_REG equ 3; x3FB ;line control |
||
28 | MCR_REG equ 4; x3FC ;modem control |
||
29 | LSR_REG equ 5; x3FD ;line status |
||
30 | MSR_REG equ 6; x3FE ;modem status |
||
31 | |||
405 | serge | 32 | |
33 | LCR_6BIT equ 0x01 |
||
34 | LCR_7BIT equ 0x02 |
||
35 | LCR_8BIT equ 0x03 |
||
36 | LCR_STOP_1 equ 0x00 |
||
37 | LCR_STOP_2 equ 0x04 |
||
38 | LCR_PARITY equ 0x08 |
||
39 | LCR_EVEN equ 0x10 |
||
40 | LCR_STICK equ 0x20 |
||
41 | LCR_BREAK equ 0x40 |
||
42 | LCR_DLAB equ 0x80 |
||
43 | |||
44 | |||
45 | LSR_OE equ 0x02 ;overrun error |
||
46 | LSR_PE equ 0x04 ;parity error |
||
47 | LSR_FE equ 0x08 ;framing error |
||
48 | LSR_BI equ 0x10 ;break interrupt |
||
49 | LSR_THRE equ 0x20 ;transmitter holding empty |
||
50 | LSR_TEMT equ 0x40 ;transmitter empty |
||
51 | LSR_FER equ 0x80 ;FIFO error |
||
52 | |||
53 | |||
54 | FCR_CRB equ 0x02 ;clear reciever FIFO |
||
55 | FCR_CXMIT equ 0x04 ;clear transmitter FIFO |
||
56 | FCR_RDY equ 0x08 ;set RXRDY and TXRDY pins |
||
57 | FCR_FIFO_1 equ 0x00 ;1 byte trigger |
||
58 | FCR_FIFO_4 equ 0x40 ;4 bytes trigger |
||
59 | FCR_FIFO_8 equ 0x80 ;8 bytes trigger |
||
60 | FCR_FIFO_14 equ 0xC0 ;14 bytes trigger |
||
61 | |||
62 | |||
63 | |||
64 | |||
65 | IER_THRI equ 0x02 ;transmitter empty interrupt |
||
66 | IER_LSI equ 0x04 ;line status interrupt |
||
67 | IER_MSI equ 0x08 ;modem status interrupt |
||
68 | |||
69 | |||
70 | MCR_RTS equ 0x02 ;0-> RTS=1, 1-> RTS=0 |
||
71 | MCR_OUT_1 equ 0x04 ;0-> OUT1=1, 1-> OUT1=0 |
||
72 | MCR_OUT_2 equ 0x08 ;0-> OUT2=1, 1-> OUT2=0; enable intr |
||
414 | serge | 73 | MCR_LOOP equ 0x10 ;lopback mode |
405 | serge | 74 | |
75 | |||
76 | MSR_DDSR equ 0x02 ;delta data set redy |
||
77 | MSR_TERI equ 0x04 ;trailinh edge of ring |
||
78 | MSR_DDCD equ 0x08 ;delta carrier detect |
||
79 | |||
80 | |||
81 | |||
82 | RATE_75 equ 1 |
||
83 | RATE_110 equ 2 |
||
84 | RATE_134 equ 3 |
||
85 | RATE_150 equ 4 |
||
86 | RATE_300 equ 5 |
||
87 | RATE_600 equ 6 |
||
88 | RATE_1200 equ 7 |
||
89 | RATE_1800 equ 8 |
||
90 | RATE_2000 equ 9 |
||
91 | RATE_2400 equ 10 |
||
92 | RATE_3600 equ 11 |
||
93 | RATE_4800 equ 12 |
||
94 | RATE_7200 equ 13 |
||
95 | RATE_9600 equ 14 |
||
96 | RATE_19200 equ 15 |
||
97 | RATE_38400 equ 16 |
||
98 | RATE_57600 equ 17 |
||
99 | RATE_115200 equ 18 |
||
100 | |||
101 | |||
413 | serge | 102 | COM_2 equ 2 |
103 | COM_3 equ 3 |
||
104 | COM_4 equ 4 |
||
105 | COM_MAX equ 2 ;only two port supported |
||
106 | |||
405 | serge | 107 | |
413 | serge | 108 | COM_2_BASE equ 0x2F8 |
109 | |||
110 | |||
405 | serge | 111 | COM_2_IRQ equ 3 |
112 | |||
113 | |||
413 | serge | 114 | UART_TRANSMIT equ 1 |
115 | UART_STOP equ 2 |
||
414 | serge | 116 | |
405 | serge | 117 | |
413 | serge | 118 | { |
405 | serge | 119 | .lock dd ? |
413 | serge | 120 | .base dd ? |
405 | serge | 121 | .lcr_reg dd ? |
122 | .mcr_reg dd ? |
||
123 | .rate dd ? |
||
124 | .mode dd ? |
||
125 | .state dd ? |
||
126 | |||
127 | |||
416 | serge | 128 | .rcvr_rp dd ? |
405 | serge | 129 | .rcvr_wp dd ? |
130 | .rcvr_count dd ? |
||
416 | serge | 131 | .rcvr_top dd ? |
132 | |||
405 | serge | 133 | |
414 | serge | 134 | .xmit_rp dd ? |
405 | serge | 135 | .xmit_wp dd ? |
136 | .xmit_count dd ? |
||
414 | serge | 137 | .xmit_free dd ? |
405 | serge | 138 | .xmit_top dd ? |
414 | serge | 139 | } |
405 | serge | 140 | virtual at 0 |
141 | UART UART |
||
413 | serge | 142 | end virtual |
405 | serge | 143 | |
144 | |||
416 | serge | 145 | |
405 | serge | 146 | |
413 | serge | 147 | { |
148 | .magic dd ? ;'CNCT' |
||
149 | .destroy dd ? ;internal destructor |
||
150 | .fd dd ? ;next object in list |
||
151 | .bk dd ? ;prev object in list |
||
152 | .pid dd ? ;owner id |
||
153 | |||
405 | serge | 154 | |
413 | serge | 155 | .uart dd ? ;uart pointer |
156 | } |
||
157 | |||
158 | |||
159 | CONNECTION CONNECTION |
||
160 | end virtual |
||
161 | |||
162 | |||
163 | |||
164 | |||
165 | |||
166 | |||
417 | serge | 167 | |
168 | |||
169 | jne .stop |
||
170 | |||
171 | |||
413 | serge | 172 | call malloc |
405 | serge | 173 | test eax, eax |
174 | jz .fail |
||
175 | |||
176 | |||
177 | mov edi, eax |
||
178 | mov ecx, UART_SIZE/4 |
||
413 | serge | 179 | xor eax, eax |
405 | serge | 180 | cld |
181 | rep stosd |
||
182 | |||
183 | |||
413 | serge | 184 | mov [eax+UART.base], COM_1_BASE |
185 | |||
405 | serge | 186 | |
416 | serge | 187 | |
413 | serge | 188 | |
414 | serge | 189 | mov edx, eax |
190 | |||
416 | serge | 191 | |
192 | add eax, 8192 |
||
193 | mov [edi+UART.rcvr_top], eax |
||
194 | add eax, 8192 |
||
195 | mov [edi+UART.xmit_buff], eax |
||
414 | serge | 196 | add eax, 8192 |
197 | mov [edi+UART.xmit_top], eax |
||
198 | |||
199 | |||
200 | test eax, eax |
||
201 | jz .fail |
||
202 | |||
203 | |||
204 | or eax, PG_SW |
||
205 | mov [page_tabs+edx*4], eax |
||
206 | mov [page_tabs+edx*4+8], eax |
||
207 | |||
208 | |||
209 | test eax, eax |
||
210 | jz .fail |
||
211 | |||
212 | |||
213 | mov [page_tabs+edx*4+4], eax |
||
214 | mov [page_tabs+edx*4+12], eax |
||
215 | |||
216 | |||
416 | serge | 217 | test eax, eax |
218 | jz .fail |
||
219 | |||
220 | |||
221 | mov [page_tabs+edx*4+16], eax |
||
222 | mov [page_tabs+edx*4+24], eax |
||
223 | |||
224 | |||
225 | test eax, eax |
||
226 | jz .fail |
||
227 | |||
228 | |||
229 | mov [page_tabs+edx*4+20], eax |
||
230 | mov [page_tabs+edx*4+28], eax |
||
231 | |||
232 | |||
233 | invlpg [eax] |
||
414 | serge | 234 | invlpg [eax+0x1000] |
235 | invlpg [eax+0x2000] |
||
236 | invlpg [eax+0x3000] |
||
237 | invlpg [eax+0x4000] |
||
416 | serge | 238 | invlpg [eax+0x5000] |
239 | invlpg [eax+0x6000] |
||
240 | invlpg [eax+0x7000] |
||
241 | |||
414 | serge | 242 | |
243 | call uart_reset.internal ;eax= uart |
||
244 | |||
245 | |||
413 | serge | 246 | stdcall reg_service, sz_uart_srv, uart_proc |
405 | serge | 247 | mov [eax+SRV.entry], init_uart_service |
417 | serge | 248 | ret |
405 | serge | 249 | .fail: |
250 | .stop: |
||
417 | serge | 251 | xor eax, eax |
405 | serge | 252 | ret |
253 | endp |
||
417 | serge | 254 | |
405 | serge | 255 | |
417 | serge | 256 | |
405 | serge | 257 | io_code equ IOCTL.io_code |
258 | input equ IOCTL.input |
||
259 | inp_size equ IOCTL.inp_size |
||
260 | output equ IOCTL.output |
||
261 | out_size equ IOCTL.out_size |
||
262 | |||
263 | |||
264 | PORT_OPEN equ 1 |
||
265 | PORT_CLOSE equ 2 |
||
266 | PORT_RESET equ 3 |
||
267 | PORT_SETMODE equ 4 |
||
268 | PORT_GETMODE equ 5 |
||
269 | PORT_SETMCR equ 6 |
||
270 | PORT_GETMCR equ 7 |
||
271 | PORT_READ equ 8 |
||
272 | PORT_WRITE equ 9 |
||
273 | |||
274 | |||
275 | proc uart_proc stdcall, ioctl:dword |
||
276 | |||
277 | |||
278 | mov eax, [ebx+io_code] |
||
279 | cmp eax, PORT_WRITE |
||
280 | ja .fail |
||
281 | |||
282 | |||
283 | jne @F |
||
284 | |||
285 | |||
286 | mov [eax], dword UART_VERSION |
||
287 | xor eax, eax |
||
288 | ret |
||
289 | @@: |
||
290 | cmp eax, PORT_OPEN |
||
291 | jne @F |
||
292 | |||
293 | |||
413 | serge | 294 | mov eax, [ebx] |
295 | call uart_open |
||
296 | mov ebx, [ioctl] |
||
297 | mov ebx, [ebx+output] |
||
298 | mov [ebx], ecx |
||
299 | ret |
||
405 | serge | 300 | @@: |
413 | serge | 301 | mov esi, [ebx+input] ;input buffer |
302 | mov edi, [ebx+output] |
||
414 | serge | 303 | call [uart_func+eax*4] |
413 | serge | 304 | ret |
305 | .fail: |
||
405 | serge | 306 | or eax, -1 |
307 | ret |
||
308 | |||
309 | |||
310 | |||
311 | |||
312 | restore io_code |
||
313 | restore input |
||
314 | restore inp_size |
||
315 | restore output |
||
316 | restore out_size |
||
317 | |||
318 | |||
319 | |||
414 | serge | 320 | ; esi= input buffer |
321 | ; +0 connection |
||
322 | ; |
||
323 | ; retval |
||
324 | ; eax= error code |
||
325 | |||
326 | |||
327 | uart_reset: |
||
328 | mov eax, [esi] |
||
329 | cmp [eax+APPOBJ.magic], 'CNCT' |
||
330 | jne .fail |
||
331 | |||
332 | |||
333 | jne .fail |
||
334 | |||
335 | |||
336 | test eax, eax |
||
337 | jz .fail |
||
338 | |||
339 | |||
413 | serge | 340 | ; disable DTR & RTS |
341 | ; clear FIFO |
||
342 | ; clear pending interrupts |
||
343 | ; |
||
344 | ; param |
||
405 | serge | 345 | ; eax= uart |
413 | serge | 346 | |
405 | serge | 347 | |
348 | .internal: |
||
414 | serge | 349 | mov esi, eax |
413 | serge | 350 | mov [eax+UART.state], UART_CLOSED |
351 | mov edx, [eax+UART.base] |
||
352 | add edx, MCR_REG |
||
353 | xor eax, eax |
||
405 | serge | 354 | out dx, al ;clear DTR & RTS |
413 | serge | 355 | |
405 | serge | 356 | |
413 | serge | 357 | mov ebx, RATE_2400 |
358 | mov ecx, LCR_8BIT+LCR_STOP_1 |
||
359 | call uart_set_mode.internal |
||
360 | |||
405 | serge | 361 | |
413 | serge | 362 | add edx, IIR_REG |
363 | mov eax,FCR_EFIFO+FCR_CRB+FCR_CXMIT+FCR_FIFO_14 |
||
405 | serge | 364 | out dx, al |
365 | .clear_RB: |
||
366 | mov edx, [esi+UART.base] |
||
413 | serge | 367 | add edx, LSR_REG |
368 | in al, dx |
||
405 | serge | 369 | test eax, LSR_DR |
370 | jz @F |
||
371 | |||
372 | |||
413 | serge | 373 | in al, dx |
405 | serge | 374 | jmp .clear_RB |
375 | @@: |
||
376 | mov edx, [esi+UART.base] |
||
413 | serge | 377 | add edx, IER_REG |
378 | mov eax,IER_RDAI+IER_THRI+IER_LSI |
||
405 | serge | 379 | out dx, al |
380 | .clear_IIR: |
||
381 | mov edx, [esi+UART.base] |
||
413 | serge | 382 | add edx, IIR_REG |
383 | in al, dx |
||
405 | serge | 384 | test al, IIR_INTR |
385 | jnz .done |
||
386 | |||
387 | |||
388 | and eax, 3 |
||
389 | jnz @F |
||
390 | |||
391 | |||
413 | serge | 392 | add edx, MSR_REG |
393 | in al, dx |
||
405 | serge | 394 | jmp .clear_IIR |
395 | @@: |
||
396 | cmp eax, 1 |
||
397 | je .clear_IIR |
||
398 | |||
399 | |||
400 | jne @F |
||
401 | |||
402 | |||
413 | serge | 403 | in al, dx |
405 | serge | 404 | jmp .clear_IIR |
405 | @@: |
||
406 | mov edx, [esi+UART.base] |
||
413 | serge | 407 | add edx, LSR_REG |
408 | in al, dx |
||
405 | serge | 409 | jmp .clear_IIR |
410 | .done: |
||
411 | mov edi, [esi+UART.rcvr_buff] |
||
416 | serge | 412 | mov ecx, 8192/4 |
414 | serge | 413 | xor eax, eax |
405 | serge | 414 | |
415 | |||
416 | serge | 416 | mov [esi+UART.rcvr_wp], edi |
417 | mov [esi+UART.rcvr_count], eax |
||
418 | |||
419 | |||
420 | rep stosd |
||
421 | |||
422 | |||
423 | mov ecx, 8192/4 |
||
424 | |||
425 | |||
414 | serge | 426 | mov [esi+UART.xmit_wp], edi |
427 | mov [esi+UART.xmit_count], eax |
||
428 | mov [esi+UART.xmit_free], 8192 |
||
429 | |||
405 | serge | 430 | |
431 | ret ;eax= 0 |
||
416 | serge | 432 | .fail: |
414 | serge | 433 | or eax, -1 |
434 | ret |
||
435 | |||
405 | serge | 436 | |
437 | ; esi= input buffer |
||
413 | serge | 438 | ; +0 connection |
439 | ; +4 rate |
||
440 | ; +8 mode |
||
441 | ; |
||
442 | ; retval |
||
443 | ; eax= error code |
||
444 | |||
405 | serge | 445 | |
446 | uart_set_mode: |
||
413 | serge | 447 | mov eax, [esi] |
448 | cmp [eax+APPOBJ.magic], 'CNCT' |
||
449 | jne .fail |
||
450 | |||
451 | |||
452 | jne .fail |
||
453 | |||
454 | |||
455 | test eax, eax |
||
456 | jz .fail |
||
457 | |||
458 | |||
459 | mov ecx, [esi+8] |
||
460 | |||
461 | |||
462 | ; eax= uart |
||
463 | ; ebx= baud rate |
||
464 | ; ecx= mode |
||
465 | |||
466 | |||
467 | .internal: |
||
468 | cmp ebx, RATE_115200 |
||
469 | ja .fail |
||
405 | serge | 470 | |
471 | |||
413 | serge | 472 | jae .fail |
405 | serge | 473 | |
474 | |||
413 | serge | 475 | mov [eax+UART.mode], ecx |
476 | |||
405 | serge | 477 | |
413 | serge | 478 | mov bx, [divisor+ebx*2] |
479 | |||
405 | serge | 480 | |
413 | serge | 481 | push edx |
482 | add edx, LCR_REG |
||
483 | in al, dx |
||
405 | serge | 484 | or al, 0x80 |
485 | out dx, al |
||
486 | |||
487 | |||
413 | serge | 488 | mov al, bl |
489 | out dx, al |
||
405 | serge | 490 | |
491 | |||
492 | mov al, bh |
||
413 | serge | 493 | out dx, al |
405 | serge | 494 | |
495 | |||
413 | serge | 496 | mov eax, ecx |
497 | out dx, al |
||
405 | serge | 498 | xor eax, eax |
413 | serge | 499 | ret |
500 | .fail: |
||
405 | serge | 501 | or eax, -1 |
413 | serge | 502 | ret |
405 | serge | 503 | |
504 | |||
414 | serge | 505 | ; esi= input buffer |
506 | ; +0 connection |
||
507 | ; +4 modem control reg valie |
||
508 | ; |
||
509 | ; retval |
||
510 | ; eax= error code |
||
511 | |||
413 | serge | 512 | |
513 | uart_set_mcr: |
||
414 | serge | 514 | |
413 | serge | 515 | |
414 | serge | 516 | cmp [eax+APPOBJ.magic], 'CNCT' |
517 | jne .fail |
||
518 | |||
519 | |||
520 | jne .fail |
||
521 | |||
522 | |||
523 | test eax, eax |
||
524 | jz .fail |
||
525 | |||
526 | |||
527 | |||
528 | |||
413 | serge | 529 | mov edx, [eax+UART.base] |
530 | add edx, MCR_REG |
||
531 | mov al, bl |
||
532 | out dx, al |
||
533 | xor eax, eax |
||
414 | serge | 534 | ret |
413 | serge | 535 | .fail: |
414 | serge | 536 | or eax, -1 |
537 | ret |
||
538 | |||
413 | serge | 539 | |
405 | serge | 540 | ; eax= port |
413 | serge | 541 | ; |
542 | ; retval |
||
543 | ; ecx= connection |
||
544 | ; eax= error code |
||
545 | |||
405 | serge | 546 | |
547 | uart_open: |
||
413 | serge | 548 | dec eax |
549 | cmp eax, COM_MAX |
||
550 | jae .fail |
||
551 | |||
552 | |||
553 | push esi |
||
554 | .do_wait: |
||
555 | cmp dword [esi+UART.lock],0 |
||
556 | je .get_lock |
||
557 | call change_task |
||
558 | jmp .do_wait |
||
559 | .get_lock: |
||
560 | mov eax, 1 |
||
561 | xchg eax, [esi+UART.lock] |
||
562 | test eax, eax |
||
563 | jnz .do_wait |
||
564 | |||
565 | |||
566 | call uart_reset.internal |
||
414 | serge | 567 | |
413 | serge | 568 | |
569 | shl ebx, 5 |
||
570 | mov ebx, [CURRENT_TASK+ebx+4] |
||
571 | mov eax, CONNECTION_SIZE |
||
572 | call create_kernel_object |
||
573 | pop esi ;uart |
||
574 | test eax, eax |
||
575 | jz .fail |
||
576 | |||
577 | |||
578 | mov [eax+APPOBJ.destroy], uart_close.destroy |
||
579 | mov [eax+CONNECTION.uart], esi |
||
580 | mov ecx, eax |
||
581 | xor eax, eax |
||
582 | ret |
||
583 | .fail: |
||
584 | or eax, -1 |
||
585 | ret |
||
586 | restore .uart |
||
587 | |||
588 | |||
589 | ; esi= input buffer |
||
590 | |||
591 | |||
592 | uart_close: |
||
593 | mov eax, [esi] |
||
594 | cmp [eax+APPOBJ.magic], 'CNCT' |
||
595 | jne .fail |
||
596 | |||
597 | |||
598 | jne .fail |
||
599 | .destroy: |
||
600 | push [eax+CONNECTION.uart] |
||
601 | call destroy_kernel_object ;eax= object |
||
602 | pop eax ;eax= uart |
||
603 | test eax, eax |
||
604 | jz .fail |
||
605 | |||
606 | |||
607 | mov [eax+UART.lock], 0 ;release port |
||
608 | xor eax, eax |
||
609 | ret |
||
610 | .fail: |
||
611 | or eax, -1 |
||
612 | ret |
||
613 | |||
614 | |||
615 | |||
616 | ; eax= uart |
||
617 | ; ebx= baud rate |
||
618 | |||
619 | |||
620 | set_rate: |
||
405 | serge | 621 | cmp ebx, RATE_115200 |
413 | serge | 622 | ja .fail |
405 | serge | 623 | |
624 | |||
413 | serge | 625 | mov bx, [divisor+ebx*2] |
626 | |||
405 | serge | 627 | |
413 | serge | 628 | add edx, LCR_REG |
629 | in al, dx |
||
405 | serge | 630 | push eax |
413 | serge | 631 | or al, 0x80 |
405 | serge | 632 | out dx, al |
633 | |||
634 | |||
413 | serge | 635 | mov al, bl |
405 | serge | 636 | out dx, al |
637 | |||
638 | |||
413 | serge | 639 | mov al, bh |
405 | serge | 640 | out dx, al |
641 | |||
642 | |||
413 | serge | 643 | add edx, LCR_REG-1 |
644 | out dx, al |
||
405 | serge | 645 | .fail: |
646 | ret |
||
647 | |||
648 | |||
413 | serge | 649 | |
650 | ; ebx= uart |
||
651 | |||
652 | |||
405 | serge | 653 | transmit: |
654 | push esi |
||
655 | push edi |
||
413 | serge | 656 | |
405 | serge | 657 | |
413 | serge | 658 | |
405 | serge | 659 | |
660 | cli |
||
661 | |||
662 | |||
413 | serge | 663 | mov ecx, [ebx+UART.xmit_count] |
414 | serge | 664 | test ecx, ecx |
665 | je .stop |
||
666 | |||
405 | serge | 667 | |
414 | serge | 668 | jbe @F |
669 | mov ecx, 16 |
||
670 | @@: |
||
405 | serge | 671 | sub [ebx+UART.xmit_count], ecx |
414 | serge | 672 | add [ebx+UART.xmit_free], ecx |
673 | cld |
||
674 | @@: |
||
675 | lodsb |
||
676 | out dx, al |
||
405 | serge | 677 | dec ecx |
414 | serge | 678 | jnz @B |
679 | |||
405 | serge | 680 | |
414 | serge | 681 | jb @F |
682 | sub esi, 8192 |
||
683 | @@: |
||
684 | mov [ebx+UART.xmit_rp], esi |
||
413 | serge | 685 | |
414 | serge | 686 | |
687 | je .stop |
||
688 | |||
689 | |||
413 | serge | 690 | jmp @F |
414 | serge | 691 | .stop: |
692 | mov [ebx+UART.state], UART_STOP |
||
693 | @@: |
||
694 | popfd |
||
405 | serge | 695 | pop edi |
413 | serge | 696 | pop esi |
405 | serge | 697 | ret |
698 | |||
699 | |||
414 | serge | 700 | |
413 | serge | 701 | ; esi= input buffer |
414 | serge | 702 | ; +0 connection |
703 | ; +4 dst buffer |
||
704 | ; +8 dst size |
||
705 | ; edi= output buffer |
||
706 | ; +0 bytes read |
||
707 | |||
708 | |||
709 | ; eax= error code |
||
710 | |||
711 | |||
712 | uart_read: |
||
713 | mov eax, [esi] |
||
714 | cmp [eax+APPOBJ.magic], 'CNCT' |
||
715 | jne .fail |
||
716 | |||
717 | |||
718 | jne .fail |
||
719 | |||
720 | |||
721 | test eax, eax |
||
722 | jz .fail |
||
723 | |||
724 | |||
725 | mov ecx, [eax+UART.rcvr_count] |
||
416 | serge | 726 | cmp ecx, ebx |
414 | serge | 727 | jbe @F |
728 | mov ecx, ebx |
||
729 | @@: |
||
730 | mov [edi], ecx ;bytes read |
||
731 | test ecx, ecx |
||
732 | jz .done |
||
733 | |||
734 | |||
416 | serge | 735 | |
414 | serge | 736 | |
737 | mov esi, [eax+UART.rcvr_rp] |
||
416 | serge | 738 | cld |
414 | serge | 739 | rep movsb |
416 | serge | 740 | pop ecx |
741 | |||
742 | |||
743 | jb @F |
||
744 | sub esi, 8192 |
||
745 | @@: |
||
414 | serge | 746 | mov [eax+UART.rcvr_rp], esi |
416 | serge | 747 | sub [eax+UART.rcvr_count], ecx |
748 | .done: |
||
414 | serge | 749 | xor eax, eax |
750 | ret |
||
416 | serge | 751 | .fail: |
414 | serge | 752 | or eax, -1 |
753 | ret |
||
754 | |||
755 | |||
756 | ; esi= input buffer |
||
757 | ; +0 connection |
||
758 | ; +4 src buffer |
||
759 | ; +8 src size |
||
760 | ; |
||
761 | ; retval |
||
762 | ; eax= error code |
||
763 | |||
764 | |||
765 | uart_write: |
||
766 | mov eax, [esi] |
||
767 | cmp [eax+APPOBJ.magic], 'CNCT' |
||
768 | jne .fail |
||
769 | |||
770 | |||
771 | jne .fail |
||
772 | |||
773 | |||
774 | test eax, eax |
||
775 | jz .fail |
||
776 | |||
777 | |||
778 | mov edx, [esi+8] |
||
779 | |||
780 | |||
781 | ; eax= uart |
||
413 | serge | 782 | ; ebx= src |
783 | ; edx= count |
||
784 | |||
405 | serge | 785 | |
786 | .internal: |
||
414 | serge | 787 | mov esi, ebx |
413 | serge | 788 | mov edi, [eax+UART.xmit_wp] |
789 | .write: |
||
405 | serge | 790 | test edx, edx |
413 | serge | 791 | jz .fail |
414 | serge | 792 | .wait: |
405 | serge | 793 | cmp [eax+UART.xmit_free], 0 |
413 | serge | 794 | jne .fill |
405 | serge | 795 | |
796 | |||
413 | serge | 797 | je .wait |
405 | serge | 798 | |
799 | |||
413 | serge | 800 | push edx |
801 | call transmit |
||
405 | serge | 802 | pop edx |
413 | serge | 803 | mov eax, ebx |
804 | jmp .write |
||
405 | serge | 805 | .fill: |
806 | mov ecx, [eax+UART.xmit_free] |
||
413 | serge | 807 | cmp ecx, edx |
808 | jbe @F |
||
809 | mov ecx, edx |
||
810 | @@: |
||
405 | serge | 811 | push ecx |
414 | serge | 812 | cld |
813 | rep movsb |
||
814 | pop ecx |
||
815 | sub [eax+UART.xmit_free], ecx |
||
413 | serge | 816 | add [eax+UART.xmit_count], ecx |
414 | serge | 817 | sub edx, ecx |
413 | serge | 818 | jnz .wait |
414 | serge | 819 | .done: |
405 | serge | 820 | cmp edi, [eax+UART.xmit_top] |
414 | serge | 821 | jb @F |
822 | sub edi, 8192 |
||
823 | @@: |
||
824 | mov [eax+UART.xmit_wp], edi |
||
413 | serge | 825 | cmp [eax+UART.state], UART_TRANSMIT |
826 | je @F |
||
405 | serge | 827 | mov ebx, eax |
413 | serge | 828 | call transmit |
405 | serge | 829 | @@: |
830 | xor eax, eax |
||
414 | serge | 831 | ret |
405 | serge | 832 | .fail: |
414 | serge | 833 | or eax, -1 |
834 | ret |
||
835 | |||
405 | serge | 836 | |
414 | serge | 837 | |
405 | serge | 838 | com_2_isr: |
413 | serge | 839 | mov ebx, [com2] |
840 | jmp com_1_isr.get_info |
||
841 | align 4 |
||
842 | com_1_isr: |
||
843 | mov ebx, [com1] |
||
844 | .get_info: |
||
405 | serge | 845 | mov edx, [ebx+UART.base] |
413 | serge | 846 | add edx, IIR_REG |
847 | in al, dx |
||
405 | serge | 848 | |
849 | |||
850 | jnz .done |
||
851 | |||
852 | |||
853 | and eax, 3 |
||
854 | |||
855 | |||
856 | jmp .get_info |
||
857 | .done: |
||
858 | ret |
||
859 | |||
860 | |||
861 | isr_line: |
||
862 | mov edx, [ebx+UART.base] |
||
413 | serge | 863 | add edx, LSR_REG |
864 | in al, dx |
||
405 | serge | 865 | ret |
866 | |||
867 | |||
868 | isr_recieve: |
||
869 | mov esi, [ebx+UART.base] |
||
416 | serge | 870 | add esi, LSR_REG |
871 | mov edi, [ebx+UART.rcvr_wp] |
||
872 | xor ecx, ecx |
||
873 | cld |
||
874 | .read: |
||
875 | mov edx, esi |
||
876 | in al, dx |
||
877 | test eax, LSR_DR |
||
878 | jz .done |
||
879 | |||
880 | |||
413 | serge | 881 | in al, dx |
405 | serge | 882 | stosb |
416 | serge | 883 | inc ecx |
884 | jmp .read |
||
885 | .done: |
||
886 | cmp edi, [ebx+UART.rcvr_top] |
||
887 | jb @F |
||
888 | sub edi, 8192 |
||
889 | @@: |
||
890 | mov [ebx+UART.rcvr_wp], edi |
||
891 | add [ebx+UART.rcvr_count], ecx |
||
892 | ret |
||
405 | serge | 893 | |
894 | |||
895 | isr_modem: |
||
896 | mov edx, [ebx+UART.base] |
||
413 | serge | 897 | add edx, MSR_REG |
898 | in al, dx |
||
899 | ret |
||
900 | |||
405 | serge | 901 | |
902 | |||
413 | serge | 903 | com1 dd 0 |
904 | com2 dd 0 |
||
905 | |||
405 | serge | 906 | |
907 | uart_func dd 0 ;SRV_GETVERSION |
||
413 | serge | 908 | dd 0 ;PORT_OPEN |
909 | dd uart_close ;PORT_CLOSE |
||
910 | dd uart_reset ;PORT_RESET |
||
414 | serge | 911 | dd uart_set_mode ;PORT_SETMODE |
413 | serge | 912 | dd 0 ;PORT_GETMODE |
414 | serge | 913 | dd uart_set_mcr ;PORT_SETMODEM |
914 | dd 0 ;PORT_GETMODEM |
||
915 | dd uart_read ;PORT_READ |
||
916 | dd uart_write ;PORT_WRITE |
||
917 | |||
405 | serge | 918 | |
919 | dd transmit |
||
920 | dd isr_recieve |
||
921 | dd isr_line |
||
922 | |||
923 | |||
413 | serge | 924 | |
405 | serge | 925 | |
926 | dw 192, 96, 64, 58, 48, 32 |
||
927 | dw 24, 16, 12, 6, 3, 2, 1 |
||
928 | |||
929 | |||
930 | |||
931 | |||
932 |