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"); } }
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); } } }
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(); }