Diff markup
001 001
002 002
003 003
004 004
005 005
006 006
007 007
008 008
009 009
010 010
011 011
012 012
013 013
014 014
015 015
016 016
017 017
018 018
019 019
020 020
021 #include <bootstrap/multiboot.h> 021 #include <bootstrap/multiboot.h>
022 #include <hwcore/idt.h> <<
023 #include <hwcore/gdt.h> <<
024 #include <hwcore/irq.h> <<
025 #include <hwcore/exception.h> <<
026 #include <hwcore/i8254.h> <<
027 #include <sos/klibc.h> 022 #include <sos/klibc.h>
028 #include <sos/assert.h> 023 #include <sos/assert.h>
029 #include <drivers/x86_videomem.h> 024 #include <drivers/x86_videomem.h>
030 #include <drivers/bochs.h> 025 #include <drivers/bochs.h>
031 026
032 027
033 <<
034 <<
035 static void display_bits(unsigned char row, un <<
036 unsigned char attribu <<
037 sos_ui32_t integer) <<
038 { <<
039 int i; <<
040 <<
041 for (i = 31 ; i >= 0 ; i--) <<
042 { <<
043 <<
044 int bit_i = (integer & (1 << i)); <<
045 <<
046 unsigned char ascii_code = bit_i?219:177 <<
047 sos_x86_videomem_putchar(row, col++, <<
048 attribute, <<
049 ascii_code); <<
050 } <<
051 } <<
052 <<
053 <<
054 <<
055 static void clk_it(int intid) <<
056 { <<
057 static sos_ui32_t clock_count = 0; <<
058 <<
059 display_bits(0, 48, <<
060 SOS_X86_VIDEO_FG_LTGREEN | SOS_ <<
061 clock_count); <<
062 clock_count++; <<
063 <<
064 } <<
065 <<
066 <<
067 static void divide_ex(int exid) <<
068 { <<
069 static sos_ui32_t div_count = 0; <<
070 display_bits(0, 0, <<
071 SOS_X86_VIDEO_FG_LTRED | SOS_X8 <<
072 div_count); <<
073 div_count++; <<
074 } <<
075 028
076 029
077 void sos_main(unsigned long magic, unsigned lo 030 void sos_main(unsigned long magic, unsigned long addr)
078 { 031 {
079 unsigned i; 032 unsigned i;
080 033
081 034
082 035
083 036
084 multiboot_info_t *mbi; 037 multiboot_info_t *mbi;
085 mbi = (multiboot_info_t *) addr; 038 mbi = (multiboot_info_t *) addr;
086 039
087 040
088 sos_bochs_setup(); 041 sos_bochs_setup();
089 042
090 sos_x86_videomem_setup(); 043 sos_x86_videomem_setup();
091 sos_x86_videomem_cls(SOS_X86_VIDEO_BG_BLUE); 044 sos_x86_videomem_cls(SOS_X86_VIDEO_BG_BLUE);
092 045
093 046
094 if (magic == MULTIBOOT_BOOTLOADER_MAGIC) 047 if (magic == MULTIBOOT_BOOTLOADER_MAGIC)
095 048
096 sos_x86_videomem_printf(1, 0, 049 sos_x86_videomem_printf(1, 0,
097 SOS_X86_VIDEO_FG_Y 050 SOS_X86_VIDEO_FG_YELLOW | SOS_X86_VIDEO_BG_BLUE,
098 "Welcome From GRUB 051 "Welcome From GRUB to %s%c RAM is %dMB (upper mem = 0x%x kB)",
099 "SOS", ',', 052 "SOS", ',',
100 (unsigned)(mbi->me 053 (unsigned)(mbi->mem_upper >> 10) + 1,
101 (unsigned)mbi->mem 054 (unsigned)mbi->mem_upper);
102 else 055 else
103 056
104 sos_x86_videomem_printf(1, 0, 057 sos_x86_videomem_printf(1, 0,
105 SOS_X86_VIDEO_FG_Y 058 SOS_X86_VIDEO_FG_YELLOW | SOS_X86_VIDEO_BG_BLUE,
106 "Welcome to SOS"); 059 "Welcome to SOS");
107 060
108 sos_bochs_putstring("Message in a bochs\n"); 061 sos_bochs_putstring("Message in a bochs\n");
109 062
110 !! 063
111 sos_gdt_setup(); !! 064
112 sos_idt_setup(); !! 065 for (;;)
113 !! 066 continue;
114 <<
115 sos_exceptions_setup(); <<
116 sos_irq_setup(); <<
117 <<
118 <<
119 sos_i8254_set_frequency(100); <<
120 <<
121 <<
122 sos_irq_set_routine(SOS_IRQ_TIMER, <<
123 clk_it); <<
124 sos_exception_set_routine(SOS_EXCEPT_DIVIDE_ <<
125 divide_ex); <<
126 <<
127 <<
128 asm volatile ("sti\n"); <<
129 <<
130 <<
131 <<
132 <<
133 <<
134 i = 10; <<
135 while (1) <<
136 { <<
137 <<
138 sos_bochs_printf("i = 1 / %d...\n", i); <<
139 i = 1 / i; <<
140 } <<
141 <<
142 <<
143 <<
144 <<
145 <<
146 sos_x86_videomem_putstring(2, 0, <<
147 SOS_X86_VIDEO_FG_ <<
148 "Invisible"); <<
149 067
150 return; 068 return;
151 } 069 }