DOS-debug

Форк
0
/
DPMIBK16.ASM 
142 строки · 2.8 Кб
1

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
5

6
LF  equ 10
7
CR  equ 13
8

9
    .286
10
    .model tiny
11

12
;--- DPMI real-mode call structure
13

14
RMCS struct
15
rEDI    dd ?
16
rESI    dd ?
17
rEBP    dd ?
18
        dd ?
19
rEBX    dd ?
20
rEDX    dd ?
21
rECX    dd ?
22
rEAX    dd ?
23
rFlags  dw ?
24
rES     dw ?
25
rDS     dw ?
26
rFS     dw ?
27
rGS     dw ?
28
rIP     dw ?
29
rCS     dw ?
30
rSP     dw ?
31
rSS     dw ?
32
RMCS ends
33

34
    .code
35

36
    org 100h
37

38
;--- the 16bit initialization part
39

40
start:
41
    pop ax          ;get word saved on stack for COM files
42
    mov bx, sp
43
    shr bx, 4
44
    jnz @F
45
    mov bx,1000h    ;it was a full 64kB stack
46
@@:
47
    mov ah, 4Ah     ;free unused memory
48
    int 21h
49
    mov ax, 1687h   ;DPMI host installed?
50
    int 2Fh
51
    and ax, ax
52
    jnz nohost
53
    push es         ;save DPMI entry address
54
    push di
55
    and si, si      ;requires host client-specific DOS memory?
56
    jz nomemneeded
57
    mov bx, si
58
    mov ah, 48h     ;alloc DOS memory
59
    int 21h
60
    jc nomem
61
    mov es, ax
62
nomemneeded:
63
    mov bp, sp
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
67
    jnc initok
68
    call error
69
    db "DPMI initialisation failed",CR,LF,'$'
70
nohost:
71
    call error
72
    db "no DPMI host installed",CR,LF,'$'
73
nomem:
74
    call error
75
    db "not enough DOS memory for initialisation",CR,LF,'$'
76
error:
77
    push cs
78
    pop ds
79
    pop dx
80
    mov ah, 9
81
    int 21h
82
    mov ax, 4C00h
83
    int 21h
84

85
;--- now in protected-mode
86

87
initok:
88
    push bx
89
    call printstring
90
    db "welcome in protected-mode",CR,LF,0
91
    pop bx
92

93
;--- switch back to real-mode
94

95
    sub sp, sizeof RMCS
96
    mov bp,sp
97
    mov [bp].RMCS.rIP, offset backinreal
98
    mov [bp].RMCS.rCS, bx
99
    xor ax, ax
100
    mov [bp].RMCS.rFlags, ax
101
    mov [bp].RMCS.rDS, ax
102
    mov [bp].RMCS.rES, ax
103
    lea ax,[bp-20h]
104
    mov [bp].RMCS.rSP, ax
105
    mov [bp].RMCS.rSS, bx
106
    xor bx,bx
107
    xor cx,cx
108
    mov di,bp
109
    push ss
110
    pop es
111
    mov ax,0301h	;temporarily switch to real-mode
112
    int 31h
113

114
    call printstring
115
    db "back in protected-mode",CR,LF,0
116
    mov ax, 4C00h   ;normal client exit
117
    int 21h
118

119
backinreal:
120
    push cs
121
    pop ds
122
    call printstring
123
    db "switched to real-mode",CR,LF,0
124
    retf            ;back to protected-mode
125

126
;--- print a string in both protected-mode and real-mode.
127
;--- uses simple DOS commands without pointers.
128

129
printstring:
130
    pop si
131
nextchar:
132
    lodsb
133
    and al,al
134
    jz stringdone
135
    mov dl,al
136
    mov ah,2
137
    int 21h
138
    jmp nextchar
139
stringdone:
140
    push si
141
    ret
142

143
    end start
144

Использование cookies

Мы используем файлы cookie в соответствии с Политикой конфиденциальности и Политикой использования cookies.

Нажимая кнопку «Принимаю», Вы даете АО «СберТех» согласие на обработку Ваших персональных данных в целях совершенствования нашего веб-сайта и Сервиса GitVerse, а также повышения удобства их использования.

Запретить использование cookies Вы можете самостоятельно в настройках Вашего браузера.