1# output(): Hello, world.\n
2# mach(): all
3
4# Emit hello world while switching back and forth between arm/thumb.
5# ??? Unfinished
6
7	.macro invalid
8# This is "undefined" but it's not properly decoded yet.
9	.word 0x07ffffff
10# This is stc which isn't recognized yet.
11	stc 0,cr0,[r0]
12	.endm
13
14	.global _start
15_start:
16# Run some simple insns to confirm the engine is at least working.
17	nop
18
19# Skip over output text.
20
21	bl skip_output
22
23hello_text:
24	.asciz "Hello, world.\n"
25
26	.p2align 2
27skip_output:
28
29# Prime loop.
30
31	mov r4, r14
32
33output_next:
34
35# Switch arm->thumb to output next chacter.
36# At this point r4 must point to the next character to output.
37
38	adr r0, into_thumb + 1
39	bx r0
40
41into_thumb:
42	.thumb
43
44# Output a character.
45
46	mov r0,#3 @ writec angel call
47	mov r1,r4
48	swi 0xab @ ??? Confirm number.
49
50# Switch thumb->arm.
51
52	adr r5, back_to_arm
53	bx r5
54
55	.p2align 2
56back_to_arm:
57	.arm
58
59# Load next character, see if done.
60
61	add r4,r4,#1
62	sub r3,r3,r3
63	ldrb r5,[r4,r3]
64	teq r5,#0
65	beq done
66
67# Output a character (in arm mode).
68
69	mov r0,#3
70	mov r1,r4
71	swi #0x123456
72
73# Load next character, see if done.
74
75	add r4,r4,#1
76	sub r3,r3,r3
77	ldrb r5,[r4,r3]
78	teq r5,#0
79	bne output_next
80
81done:
82	mov r0,#0x18
83	ldr r1,exit_code
84	swi #0x123456
85
86# If that fails, try to die with an invalid insn.
87
88	invalid
89
90exit_code:
91	.word 0x20026
92