| .code16 |
| |
| #ifndef REGPARM |
| # error "This file assumes -mregparm=3 -DREGPARM=3" |
| #endif |
| |
| .section ".text","ax" |
| .globl _start |
| .type _start,@function |
| _start: |
| # Align the stack and make sure the high half is zero |
| andl $0xfffc,%esp |
| |
| # DS, ES points to the PSP at this point |
| pushw %es # Save PSP pointer |
| movw %cs,%ax |
| movw %ax,%ds |
| movw %ax,%es |
| |
| # Clear the .bss |
| cld |
| xorl %eax,%eax |
| movw $__bss_start,%di |
| movw $__bss_end+3,%cx |
| subw %di,%cx |
| shrw $2,%cx |
| rep ; stosl |
| |
| # Copy the PSP into our own segment |
| popw %fs # FS -> PSP |
| movw $_PSP,%di |
| xorw %si,%si |
| movw $0x40,%cx |
| fs ; rep ; movsl |
| |
| # Verify that this is a supportable DOS version |
| movw $0x3001,%ax |
| int $0x21 |
| xchgb %ah,%al |
| movw %ax,dos_version |
| cmpw $0x0314,%ax # DOS >= 3.20? |
| jae 1f # If so, okay |
| movw $bad_dos,%dx # Print error message |
| movb $0x09,%ah |
| int $0x21 |
| int $0x20 # Die |
| |
| 1: |
| # Compute argc and argv (assumes REGPARM) |
| pushl %eax # Make space for argv |
| movl %esp,%eax |
| calll __parse_argv |
| pushl %eax # argc |
| |
| # Initialize malloc |
| calll __init_memory_arena |
| |
| # Now call main |
| popl %eax # argc |
| popl %edx # argv |
| calll main |
| |
| # Here %eax is the exit code, fall through into exit |
| |
| .size _start,.-_start |
| |
| .globl exit |
| .type exit,@function |
| exit: |
| # Exit code already in %eax |
| movb $0x4c,%ah # Terminate program |
| int $0x21 |
| 1: hlt |
| jmp 1b |
| .size exit,.-exit |
| |
| .section ".rodata","a" |
| bad_dos: |
| .ascii "Unsupported DOS version\r\n$" |
| .size bad_dos,.-bad_dos |
| |
| .section ".bss","aw" |
| .balign 16 |
| .globl _PSP |
| _PSP: |
| .space 256 |
| .size _PSP, .-_PSP |
| |
| /* Purely for sanity */ |
| .section ".null","a" |
| .long 0,0,0,0 |