void Oberon::CodeGenerator::Disassemble(Parser* parser) {
	int maxPc = pc;
	wprintf(L"TOP PC: %3d\n", pc);
	wprintf(L"DISASSEMBLING:\n");
	pc = 0;
	while (pc < maxPc) {
		int code = Next();
		wprintf(L"%3x:\t%2x\t%ls\t", pc-1, code, (code==-1?L"-1":opcode[code]));
		if (code == LOAD || code == LOADG || code == CONST || code == STO || code == STOG ||
			code == CALL || code == ENTER || code == JMP   || code == FJMP)
				wprintf(L"%d\n", Next2());
		else
			if (code == ADD  || code == SUB || code == MUL || code == DIV || code == NEG ||
				code == EQU  || code == LSS || code == GTR || code == RET || code == LEAVE ||
				code == READ || code == WRITE)
					wprintf(L"\n");
			else
				wprintf(L"\n");
	}
}
示例#2
0
文件: tc.c 项目: armornick/CocoR
void Interpret(void)
{
  int val, a, lev;

  printf("Interpreting\n");
  pc = progStart;
  base = 0;
  top = 3;
  while (1) {
    switch (Next()) {
    case LOAD:
      lev = Next();
      a = Next2();
      Push(stack[Up(lev) + a]);
      break;
    case LIT:
      Push(Next2());
      break;
    case STO:
      lev = Next();
      a = Next2();
      stack[Up(lev) + a] = Pop();
      break;
    case ADD:
      val = Pop(); Push(Pop() + val);
      break;
    case SUB:
      val = Pop(); Push(Pop() - val);
      break;
    case MUL:
      val = Pop(); Push(Pop() * val);
      break;
    case DIVI:
      val = Pop();
      if (!val) { printf("Divide by zero\n"); exit(1); }
      Push(Pop() / val);
      break;
    case EQU:
      val = Pop(); Push(Pop() == val);
      break;
    case LSS:
      val = Pop(); Push(Pop() < val);
      break;
    case GTR:
      val = Pop(); Push(Pop() > val);
      break;
    case CALL:
      Push(Up(Next()));
      Push(base);
      Push(pc + 2);
      pc = Next2();
      base = top - 3;
      break;
    case RET:
      top = base;
      base = stack[top+1];
      pc = stack[top+2];
      break;
    case RES:
      top+= Next2();
      break;
    case JMP:
      pc = Next2();
      break;
    case FJMP:
      a = Next2();
      if (Pop() == 0) pc = a;
      break;
    case HALTc:
      return;
    case NEG:
      Push(-Pop());
      break;
    case READ:
      lev = Next();
      a = Next2();
      printf("? ");
      scanf("%d", &val);
      stack[Up(lev) + a] = val;
      break;
    case WRITE:
      printf("%d\n", Pop());
      break;
    default:
      exit(1);
    }
  }
}
示例#3
0
文件: font.cpp 项目: Dingf/Paper-TD
void Font::LoadCharacter(const FT_Face& face, uint8 character)
{
	FT_Bitmap bitmap = face->glyph->bitmap;

	uint32 width = Next2(bitmap.width);
	uint32 height = Next2(bitmap.rows);

	uint8 * imageData = new uint8[2*width*height];

	for (uint32 i = 0; i < height; i++) 
	{
		for (uint32 j = 0; j < width; j++)
		{
			uint32 index = 2 * (j + (i * width));
			if ((j >= bitmap.width) || (i >= bitmap.rows))
			{
				imageData[index] = 0;
			}
			else
			{
				imageData[index] = bitmap.buffer[j+(bitmap.width*i)];
			}
			imageData[index+1] = imageData[index];
		}
	}

	glBindTexture(GL_TEXTURE_2D, textures[character]);

	glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, width, height, 0, GL_LUMINANCE_ALPHA, GL_UNSIGNED_BYTE, imageData);

	glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
	glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);

	Delete(imageData);

	int32 left = face->glyph->bitmap_left;
	int32 top = face->glyph->bitmap_top;

	glNewList(displayLists + character, GL_COMPILE);

	glBindTexture(GL_TEXTURE_2D, textures[character]);

	glTranslated(left, -top, 0);

	Float x = (Float)bitmap.width/(Float)width;
	Float y = (Float)bitmap.rows/(Float)height;

	glBegin(GL_QUADS);
		glTexCoord2d(0, 0); glVertex2f(0, 0);
		glTexCoord2d(0, y); glVertex2f(0,  bitmap.rows);
		glTexCoord2d(x, y); glVertex2f(bitmap.width,  bitmap.rows);
		glTexCoord2d(x, 0); glVertex2f(bitmap.width, 0);
	glEnd();

	glTranslated(-left, top, 0);

	glTranslated(face->glyph->advance.x >> 6, 0, 0);

	glEndList();

	glEndList();
}