diff options
Diffstat (limited to 'misc')
-rw-r--r-- | misc/c16.mac | 49 | ||||
-rw-r--r-- | misc/c32.mac | 28 | ||||
-rw-r--r-- | misc/exebin.mac | 57 |
3 files changed, 131 insertions, 3 deletions
diff --git a/misc/c16.mac b/misc/c16.mac index 86e6bf92..50b5d5ee 100644 --- a/misc/c16.mac +++ b/misc/c16.mac @@ -1,37 +1,82 @@ ; NASM macro set to make interfacing to 16-bit programs easier -*- nasm -*- + + %imacro proc 1 ; begin a procedure definition + %push proc + global %1 + %1: push bp + mov bp,sp + %ifdef FARCODE PASCAL ; arguments may start at bp+4 or bp+6 + %assign %$arg 6 + +%define %$firstarg 6 + %else + %assign %$arg 4 + +%define %$firstarg 4 + %endif + %define %$procname %1 + %endmacro + + %imacro arg 0-1 2 ; used with the argument name as a label - equ %$arg + +%00 equ %$arg + + ; we could possibly be adding some + + ; debug information at this point...? + %assign %$arg %1+%$arg + %endmacro + + %imacro endproc 0 + %ifnctx proc + %error Mismatched `endproc'/`proc' + %else + mov sp,bp + pop bp + %ifdef PASCAL - retf %$arg + + retf %$arg - %$firstarg + %elifdef FARCODE + retf + %else + retn + %endif + __end_%$procname: ; useful for calculating function size + %pop + %endif + %endmacro + diff --git a/misc/c32.mac b/misc/c32.mac index a59acfde..f0c116ba 100644 --- a/misc/c32.mac +++ b/misc/c32.mac @@ -1,26 +1,52 @@ ; NASM macro set to make interfacing to 32-bit programs easier -*- nasm -*- + + %imacro proc 1 ; begin a procedure definition + %push proc + global %1 + %1: push ebp + mov ebp,esp + %assign %$arg 8 + %define %$procname %1 + %endmacro + + %imacro arg 0-1 4 ; used with the argument name as a label - equ %$arg + +%00 equ %$arg + %assign %$arg %1+%$arg + %endmacro + + %imacro endproc 0 + %ifnctx proc + %error Mismatched `endproc'/`proc' + %else + leave + ret + __end_%$procname: ; useful for calculating function size + %pop + %endif + %endmacro + diff --git a/misc/exebin.mac b/misc/exebin.mac index 8d1eaf8c..89c68898 100644 --- a/misc/exebin.mac +++ b/misc/exebin.mac @@ -1,57 +1,114 @@ ; -*- 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 + |