mirror of
https://github.com/ioacademy-jikim/debugging
synced 2025-06-11 09:56:29 +00:00
80 lines
1.9 KiB
C
80 lines
1.9 KiB
C
#include <stdio.h>
|
|
|
|
#define get_cc() \
|
|
({ \
|
|
char __cc; \
|
|
/* don't use IPM to better test spechelpers */ \
|
|
asm volatile( "brc 8,1f\n\t" \
|
|
"brc 4,2f\n\t" \
|
|
"brc 2,3f\n\t" \
|
|
"brc 1,4f\n\t" \
|
|
"mvi %0,4\n\t" \
|
|
"j 0f\n\t" \
|
|
"1: mvi %0,0\n\t" \
|
|
"j 0f\n\t" \
|
|
"2: mvi %0,1\n\t" \
|
|
"j 0f\n\t" \
|
|
"3: mvi %0,2\n\t" \
|
|
"j 0f\n\t" \
|
|
"4: mvi %0,3\n\t" \
|
|
"j 0f\n\t" \
|
|
"0: /* nop */ brc 0,0\n\t" \
|
|
: "=m" (__cc) : : "memory"); \
|
|
__cc; \
|
|
})
|
|
|
|
void check_cc(int value, int cc)
|
|
{
|
|
if (cc != value) {
|
|
printf("wrong cc: ");
|
|
if (value == 0) printf("expected 0 ");
|
|
if (value == 1) printf("expected 1 ");
|
|
if (value == 2) printf("expected 2 ");
|
|
if (value == 3) printf("expected 3 ");
|
|
if (cc == 0) printf("got 0");
|
|
if (cc == 1) printf("got 1");
|
|
if (cc == 2) printf("got 2");
|
|
if (cc == 3) printf("got 3");
|
|
} else {
|
|
printf("OK");
|
|
}
|
|
printf("\n");
|
|
}
|
|
|
|
void tm(void)
|
|
{
|
|
unsigned char v;
|
|
|
|
/* test #1: value is zero */
|
|
v = 0;
|
|
asm volatile( "tm %[v],15\n\t" : : [v] "R"(v) : "cc");
|
|
check_cc(0, get_cc());
|
|
|
|
/* test #2: mask is zero */
|
|
v = 0xFF;
|
|
asm volatile( "tm %[v],0\n\t" : : [v] "R"(v) : "cc");
|
|
check_cc(0, get_cc());
|
|
|
|
/* test #3: selected bits are 0 */
|
|
v = 0x0F;
|
|
asm volatile( "tm %[v],0xf0\n\t" : : [v] "R"(v) : "cc");
|
|
check_cc(0, get_cc());
|
|
|
|
/* test #4: selected bits are all 1 */
|
|
v = 0xF0;
|
|
asm volatile( "tm %[v],0x70\n\t" : : [v] "R"(v) : "cc");
|
|
check_cc(3, get_cc());
|
|
|
|
/* test #5: selected bits are mixed */
|
|
v = 0x0F;
|
|
asm volatile( "tm %[v],0x81\n\t" : : [v] "R"(v) : "cc");
|
|
check_cc(1, get_cc());
|
|
}
|
|
|
|
int main(void)
|
|
{
|
|
tm();
|
|
|
|
return 0;
|
|
}
|