131 lines
3.3 KiB
ArmAsm
131 lines
3.3 KiB
ArmAsm
/*******************************************************************************
|
|
HARPtools by Chad D. Kersey, Summer 2011
|
|
********************************************************************************
|
|
|
|
Sample HARP assmebly programs. These should work on anything from a 4x up.
|
|
|
|
*******************************************************************************/
|
|
/* Library: print decimals and strings! */
|
|
.perm x
|
|
|
|
.global
|
|
printhex: ldi %r8, (__WORD * 8);
|
|
ldi %r11, #1;
|
|
shli %r11, %r11, (__WORD*8 - 1);
|
|
printhex_l1: subi %r8, %r8, #4;
|
|
shr %r9, %r7, %r8;
|
|
andi %r9, %r9, #15;
|
|
subi %r10, %r9, #10;
|
|
isneg @p0, %r10;
|
|
notp @p1, @p0;
|
|
@p0 ? addi %r9, %r9, #0x30
|
|
@p1 ? addi %r9, %r10, #0x61
|
|
rtop @p0, %r8;
|
|
st %r9, %r11, #0;
|
|
@p0 ? jmpi printhex_l1;
|
|
ldi %r9, #0x0a;
|
|
st %r9, %r11, #0;
|
|
jmpr %r5;
|
|
|
|
.global
|
|
printfloat: ori %r10, %r5, #0;
|
|
ori %r11, %r7, #0;
|
|
ftoi %r7, %r7;
|
|
jali %r5, printdecint; /* Print whole part */
|
|
|
|
ldi %r8, #1;
|
|
shli %r8, %r8, (__WORD*8 -1 );
|
|
|
|
/* Print dot */
|
|
ldi %r7, #0x2e;
|
|
st %r7, %r8, #0;
|
|
|
|
ldi %r7, #10;
|
|
itof %r7, %r7;
|
|
|
|
ldi %r12, #3
|
|
|
|
pfloop: /* Print next decimal place */
|
|
subi %r12, %r12, #1;
|
|
rtop @p0, %r12;
|
|
fmul %r11, %r11, %r7;
|
|
ftoi %r9, %r11;
|
|
modi %r9, %r9, #10;
|
|
addi %r9, %r9, #0x30;
|
|
st %r9, %r8, #0;
|
|
@p0 ? jmpi pfloop;
|
|
|
|
ldi %r9, #0x0a;
|
|
st %r9, %r8, #0;
|
|
|
|
jmpr %r10;
|
|
|
|
printdecint: ldi %r8, #1;
|
|
shli %r8, %r8, (__WORD*8 - 1);
|
|
and %r6, %r8, %r7;
|
|
rtop @p0, %r6;
|
|
@p0 ? ldi %r6, #0x2d;
|
|
@p0 ? st %r6, %r8, #0;
|
|
@p0 ? neg %r7, %r7;
|
|
ldi %r9, #0;
|
|
printdec_l1: modi %r6, %r7, #10;
|
|
divi %r7, %r7, #10;
|
|
addi %r6, %r6, #0x30;
|
|
st %r6, %r9, digstack;
|
|
addi %r9, %r9, __WORD;
|
|
rtop @p0, %r7;
|
|
@p0 ? jmpi printdec_l1;
|
|
printdec_l2: subi %r9, %r9, __WORD;
|
|
ld %r6, %r9, digstack;
|
|
st %r6, %r8, #0;
|
|
rtop @p0, %r9;
|
|
@p0 ? jmpi printdec_l2;
|
|
|
|
jmpr %r5
|
|
|
|
.global
|
|
printdec: ori %r10, %r5, #0;
|
|
jali %r5, printdecint;
|
|
ldi %r6, #0x0a;
|
|
st %r6, %r8, #0;
|
|
jmpr %r10;
|
|
|
|
.global
|
|
puts: ldi %r8, #1;
|
|
shli %r8, %r8, (__WORD*8 - 1);
|
|
|
|
puts_l: ld %r6, %r7, #0;
|
|
andi %r6, %r6, #0xff;
|
|
rtop @p0, %r6;
|
|
notp @p0, @p0;
|
|
@p0 ? jmpi puts_end;
|
|
st %r6, %r8, #0;
|
|
addi %r7, %r7, #1;
|
|
jmpi puts_l;
|
|
puts_end: jmpr %r5
|
|
|
|
.global
|
|
rand: ldi %r0, #0;
|
|
ld %r0, %r0, rseed;
|
|
mul %r0, %r0, %r0;
|
|
shri %r0, %r0, #8;
|
|
ldi %r9, #0xffff;
|
|
and %r0, %r0, %r9;
|
|
ldi %r9, #0;
|
|
st %r0, %r9, rseed;
|
|
jmpr %r5;
|
|
|
|
.global
|
|
randf: ori %r10, %r5, #0;
|
|
jali %r5, rand;
|
|
ldi %r9, #1;
|
|
shli %r9, %r9, #16;
|
|
itof %r9, %r9;
|
|
itof %r0, %r0;
|
|
fdiv %r0, %r0, %r9;
|
|
jmpr %r10;
|
|
|
|
.perm rw
|
|
rseed: .word 0xface
|
|
digstack: .space 10
|