void test_memset2() { char i; char m[100]; printf("TEST MEMSET2: "); // забиваем массив тестовыми данными // 1,2,3,4,5...100 for (i = 0; i < 100; ++i) m[i] = i; // 1 тест // memset не должен тронуть массив если n = 0 memset2(m, 5, 0); for (i = 0; i < 100; ++i) assert(m[i] == i); // 2 тест // memset должен выставить на 5 только первые 25 элементов // остальные не должен тронуть memset2(m, 5, 25); // проверяем первые 25 элементов // там должны быть пятёрки for (i = 0; i < 25; ++i) assert(m[i] == 5); // проверяем оставшиеся элементы // там должны быть старые данные for (i = 25; i < 100; ++i) assert(m[i] == i); printf("[ OK ]\n"); }
static int fb_write(int c) { uint16 *t = fb; if(!t) t = vram_s; if(c != '\n') { bfont_draw(t + cur_y * fb_w + cur_x, fb_w, 1, c); cur_x += FONT_CHAR_WIDTH; } /* If we have a newline or we've gone past the end of the line, advance down one line. */ if(c == '\n' || cur_x + FONT_CHAR_WIDTH > max_x) { cur_y += FONT_CHAR_HEIGHT; cur_x = min_x; /* If going down a line put us over the edge of the screen, move everything up a line, fixing the problem. */ if(cur_y + FONT_CHAR_HEIGHT > max_y) { memcpy2(t + min_y * fb_w, t + (min_y + FONT_CHAR_HEIGHT) * fb_w, (cur_y - min_y - FONT_CHAR_HEIGHT) * fb_w * 2); cur_y -= FONT_CHAR_HEIGHT; memset2(t + cur_y * fb_w, 0, FONT_CHAR_HEIGHT * fb_w * 2); } } return 1; }
void memset2d2(void* dst, size_t row_pitch, int16_t value, size_t set_pitch, size_t num_rows) { oCheck((set_pitch & 1) == 0, std::errc::invalid_argument, "set_pitch must be 2-byte aligned"); int8_t* d = (int8_t*)dst; for (const int8_t* end = row_pitch * num_rows + d; d < end; d += row_pitch) memset2(d, value, set_pitch); }
void readDataCompressedWithFixedHuffmanCodes(BitReadState *in_pBitReadState, SetjmpStreamState *in_out_pWriteStreamState, ByteStreamInterface in_writeInterface) { static bool tableInitialized = false; HuffmanNode lengthCode, distanceCode; static uint16_t lencnt[MAXIMUM_BITS_IN_A_CODE+1], lensym[FIXED_LITERALLENGTH_HUFFMAN_CODES_COUNT]; static uint16_t distcnt[MAXIMUM_BITS_IN_A_CODE+1], distsym[MAXIMUM_NUMBER_OF_DISTANCE_CODES]; if (!tableInitialized) { uint16_t codeLengths[FIXED_LITERALLENGTH_HUFFMAN_CODES_COUNT]; { const uint16_t literalValueRangeBoundaries[LITERAL_VALUE_RANGE_BOUNDARY_COUNT+1] = { 0, 144, 256, 280, FIXED_LITERALLENGTH_HUFFMAN_CODES_COUNT }; const uint8_t literalCodeLengthsInArea[LITERAL_VALUE_RANGE_BOUNDARY_COUNT] = { 8, 9, 7, 8 }; uint8_t idx; for (idx = 0; idx < LITERAL_VALUE_RANGE_BOUNDARY_COUNT; idx++) { memset2(codeLengths+literalValueRangeBoundaries[idx], literalCodeLengthsInArea[idx], literalValueRangeBoundaries[idx+1]-literalValueRangeBoundaries[idx]); } } lengthCode.count = lencnt; lengthCode.symbol = lensym; constructHuffmanTree(&lengthCode, codeLengths, FIXED_LITERALLENGTH_HUFFMAN_CODES_COUNT); memset2(codeLengths, 5, MAXIMUM_NUMBER_OF_DISTANCE_CODES); distanceCode.count = distcnt; distanceCode.symbol = distsym; constructHuffmanTree(&distanceCode, codeLengths, MAXIMUM_NUMBER_OF_DISTANCE_CODES); } // ... }
int RunElf(char *name) { int fd,size,i; u8 *boot_elf = (u8 *) 0;//&_end; elf_header_t *eh = &elfh; elf_pheader_t *eph; char *argv[1]; void *pdata; fd=-1; if(name[0]=='m' && name[1]=='c') // if mc, test mc0 and mc1 { if((fd = fioOpen(name,1)) < 0) { name[2]='1'; } } if(fd < 0) if((fd = fioOpen(name,1)) < 0) { return -1; } size = fioLseek(fd, 0, SEEK_END); if(!size) { fioClose(fd); return -2; } fioLseek(fd, 0, 0); fioRead(fd, eh, sizeof(elf_header_t)); // read the elf header // crazy code for crazy man :P boot_elf=(u8 *)0x1800000-size-256; //if((eh->entry+size)>=boot_elf) boot_elf=(u8 *)eh->entry-size-256; boot_elf=(u8 *) (((unsigned)boot_elf) &0xfffffff0); // read rest file elf fioRead(fd, boot_elf+sizeof(elf_header_t), size-sizeof(elf_header_t)); fioClose(fd); // mrbrown machine gun ;) eph = (elf_pheader_t *)(boot_elf + eh->phoff); // Scan through the ELF's program headers and copy them into RAM, then // zero out any non-loaded regions. for (i = 0; i < eh->phnum; i++) { if (eph[i].type != ELF_PT_LOAD) continue; pdata = (void *)(boot_elf + eph[i].offset); memcpy2((unsigned char *)eph[i].vaddr, (unsigned char *)pdata, (int)eph[i].filesz); if (eph[i].memsz > eph[i].filesz) memset2((unsigned char *)eph[i].vaddr + eph[i].filesz, (unsigned char)0, (int)eph[i].memsz - eph[i].filesz); } // Let's go. argv[0] = name; fioExit(); Reset(); FlushCache(0); FlushCache(2); ExecPS2((void *)eh->entry, 0, 1, argv); return 0; }