Subversion Repositories Kolibri OS

Rev

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