URL
https://opencores.org/ocsvn/atlas_core/atlas_core/trunk
Subversion Repositories atlas_core
Compare Revisions
- This comparison shows the changes necessary to convert path
/atlas_core/trunk
- from Rev 24 to Rev 25
- ↔ Reverse comparison
Rev 24 → Rev 25
/asm/atlas_asm.exe
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
/asm/src/main.cpp
826,7 → 826,10
|
int imm = 65535; |
int i = 0; |
int j = 0; |
int offset = 0; |
char temp[32]; |
char num[32]; |
char input_string[32]; |
bool extended = false; |
|
959,8 → 962,89
} |
|
imm = atoi(input_string); // normal immediate |
|
// immediate label-address? |
|
// immediate REALTIVE LOW label-address? |
if ((input_string[0] == 'R') and (input_string[1] == 'L') and (input_string[2] == 'O') and (input_string[3] == 'W') and (input_string[4] == '[')){ |
for(i=5; i<31; i++){ |
if (input_string[i] != ']') |
temp[i-5] = input_string[i]; |
else{ |
temp[i-5] = '\0'; |
break; |
} |
} |
// inline math stuff? |
offset = 0; |
for(i=0; i<31; i++){ |
if ((temp[i] == '+') or (temp[i] == '-')) { |
if (temp[i] == '-') |
offset = -1; |
else |
offset = +1; |
temp[i] = '\0'; // terminate here |
for (j=0; j<(31-i); j++) |
num[j] = temp[i+j+1]; |
offset = offset * atoi(num); |
break; |
} |
} |
if (temp[0] == '#'){ // immediate |
for(i=0; i<31; i++) |
temp[i] = temp[i+1]; |
if (extended == true) |
imm = ((atoi(temp) + offset - line) >> 16) & 255; // low immediate of 32-bit immediate |
else |
imm = (atoi(temp) + offset - line) & 255; // low immediate |
} |
else { // label address |
if (extended == true) |
imm = (((find_offset(temp, -1)-line-1)*2+offset) >> 16) & 255; // low immediate of 32-bit immediate |
else |
imm = ((find_offset(temp, -1)-line-1)*2+offset) & 255; // low immediate |
} |
} |
// immediate REALTIVE HIGH label-address? |
if ((input_string[0] == 'R') and (input_string[1] == 'H') and (input_string[2] == 'I') and (input_string[3] == 'G') and (input_string[4] == 'H') and (input_string[5] == '[')){ |
for(i=6; i<31; i++){ |
if (input_string[i] != ']') |
temp[i-6] = input_string[i]; |
else{ |
temp[i-6] = '\0'; |
break; |
} |
} |
// inline math stuff? |
offset = 0; |
for(i=0; i<31; i++){ |
if ((temp[i] == '+') or (temp[i] == '-')) { |
if (temp[i] == '-') |
offset = -1; |
else |
offset = +1; |
temp[i] = '\0'; // terminate here |
for (j=0; j<(31-i); j++) |
num[j] = temp[i+j+1]; |
offset = offset * atoi(num); |
break; |
} |
} |
if (temp[0] == '#'){ // immediate |
for(i=0; i<31; i++) |
temp[i] = temp[i+1]; |
if (extended == true) |
imm = ((atoi(temp) + offset - line) >> 24) & 255; // high immediate of 32-bit immediate |
else |
imm = ((atoi(temp) + offset - line) >> 8) & 255; // high immediate |
} |
else{ // label address |
if (extended == true) |
imm = (((find_offset(temp, -1)-line-1)*2+offset) >> 24) & 255; // high immediate of 32-bit immediate |
else |
imm = (((find_offset(temp, -1)-line-1)*2+offset) >> 8) & 255; // high immediate |
} |
} |
|
// immediate LOW label-address? |
if ((input_string[0] == 'L') and (input_string[1] == 'O') and (input_string[2] == 'W') and (input_string[3] == '[')){ |
for(i=4; i<31; i++){ |
if (input_string[i] != ']') |
970,21 → 1054,37
break; |
} |
} |
// inline math stuff? |
offset = 0; |
for(i=0; i<31; i++){ |
if ((temp[i] == '+') or (temp[i] == '-')) { |
if (temp[i] == '-') |
offset = -1; |
else |
offset = +1; |
temp[i] = '\0'; // terminate here |
for (j=0; j<(31-i); j++) |
num[j] = temp[i+j+1]; |
offset = offset * atoi(num); |
break; |
} |
} |
if (temp[0] == '#'){ // immediate |
for(i=0; i<31; i++) |
temp[i] = temp[i+1]; |
if (extended == true) |
imm = (atoi(temp) >> 16) & 255; // low immediate of 32-bit immediate |
imm = ((atoi(temp) + offset) >> 16) & 255; // low immediate of 32-bit immediate |
else |
imm = atoi(temp) & 255; // low immediate |
imm = (atoi(temp) + offset) & 255; // low immediate |
} |
else { |
else { // label address |
if (extended == true) |
imm = (((find_offset(temp, -1)-2)*2) >> 16) & 255; // low immediate of 32-bit immediate |
imm = (((find_offset(temp, -1)-2)*2+offset) >> 16) & 255; // low immediate of 32-bit immediate |
else |
imm = ((find_offset(temp, -1)-2)*2) & 255; // low immediate |
imm = ((find_offset(temp, -1)-2)*2+offset) & 255; // low immediate |
} |
} |
// immediate HIGH label-address? |
if ((input_string[0] == 'H') and (input_string[1] == 'I') and (input_string[2] == 'G') and (input_string[3] == 'H') and (input_string[4] == '[')){ |
for(i=5; i<31; i++){ |
if (input_string[i] != ']') |
994,19 → 1094,34
break; |
} |
} |
// inline math stuff? |
offset = 0; |
for(i=0; i<31; i++){ |
if ((temp[i] == '+') or (temp[i] == '-')) { |
if (temp[i] == '-') |
offset = -1; |
else |
offset = +1; |
temp[i] = '\0'; // terminate here |
for (j=0; j<(31-i); j++) |
num[j] = temp[i+j+1]; |
offset = offset * atoi(num); |
break; |
} |
} |
if (temp[0] == '#'){ // immediate |
for(i=0; i<31; i++) |
temp[i] = temp[i+1]; |
if (extended == true) |
imm = (atoi(temp) >> 24) & 255; // high immediate of 32-bit immediate |
imm = ((atoi(temp) + offset) >> 24) & 255; // high immediate of 32-bit immediate |
else |
imm = (atoi(temp) >> 8) & 255; // high immediate |
imm = ((atoi(temp) + offset) >> 8) & 255; // high immediate |
} |
else{ |
else{ // label address |
if (extended == true) |
imm = (((find_offset(temp, -1)-2)*2) >> 24) & 255; // high immediate of 32-bit immediate |
imm = (((find_offset(temp, -1)-2)*2+offset) >> 24) & 255; // high immediate of 32-bit immediate |
else |
imm = (((find_offset(temp, -1)-2)*2) >> 8) & 255; // high immediate |
imm = (((find_offset(temp, -1)-2)*2+offset) >> 8) & 255; // high immediate |
} |
} |
|
1755,7 → 1870,7
int p_size = 0; |
int i = 0; |
|
printf("ATLAS 2k Assembler, Version 2014.03.24\n"); |
printf("ATLAS 2k Assembler, Version 2014.03.28\n"); |
printf("by Stephan Nolting (stnolting@gmail.com), Hanover, Germany\n"); |
printf("www.opencores.org/project,atlas_core\n\n"); |
|
/doc/Atlas 2k Processor Documentary.pdf
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
/software/examples/demo.asm
File deleted
/software/examples/test.asm
File deleted
/software/examples/random_numbers.asm
File deleted
/software/examples/blink_demo/demo.asm
0,0 → 1,48
; ************************************************************************************************************** |
; DEMO - Simple blink test |
; ************************************************************************************************************** |
|
.equ lr r7 ; link register |
|
.equ sys0_core c0 |
.equ sys1_core c1 |
.equ com0_core c2 |
|
|
; ************************************************************************************************************** |
; Exception Vector Table |
; ************************************************************************************************************** |
|
reset_vec: b reset |
x_int0_vec: b x_int0_vec ; freeze |
x_int1_vec: b x_int1_vec ; freeze |
cmd_err_vec: b cmd_err_vec ; freeze |
swi_vec: b swi_vec ; freeze |
|
|
; ************************************************************************************************************** |
; Main Program |
; ************************************************************************************************************** |
reset: clr r0 |
mcr #1, com0_core, r0, #7 ; clear system output |
forever: |
ldil r5, #50 |
bl delay ; wait some time |
|
mcr #1, com0_core, r0, #7 ; read system output |
sft r0, r0, #swp ; swap bytes |
inc r0, r0, #1 ; increment |
ldil r1, #0x0F |
and r0, r0, r1 ; apply 4-bit mask |
sft r0, r0, #swp ; swap bytes again |
mcr #1, com0_core, r0, #7 ; set system output |
|
b forever ; repeat forever |
|
; wait subroutine |
delay: ldil r6, #0xff |
decs r6, r6, #1 |
bne #-1 |
decs r5, r5, #1 |
bne delay |
ret lr |
/software/examples/blink_demo/init.vhd
0,0 → 1,24
000000 => x"bc05", -- B |
000001 => x"bc00", -- B |
000002 => x"bc00", -- B |
000003 => x"bc00", -- B |
000004 => x"bc00", -- B |
000005 => x"2800", -- CLR |
000006 => x"ed0f", -- MCR |
000007 => x"c2b2", -- LDIL |
000008 => x"be09", -- BL |
000009 => x"ed0f", -- MCR |
000010 => x"3c00", -- SFT |
000011 => x"0001", -- INC |
000012 => x"c08f", -- LDIL |
000013 => x"2001", -- AND |
000014 => x"3c00", -- SFT |
000015 => x"ed0f", -- MCR |
000016 => x"bdf7", -- B |
000017 => x"c77f", -- LDIL |
000018 => x"0769", -- DECS |
000019 => x"85ff", -- BNE |
000020 => x"06d9", -- DECS |
000021 => x"85fc", -- BNE |
000022 => x"3470", -- RET |
others => x"0000" -- NOP |
/software/examples/blink_demo/out.bin
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
software/examples/blink_demo/out.bin
Property changes :
Added: svn:mime-type
## -0,0 +1 ##
+application/octet-stream
\ No newline at end of property
Index: software/examples/random_numbers/init.vhd
===================================================================
--- software/examples/random_numbers/init.vhd (nonexistent)
+++ software/examples/random_numbers/init.vhd (revision 25)
@@ -0,0 +1,191 @@
+000000 => x"bc0b", -- B
+000001 => x"bc04", -- B
+000002 => x"bc03", -- B
+000003 => x"bc02", -- B
+000004 => x"bc01", -- B
+000005 => x"be31", -- BL
+000006 => x"c110", -- LDIL
+000007 => x"c901", -- LDIH
+000008 => x"be21", -- BL
+000009 => x"be2d", -- BL
+000010 => x"bc00", -- B
+000011 => x"c12c", -- LDIL
+000012 => x"c901", -- LDIH
+000013 => x"be19", -- BL
+000014 => x"c144", -- LDIL
+000015 => x"c901", -- LDIH
+000016 => x"be19", -- BL
+000017 => x"be34", -- BL
+000018 => x"ec4d", -- MCR
+000019 => x"be23", -- BL
+000020 => x"c160", -- LDIL
+000021 => x"c901", -- LDIH
+000022 => x"be13", -- BL
+000023 => x"be2e", -- BL
+000024 => x"d24f", -- CBR
+000025 => x"ec4e", -- MCR
+000026 => x"be1c", -- BL
+000027 => x"c0b0", -- LDIL
+000028 => x"be1f", -- BL
+000029 => x"c0f8", -- LDIL
+000030 => x"be1d", -- BL
+000031 => x"ee05", -- MRC
+000032 => x"be4a", -- BL
+000033 => x"be15", -- BL
+000034 => x"ec20", -- MRC
+000035 => x"dc0f", -- STB
+000036 => x"b9ea", -- BTS
+000037 => x"bdf6", -- B
+000038 => x"c5ff", -- LDIL
+000039 => x"0270", -- MOV
+000040 => x"bc03", -- B
+000041 => x"29b3", -- CLR
+000042 => x"0270", -- MOV
+000043 => x"7829", -- LDR
+000044 => x"c080", -- LDIL
+000045 => x"ccff", -- LDIH
+000046 => x"2081", -- AND
+000047 => x"3c98", -- SFTS
+000048 => x"8003", -- BEQ
+000049 => x"be0a", -- BL
+000050 => x"bdf9", -- B
+000051 => x"03c0", -- MOV
+000052 => x"343b", -- TEQ
+000053 => x"f707", -- RBAEQ
+000054 => x"0170", -- MOV
+000055 => x"c08d", -- LDIL
+000056 => x"be03", -- BL
+000057 => x"c08a", -- LDIL
+000058 => x"03a0", -- MOV
+000059 => x"ec22", -- MRC
+000060 => x"dc05", -- STB
+000061 => x"b9fe", -- BTS
+000062 => x"ed18", -- MCR
+000063 => x"3470", -- RET
+000064 => x"ec20", -- MRC
+000065 => x"dc8f", -- STBI
+000066 => x"b9fe", -- BTS
+000067 => x"c800", -- LDIH
+000068 => x"3470", -- RET
+000069 => x"0170", -- MOV
+000070 => x"c200", -- LDIL
+000071 => x"c184", -- LDIL
+000072 => x"bff8", -- BL
+000073 => x"c0c6", -- LDIL
+000074 => x"1809", -- CMP
+000075 => x"9003", -- BMI
+000076 => x"c0a0", -- LDIL
+000077 => x"1001", -- SUB
+000078 => x"c0b0", -- LDIL
+000079 => x"1809", -- CMP
+000080 => x"91f8", -- BMI
+000081 => x"c0c6", -- LDIL
+000082 => x"1818", -- CMP
+000083 => x"91f5", -- BMI
+000084 => x"c0b9", -- LDIL
+000085 => x"1818", -- CMP
+000086 => x"a404", -- BLS
+000087 => x"c0c1", -- LDIL
+000088 => x"1809", -- CMP
+000089 => x"a1ef", -- BHI
+000090 => x"0080", -- MOV
+000091 => x"bfe0", -- BL
+000092 => x"c030", -- LDIL
+000093 => x"1090", -- SUB
+000094 => x"c009", -- LDIL
+000095 => x"1809", -- CMP
+000096 => x"a402", -- BLS
+000097 => x"0497", -- DEC
+000098 => x"3e42", -- SFT
+000099 => x"3e42", -- SFT
+000100 => x"3e42", -- SFT
+000101 => x"3e42", -- SFT
+000102 => x"2641", -- ORR
+000103 => x"05b9", -- DECS
+000104 => x"85e0", -- BNE
+000105 => x"3420", -- RET
+000106 => x"0370", -- MOV
+000107 => x"3d42", -- SFT
+000108 => x"3d22", -- SFT
+000109 => x"3d22", -- SFT
+000110 => x"3d22", -- SFT
+000111 => x"be0f", -- BL
+000112 => x"bfcb", -- BL
+000113 => x"3d40", -- SFT
+000114 => x"be0c", -- BL
+000115 => x"bfc8", -- BL
+000116 => x"3d45", -- SFT
+000117 => x"3d25", -- SFT
+000118 => x"3d25", -- SFT
+000119 => x"3d25", -- SFT
+000120 => x"be06", -- BL
+000121 => x"bfc2", -- BL
+000122 => x"0140", -- MOV
+000123 => x"be03", -- BL
+000124 => x"bfbf", -- BL
+000125 => x"3460", -- RET
+000126 => x"c08f", -- LDIL
+000127 => x"2121", -- AND
+000128 => x"c089", -- LDIL
+000129 => x"181a", -- CMP
+000130 => x"8803", -- BCS
+000131 => x"c0b0", -- LDIL
+000132 => x"bc02", -- B
+000133 => x"c0b7", -- LDIL
+000134 => x"0892", -- ADD
+000135 => x"3470", -- RET
+000136 => x"4578", -- .DW
+000137 => x"6365", -- .DW
+000138 => x"7074", -- .DW
+000139 => x"696f", -- .DW
+000140 => x"6e2f", -- .DW
+000141 => x"696e", -- .DW
+000142 => x"7465", -- .DW
+000143 => x"7272", -- .DW
+000144 => x"7570", -- .DW
+000145 => x"7420", -- .DW
+000146 => x"6572", -- .DW
+000147 => x"726f", -- .DW
+000148 => x"7221", -- .DW
+000149 => x"0000", -- .DW
+000150 => x"5261", -- .DW
+000151 => x"6e64", -- .DW
+000152 => x"6f6d", -- .DW
+000153 => x"204e", -- .DW
+000154 => x"756d", -- .DW
+000155 => x"6265", -- .DW
+000156 => x"7220", -- .DW
+000157 => x"4765", -- .DW
+000158 => x"6e65", -- .DW
+000159 => x"7261", -- .DW
+000160 => x"746f", -- .DW
+000161 => x"7200", -- .DW
+000162 => x"456e", -- .DW
+000163 => x"7465", -- .DW
+000164 => x"7220", -- .DW
+000165 => x"4c46", -- .DW
+000166 => x"5352", -- .DW
+000167 => x"2073", -- .DW
+000168 => x"6565", -- .DW
+000169 => x"6420", -- .DW
+000170 => x"2834", -- .DW
+000171 => x"6865", -- .DW
+000172 => x"7829", -- .DW
+000173 => x"3a20", -- .DW
+000174 => x"3078", -- .DW
+000175 => x"0000", -- .DW
+000176 => x"456e", -- .DW
+000177 => x"7465", -- .DW
+000178 => x"7220", -- .DW
+000179 => x"4c46", -- .DW
+000180 => x"5352", -- .DW
+000181 => x"2074", -- .DW
+000182 => x"6170", -- .DW
+000183 => x"7320", -- .DW
+000184 => x"2834", -- .DW
+000185 => x"6865", -- .DW
+000186 => x"7829", -- .DW
+000187 => x"3a20", -- .DW
+000188 => x"3078", -- .DW
+000189 => x"0000", -- .DW
+others => x"0000" -- NOP
\ No newline at end of file
Index: software/examples/random_numbers/random_numbers.asm
===================================================================
--- software/examples/random_numbers/random_numbers.asm (nonexistent)
+++ software/examples/random_numbers/random_numbers.asm (revision 25)
@@ -0,0 +1,301 @@
+; **************************************************************************************************************
+; Print Random Numbers - LFSR Test
+;
+; Print random hex numbers from the LFSR via UART
+; Uses BAUD rate from bootloader config!!!
+; **************************************************************************************************************
+
+
+; **************************************************************************************************************
+; Defintions
+; **************************************************************************************************************
+
+.equ sys0_core c0
+.equ com0_core c2
+.equ lr r7 ; link register
+
+
+; **************************************************************************************************************
+; Exception Vector Table
+; **************************************************************************************************************
+
+reset_vec: b reset
+x_int0_vec: b err_handler
+x_int1_vec: b err_handler
+cmd_err_vec: b err_handler
+swi_vec: b err_handler
+
+
+; **************************************************************************************************************
+; IRQ/SWI/CMD_ERR: Terminate
+; **************************************************************************************************************
+
+err_handler: bl uart_linebreak
+ ldil r2, low[err_string]
+ ldih r2, high[err_string]
+ bl uart_print
+ bl uart_linebreak
+ b #+0 ; freeze
+
+
+; **************************************************************************************************************
+; Main Program
+; **************************************************************************************************************
+
+reset: ; print intro
+ ldil r2, low[string_intro]
+ ldih r2, high[string_intro]
+ bl uart_print_br
+
+restart: ; get seed
+ ldil r2, low[string_seed]
+ ldih r2, high[string_seed]
+ bl uart_print
+ bl receive_hex_word
+ mcr #1, sys0_core, r4, #5 ; set lfsr data register
+ bl uart_linebreak
+
+ ; get taps
+ ldil r2, low[string_taps]
+ ldih r2, high[string_taps]
+ bl uart_print
+ bl receive_hex_word
+ cbr r4, r4, #15 ; new value after read access
+ mcr #1, sys0_core, r4, #6 ; set lfsr polynomial register
+ bl uart_linebreak
+
+ ; read and print hex random numbers
+forever: ldil r1, #'0'
+ bl uart_sendbyte
+ ldil r1, #'x'
+ bl uart_sendbyte
+
+ ; get and print
+ mrc #1, r4, sys0_core, #5 ; get lfsr data
+ bl print_hex_string
+ bl uart_linebreak
+
+ ; user console interrupt?
+ mrc #1, r0, com0_core, #0 ; get uart RTX register
+ stb r0, #15 ; copy uart rx_ready flag to T-flag
+ bts restart
+
+ ; repeat forever
+ b forever
+
+
+; **************************************************************************************************************
+; Communication Subroutines
+; **************************************************************************************************************
+
+
+; --------------------------------------------------------------------------------------------------------
+; Print char-string (bytes) via CP0.COM_0.UART and send linebreak
+; Arguments: r2 = address of string (string must be zero-terminated!)
+; Results: -
+; Used registers: r0, r1, r2, r3, r4, lr
+uart_print_br:
+; --------------------------------------------------------------------------------------------------------
+ ldil r3, #0xFF
+ mov r4, lr
+ b uart_print_loop
+
+
+; --------------------------------------------------------------------------------------------------------
+; Print char-string (bytes) via CP0.COM_0.UART
+; Arguments: r2 = address of string (string must be zero-terminated!)
+; Results: -
+; Used registers: r0, r1, r2, r3, r4, lr
+uart_print:
+; --------------------------------------------------------------------------------------------------------
+ clr r3
+ mov r4, lr
+
+uart_print_loop:
+ ldr r0, r2, +#1, post, ! ; get one string byte
+ ldil r1, #0x00 ; upper byte mask
+ ldih r1, #0xFF
+ and r1, r0, r1
+ sfts r1, r1, #swp ; swap bytes and test if zero
+ beq uart_print_loop_end
+ bl uart_sendbyte
+ b uart_print_loop
+
+uart_print_loop_end:
+ mov lr, r4
+ teq r3, r3 ; do linebreak?
+ rbaeq lr
+; b uart_linebreak
+
+
+; --------------------------------------------------------------------------------------------------------
+; Print linebreak
+; Arguments: -
+; Results: -
+; Used registers: r0, r1, r2, lr
+uart_linebreak:
+; --------------------------------------------------------------------------------------------------------
+ mov r2, lr
+ ldil r1, #0x0D ; carriage return
+ bl uart_sendbyte
+ ldil r1, #0x0A ; line feed
+ mov lr, r2
+; b uart_sendbyte
+
+
+; --------------------------------------------------------------------------------------------------------
+; Print char (byte) via CP0.COM_0.UART
+; Arguments: r1 = char (low byte)
+; Results: -
+; Used registers: r0, r1
+uart_sendbyte:
+; --------------------------------------------------------------------------------------------------------
+ mrc #1, r0, com0_core, #2 ; get com control register
+ stb r0, #5 ; copy uart tx_busy flag to T-flag
+ bts uart_sendbyte ; still set, keep on waiting
+ mcr #1, com0_core, r1, #0 ; send data
+ ret lr
+
+
+; --------------------------------------------------------------------------------------------------------
+; Receive a byte via CP0.COM_0.UART
+; Arguments: -
+; Results: r0 (low byte)
+; Used registers: r0
+uart_receivebyte:
+; --------------------------------------------------------------------------------------------------------
+ mrc #1, r0, com0_core, #0 ; get uart status/data register
+ stbi r0, #15 ; copy inverted uart rx_ready flag to T-flag
+ bts uart_receivebyte ; nothing received, keep on waiting
+ ldih r0, #0x00 ; clear upper byte
+ ret lr
+
+
+; --------------------------------------------------------------------------------------------------------
+; Reads 16 bit data as 4x hex chars via UART (+ECHO)
+; Arguments: -
+; Results:
+; r4 = data
+; Used registers: r0, r1, r2, r3, r4, lr
+receive_hex_word:
+; --------------------------------------------------------------------------------------------------------
+ mov r2, lr ; backup link regsiter
+ ldil r4, #0 ; clear data register
+ ldil r3, #4 ; number of chars
+
+receive_hex_word_loop:
+ bl uart_receivebyte ; get one char
+
+ ; convert to higher case
+ ldil r1, #'F'
+ cmp r0, r1
+ bmi #+3 ; skip decrement
+ ldil r1, #32 ; -> to lower case
+ sub r0, r0, r1
+
+ ; is valid?
+ ldil r1, #'0'
+ cmp r0, r1
+ bmi receive_hex_word_loop ; if less than '0'
+
+ ldil r1, #'F'
+ cmp r1, r0
+ bmi receive_hex_word_loop ; if higher than 'F'
+
+ ldil r1, #'9'
+ cmp r1, r0
+ bls receive_hex_word_echo ; if less than '9'
+
+ ldil r1, #'A'
+ cmp r0, r1
+ bhi receive_hex_word_loop ; if less than 'A'
+
+ ; echo char
+receive_hex_word_echo:
+ mov r1, r0
+ bl uart_sendbyte
+
+ ; do conversion
+ ldil r0, #'0'
+ sub r1, r1, r0
+ ldil r0, #9
+ cmp r0, r1
+ bls #+2 ; 0..9 -> ok
+ dec r1, r1, #7 ; 'A' - '0' - 10 = 7 -> A..F -> ok
+
+ ; save conversion data
+ sft r4, r4, #rol
+ sft r4, r4, #rol
+ sft r4, r4, #rol
+ sft r4, r4, #rol
+ orr r4, r4, r1
+
+ ; loop controller
+ decs r3, r3, #1
+ bne receive_hex_word_loop
+
+ ret r2 ; return
+
+
+; --------------------------------------------------------------------------------------------------------
+; Prints 16bit data as 4x char hex value
+; Arguments:
+; r4 = data
+; Results: -
+; Used registers: r0, r1, r2, r3, r4, r6, lr
+print_hex_string:
+; --------------------------------------------------------------------------------------------------------
+ mov r6, lr ; backup link regiiter
+
+ ; char 3
+ sft r2, r4, #rol
+ sft r2, r2, #rol
+ sft r2, r2, #rol
+ sft r2, r2, #rol
+ bl conv_hex_comp
+ bl uart_sendbyte
+
+ ; char 2
+ sft r2, r4, #swp
+ bl conv_hex_comp
+ bl uart_sendbyte
+
+ ; char 1
+ sft r2, r4, #lsr
+ sft r2, r2, #lsr
+ sft r2, r2, #lsr
+ sft r2, r2, #lsr
+ bl conv_hex_comp
+ bl uart_sendbyte
+
+ ; char 0
+ mov r2, r4
+ bl conv_hex_comp
+ bl uart_sendbyte
+
+ ret r6
+
+; compute hex-char from 4-bit value of r2, result in r1
+conv_hex_comp: ldil r1, #0x0f ; mask for lowest 4 bit
+ and r2, r2, r1
+
+ ldil r1, #9
+ cmp r1, r2
+ bcs #+3
+
+ ldil r1, #48 ; this is a '0'
+ b #+2
+ ldil r1, #55 ; this is an 'A'-10
+ add r1, r1, r2 ; resulting char in lower byte
+ ret lr
+
+
+; **************************************************************************************************************
+; Constants
+; **************************************************************************************************************
+
+; -- strings --
+err_string: .stringz "Exception/interrupt error!"
+string_intro: .stringz "Random Number Generator"
+string_seed: .stringz "Enter LFSR seed (4hex): 0x"
+string_taps: .stringz "Enter LFSR taps (4hex): 0x"
Index: software/examples/random_numbers/out.bin
===================================================================
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Index: software/examples/random_numbers/out.bin
===================================================================
--- software/examples/random_numbers/out.bin (nonexistent)
+++ software/examples/random_numbers/out.bin (revision 25)
software/examples/random_numbers/out.bin
Property changes :
Added: svn:mime-type
## -0,0 +1 ##
+application/octet-stream
\ No newline at end of property