PageRenderTime 40ms CodeModel.GetById 15ms RepoModel.GetById 0ms app.codeStats 0ms

/main.cpp

https://gitlab.com/kudze/os_lab_02
C++ | 148 lines | 105 code | 37 blank | 6 comment | 3 complexity | e139de2ac1760c86f029dbd675278779 MD5 | raw file
  1. #include "src/real_machine.h"
  2. #include <iostream>
  3. #include <cmath>
  4. #include <cstring>
  5. using namespace std;
  6. void greet() {
  7. cout
  8. << "VU OS Laboratorinis 02." << endl
  9. << endl
  10. << "Credits: " << endl
  11. << "* Gediminas Kripas" << endl
  12. << "* Karolis Kraujelis" << endl << endl;
  13. }
  14. void writeStringToMemoryBlock(const char* message, block_address_t blockAddress, MemoryInterface* memory)
  15. {
  16. auto message_len = strlen(message);
  17. if(message_len >= 64)
  18. throw std::invalid_argument("writeStringToMemoryBlock message length should be less than 64");
  19. auto msg_ptr = reinterpret_cast<const memory_word_t *>(message);
  20. auto wordsToWrite = (word_address_t) ceil(message_len / 4.f);
  21. for(word_address_t i = 0; i < wordsToWrite; i++)
  22. memory->writeWord(blockAddress, i, msg_ptr[i]);
  23. for(word_address_t i = wordsToWrite; i < MEMORY_BLOCK_SIZE; i++)
  24. memory->writeWord(blockAddress, i, 0x00000000);
  25. }
  26. #define OS_PROCEDURE_START_VM_OFFSET SUPERVISOR_CODE_SEGMENT_OFFSET + 1
  27. void writeOS(RealMachine* machine)
  28. {
  29. auto memory = machine->getMemory();
  30. writeStringToMemoryBlock("Welcome from dummy OS", MEMORY_SUPERVISOR_BLOCK_OFFSET + SUPERVISOR_DATA_SEGMENT_OFFSET, memory);
  31. writeStringToMemoryBlock("Which program to load? [0-9]", MEMORY_SUPERVISOR_BLOCK_OFFSET + SUPERVISOR_DATA_SEGMENT_OFFSET + 1, memory);
  32. //int main();
  33. memory->writeSupervisorWord(SUPERVISOR_CODE_SEGMENT_OFFSET, 0, 0xF0000000); //PB [0]
  34. memory->writeSupervisorWord(SUPERVISOR_CODE_SEGMENT_OFFSET, 1, 0xF0010000); //PB [1]
  35. memory->writeSupervisorWord(SUPERVISOR_CODE_SEGMENT_OFFSET, 2, 0xF6020000); //GB [2]
  36. memory->writeSupervisorWord(SUPERVISOR_CODE_SEGMENT_OFFSET, 3, 0xAD020000); //LW R1 [2 0]
  37. memory->writeSupervisorWord(SUPERVISOR_CODE_SEGMENT_OFFSET, 4, 0xAB010000); //LW R2
  38. memory->writeSupervisorWord(SUPERVISOR_CODE_SEGMENT_OFFSET, 5, 0x30); //0x30
  39. memory->writeSupervisorWord(SUPERVISOR_CODE_SEGMENT_OFFSET, 6, 0xA1000100); //SUB R1 R2
  40. memory->writeSupervisorWord(SUPERVISOR_CODE_SEGMENT_OFFSET, 7, 0xE4001000); //CALL start_vm
  41. memory->writeSupervisorWord(SUPERVISOR_CODE_SEGMENT_OFFSET, 8, 0xA5000000); //INC R1
  42. memory->writeSupervisorWord(SUPERVISOR_CODE_SEGMENT_OFFSET, 9, 0xE6000A00); //LOOP 10
  43. memory->writeSupervisorWord(SUPERVISOR_CODE_SEGMENT_OFFSET, 10, 0xE8000001); //SICMODE 0x00 0x01
  44. memory->writeSupervisorWord(SUPERVISOR_CODE_SEGMENT_OFFSET, 11, INSTRUCTION_HALT_FULL);
  45. //start_vm(R1 = vmIndex);
  46. memory->writeSupervisorWord(OS_PROCEDURE_START_VM_OFFSET, 0, 0x00000000); //PTALLOC
  47. memory->writeSupervisorWord(OS_PROCEDURE_START_VM_OFFSET, 1, 0x01000000); //PTCOPY
  48. memory->writeSupervisorWord(OS_PROCEDURE_START_VM_OFFSET, 2, 0xE5000000); //RET
  49. auto processor = machine->getProcessor();
  50. processor->getMODE()->setValue(MODE_REGISTER_VALUE_SUPERVISOR);
  51. processor->getIC()->setValue(0);
  52. }
  53. void writeProgram(RealMachine* machine) {
  54. auto external_memory = machine->getExternalMemory();
  55. //PROGRAM 0.
  56. external_memory->writeWord(VIRTUAL_CODE_SEGMENT_OFFSET, 0, 0xF0000000);
  57. external_memory->writeWord(VIRTUAL_CODE_SEGMENT_OFFSET, 1, INSTRUCTION_HALT_FULL);
  58. writeStringToMemoryBlock("Hello world from program!", VIRTUAL_DATA_SEGMENT_OFFSET, external_memory);
  59. //PROGRAM 1.
  60. external_memory->writeWord(VIRTUAL_CODE_SEGMENT_OFFSET + VIRTUAL_MEMORY_TOTAL_BLOCKS, 0, 0xF0010000); //PB 1
  61. external_memory->writeWord(VIRTUAL_CODE_SEGMENT_OFFSET + VIRTUAL_MEMORY_TOTAL_BLOCKS, 1, 0xF6000000); //GB 0
  62. external_memory->writeWord(VIRTUAL_CODE_SEGMENT_OFFSET + VIRTUAL_MEMORY_TOTAL_BLOCKS, 2, 0xF0020000); //PB 2
  63. external_memory->writeWord(VIRTUAL_CODE_SEGMENT_OFFSET + VIRTUAL_MEMORY_TOTAL_BLOCKS, 3, 0xF0000000); //PB 0
  64. external_memory->writeWord(VIRTUAL_CODE_SEGMENT_OFFSET + VIRTUAL_MEMORY_TOTAL_BLOCKS, 4, INSTRUCTION_HALT_FULL);
  65. writeStringToMemoryBlock("Enter input:", VIRTUAL_DATA_SEGMENT_OFFSET + VIRTUAL_MEMORY_TOTAL_BLOCKS + 1, external_memory);
  66. writeStringToMemoryBlock("You inputted:", VIRTUAL_DATA_SEGMENT_OFFSET + VIRTUAL_MEMORY_TOTAL_BLOCKS + 2, external_memory);
  67. //PROGRAM 2 - Example program.
  68. external_memory->writeWord(VIRTUAL_CODE_SEGMENT_OFFSET + VIRTUAL_MEMORY_TOTAL_BLOCKS * 2, 0, 0xAB000000); //LWRC R1
  69. external_memory->writeWord(VIRTUAL_CODE_SEGMENT_OFFSET + VIRTUAL_MEMORY_TOTAL_BLOCKS * 2, 1, 10); //10
  70. external_memory->writeWord(VIRTUAL_CODE_SEGMENT_OFFSET + VIRTUAL_MEMORY_TOTAL_BLOCKS * 2, 2, 0xAB010000); //LWRC R2
  71. external_memory->writeWord(VIRTUAL_CODE_SEGMENT_OFFSET + VIRTUAL_MEMORY_TOTAL_BLOCKS * 2, 3, 8); //8
  72. external_memory->writeWord(VIRTUAL_CODE_SEGMENT_OFFSET + VIRTUAL_MEMORY_TOTAL_BLOCKS * 2, 4, 0xA0000100); //ADD R1 R2
  73. external_memory->writeWord(VIRTUAL_CODE_SEGMENT_OFFSET + VIRTUAL_MEMORY_TOTAL_BLOCKS * 2, 5, 0xAB010000); //LWRC R2
  74. external_memory->writeWord(VIRTUAL_CODE_SEGMENT_OFFSET + VIRTUAL_MEMORY_TOTAL_BLOCKS * 2, 6, 6); //6
  75. external_memory->writeWord(VIRTUAL_CODE_SEGMENT_OFFSET + VIRTUAL_MEMORY_TOTAL_BLOCKS * 2, 7, 0xA0000100); //ADD R1 R2
  76. external_memory->writeWord(VIRTUAL_CODE_SEGMENT_OFFSET + VIRTUAL_MEMORY_TOTAL_BLOCKS * 2, 8, 0xAB010000); //LWRC R2
  77. external_memory->writeWord(VIRTUAL_CODE_SEGMENT_OFFSET + VIRTUAL_MEMORY_TOTAL_BLOCKS * 2, 9, 4); //2
  78. external_memory->writeWord(VIRTUAL_CODE_SEGMENT_OFFSET + VIRTUAL_MEMORY_TOTAL_BLOCKS * 2, 10, 0xA0000100); //ADD R1 R2
  79. external_memory->writeWord(VIRTUAL_CODE_SEGMENT_OFFSET + VIRTUAL_MEMORY_TOTAL_BLOCKS * 2, 11, 0xAB010000); //LWRC R2
  80. external_memory->writeWord(VIRTUAL_CODE_SEGMENT_OFFSET + VIRTUAL_MEMORY_TOTAL_BLOCKS * 2, 12, 2); //2
  81. external_memory->writeWord(VIRTUAL_CODE_SEGMENT_OFFSET + VIRTUAL_MEMORY_TOTAL_BLOCKS * 2, 13, 0xA0000100); //ADD R1 R2
  82. external_memory->writeWord(VIRTUAL_CODE_SEGMENT_OFFSET + VIRTUAL_MEMORY_TOTAL_BLOCKS * 2, 14, 0xAB010000); //LWRC R2
  83. external_memory->writeWord(VIRTUAL_CODE_SEGMENT_OFFSET + VIRTUAL_MEMORY_TOTAL_BLOCKS * 2, 15, 5); //2
  84. external_memory->writeWord(VIRTUAL_CODE_SEGMENT_OFFSET + VIRTUAL_MEMORY_TOTAL_BLOCKS * 2 + 1, 0, 0xA3000100); //DIV R1 R2
  85. external_memory->writeWord(VIRTUAL_CODE_SEGMENT_OFFSET + VIRTUAL_MEMORY_TOTAL_BLOCKS * 2 + 1, 1, 0xAB010000); //LWRC R2
  86. external_memory->writeWord(VIRTUAL_CODE_SEGMENT_OFFSET + VIRTUAL_MEMORY_TOTAL_BLOCKS * 2 + 1, 2, 0x30); //ASCI 0
  87. external_memory->writeWord(VIRTUAL_CODE_SEGMENT_OFFSET + VIRTUAL_MEMORY_TOTAL_BLOCKS * 2 + 1, 3, 0xA0000100); //ADD R1 R2
  88. external_memory->writeWord(VIRTUAL_CODE_SEGMENT_OFFSET + VIRTUAL_MEMORY_TOTAL_BLOCKS * 2 + 1, 4, 0xF0000000); //PB 0
  89. external_memory->writeWord(VIRTUAL_CODE_SEGMENT_OFFSET + VIRTUAL_MEMORY_TOTAL_BLOCKS * 2 + 1, 5, 0xAC000100); //LWRM R1 [2 0]
  90. external_memory->writeWord(VIRTUAL_CODE_SEGMENT_OFFSET + VIRTUAL_MEMORY_TOTAL_BLOCKS * 2 + 1, 6, 0xF0010000); //PB 1
  91. external_memory->writeWord(VIRTUAL_CODE_SEGMENT_OFFSET + VIRTUAL_MEMORY_TOTAL_BLOCKS * 2 + 1, 7, INSTRUCTION_HALT_FULL); //HALT
  92. writeStringToMemoryBlock("10 8 6 4 2 vidurkis yra: ", VIRTUAL_DATA_SEGMENT_OFFSET + VIRTUAL_MEMORY_TOTAL_BLOCKS * 2, external_memory);
  93. }
  94. void run() {
  95. cout << "Starting up..." << endl;
  96. cout << "Run in debug mode: ";
  97. bool debug = false;
  98. cin >> debug;
  99. RealMachine* real = new RealMachine(debug);
  100. //writeHelloWorldOS(real);
  101. writeOS(real);
  102. writeProgram(real);
  103. cout << "Running the machine..." << endl;
  104. real->run();
  105. delete real;
  106. }
  107. int main() {
  108. srand(time(NULL));
  109. greet();
  110. run();
  111. }