|
|
1.1 root 1: #include <stdio.h>
2:
3: /* SYNTAX: a.out A B Z */
4: /* e.g. ./a.out 31 32 1 adds 0x31 + 0x32 with Z flag set */
5:
6: typedef unsigned char uint8;
7: typedef signed char sint8;
8: typedef unsigned short uint16;
9: typedef signed short sint16;
10: typedef unsigned int uint32;
11: typedef signed int sint32;
12:
13: int main(int argc, char *argv[])
14: {
15: uint16 a[3];
16:
17: if (argc < 3 ||
18: sscanf(argv[1], "%x", &a[0]) == 0 ||
19: sscanf(argv[2], "%x", &a[1]) == 0 ||
20: sscanf(argv[3], "%x", &a[2]) == 0) {
21: printf("Syntax: <hexval> <hexval> <xflag>\n");
22: exit(1);
23: }
24:
25: uint8 dstdata = a[0];
26: uint8 srcdata = a[1];
27: uint8 XFLAG = a[2];
28: uint8 NFLAG, VFLAG;
29: uint8 CFLAG;
30:
31: uint8 outdata;
32: uint8 outdata_low = (dstdata & 0xF) + (srcdata & 0xF) + XFLAG;
33: uint16 precalc = dstdata + srcdata + XFLAG;
34: uint16 outdata_tmp = precalc;
35:
36: if (outdata_low > 0x09)
37: outdata_tmp+= 0x06;
38: if (outdata_tmp > 0x90) {
39: outdata_tmp+= 0x60;
40: CFLAG = 1;
41: XFLAG = 1;
42: } else {
43: CFLAG = 0;
44: XFLAG = 0;
45: }
46: outdata = outdata_tmp;
47: if (outdata) printf("ZFLAG = 0\n");
48: NFLAG = ((sint8)outdata) < 0;
49: VFLAG = ((precalc & 1<<7) == 0) && (outdata & 1<<7);
50: printf("CFLAG = %d\n", CFLAG);
51: printf("XFLAG = %d\n", XFLAG);
52: printf("NFLAG = %d\n", NFLAG);
53: printf("VFLAG = %d\n", VFLAG);
54: printf("( precalc = %X outdata = %X )\n", precalc, outdata);
55: printf("%X - %X (- %X) = %X\n", dstdata, srcdata, XFLAG, outdata);
56: exit(0);
57: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.