?
So, Meister, ich hab das Beispiel gefunden (auf einer Diskette die satte 16 Jahre alt ist). Mit der Routine "START" kommst du in den Protected Mode
und auch wieder zurück:
.286p
LOC_DES_TAB1 SEGMENT
DB 0, 0, 0, 0, 0, 0, 0, 0 ; NULLSELEKTOR
DB 0, 0, 0, 0, 0, 0, 0, 0
DB 0, 0, 0, 0, 0, 0, 0, 0
DB 0, 0, 0, 0, 0, 0, 0, 0
LOC_DES_TAB1 ENDS
GLOB_DES_TAB SEGMENT
DB 0, 0, 0, 0, 0, 0, 0, 0 ; NULLSELEKTOR
DB 0, 0, 0, 0, 0, 0, 0, 0
DB 255,255,0, 0, 10,147, 0, 0
DB 255,255,0,128, 11,147, 0, 0
DB 0, 0, 0, 0, 0, 0, 0, 0
DB 0, 0, 0, 0, 0, 0, 0, 0
GLOB_DES_TAB ENDS
INTR_DES_TAB SEGMENT
DB 0, 0, 0, 0, 0, 0, 0, 0 ; NULLSELEKTOR
DB 0, 0, 0, 0, 0, 0, 0, 0
DB 0, 0, 0, 0, 0, 0, 0, 0
DB 0, 0, 0, 0, 0, 0, 0, 0
INTR_DES_TAB ENDS
FEHLER SEGMENT
I0 DB 'Divisionsfehler′I1DB′Einzelschritt'
I1 DB 'Einzelschritt′I1DB′Einzelschritt'
I2 DB 'NMI$'
FEHLER ENDS
STAPEL SEGMENT STACK
DW 256 DUP (0)
STAPEL ENDS
PROCODE SEGMENT
ASSUME CS: PROCODE
TABLE DW ?, ?, ?
DOSRETURN: MOV AX,4C00H
INT 21H
START: CLI
MOV AH,159+64 ; A20 FREISCHALTEN
CALL WAIT8042
JNZ WEITER
MOV AL,0D1H
OUT [64H],AL
CALL WAIT8042
JNZ WEITER
MOV AL,AH
OUT [60H],AL
CALL WAIT8042
WEITER: MOV AL,08FH ; CMOS-BYTE IN UHR SETZEN
OUT [70H],AL
AAD ; 14 TAKTE WARTEN
MOV AL,9
OUT [71H],AL
PUSHF
PUSH CS
PUSH OFFSET DOSRETURN ; FšR RETURN NACH EINEM INT 15H
SUB SP,20
MOV AX,0 ; REAL-MODE-STACKZEIGER MERKEN
MOV DS,AX
MOV DS:[0469H],SS
MOV DS:[0467H],SP
PUSHF
MOV DI,SP
AND SS:[DI],1111110011111111b ; CLI UND TRAPFLAG LSCHEN
POPF
MOV AX,GLOB_DES_TAB
MOV ES,AX
MOV SI,0
MOV BP,SI ; OFFSET IN GDTSEG = 0
LEA DI,[SI+8]
MOV DX,6*8
MOV BL,0
CALL DESKRIP
LGDT QWORD PTR ES:[SI+08H]
MOV AX,SS
MOV BP,0
LEA DI,[SI+28H]
MOV DX,0FFFFH
MOV BL,93H
CALL DESKRIP
MOV WORD PTR CS:TABLE,2048 ; 6 BYTES FUER DIE
MOV AX,INTR_DES_TAB ; INITIALISIERUNG DES IDTR
MOV BX,10 ; VORBEREITEN
MUL BX
MOV WORD PTR CS:TABLE+2,AX
MOV BYTE PTR CS:TABLE+3,DL
LIDT QWORD PTR CS:TABLE
MOV AX,PROCODE ; PM-CODE-SEGMENT
MOV BP,0
MOV DX,0FFFFH
MOV BL,9BH
LEA DI,[SI+20H]
CALL DESKRIP
SMSW AX
OR AL,1
LMSW AX
DB 0EAH
DW OFFSET PM_START
DW 0020H ; JMP 0020:PM_START
PM_START: MOV AX,28H
MOV SS,AX
MOV AX,18H
MOV ES,AX
MOV AX,10H
MOV DS,AX
MOV ax,65+16*256;
MOV cx,1000
XOR di,di
REP stosw
MOV WORD PTR CS:TABLE,0 ;
LIDT QWORD PTR CS:TABLE ; IDT-LŽNGE AUF 0 UND INT 8
INT 8
DESKRIP PROC NEAR
MOV WORD PTR ES:[DI+6],0
MOV ES:[DI+5],BL
MOV ES:[DI],DX
MOV BX,10H
MUL BX
ADD AX,BP
ADC DX,0
MOV ES:[DI+2],AX
MOV ES:[DI+4],DL
RET
DESKRIP ENDP
WAIT8042 PROC NEAR
XOR CX,CX
INPUT: IN AL,[64H]
AND AL,02
JZ OK8042
LOOP INPUT
INC CX
OK8042: RET
WAIT8042 ENDP
PROCODE ENDS
END START