bad-apple/NDS/source/main.cpp
2021-12-27 05:46:09 +07:00

117 lines
2.5 KiB
C++

#include <nds.h>
#include <filesystem.h>
#include <iostream>
#include <fstream>
#include <maxmod9.h>
#define TIMER_SPEED (BUS_CLOCK/1024)
FILE* file = 0;
std::ifstream in;
uint16_t blockSize;
char buffer[256*192*2];
char buffer2[256*256*2];
bool shouldDraw = false;
bool queueAvaible = false;
void VBlankProc() {
mmStreamUpdate();
if (shouldDraw) {
shouldDraw = false;
if (queueAvaible) {
queueAvaible = false;
dmaCopyWordsAsynch(3, buffer2, VRAM_A, 256*192*2);
}
}
}
void TimerTick() {
shouldDraw = true;
}
mm_word on_stream_request( mm_word length, mm_addr dest, mm_stream_formats format ) {
if(file){
size_t samplesize = 1;
switch(format){
case MM_STREAM_8BIT_MONO: samplesize = 1; break;
case MM_STREAM_8BIT_STEREO: samplesize = 2; break;
case MM_STREAM_16BIT_MONO: samplesize = 2; break;
case MM_STREAM_16BIT_STEREO: samplesize = 4; break;
}
int res = fread(dest,samplesize,length,file);
if(res){
length = res;
} else {
mmStreamClose();
fclose(file);
length = 0;
}
}
return length;
}
int main(void) {
consoleDemoInit();
videoSetMode(MODE_FB0);
vramSetBankA(VRAM_A_LCD);
std::cerr << "<=== init ===>" << std::endl;
// nitrofiles initialization
if (nitroFSInit(NULL)) {
chdir("nitro:/");
std::cerr << "nitrofs init success" << std::endl;
} else {
consoleDemoInit();
std::cout << "failed to init nitrofs" << std::endl;
std::cout << "Please launch the game\nfrom nds-bootstrap from twilightmenu" << std::endl;
while(1) {
// freezee
}
}
mmInitDefault((char*)"soundbank.bin");
file = fopen("music.raw","rb");
mm_stream mystream;
mystream.sampling_rate = 22050; // sampling rate = 25khz
mystream.buffer_length = 2400; // buffer length = 1200 samples
mystream.callback = on_stream_request; // set callback function
mystream.format = MM_STREAM_16BIT_MONO; // format = stereo 16-bit
mystream.timer = MM_TIMER0; // use hardware timer 0
mystream.manual = true; // use manual filling
mmStreamOpen( &mystream );
// quick hack... sometime it need to update once?
mmStreamUpdate(); mmStreamUpdate();
irqSet(IRQ_VBLANK, VBlankProc);
timerStart(2, ClockDivider_1024, TIMER_FREQ_1024(30), TimerTick);
in.open("data_compress", std::ios::in | std::ios::binary);
while(true) {
timerElapsed(1);
if (!in.eof() && !queueAvaible) {
in.read((char*)&blockSize, sizeof(blockSize));
in.read(buffer, blockSize);
swiDecompressLZSSWram(buffer, buffer2);
queueAvaible = true;
}
// swiWaitForVBlank();
}
// crashh
return 0;
}