1;; 2;; This file verifies the compliance with the Motorola specification: 3;; 4;; MOTOROLA STANDARDS 5;; Document #1001, Version 1.0 6;; SPECIFICATION FOR Motorola 8- and 16-Bit ASSEMBLY LANGUAGE INPUT STANDARD 7;; 26, October 1999 8;; 9;; Available at: 10;; 11;; http://www.mcu.motsps.com/dev_tools/hc12/eabi/m8-16alis.pdf 12;; 13;; Lines starting with '#' represent instructions that fail in GAS. 14;; 15;; 16;; Section 8.2 INPUTS 17 ;; Validated within the whole file 18 19;; Section 8.2.1 Character Set 20 ;; TBD 21 22;; Section 8.2.2 Assembly Language Statement 23 ;; Validated within the whole file 24 25;; Section 8.2.3 Comments 26 ; Motorola comment 27 ;; This file is full of comments 28 29;; Section 8.2.5 Location Counter 30 section .text 31 32_start: 33L0: * ; L0 set to 0 (relative to text) 34 ldaa 1,x 35L1: equ * ; L1 set to 2 (relative to text) 36 37;; Section 8.2.6 Sections 38 section .data 39 section .text 40 section empty 41 section .text 42 43;; Section 8.2.7 Expressions 44L2: equ 23 ; Absolute = 0x17 45L3: equ L0-23 ; Simple relocatable 46 47;; Section 8.2.7.1 Primary Expression 48L4: equ 45 ; Numeric = 0x2d 49L5: equ L0 ; Symbolic 50 51;; Section 8.2.7.2 Absolute Expression 52L_txt: ldaa #44 53L_txt2: 54L6: equ -L4 ; unary expr 0xffffffd3 55L7: equ L6+1000 ; binary expr 0x03bb 56L8: equ L6-12 ; 0xffffffc7 57L9: equ L_txt2-L_txt ; reloc - reloc 2 = sizeof(ldaa #44) 58 59;; Section 8.2.7.3 Simple Relocatable Expressions 60L10: equ _start ; symbol 0 + text 61L11: equ L10+23 ; reloc+abs 0x17 + text 62L12: equ L11-4 ; reloc-abs 0x13 + text 63L13: equ L12+L9 ; reloc+abs 0x15 + text 64 65;; Section 8.2.8 Symbols 66 section .text 67Text_Symbol: 68 ldx #Data_Symbol 69 70 section .data 71Data_Symbol: 72 73;; Section 8.2.8.1 Labels 74L_label_shall_be_significant_to_at_least_32_chars: 75 dc.b 1 76L_label_lower: ; Labels are case sensitive 77 dc.b 2 78L_Label_Lower: 79 dc.b 3 80 81;; Section 8.2.9 Constants 82; 83; Section 8.2.9.1 Decimal Constants 84 section .text 85L_constant: 86 ldaa #123 ; -> ldaa #0x7b 87 ldaa #-23 ; -> ldaa #0xe9 88 89;; Section 8.2.9.2 Binary Constants 90 ldab #%10001010 ; -> ldab #0x8A 91 ldab #%0111 ; -> ldab #0x07 92 93;; Section 8.2.9.3 Octal Constants 94 ldaa #@74 ; -> ldaa 0x3c 95 ldaa #@377 ; -> ldaa 0xff 96 97;; Section 8.2.9.4 Hexadecimal Constants 98 ldaa #$ae ; -> ldaa 0xae 99 ldaa #$B2 ; -> ldaa 0xb2 100 101;; Section 8.2.9.5 String Constants 102 section .data 103# ascii '"Single quote string"' 104 ascii "'Double quote string'" 105 106;; Section 8.2.9.6 Floating Point Constants 107;; No specification 108L_float: float 3.241592e-2 109 110;; Section 8.2.10 Operators 111 section .text 112L_operator: 113 ldx #(((1<<3)&(1<<3)|2)<<4)+(4*4-1) 114 ldx #(L2>=23)&1-(L2<=23)&1+(L2==23)&1 ; -> ldx #1 115 ldx #(L2>23)&1-(L2<23)&1+(L2==23)&1 ; -> ldx #0 116 ldx #1-1+1-1+1-1 117 ldab #~L4 ; -> ldab #0xd2 118# ldab #<_start ; force to 8-bit 119# ldx #>_start ; force to 16-bit 120# ldab #page(_start) ; 68HC12 page number of symbol 121 122;; Section 8.2.11 Instructions 123;; Defined by other tests 124 125;; Section 8.2.12 Assembler Directives 126;; 127;; Section 8.2.12.1 Conditional Directives 128;; 129# The specification says we are allowed to have spaces in expressions. 130# This does not work with GAS in mri mode, the instruction 'if L2 < 24' 131# is in fact treated as 'if L2'. 132L_if: 133 if L2<24 ; true 134 ldx #1 ; -> ldx #1 135 else 136 ldx #2 137 endif 138 if L2<23||L2>23||L2==22+1 ; true 139 if L2<23 ; false 140 ldaa #0 141 endif 142 if L2>23 ; false 143 ldaa #1 144 endif 145 if L2 == 23 ; true 146 ldaa #L2+8 ; -> ldaa #31 147 endif 148 if L2+2<23+2 ; false 149 if L2+4>23+4 150 ldaa #1 151 elseif L2==23 152 ldaa #2 153 else 154 ldaa #3 155 endif 156 elseif L2==23 ; true 157 ldaa #4 ; -> ldaa #4 158 else 159 ldaa #5 160 endif 161 endif 162 ifdef L1 ; true 163 ldx #23 ; -> ldx #0x17 164 endif 165 ifndef L_undef ; true 166 ldx #4 ; -> ldx #4 167 endif 168 169;; Section 8.2.12.2 Define Constant -dc 170 section .data 171L_const_data: 172 dc.b (1<<3)|2 ; 0x0a 173 dc.w (1<<9)+2 ; 0x02 0x02 174 dc.l $12345678 175 dc.b 10 176 dc.l (1<<9)*(3<<12) 177# dc.b "Hello" 178# dc.w "World" 179# dc.l "!!!" 180 181;; Section 8.2.12.3 Define Constant Block -dcb 182 dcb.b 3,2 183 dcb.w 2,$55AA 184 dcb.l 2,$12345678 185 dcb.b 10,2 186 dcb.w 5,$55AA 187 dcb.l 2,$12345678 188# dcb.b 4, 12 ; Fails in GAS due to space 189 190;; Section 8.2.12.4 Define Storage - ds 191 ds.b 4 192 ds.w 2 193 ds.l 1 194 ds 2 195 196;; Section 8.2.12.5 Equate Symbol Value - equ 197L_equ1: equ (1<<8)+3 198L_equ2: equ L_equ1*3 199L_equ3: equ L_equ2-L_equ1 200 201;; Section 8.2.12.6 Include File - include 202# include 'malis-include.s' 203# include "malis-include.s" 204 include malis-include.s 205 include malis-include.s 206 207;; Section 8.2.12.7 Origin - org 208 section .text 209# org $100 210 ldaa #23 211# org $200 212 staa 24 213# org $0 214 rts 215 216;; Section 8.2.12.8 Define Section - section 217 section .text 218 ldaa 23 219 220 section .data 221 dc.b 23 222 223;; Section 8.2.12.9 Set Value of Symbol - set 224s1: set 3 225s1: set 4 226s2: set s1+2 227s3: set s2+4 228 229;; Section 8.2.12.10 External Symbol Definition - xdef 230 xdef s1 231 xdef s2 232 xdef entry 233 234;; Section 8.2.12.11 External Symbol Reference - xref 235 section .text 236 xref printf 237 xrefb write 238entry: 239 rts 240 241