1;; ######################################################################## 
2;; Macros
3;; ########################################################################
4
5; descriptor type, base, limit, p_dpl_s, g_db_a
6%macro descriptor 5 
7	dw (%3 & 0xFFFF)       			; Limit 0-15
8	dw (%2 & 0xFFFF) 			; Base  0-15
9	db ((%2 & 0xFF0000) >> 16)		; Base  16-23
10	db ((%4 & 0xF) << 4) | (%1 & 0xF )	; p_dpl_s_type  
11	db (%5 << 4) | ((%3 & 0xF0000) >> 16) 	; g_db_a limit 19:16
12	db ((%2 & 0xFF000000) >> 24)    	; Base  24-31	
13%endmacro
14
15; cdesc32 base, limit, dpl
16%macro cdesc32 3
17       descriptor 0xB, %1, %2, 0x9 | (%3 & 0x3) << 1, 0xD
18%endmacro
19	
20; ddesc32 base, limit, dpl
21%macro ddesc32 3
22       descriptor 0x3, %1, %2, 0x9 | (%3 & 0x3) << 1, 0xD
23%endmacro
24
25; gates type, offset, selector, p_dpl_s
26%macro gates 4 
27	dw %2 		      			; Offset 0-15
28	dw (%3 & 0xFFFF) 			; Selector 0-15
29	db 0					; Reserved
30	db ((%4 & 0xF) << 4) | (%1 & 0xF) 	; p_dpl_s_type  
31	dw 0					; Offset 16-31
32%endmacro
33	
34%macro idesc32 3
35       gates 0xE, %1, %2, 0x8 | ((%3 & 0x3) << 1)
36%endmacro
37	
38	
39;; ######################################################################## 
40;; Code Section
41;; ########################################################################
42
43SECTION CODE ABSOLUTE=0x00400000 FLAT USE32
44
45test_code:	
46
47	;; Your Code Goes Here
48	hlt			 
49		
50;; ######################################################################## 
51;; Setup Section
52;; ########################################################################
53
54SECTION SETUP ALIGN=16 FLAT USE16
55
56setup:	
57
58	mov edx, cr0
59        or  dl,  0x21		; Protect Mode On, Int 16 for FPU
60	and edx, 0x9FFFFFFF     ; Turn Caches on
61	mov cr0, edx
62
63	xor edx, edx		; Enable Var MTRRs
64	mov eax, 0x0806		; WriteBack
65	mov ecx, 0x2FF		
66	wrmsr
67
68	lgdt [pgdt]		; Set GDT
69	lidt [pidt]		; Set IDT
70	
71	jmp 0x8:protect_mode
72	
73protect_mode:		
74
75        BITS 32
76
77	mov esp, 0x01000000	; Get some stack space
78	mov ax,  0x0010		; Set data selectors
79	mov ss, ax
80	mov ds, ax
81	mov es, ax
82	mov fs, ax
83	mov gs, ax
84
85	jmp test_code		; Jmp to test code
86		
87;; ######################################################################## 
88;; Protect Mode IDT 
89;; ########################################################################
90	 
91SECTION IDTP ALIGN=16 FLAT USE32
92
93	;; cdesc32 base, limit, dpl
94gdt0:	dq 0.0				; 0x0000 - Null descriptor
95     	cdesc32 0x00000000, 0xFFFFF, 0	; 0x0008 - Code Selector 
96     	ddesc32 0x00000000, 0xFFFFF, 0	; 0x0010 - Data Selector
97     	cdesc32 0x00000000, 0xFFFFF, 3  ; 0x0018 - Code Select Ring 3 
98     	ddesc32 0x00000000, 0xFFFFF, 3	; 0x0020 - Data Select Ring 3
99	
100	;; idesc32 offset, selector, dpl
101idt0:	idesc32 isrP, 0x0008, 0		; 0x00,  0   #DE, Divide Error	
102     	idesc32 isrP, 0x0008, 0		; 0x01,  1   #DB, Debug Fault
103     	idesc32 isrP, 0x0008, 0		; 0x02,  2,  ---, NMI
104     	idesc32 isrP, 0x0008, 0		; 0x03,  3,  #BP, Breakpoint
105     	idesc32 isrP, 0x0008, 0		; 0x04,  4,  #OF, INTO detected Overflow
106     	idesc32 isrP, 0x0008, 0	        ; 0x05,  5,  #BR, Bound Range Exceeded
107     	idesc32 isrP, 0x0008, 0		; 0x06,  6,  #UD, Invalid Opcode
108     	idesc32 isrP, 0x0008, 0		; 0x07,  7,  #NM, Device Not Available
109     	idesc32 isrP, 0x0008, 0		; 0x08,  8,  #DF, Double Fault
110     	idesc32 isrP, 0x0008, 0		; 0x09   9,  ---, Coprocessor Segment Overrun
111      	idesc32 isrP, 0x0008, 0		; 0x0A,  10, #TS, Invalid TSS 
112      	idesc32 isrP, 0x0008, 0		; 0x0B,  11, #NP, Segment Not Present
113      	idesc32 isrP, 0x0008, 0		; 0x0C,  12, #SS, Stack Fault
114      	idesc32 isrP, 0x0008, 0	        ; 0x0D,  13, #GP, General Protection Fault
115      	idesc32 isrP, 0x0008, 0		; 0x0E,  14, #PF, Page Fault
116      	idesc32 isrP, 0x0008, 0		; 0x0F,  15, ---, Reserved
117      	idesc32 isrP, 0x0008, 0		; 0x10,  16, #MF, Floating Point Fault
118      	idesc32 isrP, 0x0008, 0		; 0x11,  17, #AC, Alignment Check
119      	idesc32 isrP, 0x0008, 0		; 0x12   18, #MC, Machine Check
120      	idesc32 isrP, 0x0008, 0		; 0x13,  19, #XF, SSE Fault
121
122pgdt:   dw 6 * 8			; Limit 
123	dd gdt0			        ; base
124	
125pidt:   dw 20 * 8			; Limit 
126	dd idt0			        ; base
127
128isrP:	mov eax, 0xDEADBEEF ; Default Real Mode Interrupt Handler 
129	out 0x80, eax
130	hlt
131			
132;; ######################################################################## 
133;; Real Mode IDT 
134;; ########################################################################
135	
136SECTION IDTR ABSOLUTE=0x00000000 FLAT USE16 
137
138	;; FORMAT IP:CS 
139	dw isrR, 0			; 0x00,  0   #DE, Divide Error	
140	dw isrR, 0			; 0x01,  1   #DB, Debug Fault
141	dw isrR, 0			; 0x02,  2,  ---, NMI
142	dw isrR, 0			; 0x03,  3,  #BP, Breakpoint
143	dw isrR, 0			; 0x04,  4,  #OF, INTO detected Overflow
144	dw isrR, 0			; 0x05,  5,  #BR, Bound Range Exceeded
145	dw isrR, 0			; 0x06,  6,  #UD, Invalid Opcode
146	dw isrR, 0			; 0x07,  7,  #NM, Device Not Available
147	dw isrR, 0			; 0x08,  8,  #DF, Double Fault
148	dw isrR, 0			; 0x09   9,  ---, Coprocessor Segment Overrun
149	dw isrR, 0			; 0x0A,  10, #TS, Invalid TSS 
150	dw isrR, 0			; 0x0B,  11, #NP, Segment Not Present
151	dw isrR, 0			; 0x0C,  12, #SS, Stack Fault
152	dw isrR, 0			; 0x0D,  13, #GP, General Protection Fault
153	dw isrR, 0			; 0x0E,  14, #PF, Page Fault
154	dw isrR, 0			; 0x0F,  15, ---, Reserved
155	dw isrR, 0			; 0x10,  16, #MF, Floating Point Fault
156	dw isrR, 0			; 0x11,  17, #AC, Alignment Check
157	dw isrR, 0			; 0x12   18, #MC, Machine Check
158	dw isrR, 0			; 0x13,  19, #XF, SSE Fault
159
160isrR:	mov eax, 0xDEADBEEF ; Default Real Mode Interrupt Handler 
161	out 0x80, eax
162	hlt
163	
164;; ######################################################################## 
165;; SMM Handler
166;; ########################################################################
167
168SECTION SMM ABSOLUTE=0x00038000 USE16
169	
170	rsm
171	
172;; ######################################################################## 
173;; Reset Vector
174;; ########################################################################
175
176SECTION RESET ABSOLUTE=0xFFFFFFF0 USE16
177	
178	jmp far setup
179