1 .code16 2 3#ifndef REGPARM 4# error "This file assumes -mregparm=3 -DREGPARM=3" 5#endif 6 7 .section ".text","ax" 8 .globl _start 9 .type _start,@function 10_start: 11 # Align the stack and make sure the high half is zero 12 andl $0xfffc,%esp 13 14 # DS, ES points to the PSP at this point 15 pushw %es # Save PSP pointer 16 movw %cs,%ax 17 movw %ax,%ds 18 movw %ax,%es 19 20 # Clear the .bss 21 cld 22 xorl %eax,%eax 23 movw $__bss_start,%di 24 movw $__bss_end+3,%cx 25 subw %di,%cx 26 shrw $2,%cx 27 rep ; stosl 28 29 # Copy the PSP into our own segment 30 popw %fs # FS -> PSP 31 movw $_PSP,%di 32 xorw %si,%si 33 movw $0x40,%cx 34 fs ; rep ; movsl 35 36 # Verify that this is a supportable DOS version 37 movw $0x3001,%ax 38 int $0x21 39 xchgb %ah,%al 40 movw %ax,dos_version 41 cmpw $0x0314,%ax # DOS >= 3.20? 42 jae 1f # If so, okay 43 movw $bad_dos,%dx # Print error message 44 movb $0x09,%ah 45 int $0x21 46 int $0x20 # Die 47 481: 49 # Compute argc and argv (assumes REGPARM) 50 pushl %eax # Make space for argv 51 movl %esp,%eax 52 calll __parse_argv 53 pushl %eax # argc 54 55 # Initialize malloc 56 calll __init_memory_arena 57 58 # Now call main 59 popl %eax # argc 60 popl %edx # argv 61 calll main 62 63 # Here %eax is the exit code, fall through into exit 64 65 .size _start,.-_start 66 67 .globl exit 68 .type exit,@function 69exit: 70 # Exit code already in %eax 71 movb $0x4c,%ah # Terminate program 72 int $0x21 731: hlt 74 jmp 1b 75 .size exit,.-exit 76 77 .section ".rodata","a" 78bad_dos: 79 .ascii "Unsupported DOS version\r\n$" 80 .size bad_dos,.-bad_dos 81 82 .section ".bss","aw" 83 .balign 16 84 .globl _PSP 85_PSP: 86 .space 256 87 .size _PSP, .-_PSP 88 89 /* Purely for sanity */ 90 .section ".null","a" 91 .long 0,0,0,0 92