2007-12-25 04:29:13 UTC
[code]
typedef unsigned int UINT32 ;
UINT32 MMPHYSLFB,MMLIN,MMSIZE;
main() {
printf ("Hello DOSSER !!!\r\n");
MMPHYSLFB=0xDC000000;
MMSIZE=4096;
asm {
mov ax,0x0800
mov ebx,[MMPHYSLFB] /* BX:CX physical address of memory, BX is high */
mov ecx,ebx
shr ebx,16
mov esi,[MMSIZE] /* SI:DI size of region to map (bytes), SI is high */
mov edi,esi
shr esi,16
int 0x31
jnc blah /* OK */
xor ebx,ebx /* Failure -> Return 0 */
xor ecx,ecx
blah: shl ebx,16
mov bx,cx /* Now we have 32 bits in EBX */
mov [MMLIN],ebx
}
if (MMLIN>1048576) /* then */ {
printf ("Done: %X -> %X ... ",MMPHYSLFB,MMLIN);
} else {
printf ("Mapping failed - Vi$ta/XP NTVDM crap rulez :-(");
} /* endif */
} /* endmain */
[/code]
Works ... except with DOS32A 9.12 on VCPI (JEMM/JEMMEX/MS-DOG-EMM) :-(
- DOS32A 7.1 no bug
- on "raw" or XMS no bug (dummy ;-) )
- other extenders no bug
I am not aware of any VESA LFB applications that could also expose / have exposed this bug before :-(
It's not really critical for me (avoid EMM stuff anyway) ... but seems that I found a bug ... yeah :-D