From bff9474c3bf7159b16ca2caef6564a887934db43 Mon Sep 17 00:00:00 2001 From: Jose Rodriguez Date: Wed, 18 Oct 2017 22:59:06 +0200 Subject: [PATCH] add headerless mode With the command line flag --headerless the compiler does not generate neither ASM prologue nor epilogue. --- arch/zx48k/backend/__init__.py | 9 ++++++++- tests/functional/headerless.asm | 17 +++++++++++++++++ tests/functional/headerless.bas | 6 ++++++ zxb.py | 3 +++ 4 files changed, 34 insertions(+), 1 deletion(-) create mode 100644 tests/functional/headerless.asm create mode 100644 tests/functional/headerless.bas diff --git a/arch/zx48k/backend/__init__.py b/arch/zx48k/backend/__init__.py index 8dba89589..9dd89269c 100644 --- a/arch/zx48k/backend/__init__.py +++ b/arch/zx48k/backend/__init__.py @@ -201,6 +201,8 @@ def init(): OPTIONS.add_option('heap_start_label', str, 'ZXBASIC_MEM_HEAP') # Labels for HEAP SIZE (might not be used if not needed) OPTIONS.add_option('heap_size_label', str, 'ZXBASIC_HEAP_SIZE') + # Flag for headerless mode (No prologue / epilogue) + OPTIONS.add_option('headerless', bool, False) def new_ASMID(): @@ -402,6 +404,9 @@ def _end(ins): FLAG_end_emitted = True output.append('%s:' % END_LABEL) + if OPTIONS.headerless.value: + return output + ['ret'] + output.append('di') output.append('ld hl, (%s)' % CALL_BACK) output.append('ld sp, hl') @@ -2164,7 +2169,9 @@ def __str__(self): # Program Start routine # ------------------------- def emit_start(): - output = [] + output = list() + if OPTIONS.headerless.value: + return output output.append('org %s' % OPTIONS.org.value) diff --git a/tests/functional/headerless.asm b/tests/functional/headerless.asm new file mode 100644 index 000000000..b49ecb8b4 --- /dev/null +++ b/tests/functional/headerless.asm @@ -0,0 +1,17 @@ + ld a, (_a) + inc a + ld (_a), a + ld hl, 0 + ld b, h + ld c, l +__END_PROGRAM: + ret + +ZXBASIC_USER_DATA: +_a: + DEFB 02h + ; Defines DATA END --> HEAP size is 0 +ZXBASIC_USER_DATA_END EQU ZXBASIC_MEM_HEAP + ; Defines USER DATA Length in bytes +ZXBASIC_USER_DATA_LEN EQU ZXBASIC_USER_DATA_END - ZXBASIC_USER_DATA + END diff --git a/tests/functional/headerless.bas b/tests/functional/headerless.bas new file mode 100644 index 000000000..06fe0c957 --- /dev/null +++ b/tests/functional/headerless.bas @@ -0,0 +1,6 @@ +REM a headerless (no prologuqe in ASM) program +#pragma headerless=true + +DIM a as UByte = 2 +LET a = a + 1 + diff --git a/zxb.py b/zxb.py index 61bbb2de1..a49e97eff 100755 --- a/zxb.py +++ b/zxb.py @@ -141,6 +141,8 @@ def main(args=None): help='Add colon separated list of directories to add to include path. e.g. -I dir1:dir2') parser.add_argument('--strict', action='store_true', help='Enables strict mode. Force explicit type declaration') + parser.add_argument('--headerless', action='store_true', + help='Header-less mode: omit asm prologue and epilogue') parser.add_argument('--version', action='version', version='%(prog)s {0}'.format(VERSION)) options = parser.parse_args(args=args) @@ -166,6 +168,7 @@ def main(args=None): OPTIONS.explicit.value = options.explicit OPTIONS.memory_map.value = options.memory_map OPTIONS.strict.value = options.strict + OPTIONS.headerless.value = options.headerless if options.defines: for i in options.defines: