mirror of
https://github.com/xcat2/xNBA.git
synced 2024-12-15 15:51:44 +00:00
47 lines
1.3 KiB
ArmAsm
47 lines
1.3 KiB
ArmAsm
|
/* We need a real mode stack that won't be stomped on by Etherboot
|
||
|
which starts at 0x20000. Choose something that's sufficiently high,
|
||
|
but not in DOC territory. Note that we couldn't do this in a real
|
||
|
.com program since stack variables are in the same segment as the
|
||
|
code and data, but this isn't really a .com program, it just looks
|
||
|
like one to make DOS load it into memory. It still has the 64kB
|
||
|
limitation of .com files though. */
|
||
|
#define STACK_SEG 0x7000
|
||
|
#define STACK_SIZE 0x4000
|
||
|
|
||
|
.text
|
||
|
.code16
|
||
|
.arch i386
|
||
|
.section ".prefix", "ax", @progbits
|
||
|
|
||
|
/* Cheat a little with the relocations: .COM files are loaded at 0x100 */
|
||
|
_prefix:
|
||
|
/* Set up temporary stack */
|
||
|
movw $STACK_SEG, %ax
|
||
|
movw %ax, %ss
|
||
|
movw $STACK_SIZE, %sp
|
||
|
|
||
|
pushl $0 /* No parameters to preserve for exit path */
|
||
|
pushw $0 /* Dummy return address - use prefix_exit */
|
||
|
|
||
|
/* Calculate segment address of image start */
|
||
|
pushw %cs
|
||
|
popw %ax
|
||
|
addw $(0x100/16), %ax
|
||
|
pushw %ax
|
||
|
pushw $_start
|
||
|
/* Calculated lcall to _start with %cs:0000 = image start */
|
||
|
lret
|
||
|
|
||
|
.section ".text16", "ax", @progbits
|
||
|
prefix_exit:
|
||
|
movw $0x4c00,%ax /* return to DOS */
|
||
|
int $0x21 /* reach this on Quit */
|
||
|
prefix_exit_end:
|
||
|
.previous
|
||
|
|
||
|
/* The body of etherboot is attached here at build time.
|
||
|
* Force 16 byte alignment
|
||
|
*/
|
||
|
.align 16,0
|
||
|
_body:
|