diff --git a/src/Kernel/KStart16.ZC b/src/Kernel/KStart16.ZC index 8d94dd88..16c6c9e4 100755 --- a/src/Kernel/KStart16.ZC +++ b/src/Kernel/KStart16.ZC @@ -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 diff --git a/src/Kernel/KernelA.HH b/src/Kernel/KernelA.HH index 14fbcece..7a777262 100755 --- a/src/Kernel/KernelA.HH +++ b/src/Kernel/KernelA.HH @@ -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 diff --git a/src/Kernel/KernelB.HH b/src/Kernel/KernelB.HH index 01887d79..94865553 100755 --- a/src/Kernel/KernelB.HH +++ b/src/Kernel/KernelB.HH @@ -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; diff --git a/src/System/Utils/VideoRep.ZC b/src/System/Utils/VideoRep.ZC index 3f30f106..828b470b 100755 --- a/src/System/Utils/VideoRep.ZC +++ b/src/System/Utils/VideoRep.ZC @@ -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; \ No newline at end of file diff --git a/zealbooter/zealbooter.c b/zealbooter/zealbooter.c index 761d75d7..10368a30 100644 --- a/zealbooter/zealbooter.c +++ b/zealbooter/zealbooter.c @@ -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 = {