Deleted Added
full compact
btxldr.S (128716) btxldr.S (129240)
1/*
2 * Copyright (c) 1998 Robert Nordier
3 * All rights reserved.
4 *
5 * Redistribution and use in source and binary forms are freely
6 * permitted provided that the above copyright notice and this
7 * paragraph and the following disclaimer are duplicated in all
8 * such forms.
9 *
10 * This software is provided "AS IS" and without any express or
11 * implied warranties, including, without limitation, the implied
12 * warranties of merchantability and fitness for a particular
13 * purpose.
14 *
1/*
2 * Copyright (c) 1998 Robert Nordier
3 * All rights reserved.
4 *
5 * Redistribution and use in source and binary forms are freely
6 * permitted provided that the above copyright notice and this
7 * paragraph and the following disclaimer are duplicated in all
8 * such forms.
9 *
10 * This software is provided "AS IS" and without any express or
11 * implied warranties, including, without limitation, the implied
12 * warranties of merchantability and fitness for a particular
13 * purpose.
14 *
15 * $FreeBSD: head/sys/boot/i386/btx/btxldr/btxldr.S 128716 2004-04-28 14:31:44Z ru $
15 * $FreeBSD: head/sys/boot/i386/btx/btxldr/btxldr.S 129240 2004-05-14 20:29:30Z ru $
16 */
17
18/*
19 * Prototype BTX loader program, written in a couple of hours. The
20 * real thing should probably be more flexible, and in C.
21 */
22
23/*
24 * Memory locations.
25 */
16 */
17
18/*
19 * Prototype BTX loader program, written in a couple of hours. The
20 * real thing should probably be more flexible, and in C.
21 */
22
23/*
24 * Memory locations.
25 */
26 .set MEM_STUB,0x600 // Real mode stub
27 .set MEM_ESP,0x1000 // New stack pointer
28 .set MEM_TBL,0x5000 // BTX page tables
29 .set MEM_ENTRY,0x9010 // BTX entry point
30 .set MEM_DATA,start+0x1000 // Data segment
26 .set MEM_STUB,0x600 # Real mode stub
27 .set MEM_ESP,0x1000 # New stack pointer
28 .set MEM_TBL,0x5000 # BTX page tables
29 .set MEM_ENTRY,0x9010 # BTX entry point
30 .set MEM_DATA,start+0x1000 # Data segment
31/*
32 * Segment selectors.
33 */
31/*
32 * Segment selectors.
33 */
34 .set SEL_SCODE,0x8 // 4GB code
35 .set SEL_SDATA,0x10 // 4GB data
36 .set SEL_RCODE,0x18 // 64K code
37 .set SEL_RDATA,0x20 // 64K data
34 .set SEL_SCODE,0x8 # 4GB code
35 .set SEL_SDATA,0x10 # 4GB data
36 .set SEL_RCODE,0x18 # 64K code
37 .set SEL_RDATA,0x20 # 64K data
38/*
39 * Paging constants.
40 */
38/*
39 * Paging constants.
40 */
41 .set PAG_SIZ,0x1000 // Page size
42 .set PAG_ENT,0x4 // Page entry size
41 .set PAG_SIZ,0x1000 # Page size
42 .set PAG_ENT,0x4 # Page entry size
43/*
44 * Screen constants.
45 */
43/*
44 * Screen constants.
45 */
46 .set SCR_MAT,0x7 // Mode/attribute
47 .set SCR_COL,0x50 // Columns per row
48 .set SCR_ROW,0x19 // Rows per screen
46 .set SCR_MAT,0x7 # Mode/attribute
47 .set SCR_COL,0x50 # Columns per row
48 .set SCR_ROW,0x19 # Rows per screen
49/*
50 * BIOS Data Area locations.
51 */
49/*
50 * BIOS Data Area locations.
51 */
52 .set BDA_MEM,0x413 // Free memory
53 .set BDA_SCR,0x449 // Video mode
54 .set BDA_POS,0x450 // Cursor position
52 .set BDA_MEM,0x413 # Free memory
53 .set BDA_SCR,0x449 # Video mode
54 .set BDA_POS,0x450 # Cursor position
55/*
56 * Required by aout gas inadequacy.
57 */
55/*
56 * Required by aout gas inadequacy.
57 */
58 .set SIZ_STUB,0x1a // Size of stub
58 .set SIZ_STUB,0x1a # Size of stub
59/*
60 * We expect to be loaded by boot2 at the origin defined in ./Makefile.
61 */
62 .globl start
63/*
64 * BTX program loader for ELF clients.
65 */
59/*
60 * We expect to be loaded by boot2 at the origin defined in ./Makefile.
61 */
62 .globl start
63/*
64 * BTX program loader for ELF clients.
65 */
66start: cld // String ops inc
67 movl $m_logo,%esi // Identify
68 call putstr // ourselves
69 movzwl BDA_MEM,%eax // Get base memory
70 shll $0xa,%eax // in bytes
71 movl %eax,%ebp // Base of user stack
66start: cld # String ops inc
67 movl $m_logo,%esi # Identify
68 call putstr # ourselves
69 movzwl BDA_MEM,%eax # Get base memory
70 shll $0xa,%eax # in bytes
71 movl %eax,%ebp # Base of user stack
72#ifdef BTXLDR_VERBOSE
72#ifdef BTXLDR_VERBOSE
73 movl $m_mem,%esi // Display
74 call hexout // amount of
75 call putstr // base memory
73 movl $m_mem,%esi # Display
74 call hexout # amount of
75 call putstr # base memory
76#endif
76#endif
77 lgdt gdtdesc // Load new GDT
77 lgdt gdtdesc # Load new GDT
78/*
79 * Relocate caller's arguments.
80 */
81#ifdef BTXLDR_VERBOSE
78/*
79 * Relocate caller's arguments.
80 */
81#ifdef BTXLDR_VERBOSE
82 movl $m_esp,%esi // Display
83 movl %esp,%eax // caller
84 call hexout // stack
85 call putstr // pointer
86 movl $m_args,%esi // Format string
87 leal 0x4(%esp,1),%ebx // First argument
88 movl $0x6,%ecx // Count
89start.1: movl (%ebx),%eax // Get argument and
90 addl $0x4,%ebx // bump pointer
91 call hexout // Display it
92 loop start.1 // Till done
93 call putstr // End message
82 movl $m_esp,%esi # Display
83 movl %esp,%eax # caller
84 call hexout # stack
85 call putstr # pointer
86 movl $m_args,%esi # Format string
87 leal 0x4(%esp,1),%ebx # First argument
88 movl $0x6,%ecx # Count
89start.1: movl (%ebx),%eax # Get argument and
90 addl $0x4,%ebx # bump pointer
91 call hexout # Display it
92 loop start.1 # Till done
93 call putstr # End message
94#endif
94#endif
95 movl $0x48,%ecx // Allocate space
96 subl %ecx,%ebp // for bootinfo
97 movl 0x18(%esp,1),%esi // Source: bootinfo
98 cmpl $0x0, %esi // If the bootinfo pointer
99 je start_null_bi // is null, don't copy it
100 movl %ebp,%edi // Destination
101 rep // Copy
102 movsb // it
103 movl %ebp,0x18(%esp,1) // Update pointer
95 movl $0x48,%ecx # Allocate space
96 subl %ecx,%ebp # for bootinfo
97 movl 0x18(%esp,1),%esi # Source: bootinfo
98 cmpl $0x0, %esi # If the bootinfo pointer
99 je start_null_bi # is null, don't copy it
100 movl %ebp,%edi # Destination
101 rep # Copy
102 movsb # it
103 movl %ebp,0x18(%esp,1) # Update pointer
104#ifdef BTXLDR_VERBOSE
104#ifdef BTXLDR_VERBOSE
105 movl $m_rel_bi,%esi // Display
106 movl %ebp,%eax // bootinfo
107 call hexout // relocation
108 call putstr // message
105 movl $m_rel_bi,%esi # Display
106 movl %ebp,%eax # bootinfo
107 call hexout # relocation
108 call putstr # message
109#endif
109#endif
110start_null_bi: movl $0x18,%ecx // Allocate space
111 subl %ecx,%ebp // for arguments
112 leal 0x4(%esp,1),%esi // Source
113 movl %ebp,%edi // Destination
114 rep // Copy
115 movsb // them
110start_null_bi: movl $0x18,%ecx # Allocate space
111 subl %ecx,%ebp # for arguments
112 leal 0x4(%esp,1),%esi # Source
113 movl %ebp,%edi # Destination
114 rep # Copy
115 movsb # them
116#ifdef BTXLDR_VERBOSE
116#ifdef BTXLDR_VERBOSE
117 movl $m_rel_args,%esi // Display
118 movl %ebp,%eax // argument
119 call hexout // relocation
120 call putstr // message
117 movl $m_rel_args,%esi # Display
118 movl %ebp,%eax # argument
119 call hexout # relocation
120 call putstr # message
121#endif
122/*
123 * Set up BTX kernel.
124 */
121#endif
122/*
123 * Set up BTX kernel.
124 */
125 movl $MEM_ESP,%esp // Set up new stack
126 movl $MEM_DATA,%ebx // Data segment
127 movl $m_vers,%esi // Display BTX
128 call putstr // version message
129 movb 0x5(%ebx),%al // Get major version
130 addb $'0',%al // Display
131 call putchr // it
132 movb $'.',%al // And a
133 call putchr // dot
134 movb 0x6(%ebx),%al // Get minor
135 xorb %ah,%ah // version
136 movb $0xa,%dl // Divide
137 divb %dl,%al // by 10
138 addb $'0',%al // Display
139 call putchr // tens
140 movb %ah,%al // Get units
141 addb $'0',%al // Display
142 call putchr // units
143 call putstr // End message
144 movl %ebx,%esi // BTX image
145 movzwl 0x8(%ebx),%edi // Compute
146 orl $PAG_SIZ/PAG_ENT-1,%edi // the
147 incl %edi // BTX
148 shll $0x2,%edi // load
149 addl $MEM_TBL,%edi // address
150 pushl %edi // Save load address
151 movzwl 0xa(%ebx),%ecx // Image size
125 movl $MEM_ESP,%esp # Set up new stack
126 movl $MEM_DATA,%ebx # Data segment
127 movl $m_vers,%esi # Display BTX
128 call putstr # version message
129 movb 0x5(%ebx),%al # Get major version
130 addb $'0',%al # Display
131 call putchr # it
132 movb $'.',%al # And a
133 call putchr # dot
134 movb 0x6(%ebx),%al # Get minor
135 xorb %ah,%ah # version
136 movb $0xa,%dl # Divide
137 divb %dl,%al # by 10
138 addb $'0',%al # Display
139 call putchr # tens
140 movb %ah,%al # Get units
141 addb $'0',%al # Display
142 call putchr # units
143 call putstr # End message
144 movl %ebx,%esi # BTX image
145 movzwl 0x8(%ebx),%edi # Compute
146 orl $PAG_SIZ/PAG_ENT-1,%edi # the
147 incl %edi # BTX
148 shll $0x2,%edi # load
149 addl $MEM_TBL,%edi # address
150 pushl %edi # Save load address
151 movzwl 0xa(%ebx),%ecx # Image size
152#ifdef BTXLDR_VERBOSE
152#ifdef BTXLDR_VERBOSE
153 pushl %ecx // Save image size
153 pushl %ecx # Save image size
154#endif
154#endif
155 rep // Relocate
156 movsb // BTX
157 movl %esi,%ebx // Keep place
155 rep # Relocate
156 movsb # BTX
157 movl %esi,%ebx # Keep place
158#ifdef BTXLDR_VERBOSE
158#ifdef BTXLDR_VERBOSE
159 movl $m_rel_btx,%esi // Restore
160 popl %eax // parameters
161 call hexout // and
159 movl $m_rel_btx,%esi # Restore
160 popl %eax # parameters
161 call hexout # and
162#endif
162#endif
163 popl %ebp // display
163 popl %ebp # display
164#ifdef BTXLDR_VERBOSE
164#ifdef BTXLDR_VERBOSE
165 movl %ebp,%eax // the
166 call hexout // relocation
167 call putstr // message
165 movl %ebp,%eax # the
166 call hexout # relocation
167 call putstr # message
168#endif
168#endif
169 addl $PAG_SIZ,%ebp // Display
169 addl $PAG_SIZ,%ebp # Display
170#ifdef BTXLDR_VERBOSE
170#ifdef BTXLDR_VERBOSE
171 movl $m_base,%esi // the
172 movl %ebp,%eax // user
173 call hexout // base
174 call putstr // address
171 movl $m_base,%esi # the
172 movl %ebp,%eax # user
173 call hexout # base
174 call putstr # address
175#endif
176/*
177 * Set up ELF-format client program.
178 */
175#endif
176/*
177 * Set up ELF-format client program.
178 */
179 cmpl $0x464c457f,(%ebx) // ELF magic number?
180 je start.3 // Yes
181 movl $e_fmt,%esi // Display error
182 call putstr // message
183start.2: jmp start.2 // Hang
179 cmpl $0x464c457f,(%ebx) # ELF magic number?
180 je start.3 # Yes
181 movl $e_fmt,%esi # Display error
182 call putstr # message
183start.2: jmp start.2 # Hang
184start.3:
185#ifdef BTXLDR_VERBOSE
184start.3:
185#ifdef BTXLDR_VERBOSE
186 movl $m_elf,%esi // Display ELF
187 call putstr // message
188 movl $m_segs,%esi // Format string
186 movl $m_elf,%esi # Display ELF
187 call putstr # message
188 movl $m_segs,%esi # Format string
189#endif
189#endif
190 movl $0x2,%edi // Segment count
191 movl 0x1c(%ebx),%edx // Get e_phoff
192 addl %ebx,%edx // To pointer
193 movzwl 0x2c(%ebx),%ecx // Get e_phnum
194start.4: cmpl $0x1,(%edx) // Is p_type PT_LOAD?
195 jne start.6 // No
190 movl $0x2,%edi # Segment count
191 movl 0x1c(%ebx),%edx # Get e_phoff
192 addl %ebx,%edx # To pointer
193 movzwl 0x2c(%ebx),%ecx # Get e_phnum
194start.4: cmpl $0x1,(%edx) # Is p_type PT_LOAD?
195 jne start.6 # No
196#ifdef BTXLDR_VERBOSE
196#ifdef BTXLDR_VERBOSE
197 movl 0x4(%edx),%eax // Display
198 call hexout // p_offset
199 movl 0x8(%edx),%eax // Display
200 call hexout // p_vaddr
201 movl 0x10(%edx),%eax // Display
202 call hexout // p_filesz
203 movl 0x14(%edx),%eax // Display
204 call hexout // p_memsz
205 call putstr // End message
197 movl 0x4(%edx),%eax # Display
198 call hexout # p_offset
199 movl 0x8(%edx),%eax # Display
200 call hexout # p_vaddr
201 movl 0x10(%edx),%eax # Display
202 call hexout # p_filesz
203 movl 0x14(%edx),%eax # Display
204 call hexout # p_memsz
205 call putstr # End message
206#endif
206#endif
207 pushl %esi // Save
208 pushl %edi // working
209 pushl %ecx // registers
210 movl 0x4(%edx),%esi // Get p_offset
211 addl %ebx,%esi // as pointer
212 movl 0x8(%edx),%edi // Get p_vaddr
213 addl %ebp,%edi // as pointer
214 movl 0x10(%edx),%ecx // Get p_filesz
215 rep // Set up
216 movsb // segment
217 movl 0x14(%edx),%ecx // Any bytes
218 subl 0x10(%edx),%ecx // to zero?
219 jz start.5 // No
220 xorb %al,%al // Then
221 rep // zero
222 stosb // them
223start.5: popl %ecx // Restore
224 popl %edi // working
225 popl %esi // registers
226 decl %edi // Segments to do
227 je start.7 // If none
228start.6: addl $0x20,%edx // To next entry
229 loop start.4 // Till done
207 pushl %esi # Save
208 pushl %edi # working
209 pushl %ecx # registers
210 movl 0x4(%edx),%esi # Get p_offset
211 addl %ebx,%esi # as pointer
212 movl 0x8(%edx),%edi # Get p_vaddr
213 addl %ebp,%edi # as pointer
214 movl 0x10(%edx),%ecx # Get p_filesz
215 rep # Set up
216 movsb # segment
217 movl 0x14(%edx),%ecx # Any bytes
218 subl 0x10(%edx),%ecx # to zero?
219 jz start.5 # No
220 xorb %al,%al # Then
221 rep # zero
222 stosb # them
223start.5: popl %ecx # Restore
224 popl %edi # working
225 popl %esi # registers
226 decl %edi # Segments to do
227 je start.7 # If none
228start.6: addl $0x20,%edx # To next entry
229 loop start.4 # Till done
230start.7:
231#ifdef BTXLDR_VERBOSE
230start.7:
231#ifdef BTXLDR_VERBOSE
232 movl $m_done,%esi // Display done
233 call putstr // message
232 movl $m_done,%esi # Display done
233 call putstr # message
234#endif
234#endif
235 movl $start.8,%esi // Real mode stub
236 movl $MEM_STUB,%edi // Destination
237 movl $start.9-start.8,%ecx // Size
238 rep // Relocate
239 movsb // it
240 ljmp $SEL_RCODE,$MEM_STUB // To 16-bit code
235 movl $start.8,%esi # Real mode stub
236 movl $MEM_STUB,%edi # Destination
237 movl $start.9-start.8,%ecx # Size
238 rep # Relocate
239 movsb # it
240 ljmp $SEL_RCODE,$MEM_STUB # To 16-bit code
241 .code16
241 .code16
242start.8: xorw %ax,%ax // Data
243 movb $SEL_RDATA,%al // selector
244 movw %ax,%ss // Reload SS
245 movw %ax,%ds // Reset
246 movw %ax,%es // other
247 movw %ax,%fs // segment
248 movw %ax,%gs // limits
249 movl %cr0,%eax // Switch to
250 decw %ax // real
251 movl %eax,%cr0 // mode
252 ljmp $0,$MEM_ENTRY // Jump to BTX entry point
242start.8: xorw %ax,%ax # Data
243 movb $SEL_RDATA,%al # selector
244 movw %ax,%ss # Reload SS
245 movw %ax,%ds # Reset
246 movw %ax,%es # other
247 movw %ax,%fs # segment
248 movw %ax,%gs # limits
249 movl %cr0,%eax # Switch to
250 decw %ax # real
251 movl %eax,%cr0 # mode
252 ljmp $0,$MEM_ENTRY # Jump to BTX entry point
253start.9:
254 .code32
255/*
256 * Output message [ESI] followed by EAX in hex.
257 */
253start.9:
254 .code32
255/*
256 * Output message [ESI] followed by EAX in hex.
257 */
258hexout: pushl %eax // Save
259 call putstr // Display message
260 popl %eax // Restore
261 pushl %esi // Save
262 pushl %edi // caller's
263 movl $buf,%edi // Buffer
264 pushl %edi // Save
265 call hex32 // To hex
266 xorb %al,%al // Terminate
267 stosb // string
268 popl %esi // Restore
269hexout.1: lodsb // Get a char
270 cmpb $'0',%al // Leading zero?
271 je hexout.1 // Yes
272 testb %al,%al // End of string?
273 jne hexout.2 // No
274 decl %esi // Undo
275hexout.2: decl %esi // Adjust for inc
276 call putstr // Display hex
277 popl %edi // Restore
278 popl %esi // caller's
279 ret // To caller
258hexout: pushl %eax # Save
259 call putstr # Display message
260 popl %eax # Restore
261 pushl %esi # Save
262 pushl %edi # caller's
263 movl $buf,%edi # Buffer
264 pushl %edi # Save
265 call hex32 # To hex
266 xorb %al,%al # Terminate
267 stosb # string
268 popl %esi # Restore
269hexout.1: lodsb # Get a char
270 cmpb $'0',%al # Leading zero?
271 je hexout.1 # Yes
272 testb %al,%al # End of string?
273 jne hexout.2 # No
274 decl %esi # Undo
275hexout.2: decl %esi # Adjust for inc
276 call putstr # Display hex
277 popl %edi # Restore
278 popl %esi # caller's
279 ret # To caller
280/*
281 * Output zero-terminated string [ESI] to the console.
282 */
280/*
281 * Output zero-terminated string [ESI] to the console.
282 */
283putstr.0: call putchr // Output char
284putstr: lodsb // Load char
285 testb %al,%al // End of string?
286 jne putstr.0 // No
287 ret // To caller
283putstr.0: call putchr # Output char
284putstr: lodsb # Load char
285 testb %al,%al # End of string?
286 jne putstr.0 # No
287 ret # To caller
288/*
289 * Output character AL to the console.
290 */
288/*
289 * Output character AL to the console.
290 */
291putchr: pusha // Save
292 xorl %ecx,%ecx // Zero for loops
293 movb $SCR_MAT,%ah // Mode/attribute
294 movl $BDA_POS,%ebx // BDA pointer
295 movw (%ebx),%dx // Cursor position
296 movl $0xb8000,%edi // Regen buffer (color)
297 cmpb %ah,BDA_SCR-BDA_POS(%ebx) // Mono mode?
298 jne putchr.1 // No
299 xorw %di,%di // Regen buffer (mono)
300putchr.1: cmpb $0xa,%al // New line?
301 je putchr.2 // Yes
302 xchgl %eax,%ecx // Save char
303 movb $SCR_COL,%al // Columns per row
304 mulb %dh // * row position
305 addb %dl,%al // + column
306 adcb $0x0,%ah // position
307 shll %eax // * 2
308 xchgl %eax,%ecx // Swap char, offset
309 movw %ax,(%edi,%ecx,1) // Write attr:char
310 incl %edx // Bump cursor
311 cmpb $SCR_COL,%dl // Beyond row?
312 jb putchr.3 // No
313putchr.2: xorb %dl,%dl // Zero column
314 incb %dh // Bump row
315putchr.3: cmpb $SCR_ROW,%dh // Beyond screen?
316 jb putchr.4 // No
317 leal 2*SCR_COL(%edi),%esi // New top line
318 movw $(SCR_ROW-1)*SCR_COL/2,%cx // Words to move
319 rep // Scroll
320 movsl // screen
321 movb $' ',%al // Space
322 movb $SCR_COL,%cl // Columns to clear
323 rep // Clear
324 stosw // line
325 movb $SCR_ROW-1,%dh // Bottom line
326putchr.4: movw %dx,(%ebx) // Update position
327 popa // Restore
328 ret // To caller
291putchr: pusha # Save
292 xorl %ecx,%ecx # Zero for loops
293 movb $SCR_MAT,%ah # Mode/attribute
294 movl $BDA_POS,%ebx # BDA pointer
295 movw (%ebx),%dx # Cursor position
296 movl $0xb8000,%edi # Regen buffer (color)
297 cmpb %ah,BDA_SCR-BDA_POS(%ebx) # Mono mode?
298 jne putchr.1 # No
299 xorw %di,%di # Regen buffer (mono)
300putchr.1: cmpb $0xa,%al # New line?
301 je putchr.2 # Yes
302 xchgl %eax,%ecx # Save char
303 movb $SCR_COL,%al # Columns per row
304 mulb %dh # * row position
305 addb %dl,%al # + column
306 adcb $0x0,%ah # position
307 shll %eax # * 2
308 xchgl %eax,%ecx # Swap char, offset
309 movw %ax,(%edi,%ecx,1) # Write attr:char
310 incl %edx # Bump cursor
311 cmpb $SCR_COL,%dl # Beyond row?
312 jb putchr.3 # No
313putchr.2: xorb %dl,%dl # Zero column
314 incb %dh # Bump row
315putchr.3: cmpb $SCR_ROW,%dh # Beyond screen?
316 jb putchr.4 # No
317 leal 2*SCR_COL(%edi),%esi # New top line
318 movw $(SCR_ROW-1)*SCR_COL/2,%cx # Words to move
319 rep # Scroll
320 movsl # screen
321 movb $' ',%al # Space
322 movb $SCR_COL,%cl # Columns to clear
323 rep # Clear
324 stosw # line
325 movb $SCR_ROW-1,%dh # Bottom line
326putchr.4: movw %dx,(%ebx) # Update position
327 popa # Restore
328 ret # To caller
329/*
330 * Convert EAX, AX, or AL to hex, saving the result to [EDI].
331 */
329/*
330 * Convert EAX, AX, or AL to hex, saving the result to [EDI].
331 */
332hex32: pushl %eax // Save
333 shrl $0x10,%eax // Do upper
334 call hex16 // 16
335 popl %eax // Restore
336hex16: call hex16.1 // Do upper 8
337hex16.1: xchgb %ah,%al // Save/restore
338hex8: pushl %eax // Save
339 shrb $0x4,%al // Do upper
340 call hex8.1 // 4
341 popl %eax // Restore
342hex8.1: andb $0xf,%al // Get lower 4
343 cmpb $0xa,%al // Convert
344 sbbb $0x69,%al // to hex
345 das // digit
346 orb $0x20,%al // To lower case
347 stosb // Save char
348 ret // (Recursive)
332hex32: pushl %eax # Save
333 shrl $0x10,%eax # Do upper
334 call hex16 # 16
335 popl %eax # Restore
336hex16: call hex16.1 # Do upper 8
337hex16.1: xchgb %ah,%al # Save/restore
338hex8: pushl %eax # Save
339 shrb $0x4,%al # Do upper
340 call hex8.1 # 4
341 popl %eax # Restore
342hex8.1: andb $0xf,%al # Get lower 4
343 cmpb $0xa,%al # Convert
344 sbbb $0x69,%al # to hex
345 das # digit
346 orb $0x20,%al # To lower case
347 stosb # Save char
348 ret # (Recursive)
349
350 .data
351 .p2align 4
352/*
353 * Global descriptor table.
354 */
349
350 .data
351 .p2align 4
352/*
353 * Global descriptor table.
354 */
355gdt: .word 0x0,0x0,0x0,0x0 // Null entry
356 .word 0xffff,0x0,0x9a00,0xcf // SEL_SCODE
357 .word 0xffff,0x0,0x9200,0xcf // SEL_SDATA
358 .word 0xffff,0x0,0x9a00,0x0 // SEL_RCODE
359 .word 0xffff,0x0,0x9200,0x0 // SEL_RDATA
355gdt: .word 0x0,0x0,0x0,0x0 # Null entry
356 .word 0xffff,0x0,0x9a00,0xcf # SEL_SCODE
357 .word 0xffff,0x0,0x9200,0xcf # SEL_SDATA
358 .word 0xffff,0x0,0x9a00,0x0 # SEL_RCODE
359 .word 0xffff,0x0,0x9200,0x0 # SEL_RDATA
360gdt.1:
360gdt.1:
361gdtdesc: .word gdt.1-gdt-1 // Limit
362 .long gdt // Base
361gdtdesc: .word gdt.1-gdt-1 # Limit
362 .long gdt # Base
363/*
364 * Messages.
365 */
366m_logo: .asciz " \nBTX loader 1.00 "
367m_vers: .asciz "BTX version is \0\n"
368e_fmt: .asciz "Error: Client format not supported\n"
369#ifdef BTXLDR_VERBOSE
370m_mem: .asciz "Starting in protected mode (base mem=\0)\n"

--- 17 unchanged lines hidden (view full) ---

388 .asciz " vaddr="
389 .asciz " filesz="
390 .asciz " memsz=\0\n"
391m_done: .asciz "Loading complete\n"
392#endif
393/*
394 * Uninitialized data area.
395 */
363/*
364 * Messages.
365 */
366m_logo: .asciz " \nBTX loader 1.00 "
367m_vers: .asciz "BTX version is \0\n"
368e_fmt: .asciz "Error: Client format not supported\n"
369#ifdef BTXLDR_VERBOSE
370m_mem: .asciz "Starting in protected mode (base mem=\0)\n"

--- 17 unchanged lines hidden (view full) ---

388 .asciz " vaddr="
389 .asciz " filesz="
390 .asciz " memsz=\0\n"
391m_done: .asciz "Loading complete\n"
392#endif
393/*
394 * Uninitialized data area.
395 */
396buf: // Scratch buffer
396buf: # Scratch buffer