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