Просмотр сообщений

В этом разделе можно просмотреть все сообщения, сделанные этим пользователем.


Сообщения - pristavkin

Страницы: [1]
1
Вообще нафиг не нужен но просто нужо перенес в инел код. Вот и сижу , пытаюсь понять, втыкаю, что всё то после : значит. Оно ведь там не просто так

2
Ничего я не понял. Плиз давай те разберём :-\

Добавлено позже:
__asm mov  eax,reg
  __asm mov  dl,[eax]
  __asm mov  bx,flags

  __asm inc  dl = "incb %2\n" // Почему dl? Так и не понял %2. Второй какой то параметр но я его нигде не нашел.
  __asm lahf ="lahf\n" // тут понятно
  __asm and  bh,1 = "andb $1,%%bh\n" // Тут очему то bh. НО параметр записан черещ $ почему-то а не через проценты
  __asm and  ah,0xFE = andb $0xFE,%%ah.// Почему 2 процента
  __asm or   bh,ah = "orb %%ah, %%bh \n" // понятно

"movl $0, %1\n" куда то нолик грузим только не знаюкуда


  __asm mov  flags,bx
  __asm mov  eax,reg
  __asm mov  [eax],dl

: "=b" (flags), "=g" (NFLAG), "=q" (*reg)
     : "2" (*reg), "0" (flags)
     : "cc", "ah");

Тут между этими делами должна зависимость быть на я её не вижу :(

3
void gbz80_inc(byte* reg)
{
     asm volatile (   
     "movl $0, %1\n"      // load 0 to NFLAG
     
     "incb %2\n"
         
     "lahf\n"             // get flags
     "andb $1,%%bh\n"     // carry not affected
     "andb $0xFE,%%ah\n"
     "orb %%ah, %%bh \n"
     
     : "=b" (flags), "=g" (NFLAG), "=q" (*reg)
     : "2" (*reg), "0" (flags)
     : "cc", "ah"); 
}
Собственно код. Первая часть понятно, а вот вторая
   : "=b" (flags), "=g" (NFLAG), "=q" (*reg)
     : "2" (*reg), "0" (flags)
     : "cc", "ah");
не пойму как это до конца работает.
Может кто-нибудь объяснит, расскажет что всё это значит и как устроено. Спасибо.

4
Железо / Re: Пара вопросиков о z80 и gameboy
« : 28 Сентябрь 2009, 12:32:51 »
Цитата
дела есть, на русском разговаривать отказался
Не, со мной пообщался на русском, но отвечает очень кратко, ничего подробно не рассказывает, всё скрывает. Зазнался чел помойму.

5
Железо / Re: Пара вопросиков о z80 и gameboy
« : 26 Сентябрь 2009, 22:48:18 »
Цитата
PUSH IX состоит из двух байт: 0хDD как префикс, переключающий регистровую пару HL на IX и опкода 0хE5, который является командой PUSH HL. Код 0xDD отсутствует в таблице Sharp LR35902.
 

Странно,а вот в другой доке и ещё вот пример из эмуля - есть опкод  ДД.
Вот что он значит.
А вот есть у мня книжка Королёва про приставки, там тоже
нету, там у комманды set другой опкод да ещё и другой 
Цитата
case 0xDD: //SET 3,L
          HL.B.l |= 0x08;


Добавлено позже:
Да, вот ,прикольно я прочёлдо конца, спасибо тебе. А вот такой вопросик. Смотри попоробую объяснить. Допустим фазалин тогда задампил кард.
И начил его дизасмить. А откуда он знал какого размера команда? 8 или 16.
Т.е. с префиксом или нет. Может это 2 разщные команды. А может это Комманды и аргументы, или вообще ОДНА КОММАНДА. Кстати насчёт одной комманды, которая описывается двойным опкодом,т.е. 0xABCD. Проц то восмибитный, как он это всё это съедал, такую команду. Сорри за такую вычурность ^_^

6
Железо / Re: Пара вопросиков о z80 и gameboy
« : 26 Сентябрь 2009, 20:01:51 »
Цитата
1) Значит посмотрел я эмуль GB. Там все опкоды забиты начиная от 0x00 до 0xFF.  Но в отличае от кастомного проца в настоящем есть
такая комманда к примеру push ix. Т.е. работа со стеком и регистром  ix, который убрали из GB.
Вопрос такой. Как в оригинале могла использоваться эта комманда
если все опкоды занята. Написано что они совместимы же.
КАк так полчуется?
Кто на это ответит,плиз?

7
Железо / Re: Пара вопросиков о z80 и gameboy
« : 26 Сентябрь 2009, 17:51:16 »
Спасибо, посмотрим, может другие знатоки процессора этого или эмуляторщики скажут.
Ещё тут про какого-то санчюза пишут, типа может он скажет, я так понял он друг фазалина

8
Железо / Re: Пара вопросиков о z80 и gameboy
« : 26 Сентябрь 2009, 16:47:01 »
Цитата
Я вообще до сих пор не понимаю, почему все говорят, что в GB в Z80
Фига себе? А как тогда правильно говорить то? Что тогда в нём?
Сорри, но так написано везде
Цитата
на шине GB CPU имеется сигнал Ф2, совершенно не характерный для Z80
Это что синхроимпульс? А то я не силён в микросхемах :blush:
Цитата
просто занимался раверс - инженерингом

Чего? Рома, катриджа или проца. Как можно по рому узнать так много о приставке. Темболее что нужно было ещё иметь правильный дизассемблер характреный для z80. НУжно было его иметь в начличие или иметь доку на тот кастомный проц.
 НЕ мог же он сидеть с тестером и все подряд тожки тыкать, их там уйма, даещё сколько комбинаций то. А внутренние регистры. Как он узнавал во что они устанавливаются
Цитата
и там было написано, что в GB стоит 6502.
o_0 o_0 o_0
Я с ума схожу. ТАк что тама на самом деле.
Цитата
даже названия не помню.
Обидно что не помниш, просто интересно что за магазин был. Да ещё в таком году да и ещё буржуйский

Добавлено позже:
Re: Пара вопросиков о z80 и gameboy
« Ответ #2 : Сегодня в 13:41:36 »
Чё за на, пост сделан 5 мин назад в 16:39? o_0

9
Железо / Пара вопросиков о z80 и gameboy
« : 26 Сентябрь 2009, 15:53:08 »
В общем пытаюсь понять и вникнуть в отличая оригинального z80 и тот что используется в GB
Может кто-нить поможет понять?
1) Значит посмотрел я эмуль GB. Там все опкоды забиты начиная от 0x00 до 0xFF.  Но в отличае от кастомного проца в настоящем есть
такая комманда к примеру push ix. Т.е. работа со стеком и регистром  ix, который убрали из GB.
Вопрос такой. Как в оригинале могла использоваться эта комманда
если все опкоды занята. Написано что они совместимы же.
КАк так полчуется?
2) Как вскрыли это чёрный ящик. Что-то я понять не могу. У меня GB есть я его раскрутил а там кастомная микроха производства Nintendo написано. Помню писали в игромании что вскрул эту приставку МАрат Фазалин. ОН что участвовал в производстве чтоль. В инете лежит мега дока на всю архитекутуру приставки. Откуда он всё узнал. Что там z80 да и ещё немного именённый. Если учесть ещё то что не было почти инета, да и поисковиков не было. Было это в 95 году. Вот
Извините, может я туплю, но мне както это всё в голову не лезет?

11
А ещё раз почему именно 12
а не 8 или 16?

12
Это всё взято из примеров jnes, gens, и gbuboy

Добавлено позже:
INLINE uint32 zp_readword(register uint8 address)
{
#ifdef HOST_LITTLE_ENDIAN
   /* TODO: this fails if host architecture doesn't support byte alignment */
   return (uint32) (*(uint16 *)(ram + address));
#else
#ifdef TARGET_CPU_PPC
   return __lhbrx(ram, address);
#else
   uint32 x = (uint32) *(uint16 *)(ram + address);
   return (x << 8) | (x >> 8);
#endif /* TARGET_CPU_PPC */
#endif /* HOST_LITTLE_ENDIAN */
}

INLINE uint8 bank_readbyte(register uint32 address)
{
   return cpu.mem_page[address >> NES6502_BANKSHIFT][address & NES6502_BANKMASK];
}

INLINE uint32 bank_readword(register uint32 address)
{
#ifdef HOST_LITTLE_ENDIAN
   /* TODO: this fails if src address is $xFFF */
   /* TODO: this fails if host architecture doesn't support byte alignment */
   return (uint32) (*(uint16 *)(cpu.mem_page[address >> NES6502_BANKSHIFT] + (address & NES6502_BANKMASK)));
#else
#ifdef TARGET_CPU_PPC
   return __lhbrx(cpu.mem_page[address >> NES6502_BANKSHIFT], address & NES6502_BANKMASK);
#else
   uint32 x = (uint32) *(uint16 *)(cpu.mem_page[address >> NES6502_BANKSHIFT] + (address & NES6502_BANKMASK));
   return (x << 8) | (x >> 8);
#endif /* TARGET_CPU_PPC */
#endif /* HOST_LITTLE_ENDIAN */
}

INLINE void bank_writebyte(register uint32 address, register uint8 value)
{
   cpu.mem_page[address >> NES6502_BANKSHIFT][address & NES6502_BANKMASK] = value;
}

Хорошо, вот это пример - да для денди.
А первый из z80 для сеги. Почему там тоже на 12

memory_mapped[address>>12][address&0x0FFF];
Можно пример привести с цифрами и адресами. Чтобы понятней было
И так н могу понять почему тут 2 массива. Если он вначале объявлен как олин массив казателей. В обещм здесь какая то тонколсть есть которую я понять не могу

Добавлено позже:
#define  NES6502_BANKSHIFT 13
Ну почти угадал

13
У меня есть исходные коды 3-х разных эмуляторов
И везде есть одни очень схожие конструкции, которые не могу понять
Речь идёт о чтении опкода записи в память и чтения из памяти

вот

inline byte readopcode(register unsigned short address)
{
  return memory_mapped[address>>12][address&0x0FFF];
}


inline unsigned short readword(register unsigned short address)
{
   return (unsigned short)(memory_mapped[address>>12][address&0x0FFF]|(memory_mapped[(address+1)>>12][(address+1)&0x0FFF]<<8));
}

inline void writeword(register unsigned short address, register unsigned short data)
{
   memory_mapped[address>>12][address&0x0FFF] = data;
   memory_mapped[((address+1)&0xFFFF)>>12][(address+1)&0x0FFF] = (data>>8);
}


INLINE void bank_writebyte(register uint32 address, register uint8 value)
{
   cpu.mem_page[address >> NES6502_BANKSHIFT][address & NES6502_BANKMASK] = value;
}

#define  NES6502_BANKSHIFT 12
uint8 *mem_page[NES6502_NUMBANKS];  /* memory page pointers */

Не могу понять почему во всех трёх эмуляторрах идёт сдвиг на 12
и почему используются 2 массив, если он только один.
Или  я не силён в арифметике с++? Указателях?
Объясните. Что значат эти конструкции

Зачем мы здвигаем да ещё и применяем логическую операцию с FFF
[((address+1)&0xFFFF)>>12?
Почему именно на 12?


Страницы: [1]