annotate osdep/vbelib.c @ 15980:85fd2ee1c094

proper disabling/enabling of console output for vo_vesa
author aurel
date Sat, 16 Jul 2005 14:49:21 +0000
parents 1cb0e1833515
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
2243
f4b588dba08a vbelib import
nick
parents:
diff changeset
1 /*
f4b588dba08a vbelib import
nick
parents:
diff changeset
2 This file contains implementation of VESA library which is based on
f4b588dba08a vbelib import
nick
parents:
diff changeset
3 LRMI (Linux real-mode interface).
f4b588dba08a vbelib import
nick
parents:
diff changeset
4 So it's not an emulator - it calls real int 10h handler under Linux.
f4b588dba08a vbelib import
nick
parents:
diff changeset
5 Note: VESA is available only on x86 systems.
f4b588dba08a vbelib import
nick
parents:
diff changeset
6 You can redistribute this file under terms and conditions
2632
6e3cee9e07ef Double buffering interface
nick
parents: 2610
diff changeset
7 of GNU General Public licence v2.
2243
f4b588dba08a vbelib import
nick
parents:
diff changeset
8 Written by Nick Kurshev <nickols_k@mail.ru>
12660
430a71a762b4 neomagic tv out support throught vesa vbe, patch by Rudolf Marek
alex
parents: 11455
diff changeset
9 Neomagic TV out support by Rudolf Marek <r.marek et sh.cvut.cz>
2243
f4b588dba08a vbelib import
nick
parents:
diff changeset
10 */
11455
22f8732b5d97 cumulative libc5 compatibility patch ;)
gabucino
parents: 10114
diff changeset
11
22f8732b5d97 cumulative libc5 compatibility patch ;)
gabucino
parents: 10114
diff changeset
12 #include <../config.h>
22f8732b5d97 cumulative libc5 compatibility patch ;)
gabucino
parents: 10114
diff changeset
13 #ifdef HAVE_VESA
22f8732b5d97 cumulative libc5 compatibility patch ;)
gabucino
parents: 10114
diff changeset
14
2243
f4b588dba08a vbelib import
nick
parents:
diff changeset
15 #include "vbelib.h"
f4b588dba08a vbelib import
nick
parents:
diff changeset
16 #include "lrmi.h"
f4b588dba08a vbelib import
nick
parents:
diff changeset
17 #include <stdlib.h>
f4b588dba08a vbelib import
nick
parents:
diff changeset
18 #include <string.h>
f4b588dba08a vbelib import
nick
parents:
diff changeset
19 #include <stdio.h>
f4b588dba08a vbelib import
nick
parents:
diff changeset
20 #include <sys/io.h>
2610
65cb69a90a9f vo_vesa: DGA support
nick
parents: 2552
diff changeset
21 #include <sys/mman.h>
65cb69a90a9f vo_vesa: DGA support
nick
parents: 2552
diff changeset
22 #include <sys/types.h>
65cb69a90a9f vo_vesa: DGA support
nick
parents: 2552
diff changeset
23 #include <sys/stat.h>
2407
2e4c17f4a744 More verbosing
nick
parents: 2359
diff changeset
24 #include <ctype.h>
2610
65cb69a90a9f vo_vesa: DGA support
nick
parents: 2552
diff changeset
25 #include <unistd.h>
65cb69a90a9f vo_vesa: DGA support
nick
parents: 2552
diff changeset
26 #include <fcntl.h>
15980
85fd2ee1c094 proper disabling/enabling of console output for vo_vesa
aurel
parents: 13568
diff changeset
27 #include <sys/ioctl.h>
85fd2ee1c094 proper disabling/enabling of console output for vo_vesa
aurel
parents: 13568
diff changeset
28 #include <linux/kd.h>
2243
f4b588dba08a vbelib import
nick
parents:
diff changeset
29
f4b588dba08a vbelib import
nick
parents:
diff changeset
30 static struct VesaProtModeInterface vbe_pm_info;
2632
6e3cee9e07ef Double buffering interface
nick
parents: 2610
diff changeset
31 static struct VesaModeInfoBlock curr_mode_info;
2243
f4b588dba08a vbelib import
nick
parents:
diff changeset
32
2536
6426007cad63 Fixed broken BIOS workaround
nick
parents: 2518
diff changeset
33 static inline int VERR(const void *p)
2515
622cd80caaba memory verification
nick
parents: 2460
diff changeset
34 {
622cd80caaba memory verification
nick
parents: 2460
diff changeset
35 register int retval;
622cd80caaba memory verification
nick
parents: 2460
diff changeset
36 __asm __volatile(
622cd80caaba memory verification
nick
parents: 2460
diff changeset
37 "xorl %0, %0\n\t"
622cd80caaba memory verification
nick
parents: 2460
diff changeset
38 "verr %1\n\t"
622cd80caaba memory verification
nick
parents: 2460
diff changeset
39 "setnz %b0"
4405
7eda15bbb3f9 fixing assembly bug. By Thierry Vignaud <tvignaud@mandrakesoft.com>
nick
parents: 3016
diff changeset
40 :"=q"(retval)
2515
622cd80caaba memory verification
nick
parents: 2460
diff changeset
41 :"m"(*(unsigned char *)p)
4405
7eda15bbb3f9 fixing assembly bug. By Thierry Vignaud <tvignaud@mandrakesoft.com>
nick
parents: 3016
diff changeset
42 :"memory","cc");
2515
622cd80caaba memory verification
nick
parents: 2460
diff changeset
43 return retval;
622cd80caaba memory verification
nick
parents: 2460
diff changeset
44 }
622cd80caaba memory verification
nick
parents: 2460
diff changeset
45
622cd80caaba memory verification
nick
parents: 2460
diff changeset
46 #if 0
2536
6426007cad63 Fixed broken BIOS workaround
nick
parents: 2518
diff changeset
47 static inline int VERW(const void *p)
2515
622cd80caaba memory verification
nick
parents: 2460
diff changeset
48 {
622cd80caaba memory verification
nick
parents: 2460
diff changeset
49 register int retval;
622cd80caaba memory verification
nick
parents: 2460
diff changeset
50 __asm __volatile(
622cd80caaba memory verification
nick
parents: 2460
diff changeset
51 "xorl %0, %0\n\t"
622cd80caaba memory verification
nick
parents: 2460
diff changeset
52 "verw %1\n\t"
622cd80caaba memory verification
nick
parents: 2460
diff changeset
53 "setnz %b0"
4405
7eda15bbb3f9 fixing assembly bug. By Thierry Vignaud <tvignaud@mandrakesoft.com>
nick
parents: 3016
diff changeset
54 :"=q"(retval)
2515
622cd80caaba memory verification
nick
parents: 2460
diff changeset
55 :"m"(*(unsigned char *)p)
4405
7eda15bbb3f9 fixing assembly bug. By Thierry Vignaud <tvignaud@mandrakesoft.com>
nick
parents: 3016
diff changeset
56 :"memory","cc");
2515
622cd80caaba memory verification
nick
parents: 2460
diff changeset
57 return retval;
622cd80caaba memory verification
nick
parents: 2460
diff changeset
58 }
622cd80caaba memory verification
nick
parents: 2460
diff changeset
59 #endif
622cd80caaba memory verification
nick
parents: 2460
diff changeset
60
2294
9475a75dde9c More verbosing
nick
parents: 2254
diff changeset
61 #define HAVE_VERBOSE_VAR 1
9475a75dde9c More verbosing
nick
parents: 2254
diff changeset
62
9475a75dde9c More verbosing
nick
parents: 2254
diff changeset
63 #ifdef HAVE_VERBOSE_VAR
9475a75dde9c More verbosing
nick
parents: 2254
diff changeset
64 extern int verbose;
9475a75dde9c More verbosing
nick
parents: 2254
diff changeset
65
9475a75dde9c More verbosing
nick
parents: 2254
diff changeset
66 static void __dump_regs(struct LRMI_regs *r)
9475a75dde9c More verbosing
nick
parents: 2254
diff changeset
67 {
9475a75dde9c More verbosing
nick
parents: 2254
diff changeset
68 printf("vbelib: eax=%08lXh ebx=%08lXh ecx=%08lXh edx=%08lXh\n"
9475a75dde9c More verbosing
nick
parents: 2254
diff changeset
69 "vbelib: edi=%08lXh esi=%08lXh ebp=%08lXh esp=%08lXh\n"
2445
c570836dd567 Suppressing warnings
nick
parents: 2410
diff changeset
70 "vbelib: ds=%04Xh es=%04Xh ss=%04Xh cs:ip=%04X:%04X\n"
c570836dd567 Suppressing warnings
nick
parents: 2410
diff changeset
71 "vbelib: fs=%04Xh gs=%04Xh ss:sp=%04X:%04X flags=%04X\n"
c570836dd567 Suppressing warnings
nick
parents: 2410
diff changeset
72 ,(unsigned long)r->eax,(unsigned long)r->ebx,(unsigned long)r->ecx,(unsigned long)r->edx
c570836dd567 Suppressing warnings
nick
parents: 2410
diff changeset
73 ,(unsigned long)r->edi,(unsigned long)r->esi,(unsigned long)r->ebp,(unsigned long)r->reserved
2294
9475a75dde9c More verbosing
nick
parents: 2254
diff changeset
74 ,r->ds,r->es,r->ss,r->cs,r->ip
9475a75dde9c More verbosing
nick
parents: 2254
diff changeset
75 ,r->fs,r->gs,r->ss,r->sp,r->flags);
9475a75dde9c More verbosing
nick
parents: 2254
diff changeset
76 }
9475a75dde9c More verbosing
nick
parents: 2254
diff changeset
77
9475a75dde9c More verbosing
nick
parents: 2254
diff changeset
78 static inline int VBE_LRMI_int(int int_no, struct LRMI_regs *r)
9475a75dde9c More verbosing
nick
parents: 2254
diff changeset
79 {
9475a75dde9c More verbosing
nick
parents: 2254
diff changeset
80 int retval;
9475a75dde9c More verbosing
nick
parents: 2254
diff changeset
81 if(verbose > 1)
9475a75dde9c More verbosing
nick
parents: 2254
diff changeset
82 {
9475a75dde9c More verbosing
nick
parents: 2254
diff changeset
83 printf("vbelib: registers before int %02X\n",int_no);
9475a75dde9c More verbosing
nick
parents: 2254
diff changeset
84 __dump_regs(r);
9475a75dde9c More verbosing
nick
parents: 2254
diff changeset
85 }
9475a75dde9c More verbosing
nick
parents: 2254
diff changeset
86 retval = LRMI_int(int_no,r);
9475a75dde9c More verbosing
nick
parents: 2254
diff changeset
87 if(verbose > 1)
9475a75dde9c More verbosing
nick
parents: 2254
diff changeset
88 {
2445
c570836dd567 Suppressing warnings
nick
parents: 2410
diff changeset
89 printf("vbelib: Interrupt handler returns: %X\n",retval);
2294
9475a75dde9c More verbosing
nick
parents: 2254
diff changeset
90 printf("vbelib: registers after int %02X\n",int_no);
9475a75dde9c More verbosing
nick
parents: 2254
diff changeset
91 __dump_regs(r);
9475a75dde9c More verbosing
nick
parents: 2254
diff changeset
92 }
9475a75dde9c More verbosing
nick
parents: 2254
diff changeset
93 return retval;
9475a75dde9c More verbosing
nick
parents: 2254
diff changeset
94 }
9475a75dde9c More verbosing
nick
parents: 2254
diff changeset
95 #else
9475a75dde9c More verbosing
nick
parents: 2254
diff changeset
96 #define VBE_LRMI_int(int_no,regs) (VBE_LRMI_int(int_no,regs))
9475a75dde9c More verbosing
nick
parents: 2254
diff changeset
97 #endif
9475a75dde9c More verbosing
nick
parents: 2254
diff changeset
98
15980
85fd2ee1c094 proper disabling/enabling of console output for vo_vesa
aurel
parents: 13568
diff changeset
99 /**
85fd2ee1c094 proper disabling/enabling of console output for vo_vesa
aurel
parents: 13568
diff changeset
100 * Set console to graphics or text mode.
85fd2ee1c094 proper disabling/enabling of console output for vo_vesa
aurel
parents: 13568
diff changeset
101 * This is a clean way to enable/disable console text output
85fd2ee1c094 proper disabling/enabling of console output for vo_vesa
aurel
parents: 13568
diff changeset
102 * and cursor blinking.
85fd2ee1c094 proper disabling/enabling of console output for vo_vesa
aurel
parents: 13568
diff changeset
103 *
85fd2ee1c094 proper disabling/enabling of console output for vo_vesa
aurel
parents: 13568
diff changeset
104 * @param mode The new wanted mode. Can be either KD_GRAPHICS to switch
85fd2ee1c094 proper disabling/enabling of console output for vo_vesa
aurel
parents: 13568
diff changeset
105 * to graphics mode or anything else to switch back to the
85fd2ee1c094 proper disabling/enabling of console output for vo_vesa
aurel
parents: 13568
diff changeset
106 * original mode.
85fd2ee1c094 proper disabling/enabling of console output for vo_vesa
aurel
parents: 13568
diff changeset
107 */
85fd2ee1c094 proper disabling/enabling of console output for vo_vesa
aurel
parents: 13568
diff changeset
108 static void kd_set_mode(int mode)
3016
ea414257856f Hide terminal's output and text-mode cursor for LCD and DFP
nick
parents: 2913
diff changeset
109 {
15980
85fd2ee1c094 proper disabling/enabling of console output for vo_vesa
aurel
parents: 13568
diff changeset
110 static int old_mode = KD_TEXT;
85fd2ee1c094 proper disabling/enabling of console output for vo_vesa
aurel
parents: 13568
diff changeset
111 int fd;
3016
ea414257856f Hide terminal's output and text-mode cursor for LCD and DFP
nick
parents: 2913
diff changeset
112
15980
85fd2ee1c094 proper disabling/enabling of console output for vo_vesa
aurel
parents: 13568
diff changeset
113 if ((fd = open("/dev/tty0", O_RDWR)) < 0)
85fd2ee1c094 proper disabling/enabling of console output for vo_vesa
aurel
parents: 13568
diff changeset
114 return;
85fd2ee1c094 proper disabling/enabling of console output for vo_vesa
aurel
parents: 13568
diff changeset
115 if(mode == KD_GRAPHICS)
85fd2ee1c094 proper disabling/enabling of console output for vo_vesa
aurel
parents: 13568
diff changeset
116 old_mode = ioctl(fd, KDGETMODE);
85fd2ee1c094 proper disabling/enabling of console output for vo_vesa
aurel
parents: 13568
diff changeset
117 else
85fd2ee1c094 proper disabling/enabling of console output for vo_vesa
aurel
parents: 13568
diff changeset
118 mode = old_mode;
85fd2ee1c094 proper disabling/enabling of console output for vo_vesa
aurel
parents: 13568
diff changeset
119 ioctl(fd, KDSETMODE, mode);
85fd2ee1c094 proper disabling/enabling of console output for vo_vesa
aurel
parents: 13568
diff changeset
120 close(fd);
3016
ea414257856f Hide terminal's output and text-mode cursor for LCD and DFP
nick
parents: 2913
diff changeset
121 }
ea414257856f Hide terminal's output and text-mode cursor for LCD and DFP
nick
parents: 2913
diff changeset
122
2407
2e4c17f4a744 More verbosing
nick
parents: 2359
diff changeset
123 static unsigned hh_int_10_seg;
2610
65cb69a90a9f vo_vesa: DGA support
nick
parents: 2552
diff changeset
124 static int fd_mem;
6473
6c45b8bf9a3e date: 2002/06/16 09:10:00; author: nickols_k; state: Exp; lines: +17 -13
atmos4
parents: 4405
diff changeset
125 /*
6c45b8bf9a3e date: 2002/06/16 09:10:00; author: nickols_k; state: Exp; lines: +17 -13
atmos4
parents: 4405
diff changeset
126 the list of supported video modes is stored in the reserved portion of
6c45b8bf9a3e date: 2002/06/16 09:10:00; author: nickols_k; state: Exp; lines: +17 -13
atmos4
parents: 4405
diff changeset
127 the SuperVGA information record by some implementations, and it may
6c45b8bf9a3e date: 2002/06/16 09:10:00; author: nickols_k; state: Exp; lines: +17 -13
atmos4
parents: 4405
diff changeset
128 thus be necessary to either copy the mode list or use a different
6c45b8bf9a3e date: 2002/06/16 09:10:00; author: nickols_k; state: Exp; lines: +17 -13
atmos4
parents: 4405
diff changeset
129 buffer for all subsequent VESA calls
6c45b8bf9a3e date: 2002/06/16 09:10:00; author: nickols_k; state: Exp; lines: +17 -13
atmos4
parents: 4405
diff changeset
130 */
6c45b8bf9a3e date: 2002/06/16 09:10:00; author: nickols_k; state: Exp; lines: +17 -13
atmos4
parents: 4405
diff changeset
131 static void *controller_info;
2243
f4b588dba08a vbelib import
nick
parents:
diff changeset
132 int vbeInit( void )
f4b588dba08a vbelib import
nick
parents:
diff changeset
133 {
2407
2e4c17f4a744 More verbosing
nick
parents: 2359
diff changeset
134 unsigned short iopl_port;
2359
ee6ef0b10655 More iopl'ed ports and test for brken BIOS
nick
parents: 2294
diff changeset
135 size_t i;
2243
f4b588dba08a vbelib import
nick
parents:
diff changeset
136 if(!LRMI_init()) return VBE_VM86_FAIL;
6473
6c45b8bf9a3e date: 2002/06/16 09:10:00; author: nickols_k; state: Exp; lines: +17 -13
atmos4
parents: 4405
diff changeset
137 if(!(controller_info = LRMI_alloc_real(sizeof(struct VbeInfoBlock)))) return VBE_OUT_OF_DOS_MEM;
2243
f4b588dba08a vbelib import
nick
parents:
diff changeset
138 /*
f4b588dba08a vbelib import
nick
parents:
diff changeset
139 Allow read/write to ALL io ports
f4b588dba08a vbelib import
nick
parents:
diff changeset
140 */
2407
2e4c17f4a744 More verbosing
nick
parents: 2359
diff changeset
141 hh_int_10_seg = *(unsigned short *)PhysToVirtSO(0x0000,0x0042);
2359
ee6ef0b10655 More iopl'ed ports and test for brken BIOS
nick
parents: 2294
diff changeset
142 /* Video BIOS should be at C000:0000 and above */
2407
2e4c17f4a744 More verbosing
nick
parents: 2359
diff changeset
143 hh_int_10_seg >>= 12;
2e4c17f4a744 More verbosing
nick
parents: 2359
diff changeset
144 if(hh_int_10_seg < 0xC) return VBE_BROKEN_BIOS;
2243
f4b588dba08a vbelib import
nick
parents:
diff changeset
145 ioperm(0, 1024, 1);
f4b588dba08a vbelib import
nick
parents:
diff changeset
146 iopl(3);
f4b588dba08a vbelib import
nick
parents:
diff changeset
147 memset(&vbe_pm_info,0,sizeof(struct VesaProtModeInterface));
13568
1cb0e1833515 Currently vbeGetProtModeInfo call the 0x4f0a function of int 10h the get
faust3
parents: 13352
diff changeset
148 vbeGetProtModeInfo(&vbe_pm_info);
2359
ee6ef0b10655 More iopl'ed ports and test for brken BIOS
nick
parents: 2294
diff changeset
149 i = 0;
2913
74731185c5c9 Fixed iopl ports detection
nick
parents: 2693
diff changeset
150 if(vbe_pm_info.iopl_ports) /* Can be NULL !!!*/
2552
bd734d41a407 Misc: more checks
nick
parents: 2536
diff changeset
151 while((iopl_port=vbe_pm_info.iopl_ports[i]) != 0xFFFF
bd734d41a407 Misc: more checks
nick
parents: 2536
diff changeset
152 && vbe_pm_info.iopl_ports[i++] > 1023) ioperm(iopl_port,1,1);
2359
ee6ef0b10655 More iopl'ed ports and test for brken BIOS
nick
parents: 2294
diff changeset
153 iopl(3);
2610
65cb69a90a9f vo_vesa: DGA support
nick
parents: 2552
diff changeset
154 fd_mem = open("/dev/mem",O_RDWR);
15980
85fd2ee1c094 proper disabling/enabling of console output for vo_vesa
aurel
parents: 13568
diff changeset
155 kd_set_mode(KD_GRAPHICS);
2243
f4b588dba08a vbelib import
nick
parents:
diff changeset
156 return VBE_OK;
f4b588dba08a vbelib import
nick
parents:
diff changeset
157 }
f4b588dba08a vbelib import
nick
parents:
diff changeset
158
2610
65cb69a90a9f vo_vesa: DGA support
nick
parents: 2552
diff changeset
159 int vbeDestroy( void )
65cb69a90a9f vo_vesa: DGA support
nick
parents: 2552
diff changeset
160 {
15980
85fd2ee1c094 proper disabling/enabling of console output for vo_vesa
aurel
parents: 13568
diff changeset
161 kd_set_mode(KD_TEXT);
2610
65cb69a90a9f vo_vesa: DGA support
nick
parents: 2552
diff changeset
162 close(fd_mem);
6473
6c45b8bf9a3e date: 2002/06/16 09:10:00; author: nickols_k; state: Exp; lines: +17 -13
atmos4
parents: 4405
diff changeset
163 LRMI_free_real(controller_info);
2610
65cb69a90a9f vo_vesa: DGA support
nick
parents: 2552
diff changeset
164 return VBE_OK;
65cb69a90a9f vo_vesa: DGA support
nick
parents: 2552
diff changeset
165 }
2243
f4b588dba08a vbelib import
nick
parents:
diff changeset
166
2536
6426007cad63 Fixed broken BIOS workaround
nick
parents: 2518
diff changeset
167 /* Fixme!!! This code is compatible only with mplayer's version of lrmi*/
6426007cad63 Fixed broken BIOS workaround
nick
parents: 2518
diff changeset
168 static inline int is_addr_valid(const void *p)
6426007cad63 Fixed broken BIOS workaround
nick
parents: 2518
diff changeset
169 {
6426007cad63 Fixed broken BIOS workaround
nick
parents: 2518
diff changeset
170 return (p < (const void *)0x502) ||
6426007cad63 Fixed broken BIOS workaround
nick
parents: 2518
diff changeset
171 (p >= (const void *)0x10000 && p < (const void *)0x20000) ||
6426007cad63 Fixed broken BIOS workaround
nick
parents: 2518
diff changeset
172 (p >= (const void *)0xa0000 && p < (const void *)0x100000);
6426007cad63 Fixed broken BIOS workaround
nick
parents: 2518
diff changeset
173 }
6426007cad63 Fixed broken BIOS workaround
nick
parents: 2518
diff changeset
174
6426007cad63 Fixed broken BIOS workaround
nick
parents: 2518
diff changeset
175 static int check_str(const unsigned char *str)
2515
622cd80caaba memory verification
nick
parents: 2460
diff changeset
176 {
622cd80caaba memory verification
nick
parents: 2460
diff changeset
177 size_t i;
622cd80caaba memory verification
nick
parents: 2460
diff changeset
178 int null_found = 0;
622cd80caaba memory verification
nick
parents: 2460
diff changeset
179 for(i = 0;i < 256;i++)
622cd80caaba memory verification
nick
parents: 2460
diff changeset
180 {
2536
6426007cad63 Fixed broken BIOS workaround
nick
parents: 2518
diff changeset
181 if(is_addr_valid(&str[i]))
2515
622cd80caaba memory verification
nick
parents: 2460
diff changeset
182 {
2536
6426007cad63 Fixed broken BIOS workaround
nick
parents: 2518
diff changeset
183 if(VERR(&str[i]))
6426007cad63 Fixed broken BIOS workaround
nick
parents: 2518
diff changeset
184 {
6426007cad63 Fixed broken BIOS workaround
nick
parents: 2518
diff changeset
185 if(!str[i]) { null_found = 1; break; }
6426007cad63 Fixed broken BIOS workaround
nick
parents: 2518
diff changeset
186 }
6426007cad63 Fixed broken BIOS workaround
nick
parents: 2518
diff changeset
187 else break;
2515
622cd80caaba memory verification
nick
parents: 2460
diff changeset
188 }
622cd80caaba memory verification
nick
parents: 2460
diff changeset
189 else break;
622cd80caaba memory verification
nick
parents: 2460
diff changeset
190 }
622cd80caaba memory verification
nick
parents: 2460
diff changeset
191 return null_found;
622cd80caaba memory verification
nick
parents: 2460
diff changeset
192 }
622cd80caaba memory verification
nick
parents: 2460
diff changeset
193
2536
6426007cad63 Fixed broken BIOS workaround
nick
parents: 2518
diff changeset
194 static int check_wrd(const unsigned short *str)
2515
622cd80caaba memory verification
nick
parents: 2460
diff changeset
195 {
622cd80caaba memory verification
nick
parents: 2460
diff changeset
196 size_t i;
622cd80caaba memory verification
nick
parents: 2460
diff changeset
197 int ffff_found = 0;
622cd80caaba memory verification
nick
parents: 2460
diff changeset
198 for(i = 0;i < 1024;i++)
622cd80caaba memory verification
nick
parents: 2460
diff changeset
199 {
2536
6426007cad63 Fixed broken BIOS workaround
nick
parents: 2518
diff changeset
200 if(is_addr_valid(&str[i]))
2515
622cd80caaba memory verification
nick
parents: 2460
diff changeset
201 {
2536
6426007cad63 Fixed broken BIOS workaround
nick
parents: 2518
diff changeset
202 if(VERR(&str[i]))
6426007cad63 Fixed broken BIOS workaround
nick
parents: 2518
diff changeset
203 {
6426007cad63 Fixed broken BIOS workaround
nick
parents: 2518
diff changeset
204 if(str[i] == 0xffff) { ffff_found = 1; break; }
6426007cad63 Fixed broken BIOS workaround
nick
parents: 2518
diff changeset
205 }
6426007cad63 Fixed broken BIOS workaround
nick
parents: 2518
diff changeset
206 else break;
2515
622cd80caaba memory verification
nick
parents: 2460
diff changeset
207 }
622cd80caaba memory verification
nick
parents: 2460
diff changeset
208 else break;
622cd80caaba memory verification
nick
parents: 2460
diff changeset
209 }
622cd80caaba memory verification
nick
parents: 2460
diff changeset
210 return ffff_found;
622cd80caaba memory verification
nick
parents: 2460
diff changeset
211 }
622cd80caaba memory verification
nick
parents: 2460
diff changeset
212
2407
2e4c17f4a744 More verbosing
nick
parents: 2359
diff changeset
213 static void print_str(unsigned char *str)
2e4c17f4a744 More verbosing
nick
parents: 2359
diff changeset
214 {
2e4c17f4a744 More verbosing
nick
parents: 2359
diff changeset
215 size_t i;
2e4c17f4a744 More verbosing
nick
parents: 2359
diff changeset
216 fflush(stdout);
2e4c17f4a744 More verbosing
nick
parents: 2359
diff changeset
217 printf("vbelib: ");
2e4c17f4a744 More verbosing
nick
parents: 2359
diff changeset
218 for(i = 0;i < 256;i++) { printf("%02X(%c) ",str[i],isprint(str[i])?str[i]:'.'); if(!str[i]) break; }
2e4c17f4a744 More verbosing
nick
parents: 2359
diff changeset
219 printf("\n");
2e4c17f4a744 More verbosing
nick
parents: 2359
diff changeset
220 fflush(stdout);
2e4c17f4a744 More verbosing
nick
parents: 2359
diff changeset
221 }
2e4c17f4a744 More verbosing
nick
parents: 2359
diff changeset
222
2e4c17f4a744 More verbosing
nick
parents: 2359
diff changeset
223 static void print_wrd(unsigned short *str)
2e4c17f4a744 More verbosing
nick
parents: 2359
diff changeset
224 {
2e4c17f4a744 More verbosing
nick
parents: 2359
diff changeset
225 size_t i;
2e4c17f4a744 More verbosing
nick
parents: 2359
diff changeset
226 fflush(stdout);
2e4c17f4a744 More verbosing
nick
parents: 2359
diff changeset
227 printf("vbelib: ");
2e4c17f4a744 More verbosing
nick
parents: 2359
diff changeset
228 for(i = 0;i < 256;i++) { printf("%04X ",str[i]); if(str[i] == 0xffff) break; }
2e4c17f4a744 More verbosing
nick
parents: 2359
diff changeset
229 printf("\n");
2e4c17f4a744 More verbosing
nick
parents: 2359
diff changeset
230 fflush(stdout);
2e4c17f4a744 More verbosing
nick
parents: 2359
diff changeset
231 }
2e4c17f4a744 More verbosing
nick
parents: 2359
diff changeset
232
2243
f4b588dba08a vbelib import
nick
parents:
diff changeset
233 int vbeGetControllerInfo(struct VbeInfoBlock *data)
f4b588dba08a vbelib import
nick
parents:
diff changeset
234 {
f4b588dba08a vbelib import
nick
parents:
diff changeset
235 struct LRMI_regs r;
f4b588dba08a vbelib import
nick
parents:
diff changeset
236 int retval;
6473
6c45b8bf9a3e date: 2002/06/16 09:10:00; author: nickols_k; state: Exp; lines: +17 -13
atmos4
parents: 4405
diff changeset
237 memcpy(controller_info,data,sizeof(struct VbeInfoBlock));
2243
f4b588dba08a vbelib import
nick
parents:
diff changeset
238 memset(&r,0,sizeof(struct LRMI_regs));
f4b588dba08a vbelib import
nick
parents:
diff changeset
239 r.eax = 0x4f00;
6473
6c45b8bf9a3e date: 2002/06/16 09:10:00; author: nickols_k; state: Exp; lines: +17 -13
atmos4
parents: 4405
diff changeset
240 r.es = VirtToPhysSeg(controller_info);
6c45b8bf9a3e date: 2002/06/16 09:10:00; author: nickols_k; state: Exp; lines: +17 -13
atmos4
parents: 4405
diff changeset
241 r.edi = VirtToPhysOff(controller_info);
6c45b8bf9a3e date: 2002/06/16 09:10:00; author: nickols_k; state: Exp; lines: +17 -13
atmos4
parents: 4405
diff changeset
242 if(!VBE_LRMI_int(0x10,&r)) return VBE_VM86_FAIL;
2243
f4b588dba08a vbelib import
nick
parents:
diff changeset
243 retval = r.eax & 0xffff;
f4b588dba08a vbelib import
nick
parents:
diff changeset
244 if(retval == 0x4f)
f4b588dba08a vbelib import
nick
parents:
diff changeset
245 {
f4b588dba08a vbelib import
nick
parents:
diff changeset
246 FarPtr fpdata;
f4b588dba08a vbelib import
nick
parents:
diff changeset
247 retval = VBE_OK;
6473
6c45b8bf9a3e date: 2002/06/16 09:10:00; author: nickols_k; state: Exp; lines: +17 -13
atmos4
parents: 4405
diff changeset
248 memcpy(data,controller_info,sizeof(struct VbeInfoBlock));
2243
f4b588dba08a vbelib import
nick
parents:
diff changeset
249 fpdata.seg = (unsigned long)(data->OemStringPtr) >> 16;
f4b588dba08a vbelib import
nick
parents:
diff changeset
250 fpdata.off = (unsigned long)(data->OemStringPtr) & 0xffff;
f4b588dba08a vbelib import
nick
parents:
diff changeset
251 data->OemStringPtr = PhysToVirt(fpdata);
2515
622cd80caaba memory verification
nick
parents: 2460
diff changeset
252 if(!check_str(data->OemStringPtr)) data->OemStringPtr = NULL;
2294
9475a75dde9c More verbosing
nick
parents: 2254
diff changeset
253 #ifdef HAVE_VERBOSE_VAR
2407
2e4c17f4a744 More verbosing
nick
parents: 2359
diff changeset
254 if(verbose > 1)
2e4c17f4a744 More verbosing
nick
parents: 2359
diff changeset
255 {
2e4c17f4a744 More verbosing
nick
parents: 2359
diff changeset
256 printf("vbelib: OemStringPtr=%04X:%04X => %p\n",fpdata.seg,fpdata.off,data->OemStringPtr);
2515
622cd80caaba memory verification
nick
parents: 2460
diff changeset
257 if(data->OemStringPtr) print_str(data->OemStringPtr);
2518
a3f658d3c98c More flushing
nick
parents: 2515
diff changeset
258 fflush(stdout);
2407
2e4c17f4a744 More verbosing
nick
parents: 2359
diff changeset
259 }
2294
9475a75dde9c More verbosing
nick
parents: 2254
diff changeset
260 #endif
2243
f4b588dba08a vbelib import
nick
parents:
diff changeset
261 fpdata.seg = (unsigned long)(data->VideoModePtr) >> 16;
f4b588dba08a vbelib import
nick
parents:
diff changeset
262 fpdata.off = (unsigned long)(data->VideoModePtr) & 0xffff;
f4b588dba08a vbelib import
nick
parents:
diff changeset
263 data->VideoModePtr = PhysToVirt(fpdata);
2515
622cd80caaba memory verification
nick
parents: 2460
diff changeset
264 if(!check_wrd(data->VideoModePtr))
622cd80caaba memory verification
nick
parents: 2460
diff changeset
265 {
622cd80caaba memory verification
nick
parents: 2460
diff changeset
266 data->VideoModePtr = NULL;
622cd80caaba memory verification
nick
parents: 2460
diff changeset
267 retval = VBE_BROKEN_BIOS;
622cd80caaba memory verification
nick
parents: 2460
diff changeset
268 }
2294
9475a75dde9c More verbosing
nick
parents: 2254
diff changeset
269 #ifdef HAVE_VERBOSE_VAR
2407
2e4c17f4a744 More verbosing
nick
parents: 2359
diff changeset
270 if(verbose > 1)
2e4c17f4a744 More verbosing
nick
parents: 2359
diff changeset
271 {
2e4c17f4a744 More verbosing
nick
parents: 2359
diff changeset
272 printf("vbelib: VideoModePtr=%04X:%04X => %p\n",fpdata.seg,fpdata.off,data->VideoModePtr);
2515
622cd80caaba memory verification
nick
parents: 2460
diff changeset
273 if(data->VideoModePtr) print_wrd(data->VideoModePtr);
2518
a3f658d3c98c More flushing
nick
parents: 2515
diff changeset
274 fflush(stdout);
2407
2e4c17f4a744 More verbosing
nick
parents: 2359
diff changeset
275 }
2294
9475a75dde9c More verbosing
nick
parents: 2254
diff changeset
276 #endif
2243
f4b588dba08a vbelib import
nick
parents:
diff changeset
277 fpdata.seg = (unsigned long)(data->OemVendorNamePtr) >> 16;
f4b588dba08a vbelib import
nick
parents:
diff changeset
278 fpdata.off = (unsigned long)(data->OemVendorNamePtr) & 0xffff;
f4b588dba08a vbelib import
nick
parents:
diff changeset
279 data->OemVendorNamePtr = PhysToVirt(fpdata);
2515
622cd80caaba memory verification
nick
parents: 2460
diff changeset
280 if(!check_str(data->OemVendorNamePtr)) data->OemVendorNamePtr = NULL;
2294
9475a75dde9c More verbosing
nick
parents: 2254
diff changeset
281 #ifdef HAVE_VERBOSE_VAR
2407
2e4c17f4a744 More verbosing
nick
parents: 2359
diff changeset
282 if(verbose > 1)
2e4c17f4a744 More verbosing
nick
parents: 2359
diff changeset
283 {
2e4c17f4a744 More verbosing
nick
parents: 2359
diff changeset
284 printf("vbelib: OemVendorNamePtr=%04X:%04X => %p\n",fpdata.seg,fpdata.off,data->OemVendorNamePtr);
2515
622cd80caaba memory verification
nick
parents: 2460
diff changeset
285 if(data->OemVendorNamePtr) print_str(data->OemVendorNamePtr);
2518
a3f658d3c98c More flushing
nick
parents: 2515
diff changeset
286 fflush(stdout);
2407
2e4c17f4a744 More verbosing
nick
parents: 2359
diff changeset
287 }
2294
9475a75dde9c More verbosing
nick
parents: 2254
diff changeset
288 #endif
2243
f4b588dba08a vbelib import
nick
parents:
diff changeset
289 fpdata.seg = (unsigned long)(data->OemProductNamePtr) >> 16;
f4b588dba08a vbelib import
nick
parents:
diff changeset
290 fpdata.off = (unsigned long)(data->OemProductNamePtr) & 0xffff;
f4b588dba08a vbelib import
nick
parents:
diff changeset
291 data->OemProductNamePtr = PhysToVirt(fpdata);
2515
622cd80caaba memory verification
nick
parents: 2460
diff changeset
292 if(!check_str(data->OemProductNamePtr)) data->OemProductNamePtr = NULL;
2294
9475a75dde9c More verbosing
nick
parents: 2254
diff changeset
293 #ifdef HAVE_VERBOSE_VAR
2407
2e4c17f4a744 More verbosing
nick
parents: 2359
diff changeset
294 if(verbose > 1)
2e4c17f4a744 More verbosing
nick
parents: 2359
diff changeset
295 {
2e4c17f4a744 More verbosing
nick
parents: 2359
diff changeset
296 printf("vbelib: OemProductNamePtr=%04X:%04X => %p\n",fpdata.seg,fpdata.off,data->OemProductNamePtr);
2515
622cd80caaba memory verification
nick
parents: 2460
diff changeset
297 if(data->OemVendorNamePtr) print_str(data->OemProductNamePtr);
2518
a3f658d3c98c More flushing
nick
parents: 2515
diff changeset
298 fflush(stdout);
2407
2e4c17f4a744 More verbosing
nick
parents: 2359
diff changeset
299 }
2294
9475a75dde9c More verbosing
nick
parents: 2254
diff changeset
300 #endif
2243
f4b588dba08a vbelib import
nick
parents:
diff changeset
301 fpdata.seg = (unsigned long)(data->OemProductRevPtr) >> 16;
f4b588dba08a vbelib import
nick
parents:
diff changeset
302 fpdata.off = (unsigned long)(data->OemProductRevPtr) & 0xffff;
f4b588dba08a vbelib import
nick
parents:
diff changeset
303 data->OemProductRevPtr = PhysToVirt(fpdata);
2515
622cd80caaba memory verification
nick
parents: 2460
diff changeset
304 if(!check_str(data->OemProductRevPtr)) data->OemProductRevPtr = NULL;
2294
9475a75dde9c More verbosing
nick
parents: 2254
diff changeset
305 #ifdef HAVE_VERBOSE_VAR
2407
2e4c17f4a744 More verbosing
nick
parents: 2359
diff changeset
306 if(verbose > 1)
2e4c17f4a744 More verbosing
nick
parents: 2359
diff changeset
307 {
2e4c17f4a744 More verbosing
nick
parents: 2359
diff changeset
308 printf("vbelib: OemProductRevPtr=%04X:%04X => %p\n",fpdata.seg,fpdata.off,data->OemProductRevPtr);
2515
622cd80caaba memory verification
nick
parents: 2460
diff changeset
309 if(data->OemProductRevPtr) print_str(data->OemProductRevPtr);
2518
a3f658d3c98c More flushing
nick
parents: 2515
diff changeset
310 fflush(stdout);
2407
2e4c17f4a744 More verbosing
nick
parents: 2359
diff changeset
311 }
2294
9475a75dde9c More verbosing
nick
parents: 2254
diff changeset
312 #endif
2243
f4b588dba08a vbelib import
nick
parents:
diff changeset
313 }
f4b588dba08a vbelib import
nick
parents:
diff changeset
314 return retval;
f4b588dba08a vbelib import
nick
parents:
diff changeset
315 }
f4b588dba08a vbelib import
nick
parents:
diff changeset
316
f4b588dba08a vbelib import
nick
parents:
diff changeset
317 int vbeGetModeInfo(unsigned mode,struct VesaModeInfoBlock *data)
f4b588dba08a vbelib import
nick
parents:
diff changeset
318 {
f4b588dba08a vbelib import
nick
parents:
diff changeset
319 struct LRMI_regs r;
f4b588dba08a vbelib import
nick
parents:
diff changeset
320 void *rm_space;
f4b588dba08a vbelib import
nick
parents:
diff changeset
321 int retval;
f4b588dba08a vbelib import
nick
parents:
diff changeset
322 if(!(rm_space = LRMI_alloc_real(sizeof(struct VesaModeInfoBlock)))) return VBE_OUT_OF_DOS_MEM;
f4b588dba08a vbelib import
nick
parents:
diff changeset
323 memset(&r,0,sizeof(struct LRMI_regs));
f4b588dba08a vbelib import
nick
parents:
diff changeset
324 r.eax = 0x4f01;
f4b588dba08a vbelib import
nick
parents:
diff changeset
325 r.ecx = mode;
f4b588dba08a vbelib import
nick
parents:
diff changeset
326 r.es = VirtToPhysSeg(rm_space);
f4b588dba08a vbelib import
nick
parents:
diff changeset
327 r.edi = VirtToPhysOff(rm_space);
2294
9475a75dde9c More verbosing
nick
parents: 2254
diff changeset
328 if(!VBE_LRMI_int(0x10,&r))
2243
f4b588dba08a vbelib import
nick
parents:
diff changeset
329 {
f4b588dba08a vbelib import
nick
parents:
diff changeset
330 LRMI_free_real(rm_space);
f4b588dba08a vbelib import
nick
parents:
diff changeset
331 return VBE_VM86_FAIL;
f4b588dba08a vbelib import
nick
parents:
diff changeset
332 }
f4b588dba08a vbelib import
nick
parents:
diff changeset
333 retval = r.eax & 0xffff;
f4b588dba08a vbelib import
nick
parents:
diff changeset
334 if(retval == 0x4f)
f4b588dba08a vbelib import
nick
parents:
diff changeset
335 {
f4b588dba08a vbelib import
nick
parents:
diff changeset
336 retval = VBE_OK;
f4b588dba08a vbelib import
nick
parents:
diff changeset
337 memcpy(data,rm_space,sizeof(struct VesaModeInfoBlock));
f4b588dba08a vbelib import
nick
parents:
diff changeset
338 }
6473
6c45b8bf9a3e date: 2002/06/16 09:10:00; author: nickols_k; state: Exp; lines: +17 -13
atmos4
parents: 4405
diff changeset
339 LRMI_free_real(rm_space);
2243
f4b588dba08a vbelib import
nick
parents:
diff changeset
340 return retval;
f4b588dba08a vbelib import
nick
parents:
diff changeset
341 }
f4b588dba08a vbelib import
nick
parents:
diff changeset
342
12660
430a71a762b4 neomagic tv out support throught vesa vbe, patch by Rudolf Marek
alex
parents: 11455
diff changeset
343
430a71a762b4 neomagic tv out support throught vesa vbe, patch by Rudolf Marek
alex
parents: 11455
diff changeset
344 int vbeSetTV(unsigned int vesa_mode,unsigned int TV_mode) {
430a71a762b4 neomagic tv out support throught vesa vbe, patch by Rudolf Marek
alex
parents: 11455
diff changeset
345
430a71a762b4 neomagic tv out support throught vesa vbe, patch by Rudolf Marek
alex
parents: 11455
diff changeset
346 #define NR_MODES 8
430a71a762b4 neomagic tv out support throught vesa vbe, patch by Rudolf Marek
alex
parents: 11455
diff changeset
347
430a71a762b4 neomagic tv out support throught vesa vbe, patch by Rudolf Marek
alex
parents: 11455
diff changeset
348 unsigned int mode_table[NR_MODES] =
430a71a762b4 neomagic tv out support throught vesa vbe, patch by Rudolf Marek
alex
parents: 11455
diff changeset
349 {0x101,0x103,0x111,0x114,0x120,0x121,0x122,0x123};
430a71a762b4 neomagic tv out support throught vesa vbe, patch by Rudolf Marek
alex
parents: 11455
diff changeset
350 unsigned int tv_table[][NR_MODES] = {
430a71a762b4 neomagic tv out support throught vesa vbe, patch by Rudolf Marek
alex
parents: 11455
diff changeset
351 {0x201,0x202,0x211,0x212,0x221,0x231,0x222,0x232},
430a71a762b4 neomagic tv out support throught vesa vbe, patch by Rudolf Marek
alex
parents: 11455
diff changeset
352 {0x200,0x203,0x210,0x213,0x220,0x230,0xFFFF,0xFFFF}};
430a71a762b4 neomagic tv out support throught vesa vbe, patch by Rudolf Marek
alex
parents: 11455
diff changeset
353
430a71a762b4 neomagic tv out support throught vesa vbe, patch by Rudolf Marek
alex
parents: 11455
diff changeset
354 /*
430a71a762b4 neomagic tv out support throught vesa vbe, patch by Rudolf Marek
alex
parents: 11455
diff changeset
355
430a71a762b4 neomagic tv out support throught vesa vbe, patch by Rudolf Marek
alex
parents: 11455
diff changeset
356 Alternate mode map. If modes like 320x240 and 400x300 does not work, but
430a71a762b4 neomagic tv out support throught vesa vbe, patch by Rudolf Marek
alex
parents: 11455
diff changeset
357 640x480 and 800x600 work, then try to replace above two lines with this
430a71a762b4 neomagic tv out support throught vesa vbe, patch by Rudolf Marek
alex
parents: 11455
diff changeset
358 lines and write email to me if it works.
430a71a762b4 neomagic tv out support throught vesa vbe, patch by Rudolf Marek
alex
parents: 11455
diff changeset
359 r.marek et sh.cvut.cz
430a71a762b4 neomagic tv out support throught vesa vbe, patch by Rudolf Marek
alex
parents: 11455
diff changeset
360
430a71a762b4 neomagic tv out support throught vesa vbe, patch by Rudolf Marek
alex
parents: 11455
diff changeset
361 {0x201,0x202,0x211,0x212,0x222,0x223,0x224,0x225},
430a71a762b4 neomagic tv out support throught vesa vbe, patch by Rudolf Marek
alex
parents: 11455
diff changeset
362 {0x200,0x203,0x210,0x213,0x220,0x221,0xFFFF,0xFFFF}};
430a71a762b4 neomagic tv out support throught vesa vbe, patch by Rudolf Marek
alex
parents: 11455
diff changeset
363
430a71a762b4 neomagic tv out support throught vesa vbe, patch by Rudolf Marek
alex
parents: 11455
diff changeset
364 */
430a71a762b4 neomagic tv out support throught vesa vbe, patch by Rudolf Marek
alex
parents: 11455
diff changeset
365 int i,retval;
430a71a762b4 neomagic tv out support throught vesa vbe, patch by Rudolf Marek
alex
parents: 11455
diff changeset
366 struct LRMI_regs r;
430a71a762b4 neomagic tv out support throught vesa vbe, patch by Rudolf Marek
alex
parents: 11455
diff changeset
367
430a71a762b4 neomagic tv out support throught vesa vbe, patch by Rudolf Marek
alex
parents: 11455
diff changeset
368 memset(&r,0,sizeof(struct LRMI_regs));
430a71a762b4 neomagic tv out support throught vesa vbe, patch by Rudolf Marek
alex
parents: 11455
diff changeset
369 for (i=0;((mode_table[i]!=(vesa_mode&0x3FF))&&(i<NR_MODES));i++) ;
430a71a762b4 neomagic tv out support throught vesa vbe, patch by Rudolf Marek
alex
parents: 11455
diff changeset
370
430a71a762b4 neomagic tv out support throught vesa vbe, patch by Rudolf Marek
alex
parents: 11455
diff changeset
371 if (i==NR_MODES) return 0;
430a71a762b4 neomagic tv out support throught vesa vbe, patch by Rudolf Marek
alex
parents: 11455
diff changeset
372 if(verbose > 1) printf("vbelib: Trying to set TV mode %x\n",tv_table[TV_mode][i]);
430a71a762b4 neomagic tv out support throught vesa vbe, patch by Rudolf Marek
alex
parents: 11455
diff changeset
373 r.eax = 0x4f14;
430a71a762b4 neomagic tv out support throught vesa vbe, patch by Rudolf Marek
alex
parents: 11455
diff changeset
374 r.ebx = 0x20;
430a71a762b4 neomagic tv out support throught vesa vbe, patch by Rudolf Marek
alex
parents: 11455
diff changeset
375 r.edx = 0;
430a71a762b4 neomagic tv out support throught vesa vbe, patch by Rudolf Marek
alex
parents: 11455
diff changeset
376 r.edi = 0;
430a71a762b4 neomagic tv out support throught vesa vbe, patch by Rudolf Marek
alex
parents: 11455
diff changeset
377 r.ecx = tv_table[TV_mode][i];
430a71a762b4 neomagic tv out support throught vesa vbe, patch by Rudolf Marek
alex
parents: 11455
diff changeset
378 retval = VBE_LRMI_int(0x10,&r);
430a71a762b4 neomagic tv out support throught vesa vbe, patch by Rudolf Marek
alex
parents: 11455
diff changeset
379 if(!retval) return VBE_VM86_FAIL;
430a71a762b4 neomagic tv out support throught vesa vbe, patch by Rudolf Marek
alex
parents: 11455
diff changeset
380 return r.eax & 0xffff;
430a71a762b4 neomagic tv out support throught vesa vbe, patch by Rudolf Marek
alex
parents: 11455
diff changeset
381
430a71a762b4 neomagic tv out support throught vesa vbe, patch by Rudolf Marek
alex
parents: 11455
diff changeset
382 }
2243
f4b588dba08a vbelib import
nick
parents:
diff changeset
383 int vbeSetMode(unsigned mode,struct VesaCRTCInfoBlock *data)
f4b588dba08a vbelib import
nick
parents:
diff changeset
384 {
f4b588dba08a vbelib import
nick
parents:
diff changeset
385 struct LRMI_regs r;
f4b588dba08a vbelib import
nick
parents:
diff changeset
386 void *rm_space = NULL;
f4b588dba08a vbelib import
nick
parents:
diff changeset
387 int retval;
f4b588dba08a vbelib import
nick
parents:
diff changeset
388 memset(&r,0,sizeof(struct LRMI_regs));
f4b588dba08a vbelib import
nick
parents:
diff changeset
389 if(data)
f4b588dba08a vbelib import
nick
parents:
diff changeset
390 {
f4b588dba08a vbelib import
nick
parents:
diff changeset
391 if(!(rm_space = LRMI_alloc_real(sizeof(struct VesaCRTCInfoBlock)))) return VBE_OUT_OF_DOS_MEM;
f4b588dba08a vbelib import
nick
parents:
diff changeset
392 r.es = VirtToPhysSeg(rm_space);
f4b588dba08a vbelib import
nick
parents:
diff changeset
393 r.edi = VirtToPhysOff(rm_space);
f4b588dba08a vbelib import
nick
parents:
diff changeset
394 memcpy(rm_space,data,sizeof(struct VesaCRTCInfoBlock));
f4b588dba08a vbelib import
nick
parents:
diff changeset
395 }
f4b588dba08a vbelib import
nick
parents:
diff changeset
396 r.eax = 0x4f02;
f4b588dba08a vbelib import
nick
parents:
diff changeset
397 r.ebx = mode;
2294
9475a75dde9c More verbosing
nick
parents: 2254
diff changeset
398 retval = VBE_LRMI_int(0x10,&r);
6473
6c45b8bf9a3e date: 2002/06/16 09:10:00; author: nickols_k; state: Exp; lines: +17 -13
atmos4
parents: 4405
diff changeset
399 LRMI_free_real(rm_space);
2243
f4b588dba08a vbelib import
nick
parents:
diff changeset
400 if(!retval) return VBE_VM86_FAIL;
f4b588dba08a vbelib import
nick
parents:
diff changeset
401 retval = r.eax & 0xffff;
2632
6e3cee9e07ef Double buffering interface
nick
parents: 2610
diff changeset
402 if(retval == 0x4f)
6e3cee9e07ef Double buffering interface
nick
parents: 2610
diff changeset
403 {
6e3cee9e07ef Double buffering interface
nick
parents: 2610
diff changeset
404 /* Just info for internal use (currently in SetDiplayStart func). */
13568
1cb0e1833515 Currently vbeGetProtModeInfo call the 0x4f0a function of int 10h the get
faust3
parents: 13352
diff changeset
405 vbeGetModeInfo(mode,&curr_mode_info);
2632
6e3cee9e07ef Double buffering interface
nick
parents: 2610
diff changeset
406 retval = VBE_OK;
6e3cee9e07ef Double buffering interface
nick
parents: 2610
diff changeset
407 }
2243
f4b588dba08a vbelib import
nick
parents:
diff changeset
408 return retval;
f4b588dba08a vbelib import
nick
parents:
diff changeset
409 }
f4b588dba08a vbelib import
nick
parents:
diff changeset
410
f4b588dba08a vbelib import
nick
parents:
diff changeset
411 int vbeGetMode(unsigned *mode)
f4b588dba08a vbelib import
nick
parents:
diff changeset
412 {
f4b588dba08a vbelib import
nick
parents:
diff changeset
413 struct LRMI_regs r;
f4b588dba08a vbelib import
nick
parents:
diff changeset
414 int retval;
f4b588dba08a vbelib import
nick
parents:
diff changeset
415 memset(&r,0,sizeof(struct LRMI_regs));
f4b588dba08a vbelib import
nick
parents:
diff changeset
416 r.eax = 0x4f03;
2294
9475a75dde9c More verbosing
nick
parents: 2254
diff changeset
417 if(!VBE_LRMI_int(0x10,&r)) return VBE_VM86_FAIL;
2243
f4b588dba08a vbelib import
nick
parents:
diff changeset
418 retval = r.eax & 0xffff;
f4b588dba08a vbelib import
nick
parents:
diff changeset
419 if(retval == 0x4f)
f4b588dba08a vbelib import
nick
parents:
diff changeset
420 {
f4b588dba08a vbelib import
nick
parents:
diff changeset
421 *mode = r.ebx;
f4b588dba08a vbelib import
nick
parents:
diff changeset
422 retval = VBE_OK;
f4b588dba08a vbelib import
nick
parents:
diff changeset
423 }
f4b588dba08a vbelib import
nick
parents:
diff changeset
424 return retval;
f4b588dba08a vbelib import
nick
parents:
diff changeset
425 }
f4b588dba08a vbelib import
nick
parents:
diff changeset
426
7069
21e1ab99cb21 General Timing Formula algorithm from a scratch.
arpi
parents: 6473
diff changeset
427 int vbeGetPixelClock(unsigned *mode,unsigned *pixel_clock) // in Hz
21e1ab99cb21 General Timing Formula algorithm from a scratch.
arpi
parents: 6473
diff changeset
428 {
21e1ab99cb21 General Timing Formula algorithm from a scratch.
arpi
parents: 6473
diff changeset
429 struct LRMI_regs r;
21e1ab99cb21 General Timing Formula algorithm from a scratch.
arpi
parents: 6473
diff changeset
430 int retval;
21e1ab99cb21 General Timing Formula algorithm from a scratch.
arpi
parents: 6473
diff changeset
431 memset(&r,0,sizeof(struct LRMI_regs));
21e1ab99cb21 General Timing Formula algorithm from a scratch.
arpi
parents: 6473
diff changeset
432 r.eax = 0x4f0b;
21e1ab99cb21 General Timing Formula algorithm from a scratch.
arpi
parents: 6473
diff changeset
433 r.ebx = 0;
21e1ab99cb21 General Timing Formula algorithm from a scratch.
arpi
parents: 6473
diff changeset
434 r.edx = *mode;
21e1ab99cb21 General Timing Formula algorithm from a scratch.
arpi
parents: 6473
diff changeset
435 r.ecx = *pixel_clock;
21e1ab99cb21 General Timing Formula algorithm from a scratch.
arpi
parents: 6473
diff changeset
436 if(!VBE_LRMI_int(0x10,&r)) return VBE_VM86_FAIL;
21e1ab99cb21 General Timing Formula algorithm from a scratch.
arpi
parents: 6473
diff changeset
437 retval = r.eax & 0xffff;
21e1ab99cb21 General Timing Formula algorithm from a scratch.
arpi
parents: 6473
diff changeset
438 if(retval == 0x4f)
21e1ab99cb21 General Timing Formula algorithm from a scratch.
arpi
parents: 6473
diff changeset
439 {
21e1ab99cb21 General Timing Formula algorithm from a scratch.
arpi
parents: 6473
diff changeset
440 *pixel_clock = r.ecx;
21e1ab99cb21 General Timing Formula algorithm from a scratch.
arpi
parents: 6473
diff changeset
441 retval = VBE_OK;
21e1ab99cb21 General Timing Formula algorithm from a scratch.
arpi
parents: 6473
diff changeset
442 }
21e1ab99cb21 General Timing Formula algorithm from a scratch.
arpi
parents: 6473
diff changeset
443 return retval;
21e1ab99cb21 General Timing Formula algorithm from a scratch.
arpi
parents: 6473
diff changeset
444 }
21e1ab99cb21 General Timing Formula algorithm from a scratch.
arpi
parents: 6473
diff changeset
445
21e1ab99cb21 General Timing Formula algorithm from a scratch.
arpi
parents: 6473
diff changeset
446
2243
f4b588dba08a vbelib import
nick
parents:
diff changeset
447 int vbeSaveState(void **data)
f4b588dba08a vbelib import
nick
parents:
diff changeset
448 {
f4b588dba08a vbelib import
nick
parents:
diff changeset
449 struct LRMI_regs r;
f4b588dba08a vbelib import
nick
parents:
diff changeset
450 int retval;
f4b588dba08a vbelib import
nick
parents:
diff changeset
451 void *rm_space;
f4b588dba08a vbelib import
nick
parents:
diff changeset
452 memset(&r,0,sizeof(struct LRMI_regs));
f4b588dba08a vbelib import
nick
parents:
diff changeset
453 r.eax = 0x4f04;
f4b588dba08a vbelib import
nick
parents:
diff changeset
454 r.edx = 0x00;
f4b588dba08a vbelib import
nick
parents:
diff changeset
455 r.ecx = 0x0f;
2294
9475a75dde9c More verbosing
nick
parents: 2254
diff changeset
456 if(!VBE_LRMI_int(0x10,&r)) return VBE_VM86_FAIL;
2243
f4b588dba08a vbelib import
nick
parents:
diff changeset
457 retval = r.eax & 0xffff;
f4b588dba08a vbelib import
nick
parents:
diff changeset
458 if(retval != 0x4f) return retval;
f4b588dba08a vbelib import
nick
parents:
diff changeset
459 if(!(rm_space = LRMI_alloc_real((r.ebx & 0xffff)*64))) return VBE_OUT_OF_DOS_MEM;
f4b588dba08a vbelib import
nick
parents:
diff changeset
460 r.eax = 0x4f04;
f4b588dba08a vbelib import
nick
parents:
diff changeset
461 r.edx = 0x01;
f4b588dba08a vbelib import
nick
parents:
diff changeset
462 r.ecx = 0x0f;
f4b588dba08a vbelib import
nick
parents:
diff changeset
463 r.es = VirtToPhysSeg(rm_space);
2254
6e5b548790c9 Fixed bug of 32-bit mode interface detection and save-restore mechanism
nick
parents: 2243
diff changeset
464 r.ebx = VirtToPhysOff(rm_space);
2294
9475a75dde9c More verbosing
nick
parents: 2254
diff changeset
465 if(!VBE_LRMI_int(0x10,&r))
2243
f4b588dba08a vbelib import
nick
parents:
diff changeset
466 {
f4b588dba08a vbelib import
nick
parents:
diff changeset
467 LRMI_free_real(rm_space);
f4b588dba08a vbelib import
nick
parents:
diff changeset
468 return VBE_VM86_FAIL;
f4b588dba08a vbelib import
nick
parents:
diff changeset
469 }
f4b588dba08a vbelib import
nick
parents:
diff changeset
470 retval = r.eax & 0xffff;
f4b588dba08a vbelib import
nick
parents:
diff changeset
471 if(retval != 0x4f)
f4b588dba08a vbelib import
nick
parents:
diff changeset
472 {
f4b588dba08a vbelib import
nick
parents:
diff changeset
473 LRMI_free_real(rm_space);
f4b588dba08a vbelib import
nick
parents:
diff changeset
474 return retval;
f4b588dba08a vbelib import
nick
parents:
diff changeset
475 }
f4b588dba08a vbelib import
nick
parents:
diff changeset
476 *data = rm_space;
f4b588dba08a vbelib import
nick
parents:
diff changeset
477 return VBE_OK;
f4b588dba08a vbelib import
nick
parents:
diff changeset
478 }
f4b588dba08a vbelib import
nick
parents:
diff changeset
479
f4b588dba08a vbelib import
nick
parents:
diff changeset
480 int vbeRestoreState(void *data)
f4b588dba08a vbelib import
nick
parents:
diff changeset
481 {
f4b588dba08a vbelib import
nick
parents:
diff changeset
482 struct LRMI_regs r;
f4b588dba08a vbelib import
nick
parents:
diff changeset
483 int retval;
f4b588dba08a vbelib import
nick
parents:
diff changeset
484 memset(&r,0,sizeof(struct LRMI_regs));
f4b588dba08a vbelib import
nick
parents:
diff changeset
485 r.eax = 0x4f04;
f4b588dba08a vbelib import
nick
parents:
diff changeset
486 r.edx = 0x02;
f4b588dba08a vbelib import
nick
parents:
diff changeset
487 r.ecx = 0x0f;
f4b588dba08a vbelib import
nick
parents:
diff changeset
488 r.es = VirtToPhysSeg(data);
2254
6e5b548790c9 Fixed bug of 32-bit mode interface detection and save-restore mechanism
nick
parents: 2243
diff changeset
489 r.ebx = VirtToPhysOff(data);
2294
9475a75dde9c More verbosing
nick
parents: 2254
diff changeset
490 retval = VBE_LRMI_int(0x10,&r);
2243
f4b588dba08a vbelib import
nick
parents:
diff changeset
491 LRMI_free_real(data);
f4b588dba08a vbelib import
nick
parents:
diff changeset
492 if(!retval) return VBE_VM86_FAIL;
f4b588dba08a vbelib import
nick
parents:
diff changeset
493 retval = r.eax & 0xffff;
f4b588dba08a vbelib import
nick
parents:
diff changeset
494 if(retval == 0x4f) retval = VBE_OK;
f4b588dba08a vbelib import
nick
parents:
diff changeset
495 return retval;
f4b588dba08a vbelib import
nick
parents:
diff changeset
496 }
f4b588dba08a vbelib import
nick
parents:
diff changeset
497
f4b588dba08a vbelib import
nick
parents:
diff changeset
498 int vbeGetWindow(unsigned *win_num)
f4b588dba08a vbelib import
nick
parents:
diff changeset
499 {
f4b588dba08a vbelib import
nick
parents:
diff changeset
500 struct LRMI_regs r;
f4b588dba08a vbelib import
nick
parents:
diff changeset
501 int retval;
f4b588dba08a vbelib import
nick
parents:
diff changeset
502 memset(&r,0,sizeof(struct LRMI_regs));
f4b588dba08a vbelib import
nick
parents:
diff changeset
503 r.eax = 0x4f05;
f4b588dba08a vbelib import
nick
parents:
diff changeset
504 r.ebx = (*win_num & 0x0f) | 0x0100;
2294
9475a75dde9c More verbosing
nick
parents: 2254
diff changeset
505 if(!VBE_LRMI_int(0x10,&r)) return VBE_VM86_FAIL;
2243
f4b588dba08a vbelib import
nick
parents:
diff changeset
506 retval = r.eax & 0xffff;
f4b588dba08a vbelib import
nick
parents:
diff changeset
507 if(retval == 0x4f)
f4b588dba08a vbelib import
nick
parents:
diff changeset
508 {
f4b588dba08a vbelib import
nick
parents:
diff changeset
509 *win_num = r.edx & 0xffff;
f4b588dba08a vbelib import
nick
parents:
diff changeset
510 retval = VBE_OK;
f4b588dba08a vbelib import
nick
parents:
diff changeset
511 }
f4b588dba08a vbelib import
nick
parents:
diff changeset
512 return retval;
f4b588dba08a vbelib import
nick
parents:
diff changeset
513 }
f4b588dba08a vbelib import
nick
parents:
diff changeset
514
f4b588dba08a vbelib import
nick
parents:
diff changeset
515 int vbeSetWindow(unsigned win_num,unsigned win_gran)
f4b588dba08a vbelib import
nick
parents:
diff changeset
516 {
f4b588dba08a vbelib import
nick
parents:
diff changeset
517 int retval;
f4b588dba08a vbelib import
nick
parents:
diff changeset
518 if(vbe_pm_info.SetWindowCall)
f4b588dba08a vbelib import
nick
parents:
diff changeset
519 {
2294
9475a75dde9c More verbosing
nick
parents: 2254
diff changeset
520 /* Don't verbose this stuff from performance reasons */
2243
f4b588dba08a vbelib import
nick
parents:
diff changeset
521 /* 32-bit function call is much better of int 10h */
f4b588dba08a vbelib import
nick
parents:
diff changeset
522 __asm __volatile(
f4b588dba08a vbelib import
nick
parents:
diff changeset
523 "pushl %%ebx\n"
f4b588dba08a vbelib import
nick
parents:
diff changeset
524 "movl %1, %%ebx\n"
f4b588dba08a vbelib import
nick
parents:
diff changeset
525 ::"a"(0x4f05),"S"(win_num & 0x0f),"d"(win_gran):"memory");
f4b588dba08a vbelib import
nick
parents:
diff changeset
526 (*vbe_pm_info.SetWindowCall)();
2254
6e5b548790c9 Fixed bug of 32-bit mode interface detection and save-restore mechanism
nick
parents: 2243
diff changeset
527 __asm __volatile("popl %%ebx":::"memory");
6e5b548790c9 Fixed bug of 32-bit mode interface detection and save-restore mechanism
nick
parents: 2243
diff changeset
528 retval = VBE_OK;
2243
f4b588dba08a vbelib import
nick
parents:
diff changeset
529 }
f4b588dba08a vbelib import
nick
parents:
diff changeset
530 else
f4b588dba08a vbelib import
nick
parents:
diff changeset
531 {
f4b588dba08a vbelib import
nick
parents:
diff changeset
532 struct LRMI_regs r;
f4b588dba08a vbelib import
nick
parents:
diff changeset
533 memset(&r,0,sizeof(struct LRMI_regs));
f4b588dba08a vbelib import
nick
parents:
diff changeset
534 r.eax = 0x4f05;
f4b588dba08a vbelib import
nick
parents:
diff changeset
535 r.ebx = win_num & 0x0f;
f4b588dba08a vbelib import
nick
parents:
diff changeset
536 r.edx = win_gran;
2294
9475a75dde9c More verbosing
nick
parents: 2254
diff changeset
537 if(!VBE_LRMI_int(0x10,&r)) return VBE_VM86_FAIL;
2243
f4b588dba08a vbelib import
nick
parents:
diff changeset
538 retval = r.eax & 0xffff;
2254
6e5b548790c9 Fixed bug of 32-bit mode interface detection and save-restore mechanism
nick
parents: 2243
diff changeset
539 if(retval == 0x4f) retval = VBE_OK;
2243
f4b588dba08a vbelib import
nick
parents:
diff changeset
540 }
f4b588dba08a vbelib import
nick
parents:
diff changeset
541 return retval;
f4b588dba08a vbelib import
nick
parents:
diff changeset
542 }
f4b588dba08a vbelib import
nick
parents:
diff changeset
543
2632
6e3cee9e07ef Double buffering interface
nick
parents: 2610
diff changeset
544 int vbeGetScanLineLength(unsigned *num_pixels,unsigned *num_bytes)
6e3cee9e07ef Double buffering interface
nick
parents: 2610
diff changeset
545 {
6e3cee9e07ef Double buffering interface
nick
parents: 2610
diff changeset
546 struct LRMI_regs r;
6e3cee9e07ef Double buffering interface
nick
parents: 2610
diff changeset
547 int retval;
6e3cee9e07ef Double buffering interface
nick
parents: 2610
diff changeset
548 memset(&r,0,sizeof(struct LRMI_regs));
6e3cee9e07ef Double buffering interface
nick
parents: 2610
diff changeset
549 r.eax = 0x4f06;
6e3cee9e07ef Double buffering interface
nick
parents: 2610
diff changeset
550 r.ebx = 1;
6e3cee9e07ef Double buffering interface
nick
parents: 2610
diff changeset
551 if(!VBE_LRMI_int(0x10,&r)) return VBE_VM86_FAIL;
6e3cee9e07ef Double buffering interface
nick
parents: 2610
diff changeset
552 retval = r.eax & 0xffff;
6e3cee9e07ef Double buffering interface
nick
parents: 2610
diff changeset
553 if(retval == 0x4f)
6e3cee9e07ef Double buffering interface
nick
parents: 2610
diff changeset
554 {
6e3cee9e07ef Double buffering interface
nick
parents: 2610
diff changeset
555 if(num_bytes) *num_bytes = r.ebx & 0xffff;
6e3cee9e07ef Double buffering interface
nick
parents: 2610
diff changeset
556 if(num_pixels) *num_pixels= r.ecx & 0xffff;
6e3cee9e07ef Double buffering interface
nick
parents: 2610
diff changeset
557 retval = VBE_OK;
6e3cee9e07ef Double buffering interface
nick
parents: 2610
diff changeset
558 }
6e3cee9e07ef Double buffering interface
nick
parents: 2610
diff changeset
559 return retval;
6e3cee9e07ef Double buffering interface
nick
parents: 2610
diff changeset
560 }
6e3cee9e07ef Double buffering interface
nick
parents: 2610
diff changeset
561
6e3cee9e07ef Double buffering interface
nick
parents: 2610
diff changeset
562 int vbeGetMaxScanLines(unsigned *num_pixels,unsigned *num_bytes, unsigned *num_lines)
6e3cee9e07ef Double buffering interface
nick
parents: 2610
diff changeset
563 {
6e3cee9e07ef Double buffering interface
nick
parents: 2610
diff changeset
564 struct LRMI_regs r;
6e3cee9e07ef Double buffering interface
nick
parents: 2610
diff changeset
565 int retval;
6e3cee9e07ef Double buffering interface
nick
parents: 2610
diff changeset
566 memset(&r,0,sizeof(struct LRMI_regs));
6e3cee9e07ef Double buffering interface
nick
parents: 2610
diff changeset
567 r.eax = 0x4f06;
6e3cee9e07ef Double buffering interface
nick
parents: 2610
diff changeset
568 r.ebx = 3;
6e3cee9e07ef Double buffering interface
nick
parents: 2610
diff changeset
569 if(!VBE_LRMI_int(0x10,&r)) return VBE_VM86_FAIL;
6e3cee9e07ef Double buffering interface
nick
parents: 2610
diff changeset
570 retval = r.eax & 0xffff;
6e3cee9e07ef Double buffering interface
nick
parents: 2610
diff changeset
571 if(retval == 0x4f)
6e3cee9e07ef Double buffering interface
nick
parents: 2610
diff changeset
572 {
6e3cee9e07ef Double buffering interface
nick
parents: 2610
diff changeset
573 if(num_bytes) *num_bytes = r.ebx & 0xffff;
6e3cee9e07ef Double buffering interface
nick
parents: 2610
diff changeset
574 if(num_pixels) *num_pixels= r.ecx & 0xffff;
6e3cee9e07ef Double buffering interface
nick
parents: 2610
diff changeset
575 if(num_lines) *num_lines = r.edx & 0xffff;
6e3cee9e07ef Double buffering interface
nick
parents: 2610
diff changeset
576 retval = VBE_OK;
6e3cee9e07ef Double buffering interface
nick
parents: 2610
diff changeset
577 }
6e3cee9e07ef Double buffering interface
nick
parents: 2610
diff changeset
578 return retval;
6e3cee9e07ef Double buffering interface
nick
parents: 2610
diff changeset
579 }
6e3cee9e07ef Double buffering interface
nick
parents: 2610
diff changeset
580
6e3cee9e07ef Double buffering interface
nick
parents: 2610
diff changeset
581 int vbeSetScanLineLength(unsigned num_pixels)
6e3cee9e07ef Double buffering interface
nick
parents: 2610
diff changeset
582 {
6e3cee9e07ef Double buffering interface
nick
parents: 2610
diff changeset
583 int retval;
6e3cee9e07ef Double buffering interface
nick
parents: 2610
diff changeset
584 struct LRMI_regs r;
6e3cee9e07ef Double buffering interface
nick
parents: 2610
diff changeset
585 memset(&r,0,sizeof(struct LRMI_regs));
6e3cee9e07ef Double buffering interface
nick
parents: 2610
diff changeset
586 r.eax = 0x4f06;
6e3cee9e07ef Double buffering interface
nick
parents: 2610
diff changeset
587 r.ebx = 0;
6e3cee9e07ef Double buffering interface
nick
parents: 2610
diff changeset
588 r.ecx = num_pixels;
6e3cee9e07ef Double buffering interface
nick
parents: 2610
diff changeset
589 if(!VBE_LRMI_int(0x10,&r)) return VBE_VM86_FAIL;
6e3cee9e07ef Double buffering interface
nick
parents: 2610
diff changeset
590 retval = r.eax & 0xffff;
6e3cee9e07ef Double buffering interface
nick
parents: 2610
diff changeset
591 if(retval == 0x4f) retval = VBE_OK;
6e3cee9e07ef Double buffering interface
nick
parents: 2610
diff changeset
592 return retval;
6e3cee9e07ef Double buffering interface
nick
parents: 2610
diff changeset
593 }
6e3cee9e07ef Double buffering interface
nick
parents: 2610
diff changeset
594
6e3cee9e07ef Double buffering interface
nick
parents: 2610
diff changeset
595 int vbeSetScanLineLengthB(unsigned num_bytes)
6e3cee9e07ef Double buffering interface
nick
parents: 2610
diff changeset
596 {
6e3cee9e07ef Double buffering interface
nick
parents: 2610
diff changeset
597 int retval;
6e3cee9e07ef Double buffering interface
nick
parents: 2610
diff changeset
598 struct LRMI_regs r;
6e3cee9e07ef Double buffering interface
nick
parents: 2610
diff changeset
599 memset(&r,0,sizeof(struct LRMI_regs));
6e3cee9e07ef Double buffering interface
nick
parents: 2610
diff changeset
600 r.eax = 0x4f06;
6e3cee9e07ef Double buffering interface
nick
parents: 2610
diff changeset
601 r.ebx = 2;
6e3cee9e07ef Double buffering interface
nick
parents: 2610
diff changeset
602 r.ecx = num_bytes;
6e3cee9e07ef Double buffering interface
nick
parents: 2610
diff changeset
603 if(!VBE_LRMI_int(0x10,&r)) return VBE_VM86_FAIL;
6e3cee9e07ef Double buffering interface
nick
parents: 2610
diff changeset
604 retval = r.eax & 0xffff;
6e3cee9e07ef Double buffering interface
nick
parents: 2610
diff changeset
605 if(retval == 0x4f) retval = VBE_OK;
6e3cee9e07ef Double buffering interface
nick
parents: 2610
diff changeset
606 return retval;
6e3cee9e07ef Double buffering interface
nick
parents: 2610
diff changeset
607 }
6e3cee9e07ef Double buffering interface
nick
parents: 2610
diff changeset
608
6e3cee9e07ef Double buffering interface
nick
parents: 2610
diff changeset
609 int vbeGetDisplayStart(unsigned *pixel_num,unsigned *scan_line)
6e3cee9e07ef Double buffering interface
nick
parents: 2610
diff changeset
610 {
6e3cee9e07ef Double buffering interface
nick
parents: 2610
diff changeset
611 struct LRMI_regs r;
6e3cee9e07ef Double buffering interface
nick
parents: 2610
diff changeset
612 int retval;
6e3cee9e07ef Double buffering interface
nick
parents: 2610
diff changeset
613 memset(&r,0,sizeof(struct LRMI_regs));
6e3cee9e07ef Double buffering interface
nick
parents: 2610
diff changeset
614 r.eax = 0x4f07;
6e3cee9e07ef Double buffering interface
nick
parents: 2610
diff changeset
615 r.ebx = 1;
6e3cee9e07ef Double buffering interface
nick
parents: 2610
diff changeset
616 if(!VBE_LRMI_int(0x10,&r)) return VBE_VM86_FAIL;
6e3cee9e07ef Double buffering interface
nick
parents: 2610
diff changeset
617 retval = r.eax & 0xffff;
6e3cee9e07ef Double buffering interface
nick
parents: 2610
diff changeset
618 if(retval == 0x4f)
6e3cee9e07ef Double buffering interface
nick
parents: 2610
diff changeset
619 {
6e3cee9e07ef Double buffering interface
nick
parents: 2610
diff changeset
620 if(pixel_num) *pixel_num = r.ecx & 0xffff;
6e3cee9e07ef Double buffering interface
nick
parents: 2610
diff changeset
621 if(scan_line) *scan_line = r.edx & 0xffff;
6e3cee9e07ef Double buffering interface
nick
parents: 2610
diff changeset
622 retval = VBE_OK;
6e3cee9e07ef Double buffering interface
nick
parents: 2610
diff changeset
623 }
6e3cee9e07ef Double buffering interface
nick
parents: 2610
diff changeset
624 return retval;
6e3cee9e07ef Double buffering interface
nick
parents: 2610
diff changeset
625 }
6e3cee9e07ef Double buffering interface
nick
parents: 2610
diff changeset
626
6e3cee9e07ef Double buffering interface
nick
parents: 2610
diff changeset
627 int vbeSetDisplayStart(unsigned long offset, int vsync)
6e3cee9e07ef Double buffering interface
nick
parents: 2610
diff changeset
628 {
6e3cee9e07ef Double buffering interface
nick
parents: 2610
diff changeset
629 int retval;
6e3cee9e07ef Double buffering interface
nick
parents: 2610
diff changeset
630 if(vbe_pm_info.SetDisplayStart)
6e3cee9e07ef Double buffering interface
nick
parents: 2610
diff changeset
631 {
6e3cee9e07ef Double buffering interface
nick
parents: 2610
diff changeset
632 /* Don't verbose this stuff from performance reasons */
6e3cee9e07ef Double buffering interface
nick
parents: 2610
diff changeset
633 /* 32-bit function call is much better of int 10h */
6e3cee9e07ef Double buffering interface
nick
parents: 2610
diff changeset
634 __asm __volatile(
6e3cee9e07ef Double buffering interface
nick
parents: 2610
diff changeset
635 "pushl %%ebx\n"
6e3cee9e07ef Double buffering interface
nick
parents: 2610
diff changeset
636 "movl %1, %%ebx\n"
6e3cee9e07ef Double buffering interface
nick
parents: 2610
diff changeset
637 ::"a"(0x4f07),"S"(vsync ? 0x80 : 0),
2686
44ff6b5c7cea Double buffering support
nick
parents: 2632
diff changeset
638 "c"((offset>>2) & 0xffff),"d"((offset>>18)&0xffff):"memory");
2632
6e3cee9e07ef Double buffering interface
nick
parents: 2610
diff changeset
639 (*vbe_pm_info.SetDisplayStart)();
6e3cee9e07ef Double buffering interface
nick
parents: 2610
diff changeset
640 __asm __volatile("popl %%ebx":::"memory");
6e3cee9e07ef Double buffering interface
nick
parents: 2610
diff changeset
641 retval = VBE_OK;
6e3cee9e07ef Double buffering interface
nick
parents: 2610
diff changeset
642 }
6e3cee9e07ef Double buffering interface
nick
parents: 2610
diff changeset
643 else
6e3cee9e07ef Double buffering interface
nick
parents: 2610
diff changeset
644 {
6e3cee9e07ef Double buffering interface
nick
parents: 2610
diff changeset
645 struct LRMI_regs r;
6e3cee9e07ef Double buffering interface
nick
parents: 2610
diff changeset
646 unsigned long pixel_num;
6e3cee9e07ef Double buffering interface
nick
parents: 2610
diff changeset
647 memset(&r,0,sizeof(struct LRMI_regs));
2686
44ff6b5c7cea Double buffering support
nick
parents: 2632
diff changeset
648 pixel_num = offset%(unsigned long)curr_mode_info.BytesPerScanLine;
44ff6b5c7cea Double buffering support
nick
parents: 2632
diff changeset
649 if(pixel_num*(unsigned long)curr_mode_info.BytesPerScanLine!=offset) pixel_num++;
2632
6e3cee9e07ef Double buffering interface
nick
parents: 2610
diff changeset
650 r.eax = 0x4f07;
2693
1a8e5e017b1d triple buffering interface
nick
parents: 2686
diff changeset
651 r.ebx = vsync ? 0x82 : 2;
2632
6e3cee9e07ef Double buffering interface
nick
parents: 2610
diff changeset
652 r.ecx = pixel_num;
6e3cee9e07ef Double buffering interface
nick
parents: 2610
diff changeset
653 r.edx = offset/(unsigned long)curr_mode_info.BytesPerScanLine;
6e3cee9e07ef Double buffering interface
nick
parents: 2610
diff changeset
654 if(!VBE_LRMI_int(0x10,&r)) return VBE_VM86_FAIL;
6e3cee9e07ef Double buffering interface
nick
parents: 2610
diff changeset
655 retval = r.eax & 0xffff;
6e3cee9e07ef Double buffering interface
nick
parents: 2610
diff changeset
656 if(retval == 0x4f) retval = VBE_OK;
13568
1cb0e1833515 Currently vbeGetProtModeInfo call the 0x4f0a function of int 10h the get
faust3
parents: 13352
diff changeset
657 else retval = VBE_BROKEN_BIOS;
2632
6e3cee9e07ef Double buffering interface
nick
parents: 2610
diff changeset
658 }
6e3cee9e07ef Double buffering interface
nick
parents: 2610
diff changeset
659 return retval;
6e3cee9e07ef Double buffering interface
nick
parents: 2610
diff changeset
660 }
6e3cee9e07ef Double buffering interface
nick
parents: 2610
diff changeset
661
2693
1a8e5e017b1d triple buffering interface
nick
parents: 2686
diff changeset
662 int vbeSetScheduledDisplayStart(unsigned long offset, int vsync)
1a8e5e017b1d triple buffering interface
nick
parents: 2686
diff changeset
663 {
1a8e5e017b1d triple buffering interface
nick
parents: 2686
diff changeset
664 int retval;
1a8e5e017b1d triple buffering interface
nick
parents: 2686
diff changeset
665 struct LRMI_regs r;
1a8e5e017b1d triple buffering interface
nick
parents: 2686
diff changeset
666 unsigned long pixel_num;
1a8e5e017b1d triple buffering interface
nick
parents: 2686
diff changeset
667 memset(&r,0,sizeof(struct LRMI_regs));
1a8e5e017b1d triple buffering interface
nick
parents: 2686
diff changeset
668 pixel_num = offset%(unsigned long)curr_mode_info.BytesPerScanLine;
1a8e5e017b1d triple buffering interface
nick
parents: 2686
diff changeset
669 if(pixel_num*(unsigned long)curr_mode_info.BytesPerScanLine!=offset) pixel_num++;
1a8e5e017b1d triple buffering interface
nick
parents: 2686
diff changeset
670 r.eax = 0x4f07;
1a8e5e017b1d triple buffering interface
nick
parents: 2686
diff changeset
671 r.ebx = vsync ? 0x82 : 2;
1a8e5e017b1d triple buffering interface
nick
parents: 2686
diff changeset
672 r.ecx = offset;
1a8e5e017b1d triple buffering interface
nick
parents: 2686
diff changeset
673 if(!VBE_LRMI_int(0x10,&r)) return VBE_VM86_FAIL;
1a8e5e017b1d triple buffering interface
nick
parents: 2686
diff changeset
674 retval = r.eax & 0xffff;
1a8e5e017b1d triple buffering interface
nick
parents: 2686
diff changeset
675 if(retval == 0x4f) retval = VBE_OK;
1a8e5e017b1d triple buffering interface
nick
parents: 2686
diff changeset
676 return retval;
1a8e5e017b1d triple buffering interface
nick
parents: 2686
diff changeset
677 }
1a8e5e017b1d triple buffering interface
nick
parents: 2686
diff changeset
678
2243
f4b588dba08a vbelib import
nick
parents:
diff changeset
679 struct realVesaProtModeInterface
f4b588dba08a vbelib import
nick
parents:
diff changeset
680 {
f4b588dba08a vbelib import
nick
parents:
diff changeset
681 unsigned short SetWindowCall;
f4b588dba08a vbelib import
nick
parents:
diff changeset
682 unsigned short SetDisplayStart;
f4b588dba08a vbelib import
nick
parents:
diff changeset
683 unsigned short SetPaletteData;
f4b588dba08a vbelib import
nick
parents:
diff changeset
684 unsigned short iopl_ports;
f4b588dba08a vbelib import
nick
parents:
diff changeset
685 }__attribute__((packed));
f4b588dba08a vbelib import
nick
parents:
diff changeset
686
f4b588dba08a vbelib import
nick
parents:
diff changeset
687 int vbeGetProtModeInfo(struct VesaProtModeInterface *pm_info)
f4b588dba08a vbelib import
nick
parents:
diff changeset
688 {
f4b588dba08a vbelib import
nick
parents:
diff changeset
689 struct LRMI_regs r;
f4b588dba08a vbelib import
nick
parents:
diff changeset
690 int retval;
2254
6e5b548790c9 Fixed bug of 32-bit mode interface detection and save-restore mechanism
nick
parents: 2243
diff changeset
691 unsigned info_offset;
2243
f4b588dba08a vbelib import
nick
parents:
diff changeset
692 struct realVesaProtModeInterface *rm_info;
f4b588dba08a vbelib import
nick
parents:
diff changeset
693 memset(&r,0,sizeof(struct LRMI_regs));
f4b588dba08a vbelib import
nick
parents:
diff changeset
694 r.eax = 0x4f0a;
f4b588dba08a vbelib import
nick
parents:
diff changeset
695 r.ebx = 0;
2294
9475a75dde9c More verbosing
nick
parents: 2254
diff changeset
696 if(!VBE_LRMI_int(0x10,&r)) return VBE_VM86_FAIL;
2243
f4b588dba08a vbelib import
nick
parents:
diff changeset
697 retval = r.eax & 0xffff;
f4b588dba08a vbelib import
nick
parents:
diff changeset
698 if(retval == 0x4f)
f4b588dba08a vbelib import
nick
parents:
diff changeset
699 {
2407
2e4c17f4a744 More verbosing
nick
parents: 2359
diff changeset
700 retval = VBE_OK;
2254
6e5b548790c9 Fixed bug of 32-bit mode interface detection and save-restore mechanism
nick
parents: 2243
diff changeset
701 info_offset = r.edi&0xffff;
2407
2e4c17f4a744 More verbosing
nick
parents: 2359
diff changeset
702 if((r.es >> 12) != hh_int_10_seg) retval = VBE_BROKEN_BIOS;
2254
6e5b548790c9 Fixed bug of 32-bit mode interface detection and save-restore mechanism
nick
parents: 2243
diff changeset
703 rm_info = PhysToVirtSO(r.es,info_offset);
6e5b548790c9 Fixed bug of 32-bit mode interface detection and save-restore mechanism
nick
parents: 2243
diff changeset
704 pm_info->SetWindowCall = PhysToVirtSO(r.es,info_offset+rm_info->SetWindowCall);
2552
bd734d41a407 Misc: more checks
nick
parents: 2536
diff changeset
705 if(!is_addr_valid(pm_info->SetWindowCall)) retval = VBE_BROKEN_BIOS;
2294
9475a75dde9c More verbosing
nick
parents: 2254
diff changeset
706 #ifdef HAVE_VERBOSE_VAR
9475a75dde9c More verbosing
nick
parents: 2254
diff changeset
707 if(verbose > 1) printf("vbelib: SetWindowCall=%04X:%04X => %p\n",r.es,info_offset+rm_info->SetWindowCall,pm_info->SetWindowCall);
9475a75dde9c More verbosing
nick
parents: 2254
diff changeset
708 #endif
2254
6e5b548790c9 Fixed bug of 32-bit mode interface detection and save-restore mechanism
nick
parents: 2243
diff changeset
709 pm_info->SetDisplayStart = PhysToVirtSO(r.es,info_offset+rm_info->SetDisplayStart);
2552
bd734d41a407 Misc: more checks
nick
parents: 2536
diff changeset
710 if(!is_addr_valid(pm_info->SetDisplayStart)) retval = VBE_BROKEN_BIOS;
2294
9475a75dde9c More verbosing
nick
parents: 2254
diff changeset
711 #ifdef HAVE_VERBOSE_VAR
9475a75dde9c More verbosing
nick
parents: 2254
diff changeset
712 if(verbose > 1) printf("vbelib: SetDisplayStart=%04X:%04X => %p\n",r.es,info_offset+rm_info->SetDisplayStart,pm_info->SetDisplayStart);
9475a75dde9c More verbosing
nick
parents: 2254
diff changeset
713 #endif
2254
6e5b548790c9 Fixed bug of 32-bit mode interface detection and save-restore mechanism
nick
parents: 2243
diff changeset
714 pm_info->SetPaletteData = PhysToVirtSO(r.es,info_offset+rm_info->SetPaletteData);
2552
bd734d41a407 Misc: more checks
nick
parents: 2536
diff changeset
715 if(!is_addr_valid(pm_info->SetPaletteData)) retval = VBE_BROKEN_BIOS;
2294
9475a75dde9c More verbosing
nick
parents: 2254
diff changeset
716 #ifdef HAVE_VERBOSE_VAR
9475a75dde9c More verbosing
nick
parents: 2254
diff changeset
717 if(verbose > 1) printf("vbelib: SetPaletteData=%04X:%04X => %p\n",r.es,info_offset+rm_info->SetPaletteData,pm_info->SetPaletteData);
9475a75dde9c More verbosing
nick
parents: 2254
diff changeset
718 #endif
2254
6e5b548790c9 Fixed bug of 32-bit mode interface detection and save-restore mechanism
nick
parents: 2243
diff changeset
719 pm_info->iopl_ports = PhysToVirtSO(r.es,info_offset+rm_info->iopl_ports);
2913
74731185c5c9 Fixed iopl ports detection
nick
parents: 2693
diff changeset
720 if(!rm_info->iopl_ports) pm_info->iopl_ports = NULL;
74731185c5c9 Fixed iopl ports detection
nick
parents: 2693
diff changeset
721 else
2515
622cd80caaba memory verification
nick
parents: 2460
diff changeset
722 if(!check_wrd(pm_info->iopl_ports))
622cd80caaba memory verification
nick
parents: 2460
diff changeset
723 {
622cd80caaba memory verification
nick
parents: 2460
diff changeset
724 pm_info->iopl_ports = NULL;
2913
74731185c5c9 Fixed iopl ports detection
nick
parents: 2693
diff changeset
725 /* retval = VBE_BROKEN_BIOS; <- It's for broken BIOSes only */
2515
622cd80caaba memory verification
nick
parents: 2460
diff changeset
726 }
2294
9475a75dde9c More verbosing
nick
parents: 2254
diff changeset
727 #ifdef HAVE_VERBOSE_VAR
2407
2e4c17f4a744 More verbosing
nick
parents: 2359
diff changeset
728 if(verbose > 1)
2e4c17f4a744 More verbosing
nick
parents: 2359
diff changeset
729 {
2e4c17f4a744 More verbosing
nick
parents: 2359
diff changeset
730 printf("vbelib: iopl_ports=%04X:%04X => %p\n",r.es,info_offset+rm_info->iopl_ports,pm_info->iopl_ports);
2515
622cd80caaba memory verification
nick
parents: 2460
diff changeset
731 if(pm_info->iopl_ports) print_wrd(pm_info->iopl_ports);
2518
a3f658d3c98c More flushing
nick
parents: 2515
diff changeset
732 fflush(stdout);
2407
2e4c17f4a744 More verbosing
nick
parents: 2359
diff changeset
733 }
2294
9475a75dde9c More verbosing
nick
parents: 2254
diff changeset
734 #endif
2243
f4b588dba08a vbelib import
nick
parents:
diff changeset
735 }
f4b588dba08a vbelib import
nick
parents:
diff changeset
736 return retval;
f4b588dba08a vbelib import
nick
parents:
diff changeset
737 }
2410
27ca5ad3c7e9 Title support
nick
parents: 2407
diff changeset
738 /* --------- Standard VGA stuff -------------- */
27ca5ad3c7e9 Title support
nick
parents: 2407
diff changeset
739 int vbeWriteString(int x, int y, int attr, char *str)
27ca5ad3c7e9 Title support
nick
parents: 2407
diff changeset
740 {
27ca5ad3c7e9 Title support
nick
parents: 2407
diff changeset
741 struct LRMI_regs r;
27ca5ad3c7e9 Title support
nick
parents: 2407
diff changeset
742 void *rm_space = NULL;
27ca5ad3c7e9 Title support
nick
parents: 2407
diff changeset
743 int retval;
27ca5ad3c7e9 Title support
nick
parents: 2407
diff changeset
744 memset(&r,0,sizeof(struct LRMI_regs));
27ca5ad3c7e9 Title support
nick
parents: 2407
diff changeset
745 r.ecx = strlen(str);
27ca5ad3c7e9 Title support
nick
parents: 2407
diff changeset
746 r.edx = ((y<<8)&0xff00)|(x&0xff);
27ca5ad3c7e9 Title support
nick
parents: 2407
diff changeset
747 r.ebx = attr;
27ca5ad3c7e9 Title support
nick
parents: 2407
diff changeset
748 if(!(rm_space = LRMI_alloc_real(r.ecx))) return VBE_OUT_OF_DOS_MEM;
27ca5ad3c7e9 Title support
nick
parents: 2407
diff changeset
749 r.es = VirtToPhysSeg(rm_space);
27ca5ad3c7e9 Title support
nick
parents: 2407
diff changeset
750 r.ebp = VirtToPhysOff(rm_space);
27ca5ad3c7e9 Title support
nick
parents: 2407
diff changeset
751 memcpy(rm_space,str,r.ecx);
27ca5ad3c7e9 Title support
nick
parents: 2407
diff changeset
752 r.eax = 0x1300;
27ca5ad3c7e9 Title support
nick
parents: 2407
diff changeset
753 retval = VBE_LRMI_int(0x10,&r);
6473
6c45b8bf9a3e date: 2002/06/16 09:10:00; author: nickols_k; state: Exp; lines: +17 -13
atmos4
parents: 4405
diff changeset
754 LRMI_free_real(rm_space);
2410
27ca5ad3c7e9 Title support
nick
parents: 2407
diff changeset
755 if(!retval) return VBE_VM86_FAIL;
27ca5ad3c7e9 Title support
nick
parents: 2407
diff changeset
756 retval = r.eax & 0xffff;
27ca5ad3c7e9 Title support
nick
parents: 2407
diff changeset
757 if(retval == 0x4f) retval = VBE_OK;
27ca5ad3c7e9 Title support
nick
parents: 2407
diff changeset
758 return retval;
2460
7925f241765b Suppress trivial warnings
nick
parents: 2445
diff changeset
759 }
2610
65cb69a90a9f vo_vesa: DGA support
nick
parents: 2552
diff changeset
760
65cb69a90a9f vo_vesa: DGA support
nick
parents: 2552
diff changeset
761 void * vbeMapVideoBuffer(unsigned long phys_addr,unsigned long size)
65cb69a90a9f vo_vesa: DGA support
nick
parents: 2552
diff changeset
762 {
65cb69a90a9f vo_vesa: DGA support
nick
parents: 2552
diff changeset
763 void *lfb;
65cb69a90a9f vo_vesa: DGA support
nick
parents: 2552
diff changeset
764 if(fd_mem == -1) return NULL;
65cb69a90a9f vo_vesa: DGA support
nick
parents: 2552
diff changeset
765 if(verbose > 1) printf("vbelib: vbeMapVideoBuffer(%08lX,%08lX)\n",phys_addr,size);
65cb69a90a9f vo_vesa: DGA support
nick
parents: 2552
diff changeset
766 /* Here we don't need with MAP_FIXED and prefered address (first argument) */
65cb69a90a9f vo_vesa: DGA support
nick
parents: 2552
diff changeset
767 lfb = mmap((void *)0,size,PROT_READ | PROT_WRITE,MAP_SHARED,fd_mem,phys_addr);
65cb69a90a9f vo_vesa: DGA support
nick
parents: 2552
diff changeset
768 return lfb == (void *)-1 ? 0 : lfb;
65cb69a90a9f vo_vesa: DGA support
nick
parents: 2552
diff changeset
769 }
65cb69a90a9f vo_vesa: DGA support
nick
parents: 2552
diff changeset
770
65cb69a90a9f vo_vesa: DGA support
nick
parents: 2552
diff changeset
771 void vbeUnmapVideoBuffer(unsigned long linear_addr,unsigned long size)
65cb69a90a9f vo_vesa: DGA support
nick
parents: 2552
diff changeset
772 {
65cb69a90a9f vo_vesa: DGA support
nick
parents: 2552
diff changeset
773 if(verbose > 1) printf("vbelib: vbeUnmapVideoBuffer(%08lX,%08lX)\n",linear_addr,size);
65cb69a90a9f vo_vesa: DGA support
nick
parents: 2552
diff changeset
774 munmap((void *)linear_addr,size);
65cb69a90a9f vo_vesa: DGA support
nick
parents: 2552
diff changeset
775 }
11455
22f8732b5d97 cumulative libc5 compatibility patch ;)
gabucino
parents: 10114
diff changeset
776
22f8732b5d97 cumulative libc5 compatibility patch ;)
gabucino
parents: 10114
diff changeset
777 #endif