Subversion Repositories Kolibri OS

Rev

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

Rev 5014 Rev 5018
Line 122... Line 122...
122
chipType                db      ?
122
chipType                db      ?
123
baudrate                dd      ?
123
baudrate                dd      ?
124
bitbangEnabled          db      ?
124
bitbangEnabled          db      ?
125
readBufChunkSize        dd      ?
125
readBufChunkSize        dd      ?
126
writeBufChunkSize       dd      ?
126
writeBufChunkSize       dd      ?
-
 
127
maxPacketSize           dd      ?
127
interface               dd      ?
128
interface               dd      ?
128
index                   dd      ?
129
index                   dd      ?
129
inEP                    dd      ?
130
inEP                    dd      ?
130
outEP                   dd      ?
131
outEP                   dd      ?
131
nullP                   dd      ? 
132
nullP                   dd      ? 
Line 179... Line 180...
179
.nothing:
180
.nothing:
180
        ret
181
        ret
181
endp
182
endp
Line 182... Line 183...
182
 
183
 
Line 183... Line 184...
183
 
184
 
184
proc AddDevice stdcall uses ebx esi, .config_pipe:DWORD, .config_descr:DWORD, .interface:DWORD
185
proc AddDevice stdcall uses ebx esi edi, .config_pipe:DWORD, .config_descr:DWORD, .interface:DWORD
185
        
186
        
186
        stdcall USBGetParam, [.config_pipe], 0
187
        stdcall USBGetParam, [.config_pipe], 0
187
        mov     edx, eax
188
        mov     edx, eax
188
        DEBUGF 1,'K : Device detected Vendor: %x\n', [eax+usb_descr.idVendor]
-
 
189
        cmp     word[eax+usb_descr.idVendor], 0x0403
189
        DEBUGF 1,'K : Detected device vendor: %x\n', [eax+usb_descr.idVendor]
190
        jnz     .notftdi
190
        cmp     word[eax+usb_descr.idVendor], 0x0403
191
        DEBUGF 1,'K : FTDI USB device detected\n'
191
        jnz     .notftdi
192
        movi    eax, sizeof.ftdi_context
192
        movi    eax, sizeof.ftdi_context
193
        call    Kmalloc
193
        call    Kmalloc
Line 202... Line 202...
202
        
202
        
203
        mov     ebx, [.config_pipe]
203
        mov     ebx, [.config_pipe]
204
        mov     [eax + ftdi_context.nullP], ebx
204
        mov     [eax + ftdi_context.nullP], ebx
205
        mov     [eax + ftdi_context.index], 0
205
        mov     [eax + ftdi_context.index], 0
-
 
206
        mov     [eax + ftdi_context.lockPID], 0
206
        mov     [eax + ftdi_context.lockPID], 0
207
        mov     [eax + ftdi_context.maxPacketSize], 64       
207
        mov     [eax + ftdi_context.readBufChunkSize], 64
208
        mov     [eax + ftdi_context.readBufChunkSize], 64
Line 208... Line 209...
208
        mov     [eax + ftdi_context.writeBufChunkSize], 64
209
        mov     [eax + ftdi_context.writeBufChunkSize], 64
-
 
210
        
209
        
211
        mov     cx, [edx+usb_descr.bcdDevice]
210
        cmp     [edx+usb_descr.bcdDevice], 0x400
212
        cmp     cx, 0x400
-
 
213
        jnz     @f
211
        jnz     @f
214
        mov     [eax + ftdi_context.chipType], TYPE_BM
212
        mov     [eax + ftdi_context.chipType], TYPE_BM
215
        jmp     .slow
213
  @@:      
216
  @@:      
214
        cmp     [edx+usb_descr.bcdDevice], 0x200
217
        cmp     cx, 0x200
-
 
218
        jnz     @f
215
        jnz     @f
219
        mov     [eax + ftdi_context.chipType], TYPE_AM
216
        mov     [eax + ftdi_context.chipType], TYPE_AM
220
        jmp     .slow
217
  @@:     
221
  @@:     
218
        cmp     [edx+usb_descr.bcdDevice], 0x500
222
        cmp     cx, 0x500
-
 
223
        jnz     @f
219
        jnz     @f
224
        mov     [eax + ftdi_context.chipType], TYPE_2232C 
220
        mov     [eax + ftdi_context.chipType], TYPE_2232C        
225
        jmp     .slow
221
  @@:      
226
  @@:      
222
        cmp     [edx+usb_descr.bcdDevice], 0x600
227
        cmp     cx, 0x600
-
 
228
        jnz     @f
223
        jnz     @f
229
        mov     [eax + ftdi_context.chipType], TYPE_R
224
        mov     [eax + ftdi_context.chipType], TYPE_R
230
        jmp     .slow
225
  @@:      
231
  @@:      
226
        cmp     [edx+usb_descr.bcdDevice], 0x700
232
        cmp     cx, 0x700
-
 
233
        jnz     @f
227
        jnz     @f
234
        mov     [eax + ftdi_context.chipType], TYPE_2232H
228
        mov     [eax + ftdi_context.chipType], TYPE_2232H
235
        jmp     .fast
229
  @@:      
236
  @@:      
230
        cmp     [edx+usb_descr.bcdDevice], 0x900
237
        cmp     cx, 0x900
-
 
238
        jnz     @f
231
        jnz     @f
239
        mov     [eax + ftdi_context.chipType], TYPE_232H
232
        mov     [eax + ftdi_context.chipType], TYPE_232H
240
        jmp     .fast
233
  @@:      
241
  @@:      
234
        cmp     [edx+usb_descr.bcdDevice], 0x1000
242
        cmp     cx, 0x1000
235
        jnz     @f
243
        jnz     .slow
236
        mov     [eax + ftdi_context.chipType], TYPE_BM
244
        mov     [eax + ftdi_context.chipType], TYPE_230X
-
 
245
        jmp     .fast
237
  @@:
246
        
-
 
247
  .fast:
238
  
248
        add     [eax + ftdi_context.maxPacketSize], 512-64
239
        DEBUGF 1,'K : Open first pipe\n'
249
  .slow:    
-
 
250
        mov     ebx, eax
-
 
251
        stdcall USBOpenPipe, [.config_pipe],  0x81,  [ebx + ftdi_context.maxPacketSize],  BULK_PIPE, 0
240
        mov     ebx, eax
252
        test    eax, eax
-
 
253
        jz      .nothing
241
        stdcall USBOpenPipe, [.config_pipe],  0x81,  0x40,  BULK_PIPE, 0
254
        mov     [ebx + ftdi_context.inEP], eax
242
        mov     [ebx + ftdi_context.inEP], eax
255
        stdcall USBOpenPipe, [.config_pipe],  0x02,  [ebx + ftdi_context.maxPacketSize],  BULK_PIPE, 0
243
        DEBUGF 1,'K : Open second pipe\n'
256
        test    eax, eax
244
        stdcall USBOpenPipe, [.config_pipe],  0x02,  0x40,  BULK_PIPE, 0
257
        jz      .nothing
245
        mov     [ebx + ftdi_context.outEP], eax
258
        mov     [ebx + ftdi_context.outEP], eax
Line 246... Line 259...
246
        mov     eax, ebx
259
        mov     eax, ebx
Line 295... Line 308...
295
        mov     esi, [edi+output]
308
        mov     esi, [edi+output]
296
        mov     dword[esi], 'LCKD'
309
        mov     dword[esi], 'LCKD'
297
        jmp     .endswitch
310
        jmp     .endswitch
Line 298... Line 311...
298
        
311
        
-
 
312
  .pid_ok:
-
 
313
        dec     eax
-
 
314
        jz      .ftdi_get_wchunksize    ;5
-
 
315
        dec     eax
-
 
316
        jz      .ftdi_get_rchunksize    ;7        
-
 
317
        
-
 
318
        mov     edi, [edi+input]
-
 
319
        
-
 
320
        dec     eax
-
 
321
        jz      .ftdi_set_rchunksize    ;6
-
 
322
        dec     eax
-
 
323
        jz      .ftdi_set_wchunksize    ;4
299
  .pid_ok:  
324
  
300
        push    eax edi
325
        push    eax edi
301
        mov     ecx, 0x80000000
326
        mov     ecx, 0x80000000
302
        cmp     eax, 17
327
        cmp     eax, 17
303
        je     .bulkevent
328
        je      .bulkevent
Line 309... Line 334...
309
        call    CreateEvent        
334
        call    CreateEvent        
310
        mov     [EventData], eax
335
        mov     [EventData], eax
311
        mov     [EventData+4], edx
336
        mov     [EventData+4], edx
312
        pop     edi eax 
337
        pop     edi eax
Line 313... Line 338...
313
        
338
        
314
        dec     eax                 ;4
339
        dec     eax                 ;8
315
        jz      .ftdi_set_bitmode
340
        jz      .ftdi_set_bitmode
316
        dec     eax                 ;5
341
        dec     eax                 ;9
317
        jz      .ftdi_setrtshigh   
342
        jz      .ftdi_setrtshigh   
318
        dec     eax                 ;6
343
        dec     eax                 ;10
319
        jz      .ftdi_setrtslow  
344
        jz      .ftdi_setrtslow  
320
        dec     eax                 ;7
345
        dec     eax                 ;11
321
        jz      .ftdi_setdtrhigh
346
        jz      .ftdi_setdtrhigh
322
        dec     eax                 ;8
347
        dec     eax                 ;12
323
        jz      .ftdi_setdtrlow
348
        jz      .ftdi_setdtrlow
324
        dec     eax                 ;9
349
        dec     eax                 ;13
325
        jz      .ftdi_usb_reset
350
        jz      .ftdi_usb_reset
326
        dec     eax                 ;10
351
        dec     eax                 ;14
327
        jz      .ftdi_setflowctrl
352
        jz      .ftdi_setflowctrl
328
        dec     eax                 ;11
353
        dec     eax                 ;15
329
        jz      .ftdi_set_event_char
354
        jz      .ftdi_set_event_char
330
        dec     eax                 ;12
355
        dec     eax                 ;16
331
        jz      .ftdi_set_error_char
356
        jz      .ftdi_set_error_char
332
        dec     eax                 ;13
357
        dec     eax                 ;17
333
        jz      .ftdi_set_latency_timer
358
        jz      .ftdi_set_latency_timer
334
        dec     eax                 ;14
359
        dec     eax                 ;18
335
        jz      .ftdi_get_latency_timer
360
        jz      .ftdi_get_latency_timer
336
        dec     eax                 ;15
361
        dec     eax                 ;19
337
        jz      .ftdi_read_pins
362
        jz      .ftdi_read_pins
338
        dec     eax                 ;16
363
        dec     eax                 ;20
339
        jz      .ftdi_poll_modem_status
364
        jz      .ftdi_poll_modem_status
340
        dec     eax                 ;17
365
        dec     eax                 ;21
341
        jz      .ftdi_write_data
366
        jz      .ftdi_write_data
342
        dec     eax                 ;18
367
        dec     eax                 ;22
343
        jz      .ftdi_read_data
368
        jz      .ftdi_read_data
344
        dec     eax                 ;19
369
        dec     eax                 ;23
345
        jz      .ftdi_set_baudrate
370
        jz      .ftdi_set_baudrate
346
        dec     eax                 ;20
371
        dec     eax                 ;24
347
        jz      .ftdi_set_line_property
372
        jz      .ftdi_set_line_property
348
        dec     eax                 ;21
373
        dec     eax                 ;25
349
        jz      .ftdi_purge_rx_buf
374
        jz      .ftdi_purge_rx_buf
350
        dec     eax                 ;22
375
        dec     eax                 ;26
-
 
376
        jz      .ftdi_purge_tx_buf
Line 351... Line 377...
351
        jz      .ftdi_purge_tx_buf
377
        jmp     .error
-
 
378
                  
-
 
379
  .version:     
-
 
380
        jmp     .endswitch
-
 
381
  .error:
-
 
382
        mov     esi, [edi+output]
352
                
383
        mov     [esi], dword 'ERR0'
353
  .version:     
384
        or      [esi], eax
354
  .endswitch:
385
  .endswitch:
Line -... Line 386...
-
 
386
        xor     eax, eax
-
 
387
	    ret
-
 
388
        
-
 
389
  .eventdestroy:
-
 
390
        mov     eax, [EventData]
-
 
391
        mov     ebx, [EventData+4]
-
 
392
        call    DestroyEvent
-
 
393
        jmp     .endswitch
-
 
394
        
355
        xor     eax, eax
395
  .ftdi_out_control_transfer_withinp:               
356
	    ret 
396
        mov     dx, word[edi+8]                
357
        
397
        mov     word[ConfPacket+2], dx 
358
  .ftdi_out_control_transfer:
398
  .ftdi_out_control_transfer_noinp:
359
        mov     ebx, [edi]
399
        mov     ebx, [edi+4]
360
        mov     cx, word[ebx + ftdi_context.index]
400
        mov     cx, word[ebx + ftdi_context.index]
361
        mov     word[ConfPacket+4], cx
401
        mov     word[ConfPacket+4], cx
362
        xor     cx, cx
402
        xor     cx, cx
363
        mov     word[ConfPacket+6], cx
403
        mov     word[ConfPacket+6], cx
364
  .own_index:
404
  .own_index:
365
        mov    ebx, [edi+4]
405
        mov     ebx, [edi+4]
366
        DEBUGF 1,'K : ConfPacket %x %x\n', [ConfPacket], [ConfPacket+4]          
406
        DEBUGF 1,'K : ConfPacket %x %x\n', [ConfPacket], [ConfPacket+4]          
367
        lea     esi, [ConfPacket]
407
        lea     esi, [ConfPacket]
-
 
408
        lea     edi, [EventData]        
368
        lea     edi, [EventData]        
409
        stdcall USBControlTransferAsync, [ebx + ftdi_context.nullP],  esi, 0, 0, control_callback, edi, 0
369
        stdcall USBControlTransferAsync, [ebx + ftdi_context.nullP],  esi, 0, 0, control_callback, edi, 0
410
        test    eax, eax        
370
        DEBUGF 1, 'K : Returned value is %d\n', eax
411
        jz      .error
371
        mov     eax, [EventData]
412
        mov     eax, [EventData]
Line 372... Line -...
372
        mov     ebx, [EventData+4]
-
 
373
        call    WaitEvent     
-
 
374
        jmp     .endswitch
-
 
375
        
-
 
376
  .ftdi_set_bitmode:
-
 
377
        DEBUGF 1,'K : FTDI Seting bitmode\n'                   
-
 
378
        mov     word[ConfPacket], (FTDI_DEVICE_OUT_REQTYPE) + (SIO_SET_BITMODE_REQUEST shl 8)
-
 
379
        mov     edi, [edi+input]        
-
 
380
        mov     dx, word[edi+8]                
413
        mov     ebx, [EventData+4]
381
        mov     word[ConfPacket+2], dx                                        
414
        call    WaitEvent     
382
        jmp     .ftdi_out_control_transfer     
415
        jmp     .endswitch
383
 
416
        
Line 384... Line 417...
384
  .ftdi_setrtshigh:
417
  .ftdi_setrtshigh:
385
        DEBUGF 1,'K : FTDI Setting RTS pin HIGH\n'                     
418
        DEBUGF 1,'K : FTDI Setting RTS pin HIGH\n'                     
386
        mov     dword[ConfPacket], (FTDI_DEVICE_OUT_REQTYPE) + (SIO_SET_MODEM_CTRL_REQUEST shl 8) + (SIO_SET_RTS_HIGH shl 16)
419
        mov     dword[ConfPacket], (FTDI_DEVICE_OUT_REQTYPE) + (SIO_SET_MODEM_CTRL_REQUEST shl 8) + (SIO_SET_RTS_HIGH shl 16)
387
        jmp     .ftdi_out_control_transfer         
420
        jmp     .ftdi_out_control_transfer_noinp         
Line 388... Line 421...
388
 
421
 
389
  .ftdi_setrtslow:
422
  .ftdi_setrtslow:
390
        DEBUGF 1,'K : FTDI Setting RTS pin LOW\n'             
423
        DEBUGF 1,'K : FTDI Setting RTS pin LOW\n'             
391
        mov     dword[ConfPacket], (FTDI_DEVICE_OUT_REQTYPE) + (SIO_SET_MODEM_CTRL_REQUEST shl 8) + (SIO_SET_RTS_LOW shl 16)
424
        mov     dword[ConfPacket], (FTDI_DEVICE_OUT_REQTYPE) + (SIO_SET_MODEM_CTRL_REQUEST shl 8) + (SIO_SET_RTS_LOW shl 16)
Line 392... Line 425...
392
        jmp     .ftdi_out_control_transfer         
425
        jmp     .ftdi_out_control_transfer_noinp           
393
        
426
        
394
  .ftdi_setdtrhigh:
427
  .ftdi_setdtrhigh:
395
        DEBUGF 1,'K : FTDI Setting DTR pin HIGH\n'                     
428
        DEBUGF 1,'K : FTDI Setting DTR pin HIGH\n'                     
Line 396... Line 429...
396
        mov     dword[ConfPacket], (FTDI_DEVICE_OUT_REQTYPE) + (SIO_SET_MODEM_CTRL_REQUEST shl 8) + (SIO_SET_DTR_HIGH shl 16)
429
        mov     dword[ConfPacket], (FTDI_DEVICE_OUT_REQTYPE) + (SIO_SET_MODEM_CTRL_REQUEST shl 8) + (SIO_SET_DTR_HIGH shl 16)
397
        jmp     .ftdi_out_control_transfer         
430
        jmp     .ftdi_out_control_transfer_noinp           
398
 
431
 
399
  .ftdi_setdtrlow:
432
  .ftdi_setdtrlow:
Line 400... Line 433...
400
        DEBUGF 1,'K : FTDI Setting DTR pin LOW\n'             
433
        DEBUGF 1,'K : FTDI Setting DTR pin LOW\n'             
401
        mov     dword[ConfPacket], (FTDI_DEVICE_OUT_REQTYPE) + (SIO_SET_MODEM_CTRL_REQUEST shl 8) + (SIO_SET_DTR_LOW shl 16)
434
        mov     dword[ConfPacket], (FTDI_DEVICE_OUT_REQTYPE) + (SIO_SET_MODEM_CTRL_REQUEST shl 8) + (SIO_SET_DTR_LOW shl 16)
402
        jmp     .ftdi_out_control_transfer         
435
        jmp     .ftdi_out_control_transfer_noinp           
Line 403... Line 436...
403
        
436
        
404
  .ftdi_usb_reset:
437
  .ftdi_usb_reset:
405
        DEBUGF 1,'K : FTDI Reseting\n'
438
        DEBUGF 1,'K : FTDI Reseting\n'
406
        mov     dword[ConfPacket], (FTDI_DEVICE_OUT_REQTYPE) + (SIO_RESET_REQUEST shl 8) + (SIO_RESET_SIO shl 16)
-
 
407
        jmp     .ftdi_out_control_transfer
-
 
408
        
-
 
409
  .ftdi_purge_rx_buf:
-
 
410
        mov     dword[ConfPacket], (FTDI_DEVICE_OUT_REQTYPE) + (SIO_RESET_REQUEST shl 8) + (SIO_RESET_PURGE_RX shl 16)
-
 
411
        jmp     .ftdi_out_control_transfer
-
 
412
        
-
 
413
  .ftdi_purge_tx_buf:
-
 
414
        mov     dword[ConfPacket], (FTDI_DEVICE_OUT_REQTYPE) + (SIO_RESET_REQUEST shl 8) + (SIO_RESET_PURGE_TX shl 16)
-
 
415
        jmp     .ftdi_out_control_transfer
-
 
416
 
-
 
417
H_CLK = 120000000
-
 
418
C_CLK = 48000000        
-
 
419
  .ftdi_set_baudrate:
-
 
420
        mov     edi, [edi+input]
-
 
421
        mov     ebx, [edi]
-
 
422
        cmp     [ebx + ftdi_context.chipType], TYPE_2232H
-
 
423
        jl      .c_clk        
-
 
424
        imul    eax, [edi+8], 10
-
 
425
        cmp     eax, H_CLK / 0x3FFF        
-
 
426
        jle     .c_clk
-
 
427
  .h_clk:       
-
 
428
        cmp     dword[edi+8], H_CLK/10
-
 
429
        jl      .h_nextbaud1
-
 
430
        xor     edx, edx
-
 
431
        mov     ecx, H_CLK/10
-
 
432
        jmp     .calcend
-
 
433
        
-
 
434
  .c_clk:
-
 
435
        cmp     dword[edi+8], C_CLK/10
-
 
436
        jl      .c_nextbaud1
-
 
437
        xor     edx, edx
-
 
438
        mov     ecx, C_CLK/10
-
 
439
        jmp     .calcend  
-
 
440
  
-
 
441
  .h_nextbaud1:
-
 
442
        cmp     dword[edi+8], H_CLK/(10 + 10/2)
-
 
443
        jl      .h_nextbaud2
-
 
444
        mov     edx, 1
-
 
445
        mov     ecx, H_CLK/(10 + 10/2)
-
 
446
        jmp     .calcend
-
 
447
        
-
 
448
  .c_nextbaud1:
-
 
449
        cmp     dword[edi+8], C_CLK/(10 + 10/2)
-
 
450
        jl      .c_nextbaud2
-
 
451
        mov     edx, 1
-
 
452
        mov     ecx, C_CLK/(10 + 10/2)
-
 
453
        jmp     .calcend        
-
 
454
        
-
 
455
  .h_nextbaud2:      
-
 
456
        cmp     dword[edi+8], H_CLK/(2*10)
-
 
457
        jl      .h_nextbaud3
-
 
458
        mov     edx, 2
-
 
459
        mov     ecx, H_CLK/(2*10)
-
 
460
        jmp     .calcend
-
 
461
        
-
 
462
  .c_nextbaud2:      
-
 
463
        cmp     dword[edi+8], C_CLK/(2*10)
-
 
464
        jl      .c_nextbaud3
-
 
465
        mov     edx, 2
-
 
466
        mov     ecx, C_CLK/(2*10)
-
 
467
        jmp     .calcend        
-
 
468
        
-
 
469
  .h_nextbaud3:
-
 
470
        mov     eax, H_CLK*16/10  ; eax - best_divisor
-
 
471
        div     dword[edi+8]      ; [edi+8] - baudrate
-
 
472
        push    eax
-
 
473
        and     eax, 1
-
 
474
        pop     eax
-
 
475
        shr     eax, 1
-
 
476
        jz      .h_rounddowndiv     ; jump by result of and eax, 1
-
 
477
        inc     eax
-
 
478
  .h_rounddowndiv:
-
 
479
        cmp     eax, 0x20000
-
 
480
        jle     .h_best_divok
-
 
481
        mov     eax, 0x1FFFF
-
 
482
  .h_best_divok:
-
 
483
        mov     ecx, eax        
-
 
484
        mov     eax, H_CLK*16/10
-
 
485
        div     ecx
-
 
486
        xchg    ecx, eax            ; ecx - best_baud
-
 
487
        push    ecx
-
 
488
        and     ecx, 1
-
 
489
        pop     ecx
-
 
490
        shr     ecx, 1
-
 
491
        jz      .rounddownbaud
-
 
492
        inc     ecx
-
 
493
        jmp     .rounddownbaud
-
 
494
        
-
 
495
  .c_nextbaud3:
-
 
496
        mov     eax, C_CLK*16/10  ; eax - best_divisor
-
 
497
        div     dword[edi+8]      ; [edi+8] - baudrate
-
 
498
        push    eax
-
 
499
        and     eax, 1
-
 
500
        pop     eax
-
 
501
        shr     eax, 1
-
 
502
        jz      .c_rounddowndiv     ; jump by result of and eax, 1
-
 
503
        inc     eax
-
 
504
  .c_rounddowndiv:
-
 
505
        cmp     eax, 0x20000
-
 
506
        jle     .c_best_divok
-
 
507
        mov     eax, 0x1FFFF
-
 
508
  .c_best_divok:
-
 
509
        mov     ecx, eax        
-
 
510
        mov     eax, C_CLK*16/10
-
 
511
        div     ecx
-
 
512
        xchg    ecx, eax            ; ecx - best_baud
-
 
513
        push    ecx
-
 
514
        and     ecx, 1
-
 
515
        pop     ecx
-
 
516
        shr     ecx, 1
-
 
517
        jz      .rounddownbaud
-
 
518
        inc     ecx
-
 
519
        
-
 
520
  .rounddownbaud:
-
 
521
        mov     edx, eax            ; edx - encoded_divisor
-
 
522
        shr     edx, 3
-
 
523
        and     eax, 0x7
-
 
524
        push    esp
-
 
525
        push    7 6 5 1 4 2 3 0
-
 
526
        mov     eax, [esp+eax*4]
-
 
527
        shl     eax, 14
-
 
528
        or      edx, eax
-
 
529
        mov     esp, [esp+36]
-
 
530
        
-
 
531
  .calcend:
-
 
532
        mov     eax, edx        ; eax - *value
-
 
Line 533... Line 439...
533
        mov     ecx, edx        ; ecx - *index
439
        mov     dword[ConfPacket], (FTDI_DEVICE_OUT_REQTYPE) + (SIO_RESET_REQUEST shl 8) + (SIO_RESET_SIO shl 16)
534
        and     eax, 0xFFFF
-
 
535
        cmp     [ebx + ftdi_context.chipType], TYPE_2232H
440
        jmp     .ftdi_out_control_transfer_noinp  
536
        jge     .foxyindex        
441
        
537
        shr     ecx, 16
-
 
538
        jmp     .preparepacket
442
  .ftdi_purge_rx_buf:
Line 539... Line 443...
539
  .foxyindex:
443
        mov     dword[ConfPacket], (FTDI_DEVICE_OUT_REQTYPE) + (SIO_RESET_REQUEST shl 8) + (SIO_RESET_PURGE_RX shl 16)
540
        shr     ecx, 8
444
        jmp     .ftdi_out_control_transfer_noinp  
541
        and     ecx, 0xFF00
-
 
542
        or      ecx, [ebx + ftdi_context.index]
-
 
543
        
-
 
544
  .preparepacket:
445
        
Line 545... Line 446...
545
        mov     word[ConfPacket], (FTDI_DEVICE_OUT_REQTYPE) + (SIO_SET_BAUDRATE_REQUEST shl 8)
446
  .ftdi_purge_tx_buf:
546
        mov     word[ConfPacket+2], ax
447
        mov     dword[ConfPacket], (FTDI_DEVICE_OUT_REQTYPE) + (SIO_RESET_REQUEST shl 8) + (SIO_RESET_PURGE_TX shl 16)
547
        mov     word[ConfPacket+4], cx
-
 
548
        mov     word[ConfPacket+6], 0
-
 
549
        jmp     .own_index
-
 
550
     
448
        jmp     .ftdi_out_control_transfer_noinp  
Line 551... Line 449...
551
  .ftdi_set_line_property:
449
        
552
        mov     word[ConfPacket], (FTDI_DEVICE_OUT_REQTYPE) + (SIO_SET_DATA_REQUEST shl 8)
450
  .ftdi_set_bitmode:
553
        mov     edi, [edi+input]        
-
 
554
        mov     dx, word[edi+8]                
-
 
555
        mov     word[ConfPacket+2], dx
-
 
556
        jmp     .ftdi_out_control_transfer
451
        DEBUGF 1,'K : FTDI Seting bitmode\n'                   
Line 557... Line 452...
557
        
452
        mov     word[ConfPacket], (FTDI_DEVICE_OUT_REQTYPE) + (SIO_SET_BITMODE_REQUEST shl 8)                                       
558
  .ftdi_set_latency_timer:
453
        jmp     .ftdi_out_control_transfer_withinp        
559
        mov     word[ConfPacket], (FTDI_DEVICE_OUT_REQTYPE) + (SIO_SET_LATENCY_TIMER_REQUEST shl 8)
-
 
560
        mov     edi, [edi+input]        
-
 
561
        mov     dx, word[edi+8]                
-
 
562
        mov     word[ConfPacket+2], dx        
454
     
Line 563... Line 455...
563
        jmp     .ftdi_out_control_transfer
455
  .ftdi_set_line_property:
564
        
456
        mov     word[ConfPacket], (FTDI_DEVICE_OUT_REQTYPE) + (SIO_SET_DATA_REQUEST shl 8)
565
  .ftdi_set_event_char:
-
 
566
        mov     word[ConfPacket], (FTDI_DEVICE_OUT_REQTYPE) + (SIO_SET_EVENT_CHAR_REQUEST shl 8)
457
        jmp     .ftdi_out_control_transfer_withinp
567
        mov     edi, [edi+input]        
458
        
568
        mov     dx, word[edi+8]                
459
  .ftdi_set_latency_timer:
569
        mov     word[ConfPacket+2], dx
460
        mov     word[ConfPacket], (FTDI_DEVICE_OUT_REQTYPE) + (SIO_SET_LATENCY_TIMER_REQUEST shl 8)        
570
        jmp     .ftdi_out_control_transfer
461
        jmp     .ftdi_out_control_transfer_withinp
571
 
462
        
572
  .ftdi_set_error_char:
463
  .ftdi_set_event_char:
Line 573... Line 464...
573
        mov     word[ConfPacket], (FTDI_DEVICE_OUT_REQTYPE) + (SIO_SET_ERROR_CHAR_REQUEST shl 8)
464
        mov     word[ConfPacket], (FTDI_DEVICE_OUT_REQTYPE) + (SIO_SET_EVENT_CHAR_REQUEST shl 8)
574
        mov     edi, [edi+input]        
-
 
575
        mov     dx, word[edi+8]                
-
 
576
        mov     word[ConfPacket+2], dx
465
        jmp     .ftdi_out_control_transfer_withinp
577
        jmp     .ftdi_out_control_transfer 
466
 
578
        
467
  .ftdi_set_error_char:
579
  .ftdi_setflowctrl:
468
        mov     word[ConfPacket], (FTDI_DEVICE_OUT_REQTYPE) + (SIO_SET_ERROR_CHAR_REQUEST shl 8)
580
        mov     dword[ConfPacket], (FTDI_DEVICE_OUT_REQTYPE) + (SIO_SET_FLOW_CTRL_REQUEST shl 8) + (0 shl 16)      
469
        jmp     .ftdi_out_control_transfer_withinp 
581
        mov     edi, [edi+input]
470
        
582
        mov     ebx, [edi]
471
  .ftdi_setflowctrl:
583
        mov     cx, word[edi+8]   
472
        mov     dword[ConfPacket], (FTDI_DEVICE_OUT_REQTYPE) + (SIO_SET_FLOW_CTRL_REQUEST shl 8) + (0 shl 16)
584
        or      ecx, [ebx + ftdi_context.index]
473
        mov     ebx, [edi+4]
585
        mov     word[ConfPacket+4], cx
474
        mov     cx, word[edi+8]   
586
        xor     cx, cx
-
 
587
        mov     word[ConfPacket+6], cx
475
        or      ecx, [ebx + ftdi_context.index]
588
        jmp     .own_index
476
        mov     word[ConfPacket+4], cx
589
 
477
        xor     cx, cx
590
  .ftdi_read_pins:
478
        mov     word[ConfPacket+6], cx
Line 591... Line 479...
591
        DEBUGF 1,'K : FTDI Reading pins\n'
479
        jmp     .own_index
-
 
480
 
-
 
481
  .ftdi_read_pins:                            
-
 
482
        mov     ebx, [edi] 
-
 
483
        mov     dword[ConfPacket], FTDI_DEVICE_IN_REQTYPE + (SIO_READ_PINS_REQUEST shl 8) + (0 shl 16)
-
 
484
        mov     ecx, [ebx + ftdi_context.index]
-
 
485
        mov     word[ConfPacket+4], cx
-
 
486
        mov     word[ConfPacket+6], 1
-
 
487
        lea     esi, [ConfPacket]
-
 
488
        lea     edi, [EventData]
-
 
489
        mov     ecx, [ioctl]
-
 
490
        mov     ecx, [ecx+output]
-
 
491
        stdcall USBControlTransferAsync, [ebx + ftdi_context.nullP],  esi, ecx, 1, control_callback, edi, 0
-
 
492
        mov     eax, [EventData]
-
 
493
        mov     ebx, [EventData+4]
-
 
494
        call    WaitEvent     
-
 
495
        jmp     .endswitch
-
 
496
        
-
 
497
  .ftdi_set_wchunksize:
-
 
498
        mov     ebx, [edi+4]
-
 
499
        mov     ecx, [edi+8]
-
 
500
        cmp     [ebx + ftdi_context.maxPacketSize], ecx
-
 
501
        jg      .error
-
 
502
        mov     [ebx + ftdi_context.writeBufChunkSize], ecx
-
 
503
        jmp     .endswitch
-
 
504
   
592
        mov     edi, [edi+input]                                  
505
  .ftdi_get_wchunksize:
593
        mov     ebx, [edi] 
506
        mov     esi, [edi+output]
-
 
507
        mov     edi, [edi+input]
-
 
508
        mov     ebx, [edi+4]
-
 
509
        mov     ecx, [ebx + ftdi_context.writeBufChunkSize]
-
 
510
        mov     [esi], ecx
-
 
511
        jmp     .endswitch
-
 
512
 
-
 
513
  .ftdi_set_rchunksize:
-
 
514
        mov     ebx, [edi+4]
594
        mov     dword[ConfPacket], FTDI_DEVICE_IN_REQTYPE + (SIO_READ_PINS_REQUEST shl 8) + (0 shl 16)
515
        mov     ecx, [edi+8]
595
        mov     ecx, [ebx + ftdi_context.index]
516
        cmp     [ebx + ftdi_context.maxPacketSize], ecx
596
        mov     word[ConfPacket+4], cx
-
 
597
        mov     word[ConfPacket+6], 1
-
 
598
        lea     esi, [ConfPacket]
-
 
599
        lea     edi, [EventData]
517
        jg      .error
600
        mov     ecx, [ioctl]
-
 
601
        mov     ecx, [ecx+output]
-
 
602
        stdcall USBControlTransferAsync, [ebx + ftdi_context.nullP],  esi, ecx, 1, control_callback, edi, 0
-
 
603
        DEBUGF 1, 'K : Returned value is %d\n', eax
518
        mov     [ebx + ftdi_context.readBufChunkSize], ecx
-
 
519
        jmp     .endswitch
-
 
520
 
-
 
521
  .ftdi_get_rchunksize:
604
        mov     eax, [EventData]
522
        mov     esi, [edi+output]
-
 
523
        mov     edi, [edi+input]
605
        mov     ebx, [EventData+4]
524
        mov     ebx, [edi+4]
-
 
525
        mov     ecx, [ebx + ftdi_context.readBufChunkSize]
606
        call    WaitEvent     
526
        mov     [esi], ecx
607
        jmp     .endswitch
-
 
608
 
527
        jmp     .endswitch        
609
  .ftdi_write_data:
528
 
610
        mov     edi, [edi+input]        
529
  .ftdi_write_data:
-
 
530
        mov     esi, edi
-
 
531
        add     esi, 12        
-
 
532
        mov     ebx, [edi+4]
611
        mov     ebx, [edi+4]
533
        xor     ecx, ecx        ; ecx - offset      
612
        xor     ecx, ecx        ; ecx - offset     
534
  .write_loop:
613
  .dataleft:        
535
        mov     edx, [edi+8]    ; edx - write_size
614
        mov     edx, [ebx + ftdi_context.writeBufChunkSize] ; edx - write_size
536
        sub     edx, ecx
615
        push    ecx
537
        cmp     edx, [ebx + ftdi_context.writeBufChunkSize]
616
        add     ecx, edx
538
        jle     .lessthanchunk_write
617
        cmp     ecx, [edi+8]    ; [edi+8] - size
539
        mov     edx, [ebx + ftdi_context.writeBufChunkSize]
Line 618... Line 540...
618
        pop     ecx
540
  .lessthanchunk_write:
-
 
541
        add     esi, ecx
619
        jle     .morethanchunk_write
542
        lea     eax, [EventData]
620
        mov     edx, [edi+8]           
543
        push    ecx ebx esi edi
621
        sub     edx, ecx
544
        stdcall USBNormalTransferAsync, [ebx + ftdi_context.inEP], esi, edx, bulk_callback, eax, 1        
622
  .morethanchunk_write:
545
        mov     eax, [EventData]
623
        lea     eax, [EventData]
546
        mov     ebx, [EventData+4]
624
        stdcall USBNormalTransferAsync, [ebx + ftdi_context.inEP], [edi+12+ecx], edx, bulk_callback, eax, 1
547
        call    WaitEvent
-
 
548
        mov     eax, [EventData]
-
 
549
        mov     ebx, [EventData+4]        
625
        push    ebx edi edx ecx
550
        call    ClearEvent
626
        mov     eax, [EventData]
-
 
627
        mov     ebx, [EventData+4]
-
 
628
        call    WaitEvent
551
        pop     edi esi ebx ecx
629
        pop     ecx edx edi ebx
552
        cmp     [EventData+8], -1
630
        cmp     [EventData+8], -1
553
        jz .error
631
        jz      .endswitch;jz      .error
554
        add     ecx, [EventData+8]
632
        add     ecx, [EventData+8]
555
        cmp     ecx, [edi+8]
633
        cmp     ecx, [edi+8]
556
        jge     .eventdestroy
634
        jl      .dataleft
557
        jmp     .write_loop
-
 
558
        
635
        jmp     .endswitch
559
  .ftdi_read_data:
636
        
560
        mov     edi, [ioctl]
637
  .ftdi_read_data:
561
        mov     esi, [edi+input]
-
 
562
        mov     edi, [edi+output]
-
 
563
        mov     ebx, [esi+4]        
-
 
564
        xor     ecx, ecx
638
        mov     esi, [edi+input]
565
  .read_loop:  
639
        mov     edi, [edi+output]
566
        mov     edx, [esi+8]
640
        mov     ebx, [esi+4]        
567
        cmp     ecx, edx
641
        xor     ecx, ecx
568
        jge     .eventdestroy ;!!!
642
  .read_loop:
569
        sub     edx, ecx
Line 643... Line 570...
643
        mov     edx, [esi+8]
570
        cmp     edx, [ebx + ftdi_context.readBufChunkSize]
644
        sub     edx, ecx
-
 
645
        test    edx, edx
571
        jl      .lessthanchunk_read
646
        jz      .endswitch
572
        mov     edx, [ebx + ftdi_context.readBufChunkSize]     
647
        cmp     edx, [ebx + ftdi_context.readBufChunkSize]
573
  .lessthanchunk_read:
648
        jl      .lessthanchunk_read
574
        lea     eax, [EventData]
649
        mov     edx, [ebx + ftdi_context.readBufChunkSize]     
575
        add     edi, ecx
650
  .lessthanchunk_read:
576
        push    esi edi ecx ebx
651
        lea     eax, [EventData]
577
        stdcall USBNormalTransferAsync, [ebx + ftdi_context.outEP], edi, edx, bulk_callback, eax, 1        
652
        stdcall USBNormalTransferAsync, [ebx + ftdi_context.outEP], [edi+ecx], edx, bulk_callback, eax, 1        
578
        mov     eax, [EventData]
653
        push    esi edi ecx ebx
579
        mov     ebx, [EventData+4]        
654
        mov     eax, [EventData]
580
        call    WaitEvent
655
        mov     ebx, [EventData+4]        
-
 
656
        call    WaitEvent
581
        mov     eax, [EventData]
657
        pop     ebx ecx edi esi
582
        mov     ebx, [EventData+4]        
658
        cmp     [EventData+8], -1
583
        call    ClearEvent
659
        jz      .endswitch;jz      .error
584
        pop     ebx ecx edi esi
660
        add     ecx, [EventData+8]
585
        cmp     [EventData+8], -1
661
        jmp     .read_loop 
586
        jz      .error
662
        
587
        add     ecx, [EventData+8]
663
  .ftdi_poll_modem_status:
588
        jmp     .read_loop 
Line 664... Line 589...
664
        mov     edi, [edi+input]                                  
589
        
665
        mov     ebx, [edi+4] 
-
 
666
        mov     dword[ConfPacket], FTDI_DEVICE_IN_REQTYPE + (SIO_POLL_MODEM_STATUS_REQUEST shl 8) + (0 shl 16)
590
  .ftdi_poll_modem_status:                                 
667
        mov     ecx, [ebx + ftdi_context.index]
591
        mov     ebx, [edi+4] 
668
        mov     word[ConfPacket+4], cx
592
        mov     dword[ConfPacket], FTDI_DEVICE_IN_REQTYPE + (SIO_POLL_MODEM_STATUS_REQUEST shl 8) + (0 shl 16)
669
        mov     word[ConfPacket+6], 1
593
        mov     ecx, [ebx + ftdi_context.index]
670
        lea     esi, [ConfPacket]
594
        mov     word[ConfPacket+4], cx
671
        lea     edi, [EventData]
595
        mov     word[ConfPacket+6], 1
672
        mov     ecx, [ioctl]
596
        lea     esi, [ConfPacket]
673
        mov     ecx, [ecx+output]
597
        lea     edi, [EventData]
674
        stdcall USBControlTransferAsync, [ebx + ftdi_context.nullP],  esi, ecx, 2, control_callback, edi, 0
598
        mov     ecx, [ioctl]
675
        DEBUGF 1, 'K : Returned value is %d\n', eax
599
        mov     ecx, [ecx+output]
676
        mov     eax, [EventData]
-
 
677
        mov     ebx, [EventData+4]
600
        stdcall USBControlTransferAsync, [ebx + ftdi_context.nullP],  esi, ecx, 2, control_callback, edi, 0
678
        call    WaitEvent
601
        mov     eax, [EventData]
679
        mov     ax, word[ecx]
602
        mov     ebx, [EventData+4]
680
        xchg    ah, al
603
        call    WaitEvent
Line 681... Line 604...
681
        and     ah, 0xFF
604
        mov     ax, word[ecx]
682
        mov     word[ecx], ax
605
        xchg    ah, al
-
 
606
        and     ah, 0xFF
-
 
607
        mov     word[ecx], ax
683
        jmp     .endswitch
608
        jmp     .endswitch
684
        
609
        
685
  .ftdi_get_latency_timer:
610
  .ftdi_get_latency_timer:                                 
686
        mov     edi, [edi+input]                                  
611
        mov     ebx, [edi+4] 
687
        mov     ebx, [edi+4] 
612
        mov     dword[ConfPacket], FTDI_DEVICE_IN_REQTYPE + (SIO_GET_LATENCY_TIMER_REQUEST shl 8) + (0 shl 16)
Line 753... Line 678...
753
        jmp     .endswitch   
678
        jmp     .endswitch   
754
  .unlockimp:     
679
  .unlockimp:     
755
        mov     [edi], eax
680
        mov     [edi], eax
756
        jmp     .endswitch  
681
        jmp     .endswitch 
Line -... Line 682...
-
 
682
 
-
 
683
H_CLK = 120000000
-
 
684
C_CLK = 48000000        
-
 
685
  .ftdi_set_baudrate:
-
 
686
        mov     ebx, [edi+4]
-
 
687
        cmp     [ebx + ftdi_context.chipType], TYPE_2232H
-
 
688
        jl      .c_clk        
-
 
689
        imul    eax, [edi+8], 10
-
 
690
        cmp     eax, H_CLK / 0x3FFF        
-
 
691
        jle     .c_clk
-
 
692
  .h_clk:       
-
 
693
        cmp     dword[edi+8], H_CLK/10
-
 
694
        jl      .h_nextbaud1
-
 
695
        xor     edx, edx
-
 
696
        mov     ecx, H_CLK/10
-
 
697
        jmp     .calcend
-
 
698
        
-
 
699
  .c_clk:
-
 
700
        cmp     dword[edi+8], C_CLK/10
-
 
701
        jl      .c_nextbaud1
-
 
702
        xor     edx, edx
-
 
703
        mov     ecx, C_CLK/10
-
 
704
        jmp     .calcend  
-
 
705
  
-
 
706
  .h_nextbaud1:
-
 
707
        cmp     dword[edi+8], H_CLK/(10 + 10/2)
-
 
708
        jl      .h_nextbaud2
-
 
709
        mov     edx, 1
-
 
710
        mov     ecx, H_CLK/(10 + 10/2)
-
 
711
        jmp     .calcend
-
 
712
        
-
 
713
  .c_nextbaud1:
-
 
714
        cmp     dword[edi+8], C_CLK/(10 + 10/2)
-
 
715
        jl      .c_nextbaud2
-
 
716
        mov     edx, 1
-
 
717
        mov     ecx, C_CLK/(10 + 10/2)
-
 
718
        jmp     .calcend        
-
 
719
        
-
 
720
  .h_nextbaud2:      
-
 
721
        cmp     dword[edi+8], H_CLK/(2*10)
-
 
722
        jl      .h_nextbaud3
-
 
723
        mov     edx, 2
-
 
724
        mov     ecx, H_CLK/(2*10)
-
 
725
        jmp     .calcend
-
 
726
        
-
 
727
  .c_nextbaud2:      
-
 
728
        cmp     dword[edi+8], C_CLK/(2*10)
-
 
729
        jl      .c_nextbaud3
-
 
730
        mov     edx, 2
-
 
731
        mov     ecx, C_CLK/(2*10)
-
 
732
        jmp     .calcend        
-
 
733
        
-
 
734
  .h_nextbaud3:
-
 
735
        mov     eax, H_CLK*16/10  ; eax - best_divisor
-
 
736
        div     dword[edi+8]      ; [edi+8] - baudrate
-
 
737
        push    eax
-
 
738
        and     eax, 1
-
 
739
        pop     eax
-
 
740
        shr     eax, 1
-
 
741
        jz      .h_rounddowndiv     ; jump by result of and eax, 1
-
 
742
        inc     eax
-
 
743
  .h_rounddowndiv:
-
 
744
        cmp     eax, 0x20000
-
 
745
        jle     .h_best_divok
-
 
746
        mov     eax, 0x1FFFF
-
 
747
  .h_best_divok:
-
 
748
        mov     ecx, eax        
-
 
749
        mov     eax, H_CLK*16/10
-
 
750
        div     ecx
-
 
751
        xchg    ecx, eax            ; ecx - best_baud
-
 
752
        push    ecx
-
 
753
        and     ecx, 1
-
 
754
        pop     ecx
-
 
755
        shr     ecx, 1
-
 
756
        jz      .rounddownbaud
-
 
757
        inc     ecx
-
 
758
        jmp     .rounddownbaud
-
 
759
        
-
 
760
  .c_nextbaud3:
-
 
761
        mov     eax, C_CLK*16/10  ; eax - best_divisor
-
 
762
        div     dword[edi+8]      ; [edi+8] - baudrate
-
 
763
        push    eax
-
 
764
        and     eax, 1
-
 
765
        pop     eax
-
 
766
        shr     eax, 1
-
 
767
        jz      .c_rounddowndiv     ; jump by result of and eax, 1
-
 
768
        inc     eax
-
 
769
  .c_rounddowndiv:
-
 
770
        cmp     eax, 0x20000
-
 
771
        jle     .c_best_divok
-
 
772
        mov     eax, 0x1FFFF
-
 
773
  .c_best_divok:
-
 
774
        mov     ecx, eax        
-
 
775
        mov     eax, C_CLK*16/10
-
 
776
        div     ecx
-
 
777
        xchg    ecx, eax            ; ecx - best_baud
-
 
778
        push    ecx
-
 
779
        and     ecx, 1
-
 
780
        pop     ecx
-
 
781
        shr     ecx, 1
-
 
782
        jz      .rounddownbaud
-
 
783
        inc     ecx
-
 
784
        
-
 
785
  .rounddownbaud:
-
 
786
        mov     edx, eax            ; edx - encoded_divisor
-
 
787
        shr     edx, 3
-
 
788
        and     eax, 0x7
-
 
789
        push    esp
-
 
790
        push    7 6 5 1 4 2 3 0
-
 
791
        mov     eax, [esp+eax*4]
-
 
792
        shl     eax, 14
-
 
793
        or      edx, eax
-
 
794
        mov     esp, [esp+36]
-
 
795
        
-
 
796
  .calcend:
-
 
797
        mov     eax, edx        ; eax - *value
-
 
798
        mov     ecx, edx        ; ecx - *index
-
 
799
        and     eax, 0xFFFF
-
 
800
        cmp     [ebx + ftdi_context.chipType], TYPE_2232H
-
 
801
        jge     .foxyindex        
-
 
802
        shr     ecx, 16
-
 
803
        jmp     .preparepacket
-
 
804
  .foxyindex:
-
 
805
        shr     ecx, 8
-
 
806
        and     ecx, 0xFF00
-
 
807
        or      ecx, [ebx + ftdi_context.index]
-
 
808
        
-
 
809
  .preparepacket:
-
 
810
        mov     word[ConfPacket], (FTDI_DEVICE_OUT_REQTYPE) + (SIO_SET_BAUDRATE_REQUEST shl 8)
-
 
811
        mov     word[ConfPacket+2], ax
-
 
812
        mov     word[ConfPacket+4], cx
-
 
813
        mov     word[ConfPacket+6], 0
-
 
814
        jmp     .own_index        
757
        
815
        
758
endp 
816
endp 
759
restore   handle
817
restore   handle
760
restore   io_code
818
restore   io_code
761
restore   input
819
restore   input
Line 784... Line 842...
784
        DEBUGF 1, 'K : status is %d\n', [.status]        
842
        DEBUGF 1, 'K : status is %d\n', [.status]        
785
        mov     ecx, [.calldata]
843
        mov     ecx, [.calldata]
786
        mov     eax, [ecx]
844
        mov     eax, [ecx]
787
        mov     ebx, [ecx+4]
845
        mov     ebx, [ecx+4]
788
        cmp     [.status], 0
846
        cmp     [.status], 0
789
        jg      .error?
847
        jz      .normal
790
  .error?:
-
 
791
        cmp     [.status], 9
848
        cmp     [.status], 9
792
        jne     .error
849
        jne     .error
-
 
850
  .normal:
793
        mov     edx, [.length]
851
        mov     edx, [.length]
794
        mov     [ecx+8], edx
852
        mov     [ecx+8], edx
795
        jmp     .ok
853
        jmp     .ok
796
  .error:
854
  .error:
797
        mov     [ecx+8], dword -1
855
        mov     [ecx+8], dword -1
798
  .ok:
856
  .ok:    
799
        xor     esi, esi
857
        xor     esi, esi
800
        xor     edx, edx
858
        xor     edx, edx
801
        ;mov     edx, 0x80000000
-
 
802
        call    RaiseEvent            
859
        call    RaiseEvent            
803
        ret
860
        ret
804
endp
861
endp
Line 805... Line 862...
805
 
862