IDT까지 어찌어찌 해서 처리는 해 놓은 것 같다. 그런데 갈수록 함수가 늘고 이것저것 변수들도 늘고 이러니 메인 파일이 지저분 하다. “뭐… 언제 시간 나면 한번 정리 해야지..~”
그런데… 다음에 할 내용이 조금 무겁고 어렵다.. 페이징. 많이 어렵다. 이걸 구현 하느리 기존 소스 정리나 하는 게 나을 것 같다. 쉴겸…..~~
우선.. StartKernel() 함수를 좀더 간단하게 정리했다.
int StartKernel(int argc, char *argv[])
{
char *hello = "Hello OS!";
char *complete = "complete.";
BYTE* vidmem = (BYTE*)0xB8000;
BYTE data = 0;
int b = 5;
int c = 0;
kprint(hello);
InitPIC();
Init_IDT();
Init_kbd();
while(1) ;
return 0;
}
InitPIC() PIC 초기화 함수
Init_IDT() IDT 초기화 함수
Init_kbd() 키보드 관련 초기화 함수.
…
많이 간단해졌다.
printf 함수도 다시 구현하였다… 커널에서 프린트 한다는 의미로 kprint (많은 OS 들도 kprint 라고 하더라 ^^ ㅋㅋㅋ. 그래서 이름을 차용했다.)로 함수명을 바구고.. 문자열만이 아닌 가변 인자를 받아 출력 할 수 있도록 수정하였다.
문자열 관련 함수들 . strlen, strcpy, strcmp, memcpy, memcmp, memset 이런 함수들은 그냥 기존 코드들을 가져왔다. 이런걸로 시간 뺏기기 싫어서..(라고 쓰고… 만들 줄 모르고… 다시 작성한다는게 귀찮아서~^^)..^^
그리고 IDT 최종 키보드 입력 부분까지 구현했었는데..
문제는 대문자와 특수문자( !~@#등) 출력이 되지 않았다… 그래서 키보드 테이블을 대문자와 특수문자를 출력 할 수 있도록 SHIFT키와 CAPS LOCK키를 지원하도록 수정했다.
#include "stdio.h"
#include "keyboard.h"
#include "8042.h"
#include "asm.h"
BOOL IsLShift = FALSE;
BOOL IsRShift = FALSE;
BOOL IsCapslock = FALSE;
BOOL IsAlt = FALSE;
BOOL IsCtrl = FALSE;
BOOL IsNumLock = FALSE;
KeyboardInfo kbd_scancode[] =
{
{0x00, 0x00, 0x00}, // ESC
{'1','!', 0x00, 0x00},
{'2','@', 0x00, 0x00},
{'3','#', 0x00, 0x00},
{'4','$', 0x00, 0x00},
{'5','%', 0x00, 0x00},
{'6','^', 0x00, 0x00},
{'7','&', 0x00, 0x00},
{'8','*', 0x00, 0x00},
{'9','(', 0x00, 0x00},
{'0',')', 0x00, 0x00},
{'-','_', 0x00, 0x00},
{'=','+', 0x00, 0x00},
{0x00,0x00, 0x00, 0x00}, // BACKSPACE
{0x00,0x00, 0x00, 0x00}, // TAB
{'q','Q', 0x00, 0x00},
{'w','W', 0x00, 0x00},
{'e','E', 0x00, 0x00},
{'r','R', 0x00, 0x00},
{'t','T', 0x00, 0x00},
{'y','Y', 0x00, 0x00},
{'u','U', 0x00, 0x00},
{'i','I', 0x00, 0x00},
{'o','O', 0x00, 0x00},
{'p','P', 0x00, 0x00},
{'[','{', 0x00, 0x00},
{']','}', 0x00, 0x00},
{0x00,0x00, 0x00, 0x00}, // ENTER
{0x00,0x00, 0x00, 0x00}, // CTRL
{'a','A', 0x00, 0x00},
{'s','S', 0x00, 0x00},
{'d','D', 0x00, 0x00},
{'f','F', 0x00, 0x00},
{'g','G', 0x00, 0x00},
{'h','H', 0x00, 0x00},
{'j','J', 0x00, 0x00},
{'k','K', 0x00, 0x00},
{'l','L', 0x00, 0x00},
{';',':', 0x00, 0x00},
{'\'','"', 0x00, 0x00},
{'`','~', 0x00, 0x00},
{0x00,0x00, 0x00, 0x00}, // Left Shift
{'\\','|', 0x00, 0x00},
{'z','Z', 0x00, 0x00},
{'x','X', 0x00, 0x00},
{'c','C', 0x00, 0x00},
{'v','V', 0x00, 0x00},
{'b','B', 0x00, 0x00},
{'n','N', 0x00, 0x00},
{'m','M', 0x00, 0x00},
{',','<', 0x00, 0x00},
{'.','>', 0x00, 0x00},
{'/','?', 0x00, 0x00},
{0x00,0x00, 0x00, 0x00}, // right shift
{0x00,0x00, 0x00, 0x00}, // PrtSc
{0x00,0x00, 0x00, 0x00}, // ALT
{' ',' ', 0x00, 0x00}, // space
{0x00,0x00, 0x00, 0x00}, // caps
{0x00,0x00, 0x00, 0x00}, // F1
{0x00,0x00, 0x00, 0x00}, // F2
{0x00,0x00, 0x00, 0x00}, // F3
{0x00,0x00, 0x00, 0x00}, // F4
{0x00,0x00, 0x00, 0x00}, // F5
{0x00,0x00, 0x00, 0x00}, // F6
{0x00,0x00, 0x00, 0x00}, // F7
{0x00,0x00, 0x00, 0x00}, // F8
{0x00,0x00, 0x00, 0x00}, // F9
{0x00,0x00, 0x00, 0x00}, // F10
{0x00,0x00, 0x00, 0x00}, // number lock
{0x00,0x00, 0x00, 0x00}, // scroll
{0x00,0x00, 0x00, 0x00}, // home { numlook = 7 }
{0x00,0x00, 0x00, 0x00}, // up { numlook = 8 }
{0x00,0x00, 0x00, 0x00}, // pgup { numlook = 9 }
{'-','-', 0x00, 0x00}, // -
{0x00,0x00, 0x00, 0x00}, // left { numlook = 4 }
{0x00,0x00, 0x00, 0x00}, // center { numlook = 5 }
{0x00,0x00, 0x00, 0x00}, // right { numlook = 6 }
{'+','*', 0x00, 0x00},
{0x00,0x00, 0x00, 0x00}, // end { numlook = 1 }
{0x00,0x00, 0x00, 0x00}, // down { numlook = 2 }
{0x00,0x00, 0x00, 0x00}, // pgdn { numlook = 3 }
{0x00,0x00, 0x00, 0x00}, // ins { numlook = 0 }
{0x00,0x00, 0x00, 0x00}, // del { numlook = . }
{'/','/', 0x00, 0x00}, // /
{0x00,0x00, 0x00, 0x00}, // enter
{0x00,0x00, 0x57, 0xD7}, // F11
{0x00,0x00, 0x58, 0xD8}, // F12
{0x00,0x00, 0x52, 0xD2}, // ins
{0x00,0x00, 0x53, 0xD3}, // del
{0x00,0x00, 0x47, 0xC7}, // home
{0x00,0x00, 0x4F, 0xCF}, // end
{0x00,0x00, 0x49, 0xC9}, // pgup
{0x00,0x00, 0x51, 0xD1}, // pgdn
{0x00,0x00, 0x4B, 0xCB}, // left
{0x00,0x00, 0x4D, 0xCD}, // right
{0x00,0x00, 0x48, 0xC8}, // up
{0x00,0x00, 0x50, 0xD0}, // down
{0x00,0x00, 0x38, 0xB8}, // right alt
{0x00,0x00, 0x1D, 0x9D}, // right ctrl
{0x11,0x00, 0x00, 0x00}}; // pause // 99 index
void Init_kbd()
{
int i = 0;
for(i = 0; i < 0x54; i++ )
{
kbd_scancode[i].Press = i+1;
kbd_scancode[i].Release = 0x81 + i;
}
Write_port_byte(0x21, 0xFD);
}
int GetScanCodeInfo(BYTE code, KeyboardInfo *pkbdInfo)
{
int i;
if( code > 0xD9 ) // Unknown code
return UNKNOWN_SCANCODE;
for( i = 0; i < 0x64; i++ )
{
if( kbd_scancode[i].Press == code )
{
*pkbdInfo = kbd_scancode[i];
return PRESS_SCANCODE;
}
if(kbd_scancode[i].Release == code)
{
*pkbdInfo = kbd_scancode[i];
return RELEASE_SCANCODE;
}
}
return UNKNOWN_SCANCODE;
}
void Kbd_ScanCode()
{
BYTE scancode;
int scancode_type;
KeyboardInfo Info;
scancode = GetKeyboardScanCode();
scancode_type = GetScanCodeInfo(scancode, &Info);
if(scancode_type == UNKNOWN_SCANCODE )
{
return;
}
if( scancode_type == RELEASE_SCANCODE )
{
switch(Info.Press)
{
case KEY_LSHIFT:
IsLShift = FALSE;
case KEY_RSHIFT:
IsRShift = FALSE;
break;
case KEY_ALT:
IsAlt = FALSE;
break;
case KEY_CTRL:
IsCtrl = FALSE;
break;
}
return;
}
if( scancode_type == PRESS_SCANCODE )
{
switch(Info.Press)
{
case KEY_LSHIFT:
IsLShift = TRUE;
break;
case KEY_RSHIFT:
IsRShift = TRUE;
break;
case KEY_ALT:
IsAlt = TRUE;
break;
case KEY_CTRL:
IsCtrl = TRUE;
break;
case KEY_CAPSLOCK:
IsCapslock = !IsCapslock;
break;
case KEY_NUMBERLOCK:
IsNumLock = !IsNumLock;
break;
case KEY_ENTER:
kprint("\n");
return;
}
if( IsCtrl || IsAlt )
{
// function key process
}
if( IsNumLock )
{
switch( Info.Press )
{
case 0x47:
putc('7');
return;
case 0x48:
putc('8');
return;
case 0x49:
putc('9');
return;
case 0x4B:
putc('4');
return;
case 0x4C:
putc('5');
return;
case 0x4D:
putc('6');
return;
case 0x4F:
putc('1');
return;
case 0x50:
putc('2');
return;
case 0x51:
putc('3');
return;
case 0x52:
putc('0');
return;
case 0x53:
putc('.');
return;
}
}
if( IsCapslock )
{
if( Info.Lowercase >= 'a' && Info.Lowercase <= 'z')
{
if( IsLShift || IsRShift )
putc(Info.Lowercase);
else
putc(Info.Uppercase);
return;
}
}
if( IsLShift || IsRShift )
{
if(Info.Lowercase != 0x00 )
putc(Info.Uppercase);
else
{
// function key process
// otherwise
}
return;
}
if( Info.Lowercase != 0x00 )
putc(Info.Lowercase);
}
}
잘 된다.
그후 이것저것 바꿨다.
'프로그래밍 > OS 만들기' 카테고리의 다른 글
| OS 만들기 #20 가상메모리, 페이징(PAGING) 처리 - 1 (2) | 2018.10.23 |
|---|---|
| OS 만들기 #18 IDT - 3 (0) | 2015.08.12 |
| OS 만들기 #17 IDT - 2 (0) | 2015.08.10 |
| OS 만들기 #16 IDT - 1 (0) | 2015.07.30 |
| OS 만들기 #15 커널-키보드 입력 (0) | 2015.02.09 |