diff --git a/src/Makefile.am b/src/Makefile.am index 043de00..e0c6877 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -2,7 +2,7 @@ bin_PROGRAMS = executor -noinst_PROGRAMS = map_to_c mkseedtables mkultable mksspairtable opfind +noinst_PROGRAMS = map_to_c mkseedtables mkultable mksspairtable ctl_bitmap_c_files = arrow_up_active.c arrow_up_inactive.c \ arrow_down_active.c arrow_down_inactive.c \ @@ -20,10 +20,6 @@ $(ctl_bitmap_c_files) apple.c $(wind_bitmap_c_files): map_to_c .map.c: map_to_c ./map_to_c < $< > $@ -opfind_SOURCES = config/arch/i386/opfind.c - -opfind_CPPFLAGS = -DCOMPILE_FOR_BUILD $(AM_CPPFLAGS) - seedtables.c: mkseedtables ./mkseedtables > $@ @@ -39,7 +35,6 @@ rawpatstubs.c: $(srcdir)/makerawblt.pl $(srcdir)/pat-blitters.tmpl rawsrcstubs.c: $(srcdir)/makerawblt.pl $(srcdir)/src-blitters.tmpl $(PERL) $(srcdir)/makerawblt.pl < $(srcdir)/src-blitters.tmpl > rawsrcstubs.c - ctlArrows.$(OBJEXT): $(ctl_bitmap_c_files) stdmbdf.$(OBJEXT): apple.c qIMIV.$(OBJEXT): seedtables.c @@ -99,7 +94,6 @@ sound_sources = sounddriver.c sound.c soundIMVI.c soundfake.c snth5.c num_sources = bindec.c float4.c float5.c float7.c floatnext.c toolmath.c \ mathlib.c - misc_sources = desk.c device.c disk.c diskinit.c dump.c trapname.c font.c \ gestalt.c globals.c iu.c launch.c main.c mman.c mmansubr.c notify.c hle.c \ osevent.c osutil.c pack.c scrap.c script.c segment.c serial.c setuid.c \ @@ -115,43 +109,22 @@ misc_sources = desk.c device.c disk.c diskinit.c dump.c trapname.c font.c \ emutrap.c emutraptables.c emustubs.c unix_like.c parse.y check_structs.c \ executor.c mkvol/mkvol.c crc.c -front_end_sdl_sources = config/front-ends/sdl/SDL_bmp.c \ - config/front-ends/sdl/sdlevents.c \ - config/front-ends/sdl/sdl_mem.c \ - config/front-ends/sdl/sdlquit.c \ - config/front-ends/sdl/sdlscrap.c \ - config/front-ends/sdl/sdlwin.c \ - config/front-ends/sdl/sdlwm.c \ - config/front-ends/sdl/sdlX.c \ - config/front-ends/sdl/syswm_map.c \ - config/front-ends/sdl/winmain.c +AM_CPPFLAGS=-I$(srcdir)/include -I$(srcdir)/config/front-ends/$(front_end) -I$(srcdir)/config/os/$(host_os) -I$(srcdir)/config/arch/$(host_cpu) -sound_sdl_sources = config/sound/sdl/sdl-sound.c +if CONFIG_ARCH_ALPHA +arch_sources = config/arch/alpha/alpha.c +endif CONFIG_ARCH_ALPHA -os_linux_sources = config/os/linux/linux.c \ - config/os/linux/linux_except.c \ - config/os/linux/lowglobals-mem.c +if CONFIG_ARCH_I386 -arch_alpha_sources = config/arch/alpha/alpha.c +noinst_PROGRAMS += opfind -arch_i386_sources = config/arch/i386/x86patblt.S \ - config/arch/i386/x86srcblt.S \ - config/arch/i386/xdstubtables.c \ - config/arch/i386/sbstubtables.c \ - config/arch/i386/i386.c +CLEANFILES += src-blitters.h src-blitters.s pat-blitters.h pat-blitters.s \ + asmsamples.h src-blitters-stamp pat-blitters-stamp -# TODO: If we ever support the m68k target again we'll need to make it so that -# we build m68k-callback-stubs.s +opfind_SOURCES = config/arch/i386/opfind.c -arch_m68k_sources = config/arch/m68k/m68k.c \ - config/arch/m68k/m68k-callback.c \ - config/arch/m68k/m68k-callback-handler.s \ - config/arch/m68k/m68k-call-emulator.s \ - config/arch/m68k/m68k-destroy.c \ - config/arch/m68k/m68k-stack.c \ - config/arch/m68k/m68k-trap-handler.s \ - config/arch/m68k/trap.S \ - config/arch/m68k/m68k-callback-stubs.s +opfind_CPPFLAGS = -DCOMPILE_FOR_BUILD $(AM_CPPFLAGS) x86patblt.$(OBJEXT): pat-blitters.s @@ -185,12 +158,193 @@ src-blitters-stamp src-blitters.h src-blitters.s: \ $(RM) opfind touch src-blitters-stamp -executor_SOURCES = $(ctl_sources) $(dial_sources) $(file_sources) \ - $(hfs_sources) $(list_sources) $(menu_sources) \ - $(print_sources) $(qd_sources) $(res_sources) \ - $(te_sources) $(wind_sources) $(ae_sources) \ - $(sound_sources) $(num_sources) $(misc_sources) \ - $(front_end_sdl_sources) $(sound_sdl_sources) \ - $(os_linux_sources) $(arch_i386_sources) +arch_sources = config/arch/i386/x86patblt.S \ + config/arch/i386/x86srcblt.S \ + config/arch/i386/xdstubtables.c \ + config/arch/i386/sbstubtables.c \ + config/arch/i386/i386.c -AM_CPPFLAGS=-I$(srcdir)/include -I$(srcdir)/config/front-ends/$(front_end) -I$(srcdir)/config/os/$(host_os) -I$(srcdir)/config/arch/$(host_cpu) +endif CONFIG_ARCH_I386 + +if CONFIG_ARCH_M68K + +arch_sources = config/arch/m68k/m68k.c \ + config/arch/m68k/m68k-callback.c \ + config/arch/m68k/m68k-callback-handler.s \ + config/arch/m68k/m68k-call-emulator.s \ + config/arch/m68k/m68k-destroy.c \ + config/arch/m68k/m68k-stack.c \ + config/arch/m68k/m68k-trap-handler.s \ + config/arch/m68k/trap.S \ + config/arch/m68k/m68k-callback-stubs.s + +max_callbacks=4352 # 4096 plus extra slop + +m68k-callback-stubs.s: config/arch/m68k/make_callback_stubs.pl \ + config/arch/m68k/m68k-callback-handler.s + $(srcdir)/config/arch/m68k/make_callback_stubs.pl $(max_callbacks)\ + $(srcdir)/config/arch/m68k/m68k-callback-handler.s\ + ./m68k-callback-stubs.s + +# Right now we need -DNUM_CALLBACK_SLOTS on the command line when compiling +# m68k-callback.o, but I don't know of an elegant way to do this with automake. +# Since the m68k build is unlikely to work anytime soon, I'll just leave this +# code from our old build system here, but commented out. This will fail, but +# at least it will give anyone playing with the 68k build a hint. +# +# m68k-callback.o: m68k-callback.c +# $(BUILD_GCC) $(BUILD_CFLAGS) -DNUM_CALLBACK_SLOTS=$(max_callbacks)\ +# $(HOST_ARCH_DIR)/m68k-callback.c -c -o m68k-callback.o + +endif CONFIG_ARCH_M68K + +if CONFIG_ARCH_POWERPC + +# NOTE: we used to be able to use -mcall-aix when compiling ppc_stubs and +# get the compiler to help us run PPC binaries. That ability hasn't +# worked since we started doing PPC builds on Mac OS X. + +arch_sources = powerpc.c ppc_call.c ppc_stubs.c +AM_CPPFLAGS += -D_GNU_SOURCE +endif CONFIG_ARCH_POWERPC + +if CONFIG_FRONT_END_DOS +# The DOS port of Executor hasn't ever been built using automake. Most likely +# we'll rip all the DOS support out of the code before ever making it go, but +# if you're adventurous and want to play, feel free. + +front_end_sources = config/front-ends/dos/dosclip.c \ + config/front-ends/dos/dosdisk.c \ + config/front-ends/dos/dosevents.c \ + config/front-ends/dos/vga.c \ + config/front-ends/dos/aspi.c \ + config/front-ends/dos/dosevq.c \ + config/front-ends/dos/dpmilock.c \ + config/front-ends/dos/deintr.S \ + config/front-ends/dos/dosmem.c \ + config/front-ends/dos/dosserial.c \ + vgavdriver.c + +METAASM_ARGS = -define 'DST_SEG=%es:' + +endif CONFIG_FRONT_END_DOS + +if CONFIG_FRONT_END_NEXTSTEP +# It seems really unlikely that anyone will be building the NEXTSTEP version +# of Executor again, especially with the new GNU Build system. Should you +# really wish to try, look at the Executor source on Github and look for the +# config/front-ends/nextstep directory for source and nextstep.make to see +# the source we used to use as well as some linker flags. +endif CONFIG_FRONT_END_NEXTSTEP + +if CONFIG_FRONT_END_SDL + +front_end_sources = config/front-ends/sdl/SDL_bmp.c \ + config/front-ends/sdl/sdlevents.c \ + config/front-ends/sdl/sdl_mem.c \ + config/front-ends/sdl/sdlquit.c \ + config/front-ends/sdl/sdlscrap.c \ + config/front-ends/sdl/sdlwin.c \ + config/front-ends/sdl/sdlwm.c \ + config/front-ends/sdl/sdlX.c \ + config/front-ends/sdl/syswm_map.c \ + config/front-ends/sdl/winmain.c +endif CONFIG_FRONT_END_SDL + +if CONFIG_FRONT_END_SVGALIB +# This is unlikely to work. Nobody has built the svgalib version of Executor +# in a long time. + +front_end_sources = config/front-ends/svgalib/svgalib.c \ + config/front-ends/svgalib/svgalibevent.c \ + vgavdriver.c + +endif CONFIG_FRONT_END_SVGALIB + +if CONFIG_FRONT_END_WIN32 +# This too is unlikely to work. I believe we stopped working on the win32 +# port when Sam created SDL. + +front_end_sources = config/front-ends/win32/winevents.c \ + config/front-ends/win32/wincursor.c \ + config/front-ends/win32/windriver.c + +endif CONFIG_FRONT_END_WIN32 + +if CONFIG_FRONT_END_X + +front_end_sources = config/front-ends/x/x.c config/front-ends/x/x_keycodes.c +HAVE_IV = yes + +endif CONFIG_FRONT_END_X + +if CONFIG_HOST_ALPHA_DEC_OSF +host_sources = config/hosts/alpha-dec-osf/alpha-lowglobals-mem.c +else !CONFIG_HOST_ALPHA_DEC_OSF +host_sources = +endif !CONFIG_HOST_ALPHA_DEC_OSF + +if CONFIG_OS_CYGWIN32 +os_sources = config/os/cygwin32/cygwin32.c \ + config/os/cygwin32/winfs.c \ + config/os/cygwin32/win_disk.c \ + config/os/cygwin32/win_stat.c \ + config/os/cygwin32/win_memory.c \ + config/os/cygwin32/win_serial.c \ + config/os/cygwin32/win_ntcd.c \ + config/os/cygwin32/win_print.c \ + config/os/cygwin32/win_beep.c \ + config/os/cygwin32/win_cookie.c \ + config/os/cygwin32/win_clip.c \ + config/os/cygwin32/win_temp.c \ + config/os/cygwin32/win_except.c \ + config/os/cygwin32/win_time.c \ + config/os/cygwin32/win_dongle.c \ + config/os/cygwin32/win_queue.c \ + config/os/cygwin32/win_screen.c \ + config/os/cygwin32/win_vxdiface.c \ + config/os/cygwin32/win_keyboard.c \ + config/os/cygwin32/win_launch.c \ + config/os/cygwin32/win_stdfile.c + +bin_PROGRAMS += exemove +endif CONFIG_OS_CYGWIN32 + + +if CONFIG_OS_LINUX +os_sources = config/os/linux/linux.c \ + config/os/linux/linux_except.c \ + config/os/linux/lowglobals-mem.c +endif CONFIG_OS_LINUX + +if CONFIG_OS_MSDOS +os_sources = config/os/msdos/msdos.c \ + config/os/msdos/dpmimem.c \ + config/os/msdos/dpmicall.c \ + config/os/msdos/openmany.c \ + config/os/msdos/rmint70.S +endif CONFIG_OS_MSDOS + +if CONFIG_OS_NEXT +os_sources = next.c +endif CONFIG_OS_NEXT + +if CONFIG_SOUND_DJGPP +sound_sources += config/sound/djgpp/djgpp-sound.c +endif CONFIG_SOUND_DJGPP + +if CONFIG_SOUND_LINUX +sound_sources += config/sound/linux/linux-sound.c +endif CONFIG_SOUND_LINUX + +if CONFIG_SOUND_SDL +sound_sources += config/sound/sdl/sdl-sound.c +endif CONFIG_SOUND_SDL + +executor_SOURCES = $(ctl_sources) $(dial_sources) $(file_sources) \ + $(hfs_sources) $(list_sources) $(menu_sources) \ + $(print_sources) $(qd_sources) $(res_sources) \ + $(te_sources) $(wind_sources) $(ae_sources) \ + $(sound_sources) $(num_sources) $(misc_sources) \ + $(arch_sources) $(front_end_sources) $(host_sources) \ + $(os_sources) diff --git a/src/TODO b/src/TODO index 75aa986..39641a5 100644 --- a/src/TODO +++ b/src/TODO @@ -1,16 +1,9 @@ GNU build fixes - stuff is being left behind + can clean up a bunch of repeated partial paths by making + things like archdir=config/arch/$host_arch - {src,pat}-blitters.{h,s} - asmsamples.h - parse.c - - Make it so people can select the front-end and the - sound, but that we default to SDL if it's available - - Make it so if we don't find libsyn68k, we die properly - (unless we're on a 68k) + figure out how to deal with -framework for mac os x port See if there's a more elegant solution to the blitters code (can we nuke the config/arch/i386 prefixes in the @@ -19,12 +12,6 @@ test parallel builds - Add in as much for the targets we don't currently have - a machine for as possible - - arch/alpha - arch/m68k - CToPascalCall -- look hard for arguments that sometimes take a pointer and sometimes take a long diff --git a/src/config/front-ends/nextstep/MacViewClass.m b/src/config/front-ends/nextstep/MacViewClass.m index 3063d99..139df2b 100644 --- a/src/config/front-ends/nextstep/MacViewClass.m +++ b/src/config/front-ends/nextstep/MacViewClass.m @@ -754,7 +754,7 @@ vdriver_set_colors (int first_color, int num_colors, const ColorSpec *colors) num_colors * sizeof colors[0]); conversion_func = NULL; /* Invalidate old conversion stuff. */ repaint_screen (); - vdriver_flush_display (); /* Make sure changed colors are visible. */ + vdriver_flush_display(); /* Make sure changed colors are visible. */ } } diff --git a/src/config/hosts/alpha-dec-osf/lowglobals-mem.c b/src/config/hosts/alpha-dec-osf/alpha-lowglobals-mem.c similarity index 100% rename from src/config/hosts/alpha-dec-osf/lowglobals-mem.c rename to src/config/hosts/alpha-dec-osf/alpha-lowglobals-mem.c diff --git a/src/configure.ac b/src/configure.ac index 54407f2..96b3781 100644 --- a/src/configure.ac +++ b/src/configure.ac @@ -20,8 +20,6 @@ AC_GNU_SOURCE AC_SYS_LARGEFILE -AC_CHECK_LIB(syn68k, initialize_68k_emulator) - # Normalize to our old names case ${build_cpu} in @@ -54,27 +52,63 @@ case ${host_os} in ;; esac -# This is a temporary cheat that forces us to use SDL. +# Check for libraries -front_end=sdl -sound_config=sdl - -# end of cheat - -AC_ARG_WITH(front-end, [AS_HELP_STRING([--with-front-end=arg], [arg must be sdl or x (default is sdl)])]) -AC_ARG_WITH(sound, [AS_HELP_STRING([--with-sound=arg], [arg must be linux or sdl (default is sdl)])]) - -# Right now we blindly look for the libraries we need for the SDL Linux -# port since that's the first one I'll get going with the this file. +if test x$host_cpu != xm68k; then + AC_CHECK_LIB(syn68k, initialize_68k_emulator,,[AC_MSG_ERROR([Can't build Executor for $host_cpu without Syn68k])]) +fi AC_CHECK_LIB(SDL, SDL_Init) -AC_CHECK_LIB(db, __db_ndbm_open) AC_CHECK_LIB(X11, XInitThreads) + +AC_ARG_WITH(front-end, + [AS_HELP_STRING([--with-front-end=arg], + [arg must be sdl or x (default is sdl)])], + [front_end="$withval"], + [if test x"$ac_cv_lib_SDL_SDL_Init" = xyes; then + front_end=sdl + elif test x"$ac_cv_lib_X11_XInitThreads" = xyes; then + front_end=x + else + AC_MSG_ERROR([Must use --with-front-end=sdl or --with-front-end=x]) + fi]) + +if test x$front_end = xsvgalib; then + AC_CHECK_LIB(vga, vga_setmode,,[AC_MSG_ERROR([Can't build Executor with the SVGAlib front-end without svgalib])]) +fi + +if test x$front_end = xx; then + AC_CHECK_LIB(Xext, XShmPutImage,,[AC_MSG_ERROR([Can't build Executor with the X front-end without libXext])]) +fi + +AC_ARG_WITH(sound, + [AS_HELP_STRING([--with-sound=arg], + [arg must be linux or sdl (default is sdl)])], + [sound_config="$withval"], + [if test x"$ac_cv_lib_SDL_SDL_Init" = xyes; then + sound_config=sdl + elif test x"$host_os" = xxlinux; then + sound_config=linux + else + AC_MSG_ERROR([Must use --with-sound=sdl or --with-sound=x]) + fi]) + +if test x$host_os = xcygwin32; then + # None of this is tested yet + AC_CHECK_LIB(dxguid, GUID_Valid_Start_Time) + AC_CHECK_LIB(winmm, OpenDriver) + AC_CHECK_LIB(gdi32, CreateDIBitmap) + AC_CHECK_LIB(user32, OpenClipboard) +fi + +if test x"$sound_config" = xsdl; then + AC_CHECK_LIB(pthread, pthread_create) +fi + +AC_CHECK_LIB(db, __db_ndbm_open) AC_CHECK_LIB(m, pow) - - AC_SUBST(host_cpu) AC_SUBST(host_os) AC_SUBST(front_end) @@ -87,6 +121,37 @@ AC_CONFIG_LINKS([build-arch-config.h:config/arch/$build_cpu/$build_cpu.h front-end-config.h:config/front-ends/$front_end/$front_end.h sound-config.h:config/sound/$sound_config/$sound_config-sound.h]) +# Many of the config options here have not actually been made to work since +# we converted to the modern GNU build system. + +AM_CONDITIONAL([CONFIG_ARCH_ALPHA], [test x$host_cpu = xalpha]) +AM_CONDITIONAL([CONFIG_ARCH_I386], [test x$host_cpu = xi386]) +AM_CONDITIONAL([CONFIG_ARCH_M68K], [test x$host_cpu = xm68k]) +AM_CONDITIONAL([CONFIG_ARCH_POWERPC], [test x$host_cpu = xpowerpc]) + +AM_CONDITIONAL([CONFIG_FRONT_END_DOS], [test x$front_end = xdos]) +AM_CONDITIONAL([CONFIG_FRONT_END_NEXTSTEP], [test x$front_end = xnextstep]) +AM_CONDITIONAL([CONFIG_FRONT_END_SDL], [test x$front_end = xsdl]) +AM_CONDITIONAL([CONFIG_FRONT_END_SVGALIB], [test x$front_end = xsvgalib]) +AM_CONDITIONAL([CONFIG_FRONT_END_WIN32], [test x$front_end = xwin32]) +AM_CONDITIONAL([CONFIG_FRONT_END_X], [test x$front_end = xx]) + +AM_CONDITIONAL([CONFIG_HOST_ALPHA_DEC_OSF], [false]) +AM_CONDITIONAL([CONFIG_HOST_I386_MSDOS_GO32], [test x$host_os = xmsdos]) +AM_CONDITIONAL([CONFIG_HOST_I486_LINUX], [false]) +AM_CONDITIONAL([CONFIG_HOST_I486_NEXT_NS3], [test x$host_os = xnext -a x$host_cpu = xi386]) +AM_CONDITIONAL([CONFIG_HOST_M68K_NEXT_NS3], [test x$host_os = xnext -a x$host_cpu = xm68k]) + +AM_CONDITIONAL([CONFIG_OS_CYGWIN32], [test x$host_os = xcygwin32]) +AM_CONDITIONAL([CONFIG_OS_LINUX], [test x$host_os = xlinux]) +AM_CONDITIONAL([CONFIG_OS_MACOSX], [test x$host_os = xmacosx]) +AM_CONDITIONAL([CONFIG_OS_MSDOS], [test x$host_os = xmsdos]) +AM_CONDITIONAL([CONFIG_OS_NEXT], [test x$host_os = xnext]) + +AM_CONDITIONAL([CONFIG_SOUND_DJGPP], [test x$sound_config = xdjgpp]) +AM_CONDITIONAL([CONFIG_SOUND_LINUX], [test x$sound_config = xlinux]) +AM_CONDITIONAL([CONFIG_SOUND_SDL], [test x$sound_config = xsdl]) + AC_CONFIG_FILES([Makefile]) AC_OUTPUT diff --git a/src/prLowLevel.c b/src/prLowLevel.c index 329b6fa..8448ead 100644 --- a/src/prLowLevel.c +++ b/src/prLowLevel.c @@ -438,7 +438,7 @@ update_port (DialogPtr dp) EraseRect (&r); HideDItem (dp, LAYOUT_PORT_LABEL_NO); HideDItem (dp, LAYOUT_PORT_MENU_NO); - vdriver_flush_display (); + vdriver_flush_display(); #endif ShowDItem (dp, LAYOUT_FILENAME_LABEL_NO); if (!filename_chosen_p) @@ -467,7 +467,7 @@ update_port (DialogPtr dp) HideDItem (dp, LAYOUT_PORT_MENU_NO); HideDItem (dp, LAYOUT_FILENAME_LABEL_NO); HideDItem (dp, LAYOUT_FILENAME_NO); - vdriver_flush_display (); + vdriver_flush_display(); print_where = PRINT_TO_WIN32; } } @@ -488,7 +488,7 @@ update_port (DialogPtr dp) InvalRect (&r); } #else - vdriver_flush_display (); + vdriver_flush_display(); #endif print_where = PRINT_TO_PORT; } diff --git a/src/qCursor.c b/src/qCursor.c index fc634ef..1648367 100644 --- a/src/qCursor.c +++ b/src/qCursor.c @@ -58,7 +58,7 @@ cursor_debug (const uint8 *datap, const uint8 *maskp, int hot_x, int hot_y) } dirty_rect_accrue (0, 0, 16, 16); dirty_rect_update_screen (); - vdriver_flush_display (); + vdriver_flush_display(); } #define HOST_SET_CURSOR(d,m,x,y) \ diff --git a/src/qStdRgn.c b/src/qStdRgn.c index 51e207d..411bf63 100644 --- a/src/qStdRgn.c +++ b/src/qStdRgn.c @@ -225,7 +225,7 @@ ROMlib_blt_rgn_update_dirty_rect if (ROMlib_when == WriteInBltrgn) { dirty_rect_update_screen (); - vdriver_flush_display (); + vdriver_flush_display(); } } @@ -367,7 +367,7 @@ blt_pattern_to_bitmap_simple_mode (RgnHandle rh, INTEGER mode, if (ROMlib_when == WriteInBltrgn) { dirty_rect_update_screen (); - vdriver_flush_display (); + vdriver_flush_display(); } } } @@ -480,7 +480,7 @@ blt_pixpat_to_pixmap_simple_mode (RgnHandle rh, INTEGER mode, if (ROMlib_when == WriteInBltrgn) { dirty_rect_update_screen (); - vdriver_flush_display (); + vdriver_flush_display(); } } } @@ -643,7 +643,7 @@ blt_fancy_pat_mode_to_pixmap (RgnHandle rh, int mode, if (ROMlib_when == WriteInBltrgn) { dirty_rect_update_screen (); - vdriver_flush_display (); + vdriver_flush_display(); } } diff --git a/src/splash.c b/src/splash.c index cd64dd6..2af4178 100644 --- a/src/splash.c +++ b/src/splash.c @@ -176,7 +176,7 @@ splash_screen_display (boolean_t button_p, char *basename) } vdriver_update_screen (0, 0, vdriver_height, vdriver_width, FALSE); - vdriver_flush_display (); + vdriver_flush_display(); return TRUE; }