mirror of
				https://github.com/KevinMidboe/linguist.git
				synced 2025-10-29 17:50:22 +00:00 
			
		
		
		
	
		
			
				
	
	
		
			92 lines
		
	
	
		
			1.3 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
			
		
		
	
	
			92 lines
		
	
	
		
			1.3 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
# output(): Hello, world.\n
 | 
						|
# mach(): all
 | 
						|
 | 
						|
# Emit hello world while switching back and forth between arm/thumb.
 | 
						|
# ??? Unfinished
 | 
						|
 | 
						|
	.macro invalid
 | 
						|
# This is "undefined" but it's not properly decoded yet.
 | 
						|
	.word 0x07ffffff
 | 
						|
# This is stc which isn't recognized yet.
 | 
						|
	stc 0,cr0,[r0]
 | 
						|
	.endm
 | 
						|
 | 
						|
	.global _start
 | 
						|
_start:
 | 
						|
# Run some simple insns to confirm the engine is at least working.
 | 
						|
	nop
 | 
						|
 | 
						|
# Skip over output text.
 | 
						|
 | 
						|
	bl skip_output
 | 
						|
 | 
						|
hello_text:
 | 
						|
	.asciz "Hello, world.\n"
 | 
						|
 | 
						|
	.p2align 2
 | 
						|
skip_output:
 | 
						|
 | 
						|
# Prime loop.
 | 
						|
 | 
						|
	mov r4, r14
 | 
						|
 | 
						|
output_next:
 | 
						|
 | 
						|
# Switch arm->thumb to output next chacter.
 | 
						|
# At this point r4 must point to the next character to output.
 | 
						|
 | 
						|
	adr r0, into_thumb + 1
 | 
						|
	bx r0
 | 
						|
 | 
						|
into_thumb:
 | 
						|
	.thumb
 | 
						|
 | 
						|
# Output a character.
 | 
						|
 | 
						|
	mov r0,#3 @ writec angel call
 | 
						|
	mov r1,r4
 | 
						|
	swi 0xab @ ??? Confirm number.
 | 
						|
 | 
						|
# Switch thumb->arm.
 | 
						|
 | 
						|
	adr r5, back_to_arm
 | 
						|
	bx r5
 | 
						|
 | 
						|
	.p2align 2
 | 
						|
back_to_arm:
 | 
						|
	.arm
 | 
						|
 | 
						|
# Load next character, see if done.
 | 
						|
 | 
						|
	add r4,r4,#1
 | 
						|
	sub r3,r3,r3
 | 
						|
	ldrb r5,[r4,r3]
 | 
						|
	teq r5,#0
 | 
						|
	beq done
 | 
						|
 | 
						|
# Output a character (in arm mode).
 | 
						|
 | 
						|
	mov r0,#3
 | 
						|
	mov r1,r4
 | 
						|
	swi #0x123456
 | 
						|
 | 
						|
# Load next character, see if done.
 | 
						|
 | 
						|
	add r4,r4,#1
 | 
						|
	sub r3,r3,r3
 | 
						|
	ldrb r5,[r4,r3]
 | 
						|
	teq r5,#0
 | 
						|
	bne output_next
 | 
						|
 | 
						|
done:
 | 
						|
	mov r0,#0x18
 | 
						|
	ldr r1,exit_code
 | 
						|
	swi #0x123456
 | 
						|
 | 
						|
# If that fails, try to die with an invalid insn.
 | 
						|
 | 
						|
	invalid
 | 
						|
 | 
						|
exit_code:
 | 
						|
	.word 0x20026
 |