split memories away from Pico
[picodrive.git] / pico / cd / memory_arm.S
... / ...
CommitLineData
1@*
2@* Memory I/O handlers for Sega/Mega CD emulation
3@* (C) notaz, 2007-2009
4@*
5@* This work is licensed under the terms of MAME license.
6@* See COPYING file in the top-level directory.
7@*
8
9#include "../pico_int_o32.h"
10
11.equiv PCM_STEP_SHIFT, 11
12
13.text
14.align 2
15
16.global PicoRead8_mcd_io
17.global PicoRead16_mcd_io
18.global PicoWrite8_mcd_io
19.global PicoWrite16_mcd_io
20
21.global PicoReadS68k8_pr
22.global PicoReadS68k16_pr
23.global PicoWriteS68k8_pr
24.global PicoWriteS68k16_pr
25
26.global PicoReadM68k8_cell0
27.global PicoReadM68k8_cell1
28.global PicoReadM68k16_cell0
29.global PicoReadM68k16_cell1
30.global PicoWriteM68k8_cell0
31.global PicoWriteM68k8_cell1
32.global PicoWriteM68k16_cell0
33.global PicoWriteM68k16_cell1
34
35.global PicoReadS68k8_dec0
36.global PicoReadS68k8_dec1
37.global PicoReadS68k16_dec0
38.global PicoReadS68k16_dec1
39.global PicoWriteS68k8_dec_m0b0
40.global PicoWriteS68k8_dec_m1b0
41.global PicoWriteS68k8_dec_m2b0
42.global PicoWriteS68k8_dec_m0b1
43.global PicoWriteS68k8_dec_m1b1
44.global PicoWriteS68k8_dec_m2b1
45.global PicoWriteS68k16_dec_m0b0
46.global PicoWriteS68k16_dec_m1b0
47.global PicoWriteS68k16_dec_m2b0
48.global PicoWriteS68k16_dec_m0b1
49.global PicoWriteS68k16_dec_m1b1
50.global PicoWriteS68k16_dec_m2b1
51
52@ externs, just for reference
53.extern Pico
54.extern cdc_host_r
55.extern m68k_reg_write8
56.extern s68k_reg_read16
57.extern s68k_reg_write8
58.extern s68k_reg_write16
59.extern s68k_poll_detect
60.extern pcd_pcm_write
61.extern pcd_pcm_read
62.extern PicoCpuCS68k
63.extern PicoRead8_io
64.extern PicoRead16_io
65.extern PicoWrite8_io
66.extern PicoWrite16_io
67.extern m68k_comm_check
68
69
70@ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
71
72@ utilities
73
74@ r0=addr[in,out], r1,r2=tmp
75.macro cell_map
76 ands r1, r0, #0x01c000
77 ldrne pc, [pc, r1, lsr #12]
78 beq 0f @ most common?
79 .long 0f
80 .long 0f
81 .long 0f
82 .long 0f
83 .long 1f
84 .long 1f
85 .long 2f
86 .long 3f
871: @ x16 cells
88 and r1, r0, #0x7e00 @ col
89 and r2, r0, #0x01fc @ row
90 orr r2, r2, #0x0400
91 orr r1, r2, r1, ror #13
92 b 9f
932: @ x8 cells
94 and r1, r0, #0x3f00 @ col
95 and r2, r0, #0x00fc @ row
96 orr r2, r2, #0x0600
97 orr r1, r2, r1, ror #12
98 b 9f
993: @ x4 cells
100 and r1, r0, #0x1f80 @ col
101 and r2, r0, #0x007c @ row
102 orr r1, r2, r1, ror #11
103 and r2, r0,#0x1e000
104 orr r1, r1, r2, lsr #6
105 b 9f
1060: @ x32 cells
107 and r1, r0, #0xfc00 @ col
108 and r2, r0, #0x03fc @ row
109 orr r1, r2, r1, ror #14
1109:
111 and r0, r0, #3
112 orr r0, r0, r1, ror #26 @ rol 4+2
113.endm
114
115
116@ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
117
118
119m_read_null:
120 mov r0, #0
121 bx lr
122
123
124PicoReadM68k8_cell0: @ 0x220000 - 0x23ffff, cell arranged
125 mov r3, #0x0c0000
126 b 0f
127
128PicoReadM68k8_cell1: @ 0x220000 - 0x23ffff, cell arranged
129 mov r3, #0x0e0000
1300:
131 cell_map
132 ldr r1, =Pico
133 add r0, r0, r3
134 ldr r1, [r1, #OFS_Pico_rom] @ Pico.mcd (used everywhere)
135 eor r0, r0, #1
136 ldrb r0, [r1, r0]
137 bx lr
138
139
140PicoRead8_mcd_io:
141 and r1, r0, #0xff00
142 cmp r1, #0x2000 @ a120xx?
143 bne PicoRead8_io
144
145 ldr r1, =Pico
146 and r0, r0, #0x3f
147 ldr r1, [r1, #OFS_Pico_rom] @ Pico.mcd
148 cmp r0, #0x0e
149 ldrlt pc, [pc, r0, lsl #2]
150 b m_m68k_read8_hi
151 .long m_m68k_read8_r00
152 .long m_m68k_read8_r01
153 .long m_m68k_read8_r02
154 .long m_m68k_read8_r03
155 .long m_m68k_read8_r04
156 .long m_read_null @ unused bits
157 .long m_m68k_read8_r06
158 .long m_m68k_read8_r07
159 .long m_m68k_read8_r08
160 .long m_m68k_read8_r09
161 .long m_read_null @ reserved
162 .long m_read_null
163 .long m_m68k_read8_r0c
164 .long m_m68k_read8_r0d
165m_m68k_read8_r00:
166 add r1, r1, #0x110000
167 ldr r0, [r1, #0x30]
168 and r0, r0, #0x04000000 @ we need irq2 mask state
169 mov r0, r0, lsr #19
170 bx lr
171m_m68k_read8_r01:
172 add r1, r1, #0x110000
173 add r1, r1, #0x002200
174 ldrb r0, [r1, #2] @ Pico_mcd->m.busreq
175 bx lr
176m_m68k_read8_r02:
177 add r1, r1, #0x110000
178 ldrb r0, [r1, #2]
179 bx lr
180m_m68k_read8_r03:
181 add r1, r1, #0x110000
182 push {r1, lr}
183 bl m68k_comm_check
184 pop {r1, lr}
185 ldrb r0, [r1, #3]
186 and r0, r0, #0xc7
187 bx lr
188m_m68k_read8_r04:
189 add r1, r1, #0x110000
190 ldrb r0, [r1, #4]
191 bx lr
192m_m68k_read8_r06:
193 ldrb r0, [r1, #0x73] @ IRQ vector
194 bx lr
195m_m68k_read8_r07:
196 ldrb r0, [r1, #0x72]
197 bx lr
198m_m68k_read8_r08:
199 mov r0, #0
200 bl cdc_host_r
201 mov r0, r0, lsr #8
202 bx lr
203m_m68k_read8_r09:
204 mov r0, #0
205 b cdc_host_r
206m_m68k_read8_r0c:
207 add r1, r1, #0x110000
208 add r1, r1, #0x002200
209 ldr r0, [r1, #0x14] @ Pico_mcd->m.timer_stopwatch
210 mov r0, r0, lsr #24
211 bx lr
212m_m68k_read8_r0d:
213 add r1, r1, #0x110000
214 add r1, r1, #0x002200
215 ldr r0, [r1, #0x14]
216 mov r0, r0, lsr #16
217 bx lr
218m_m68k_read8_hi:
219 cmp r0, #0x30
220 add r1, r1, #0x110000
221 movge r0, #0
222 bxge lr
223 add r1, r0
224 push {r1, lr}
225 bl m68k_comm_check
226 pop {r1, lr}
227 ldrb r0, [r1]
228 bx lr
229
230
231@ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
232
233
234PicoReadM68k16_cell0: @ 0x220000 - 0x23ffff, cell arranged
235 mov r3, #0x0c0000
236 b 0f
237
238PicoReadM68k16_cell1: @ 0x220000 - 0x23ffff, cell arranged
239 mov r3, #0x0e0000
2400:
241 cell_map
242 ldr r1, =Pico
243 add r0, r0, r3
244 ldr r1, [r1, #OFS_Pico_rom] @ Pico.mcd
245 bic r0, r0, #1
246 ldrh r0, [r1, r0]
247 bx lr
248
249
250PicoRead16_mcd_io:
251 and r1, r0, #0xff00
252 cmp r1, #0x2000 @ a120xx
253 bne PicoRead16_io
254
255m_m68k_read16_m68k_regs:
256 ldr r1, =Pico
257 and r0, r0, #0x3e
258 ldr r1, [r1, #OFS_Pico_rom] @ Pico.mcd
259 cmp r0, #0x0e
260 ldrlt pc, [pc, r0, lsl #1]
261 b m_m68k_read16_hi
262 .long m_m68k_read16_r00
263 .long m_m68k_read16_r02
264 .long m_m68k_read16_r04
265 .long m_m68k_read16_r06
266 .long m_m68k_read16_r08
267 .long m_read_null @ reserved
268 .long m_m68k_read16_r0c
269m_m68k_read16_r00:
270 add r1, r1, #0x110000
271 ldr r0, [r1, #0x30]
272 add r1, r1, #0x002200
273 ldrb r1, [r1, #2] @ Pico_mcd->m.busreq
274 and r0, r0, #0x04000000 @ we need irq2 mask state
275 orr r0, r1, r0, lsr #11
276 bx lr
277m_m68k_read16_r02:
278 add r1, r1, #0x110000
279 push {r1, lr}
280 bl m68k_comm_check
281 pop {r1, lr}
282 ldrb r2, [r1, #3]
283 ldrb r0, [r1, #2]
284 and r2, r2, #0xc7
285 orr r0, r2, r0, lsl #8
286 bx lr
287m_m68k_read16_r04:
288 add r1, r1, #0x110000
289 ldrb r0, [r1, #4]
290 mov r0, r0, lsl #8
291 bx lr
292m_m68k_read16_r06:
293 ldrh r0, [r1, #0x72] @ IRQ vector
294 bx lr
295m_m68k_read16_r08:
296 mov r0, #0
297 b cdc_host_r
298m_m68k_read16_r0c:
299 add r1, r1, #0x110000
300 add r1, r1, #0x002200
301 ldr r0, [r1, #0x14]
302 mov r0, r0, lsr #16
303 bx lr
304m_m68k_read16_hi:
305 cmp r0, #0x30
306 add r1, r1, #0x110000
307 movge r0, #0
308 bxge lr
309
310 add r1, r0, r1
311 push {r1, lr}
312 bl m68k_comm_check
313 pop {r0, lr}
314 ldrh r0, [r0]
315 mov r1, r0, lsr #8
316 and r0, r0, #0xff
317 orr r0, r1, r0, lsl #8
318 bx lr
319
320
321@ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
322
323
324PicoWriteM68k8_cell0: @ 0x220000 - 0x23ffff, cell arranged
325 mov r12,#0x0c0000
326 b 0f
327
328PicoWriteM68k8_cell1: @ 0x220000 - 0x23ffff, cell arranged
329 mov r12,#0x0e0000
3300:
331 mov r3, r1
332 cell_map
333 ldr r2, =Pico
334 add r0, r0, r12
335 ldr r2, [r2, #OFS_Pico_rom] @ Pico.mcd
336 ldr r2, [r2]
337 eor r0, r0, #1
338 strb r3, [r2, r0]
339 bx lr
340
341
342PicoWrite8_mcd_io:
343 and r2, r0, #0xff00
344 cmp r2, #0x2000 @ a120xx?
345 beq m68k_reg_write8
346 b PicoWrite8_io
347
348
349@ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
350
351
352PicoWriteM68k16_cell0: @ 0x220000 - 0x23ffff, cell arranged
353 mov r12, #0x0c0000
354 b 0f
355
356PicoWriteM68k16_cell1: @ 0x220000 - 0x23ffff, cell arranged
357 mov r12, #0x0e0000
3580:
359 mov r3, r1
360 cell_map
361 ldr r1, =Pico
362 add r0, r0, r12
363 ldr r1, [r1, #OFS_Pico_rom] @ Pico.mcd
364 bic r0, r0, #1
365 strh r3, [r1, r0]
366 bx lr
367
368
369PicoWrite16_mcd_io:
370 and r2, r0, #0xff00
371 cmp r2, #0x2000 @ a120xx?
372 bne PicoWrite16_io
373
374m_m68k_write16_regs:
375 and r0, r0, #0x3e
376 cmp r0, #0x0e
377 beq m_m68k_write16_regs_spec
378 and r3, r1, #0xff
379 add r2, r0, #1
380 stmfd sp!,{r2,r3,lr}
381 mov r1, r1, lsr #8
382 bl m68k_reg_write8
383 ldmfd sp!,{r0,r1,lr}
384 b m68k_reg_write8
385
386m_m68k_write16_regs_spec: @ special case
387 mov r1, r1, lsr #8
388 b m68k_reg_write8
389
390
391@ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
392@ Sub 68k
393@ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
394
395
396PicoReadS68k8_dec0: @ 0x080000 - 0x0bffff
397 mov r3, #0x080000 @ + ^ / 2
398 b 0f
399
400PicoReadS68k8_dec1:
401 mov r3, #0x0a0000 @ + ^ / 2
4020:
403 ldr r2, =Pico
404 eor r0, r0, #2
405 ldr r2, [r2, #OFS_Pico_rom] @ Pico.mcd
406 movs r0, r0, lsr #1 @ +4-6 <<16
407 add r2, r2, r3 @ map to our address
408 ldrb r0, [r2, r0]
409 movcc r0, r0, lsr #4
410 andcs r0, r0, #0xf
411 bx lr
412
413
414PicoReadS68k8_pr:
415 and r2, r0, #0xfe00
416 cmp r2, #0x8000
417 bne m_s68k_read8_pcm
418
419m_s68k_read8_regs:
420 bic r0, r0, #0xff0000
421 bic r0, r0, #0x008000
422 sub r2, r0, #0x0e
423 cmp r2, #(0x30-0x0e)
424 blo m_s68k_read8_comm
425 stmfd sp!,{r0,lr}
426 bic r0, r0, #1
427 bl s68k_reg_read16
428 ldmfd sp!,{r1,lr}
429 tst r1, #1
430 moveq r0, r0, lsr #8
431 and r0, r0, #0xff
432 bx lr
433
434m_s68k_read8_comm:
435 ldr r1, =Pico
436 ldr r1, [r1, #OFS_Pico_rom] @ Pico.mcd
437 add r1, r1, #0x110000
438 ldrb r1, [r1, r0]
439 bic r0, r0, #1
440 b s68k_poll_detect
441
442
443m_s68k_read8_pcm:
444 tst r0, #0x8000
445 bne m_read_null
446
447 @ must not trash r3 and r12
448 ldr r1, =Pico
449 bic r0, r0, #0xff0000
450 ldr r1, [r1, #OFS_Pico_rom] @ Pico.mcd
451 mov r2, #0x110000
452 orr r2, r2, #0x002200
453 cmp r0, #0x2000
454 bge m_s68k_read8_pcm_ram
455 cmp r0, #0x20
456 movge r0, r0, lsr #1
457 bge pcd_pcm_read
458 mov r0, #0
459 bx lr
460
461m_s68k_read8_pcm_ram:
462 orr r2, r2, #0x40
463 ldr r2, [r1, r2]
464 add r1, r1, #0x100000 @ pcm_ram
465 and r2, r2, #0x0f000000 @ bank
466 add r1, r1, r2, lsr #12
467 bic r0, r0, #0x00e000
468 mov r0, r0, lsr #1
469 ldrb r0, [r1, r0]
470 bx lr
471
472
473@ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
474
475
476PicoReadS68k16_dec0: @ 0x080000 - 0x0bffff
477 mov r3, #0x080000 @ + ^ / 2
478 b 0f
479
480PicoReadS68k16_dec1:
481 mov r3, #0x0a0000 @ + ^ / 2
4820:
483 ldr r2, =Pico
484 eor r0, r0, #2
485 ldr r2, [r2, #OFS_Pico_rom] @ Pico.mcd
486 mov r0, r0, lsr #1 @ +4-6 <<16
487 add r2, r2, r3 @ map to our address
488 ldrb r0, [r2, r0]
489 orr r0, r0, r0, lsl #4
490 bic r0, r0, #0xf0
491 bx lr
492
493
494PicoReadS68k16_pr:
495 and r2, r0, #0xfe00
496 cmp r2, #0x8000
497 @ pcm is on 8-bit bus, would this be same as byte access?
498 bne m_s68k_read8_pcm
499
500m_s68k_read16_regs:
501 bic r0, r0, #0xff0000
502 bic r0, r0, #0x008000
503 bic r0, r0, #0x000001
504 cmp r0, #8
505 bne s68k_reg_read16
506 mov r0, #1
507 b cdc_host_r
508
509
510@ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
511
512
513.macro m_s68k_write8_2M_decode
514 ldr r2, =Pico
515 eor r0, r0, #2
516 ldr r2, [r2, #OFS_Pico_rom] @ Pico.mcd
517 movs r0, r0, lsr #1 @ +4-6 <<16
518 add r2, r2, r3 @ map to our address
519.endm
520
521PicoWriteS68k8_dec_m2b0: @ overwrite
522 ands r1, r1, #0x0f
523 bxeq lr
524
525PicoWriteS68k8_dec_m0b0:
526 mov r3, #0x080000
527 b 0f
528
529PicoWriteS68k8_dec_m2b1: @ overwrite
530 ands r1, r1, #0x0f
531 bxeq lr
532
533PicoWriteS68k8_dec_m0b1:
534 mov r3, #0x0a0000
5350:
536 m_s68k_write8_2M_decode
537 ldrb r0, [r2, r0]!
538 and r1, r1, #0x0f
539 movcc r1, r1, lsl #4
540 andcc r3, r0, #0x0f
541 andcs r3, r0, #0xf0
542 orr r3, r3, r1
543 strneb r3, [r2]
544 bx lr
545
546PicoWriteS68k8_dec_m1b0: @ underwrite
547 mov r3, #0x080000
548 b 0f
549
550PicoWriteS68k8_dec_m1b1:
551 mov r3, #0x0a0000
5520:
553 ands r1, r1, #0x0f
554 bxeq lr
555 m_s68k_write8_2M_decode
556 ldrb r0, [r2, r0]!
557 movcc r1, r1, lsl #4
558 andcc r3, r0, #0x0f
559 andcs r3, r0, #0xf0
560 teq r3, r0
561 bxne lr
562 orr r3, r3, r1
563 strneb r3, [r2]
564 bx lr
565
566
567PicoWriteS68k8_pr:
568 and r2, r0, #0xfe00
569 cmp r2, #0x8000
570 bne m_s68k_write8_pcm
571
572m_s68k_write8_regs:
573 bic r0, r0, #0xff0000
574 bic r0, r0, #0x008000
575 tst r0, #0x7e00
576 movne r0, #0
577 bxne lr
578 sub r2, r0, #0x59
579 cmp r2, #0x0f
580 bhs s68k_reg_write8
581 bic r0, r0, #1
582 orr r1, r1, r1, lsl #8
583 b s68k_reg_write16
584
585
586m_s68k_write8_pcm:
587 tst r0, #0x8000
588 bxne lr
589 bic r0, r0, #0xff0000
590 cmp r0, #0x12
591 movlt r0, r0, lsr #1
592 blt pcd_pcm_write
593
594 cmp r0, #0x2000
595 bxlt lr
596
597m_s68k_write8_pcm_ram:
598 ldr r3, =Pico
599 bic r0, r0, #0x00e000
600 ldr r3, [r3, #OFS_Pico_rom] @ Pico.mcd
601 mov r0, r0, lsr #1
602 add r2, r3, #0x110000
603 add r2, r2, #0x002200
604 add r2, r2, #0x000040
605 ldr r2, [r2]
606 add r3, r3, #0x100000 @ pcm_ram
607 and r2, r2, #0x0f000000 @ bank
608 add r3, r3, r2, lsr #12
609 strb r1, [r3, r0]
610 bx lr
611
612
613@ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
614
615
616.macro m_s68k_write16_2M_decode
617 ldr r2, =Pico
618 eor r0, r0, #2
619 ldr r2, [r2, #OFS_Pico_rom] @ Pico.mcd
620 mov r0, r0, lsr #1 @ +4-6 <<16
621 add r2, r2, r3 @ map to our address
622.endm
623
624PicoWriteS68k16_dec_m0b0:
625 mov r3, #0x080000
626 b 0f
627
628PicoWriteS68k16_dec_m0b1:
629 mov r3, #0x0a0000
6300:
631 m_s68k_write16_2M_decode
632 bic r1, r1, #0xf0
633 orr r1, r1, r1, lsr #4
634 strb r1, [r2, r0]
635 bx lr
636
637PicoWriteS68k16_dec_m1b0: @ underwrite
638 mov r3, #0x080000
639 b 0f
640
641PicoWriteS68k16_dec_m1b1:
642 mov r3, #0x0a0000
6430:
644 bics r1, r1, #0xf000
645 bicnes r1, r1, #0x00f0
646 bxeq lr
647 orr r1, r1, r1, lsr #4
648 m_s68k_write16_2M_decode
649 ldrb r0, [r2, r0]!
650 and r3, r1, #0x0f
651 and r1, r1, #0xf0
652 tst r0, #0x0f
653 orreq r0, r0, r3
654 tst r0, #0xf0
655 orreq r0, r0, r1
656 strb r0, [r2]
657 bx lr
658
659PicoWriteS68k16_dec_m2b0: @ overwrite
660 mov r3, #0x080000
661 b 0f
662
663PicoWriteS68k16_dec_m2b1:
664 mov r3, #0x0a0000
6650:
666 bics r1, r1, #0xf000
667 bicnes r1, r1, #0x00f0
668 bxeq lr
669 orr r1, r1, r1, lsr #4
670 m_s68k_write16_2M_decode
671 ldrb r0, [r2, r0]!
672 ands r3, r1, #0x0f
673 andne r0, r0, #0xf0
674 orrne r0, r0, r3
675 ands r1, r1, #0xf0
676 andne r0, r0, #0x0f
677 orrne r0, r0, r1
678 strb r0, [r2]
679 bx lr
680
681
682PicoWriteS68k16_pr:
683 and r2, r0, #0xfe00
684 cmp r2, #0x8000
685 bne m_s68k_write8_pcm
686
687m_s68k_write16_regs:
688 bic r0, r0, #0xff0000
689 bic r0, r0, #0x008000
690 bic r0, r0, #1
691 tst r0, #0x7e00
692 movne r0, #0
693 bxne lr
694 cmp r0, #0x0e
695 bne s68k_reg_write16
696
697m_s68k_write16_regs_spec: @ special case
698 ldr r2, =Pico
699 mov r0, #0x110000
700 ldr r2, [r2, #OFS_Pico_rom] @ Pico.mcd
701 add r0, r0, #0x00000f
702 strb r1, [r2, r0] @ if (a == 0xe) s68k_regs[0xf] = d;
703 bx lr
704
705.pool
706
707@ vim:filetype=armasm