[openfirmware] r1150 - cpu/x86/pc/biosload
svn at openfirmware.info
svn at openfirmware.info
Sat Apr 18 21:11:32 CEST 2009
Author: wmb
Date: 2009-04-18 21:11:32 +0200 (Sat, 18 Apr 2009)
New Revision: 1150
Modified:
cpu/x86/pc/biosload/c32vesa.fth
cpu/x86/pc/biosload/callvbe.fth
Log:
VESA BIOS support - added a word to display the VESA mode list
Modified: cpu/x86/pc/biosload/c32vesa.fth
===================================================================
--- cpu/x86/pc/biosload/c32vesa.fth 2009-04-18 19:10:08 UTC (rev 1149)
+++ cpu/x86/pc/biosload/c32vesa.fth 2009-04-18 19:11:32 UTC (rev 1150)
@@ -96,7 +96,7 @@
d# 12 # sp add
[then]
-[ifndef] notdef-modemap
+[ifdef] notdef-modemap
\ Registers:
\ edx: pointer to register array for calling the gateway function
\ ebp: address of gateway function
Modified: cpu/x86/pc/biosload/callvbe.fth
===================================================================
--- cpu/x86/pc/biosload/callvbe.fth 2009-04-18 19:10:08 UTC (rev 1149)
+++ cpu/x86/pc/biosload/callvbe.fth 2009-04-18 19:11:32 UTC (rev 1150)
@@ -70,7 +70,23 @@
h# 4f00 vbe-call
h# 200 +c32-regs ( adr )
;
-: .vesa-modes ( -- )
+: vesa-mode-info ( mode# -- adr )
+ 'c32-cx l! ( )
+ h# 200 +c32-regs c32-es:di! ( )
+ h# 4f01 vbe-call ( )
+ h# 200 +c32-regs ( adr )
+;
+: .vesa-mode-info ( mode# -- )
+ push-hex dup 3 u.r space
+ vesa-mode-info >r ( r: adr )
+ decimal
+ r@ h# 12 + w@ (.) type
+ ." x" r@ h# 14 + w@ (.) type
+ ." x" r@ h# 19 + c@ (.) type cr
+ r> drop
+ pop-base
+;
+: .vesa-mode-list ( -- )
vbe-info ( adr )
dup l@ h# 41534556 <> if ( adr )
." VBE info call failed" cr
@@ -80,12 +96,26 @@
d# 14 + seg:off@ ( 'mode-list )
begin dup w@ dup h# ffff <> while . wa1+ repeat cr 2drop
;
-: vesa-mode-info ( mode# -- adr )
- 'c32-cx l! ( )
- h# 200 +c32-regs c32-es:di! ( )
- h# 4f01 vbe-call ( )
- h# 200 +c32-regs ( adr )
+
+: #vesa-modes ( 'mode-list -- n )
+ 0 begin over w@ dup h# ffff <> while ( 'mode-list n mode# )
+ drop swap wa1+ swap 1+ ( 'mode-list n' )
+ repeat ( 'mode-list n mode# )
+ drop nip ( n )
;
+: .vesa-modes ( -- )
+ vbe-info ( adr )
+ dup l@ h# 41534556 <> if ( adr )
+ ." VBE info call failed" cr
+ drop exit
+ then ( adr )
+ dup 6 + seg:off@ .cstr cr ( adr )
+ d# 14 + seg:off@ ( 'mode-list )
+ dup #vesa-modes 1+ ( 'mode-list #modes )
+ /w* dup alloc-mem ( 'mode-list modes-len adr )
+ dup >r swap move r> ( adr )
+ begin dup w@ dup h# ffff <> while .vesa-mode-info wa1+ repeat cr 2drop
+;
[ifdef] Commentary
00.w mode attributes
@@ -137,3 +167,6 @@
[then]
: current-vesa-mode ( -- mode# ) h# 4f03 vbe-call 'c32-bx l@ ;
+: set-vesa-mode ( mode# -- ) 'c32-bx w! h# 4f02 vbe-call ;
+: set-linear-mode ( mode# -- ) h# 4000 or set-vesa-mode ;
+: vesa-lfb-adr ( mode# -- padr ) h# 4000 or vesa-mode-info h# 28 + l@ ;
More information about the openfirmware
mailing list