Subversion Repositories Kolibri OS

Rev

Rev 459 | Go to most recent revision | Only display areas with differences | Regard whitespace | Details | Blame | Last modification | View Log | RSS feed

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