2
;--- DPMIBK16.ASM: 16bit DPMI application written in MASM syntax.
3
;--- this sample temporarily switches back to real-mode.
4
;--- assemble: JWasm -bin -Fo dpmibk16.com dpmibk16.asm
12
;--- DPMI real-mode call structure
38
;--- the 16bit initialization part
41
pop ax ;get word saved on stack for COM files
45
mov bx,1000h ;it was a full 64kB stack
47
mov ah, 4Ah ;free unused memory
49
mov ax, 1687h ;DPMI host installed?
53
push es ;save DPMI entry address
55
and si, si ;requires host client-specific DOS memory?
58
mov ah, 48h ;alloc DOS memory
64
mov bx, cs ;save real-mode value of CS in BX
65
mov ax, 0000 ;start a 16-bit client
66
call far ptr [bp] ;initial switch to protected-mode
69
db "DPMI initialisation failed",CR,LF,'$'
72
db "no DPMI host installed",CR,LF,'$'
75
db "not enough DOS memory for initialisation",CR,LF,'$'
85
;--- now in protected-mode
90
db "welcome in protected-mode",CR,LF,0
93
;--- switch back to real-mode
97
mov [bp].RMCS.rIP, offset backinreal
100
mov [bp].RMCS.rFlags, ax
101
mov [bp].RMCS.rDS, ax
102
mov [bp].RMCS.rES, ax
104
mov [bp].RMCS.rSP, ax
105
mov [bp].RMCS.rSS, bx
111
mov ax,0301h ;temporarily switch to real-mode
115
db "back in protected-mode",CR,LF,0
116
mov ax, 4C00h ;normal client exit
123
db "switched to real-mode",CR,LF,0
124
retf ;back to protected-mode
126
;--- print a string in both protected-mode and real-mode.
127
;--- uses simple DOS commands without pointers.