Notice
Recent Posts
Recent Comments
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
Tags
- 건담
- 운영체제 정리
- 30일
- 운영체제 문제 풀이
- 운영체제 제작
- OS
- hg
- project euler
- Project Euler 해답
- 건담 프라모델
- Project Euler Problem
- OS 강의
- 쉽게 배우는 운영체제 풀이
- 건담 엑스포
- rg
- OS 제작
- 맛집
- 맛집 추천
- 운영체제
- 건프라
- 쉽게 배우는 운영체제 연습문제
- 쉽게 배우는 운영체제
- OS 구조와 원리
- OS강의
- OS 그래픽 처리
- Gundam
- 쉽게 배우는 운영체제 솔루션
- 운영체제 만들기
- 프라모델
- os 만들기
Archives
- Today
- Total
밤색모자이크의 개발이야기
4일차. C언어와 화면 표시 - (3) OS 화면 구성 본문
안녕하세요. 밤색모자이크입니다.
이제 4일차 마지막인 OS 화면 구성을 하도록 하겠습니다.
마찬가지로 bootpack.c 만 수정하면 됩니다.
사각형 응용이요 이전의 4일차를 보실 분들은 다음 링크로 이동해주세요.
줄무늬 보이기 - http://godrjsmgl.tistory.com/109
사각형 띄우기 - http://godrjsmgl.tistory.com/110
개발환경
운영체제 : Windows10
텍스트 편집기 : Atom
PC 에뮬레이터 : QEMU
소스코드
수정된 파일
bootpack.c : OS 화면 구성으로 함수가 바뀜
bootpack.c
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 | void io_hlt(void); void io_cli(void); void io_out8(int port, 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); #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 void HariMain(void) { char *vram; int xsize, ysize; init_palette(); vram = (char *) 0xa0000; xsize = 320; ysize = 200; boxfill8(vram, xsize, COL8_008484, 0, 0, xsize - 1, ysize - 29); boxfill8(vram, xsize, COL8_C6C6C6, 0, ysize - 28, xsize - 1, ysize - 28); boxfill8(vram, xsize, COL8_FFFFFF, 0, ysize - 27, xsize - 1, ysize - 27); boxfill8(vram, xsize, COL8_C6C6C6, 0, ysize - 26, xsize - 1, ysize - 1); boxfill8(vram, xsize, COL8_FFFFFF, 3, ysize - 24, 59, ysize - 24); boxfill8(vram, xsize, COL8_FFFFFF, 2, ysize - 24, 2, ysize - 4); boxfill8(vram, xsize, COL8_848484, 3, ysize - 4, 59, ysize - 4); boxfill8(vram, xsize, COL8_848484, 59, ysize - 23, 59, ysize - 5); boxfill8(vram, xsize, COL8_000000, 2, ysize - 3, 59, ysize - 3); boxfill8(vram, xsize, COL8_000000, 60, ysize - 24, 60, ysize - 3); boxfill8(vram, xsize, COL8_848484, xsize - 47, ysize - 24, xsize - 4, ysize - 24); boxfill8(vram, xsize, COL8_848484, xsize - 47, ysize - 23, xsize - 47, ysize - 4); boxfill8(vram, xsize, COL8_FFFFFF, xsize - 47, ysize - 3, xsize - 4, ysize - 3); boxfill8(vram, xsize, COL8_FFFFFF, xsize - 3, ysize - 24, xsize - 3, ysize - 3); for (;;) { io_hlt(); } } void init_palette(void) { static unsigned char table_rgb[16 * 3] = { 0x00, 0x00, 0x00, /* 0:흑 */ 0xff, 0x00, 0x00, /* 1:밝은 빨강 */ 0x00, 0xff, 0x00, /* 2:밝은 초록 */ 0xff, 0xff, 0x00, /* 3:밝은 황색 */ 0x00, 0x00, 0xff, /* 4:밝은 파랑 */ 0xff, 0x00, 0xff, /* 5:밝은 보라색 */ 0x00, 0xff, 0xff, /* 6:밝은 물색 */ 0xff, 0xff, 0xff, /* 7:흰색 */ 0xc6, 0xc6, 0xc6, /* 8:밝은 회색 */ 0x84, 0x00, 0x00, /* 9:어두운 빨강 */ 0x00, 0x84, 0x00, /* 10:어두운 초록 */ 0x84, 0x84, 0x00, /* 11:어두운 황색 */ 0x00, 0x00, 0x84, /* 12:어두운 파랑 */ 0x84, 0x00, 0x84, /* 13:어두운 보라색 */ 0x00, 0x84, 0x84, /* 14:어두운 물색 */ 0x84, 0x84, 0x84 /* 15:어두운 회색 */ }; 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(); /* 허가 플래그를 0으로 하여 인터럽트를 금지로 한다 */ 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; } |
4일차 사각형만들기에서 바뀐것은 main함수 하나입니다.
위치를 조정해서 전부 사각형으로 OS 화면 구성을 하였습니다.
실행
make 하기 전의 파일 목록입니다.
make run 화면 모습 입니다.
make를 한 후의 파일목록 모습입니다.
결과
이제 그럴듯한 OS 화면 모습이 나왔습니다!!!!!
참고 자료
OS 구조와 원리, 카와이 히데미 저, 한빛미디어 출판
링크 : http://www.hanbit.co.kr/store/books/look.php?p_code=B9833754652
기존 글 바로가기 링크
링크 : http://godrjsmgl.tistory.com/66
'Embedded > OS제작 with OS구조와원리' 카테고리의 다른 글
6일차. 분할 컴파일과 인터럽트 처리 (0) | 2017.08.01 |
---|---|
5일차. 문자 표시와 마우스를 위한 GDT/IDT 초기화 (0) | 2017.07.10 |
4일차. C언어와 화면 표시 - (2) 사각형 띄우기 (0) | 2017.07.09 |
4일차. C언어와 화면 표시 - (1) 줄무늬 화면띄우기 (0) | 2017.07.09 |
3일차. 32비트 모드와 C언어 도입 (0) | 2017.07.07 |
Comments