rev |
line source |
pascal@15981
|
1 .text
|
pascal@15981
|
2 .code16
|
pascal@15981
|
3 .org 0
|
pascal@15981
|
4 stacktop = 0xFFFE
|
pascal@15981
|
5
|
pascal@15981
|
6 .globl _start
|
pascal@15981
|
7 _start:
|
pascal@15981
|
8 #if 1
|
pascal@15981
|
9 #define EXEADRS(x) x+0xE0
|
pascal@15981
|
10 #define CODESZ 0x200
|
pascal@15981
|
11 decw %bp // Magic number: MZ
|
pascal@15981
|
12 popw %dx
|
pascal@15981
|
13 jmp start // Bytes on last page of file
|
pascal@15981
|
14 .word (CODESZ+511)/512 // Pages in file
|
pascal@15981
|
15 .word 0 // Relocations
|
pascal@15981
|
16 .word (end_header-_start)/16 // Size of header in paragraphs
|
pascal@15981
|
17 .word 4096 // Minimum extra paragraphs needed
|
pascal@15981
|
18 .word -1 // Maximum extra paragraphs needed
|
pascal@15981
|
19 .word (CODESZ+15)/16 // Initial (relative) SS value
|
pascal@15981
|
20 .word stacktop // Initial SP value
|
pascal@15981
|
21 .word 0 // Checksum
|
pascal@15981
|
22 .word EXEADRS(comstart) // Initial IP value
|
pascal@15981
|
23 .word 0xFFF0 // Initial (relative) CS value
|
pascal@15981
|
24 // .word 0x001C // File address of relocation table
|
pascal@15981
|
25 // .word 0,0,0 // Overlay number
|
pascal@15981
|
26 start:
|
pascal@15981
|
27 pushw %dx
|
pascal@15981
|
28 cld
|
pascal@15981
|
29 pushw %cs
|
pascal@15981
|
30 call comstart2
|
pascal@15981
|
31 stop:
|
pascal@15981
|
32 hlt
|
pascal@15981
|
33 jmp stop
|
pascal@15981
|
34 end_header:
|
pascal@15981
|
35 #endif
|
pascal@15981
|
36 comstart:
|
pascal@15981
|
37 pushw %cs
|
pascal@15981
|
38 call comstart2
|
pascal@15981
|
39 int $0x20
|
pascal@15981
|
40 comstart2:
|
pascal@15981
|
41 call here
|
pascal@15981
|
42 here:
|
pascal@15981
|
43 popw %ax
|
pascal@15981
|
44 subw $here-_start, %ax
|
pascal@15981
|
45 shrw $4, %ax
|
pascal@15981
|
46 movw %cs, %dx
|
pascal@15981
|
47 addw %ax, %dx
|
pascal@15981
|
48 pushw %dx
|
pascal@15981
|
49 pushw $go
|
pascal@15981
|
50 retf
|
pascal@15981
|
51 go:
|
pascal@15981
|
52 pushw %cs
|
pascal@15981
|
53 popw %ds
|
pascal@15981
|
54 pushw %cs
|
pascal@15981
|
55 popw %es
|
pascal@15981
|
56 xorl %ebx, %ebx
|
pascal@15981
|
57 e820lp:
|
pascal@15981
|
58 movl $0xe820, %eax
|
pascal@15981
|
59 movl $0x534d4150, %edx
|
pascal@15981
|
60 movl $20, %ecx
|
pascal@15981
|
61 movw $buffer, %di
|
pascal@15981
|
62 int $0x15
|
pascal@15981
|
63 jc fail
|
pascal@15981
|
64 cmpl $0x534d4150, %eax
|
pascal@15981
|
65 jne fail
|
pascal@15981
|
66 cmpl $20, %ecx
|
pascal@15981
|
67 jc fail
|
pascal@15981
|
68 pushl %ebx
|
pascal@15981
|
69 movw $header_e820, %si
|
pascal@15981
|
70 call puts64
|
pascal@15981
|
71 movw $usable, %si
|
pascal@15981
|
72 cmpl $1, (%di)
|
pascal@15981
|
73 je show_status
|
pascal@15981
|
74 movw $acpi_reclaim, %si
|
pascal@15981
|
75 cmpl $3, (%di)
|
pascal@15981
|
76 je show_status
|
pascal@15981
|
77 movw $acpi_nvs, %si
|
pascal@15981
|
78 cmpl $4, (%di)
|
pascal@15981
|
79 je show_status
|
pascal@15981
|
80 movw $reserved, %si
|
pascal@15981
|
81 show_status:
|
pascal@15981
|
82 call putcs
|
pascal@15981
|
83 popl %ebx
|
pascal@15981
|
84 orl %ebx, %ebx
|
pascal@15981
|
85 jnz e820lp
|
pascal@15981
|
86 fail:
|
pascal@15981
|
87 movb $10, %al
|
pascal@15981
|
88 call putc
|
pascal@15981
|
89 movw $8*4, %cx
|
pascal@15981
|
90 movw $buffer, %di
|
pascal@15981
|
91 pushw %di
|
pascal@15981
|
92 xorw %ax, %ax
|
pascal@15981
|
93 rep
|
pascal@15981
|
94 stosw
|
pascal@15981
|
95 movw $0xE801, %ax
|
pascal@15981
|
96 int $0x15
|
pascal@15981
|
97 popw %di
|
pascal@15981
|
98 jc fail2
|
pascal@15981
|
99 movb $0x10, 0+2(%di) // 1M
|
pascal@15981
|
100 movb $0x10, 32+2(%di) // 1M
|
pascal@15981
|
101 movb $0x1, 16+3(%di) // 16M
|
pascal@15981
|
102 movb $0x1, 48+3(%di) // 16M
|
pascal@15981
|
103 incb %bh
|
pascal@15981
|
104 movw %bx, 24+2(%di)
|
pascal@15981
|
105 incb %dh
|
pascal@15981
|
106 movw %dx, 56+2(%di)
|
pascal@15981
|
107 shrw $6, %ax // 1K -> 64K
|
pascal@15981
|
108 jz e801_configured
|
pascal@15981
|
109 shrw $6, %cx // 1K -> 64K
|
pascal@15981
|
110 addw $0x10, %ax
|
pascal@15981
|
111 addw $0x10, %cx
|
pascal@15981
|
112 movw %ax, 8+2(%di)
|
pascal@15981
|
113 movw %cx, 40+2(%di)
|
pascal@15981
|
114 movw $extended, %si
|
pascal@15981
|
115 call pute801
|
pascal@15981
|
116 call pute801
|
pascal@15981
|
117 e801_configured:
|
pascal@15981
|
118 movw $buffer+32, %di
|
pascal@15981
|
119 movw $configured, %si
|
pascal@15981
|
120 call pute801
|
pascal@15981
|
121 call pute801
|
pascal@15981
|
122 movb $10, %al
|
pascal@15981
|
123 call putc
|
pascal@15982
|
124 fail2:
|
pascal@15982
|
125 movw $8, %cx
|
pascal@15982
|
126 movw $buffer, %di
|
pascal@15982
|
127 pushw %di
|
pascal@15982
|
128 xorw %ax, %ax
|
pascal@15982
|
129 rep
|
pascal@15982
|
130 stosw
|
pascal@15982
|
131 movb $0x88, %ah
|
pascal@15982
|
132 int $0x15
|
pascal@15982
|
133 popw %di
|
pascal@15982
|
134 jc fail3
|
pascal@15982
|
135 movb $0x10, 0+2(%di) // 1M
|
pascal@15982
|
136 shrw $6, %ax // 1K -> 64K
|
pascal@15982
|
137 jz fail3
|
pascal@15982
|
138 addw $0x10, %ax
|
pascal@15982
|
139 movw %ax, 8+2(%di)
|
pascal@15982
|
140 movw $header_0088, %si
|
pascal@15982
|
141 call puts64
|
pascal@15982
|
142 movb $10, %al
|
pascal@15982
|
143 call putc
|
pascal@15982
|
144 fail3:
|
pascal@15981
|
145 retf
|
pascal@15981
|
146
|
pascal@15981
|
147 puts64:
|
pascal@15981
|
148 call puts
|
pascal@15981
|
149 call put64
|
pascal@15981
|
150 movw $middle, %si
|
pascal@15981
|
151 call putcs
|
pascal@15981
|
152 put64:
|
pascal@15981
|
153 movw $8, %cx
|
pascal@15981
|
154 addw %cx, %di
|
pascal@15981
|
155 pushw %di
|
pascal@15981
|
156 put64lp:
|
pascal@15981
|
157 decw %di
|
pascal@15981
|
158 movb (%di), %al
|
pascal@15981
|
159 shrb $4, %al
|
pascal@15981
|
160 call putx
|
pascal@15981
|
161 movb (%di), %al
|
pascal@15981
|
162 call putx
|
pascal@15981
|
163 loop put64lp
|
pascal@15981
|
164 popw %di
|
pascal@15981
|
165 ret
|
pascal@15981
|
166
|
pascal@15981
|
167 pute801:
|
pascal@15981
|
168 pushw %si
|
pascal@15981
|
169 movw $header_e801, %si
|
pascal@15981
|
170 call puts64
|
pascal@15981
|
171 popw %si
|
pascal@15981
|
172 pushw %si
|
pascal@15981
|
173 call putcs
|
pascal@15981
|
174 popw %si
|
pascal@15981
|
175 ret
|
pascal@15981
|
176 putcs:
|
pascal@15981
|
177 movb $0x20, %al
|
pascal@15981
|
178 putslp:
|
pascal@15981
|
179 call putc
|
pascal@15981
|
180 puts:
|
pascal@15981
|
181 lodsb
|
pascal@15981
|
182 orb %al, %al
|
pascal@15981
|
183 jnz putslp
|
pascal@15981
|
184 ret
|
pascal@15981
|
185
|
pascal@15981
|
186 putx:
|
pascal@15981
|
187 andb $0xF, %al
|
pascal@15981
|
188 addb $0x90, %al
|
pascal@15981
|
189 daa
|
pascal@15981
|
190 adcb $0x40, %al
|
pascal@15981
|
191 daa
|
pascal@15981
|
192 putc:
|
pascal@15981
|
193 movw $7, %bx
|
pascal@15981
|
194 movb $0xE, %ah
|
pascal@15981
|
195 int $0x10
|
pascal@15981
|
196 ret
|
pascal@15981
|
197
|
pascal@15982
|
198 header_0088:
|
pascal@15982
|
199 .byte 13,10
|
pascal@15982
|
200 .ascii "BIOS-0088: "
|
pascal@15982
|
201 .byte 0
|
pascal@15981
|
202 header_e801:
|
pascal@15981
|
203 .byte 13,10
|
pascal@15981
|
204 .ascii "BIOS-e801: "
|
pascal@15981
|
205 .byte 0
|
pascal@15981
|
206 extended:
|
pascal@15981
|
207 .ascii "(extended)"
|
pascal@15981
|
208 .byte 0
|
pascal@15981
|
209 configured:
|
pascal@15981
|
210 .ascii "(configured)"
|
pascal@15981
|
211 .byte 0
|
pascal@15981
|
212 header_e820:
|
pascal@15981
|
213 .byte 13,10
|
pascal@15981
|
214 .ascii "BIOS-e820: "
|
pascal@15981
|
215 .byte 0
|
pascal@15981
|
216 middle:
|
pascal@15981
|
217 .ascii "- "
|
pascal@15981
|
218 .byte 0
|
pascal@15981
|
219 usable: // 1
|
pascal@15981
|
220 .ascii "(usable)"
|
pascal@15981
|
221 .byte 0
|
pascal@15981
|
222 reserved: // 2
|
pascal@15981
|
223 .ascii "(reserved)"
|
pascal@15981
|
224 .byte 0
|
pascal@15981
|
225 acpi_reclaim: // 3
|
pascal@15981
|
226 .ascii "(ACPI Reclaim)"
|
pascal@15981
|
227 .byte 0
|
pascal@15981
|
228 acpi_nvs: // 4
|
pascal@15981
|
229 .ascii "(ACPI NVS)"
|
pascal@15981
|
230 .byte 0
|
pascal@15981
|
231 buffer:
|
pascal@15981
|
232 .org 510
|
pascal@15981
|
233 .word 0xAA55
|