Subversion Repositories Kolibri OS

Rev

Rev 5363 | Only display areas with differences | Regard whitespace | Details | Blame | Last modification | View Log | RSS feed

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