; #########################################################################

      .386
      .model flat, stdcall
      option casemap :none   ; case sensitive

; #########################################################################

      include \masm32\include\windows.inc
      include \masm32\include\user32.inc
      include \masm32\include\kernel32.inc
      include \masm32\include\shlwapi.inc

      includelib \masm32\lib\user32.lib
      includelib \masm32\lib\kernel32.lib
      includelib  \masm32\lib\shlwapi.lib
      
   include \masm32\include\masm32.inc
   includelib \masm32\lib\masm32.lib
   
   include \masm32\include\debug.inc
   includelib \masm32\lib\debug.lib

; #########################################################################
 





.data
szFileName2 db		"flash.bin",0
;fmat2       db      '%02u',0
;ext         db      '.dan',0
;exttxt      db      '.txt',0
;szFileName22	db  'File'
;szIndex     db	2 dup(0),0 
szFileName1 db	256 dup(0),0  



;endl		db   13,10
;endl1		db   13,10,0
StrCnt		dd 0		; счетчик строк в блоке , макс. значение = 16 (0....15)
                              
      szTitle    db "Seagate flash Converter",0
      szMsg         db " Файл с логом пзу обработан!  ",0
      szNoCommand db  "Не найден файл с логом пзу для конвертирования в бинарный файл", 0dh,0ah
                                      db "Пример:   flashcnv.exe  flash3_10.log",0
      ;szNoBase     db   "Не найден указанный файл базы данных *.dan",0
      ;szNoMapTick  db   "Не найден файл maptick.dan в рабочем каталоге. ",0
BlockCnt	dd 100h		; счетчик блоков, макс. значение = 100h 
						; 80h (0...80h), первые 64кб пзу, 81...ffh - вторая часть пзу 
    
  .data?
  hFile1 dd ?
  hFile2  dd ?
  fSiz       dd ?
  CommandLine  dd ?
  hMainHeap dd ?
  FileCnt     dd   ?
  lpArg       dd    ?
  BeginBlock dd ?
  EndBlock  dd  ?
    
          
buff1          db  512 dup(?)
buff2          db  1024 dup(?)
   

.code







start:




;взять имя файла лога из командной строки
  invoke GetCommandLine
  mov    CommandLine,eax
  
 mov byte ptr szFileName1, 0
      ; ------------------------------
    ; get any command line filename
    ; ------------------------------
    ;invoke MessageBox,hwnd, CommandLine, addr lpArg,MB_OK

      invoke PathGetArgs,CommandLine
      ;PrintStringByAddr CommandLine
      mov lpArg, eax

;PrintStringByAddr lpArg

      mov esi, eax
      lodsb
      cmp al, 0
      je noArgs       ; jump if no arg
      cmp al, 34
      jne @F          ; jump if no quote

      invoke PathUnquoteSpaces,lpArg
      mov lpArg, eax
      
      ;PrintStringByAddr lpArg

 @@:

      invoke exist,lpArg
;   PrintStringByAddr lpArg   
      .if eax == 1
          invoke lstrcpy, addr szFileName1, lpArg
          jmp IsArgs
      .else
noArgs:

    invoke MessageBox,0, addr szNoCommand, addr  szTitle, MB_OK
     jmp Err
      .endif
 

      
 IsArgs:
      invoke GetProcessHeap
      mov hMainHeap,eax

mov al, byte ptr szFileName1
.if al == 0
   invoke MessageBox, 0, addr szNoCommand, addr szTitle, MB_OK
    jmp Err
.endif

        ; открыть выходной файл для записи
		invoke CreateFile,addr szFileName2,GENERIC_WRITE,\
		          FILE_SHARE_WRITE  ,NULL,CREATE_ALWAYS,\
		          FILE_ATTRIBUTE_NORMAL,0

    	.if eax!=INVALID_HANDLE_VALUE
        		mov hFile2, eax
   		.else
        		jmp Err
		.endif                

     
; открыть файл    базы     для чтения
invoke CreateFile,addr szFileName1,GENERIC_READ,\
		          FILE_SHARE_READ,NULL,OPEN_EXISTING	,\
		          FILE_ATTRIBUTE_NORMAL,0
		          
 .if eax!=INVALID_HANDLE_VALUE
          mov hFile1,eax
         ; определить длину файла в байтах для резервирования размера буфера в памяти
;           invoke GetFileSize,hFile1,NULL

              invoke _llseek,hFile1,0,FILE_BEGIN

nextblock:
              ; пропустить строку типа 1>D8,0000
              invoke _llseek,hFile1,11,FILE_CURRENT
              
              ; пропустить строку типа  Addr  0 1 2 3  4 5 6 7  8 9 A B  C D E F 10 1 2 3  4 5 6 7  8 9 A B  C D E F
              invoke _llseek,hFile1,79,FILE_CURRENT


                
nextstr:		;Цикл по 16 строкам блока

              ; прочитать 104 байта строки с данными 
              ; 080000 FA 0A F6 30 FA 0A 08 30 FA 0A 08 30 FA 0A 08 30 FA 0A 08 30 FA 0A 08 30 FA 0A 08 30 FA 0A 08 30
			invoke _lread, hFile1, addr buff1, 104
;PrintString  buff1 ; OK
;PrintHex eax
			;обработка строки

		 	xor eax,eax					; счетчик конвертированных байтов во 2м буфере
		 	xor edx,edx
		 	xor ecx, ecx
    	 	add ecx,5					;пропустить 6 байт адреса (080000)

convertbyte:
    	 	inc ecx						; пропустить пробел перед символами байта    	 	
    	 	inc ecx
			mov dl, byte ptr buff1[ecx]	; первый символ байта
;PrintHex edx
			
			cmp dl, 3Ah					; цифра?
			jb cifra1
			sub dl, 37h					; преобразовать символ A,B,...F в нибл
			jmp nextsimbol
cifra1:			
			sub dl,30h					; преобразовать символ цифры в нибл
nextsimbol:
			mov dh,dl
;PrintHex edx
			shl dh,4					; получить старший нибл байта в dh 
;PrintHex edx
			inc ecx						; след символ байта
			mov dl, byte ptr buff1[ecx]
			;PrintHex edx
			
			cmp dl, 3Ah					; цифра?
			jb cifra2
			sub dl, 37h					; преобразовать символ A,B,...F в нибл
			jmp nextsimbol_1
cifra2:
			sub dl,30h					; преобразовать символ цифры в нибл
nextsimbol_1:
			add dh,dl			
			mov byte ptr buff2[eax], dh
			inc eax
			cmp eax,32
			jnz convertbyte

			; записать в выходной файл
			invoke _lwrite, hFile2, addr buff2, 32
			
			mov eax,StrCnt
			inc eax
			mov StrCnt, eax
			cmp eax,16
			jnz nextstr
			
			mov StrCnt, 0
			
			; пропустить 17 строку блока
              invoke _lread,hFile1,addr buff1, 104

 			
 			mov eax, BlockCnt
 			;PrintHex eax
 			;PrintHex eax
 			;PrintHex eax
 			dec eax
 			mov BlockCnt, eax
			jnz nextblock
  
  
  
  
  
  
                             
.endif 

         	;закрыть входной файл              
			invoke CloseHandle,hFile1           
			;закрыть выходной файл              
			invoke CloseHandle,hFile2
                            
    push MB_OK
    push offset szTitle
    push offset szMsg
    push 0
    call MessageBox
    
    
Err:
    push 0
    call ExitProcess    ; invoke ExitProcess,0






end start
