;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; RDOS operating system ; Copyright (C) 1988-2011, Leif Ekblad ; ; This program is free software; you can redistribute it and/or modify ; it under the terms of the GNU General Public License as published by ; the Free Software Foundation; either version 2 of the License, or ; (at your option) any later version. The only exception to this rule ; is for commercial usage in embedded systems. For information on ; usage in commercial embedded systems, contact embedded@rdos.net ; ; This program is distributed in the hope that it will be useful, ; but WITHOUT ANY WARRANTY; without even the implied warranty of ; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ; GNU General Public License for more details. ; ; You should have received a copy of the GNU General Public License ; along with this program; if not, write to the Free Software ; Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA ; ; The author of this program may be contacted at leif@rdos.net ; ; rawbase.ASM ; ; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; include \rdos\kernel\user.def include \rdos\kernel\user.inc .386p IN_SHIFT = 4 OUT_SHIFT = 4 ANA_COUNT = 16 BUF_SIZE = 10000h BUF_MASK = 0FFFFh adc_in_data STRUC aid_amp DW ?,? aid_phase DW ?,? aid_polar DD ?,? adc_in_data ENDS adc_save_data STRUC asd_time DD ? asd_amp DW ?,? asd_phase DW ?,? asd_diff DW ? asd_level DW ? adc_save_data ENDS adc_ana_entry STRUC aae_amp DW ?,? aae_phase DW ?,? aae_diff DW ? aae_level DW ? adc_ana_entry ENDS adc_chan_entry STRUC aad_chan DW ? aad_count DW ? aad_data00 adc_ana_entry <> aad_data01 adc_ana_entry <> aad_data02 adc_ana_entry <> aad_data03 adc_ana_entry <> aad_data04 adc_ana_entry <> aad_data05 adc_ana_entry <> aad_data06 adc_ana_entry <> aad_data07 adc_ana_entry <> aad_data08 adc_ana_entry <> aad_data09 adc_ana_entry <> aad_data10 adc_ana_entry <> aad_data11 adc_ana_entry <> aad_data12 adc_ana_entry <> aad_data13 adc_ana_entry <> aad_data14 adc_ana_entry <> aad_data15 adc_ana_entry <> aad_data16 adc_ana_entry <> aad_data17 adc_ana_entry <> aad_data18 adc_ana_entry <> adc_chan_entry ENDS adc_ana_data STRUC aad_time DD ?,? aad_level DW 11 DUP(?) aad_low adc_chan_entry <> aad_high adc_chan_entry <> adc_ana_data ENDS adc_chan STRUC ac_read DD ? ac_write DD ? ac_data DD ? ac_prev_phase DW ?,? adc_chan ENDS _DATA segment use32 word public 'DATA' adc_chan0 adc_chan <> adc_chan1 adc_chan <> adc_chan2 adc_chan <> adc_chan3 adc_chan <> adc_chan4 adc_chan <> adc_chan5 adc_chan <> adc_chan6 adc_chan <> adc_chan7 adc_chan <> adc_chan8 adc_chan <> adc_chan9 adc_chan <> adc_chan10 adc_chan <> adc_chan_ptr DD 11 DUP(?) read_size DD 11 DUP(?) delay_us DW ? delay_cnt DW ? prim_val DW ? sec_val DW ? prim_ind DD ? sec_ind DD ? start_pos DD ? curr_pos DD ?,? _DATA ends ;;;;;;;;; INTERNAL PROCEDURES ;;;;;;;;;;; _TEXT segment use32 word public 'CODE' assume cs:_TEXT ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; ; ; NAME: InitRaw ; ; DESCRIPTION: Init buffers ; ; PARAMETERS: EBX Channel ; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; public InitRaw_ InitRaw_ Proc near push ebx push ecx push edi ; mov eax,SIZE adc_chan mul ebx lea edi,ds:[eax].adc_chan0 lea ebx,ds:[4*ebx].adc_chan_ptr mov [ebx],edi ; mov [edi].ac_read,0 mov [edi].ac_write,0 mov dword ptr [edi].ac_prev_phase,0 ; mov eax,BUF_SIZE SHL OUT_SHIFT UserGateApp allocate_circ_buf_nr mov [edi].ac_data,edx ; pop edi pop ecx pop ebx ret InitRaw_ Endp ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; ; ; NAME: SetupRaw ; ; DESCRIPTION: Setup buffers ; ; PARAMETERS: EDX Frequency ; ECX Periods ; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; public SetupRaw_ SetupRaw_ Proc near pushad ; mov delay_cnt,0 ; mov eax,edx xor edx,edx div ecx ; mov edx,1000 mul edx ; mov ecx,BUF_SIZE / 8 div ecx ; mov ecx,eax mov eax,1000000000 xor edx,edx div ecx mov delay_us,ax ; popad ret SetupRaw_ Endp ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; ; ; NAME: StartRaw ; ; DESCRIPTION: Start buffers ; ; PARAMETERS: EDX:EAX Start time ; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; public StartRaw_ StartRaw_ Proc near mov start_pos,eax mov curr_pos,0 mov curr_pos+4,0 ret StartRaw_ Endp ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; ; ; NAME: CheckRaw ; ; DESCRIPTION: Check buffer ; ; PARAMETERS: EBX Channel ; ECX Count ; ; RETURNS: EAX 0 = no data, 1 data ok ; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; public CheckRaw_ CheckRaw_ Proc near push ebx ; mov ebx,ds:[4*ebx].adc_chan_ptr mov eax,[ebx].ac_write sub eax,[ebx].ac_read and eax,BUF_MASK cmp eax,ecx jc cbLower cbHigher: mov eax,1 jmp cbDone cbLower: xor eax,eax cbDone: pop ebx ret CheckRaw_ Endp ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; ; ; NAME: WaitData ; ; DESCRIPTION: Wait for data ; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; WaitData Proc near mov ecx,11 mov ebx,OFFSET adc_chan0 xor esi,esi wdLoop: mov eax,[ebx].ac_write sub eax,[ebx].ac_read and eax,BUF_MASK cmp eax,128*32 jae wdOk ; mov ax,delay_us UserGateApp wait_micro_nr jmp WaitData wdOk: add ebx,SIZE adc_chan loop wdLoop ; mov delay_cnt,128 ret WaitData Endp ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; ; ; NAME: GetReadSize ; ; DESCRIPTION: Get read size ; ; RETURNS: EDX Position ; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; GetReadSize Proc near push edi ; mov ebx,OFFSET adc_chan5 mov ebp,[ebx].ac_read add ebp,ANA_COUNT shl ebp,OUT_SHIFT add ebp,[ebx].ac_data mov edx,[ebp].asd_time mov read_size+5*4,ANA_COUNT ; mov ecx,5 mov ebx,OFFSET adc_chan0 mov esi,OFFSET read_size grsLowLoop: mov ebp,[ebx].ac_read add ebp,ANA_COUNT shl ebp,OUT_SHIFT add ebp,[ebx].ac_data grsLowTimeLoop: mov eax,[ebp].asd_time sub eax,edx rcl eax,1 jc grsLowFound ; sub ebp,SIZE adc_save_data jmp grsLowTimeLoop grsLowFound: rcr eax,1 neg eax add ebp,SIZE adc_save_data mov edi,[ebp].asd_time sub edi,edx cmp eax,edi jnc grsLowSave ; sub ebp,SIZE adc_save_data grsLowSave: sub ebp,[ebx].ac_data shr ebp,OUT_SHIFT sub ebp,[ebx].ac_read mov [esi],ebp add esi,4 add ebx,SIZE adc_chan ; loop grsLowLoop ; mov ecx,5 mov ebx,OFFSET adc_chan6 mov esi,OFFSET read_size + 4 * 6 grsHighLoop: mov ebp,[ebx].ac_read add ebp,ANA_COUNT shl ebp,OUT_SHIFT add ebp,[ebx].ac_data grsHighTimeLoop: mov eax,[ebp].asd_time sub eax,edx rcl eax,1 jnc grsHighFound ; add ebp,SIZE adc_save_data jmp grsHighTimeLoop grsHighFound: shr eax,1 sub ebp,SIZE adc_save_data mov edi,[ebp].asd_time sub edi,edx neg edi cmp eax,edi jnc grsHighSave ; add ebp,SIZE adc_save_data grsHighSave: sub ebp,[ebx].ac_data shr ebp,OUT_SHIFT sub ebp,[ebx].ac_read mov [esi],ebp add esi,4 add ebx,SIZE adc_chan ; loop grsHighLoop ; pop edi ret GetReadSize Endp ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; ; ; NAME: CalcMean ; ; DESCRIPTION: Calc means for channels ; ; PARAMETERS: EDI Data ; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; CalcMean Proc near push edi ; add edi,OFFSET aad_level mov ecx,11 mov ebx,OFFSET adc_chan0 xor esi,esi cmChanLoop: push ecx ; xor eax,eax mov ebp,[ebx].ac_read shl ebp,OUT_SHIFT add ebp,[ebx].ac_data mov ecx,[4*esi].read_size cmCalcLoop: movzx edx,[ebp].asd_level add eax,edx add ebp,SIZE adc_save_data loop cmCalcLoop ; xor edx,edx div [4*esi].read_size mov [edi+2*esi],ax ; pop ecx ; inc esi add ebx,SIZE adc_chan ; loop cmChanLoop ; pop edi ret CalcMean Endp ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; ; ; NAME: SelectData ; ; DESCRIPTION: Select data ; ; PARAMETERS: EDI Data ; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; SelectData Proc near lea esi,[edi].aad_level mov prim_val,0 mov sec_val,0 ; mov ecx,11 xor ebx,ebx sdLoop: mov ax,[esi] cmp ax,prim_val jb sdNotPrim ; mov dx,prim_val mov sec_val,dx mov edx,prim_ind mov sec_ind,edx mov prim_val,ax mov prim_ind,ebx jmp sdNext sdNotPrim: cmp ax,sec_val jb sdNext ; mov sec_val,ax mov sec_ind,ebx sdNext: inc ebx add esi,2 loop sdLoop ; mov eax,prim_ind cmp eax,sec_ind jb sdPrimFirst sdSecFirst: mov eax,sec_ind mov [edi].aad_low.aad_chan,ax mov eax,[4*eax].read_size mov [edi].aad_low.aad_count,ax ; mov eax,prim_ind mov [edi].aad_high.aad_chan,ax mov eax,[4*eax].read_size mov [edi].aad_high.aad_count,ax jmp sdDone sdPrimFirst: mov eax,prim_ind mov [edi].aad_low.aad_chan,ax mov eax,[4*eax].read_size mov [edi].aad_low.aad_count,ax ; mov eax,sec_ind mov [edi].aad_high.aad_chan,ax mov eax,[4*eax].read_size mov [edi].aad_high.aad_count,ax sdDone: ret SelectData Endp ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; ; ; NAME: GetData ; ; DESCRIPTION: Get data series ; ; PARAMETERS: EDI Data series ; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; GetData Proc near movzx ecx,[edi].aad_count movzx ebx,[edi].aad_chan add edi,OFFSET aad_data00 mov ebx,ds:[4*ebx].adc_chan_ptr mov esi,[ebx].ac_read shl esi,OUT_SHIFT add esi,[ebx].ac_data gdLoop: add esi,4 movsd movsd movsd loop gdLoop ret GetData Endp ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; ; ; NAME: Advance ; ; DESCRIPTION: Advance channels to new positions ; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Advance Proc near mov ecx,11 mov ebx,OFFSET adc_chan0 mov esi,OFFSET read_size aLoop: mov eax,[esi] add eax,[ebx].ac_read and eax,BUF_MASK mov [ebx].ac_read,eax ; add esi,4 add ebx,SIZE adc_chan ; loop aLoop ret Advance Endp ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; ; ; NAME: ReadRaw ; ; DESCRIPTION: Read raw ; ; PARAMETERS: EDI Data ; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; public ReadRaw_ ReadRaw_ Proc near pushad ; sub delay_cnt,1 jnc rrNoCheck ; call WaitData rrNoCheck: call GetReadSize ; sub edx,start_pos cmp edx,curr_pos jnc rrHighOk ; inc curr_pos+4 rrHighOk: mov curr_pos,edx mov [edi].aad_time,edx mov edx,curr_pos+4 mov [edi].aad_time+4,edx ; call CalcMean call SelectData ; push edi lea edi,[edi].aad_low call GetData pop edi ; push edi lea edi,[edi].aad_high call GetData pop edi ; call Advance ; popad ret ReadRaw_ Endp ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; ; ; NAME: WriteRaw ; ; DESCRIPTION: Write buffer ; ; PARAMETERS: EBX Channel ; EDX:EAX Time ; ESI Data ; ; RETURNS: EAX 0 = failed, 1 = ok ; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; public WriteRaw_ WriteRaw_ Proc near push ebx push ecx push edi push ebp ; mov ebp,ds:[4*ebx].adc_chan_ptr mov ecx,[ebp].ac_write mov edi,ecx inc ecx and ecx,BUF_MASK cmp ecx,[ebp].ac_read jne wbOk ; xor eax,eax jmp wbDone wbOk: shl edi,OUT_SHIFT add edi,[ebp].ac_data ; mov [edi].asd_time,eax ; mov eax,dword ptr [esi].aid_amp mov dword ptr [edi].asd_amp,eax mov ebx,eax shr ebx,16 movzx eax,ax add eax,ebx shr eax,1 mov [edi].asd_level,ax ; mov ax,[esi].aid_phase+2 mov ebx,eax sub ax,[ebp].ac_prev_phase+2 mov [ebp].ac_prev_phase+2,bx mov [edi].asd_phase+2,ax ; mov ax,[esi].aid_phase sub bx,ax mov [edi].asd_diff,bx mov ebx,eax sub ax,[ebp].ac_prev_phase mov [ebp].ac_prev_phase,bx mov [edi].asd_phase,ax ; mov [ebp].ac_write,ecx mov eax,1 wbDone: pop ebp pop edi pop ecx pop ebx ret WriteRaw_ Endp _TEXT ends END