Unreal Mode: Difference between revisions

m
Bot: Replace deprecated source tag with syntaxhighlight
[unchecked revision][unchecked revision]
No edit summary
m (Bot: Replace deprecated source tag with syntaxhighlight)
 
(12 intermediate revisions by 8 users not shown)
Line 3:
==Usage==
Unreal mode is usually recommended in the two following cases:
* youYou're trying to extend a legacy 16-bit DOS program so that it can deal with larger data and neither [[Virtual 8086 Mode]], nor xms are suitable for your needs.
* youYou're trying to load something that will run in 32-bit mode which is larger than 640K (therefore you cannot load it in conventional memory) and you don't want to bother writing a protected mode disk driver yet, but you also want to avoid switching between real and protected mode to copy chunks from the conventional memory buffer into extended memory.
 
You still will not have full access to all physical RAM if you do not have the [[A20 Line]] enabled; all the "odd" 1 MiB blocks will be unavailable.
Line 19:
Therefore IP is unaffected by all this, and the code itself is still limited to 64KiB.
 
<sourcesyntaxhighlight lang="asm">
; Assembly example
 
; nasmwnasm boot.asm -o boot.bin
; partcopy boot.bin 0 200 -f0
 
[ORG 0x7c00] ; add to offsets
 
start:
start: xor ax, ax ; make it zero
mov ds, ax ; DS=0
mov ss, ax ; stack starts at seg 0
Line 41 ⟶ 42:
or al,1 ; set pmode bit
mov cr0, eax
jmp 0x8:pmode
 
pmode:
jmp $+2 ; tell 386/486 to not crash
mov dsbx, bx 0x10 ; 8hselect =descriptor 1000b2
 
mov bxds, 0x08bx ; select10h descriptor= 110000b
mov ds, bx ; 8h = 1000b
 
and al,0xFE ; back to realmode
mov cr0, eax ; by toggling bit again
jmp 0x0:unreal
 
unreal:
pop ds ; get back old segment
sti
Line 63 ⟶ 66:
dd gdt ;start of table
 
gdt : dd 0,0 ; entry 0 is always unused
flatdesc codedesc: db 0xff, 0xff, 0, 0, 0, 10010010b10011010b, 11001111b00000000b, 0
flatdesc: db 0xff, 0xff, 0, 0, 0, 10010010b, 11001111b, 0
gdt_end:
 
times 510-($-$$) db 0 ; fill sector w/ 0's
db 0x55 dw 0xAA55 ; req'dRequired by some BIOSes
</syntaxhighlight>
db 0xAA
</source>
 
===Huge Unreal Mode===
Huge Unreal Mode enables code over 64KiB. However, it is more difficult to implement as real mode interrupts do not automatically save the high 16 bits of EIP. Initialization is simple though, you just load a code segment with a 4GiB limit:
 
<sourcesyntaxhighlight lang="asm">
; Assembly example
 
; nasmwnasm boot.asm -o boot.bin
; partcopy boot.bin 0 200 -f0
 
[ ORG 0x7c00] ; add to offsets
 
start: xor ax, ax ; make it zero
Line 110 ⟶ 113:
 
times 510-($-$$) db 0 ; fill sector w/ 0's
db 0x55 dw 0xAA55 ; req'dRequired by some BIOSes
</syntaxhighlight>
db 0xAA
</source>
 
WARNING: this may not work on some emulators or some hardware.
Line 125 ⟶ 127:
 
You can try out unreal mode in DOS (e.g. in DOSBox, VirtualBox + FreeDOS) as the compiler fully supports the DOS + unreal mode combo in its C library. ''tests/vesalfb.c'' is a simple example of setting up a [[VESA]] graphics mode with the linear frame buffer enabled and drawing something on the screen in unreal mode.
 
For an example of an Unreal Mode [[bootloader]] implementation with Smaller C, look at [https://github.com/fysnet/FYSOS/tree/master/loader FYSOS].
[[Category:X86 CPU]]
[[Category:Operating Modes]]
[[Category:FAQ]]