일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- Gundam
- 프라모델
- OS강의
- 쉽게 배우는 운영체제 풀이
- OS 제작
- 맛집
- Project Euler 해답
- 운영체제
- 운영체제 정리
- Project Euler Problem
- 30일
- OS 강의
- OS 그래픽 처리
- 쉽게 배우는 운영체제 연습문제
- 운영체제 문제 풀이
- project euler
- 쉽게 배우는 운영체제
- OS
- 운영체제 제작
- rg
- 운영체제 만들기
- os 만들기
- hg
- 건담 엑스포
- 건담 프라모델
- 건담
- 건프라
- OS 구조와 원리
- 맛집 추천
- 쉽게 배우는 운영체제 솔루션
- Today
- Total
밤색모자이크의 개발이야기
4일차. C언어와 화면 표시 - (1) 줄무늬 화면띄우기 본문
안녕하세요. 밤색모자이크입니다.
오늘은 그래픽 작업을 하려고합니다.
근데 이게 줄무늬부터 사각형 후에 OS모습을해서 줄무늬부터 시작해서 나눠서 하려고합니다.
개발환경
운영체제 : Windows10
텍스트 편집기 : Atom
PC 에뮬레이터 : QEMU
소스코드
수정된 파일
naskFunc.nas : 인터럽트 함수, 색상지정 주소 지정
bootpack.c : 팔레트 설정 및 세팅
naskFunc.nas
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 | ; naskfunc ; TAB=4 [FORMAT "WCOFF"] ; 오브젝트 파일을 만드는 모드 [INSTRSET "i486p"] ; 486명령까지 사용하고 싶다고 하는 기술 [BITS 32] ; 32비트 모드용의 기계어를 만든다 [FILE "naskfunc.nas"] ; 원시 파일명 정보 GLOBAL _io_hlt, _io_cli, _io_sti, io_stihlt GLOBAL _io_in8, _io_in16, _io_in32 GLOBAL _io_out8, _io_out16, _io_out32 GLOBAL _io_load_eflags, _io_store_eflags [SECTION .text] _io_hlt: ; void io_hlt(void); HLT RET _io_cli: ; void io_cli(void); CLI RET _io_sti: ; void io_sti(void); STI RET _io_stihlt: ; void io_stihlt(void); STI HLT RET _io_in8: ; int io_in8(int port); MOV EDX,[ESP+4] ; port MOV EAX,0 IN AL,DX RET _io_in16: ; int io_in16(int port); MOV EDX,[ESP+4] ; port MOV EAX,0 IN AX,DX RET _io_in32: ; int io_in32(int port); MOV EDX,[ESP+4] ; port IN EAX,DX RET _io_out8: ; void io_out8(int port, int data); MOV EDX,[ESP+4] ; port MOV AL,[ESP+8] ; data OUT DX,AL RET _io_out16: ; void io_out16(int port, int data); MOV EDX,[ESP+4] ; port MOV EAX,[ESP+8] ; data OUT DX,AX RET _io_out32: ; void io_out32(int port, int data); MOV EDX,[ESP+4] ; port MOV EAX,[ESP+8] ; data OUT DX,EAX RET _io_load_eflags: ; int io_load_eflags(void); PUSHFD ; PUSH EFLAGS의 의미 POP EAX RET _io_store_eflags: ; void io_store_eflags(int eflags); MOV EAX,[ESP+4] PUSH EAX POPFD ; POP EFLAGS의 의미 RET |
엄청 많은 함수가 추가되었습니다.
가장 중요한 것은 68라인과 73라인입니다.
두 함수가 인터럽트를 설정하고 해지합니다.
이 두 함수에서 EFFFLAGS를 읽고 쓰는 연산을 하면서 플래그들의 값을 보고 인터럽트를 받을지 말지 결정하게 됩니다.
3일차 코드의 asmhead.nas에서 14라인에 설정함 VRAM은 그래픽 버퍼의 개시 번지가 됩니다.
따라서, VRAM에 색상을 넣어주면 원하는 그래픽을 출력할 수 있습니다.
io_out8과 같은 함수들은 간단합니다. 지정된 장비번호로 데이터를 보내는 함수이고 처리하는 함수입니다.
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 | 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 HariMain(void) { int i; char *p; init_palette(); /* 팔레트 설정 */ p = (char *) 0xa0000; /* 번지를 대입 */ for (i = 0; i <= 0xffff; i++) { p[i] = i & 0x0f; } 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; } |
팔레트를 설정하고 세팅하는 함수들을 구현 것 입니다.
실행
파일 목록을 3일차와 바뀐게 없습니다.
Icons_nt.bat을 열고 make run을 수행합니다.
위와 같은 파일들이 생성되고 마지막으로 이미지 파일이 생성되면서 실행됩니다.
결과
드디어 OS 처음으로 그래픽 작업을 하기 시작했네요.
생각보다 눈이 아픕니다.
4일차 첫번째 작업입니다.
참고 자료
OS 구조와 원리, 카와이 히데미 저, 한빛미디어 출판
링크 : http://www.hanbit.co.kr/store/books/look.php?p_code=B9833754652
링크 : http://godrjsmgl.tistory.com/66
'Embedded > OS제작 with OS구조와원리' 카테고리의 다른 글
4일차. C언어와 화면 표시 - (3) OS 화면 구성 (0) | 2017.07.09 |
---|---|
4일차. C언어와 화면 표시 - (2) 사각형 띄우기 (0) | 2017.07.09 |
3일차. 32비트 모드와 C언어 도입 (0) | 2017.07.07 |
2일차. 부트섹터 분리와 Make 파일 생성 (3) | 2017.06.27 |
1일차. 어셈블리 입문과 Helloworld 띄우기 (1) | 2017.06.20 |