Subversion Repositories Kolibri OS

Rev

Rev 414 | 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
 
167
           mov eax, UART_SIZE
168
           call malloc
405 serge 169
           test eax, eax
170
           jz .fail
171
172
 
173
           mov edi, eax
174
           mov ecx, UART_SIZE/4
413 serge 175
           xor eax, eax
405 serge 176
           cld
177
           rep stosd
178
179
 
413 serge 180
           mov [eax+UART.base], COM_1_BASE
181
405 serge 182
 
416 serge 183
413 serge 184
 
414 serge 185
           mov edx, eax
186
416 serge 187
 
188
           add eax, 8192
189
           mov [edi+UART.rcvr_top], eax
190
           add eax, 8192
191
           mov [edi+UART.xmit_buff], eax
414 serge 192
           add eax, 8192
193
           mov [edi+UART.xmit_top], eax
194
195
 
196
           test eax, eax
197
           jz .fail
198
199
 
200
           or eax, PG_SW
201
           mov [page_tabs+edx*4], eax
202
           mov [page_tabs+edx*4+8], eax
203
204
 
205
           test eax, eax
206
           jz .fail
207
208
 
209
           mov [page_tabs+edx*4+4], eax
210
           mov [page_tabs+edx*4+12], eax
211
212
 
416 serge 213
           test eax, eax
214
           jz .fail
215
216
 
217
           mov [page_tabs+edx*4+16], eax
218
           mov [page_tabs+edx*4+24], eax
219
220
 
221
           test eax, eax
222
           jz .fail
223
224
 
225
           mov [page_tabs+edx*4+20], eax
226
           mov [page_tabs+edx*4+28], eax
227
228
 
229
           invlpg [eax]
414 serge 230
           invlpg [eax+0x1000]
231
           invlpg [eax+0x2000]
232
           invlpg [eax+0x3000]
233
           invlpg [eax+0x4000]
416 serge 234
           invlpg [eax+0x5000]
235
           invlpg [eax+0x6000]
236
           invlpg [eax+0x7000]
237
414 serge 238
 
239
           call uart_reset.internal   ;eax= uart
240
241
 
413 serge 242
           stdcall reg_service, sz_uart_srv, uart_proc
405 serge 243
           ret
244
.fail:
245
           xor eax, eax
246
           ret
247
248
 
249
io_code    equ  IOCTL.io_code
250
input      equ  IOCTL.input
251
inp_size   equ  IOCTL.inp_size
252
output     equ  IOCTL.output
253
out_size   equ  IOCTL.out_size
254
255
 
256
PORT_OPEN       equ 1
257
PORT_CLOSE      equ 2
258
PORT_RESET      equ 3
259
PORT_SETMODE    equ 4
260
PORT_GETMODE    equ 5
261
PORT_SETMCR     equ 6
262
PORT_GETMCR     equ 7
263
PORT_READ       equ 8
264
PORT_WRITE      equ 9
265
266
 
267
proc uart_proc stdcall, ioctl:dword
268
269
 
270
           mov eax, [ebx+io_code]
271
           cmp eax, PORT_WRITE
272
           ja .fail
273
274
 
275
           jne @F
276
277
 
278
           mov [eax], dword UART_VERSION
279
           xor eax, eax
280
           ret
281
@@:
282
           cmp eax, PORT_OPEN
283
           jne @F
284
285
 
413 serge 286
           mov eax, [ebx]
287
           call uart_open
288
           mov ebx, [ioctl]
289
           mov ebx, [ebx+output]
290
           mov [ebx], ecx
291
           ret
405 serge 292
@@:
413 serge 293
           mov esi, [ebx+input]     ;input buffer
294
           mov edi, [ebx+output]
414 serge 295
           call [uart_func+eax*4]
413 serge 296
           ret
297
.fail:
405 serge 298
           or eax, -1
299
           ret
300
301
 
302
303
 
304
restore   io_code
305
restore   input
306
restore   inp_size
307
restore   output
308
restore   out_size
309
310
 
311
 
414 serge 312
;  esi=  input buffer
313
;        +0 connection
314
;
315
; retval
316
;  eax= error code
317
318
 
319
uart_reset:
320
           mov eax, [esi]
321
           cmp [eax+APPOBJ.magic], 'CNCT'
322
           jne .fail
323
324
 
325
           jne .fail
326
327
 
328
           test eax, eax
329
           jz .fail
330
331
 
413 serge 332
; disable DTR & RTS
333
; clear FIFO
334
; clear pending interrupts
335
;
336
; param
405 serge 337
;  eax= uart
413 serge 338
405 serge 339
 
340
.internal:
414 serge 341
           mov esi, eax
413 serge 342
           mov [eax+UART.state], UART_CLOSED
343
           mov edx, [eax+UART.base]
344
           add edx, MCR_REG
345
           xor eax, eax
405 serge 346
           out dx, al        ;clear DTR & RTS
413 serge 347
405 serge 348
 
413 serge 349
           mov ebx, RATE_2400
350
           mov ecx, LCR_8BIT+LCR_STOP_1
351
           call uart_set_mode.internal
352
405 serge 353
 
413 serge 354
           add edx, IIR_REG
355
           mov eax,FCR_EFIFO+FCR_CRB+FCR_CXMIT+FCR_FIFO_14
405 serge 356
           out dx, al
357
.clear_RB:
358
           mov edx, [esi+UART.base]
413 serge 359
           add edx, LSR_REG
360
           in al, dx
405 serge 361
           test eax, LSR_DR
362
           jz @F
363
364
 
413 serge 365
           in al, dx
405 serge 366
           jmp .clear_RB
367
@@:
368
           mov edx, [esi+UART.base]
413 serge 369
           add edx, IER_REG
370
           mov eax,IER_RDAI+IER_THRI+IER_LSI
405 serge 371
           out dx, al
372
.clear_IIR:
373
           mov edx, [esi+UART.base]
413 serge 374
           add edx, IIR_REG
375
           in al, dx
405 serge 376
           test al, IIR_INTR
377
           jnz .done
378
379
 
380
           and eax, 3
381
           jnz @F
382
383
 
413 serge 384
           add edx, MSR_REG
385
           in al, dx
405 serge 386
           jmp .clear_IIR
387
@@:
388
           cmp eax, 1
389
           je .clear_IIR
390
391
 
392
           jne @F
393
394
 
413 serge 395
           in al, dx
405 serge 396
           jmp .clear_IIR
397
@@:
398
           mov edx, [esi+UART.base]
413 serge 399
           add edx, LSR_REG
400
           in al, dx
405 serge 401
           jmp .clear_IIR
402
.done:
403
           mov edi, [esi+UART.rcvr_buff]
416 serge 404
           mov ecx, 8192/4
414 serge 405
           xor eax, eax
405 serge 406
407
 
416 serge 408
           mov [esi+UART.rcvr_wp], edi
409
           mov [esi+UART.rcvr_count], eax
410
411
 
412
           rep stosd
413
414
 
415
           mov ecx, 8192/4
416
417
 
414 serge 418
           mov [esi+UART.xmit_wp], edi
419
           mov [esi+UART.xmit_count], eax
420
           mov [esi+UART.xmit_free], 8192
421
405 serge 422
 
423
           ret               ;eax= 0
416 serge 424
.fail:
414 serge 425
           or eax, -1
426
           ret
427
405 serge 428
 
429
;  esi=  input buffer
413 serge 430
;        +0 connection
431
;        +4 rate
432
;        +8 mode
433
;
434
; retval
435
;  eax= error code
436
405 serge 437
 
438
uart_set_mode:
413 serge 439
           mov eax, [esi]
440
           cmp [eax+APPOBJ.magic], 'CNCT'
441
           jne .fail
442
443
 
444
           jne .fail
445
446
 
447
           test eax, eax
448
           jz .fail
449
450
 
451
           mov ecx, [esi+8]
452
453
 
454
;  eax= uart
455
;  ebx= baud rate
456
;  ecx= mode
457
458
 
459
.internal:
460
           cmp ebx, RATE_115200
461
           ja .fail
405 serge 462
463
 
413 serge 464
           jae .fail
405 serge 465
466
 
413 serge 467
           mov [eax+UART.mode], ecx
468
405 serge 469
 
413 serge 470
           mov bx, [divisor+ebx*2]
471
405 serge 472
 
413 serge 473
           push edx
474
           add edx, LCR_REG
475
           in al, dx
405 serge 476
           or al, 0x80
477
           out dx, al
478
479
 
413 serge 480
           mov al, bl
481
           out dx, al
405 serge 482
483
 
484
           mov al, bh
413 serge 485
           out dx, al
405 serge 486
487
 
413 serge 488
           mov eax, ecx
489
           out dx, al
405 serge 490
           xor eax, eax
413 serge 491
           ret
492
.fail:
405 serge 493
           or eax, -1
413 serge 494
           ret
405 serge 495
496
 
414 serge 497
;  esi=  input buffer
498
;        +0 connection
499
;        +4 modem control reg valie
500
;
501
; retval
502
;  eax= error code
503
413 serge 504
 
505
uart_set_mcr:
414 serge 506
413 serge 507
 
414 serge 508
           cmp [eax+APPOBJ.magic], 'CNCT'
509
           jne .fail
510
511
 
512
           jne .fail
513
514
 
515
           test eax, eax
516
           jz .fail
517
518
 
519
520
 
413 serge 521
           mov edx, [eax+UART.base]
522
           add edx, MCR_REG
523
           mov al, bl
524
           out dx, al
525
           xor eax, eax
414 serge 526
           ret
413 serge 527
.fail:
414 serge 528
           or eax, -1
529
           ret
530
413 serge 531
 
405 serge 532
;  eax= port
413 serge 533
;
534
; retval
535
;  ecx= connection
536
;  eax= error code
537
405 serge 538
 
539
uart_open:
413 serge 540
           dec eax
541
           cmp eax, COM_MAX
542
           jae .fail
543
544
 
545
           push esi
546
.do_wait:
547
           cmp dword [esi+UART.lock],0
548
           je .get_lock
549
           call change_task
550
           jmp .do_wait
551
.get_lock:
552
           mov eax, 1
553
           xchg eax, [esi+UART.lock]
554
           test eax, eax
555
           jnz .do_wait
556
557
 
558
           call uart_reset.internal
414 serge 559
413 serge 560
 
561
           shl ebx, 5
562
           mov ebx, [CURRENT_TASK+ebx+4]
563
           mov eax, CONNECTION_SIZE
564
           call create_kernel_object
565
           pop esi                       ;uart
566
           test eax, eax
567
           jz .fail
568
569
 
570
           mov [eax+APPOBJ.destroy], uart_close.destroy
571
           mov [eax+CONNECTION.uart], esi
572
           mov ecx, eax
573
           xor eax, eax
574
           ret
575
.fail:
576
           or eax, -1
577
           ret
578
restore .uart
579
580
 
581
;  esi= input buffer
582
583
 
584
uart_close:
585
           mov eax, [esi]
586
           cmp [eax+APPOBJ.magic], 'CNCT'
587
           jne .fail
588
589
 
590
           jne .fail
591
.destroy:
592
           push [eax+CONNECTION.uart]
593
           call destroy_kernel_object   ;eax= object
594
           pop eax                      ;eax= uart
595
           test eax, eax
596
           jz .fail
597
598
 
599
           mov [eax+UART.lock], 0 ;release port
600
           xor eax, eax
601
           ret
602
.fail:
603
           or eax, -1
604
           ret
605
606
 
607
 
608
;  eax= uart
609
;  ebx= baud rate
610
611
 
612
set_rate:
405 serge 613
           cmp ebx, RATE_115200
413 serge 614
           ja .fail
405 serge 615
616
 
413 serge 617
           mov bx, [divisor+ebx*2]
618
405 serge 619
 
413 serge 620
           add edx, LCR_REG
621
           in al, dx
405 serge 622
           push eax
413 serge 623
           or al, 0x80
405 serge 624
           out dx, al
625
626
 
413 serge 627
           mov al, bl
405 serge 628
           out dx, al
629
630
 
413 serge 631
           mov al, bh
405 serge 632
           out dx, al
633
634
 
413 serge 635
           add edx, LCR_REG-1
636
           out dx, al
405 serge 637
.fail:
638
           ret
639
640
 
413 serge 641
 
642
;   ebx= uart
643
644
 
405 serge 645
transmit:
646
           push esi
647
           push edi
413 serge 648
405 serge 649
 
413 serge 650
405 serge 651
 
652
           cli
653
654
 
413 serge 655
           mov ecx, [ebx+UART.xmit_count]
414 serge 656
           test ecx, ecx
657
           je .stop
658
405 serge 659
 
414 serge 660
           jbe @F
661
           mov ecx, 16
662
@@:
405 serge 663
           sub [ebx+UART.xmit_count], ecx
414 serge 664
           add [ebx+UART.xmit_free], ecx
665
           cld
666
@@:
667
           lodsb
668
           out dx, al
405 serge 669
           dec ecx
414 serge 670
           jnz @B
671
405 serge 672
 
414 serge 673
           jb @F
674
           sub esi, 8192
675
@@:
676
           mov [ebx+UART.xmit_rp], esi
413 serge 677
414 serge 678
 
679
           je .stop
680
681
 
413 serge 682
           jmp @F
414 serge 683
.stop:
684
           mov [ebx+UART.state], UART_STOP
685
@@:
686
           popfd
405 serge 687
           pop edi
413 serge 688
           pop esi
405 serge 689
           ret
690
691
 
414 serge 692
 
413 serge 693
;  esi=  input buffer
414 serge 694
;        +0 connection
695
;        +4 dst buffer
696
;        +8 dst size
697
;  edi=  output buffer
698
;        +0 bytes read
699
700
 
701
;  eax= error code
702
703
 
704
uart_read:
705
           mov eax, [esi]
706
           cmp [eax+APPOBJ.magic], 'CNCT'
707
           jne .fail
708
709
 
710
           jne .fail
711
712
 
713
           test eax, eax
714
           jz .fail
715
716
 
717
           mov ecx, [eax+UART.rcvr_count]
416 serge 718
           cmp ecx, ebx
414 serge 719
           jbe @F
720
           mov ecx, ebx
721
@@:
722
           mov [edi], ecx      ;bytes read
723
           test ecx, ecx
724
           jz .done
725
726
 
416 serge 727
414 serge 728
 
729
           mov esi, [eax+UART.rcvr_rp]
416 serge 730
           cld
414 serge 731
           rep movsb
416 serge 732
           pop ecx
733
734
 
735
           jb @F
736
           sub esi, 8192
737
@@:
414 serge 738
           mov [eax+UART.rcvr_rp], esi
416 serge 739
           sub [eax+UART.rcvr_count], ecx
740
.done:
414 serge 741
           xor eax, eax
742
           ret
416 serge 743
.fail:
414 serge 744
           or eax, -1
745
           ret
746
747
 
748
;  esi=  input buffer
749
;        +0 connection
750
;        +4 src buffer
751
;        +8 src size
752
;
753
; retval
754
;  eax= error code
755
756
 
757
uart_write:
758
           mov eax, [esi]
759
           cmp [eax+APPOBJ.magic], 'CNCT'
760
           jne .fail
761
762
 
763
           jne .fail
764
765
 
766
           test eax, eax
767
           jz .fail
768
769
 
770
           mov edx, [esi+8]
771
772
 
773
;  eax= uart
413 serge 774
;  ebx= src
775
;  edx= count
776
405 serge 777
 
778
.internal:
414 serge 779
           mov esi, ebx
413 serge 780
           mov edi, [eax+UART.xmit_wp]
781
.write:
405 serge 782
           test edx, edx
413 serge 783
           jz .fail
414 serge 784
.wait:
405 serge 785
           cmp [eax+UART.xmit_free], 0
413 serge 786
           jne .fill
405 serge 787
788
 
413 serge 789
           je .wait
405 serge 790
791
 
413 serge 792
           push edx
793
           call transmit
405 serge 794
           pop edx
413 serge 795
           mov eax, ebx
796
           jmp .write
405 serge 797
.fill:
798
           mov ecx, [eax+UART.xmit_free]
413 serge 799
           cmp ecx, edx
800
           jbe @F
801
           mov ecx, edx
802
@@:
405 serge 803
           push ecx
414 serge 804
           cld
805
           rep movsb
806
           pop ecx
807
           sub [eax+UART.xmit_free], ecx
413 serge 808
           add [eax+UART.xmit_count], ecx
414 serge 809
           sub edx, ecx
413 serge 810
           jnz .wait
414 serge 811
.done:
405 serge 812
           cmp edi, [eax+UART.xmit_top]
414 serge 813
           jb @F
814
           sub edi, 8192
815
@@:
816
           mov [eax+UART.xmit_wp], edi
413 serge 817
           cmp [eax+UART.state], UART_TRANSMIT
818
           je @F
405 serge 819
           mov ebx, eax
413 serge 820
           call transmit
405 serge 821
@@:
822
           xor eax, eax
414 serge 823
           ret
405 serge 824
.fail:
414 serge 825
           or eax, -1
826
           ret
827
405 serge 828
 
414 serge 829
 
405 serge 830
com_2_isr:
413 serge 831
           mov ebx, [com2]
832
           jmp com_1_isr.get_info
833
align 4
834
com_1_isr:
835
           mov ebx, [com1]
836
.get_info:
405 serge 837
           mov edx, [ebx+UART.base]
413 serge 838
           add edx, IIR_REG
839
           in  al, dx
405 serge 840
841
 
842
           jnz .done
843
844
 
845
           and eax, 3
846
847
 
848
           jmp .get_info
849
.done:
850
           ret
851
852
 
853
isr_line:
854
           mov edx, [ebx+UART.base]
413 serge 855
           add edx, LSR_REG
856
           in al, dx
405 serge 857
           ret
858
859
 
860
isr_recieve:
861
           mov esi, [ebx+UART.base]
416 serge 862
           add esi, LSR_REG
863
           mov edi, [ebx+UART.rcvr_wp]
864
           xor ecx, ecx
865
           cld
866
.read:
867
           mov edx, esi
868
           in al, dx
869
           test eax, LSR_DR
870
           jz .done
871
872
 
413 serge 873
           in al, dx
405 serge 874
           stosb
416 serge 875
           inc ecx
876
           jmp .read
877
.done:
878
           cmp edi, [ebx+UART.rcvr_top]
879
           jb @F
880
           sub edi, 8192
881
@@:
882
           mov [ebx+UART.rcvr_wp], edi
883
           add [ebx+UART.rcvr_count], ecx
884
           ret
405 serge 885
886
 
887
isr_modem:
888
           mov edx, [ebx+UART.base]
413 serge 889
           add edx, MSR_REG
890
           in al, dx
891
           ret
892
405 serge 893
 
894
 
413 serge 895
com1        dd 0
896
com2        dd 0
897
405 serge 898
 
899
uart_func   dd 0                ;SRV_GETVERSION
413 serge 900
            dd 0                ;PORT_OPEN
901
            dd uart_close       ;PORT_CLOSE
902
            dd uart_reset       ;PORT_RESET
414 serge 903
            dd uart_set_mode    ;PORT_SETMODE
413 serge 904
            dd 0                ;PORT_GETMODE
414 serge 905
            dd uart_set_mcr     ;PORT_SETMODEM
906
            dd 0                ;PORT_GETMODEM
907
            dd uart_read        ;PORT_READ
908
            dd uart_write       ;PORT_WRITE
909
405 serge 910
 
911
            dd transmit
912
            dd isr_recieve
913
            dd isr_line
914
915
 
413 serge 916
405 serge 917
 
918
            dw  192,   96,   64,  58,  48,  32
919
            dw   24,   16,   12,   6,   3,   2, 1
920
921
 
922
 
923
 
924