Advertisement
Guest User

Untitled

a guest
Feb 20th, 2020
147
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 6.33 KB | None | 0 0
  1. #include "interrupt.h"
  2. #include "port.h"
  3. #include "shitio.h"
  4. #include "keyboard.h"
  5.  
  6. struct IDT_entry IDT[256];
  7.  
  8. extern void load_idt(unsigned long *idt_ptr) asm("load_idt");
  9. extern void keyboard_handler(void) asm("keyboard_handler");
  10. extern void time_handler(void) asm("time_handler");
  11. extern unsigned char keyboard_map[128];
  12. extern int irq2() asm("irq2");
  13. extern int irq3() asm("irq3");
  14. extern int irq4() asm("irq4");
  15. extern int irq5() asm("irq5");
  16. extern int irq6() asm("irq6");
  17. extern int irq7() asm("irq7");
  18. extern int irq8() asm("irq8");
  19. extern int irq9() asm("irq9");
  20. extern int irq10() asm("irq10");
  21. extern int irq11() asm("irq11");
  22. extern int irq12() asm("irq12");
  23. extern int irq13() asm("irq13");
  24. extern int irq14() asm("irq14");
  25. extern int irq15() asm("irq15");
  26.  
  27. struct keyboard_buffer key;
  28.  
  29. extern "C" void irq_l(void) {
  30. outb(0x20, 0x20);
  31. }
  32.  
  33. extern "C" void irq_h(void) {
  34. outb(0xA0, 0x20);
  35. outb(0x20, 0x20);
  36. }
  37.  
  38. extern "C" void PITI() {
  39. outb(0x20, 0x20);
  40. }
  41.  
  42. char *kb_init() {
  43. key.on = 99;
  44. while(key.done != 99) {
  45. t_print("not 99");
  46. }
  47. //t_print("Here");
  48. }
  49.  
  50. extern "C" void keyboard_handler_main() {
  51. outb(0x20, 0x20); //EOI
  52.  
  53. static int counter = 0;
  54.  
  55. if(inb(0x64) & 0x01) {
  56.  
  57. char keycode = inb(0x60);
  58.  
  59. if(keycode < 0)
  60. return;
  61.  
  62. switch(keycode) {
  63. case 0x1c:
  64. if(key.on != 99) {
  65. putchar('\n');
  66. break;
  67. }
  68. putchar('\n');
  69.  
  70. key.done = 99;
  71.  
  72. break;
  73. case 0x0e:
  74. putchar('\b');
  75. break;
  76. default:
  77. if(key.on != 99) {
  78. putchar(keyboard_map[(unsigned char) keycode]);
  79. break;
  80. }
  81. putchar(keyboard_map[(unsigned char) keycode]);
  82. key.input[counter++] = keyboard_map[(unsigned char)keycode];
  83. break;
  84. }
  85. }
  86. else
  87. t_print("IRQ1: bad keycodes");
  88. }
  89.  
  90. void idt_init(void) {
  91.  
  92. k_print("Starting idt");
  93.  
  94. uint32_t idt_address;
  95. uint32_t idt_ptr[2];
  96.  
  97. outb(0x20, 0x11);
  98. outb(0xA0, 0x11);
  99. outb(0x21, 0x20);
  100. outb(0xA1, 40);
  101. outb(0x21, 0x04);
  102. outb(0xA1, 0x02);
  103. outb(0x21, 0x01);
  104. outb(0xA1, 0x01);
  105. outb(0x21, 0x0);
  106. outb(0xA1, 0x0);
  107.  
  108. uint32_t irq0;
  109. uint32_t irq1;
  110. uint32_t irq2_address;
  111. uint32_t irq3_address;
  112. uint32_t irq4_address;
  113. uint32_t irq5_address;
  114. uint32_t irq6_address;
  115. uint32_t irq7_address;
  116. uint32_t irq8_address;
  117. uint32_t irq9_address;
  118. uint32_t irq10_address;
  119. uint32_t irq11_address;
  120. uint32_t irq12_address;
  121. uint32_t irq13_address;
  122. uint32_t irq14_address;
  123. uint32_t irq15_address;
  124.  
  125. irq0 = (uint32_t)time_handler;
  126. IDT[32].offset_lowerbits = irq0 & 0xffff;
  127. IDT[32].selector = 0x08;
  128. IDT[32].zero = 0;
  129. IDT[32].type_attr = 0x8e;
  130. IDT[32].offset_higherbits = (irq0 & 0xffff0000) >> 16;
  131.  
  132. irq1 = (uint32_t)keyboard_handler;
  133. IDT[33].offset_lowerbits = irq1 & 0xffff;
  134. IDT[33].selector = 0x08;
  135. IDT[33].zero = 0;
  136. IDT[33].type_attr = 0x8e;
  137. IDT[33].offset_higherbits = (irq1 & 0xffff0000) >> 16;
  138.  
  139. irq2_address = (uint32_t)irq2;
  140. IDT[34].offset_lowerbits = irq2_address & 0xffff;
  141. IDT[34].selector = 0x08; /* KERNEL_CODE_SEGMENT_OFFSET */
  142. IDT[34].zero = 0;
  143. IDT[34].type_attr = 0x8e; /* INTERRUPT_GATE */
  144. IDT[34].offset_higherbits = (irq2_address & 0xffff0000) >> 16;
  145.  
  146. irq3_address = (uint32_t)irq3;
  147. IDT[35].offset_lowerbits = irq3_address & 0xffff;
  148. IDT[35].selector = 0x08;
  149. IDT[35].zero = 0;
  150. IDT[35].type_attr = 0x8e;
  151. IDT[35].offset_higherbits = (irq3_address & 0xffff0000) >> 16;
  152.  
  153. irq4_address = (uint32_t)irq4;
  154. IDT[36].offset_lowerbits = irq4_address & 0xffff;
  155. IDT[36].selector = 0x08;
  156. IDT[36].zero = 0;
  157. IDT[36].type_attr = 0x8e;
  158. IDT[36].offset_higherbits = (irq4_address & 0xffff0000) >> 16;
  159.  
  160. irq5_address = (uint32_t)irq5;
  161. IDT[37].offset_lowerbits = irq5_address & 0xffff;
  162. IDT[37].selector = 0x08;
  163. IDT[37].zero = 0;
  164. IDT[37].type_attr = 0x8e;
  165. IDT[37].offset_higherbits = (irq5_address & 0xffff0000) >> 16;
  166.  
  167. irq6_address = (uint32_t)irq6;
  168. IDT[38].offset_lowerbits = irq6_address & 0xffff;
  169. IDT[38].selector = 0x08;
  170. IDT[38].zero = 0;
  171. IDT[38].type_attr = 0x8e;
  172. IDT[38].offset_higherbits = (irq6_address & 0xffff0000) >> 16;
  173.  
  174. irq7_address = (uint32_t)irq7;
  175. IDT[39].offset_lowerbits = irq7_address & 0xffff;
  176. IDT[39].selector = 0x08;
  177. IDT[39].zero = 0;
  178. IDT[39].type_attr = 0x8e;
  179. IDT[39].offset_higherbits = (irq7_address & 0xffff0000) >> 16;
  180.  
  181. irq8_address = (uint32_t)irq8;
  182. IDT[40].offset_lowerbits = irq8_address & 0xffff;
  183. IDT[40].selector = 0x08;
  184. IDT[40].zero = 0;
  185. IDT[40].type_attr = 0x8e;
  186. IDT[40].offset_higherbits = (irq8_address & 0xffff0000) >> 16;
  187.  
  188. irq9_address = (uint32_t)irq9;
  189. IDT[41].offset_lowerbits = irq9_address & 0xffff;
  190. IDT[41].selector = 0x08;
  191. IDT[41].zero = 0;
  192. IDT[41].type_attr = 0x8e;
  193. IDT[41].offset_higherbits = (irq9_address & 0xffff0000) >> 16;
  194.  
  195. irq10_address = (uint32_t)irq10;
  196. IDT[42].offset_lowerbits = irq10_address & 0xffff;
  197. IDT[42].selector = 0x08;
  198. IDT[42].zero = 0;
  199. IDT[42].type_attr = 0x8e;
  200. IDT[42].offset_higherbits = (irq10_address & 0xffff0000) >> 16;
  201.  
  202. irq11_address = (uint32_t)irq11;
  203. IDT[43].offset_lowerbits = irq11_address & 0xffff;
  204. IDT[43].selector = 0x08;
  205. IDT[43].zero = 0;
  206. IDT[43].type_attr = 0x8e;
  207. IDT[43].offset_higherbits = (irq11_address & 0xffff0000) >> 16;
  208.  
  209. irq12_address = (uint32_t)irq12;
  210. IDT[44].offset_lowerbits = irq12_address & 0xffff;
  211. IDT[44].selector = 0x08;
  212. IDT[44].zero = 0;
  213. IDT[44].type_attr = 0x8e;
  214. IDT[44].offset_higherbits = (irq12_address & 0xffff0000) >> 16;
  215.  
  216. irq13_address = (uint32_t)irq13;
  217. IDT[45].offset_lowerbits = irq13_address & 0xffff;
  218. IDT[45].selector = 0x08;
  219. IDT[45].zero = 0;
  220. IDT[45].type_attr = 0x8e;
  221. IDT[45].offset_higherbits = (irq13_address & 0xffff0000) >> 16;
  222.  
  223. irq14_address = (uint32_t)irq14;
  224. IDT[46].offset_lowerbits = irq14_address & 0xffff;
  225. IDT[46].selector = 0x08;
  226. IDT[46].zero = 0;
  227. IDT[46].type_attr = 0x8e;
  228. IDT[46].offset_higherbits = (irq14_address & 0xffff0000) >> 16;
  229.  
  230. irq15_address = (uint32_t)irq15;
  231. IDT[47].offset_lowerbits = irq15_address & 0xffff;
  232. IDT[47].selector = 0x08;
  233. IDT[47].zero = 0;
  234. IDT[47].type_attr = 0x8e;
  235. IDT[47].offset_higherbits = (irq15_address & 0xffff0000) >> 16;
  236.  
  237. idt_address = (uint32_t)IDT ;
  238. idt_ptr[0] = (sizeof (struct IDT_entry) * 256) + ((idt_address & 0xffff) << 16);
  239. idt_ptr[1] = idt_address >> 16 ;
  240.  
  241. k_print(": idt adress: %x\n", idt_address);
  242.  
  243. load_idt(idt_ptr);
  244. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement