2
;--- DPMIBK32.ASM: 32bit DPMI application written in MASM syntax.
3
;--- this sample temporarily switches back to real-mode.
4
;--- assemble: JWasm -mz dpmibk32.asm
12
.dosseg ;this ensures that stack segment is last
16
;--- DPMI real-mode call structure
40
szWelcome db "welcome in protected-mode",CR,LF,0
41
szBackinPM db "back in protected-mode",CR,LF,0
47
mov esi, offset szWelcome
51
;--- switch back to real-mode
53
sub esp, sizeof RMCS+2
56
mov [ebp].RMCS.rIP, offset backtoreal
57
mov [ebp].RMCS.rCS, _TEXT16
58
mov [ebp].RMCS.rFlags, ax
59
mov [ebp].RMCS.rDS, ax
60
mov [ebp].RMCS.rES, ax
61
mov [ebp].RMCS.rFS, ax
62
mov [ebp].RMCS.rGS, ax
64
mov [ebp].RMCS.rSP, ax
65
mov [ebp].RMCS.rSS, bx
71
mov ax,0301h ;temporarily switch to real-mode
74
mov esi, offset szBackinPM
76
mov ax, 4C00h ;normal client exit
79
;--- print a string in protected-mode with simple
80
;--- DOS commands not using pointers.
93
;--- now comes the 16bit initialization part
95
_TEXT16 segment use16 word public 'CODE'
100
mov dx,offset dBackinRM
103
retf ;back to protected-mode
114
mov ah, 4Ah ;free unused memory
117
mov ax, 1687h ;DPMI host installed?
121
push es ;save DPMI entry address
123
and si, si ;requires host client-specific DOS memory?
126
mov ah, 48h ;alloc DOS memory
135
mov ax, 0001 ;start a 32-bit client
136
call far ptr [bp] ;initial switch to protected-mode
139
;--- now in protected-mode
141
;--- create a 32bit code selector and jump to 32bit code
143
push bx ;save stack segment
153
int 31h ;set base address
157
int 31h ;set descriptor limit to 64 kB
163
int 31h ;set code descriptors attributes to 32bit
164
pop ax ;store stack segment in AX
167
retd ;jump to 32-bit code
185
dErr1 db "no DPMI host installed",CR,LF,'$'
186
dErr2 db "not enough DOS memory for initialisation",CR,LF,'$'
187
dErr3 db "DPMI initialisation failed",CR,LF,'$'
188
dBackinRM db "switched to real-mode",CR,LF,'$'