일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- 맛집 추천
- OS 강의
- 쉽게 배우는 운영체제 연습문제
- 건담 엑스포
- Project Euler 해답
- OS 제작
- OS강의
- 맛집
- 건담
- project euler
- os 만들기
- 쉽게 배우는 운영체제 솔루션
- rg
- 쉽게 배우는 운영체제 풀이
- 30일
- 프라모델
- 운영체제 제작
- 쉽게 배우는 운영체제
- 운영체제
- 운영체제 문제 풀이
- 운영체제 정리
- Gundam
- OS 구조와 원리
- 건담 프라모델
- Project Euler Problem
- hg
- OS 그래픽 처리
- OS
- 운영체제 만들기
- 건프라
- Today
- Total
밤색모자이크의 개발이야기
8일차. 마우스 제어와 32비트 모드 전환 본문
안녕하세요. 밤색모자이크입니다.
오늘은 드디어 마우스가 움직였네요. ㅜㅜ
약간 문제가 있긴하지만 어째든 움직입니다.
그리고 책을 읽다보면 asmbead.nas 부분의 약 100행정도를 그냥 넘어가는 부분이 있는데 이번 장에서 설명을 합니다.
저는 그냥 단순히 메모리맵으로 대신하겠습니다.
0x00000000 - 0x000fffff : 부팅중에 여러 용도로 사용, 그 이후에는 비어짐
0x00100000 - 0x00267ffff : 플로피 디스크 내용 기억
0x00268000 - 0x0026f7ff : 비어 있음
0x0026f800 - 0x0026ffff : IDT
0x00270000 - 0x0027ffff : GDT
0x00280000 - 0x002ffff : bootpack.hrb
0x00300000 - 0x003fffff : 스택 등
0x00400000 - : 비어있음
개발환경
운영체제 : Windows10
텍스트 편집기 : Atom
PC 에뮬레이터 : QEMU
소스코드
수정된 파일
bootpack.c : 마우스 처리에 관한 함수와 구조체 추가
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 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 | /* bootpack의 메인 */ #include "bootpack.h" #include <stdio.h> struct MOUSE_DEC { unsigned char buf[3], phase; int x, y, btn; }; extern struct FIFO8 keyfifo, mousefifo; void enable_mouse(struct MOUSE_DEC *mdec); void init_keyboard(void); int mouse_decode(struct MOUSE_DEC *mdec, unsigned char dat); void HariMain(void) { struct BOOTINFO *binfo = (struct BOOTINFO *) ADR_BOOTINFO; char s[40], mcursor[256], keybuf[32], mousebuf[128]; int mx, my, i; struct MOUSE_DEC mdec; init_gdtidt(); init_pic(); io_sti(); /* IDT/PIC의 초기화가 끝났으므로 CPU의 인터럽트 금지를 해제 */ fifo8_init(&keyfifo, 32, keybuf); fifo8_init(&mousefifo, 128, mousebuf); io_out8(PIC0_IMR, 0xf9); /* PIC1와 키보드를 허가(11111001) */ io_out8(PIC1_IMR, 0xef); /* 마우스를 허가(11101111) */ init_keyboard(); init_palette(); init_screen8(binfo->vram, binfo->scrnx, binfo->scrny); mx = (binfo->scrnx - 16) / 2; /* 화면 중앙이 되도록 좌표 계산 */ my = (binfo->scrny - 28 - 16) / 2; init_mouse_cursor8(mcursor, COL8_008484); putblock8_8(binfo->vram, binfo->scrnx, 16, 16, mx, my, mcursor, 16); sprintf(s, "(%3d, %3d)", mx, my); putfonts8_asc(binfo->vram, binfo->scrnx, 0, 0, COL8_FFFFFF, s); enable_mouse(&mdec); for (;;) { putfonts8_asc(binfo->vram, binfo->scrnx, 30, 50, COL8_FFFFFF, "Hi, Chestnut Mosaic OS"); io_cli(); if (fifo8_status(&keyfifo) + fifo8_status(&mousefifo) == 0) { io_stihlt(); } else { if (fifo8_status(&keyfifo) != 0) { i = fifo8_get(&keyfifo); io_sti(); sprintf(s, "%02X", i); boxfill8(binfo->vram, binfo->scrnx, COL8_008484, 0, 16, 15, 31); putfonts8_asc(binfo->vram, binfo->scrnx, 0, 16, COL8_FFFFFF, s); } else if (fifo8_status(&mousefifo) != 0) { i = fifo8_get(&mousefifo); io_sti(); if (mouse_decode(&mdec, i) != 0) { /* 데이터가 3바이트 모였으므로 표시 */ sprintf(s, "[lcr %4d %4d]", mdec.x, mdec.y); if ((mdec.btn & 0x01) != 0) { s[1] = 'L'; } if ((mdec.btn & 0x02) != 0) { s[3] = 'R'; } if ((mdec.btn & 0x04) != 0) { s[2] = 'C'; } boxfill8(binfo->vram, binfo->scrnx, COL8_008484, 32, 16, 32 + 15 * 8 - 1, 31); putfonts8_asc(binfo->vram, binfo->scrnx, 32, 16, COL8_FFFFFF, s); /* 마우스 커서의 이동 */ boxfill8(binfo->vram, binfo->scrnx, COL8_008484, mx, my, mx + 15, my + 15); /* 마우스 지운다 */ mx += mdec.x; my += mdec.y; if (mx < 0) { mx = 0; } if (my < 0) { my = 0; } if (mx > binfo->scrnx - 16) { mx = binfo->scrnx - 16; } if (my > binfo->scrny - 16) { my = binfo->scrny - 16; } sprintf(s, "(%3d, %3d)", mx, my); boxfill8(binfo->vram, binfo->scrnx, COL8_008484, 0, 0, 79, 15); /* 좌표 지운다 */ putfonts8_asc(binfo->vram, binfo->scrnx, 0, 0, COL8_FFFFFF, s); /* 좌표 쓴다 */ putblock8_8(binfo->vram, binfo->scrnx, 16, 16, mx, my, mcursor, 16); /* 마우스 그린다 */ } } } } } #define PORT_KEYDAT 0x0060 #define PORT_KEYSTA 0x0064 #define PORT_KEYCMD 0x0064 #define KEYSTA_SEND_NOTREADY 0x02 #define KEYCMD_WRITE_MODE 0x60 #define KBC_MODE 0x47 void wait_KBC_sendready(void) { /* 키보드 컨트롤러가 데이터 송신이 가능하게 되는 것을 기다린다 */ for (;;) { if ((io_in8(PORT_KEYSTA) & KEYSTA_SEND_NOTREADY) == 0) { break; } } return; } void init_keyboard(void) { /* 키보드 컨트롤러의 초기화 */ wait_KBC_sendready(); io_out8(PORT_KEYCMD, KEYCMD_WRITE_MODE); wait_KBC_sendready(); io_out8(PORT_KEYDAT, KBC_MODE); return; } #define KEYCMD_SENDTO_MOUSE 0xd4 #define MOUSECMD_ENABLE 0xf4 void enable_mouse(struct MOUSE_DEC *mdec) { /* 마우스 유효 */ wait_KBC_sendready(); io_out8(PORT_KEYCMD, KEYCMD_SENDTO_MOUSE); wait_KBC_sendready(); io_out8(PORT_KEYDAT, MOUSECMD_ENABLE); /* 잘되면 ACK(0xfa)가 송신되어 온다 */ mdec->phase = 0; /* 마우스의 0xfa를 기다리고 있는 단계 */ return; } int mouse_decode(struct MOUSE_DEC *mdec, unsigned char dat) { if (mdec->phase == 0) { /* 마우스의 0xfa를 기다리고 있는 단계 */ if (dat == 0xfa) { mdec->phase = 1; } return 0; } if (mdec->phase == 1) { /* 마우스의 1바이트째를 기다리고 있는 단계 */ if ((dat & 0xc8) == 0x08) { /* 올바른 1바이트째였다 */ mdec->buf[0] = dat; mdec->phase = 2; } return 0; } if (mdec->phase == 2) { /* 마우스의 2바이트째를 기다리고 있는 단계 */ mdec->buf[1] = dat; mdec->phase = 3; return 0; } if (mdec->phase == 3) { /* 마우스의 3바이트째를 기다리고 있는 단계 */ mdec->buf[2] = dat; mdec->phase = 1; mdec->btn = mdec->buf[0] & 0x07; mdec->x = mdec->buf[1]; mdec->y = mdec->buf[2]; if ((mdec->buf[0] & 0x10) != 0) { mdec->x |= 0xffffff00; } if ((mdec->buf[0] & 0x20) != 0) { mdec->y |= 0xffffff00; } mdec->y = - mdec->y; /* 마우스에서는 y방향의 부호가 화면과 반대 */ return 1; } return -1; /* 여기에 올 일은 없을 것 */ } |
마우스 관련된 함수들이 다 추가됬습니다.
마우스 인터럽트를 통한 정보는 3바이트씩 들어옵니다.
이걸 이용해서 마우스 움직임을 설정할 수 있습니다.
실행
실행전 파일 목록
make run 결과
실행 후 파일 목록
결과
잘 움직이는데...
이런 문제가 발생합니다.
참고 자료
OS 구조와 원리, 카와이 히데미 저, 한빛미디어 출판
링크 : http://www.hanbit.co.kr/store/books/look.php?p_code=B9833754652
링크 : http://godrjsmgl.tistory.com/66
'Embedded > OS제작 with OS구조와원리' 카테고리의 다른 글
7일차. FIFO와 마우스 제어 (0) | 2017.08.06 |
---|---|
6일차. 분할 컴파일과 인터럽트 처리 (0) | 2017.08.01 |
5일차. 문자 표시와 마우스를 위한 GDT/IDT 초기화 (0) | 2017.07.10 |
4일차. C언어와 화면 표시 - (3) OS 화면 구성 (0) | 2017.07.09 |
4일차. C언어와 화면 표시 - (2) 사각형 띄우기 (0) | 2017.07.09 |