void draw_osk() { int middle_x = 240; int y = 230; int i; msxPutString(5,27,lawngreen,g_osk_buffer); msxPutCharAbsolute((strlen(g_osk_buffer))*6+5*8,27*8,cyan,'_'); //pgFillBox(middle_x-16, y-4,middle_x+13, y+26, darkgray); pgDrawFrame(middle_x-16, y-4,middle_x+13, y+26, gray); pgDrawFrame(30,y-6,480-30,y+28,gray); for (i=-6;i<=6;i++) { int color = (i==0) ? cyan : gray; int px = middle_x + (i*30); msxPutCharAbsolute( px-4,y+1,color, get_osk_character(PSP_CTRL_TRIANGLE,g_osk_cursor+i)); msxPutCharAbsolute(px+3,y+8,color, get_osk_character(PSP_CTRL_CIRCLE,g_osk_cursor+i)); msxPutCharAbsolute(px-4,y+15,color, get_osk_character(PSP_CTRL_CROSS,g_osk_cursor+i)); msxPutCharAbsolute(px-11,y+8,color, get_osk_character(PSP_CTRL_SQUARE,g_osk_cursor+i)); } }
int msgBoxLinesRaw(const char *msg,int rev_line) { unsigned int len,width; unsigned char c; char str[256]; int i,j,x,y,lines,ret; if (!msg) return -1; if (!msg[0]) return -1; pgCopyScreen(); lines=1; j=0; len=0; width=0; while ((c=msg[len])) { if (((c>=0x80) && (c<0xa0)) || (c>=0xe0)) { len++; } else { if (c=='\n') { lines++; if (width<(len-j)) width=len-j; j=len+1; } } len++; } if (width<(len-j)) width=len-j; if (!width) width=strlen(msg); y=(272-lines*12)/2; x=(480-width*6)/2; pgFillBox(x-12-1,y-6-1,x+width*6+12+1,y+lines*12+6,BOX_COLOR); pgDrawFrame(x-12,y-6,x+width*6+12,y+lines*12+6-1,FRAME_COLOR); len=0; for (i=0;i<lines;i++){ j=0; while ((c=msg[len])) { if (((c>=0x80) && (c<0xa0)) || (c>=0xe0)) { str[j++]=msg[len++]; } else { if (c=='\n') break; } str[j++]=msg[len++]; } if (msg[len]=='\n') len++; str[j]=0; if (i==rev_line) { width=mh_length(str); x=(480-width)>>1; pgFillBox(x-1,y-1,x+width+1,y+12-1,0); pgDrawFrame(x-1,y-1,x+width+1,y+12-1,7<<10); mh_printCenter(y,str,28<<5); } else mh_printCenter(y,str,TEXT_COLOR);
//////////////////////////////////////////////////////////////////////////////////////// // Multiple lines message box //////////////////////////////////////////////////////////////////////////////////////// int msgBoxLines(const char *msg,int delay_vblank) { int len,width; unsigned char c; char str[256]; int i,j,x,y,lines,ret; if (!msg) return -1; if (!(msg[0])) return -1; pgCopyScreen(); lines=1; j=0; len=0; width=0; while ((c=msg[len])) { if (((c>=0x80) && (c<0xa0)) || (c>=0xe0)) { len++; } else { if (c=='\n') { lines++; if (width<(len-j)) width=len-j; j=len+1; } } len++; } if (width<(len-j)) width=len-j; if (!width) width=strlen(msg); y=(272-lines*12)/2; x=(480-width*6)/2; pgFillBox(x-12-1,y-6-1,x+width*6+12+1,y+lines*12+6,BOX_COLOR); pgDrawFrame(x-12,y-6,x+width*6+12,y+lines*12+6-1,FRAME_COLOR); len=0; for (i=0;i<lines;i++){ j=0; while ((c=msg[len])) { if (((c>=0x80) && (c<0xa0)) || (c>=0xe0)) { str[j++]=msg[len++]; } else { if (c=='\n') break; } str[j++]=msg[len++]; } if (msg[len]=='\n') len++; str[j]=0; mh_printCenter(y,str,TEXT_COLOR); ret=y; y+=12; } pgScreenFlipV(); if (delay_vblank>0) pgWaitVn(delay_vblank); return ret; }
//////////////////////////////////////////////////////////////////////////////////////// // Message box //////////////////////////////////////////////////////////////////////////////////////// void msgBox(const char *msg,int delay_vblank) { int len; char str[60]; pgCopyScreen(); memcpy(str,msg,50); str[50]=0; len=strlen(msg); if (len>=50) { str[50-3]=str[50-2]=str[50-1]='.'; len=49; } len*=8; pgFillBox(240-len/2-20-1,136-12-1,240+len/2+20+1,136+18+1,BOX_COLOR); pgDrawFrame(240-len/2-20,136-12,240+len/2+20,136+18,FRAME_COLOR); pgPrintCenter(17,TEXT_COLOR,str); pgScreenFlipV(); if (delay_vblank<=0) delay_vblank=1; pgWaitVn(delay_vblank); }
void OSPC_Play(char *fname,int release,int vol) { u16 *menu_bg; u16 *dst,*src; int i,j,pollcpt; char str[256]; char *emulator[3]={"Unknown","Zsnes","Snes9x"}; uint8 *scr; OSPC_Init(); if (i=OSPC_Load(fname)) { sprintf(str,"Error at SPC loading, code : %d",i); msgBoxLines(str,60); //gp32_pause(); //GpAppExit(); return; } OSPC_id=OSPC_GetID666(spc_data); OSPC_sound_fd = sceAudioChReserve( -1, 1024, 0 ); OSPC_exit=0; OSPC_volume=vol; OSPC_thread = sceKernelCreateThread( "OSPC Thread", (SceKernelThreadEntry)OSPC_PlayThread, 0x8, 256*1024, 0, 0 ); if (OSPC_thread<0) { msgBoxLines("Cannot create OSPC playback thread",60); } else { //init start time scePowerSetClockFrequency(266,266,133); sceKernelLibcGettimeofday( &OSPC_start_time, 0 ); sceKernelStartThread( OSPC_thread, 0, 0 ); if (release) return; //init bg menu_bg=(u16*)malloc_64(480*272*2); dst=menu_bg; show_background(bg_img_mul,(os9x_lowbat?0x600000:0)); for (i=0;i<272;i++) { src = (u16*)pgGetVramAddr(0,i); memcpy(dst,src,480*2); dst+=480; } //init fx fx_init(); for (;;) { //show bg OSPC_show_bg(menu_bg); //show bg fx fx_main(pgGetVramAddr(0,0)); //batt infos show_batteryinfo(); //music info //draw frame pgDrawFrame(14,14,20+230+5+1,75+1,12|(12<<5)|(12<<10)); pgDrawFrame(13,13,20+230+5+2,75+2,30|(30<<5)|(30<<10)); pgDrawFrame(12,12,20+230+5+3,75+3,12|(12<<5)|(12<<10)); pgFillBoxHalfer(15,15,20+230+5,75); // if (strlen(OSPC_id->gametitle)) sprintf(str,"Game : %s",OSPC_id->gametitle); else sprintf(str,"Game : unknown"); mh_print(20,20,(char*)str,30|(30<<5)|(30<<10)); if (strlen(OSPC_id->songname)) sprintf(str,"Song : %s",OSPC_id->songname); else sprintf(str,"Song : unknown"); mh_print(20,30,(char*)str,30|(30<<5)|(30<<10)); if (strlen(OSPC_id->dumper)) sprintf(str,"Dumper : %s",OSPC_id->dumper); else sprintf(str,"Dumper : unknown"); mh_print(20,40,(char*)str,30|(30<<5)|(30<<10)); if (strlen(OSPC_id->comments)) sprintf(str,"Comments : %s",OSPC_id->comments); else sprintf(str,"Comments : unknown"); mh_print(20,50,(char*)str,30|(30<<5)|(30<<10)); if (strlen(OSPC_id->author)) sprintf(str,"Author : %s",OSPC_id->author); else sprintf(str,"Author : unknown"); mh_print(20,60,(char*)str,30|(30<<5)|(30<<10)); //time infos //draw frame //draw frame pgDrawFrame(14,94,20+65+5+1,116,8|(8<<5)|(16<<10)); pgDrawFrame(13,93,20+65+5+2,117,28|(28<<5)|(31<<10)); pgDrawFrame(12,92,20+65+5+3,118,8|(8<<5)|(16<<10)); pgFillBoxHalfer(15,95,20+65+5,115); sceKernelLibcGettimeofday( &OSPC_cur_time, 0 ); i=(OSPC_cur_time.tv_sec-OSPC_start_time.tv_sec)+(OSPC_cur_time.tv_usec-OSPC_start_time.tv_usec)/1000000; sprintf(str,"%2d%c%.2d / %2d:%.2d",i/60,((i&1)?':':' '),i%60,OSPC_id->playtime/60,OSPC_id->playtime%60); mh_print(20,100,(char*)str,(20)|(31<<5)|(18<<10)); if (get_pad()) break; pgScreenFlip(); } OSPC_exit=1; sceKernelWaitThreadEnd( OSPC_thread, NULL ); sceKernelDeleteThread( OSPC_thread ); OSPC_thread=-1; free(menu_bg); fx_close(); } sceAudioChRelease( OSPC_sound_fd ); OSPC_Stop(); OSPC_Close(); if (OSPC_id) free(OSPC_id); }