- #include "input.h" 
-   
- #include "brender/brender.h" 
- #include "errors.h" 
- #include "globvars.h" 
- #include "grafdata.h" 
- #include "graphics.h" 
- #include "harness/hooks.h" 
- #include "harness/trace.h" 
- #include "pd/sys.h" 
- #include "utility.h" 
- #include <stdlib.h> 
-   
- int gEdge_trigger_mode; 
- tU32 gLast_poll_keys; 
- int gInsert_mode; 
- int gGo_ahead_keys[3] = { 51, 52, 106 }; // enter, return, space 
- tJoy_array gJoy_array; 
- tKey_array gKey_array; 
- int gKey_poll_counter; 
- tRolling_letter* gRolling_letters; 
- int gCurrent_cursor; 
- int gCurrent_position; 
- int gLetter_x_coords[15]; 
- int gVisible_length; 
- int gLetter_y_coords[15]; 
- int gThe_key; 
- tU32 gLast_key_down_time; 
- int gThe_length; 
- tU32 gLast_roll; 
- int gLast_key_down; 
- int gKey_mapping[67]; 
- char gCurrent_typing[110]; 
-   
- #define NBR_ROLLING_LETTERS 500 
-   
- // IDA: void __usercall SetJoystickArrays(int *pKeys@<EAX>, int pMark@<EDX>) 
- void SetJoystickArrays(int* pKeys, int pMark) { 
-     //int i; // Pierre-Marie Baty -- unused variable 
-     //tS32 joyX; // Pierre-Marie Baty -- unused variable 
-     //tS32 joyY; // Pierre-Marie Baty -- unused variable 
-     //static tS32 old_joy1X; // Pierre-Marie Baty -- unused variable 
-     //static tS32 old_joy1Y; // Pierre-Marie Baty -- unused variable 
-     //static tS32 old_joy2X; // Pierre-Marie Baty -- unused variable 
-     //static tS32 old_joy2Y; // Pierre-Marie Baty -- unused variable 
- } 
-   
- // IDA: void __cdecl PollKeys() 
- void PollKeys(void) { 
-   
-     gKey_poll_counter++; 
-     PDSetKeyArray(gKey_array, gKey_poll_counter); 
-     SetJoystickArrays(gKey_array, gKey_poll_counter); 
-     gLast_poll_keys = PDGetTotalTime(); 
- } 
-   
- // IDA: void __cdecl CyclePollKeys() 
- void CyclePollKeys(void) { 
-     int i; 
-     for (i = 0; i < COUNT_OF(gKey_array); i++) { 
-         if (gKey_array[i] > gKey_poll_counter) { 
-             gKey_array[i] = 0; 
-             if (i > 115) { 
-                 gJoy_array[i - 115] = -1; // yes this is a little weird I know... 
-             } 
-         } 
-     } 
-     gKey_poll_counter = 0; 
- } 
-   
- // IDA: void __cdecl ResetPollKeys() 
- void ResetPollKeys(void) { 
-     int i; 
-     for (i = 0; i < COUNT_OF(gKey_array); i++) { 
-         gKey_array[i] = 0; 
-     } 
-     for (i = 0; i < COUNT_OF(gJoy_array); i++) { 
-         gJoy_array[i] = -1; 
-     } 
- } 
-   
- // IDA: void __cdecl CheckKeysForMouldiness() 
- void CheckKeysForMouldiness(void) { 
-     LOG_TRACE9("()"); 
-   
-     if (PDGetTotalTime() - gLast_poll_keys > 500) { 
-         ResetPollKeys(); 
-         CyclePollKeys(); 
-         PollKeys(); 
-     } 
- } 
-   
- // IDA: int __cdecl EitherMouseButtonDown() 
- int EitherMouseButtonDown(void) { 
-     int but_1; 
-     int but_2; 
-   
-     PDMouseButtons(&but_1, &but_2); 
-     return but_1 || but_2; 
- } 
-   
- // IDA: tKey_down_result __usercall PDKeyDown2@<EAX>(int pKey_index@<EAX>) 
- tKey_down_result PDKeyDown2(int pKey_index) { 
-     tU32 the_time; 
-   
-     CheckKeysForMouldiness(); 
-     if (!gEdge_trigger_mode) { 
-         return gKey_array[pKey_index]; 
-     } 
-     the_time = PDGetTotalTime(); 
-     if (gKey_array[pKey_index]) { 
-         if (gLast_key_down == pKey_index) { 
-             if (the_time - gLast_key_down_time < 300) { 
-                 return tKey_down_still; 
-             } else { 
-                 gLast_key_down_time = the_time; 
-                 return tKey_down_repeat; 
-             } 
-         } else { 
-             gLast_key_down_time = the_time; 
-             gLast_key_down = pKey_index; 
-             return tKey_down_yes; 
-         } 
-     } 
-     if (gLast_key_down == pKey_index) { 
-         gLast_key_down_time = 0; 
-         gLast_key_down = -1; 
-     } 
-     return tKey_down_no; 
- } 
-   
- // IDA: int __usercall PDKeyDown@<EAX>(int pKey_index@<EAX>) 
- int PDKeyDown(int pKey_index) { 
-     tKey_down_result result; 
-   
-     result = PDKeyDown2(pKey_index); 
-     if (!gEdge_trigger_mode || pKey_index <= 10) { 
-         return result != tKey_down_no; 
-     } 
-     return result == tKey_down_yes || result == tKey_down_repeat; 
- } 
-   
- // IDA: int __usercall PDKeyDown3@<EAX>(int pKey_index@<EAX>) 
- int PDKeyDown3(int pKey_index) { 
-     int last_key_down_time; 
-     int last_key_down; 
-     tKey_down_result result; 
-     LOG_TRACE("(%d)", pKey_index); 
-   
-     last_key_down = gLast_key_down; 
-     last_key_down_time = gLast_key_down_time; 
-     result = PDKeyDown2(pKey_index); 
-     gLast_key_down_time = last_key_down_time; 
-     gLast_key_down = last_key_down; 
-     return result == tKey_down_yes || result == tKey_down_repeat; 
- } 
-   
- // IDA: int __cdecl PDAnyKeyDown() 
- int PDAnyKeyDown(void) { 
-     int i; 
-     tKey_down_result result; 
-   
-     CheckKeysForMouldiness(); 
-     for (i = COUNT_OF(gKey_array) - 1; i >= 0; --i) { 
-         if (gKey_array[i]) { 
-             if (!gEdge_trigger_mode) { 
-                 return i; 
-             } 
-             result = PDKeyDown2(i); 
-             switch (result) { 
-             case tKey_down_no: 
-             case tKey_down_still: 
-                 return -1; 
-             case tKey_down_yes: 
-             case tKey_down_repeat: 
-                 return i; 
-             } 
-         } 
-     } 
-     if (gEdge_trigger_mode) { 
-         gLast_key_down_time = 0; 
-         gLast_key_down = -1; 
-     } 
-     return -1; 
- } 
-   
- // IDA: int __cdecl AnyKeyDown() 
- int AnyKeyDown(void) { 
-     int the_key; 
-   
-     the_key = PDAnyKeyDown(); 
-     if ((the_key != -1 && the_key != 4) || EitherMouseButtonDown() != 0) { 
-         return 1; 
-     } 
-     return 0; 
- } 
-   
- // IDA: tU32* __cdecl KevKeyService() 
- tU32* KevKeyService(void) { 
-     static tU32 sum = 0; 
-     static tU32 code = 0; 
-     static tU32 code2 = 0; 
-     static int last_key = -1; 
-     static int last_single_key = -1; 
-     static tU32 last_time = 0; 
-     static tU32 return_val[2]; 
-     tU32 keys; 
-   
-     keys = gKeys_pressed; 
-     // printf("key: %d, %lx, %lx\n", sizeof(long), keys, code2); 
-     return_val[0] = 0; 
-     return_val[1] = 0; 
-   
-     if (keys < 0x6B) { 
-         last_single_key = gKeys_pressed; 
-     } else { 
-         if (keys > 0x6b00) { 
-             sum = 0; 
-             code = 0; 
-             return return_val; 
-         } 
-         if ((keys & 0xff) != last_single_key && keys >> 8 != last_single_key) { 
-             sum = 0; 
-             code = 0; 
-             return return_val; 
-         } 
-         if (keys >> 8 != last_single_key) { 
-             sum = 0; 
-             code = 0; 
-             return return_val; 
-         } 
-         if ((keys & 0xff) == last_single_key) { 
-             keys = keys >> 8; 
-         } 
-         keys = keys & 0xff; 
-     } 
-   
-     if (keys && keys != last_key) { 
-         sum += keys; 
-         code += keys << 11; 
-         code = (code >> 17) + (code << 4); 
-         code2 = (code2 >> 29) + keys * keys + (code2 << 3); 
-         // printf("accumulate: keys=%lx, sum=%lx, code=%lx, code2=%lx\n", keys, sum, code, code2); 
-         last_time = PDGetTotalTime(); 
-     } else if ((tU32) PDGetTotalTime() > (last_time + 1000)) { // Pierre-Marie Baty -- added type cast 
-         return_val[0] = ((code >> 11) + (sum << 21)); 
-         return_val[1] = code2; 
-         // printf("final value: code=%lx, code2=%lx\n", return_val[0], return_val[1]); 
-         code = 0; 
-         code2 = 0; 
-         sum = 0; 
-     } 
-     last_key = keys; 
-     return return_val; 
- } 
-   
- // IDA: int __usercall OldKeyIsDown@<EAX>(int pKey_index@<EAX>) 
- int OldKeyIsDown(int pKey_index) { 
-     int i; 
-     LOG_TRACE("(%d)", pKey_index); 
-   
-     switch (pKey_index) { 
-     case -2: 
-         return 1; 
-     case -1: 
-         for (i = 0; i < COUNT_OF(gGo_ahead_keys); i++) { 
-             if (PDKeyDown(gGo_ahead_keys[i]) != 0) { 
-                 return 1; 
-             } 
-         } 
-         return 0; 
-     default: 
-         return PDKeyDown(gKey_mapping[pKey_index]); 
-     } 
- } 
-   
- // IDA: int __usercall KeyIsDown@<EAX>(int pKey_index@<EAX>) 
- int KeyIsDown(int pKey_index) { 
-     int i; 
-   
-     CheckKeysForMouldiness(); 
-     switch (pKey_index) { 
-     case -2: 
-         return 1; 
-     case -1: 
-         for (i = 0; i < COUNT_OF(gGo_ahead_keys); i++) { 
-             if (gKey_array[gGo_ahead_keys[i]]) { 
-                 return 1; 
-             } 
-         } 
-         return 0; 
-     default: 
-         return gKey_array[gKey_mapping[pKey_index]]; 
-     } 
- } 
-   
- // IDA: void __cdecl WaitForNoKeys() 
- void WaitForNoKeys(void) { 
-     LOG_TRACE("()"); 
-   
-     while (AnyKeyDown() || EitherMouseButtonDown()) { 
-         CheckQuit(); 
-     } 
-     CheckQuit(); 
- } 
-   
- // IDA: void __cdecl WaitForAKey() 
- void WaitForAKey(void) { 
-     LOG_TRACE("()"); 
-   
-     while (1) { 
-         CheckQuit(); 
-         if (AnyKeyDown()) { 
-             break; 
-         } 
-         if (EitherMouseButtonDown()) { 
-             break; 
-         } 
-     } 
-     CheckQuit(); 
-     WaitForNoKeys(); 
- } 
-   
- // IDA: int __usercall CmdKeyDown@<EAX>(int pFKey_ID@<EAX>, int pCmd_key_ID@<EDX>) 
- int CmdKeyDown(int pFKey_ID, int pCmd_key_ID) { 
-     return KeyIsDown(pFKey_ID) || (KeyIsDown(KEYMAP_CONTROL_ANY) && KeyIsDown(pCmd_key_ID)); 
- } 
-   
- // IDA: void __usercall GetMousePosition(int *pX_coord@<EAX>, int *pY_coord@<EDX>) 
- void GetMousePosition(int* pX_coord, int* pY_coord) { 
-     //int x_left_margin; // Pierre-Marie Baty -- unused variable 
-     //int x_right_margin; // Pierre-Marie Baty -- unused variable 
-     //int y_top_margin; // Pierre-Marie Baty -- unused variable 
-     //int y_bottom_margin; // Pierre-Marie Baty -- unused variable 
-     LOG_TRACE("(%p, %p)", pX_coord, pY_coord); 
-   
-     PDGetMousePosition(pX_coord, pY_coord); 
-     if (*pX_coord < 0) { 
-         *pX_coord = 0; 
-     } else if (gGraf_specs[gGraf_spec_index].total_width < *pX_coord) { 
-         *pX_coord = gGraf_specs[gGraf_spec_index].total_width; 
-     } 
-     if (*pY_coord < 0) { 
-         *pY_coord = 0; 
-     } else if (gGraf_specs[gGraf_spec_index].total_height < *pY_coord) { 
-         *pY_coord = gGraf_specs[gGraf_spec_index].total_height; 
-     } 
- } 
-   
- // IDA: void __cdecl InitRollingLetters() 
- void InitRollingLetters(void) { 
-     int i; 
-     LOG_TRACE("()"); 
-   
-     gLast_roll = 0; 
-     gCurrent_cursor = -1; 
-     gRolling_letters = BrMemAllocate(NBR_ROLLING_LETTERS * sizeof(tRolling_letter), kMem_rolling_letters); 
-     for (i = 0; i < NBR_ROLLING_LETTERS; i++) { 
-         gRolling_letters[i].number_of_letters = -1; 
-     } 
- } 
-   
- // IDA: void __cdecl EndRollingLetters() 
- void EndRollingLetters(void) { 
-     LOG_TRACE("()"); 
-   
-     BrMemFree(gRolling_letters); 
- } 
-   
- // IDA: int __usercall AddRollingLetter@<EAX>(char pChar@<EAX>, int pX@<EDX>, int pY@<EBX>, tRolling_type rolling_type@<ECX>) 
- int AddRollingLetter(char pChar, int pX, int pY, tRolling_type rolling_type) { 
-     tRolling_letter* let; 
-     int i; 
-     //int number_of_letters; // Pierre-Marie Baty -- unused variable 
-     LOG_TRACE("(%d, %d, %d, %d)", pChar, pX, pY, rolling_type); 
-   
-     let = &gRolling_letters[0]; 
-     for (i = 0; i < NBR_ROLLING_LETTERS; i++) { 
-         let = &gRolling_letters[i]; 
-         if (let->number_of_letters < 0) { 
-             break; 
-         } 
-     } 
-     if (i == NBR_ROLLING_LETTERS) { 
-         LOG_WARN("no rolling slot available"); 
-         return -1; 
-     } 
-     let->x_coord = pX; 
-     let->y_coord = pY; 
-     let->rolling_type = rolling_type; 
-     switch (rolling_type) { 
-     case eRT_looping_random: 
-         let->number_of_letters = 9; 
-         break; 
-     case eRT_looping_single: 
-         let->number_of_letters = 2; 
-         break; 
-     default: 
-         let->number_of_letters = IRandomBetween(3, 9); 
-         break; 
-     } 
-   
-     let->current_offset = (gCurrent_graf_data->save_slot_letter_height * let->number_of_letters); 
-     for (i = 0; i < let->number_of_letters; i++) { 
-         if (rolling_type == eRT_numeric) { 
-             /* The (tU8) cast makes sure extended ASCII is positive. */ 
-             let->letters[i] = (tU8)pChar; 
-         } else { 
-             let->letters[i] = IRandomBetween('A', 'Z' + 1); 
-         } 
-     } 
-     if (rolling_type != eRT_looping_random) { 
-         /* The (tU8) cast makes sure extended ASCII is positive. */ 
-         let->letters[0] = (tU8)pChar; 
-     } 
-   
-     return 0; 
- } 
-   
- // IDA: void __usercall AddRollingString(char *pStr@<EAX>, int pX@<EDX>, int pY@<EBX>, tRolling_type rolling_type@<ECX>) 
- void AddRollingString(char* pStr, int pX, int pY, tRolling_type rolling_type) { 
-     size_t i; // Pierre-Marie Baty -- fixed type 
-     LOG_TRACE("(\"%s\", %d, %d, %d)", pStr, pX, pY, rolling_type); 
-   
-     for (- i  = 0;-  i  < strlen(- pStr );-  i ++) {
 
-         AddRollingLetter(pStr[i], pX, pY, rolling_type); 
-         pX += gCurrent_graf_data->rolling_letter_x_pitch; 
-     } 
- } 
-   
- // IDA: void __usercall AddRollingNumber(tU32 pNumber@<EAX>, int pWidth@<EDX>, int pX@<EBX>, int pY@<ECX>) 
- void AddRollingNumber(tU32 pNumber, int pWidth, int pX, int pY) { 
-     char the_string[32]; 
-     LOG_TRACE("(%d, %d, %d, %d)", pNumber, pWidth, pX, pY); 
-   
-     sprintf(- the_string ,-  VARLZEROINT ,-  pWidth ,-  pNumber );
 
-     AddRollingString(the_string, pX, pY, eRT_numeric); 
- } 
-   
- // IDA: void __cdecl RollLettersIn() 
- void RollLettersIn(void) { 
-     tU32 new_time; 
-     tU32 period; 
-     tRolling_letter* let; 
-     int i; 
-     int j; 
-     int k; 
-     int offset; 
-     int which_letter; 
-     int font_width; 
-     int letter_offset; 
-     int font_height; 
-     int the_row_bytes; 
-     tU8* char_ptr; 
-     tU8* saved_char_ptr; 
-     tU8* source_ptr; 
-     tU8 the_byte; 
-     LOG_TRACE9("()"); 
-   
-     new_time = PDGetTotalTime(); 
-     if (gLast_roll) { 
-         period = new_time - gLast_roll; 
-     } else { 
-         period = 0; 
-     } 
-     font_height = gFonts[FONT_TYPEABLE].height; 
-     font_width = gFonts[FONT_TYPEABLE].width; 
-     the_row_bytes = gFonts[FONT_TYPEABLE].images->row_bytes; 
-   
-     for (i = 0; i < NBR_ROLLING_LETTERS; i++) { 
-         let = &gRolling_letters[i]; 
-         if (let->number_of_letters >= 0) { 
-             char_ptr = gBack_screen->pixels; 
-             char_ptr += let->y_coord * gBack_screen->row_bytes + let->x_coord; 
-             if (let->current_offset > 0.0f) { 
-                 let->current_offset -= period * 0.18f; 
-                 if (let->current_offset <= 0.0f) { 
-                     if (let->rolling_type == eRT_looping_random || let->rolling_type == eRT_looping_single) { 
-                         let->current_offset = (gCurrent_graf_data->save_slot_letter_height * let->number_of_letters) + let->current_offset; 
-                     } else { 
-                         let->current_offset = 0.0f; 
-                     } 
-                 } 
-             } 
-             for (j = 0; j < gCurrent_graf_data->save_slot_height; j++) { 
-                 offset = gCurrent_graf_data->save_slot_table[j] + let->current_offset; 
-                 which_letter = offset / gCurrent_graf_data->save_slot_letter_height; 
-                 letter_offset = offset % gCurrent_graf_data->save_slot_letter_height - (gCurrent_graf_data->save_slot_letter_height - font_height) / 2; 
-                 saved_char_ptr = char_ptr; 
-                 if (which_letter < let->number_of_letters && which_letter >= 0 && letter_offset >= 0 && letter_offset < font_height) { 
-   
-                     // LOG_DEBUG("chars %d, %d, %d, %d", let->letters[0], let->letters[1], let->letters[2], let->letters[3]); 
-                     source_ptr = (tU8*)gFonts[FONT_TYPEABLE].images->pixels + (font_height * (let->letters[which_letter] - ' ') + letter_offset) * the_row_bytes; 
-                     for (k = 0; k < font_width; k++) { 
-                         the_byte = *source_ptr; 
-                         if (the_byte) { 
-                             *char_ptr = the_byte; 
-                         } 
-                         char_ptr++; 
-                         source_ptr++; 
-                     } 
-                 } 
-                 char_ptr = saved_char_ptr + gBack_screen->row_bytes; 
-             } 
-         } 
-     } 
-     gLast_roll = new_time; 
- } 
-   
- // IDA: int __usercall ChangeCharTo@<EAX>(int pSlot_index@<EAX>, int pChar_index@<EDX>, char pNew_char@<EBX>) 
- int ChangeCharTo(int pSlot_index, int pChar_index, char pNew_char) { 
-     int x_coord; 
-     int y_coord; 
-     int i; 
-     //int j; // Pierre-Marie Baty -- unused variable 
-     tRolling_letter* let; 
-     tRolling_type new_type; 
-     LOG_TRACE("(%d, %d, %d)", pSlot_index, pChar_index, pNew_char); 
-   
-     if (pChar_index >= gVisible_length || pChar_index < 0) { 
-         return -1; 
-     } 
-     y_coord = gLetter_y_coords[pSlot_index]; 
-     x_coord = gCurrent_graf_data->rolling_letter_x_pitch * pChar_index + gLetter_x_coords[pSlot_index]; 
-   
-     if (pNew_char == ROLLING_LETTER_LOOP_RANDOM) { 
-         new_type = eRT_looping_random; 
-     } else if (pNew_char >= '0' && pNew_char <= '9') { 
-         new_type = eRT_numeric; 
-     } else { 
-         new_type = eRT_alpha; 
-     } 
-   
-     for (i = 0; i < NBR_ROLLING_LETTERS; i++) { 
-         let = &gRolling_letters[i]; 
-         if (let->number_of_letters >= 0 && x_coord == let->x_coord && y_coord == let->y_coord) { 
-             break; 
-         } 
-     } 
-     if (i >= NBR_ROLLING_LETTERS) { 
-         return AddRollingLetter(pNew_char, x_coord, y_coord, new_type); 
-     } 
-     if (pNew_char != ROLLING_LETTER_LOOP_RANDOM) { 
-         /* The (tU8) cast makes sure extended ASCII is positive. */ 
-         let->letters[0] = (tU8)pNew_char; 
-     } 
-     if (pNew_char == ' ') { 
-         let->letters[0] = ' '; 
-     } 
-     let->rolling_type = new_type; 
-     let->current_offset = gCurrent_graf_data->save_slot_letter_height * let->number_of_letters; 
-     return i; 
- } 
-   
- // IDA: void __usercall ChangeTextTo(int pXcoord@<EAX>, int pYcoord@<EDX>, char *pNew_str@<EBX>, char *pOld_str@<ECX>) 
- void ChangeTextTo(int pXcoord, int pYcoord, char* pNew_str, char* pOld_str) { 
-     int x_coord; 
-     int i; 
-     int len; 
-     int len2; 
-     int j; 
-     tRolling_letter* let; 
-     tRolling_type new_type; 
-     char new_char; 
-     LOG_TRACE("(%d, %d, \"%s\", \"%s\")", pXcoord, pYcoord, pNew_str, pOld_str); 
-   
- #if defined(DETHRACE_FIX_BUGS) 
-     new_type = eRT_looping_random; 
- #endif 
-   
-     for (i = 0; i < len; i++) { 
-         if (i < len2) { 
-             new_char = pNew_str[i]; 
-         } else { 
-             new_char = ' '; 
-         } 
-         if (new_char == ROLLING_LETTER_LOOP_RANDOM) { 
-             new_type = eRT_looping_random; 
-         } else if (new_char >= '0' && new_char <= '9') { 
-             new_type = eRT_numeric; 
-         } else { 
-             new_type = eRT_alpha; 
-         } 
-         x_coord = gCurrent_graf_data->rolling_letter_x_pitch * i + pXcoord; 
-         for (j = 0, let = gRolling_letters; j < NBR_ROLLING_LETTERS; j++, let++) { 
-             if (let->number_of_letters >= 0 && let->x_coord == x_coord && let->y_coord == pYcoord) { 
-                 if (new_char != ROLLING_LETTER_LOOP_RANDOM) { 
-                     let->letters[0] = new_char; 
-                 } 
-                 if (new_char == ' ') { 
-                     let->letters[0] = ' '; 
-                 } 
-                 let->current_offset = let->number_of_letters * gCurrent_graf_data->save_slot_letter_height; 
-                 let->rolling_type = new_type; 
-             } 
-         } 
-     } 
-     for (i = len; i < len2; i++) { 
-         AddRollingLetter(pNew_str[i], gCurrent_graf_data->rolling_letter_x_pitch * i + pXcoord, pYcoord, new_type); 
-     } 
- } 
-   
- // IDA: void __usercall SetRollingCursor(int pSlot_index@<EAX>) 
- void SetRollingCursor(int pSlot_index) { 
-     LOG_TRACE("(%d)", pSlot_index); 
-   
-     gCurrent_cursor = ChangeCharTo(pSlot_index, gCurrent_position, ROLLING_LETTER_LOOP_RANDOM); 
- } 
-   
- // IDA: void __usercall BlankSlot(int pIndex@<EAX>, int pName_length@<EDX>, int pVisible_length@<EBX>) 
- void BlankSlot(int pIndex, int pName_length, int pVisible_length) { 
-     int i; 
-     LOG_TRACE("(%d, %d, %d)", pIndex, pName_length, pVisible_length); 
-   
-     gVisible_length = pVisible_length; 
-     for (i = 0; i < pName_length; i++) { 
-         ChangeCharTo(pIndex, i, ' '); 
-     } 
- } 
-   
- // IDA: void __usercall DoRLBackspace(int pSlot_index@<EAX>) 
- void DoRLBackspace(int pSlot_index) { 
-     int i; 
-     int new_len; 
-     LOG_TRACE("(%d)", pSlot_index); 
-   
-     if (gCurrent_position != 0) { 
-         if (strlen(- gCurrent_typing ) ==-  gCurrent_position ) {
 
-             new_len  = strlen(- gCurrent_typing );
-         } else { 
-             new_len  = strlen(- gCurrent_typing ) - 1;
-         } 
-         ChangeCharTo(pSlot_index, new_len, ' '); 
-         new_len  = strlen(- gCurrent_typing ) - 1;
-         for (i = gCurrent_position - 1; i < new_len; i++) { 
-             ChangeCharTo(pSlot_index, i, gCurrent_typing[i]); 
-             gCurrent_typing[i] = gCurrent_typing[i + 1]; 
-         } 
-         gCurrent_typing[new_len] = 0; 
-         gCurrent_position = gCurrent_position - 1; 
-         SetRollingCursor(pSlot_index); 
-     } 
- } 
-   
- // IDA: void __usercall DoRLDelete(int pSlot_index@<EAX>) 
- void DoRLDelete(int pSlot_index) { 
-     int i; 
-     int new_len; 
-     LOG_TRACE("(%d)", pSlot_index); 
-   
-     if (- gCurrent_position  <= ((int)strlen(- gCurrent_typing ) - 1)) {
 
-         new_len  = strlen(- gCurrent_typing ) - 1;
-         ChangeCharTo(pSlot_index, new_len, ' '); 
-         for (i = gCurrent_position; i < new_len; i++) { 
-             gCurrent_typing[i] = gCurrent_typing[i + 1]; 
-             ChangeCharTo(pSlot_index, i, gCurrent_typing[i]); 
-         } 
-         gCurrent_typing[new_len] = '\0'; 
-         SetRollingCursor(pSlot_index); 
-     } 
- } 
-   
- // IDA: void __usercall DoRLInsert(int pSlot_index@<EAX>) 
- void DoRLInsert(int pSlot_index) { 
-     LOG_TRACE("(%d)", pSlot_index); 
-   
-     gInsert_mode = !gInsert_mode; 
- } 
-   
- // IDA: void __usercall DoRLCursorLeft(int pSlot_index@<EAX>) 
- void DoRLCursorLeft(int pSlot_index) { 
-     LOG_TRACE("(%d)", pSlot_index); 
-     if (gCurrent_position != 0) { 
-         if (strlen(- gCurrent_typing ) ==-  gCurrent_position ) {
 
-             ChangeCharTo (- pSlot_index , strlen(- gCurrent_typing ), ' ');
-         } else { 
-             ChangeCharTo(pSlot_index, gCurrent_position, gCurrent_typing[gCurrent_position]); 
-         } 
-   
-         gCurrent_position--; 
-         SetRollingCursor(pSlot_index); 
-     } 
- } 
-   
- // IDA: void __usercall DoRLCursorRight(int pSlot_index@<EAX>) 
- void DoRLCursorRight(int pSlot_index) { 
-     LOG_TRACE("(%d)", pSlot_index); 
-   
-     if (- gCurrent_position  < (int) strlen(- gCurrent_typing )) { // Pierre-Marie Baty -- added type cast
 
-         ChangeCharTo(pSlot_index, gCurrent_position, gCurrent_typing[gCurrent_position]); 
-         gCurrent_position++; 
-         SetRollingCursor(pSlot_index); 
-     } 
- } 
-   
- // IDA: void __usercall DoRLTypeLetter(int pChar@<EAX>, int pSlot_index@<EDX>) 
- void DoRLTypeLetter(int pChar, int pSlot_index) { 
-     int i; 
-     int new_len; 
-     LOG_TRACE("(%d, %d)", pChar, pSlot_index); 
-   
-     // v2 = pSlot_index; 
-     if (pChar >= 32) { 
-         if (gInsert_mode) { 
-             new_len  = strlen(- gCurrent_typing ) + 1;
-             if (new_len > 100) { 
-                 new_len = 100; 
-                 DoErrorInterface(kMiscString_FIXED_THAT_YOU_TWISTED_BASTARD); 
-             } 
-             for (i = new_len - 1; i > gCurrent_position; i--) { 
-                 gCurrent_typing[i] = gCurrent_typing[i - 1]; 
-                 ChangeCharTo(pSlot_index, i, gCurrent_typing[i]); 
-             } 
-         } else if (strlen(- gCurrent_typing ) ==-  gCurrent_position ) {
 
-             new_len  = strlen(- gCurrent_typing ) + 1;
-         } else { 
-             new_len  = strlen(- gCurrent_typing );
-         } 
-         if (new_len > 100) { 
-             new_len = 100; 
-             DoErrorInterface(kMiscString_FIXED_THAT_YOU_TWISTED_BASTARD); 
-         } 
-   
-         gCurrent_typing[new_len] = 0; 
-         if (new_len - 1 < gCurrent_position) { 
-             gCurrent_position = new_len - 1; 
-         } 
-         gCurrent_typing[gCurrent_position] = pChar; 
-         ChangeCharTo(pSlot_index, gCurrent_position, pChar); 
-         gCurrent_position++; 
-         SetRollingCursor(pSlot_index); 
-     } 
- } 
-   
- // IDA: void __usercall StopTyping(int pSlot_index@<EAX>) 
- void StopTyping(int pSlot_index) { 
-     int i; 
-     LOG_TRACE("(%d)", pSlot_index); 
-   
-     for (i = 0; i < gThe_length; i++) { 
-         if (- i  < ((int) strlen(- gCurrent_typing ) - 1)) { // Pierre-Marie Baty -- added type cast
 
-             ChangeCharTo(pSlot_index, i, gCurrent_typing[i]); 
-         } else { 
-             ChangeCharTo(pSlot_index, i, ' '); 
-         } 
-     } 
- } 
-   
- // IDA: void __usercall RevertTyping(int pSlot_index@<EAX>, char *pRevert_str@<EDX>) 
- void RevertTyping(int pSlot_index, char* pRevert_str) { 
-     int i; 
-     LOG_TRACE("(%d, \"%s\")", pSlot_index, pRevert_str); 
-   
-     for (i = 0; i < gThe_length; i++) { 
-         ChangeCharTo (- pSlot_index ,-  i ,-  i  >= (int) strlen(- pRevert_str ) ? ' ' :-  pRevert_str [- i ]); // Pierre-Marie Baty -- added type cast
-     } 
- } 
-   
- // IDA: void __usercall StartTyping(int pSlot_index@<EAX>, char *pText@<EDX>, int pVisible_length@<EBX>) 
- void StartTyping(int pSlot_index, char* pText, int pVisible_length) { 
-     LOG_TRACE("(%d, \"%s\", %d)", pSlot_index, pText, pVisible_length); 
-   
-     gThe_length = pVisible_length; 
-     strcpy(- gCurrent_typing ,-  pText );
 
-     gVisible_length = pVisible_length; 
-     gCurrent_position  = strlen(- gCurrent_typing );
-     SetRollingCursor(pSlot_index); 
- } 
-   
- // IDA: void __usercall TypeKey(int pSlot_index@<EAX>, char pKey@<EDX>) 
- void TypeKey(int pSlot_index, char pKey) { 
-     LOG_TRACE("(%d, %d)", pSlot_index, pKey); 
-   
-     switch (pKey) { 
-     case KEY_GRAVE: 
-         break; 
-     case KEY_BACKSPACE: 
-         DoRLBackspace(pSlot_index); 
-         break; 
-     case KEY_INSERT: 
-         DoRLInsert(pSlot_index); 
-         break; 
-     case KEY_DELETE: 
-         DoRLDelete(pSlot_index); 
-         break; 
-     case KEY_LEFT: 
-         DoRLCursorLeft(pSlot_index); 
-         break; 
-     case KEY_RIGHT: 
-         DoRLCursorRight(pSlot_index); 
-         break; 
-     default: 
-         DoRLTypeLetter(PDGetASCIIFromKey(pKey), pSlot_index); 
-         break; 
-     } 
- } 
-   
- // IDA: void __usercall SetSlotXY(int pSlot_index@<EAX>, int pX_coord@<EDX>, int pY_coord@<EBX>) 
- void SetSlotXY(int pSlot_index, int pX_coord, int pY_coord) { 
-     LOG_TRACE("(%d, %d, %d)", pSlot_index, pX_coord, pY_coord); 
-   
-     gLetter_x_coords[pSlot_index] = pX_coord; 
-     gLetter_y_coords[pSlot_index] = pY_coord; 
- } 
-   
- // IDA: void __usercall GetTypedName(char *pDestn@<EAX>, int pMax_length@<EDX>) 
- void GetTypedName(char* pDestn, int pMax_length) { 
-     LOG_TRACE("(\"%s\", %d)", pDestn, pMax_length); 
-   
-     if ((int) strlen(- gCurrent_typing ) <=-  pMax_length ) { // Pierre-Marie Baty -- added type cast
 
-         strcpy(- pDestn ,-  gCurrent_typing );
 
-     } else { 
-         memcpy(- pDestn ,-  gCurrent_typing ,-  pMax_length );
 
-         pDestn[pMax_length] = 0; 
-     } 
- } 
-   
- // IDA: void __usercall KillCursor(int pSlot_index@<EAX>) 
- void KillCursor(int pSlot_index) { 
-     int x_coord; 
-     int y_coord; 
-     int i; 
-     //int j; // Pierre-Marie Baty -- unused variable 
-     tRolling_letter* let; 
-     //tRolling_type new_type; // Pierre-Marie Baty -- unused variable 
-     LOG_TRACE("(%d)", pSlot_index); 
-   
-     if (gCurrent_position < gVisible_length && gCurrent_position >= 0) { 
-         y_coord = gLetter_y_coords[pSlot_index]; 
-         x_coord = gCurrent_graf_data->rolling_letter_x_pitch * gCurrent_position + gLetter_x_coords[pSlot_index]; 
-         for (i = 0; i < NBR_ROLLING_LETTERS; i++) { 
-             let = &gRolling_letters[i]; 
-             if (let->number_of_letters >= 0 && x_coord == let->x_coord && y_coord == let->y_coord) { 
-                 gRolling_letters[i].number_of_letters = -1; 
-                 break; 
-             } 
-         } 
-     } 
- } 
-   
- // IDA: void __cdecl EdgeTriggerModeOn() 
- void EdgeTriggerModeOn(void) { 
-     gEdge_trigger_mode = 1; 
- } 
-   
- // IDA: void __cdecl EdgeTriggerModeOff() 
- void EdgeTriggerModeOff(void) { 
-     gEdge_trigger_mode = 0; 
- } 
-