Advertisement
Guest User

Ethan

a guest
Jun 13th, 2009
171
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 9.12 KB | None | 0 0
  1. /******************************************************************************
  2.    main.cpp
  3.         -Kernel main program
  4. ******************************************************************************/
  5. #ifdef __cplusplus
  6. extern "C"
  7. {
  8. #endif
  9.  
  10. /* va list parameter list */
  11. typedef unsigned char *va_list;
  12.  
  13. #ifdef __cplusplus
  14. }
  15. #include <bootinfo.h>
  16. #include <hal.h>
  17. #include <kybrd.h>
  18. #include <string.h>
  19. #include <stdio.h>
  20.  
  21. #include "../Hal/cpu.cpp"
  22. #include "DebugDisplay.h"
  23. #include "exception.h"
  24. #include "mmngr_phys.h"
  25. #include "mmngr_virtual.h"
  26. extern void _cdecl kernel_panic (const char* fmt, ...);
  27. struct memory_region {
  28.  
  29.     uint32_t    startLo;    //base address
  30.     uint32_t    startHi;
  31.     uint32_t    sizeLo;     //length (in bytes)
  32.     uint32_t    sizeHi;
  33.     uint32_t    type;
  34.     uint32_t    acpi_3_0;
  35. };
  36.  
  37. uint32_t kernelSize=0;
  38. int find_substr(char *listPointer, char *itemPointer)
  39. {
  40.     int t;
  41.     char *p, *p2;
  42.  
  43.     for(t=0; listPointer[t]; t++) {
  44.         p = &listPointer[t];
  45.         p2 = itemPointer;
  46.  
  47.         while(*p2 && *p2==*p) {
  48.             p++;
  49.             p2++;
  50.         }
  51.         if(!*p2) return t; /* 1st return */
  52.     }
  53.     return -1; /* 2nd return */
  54. }
  55. char *strstr(char *buf, char *sub)
  56. {
  57.     register char *bp;
  58.     register char *sp;
  59.  
  60.     if (!*sub)
  61.     return buf;
  62.     while (*buf) {
  63.     bp = buf;
  64.     sp = sub;
  65.     do {
  66.         if (!*sp)
  67.         return buf;
  68.     } while (*bp++ == *sp++);
  69.     buf += 1;
  70.     }
  71.     return 0;
  72. }
  73. extern void abort (void);
  74. extern int inside_main;
  75. char * strncpy(extern char *s1, const char *s2, unsigned int n)
  76. {
  77.     char *dest;
  78.     dest = s1;
  79. #ifdef __OPTIMIZE__
  80.     if (inside_main)
  81.         abort ();
  82. #endif
  83.     for (; *s2 && n; n--)
  84.         *s1++ = *s2++;
  85.     while (n--)
  86.         return dest;
  87.         *s1++ = 0;
  88.     return dest;
  89. }
  90. int sprintf (char *buf, const char *fmt, ...)
  91. {
  92.   va_list ap;
  93.   int r;
  94. #ifdef __OPTIMIZE__
  95.   if (inside_main)
  96.     abort ();
  97. #endif
  98.   va_start (ap, fmt);
  99.   r = vsprintf (buf, fmt, ap);
  100.   va_end (ap);
  101.   return r;
  102. }
  103. unsigned int f = 0x3f;
  104. char *replace_str(char *str, char *orig, char *rep)
  105. {
  106.   static char buffer[4096];
  107.   char *p;
  108.  
  109.   if(!(p = strstr(str, orig)))  // Is 'orig' even in 'str'?
  110.     return str;
  111.  
  112.   strncpy(buffer, str, p-str); // Copy characters from 'str' start to 'orig' st$
  113.   buffer[p-str] = '\0';
  114.  
  115.   sprintf(buffer+(p-str), "%s%s", rep, p+strlen(orig));
  116.  
  117.   return buffer;
  118. }
  119. char copytext[101];
  120. void init (multiboot_info* bootinfo) {
  121.  
  122.     //! initialize our vmm
  123.     vmmngr_initialize ();
  124.  
  125.     //! clear and init display
  126.     DebugClrScr (f);
  127.     DebugGotoXY (0,0);
  128.     DebugSetColor (f);
  129.  
  130.     hal_initialize ();
  131.  
  132.     enable ();
  133.     setvect (0,(void (__cdecl &)(void))divide_by_zero_fault);
  134.     setvect (1,(void (__cdecl &)(void))single_step_trap);
  135.     setvect (2,(void (__cdecl &)(void))nmi_trap);
  136.     setvect (3,(void (__cdecl &)(void))breakpoint_trap);
  137.     setvect (4,(void (__cdecl &)(void))overflow_trap);
  138.     setvect (5,(void (__cdecl &)(void))bounds_check_fault);
  139.     setvect (6,(void (__cdecl &)(void))invalid_opcode_fault);
  140.     setvect (7,(void (__cdecl &)(void))no_device_fault);
  141.     setvect (8,(void (__cdecl &)(void))double_fault_abort);
  142.     setvect (10,(void (__cdecl &)(void))invalid_tss_fault);
  143.     setvect (11,(void (__cdecl &)(void))no_segment_fault);
  144.     setvect (12,(void (__cdecl &)(void))stack_fault);
  145.     setvect (13,(void (__cdecl &)(void))general_protection_fault);
  146.     setvect (14,(void (__cdecl &)(void))page_fault);
  147.     setvect (16,(void (__cdecl &)(void))fpu_fault);
  148.     setvect (17,(void (__cdecl &)(void))alignment_check_fault);
  149.     setvect (18,(void (__cdecl &)(void))machine_check_abort);
  150.     setvect (19,(void (__cdecl &)(void))simd_fpu_fault);
  151.  
  152.     pmmngr_init (bootinfo->m_memorySize, 0xC0000000 + kernelSize*512);
  153.  
  154.     memory_region*  region = (memory_region*)0x1000;
  155.  
  156.     for (int i=0; i<10; ++i) {
  157.  
  158.         if (region[i].type>4)
  159.             break;
  160.  
  161.         if (i>0 && region[i].startLo==0)
  162.             break;
  163.  
  164.         pmmngr_init_region (region[i].startLo, region[i].sizeLo);
  165.     }
  166.     pmmngr_deinit_region (0x100000, kernelSize*512);
  167.  
  168.     //! install the keyboard to IR 33
  169.     kkybrd_install (33);
  170. }
  171.  
  172. //! sleeps a little bit. This uses the HALs get_tick_count() which in turn uses the PIT
  173. void sleep (int ms) {
  174.  
  175.     static int ticks = ms + get_tick_count ();
  176.     while (ticks > get_tick_count ())
  177.         ;
  178. }
  179.  
  180. //! wait for key stroke
  181. KEYCODE getch () {
  182.  
  183.     KEYCODE key = KEY_UNKNOWN;
  184.  
  185.     //! wait for a keypress
  186.     while (key==KEY_UNKNOWN)
  187.         key = kkybrd_get_last_key ();
  188.  
  189.     //! discard last keypress (we handled it) and return
  190.     kkybrd_discard_last_key ();
  191.     return key;
  192. }
  193.  
  194. //! command prompt
  195. void cmd () {
  196.  
  197.     DebugPrintf ("\n-> ");
  198. }
  199.  
  200. //! gets next command
  201. void get_cmd (char* buf, int n) {
  202.  
  203.     cmd ();
  204.  
  205.     KEYCODE key = KEY_UNKNOWN;
  206.     bool    BufChar;
  207.  
  208.     //! get command string
  209.     int i=0;
  210.     while ( i < n ) {
  211.  
  212.         //! buffer the next char
  213.         BufChar = true;
  214.  
  215.         //! grab next char
  216.         key = getch ();
  217.  
  218.         //! end of command if enter is pressed
  219.         if (key==KEY_RETURN)
  220.             break;
  221.  
  222.         //! backspace
  223.         if (key==KEY_BACKSPACE) {
  224.  
  225.             //! dont buffer this char
  226.             BufChar = false;
  227.  
  228.             if (i > 0) {
  229.  
  230.                 //! go back one char
  231.                 unsigned y, x;
  232.                 DebugGetXY (&x, &y);
  233.                 if (x>0)
  234.                     DebugGotoXY (--x, y);
  235.                 else {
  236.                     //! x is already 0, so go back one line
  237.                     y--;
  238.                     x = DebugGetHorz ();
  239.                 }
  240.  
  241.                 //! erase the character from display
  242.                 DebugPutc (' ');
  243.                 DebugGotoXY (x, y);
  244.  
  245.                 //! go back one char in cmd buf
  246.                 i--;
  247.             }
  248.         }
  249.  
  250.         //! only add the char if it is to be buffered
  251.         if (BufChar) {
  252.  
  253.             //! convert key to an ascii char and put it in buffer
  254.             char c = kkybrd_key_to_ascii (key);
  255.             if (c != 0) { //insure its an ascii char
  256.  
  257.                 DebugPutc (c);
  258.                 buf [i++] = c;
  259.             }
  260.         }
  261.  
  262.         //! wait for next key. You may need to adjust this to suit your needs
  263.         sleep (10);
  264.     }
  265.  
  266.     //! null terminate the string
  267.     buf [i] = '\0';
  268. }
  269.  
  270. //! our simple command parser
  271. bool run_cmd (char* cmd_buf) {
  272.  
  273.     //! exit command
  274.     if (strcmp (cmd_buf, "exit") == 0) {
  275.         return true;
  276.     }
  277.     else if (find_substr (cmd_buf, "print") != -1) {
  278.         if (strcmp (cmd_buf, "print") == 0) {
  279.             DebugPrintf ("\nInvalid string");
  280.         }
  281.         else if (find_substr (cmd_buf, "print") != -1) {
  282.             DebugPrintf ("\n");
  283.             DebugPrintf (replace_str (cmd_buf, "print", "\0"));
  284.         }
  285.     }
  286.  
  287.     //! clear screen
  288.     else if (strcmp (cmd_buf, "cls") == 0) {
  289.         DebugClrScr (f);
  290.     }
  291.     else if (find_substr (cmd_buf, "color") != -1) {
  292.         if (strcmp (cmd_buf, "color") == 0) {
  293.             DebugPrintf ("\nColor table:\n\n0 = Black\t8 = Gray\n1 = Blue\t9 = Light Blue\n2 = Green\tA = Light Green\n3 = Aqua\tB = Light Aqua\n4 = Red\t\tC = Light Red\n5 = Purple\tD = Light Purple\n6 = Yellow\tE = Light Yellow\n7 = White\tF = Bright White\n");
  294.         }
  295.         else if (find_substr (cmd_buf, "color ") != -1) {
  296.             f = int(replace_str (cmd_buf, "color ", "\0"));
  297.             DebugPrintf ("\n");
  298.             DebugClrScr (f);
  299.             DebugSetColor (f);
  300.         }
  301.         //DebugSetColor (0x3f);
  302.     }
  303.     else if (strcmp (cmd_buf, "clear") == 0) {
  304.         DebugClrScr (f);
  305.     }
  306.     else if (strcmp (cmd_buf, "sysinfo") == 0) {
  307.         DebugPuts("\n");
  308.         DebugPuts(i86_cpu_get_vender());
  309.     }
  310.     else if (strcmp (cmd_buf, "test error") == 0) {
  311.         kernel_panic("Test error initiated by the user");
  312.     }
  313.     else if (find_substr (cmd_buf, "copy") != -1) {
  314.         if (strcmp (cmd_buf, "copy") == 0) {
  315.             DebugPrintf ("\nInvalid String");
  316.         }
  317.         else if (find_substr (cmd_buf, "copy") != -1) {
  318.             strncpy(copytext, replace_str (cmd_buf, "copy", "\0"), 100);
  319.             DebugPrintf ("\nString copied.");
  320.         }
  321.     }
  322.     else if (strcmp (cmd_buf, "paste") == 0) {
  323.         DebugPrintf ("\n");
  324.         DebugPrintf (copytext);
  325.     }
  326.  
  327.     //! help
  328.     else if (strcmp (cmd_buf, "help") == 0) {
  329.  
  330.         DebugPuts ("\nThis is my Operating System");
  331.         DebugPuts ("\nwith a basic Command Line Interface (CLI)\n\n");
  332.         DebugPuts ("Supported commands:\n");
  333.         DebugPuts (" - exit: quits and halts the system\n");
  334.         DebugPuts (" - cls: clears the display\n");
  335.         DebugPuts (" - help: displays this message\n");
  336.         DebugPuts (" - clear: clears the display\n");
  337.         DebugPuts (" - print [string]: displays [string]");
  338.     }
  339.     else if (strcmp (cmd_buf, "test") == 0) {
  340.         unsigned char* p1 = (unsigned char*) 0x50000;
  341.         unsigned char* p2 = (unsigned char*) 0x500000;
  342.         p1[3] = 0;
  343.         p2[3] = 0;
  344.         DebugPrintf ("%s", p1);
  345.         DebugPrintf ("%s", p2);
  346.        
  347.     }
  348.  
  349.     //! invalid command
  350.     else {
  351.         DebugPrintf ("\nUnkown command");
  352.     }
  353.  
  354.     return false;
  355. }
  356.  
  357. void run () {
  358.  
  359.     //! command buffer
  360.     char    cmd_buf [100];
  361.  
  362.     while (1) {
  363.  
  364.         //! get command
  365.         get_cmd (cmd_buf, 98);
  366.  
  367.         //! run command
  368.         if (run_cmd (cmd_buf) == true)
  369.             break;
  370.     }
  371. }
  372.  
  373. bool floppyMotorStart(void) {
  374.     _asm    mov     al,01ch
  375.     _asm    mov     dx,03f2h
  376.     _asm    out     dx,al
  377.     return true;
  378. }
  379.  
  380. bool floppyMotorReset(void) {
  381.     _asm    mov     al,0
  382.     _asm    mov     dx,03f2h
  383.     _asm    out     dx,al
  384.     return true;
  385. }
  386.  
  387. int _cdecl kmain (multiboot_info* bootinfo) {
  388.  
  389.     _asm    mov word ptr [kernelSize], dx
  390.     init (bootinfo);
  391.  
  392.     DebugGotoXY (0,0);
  393.     //pmmngr_paging_enable (true);
  394.     DebugPuts ("+------------------------------------------+\n");
  395.     DebugPuts ("| Jandekk J-OS Version 0.0.16 (Build 52)   |\n");
  396.     DebugPuts ("| Copyright Jandekk Corporation, 2007-2009 |\n");
  397.     DebugPuts ("+------------------------------------------+\n");
  398.  
  399.     run ();
  400.  
  401.     //DebugPrintf ("\nExit command recieved; OS halted");
  402.     //for (;;);
  403.     return 0;
  404. }
  405. #endif
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement