commit 4d41f645976ee3107894ec8fb439af4245f9db50 parent 586b5f0749027310004a32d65f90790297bbbfb9 Author: Virgil Dupras <hsoft@hardcoded.net> Date: Sun, 11 Dec 2022 16:17:47 -0500 drv/pc/vesa: enumerate modes Diffstat:
M | fs/drv/pc/vesa.fs | | | 78 | +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++------------- |
1 file changed, 65 insertions(+), 13 deletions(-)
diff --git a/fs/drv/pc/vesa.fs b/fs/drv/pc/vesa.fs @@ -16,7 +16,41 @@ struct[ VBEInfo : :new ( -- self ) here SZ allot ; ]struct -VBEInfo :new structbind VBEInfo _info +struct[ VBEModeInfo + sfieldw attributes + sfieldb windowa + sfieldb windowb + sfieldw granularity + sfieldw windowsize + sfieldw segmenta + sfieldw segmentb + sfield winfuncptr + sfieldw pitch + sfieldw width + sfieldw height + sfieldb wchar + sfieldb ychar + sfieldb planes + sfieldb bpp + sfieldb banks + sfieldb memorymodel + sfieldb banksize + sfieldb imagepages + 1 sallot + sfieldb redmask + sfieldb redpos + sfieldb greenmask + sfieldb greenpos + sfieldb bluemask + sfieldb bluepos + 2 sallot + sfieldb directcolorattributes + sfield framebuffer + sfield offscreenoff + sfieldw offscreensize + + : :linear? attributes $80 and bool ; +]struct : _err abort" VESA error" ; : _assert not if _err then ; @@ -25,16 +59,34 @@ VBEInfo :new structbind VBEInfo _info : seg>32 ( n -- n ) dup 12 rshift $ffff0 and swap $ffff and + ; -: vesa$ +: _info ( -- info ) 0 0 $4f00 int10h ( di bx ax ) - $4f = _assert drop _info :self VBEInfo SZ move ( ) - _info sig $41534556 ( "VESA" ) = _assert ; - -: .vesa - _info version .f" Version: %w\n" - _info capabilities .f" Capabilities: %x\n" - _info videomem .f" Video memory (*64K): %w\n" - _info videomem .f" Software rev: %w\n" - _info vendor seg>32 .f" Vendor: %z\n" - _info productname seg>32 .f" Product name: %z\n" - _info productrev seg>32 .f" Product rev: %z\n" ; + $4f = _assert drop ( info ) + dup VBEInfo sig $41534556 ( "VESA" ) = _assert ; + +: .vesa _info >r \ V1=info + r@ VBEInfo version .f" Version: %w\n" + r@ VBEInfo capabilities .f" Capabilities: %x\n" + r@ VBEInfo videomem .f" Video memory (*64K): %w\n" + r@ VBEInfo softwarerev .f" Software rev: %w\n" + r@ VBEInfo vendor seg>32 .f" Vendor: %z\n" + r@ VBEInfo productname seg>32 .f" Product name: %z\n" + r> VBEInfo productrev seg>32 .f" Product rev: %z\n" ; + +\ To make the output a bit lighter, we ignore any mode that is less than 8bpp or +\ that don't support a linear frame buffer. +: _.mode ( n -- ) + dup >r ( cx ) 0 $4f01 int10h ( di bx ax ) \ V1=n + $4f = _assert drop >r ( ) \ V2=mode + r@ VBEModeInfo bpp 8 >= r@ VBEModeInfo :linear? and if + r@ VBEModeInfo bpp r@ VBEModeInfo height r> VBEModeInfo width + r> .f" |%w %dx%dx%d " + else rdrop rdrop then ; + +\ We have to read all mode IDs before we call int10h because that list might be +\ overwritten by int10h. +: .vesamodes + _info VBEInfo videomodes seg>32 >r \ V1=a + -1 ( sentinel ) begin 16b to@+ V1 dup $ffff = until ( -1 ... $ffff ) + drop rdrop + begin ( -1 ... ) dup 0>= while _.mode repeat ( -1 ) drop ;