| ;; |
| ;; This file verifies the compliance with the Motorola specification: |
| ;; |
| ;; MOTOROLA STANDARDS |
| ;; Document #1001, Version 1.0 |
| ;; SPECIFICATION FOR Motorola 8- and 16-Bit ASSEMBLY LANGUAGE INPUT STANDARD |
| ;; 26, October 1999 |
| ;; |
| ;; Available at: |
| ;; |
| ;; http://www.mcu.motsps.com/dev_tools/hc12/eabi/m8-16alis.pdf |
| ;; |
| ;; Lines starting with '#' represent instructions that fail in GAS. |
| ;; |
| ;; |
| ;; Section 8.2 INPUTS |
| ;; Validated within the whole file |
| |
| ;; Section 8.2.1 Character Set |
| ;; TBD |
| |
| ;; Section 8.2.2 Assembly Language Statement |
| ;; Validated within the whole file |
| |
| ;; Section 8.2.3 Comments |
| ; Motorola comment |
| ;; This file is full of comments |
| |
| ;; Section 8.2.5 Location Counter |
| section .text |
| |
| _start: |
| L0: * ; L0 set to 0 (relative to text) |
| ldaa 1,x |
| L1: equ * ; L1 set to 2 (relative to text) |
| |
| ;; Section 8.2.6 Sections |
| section .data |
| section .text |
| section empty |
| section .text |
| |
| ;; Section 8.2.7 Expressions |
| L2: equ 23 ; Absolute = 0x17 |
| L3: equ L0-23 ; Simple relocatable |
| |
| ;; Section 8.2.7.1 Primary Expression |
| L4: equ 45 ; Numeric = 0x2d |
| L5: equ L0 ; Symbolic |
| |
| ;; Section 8.2.7.2 Absolute Expression |
| L_txt: ldaa #44 |
| L_txt2: |
| L6: equ -L4 ; unary expr 0xffffffd3 |
| L7: equ L6+1000 ; binary expr 0x03bb |
| L8: equ L6-12 ; 0xffffffc7 |
| L9: equ L_txt2-L_txt ; reloc - reloc 2 = sizeof(ldaa #44) |
| |
| ;; Section 8.2.7.3 Simple Relocatable Expressions |
| L10: equ _start ; symbol 0 + text |
| L11: equ L10+23 ; reloc+abs 0x17 + text |
| L12: equ L11-4 ; reloc-abs 0x13 + text |
| L13: equ L12+L9 ; reloc+abs 0x15 + text |
| |
| ;; Section 8.2.8 Symbols |
| section .text |
| Text_Symbol: |
| ldx #Data_Symbol |
| |
| section .data |
| Data_Symbol: |
| |
| ;; Section 8.2.8.1 Labels |
| L_label_shall_be_significant_to_at_least_32_chars: |
| dc.b 1 |
| L_label_lower: ; Labels are case sensitive |
| dc.b 2 |
| L_Label_Lower: |
| dc.b 3 |
| |
| ;; Section 8.2.9 Constants |
| ; |
| ; Section 8.2.9.1 Decimal Constants |
| section .text |
| L_constant: |
| ldaa #123 ; -> ldaa #0x7b |
| ldaa #-23 ; -> ldaa #0xe9 |
| |
| ;; Section 8.2.9.2 Binary Constants |
| ldab #%10001010 ; -> ldab #0x8A |
| ldab #%0111 ; -> ldab #0x07 |
| |
| ;; Section 8.2.9.3 Octal Constants |
| ldaa #@74 ; -> ldaa 0x3c |
| ldaa #@377 ; -> ldaa 0xff |
| |
| ;; Section 8.2.9.4 Hexadecimal Constants |
| ldaa #$ae ; -> ldaa 0xae |
| ldaa #$B2 ; -> ldaa 0xb2 |
| |
| ;; Section 8.2.9.5 String Constants |
| section .data |
| # ascii '"Single quote string"' |
| ascii "'Double quote string'" |
| |
| ;; Section 8.2.9.6 Floating Point Constants |
| ;; No specification |
| L_float: float 3.241592e-2 |
| |
| ;; Section 8.2.10 Operators |
| section .text |
| L_operator: |
| ldx #(((1<<3)&(1<<3)|2)<<4)+(4*4-1) |
| ldx #(L2>=23)&1-(L2<=23)&1+(L2==23)&1 ; -> ldx #1 |
| ldx #(L2>23)&1-(L2<23)&1+(L2==23)&1 ; -> ldx #0 |
| ldx #1-1+1-1+1-1 |
| ldab #~L4 ; -> ldab #0xd2 |
| # ldab #<_start ; force to 8-bit |
| # ldx #>_start ; force to 16-bit |
| # ldab #page(_start) ; 68HC12 page number of symbol |
| |
| ;; Section 8.2.11 Instructions |
| ;; Defined by other tests |
| |
| ;; Section 8.2.12 Assembler Directives |
| ;; |
| ;; Section 8.2.12.1 Conditional Directives |
| ;; |
| # The specification says we are allowed to have spaces in expressions. |
| # This does not work with GAS in mri mode, the instruction 'if L2 < 24' |
| # is in fact treated as 'if L2'. |
| L_if: |
| if L2<24 ; true |
| ldx #1 ; -> ldx #1 |
| else |
| ldx #2 |
| endif |
| if L2<23||L2>23||L2==22+1 ; true |
| if L2<23 ; false |
| ldaa #0 |
| endif |
| if L2>23 ; false |
| ldaa #1 |
| endif |
| if L2 == 23 ; true |
| ldaa #L2+8 ; -> ldaa #31 |
| endif |
| if L2+2<23+2 ; false |
| if L2+4>23+4 |
| ldaa #1 |
| elseif L2==23 |
| ldaa #2 |
| else |
| ldaa #3 |
| endif |
| elseif L2==23 ; true |
| ldaa #4 ; -> ldaa #4 |
| else |
| ldaa #5 |
| endif |
| endif |
| ifdef L1 ; true |
| ldx #23 ; -> ldx #0x17 |
| endif |
| ifndef L_undef ; true |
| ldx #4 ; -> ldx #4 |
| endif |
| |
| ;; Section 8.2.12.2 Define Constant -dc |
| section .data |
| L_const_data: |
| dc.b (1<<3)|2 ; 0x0a |
| dc.w (1<<9)+2 ; 0x02 0x02 |
| dc.l $12345678 |
| dc.b 10 |
| dc.l (1<<9)*(3<<12) |
| # dc.b "Hello" |
| # dc.w "World" |
| # dc.l "!!!" |
| |
| ;; Section 8.2.12.3 Define Constant Block -dcb |
| dcb.b 3,2 |
| dcb.w 2,$55AA |
| dcb.l 2,$12345678 |
| dcb.b 10,2 |
| dcb.w 5,$55AA |
| dcb.l 2,$12345678 |
| # dcb.b 4, 12 ; Fails in GAS due to space |
| |
| ;; Section 8.2.12.4 Define Storage - ds |
| ds.b 4 |
| ds.w 2 |
| ds.l 1 |
| ds 2 |
| |
| ;; Section 8.2.12.5 Equate Symbol Value - equ |
| L_equ1: equ (1<<8)+3 |
| L_equ2: equ L_equ1*3 |
| L_equ3: equ L_equ2-L_equ1 |
| |
| ;; Section 8.2.12.6 Include File - include |
| # include 'malis-include.s' |
| # include "malis-include.s" |
| include malis-include.s |
| include malis-include.s |
| |
| ;; Section 8.2.12.7 Origin - org |
| section .text |
| # org $100 |
| ldaa #23 |
| # org $200 |
| staa 24 |
| # org $0 |
| rts |
| |
| ;; Section 8.2.12.8 Define Section - section |
| section .text |
| ldaa 23 |
| |
| section .data |
| dc.b 23 |
| |
| ;; Section 8.2.12.9 Set Value of Symbol - set |
| s1: set 3 |
| s1: set 4 |
| s2: set s1+2 |
| s3: set s2+4 |
| |
| ;; Section 8.2.12.10 External Symbol Definition - xdef |
| xdef s1 |
| xdef s2 |
| xdef entry |
| |
| ;; Section 8.2.12.11 External Symbol Reference - xref |
| section .text |
| xref printf |
| xrefb write |
| entry: |
| rts |
| |