mirror of
https://github.com/Zeal-Operating-System/ZealOS.git
synced 2024-12-25 15:10:28 +00:00
Begin reimplementing framebuffer mode list storage and VideoRep funtionality.
This commit is contained in:
parent
4d6f3f380c
commit
a2be44fa28
5 changed files with 78 additions and 13 deletions
|
@ -64,6 +64,8 @@ SYS_BOOT_STACK:: DU32 BOOT_RAM_LIMIT;
|
|||
|
||||
SYS_IS_UEFI_BOOTED:: DU8 0;
|
||||
|
||||
//SYS_FRAMEBUFFER_LIST:: DU8 sizeof(CVideoInfo) * VBE_MODES_NUM DUP(0);
|
||||
|
||||
#assert $$ - SYS_KERNEL == sizeof(CKernel) - sizeof(CZXE)
|
||||
|
||||
REQUESTED_SCREEN_WIDTH: DU16 1024;
|
||||
|
@ -74,6 +76,8 @@ VBE_INFO: DU8 sizeof(CVBEInfo) DUP(0);
|
|||
VBE_FINAL_MODE_NUM: DU16 0; // gets set to final result mode number
|
||||
VBE_STD_MODE_NUM: DU16 0; // gets set to mode number for standard 1024x768
|
||||
|
||||
SYS_FRAMEBUFFER_LIST:: DU8 sizeof(CVideoInfo) * VBE_MODES_NUM DUP(0);
|
||||
|
||||
//************************************
|
||||
CORE0_16BIT_INIT::
|
||||
//EAX is $LK,"SYS_BOOT_SRC",A="FF:::/Kernel/KStart16.ZC,[SYS_BOOT_SRC]"$. (Value passed from boot block, $LK,"BootHD",A="FF:::/System/Boot/BootHD.ZC,BOOT_SRC_HARDDRIVE"$, $LK,"BootDVD",A="FF:::/System/Boot/BootDVD.ZC,BOOT_SRC_DVD"$, & $LK,"BootRAM",A="FF:::/System/Boot/BootRAM.ZC,BOOT_SRC_RAM"$.)
|
||||
|
@ -119,6 +123,7 @@ GET_IP: POP BX
|
|||
/*Loop variables:
|
||||
DI <- Temporary storage for mode information
|
||||
CX <- Mode number
|
||||
DX <- 'mode' array
|
||||
GS <- Segment for video modes list
|
||||
SI <- Offset for video modes list
|
||||
*/
|
||||
|
@ -126,6 +131,7 @@ GET_IP: POP BX
|
|||
MOV AX, VBE_INFO
|
||||
MOV SI, CVBEInfo.video_modes[AX]
|
||||
MOV GS, CVBEInfo.video_modes+2[AX]
|
||||
MOV DX, SYS_FRAMEBUFFER_LIST
|
||||
MOV DI, VBE_TEMP_MODE
|
||||
|
||||
@@15: //Loop through all the mode numbers
|
||||
|
@ -169,6 +175,12 @@ GET_IP: POP BX
|
|||
@@18: MOV BX, CVBEMode.height[DI]
|
||||
@@20: MOV AX, CVBEMode.width[DI]
|
||||
|
||||
// Copy info into DX SYS_FRAMEBUFFER_LIST
|
||||
|
||||
MOV CVideoInfo.height[DX], BX
|
||||
MOV CVideoInfo.width[DX], AX
|
||||
ADD DX, sizeof(CVideoInfo) // next array element
|
||||
|
||||
//Check if width and height match standard 1024x768
|
||||
//If they match, set VBE_STD_MODE_NUM to this mode num
|
||||
CMP AX, 1024
|
||||
|
|
|
@ -536,6 +536,12 @@ class CVBEMode
|
|||
};
|
||||
#assert sizeof(CVBEMode) == 256
|
||||
|
||||
class CVideoInfo
|
||||
{
|
||||
U16 width;
|
||||
U16 height;
|
||||
};
|
||||
|
||||
#help_index "Boot"
|
||||
class CKernel
|
||||
{//Must match $LK,"OSStartUp",A="FF:::/Kernel/KStart16.ZC,MEM_BOOT_BASE"$
|
||||
|
@ -564,7 +570,8 @@ class CKernel
|
|||
U64 sys_smbios_entry;
|
||||
U64 sys_disk_uuid[2];
|
||||
U32 sys_boot_stack;
|
||||
Bool sys_is_uefi_booted;
|
||||
Bool sys_is_uefi_booted;
|
||||
// CVideoInfo sys_framebuffer_list[VBE_MODES_NUM];
|
||||
};
|
||||
|
||||
//Run-Levels
|
||||
|
|
|
@ -244,11 +244,13 @@ public _intern IC_FS CTask *Fs(); //FS segment register points to the current $L
|
|||
public _intern IC_RDTSC I64 TSCGet(); //Get time stamp counter.
|
||||
|
||||
#help_index "Graphics/Framebuffer"
|
||||
public _extern SYS_FRAMEBUFFER_ADDR U8 *sys_framebuffer_addr;
|
||||
public _extern SYS_FRAMEBUFFER_WIDTH U64 sys_framebuffer_width;
|
||||
public _extern SYS_FRAMEBUFFER_HEIGHT U64 sys_framebuffer_height;
|
||||
public _extern SYS_FRAMEBUFFER_PITCH U64 sys_framebuffer_pitch;
|
||||
public _extern SYS_FRAMEBUFFER_BPP U8 sys_framebuffer_bpp;
|
||||
public _extern SYS_FRAMEBUFFER_ADDR U8 *sys_framebuffer_addr;
|
||||
public _extern SYS_FRAMEBUFFER_WIDTH U64 sys_framebuffer_width;
|
||||
public _extern SYS_FRAMEBUFFER_HEIGHT U64 sys_framebuffer_height;
|
||||
public _extern SYS_FRAMEBUFFER_PITCH U64 sys_framebuffer_pitch;
|
||||
public _extern SYS_FRAMEBUFFER_BPP U8 sys_framebuffer_bpp;
|
||||
|
||||
_extern SYS_FRAMEBUFFER_LIST CVideoInfo sys_framebuffer_list[VBE_MODES_NUM];
|
||||
|
||||
#help_index "Processor/SMBIOS"
|
||||
public _extern SYS_SMBIOS_ENTRY U8 *sys_smbios_entry;
|
||||
|
|
|
@ -1,8 +1,52 @@
|
|||
public U0 VideoRep()
|
||||
{ //Report screen information.
|
||||
|
||||
public I64 VideoRep()
|
||||
{ // List available screen resolutions.
|
||||
|
||||
"\n";
|
||||
"Resolution: $$RED$$%d x %d$$FG$$ \n", sys_framebuffer_width, sys_framebuffer_height;
|
||||
"Pitch: $$RED$$%d$$FG$$ \n", sys_framebuffer_pitch;
|
||||
"Bits-per-pixel: $$RED$$%d$$FG$$ \n", sys_framebuffer_bpp;
|
||||
"Framebuffer pointer: $$RED$$0x%8X$$FG$$ \n\n", sys_framebuffer_addr;
|
||||
"$$PURPLE$$Framebuffer pointer: $$BLACK$$0x%8X$$FG$$ \n", sys_framebuffer_addr;
|
||||
|
||||
I64 i, count = 0;
|
||||
CVideoInfo *info;
|
||||
|
||||
"\nAll modes shown are 32-bit color.\n\n";
|
||||
|
||||
if (!IsRaw)
|
||||
"$$LTCYAN$$ # W x H$$FG$$\n\n";
|
||||
else
|
||||
"#\t\t W x H\n\n";
|
||||
|
||||
for (i = 0; i < VBE_MODES_NUM; i++)
|
||||
{
|
||||
info = &sys_framebuffer_list[i];
|
||||
if (info->height)
|
||||
{
|
||||
|
||||
if (!IsRaw)
|
||||
"$$PURPLE$$ $$BT+X,\"%d\",LM=\"%d\\n\"$$$$FG$$$$LM,4$$", i+1, i+1;
|
||||
else
|
||||
" [%d]\t", i+1;
|
||||
|
||||
if (info->width == sys_framebuffer_width && info->height == sys_framebuffer_height)
|
||||
{
|
||||
if (!IsRaw)
|
||||
"$$RED$$%4d x %4d (Current resolution)$$FG$$$$LM,0$$", info->width, info->height;
|
||||
else
|
||||
"%4d x %4d (Current resolution)", info->width, info->height;
|
||||
}
|
||||
else
|
||||
{
|
||||
if (!IsRaw)
|
||||
"$$BLACK$$%4d x %4d $$FG$$$$LM,0$$", info->width, info->height;
|
||||
else
|
||||
"%4d x %4d ", info->width, info->height;
|
||||
}
|
||||
|
||||
"\n\n\n";
|
||||
count++;
|
||||
}
|
||||
}
|
||||
|
||||
return count;
|
||||
}
|
||||
|
||||
VideoRep;
|
|
@ -21,7 +21,7 @@ static volatile struct limine_memmap_request memmap_request = {
|
|||
|
||||
static volatile struct limine_framebuffer_request framebuffer_request = {
|
||||
.id = LIMINE_FRAMEBUFFER_REQUEST,
|
||||
.revision = 0
|
||||
.revision = 1
|
||||
};
|
||||
|
||||
static volatile struct limine_smbios_request smbios_request = {
|
||||
|
|
Loading…
Reference in a new issue