mRegs.c 3.0 KB

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