fork download
  1. #include <iostream>
  2. #include <stdexcept>
  3.  
  4. using namespace std;
  5.  
  6. unsigned char memory[0x1000] = {};
  7.  
  8. const size_t bits_in_byte = 8;
  9. const size_t video_mem_offset = 0xF00;
  10.  
  11. const size_t video_mem_row_bitsize = 0x40;
  12. const size_t video_mem_row_stride =
  13. (video_mem_row_bitsize + (bits_in_byte - 1)) / bits_in_byte;
  14.  
  15. typedef unsigned char video_mem_row[video_mem_row_stride];
  16.  
  17. video_mem_row* video_mem = (video_mem_row*)(memory + video_mem_offset);
  18.  
  19. const size_t video_mem_number_of_rows = 0x20;
  20.  
  21. bool get_video_bit(size_t row, size_t col)
  22. {
  23. if (row >= video_mem_number_of_rows || col > video_mem_row_bitsize)
  24. throw std::invalid_argument("index");
  25. unsigned char* p = &video_mem[row][col / bits_in_byte];
  26. unsigned char mask = ((unsigned char)1) << col % bits_in_byte;
  27. return *p & mask;
  28. }
  29.  
  30. void set_video_bit(size_t row, size_t col, bool value)
  31. {
  32. if (row >= video_mem_number_of_rows || col > video_mem_row_bitsize)
  33. throw std::invalid_argument("index");
  34. unsigned char* p = &video_mem[row][col / bits_in_byte];
  35. unsigned char mask = ((unsigned char)1) << col % bits_in_byte;
  36. if (value)
  37. *p |= mask;
  38. else
  39. *p &= ~mask;
  40. }
  41.  
  42. int main()
  43. {
  44. size_t test_rows = 3;
  45. for (size_t i = 0; i < test_rows; i++)
  46. for (int j = 0; j < video_mem_row_bitsize; j++)
  47. set_video_bit(i, j, (i + j) % 2);
  48.  
  49. bool check_failed = false;
  50. for (size_t k = 0; k < test_rows * video_mem_row_stride; k++)
  51. if (memory[video_mem_offset + k] != (((k / video_mem_row_stride) % 2) ? 0x55 : 0xaa))
  52. check_failed = true;
  53.  
  54. cout << boolalpha << check_failed << endl;
  55. return 0;
  56. }
Success #stdin #stdout 0s 3344KB
stdin
Standard input is empty
stdout
false