Subversion Repositories Kolibri OS

Rev

Rev 465 | Go to most recent revision | Show entire file | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed

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