rlm@49: #include "com_aurellem_gb_Gb.h" rlm@49: #include "../sdl/Drive.h" rlm@56: #include "../gb/GB.h" rlm@49: rlm@522: rlm@49: #include rlm@49: rlm@49: #define UNUSED(x) (void)(x) rlm@49: rlm@49: rlm@49: /* rlm@49: * Class: com_aurellem_gb_Gb rlm@49: * Method: sayHello rlm@49: * Signature: ()V rlm@49: */ rlm@49: JNIEXPORT void JNICALL Java_com_aurellem_gb_Gb_sayHello rlm@49: (JNIEnv *env, jclass clazz){ rlm@49: UNUSED(env);UNUSED(clazz); rlm@49: printf("Hello from GB\n"); rlm@49: } rlm@49: rlm@49: /* rlm@49: * Class: com_aurellem_gb_Gb rlm@49: * Method: startEmulator rlm@49: * Signature: (Ljava/lang/String;)V rlm@49: */ rlm@49: JNIEXPORT void JNICALL Java_com_aurellem_gb_Gb_startEmulator rlm@49: (JNIEnv *env, jclass clazz, jstring str){ rlm@488: UNUSED(clazz); rlm@49: rlm@49: const char *_romName = env->GetStringUTFChars(str, 0); rlm@49: size_t len = strlen(_romName); rlm@49: rlm@49: char romName[len + 1]; rlm@49: rlm@49: strcpy(romName, _romName); rlm@49: rlm@49: char* arguments[] = {"vba-rlm", romName}; rlm@49: runVBA(2, arguments); rlm@49: } rlm@49: rlm@55: rlm@55: rlm@55: rlm@53: /* rlm@53: * Class: com_aurellem_gb_Gb rlm@53: * Method: step rlm@53: * Signature: ()V rlm@53: */ rlm@83: JNIEXPORT void JNICALL Java_com_aurellem_gb_Gb_step rlm@53: (JNIEnv *env, jclass clazz){ rlm@53: step(); rlm@53: } rlm@53: rlm@53: /* rlm@53: * Class: com_aurellem_gb_Gb rlm@55: * Method: step rlm@55: * Signature: (I)V rlm@55: */ rlm@83: JNIEXPORT void JNICALL Java_com_aurellem_gb_Gb_nstep rlm@55: (JNIEnv *env, jclass clazz, jint keymask){ rlm@55: step(keymask); rlm@55: } rlm@55: rlm@92: /* rlm@92: * Class: com_aurellem_gb_Gb rlm@92: * Method: ntick rlm@92: * Signature: ()I rlm@92: */ rlm@92: JNIEXPORT jint JNICALL Java_com_aurellem_gb_Gb_ntick rlm@92: (JNIEnv *env, jclass clazz){ rlm@92: return tick(); rlm@55: rlm@92: } rlm@55: rlm@55: rlm@55: /* rlm@55: * Class: com_aurellem_gb_Gb rlm@53: * Method: shutdown rlm@53: * Signature: ()V rlm@53: */ rlm@53: JNIEXPORT void JNICALL Java_com_aurellem_gb_Gb_shutdown rlm@53: (JNIEnv *env, jclass clazz){ rlm@53: shutdown(); rlm@56: rlm@53: } rlm@53: rlm@56: /* rlm@56: * Class: com_aurellem_gb_Gb rlm@56: * Method: saveState rlm@76: * Signature: (Ljava/nio/ByteBuffer;I)J rlm@56: */ rlm@76: JNIEXPORT jlong JNICALL Java_com_aurellem_gb_Gb_saveState rlm@56: (JNIEnv *env, jclass clazz, jobject buffer, jint size){ rlm@56: char* buffer_address = rlm@56: ((char*) env->GetDirectBufferAddress(buffer)); rlm@76: long limit = gbWriteMemSaveStatePos(buffer_address, size); rlm@76: return limit; rlm@56: } rlm@53: rlm@56: /* rlm@56: * Class: com_aurellem_gb_Gb rlm@56: * Method: loadState rlm@56: * Signature: (Ljava/nio/ByteBuffer;)V rlm@56: */ rlm@56: JNIEXPORT void JNICALL Java_com_aurellem_gb_Gb_loadState rlm@56: (JNIEnv *env, jclass clazz, jobject buffer, jint size){ rlm@56: char* buffer_address = rlm@56: ((char*) env->GetDirectBufferAddress(buffer)); rlm@56: gbReadMemSaveState(buffer_address, size); rlm@56: } rlm@55: rlm@55: rlm@59: /* rlm@59: * Class: com_aurellem_gb_Gb rlm@59: * Method: getROMSize rlm@59: * Signature: ()I rlm@59: */ rlm@59: JNIEXPORT jint JNICALL Java_com_aurellem_gb_Gb_getROMSize rlm@59: (JNIEnv *env, jclass clazz){ rlm@59: return getRomSize(); rlm@59: } rlm@55: rlm@59: /* rlm@59: * Class: com_aurellem_gb_Gb rlm@59: * Method: getRAMSize rlm@59: * Signature: ()I rlm@59: */ rlm@59: JNIEXPORT jint JNICALL Java_com_aurellem_gb_Gb_getRAMSize rlm@59: (JNIEnv *env, jclass clazz){ rlm@59: return getRamSize(); rlm@59: } rlm@56: rlm@93: rlm@93: /* rlm@93: * Class: com_aurellem_gb_Gb rlm@93: * Method: getMemory rlm@93: * Signature: ([I)V rlm@93: */ rlm@93: JNIEXPORT void JNICALL Java_com_aurellem_gb_Gb_getMemory rlm@93: (JNIEnv *env, jclass clazz, jintArray arr){ rlm@93: jint *mem_store = env->GetIntArrayElements(arr, 0); rlm@93: storeMemory(mem_store); rlm@93: env->ReleaseIntArrayElements(arr, mem_store, 0); rlm@93: } rlm@93: rlm@96: /* rlm@96: * Class: com_aurellem_gb_Gb rlm@96: * Method: writeMemory rlm@96: * Signature: ([I)V rlm@96: */ rlm@96: JNIEXPORT void JNICALL Java_com_aurellem_gb_Gb_writeMemory rlm@96: (JNIEnv *env, jclass clazz, jintArray arr){ rlm@96: jint *new_memory = env->GetIntArrayElements(arr, 0); rlm@96: writeMemory(new_memory); rlm@96: env->ReleaseIntArrayElements(arr, new_memory, 0); rlm@96: } rlm@96: rlm@93: rlm@60: /* rlm@60: * Class: com_aurellem_gb_Gb rlm@60: * Method: getRAM rlm@60: * Signature: ([I)V rlm@60: */ rlm@60: JNIEXPORT void JNICALL Java_com_aurellem_gb_Gb_getRAM rlm@60: (JNIEnv *env, jclass clazz, jintArray arr){ rlm@60: jint *ram_store = env->GetIntArrayElements(arr, 0); rlm@60: storeRam(ram_store); rlm@60: env->ReleaseIntArrayElements(arr, ram_store, 0); rlm@60: } rlm@56: rlm@59: rlm@61: /* rlm@61: * Class: com_aurellem_gb_Gb rlm@61: * Method: getROM rlm@61: * Signature: ([I)V rlm@61: */ rlm@61: JNIEXPORT void JNICALL Java_com_aurellem_gb_Gb_getROM rlm@61: (JNIEnv *env, jclass clazz, jintArray arr){ rlm@93: jint *rom_store = env->GetIntArrayElements(arr, 0); rlm@93: storeRom(rom_store); rlm@93: env->ReleaseIntArrayElements(arr, rom_store, 0); rlm@61: } rlm@59: rlm@61: rlm@61: /* rlm@61: * Class: com_aurellem_gb_Gb rlm@191: * Method: writeROM rlm@191: * Signature: ([I)V rlm@191: */ rlm@191: JNIEXPORT void JNICALL Java_com_aurellem_gb_Gb_writeROM rlm@191: (JNIEnv *env, jclass clazz, jintArray arr){ rlm@191: jint *new_rom = env->GetIntArrayElements(arr, 0); rlm@191: writeRom(new_rom); rlm@191: env->ReleaseIntArrayElements(arr, new_rom, 0); rlm@191: } rlm@191: rlm@191: rlm@191: rlm@191: /* rlm@191: * Class: com_aurellem_gb_Gb rlm@61: * Method: getWRAM rlm@61: * Signature: ([I)V rlm@61: */ rlm@61: JNIEXPORT void JNICALL Java_com_aurellem_gb_Gb_getWRAM rlm@61: (JNIEnv *env, jclass clazz, jintArray arr){ rlm@61: jint *ram_store = env->GetIntArrayElements(arr, 0); rlm@61: storeWRam(ram_store); rlm@61: env->ReleaseIntArrayElements(arr, ram_store, 0); rlm@61: } rlm@61: rlm@61: rlm@61: /* rlm@61: * Class: com_aurellem_gb_Gb rlm@61: * Method: getVRAM rlm@61: * Signature: ([I)V rlm@61: */ rlm@61: JNIEXPORT void JNICALL Java_com_aurellem_gb_Gb_getVRAM rlm@61: (JNIEnv *env, jclass clazz, jintArray arr){ rlm@61: jint *ram_store = env->GetIntArrayElements(arr, 0); rlm@61: storeVRam(ram_store); rlm@61: env->ReleaseIntArrayElements(arr, ram_store, 0); rlm@61: } rlm@61: rlm@61: rlm@62: /* rlm@62: * Class: com_aurellem_gb_Gb rlm@62: * Method: getRegisters rlm@62: * Signature: ([I)V rlm@62: */ rlm@62: JNIEXPORT void JNICALL Java_com_aurellem_gb_Gb_getRegisters rlm@62: (JNIEnv *env, jclass clazz, jintArray arr){ rlm@62: jint *registers_store = env->GetIntArrayElements(arr, 0); rlm@62: storeRegisters(registers_store); rlm@62: env->ReleaseIntArrayElements(arr, registers_store, 0); rlm@62: } rlm@61: rlm@62: rlm@100: /* rlm@100: * Class: com_aurellem_gb_Gb rlm@100: * Method: writeRegisters rlm@100: * Signature: ([I)V rlm@100: */ rlm@100: JNIEXPORT void JNICALL Java_com_aurellem_gb_Gb_writeRegisters rlm@100: (JNIEnv *env, jclass clazz, jintArray arr){ rlm@100: jint *new_registers = env->GetIntArrayElements(arr, 0); rlm@100: setRegisters(new_registers); rlm@100: env->ReleaseIntArrayElements(arr, new_registers, 0); rlm@100: } rlm@100: rlm@488: rlm@488: int intensity[32] = { rlm@488: 0x00, 0x10, 0x20, 0x30, 0x40, 0x50, 0x5e, 0x6c, 0x7a, 0x88, 0x94, rlm@488: 0xa0, 0xae, 0xb7, 0xbf, 0xc6, 0xce, 0xd3, 0xd9, 0xdf, 0xe3, 0xe7, rlm@488: 0xeb, 0xef, 0xf3, 0xf6, 0xf9, 0xfb, 0xfd, 0xfe, 0xff, 0xff }; rlm@488: rlm@488: int influence[3][3] = rlm@488: { rlm@488: {16,4,4}, rlm@488: {8,16,8}, rlm@488: {0,8,16} rlm@488: }; rlm@488: rlm@488: int* translateRGB(int* rgb, int* store){ rlm@488: rlm@488: int m[3][3]; rlm@488: int i,j; rlm@488: rlm@488: for (i=0;i<3;i++){ rlm@488: for (j=0;j<3;j++){ rlm@488: m[i][j] = (intensity[rgb[i]>>3]*influence[i][j]) >> 5;}} rlm@488: rlm@488: for (i=0;i<3;i++) rlm@488: { rlm@488: if (m[0][i]>m[1][i]) rlm@488: { rlm@488: j=m[0][i]; rlm@488: m[0][i]=m[1][i]; rlm@488: m[1][i]=j; rlm@488: } rlm@488: rlm@488: if (m[1][i]>m[2][i]) rlm@488: { rlm@488: j=m[1][i]; rlm@488: m[1][i]=m[2][i]; rlm@488: m[2][i]=j; rlm@488: } rlm@488: rlm@488: if (m[0][i]>m[1][i]) rlm@488: { rlm@488: j=m[0][i]; rlm@488: m[0][i]=m[1][i]; rlm@488: m[1][i]=j; rlm@488: } rlm@488: rlm@488: store[i]=(((m[0][i]+m[1][i]*2+m[2][i]*4)*5) >> 4)+32; rlm@488: } rlm@488: return store; rlm@488: } rlm@488: rlm@488: /* rlm@488: * Class: com_aurellem_gb_Gb rlm@488: * Method: translateRGB rlm@488: * Signature: ([I[I)V rlm@488: */ rlm@488: JNIEXPORT void JNICALL Java_com_aurellem_gb_Gb_translateRGB rlm@488: (JNIEnv *env, jclass clazz, jintArray rgb, jintArray store){ rlm@488: jint *RGB_Arr = env->GetIntArrayElements(rgb, 0); rlm@488: jint *store_Arr = env->GetIntArrayElements(store,0); rlm@488: translateRGB(RGB_Arr, store_Arr); rlm@488: env->ReleaseIntArrayElements(rgb, RGB_Arr, 0); rlm@488: env->ReleaseIntArrayElements(store, store_Arr, 0); rlm@488: } rlm@496: rlm@496: rlm@496: /* rlm@496: * Class: com_aurellem_gb_Gb rlm@496: * Method: getPixels rlm@496: * Signature: ([I)V rlm@496: */ rlm@496: JNIEXPORT void JNICALL Java_com_aurellem_gb_Gb_getPixels rlm@496: (JNIEnv *env, jclass clazz, jintArray arr){ rlm@496: jint *pixel_store = env->GetIntArrayElements(arr, 0); rlm@496: getPixels32(pixel_store); rlm@496: env->ReleaseIntArrayElements(arr, pixel_store, 0); rlm@496: } rlm@496: rlm@496: /* rlm@496: * Class: com_aurellem_gb_Gb rlm@496: * Method: nwritePNG rlm@496: * Signature: (Ljava/lang/String;)V rlm@496: */ rlm@496: JNIEXPORT void JNICALL Java_com_aurellem_gb_Gb_nwritePNG rlm@496: (JNIEnv *env, jclass clazz, jstring filename){ rlm@496: const char *_filename = env->GetStringUTFChars(filename, 0); rlm@496: gbWritePNGFile(_filename); rlm@496: } rlm@496: rlm@496: rlm@522: rlm@522: /* rlm@522: * Class: com_aurellem_gb_Gb rlm@522: * Method: readMemory rlm@522: * Signature: (I)I rlm@522: */ rlm@522: JNIEXPORT jint JNICALL Java_com_aurellem_gb_Gb_readMemory rlm@522: (JNIEnv *env, jclass clazz, jint address){ rlm@522: return (jint) gbReadMemory((u16) address); rlm@522: } rlm@523: rlm@523: /* rlm@523: * Class: com_aurellem_gb_Gb rlm@523: * Method: getFrameSound rlm@524: * Signature: ([B)V rlm@523: */ rlm@523: JNIEXPORT void JNICALL Java_com_aurellem_gb_Gb_getFrameSound rlm@524: (JNIEnv *env, jclass clazz, jbyteArray arr){ rlm@524: jbyte *sound_store = env->GetByteArrayElements(arr, 0); rlm@523: int i; rlm@524: rlm@524: rlm@524: u8* soundBytes = (u8*) soundFrameSound; rlm@524: for (i = 0; i < 44100*2; i++){ rlm@524: sound_store[i] = (jbyte) soundBytes[i]; rlm@523: } rlm@524: rlm@524: /* rlm@525: u8* soundBytes = (u8*) soundFinalWave; rlm@525: for (i = 0; i < 1470*2 ; i++){ rlm@524: sound_store[i] = (jbyte) soundBytes[i]; rlm@525: } rlm@524: */ rlm@524: rlm@524: env->ReleaseByteArrayElements(arr, sound_store, 0); rlm@523: } rlm@523: rlm@523: rlm@523: /* rlm@523: * Class: com_aurellem_gb_Gb rlm@523: * Method: getSoundFrameWritten rlm@523: * Signature: ()I rlm@523: */ rlm@523: JNIEXPORT jint JNICALL Java_com_aurellem_gb_Gb_getSoundFrameWritten rlm@523: (JNIEnv *env, jclass clazz){ rlm@523: return soundFrameSoundWritten; rlm@523: } rlm@523: rlm@523: /* rlm@523: * Class: com_aurellem_gb_Gb rlm@523: * Method: setSoundFrameWritten rlm@523: * Signature: (I)V rlm@523: */ rlm@523: JNIEXPORT void JNICALL Java_com_aurellem_gb_Gb_setSoundFrameWritten rlm@523: (JNIEnv *env, jclass clazz , jint newSoundFrameWritten){ rlm@523: soundFrameSoundWritten = newSoundFrameWritten; rlm@523: } rlm@523: rlm@525: rlm@525: /* rlm@525: * Class: com_aurellem_gb_Gb rlm@525: * Method: getFrameSound2 rlm@525: * Signature: ([B)V rlm@525: */ rlm@525: JNIEXPORT void JNICALL Java_com_aurellem_gb_Gb_getFrameSound2 rlm@525: (JNIEnv *env, jclass clazz, jbyteArray arr){ rlm@525: setbuf(stdout, NULL); rlm@525: rlm@525: jbyte *sound_store = env->GetByteArrayElements(arr, 0); rlm@525: int i; rlm@525: rlm@525: for (i = 0; i < 1470*2; i++){ rlm@525: sound_store[i] = (jbyte) soundCopyBuffer[i]; rlm@525: } rlm@525: rlm@525: env->ReleaseByteArrayElements(arr, sound_store, 0); rlm@525: rlm@525: }