From d34e2db9e1f09d9fcbef8608c71dc44fca4679eb Mon Sep 17 00:00:00 2001 From: anyc Date: Mon, 19 May 2014 22:53:14 +0200 Subject: [PATCH] added GCC/MinGW-compatible assembler --- src/addresses.h | 106 ++++++++++ src/game.c | 30 +++ src/rct2.c | 8 + src/scenario.c | 27 +++ src/window.c | 11 + src/window_about.c | 10 + src/window_banner.c | 35 +++ src/window_cheats.c | 39 ++++ src/window_clear_scenery.c | 25 +++ src/window_dropdown.c | 10 + src/window_footpath.c | 140 ++++++++++++ src/window_game_bottom_toolbar.c | 59 +++++- src/window_game_top_toolbar.c | 50 +++++ src/window_guest_list.c | 105 +++++++++ src/window_land.c | 55 +++++ src/window_main.c | 19 ++ src/window_map.c | 24 +++ src/window_news.c | 50 +++++ src/window_options.c | 78 ++++++- src/window_park.c | 340 ++++++++++++++++++++++++++++++ src/window_ride_list.c | 105 +++++++++ src/window_save_prompt.c | 20 ++ src/window_title_exit.c | 20 ++ src/window_title_logo.c | 10 + src/window_title_menu.c | 40 ++++ src/window_title_scenarioselect.c | 90 ++++++++ src/window_tooltip.c | 10 + src/window_water.c | 25 +++ 28 files changed, 1536 insertions(+), 5 deletions(-) diff --git a/src/addresses.h b/src/addresses.h index 35e796eb9c..dce526ea9a 100644 --- a/src/addresses.h +++ b/src/addresses.h @@ -286,13 +286,22 @@ static void RCT2_CALLPROC_EBPSAFE(int address) { + #ifdef _MSC_VER __asm push ebp __asm call address __asm pop ebp + #else + __asm__ ( "\ + push ebp \n\ + call %[address] \n\ + pop ebp \n\ + " : [address] "+m" (address) ); + #endif } static void RCT2_CALLPROC_X(int address, int _eax, int _ebx, int _ecx, int _edx, int _esi, int _edi, int _ebp) { + #ifdef _MSC_VER __asm { push address mov eax, _eax @@ -305,10 +314,33 @@ static void RCT2_CALLPROC_X(int address, int _eax, int _ebx, int _ecx, int _edx, call [esp] add esp, 4 } + #else + __asm__ ( "\ + \n\ + push ebx \n\ + push ebp \n\ + push %[address] \n\ + mov eax, %[_eax] \n\ + mov ebx, %[_ebx] \n\ + mov ecx, %[_ecx] \n\ + mov edx, %[_edx] \n\ + mov esi, %[_esi] \n\ + mov edi, %[_edi] \n\ + mov ebp, %[_ebp] \n\ + call [esp] \n\ + add esp, 4 \n\ + pop ebp \n\ + pop ebx \n\ + " : [address] "+m" (address), [_eax] "+m" (_eax), [_ebx] "+m" (_ebx), [_ecx] "+m" (_ecx), [_edx] "+m" (_edx), [_esi] "+m" (_esi), [_edi] "+m" (_edi), [_ebp] "+m" (_ebp) + : + : "eax","ecx","edx","esi","edi" + ); + #endif } static void RCT2_CALLFUNC_X(int address, int *_eax, int *_ebx, int *_ecx, int *_edx, int *_esi, int *_edi, int *_ebp) { + #ifdef _MSC_VER __asm { // Store C's base pointer push ebp @@ -375,6 +407,80 @@ static void RCT2_CALLFUNC_X(int address, int *_eax, int *_ebx, int *_ecx, int *_ add esp, 4 } + #else + __asm__ ( "\ + \n\ + /* Store C's base pointer*/ \n\ + push ebx \n\ + push ebp \n\ + \n\ + /* Store %[address] to call*/ \n\ + push %[address] \n\ + \n\ + /* Set all registers to the input values*/ \n\ + mov eax, [%[_eax]] \n\ + mov eax, [eax] \n\ + mov ebx, [%[_ebx]] \n\ + mov ebx, [ebx] \n\ + mov ecx, [%[_ecx]] \n\ + mov ecx, [ecx] \n\ + mov edx, [%[_edx]] \n\ + mov edx, [edx] \n\ + mov esi, [%[_esi]] \n\ + mov esi, [esi] \n\ + mov edi, [%[_edi]] \n\ + mov edi, [edi] \n\ + mov ebp, [%[_ebp]] \n\ + mov ebp, [ebp] \n\ + \n\ + /* Call function*/ \n\ + call [esp] \n\ + add esp, 4 \n\ + \n\ + /* Store output eax*/ \n\ + push eax \n\ + \n\ + /* Put original C base pointer into eax*/ \n\ + mov eax, [esp+4] \n\ + \n\ + /* Store output ebp*/ \n\ + push ebp \n\ + \n\ + /* Set ebp to the original C base pointer*/ \n\ + mov ebp, eax \n\ + \n\ + /* Put output ebp into ebp parameter*/ \n\ + mov eax, [esp] \n\ + push ebx \n\ + mov ebx, [%[_ebp]] \n\ + mov [ebx], eax \n\ + pop ebx \n\ + add esp, 4 \n\ + \n\ + /* Get resulting ebx, ecx, edx, esi, edi registers*/ \n\ + mov eax, [%[_edi]] \n\ + mov [eax], edi \n\ + mov eax, [%[_esi]] \n\ + mov [eax], esi \n\ + mov eax, [%[_edx]] \n\ + mov [eax], edx \n\ + mov eax, [%[_ecx]] \n\ + mov [eax], ecx \n\ + mov eax, [%[_ebx]] \n\ + mov [eax], ebx \n\ + pop eax \n\ + \n\ + /* Get resulting eax register*/ \n\ + mov ebx, [%[_eax]] \n\ + mov [ebx], eax \n\ + \n\ + add esp, 4 \n\ + pop ebx \n\ + " : [address] "+m" (address), [_eax] "+m" (_eax), [_ebx] "+m" (_ebx), [_ecx] "+m" (_ecx), [_edx] "+m" (_edx), [_esi] "+m" (_esi), [_edi] "+m" (_edi), [_ebp] "+m" (_ebp) + : + : "eax","ecx","edx","esi","edi" + ); + #endif } #endif diff --git a/src/game.c b/src/game.c index 9f779df8dd..945d1f7dc9 100644 --- a/src/game.c +++ b/src/game.c @@ -1310,7 +1310,12 @@ static void game_pause_toggle() { char input_bl; + #ifdef _MSC_VER __asm mov input_bl, bl + #else + __asm__ ( "mov %[input_bl], bl " : [input_bl] "+m" (input_bl) ); + #endif + if (input_bl & 1) { RCT2_GLOBAL(0x009DEA6E, uint32) ^= 1; @@ -1321,7 +1326,12 @@ static void game_pause_toggle() unpause_sounds(); } + #ifdef _MSC_VER __asm mov ebx, 0 + #else + __asm__ ( "mov ebx, 0 " ); + #endif + } /** @@ -1333,9 +1343,24 @@ static void game_load_or_quit() char input_bl, input_dl; short input_di; + #ifdef _MSC_VER __asm mov input_bl, bl + #else + __asm__ ( "mov %[input_bl], bl " : [input_bl] "+m" (input_bl) ); + #endif + + #ifdef _MSC_VER __asm mov input_dl, dl + #else + __asm__ ( "mov %[input_dl], dl " : [input_dl] "+m" (input_dl) ); + #endif + + #ifdef _MSC_VER __asm mov input_di, di + #else + __asm__ ( "mov %[input_di], di " : [input_di] "+m" (input_di) ); + #endif + if (!(input_bl & 1)) return; // 0; @@ -1353,7 +1378,12 @@ static void game_load_or_quit() break; } + #ifdef _MSC_VER __asm mov ebx, 0 + #else + __asm__ ( "mov ebx, 0 " ); + #endif + } /** diff --git a/src/rct2.c b/src/rct2.c index 77a58473d6..e3ac83c096 100644 --- a/src/rct2.c +++ b/src/rct2.c @@ -189,10 +189,18 @@ void rct2_update() { // Set 0x009DE564 to the value of esp // RCT2 sets the stack pointer to the value of this address when ending the current game tick from anywhere + #ifdef _MSC_VER __asm { mov eax, 009DE564h mov [eax], esp } + #else + __asm__ ( "\ + \n\ + mov eax, 0x009DE564 \n\ + mov [eax], esp \n\ + " : : : "eax" ); + #endif if (!setjmp(_end_update_jump)) rct2_update_2(); diff --git a/src/scenario.c b/src/scenario.c index 2cd9b9b2b8..895e83aa59 100644 --- a/src/scenario.c +++ b/src/scenario.c @@ -282,6 +282,7 @@ static int scenario_load_basic(char *path) CloseHandle(hFile); RCT2_GLOBAL(0x009AA00C, uint8) = 0; if (s6Info->flags != 255) { + #ifdef _MSC_VER __asm { push ebp mov ebp, 0141F6F8h @@ -291,14 +292,34 @@ static int scenario_load_basic(char *path) mov _eax, eax jb loc_67628F } + #else + __asm__ ( "\ + push ebp \n\ + mov ebp, 0x0141F6F8 \n\ + mov eax, 0x006A9428 \n\ + call eax \n\ + pop ebp \n\ + mov %[_eax], eax \n\ + jb loc_67628F \n\ + " : [_eax] "+m" (_eax) : : "eax" ); + #endif int ebp = RCT2_GLOBAL(0x009ADAF8, uint32); format_string(s6Info->name, RCT2_GLOBAL(ebp, sint16), NULL); format_string(s6Info->details, RCT2_GLOBAL(ebp + 4, sint16), NULL); RCT2_GLOBAL(0x009AA00C, uint8) = RCT2_GLOBAL(ebp + 6, uint8); RCT2_CALLPROC(0x006A982D); + #ifdef _MSC_VER __asm mov _eax, eax + #else + __asm__ ( "mov %[_eax], eax " : [_eax] "+m" (_eax) ); + #endif + + #ifdef _MSC_VER loc_67628F : + #else + __asm__ ( "loc_67628F :"); + #endif return _eax; } return 1; @@ -879,8 +900,14 @@ void scenario_update() for (int i = 0; i < 100; ++i) { int carry; RCT2_CALLPROC_EBPSAFE(0x006744A9); // clears carry flag on failure -.- + #ifdef _MSC_VER __asm mov carry, 0; __asm adc carry, 0; + #else + __asm__ ( "mov %[carry], 0; " : [carry] "+m" (carry) ); + __asm__ ( "adc %[carry], 0; " : [carry] "+m" (carry) ); + #endif + if (!carry) break; } diff --git a/src/window.c b/src/window.c index 82483ecdd1..01333e8809 100644 --- a/src/window.c +++ b/src/window.c @@ -102,6 +102,7 @@ rct_widget *window_get_scroll_widget(rct_window *w, int scrollIndex) } static void RCT2_CALLPROC_WE_UPDATE(int address, rct_window* w) { + #ifdef _MSC_VER __asm { push address push w @@ -109,6 +110,16 @@ static void RCT2_CALLPROC_WE_UPDATE(int address, rct_window* w) call[esp + 4] add esp, 8 } + #else + __asm__ ( "\ + push %[address]\n\ + mov eax, %[w] \n\ + push eax \n\ + mov esi, %[w] \n\ + call [esp+4] \n\ + add esp, 8 \n\ + " : [address] "+m" (address), [w] "+m" (w) : : "eax", "esi" ); + #endif } /** * diff --git a/src/window_about.c b/src/window_about.c index a6d3848103..d659b7c5f0 100644 --- a/src/window_about.c +++ b/src/window_about.c @@ -117,8 +117,13 @@ static void window_about_mouseup() short widgetIndex; rct_window *w; + #ifdef _MSC_VER __asm mov widgetIndex, dx __asm mov w, esi + #else + __asm__ ( "mov %[widgetIndex], dx " : [widgetIndex] "+m" (widgetIndex) ); + __asm__ ( "mov %[w], esi " : [w] "+m" (w) ); + #endif switch (widgetIndex) { case WIDX_CLOSE: @@ -143,8 +148,13 @@ static void window_about_paint() rct_window *w; rct_drawpixelinfo *dpi; + #ifdef _MSC_VER __asm mov w, esi __asm mov dpi, edi + #else + __asm__ ( "mov %[w], esi " : [w] "+m" (w) ); + __asm__ ( "mov %[dpi], edi " : [dpi] "+m" (dpi) ); + #endif window_draw_widgets(w, dpi); diff --git a/src/window_banner.c b/src/window_banner.c index 990c4bfe43..10564eb994 100644 --- a/src/window_banner.c +++ b/src/window_banner.c @@ -153,8 +153,18 @@ static void window_banner_mouseup() short widgetIndex; rct_window *w; + #ifdef _MSC_VER __asm mov widgetIndex, dx + #else + __asm__ ( "mov %[widgetIndex], dx " : [widgetIndex] "+m" (widgetIndex) ); + #endif + + #ifdef _MSC_VER __asm mov w, esi + #else + __asm__ ( "mov %[w], esi " : [w] "+m" (w) ); + #endif + switch (widgetIndex) { case WIDX_CLOSE: @@ -176,7 +186,12 @@ static void window_banner_mousedown() { short widgetIndex; + #ifdef _MSC_VER __asm mov widgetIndex, dx + #else + __asm__ ( "mov %[widgetIndex], dx " : [widgetIndex] "+m" (widgetIndex) ); + #endif + switch (widgetIndex) { case WIDX_MAIN_COLOR: @@ -192,7 +207,12 @@ static void window_banner_dropdown() { short widgetIndex; + #ifdef _MSC_VER __asm mov widgetIndex, dx; + #else + __asm__ ( "mov %[widgetIndex], dx; " : [widgetIndex] "+m" (widgetIndex) ); + #endif + if (widgetIndex == WIDX_MAIN_COLOR) RCT2_CALLPROC_EBPSAFE(0x006BA548); @@ -204,7 +224,12 @@ static void window_banner_textinput() { short widgetIndex; + #ifdef _MSC_VER __asm mov widgetIndex, dx; + #else + __asm__ ( "mov %[widgetIndex], dx; " : [widgetIndex] "+m" (widgetIndex) ); + #endif + if (widgetIndex == WIDX_BANNER_TEXT) { RCT2_CALLPROC_EBPSAFE(0x006BA6D8); @@ -221,8 +246,18 @@ static void window_banner_paint() rct_window *w; rct_drawpixelinfo *dpi; + #ifdef _MSC_VER __asm mov w, esi + #else + __asm__ ( "mov %[w], esi " : [w] "+m" (w) ); + #endif + + #ifdef _MSC_VER __asm mov dpi, edi + #else + __asm__ ( "mov %[dpi], edi " : [dpi] "+m" (dpi) ); + #endif + window_draw_widgets(w, dpi); diff --git a/src/window_cheats.c b/src/window_cheats.c index 52c3d7c74f..7974617fbb 100644 --- a/src/window_cheats.c +++ b/src/window_cheats.c @@ -183,8 +183,18 @@ static void window_cheats_money_mouseup() short widgetIndex; rct_window *w; + #ifdef _MSC_VER __asm mov widgetIndex, dx + #else + __asm__ ( "mov %[widgetIndex], dx " : [widgetIndex] "+m" (widgetIndex) ); + #endif + + #ifdef _MSC_VER __asm mov w, esi + #else + __asm__ ( "mov %[w], esi " : [w] "+m" (w) ); + #endif + switch (widgetIndex) { case WIDX_CLOSE: @@ -214,8 +224,18 @@ static void window_cheats_guests_mouseup() short widgetIndex; rct_window *w; + #ifdef _MSC_VER __asm mov widgetIndex, dx + #else + __asm__ ( "mov %[widgetIndex], dx " : [widgetIndex] "+m" (widgetIndex) ); + #endif + + #ifdef _MSC_VER __asm mov w, esi + #else + __asm__ ( "mov %[w], esi " : [w] "+m" (w) ); + #endif + rct_peep* peep; uint16 sprite_idx; @@ -245,7 +265,11 @@ static void window_cheats_update(rct_window *w) { rct_window *w2; + #ifdef _MSC_VER __asm mov w2, esi + #else + __asm__ ( "mov %[w2], esi " : [w2] "+m" (w2) ); + #endif w->var_48E++; widget_invalidate(w->classification, w->number, WIDX_TAB_1+w->page); @@ -256,7 +280,12 @@ static void window_cheats_invalidate() int i; rct_window *w; + #ifdef _MSC_VER __asm mov w, esi + #else + __asm__ ( "mov %[w], esi " : [w] "+m" (w) ); + #endif + strcpy((char*)0x009BC677, "Cheats"); rct_widget *widgets = window_cheats_page_widgets[w->page]; @@ -276,8 +305,18 @@ static void window_cheats_paint() rct_window *w; rct_drawpixelinfo *dpi; + #ifdef _MSC_VER __asm mov w, esi + #else + __asm__ ( "mov %[w], esi " : [w] "+m" (w) ); + #endif + + #ifdef _MSC_VER __asm mov dpi, edi + #else + __asm__ ( "mov %[dpi], edi " : [dpi] "+m" (dpi) ); + #endif + window_draw_widgets(w, dpi); window_cheats_draw_tab_images(dpi, w); diff --git a/src/window_clear_scenery.c b/src/window_clear_scenery.c index f4674fefa4..957139683d 100644 --- a/src/window_clear_scenery.c +++ b/src/window_clear_scenery.c @@ -129,8 +129,18 @@ static void window_clear_scenery_mouseup() int limit; short widgetIndex; + #ifdef _MSC_VER __asm mov widgetIndex, dx + #else + __asm__ ( "mov %[widgetIndex], dx " : [widgetIndex] "+m" (widgetIndex) ); + #endif + + #ifdef _MSC_VER __asm mov w, esi + #else + __asm__ ( "mov %[w], esi " : [w] "+m" (w) ); + #endif + switch (widgetIndex) { case WIDX_CLOSE: @@ -183,7 +193,12 @@ static void window_clear_scenery_invalidate() { rct_window *w; + #ifdef _MSC_VER __asm mov w, esi + #else + __asm__ ( "mov %[w], esi " : [w] "+m" (w) ); + #endif + // Set the preview image button to be pressed down w->pressed_widgets |= (1 << WIDX_PREVIEW); @@ -202,8 +217,18 @@ static void window_clear_scenery_paint() rct_drawpixelinfo *dpi; int x, y; + #ifdef _MSC_VER __asm mov w, esi + #else + __asm__ ( "mov %[w], esi " : [w] "+m" (w) ); + #endif + + #ifdef _MSC_VER __asm mov dpi, edi + #else + __asm__ ( "mov %[dpi], edi " : [dpi] "+m" (dpi) ); + #endif + window_draw_widgets(w, dpi); diff --git a/src/window_dropdown.c b/src/window_dropdown.c index 03fe290e42..59bd42a92a 100644 --- a/src/window_dropdown.c +++ b/src/window_dropdown.c @@ -269,8 +269,18 @@ static void window_dropdown_paint() rct_window *w; rct_drawpixelinfo *dpi; + #ifdef _MSC_VER __asm mov w, esi + #else + __asm__ ( "mov %[w], esi " : [w] "+m" (w) ); + #endif + + #ifdef _MSC_VER __asm mov dpi, edi + #else + __asm__ ( "mov %[dpi], edi " : [dpi] "+m" (dpi) ); + #endif + window_draw_widgets(w, dpi); diff --git a/src/window_footpath.c b/src/window_footpath.c index f68e44c6c3..ec2e3ac941 100644 --- a/src/window_footpath.c +++ b/src/window_footpath.c @@ -223,7 +223,12 @@ static void window_footpath_close() { rct_window *w; + #ifdef _MSC_VER __asm mov w, esi + #else + __asm__ ( "mov %[w], esi " : [w] "+m" (w) ); + #endif + RCT2_CALLPROC_EBPSAFE(0x006A7831); RCT2_CALLPROC_X(0x006CB70A, 0, 0, 0, 0, 0, 0, 0); @@ -242,8 +247,18 @@ static void window_footpath_mouseup() short widgetIndex; rct_window *w; + #ifdef _MSC_VER __asm mov widgetIndex, dx + #else + __asm__ ( "mov %[widgetIndex], dx " : [widgetIndex] "+m" (widgetIndex) ); + #endif + + #ifdef _MSC_VER __asm mov w, esi + #else + __asm__ ( "mov %[w], esi " : [w] "+m" (w) ); + #endif + switch (widgetIndex) { case WIDX_CLOSE: @@ -298,9 +313,24 @@ static void window_footpath_mousedown() rct_window *w; rct_widget *widget; + #ifdef _MSC_VER __asm mov widgetIndex, dx + #else + __asm__ ( "mov %[widgetIndex], dx " : [widgetIndex] "+m" (widgetIndex) ); + #endif + + #ifdef _MSC_VER __asm mov w, esi + #else + __asm__ ( "mov %[w], esi " : [w] "+m" (w) ); + #endif + + #ifdef _MSC_VER __asm mov widget, edi + #else + __asm__ ( "mov %[widget], edi " : [widget] "+m" (widget) ); + #endif + switch (widgetIndex) { case WIDX_FOOTPATH_TYPE: @@ -345,9 +375,24 @@ static void window_footpath_dropdown() rct_window *w; rct_path_type *pathType; + #ifdef _MSC_VER __asm mov dropdownIndex, ax + #else + __asm__ ( "mov %[dropdownIndex], ax " : [dropdownIndex] "+m" (dropdownIndex) ); + #endif + + #ifdef _MSC_VER __asm mov widgetIndex, dx + #else + __asm__ ( "mov %[widgetIndex], dx " : [widgetIndex] "+m" (widgetIndex) ); + #endif + + #ifdef _MSC_VER __asm mov w, esi + #else + __asm__ ( "mov %[w], esi " : [w] "+m" (w) ); + #endif + if (widgetIndex == WIDX_FOOTPATH_TYPE) RCT2_GLOBAL(RCT2_ADDRESS_SELECTED_PATH_TYPE, uint8) = SELECTED_PATH_TYPE_NORMAL; @@ -397,10 +442,30 @@ static void window_footpath_toolupdate() short widgetIndex; rct_window *w; + #ifdef _MSC_VER __asm mov x, eax + #else + __asm__ ( "mov %[x], eax " : [x] "+m" (x) ); + #endif + + #ifdef _MSC_VER __asm mov y, ebx + #else + __asm__ ( "mov %[y], ebx " : [y] "+m" (y) ); + #endif + + #ifdef _MSC_VER __asm mov widgetIndex, dx + #else + __asm__ ( "mov %[widgetIndex], dx " : [widgetIndex] "+m" (widgetIndex) ); + #endif + + #ifdef _MSC_VER __asm mov w, esi + #else + __asm__ ( "mov %[w], esi " : [w] "+m" (w) ); + #endif + if (widgetIndex == WIDX_CONSTRUCT_ON_LAND) { window_footpath_set_provisional_path_at_point(x, y); @@ -419,10 +484,30 @@ static void window_footpath_tooldown() short widgetIndex; rct_window *w; + #ifdef _MSC_VER __asm mov x, eax + #else + __asm__ ( "mov %[x], eax " : [x] "+m" (x) ); + #endif + + #ifdef _MSC_VER __asm mov y, ebx + #else + __asm__ ( "mov %[y], ebx " : [y] "+m" (y) ); + #endif + + #ifdef _MSC_VER __asm mov widgetIndex, dx + #else + __asm__ ( "mov %[widgetIndex], dx " : [widgetIndex] "+m" (widgetIndex) ); + #endif + + #ifdef _MSC_VER __asm mov w, esi + #else + __asm__ ( "mov %[w], esi " : [w] "+m" (w) ); + #endif + if (widgetIndex == WIDX_CONSTRUCT_ON_LAND) { window_footpath_place_path_at_point(x, y); @@ -441,10 +526,30 @@ static void window_footpath_tooldrag() short widgetIndex; rct_window *w; + #ifdef _MSC_VER __asm mov x, eax + #else + __asm__ ( "mov %[x], eax " : [x] "+m" (x) ); + #endif + + #ifdef _MSC_VER __asm mov y, ebx + #else + __asm__ ( "mov %[y], ebx " : [y] "+m" (y) ); + #endif + + #ifdef _MSC_VER __asm mov widgetIndex, dx + #else + __asm__ ( "mov %[widgetIndex], dx " : [widgetIndex] "+m" (widgetIndex) ); + #endif + + #ifdef _MSC_VER __asm mov w, esi + #else + __asm__ ( "mov %[w], esi " : [w] "+m" (w) ); + #endif + if (widgetIndex == WIDX_CONSTRUCT_ON_LAND) { RCT2_CALLPROC_X(0x006A82C5, x, y, 0, 0, (int)w, 0, 0); @@ -461,10 +566,30 @@ static void window_footpath_toolup() short widgetIndex; rct_window *w; + #ifdef _MSC_VER __asm mov x, eax + #else + __asm__ ( "mov %[x], eax " : [x] "+m" (x) ); + #endif + + #ifdef _MSC_VER __asm mov y, ebx + #else + __asm__ ( "mov %[y], ebx " : [y] "+m" (y) ); + #endif + + #ifdef _MSC_VER __asm mov widgetIndex, dx + #else + __asm__ ( "mov %[widgetIndex], dx " : [widgetIndex] "+m" (widgetIndex) ); + #endif + + #ifdef _MSC_VER __asm mov w, esi + #else + __asm__ ( "mov %[w], esi " : [w] "+m" (w) ); + #endif + if (widgetIndex == WIDX_CONSTRUCT_ON_LAND) { RCT2_CALLPROC_X(0x006A8380, x, y, 0, 0, (int)w, 0, 0); @@ -510,7 +635,12 @@ static void window_footpath_invalidate() rct_path_type *pathType; rct_window *w; + #ifdef _MSC_VER __asm mov w, esi + #else + __asm__ ( "mov %[w], esi " : [w] "+m" (w) ); + #endif + // Press / unpress footpath and queue type buttons w->pressed_widgets &= ~(1 << WIDX_FOOTPATH_TYPE); @@ -547,8 +677,18 @@ static void window_footpath_paint() rct_window *w; rct_drawpixelinfo *dpi; + #ifdef _MSC_VER __asm mov w, esi + #else + __asm__ ( "mov %[w], esi " : [w] "+m" (w) ); + #endif + + #ifdef _MSC_VER __asm mov dpi, edi + #else + __asm__ ( "mov %[dpi], edi " : [dpi] "+m" (dpi) ); + #endif + window_draw_widgets(w, dpi); diff --git a/src/window_game_bottom_toolbar.c b/src/window_game_bottom_toolbar.c index 0a38aa0b56..e8c3a1ab22 100644 --- a/src/window_game_bottom_toolbar.c +++ b/src/window_game_bottom_toolbar.c @@ -154,8 +154,18 @@ static void window_game_bottom_toolbar_mouseup() rct_window *w, *mainWindow; rct_news_item *newsItem; + #ifdef _MSC_VER __asm mov widgetIndex, dx + #else + __asm__ ( "mov %[widgetIndex], dx " : [widgetIndex] "+m" (widgetIndex) ); + #endif + + #ifdef _MSC_VER __asm mov w, esi + #else + __asm__ ( "mov %[w], esi " : [w] "+m" (w) ); + #endif + switch (widgetIndex) { case WIDX_LEFT_OUTSET: @@ -207,8 +217,18 @@ static void window_game_bottom_toolbar_tooltip() short widgetIndex; rct_window *w; + #ifdef _MSC_VER __asm mov widgetIndex, dx + #else + __asm__ ( "mov %[widgetIndex], dx " : [widgetIndex] "+m" (widgetIndex) ); + #endif + + #ifdef _MSC_VER __asm mov w, esi + #else + __asm__ ( "mov %[w], esi " : [w] "+m" (w) ); + #endif + switch (widgetIndex) { case WIDX_MONEY: @@ -230,7 +250,12 @@ static void window_game_bottom_toolbar_tooltip() break; } + #ifdef _MSC_VER __asm mov dx, widgetIndex + #else + __asm__ ( "mov dx, %[widgetIndex] " : [widgetIndex] "+m" (widgetIndex) ); + #endif + } /** @@ -243,7 +268,12 @@ static void window_game_bottom_toolbar_invalidate() rct_window *w; rct_news_item *newsItem; + #ifdef _MSC_VER __asm mov w, esi + #else + __asm__ ( "mov %[w], esi " : [w] "+m" (w) ); + #endif + // Anchor the middle and right panel to the right x = RCT2_GLOBAL(RCT2_ADDRESS_SCREEN_WIDTH, sint16); @@ -335,8 +365,18 @@ static void window_game_bottom_toolbar_paint() rct_window *w; rct_drawpixelinfo *dpi; + #ifdef _MSC_VER __asm mov w, esi + #else + __asm__ ( "mov %[w], esi " : [w] "+m" (w) ); + #endif + + #ifdef _MSC_VER __asm mov dpi, edi + #else + __asm__ ( "mov %[dpi], edi " : [dpi] "+m" (dpi) ); + #endif + // Draw panel grey backgrounds gfx_fill_rect( @@ -543,7 +583,8 @@ static void window_game_bottom_toolbar_draw_news_item(rct_drawpixelinfo *dpi, rc _edi = (int)e->paint.dpi; _cx = x; _dx = y; - __asm { + #ifdef _MSC_VER + __asm { mov cx, _cx mov dx, _dx mov esi, w @@ -556,6 +597,22 @@ static void window_game_bottom_toolbar_draw_news_item(rct_drawpixelinfo *dpi, rc after: pop ebp } + #else + __asm__ ( "\ + \n\ + mov cx, %[_cx] \n\ + mov dx, %[_dx] \n\ + mov esi, %[w] \n\ + mov edi, %[_edi] \n\ + push ebp \n\ + mov ebp, 0x0066C3B8 \n\ + push %[after] \n\ + push esi \n\ + jmp ebp \n\ + %[after]: \n\ + pop ebp \n\ + " : [_cx] "+m" (_cx), [_dx] "+m" (_dx), [w] "+m" (w), [_edi] "+m" (_edi), [after] "+m" (after) ); + #endif break; */ diff --git a/src/window_game_top_toolbar.c b/src/window_game_top_toolbar.c index 616e1a525e..05ee76e813 100644 --- a/src/window_game_top_toolbar.c +++ b/src/window_game_top_toolbar.c @@ -148,8 +148,18 @@ static void window_game_top_toolbar_mouseup() short widgetIndex; rct_window *w, *mainWindow; + #ifdef _MSC_VER __asm mov widgetIndex, dx + #else + __asm__ ( "mov %[widgetIndex], dx " : [widgetIndex] "+m" (widgetIndex) ); + #endif + + #ifdef _MSC_VER __asm mov w, esi + #else + __asm__ ( "mov %[w], esi " : [w] "+m" (w) ); + #endif + switch (widgetIndex) { case WIDX_PAUSE: @@ -251,9 +261,24 @@ static void window_game_top_toolbar_mousedown() rct_widget *widget; rct_viewport *mainViewport; + #ifdef _MSC_VER __asm mov widgetIndex, dx + #else + __asm__ ( "mov %[widgetIndex], dx " : [widgetIndex] "+m" (widgetIndex) ); + #endif + + #ifdef _MSC_VER __asm mov w, esi + #else + __asm__ ( "mov %[w], esi " : [w] "+m" (w) ); + #endif + + #ifdef _MSC_VER __asm mov widget, edi + #else + __asm__ ( "mov %[widget], edi " : [widget] "+m" (widget) ); + #endif + if (widgetIndex == WIDX_FILE_MENU) { gDropdownItemsFormat[0] = 882; @@ -339,8 +364,18 @@ static void window_game_top_toolbar_dropdown() { short widgetIndex, dropdownIndex; + #ifdef _MSC_VER __asm mov widgetIndex, dx + #else + __asm__ ( "mov %[widgetIndex], dx " : [widgetIndex] "+m" (widgetIndex) ); + #endif + + #ifdef _MSC_VER __asm mov dropdownIndex, ax + #else + __asm__ ( "mov %[dropdownIndex], ax " : [dropdownIndex] "+m" (dropdownIndex) ); + #endif + if (widgetIndex == WIDX_FILE_MENU) { switch (dropdownIndex) { @@ -402,7 +437,12 @@ static void window_game_top_toolbar_invalidate() int x; rct_window *w; + #ifdef _MSC_VER __asm mov w, esi + #else + __asm__ ( "mov %[w], esi " : [w] "+m" (w) ); + #endif + // Anchor the right half of the buttons to the right x = RCT2_GLOBAL(RCT2_ADDRESS_SCREEN_WIDTH, sint16); @@ -472,8 +512,18 @@ static void window_game_top_toolbar_paint() rct_window *w; rct_drawpixelinfo *dpi; + #ifdef _MSC_VER __asm mov w, esi + #else + __asm__ ( "mov %[w], esi " : [w] "+m" (w) ); + #endif + + #ifdef _MSC_VER __asm mov dpi, edi + #else + __asm__ ( "mov %[dpi], edi " : [dpi] "+m" (dpi) ); + #endif + window_draw_widgets(w, dpi); diff --git a/src/window_guest_list.c b/src/window_guest_list.c index 0ef8b24cbe..d235cab756 100644 --- a/src/window_guest_list.c +++ b/src/window_guest_list.c @@ -187,8 +187,18 @@ static void window_guest_list_mouseup() short widgetIndex; rct_window *w; + #ifdef _MSC_VER __asm mov widgetIndex, dx + #else + __asm__ ( "mov %[widgetIndex], dx " : [widgetIndex] "+m" (widgetIndex) ); + #endif + + #ifdef _MSC_VER __asm mov w, esi + #else + __asm__ ( "mov %[w], esi " : [w] "+m" (w) ); + #endif + switch (widgetIndex) { case WIDX_CLOSE: @@ -208,7 +218,12 @@ static void window_guest_list_resize() { rct_window *w; + #ifdef _MSC_VER __asm mov w, esi + #else + __asm__ ( "mov %[w], esi " : [w] "+m" (w) ); + #endif + w->min_width = 350; w->min_height = 330; @@ -233,9 +248,24 @@ static void window_guest_list_mousedown() rct_window *w; rct_widget *widget; + #ifdef _MSC_VER __asm mov widgetIndex, dx + #else + __asm__ ( "mov %[widgetIndex], dx " : [widgetIndex] "+m" (widgetIndex) ); + #endif + + #ifdef _MSC_VER __asm mov w, esi + #else + __asm__ ( "mov %[w], esi " : [w] "+m" (w) ); + #endif + + #ifdef _MSC_VER __asm mov widget, edi + #else + __asm__ ( "mov %[widget], edi " : [widget] "+m" (widget) ); + #endif + switch (widgetIndex) { case WIDX_TAB_1: @@ -303,9 +333,24 @@ static void window_guest_list_dropdown() short dropdownIndex, widgetIndex; rct_window *w; + #ifdef _MSC_VER __asm mov dropdownIndex, ax + #else + __asm__ ( "mov %[dropdownIndex], ax " : [dropdownIndex] "+m" (dropdownIndex) ); + #endif + + #ifdef _MSC_VER __asm mov widgetIndex, dx + #else + __asm__ ( "mov %[widgetIndex], dx " : [widgetIndex] "+m" (widgetIndex) ); + #endif + + #ifdef _MSC_VER __asm mov w, esi + #else + __asm__ ( "mov %[w], esi " : [w] "+m" (w) ); + #endif + switch (widgetIndex) { case WIDX_PAGE_DROPDOWN_BUTTON: @@ -347,7 +392,12 @@ static void window_guest_list_scrollgetsize() rct_window *w; rct_peep *peep; + #ifdef _MSC_VER __asm mov w, esi + #else + __asm__ ( "mov %[w], esi " : [w] "+m" (w) ); + #endif + switch (_window_guest_list_selected_tab) { case PAGE_INDIVIDUAL: @@ -400,8 +450,18 @@ static void window_guest_list_scrollgetsize() window_invalidate(w); } + #ifdef _MSC_VER __asm mov ecx, 447 + #else + __asm__ ( "mov ecx, 447 " ); + #endif + + #ifdef _MSC_VER __asm mov edx, y + #else + __asm__ ( "mov edx, %[y] " : [y] "+m" (y) ); + #endif + } /** @@ -415,8 +475,18 @@ static void window_guest_list_scrollmousedown() rct_window *w; rct_peep *peep; + #ifdef _MSC_VER __asm mov y, dx + #else + __asm__ ( "mov %[y], dx " : [y] "+m" (y) ); + #endif + + #ifdef _MSC_VER __asm mov w, esi + #else + __asm__ ( "mov %[w], esi " : [w] "+m" (w) ); + #endif + switch (_window_guest_list_selected_tab) { case PAGE_INDIVIDUAL: @@ -468,8 +538,18 @@ static void window_guest_list_scrollmouseover() short y; rct_window *w; + #ifdef _MSC_VER __asm mov y, dx + #else + __asm__ ( "mov %[y], dx " : [y] "+m" (y) ); + #endif + + #ifdef _MSC_VER __asm mov w, esi + #else + __asm__ ( "mov %[w], esi " : [w] "+m" (w) ); + #endif + i = y / (_window_guest_list_selected_tab == PAGE_INDIVIDUAL ? 10 : 21); i += _window_guest_list_selected_page * 3173; @@ -496,7 +576,12 @@ static void window_guest_list_invalidate() { rct_window *w; + #ifdef _MSC_VER __asm mov w, esi + #else + __asm__ ( "mov %[w], esi " : [w] "+m" (w) ); + #endif + w->pressed_widgets &= ~(1 << WIDX_TAB_1); w->pressed_widgets &= ~(1 << WIDX_TAB_2); @@ -530,8 +615,18 @@ static void window_guest_list_paint() rct_window *w; rct_drawpixelinfo *dpi; + #ifdef _MSC_VER __asm mov w, esi + #else + __asm__ ( "mov %[w], esi " : [w] "+m" (w) ); + #endif + + #ifdef _MSC_VER __asm mov dpi, edi + #else + __asm__ ( "mov %[dpi], edi " : [dpi] "+m" (dpi) ); + #endif + // Widgets window_draw_widgets(w, dpi); @@ -594,8 +689,18 @@ static void window_guest_list_scrollpaint() rct_peep *peep; rct_peep_thought *thought; + #ifdef _MSC_VER __asm mov w, esi + #else + __asm__ ( "mov %[w], esi " : [w] "+m" (w) ); + #endif + + #ifdef _MSC_VER __asm mov dpi, edi + #else + __asm__ ( "mov %[dpi], edi " : [dpi] "+m" (dpi) ); + #endif + // Background fill gfx_fill_rect(dpi, dpi->x, dpi->y, dpi->x + dpi->width - 1, dpi->y + dpi->height - 1, ((char*)0x0141FC48)[w->colours[1] * 8]); diff --git a/src/window_land.c b/src/window_land.c index 0dd6493ff4..0d6624e8d3 100644 --- a/src/window_land.c +++ b/src/window_land.c @@ -165,8 +165,18 @@ static void window_land_mouseup() short widgetIndex; rct_window *w; + #ifdef _MSC_VER __asm mov widgetIndex, dx + #else + __asm__ ( "mov %[widgetIndex], dx " : [widgetIndex] "+m" (widgetIndex) ); + #endif + + #ifdef _MSC_VER __asm mov w, esi + #else + __asm__ ( "mov %[w], esi " : [w] "+m" (w) ); + #endif + switch (widgetIndex) { case WIDX_CLOSE: @@ -214,9 +224,24 @@ static void window_land_mousedown() rct_window *w; rct_widget *widget; + #ifdef _MSC_VER __asm mov widgetIndex, dx + #else + __asm__ ( "mov %[widgetIndex], dx " : [widgetIndex] "+m" (widgetIndex) ); + #endif + + #ifdef _MSC_VER __asm mov w, esi + #else + __asm__ ( "mov %[w], esi " : [w] "+m" (w) ); + #endif + + #ifdef _MSC_VER __asm mov widget, edi + #else + __asm__ ( "mov %[widget], edi " : [widget] "+m" (widget) ); + #endif + switch (widgetIndex) { case WIDX_FLOOR: @@ -266,9 +291,24 @@ static void window_land_dropdown() short dropdownIndex, widgetIndex; rct_window *w; + #ifdef _MSC_VER __asm mov dropdownIndex, ax + #else + __asm__ ( "mov %[dropdownIndex], ax " : [dropdownIndex] "+m" (dropdownIndex) ); + #endif + + #ifdef _MSC_VER __asm mov widgetIndex, dx + #else + __asm__ ( "mov %[widgetIndex], dx " : [widgetIndex] "+m" (widgetIndex) ); + #endif + + #ifdef _MSC_VER __asm mov w, esi + #else + __asm__ ( "mov %[w], esi " : [w] "+m" (w) ); + #endif + switch (widgetIndex) { case WIDX_FLOOR: @@ -325,7 +365,12 @@ static void window_land_invalidate() { rct_window *w; + #ifdef _MSC_VER __asm mov w, esi + #else + __asm__ ( "mov %[w], esi " : [w] "+m" (w) ); + #endif + w->pressed_widgets = (1 << WIDX_PREVIEW); if (RCT2_GLOBAL(RCT2_ADDRESS_SELECTED_TERRAIN_SURFACE, uint8) != 255) @@ -350,8 +395,18 @@ static void window_land_paint() rct_drawpixelinfo *dpi; int x, y, price, numTiles; + #ifdef _MSC_VER __asm mov w, esi + #else + __asm__ ( "mov %[w], esi " : [w] "+m" (w) ); + #endif + + #ifdef _MSC_VER __asm mov dpi, edi + #else + __asm__ ( "mov %[dpi], edi " : [dpi] "+m" (dpi) ); + #endif + window_draw_widgets(w, dpi); diff --git a/src/window_main.c b/src/window_main.c index 314fe51d94..2ab518cc18 100644 --- a/src/window_main.c +++ b/src/window_main.c @@ -48,6 +48,7 @@ void window_main_open() window->widgets = main_widgets; // RCT2_CALLPROC_X(0x006EB009, window->x, window->y, 0x4000000, 0x0FFF0FFF, window, 0, 0); + #ifdef _MSC_VER __asm { mov esi, window mov edx, 0FFF0FFFh @@ -62,6 +63,24 @@ void window_main_open() pop ebp or word ptr [edi+12h], 400h } + #else + __asm__ ( "\ + \n\ + push ebx \n\ + mov esi, %[window] \n\ + mov edx, 0x0FFF0FFF \n\ + mov eax, [esi+0x2C] \n\ + mov ebx, [esi+0x30] \n\ + mov ecx, 0x4000000 \n\ + push ebp \n\ + mov ebp, 0x6EB009 \n\ + call ebp \n\ + \n\ + pop ebp \n\ + or word ptr [edi+0x12], 0x400 \n\ + pop ebx \n\ + " : [window] "+m" (window) : : "esi","edx","eax","ecx" ); + #endif RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_ROTATION, sint32) = 0; RCT2_GLOBAL(0x009E32B0, uint8) = 0; diff --git a/src/window_map.c b/src/window_map.c index 4c1a5f00d2..11c01213d7 100644 --- a/src/window_map.c +++ b/src/window_map.c @@ -187,8 +187,18 @@ static void window_map_mouseup() /*short widgetIndex; rct_window *w; + #ifdef _MSC_VER __asm mov widgetIndex, dx + #else + __asm__ ( "mov %[widgetIndex], dx " : [widgetIndex] "+m" (widgetIndex) ); + #endif + + #ifdef _MSC_VER __asm mov w, esi + #else + __asm__ ( "mov %[w], esi " : [w] "+m" (w) ); + #endif + switch (widgetIndex) { case WIDX_CLOSE: @@ -243,7 +253,11 @@ static void window_map_invalidate() uint32 pressed_widgets; int i, height; + #ifdef _MSC_VER __asm mov w, esi + #else + __asm__ ( "mov %[w], esi " : [w] "+m" (w) ); + #endif // set the pressed widgets pressed_widgets = (uint32)w->pressed_widgets; @@ -366,8 +380,18 @@ static void window_map_paint() int image_id; int i, x, y; + #ifdef _MSC_VER __asm mov w, esi + #else + __asm__ ( "mov %[w], esi " : [w] "+m" (w) ); + #endif + + #ifdef _MSC_VER __asm mov dpi, edi + #else + __asm__ ( "mov %[dpi], edi " : [dpi] "+m" (dpi) ); + #endif + window_draw_widgets(w, dpi); diff --git a/src/window_news.c b/src/window_news.c index 580d76e322..4cf448c5ca 100644 --- a/src/window_news.c +++ b/src/window_news.c @@ -129,8 +129,18 @@ static void window_news_mouseup() short widgetIndex; rct_window *w; + #ifdef _MSC_VER __asm mov widgetIndex, dx + #else + __asm__ ( "mov %[widgetIndex], dx " : [widgetIndex] "+m" (widgetIndex) ); + #endif + + #ifdef _MSC_VER __asm mov w, esi + #else + __asm__ ( "mov %[w], esi " : [w] "+m" (w) ); + #endif + if (widgetIndex == WIDX_CLOSE) window_close(w); @@ -195,7 +205,12 @@ static void window_news_scrollgetsize() height += 42; } + #ifdef _MSC_VER __asm mov edx, height + #else + __asm__ ( "mov edx, %[height] " : [height] "+m" (height) ); + #endif + } /** @@ -209,9 +224,24 @@ static void window_news_scrollmousedown() rct_window *w; rct_news_item *newsItems; + #ifdef _MSC_VER __asm mov x, cx + #else + __asm__ ( "mov %[x], cx " : [x] "+m" (x) ); + #endif + + #ifdef _MSC_VER __asm mov y, dx + #else + __asm__ ( "mov %[y], dx " : [y] "+m" (y) ); + #endif + + #ifdef _MSC_VER __asm mov w, esi + #else + __asm__ ( "mov %[w], esi " : [w] "+m" (w) ); + #endif + buttonIndex = 0; newsItems = RCT2_ADDRESS(RCT2_ADDRESS_NEWS_ITEM_LIST, rct_news_item); @@ -274,8 +304,18 @@ static void window_news_paint() rct_window *w; rct_drawpixelinfo *dpi; + #ifdef _MSC_VER __asm mov w, esi + #else + __asm__ ( "mov %[w], esi " : [w] "+m" (w) ); + #endif + + #ifdef _MSC_VER __asm mov dpi, edi + #else + __asm__ ( "mov %[dpi], edi " : [dpi] "+m" (dpi) ); + #endif + window_draw_widgets(w, dpi); } @@ -291,8 +331,18 @@ static void window_news_scrollpaint() rct_drawpixelinfo *dpi; rct_news_item *newsItems, *newsItem, *newsItem2; + #ifdef _MSC_VER __asm mov w, esi + #else + __asm__ ( "mov %[w], esi " : [w] "+m" (w) ); + #endif + + #ifdef _MSC_VER __asm mov dpi, edi + #else + __asm__ ( "mov %[dpi], edi " : [dpi] "+m" (dpi) ); + #endif + y = 0; newsItems = RCT2_ADDRESS(RCT2_ADDRESS_NEWS_ITEM_LIST, rct_news_item); diff --git a/src/window_options.c b/src/window_options.c index fae7561050..8206d69532 100644 --- a/src/window_options.c +++ b/src/window_options.c @@ -199,8 +199,18 @@ static void window_options_mouseup() short widgetIndex; rct_window *w; + #ifdef _MSC_VER __asm mov widgetIndex, dx + #else + __asm__ ( "mov %[widgetIndex], dx " : [widgetIndex] "+m" (widgetIndex) ); + #endif + + #ifdef _MSC_VER __asm mov w, esi + #else + __asm__ ( "mov %[w], esi " : [w] "+m" (w) ); + #endif + switch (widgetIndex) { case WIDX_CLOSE: @@ -218,9 +228,19 @@ static void window_options_mouseup() RCT2_GLOBAL(RCT2_ADDRESS_PARK_FLAGS, uint32) ^= PARK_FLAGS_SHOW_REAL_GUEST_NAMES; if (RCT2_GLOBAL(RCT2_ADDRESS_PARK_FLAGS, uint32) & PARK_FLAGS_SHOW_REAL_GUEST_NAMES) - __asm xor al, al + #ifdef _MSC_VER + __asm xor al, al + #else + __asm__ ( "xor al, al " ); + #endif + else - __asm mov al, 1 + #ifdef _MSC_VER + __asm mov al, 1 + #else + __asm__ ( "mov al, 1 " ); + #endif + RCT2_CALLPROC_EBPSAFE(0x0069C52F); break; @@ -268,8 +288,18 @@ static void window_options_mousedown() rct_window *w; rct_widget *widget; + #ifdef _MSC_VER __asm mov widgetIndex, dx + #else + __asm__ ( "mov %[widgetIndex], dx " : [widgetIndex] "+m" (widgetIndex) ); + #endif + + #ifdef _MSC_VER __asm mov w, esi + #else + __asm__ ( "mov %[w], esi " : [w] "+m" (w) ); + #endif + widget = &w->widgets[widgetIndex - 1]; @@ -386,16 +416,36 @@ static void window_options_dropdown() short widgetIndex; rct_window *w; + #ifdef _MSC_VER __asm mov dropdownIndex, ax + #else + __asm__ ( "mov %[dropdownIndex], ax " : [dropdownIndex] "+m" (dropdownIndex) ); + #endif + + #ifdef _MSC_VER __asm mov widgetIndex, dx + #else + __asm__ ( "mov %[widgetIndex], dx " : [widgetIndex] "+m" (widgetIndex) ); + #endif + + #ifdef _MSC_VER __asm mov w, esi + #else + __asm__ ( "mov %[w], esi " : [w] "+m" (w) ); + #endif + if (dropdownIndex == -1) return; switch (widgetIndex) { case WIDX_SOUND_DROPDOWN: - __asm movzx ax, dropdownIndex // the switch replaces ax value + #ifdef _MSC_VER + __asm movzx ax, dropdownIndex + #else + __asm__ ( "movzx ax, %[dropdownIndex] " : : [dropdownIndex] "g" ((char)dropdownIndex) ); + #endif + // the switch replaces ax value RCT2_CALLPROC_EBPSAFE(0x006BA9B5); // part of init audio window_invalidate(w); break; @@ -434,7 +484,12 @@ static void window_options_dropdown() window_options_update_height_markers(); break; case WIDX_RESOLUTION_DROPDOWN: - __asm movzx ax, dropdownIndex // the switch replaces ax value + #ifdef _MSC_VER + __asm movzx ax, dropdownIndex + #else + __asm__ ( "movzx ax, %[dropdownIndex] " : : [dropdownIndex] "g" ((char)dropdownIndex) ); + #endif + // the switch replaces ax value RCT2_CALLPROC_EBPSAFE(0x006BB37D); break; case WIDX_TEMPERATURE_DROPDOWN: @@ -461,7 +516,12 @@ static void window_options_dropdown() static void window_options_update(rct_window *w) { //Has use asm verison incase called by WM_INVALIDATE + #ifdef _MSC_VER __asm mov w, esi + #else + __asm__ ( "mov %[w], esi " : [w] "+m" (w) ); + #endif + sint32 format_args = RCT2_GLOBAL(0x009AF280, sint32); @@ -568,8 +628,18 @@ static void window_options_paint() rct_window *w; rct_drawpixelinfo *dpi; + #ifdef _MSC_VER __asm mov w, esi + #else + __asm__ ( "mov %[w], esi " : [w] "+m" (w) ); + #endif + + #ifdef _MSC_VER __asm mov dpi, edi + #else + __asm__ ( "mov %[dpi], edi " : [dpi] "+m" (dpi) ); + #endif + window_draw_widgets(w, dpi); diff --git a/src/window_park.c b/src/window_park.c index c3b4ffb4ab..e22df34d2e 100644 --- a/src/window_park.c +++ b/src/window_park.c @@ -643,7 +643,12 @@ static void window_park_entrance_close() { rct_window *w; + #ifdef _MSC_VER __asm mov w, esi + #else + __asm__ ( "mov %[w], esi " : [w] "+m" (w) ); + #endif + if (RCT2_GLOBAL(0x009DE518, uint32) & (1 << 3)) if (w->classification == RCT2_GLOBAL(RCT2_ADDRESS_TOOL_WINDOWCLASS, rct_windowclass) && w->number == RCT2_GLOBAL(RCT2_ADDRESS_TOOL_WINDOWNUMBER, rct_windownumber)) @@ -659,8 +664,18 @@ static void window_park_entrance_mouseup() short widgetIndex; rct_window *w; + #ifdef _MSC_VER __asm mov widgetIndex, dx + #else + __asm__ ( "mov %[widgetIndex], dx " : [widgetIndex] "+m" (widgetIndex) ); + #endif + + #ifdef _MSC_VER __asm mov w, esi + #else + __asm__ ( "mov %[w], esi " : [w] "+m" (w) ); + #endif + switch (widgetIndex) { case WIDX_CLOSE: @@ -699,7 +714,12 @@ static void window_park_entrance_resize() { rct_window *w; + #ifdef _MSC_VER __asm mov w, esi + #else + __asm__ ( "mov %[w], esi " : [w] "+m" (w) ); + #endif + w->flags |= WF_RESIZABLE; window_set_resize(w, 230, 174 + 9, 230 * 3, (274 + 9) * 3); @@ -716,9 +736,24 @@ static void window_park_entrance_mousedown() rct_window *w; rct_widget *widget; + #ifdef _MSC_VER __asm mov widgetIndex, dx + #else + __asm__ ( "mov %[widgetIndex], dx " : [widgetIndex] "+m" (widgetIndex) ); + #endif + + #ifdef _MSC_VER __asm mov w, esi + #else + __asm__ ( "mov %[w], esi " : [w] "+m" (w) ); + #endif + + #ifdef _MSC_VER __asm mov widget, edi + #else + __asm__ ( "mov %[widget], edi " : [widget] "+m" (widget) ); + #endif + if (widgetIndex == WIDX_OPEN_OR_CLOSE) { gDropdownItemsFormat[0] = 1142; @@ -752,8 +787,18 @@ static void window_park_entrance_dropdown() { short widgetIndex, dropdownIndex; + #ifdef _MSC_VER __asm mov dropdownIndex, ax + #else + __asm__ ( "mov %[dropdownIndex], ax " : [dropdownIndex] "+m" (dropdownIndex) ); + #endif + + #ifdef _MSC_VER __asm mov widgetIndex, dx + #else + __asm__ ( "mov %[widgetIndex], dx " : [widgetIndex] "+m" (widgetIndex) ); + #endif + if (widgetIndex == WIDX_OPEN_OR_CLOSE) { if (dropdownIndex == -1) @@ -790,10 +835,30 @@ static void window_park_entrance_toolupdate() short widgetIndex; rct_window *w; + #ifdef _MSC_VER __asm mov x, eax + #else + __asm__ ( "mov %[x], eax " : [x] "+m" (x) ); + #endif + + #ifdef _MSC_VER __asm mov y, ebx + #else + __asm__ ( "mov %[y], ebx " : [y] "+m" (y) ); + #endif + + #ifdef _MSC_VER __asm mov widgetIndex, dx + #else + __asm__ ( "mov %[widgetIndex], dx " : [widgetIndex] "+m" (widgetIndex) ); + #endif + + #ifdef _MSC_VER __asm mov w, esi + #else + __asm__ ( "mov %[w], esi " : [w] "+m" (w) ); + #endif + if (widgetIndex == WIDX_BUY_LAND_RIGHTS) { RCT2_CALLPROC_X(0x0068AAE1, x, y, 0, 0, (int)w, 0, 0); @@ -820,10 +885,30 @@ static void window_park_entrance_tooldown() short x, y, widgetIndex; rct_window *w; + #ifdef _MSC_VER __asm mov x, ax + #else + __asm__ ( "mov %[x], ax " : [x] "+m" (x) ); + #endif + + #ifdef _MSC_VER __asm mov y, bx + #else + __asm__ ( "mov %[y], bx " : [y] "+m" (y) ); + #endif + + #ifdef _MSC_VER __asm mov widgetIndex, dx + #else + __asm__ ( "mov %[widgetIndex], dx " : [widgetIndex] "+m" (widgetIndex) ); + #endif + + #ifdef _MSC_VER __asm mov w, esi + #else + __asm__ ( "mov %[w], esi " : [w] "+m" (w) ); + #endif + RCT2_CALLPROC_X(0x006681E6, x, y, 0, widgetIndex, (int)w, 0, 0); } @@ -837,10 +922,30 @@ static void window_park_entrance_tooldrag() short x, y, widgetIndex; rct_window *w; + #ifdef _MSC_VER __asm mov x, ax + #else + __asm__ ( "mov %[x], ax " : [x] "+m" (x) ); + #endif + + #ifdef _MSC_VER __asm mov y, bx + #else + __asm__ ( "mov %[y], bx " : [y] "+m" (y) ); + #endif + + #ifdef _MSC_VER __asm mov widgetIndex, dx + #else + __asm__ ( "mov %[widgetIndex], dx " : [widgetIndex] "+m" (widgetIndex) ); + #endif + + #ifdef _MSC_VER __asm mov w, esi + #else + __asm__ ( "mov %[w], esi " : [w] "+m" (w) ); + #endif + RCT2_CALLPROC_X(0x006681FB, x, y, 0, widgetIndex, (int)w, 0, 0); } @@ -854,8 +959,18 @@ static void window_park_entrance_toolabort() short widgetIndex; rct_window *w; + #ifdef _MSC_VER __asm mov widgetIndex, dx + #else + __asm__ ( "mov %[widgetIndex], dx " : [widgetIndex] "+m" (widgetIndex) ); + #endif + + #ifdef _MSC_VER __asm mov w, esi + #else + __asm__ ( "mov %[w], esi " : [w] "+m" (w) ); + #endif + if (widgetIndex == WIDX_BUY_LAND_RIGHTS) { hide_gridlines(); @@ -877,10 +992,30 @@ static void window_park_entrance_textinput() rct_window *w; char *text; + #ifdef _MSC_VER __asm mov result, cl + #else + __asm__ ( "mov %[result], cl " : [result] "+m" (result) ); + #endif + + #ifdef _MSC_VER __asm mov widgetIndex, dx + #else + __asm__ ( "mov %[widgetIndex], dx " : [widgetIndex] "+m" (widgetIndex) ); + #endif + + #ifdef _MSC_VER __asm mov w, esi + #else + __asm__ ( "mov %[w], esi " : [w] "+m" (w) ); + #endif + + #ifdef _MSC_VER __asm mov text, edi + #else + __asm__ ( "mov %[text], edi " : [text] "+m" (text) ); + #endif + if (widgetIndex == WIDX_RENAME) { if (result) { @@ -901,7 +1036,12 @@ static void window_park_entrance_invalidate() int i; rct_window *w; + #ifdef _MSC_VER __asm mov w, esi + #else + __asm__ ( "mov %[w], esi " : [w] "+m" (w) ); + #endif + w->widgets = window_park_page_widgets[w->page]; window_init_scroll_widgets(w); @@ -953,8 +1093,18 @@ static void window_park_entrance_paint() rct_drawpixelinfo *dpi; rct_widget *labelWidget; + #ifdef _MSC_VER __asm mov w, esi + #else + __asm__ ( "mov %[w], esi " : [w] "+m" (w) ); + #endif + + #ifdef _MSC_VER __asm mov dpi, edi + #else + __asm__ ( "mov %[dpi], edi " : [dpi] "+m" (dpi) ); + #endif + window_draw_widgets(w, dpi); window_park_draw_tab_images(dpi, w); @@ -1117,8 +1267,18 @@ static void window_park_rating_mouseup() short widgetIndex; rct_window *w; + #ifdef _MSC_VER __asm mov widgetIndex, dx + #else + __asm__ ( "mov %[widgetIndex], dx " : [widgetIndex] "+m" (widgetIndex) ); + #endif + + #ifdef _MSC_VER __asm mov w, esi + #else + __asm__ ( "mov %[w], esi " : [w] "+m" (w) ); + #endif + if (widgetIndex == WIDX_CLOSE) window_close(w); @@ -1134,7 +1294,12 @@ static void window_park_rating_resize() { rct_window *w; + #ifdef _MSC_VER __asm mov w, esi + #else + __asm__ ( "mov %[w], esi " : [w] "+m" (w) ); + #endif + window_set_resize(w, 230, 182, 230, 182); } @@ -1158,7 +1323,12 @@ static void window_park_rating_invalidate() rct_window *w; rct_widget *widgets; + #ifdef _MSC_VER __asm mov w, esi + #else + __asm__ ( "mov %[w], esi " : [w] "+m" (w) ); + #endif + widgets = window_park_page_widgets[w->page]; if (w->widgets != widgets) { @@ -1187,8 +1357,18 @@ static void window_park_rating_paint() rct_widget *widget; uint8 *history; + #ifdef _MSC_VER __asm mov w, esi + #else + __asm__ ( "mov %[w], esi " : [w] "+m" (w) ); + #endif + + #ifdef _MSC_VER __asm mov dpi, edi + #else + __asm__ ( "mov %[dpi], edi " : [dpi] "+m" (dpi) ); + #endif + window_draw_widgets(w, dpi); window_park_draw_tab_images(dpi, w); @@ -1255,8 +1435,18 @@ static void window_park_guests_mouseup() short widgetIndex; rct_window *w; + #ifdef _MSC_VER __asm mov widgetIndex, dx + #else + __asm__ ( "mov %[widgetIndex], dx " : [widgetIndex] "+m" (widgetIndex) ); + #endif + + #ifdef _MSC_VER __asm mov w, esi + #else + __asm__ ( "mov %[w], esi " : [w] "+m" (w) ); + #endif + if (widgetIndex == WIDX_CLOSE) window_close(w); @@ -1272,7 +1462,12 @@ static void window_park_guests_resize() { rct_window *w; + #ifdef _MSC_VER __asm mov w, esi + #else + __asm__ ( "mov %[w], esi " : [w] "+m" (w) ); + #endif + window_set_resize(w, 230, 182, 230, 182); } @@ -1297,7 +1492,12 @@ static void window_park_guests_invalidate() rct_window *w; rct_widget *widgets; + #ifdef _MSC_VER __asm mov w, esi + #else + __asm__ ( "mov %[w], esi " : [w] "+m" (w) ); + #endif + widgets = window_park_page_widgets[w->page]; if (w->widgets != widgets) { @@ -1326,8 +1526,18 @@ static void window_park_guests_paint() rct_widget *widget; uint8 *history; + #ifdef _MSC_VER __asm mov w, esi + #else + __asm__ ( "mov %[w], esi " : [w] "+m" (w) ); + #endif + + #ifdef _MSC_VER __asm mov dpi, edi + #else + __asm__ ( "mov %[dpi], edi " : [dpi] "+m" (dpi) ); + #endif + window_draw_widgets(w, dpi); window_park_draw_tab_images(dpi, w); @@ -1365,8 +1575,18 @@ static void window_park_price_mouseup() short widgetIndex; rct_window *w; + #ifdef _MSC_VER __asm mov widgetIndex, dx + #else + __asm__ ( "mov %[widgetIndex], dx " : [widgetIndex] "+m" (widgetIndex) ); + #endif + + #ifdef _MSC_VER __asm mov w, esi + #else + __asm__ ( "mov %[w], esi " : [w] "+m" (w) ); + #endif + if (widgetIndex == WIDX_CLOSE) window_close(w); @@ -1382,7 +1602,12 @@ static void window_park_price_resize() { rct_window *w; + #ifdef _MSC_VER __asm mov w, esi + #else + __asm__ ( "mov %[w], esi " : [w] "+m" (w) ); + #endif + window_set_resize(w, 230, 124, 230, 124); } @@ -1397,8 +1622,18 @@ static void window_park_price_mousedown() short widgetIndex; rct_window *w; + #ifdef _MSC_VER __asm mov widgetIndex, dx + #else + __asm__ ( "mov %[widgetIndex], dx " : [widgetIndex] "+m" (widgetIndex) ); + #endif + + #ifdef _MSC_VER __asm mov w, esi + #else + __asm__ ( "mov %[w], esi " : [w] "+m" (w) ); + #endif + switch (widgetIndex) { case WIDX_CLOSE: @@ -1443,7 +1678,12 @@ static void window_park_price_invalidate() rct_window *w; rct_widget *widgets; + #ifdef _MSC_VER __asm mov w, esi + #else + __asm__ ( "mov %[w], esi " : [w] "+m" (w) ); + #endif + widgets = window_park_page_widgets[w->page]; if (w->widgets != widgets) { @@ -1483,8 +1723,18 @@ static void window_park_price_paint() rct_window *w; rct_drawpixelinfo *dpi; + #ifdef _MSC_VER __asm mov w, esi + #else + __asm__ ( "mov %[w], esi " : [w] "+m" (w) ); + #endif + + #ifdef _MSC_VER __asm mov dpi, edi + #else + __asm__ ( "mov %[dpi], edi " : [dpi] "+m" (dpi) ); + #endif + window_draw_widgets(w, dpi); window_park_draw_tab_images(dpi, w); @@ -1510,8 +1760,18 @@ static void window_park_stats_mouseup() short widgetIndex; rct_window *w; + #ifdef _MSC_VER __asm mov widgetIndex, dx + #else + __asm__ ( "mov %[widgetIndex], dx " : [widgetIndex] "+m" (widgetIndex) ); + #endif + + #ifdef _MSC_VER __asm mov w, esi + #else + __asm__ ( "mov %[w], esi " : [w] "+m" (w) ); + #endif + if (widgetIndex == WIDX_CLOSE) window_close(w); @@ -1527,7 +1787,12 @@ static void window_park_stats_resize() { rct_window *w; + #ifdef _MSC_VER __asm mov w, esi + #else + __asm__ ( "mov %[w], esi " : [w] "+m" (w) ); + #endif + window_set_resize(w, 230, 109, 230, 109); } @@ -1567,7 +1832,12 @@ static void window_park_stats_invalidate() rct_window *w; rct_widget *widgets; + #ifdef _MSC_VER __asm mov w, esi + #else + __asm__ ( "mov %[w], esi " : [w] "+m" (w) ); + #endif + widgets = window_park_page_widgets[w->page]; if (w->widgets != widgets) { @@ -1594,8 +1864,18 @@ static void window_park_stats_paint() rct_window *w; rct_drawpixelinfo *dpi; + #ifdef _MSC_VER __asm mov w, esi + #else + __asm__ ( "mov %[w], esi " : [w] "+m" (w) ); + #endif + + #ifdef _MSC_VER __asm mov dpi, edi + #else + __asm__ ( "mov %[dpi], edi " : [dpi] "+m" (dpi) ); + #endif + window_draw_widgets(w, dpi); window_park_draw_tab_images(dpi, w); @@ -1677,8 +1957,18 @@ static void window_park_objective_mouseup() short widgetIndex; rct_window *w; + #ifdef _MSC_VER __asm mov widgetIndex, dx + #else + __asm__ ( "mov %[widgetIndex], dx " : [widgetIndex] "+m" (widgetIndex) ); + #endif + + #ifdef _MSC_VER __asm mov w, esi + #else + __asm__ ( "mov %[w], esi " : [w] "+m" (w) ); + #endif + switch (widgetIndex) { case WIDX_CLOSE: @@ -1707,7 +1997,12 @@ static void window_park_objective_resize() { rct_window *w; + #ifdef _MSC_VER __asm mov w, esi + #else + __asm__ ( "mov %[w], esi " : [w] "+m" (w) ); + #endif + window_set_resize(w, 230, 224, 230, 224); } @@ -1730,7 +2025,12 @@ static void window_park_objective_invalidate() { rct_window *w; + #ifdef _MSC_VER __asm mov w, esi + #else + __asm__ ( "mov %[w], esi " : [w] "+m" (w) ); + #endif + window_park_set_pressed_tab(w); @@ -1758,8 +2058,18 @@ static void window_park_objective_paint() rct_window *w; rct_drawpixelinfo *dpi; + #ifdef _MSC_VER __asm mov w, esi + #else + __asm__ ( "mov %[w], esi " : [w] "+m" (w) ); + #endif + + #ifdef _MSC_VER __asm mov dpi, edi + #else + __asm__ ( "mov %[dpi], edi " : [dpi] "+m" (dpi) ); + #endif + window_draw_widgets(w, dpi); window_park_draw_tab_images(dpi, w); @@ -1839,8 +2149,18 @@ static void window_park_awards_mouseup() short widgetIndex; rct_window *w; + #ifdef _MSC_VER __asm mov widgetIndex, dx + #else + __asm__ ( "mov %[widgetIndex], dx " : [widgetIndex] "+m" (widgetIndex) ); + #endif + + #ifdef _MSC_VER __asm mov w, esi + #else + __asm__ ( "mov %[w], esi " : [w] "+m" (w) ); + #endif + if (widgetIndex == WIDX_CLOSE) window_close(w); @@ -1856,7 +2176,12 @@ static void window_park_awards_resize() { rct_window *w; + #ifdef _MSC_VER __asm mov w, esi + #else + __asm__ ( "mov %[w], esi " : [w] "+m" (w) ); + #endif + window_set_resize(w, 230, 182, 230, 182); } @@ -1880,7 +2205,12 @@ static void window_park_awards_invalidate() rct_window *w; rct_widget *widgets; + #ifdef _MSC_VER __asm mov w, esi + #else + __asm__ ( "mov %[w], esi " : [w] "+m" (w) ); + #endif + widgets = window_park_page_widgets[w->page]; if (w->widgets != widgets) { @@ -1908,8 +2238,18 @@ static void window_park_awards_paint() rct_drawpixelinfo *dpi; rct_award *award; + #ifdef _MSC_VER __asm mov w, esi + #else + __asm__ ( "mov %[w], esi " : [w] "+m" (w) ); + #endif + + #ifdef _MSC_VER __asm mov dpi, edi + #else + __asm__ ( "mov %[dpi], edi " : [dpi] "+m" (dpi) ); + #endif + window_draw_widgets(w, dpi); window_park_draw_tab_images(dpi, w); diff --git a/src/window_ride_list.c b/src/window_ride_list.c index 0b65bf1bd9..be78d9da0b 100644 --- a/src/window_ride_list.c +++ b/src/window_ride_list.c @@ -178,8 +178,18 @@ static void window_ride_list_mouseup() short widgetIndex; rct_window *w; + #ifdef _MSC_VER __asm mov widgetIndex, dx + #else + __asm__ ( "mov %[widgetIndex], dx " : [widgetIndex] "+m" (widgetIndex) ); + #endif + + #ifdef _MSC_VER __asm mov w, esi + #else + __asm__ ( "mov %[w], esi " : [w] "+m" (w) ); + #endif + switch (widgetIndex) { case WIDX_CLOSE: @@ -213,7 +223,12 @@ static void window_ride_list_resize() { rct_window *w; + #ifdef _MSC_VER __asm mov w, esi + #else + __asm__ ( "mov %[w], esi " : [w] "+m" (w) ); + #endif + w->min_width = 340; w->min_height = 124; @@ -240,9 +255,24 @@ static void window_ride_list_mousedown() rct_window *w; rct_widget *widget; + #ifdef _MSC_VER __asm mov widgetIndex, dx + #else + __asm__ ( "mov %[widgetIndex], dx " : [widgetIndex] "+m" (widgetIndex) ); + #endif + + #ifdef _MSC_VER __asm mov w, esi + #else + __asm__ ( "mov %[w], esi " : [w] "+m" (w) ); + #endif + + #ifdef _MSC_VER __asm mov widget, edi + #else + __asm__ ( "mov %[widget], edi " : [widget] "+m" (widget) ); + #endif + if (widgetIndex == WIDX_OPEN_CLOSE_ALL) { gDropdownItemsFormat[0] = STR_CLOSE_ALL; @@ -275,9 +305,24 @@ static void window_ride_list_dropdown() short dropdownIndex, widgetIndex; rct_window *w; + #ifdef _MSC_VER __asm mov dropdownIndex, ax + #else + __asm__ ( "mov %[dropdownIndex], ax " : [dropdownIndex] "+m" (dropdownIndex) ); + #endif + + #ifdef _MSC_VER __asm mov widgetIndex, dx + #else + __asm__ ( "mov %[widgetIndex], dx " : [widgetIndex] "+m" (widgetIndex) ); + #endif + + #ifdef _MSC_VER __asm mov w, esi + #else + __asm__ ( "mov %[w], esi " : [w] "+m" (w) ); + #endif + if (widgetIndex == WIDX_OPEN_CLOSE_ALL) { if (dropdownIndex == 0) @@ -314,7 +359,12 @@ static void window_ride_list_scrollgetsize() int top, height; rct_window *w; + #ifdef _MSC_VER __asm mov w, esi + #else + __asm__ ( "mov %[w], esi " : [w] "+m" (w) ); + #endif + height = w->var_476 * 10; if (w->var_47A != -1) { @@ -330,8 +380,18 @@ static void window_ride_list_scrollgetsize() window_invalidate(w); } + #ifdef _MSC_VER __asm mov ecx, 0 + #else + __asm__ ( "mov ecx, 0 " ); + #endif + + #ifdef _MSC_VER __asm mov edx, height + #else + __asm__ ( "mov edx, %[height] " : [height] "+m" (height) ); + #endif + } /** @@ -344,8 +404,18 @@ static void window_ride_list_scrollmousedown() short y; rct_window *w; + #ifdef _MSC_VER __asm mov y, dx + #else + __asm__ ( "mov %[y], dx " : [y] "+m" (y) ); + #endif + + #ifdef _MSC_VER __asm mov w, esi + #else + __asm__ ( "mov %[w], esi " : [w] "+m" (w) ); + #endif + index = y / 10; if (index >= w->var_476) @@ -365,8 +435,18 @@ static void window_ride_list_scrollmouseover() short y; rct_window *w; + #ifdef _MSC_VER __asm mov y, dx + #else + __asm__ ( "mov %[y], dx " : [y] "+m" (y) ); + #endif + + #ifdef _MSC_VER __asm mov w, esi + #else + __asm__ ( "mov %[w], esi " : [w] "+m" (w) ); + #endif + index = y / 10; if (index >= w->var_476) @@ -394,7 +474,12 @@ static void window_ride_list_invalidate() int i; rct_window *w; + #ifdef _MSC_VER __asm mov w, esi + #else + __asm__ ( "mov %[w], esi " : [w] "+m" (w) ); + #endif + window_ride_list_widgets[WIDX_CURRENT_INFORMATION_TYPE].image = STR_STATUS + _window_ride_list_information_type; @@ -427,8 +512,18 @@ static void window_ride_list_paint() rct_window *w; rct_drawpixelinfo *dpi; + #ifdef _MSC_VER __asm mov w, esi + #else + __asm__ ( "mov %[w], esi " : [w] "+m" (w) ); + #endif + + #ifdef _MSC_VER __asm mov dpi, edi + #else + __asm__ ( "mov %[dpi], edi " : [dpi] "+m" (dpi) ); + #endif + window_draw_widgets(w, dpi); window_ride_list_draw_tab_images(dpi, w); @@ -458,8 +553,18 @@ static void window_ride_list_scrollpaint() rct_drawpixelinfo *dpi; rct_ride *ride; + #ifdef _MSC_VER __asm mov w, esi + #else + __asm__ ( "mov %[w], esi " : [w] "+m" (w) ); + #endif + + #ifdef _MSC_VER __asm mov dpi, edi + #else + __asm__ ( "mov %[dpi], edi " : [dpi] "+m" (dpi) ); + #endif + gfx_fill_rect(dpi, dpi->x, dpi->y, dpi->x + dpi->width, dpi->y + dpi->height, RCT2_GLOBAL(0x0141FC48 + (w->colours[1] * 8), uint8)); diff --git a/src/window_save_prompt.c b/src/window_save_prompt.c index db3ea4edfd..b9ca33e570 100644 --- a/src/window_save_prompt.c +++ b/src/window_save_prompt.c @@ -175,8 +175,18 @@ static void window_save_prompt_mouseup() short widgetIndex; rct_window *w; + #ifdef _MSC_VER __asm mov widgetIndex, dx + #else + __asm__ ( "mov %[widgetIndex], dx " : [widgetIndex] "+m" (widgetIndex) ); + #endif + + #ifdef _MSC_VER __asm mov w, esi + #else + __asm__ ( "mov %[w], esi " : [w] "+m" (w) ); + #endif + // TODO } @@ -186,8 +196,18 @@ static void window_save_prompt_paint() rct_window *w; rct_drawpixelinfo *dpi; + #ifdef _MSC_VER __asm mov w, esi + #else + __asm__ ( "mov %[w], esi " : [w] "+m" (w) ); + #endif + + #ifdef _MSC_VER __asm mov dpi, edi + #else + __asm__ ( "mov %[dpi], edi " : [dpi] "+m" (dpi) ); + #endif + window_draw_widgets(w, dpi); } \ No newline at end of file diff --git a/src/window_title_exit.c b/src/window_title_exit.c index 843a848cc7..da9526ba1a 100644 --- a/src/window_title_exit.c +++ b/src/window_title_exit.c @@ -98,8 +98,18 @@ static void window_title_exit_mouseup() short widgetIndex; rct_window *w; + #ifdef _MSC_VER __asm mov widgetIndex, dx + #else + __asm__ ( "mov %[widgetIndex], dx " : [widgetIndex] "+m" (widgetIndex) ); + #endif + + #ifdef _MSC_VER __asm mov w, esi + #else + __asm__ ( "mov %[w], esi " : [w] "+m" (w) ); + #endif + if (RCT2_GLOBAL(RCT2_ADDRESS_RUN_INTRO_TICK_PART, int) != 0) return; @@ -117,8 +127,18 @@ static void window_title_exit_paint() rct_window *w; rct_drawpixelinfo *dpi; + #ifdef _MSC_VER __asm mov w, esi + #else + __asm__ ( "mov %[w], esi " : [w] "+m" (w) ); + #endif + + #ifdef _MSC_VER __asm mov dpi, edi + #else + __asm__ ( "mov %[dpi], edi " : [dpi] "+m" (dpi) ); + #endif + window_draw_widgets(w, dpi); } \ No newline at end of file diff --git a/src/window_title_logo.c b/src/window_title_logo.c index 1b1b4a06ac..bc079e5b95 100644 --- a/src/window_title_logo.c +++ b/src/window_title_logo.c @@ -99,8 +99,18 @@ static void window_title_logo_paint() rct_window *w; rct_drawpixelinfo *dpi; + #ifdef _MSC_VER __asm mov w, esi + #else + __asm__ ( "mov %[w], esi " : [w] "+m" (w) ); + #endif + + #ifdef _MSC_VER __asm mov dpi, edi + #else + __asm__ ( "mov %[dpi], edi " : [dpi] "+m" (dpi) ); + #endif + gfx_draw_sprite(dpi, SPR_MENU_LOGO, w->x, w->y); diff --git a/src/window_title_menu.c b/src/window_title_menu.c index 63f3c68e25..087b6cd41e 100644 --- a/src/window_title_menu.c +++ b/src/window_title_menu.c @@ -109,7 +109,12 @@ static void window_title_menu_mouseup() { short widgetIndex; + #ifdef _MSC_VER __asm mov widgetIndex, dx + #else + __asm__ ( "mov %[widgetIndex], dx " : [widgetIndex] "+m" (widgetIndex) ); + #endif + if (widgetIndex == WIDX_START_NEW_GAME) { window_scenarioselect_open(); } else if (widgetIndex == WIDX_CONTINUE_SAVED_GAME) { @@ -123,9 +128,24 @@ static void window_title_menu_mousedown() rct_window *w; rct_widget *widget; + #ifdef _MSC_VER __asm mov widgetIndex, dx + #else + __asm__ ( "mov %[widgetIndex], dx " : [widgetIndex] "+m" (widgetIndex) ); + #endif + + #ifdef _MSC_VER __asm mov w, esi + #else + __asm__ ( "mov %[w], esi " : [w] "+m" (w) ); + #endif + + #ifdef _MSC_VER __asm mov widget, edi + #else + __asm__ ( "mov %[widget], edi " : [widget] "+m" (widget) ); + #endif + if (widgetIndex == WIDX_SHOW_TUTORIAL) { gDropdownItemsFormat[0] = STR_TUTORIAL_BEGINNERS; @@ -159,8 +179,18 @@ static void window_title_menu_dropdown() { short widgetIndex, dropdownIndex; + #ifdef _MSC_VER __asm mov widgetIndex, dx + #else + __asm__ ( "mov %[widgetIndex], dx " : [widgetIndex] "+m" (widgetIndex) ); + #endif + + #ifdef _MSC_VER __asm mov dropdownIndex, ax + #else + __asm__ ( "mov %[dropdownIndex], ax " : [dropdownIndex] "+m" (dropdownIndex) ); + #endif + if (widgetIndex == WIDX_SHOW_TUTORIAL) { tutorial_start(dropdownIndex); @@ -192,8 +222,18 @@ static void window_title_menu_paint() rct_window *w; rct_drawpixelinfo *dpi; + #ifdef _MSC_VER __asm mov w, esi + #else + __asm__ ( "mov %[w], esi " : [w] "+m" (w) ); + #endif + + #ifdef _MSC_VER __asm mov dpi, edi + #else + __asm__ ( "mov %[dpi], edi " : [dpi] "+m" (dpi) ); + #endif + window_draw_widgets(w, dpi); } diff --git a/src/window_title_scenarioselect.c b/src/window_title_scenarioselect.c index b85b39da99..021490dc81 100644 --- a/src/window_title_scenarioselect.c +++ b/src/window_title_scenarioselect.c @@ -173,8 +173,18 @@ static void window_scenarioselect_mouseup() short widgetIndex; rct_window *w; + #ifdef _MSC_VER __asm mov widgetIndex, dx + #else + __asm__ ( "mov %[widgetIndex], dx " : [widgetIndex] "+m" (widgetIndex) ); + #endif + + #ifdef _MSC_VER __asm mov w, esi + #else + __asm__ ( "mov %[w], esi " : [w] "+m" (w) ); + #endif + if (widgetIndex == WIDX_CLOSE) window_close(w); @@ -185,8 +195,18 @@ static void window_scenarioselect_mousedown() short widgetIndex; rct_window *w; + #ifdef _MSC_VER __asm mov widgetIndex, dx + #else + __asm__ ( "mov %[widgetIndex], dx " : [widgetIndex] "+m" (widgetIndex) ); + #endif + + #ifdef _MSC_VER __asm mov w, esi + #else + __asm__ ( "mov %[w], esi " : [w] "+m" (w) ); + #endif + if (widgetIndex >= WIDX_TAB1 && widgetIndex <= WIDX_TAB5) { w->selected_tab = widgetIndex - 4; @@ -205,7 +225,12 @@ static void window_scenarioselect_scrollgetsize() rct_window *w; rct_scenario_basic *scenario; + #ifdef _MSC_VER __asm mov w, esi + #else + __asm__ ( "mov %[w], esi " : [w] "+m" (w) ); + #endif + height = 0; for (i = 0; i < RCT2_GLOBAL(RCT2_ADDRESS_NUM_SCENARIOS, sint32); i++) { @@ -216,8 +241,18 @@ static void window_scenarioselect_scrollgetsize() height += 24; } + #ifdef _MSC_VER __asm mov ecx, 0 + #else + __asm__ ( "mov ecx, 0 " ); + #endif + + #ifdef _MSC_VER __asm mov edx, height + #else + __asm__ ( "mov edx, %[height] " : [height] "+m" (height) ); + #endif + } static void window_scenarioselect_scrollmousedown() @@ -227,9 +262,24 @@ static void window_scenarioselect_scrollmousedown() rct_window *w; rct_scenario_basic *scenario; + #ifdef _MSC_VER __asm mov x, cx + #else + __asm__ ( "mov %[x], cx " : [x] "+m" (x) ); + #endif + + #ifdef _MSC_VER __asm mov y, dx + #else + __asm__ ( "mov %[y], dx " : [y] "+m" (y) ); + #endif + + #ifdef _MSC_VER __asm mov w, esi + #else + __asm__ ( "mov %[w], esi " : [w] "+m" (w) ); + #endif + for (i = 0; i < RCT2_GLOBAL(RCT2_ADDRESS_NUM_SCENARIOS, sint32); i++) { scenario = &(RCT2_GLOBAL(RCT2_ADDRESS_SCENARIO_LIST, rct_scenario_basic*)[i]); @@ -255,9 +305,24 @@ static void window_scenarioselect_scrollmouseover() rct_window *w; rct_scenario_basic *scenario, *selected; + #ifdef _MSC_VER __asm mov x, cx + #else + __asm__ ( "mov %[x], cx " : [x] "+m" (x) ); + #endif + + #ifdef _MSC_VER __asm mov y, dx + #else + __asm__ ( "mov %[y], dx " : [y] "+m" (y) ); + #endif + + #ifdef _MSC_VER __asm mov w, esi + #else + __asm__ ( "mov %[w], esi " : [w] "+m" (w) ); + #endif + selected = NULL; for (i = 0; i < RCT2_GLOBAL(RCT2_ADDRESS_NUM_SCENARIOS, sint32); i++) { @@ -284,7 +349,12 @@ static void window_scenarioselect_invalidate() { rct_window *w; + #ifdef _MSC_VER __asm mov w, esi + #else + __asm__ ( "mov %[w], esi " : [w] "+m" (w) ); + #endif + w->pressed_widgets &= ~(0x10 | 0x20 | 0x40 | 0x80 | 0x100); w->pressed_widgets |= 1LL << (w->selected_tab + 4); @@ -298,8 +368,18 @@ static void window_scenarioselect_paint() rct_widget *widget; rct_scenario_basic *scenario; + #ifdef _MSC_VER __asm mov w, esi + #else + __asm__ ( "mov %[w], esi " : [w] "+m" (w) ); + #endif + + #ifdef _MSC_VER __asm mov dpi, edi + #else + __asm__ ( "mov %[dpi], edi " : [dpi] "+m" (dpi) ); + #endif + window_draw_widgets(w, dpi); @@ -360,8 +440,18 @@ static void window_scenarioselect_scrollpaint() rct_drawpixelinfo *dpi; rct_scenario_basic *scenario; + #ifdef _MSC_VER __asm mov w, esi + #else + __asm__ ( "mov %[w], esi " : [w] "+m" (w) ); + #endif + + #ifdef _MSC_VER __asm mov dpi, edi + #else + __asm__ ( "mov %[dpi], edi " : [dpi] "+m" (dpi) ); + #endif + colour = ((char*)0x0141FC48)[w->colours[1] * 8]; colour = (colour << 24) | (colour << 16) | (colour << 8) | colour; diff --git a/src/window_tooltip.c b/src/window_tooltip.c index 52602d6c41..643671f568 100644 --- a/src/window_tooltip.c +++ b/src/window_tooltip.c @@ -188,8 +188,18 @@ static void window_tooltip_paint() rct_window *w; rct_drawpixelinfo *dpi; + #ifdef _MSC_VER __asm mov w, esi + #else + __asm__ ( "mov %[w], esi " : [w] "+m" (w) ); + #endif + + #ifdef _MSC_VER __asm mov dpi, edi + #else + __asm__ ( "mov %[dpi], edi " : [dpi] "+m" (dpi) ); + #endif + int left = w->x; int top = w->y; diff --git a/src/window_water.c b/src/window_water.c index 55f9493438..17a9fc21fb 100644 --- a/src/window_water.c +++ b/src/window_water.c @@ -130,8 +130,18 @@ static void window_water_mouseup() int limit; short widgetIndex; + #ifdef _MSC_VER __asm mov widgetIndex, dx + #else + __asm__ ( "mov %[widgetIndex], dx " : [widgetIndex] "+m" (widgetIndex) ); + #endif + + #ifdef _MSC_VER __asm mov w, esi + #else + __asm__ ( "mov %[w], esi " : [w] "+m" (w) ); + #endif + switch (widgetIndex) { case WIDX_CLOSE: @@ -184,7 +194,12 @@ static void window_water_invalidate() { rct_window *w; + #ifdef _MSC_VER __asm mov w, esi + #else + __asm__ ( "mov %[w], esi " : [w] "+m" (w) ); + #endif + // Set the preview image button to be pressed down w->pressed_widgets |= (1 << WIDX_PREVIEW); @@ -203,8 +218,18 @@ static void window_water_paint() rct_drawpixelinfo *dpi; int x, y; + #ifdef _MSC_VER __asm mov w, esi + #else + __asm__ ( "mov %[w], esi " : [w] "+m" (w) ); + #endif + + #ifdef _MSC_VER __asm mov dpi, edi + #else + __asm__ ( "mov %[dpi], edi " : [dpi] "+m" (dpi) ); + #endif + window_draw_widgets(w, dpi);