JUMP16 MACRO selector,offsetv
DB 0EAH
DW offsetv
DW selector
ENDM
JUMP32 MACRO selector,offsetv
DB 0EAH
DW offsetv
DW 0
DW selector
ENDM
DESCRIPTOR STRUC
LIMITL DW 0
BASEL DW 0
BASEM DB 0
ATTRIBUTES DW 0
BASEH DB 0
DESCRIPTOR ENDS
PDESC STRUC
LIMIT DW 0
BASE DD 0
PDESC ENDS
DATALEN = 16
.386P
DSEG SEGMENT USE16
GDT LABEL BYTE
DUMMY DESCRIPTOR <>
;CODE32 DESCRIPTOR <0FFFFH,,,0CF98H,>
;CODE32_SEL = 08H
;CODE16 DESCRIPTOR <0FFFFH,,,08F98H,>
;CODE16_SEL = 10H
;DATAS DESCRIPTOR <0FFFFH,,10H,0C092H,>
;DATAS_SEL = 18H
;DATAD DESCRIPTOR <0FFFFH,80A0H,0BH,0CF92H,>
;DATAD_SEL = 20H
;STACKS DESCRIPTOR <0FFFFH,0,0,8F92H,>
;STACKS_SEL = 28H
;NORMAL DESCRIPTOR <0FFFFH,0,0,92H,0>
;NORMAL_SEL = 30H
;GDTLEN = $-GDT
CODE32 DESCRIPTOR <0FFFFH,,,0CF98H,>
CODE32_SEL = 08H
CODE16 DESCRIPTOR <0FFFFH,,,8f98H,>
CODE16_SEL = 10H
DATAS DESCRIPTOR <0FFFFH,,10H,0c092H,>
DATAS_SEL = 18H
DATAD DESCRIPTOR <0FFFFH,80A0H,0BH,0CF92H,>
DATAD_SEL = 20H
STACKS DESCRIPTOR <0FFFFH,0,0,8f92H,>
STACKS_SEL = 28H
NORMAL DESCRIPTOR <0FFFFH,0,0,92H,0>
NORMAL_SEL = 30H
GDTLEN = $-GDT
VGDTR PDESC <GDTLEN-1,>
VARSS DW ?
DSEG ENDS
CSEG1 SEGMENT USE16 'REAL'
ASSUME CS:CSEG1,DS:DSEG
START:
MOV AX,DSEG
MOV DS,AX
MOV BX,16
MUL BX
ADD AX,OFFSET GDT
ADC DX,0
MOV WORD PTR VGDTR.BASE,AX
MOV WORD PTR VGDTR.BASE+2,DX
MOV AX,CSEG2
MUL BX
MOV CODE32.BASEL,AX
MOV CODE32.BASEM,DL
MOV CODE32.BASEH,DH
MOV AX,CSEG3
MUL BX
MOV CODE16.BASEL,AX
MOV CODE16.BASEM,DL
MOV CODE16.BASEH,DH
MOV AX,SS
MUL BX
MOV STACKS.BASEL,AX
MOV STACKS.BASEM,DL
MOV STACKS.BASEH,DH
MOV VARSS,SS
LGDT QWORD PTR VGDTR
CLI
CALL EA20
MOV EAX,CR0
OR EAX,1
MOV CR0,EAX
JUMP16 CODE32_SEL,<OFFSET SPM32>
TOREAL:
MOV AX,DSEG
MOV DS,AX
MOV SS,VARSS
CALL DA20
STI
MOV AH,4CH
INT 21H
EA20 PROC
PUSH AX
IN AL,92H
OR AL,2
OUT 92H,AL
POP AX
RET
EA20 ENDP
DA20 PROC
PUSH AX
IN AL,92H
AND AL,0FDH
OUT 92H,AL
POP AX
RET
DA20 ENDP
CSEG1 ENDS
CSEG2 SEGMENT USE32 'PM32'
ASSUME CS:CSEG2
SPM32:
MOV AX,STACKS_SEL
MOV SS,AX
MOV AX,DATAS_SEL
MOV DS,AX
MOV AX,DATAD_SEL
MOV ES,AX
XOR ESI,ESI
XOR EDI,EDI
MOV ECX,DATALEN
CLD
NEXT:
LODSB
PUSH AX
CALL TOASCII
MOV AH,7
SHL EAX,16
POP AX
SHR AL,4
CALL TOASCII
MOV AX,7
STOSD
MOV AL,' '
STOSW
LOOP NEXT
JUMP32 CODE16_SEL,<OFFSET SPM16>
TOASCII PROC
AND AL,0FH
ADD AL,90H
DAA
ADC AL,40H
DAA
RET
TOASCII ENDP
CODE32LEN = $
CSEG2 ENDS
CSEG3 SEGMENT USE16 'PM16'
ASSUME CS:CSEG3
SPM16:
XOR SI,SI
MOV DI, DATALEN*6
MOV AH,7
MOV CX,DATALEN
AGAIN:
LODSB
STOSW
LOOP AGAIN
MOV AX,NORMAL_SEL
MOV DS,AX
MOV ES,AX
MOV EAX,CR0
AND EAX,0FFFFFFFEH
MOV CR0,EAX
JUMP16 <SEG TOREAL>,<OFFSET TOREAL>
CSEG3 ENDS
END START