diff options
-rw-r--r-- | CMakeLists.txt | 8 | ||||
-rwxr-xr-x | cmake/djgpp/djgpp-cmake.sh | 31 | ||||
-rw-r--r-- | cmake/djgpp/toolchain-djgpp.cmake | 27 | ||||
-rw-r--r-- | utils/adlmidi-2/input.hpp | 1 | ||||
-rw-r--r-- | utils/adlmidi-2/midiplay.cc | 73 |
5 files changed, 108 insertions, 32 deletions
diff --git a/CMakeLists.txt b/CMakeLists.txt index d1ae802..266d0fa 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -27,7 +27,7 @@ if(MSVC) ENDIF() # -fPIC thing -IF(NOT WIN32) +IF(NOT WIN32 AND NOT DJGPP) set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fPIC") set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fPIC") ENDIF() @@ -196,13 +196,13 @@ if(WITH_MIDIPLAY) endif() if(WITH_ADLMIDI2) - if(NOT WIN32) + if(NOT WIN32 AND NOT DJGPP) find_library(SDL2_LIBRARY SDL2 REQUIRED) include_directories(${SDL2_INCLUDE_DIR}) message("Found ${SDL2_LIBRARY}") endif() - if(NOT WIN32) + if(NOT WIN32 AND NOT DJGPP) set(ADLMIDI2_HAS_PUZZLE_GAME "TRUE") set(ADLMIDI2_VIDEO_OUT_SUPPORT "TRUE") endif() @@ -228,6 +228,8 @@ if(WITH_ADLMIDI2) if(WIN32) target_link_libraries(adlmidi2 ADLMIDI winmm) + elseif(DJGPP) + target_link_libraries(adlmidi2 ADLMIDI) else() target_link_libraries(adlmidi2 ADLMIDI ${SDL2_LIBRARY} pthread dl m stdc++) endif() diff --git a/cmake/djgpp/djgpp-cmake.sh b/cmake/djgpp/djgpp-cmake.sh new file mode 100755 index 0000000..7b4fab6 --- /dev/null +++ b/cmake/djgpp/djgpp-cmake.sh @@ -0,0 +1,31 @@ +#!/bin/bash +djgpp_prefix=/usr/local/djgpp + +# export PKG_CONFIG_LIBDIR="${djgpp_prefix}/lib/pkgconfig" + +# djgpp_c_flags="-O2 -g -pipe -Wall -Wp,-D_FORTIFY_SOURCE=2 -fexceptions --param=ssp-buffer-size=4" +# export CFLAGS="$djgpp_c_flags" +# export CXXFLAGS="$djgpp_c_flags" + +CUSTOM_PATH=/home/vitaly/_git_repos/libADLMIDI/cmake/djgpp:${djgpp_prefix}/bin:/usr/local/djgpp/libexec/gcc/i586-pc-msdosdjgpp/7.2.0:$PATH + +if [[ "$1" != '--build' ]]; then + echo "KEK [${CUSTOM_PATH}]" + + PATH=${CUSTOM_PATH} cmake \ + -DCMAKE_INSTALL_PREFIX:PATH=${djgpp_prefix} \ + -DCMAKE_INSTALL_LIBDIR:PATH=${djgpp_prefix}/lib \ + -DINCLUDE_INSTALL_DIR:PATH=${djgpp_prefix}/include \ + -DLIB_INSTALL_DIR:PATH=${djgpp_prefix}/lib \ + -DSYSCONF_INSTALL_DIR:PATH=${djgpp_prefix}/etc \ + -DSHARE_INSTALL_DIR:PATH=${djgpp_prefix}/share \ + -DBUILD_SHARED_LIBS:BOOL=OFF \ + -DCMAKE_TOOLCHAIN_FILE=/home/vitaly/_git_repos/libADLMIDI/cmake/djgpp/toolchain-djgpp.cmake \ + "$@" + +else + PATH=${CUSTOM_PATH} cmake "$@" +fi + +#-DCMAKE_CROSSCOMPILING_EMULATOR=/usr/bin/i686-pc-msdosdjgpp-wine + diff --git a/cmake/djgpp/toolchain-djgpp.cmake b/cmake/djgpp/toolchain-djgpp.cmake new file mode 100644 index 0000000..3186b4f --- /dev/null +++ b/cmake/djgpp/toolchain-djgpp.cmake @@ -0,0 +1,27 @@ +set (CMAKE_SYSTEM_NAME linux-djgpp) + +set (DJGPP TRUE) + +# specify the cross compiler +set (CMAKE_C_COMPILER /usr/local/djgpp/bin/i586-pc-msdosdjgpp-gcc) +set (CMAKE_CXX_COMPILER /usr/local/djgpp/bin/i586-pc-msdosdjgpp-g++) + +# where is the target environment +set (CMAKE_FIND_ROOT_PATH /usr/local/djgpp) + +# search for programs in the build host directories +set (CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER) +# for libraries and headers in the target directories +set (CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY) +set (CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY) +set (CMAKE_FIND_ROOT_PATH_MODE_PACKAGE ONLY) + +# Make sure Qt can be detected by CMake +set (QT_BINARY_DIR /usr/local/djgpp/bin /usr/bin) +set (QT_INCLUDE_DIRS_NO_SYSTEM ON) + +# These are needed for compiling lapack (RHBZ #753906) +set (CMAKE_Fortran_COMPILER /usr/local/djgpp/bin/i586-pc-msdosdjgpp-gfortran) +set (CMAKE_AR:FILEPATH /usr/local/djgpp/bin/i586-pc-msdosdjgpp-ar) +set (CMAKE_RANLIB:FILEPATH /usr/local/djgpp/bin/i586-pc-msdosdjgpp-ranlib) + diff --git a/utils/adlmidi-2/input.hpp b/utils/adlmidi-2/input.hpp index dba4229..59f7f8c 100644 --- a/utils/adlmidi-2/input.hpp +++ b/utils/adlmidi-2/input.hpp @@ -17,6 +17,7 @@ #include <dpmi.h> #include <go32.h> #include <sys/farptr.h> +#include <sys/exceptn.h> #include <dos.h> #include <stdlib.h> #define BIOStimer _farpeekl(_dos_ds, 0x46C) diff --git a/utils/adlmidi-2/midiplay.cc b/utils/adlmidi-2/midiplay.cc index f3b4cde..843f4d7 100644 --- a/utils/adlmidi-2/midiplay.cc +++ b/utils/adlmidi-2/midiplay.cc @@ -207,6 +207,22 @@ public: bool cursor_visible; char stderr_buffer[256]; public: +#ifdef __DJGPP__ +# define RawPrn cprintf +#else + static void RawPrn(const char *fmt, ...) ATTRIBUTE_FORMAT_PRINTF(1, 2) + { + // Note: should essentially match PutC, except without updates to x + va_list ap; + va_start(ap, fmt); + vfprintf(stderr, fmt, ap); + va_end(ap); + #ifdef _WIN32 + fflush(stderr); + #endif + } +#endif + UserInterface(): #ifdef SUPPORT_PUZZLE_GAME player(2), @@ -387,22 +403,6 @@ public: ++x; // One letter drawn. Update cursor position. } -#ifdef __DJGPP__ -# define RawPrn cprintf -#else - static void RawPrn(const char *fmt, ...) ATTRIBUTE_FORMAT_PRINTF(1, 2) - { - // Note: should essentially match PutC, except without updates to x - va_list ap; - va_start(ap, fmt); - vfprintf(stderr, fmt, ap); - va_end(ap); - #ifdef _WIN32 - fflush(stderr); - #endif - } -#endif - int Print(unsigned beginx, unsigned color, bool ln, const char *fmt, va_list ap) { char Line[1024]; @@ -1411,7 +1411,11 @@ static void SendStereoAudio(unsigned long count, short *samples) static void TidyupAndExit(int sig) { - if(sig == SIGINT) + if((sig == SIGINT) + #ifdef __DJGPP__ + || (sig == SIGQUIT) + #endif + ) { UI.ShowCursor(); UI.Color(7); @@ -1574,6 +1578,7 @@ int main(int argc, char **argv) std::fflush(stderr); signal(SIGINT, TidyupAndExit); + __djgpp_set_ctrl_c(1); if(argc < 2 || std::string(argv[1]) == "--help" || std::string(argv[1]) == "-h") { @@ -1855,7 +1860,9 @@ int main(int argc, char **argv) AdlInstrumentTester InstrumentTester(myDevice); //static std::vector<int> sample_buf; - //double delay = 0.0; + #ifdef __DJGPP__ + double tick_delay = 0.0; + #endif //sample_buf.resize(1024); short buff[1024]; @@ -1961,9 +1968,17 @@ int main(int argc, char **argv) QuitFlag = true; #ifdef __DJGPP__ else - delay = adl_tickEvents(myDevice, eat_delay, mindelay); + tick_delay = adl_tickEvents(myDevice, eat_delay, mindelay); #endif } + #ifdef __DJGPP__ + else + { + tick_delay = adl_tickEvents(myDevice, eat_delay, mindelay); + if(adl_atEnd(myDevice) && tick_delay <= 0) + QuitFlag = true; + } + #endif //: player.Tick(eat_delay, mindelay); UI.GotoXY(0, 0); @@ -1973,11 +1988,10 @@ int main(int argc, char **argv) * TODO: Implement the public "tick()" function for the Hardware OPL3 chip support on DJGPP */ - //delay = nextdelay; + //tick_delay = nextdelay; } #ifdef __DJGPP__ - // Fix the skewed clock and reset BIOS tick rate _farpokel(_dos_ds, 0x46C, BIOStimer_begin + (BIOStimer - BIOStimer_begin) @@ -1988,8 +2002,10 @@ int main(int argc, char **argv) outportb(0x40, 0); //enable(); + UI.Color(7); + clrscr(); + std::printf("Bye!\n"); #else - #ifdef _WIN32 WindowsAudio::Close(); #else @@ -2002,13 +2018,12 @@ int main(int argc, char **argv) if(FakeDOSshell) { - fprintf(stderr, - "Going TSR. Type 'EXIT' to return to ADLMIDI.\n" - "\n" - /*"Megasoft(R) Orifices 98\n" - " (C)Copyright Megasoft Corp 1981 - 1999.\n"*/ - "" - ); + std::fprintf(stderr, + "Going TSR. Type 'EXIT' to return to ADLMIDI.\n" + "\n" + /*"Megasoft(R) Orifices 98\n" + " (C)Copyright Megasoft Corp 1981 - 1999.\n"*/ + ""); } return 0; } |