Помогите новичку

Applications development, KoOS API questions
  • Функция преобразования числа в строку, написа мной. Как сделать так, чтобы строка получалась не зеркальной?

    Code: Select all

    dword itoa_my(dword from_int)
    {
    	unsigned char to_char[11], int_index, sign;
    	if (from_int < 0) //запоминаем знак знак, делаем число позитивным
    	{
    		sign = 1;
    		from_int = -from_int;
    	}
    	for (;int_index<from_int; int_index++) //записываем числа в обратном порядке
    	{
    		to_char[int_index] = from_int % 10 + '0';
    		from_int /= 10;
    	}
    	int_index++;
    	if (sign) to_char[int_index] = '-'; //запишем знак
    	
    	return #to_char;
    }
    Из хаоса в космос
  • может всё положить в стек, а потом всё забрать?
  • Вот так?

    Code: Select all

    dword itoa_my(dword from_int)
    {
    	unsigned char to_char[11], int_index, sign;
    	if (from_int < 0) //запоминаем знак знак, делаем число позитивным
    	{
    		sign = 1;
    		from_int = -from_int;
    	}
    	for (int_index=0; from_int>0; int_index++) //записываем числа в обратном порядке
    	{
    		EAX = from_int % 10 + '0';
    		$push eax
    		from_int /= 10;
    	}
    	//int_index++;
    	//if (sign) to_char[int_index] = '-'; //запишем знак
    	for ( ;int_index>0; int_index--)
    	{
    		$pop eax
    		to_char[int_index] = EAX;
    	}
    	return #to_char;
    }
    Из хаоса в космос
  • Не особо понимаю всё написаное, но судя по подходу да, как то так.
  • Code: Select all

    inline fastcall int TestBit(EAX, CL)
    {
    	$shr eax,cl
    	$and eax,1
    }
    off=file_mas[filenum+za_kadrom]*304 + buf+72; //buf - буфер с данными о файлах из ф70, off - указатель на имя файла
    
    if (!TestBit(ESDWORD[off-40], 4)) //это ФАЙЛ или папка?
    Код для меня сложный, где-то здесь должна быть ошибка... Не могу понять где.
    Из хаоса в космос
  • ошибки не вижу, потому даю вопросы:
    1) указатель off точно дает имя файла ?
    2) а ESDWORD это макрос или функция, как оно выглядит ?
    3) функция TestBit правильно работает? Что-бы проверить правильность работы функции TestBit попробуй 2 варианта

    Code: Select all

    TestBit(1, 0) // должно дать 1
    TestBit(0, 0) //  должно дать 0
    Last edited by IgorA on Fri Nov 16, 2012 11:08 pm, edited 1 time in total.
  • Leency wrote: off=file_mas[filenum+za_kadrom]*304 + buf+72; //buf - буфер с данными о файлах из ф70, off - указатель на имя файла
    Возможно не 72, а 32(размер заголовка)?
    IgorA wrote:TestBit(0, 0) // должно дать 1
    Ноль же?
  • 0CodErr wrote:IgorA писал(а):TestBit(0, 0) // должно дать 1Ноль же?
    ошибся, предполагал 0 а написал 1, уже исправил
    0CodErr wrote:Возможно не 72, а 32(размер заголовка)?
    там 32 размер заголовка плюс 40 смещение на имя файла
  • Хм... проблема не в этом...
    Из хаоса в космос
  • Можно ли не распаковывая, упакованный Kpack-ом файл, узнать, что это приложение Kolibri?
    У неупакованного, например, "MENUET01" в заголовке. А с упакованным как?
  • KPCK
  • Но "KPCK" не говорит о том, что это именно приложение. Любой файл, упакованный Kpack-ом, будет иметь такой заголовок.
    Конечно, если файл без расширения и имеет в заголовке "KPCK", то, скорее всего, это упакованное приложение. Но я хотел узнать, можно ли это определить однозначно.
  • Без распаковки - нет.
  • Читаю папки:
    "/bd0/" - файл не найден
    "/bd0/1/" - успешно
    Само устройство "bd0" существует.

    Code: Select all

    ORG 0
    BITS 32
    MENUET01           db 'MENUET01'
    version            dd 1
    program.start      dd start_
    program.end        dd end_
    program.memory     dd end_ + STACK_SIZE  
    program.stack      dd end_ + STACK_SIZE
    program.params     dd 0
    program.path       dd 0 
    
    STACK_SIZE     equ 256
    
    
    start_:
    
      call on_redraw
      
      L_1:
        ; wait.event
        mov eax, 10
        int 64
    
        cmp eax, 1
        jne L_2
            call on_redraw
        jmp L_1
        
        L_2:    
        cmp eax, 2
        jne L_3
          ; get.key.code
          ; mov eax, 2
          int 64
        jmp L_1
        
        L_3:    
        cmp eax, 3
        jne L_1
          ; get.button.number
          mov eax, 17
          int 64
          
          shr eax, 8
          cmp eax, 1
          jne L_1
              
          ; program.terminate
          neg eax
          int 64
    
    
    on_redraw:
        
        ; redraw.start
        mov eax, 12
        mov ebx, 1
        int 64
    
        ; draw.window
        xor eax, eax
        mov ebx, 200
        mov ecx, 200
        mov edx, 33AABBCCh
        xor edi, edi
        int 64    
        
    		
    		
    		
    	   mov eax, 70
    	   mov ebx, .dir.read.file_info
    	   int 64
    
        ; draw.text
        mov edx, [eax * 4 + errors]
        mov eax, 4
        xor ebx, ebx
        mov ecx, 80000000h
        int 64    
        
    		
    		
        ; redraw.finish
        mov eax, 12
        mov ebx, 2
        int 64
        
    ret
    
    
    
    .dir.read.file_info:
    dd 1 
    dd 0 
    dd 0
    dd 0 
    dd .buffer
    db 0
    dd  .FolderName
    
    
    ; .FolderName db "/bd0/",0
    .FolderName db "/bd0/1/",0
    .buffer resb 32
    
    
    
    errors:
    dd .0 
    dd .1 
    dd .2 
    dd .3 
    dd .4 
    dd .5 
    dd .6 
    dd .7 
    dd .8 
    dd .9 
    dd .10
    dd .11
    
    .0  db "0 = успешно",0
    .1  db "1 = не определена база и/или раздел жёсткого диска" ,0
    .2  db "2 = функция не поддерживается для данной файловой системы",0
    .3  db "3 = неизвестная файловая система",0
    .4  db "4 = зарезервировано, никогда не возвращается в текущей реализации",0
    .5  db "5 = файл не найден",0
    .6  db "6 = файл закончился",0
    .7  db "7 = указатель вне памяти приложения",0
    .8  db "8 = диск заполнен",0
    .9  db "9 = таблица FAT разрушена",0
    .10 db "10 = доступ запрещён",0
    .11 db "11 = ошибка устройства",0
    
    end_:
    
    Как вообще проверить возможность чтения папки?
    В ebx возвращается -1, если папка не найдена.
    Но она может существовать и быть в это же время недоступна.
  • Who is online

    Users browsing this forum: No registered users and 39 guests