diff --git a/ReadMe.txt b/ReadMe.txt
index bd747ac..792cc15 100644
--- a/ReadMe.txt
+++ b/ReadMe.txt
@@ -63,7 +63,7 @@ LINKS
CHANGES
-Version 2.0 (2020-11-XX)
+Version 2.0 (2020-11-15)
- Updated source code from Eric Rechlin's Emu48 version 1.62+ that was merged from Christoph Gießelink's Emu48 version 1.63.
- For the HP49/50 port 2, it is now possible to load a new Flash ROM file (It fully replaces the ROM).
@@ -72,6 +72,7 @@ Version 2.0 (2020-11-XX)
- Fix a printer issue from Christoph Gießelink's HP82240B Printer Simulator version 1.12.
- Fix the KML button Type 3 with a Background offset which was not display at the right location (Fix #15).
- Fix a timer issue.
+- Fix a freeze with a hp48 sx or gx, when switching on/off several times port 1 and 2!
Version 1.9 (2020-09-07)
@@ -219,21 +220,18 @@ TODO
- Manage the HP 48 port 2 with the same kind of interface for the memory card.
- The render pixels are very nice. A solution to obtain uniform pixel size could be a preset (a multiplier, auto) so the user could decide and upscale/downscale (Michael P).
-- Bug: In Xiaomi mi A3 under Android10, the haptic feedback does not work (add an intensity setting).
- Somehow LEFT (Shift on the keyboard) + 7 activates the DIVIDE-key (z-Key)..., but with the NUM-Key it can make it work without problems...
I think it might have something to do with the "/" sign on the Shifted-7-key.
- The clock seems unsynchronized sometimes (Michael P).
- Retain a key by right clicking if it is from a mouse.
-- Add the possibility to load and save the flash in another file.
- Sometimes, the calculator seems to lag and finally freeze.
-- In Chrome OS:
- - sometimes there is no OK button in the KML Script Compilation Result.
+- In Chrome OS, sometimes there is no OK button in the KML Script Compilation Result.
- Add KML script loading dependencies fallback to the inner ROM (and may be KML include?).
BUILD
-Emu48 for Android is built with Android Studio 4.0 (2020).
+Emu48 for Android is built with Android Studio 4.1 (2020).
And to generate an installable APK file with a real Android device, it MUST be signed.
Either use Android Studio:
diff --git a/app/src/main/assets/ReadMe.txt b/app/src/main/assets/ReadMe.txt
index 4f15d42..119409b 100644
--- a/app/src/main/assets/ReadMe.txt
+++ b/app/src/main/assets/ReadMe.txt
@@ -63,7 +63,7 @@ LINKS
CHANGES
-Version 2.0 (2020-11-XX)
+Version 2.0 (2020-11-15)
- Updated source code from Eric Rechlin's Emu48 version 1.62+ that was merged from Christoph Gießelink's Emu48 version 1.63.
- For the HP49/50 port 2, it is now possible to load a new Flash ROM file (It fully replaces the ROM).
@@ -72,6 +72,7 @@ Version 2.0 (2020-11-XX)
- Fix a printer issue from Christoph Gießelink's HP82240B Printer Simulator version 1.12.
- Fix the KML button Type 3 with a Background offset which was not display at the right location (Fix #15).
- Fix a timer issue.
+- Fix a freeze with a hp48 sx or gx, when switching on/off several times port 1 and 2!
Version 1.9 (2020-09-07)
diff --git a/app/src/main/cpp/emu-jni.c b/app/src/main/cpp/emu-jni.c
index 44762c7..066f314 100644
--- a/app/src/main/cpp/emu-jni.c
+++ b/app/src/main/cpp/emu-jni.c
@@ -1047,7 +1047,9 @@ JNIEXPORT void JNICALL Java_org_emulator_calculator_NativeLib_setConfiguration(J
const char *configKey = (*env)->GetStringUTFChars(env, key, NULL) ;
const char *configStringValue = stringValue ? (*env)->GetStringUTFChars(env, stringValue, NULL) : NULL;
- bAutoSave = FALSE;
+ //LOGE("NativeLib_setConfiguration(%s, %d, %d, %s)", configKey, intValue1, intValue2, configStringValue);
+
+ bAutoSave = FALSE;
bAutoSaveOnExit = FALSE;
bLoadObjectWarning = FALSE;
bAlwaysDisplayLog = TRUE;
@@ -1081,7 +1083,9 @@ JNIEXPORT void JNICALL Java_org_emulator_calculator_NativeLib_setConfiguration(J
if (Chipset.Port1Size && (cCurrentRomType!='X' || cCurrentRomType!='2' || cCurrentRomType!='Q')) // CdB for HP: add apples
{
UINT nOldState = SwitchToState(SM_SLEEP);
- // save old card status
+ //LOGE("NativeLib_setConfiguration port1 start SwitchToState %d -> SM_SLEEP", nOldState);
+
+ // save old card status
BYTE byCardsStatus = Chipset.cards_status;
// port1 disabled?
@@ -1103,7 +1107,9 @@ JNIEXPORT void JNICALL Java_org_emulator_calculator_NativeLib_setConfiguration(J
Chipset.SoftInt = TRUE; // set interrupt
bInterrupt = TRUE;
}
+ //LOGE("NativeLib_setConfiguration port1 end SwitchToState %d", nOldState);
SwitchToState(nOldState);
+ while (nState!=nNextState) Sleep(0);
}
} else if(_tcscmp(_T("settings_port2"), configKey) == 0) {
settingsPort2en = (BOOL)intValue1;
@@ -1139,6 +1145,7 @@ JNIEXPORT void JNICALL Java_org_emulator_calculator_NativeLib_setConfiguration(J
if (bPort2CfgChange) // slot2 configuration changed
{
UINT nOldState = SwitchToState(SM_INVALID);
+ //LOGE("NativeLib_setConfiguration port2 start SwitchToState %d -> SM_INVALID", nOldState);
UnmapPort2(); // unmap port2
@@ -1159,6 +1166,7 @@ JNIEXPORT void JNICALL Java_org_emulator_calculator_NativeLib_setConfiguration(J
// save fingerprint of port2
Chipset.wPort2Crc = wPort2Crc;
}
+ //LOGE("NativeLib_setConfiguration port2 end SwitchToState %d", nOldState);
SwitchToState(nOldState);
}
}
diff --git a/app/src/main/cpp/win32-layer.c b/app/src/main/cpp/win32-layer.c
index 1ce2db3..a795b96 100644
--- a/app/src/main/cpp/win32-layer.c
+++ b/app/src/main/cpp/win32-layer.c
@@ -612,8 +612,19 @@ DWORD ResumeThread(HANDLE hThread) {
BOOL SetThreadPriority(HANDLE hThread, int nPriority) {
THREAD_LOGD("SetThreadPriority()");
- //TODO
- return 0;
+// if(hThread->handleType == HANDLE_TYPE_THREAD) {
+// int policy;
+// struct sched_param param;
+// int result = pthread_getschedparam(hThread->threadId, &policy, ¶m);
+// if(nPriority == THREAD_PRIORITY_HIGHEST) {
+// param.sched_priority = sched_get_priority_min(policy);
+// param.sched_priority = sched_get_priority_max(policy);
+// }
+// result = pthread_setschedparam(hThread->threadId, policy, ¶m);
+// // THIS DOES NOT WORK WITH ANDROID!
+// return TRUE;
+// }
+ return FALSE;
}
@@ -733,14 +744,19 @@ BOOL WINAPI CloseHandle(HANDLE hObject) {
return FALSE;
}
-void Sleep(int ms)
-{
- time_t seconds = ms / 1000;
- long milliseconds = ms - 1000 * seconds;
- struct timespec timeOut, remains;
- timeOut.tv_sec = seconds;
- timeOut.tv_nsec = milliseconds * 1000000; /* 50 milliseconds */
- nanosleep(&timeOut, &remains);
+void Sleep(int ms) {
+ if(ms == 0) {
+ // Because sched_yield() does not seem to work with Android, try to increase the pause duration,
+ // hoping to switch to the others thread (WorkerThread).
+ ms = 1;
+ }
+ sched_yield();
+ time_t seconds = ms / 1000;
+ long milliseconds = ms - 1000 * seconds;
+ struct timespec timeOut, remains;
+ timeOut.tv_sec = seconds;
+ timeOut.tv_nsec = milliseconds * 1000000;
+ nanosleep(&timeOut, &remains);
}
BOOL QueryPerformanceFrequency(PLARGE_INTEGER l) {
diff --git a/app/src/main/java/org/emulator/forty/eight/SettingsFragment.java b/app/src/main/java/org/emulator/forty/eight/SettingsFragment.java
index 5edf2cd..85e3018 100644
--- a/app/src/main/java/org/emulator/forty/eight/SettingsFragment.java
+++ b/app/src/main/java/org/emulator/forty/eight/SettingsFragment.java
@@ -350,25 +350,27 @@ public class SettingsFragment extends AppCompatDialogFragment {
Preference preferenceFlashPort2 = findPreference("settings_flash_port2");
if(preferenceFlashPort2 != null) {
- String flashPort2Filename = settings.getString(preferenceFlashPort2.getKey(), "");
- String displayName = flashPort2Filename;
- try {
- displayName = Utils.getFileName(getActivity(), flashPort2Filename);
- } catch (Exception e) {
- // Do nothing
- }
- preferenceFlashPort2.setSummary(displayName);
- //TODO offer the possibility to manage the Flash from here too.
-// preferenceFlashPort2.setOnPreferenceClickListener(preference -> {
-// Intent intent = new Intent(Intent.ACTION_OPEN_DOCUMENT);
-// intent.addCategory(Intent.CATEGORY_OPENABLE);
-// intent.setType("*/*");
-// intent.putExtra(Intent.EXTRA_TITLE, "shared.bin");
-// Fragment parentFragment = getParentFragment();
-// if (parentFragment != null)
-// parentFragment.startActivityForResult(intent, MainActivity.INTENT_PORT2LOAD);
-// return true;
-// });
+ int cCurrentRomType = NativeLib.getCurrentModel();
+ if(cCurrentRomType == 'X' || cCurrentRomType == 'Q') {
+ String flashPort2Filename = settings.getString(preferenceFlashPort2.getKey(), "");
+ String displayName = flashPort2Filename;
+ try {
+ displayName = Utils.getFileName(getActivity(), flashPort2Filename);
+ } catch (Exception e) {
+ // Do nothing
+ }
+ preferenceFlashPort2.setSummary(displayName);
+ //TODO offer the possibility to manage the Flash from here too.
+ preferenceFlashPort2.setOnPreferenceClickListener(preference -> {
+ new AlertDialog.Builder(requireContext())
+ .setTitle(getString(R.string.settings_flash_port2_title))
+ .setMessage(getString(R.string.settings_flash_port2_dialog_description))
+ .setPositiveButton(android.R.string.ok, (dialog1, which1) -> {
+ }).show();
+ return true;
+ });
+ } else
+ preferenceFlashPort2.setEnabled(false);
}
}
diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml
index 7b0486d..149f477 100644
--- a/app/src/main/res/values/strings.xml
+++ b/app/src/main/res/values/strings.xml
@@ -47,7 +47,7 @@
Change KML Script...
Show the Printer Simulator...
Tool
- Create RAM Card...
+ Create RAM Card (HP48)...
Manage Flash ROM (HP49)...
Record Macro...
Play Macro...
@@ -175,13 +175,15 @@
Custom color
Used when selecting the \'Custom color\' in the \'Other possible colors\'
- Memory Cards
+ Memory Cards HP48
Port 1 is Plugged
Port 1 is Writable
Port 2 is Plugged
Port 2 is Writable
Port 2 File
+ Memory Cards HP49/50
Port 2 Flash File
+ This file can be set from the main menu item "Manage Flash ROM (HP49)...".
Printer Simulator
Printer Model
diff --git a/app/src/main/res/xml/pref_general.xml b/app/src/main/res/xml/pref_general.xml
index c082869..9c5c20b 100644
--- a/app/src/main/res/xml/pref_general.xml
+++ b/app/src/main/res/xml/pref_general.xml
@@ -1,204 +1,179 @@
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
-
-
-
-
-
-
+
+
+
+
+
+
-
-
-
-
-
-
+
+
+
+
+
+
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
-
-
-
+
+
+
+
+
+
+
-
-
-
-
+
+
+
+
+
+
+
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+