mirror of
https://git.soft.fish/val/MicroCorruption.git
synced 2024-11-22 23:05:57 +00:00
127 lines
3.4 KiB
C
127 lines
3.4 KiB
C
|
|
||
|
#include "../common/io.c"
|
||
|
#include "../common/lib.c"
|
||
|
|
||
|
typedef u_int8_t u8;
|
||
|
typedef u_int16_t u16;
|
||
|
|
||
|
/*
|
||
|
print_hash_inline:
|
||
|
; for (i (r11) = 0; i != 0x20; i++)
|
||
|
44aa: 0b43 clr r11
|
||
|
pha_loop:
|
||
|
; byte (r14) = hash[i];
|
||
|
44ac: 0f41 mov sp, r15
|
||
|
44ae: 0f5b add r11, r15
|
||
|
44b0: 6e4f mov.b @r15, r14
|
||
|
; lower_nibble (r15) = byte & 0xf;
|
||
|
44b2: 0f4e mov r14, r15
|
||
|
44b4: 3ff0 0f00 and #0xf, r15
|
||
|
; lower_char (r11) = "0123456789ABCDEF"[lower_nibble];
|
||
|
44b8: 5a4f 1047 mov.b 0x4710(r15), r10
|
||
|
; upper_nibble (r14) = (byte >> 0x4) & 0xf;
|
||
|
44bc: 12c3 clrc
|
||
|
44be: 4e10 rrc.b r14
|
||
|
44c0: 12c3 clrc
|
||
|
44c2: 4e10 rrc.b r14
|
||
|
44c4: 12c3 clrc
|
||
|
44c6: 4e10 rrc.b r14
|
||
|
44c8: 12c3 clrc
|
||
|
44ca: 4e10 rrc.b r14
|
||
|
44cc: 3ef0 0f00 and #0xf, r14
|
||
|
; putchar("0123456789ABCDEF"[upper_nibble]);
|
||
|
44d0: 5f4e 1047 mov.b 0x4710(r14), r15
|
||
|
44d4: b012 7845 call #0x4578 <putchar>
|
||
|
; putchar(lower_char)
|
||
|
44d8: 4f4a mov.b r10, r15
|
||
|
44da: b012 7845 call #0x4578 <putchar>
|
||
|
; ... i != 0x20; i++)
|
||
|
44de: 1b53 inc r11
|
||
|
44e0: 3b90 2000 cmp #0x20, r11
|
||
|
44e4: e323 jne #0x44ac <pha_loop>
|
||
|
; puts (""); // prints newline
|
||
|
44e6: 3f40 2147 mov #0x4721, r15
|
||
|
44ea: b012 8645 call #0x4586 <puts>
|
||
|
*/
|
||
|
|
||
|
const char *HEX_LUT = "0123456789ABCDEF";
|
||
|
|
||
|
void main () {
|
||
|
// consts don't need registers
|
||
|
const u16 start = 0, length = 0x40;
|
||
|
// technically a const as well, but
|
||
|
u8 *shabuffer = mem_get(0x8000);
|
||
|
|
||
|
// assemble the shabuffer
|
||
|
|
||
|
/*asm
|
||
|
clr r11 // loop variable in r11
|
||
|
mov #1, r14
|
||
|
mov shabuffer [0x8000], r13
|
||
|
*/
|
||
|
get_sram_hashes:
|
||
|
for (u16 addr = start; addr < length; addr++) {
|
||
|
// we require at least 5 nibbles to determine the value
|
||
|
/*asm
|
||
|
loop:
|
||
|
0f4b mov r11, r15; mov addr r15
|
||
|
b012 b645 call #0x45b6 <sha256_internal>
|
||
|
3d50 0300 add #3, r13
|
||
|
1b53 add 0(r3), r11; inc r11
|
||
|
3b90 0010 cmp #0x1000, r11
|
||
|
jnc loop
|
||
|
|
||
|
*/
|
||
|
sha256_internal (addr, 1, shabuffer + addr * 3);
|
||
|
}
|
||
|
|
||
|
print_hex:
|
||
|
// print the buffer
|
||
|
/*asm
|
||
|
0b43 clr r11;
|
||
|
*/
|
||
|
for (int i = 0; i < length*3; i++) {
|
||
|
/*asm
|
||
|
1e4b 0080 mov 0x8000(r11), r14
|
||
|
*/
|
||
|
u8 lower_nibble = shabuffer[i];
|
||
|
/*asm
|
||
|
5e4b 0080 mov.b 0x8000(r11), r14
|
||
|
4f4e mov.b r14, r15
|
||
|
0f11 rra.b r15
|
||
|
0f11 rra.b r15
|
||
|
0f11 rra.b r15
|
||
|
0f11 rra.b r15
|
||
|
3ef0 0f00 and #0xf, r14
|
||
|
3ff0 0f00 and #0xf, r15
|
||
|
12c3 clrc
|
||
|
*/
|
||
|
u8 upper_nibble = (lower_nibble >> 4) & 0xf;
|
||
|
lower_nibble &= 0xf;
|
||
|
/*asm
|
||
|
5f4f 1047 mov.b 0x4710(r15), r15
|
||
|
b012 7845 call #0x4578; <putchar>
|
||
|
*/
|
||
|
putchar(HEX_LUT[upper_nibble]);
|
||
|
/*asm
|
||
|
5f4e 1047 mov.b 0x4710(r14), r15
|
||
|
b012 7845 call #0x4578; <putchar>
|
||
|
*/
|
||
|
putchar(HEX_LUT[lower_nibble]);
|
||
|
/*asm
|
||
|
1b53 add 0(r3), r11
|
||
|
3b90 c000 cmp #0xC0, r11
|
||
|
e82b jnc $-0x28
|
||
|
|
||
|
*/
|
||
|
}
|
||
|
|
||
|
getsn(mem_get(0x9000), 0x40);
|
||
|
sha256_internal(0, 0x40, 0x9000);
|
||
|
|
||
|
/*asm
|
||
|
3041 ret;
|
||
|
*/
|
||
|
return;
|
||
|
}
|