먼저 어셈블리코드에서 부팅정보 가져오기
이전에 어샘해드.nas에 부트정보 표기했었는데 이걸 c에 가져와서 사용
void HariMain (void )
{
char *vram;
int xsize, ysize;
short *binfo_scrnx, *binfo_scrny;
int *binfo_vram;
init_palette ();
binfo_scrnx = (short *)0x0ff4 ;
binfo_scrny = (short *)0x0ff6 ;
binfo_vram = (int *)0x0ff8 ;
vram = (char *) *binfo_vram;
xsize = *binfo_scrnx;
ysize = *binfo_scrny;
구조체 사용해서 부트인포 정리
struct BOOTINFO {
char cyls, leds, vmode, reserve;
short scrnx, scrny;
char *vram;
};
void HariMain (void )
{
char *vram;
int xsize, ysize;
struct BOOTINFO *binfo ;
init_palette ();
binfo = (struct BOOTINFO *) 0x0ff0 ;
xsize = (*binfo).scrnx;
ysize = (*binfo).scrny;
vram = (*binfo).vram;
화살표 연산자로 수정
void io_hlt (void ) ;
void io_cli (void ) ;
void io_out8 (int prot, int data) ;
int io_load_eflags (void ) ;
void io_store_eflags (int eflags) ;
void init_palette (void ) ;
void set_palette (int start, int end, unsigned char *rgb) ;
void boxfill8 (unsigned char *vram, int xsize, unsigned char c, int x0, int y0, int x1, int y1) ;
void init_screen (char *vram, int x, int y) ;
#define COL8_000000 0
#define COL8_FF0000 1
#define COL8_00FF00 2
#define COL8_FFFF00 3
#define COL8_0000FF 4
#define COL8_FF00FF 5
#define COL8_00FFFF 6
#define COL8_FFFFFF 7
#define COL8_C6C6C6 8
#define COL8_840000 9
#define COL8_008400 10
#define COL8_848400 11
#define COL8_000084 12
#define COL8_840084 13
#define COL8_008484 14
#define COL8_848484 15
struct BOOTINFO {
char cyls, leds, vmode, reserve;
short scrnx, scrny;
char *vram;
};
void HariMain (void )
{
struct BOOTINFO *binfo = (struct BOOTINFO *) 0x0ff0 ;
init_palette ();
init_screen (binfo->vram, binfo->scrnx, binfo->scrny);
for (;;)
{
io_hlt ();
}
}
void init_palette (void )
{
static unsigned char table_rgb[16 * 3 ] = {
0x00 , 0x00 , 0x00 ,
0xff , 0x00 , 0x00 ,
0x00 , 0xff , 0x00 ,
0xff , 0xff , 0x00 ,
0x00 , 0x00 , 0xff ,
0xff , 0x00 , 0xff ,
0x00 , 0xff , 0xff ,
0xff , 0xff , 0xff ,
0xc6 , 0xc6 , 0xc6 ,
0x84 , 0x00 , 0x00 ,
0x00 , 0x84 , 0x00 ,
0x84 , 0x84 , 0x00 ,
0x00 , 0x00 , 0x84 ,
0x84 , 0x00 , 0x84 ,
0x00 , 0x84 , 0x84 ,
0x84 , 0x84 , 0x84
};
set_palette (0 , 15 , table_rgb);
return ;
}
void set_palette (int start, int end, unsigned char *rgb)
{
int i, eflags;
eflags = io_load_eflags ();
io_cli ();
io_out8 (0x03c8 , start);
for (i=start;i<=end;i++)
{
io_out8 (0x03c9 , rgb[0 ] / 4 );
io_out8 (0x03c9 , rgb[1 ] / 4 );
io_out8 (0x03c9 , rgb[2 ] / 4 );
rgb += 3 ;
}
io_store_eflags (eflags);
return ;
}
void boxfill8 (unsigned char *vram, int xsize, unsigned char c, int x0, int y0, int x1, int y1)
{
int x, y;
for (y = y0; y <= y1; y++)
{
for (x=x0; x<=x1; x++)
vram[y *xsize + x] = c;
}
return ;
}
void init_screen (char *vram, int x, int y)
{
boxfill8 (vram, x, COL8_008484, 0 , 0 , x - 1 , y - 29 );
boxfill8 (vram, x, COL8_C6C6C6, 0 , y - 28 , x - 1 , y - 28 );
boxfill8 (vram, x, COL8_FFFFFF, 0 , y - 27 , x - 1 , y - 27 );
boxfill8 (vram, x, COL8_C6C6C6, 0 , y - 26 , x - 1 , y - 1 );
boxfill8 (vram, x, COL8_FFFFFF, 3 , y - 24 , 59 , y - 24 );
boxfill8 (vram, x, COL8_FFFFFF, 2 , y - 24 , 2 , y - 4 );
boxfill8 (vram, x, COL8_848484, 3 , y - 4 , 59 , y - 4 );
boxfill8 (vram, x, COL8_848484, 59 , y - 23 , 59 , y - 5 );
boxfill8 (vram, x, COL8_000000, 2 , y - 3 , 59 , y - 3 );
boxfill8 (vram, x, COL8_000000, 60 , y - 24 , 60 , y - 3 );
boxfill8 (vram, x, COL8_848484, x - 47 , y - 24 , x - 4 , y - 24 );
boxfill8 (vram, x, COL8_848484, x - 47 , y - 23 , x - 47 , y - 4 );
boxfill8 (vram, x, COL8_FFFFFF, x - 47 , y - 3 , x - 4 , y - 3 );
boxfill8 (vram, x, COL8_FFFFFF, x - 3 , y - 24 , x - 3 , y - 3 );
return ;
}
글자 쓰기
putchar8로 폰트데이터 드로잉 구현
void io_hlt (void ) ;
void io_cli (void ) ;
void io_out8 (int prot, int data) ;
int io_load_eflags (void ) ;
void io_store_eflags (int eflags) ;
void init_palette (void ) ;
void set_palette (int start, int end, unsigned char *rgb) ;
void boxfill8 (unsigned char *vram, int xsize, unsigned char c, int x0, int y0, int x1, int y1) ;
void init_screen (char *vram, int x, int y) ;
void putfont8 (char *vram, int xsize, int x, int y, char c, char *font) ;
#define COL8_000000 0
#define COL8_FF0000 1
#define COL8_00FF00 2
#define COL8_FFFF00 3
#define COL8_0000FF 4
#define COL8_FF00FF 5
#define COL8_00FFFF 6
#define COL8_FFFFFF 7
#define COL8_C6C6C6 8
#define COL8_840000 9
#define COL8_008400 10
#define COL8_848400 11
#define COL8_000084 12
#define COL8_840084 13
#define COL8_008484 14
#define COL8_848484 15
struct BOOTINFO {
char cyls, leds, vmode, reserve;
short scrnx, scrny;
char *vram;
};
void HariMain (void )
{
struct BOOTINFO *binfo = (struct BOOTINFO *) 0x0ff0 ;
static char font_A[16 ] = {
0x00 , 0x18 , 0x18 , 0x18 , 0x18 , 0x24 , 0x24 , 0x24 ,
0x24 , 0x7e , 0x42 , 0x42 , 0x42 , 0xe7 , 0x00 , 0x00
};
init_palette ();
init_screen (binfo->vram, binfo->scrnx, binfo->scrny);
putfont8 (binfo->vram, binfo->scrnx, 10 , 10 , COL8_FFFFFF, font_A);
for (;;)
{
io_hlt ();
}
}
void init_palette (void )
{
static unsigned char table_rgb[16 * 3 ] = {
0x00 , 0x00 , 0x00 ,
0xff , 0x00 , 0x00 ,
0x00 , 0xff , 0x00 ,
0xff , 0xff , 0x00 ,
0x00 , 0x00 , 0xff ,
0xff , 0x00 , 0xff ,
0x00 , 0xff , 0xff ,
0xff , 0xff , 0xff ,
0xc6 , 0xc6 , 0xc6 ,
0x84 , 0x00 , 0x00 ,
0x00 , 0x84 , 0x00 ,
0x84 , 0x84 , 0x00 ,
0x00 , 0x00 , 0x84 ,
0x84 , 0x00 , 0x84 ,
0x00 , 0x84 , 0x84 ,
0x84 , 0x84 , 0x84
};
set_palette (0 , 15 , table_rgb);
return ;
}
void set_palette (int start, int end, unsigned char *rgb)
{
int i, eflags;
eflags = io_load_eflags ();
io_cli ();
io_out8 (0x03c8 , start);
for (i=start;i<=end;i++)
{
io_out8 (0x03c9 , rgb[0 ] / 4 );
io_out8 (0x03c9 , rgb[1 ] / 4 );
io_out8 (0x03c9 , rgb[2 ] / 4 );
rgb += 3 ;
}
io_store_eflags (eflags);
return ;
}
void boxfill8 (unsigned char *vram, int xsize, unsigned char c, int x0, int y0, int x1, int y1)
{
int x, y;
for (y = y0; y <= y1; y++)
{
for (x=x0; x<=x1; x++)
vram[y *xsize + x] = c;
}
return ;
}
void init_screen (char *vram, int x, int y)
{
boxfill8 (vram, x, COL8_008484, 0 , 0 , x - 1 , y - 29 );
boxfill8 (vram, x, COL8_C6C6C6, 0 , y - 28 , x - 1 , y - 28 );
boxfill8 (vram, x, COL8_FFFFFF, 0 , y - 27 , x - 1 , y - 27 );
boxfill8 (vram, x, COL8_C6C6C6, 0 , y - 26 , x - 1 , y - 1 );
boxfill8 (vram, x, COL8_FFFFFF, 3 , y - 24 , 59 , y - 24 );
boxfill8 (vram, x, COL8_FFFFFF, 2 , y - 24 , 2 , y - 4 );
boxfill8 (vram, x, COL8_848484, 3 , y - 4 , 59 , y - 4 );
boxfill8 (vram, x, COL8_848484, 59 , y - 23 , 59 , y - 5 );
boxfill8 (vram, x, COL8_000000, 2 , y - 3 , 59 , y - 3 );
boxfill8 (vram, x, COL8_000000, 60 , y - 24 , 60 , y - 3 );
boxfill8 (vram, x, COL8_848484, x - 47 , y - 24 , x - 4 , y - 24 );
boxfill8 (vram, x, COL8_848484, x - 47 , y - 23 , x - 47 , y - 4 );
boxfill8 (vram, x, COL8_FFFFFF, x - 47 , y - 3 , x - 4 , y - 3 );
boxfill8 (vram, x, COL8_FFFFFF, x - 3 , y - 24 , x - 3 , y - 3 );
return ;
}
void putfont8 (char *vram, int xsize, int x, int y, char c, char *font)
{
int i;
char *p, d;
for (i = 0 ; i < 16 ; i++)
{
p = vram + (y + i) * xsize + x;
d = font[i];
if ((d&0x80 ) != 0 ) {p[0 ]=c;}
if ((d&0x40 ) != 0 ) {p[1 ]=c;}
if ((d&0x20 ) != 0 ) {p[2 ]=c;}
if ((d&0x10 ) != 0 ) {p[3 ]=c;}
if ((d&0x08 ) != 0 ) {p[4 ]=c;}
if ((d&0x04 ) != 0 ) {p[5 ]=c;}
if ((d&0x02 ) != 0 ) {p[6 ]=c;}
if ((d&0x01 ) != 0 ) {p[7 ]=c;}
}
}
폰트 데이터 가져와 사용하기
위 예제에선 폰트 A 데이터를 직접 그려서 썻으나
아래 택스트 파일을 바이너리 이미지로 만들어 bootpack.obj와 합쳐서 사용함.
void HariMain (void )
{
struct BOOTINFO *binfo = (struct BOOTINFO *) 0x0ff0 ;
extern char hankaku[4096 ];
init_palette ();
init_screen (binfo->vram, binfo->scrnx, binfo->scrny);
putfont8 (binfo->vram, binfo->scrnx, 8 , 8 , COL8_FFFFFF, hankaku + 'A' * 16 );
putfont8 (binfo->vram, binfo->scrnx, 16 , 8 , COL8_FFFFFF, hankaku + 'B' * 16 );
putfont8 (binfo->vram, binfo->scrnx, 24 , 8 , COL8_FFFFFF, hankaku + 'C' * 16 );
putfont8 (binfo->vram, binfo->scrnx, 40 , 8 , COL8_FFFFFF, hankaku + '1' * 16 );
putfont8 (binfo->vram, binfo->scrnx, 48 , 8 , COL8_FFFFFF, hankaku + '2' * 16 );
putfont8 (binfo->vram, binfo->scrnx, 56 , 8 , COL8_FFFFFF, hankaku + '3' * 16 );
for (;;)
{
io_hlt ();
}
}