From 1e4d40e112635eda8abe05e070ef94bbfb14b1e3 Mon Sep 17 00:00:00 2001 From: meepingsnesroms Date: Thu, 26 Apr 2018 22:57:00 -0700 Subject: [PATCH] Clean up Qt GUI, remove old unused buttons, add android icons Also make more android friendly since its the main target platform. --- qtBuildSystem/Mu/Mu.pro | 13 +- qtBuildSystem/Mu/Mu.pro.user | 640 ++++++++--------- .../AndroidManifest.xml | 18 +- qtBuildSystem/Mu/android/build.gradle | 57 ++ qtBuildSystem/Mu/android/gradle.properties | 9 + qtBuildSystem/Mu/android/gradle.properties~ | 9 + .../android/gradle/wrapper/gradle-wrapper.jar | Bin 0 -> 54213 bytes .../gradle/wrapper/gradle-wrapper.properties | 6 + qtBuildSystem/Mu/android/gradlew | 172 +++++ qtBuildSystem/Mu/android/gradlew.bat | 84 +++ qtBuildSystem/Mu/android/local.properties | 6 + qtBuildSystem/Mu/android/local.properties~ | 6 + .../res/drawable-hdpi/icon.png | Bin .../res/drawable-ldpi/icon.png | Bin .../res/drawable-mdpi/icon.png | Bin qtBuildSystem/Mu/android/res/values/libs.xml | 25 + qtBuildSystem/Mu/mainwindow.cpp | 50 +- qtBuildSystem/Mu/mainwindow.h | 9 - qtBuildSystem/Mu/mainwindow.ui | 642 +++++++----------- qtBuildSystem/Mu/touchscreen.cpp | 2 +- src/emulator.c | 5 + unimplementedFeatures.txt | 3 + 22 files changed, 987 insertions(+), 769 deletions(-) rename qtBuildSystem/Mu/{android-resources => android}/AndroidManifest.xml (94%) create mode 100644 qtBuildSystem/Mu/android/build.gradle create mode 100644 qtBuildSystem/Mu/android/gradle.properties create mode 100644 qtBuildSystem/Mu/android/gradle.properties~ create mode 100644 qtBuildSystem/Mu/android/gradle/wrapper/gradle-wrapper.jar create mode 100644 qtBuildSystem/Mu/android/gradle/wrapper/gradle-wrapper.properties create mode 100755 qtBuildSystem/Mu/android/gradlew create mode 100644 qtBuildSystem/Mu/android/gradlew.bat create mode 100644 qtBuildSystem/Mu/android/local.properties create mode 100644 qtBuildSystem/Mu/android/local.properties~ rename qtBuildSystem/Mu/{android-resources => android}/res/drawable-hdpi/icon.png (100%) rename qtBuildSystem/Mu/{android-resources => android}/res/drawable-ldpi/icon.png (100%) rename qtBuildSystem/Mu/{android-resources => android}/res/drawable-mdpi/icon.png (100%) create mode 100644 qtBuildSystem/Mu/android/res/values/libs.xml diff --git a/qtBuildSystem/Mu/Mu.pro b/qtBuildSystem/Mu/Mu.pro index 186a01e..d29c5ec 100644 --- a/qtBuildSystem/Mu/Mu.pro +++ b/qtBuildSystem/Mu/Mu.pro @@ -109,7 +109,18 @@ DISTFILES += \ images/right.png \ images/up.png \ images/todo.png \ - android-resources/AndroidManifest.xml + android/AndroidManifest.xml \ + android/gradle/wrapper/gradle-wrapper.jar \ + android/gradlew \ + android/res/values/libs.xml \ + android/build.gradle \ + android/gradle/wrapper/gradle-wrapper.properties \ + android/gradlew.bat \ + android/res/drawable-hdpi/icon.png \ + android/res/drawable-ldpi/icon.png \ + android/res/drawable-mdpi/icon.png RESOURCES += \ mainwindow.qrc + +ANDROID_PACKAGE_SOURCE_DIR = $$PWD/android diff --git a/qtBuildSystem/Mu/Mu.pro.user b/qtBuildSystem/Mu/Mu.pro.user index 73c696d..d3c9c47 100644 --- a/qtBuildSystem/Mu/Mu.pro.user +++ b/qtBuildSystem/Mu/Mu.pro.user @@ -1,6 +1,6 @@ - + EnvironmentId @@ -8,7 +8,7 @@ ProjectExplorer.Project.ActiveTarget - 1 + 0 ProjectExplorer.Project.EditorSettings @@ -58,6 +58,324 @@ ProjectExplorer.Project.Target.0 + + Android for armeabi-v7a (GCC 4.9, Qt 5.10.1 for Android armv7) + Android for armeabi-v7a (GCC 4.9, Qt 5.10.1 for Android armv7) + {d2003381-5fc1-4ec6-a72e-166645e4f708} + 1 + 0 + 0 + + /Users/Hoppy/Desktop/projects/PalmEmuRedo/libretro-palmm515emu/qtBuildSystem/build-Mu-Android_for_armeabi_v7a_GCC_4_9_Qt_5_10_1_for_Android_armv7-Debug + + + true + qmake + + QtProjectManager.QMakeBuildStep + true + + false + false + false + + + true + Make + + Qt4ProjectManager.MakeStep + + -w + -r + + false + + + + + true + Copy application data + + Qt4ProjectManager.AndroidPackageInstallationStep + + + android-26 + + true + Build Android APK + + QmakeProjectManager.AndroidBuildApkStep + false + false + + 4 + Build + + ProjectExplorer.BuildSteps.Build + + + + true + Make + + Qt4ProjectManager.MakeStep + + -w + -r + + true + clean + + + 1 + Clean + + ProjectExplorer.BuildSteps.Clean + + 2 + false + + Debug + Debug + Qt4ProjectManager.Qt4BuildConfiguration + 2 + true + + + /Users/Hoppy/Desktop/projects/PalmEmuRedo/libretro-palmm515emu/qtBuildSystem/build-Mu-Android_for_armeabi_v7a_GCC_4_9_Qt_5_10_1_for_Android_armv7-Release + + + true + qmake + + QtProjectManager.QMakeBuildStep + false + + false + false + false + + + true + Make + + Qt4ProjectManager.MakeStep + + -w + -r + + false + + + + + true + Copy application data + + Qt4ProjectManager.AndroidPackageInstallationStep + + + android-26 + + true + Build Android APK + + QmakeProjectManager.AndroidBuildApkStep + false + false + + 4 + Build + + ProjectExplorer.BuildSteps.Build + + + + true + Make + + Qt4ProjectManager.MakeStep + + -w + -r + + true + clean + + + 1 + Clean + + ProjectExplorer.BuildSteps.Clean + + 2 + false + + Release + Release + Qt4ProjectManager.Qt4BuildConfiguration + 0 + true + + + /Users/Hoppy/Desktop/projects/PalmEmuRedo/libretro-palmm515emu/qtBuildSystem/build-Mu-Android_for_armeabi_v7a_GCC_4_9_Qt_5_10_1_for_Android_armv7-Profile + + + true + qmake + + QtProjectManager.QMakeBuildStep + true + + false + true + false + + + true + Make + + Qt4ProjectManager.MakeStep + + -w + -r + + false + + + + + true + Copy application data + + Qt4ProjectManager.AndroidPackageInstallationStep + + + android-26 + + true + Build Android APK + + QmakeProjectManager.AndroidBuildApkStep + false + false + + 4 + Build + + ProjectExplorer.BuildSteps.Build + + + + true + Make + + Qt4ProjectManager.MakeStep + + -w + -r + + true + clean + + + 1 + Clean + + ProjectExplorer.BuildSteps.Clean + + 2 + false + + Profile + Profile + Qt4ProjectManager.Qt4BuildConfiguration + 0 + true + + 3 + + + + true + Deploy to Android device + + Qt4ProjectManager.AndroidDeployQtStep + false + + 1 + Deploy + + ProjectExplorer.BuildSteps.Deploy + + 1 + Deploy to Android device + + Qt4ProjectManager.AndroidDeployConfiguration2 + + 1 + + ZY223CQT6S + + + false + false + 1000 + + true + + false + false + false + false + true + 0.01 + 10 + true + 1 + 25 + + 1 + true + false + true + valgrind + + 0 + 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 + 10 + 11 + 12 + 13 + 14 + + + + + Mu + 2 + Qt4ProjectManager.AndroidRunConfiguration:/Users/Hoppy/Desktop/projects/PalmEmuRedo/libretro-palmm515emu/qtBuildSystem/Mu/Mu.pro + Mu.pro + 3768 + false + true + false + false + true + + 1 + + + + ProjectExplorer.Project.Target.1 Desktop Qt 5.10.1 clang 64bit Desktop Qt 5.10.1 clang 64bit @@ -321,324 +639,6 @@ 1 - - ProjectExplorer.Project.Target.1 - - Android for armeabi-v7a (GCC 4.9, Qt 5.10.1 for Android armv7) - Android for armeabi-v7a (GCC 4.9, Qt 5.10.1 for Android armv7) - {d2003381-5fc1-4ec6-a72e-166645e4f708} - 1 - 0 - 0 - - /Users/Hoppy/Desktop/projects/PalmEmuRedo/libretro-palmm515emu/qtBuildSystem/build-Mu-Android_for_armeabi_v7a_GCC_4_9_Qt_5_10_1_for_Android_armv7-Debug - - - true - qmake - - QtProjectManager.QMakeBuildStep - true - - false - false - false - - - true - Make - - Qt4ProjectManager.MakeStep - - -w - -r - - false - - - - - true - Copy application data - - Qt4ProjectManager.AndroidPackageInstallationStep - - - android-26 - - true - Build Android APK - - QmakeProjectManager.AndroidBuildApkStep - false - false - - 4 - Build - - ProjectExplorer.BuildSteps.Build - - - - true - Make - - Qt4ProjectManager.MakeStep - - -w - -r - - true - clean - - - 1 - Clean - - ProjectExplorer.BuildSteps.Clean - - 2 - false - - Debug - Debug - Qt4ProjectManager.Qt4BuildConfiguration - 2 - true - - - /Users/Hoppy/Desktop/projects/PalmEmuRedo/libretro-palmm515emu/qtBuildSystem/build-Mu-Android_for_armeabi_v7a_GCC_4_9_Qt_5_10_1_for_Android_armv7-Release - - - true - qmake - - QtProjectManager.QMakeBuildStep - false - - false - false - false - - - true - Make - - Qt4ProjectManager.MakeStep - - -w - -r - - false - - - - - true - Copy application data - - Qt4ProjectManager.AndroidPackageInstallationStep - - - android-26 - - true - Build Android APK - - QmakeProjectManager.AndroidBuildApkStep - false - false - - 4 - Build - - ProjectExplorer.BuildSteps.Build - - - - true - Make - - Qt4ProjectManager.MakeStep - - -w - -r - - true - clean - - - 1 - Clean - - ProjectExplorer.BuildSteps.Clean - - 2 - false - - Release - Release - Qt4ProjectManager.Qt4BuildConfiguration - 0 - true - - - /Users/Hoppy/Desktop/projects/PalmEmuRedo/libretro-palmm515emu/qtBuildSystem/build-Mu-Android_for_armeabi_v7a_GCC_4_9_Qt_5_10_1_for_Android_armv7-Profile - - - true - qmake - - QtProjectManager.QMakeBuildStep - true - - false - true - false - - - true - Make - - Qt4ProjectManager.MakeStep - - -w - -r - - false - - - - - true - Copy application data - - Qt4ProjectManager.AndroidPackageInstallationStep - - - android-26 - - true - Build Android APK - - QmakeProjectManager.AndroidBuildApkStep - false - false - - 4 - Build - - ProjectExplorer.BuildSteps.Build - - - - true - Make - - Qt4ProjectManager.MakeStep - - -w - -r - - true - clean - - - 1 - Clean - - ProjectExplorer.BuildSteps.Clean - - 2 - false - - Profile - Profile - Qt4ProjectManager.Qt4BuildConfiguration - 0 - true - - 3 - - - - true - Deploy to Android device - - Qt4ProjectManager.AndroidDeployQtStep - false - - 1 - Deploy - - ProjectExplorer.BuildSteps.Deploy - - 1 - Deploy to Android device - - Qt4ProjectManager.AndroidDeployConfiguration2 - - 1 - - TA107021DY - - - false - false - 1000 - - true - - false - false - false - false - true - 0.01 - 10 - true - 1 - 25 - - 1 - true - false - true - valgrind - - 0 - 1 - 2 - 3 - 4 - 5 - 6 - 7 - 8 - 9 - 10 - 11 - 12 - 13 - 14 - - - - - Mu - 2 - Qt4ProjectManager.AndroidRunConfiguration:/Users/Hoppy/Desktop/projects/PalmEmuRedo/libretro-palmm515emu/qtBuildSystem/Mu/Mu.pro - Mu.pro - 3768 - false - true - false - false - true - - 1 - - ProjectExplorer.Project.TargetCount 2 diff --git a/qtBuildSystem/Mu/android-resources/AndroidManifest.xml b/qtBuildSystem/Mu/android/AndroidManifest.xml similarity index 94% rename from qtBuildSystem/Mu/android-resources/AndroidManifest.xml rename to qtBuildSystem/Mu/android/AndroidManifest.xml index 9defd1d..dd8d540 100644 --- a/qtBuildSystem/Mu/android-resources/AndroidManifest.xml +++ b/qtBuildSystem/Mu/android/AndroidManifest.xml @@ -17,15 +17,15 @@ - + - + - - - + + + @@ -70,15 +70,13 @@ - - - + - + - + diff --git a/qtBuildSystem/Mu/android/build.gradle b/qtBuildSystem/Mu/android/build.gradle new file mode 100644 index 0000000..3a3e0cd --- /dev/null +++ b/qtBuildSystem/Mu/android/build.gradle @@ -0,0 +1,57 @@ +buildscript { + repositories { + jcenter() + } + + dependencies { + classpath 'com.android.tools.build:gradle:2.2.3' + } +} + +allprojects { + repositories { + jcenter() + } +} + +apply plugin: 'com.android.application' + +dependencies { + compile fileTree(dir: 'libs', include: ['*.jar']) +} + +android { + /******************************************************* + * The following variables: + * - androidBuildToolsVersion, + * - androidCompileSdkVersion + * - qt5AndroidDir - holds the path to qt android files + * needed to build any Qt application + * on Android. + * + * are defined in gradle.properties file. This file is + * updated by QtCreator and androiddeployqt tools. + * Changing them manually might break the compilation! + *******************************************************/ + + compileSdkVersion androidCompileSdkVersion.toInteger() + + buildToolsVersion androidBuildToolsVersion + + sourceSets { + main { + manifest.srcFile 'AndroidManifest.xml' + java.srcDirs = [qt5AndroidDir + '/src', 'src', 'java'] + aidl.srcDirs = [qt5AndroidDir + '/src', 'src', 'aidl'] + res.srcDirs = [qt5AndroidDir + '/res', 'res'] + resources.srcDirs = ['src'] + renderscript.srcDirs = ['src'] + assets.srcDirs = ['assets'] + jniLibs.srcDirs = ['libs'] + } + } + + lintOptions { + abortOnError false + } +} diff --git a/qtBuildSystem/Mu/android/gradle.properties b/qtBuildSystem/Mu/android/gradle.properties new file mode 100644 index 0000000..916cde8 --- /dev/null +++ b/qtBuildSystem/Mu/android/gradle.properties @@ -0,0 +1,9 @@ +## This file is automatically generated by QtCreator. +# +# This file must *NOT* be checked into Version Control Systems, +# as it contains information specific to your local configuration. + +androidBuildToolsVersion=26.0.2 +androidCompileSdkVersion=26 +buildDir=.build +qt5AndroidDir=/Users/Hoppy/Qt/5.10.1/android_armv7/src/android/java diff --git a/qtBuildSystem/Mu/android/gradle.properties~ b/qtBuildSystem/Mu/android/gradle.properties~ new file mode 100644 index 0000000..916cde8 --- /dev/null +++ b/qtBuildSystem/Mu/android/gradle.properties~ @@ -0,0 +1,9 @@ +## This file is automatically generated by QtCreator. +# +# This file must *NOT* be checked into Version Control Systems, +# as it contains information specific to your local configuration. + +androidBuildToolsVersion=26.0.2 +androidCompileSdkVersion=26 +buildDir=.build +qt5AndroidDir=/Users/Hoppy/Qt/5.10.1/android_armv7/src/android/java diff --git a/qtBuildSystem/Mu/android/gradle/wrapper/gradle-wrapper.jar b/qtBuildSystem/Mu/android/gradle/wrapper/gradle-wrapper.jar new file mode 100644 index 0000000000000000000000000000000000000000..2b338a935b508eb6286ed4b84a91176ee5fb93c5 GIT binary patch literal 54213 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�KD`X(({8}(}C^-^ji=hhJ(ndnfNS# z7>eD|MrdbngG__q?0kG?LPN!wm=n3t{b3Z3dXh54J`gEcM1-AKN*Pe_qn}v}G7o}T zi-|B55=anlA&vW?yS>{H^>AE>4Iq-K6vGx0j><*12mQcSkPQ%gtqj8+q{M{QFG4rA z0_~hqh>;-DtOCPWShp*Hh@*bdEqa1>t{}(?2!3CKVG)x1ArYX0|CB*=%g~QugIEM2 zbsGp6h$SF0c>#t+VAFA}c1JfEea$e)ObE_gOxR@X5skiH z31S|IbX<*LCT6hUS-phrdS|qCAs{;-*m)fhHsM(%f^L&8+UzmJ77*FKi3pp(aZ-e* z6hxm!1epxM_qGsWKBTOL)TQX7oakObpT&V#10qjtC)z4UtaCc(R-uocgDipIy}R&P zg<~uo-FWn2V2IHmGI$R@;~}wuV^A2~67-QYkns>)x*x+5SOJfestJ@K=%XVLqrv1M vc#{s-SP9Inu#pkuQ4P@O2G|%d5qJpqI7xsvD;r3WA!vp}kbz \(.*\)$'` + if expr "$link" : '/.*' > /dev/null; then + PRG="$link" + else + PRG=`dirname "$PRG"`"/$link" + fi +done +SAVED="`pwd`" +cd "`dirname \"$PRG\"`/" >/dev/null +APP_HOME="`pwd -P`" +cd "$SAVED" >/dev/null + +APP_NAME="Gradle" +APP_BASE_NAME=`basename "$0"` + +# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +DEFAULT_JVM_OPTS="-Xmx1024m -Dfile.encoding=UTF-8" + +# Use the maximum available, or set MAX_FD != -1 to use that value. +MAX_FD="maximum" + +warn ( ) { + echo "$*" +} + +die ( ) { + echo + echo "$*" + echo + exit 1 +} + +# OS specific support (must be 'true' or 'false'). +cygwin=false +msys=false +darwin=false +nonstop=false +case "`uname`" in + CYGWIN* ) + cygwin=true + ;; + Darwin* ) + darwin=true + ;; + MINGW* ) + msys=true + ;; + NONSTOP* ) + nonstop=true + ;; +esac + +CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar + +# Determine the Java command to use to start the JVM. +if [ -n "$JAVA_HOME" ] ; then + if [ -x "$JAVA_HOME/jre/sh/java" ] ; then + # IBM's JDK on AIX uses strange locations for the executables + JAVACMD="$JAVA_HOME/jre/sh/java" + else + JAVACMD="$JAVA_HOME/bin/java" + fi + if [ ! -x "$JAVACMD" ] ; then + die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME + +Please set the JAVA_HOME variable in your environment to match the +location of your Java installation." + fi +else + JAVACMD="java" + which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. + +Please set the JAVA_HOME variable in your environment to match the +location of your Java installation." +fi + +# Increase the maximum file descriptors if we can. +if [ "$cygwin" = "false" -a "$darwin" = "false" -a "$nonstop" = "false" ] ; then + MAX_FD_LIMIT=`ulimit -H -n` + if [ $? -eq 0 ] ; then + if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then + MAX_FD="$MAX_FD_LIMIT" + fi + ulimit -n $MAX_FD + if [ $? -ne 0 ] ; then + warn "Could not set maximum file descriptor limit: $MAX_FD" + fi + else + warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT" + fi +fi + +# For Darwin, add options to specify how the application appears in the dock +if $darwin; then + GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\"" +fi + +# For Cygwin, switch paths to Windows format before running java +if $cygwin ; then + APP_HOME=`cygpath --path --mixed "$APP_HOME"` + CLASSPATH=`cygpath --path --mixed "$CLASSPATH"` + JAVACMD=`cygpath --unix "$JAVACMD"` + + # We build the pattern for arguments to be converted via cygpath + ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null` + SEP="" + for dir in $ROOTDIRSRAW ; do + ROOTDIRS="$ROOTDIRS$SEP$dir" + SEP="|" + done + OURCYGPATTERN="(^($ROOTDIRS))" + # Add a user-defined pattern to the cygpath arguments + if [ "$GRADLE_CYGPATTERN" != "" ] ; then + OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)" + fi + # Now convert the arguments - kludge to limit ourselves to /bin/sh + i=0 + for arg in "$@" ; do + CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -` + CHECK2=`echo "$arg"|egrep -c "^-"` ### Determine if an option + + if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then ### Added a condition + eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"` + else + eval `echo args$i`="\"$arg\"" + fi + i=$((i+1)) + done + case $i in + (0) set -- ;; + (1) set -- "$args0" ;; + (2) set -- "$args0" "$args1" ;; + (3) set -- "$args0" "$args1" "$args2" ;; + (4) set -- "$args0" "$args1" "$args2" "$args3" ;; + (5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;; + (6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;; + (7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;; + (8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;; + (9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;; + esac +fi + +# Escape application args +save ( ) { + for i do printf %s\\n "$i" | sed "s/'/'\\\\''/g;1s/^/'/;\$s/\$/' \\\\/" ; done + echo " " +} +APP_ARGS=$(save "$@") + +# Collect all arguments for the java command, following the shell quoting and substitution rules +eval set -- $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS "\"-Dorg.gradle.appname=$APP_BASE_NAME\"" -classpath "\"$CLASSPATH\"" org.gradle.wrapper.GradleWrapperMain "$APP_ARGS" + +# by default we should be in the correct project dir, but when run from Finder on Mac, the cwd is wrong +if [ "$(uname)" = "Darwin" ] && [ "$HOME" = "$PWD" ]; then + cd "$(dirname "$0")" +fi + +exec "$JAVACMD" "$@" diff --git a/qtBuildSystem/Mu/android/gradlew.bat b/qtBuildSystem/Mu/android/gradlew.bat new file mode 100644 index 0000000..65b35a4 --- /dev/null +++ b/qtBuildSystem/Mu/android/gradlew.bat @@ -0,0 +1,84 @@ +@if "%DEBUG%" == "" @echo off +@rem ########################################################################## +@rem +@rem Gradle startup script for Windows +@rem +@rem ########################################################################## + +@rem Set local scope for the variables with windows NT shell +if "%OS%"=="Windows_NT" setlocal + +set DIRNAME=%~dp0 +if "%DIRNAME%" == "" set DIRNAME=. +set APP_BASE_NAME=%~n0 +set APP_HOME=%DIRNAME% + +@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +set DEFAULT_JVM_OPTS=-Xmx1024m -Dfile.encoding=UTF-8 + +@rem Find java.exe +if defined JAVA_HOME goto findJavaFromJavaHome + +set JAVA_EXE=java.exe +%JAVA_EXE% -version >NUL 2>&1 +if "%ERRORLEVEL%" == "0" goto init + +echo. +echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. +echo. +echo Please set the JAVA_HOME variable in your environment to match the +echo location of your Java installation. + +goto fail + +:findJavaFromJavaHome +set JAVA_HOME=%JAVA_HOME:"=% +set JAVA_EXE=%JAVA_HOME%/bin/java.exe + +if exist "%JAVA_EXE%" goto init + +echo. +echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% +echo. +echo Please set the JAVA_HOME variable in your environment to match the +echo location of your Java installation. + +goto fail + +:init +@rem Get command-line arguments, handling Windows variants + +if not "%OS%" == "Windows_NT" goto win9xME_args + +:win9xME_args +@rem Slurp the command line arguments. +set CMD_LINE_ARGS= +set _SKIP=2 + +:win9xME_args_slurp +if "x%~1" == "x" goto execute + +set CMD_LINE_ARGS=%* + +:execute +@rem Setup the command line + +set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar + +@rem Execute Gradle +"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %CMD_LINE_ARGS% + +:end +@rem End local scope for the variables with windows NT shell +if "%ERRORLEVEL%"=="0" goto mainEnd + +:fail +rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of +rem the _cmd.exe /c_ return code! +if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1 +exit /b 1 + +:mainEnd +if "%OS%"=="Windows_NT" endlocal + +:omega diff --git a/qtBuildSystem/Mu/android/local.properties b/qtBuildSystem/Mu/android/local.properties new file mode 100644 index 0000000..e3f46c2 --- /dev/null +++ b/qtBuildSystem/Mu/android/local.properties @@ -0,0 +1,6 @@ +## This file is automatically generated by QtCreator. +# +# This file must *NOT* be checked into Version Control Systems, +# as it contains information specific to your local configuration. + +sdk.dir=/Volumes/compHDD/AndroidSDK/sdk diff --git a/qtBuildSystem/Mu/android/local.properties~ b/qtBuildSystem/Mu/android/local.properties~ new file mode 100644 index 0000000..e3f46c2 --- /dev/null +++ b/qtBuildSystem/Mu/android/local.properties~ @@ -0,0 +1,6 @@ +## This file is automatically generated by QtCreator. +# +# This file must *NOT* be checked into Version Control Systems, +# as it contains information specific to your local configuration. + +sdk.dir=/Volumes/compHDD/AndroidSDK/sdk diff --git a/qtBuildSystem/Mu/android-resources/res/drawable-hdpi/icon.png b/qtBuildSystem/Mu/android/res/drawable-hdpi/icon.png similarity index 100% rename from qtBuildSystem/Mu/android-resources/res/drawable-hdpi/icon.png rename to qtBuildSystem/Mu/android/res/drawable-hdpi/icon.png diff --git a/qtBuildSystem/Mu/android-resources/res/drawable-ldpi/icon.png b/qtBuildSystem/Mu/android/res/drawable-ldpi/icon.png similarity index 100% rename from qtBuildSystem/Mu/android-resources/res/drawable-ldpi/icon.png rename to qtBuildSystem/Mu/android/res/drawable-ldpi/icon.png diff --git a/qtBuildSystem/Mu/android-resources/res/drawable-mdpi/icon.png b/qtBuildSystem/Mu/android/res/drawable-mdpi/icon.png similarity index 100% rename from qtBuildSystem/Mu/android-resources/res/drawable-mdpi/icon.png rename to qtBuildSystem/Mu/android/res/drawable-mdpi/icon.png diff --git a/qtBuildSystem/Mu/android/res/values/libs.xml b/qtBuildSystem/Mu/android/res/values/libs.xml new file mode 100644 index 0000000..4009a77 --- /dev/null +++ b/qtBuildSystem/Mu/android/res/values/libs.xml @@ -0,0 +1,25 @@ + + + + https://download.qt.io/ministro/android/qt5/qt-5.9 + + + + + + + + + + + + + + + + + + + + diff --git a/qtBuildSystem/Mu/mainwindow.cpp b/qtBuildSystem/Mu/mainwindow.cpp index a599c03..7af7c63 100644 --- a/qtBuildSystem/Mu/mainwindow.cpp +++ b/qtBuildSystem/Mu/mainwindow.cpp @@ -9,6 +9,8 @@ #include #include #include +#include +#include #include #include @@ -23,6 +25,7 @@ uint32_t screenWidth; uint32_t screenHeight; QSettings settings; +static bool extendedScreen; static QImage video; static QTimer* refreshDisplay; static HexViewer* emuStateBrowser; @@ -68,8 +71,12 @@ MainWindow::MainWindow(QWidget* parent) : emuOn = false; emuInited = false; + + /* screenWidth = 160; screenHeight = 160 + 60; + extendedScreen = false; + */ loadRom(); @@ -152,8 +159,8 @@ void MainWindow::updateDisplay(){ emulateFrame(); #endif - video = QImage((unsigned char*)palmFramebuffer, screenWidth, screenHeight, QImage::Format_RGB16);//16 bit - ui->display->setPixmap(QPixmap::fromImage(video).scaled(ui->display->size(), Qt::KeepAspectRatio, Qt::SmoothTransformation)); + video = QImage(extendedScreen ? (uchar*)palmExtendedFramebuffer : (uchar*)palmFramebuffer, screenWidth, screenHeight, QImage::Format_RGB16); + ui->display->setPixmap(QPixmap::fromImage(video).scaled(QSize(ui->display->size().width() * 0.95, ui->display->size().height() * 0.95), Qt::KeepAspectRatio, Qt::SmoothTransformation)); ui->display->update(); emuMutex.unlock(); } @@ -200,34 +207,6 @@ void MainWindow::on_notes_released(){ palmInput.buttonNotes = false; } -//ui buttons -void MainWindow::on_mainLeft_clicked(){ - ui->controlPanel->setCurrentWidget(ui->controlPanel->widget(2)); -} - -void MainWindow::on_mainRight_clicked(){ - ui->controlPanel->setCurrentWidget(ui->controlPanel->widget(1)); -} - -void MainWindow::on_settingsLeft_clicked(){ - ui->controlPanel->setCurrentWidget(ui->controlPanel->widget(0)); -} - -void MainWindow::on_settingsRight_clicked(){ - ui->controlPanel->setCurrentWidget(ui->controlPanel->widget(2)); -} - -void MainWindow::on_joyLeft_clicked(){ - ui->controlPanel->setCurrentWidget(ui->controlPanel->widget(1)); -} - -void MainWindow::on_joyRight_clicked(){ - ui->controlPanel->setCurrentWidget(ui->controlPanel->widget(0)); -} - -void MainWindow::on_settings_clicked(){ - //setprocess(SETUP); -} //emu control void MainWindow::on_ctrlBtn_clicked(){ @@ -236,6 +215,17 @@ void MainWindow::on_ctrlBtn_clicked(){ //start emu uint32_t error = emulatorInit(romBuffer, NULL/*bootloader*/, FEATURE_ACCURATE); if(error == EMU_ERROR_NONE){ + if(palmExtendedFramebuffer != NULL){ + screenWidth = 320; + screenHeight = 320 + 120; + extendedScreen = true; + } + else{ + screenWidth = 160; + screenHeight = 160 + 60; + extendedScreen = false; + } + emuInited = true; emuOn = true; ui->ctrlBtn->setText("Pause"); diff --git a/qtBuildSystem/Mu/mainwindow.h b/qtBuildSystem/Mu/mainwindow.h index 4a5665d..16b7be1 100644 --- a/qtBuildSystem/Mu/mainwindow.h +++ b/qtBuildSystem/Mu/mainwindow.h @@ -42,15 +42,6 @@ private slots: void on_notes_pressed(); void on_notes_released(); - //ui buttons - void on_mainLeft_clicked(); - void on_mainRight_clicked(); - void on_settingsLeft_clicked(); - void on_settingsRight_clicked(); - void on_joyLeft_clicked(); - void on_joyRight_clicked(); - void on_settings_clicked(); - void on_ctrlBtn_clicked(); void on_hexViewer_clicked(); diff --git a/qtBuildSystem/Mu/mainwindow.ui b/qtBuildSystem/Mu/mainwindow.ui index f489ae7..d40c599 100644 --- a/qtBuildSystem/Mu/mainwindow.ui +++ b/qtBuildSystem/Mu/mainwindow.ui @@ -6,28 +6,16 @@ 0 0 - 574 - 678 + 438 + 393 - - - 0 - 0 - - Mu - - - 0 - 0 - - - + @@ -35,408 +23,266 @@ 0 - - - 320 - 320 - - - - - 0 - 0 - - - - CrossCursor - QFrame::WinPanel QFrame::Raised - - 1 - - - - - - false - Qt::AlignCenter - - + + true - + 0 0 - - - 0 - 0 - - - - 0 - - - - - - - - 0 - 0 - - - - - - - - :/buttons/images/up.png:/buttons/images/up.png - - - - - - - - 0 - 0 - - - - L - - - - - - - - 0 - 0 - - - - - - - - :/buttons/images/calender.png:/buttons/images/calender.png - - - - - - - - 0 - 0 - - - - - - - - :/buttons/images/right.png:/buttons/images/right.png - - - - - - - - 0 - 0 - - - - - - - - :/buttons/images/left.png:/buttons/images/left.png - - - - - - - - 0 - 0 - - - - - 0 - 0 - - - - - 0 - 0 - - - - - - - - :/buttons/images/toDo.png:/buttons/images/toDo.png - - - false - - - false - - - false - - - - - - - - 0 - 0 - - - - - - - - :/buttons/images/notes.png:/buttons/images/notes.png - - - - - - - - 0 - 0 - - - - - - - - :/buttons/images/down.png:/buttons/images/down.png - - - - - - - - 0 - 0 - - - - R - - - - - - - - 0 - 0 - - - - - - - - :/buttons/images/addressBook.png:/buttons/images/addressBook.png - - - - - - - - 0 - 0 - - - - - - - - :/buttons/images/power.png:/buttons/images/power.png - - - - - - - - 0 - 0 - - - - - - - - :/buttons/images/center.png:/buttons/images/center.png - - - - - - - false - - - - 0 - 0 - - - - ctrl_btn - - - - - - - true - - - - 0 - 0 - - - - HexViewer - - - - - - - - 0 - 0 - - - - Screenshot - - - - - - - - - - - - 0 - 0 - - - - Install App or Database - - - - - - - - 0 - 0 - - - - L - - - - - - - - 0 - 0 - - - - Settings - - - - - - - - 0 - 0 - - - - R - - - - - - - - - - - Center - - - - - - - R - - - - - - - L - - - - - + + + + + + 0 + 0 + + + + + + + + :/buttons/images/calender.png:/buttons/images/calender.png + + + + + + + + 0 + 0 + + + + + + + + :/buttons/images/down.png:/buttons/images/down.png + + + + + + + + 0 + 0 + + + + + + + + :/buttons/images/up.png:/buttons/images/up.png + + + + + + + + 0 + 0 + + + + + + + + :/buttons/images/addressBook.png:/buttons/images/addressBook.png + + + + + + + + 0 + 0 + + + + + + + + :/buttons/images/right.png:/buttons/images/right.png + + + + + + + + 0 + 0 + + + + + + + + :/buttons/images/center.png:/buttons/images/center.png + + + + + + + + 0 + 0 + + + + + 0 + 0 + + + + + 0 + 0 + + + + + + + + :/buttons/images/toDo.png:/buttons/images/toDo.png + + + false + + + false + + + false + + + + + + + + 0 + 0 + + + + + + + + :/buttons/images/power.png:/buttons/images/power.png + + + + + + + + 0 + 0 + + + + + + + + :/buttons/images/notes.png:/buttons/images/notes.png + + + + + + + + 0 + 0 + + + + + + + + :/buttons/images/left.png:/buttons/images/left.png + + + + + + + false + + + + 0 + 0 + + + + ctrl_btn + + + + + + + + 0 + 0 + + + + Screenshot + + + + + + + true + + + + 0 + 0 + + + + HexViewer + + + + diff --git a/qtBuildSystem/Mu/touchscreen.cpp b/qtBuildSystem/Mu/touchscreen.cpp index dd84f17..b0068ba 100644 --- a/qtBuildSystem/Mu/touchscreen.cpp +++ b/qtBuildSystem/Mu/touchscreen.cpp @@ -2,7 +2,7 @@ #include "mainwindow.h" #include "src/emulator.h" -float rangeSwap(float newRange, float oldRange, float value){ +static inline float rangeSwap(float newRange, float oldRange, float value){ return value / oldRange * newRange; } diff --git a/src/emulator.c b/src/emulator.c index 2a2ac70..8b3f113 100644 --- a/src/emulator.c +++ b/src/emulator.c @@ -218,7 +218,12 @@ uint32_t emulatorInit(uint8_t* palmRomDump, uint8_t* palmBootDump, uint32_t spec memcpy(palmReg + REG_SIZE - 1 - BOOTLOADER_SIZE, palmBootDump, BOOTLOADER_SIZE); else memset(palmReg + REG_SIZE - 1 - BOOTLOADER_SIZE, 0x00, BOOTLOADER_SIZE); + memset(palmFramebuffer, 0x00, 160 * 160 * sizeof(uint16_t)); memcpy(&palmFramebuffer[160 * 160], silkscreenData, SILKSCREEN_WIDTH * SILKSCREEN_HEIGHT * (SILKSCREEN_BPP / 8)); + if(palmExtendedFramebuffer != NULL){ + memset(palmExtendedFramebuffer, 0x00, 320 * 320 * sizeof(uint16_t)); + //add 320*320 silkscreen image later, 2xBRZ should be able to make 320*320 version of the 160*160 silkscreen + } resetAddressSpace(); sed1376Reset(); sdCardInit(); diff --git a/unimplementedFeatures.txt b/unimplementedFeatures.txt index a52b15f..8568712 100644 --- a/unimplementedFeatures.txt +++ b/unimplementedFeatures.txt @@ -1,3 +1,6 @@ +Emulator wrapper: +add 320*320 frame buffer silkscreen, 2xBRZ should be able to make 320*320 version of the 160*160 silkscreen + CPU: sysTrapPceNativeCall, ARM Emulator CPU32 table lookup opcodes