We can now switch to 32-bit mode.
This commit is contained in:
parent
1e0961c679
commit
21b30ccadb
|
@ -45,9 +45,8 @@ dpmi_cs = 0x2c
|
||||||
dpmi_sp = 0x2e
|
dpmi_sp = 0x2e
|
||||||
dpmi_ss = 0x30
|
dpmi_ss = 0x30
|
||||||
|
|
||||||
dpmi_ps = 0x32 ! WORD: protected register segment
|
dpmi_rs = 0x32 ! WORD: real segment
|
||||||
dpmi_rs = 0x34 ! WORD: real register segment
|
dpmi_psp = 0x34 ! WORD: PSP segment
|
||||||
dpmi_psp = 0x36 ! WORD: PSP segment
|
|
||||||
dpmi_switch = 0x38 ! DWORD: far pointer of pmode switch routine
|
dpmi_switch = 0x38 ! DWORD: far pointer of pmode switch routine
|
||||||
|
|
||||||
.seek 0x3c
|
.seek 0x3c
|
||||||
|
@ -79,33 +78,10 @@ exe_start:
|
||||||
|
|
||||||
mov ax, 1 ! 32-bit app
|
mov ax, 1 ! 32-bit app
|
||||||
callf (dpmi_switch)
|
callf (dpmi_switch)
|
||||||
jc no_pmode
|
jnc pmode ! Success!
|
||||||
|
|
||||||
mov (dpmi_edx), go_msg
|
! Could not switch to protected mode.
|
||||||
mov ax, (dpmi_rs)
|
|
||||||
mov (dpmi_ds), ax
|
|
||||||
mov (dpmi_eax+1), 9
|
|
||||||
call int21
|
|
||||||
mov ax, 0x4c00
|
|
||||||
int 0x21
|
|
||||||
|
|
||||||
! Simulate DOS interrupt bx.
|
|
||||||
int21:
|
|
||||||
mov bx, 0x21
|
|
||||||
callint:
|
|
||||||
xor ax, ax
|
|
||||||
mov (dpmi_ss), ax ! zero stack: DPMI host allocates one.
|
|
||||||
mov (dpmi_sp), ax
|
|
||||||
push ds
|
|
||||||
pop es
|
|
||||||
mov di, ax
|
|
||||||
mov ax, 0x300
|
|
||||||
int 0x31 ! simulate DOS interrupt
|
|
||||||
push cs
|
|
||||||
pop ds
|
|
||||||
ret
|
|
||||||
|
|
||||||
no_pmode: ! Could not switch to protected mode.
|
|
||||||
mov dx, no_pmode_msg
|
mov dx, no_pmode_msg
|
||||||
jmp exit_with_error
|
jmp exit_with_error
|
||||||
|
|
||||||
|
@ -120,8 +96,41 @@ exit_with_error:
|
||||||
mov ax, 0x4cff
|
mov ax, 0x4cff
|
||||||
int 0x21 ! terminate with error code al
|
int 0x21 ! terminate with error code al
|
||||||
|
|
||||||
|
pmode:
|
||||||
|
! We're now in protected mode! Switch our code segment to 32-bit mode.
|
||||||
|
|
||||||
|
mov cx, cs
|
||||||
|
lar cx, cx
|
||||||
|
movb cl, ch
|
||||||
|
movb ch, 0xc0
|
||||||
|
mov bx, cs
|
||||||
|
mov ax, 0x0009
|
||||||
|
int 0x31 ! Make selector 32 bit
|
||||||
|
|
||||||
.use32
|
.use32
|
||||||
start_32bit:
|
o16 mov (dpmi_edx), go_msg
|
||||||
|
o16 mov ax, (dpmi_rs)
|
||||||
|
o16 mov (dpmi_ds), ax
|
||||||
|
movb (dpmi_eax+1), 9
|
||||||
|
call int21
|
||||||
|
o16 mov ax, 0x4c00
|
||||||
|
int 0x21
|
||||||
|
|
||||||
|
! Simulate DOS interrupt bx.
|
||||||
|
int21:
|
||||||
|
o16 mov bx, 0x21
|
||||||
|
callint:
|
||||||
|
o16 xor ax, ax
|
||||||
|
o16 mov (dpmi_ss), ax ! zero stack: DPMI host allocates one.
|
||||||
|
o16 mov (dpmi_sp), ax
|
||||||
|
push ds
|
||||||
|
pop es
|
||||||
|
mov di, ax
|
||||||
|
o16 mov ax, 0x300
|
||||||
|
int 0x31 ! simulate DOS interrupt
|
||||||
|
push cs
|
||||||
|
pop ds
|
||||||
|
ret
|
||||||
|
|
||||||
go_msg:
|
go_msg:
|
||||||
.ascii "Go!$"
|
.ascii "Go!$"
|
||||||
|
|
Loading…
Reference in a new issue