void FULLSCREEN_BuildModeList(_THIS) { _kernel_swi_regs regs; char *enumInfo = NULL; char *enum_ptr; int *blockInfo; int j; int num_modes; regs.r[0] = 2; regs.r[2] = 0; regs.r[6] = 0; regs.r[7] = 0; _kernel_swi(OS_ScreenMode, ®s, ®s); num_modes = -regs.r[2]; this->info.video_mem = regs.r[5]/1024; enumInfo = (unsigned char *)SDL_malloc(-regs.r[7]); if (enumInfo == NULL) { SDL_OutOfMemory(); return; } regs.r[2] = 0; regs.r[6] = (int)enumInfo; regs.r[7] = -regs.r[7]; _kernel_swi(OS_ScreenMode, ®s, ®s); enum_ptr = enumInfo; for (j =0; j < num_modes;j++) { blockInfo = (int *)enum_ptr; if ((blockInfo[1] & 255) == 1) { switch(blockInfo[4]) { case 3: FULLSCREEN_AddMode(this, 8, blockInfo[2], blockInfo[3]); break; case 4: FULLSCREEN_AddMode(this, 15, blockInfo[2], blockInfo[3]); break; case 5: FULLSCREEN_AddMode(this, 32, blockInfo[2], blockInfo[3]); break; } } enum_ptr += blockInfo[0]; } SDL_free(enumInfo); for ( j=0; j<NUM_MODELISTS; ++j ) { if ( SDL_nummodes[j] > 0 ) { SDL_qsort(SDL_modelist[j], SDL_nummodes[j], sizeof *SDL_modelist[j], cmpmodes); } } }
/* Query for the list of available video modes */ void FULLSCREEN_BuildModeList(_THIS) { _kernel_swi_regs regs; char *enumInfo = NULL; char *enum_ptr; int *blockInfo; int j; int num_modes; /* Find out how much space we need */ regs.r[0] = 2; /* Reason code */ regs.r[2] = 0; /* Number of modes to skip */ regs.r[6] = 0; /* pointer to block or 0 for count */ regs.r[7] = 0; /* Size of block in bytes */ _kernel_swi(OS_ScreenMode, ®s, ®s); num_modes = -regs.r[2]; /* Video memory should be in r[5] */ this->info.video_mem = regs.r[5]/1024; enumInfo = (unsigned char *)malloc(-regs.r[7]); if (enumInfo == NULL) { SDL_OutOfMemory(); return; } /* Read mode information into block */ regs.r[2] = 0; regs.r[6] = (int)enumInfo; regs.r[7] = -regs.r[7]; _kernel_swi(OS_ScreenMode, ®s, ®s); enum_ptr = enumInfo; for (j =0; j < num_modes;j++) { blockInfo = (int *)enum_ptr; if ((blockInfo[1] & 255) == 1) /* We understand this format */ { switch(blockInfo[4]) { case 3: /* 8 bits per pixel */ FULLSCREEN_AddMode(this, 8, blockInfo[2], blockInfo[3]); break; case 4: /* 15 bits per pixel */ FULLSCREEN_AddMode(this, 15, blockInfo[2], blockInfo[3]); break; case 5: /* 32 bits per pixel */ FULLSCREEN_AddMode(this, 32, blockInfo[2], blockInfo[3]); break; } } enum_ptr += blockInfo[0]; } free(enumInfo); /* Sort the mode lists */ for ( j=0; j<NUM_MODELISTS; ++j ) { if ( SDL_nummodes[j] > 0 ) { qsort(SDL_modelist[j], SDL_nummodes[j], sizeof *SDL_modelist[j], cmpmodes); } } }