mRegs.c revision a1d73b4b
1#include <unistd.h>
2#include <stdio.h>
3#include <stdlib.h>
4
5#include "iopl.h"
6
7int hex2int(char* str);
8
9int main(int argc, char** argv)
10{
11    int i, value, index = 0;
12    char c, cport;
13    char* str;
14    unsigned int port, port1 = 0;
15    int query = 0;
16
17    if(argc < 2) {
18	printf("usage: %s [Cvvxx [Cvvxx]] [Dxx]\n",argv[0]);
19        printf("     where C = A|a write vv to ARxx\n");
20        printf("             = C|c write vv to CRxx\n");
21        printf("             = F|f write vv to FRxx (6555x only)\n");
22        printf("             = G|g write vv to GRxx\n");
23        printf("             = M|m write vv to MRxx (6555x only)\n");
24        printf("             = S|s write vv to SRxx\n");
25        printf("             = X|x write vv to XRxx\n");
26        printf("     where D = Y|y write xx to FCR\n");
27        printf("             = Z|z write vv to MSR\n");
28        printf("     xx is in hexadecimal\n");
29	printf("     vv is in hexadecimal or '?' for query\n");
30    }
31
32    SET_IOPL();
33
34    for(i = 1; i < argc; i++){
35	value = 0;
36	str = argv[i];
37	c = *str++;
38	switch (c) {
39	  case 'f':
40	  case 'F':
41	    cport = 'F';
42	    port = 0x3D0;
43	    break;
44	  case 'c':
45	  case 'C':
46	    cport = 'C';
47	    port = 0x3D4;
48	    break;
49	  case 'x':
50	  case 'X':
51	    cport = 'X';
52	    port = 0x3D6;
53	    break;
54	  case 'g':
55	  case 'G':
56	    cport = 'G';
57	    port = 0x3CE;
58	    break;
59	  case 'a':
60	  case 'A':
61	    cport = 'A';
62	    port = 0x3C0;
63	    break;
64	  case 's':
65	  case 'S':
66	    cport = 'S';
67	    port = 0x3C4;
68	    break;
69	  case 'm':
70	  case 'M':
71	    cport = 'M';
72	    port = 0x3D2;
73	    break;
74	  case 'y':
75	  case 'Y':
76	    cport = 'Y';
77	    port = 0x3DA;
78            port1 = 0x3CA;
79	    break;
80	  case 'z':
81	  case 'Z':
82	    cport = 'Z';
83	    port = 0x3C2;
84	    port1 = 0x3CC;
85	    break;
86	  default:
87	    continue;
88	    break;
89	}
90	if ((cport != 'Z') && (cport != 'Y')) index = inb(port);
91	while ((c = *str++)) {
92	    if (c == '?') {
93	      query = 1;
94	    }
95	    if(c >= '0' && c <= '9')
96	    value = (value << 4) | (c - '0');  /*ASCII assumed*/
97	    else if(c >= 'A' && c < 'G')
98	    value = (value << 4) | (c - 'A'+10);  /*ASCII assumed*/
99	    else if(c >= 'a' && c < 'g')
100	    value = (value << 4) | (c - 'a'+10);  /*ASCII assumed*/
101	}
102	if ((cport != 'Z') && (cport != 'Y')) outb(port,value&0xFF);
103	if (query) {
104	    if ((cport != 'Z') && (cport != 'Y'))
105		printf("%cR%X: 0x%X\n", cport, value & 0xFF,
106		   inb(port+1)&0xFF);
107	    else
108	        if (cport == 'Z')
109		    printf("MSR: 0x%X\n", inb(port1)&0xFF);
110		else
111		    printf("FCR: 0x%X\n", inb(port1)&0xFF);
112	} else {
113	    if ((cport != 'Z') && (cport != 'Y')) {
114		printf("%cR%X: 0x%X -> 0x%X\n", cport, value & 0xFF,
115		   inb(port+1)&0xFF, (value&0xFF00)>>8);
116		outw(port, value);
117		outb(port, index &0xFF);
118	    } else {
119	        if (cport == 'Z')
120		    printf("MSR: 0x%X -> 0x%X\n", inb(port1)&0xFF, value&0xFF);
121		else
122		    printf("FCR: 0x%X -> 0x%X\n", inb(port1)&0xFF, value&0xFF);
123		outb(port, value & 0xFF);
124	    }
125	}
126    }
127    RESET_IOPL();
128    return 0;
129}
130