From 07206f7f2cd1b421ac41eb028ef3e7115cc20ff1 Mon Sep 17 00:00:00 2001 From: Timofey X Date: Fri, 26 Jan 2024 16:53:41 +0700 Subject: [PATCH 1/4] [cocas] Fix templates for CdM-8 and CdM-16 --- cocas/assembler.py | 3 ++- cocas/targets/cdm16/target_instructions.py | 4 ++-- cocas/targets/cdm8/target_instructions.py | 4 ++++ 3 files changed, 8 insertions(+), 3 deletions(-) diff --git a/cocas/assembler.py b/cocas/assembler.py index 442e9f69..7cb8bab8 100644 --- a/cocas/assembler.py +++ b/cocas/assembler.py @@ -38,7 +38,8 @@ def __init__(self, sn: TemplateSectionNode, code_segments: Type[CodeSegmentsInte elif isinstance(line, InstructionNode): if line.mnemonic not in target_instructions.assembly_directives(): - raise Exception('Only "dc" and "ds" allowed in templates') + raise Exception('Only these directives allowed in templates: ' + + ', '.join(target_instructions.assembly_directives())) for seg in target_instructions.assemble_instruction(line, temp_storage): size += seg.size diff --git a/cocas/targets/cdm16/target_instructions.py b/cocas/targets/cdm16/target_instructions.py index a2e9c1f0..8978636d 100644 --- a/cocas/targets/cdm16/target_instructions.py +++ b/cocas/targets/cdm16/target_instructions.py @@ -401,5 +401,5 @@ class Handler: ] @staticmethod - def assembly_directives() -> set[str]: - return super().assembly_directives() + def assembly_directives(): + return {'ds', 'dc', 'db', 'dw'} diff --git a/cocas/targets/cdm8/target_instructions.py b/cocas/targets/cdm8/target_instructions.py index a926d014..abab00fd 100644 --- a/cocas/targets/cdm8/target_instructions.py +++ b/cocas/targets/cdm8/target_instructions.py @@ -251,3 +251,7 @@ class Handler: 'ldi': 0xD0 }) ] + + @staticmethod + def assembly_directives(): + return {'ds', 'dc'} From 3aaf29e1cb5ac411a3327f228bd0db30833b1c38 Mon Sep 17 00:00:00 2001 From: Timofey X Date: Fri, 26 Jan 2024 17:14:15 +0700 Subject: [PATCH 2/4] [cocas] Allow align directive in templates --- cocas/abstract_code_segments.py | 8 ++++++-- cocas/assembler.py | 2 ++ cocas/targets/cdm16/target_instructions.py | 2 +- cocas/targets/cdm8/target_instructions.py | 2 +- 4 files changed, 10 insertions(+), 4 deletions(-) diff --git a/cocas/abstract_code_segments.py b/cocas/abstract_code_segments.py index 6119ef8a..913f44f0 100644 --- a/cocas/abstract_code_segments.py +++ b/cocas/abstract_code_segments.py @@ -58,12 +58,16 @@ def fill(self, object_record: "ObjectSectionRecord", section: "Section", labels: if section.name != '$abs': object_record.alignment = lcm(object_record.alignment, self.alignment) - def update_varying_length(self, pos, section: "Section", labels: dict[str, int], _): + def update_length_without_surroundings(self, pos): new_size = (-pos) % self.alignment if new_size == self.alignment: new_size = 0 - diff = new_size - self.size self.size = new_size + + def update_varying_length(self, pos, section: "Section", labels: dict[str, int], _): + old_size = self.size + self.update_length_without_surroundings(pos) + diff = self.size - old_size self.__class__.update_surroundings(diff, pos, section, labels) return diff diff --git a/cocas/assembler.py b/cocas/assembler.py index 7cb8bab8..3a478adc 100644 --- a/cocas/assembler.py +++ b/cocas/assembler.py @@ -41,6 +41,8 @@ def __init__(self, sn: TemplateSectionNode, code_segments: Type[CodeSegmentsInte raise Exception('Only these directives allowed in templates: ' + ', '.join(target_instructions.assembly_directives())) for seg in target_instructions.assemble_instruction(line, temp_storage): + if isinstance(seg, CodeSegmentsInterface.AlignmentPaddingSegment): + seg.update_length_without_surroundings(size) size += seg.size self.labels['_'] = size diff --git a/cocas/targets/cdm16/target_instructions.py b/cocas/targets/cdm16/target_instructions.py index 8978636d..4e7c13b6 100644 --- a/cocas/targets/cdm16/target_instructions.py +++ b/cocas/targets/cdm16/target_instructions.py @@ -402,4 +402,4 @@ class Handler: @staticmethod def assembly_directives(): - return {'ds', 'dc', 'db', 'dw'} + return {'ds', 'dc', 'db', 'dw', 'align'} diff --git a/cocas/targets/cdm8/target_instructions.py b/cocas/targets/cdm8/target_instructions.py index abab00fd..55ac2690 100644 --- a/cocas/targets/cdm8/target_instructions.py +++ b/cocas/targets/cdm8/target_instructions.py @@ -254,4 +254,4 @@ class Handler: @staticmethod def assembly_directives(): - return {'ds', 'dc'} + return {'ds', 'dc', 'align'} From 8e9d60be5150e0f2cf0c10c013271cbbb3ad3c92 Mon Sep 17 00:00:00 2001 From: Timofey X Date: Sat, 27 Jan 2024 11:58:19 +0700 Subject: [PATCH 3/4] [cocas] Revert "Allow align directive in templates" It might cause problems when adding negative offset fields in template --- cocas/abstract_code_segments.py | 8 ++------ cocas/assembler.py | 2 -- cocas/targets/cdm16/target_instructions.py | 2 +- cocas/targets/cdm8/target_instructions.py | 2 +- 4 files changed, 4 insertions(+), 10 deletions(-) diff --git a/cocas/abstract_code_segments.py b/cocas/abstract_code_segments.py index 913f44f0..6119ef8a 100644 --- a/cocas/abstract_code_segments.py +++ b/cocas/abstract_code_segments.py @@ -58,16 +58,12 @@ def fill(self, object_record: "ObjectSectionRecord", section: "Section", labels: if section.name != '$abs': object_record.alignment = lcm(object_record.alignment, self.alignment) - def update_length_without_surroundings(self, pos): + def update_varying_length(self, pos, section: "Section", labels: dict[str, int], _): new_size = (-pos) % self.alignment if new_size == self.alignment: new_size = 0 + diff = new_size - self.size self.size = new_size - - def update_varying_length(self, pos, section: "Section", labels: dict[str, int], _): - old_size = self.size - self.update_length_without_surroundings(pos) - diff = self.size - old_size self.__class__.update_surroundings(diff, pos, section, labels) return diff diff --git a/cocas/assembler.py b/cocas/assembler.py index 3a478adc..7cb8bab8 100644 --- a/cocas/assembler.py +++ b/cocas/assembler.py @@ -41,8 +41,6 @@ def __init__(self, sn: TemplateSectionNode, code_segments: Type[CodeSegmentsInte raise Exception('Only these directives allowed in templates: ' + ', '.join(target_instructions.assembly_directives())) for seg in target_instructions.assemble_instruction(line, temp_storage): - if isinstance(seg, CodeSegmentsInterface.AlignmentPaddingSegment): - seg.update_length_without_surroundings(size) size += seg.size self.labels['_'] = size diff --git a/cocas/targets/cdm16/target_instructions.py b/cocas/targets/cdm16/target_instructions.py index 4e7c13b6..8978636d 100644 --- a/cocas/targets/cdm16/target_instructions.py +++ b/cocas/targets/cdm16/target_instructions.py @@ -402,4 +402,4 @@ class Handler: @staticmethod def assembly_directives(): - return {'ds', 'dc', 'db', 'dw', 'align'} + return {'ds', 'dc', 'db', 'dw'} diff --git a/cocas/targets/cdm8/target_instructions.py b/cocas/targets/cdm8/target_instructions.py index 55ac2690..abab00fd 100644 --- a/cocas/targets/cdm8/target_instructions.py +++ b/cocas/targets/cdm8/target_instructions.py @@ -254,4 +254,4 @@ class Handler: @staticmethod def assembly_directives(): - return {'ds', 'dc', 'align'} + return {'ds', 'dc'} From e40e34e7e3c19e30b64e55c1fcc66db4126e678a Mon Sep 17 00:00:00 2001 From: Timofey X Date: Sat, 27 Jan 2024 15:00:35 +0700 Subject: [PATCH 4/4] [cocas] Add test of templates for cdm16 --- tests/resources/cdm16/input/template.asm | 44 ++++++++++++++++++++++ tests/resources/cdm16/output/template.yaml | 8 ++++ 2 files changed, 52 insertions(+) create mode 100644 tests/resources/cdm16/input/template.asm create mode 100644 tests/resources/cdm16/output/template.yaml diff --git a/tests/resources/cdm16/input/template.asm b/tests/resources/cdm16/input/template.asm new file mode 100644 index 00000000..87384f80 --- /dev/null +++ b/tests/resources/cdm16/input/template.asm @@ -0,0 +1,44 @@ +asect 0 +main: ext # Declare labels +default_handler: ext # as external + +# Interrupt vector table (IVT) +# Place a vector to program start and +# map all internal exceptions to default_handler +dc main, 0 # Startup/Reset vector +dc default_handler, 0 # Unaligned SP +dc default_handler, 0 # Unaligned PC +dc default_handler, 0 # Invalid instruction +dc default_handler, 0 # Double fault +align 0x80 # Reserve space for the rest + # of IVT + +# Exception handlers section +rsect exc_handlers + +# This handler halts processor +default_handler> + halt + +# Templates +tplate foo +a: ds 7 +b: dc "abcd" +c: db 10 +d: dw 20 +e: ds 984 +f: dc 30 + + +# Main program section +rsect main +main> +ldi r0, foo.a +ldi r1, foo.b +ldi r2, foo.c +ldi r3, foo.d +ldi r4, foo.e +ldi r5, foo.f +ldi r6, foo._ + +end \ No newline at end of file diff --git a/tests/resources/cdm16/output/template.yaml b/tests/resources/cdm16/output/template.yaml new file mode 100644 index 00000000..e20fa68c --- /dev/null +++ b/tests/resources/cdm16/output/template.yaml @@ -0,0 +1,8 @@ +registers: + r0: 0 + r1: 7 + r2: 11 + r3: 12 + r4: 14 + r5: 998 + r6: 1000