aboutsummaryrefslogtreecommitdiff
path: root/engines/hopkins
diff options
context:
space:
mode:
Diffstat (limited to 'engines/hopkins')
-rw-r--r--engines/hopkins/anim.cpp5
-rw-r--r--engines/hopkins/events.cpp11
-rw-r--r--engines/hopkins/files.cpp13
-rw-r--r--engines/hopkins/font.cpp7
-rw-r--r--engines/hopkins/globals.cpp5
-rw-r--r--engines/hopkins/graphics.cpp13
-rw-r--r--engines/hopkins/lines.cpp12
-rw-r--r--engines/hopkins/menu.cpp4
-rw-r--r--engines/hopkins/objects.cpp19
9 files changed, 87 insertions, 2 deletions
diff --git a/engines/hopkins/anim.cpp b/engines/hopkins/anim.cpp
index 42aef7dd1d..c01ac7409a 100644
--- a/engines/hopkins/anim.cpp
+++ b/engines/hopkins/anim.cpp
@@ -38,6 +38,7 @@ AnimationManager::AnimationManager() {
NO_SEQ = false;
}
+// Play Anim
void AnimationManager::PLAY_ANM(const Common::String &filename, uint32 rate1, uint32 rate2, uint32 rate3) {
signed __int16 v4;
signed __int16 v5;
@@ -239,6 +240,7 @@ LABEL_58:
_vm->_graphicsManager.NOLOCK = 0;
}
+// Play Anim 2
void AnimationManager::PLAY_ANM2(const Common::String &filename, uint32 a2, uint32 a3, uint32 a4) {
byte *v4;
int v5;
@@ -671,6 +673,7 @@ bool AnimationManager::REDRAW_ANIM() {
return false;
}
+// Load Anim
void AnimationManager::CHARGE_ANIM(const Common::String &animName) {
byte v20[15];
char header[10];
@@ -746,6 +749,7 @@ void AnimationManager::CLEAR_ANIM() {
}
}
+// Load Sprite Bank 1
int AnimationManager::CHARGE_BANK_SPRITE1(int idx, const Common::String &filename) {
byte *v3;
byte *v4;
@@ -843,6 +847,7 @@ int AnimationManager::CHARGE_BANK_SPRITE1(int idx, const Common::String &filenam
return result;
}
+// Search Anim
void AnimationManager::RECHERCHE_ANIM(const byte *data, int animIndex, int count) {
int v3;
const byte *v5;
diff --git a/engines/hopkins/events.cpp b/engines/hopkins/events.cpp
index 030e321316..1504a85fe2 100644
--- a/engines/hopkins/events.cpp
+++ b/engines/hopkins/events.cpp
@@ -54,10 +54,12 @@ void EventsManager::setParent(HopkinsEngine *vm) {
_vm = vm;
}
+// Install Mouse
void EventsManager::INSTALL_SOURIS() {
// No implementation in original
}
+// Mouse On
void EventsManager::souris_on() {
souris_flag = true;
@@ -78,14 +80,17 @@ void EventsManager::souris_on() {
souris_xy(150, 100);
}
+// Set Mouse position
void EventsManager::souris_xy(int xp, int yp) {
g_system->warpMouse(xp, yp);
}
+// Mouse Max
void EventsManager::souris_max() {
// No implementation in original
}
+// Get Mouse X
int EventsManager::XMOUSE() {
souris_x = start_x + g_system->getEventManager()->getMousePos().x;
souris_y = g_system->getEventManager()->getMousePos().y;
@@ -93,6 +98,7 @@ int EventsManager::XMOUSE() {
return souris_x + ofset_souris_x;
}
+// Get Mouse Y
int EventsManager::YMOUSE() {
souris_x = start_x + g_system->getEventManager()->getMousePos().x;
souris_y = g_system->getEventManager()->getMousePos().y;
@@ -100,22 +106,26 @@ int EventsManager::YMOUSE() {
return souris_y + ofset_souris_y;
}
+// Get Mouse Button
int EventsManager::BMOUSE() {
CONTROLE_MES();
return souris_bb;
}
+// Mouse Off
void EventsManager::MOUSE_OFF() {
souris_flag = false;
g_system->showMouse(false);
}
+// Mouse On
void EventsManager::MOUSE_ON() {
souris_on();
souris_flag = true;
g_system->showMouse(true);
}
+// Change Mouse Cursor
void EventsManager::CHANGE_MOUSE(int id) {
int cursorId = id;
@@ -182,6 +192,7 @@ void EventsManager::CHANGE_MOUSE(int id) {
}
}
+// Check Events
void EventsManager::CONTROLE_MES() {
pollEvents();
}
diff --git a/engines/hopkins/files.cpp b/engines/hopkins/files.cpp
index de501d884c..1fe4eba2ac 100644
--- a/engines/hopkins/files.cpp
+++ b/engines/hopkins/files.cpp
@@ -46,6 +46,7 @@ void FileManager::initSaves() {
SAUVE_FICHIER(dataFilename, data, 100);
}
+// Save File
bool FileManager::SAUVE_FICHIER(const Common::String &file, const void *buf, size_t n) {
return bsave(file, buf, n);
}
@@ -63,6 +64,7 @@ bool FileManager::bsave(const Common::String &file, const void *buf, size_t n) {
return false;
}
+// Load INI File
void FileManager::Chage_Inifile(Common::StringMap &iniParams) {
char *iniData = (char *)CHARGE_FICHIER("config.ini");
char *ptr = iniData;
@@ -105,6 +107,7 @@ void FileManager::Chage_Inifile(Common::StringMap &iniParams) {
free(iniData);
}
+// Load File
byte *FileManager::CHARGE_FICHIER(const Common::String &file) {
DMESS1();
@@ -124,6 +127,7 @@ byte *FileManager::CHARGE_FICHIER(const Common::String &file) {
return data;
}
+// Load File 2
void FileManager::CHARGE_FICHIER2(const Common::String &file, byte *buf) {
Common::File f;
size_t filesize;
@@ -137,10 +141,12 @@ void FileManager::CHARGE_FICHIER2(const Common::String &file, byte *buf) {
f.close();
}
+// Guess: Debug Message
void FileManager::DMESS() {
// No implementation in original
}
+// Guess: Debug Message 1
void FileManager::DMESS1() {
// No implementation in original
}
@@ -158,6 +164,7 @@ int FileManager::bload_it(Common::ReadStream &stream, void *buf, size_t nbytes)
return stream.read(buf, nbytes);
}
+// Censorship
void FileManager::F_Censure() {
_vm->_globals.CENSURE = false;
@@ -176,11 +183,13 @@ void FileManager::F_Censure() {
free(data);
}
+// Build System
int FileManager::CONSTRUIT_SYSTEM(const Common::String &file) {
_vm->_globals.NFICHIER = Common::String::format("system/%s", file.c_str());
return _vm->_globals.NFICHIER.size();
}
+// Build File
void FileManager::CONSTRUIT_FICHIER(const Common::String &hop, const Common::String &file) {
// At this point, the original program did a big switch statement to determine
// whether to preprend the CD or installed directory path into REPJEU
@@ -192,11 +201,13 @@ void FileManager::CONSTRUIT_FICHIER(const Common::String &hop, const Common::Str
_vm->_globals.NFICHIER = Common::String::format("%s/%s", hop.c_str(), file.c_str());
}
+// Free File
byte *FileManager::LIBERE_FICHIER(byte *ptr) {
free(ptr);
return g_PTRNUL;
}
+// Search Cat
byte *FileManager::RECHERCHE_CAT(const Common::String &file, int a2) {
byte *ptr = NULL;
Common::File f;
@@ -344,6 +355,7 @@ byte *FileManager::RECHERCHE_CAT(const Common::String &file, int a2) {
return result;
}
+// File Size
uint32 FileManager::FLONG(const Common::String &filename) {
Common::File f;
uint32 size;
@@ -357,6 +369,7 @@ uint32 FileManager::FLONG(const Common::String &filename) {
return size;
}
+// Build Linux
Common::String FileManager::CONSTRUIT_LINUX(const Common::String &file) {
return file;
}
diff --git a/engines/hopkins/font.cpp b/engines/hopkins/font.cpp
index a2c3713d87..fdcf86ea1b 100644
--- a/engines/hopkins/font.cpp
+++ b/engines/hopkins/font.cpp
@@ -51,6 +51,7 @@ void FontManager::clearAll() {
}
}
+// Text On
void FontManager::TEXTE_ON(int idx) {
if ((idx - 5) > 11)
error("Attempted to display text > MAX_TEXT.");
@@ -65,7 +66,7 @@ void FontManager::TEXTE_ON(int idx) {
}
}
-
+// Text Off
void FontManager::TEXTE_OFF(int idx) {
if ((idx - 5) > 11)
error("Attempted to display text > MAX_TEXT.");
@@ -80,10 +81,12 @@ void FontManager::TEXTE_OFF(int idx) {
}
}
+// Text Color
void FontManager::COUL_TXT(int idx, byte colByte) {
Txt[idx - 5].colour = colByte;
}
+// Text Optimal Color
void FontManager::OPTI_COUL_TXT(int idx1, int idx2, int idx3, int idx4) {
COUL_TXT(idx1, 255);
COUL_TXT(idx2, 255);
@@ -91,6 +94,7 @@ void FontManager::OPTI_COUL_TXT(int idx1, int idx2, int idx3, int idx4) {
COUL_TXT(idx4, 253);
}
+//
void FontManager::DOS_TEXT(int idx, int messageId, const Common::String &filename, int xp, int yp, int a6, int a7, int a8, int a9, int colour) {
if ((idx - 5) > 11)
error("Attempted to display text > MAX_TEXT.");
@@ -108,6 +112,7 @@ void FontManager::DOS_TEXT(int idx, int messageId, const Common::String &filenam
txt.colour = colour;
}
+// Box
void FontManager::BOITE(int idx, int messageId, const Common::String &filename, int xp, int yp) {
int filesize;
byte *v9;
diff --git a/engines/hopkins/globals.cpp b/engines/hopkins/globals.cpp
index 46b7eb3756..bd95ade47f 100644
--- a/engines/hopkins/globals.cpp
+++ b/engines/hopkins/globals.cpp
@@ -443,6 +443,7 @@ void Globals::CLEAR_VBOB() {
}
}
+// Load Object
void Globals::CHARGE_OBJET() {
_vm->_fileManager.CONSTRUIT_SYSTEM("OBJET.DAT");
byte *data = _vm->_fileManager.CHARGE_FICHIER(NFICHIER);
@@ -475,11 +476,13 @@ byte *Globals::dos_free2(byte *p) {
return g_PTRNUL;
}
+// Free File
byte *Globals::LIBERE_FICHIER(byte *p) {
dos_free2(p);
return g_PTRNUL;
}
+// Reset Cache
void Globals::RESET_CACHE() {
byte *dataP;
@@ -509,6 +512,7 @@ void Globals::RESET_CACHE() {
void Globals::CACHE_ON() {
CACHEFLAG = 1;
}
+
// TODO: Find why some calls have a parameter value
void Globals::CACHE_OFF(int v1) {
CACHEFLAG = 0;
@@ -522,6 +526,7 @@ void Globals::CACHE_ADD(int idx) {
Cache[idx].fieldA = 1;
}
+// Load Cache
void Globals::CHARGE_CACHE(const Common::String &file) {
byte *v2 = g_PTRNUL;
int v4;
diff --git a/engines/hopkins/graphics.cpp b/engines/hopkins/graphics.cpp
index 3798711a49..c42ea8cfa0 100644
--- a/engines/hopkins/graphics.cpp
+++ b/engines/hopkins/graphics.cpp
@@ -158,6 +158,7 @@ void GraphicsManager::DD_Unlock() {
}
}
+// Clear Screen
void GraphicsManager::Cls_Video() {
assert(VideoPtr);
@@ -170,6 +171,7 @@ void GraphicsManager::LOAD_IMAGE(const Common::String &file) {
INIT_TABLE(165, 170, Palette);
}
+// Load Screen
void GraphicsManager::CHARGE_ECRAN(const Common::String &file) {
bool flag;
Common::File f;
@@ -259,6 +261,7 @@ void GraphicsManager::INIT_TABLE(int a1, int a2, byte *palette) {
TABLE_COUL[0] = 1;
}
+// Scroll Screen
int GraphicsManager::SCROLL_ECRAN(int amount) {
int result = CLIP(amount, 0, SCREEN_WIDTH);
_vm->_eventsManager.start_x = result;
@@ -483,6 +486,7 @@ void GraphicsManager::A_PCX640_480(byte *surface, const Common::String &file, by
_vm->_globals.dos_free2(ptr);
}
+// Clear Palette
void GraphicsManager::Cls_Pal() {
Common::fill(&cmap[0], &cmap[PALETTE_BLOCK_SIZE], 0);
SD_PIXELS[0] = 0;
@@ -492,6 +496,7 @@ void GraphicsManager::Cls_Pal() {
}
}
+// TODO: Check if it's normal it's defined two times (also in events).
void GraphicsManager::souris_max() {
// Original has no implementation
}
@@ -1495,6 +1500,7 @@ void GraphicsManager::RESET_SEGMENT_VESA() {
}
}
+// Add VESA Segment
void GraphicsManager::Ajoute_Segment_Vesa(int x1, int y1, int x2, int y2) {
int v4;
int v5;
@@ -1553,6 +1559,7 @@ int GraphicsManager::Magic_Number(signed int v) {
return result;
}
+// Display VESA Segment
void GraphicsManager::Affiche_Segment_Vesa() {
if (_vm->_globals.NBBLOC == 0)
return;
@@ -1748,6 +1755,7 @@ int GraphicsManager::Asm_Reduc(int v, int percentage) {
return v;
}
+// Display 'Perfect?'
void GraphicsManager::Affiche_Perfect(byte *surface, const byte *srcData, int xp300, int yp300, int spriteIndex, int a6, int a7, int a8) {
const byte *v8;
int i;
@@ -2165,6 +2173,7 @@ Aff_Zoom_Larg_Cont1:
}
}
+// Display Speed
void GraphicsManager::AFFICHE_SPEED(const byte *spriteData, int xp, int yp, int spriteIndex) {
int width, height;
@@ -2242,6 +2251,7 @@ void GraphicsManager::Copy_Mem(const byte *srcSurface, int x1, int y1, unsigned
} while (yCurrent != 1);
}
+// Display Font
void GraphicsManager::Affiche_Fonte(byte *surface, const byte *spriteData, int xp, int yp,
int characterIndex, int colour) {
const byte *v6;
@@ -2291,10 +2301,12 @@ void GraphicsManager::Affiche_Fonte(byte *surface, const byte *spriteData, int x
} while (v16 != 1);
}
+// Init Screen
void GraphicsManager::INI_ECRAN(const Common::String &file) {
OPTI_INI(file, 0);
}
+// Init Screen 2
void GraphicsManager::INI_ECRAN2(const Common::String &file) {
OPTI_INI(file, 2);
}
@@ -2483,6 +2495,7 @@ Video_Cont_Vbe:
}
}
+// Reduce Screen
// TODO: Check that v9 doesn't get set anywhere (apart from the current init to zero)
void GraphicsManager::Reduc_Ecran(byte *a1, byte *a2, int a3, int a4, int a5, int a6, int a7) {
byte *v7;
diff --git a/engines/hopkins/lines.cpp b/engines/hopkins/lines.cpp
index 550cabd168..e307a0ee2f 100644
--- a/engines/hopkins/lines.cpp
+++ b/engines/hopkins/lines.cpp
@@ -59,6 +59,7 @@ void LinesManager::CLEAR_ZONE() {
next_ligne = 0;
}
+// Object Zone
int LinesManager::ZONE_OBJET(int a1, int a2) {
int v2;
@@ -127,6 +128,7 @@ int LinesManager::OPTI_ZONE(int a1, int a2, int a3) {
return v3;
}
+// Remove Line Zone
void LinesManager::RETIRE_LIGNE_ZONE(int idx) {
if (idx > 400)
error("Attempting to add a line obstacle > MAX_LIGNE.");
@@ -136,7 +138,7 @@ void LinesManager::RETIRE_LIGNE_ZONE(int idx) {
_vm->_linesManager.LigneZone[idx].zoneData = (int16 *)g_PTRNUL;
}
-
+// Add Line Zone
void LinesManager::AJOUTE_LIGNE_ZONE(int idx, int a2, int a3, int a4, int a5, int a6) {
int v8;
int v9;
@@ -223,6 +225,7 @@ void LinesManager::RESET_OBSTACLE() {
}
}
+// Remove Line
void LinesManager::RETIRE_LIGNE(int idx) {
if (idx > 400)
error("Attempting to add a line obstacle > MAX_LIGNE.");
@@ -231,6 +234,7 @@ void LinesManager::RETIRE_LIGNE(int idx) {
Ligne[idx].lineData = (int16 *)g_PTRNUL;
}
+// Add Line
void LinesManager::AJOUTE_LIGNE(int idx, int a2, int a3, int a4, int a5, int a6, int a7) {
int v7;
int v8;
@@ -381,6 +385,7 @@ void LinesManager::AJOUTE_LIGNE(int idx, int a2, int a3, int a4, int a5, int a6,
Ligne[idx].field4 = a2;
}
+// Line Collision 2
int LinesManager::colision2_ligne(int a1, int a2, int *a3, int *a4, int a5, int a6) {
int v6;
int16 *v7;
@@ -587,6 +592,7 @@ LABEL_46:
return result;
}
+// Init route
void LinesManager::INIPARCOURS() {
int v0;
int v1;
@@ -649,6 +655,7 @@ void LinesManager::INIPARCOURS() {
} while (v8 != 400);
}
+// Avoid
int LinesManager::CONTOURNE(int a1, int a2, int a3, int a4, int a5, int16 *a6, int a7) {
int v7;
int v8;
@@ -788,6 +795,7 @@ int LinesManager::CONTOURNE(int a1, int a2, int a3, int a4, int a5, int16 *a6, i
return v8;
}
+// Avoid 1
int LinesManager::CONTOURNE1(int a1, int a2, int a3, int a4, int a5, int16 *a6, int a7, int a8, int a9) {
int v9;
int v10;
@@ -1681,6 +1689,7 @@ LABEL_17:
return v99;
}
+// Avoid 2
// TODO: method casting int arrays as byte pointers. Double-check later whether
// we can convert the return to a uint16 *
int16 *LinesManager::PARCOURS2(int a1, int a2, int a3, int a4) {
@@ -3816,6 +3825,7 @@ LABEL_60:
return 1;
}
+// Test line
int LinesManager::TEST_LIGNE(int a1, int a2, int *a3, int *a4, int *a5) {
int i;
int v6;
diff --git a/engines/hopkins/menu.cpp b/engines/hopkins/menu.cpp
index fcebb2ce8b..a4bd9c13c9 100644
--- a/engines/hopkins/menu.cpp
+++ b/engines/hopkins/menu.cpp
@@ -233,6 +233,7 @@ int MenuManager::MENU() {
return v6;
}
+// Load Game
void MenuManager::CHARGE_PARTIE() {
int v1;
char v3;
@@ -304,6 +305,7 @@ void MenuManager::CHARGE_PARTIE() {
_vm->_objectsManager.CHANGE_OBJET(14);
}
+// Save Game
void MenuManager::SAUVE_PARTIE() {
byte *v1;
int v2;
@@ -559,6 +561,7 @@ void MenuManager::COMPUT_HOPKINS(int idx) {
*/
}
+// Load Save
void MenuManager::LOAD_SAUVE(int a1) {
int v1;
byte *v2;
@@ -638,6 +641,7 @@ void MenuManager::LOAD_SAUVE(int a1) {
_vm->_objectsManager.SL_Y = 0;
}
+// Search Game
int MenuManager::CHERCHE_PARTIE() {
int v0;
int v1;
diff --git a/engines/hopkins/objects.cpp b/engines/hopkins/objects.cpp
index 9ce0b3b6cd..102ad21ee8 100644
--- a/engines/hopkins/objects.cpp
+++ b/engines/hopkins/objects.cpp
@@ -110,6 +110,7 @@ void ObjectsManager::setParent(HopkinsEngine *vm) {
_vm = vm;
}
+// Change Object
byte *ObjectsManager::CHANGE_OBJET(int objIndex) {
byte *result = ObjectsManager::CAPTURE_OBJET(objIndex, 1);
_vm->_globals.Bufferobjet = result;
@@ -170,6 +171,7 @@ byte *ObjectsManager::CAPTURE_OBJET(int objIndex, int mode) {
return result;
}
+// Delete Object
void ObjectsManager::DELETE_OBJET(int objIndex) {
int v1;
int v2;
@@ -240,6 +242,7 @@ int ObjectsManager::get_offsety(const byte *spriteData, int spriteIndex, bool is
return result;
}
+// Get Width
int ObjectsManager::Get_Largeur(const byte *objectData, int idx) {
const byte *rectP = objectData + 3;
for (int i = idx; i; --i)
@@ -248,6 +251,7 @@ int ObjectsManager::Get_Largeur(const byte *objectData, int idx) {
return (int16)READ_LE_UINT16(rectP + 4);
}
+// Get height
int ObjectsManager::Get_Hauteur(const byte *objectData, int idx) {
const byte *rectP = objectData + 3;
for (int i = idx; i; --i)
@@ -279,6 +283,7 @@ byte *ObjectsManager::DEL_FICHIER_OBJ() {
return result;
}
+// Load Sprite
byte *ObjectsManager::CHARGE_SPRITE(const Common::String &file) {
_vm->_fileManager.DMESS1();
return _vm->_fileManager.CHARGE_FICHIER(file);
@@ -297,6 +302,7 @@ int ObjectsManager::capture_mem_sprite(const byte *objectData, byte *sprite, int
return result;
}
+// Add Object
int ObjectsManager::AJOUTE_OBJET(int objIndex) {
bool flag = false;
int arrIndex = 0;
@@ -312,6 +318,7 @@ int ObjectsManager::AJOUTE_OBJET(int objIndex) {
return arrIndex;
}
+// Display Sprite
void ObjectsManager::AFF_SPRITES() {
int v0;
int v1;
@@ -1139,6 +1146,7 @@ void ObjectsManager::DEF_CACHE(int idx) {
_vm->_globals.Cache[idx].field4 + _vm->_globals.Cache[idx].field8);
}
+// Compute Sprite
void ObjectsManager::CALCUL_SPRITE(int idx) {
int width, height;
int v3;
@@ -1262,6 +1270,7 @@ void ObjectsManager::CALCUL_SPRITE(int idx) {
}
}
+// Before Sort
int ObjectsManager::AvantTri(int a1, int a2, int a3) {
int result;
@@ -1277,6 +1286,7 @@ int ObjectsManager::AvantTri(int a1, int a2, int a3) {
return result;
}
+// Display BOB Anim
void ObjectsManager::AFF_BOB_ANIM() {
int v1;
int v2;
@@ -1465,6 +1475,7 @@ LABEL_38:
} while (v28 != 35);
}
+// Display VBOB
void ObjectsManager::AFF_VBOB() {
int width, height;
@@ -1723,6 +1734,7 @@ void ObjectsManager::SETYSPR(int idx, int yp) {
Sprite[idx].spritePos.y = yp;
}
+// Set Sprite Size
void ObjectsManager::SETTAILLESPR(int idx, int a2) {
if (idx > 5)
error("Set the Coord. there a sprite> MAX_SPRITE.");
@@ -2448,6 +2460,7 @@ LABEL_19:
}
}
+// Load Obstacle
void ObjectsManager::CHARGE_OBSTACLE(const Common::String &file) {
__int16 v1;
byte *ptr;
@@ -2481,6 +2494,7 @@ void ObjectsManager::CHARGE_OBSTACLE(const Common::String &file) {
_vm->_globals.dos_free2(ptr);
}
+// Load Zone
void ObjectsManager::CHARGE_ZONE(const Common::String &file) {
signed int v1;
int v2;
@@ -2592,6 +2606,7 @@ void ObjectsManager::CHARGE_ZONE(const Common::String &file) {
_vm->_objectsManager.CARRE_ZONE();
}
+// Square Zone
void ObjectsManager::CARRE_ZONE() {
int16 *dataP;
int v4;
@@ -2783,6 +2798,7 @@ void ObjectsManager::PLAN_BETA() {
_vm->_globals.PLAN_FLAG = 0;
}
+// Left Button
void ObjectsManager::BTGAUCHE() {
int v0;
int v1;
@@ -3086,6 +3102,7 @@ LABEL_64:
GOACTION = 0;
}
+// Clear Screen
void ObjectsManager::CLEAR_ECRAN() {
int v1;
int v2;
@@ -3340,6 +3357,7 @@ LABEL_7:
}
}
+// Change Face/Head
void ObjectsManager::CHANGE_TETE(int a1, int a2) {
int v2;
Sauvegarde1 *v3;
@@ -3454,6 +3472,7 @@ LABEL_9:
}
}
+// Check Size
void ObjectsManager::VERIFTAILLE() {
int v0;
int v1;