Page 7 of 77

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

Posted: Thu Jul 30, 2009 8:02 am
by Yaskhan
Кажется будет вот так:

Сначало расскрываем
FbRightStipMask(x) ((((1 << 5)-(x)) & ((1 << 5) - 1)) ? ((-1)>>((1 << 5)-(x)) & ((1 << 5) - 1)) : 0)

FbStipMask(x,w) ((-1)<<((x) & ((1 << 5)-1))) & ((-1)>>(((1 << 5) - ((x)+(w))) & ((1 << 5)-1)));

Потом уже код (код приреплен)


Я в начале думал что это: ((FbStip) -1)
Понимается как ((FbStip) -1)=чтото, а оказалось что это просто -1

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

Posted: Sat Oct 03, 2009 12:02 pm
by SoUrcerer
Кажется совсем туплю..
Пишу программу на С--, требуется вывести текущее время.
Код такой (содранный из @panel):

Code: Select all

EAX=3;		//	 get time
$int  0x40

$movzx EBX,AL
$shr   EAX,8
$movzx ECX,al
$shr   EAX,8
$movzx EDX,al

//выведем на борду что получили
WriteDebug(EBX);
WriteDebug(ECX);
WriteDebug(EDX);

в качестве эксперимента вместо WriteDebug(EBX) пробовал:
1) Бред конечно, но
WriteDebug(#EBX)
прога с таким кодом моментально вываливается в эмуляторе, стоит лишь дойти до этого момента
2) WriteDebug(IntToStr(EBX))
на доске появляются какие-то цифры, но совсем не те.
Так, в 12:53
получилось что часов - 18, минут - 10, а секунд - 422
Выходит, тоже бред.
Кроме того, прога с таким кодом вываливается в эмуляторе, если нажать на какую-нибудь кнопку, а потом поперетягивать по экрану.
3) WriteDebug(IntToStr(#EBX))
Вообще бред, но раз всё пробую, почему бы и это не попробовать. Как и следовало ожидать, вижу на доске длинные числа "ни о чём".


Где ошибка? Всё же в DNA?

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

Posted: Sat Oct 03, 2009 8:11 pm
by Nable
to Sorcerer
Во-первых, значения регистров могут не сохраняться, поэтому нужно их загонять в какие-либо переменные, а потом применять к ним IntToStr (опять же, строки в другие переменные). А во-вторых, какой тип принимает WriteDebug()? явно не int, подозреваю что char*, т.е. указатель на строку.

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

Posted: Sat Oct 03, 2009 10:20 pm
by SoUrcerer
Nable wrote:to Sorcerer
Во-первых, значения регистров могут не сохраняться, поэтому нужно их загонять в какие-либо переменные, а потом применять к ним IntToStr (опять же, строки в другие переменные). А во-вторых, какой тип принимает WriteDebug()? явно не int, подозреваю что char*, т.е. указатель на строку.
Значения регистров сохраняются, как показывает практика. Но даже если их сохранять в переменные, это не очень помогает.
Что интересно -

Code: Select all

EAX=3;
$int 0x40
работает превосходно. То есть выдает время в BCD да ещё в формате 0x00ssmmhh
а последующий код по идее должен сделать из всего этого просто цифры. но он каждый раз выдает одно и то же :(
кажется я реально туплю :((

Должно ведь быть что-то простое?

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

Posted: Sun Oct 04, 2009 11:09 am
by SoUrcerer
ага, кажется разобрался. действительно туплю.
Если не трудно, подскажите оптимальный алгоритм получения из 0x00ssmmhh нормальных чисел?

Такое впечатление, что C-- просто не знает о регистре al, иногда в warnings.log и errors.log сообщая, что переменная не задана.

Пока использую такой код

Code: Select all

dword a;	
dword s;
dword m;
dword h;
dword t;

// ......

$mov eax,3;		//	; get time
$int  0x40

a=EAX;
WriteDebug(IntToStr(a));


t=a/16;
t=t*16;
h=a-t;
a=a/16;
t=a/16;
t=t*16;
s=a-t;
h=s*10+h;
a=a/16;
t=a/16;
t=t*16;
m=a-t;
a=a/16;
t=a/16;
t=t*16;
s=a-t;
m=s*10+m;

WriteDebug(IntToStr(h));
WriteDebug(IntToStr(m));
работает отлично, что и ожидалось, но он явно далеко не идеален :(

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

Posted: Sun Oct 04, 2009 12:16 pm
by Albom
Вот код из shell (файл cmd_date.c):

Code: Select all

unsigned time = kol_system_time_get();

printf("\n\r  time [hh:mm:ss]: %x%x:%x%x:%x%x\n\r", 
	(time&0xf0)>>4, (time&0xf), // hours
	(time&0xf000)>>12, (time&0xf00)>>8, // minutes
	(time&0xf00000)>>20, (time&0xf0000)>>16 ); // seconds

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

Posted: Sun Oct 04, 2009 1:03 pm
by diamond
В строку переводить можно, например, так:

Code: Select all

str1 db '??:??:??',0
...
mov esi,str1
mov eax,3
int 0x40
mov ebx,eax
aam 16
shr ebx,8
add ax,'00'
mov [esi],ah
mov [esi+1],al
mov eax,ebx
aam 16
shr ebx,8
add ax,'00'
mov [esi+3],ah
mov [esi+4],al
mov eax,ebx
aam 16
add ax,'00'
mov [esi+6],ah
mov [esi+7],al

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

Posted: Sun Oct 04, 2009 1:16 pm
by SoUrcerer
Спасибо огромное! Буду разбираться дальше :)

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

Posted: Sun Oct 04, 2009 5:02 pm
by Gluk
у меня будет немного странная просьба =) в общем я давно написал код функции (вроде как я написал, т.к. код в файле мой вроде весь должен быть), но не помню что она делает =( никакой дополнительной информации сообщить не могу, т.к. функцию нигде не применял, и писал в отрыве от разных проектов.. в общем помогите понять что делает эта функция пожалуйста)

Code: Select all

proc strints stdcall root:dword, lenght:dword
	pushad
	xor esi, esi
	mov [strints_result],esi
	xor edi,edi
	mov eax,dword[root]
	mov ecx,dword[lenght]
	add eax,ecx
	@@:
		inc esi
		mov dl,byte[eax-esi]
		dec esi
		shl dl,4
		add dl,byte[eax-esi]
		add esi,2
		mov [edi+strints_result],dl
		inc edi
		cmp esi,ecx
	jb @b
	jne @f;if only one letter lost
		mov dl,byte[eax-ecx]
		mov [edi+strints_result],dl
	@@:
	popad
	ret 8
endp
strints_result dd ?

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

Posted: Sun Oct 04, 2009 7:00 pm
by vkos
Похоже, что эта функция переводит число из строки, где в каждом байте записана одна шестнадцатеричная цифра (не как символ, а как число) в число (little endian).
Вот примерный аналог на (почти) Python:

Code: Select all

esi=0
strints_result=0
edi=0
while esi<length:
  dl = root[length-esi-1]*16+root[length-esi]
  strints_result[edi]=dl
  esi+=2
  edi+=1
if esi!=ecx:
  dl = root[0]
  strints_result[edi] = dl

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

Posted: Thu Oct 15, 2009 9:10 am
by kogemyaka
Как можно выводить в программе текст, в котором около 255 и более символов?

Code: Select all

   
...
                   mov eax,4
                   mov ebx,5*65536+75
                   mov ecx,0x01FFFF99
                   mov edx,longtext 
                   mov esi,255
                   int 0x40 
...
longtext db 'more 255...'

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

Posted: Thu Oct 15, 2009 9:18 am
by Gluk
а зачем? разве влезет 255*6 = 1530 пикселов в экран, учитывая что Колибри разрешение больше 1280*сколько-то не держит?

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

Posted: Thu Oct 15, 2009 9:33 am
by Mario
kogemyaka
Разбивать его на части, как например делает Tinypad.

Gluk
ЕМНИП Serge сделал под экранный буфер 8 Мб, дальше считай сам. Все зависит от оборудования, в Vesa режиме.

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

Posted: Thu Oct 15, 2009 1:32 pm
by Gluk
1440*сколько-то у меня оборудование держит, а Колибри - нет. Я говорю то, что вижу..

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

Posted: Thu Oct 15, 2009 1:40 pm
by Mario
Gluk
Если оборудование поддерживает в Vesa режимах, а не с помощью специализированного драйвера.