Subversion Repositories Kolibri OS

Rev

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

Rev 405 Rev 413
Line 20... Line 20...
20
 
20
 
Line 21... Line 21...
21
DRV_ENTRY        equ   1
21
DRV_ENTRY        equ   1
22
DRV_EXIT         equ  -1
22
DRV_EXIT         equ  -1
Line -... Line 23...
-
 
23
 
-
 
24
THR_REG          equ  0;  x3f8   ;transtitter/reciever
-
 
25
IER_REG          equ  1;  x3f9   ;interrupt enable
-
 
26
IIR_REG          equ  2;  x3fA   ;interrupt info
-
 
27
LCR_REG          equ  3;  x3FB   ;line control
-
 
28
MCR_REG          equ  4;  x3FC   ;modem control
-
 
29
LSR_REG          equ  5;  x3FD   ;line status
Line 23... Line 30...
23
 
30
MSR_REG          equ  6;  x3FE   ;modem status
24
 
31
 
25
LCR_5BIT         equ  0x00
32
LCR_5BIT         equ  0x00
26
LCR_6BIT         equ  0x01
33
LCR_6BIT         equ  0x01
Line 61... Line 68...
61
 
68
 
Line 62... Line 69...
62
MCR_DTR          equ  0x01     ;0-> DTR=1, 1-> DTR=0
69
MCR_DTR          equ  0x01     ;0-> DTR=1, 1-> DTR=0
63
MCR_RTS          equ  0x02     ;0-> RTS=1, 1-> RTS=0
70
MCR_RTS          equ  0x02     ;0-> RTS=1, 1-> RTS=0
64
MCR_OUT_1        equ  0x04     ;0-> OUT1=1, 1-> OUT1=0
71
MCR_OUT_1        equ  0x04     ;0-> OUT1=1, 1-> OUT1=0
65
MCR_OUT_2        equ  0x08     ;0-> OUT2=1, 1-> OUT2=0
72
MCR_OUT_2        equ  0x08     ;0-> OUT2=1, 1-> OUT2=0  enable intr
66
MCR_LOOP         equ  0x10     ;lopback mode
73
MCR_LOOP         equ  0x10     ;lopback mode
Line 67... Line 74...
67
 
74
 
68
MSR_DCTS         equ  0x01     ;delta clear to send
75
MSR_DCTS         equ  0x01     ;delta clear to send
69
MSR_DDSR         equ  0x02     ;delta data set redy
76
MSR_DDSR         equ  0x02     ;delta data set redy
70
MSR_TERI         equ  0x04     ;trailinh edge of ring
77
MSR_TERI         equ  0x04     ;trailinh edge of ring
Line 71... Line -...
71
MSR_DDCD         equ  0x08     ;delta carrier detect
-
 
72
 
-
 
73
COM_THR          equ 0x3f8     ;transtitter/reciever
-
 
74
COM_IER          equ 0x3f9     ;interrupt enable
-
 
75
COM_IIR          equ 0x3fA     ;interrupt info
-
 
76
COM_LCR          equ 0x3FB     ;line control
-
 
77
COM_MCR          equ 0x3FC     ;modem control
-
 
Line 78... Line 78...
78
COM_LSR          equ 0x3FD     ;line status
78
MSR_DDCD         equ  0x08     ;delta carrier detect
79
COM_MSR          equ 0x3FE     ;modem status
79
 
80
 
80
 
81
RATE_50          equ  0
81
RATE_50          equ  0
Line 97... Line 97...
97
RATE_38400       equ 16
97
RATE_38400       equ 16
98
RATE_57600       equ 17
98
RATE_57600       equ 17
99
RATE_115200      equ 18
99
RATE_115200      equ 18
100
 
100
 
Line 101... Line 101...
101
COM_1            equ  0
101
COM_1            equ  1
102
COM_2            equ  1
102
COM_2            equ  2
103
COM_3            equ  2
103
COM_3            equ  3
104
COM_4            equ  3
104
COM_4            equ  4
-
 
105
COM_MAX          equ  2    ;only two port supported
-
 
106
 
-
 
107
COM_1_BASE       equ 0x3F8
-
 
108
COM_2_BASE       equ 0x2F8
Line 105... Line 109...
105
 
109
 
106
COM_1_IRQ        equ  4
110
COM_1_IRQ        equ  4
107
COM_2_IRQ        equ  3
-
 
Line -... Line 111...
-
 
111
COM_2_IRQ        equ  3
-
 
112
 
Line 108... Line 113...
108
TRANSMIT         equ  1
113
UART_CLOSED      equ  0
109
 
114
UART_TRANSMIT    equ  1
-
 
115
 
-
 
116
struc UART
110
 
117
{
111
struc COMPORT
118
  ; .owner        dd ?   unused
112
{
119
   .lock         dd ?
113
   .base         dd ?
120
   .base         dd ?
114
   .lcr_reg      dd ?
121
   .lcr_reg      dd ?
115
   .mcr_reg      dd ?
122
   .mcr_reg      dd ?
116
   .rate         dd ?
-
 
Line 117... Line 123...
117
   .mode         dd ?
123
   .rate         dd ?
118
   .state        dd ?
124
   .mode         dd ?
119
   .connection   dd ?
125
   .state        dd ?
120
 
-
 
Line 121... Line 126...
121
   .rcvr_rp      dd ?
126
 
122
   .rcvr_wp      dd ?
127
   .rcvr_rp      dd ?
123
   .rcvr_free    dd ?
128
   .rcvr_wp      dd ?
124
   .rcvr_count   dd ?
-
 
125
 
-
 
126
   .xmit_rp      dd ?
129
   .rcvr_free    dd ?
-
 
130
 
-
 
131
   .xmit_rp      dd ?
-
 
132
   .xmit_wp      dd ?
-
 
133
   .xmit_free    dd ?
-
 
134
   .rcvr_buffer  rb 128
-
 
135
   .xmit_buffer  rb 128
-
 
136
}
-
 
137
virtual at 0
-
 
138
  UART UART
-
 
139
end virtual
-
 
140
 
-
 
141
RCVR_OFFSET   equ 14*4
-
 
142
XMIT_OFFSET   equ (13*4*128)
-
 
143
UART_SIZE     equ (256+13*4)
-
 
144
 
-
 
145
struc CONNECTION
-
 
146
{
-
 
147
   .magic       dd ?   ;'CNCT'
-
 
148
   .destroy     dd ?   ;internal destructor
-
 
149
   .fd          dd ?   ;next object in list
127
   .xmit_wp      dd ?
150
   .bk          dd ?   ;prev object in list
-
 
151
   .pid         dd ?   ;owner id
128
   .xmit_free    dd ?
152
 
129
   .xmit_count   dd ?
153
   .id          dd ?   ;reserved
130
   .xmit_buffer  rb 128
154
   .uart        dd ?   ;uart pointer
Line 131... Line 155...
131
   .rcvr_buffer  rb 128
155
}
Line 132... Line 156...
132
}
156
 
Line 133... Line 157...
133
virtual at 0
157
virtual at 0
134
  COMPORT COMPORT
158
  CONNECTION CONNECTION
135
end virtual
159
end virtual
136
 
160
 
137
COMPORT_SIZE  equ 256+15*4
161
CONNECTION_SIZE equ 7*4
Line 138... Line 162...
138
 
162
 
139
UART_VERSION  equ 0x00000000
163
UART_VERSION  equ 0x12345678        ;debug
140
 
164
 
141
init_com:
165
init_uart_service:
142
           mov eax, COMPORT_SIZE
166
           mov eax, UART_SIZE
143
           call malloc
167
           call malloc
Line 144... Line 168...
144
           test eax, eax
168
           test eax, eax
-
 
169
           jz .fail
-
 
170
 
-
 
171
           mov [com1], eax
Line 145... Line 172...
145
           jz .fail
172
           mov edi, eax
146
 
173
           mov ecx, UART_SIZE/4
147
           mov [com1], eax
174
           xor eax, eax
148
           mov edi, eax
175
           cld
149
           mov ecx, COMPORT_SIZE/4
176
           rep stosd
150
           xor eax, eax
177
 
Line 189... Line 216...
189
           cmp eax, SRV_GETVERSION
216
           cmp eax, SRV_GETVERSION
190
           jne @F
217
           jne @F
Line 191... Line 218...
191
 
218
 
192
           mov eax, [ebx+output]
-
 
193
           mov eax, [eax]
219
           mov eax, [ebx+output]
194
           mov [eax], dword UART_VERSION
220
           mov [eax], dword UART_VERSION
195
           xor eax, eax
221
           xor eax, eax
196
           ret
222
           ret
197
@@:
223
@@:
198
           cmp eax, PORT_OPEN
224
           cmp eax, PORT_OPEN
199
           jne @F
-
 
200
           call open_port
-
 
201
           ret
-
 
202
 
-
 
203
 
-
 
204
           mov esi, [ebx+input]
-
 
205
           mov ecx, [esi]
-
 
206
           mov edx, [com1]
-
 
207
           cmp [edx+COMPORT.connection], ecx
-
 
208
           je @F
-
 
209
           mov edx, [com2]
-
 
210
           cmp [edx+COMPORT.connection], ecx
-
 
Line -... Line 225...
-
 
225
           jne @F
-
 
226
 
-
 
227
           mov ebx, [ebx+input]
-
 
228
           mov eax, [ebx]
211
           jne .fail
229
           call uart_open
-
 
230
           mov ebx, [ioctl]
-
 
231
           mov ebx, [ebx+output]
-
 
232
           mov [ebx], ecx
-
 
233
           ret
212
 
234
@@:
213
           mov edi, [ebx+output]
235
           mov esi, [ebx+input]     ;input buffer
214
           call [uart_func+eax*4]  ;edx, esi, edi
-
 
215
           ret
236
           call [uart_func+eax*4]
216
 
237
           ret
217
.fail:
238
.fail:
Line 218... Line 239...
218
           or eax, -1
239
           or eax, -1
Line 227... Line 248...
227
restore   output
248
restore   output
228
restore   out_size
249
restore   out_size
229
 
250
 
Line 230... Line -...
230
 
-
 
231
open_port:
-
 
232
           ret
-
 
233
 
-
 
234
; param
-
 
235
;  edx= port
-
 
236
;  esi= input data
-
 
237
;  edi= output data
-
 
238
;
-
 
239
; retval
-
 
240
;  eax=0 success
-
 
241
;  eax <>0 error
-
 
242
 
-
 
243
align 4
-
 
244
close_port:
-
 
245
 
-
 
246
           call reset
-
 
247
           mov [edx+COMPORT.connection], 0
-
 
248
           xor eax, eax
-
 
249
           ret
-
 
250
 
-
 
251
 
251
 
-
 
252
; set mode 2400 bod 8-bit
252
; set mode 2400 bod 8-bit
253
; disable DTR & RTS
253
; clear FIFO
254
; clear FIFO
-
 
255
; clear pending interrupts
-
 
256
;
-
 
257
; param
Line 254... Line 258...
254
; clear pending interrupts
258
;  eax= uart
255
 
259
 
-
 
260
align 4
-
 
261
uart_reset:
-
 
262
           mov esi, eax
-
 
263
           mov [eax+UART.state], UART_CLOSED
-
 
264
           mov edx, [eax+UART.base]
-
 
265
           add edx, MCR_REG
-
 
266
           xor eax, eax
-
 
267
           out dx, al        ;clear DTR & RTS
256
align 4
268
 
257
reset:
269
           mov eax, esi
258
           mov eax, RATE_2400
270
           mov ebx, RATE_2400
Line -... Line 271...
-
 
271
           mov ecx, LCR_8BIT+LCR_STOP_1
-
 
272
           call uart_set_mode.internal
259
           mov ebx, LCR_8BIT+LCR_STOP_1
273
 
260
           call set_mode
-
 
261
 
274
           mov edx, [esi+UART.base]
262
           mov eax,FCR_EFIFO+FCR_CRB+FCR_CXMIT+FCR_FIFO_14
-
 
263
           mov edx, COM_IIR
275
           add edx, IIR_REG
-
 
276
           mov eax,FCR_EFIFO+FCR_CRB+FCR_CXMIT+FCR_FIFO_14
264
           out dx, al
277
           out dx, al
265
 
278
.clear_RB:
266
.clear_RB:
279
           mov edx, [esi+UART.base]
267
           mov edx, COM_LSR
280
           add edx, LSR_REG
Line 268... Line 281...
268
           in al, dx
281
           in al, dx
269
           test eax, LSR_DR
282
           test eax, LSR_DR
270
           jz @F
283
           jz @F
271
 
284
 
-
 
285
           mov edx, [esi+UART.base]
-
 
286
           in al, dx
272
           mov edx, COM_THR
287
           jmp .clear_RB
273
           in al, dx
-
 
274
           jmp .clear_RB
288
@@:
275
@@:
-
 
276
           mov eax,IER_RDAI+IER_THRI+IER_LSI
289
           mov edx, [esi+UART.base]
-
 
290
           add edx, IER_REG
277
           mov edx, COM_IER
291
           mov eax,IER_RDAI+IER_THRI+IER_LSI
278
           out dx, al
292
           out dx, al
279
 
293
.clear_IIR:
280
.clear_IIR:
294
           mov edx, [esi+UART.base]
Line 281... Line 295...
281
           mov edx, COM_IIR
295
           add edx, IIR_REG
282
           in al, dx
296
           in al, dx
283
           test al, IIR_INTR
297
           test al, IIR_INTR
Line -... Line 298...
-
 
298
           jnz .done
284
           jnz .done
299
 
285
 
300
           shr eax, 1
286
           shr eax, 1
301
           and eax, 3
287
           and eax, 3
302
           jnz @F
288
           jnz @F
303
 
289
 
304
           mov edx, [esi+UART.base]
Line 290... Line 305...
290
           mov edx, COM_MSR
305
           add edx, MSR_REG
291
           in al, dx
306
           in al, dx
Line 292... Line 307...
292
           jmp .clear_IIR
307
           jmp .clear_IIR
293
@@:
308
@@:
294
           cmp eax, 1
309
           cmp eax, 1
295
           je .clear_IIR
310
           je .clear_IIR
-
 
311
 
296
 
312
           cmp eax, 2
297
           cmp eax, 2
313
           jne @F
298
           jne @F
314
 
299
 
-
 
300
           mov edx, COM_THR
315
           mov edx, [esi+UART.base]
301
           in al, dx
316
           in al, dx
302
           jmp .clear_IIR
-
 
303
@@:
317
           jmp .clear_IIR
-
 
318
@@:
Line 304... Line 319...
304
           mov edx, COM_LSR
319
           mov edx, [esi+UART.base]
305
           in al, dx
320
           add edx, LSR_REG
306
           jmp .clear_IIR
321
           in al, dx
307
 
-
 
308
.done:
-
 
309
           mov edi, rcvr_buff
322
           jmp .clear_IIR
310
           xor eax, eax
323
.done:
311
           mov ecx, 256/4
324
           lea edi, [esi+UART.rcvr_buffer]
312
 
-
 
Line 313... Line 325...
313
           mov [rcvr_rp], edi
325
           mov ecx, 256/4
314
           mov [rcvr_wp], edi
326
           xor eax, eax
315
           mov [rcvr_free], 128
327
 
Line -... Line 328...
-
 
328
           mov [esi+UART.rcvr_rp], eax
316
;;           mov [rcvr_count], 16
329
           mov [esi+UART.rcvr_wp], eax
-
 
330
           mov [esi+UART.rcvr_free], 128
317
 
331
           mov [esi+UART.xmit_rp], eax
-
 
332
           mov [esi+UART.xmit_wp], eax
-
 
333
           mov [esi+UART.xmit_free], 128
-
 
334
 
-
 
335
           cld
318
           mov [xmit_rp], xmit_buff
336
           rep stosd
Line 319... Line 337...
319
           mov [xmit_wp], xmit_buff
337
           ret
320
           mov [xmit_free], 128
338
 
-
 
339
 
-
 
340
; param
-
 
341
;  esi=  input buffer
-
 
342
;        +0 connection
-
 
343
;        +4 rate
-
 
344
;        +8 mode
-
 
345
;
-
 
346
; retval
-
 
347
;  eax= error code
-
 
348
 
-
 
349
align 4
-
 
350
uart_set_mode:
-
 
351
           mov eax, [esi]
-
 
352
           cmp [eax+APPOBJ.magic], 'CNCT'
-
 
353
           jne .fail
-
 
354
 
-
 
355
           cmp [eax+APPOBJ.destroy], uart_close.destroy
-
 
356
           jne .fail
-
 
357
 
-
 
358
           mov eax, [eax+CONNECTION.uart]
-
 
359
           test eax, eax
321
           mov [xmit_count], 16       ;FIFO free
360
           jz .fail
322
 
361
 
Line 323... Line 362...
323
           cld
362
           mov ebx, [esi+4]
324
           rep stosd
363
           mov ecx, [esi+8]
Line 325... Line 364...
325
           ret
364
 
326
 
365
; param
Line -... Line 366...
-
 
366
;  eax= uart
327
; param
367
;  ebx= baud rate
Line -... Line 368...
-
 
368
;  ecx= mode
-
 
369
 
328
;  eax= rate constant
370
align 4
329
;  ebx= mode bits
371
.internal:
330
 
372
           cmp ebx, RATE_115200
331
align 4
373
           ja .fail
Line 332... Line 374...
332
set_mode:
374
 
333
           cmp eax, RATE_115200
375
           cmp ecx, LCR_BREAK
334
           ja .fail
376
           jae .fail
Line 335... Line 377...
335
 
377
 
336
           cmp ebx, LCR_BREAK
378
           mov [eax+UART.rate], ebx
337
           jae .fail
379
           mov [eax+UART.mode], ecx
Line 338... Line 380...
338
 
380
 
339
           mov [rate], eax
381
           mov esi, eax
-
 
382
           mov bx, [divisor+ebx*2]
-
 
383
 
-
 
384
           mov edx, [esi+UART.base]
-
 
385
           push edx
-
 
386
           add edx, LCR_REG
-
 
387
           in al, dx
-
 
388
           or al, 0x80
-
 
389
           out dx, al
-
 
390
 
-
 
391
           pop edx
-
 
392
           mov al, bl
-
 
393
           out dx, al
-
 
394
 
-
 
395
           inc dx
-
 
396
           mov al, bh
340
           mov [mode], ebx
397
           out dx, al
-
 
398
 
-
 
399
           add edx, LCR_REG-1
-
 
400
           mov eax, ecx
-
 
401
           out dx, al
-
 
402
           xor eax, eax
-
 
403
           ret
-
 
404
.fail:
-
 
405
           or eax, -1
-
 
406
           ret
-
 
407
 
-
 
408
 
-
 
409
align 4
-
 
410
uart_set_modem:
-
 
411
 
-
 
412
           mov [eax+UART.mcr_reg], ebx
-
 
413
           mov edx, [eax+UART.base]
-
 
414
           add edx, MCR_REG
-
 
415
           mov al, bl
-
 
416
           out dx, al
-
 
417
           ret
-
 
418
 
-
 
419
; param
-
 
420
;  eax= port
-
 
421
;
-
 
422
; retval
-
 
423
;  ecx= connection
-
 
424
;  eax= error code
-
 
425
 
-
 
426
align 4
-
 
427
uart_open:
-
 
428
           dec eax
-
 
429
           cmp eax, COM_MAX
-
 
430
           jae .fail
-
 
431
 
-
 
432
           mov esi, [com1+eax*4]             ;uart
-
 
433
           push esi
-
 
434
.do_wait:
-
 
435
           cmp dword [esi+UART.lock],0
-
 
436
           je .get_lock
-
 
437
           call change_task
-
 
438
           jmp .do_wait
-
 
439
.get_lock:
-
 
440
           mov eax, 1
-
 
441
           xchg eax, [esi+UART.lock]
-
 
442
           test eax, eax
-
 
443
           jnz .do_wait
341
 
444
 
-
 
445
           mov eax, esi                  ;uart
342
           mov cx, [divisor+eax*2]
446
           call uart_reset
-
 
447
 
Line 343... Line 448...
343
 
448
           mov ebx, [CURRENT_TASK]
-
 
449
           shl ebx, 5
-
 
450
           mov ebx, [CURRENT_TASK+ebx+4]
-
 
451
           mov eax, CONNECTION_SIZE
-
 
452
           call create_kernel_object
-
 
453
           pop esi                       ;uart
-
 
454
           test eax, eax
-
 
455
           jz .fail
-
 
456
 
-
 
457
           mov [eax+APPOBJ.magic], 'CNCT'
-
 
458
           mov [eax+APPOBJ.destroy], uart_close.destroy
-
 
459
           mov [eax+CONNECTION.uart], esi
-
 
460
           mov ecx, eax
-
 
461
           xor eax, eax
-
 
462
           ret
-
 
463
.fail:
-
 
464
           or eax, -1
-
 
465
           ret
-
 
466
restore .uart
-
 
467
 
-
 
468
; param
-
 
469
;  esi= input buffer
-
 
470
 
-
 
471
align 4
-
 
472
uart_close:
-
 
473
           mov eax, [esi]
-
 
474
           cmp [eax+APPOBJ.magic], 'CNCT'
-
 
475
           jne .fail
-
 
476
 
344
           mov dx, COM_LCR
477
           cmp [eax+APPOBJ.destroy], uart_close.destroy
Line 345... Line 478...
345
           in al, dx
478
           jne .fail
346
           or al, 0x80
479
.destroy:
347
           out dx, al
480
           push [eax+CONNECTION.uart]
348
 
481
           call destroy_kernel_object   ;eax= object
Line 349... Line 482...
349
           mov dx, COM_THR
482
           pop eax                      ;eax= uart
350
           mov al, cl
483
           test eax, eax
Line -... Line 484...
-
 
484
           jz .fail
351
           out dx, al
485
 
352
 
486
           mov [eax+UART.state], UART_CLOSED
-
 
487
           mov [eax+UART.lock], 0 ;release port
353
           inc dx
488
           xor eax, eax
354
           mov al, ch
489
           ret
Line 355... Line 490...
355
           out dx, al
490
.fail:
356
 
491
           or eax, -1
357
           mov dx, COM_LCR
492
           ret
Line 358... Line 493...
358
           mov eax, ebx
493
 
359
           out dx, al
494
 
360
.fail:
495
; param
Line 361... Line 496...
361
           ret
496
;  eax= uart
362
 
497
;  ebx= baud rate
363
; param
498
 
364
;  eax= rate constant
499
align 4
365
 
500
set_rate:
Line -... Line 501...
-
 
501
           cmp ebx, RATE_115200
-
 
502
           ja .fail
-
 
503
 
-
 
504
           mov [eax+UART.rate], ebx
366
align 4
505
           mov bx, [divisor+ebx*2]
367
set_rate:
506
 
368
           cmp eax, RATE_115200
507
           mov edx, [eax+UART.base]
369
           ja .fail
508
           add edx, LCR_REG
-
 
509
           in al, dx
Line 370... Line 510...
370
 
510
           push eax
Line 371... Line 511...
371
           mov [rate], eax
511
           or al, 0x80
372
           mov bx, [divisor+eax*2]
512
           out dx, al
Line -... Line 513...
-
 
513
 
373
 
514
           sub edx, LCR_REG
-
 
515
           mov al, bl
374
           mov dx, COM_LCR
516
           out dx, al
Line 375... Line 517...
375
           in al, dx
517
 
376
           or al, 0x80
518
           inc edx
377
           out dx, al
519
           mov al, bh
378
 
520
           out dx, al
379
           mov dx, COM_THR
521
 
380
           mov al, bl
522
           pop eax
Line 381... Line 523...
381
           out dx, al
523
           add edx, LCR_REG-1
382
 
524
           out dx, al
383
           inc dx
525
.fail:
384
           mov al, bh
526
           ret
Line 385... Line 527...
385
           out dx, al
527
 
386
 
528
 
387
           mov dx, COM_LCR
529
; param
388
           mov eax, [lcr_reg]
-
 
389
           out dx, al
530
;   ebx= uart
390
.fail:
531
 
391
           ret
532
align 4
392
 
533
transmit:
393
align 4
534
           push esi
-
 
535
           push edi
-
 
536
           push ebp
394
transmit:
537
 
395
           push esi
538
           mov edx, [ebx+UART.base]
Line 396... Line 539...
396
           mov edx, COM_THR
539
 
-
 
540
           pushfd
397
 
541
           cli
398
           mov [xmit_count], 16
542
 
Line 399... Line 543...
399
 
543
           mov ebp, 16
400
           pushfd
544
           mov esi, [ebx+UART.xmit_rp]
401
           cli
545
           lea edi, [ebx+UART.xmit_buffer]
402
 
546
           mov ecx, [ebx+UART.xmit_free]
-
 
547
 
403
           mov esi, [xmit_rp]
548
           cmp ecx, 128
404
           mov ecx, [xmit_free]
549
           je .exit
405
 
550
@@:
406
           cmp ecx, 128
551
           and esi, 127
407
           je .exit
552
           mov al, [esi+edi]
408
@@:
553
           inc esi
Line 409... Line 554...
409
           and esi, 127
554
 
410
           mov al, [xmit_buff+esi]
555
           out dx, al
Line -... Line 556...
-
 
556
           inc ecx
-
 
557
           dec ebp
411
           inc esi
558
           jz .done
-
 
559
 
-
 
560
           cmp ecx, 128
-
 
561
           jne @B
412
 
562
.done:
413
           out dx, al
563
           mov [ebx+UART.xmit_rp], esi
414
           inc ecx
564
           mov [ebx+UART.xmit_free], ecx
415
           dec [xmit_count]
565
           mov [ebx+UART.state], UART_TRANSMIT
-
 
566
.exit:
416
           jz .done
567
           popfd
417
 
568
           pop ebp
Line 418... Line 569...
418
           cmp ecx, 128
569
           pop edi
419
           jne @B
570
           pop esi
420
.done:
571
           ret
421
           add esi, xmit_buff
572
 
422
           mov [xmit_rp], esi
573
; param
423
           mov [xmit_free], ecx
574
;  eax= uart
424
           mov [com_state], TRANSMIT
575
;  ebx= src
425
.exit:
576
;  edx= count
Line -... Line 577...
-
 
577
 
426
           popfd
578
align 4
427
           pop esi
579
uart_write:
Line 428... Line 580...
428
           ret
580
           mov esi, ebx
429
 
581
           mov edi, [eax+UART.xmit_wp]
430
 
582
           lea ebx, [eax+UART.xmit_buffer]
431
; eax= src
583
.write:
432
; ebx= count
-
 
433
 
584
           test edx, edx
-
 
585
           jz .done
434
align 4
586
.wait:
435
comm_send:
587
           cmp [eax+UART.xmit_free], 0
-
 
588
           jne .fill
436
           mov edi, [xmit_wp]
589
 
437
           mov esi, eax
590
           cmp [eax+UART.state], UART_TRANSMIT
438
.write:
591
           je .wait
Line 439... Line 592...
439
           test ebx, ebx
592
 
440
           jz .done
593
           mov ebx, eax
-
 
594
           push edx
-
 
595
           call transmit
-
 
596
           pop edx
-
 
597
           mov eax, ebx
-
 
598
           lea ebx, [ebx+UART.xmit_buffer]
Line 441... Line 599...
441
.wait:
599
           jmp .write
-
 
600
.fill:
442
           cmp [xmit_free], 0
601
           mov ecx, 128
443
           jne .fill
602
           sub ecx, edi
Line 444... Line 603...
444
 
603
           jz .clip
445
           cmp [com_state], TRANSMIT
604
           cmp ecx, [eax+UART.xmit_free]
Line 496... Line 655...
496
           ret
655
           ret
497
 
656
 
Line 498... Line 657...
498
align 4
657
align 4
499
isr_line:
658
isr_line:
-
 
659
           mov edx, [ebx+UART.base]
500
           mov edx, COM_LSR
660
           add edx, LSR_REG
501
           in al, dx
661
           in al, dx
502
           ret
662
           ret
Line 503... Line 663...
503
 
663
 
504
align 4
664
align 4
505
isr_recieve:
665
isr_recieve:
506
           mov edx, COM_THR
666
           mov edx, [ebx+UART.base]
507
           in al, dx
667
           in al, dx
Line 508... Line 668...
508
           ret
668
           ret
509
 
669
 
-
 
670
align 4
510
align 4
671
isr_modem:
511
isr_modem:
672
           mov edx, [ebx+UART.base]
512
            mov edx, COM_MSR
673
           add edx, MSR_REG
Line -... Line 674...
-
 
674
           in al, dx
-
 
675
           ret
-
 
676
 
Line 513... Line 677...
513
            in al, dx
677
 
514
            ret
678
align 4
515
 
679
com1        dd 0
516
 
680
com2        dd 0
-
 
681
 
-
 
682
align 4
-
 
683
uart_func   dd 0                ;SRV_GETVERSION
-
 
684
            dd 0                ;PORT_OPEN
-
 
685
            dd uart_close       ;PORT_CLOSE
-
 
686
            dd 0                ;PORT_RESET
-
 
687
            dd uart_set_mode    ;PORT_SETMODE
-
 
688
;            dd uart.get_mode    ;PORT_GETMODE
-
 
689
;            dd uart.set_mcr     ;PORT_SETMCR
Line 517... Line 690...
517
 
690
;PORT_GETMCR     equ 7
518
align 4
691
;PORT_READ       equ 8
519
uart_func   dd 0            ;get version
692
;PORT_WRITE      equ 9
520
            dd 0            ;open port
693
 
Line -... Line 694...
-
 
694
 
Line 521... Line 695...
521
            dd close_port
695
 
522
 
696
 
523
 
697
isr_action  dd isr_modem
Line 524... Line 698...
524
isr_action  dd isr_modem
698
            dd transmit
Line 525... Line -...
525
            dd transmit
-
 
526
            dd isr_recieve
-
 
527
            dd isr_line
-
 
528
 
-
 
529
 
-
 
530
divisor     dw 2304, 1536, 1047, 857, 768, 384
-
 
531
            dw  192,   96,   64,  58,  48,  32
-
 
Line 532... Line -...
532
            dw   24,   16,   12,   6,   3,   2, 1
-
 
533
 
-
 
534
 
-
 
535
 
-
 
536
sz_uart_srv db 'UART',0
-
 
537
 
-
 
538
;version      dd 0x00040000
-
 
539
 
-
 
540
 
-
 
541
align 4
-
 
542
 
-
 
543
com1        dd ?
-
 
544
com2        dd ?
-
 
545
 
-
 
546
rcvr_rp     dd ?
-
 
547
rcvr_wp     dd ?
-
 
548
rcvr_free   dd ?
-
 
549
rcvr_count  dd ?
-
 
550
 
-
 
551
xmit_rp     dd ?
-
 
552
xmit_wp     dd ?
-