| ; -*- nasm -*- |
| |
| ; NASM macro file to allow the `bin' output format to generate |
| |
| ; simple .EXE files by constructing the EXE header by hand. |
| |
| ; Adapted from a contribution by Yann Guidon <whygee_corp@hol.fr> |
| |
| |
| |
| %define EXE_stack_size EXE_realstacksize |
| |
| |
| |
| %macro EXE_begin 0 |
| |
| ORG 0E0h |
| |
| section .text |
| |
| |
| |
| header_start: |
| |
| db 4Dh,5Ah ; EXE file signature |
| |
| dw EXE_allocsize % 512 |
| |
| dw (EXE_allocsize + 511) / 512 |
| |
| dw 0 ; relocation information: none |
| |
| dw (header_end-header_start)/16 ; header size in paragraphs |
| |
| dw (EXE_absssize + EXE_realstacksize) / 16 ; min extra mem |
| |
| dw (EXE_absssize + EXE_realstacksize) / 16 ; max extra mem |
| |
| dw -10h ; Initial SS (before fixup) |
| |
| dw EXE_endbss + EXE_realstacksize ; Initial SP (1K DPMI+1K STACK) |
| |
| dw 0 ; (no) Checksum |
| |
| dw 100h ; Initial IP - start just after the header |
| |
| dw -10h ; Initial CS (before fixup) |
| |
| dw 0 ; file offset to relocation table: none |
| |
| dw 0 ; (no overlay) |
| |
| align 16,db 0 |
| |
| header_end: |
| |
| |
| |
| EXE_startcode: |
| |
| section .data |
| |
| EXE_startdata: |
| |
| section .bss |
| |
| EXE_startbss: |
| |
| %endmacro |
| |
| |
| |
| %macro EXE_stack 1 |
| |
| EXE_realstacksize equ %1 |
| |
| %define EXE_stack_size EXE_bogusstacksize ; defeat EQU in EXE_end |
| |
| %endmacro |
| |
| |
| |
| %macro EXE_end 0 |
| |
| section .text |
| |
| EXE_endcode: |
| |
| section .data |
| |
| EXE_enddata: |
| |
| section .bss |
| |
| alignb 4 |
| |
| EXE_endbss: |
| |
| |
| |
| EXE_acodesize equ (EXE_endcode-EXE_startcode+3) & (~3) |
| |
| EXE_datasize equ EXE_enddata-EXE_startdata |
| |
| EXE_absssize equ (EXE_endbss-EXE_startbss+3) & (~3) |
| |
| EXE_allocsize equ EXE_acodesize + EXE_datasize |
| |
| |
| |
| EXE_stack_size equ 0x800 ; default if nothing else was used |
| |
| %endmacro |
| |