diff --git a/assets/hp48s b/assets/hp48s new file mode 100644 index 0000000..8ab7822 Binary files /dev/null and b/assets/hp48s differ diff --git a/assets/rams b/assets/rams new file mode 100644 index 0000000..76b8bc2 Binary files /dev/null and b/assets/rams differ diff --git a/assets/roms b/assets/roms new file mode 100644 index 0000000..7711384 Binary files /dev/null and b/assets/roms differ diff --git a/jni/hp48.h b/jni/hp48.h index da3897c..9a0f4bb 100644 --- a/jni/hp48.h +++ b/jni/hp48.h @@ -242,6 +242,12 @@ typedef struct saturn_t { #define NIBBLES_PER_ROW 0x22 +extern char rom_filename [256]; +extern char ram_filename [256]; +extern char conf_filename [256]; +extern char port1_filename [256]; +extern char port2_filename [256]; + extern int got_alarm; extern int set_t1; diff --git a/jni/init.c b/jni/init.c index 012de6e..b2dd2ed 100644 --- a/jni/init.c +++ b/jni/init.c @@ -1063,7 +1063,7 @@ const char *fname; { int ram_size; - if (!read_rom_file(romFileName, &saturn.rom, &rom_size)) + if (!read_rom_file(fname, &saturn.rom, &rom_size)) return 0; dev_memory_init(); @@ -1171,7 +1171,7 @@ read_files() strcpy(fnam, path); - strcat(fnam, "rom"); + strcat(fnam, rom_filename); if (!read_rom_file(fnam, &saturn.rom, &rom_size)) @@ -1180,7 +1180,7 @@ read_files() rom_is_new = 0; strcpy(fnam, path); - strcat(fnam, "hp48"); + strcat(fnam, conf_filename); if (NULL == (fp = fopen(fnam, "r"))) { if (!quiet) @@ -1329,7 +1329,7 @@ read_files() } strcpy(fnam, path); - strcat(fnam, "ram"); + strcat(fnam, ram_filename); if ((fp = fopen(fnam, "r")) == NULL) { if (!quiet) LOGE( "%s: can\'t open %s\n", progname, fnam); @@ -1346,7 +1346,7 @@ read_files() saturn.port1 = (unsigned char *)0; strcpy(fnam, path); - strcat(fnam, "port1"); + strcat(fnam, port1_filename); if (stat(fnam, &st) >= 0) { port1_size = 2 * st.st_size; @@ -1388,7 +1388,7 @@ read_files() saturn.port2 = (unsigned char *)0; strcpy(fnam, path); - strcat(fnam, "port2"); + strcat(fnam, port2_filename); if (stat(fnam, &st) >= 0) { port2_size = 2 * st.st_size; @@ -1665,7 +1665,7 @@ write_files() //strcat(path, "/"); strcpy(fnam, path); - strcat(fnam, "hp48"); + strcat(fnam, conf_filename); LOGI("trying to save: %s", fnam); @@ -1761,7 +1761,7 @@ LOGI("trying to save: %s", fnam); if (rom_is_new) { strcpy(fnam, path); - strcat(fnam, "rom"); + strcat(fnam, rom_filename); if (!write_mem_file(fnam, saturn.rom, rom_size)) return 0; } @@ -1772,14 +1772,14 @@ LOGI("trying to save: %s", fnam); ram_size = RAM_SIZE_SX; strcpy(fnam, path); - strcat(fnam, "ram"); + strcat(fnam, ram_filename); if (!write_mem_file(fnam, saturn.ram, ram_size)) return 0; if ((port1_size > 0) && port1_is_ram) { strcpy(fnam, path); - strcat(fnam, "port1"); + strcat(fnam, port1_filename); if (!write_mem_file(fnam, saturn.port1, port1_size)) return 0; } @@ -1787,7 +1787,7 @@ LOGI("trying to save: %s", fnam); if ((port2_size > 0) && port2_is_ram) { strcpy(fnam, path); - strcat(fnam, "port2"); + strcat(fnam, port2_filename); if (!write_mem_file(fnam, saturn.port2, port2_size)) return 0; } @@ -1811,7 +1811,21 @@ init_emulator() } init_saturn(); - if (!read_rom(romFileName)) + + char path[1024]; + + FILE *sd; + if (NULL == (sd = fopen("/sdcard/.hp48/", "rw"))) { + strcpy(path, "/data/data/org.ab.x48/"); + + } + else + strcpy(path, "/sdcard/.hp48/"); + + + strcat(path, rom_filename); + + if (!read_rom(path)) exit(1); return 0; diff --git a/jni/main.c b/jni/main.c index a5c523a..c67209d 100644 --- a/jni/main.c +++ b/jni/main.c @@ -245,13 +245,44 @@ printf("%s\n", nl_langinfo(CODESET));*/ return 0; } +char rom_filename [256]; +char ram_filename [256]; +char conf_filename [256]; +char port1_filename [256]; +char port2_filename [256]; void -Java_org_ab_x48_X48_registerClass( JNIEnv* env, jobject caller, jobject callback ) +Java_org_ab_x48_X48_registerClass( JNIEnv* env, jobject caller, jobject callback, jstring rom, jstring ram, jstring conf, +jstring port1, jstring port2 ) { LOGI("--registerClass--"); android_env = env; android_callback = (*android_env)->NewGlobalRef(env, callback); + + const char * fp = (*android_env)->GetStringUTFChars(env, rom, NULL); + strcpy(rom_filename, fp); + (*android_env)->ReleaseStringUTFChars(env, rom, fp); + + fp = (*android_env)->GetStringUTFChars(env, ram, NULL); + strcpy(ram_filename, fp); + (*android_env)->ReleaseStringUTFChars(env, ram, fp); + + fp = (*android_env)->GetStringUTFChars(env, conf, NULL); + strcpy(conf_filename, fp); + (*android_env)->ReleaseStringUTFChars(env, conf, fp); + + fp = (*android_env)->GetStringUTFChars(env, port1, NULL); + strcpy(port1_filename, fp); + (*android_env)->ReleaseStringUTFChars(env, port1, fp); + + fp = (*android_env)->GetStringUTFChars(env, port2, NULL); + strcpy(port2_filename, fp); + (*android_env)->ReleaseStringUTFChars(env, port2, fp); + + /*strcpy(rom_filename , "roms"); + strcpy(ram_filename, "rams"); + strcpy(conf_filename , "hp48s");*/ + jclass x48 = (*android_env)->GetObjectClass(env, android_callback); LOGI("--x48 registered--"); refreshMainScreen = (*android_env)->GetMethodID(android_env, x48, "refreshMainScreen", "([S)V"); @@ -262,28 +293,28 @@ Java_org_ab_x48_X48_registerClass( JNIEnv* env, jobject caller, jobject callback LOGI("--methods registered--"); } -jstring +void Java_org_ab_x48_X48_stopHPEmulator( JNIEnv* env, jobject thiz ) { exit (0); //exit_state = 0; } -jstring +void Java_org_ab_x48_X48_saveState( JNIEnv* env, jobject thiz ) { LOGI("save_state"); write_files(); } -jstring +void Java_org_ab_x48_X48_resetHPEmulator( JNIEnv* env, jobject thiz ) { do_reset(); } -jstring +void Java_org_ab_x48_X48_startHPEmulator( JNIEnv* env, jobject thiz ) { @@ -359,7 +390,7 @@ sigset_t set; } while (exit_state); LOGI("exit loop"); - return (*env)->NewStringUTF(env, "Hello from JNI !"); + } jint diff --git a/res/values/strings.xml b/res/values/strings.xml index bdc4a6d..597b2a3 100644 --- a/res/values/strings.xml +++ b/res/values/strings.xml @@ -54,4 +54,6 @@ Prevents lite controls to show up when touching LCD Enable sound EXPERIMENTAL: system beeps ok, so far +HP48 S +Emulate an HP48S (Need App Restart !) diff --git a/src/org/ab/x48/AssetUtil.java b/src/org/ab/x48/AssetUtil.java index d6686de..2e0479c 100644 --- a/src/org/ab/x48/AssetUtil.java +++ b/src/org/ab/x48/AssetUtil.java @@ -6,14 +6,15 @@ import java.io.IOException; import java.io.InputStream; import android.content.res.AssetManager; +import android.os.Environment; import android.util.Log; public class AssetUtil { public static void copyAsset(AssetManager am, boolean force) { - File sd = new File("/sdcard"); + File sd = Environment.getExternalStorageDirectory(); if (sd.exists() && sd.isDirectory()) { - File hpDir = new File("/sdcard/.hp48"); + File hpDir = new File(sd, ".hp48"); copyAsset(am, hpDir.exists() || hpDir.mkdir(), force); } else { copyAsset(am, false, force); @@ -21,7 +22,7 @@ public class AssetUtil { } public static File getSDDir() { - File hpDir = new File("/sdcard/.hp48"); + File hpDir = new File(Environment.getExternalStorageDirectory(), ".hp48"); if (hpDir.exists()) return hpDir; return null; @@ -32,17 +33,24 @@ public class AssetUtil { String assets[] = am.list( "" ); for( int i = 0 ; i < assets.length ; i++ ) { boolean hp48 = assets[i].equals("hp48"); + boolean hp48s = assets[i].equals("hp48s"); boolean ram = assets[i].equals("ram"); boolean rom = assets[i].equals("rom"); + boolean rams = assets[i].equals("rams"); + boolean roms = assets[i].equals("roms"); int required = 0; if (ram) required = 131072; + else if (rams) + required = 32768; else if (rom) required = 524288; + else if (roms) + required = 262144; //boolean SKUNK = assets[i].equals("SKUNK"); - if (hp48 || rom || ram) { - String rep = sd?"/sdcard/.hp48/":"/data/data/org.ab.x48/"; - File fout = new File(rep + assets[i]); + if (hp48 || rom || ram || hp48s || roms || rams) { + File rep = sd?new File(Environment.getExternalStorageDirectory(), ".hp48"):Environment.getDataDirectory(); + File fout = new File(rep, assets[i]); if (!fout.exists() || fout.length() == 0 || (required > 0 && fout.length() != required) || force) { Log.i("x48", "Overwriting " + assets[i]); FileOutputStream out = new FileOutputStream(fout); @@ -63,9 +71,9 @@ public class AssetUtil { } public static boolean isFilesReady() { - File hpDir = new File("/sdcard/.hp48"); + File hpDir = new File(Environment.getExternalStorageDirectory(), ".hp48"); if (!hpDir.exists() || !hpDir.isDirectory()) { - hpDir = new File("/data/data/org.ab.x48/"); + hpDir = Environment.getDataDirectory(); if (!hpDir.exists() || !hpDir.isDirectory()) return false; } diff --git a/src/org/ab/x48/EmulatorThread.java b/src/org/ab/x48/EmulatorThread.java index 2f42537..a76d2bc 100644 --- a/src/org/ab/x48/EmulatorThread.java +++ b/src/org/ab/x48/EmulatorThread.java @@ -11,7 +11,7 @@ public class EmulatorThread extends Thread { } public void run() { - x48.registerClass(x48); + x48.registerClass(); x48.startHPEmulator(); } diff --git a/src/org/ab/x48/Settings.java b/src/org/ab/x48/Settings.java index 0871219..7d5900f 100644 --- a/src/org/ab/x48/Settings.java +++ b/src/org/ab/x48/Settings.java @@ -24,6 +24,13 @@ public class Settings extends PreferenceActivity { inlinePrefCat.setTitle(R.string.general_preferences); root.addPreference(inlinePrefCat); + CheckBoxPreference h48Pref = new CheckBoxPreference(this); + h48Pref.setKey("hp48s"); + h48Pref.setDefaultValue(false); + h48Pref.setTitle(R.string.hp48s); + h48Pref.setSummary(R.string.hp48s_summary); + inlinePrefCat.addPreference(h48Pref); + CheckBoxPreference savePref = new CheckBoxPreference(this); savePref.setKey("saveOnExit"); savePref.setTitle(R.string.saveonexit_msgbox); diff --git a/src/org/ab/x48/X48.java b/src/org/ab/x48/X48.java index 8efada1..9139758 100644 --- a/src/org/ab/x48/X48.java +++ b/src/org/ab/x48/X48.java @@ -72,6 +72,7 @@ public class X48 extends Activity { setContentView(R.layout.main); mainView = (HPView) findViewById(R.id.hpview); + hp48s = PreferenceManager.getDefaultSharedPreferences(this).getBoolean("hp48s", false); checkPrefs(); } @@ -121,13 +122,13 @@ public class X48 extends Activity { mainView.refreshIcons(i); } - public native String startHPEmulator(); - public native String resetHPEmulator(); - public native String saveState(); - public native String stopHPEmulator(); + public native void startHPEmulator(); + public native void resetHPEmulator(); + public native void saveState(); + public native void stopHPEmulator(); public native int buttonPressed(int code); public native int buttonReleased(int code); - public native void registerClass(X48 instance); + public native void registerClass(X48 instance, String rom_filename, String ram_filename, String conf_filename, String port1_filename, String port2_filename); public native int fillAudioData(short data []); public native int fillScreenData(short data []); public native void flipScreen(); @@ -332,8 +333,14 @@ public class X48 extends Activity { } private boolean saveonExit; - - private void managePort(int number, String value) { + private boolean hp48s; + + public boolean isHp48s() { + return hp48s; +} + + +private void managePort(int number, String value) { int size = Integer.parseInt(value); File f = AssetUtil.getSDDir(); if (f != null) { @@ -417,4 +424,10 @@ public class X48 extends Activity { super.onConfigurationChanged(newConfig); } + + public void registerClass() { + registerClass(this, hp48s?"roms":"rom", hp48s?"rams":"ram", hp48s?"hp48s":"hp48", + hp48s?"port1s":"port1", hp48s?"port2s":"port2"); + } + } \ No newline at end of file