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>
022 #include <sos/klibc.h> 027 #include <sos/klibc.h>
023 #include <sos/assert.h> 028 #include <sos/assert.h>
024 #include <drivers/x86_videomem.h> 029 #include <drivers/x86_videomem.h>
025 #include <drivers/bochs.h> 030 #include <drivers/bochs.h>
026 031
027 032
>> 033
>> 034
>> 035 static void display_bits(unsigned char row, unsigned char col,
>> 036 unsigned char attribute,
>> 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_X86_VIDEO_BG_BLUE,
>> 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_X86_VIDEO_BG_BLUE,
>> 072 div_count);
>> 073 div_count++;
>> 074 }
028 075
029 076
030 void sos_main(unsigned long magic, unsigned lo 077 void sos_main(unsigned long magic, unsigned long addr)
031 { 078 {
032 unsigned i; 079 unsigned i;
033 080
034 081
035 082
036 083
037 multiboot_info_t *mbi; 084 multiboot_info_t *mbi;
038 mbi = (multiboot_info_t *) addr; 085 mbi = (multiboot_info_t *) addr;
039 086
040 087
041 sos_bochs_setup(); 088 sos_bochs_setup();
042 089
043 sos_x86_videomem_setup(); 090 sos_x86_videomem_setup();
044 sos_x86_videomem_cls(SOS_X86_VIDEO_BG_BLUE); 091 sos_x86_videomem_cls(SOS_X86_VIDEO_BG_BLUE);
045 092
046 093
047 if (magic == MULTIBOOT_BOOTLOADER_MAGIC) 094 if (magic == MULTIBOOT_BOOTLOADER_MAGIC)
048 095
049 sos_x86_videomem_printf(1, 0, 096 sos_x86_videomem_printf(1, 0,
050 SOS_X86_VIDEO_FG_Y 097 SOS_X86_VIDEO_FG_YELLOW | SOS_X86_VIDEO_BG_BLUE,
051 "Welcome From GRUB 098 "Welcome From GRUB to %s%c RAM is %dMB (upper mem = 0x%x kB)",
052 "SOS", ',', 099 "SOS", ',',
053 (unsigned)(mbi->me 100 (unsigned)(mbi->mem_upper >> 10) + 1,
054 (unsigned)mbi->mem 101 (unsigned)mbi->mem_upper);
055 else 102 else
056 103
057 sos_x86_videomem_printf(1, 0, 104 sos_x86_videomem_printf(1, 0,
058 SOS_X86_VIDEO_FG_Y 105 SOS_X86_VIDEO_FG_YELLOW | SOS_X86_VIDEO_BG_BLUE,
059 "Welcome to SOS"); 106 "Welcome to SOS");
060 107
061 sos_bochs_putstring("Message in a bochs\n"); 108 sos_bochs_putstring("Message in a bochs\n");
062 109
063 !! 110
064 !! 111 sos_gdt_setup();
065 for (;;) !! 112 sos_idt_setup();
066 continue; !! 113
>> 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_ERROR,
>> 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_LTRED | SOS_X86_VIDEO_BG_BLUE,
>> 148 "Invisible");
067 149
068 return; 150 return;
069 } 151 }