Witam.
W związku że mowa jest o 2 różnych językach nie wiedziałem gdzie to zamieścić.
Jeśli to zły dział proszę Moderatora o przeniesienie.
Piszę sobie program (emulator NES) w delphi na podstawie kodu z C++.
Stanąłem na pewnej funkcji której nie mogę przetłumaczyć.
template<unsigned bitno, unsigned nbits=1, typename T=u8>
struct RegBit
{
T data;
enum { mask = (1u << nbits) - 1u };
template<typename T2>
RegBit& operator=(T2 val)
{
data = (data & ~(mask << bitno)) | ((nbits > 1 ? val & mask : !!val) << bitno);
return *this;
}
operator unsigned() const { return (data >> bitno) & mask; }
RegBit& operator++ () { return *this = *this + 1; }
unsigned operator++ (int) { unsigned r = *this; ++*this; return r; }
};
Nie mogę tego wyczuć. Wygląda mi to na jakąś funkcje rekurencyjną.
Odwołanie do tego wygląda tak (polecenie union znam dodaję to tylko aby rozjaśnić obraz):
union scrolltype
{
RegBit<3,16,u32> raw; // raw VRAM address (16-bit)
RegBit<0, 8,u32> xscroll; // low 8 bits of first write to 2005
RegBit<0, 3,u32> xfine; // low 3 bits of first write to 2005
RegBit<3, 5,u32> xcoarse; // high 5 bits of first write to 2005
RegBit<8, 5,u32> ycoarse; // high 5 bits of second write to 2005
RegBit<13,2,u32> basenta; // nametable index (copied from 2000)
RegBit<13,1,u32> basenta_h; // horizontal nametable index
RegBit<14,1,u32> basenta_v; // vertical nametable index
RegBit<15,3,u32> yfine; // low 3 bits of second write to 2005
RegBit<11,8,u32> vaddrhi; // first write to 2006 (with high 2 bits set to zero)
RegBit<3, 8,u32> vaddrlo; // second write to 2006
} scroll, vaddr;
Przykładowe wywołanie:
scroll.xscroll = 0x1F
Jeśli ktoś mógłby to przetłumaczyć na delphi był bym bardzo wdzięczny (oczywiście tylko pierwszy blok kodu z resztą sobie poradzę).
Bardzo proszę o pomoc i życzę Wesołych Świąt.