diff options
| author | Aleksa Vučković <aleksav013@gmail.com> | 2022-01-09 18:50:48 +0100 |
|---|---|---|
| committer | Aleksa Vučković <aleksav013@gmail.com> | 2022-01-10 22:36:52 +0100 |
| commit | 8e79ceaa7d3995df5a5dcf0ffdbd52ebe4c52163 (patch) | |
| tree | 60424b081f4a3e37e0c87dfa764ea559f1ba0543 | |
| parent | dbbb74c22f42df9175eaea72c1eb12d6deab332c (diff) | |
Indentation
| -rw-r--r-- | src/as/boot.s | 32 | ||||
| -rw-r--r-- | src/as/crti.s | 12 | ||||
| -rw-r--r-- | src/as/crtn.s | 12 | ||||
| -rw-r--r-- | src/as/paging.s | 4 | ||||
| -rw-r--r-- | src/c/gdt.c | 10 | ||||
| -rw-r--r-- | src/c/heap.c | 265 | ||||
| -rw-r--r-- | src/c/idt.c | 3 | ||||
| -rw-r--r-- | src/c/keyboard.c | 150 | ||||
| -rw-r--r-- | src/c/keymap.c | 680 | ||||
| -rw-r--r-- | src/c/paging.c | 18 | ||||
| -rw-r--r-- | src/c/stack_protector.c | 14 | ||||
| -rw-r--r-- | src/c/stdio.c | 28 | ||||
| -rw-r--r-- | src/c/string.c | 48 | ||||
| -rw-r--r-- | src/c/timer.c | 6 | ||||
| -rw-r--r-- | src/c/tty.c | 70 | ||||
| -rw-r--r-- | src/c/vga.c | 25 | ||||
| -rw-r--r-- | src/include/stdio.h | 9 | ||||
| -rw-r--r-- | src/include/stdlib.h | 8 | ||||
| -rw-r--r-- | src/include/string.h | 8 | ||||
| -rw-r--r-- | src/include/sys/types.h | 2 | ||||
| -rw-r--r-- | src/include/unistd.h | 9 | ||||
| -rw-r--r-- | src/linker.ld | 70 |
22 files changed, 740 insertions, 743 deletions
diff --git a/src/as/boot.s b/src/as/boot.s index 68e5947..907cd3c 100644 --- a/src/as/boot.s +++ b/src/as/boot.s @@ -3,7 +3,7 @@ .set FLAGS, ALIGN | MEMINFO .set MAGIC, 0x1BADB002 .set CHECKSUM, -(MAGIC + FLAGS) - + .section .multiboot .align 4 .long MAGIC @@ -51,20 +51,20 @@ stack_top: .section .text .type _start, @function _start: - call init_gdt_table - ljmp $CODE_SEGMENT, $code - + call init_gdt_table + ljmp $CODE_SEGMENT, $code + code: - movw $DATA_SEGMENT, %ax - movw %ax, %ds - movw %ax, %es - movw %ax, %fs - movw %ax, %gs - movw %ax, %ss - movl $stack_top, %esp - cli - call _init - call kernel_main - hlt - + movw $DATA_SEGMENT, %ax + movw %ax, %ds + movw %ax, %es + movw %ax, %fs + movw %ax, %gs + movw %ax, %ss + movl $stack_top, %esp + cli + call _init + call kernel_main + hlt + .size _start, . - _start diff --git a/src/as/crti.s b/src/as/crti.s index 30dd4ea..5894e2d 100644 --- a/src/as/crti.s +++ b/src/as/crti.s @@ -3,14 +3,14 @@ .global _init .type _init, @function _init: - push %ebp - movl %esp, %ebp - /* gcc will nicely put the contents of crtbegin.o's .init section here. */ + push %ebp + movl %esp, %ebp + /* gcc will nicely put the contents of crtbegin.o's .init section here. */ .section .fini .global _fini .type _fini, @function _fini: - push %ebp - movl %esp, %ebp - /* gcc will nicely put the contents of crtbegin.o's .fini section here. */ + push %ebp + movl %esp, %ebp + /* gcc will nicely put the contents of crtbegin.o's .fini section here. */ diff --git a/src/as/crtn.s b/src/as/crtn.s index 1da795d..0e1c314 100644 --- a/src/as/crtn.s +++ b/src/as/crtn.s @@ -1,10 +1,10 @@ /* x86 crtn.s */ .section .init - /* gcc will nicely put the contents of crtend.o's .init section here. */ - popl %ebp - ret + /* gcc will nicely put the contents of crtend.o's .init section here. */ + popl %ebp + ret .section .fini - /* gcc will nicely put the contents of crtend.o's .fini section here. */ - popl %ebp - ret + /* gcc will nicely put the contents of crtend.o's .fini section here. */ + popl %ebp + ret diff --git a/src/as/paging.s b/src/as/paging.s index 2dd52d3..e1cf42a 100644 --- a/src/as/paging.s +++ b/src/as/paging.s @@ -1,4 +1,4 @@ -.globl loadPageDirectory +.global loadPageDirectory loadPageDirectory: push %ebp mov %esp, %ebp @@ -9,7 +9,7 @@ loadPageDirectory: ret .text -.globl enablePaging +.global enablePaging enablePaging: push %ebp mov %esp, %ebp diff --git a/src/c/gdt.c b/src/c/gdt.c index a9a745c..e3d2b4c 100644 --- a/src/c/gdt.c +++ b/src/c/gdt.c @@ -36,11 +36,11 @@ void init_gdt_table() gdtp.size=sizeof(gdt)-1; gdtp.offset=(uint32_t)&gdt; - init_gdt_entry(0,0,0,0,0); // null segment - init_gdt_entry(1,0xffffffff,0,0b10011010,0b11001111); // code segment - init_gdt_entry(2,0xffffffff,0,0b10010010,0b11001111); // data segment - init_gdt_entry(3,0xffffffff,0,0b11111010,0b11001111); // user mode code segment - init_gdt_entry(4,0xffffffff,0,0b11110010,0b11001111); // user mode data segment + init_gdt_entry(0,0,0,0,0); // null segment + init_gdt_entry(1,0xffffffff,0,0b10011010,0b11001111); // code segment + init_gdt_entry(2,0xffffffff,0,0b10010010,0b11001111); // data segment + init_gdt_entry(3,0xffffffff,0,0b11111010,0b11001111); // user mode code segment + init_gdt_entry(4,0xffffffff,0,0b11110010,0b11001111); // user mode data segment load_gdt(&gdtp); } diff --git a/src/c/heap.c b/src/c/heap.c index 3e1ba24..99d0a37 100644 --- a/src/c/heap.c +++ b/src/c/heap.c @@ -1,151 +1,146 @@ #include<types.h> typedef struct _KHEAPBLOCKBM { - struct _KHEAPBLOCKBM *next; - uint32_t size; - uint32_t used; - uint32_t bsize; - uint32_t lfb; + struct _KHEAPBLOCKBM *next; + uint32_t size; + uint32_t used; + uint32_t bsize; + uint32_t lfb; } KHEAPBLOCKBM; - + typedef struct _KHEAPBM { - KHEAPBLOCKBM *fblock; + KHEAPBLOCKBM *fblock; } KHEAPBM; - + void k_heapBMInit(KHEAPBM *heap) { - heap->fblock = 0; + heap->fblock = 0; } - + int k_heapBMAddBlock(KHEAPBM *heap, uintptr_t addr, uint32_t size, uint32_t bsize) { - KHEAPBLOCKBM *b; - uint32_t bcnt; - uint32_t x; - uint8_t *bm; - - b = (KHEAPBLOCKBM*)addr; - b->size = size - sizeof(KHEAPBLOCKBM); - b->bsize = bsize; - - b->next = heap->fblock; - heap->fblock = b; - - bcnt = b->size / b->bsize; - bm = (uint8_t*)&b[1]; - - /* clear bitmap */ - for (x = 0; x < bcnt; ++x) { - bm[x] = 0; - } - - /* reserve room for bitmap */ - bcnt = (bcnt / bsize) * bsize < bcnt ? bcnt / bsize + 1 : bcnt / bsize; - for (x = 0; x < bcnt; ++x) { - bm[x] = 5; - } - - b->lfb = bcnt - 1; - - b->used = bcnt; - - return 1; + KHEAPBLOCKBM *b; + uint32_t bcnt; + uint32_t x; + uint8_t *bm; + + b = (KHEAPBLOCKBM*)addr; + b->size = size - sizeof(KHEAPBLOCKBM); + b->bsize = bsize; + + b->next = heap->fblock; + heap->fblock = b; + + bcnt = b->size / b->bsize; + bm = (uint8_t*)&b[1]; + + /* clear bitmap */ + for (x = 0; x < bcnt; ++x) { + bm[x] = 0; + } + + /* reserve room for bitmap */ + bcnt = (bcnt / bsize) * bsize < bcnt ? bcnt / bsize + 1 : bcnt / bsize; + for (x = 0; x < bcnt; ++x) { + bm[x] = 5; + } + + b->lfb = bcnt - 1; + b->used = bcnt; + return 1; } - + static uint8_t k_heapBMGetNID(uint8_t a, uint8_t b) { - uint8_t c; - for (c = a + 1; c == b || c == 0; ++c); - return c; + uint8_t c; + for (c = a + 1; c == b || c == 0; ++c); + return c; } - + void *k_heapBMAlloc(KHEAPBM *heap, uint32_t size) { - KHEAPBLOCKBM *b; - uint8_t *bm; - uint32_t bcnt; - uint32_t x, y, z; - uint32_t bneed; - uint8_t nid; - - /* iterate blocks */ - for (b = heap->fblock; b; b = b->next) { - //printf("size:%d,used:%d,bsize:%d,lfb:%d\n",b->size,b->used,b->bsize,b->lfb); - /* check if block has enough room */ - if (b->size - (b->used * b->bsize) >= size) { - - bcnt = b->size / b->bsize; - bneed = (size / b->bsize) * b->bsize < size ? size / b->bsize + 1 : size / b->bsize; - bm = (uint8_t*)&b[1]; - //printf("bcnt:%d,bneed:%d,bm:%d\n",bcnt,bneed,bm); - - for (x = (b->lfb + 1 >= bcnt ? 0 : b->lfb + 1); x != b->lfb; ++x) { - /* just wrap around */ - if (x >= bcnt) { - x = 0; - } - - if (bm[x] == 0) { - /* count free blocks */ - for (y = 0; bm[x + y] == 0 && y < bneed && (x + y) < bcnt; ++y); - - /* we have enough, now allocate them */ - if (y == bneed) { - /* find ID that does not match left or right */ - nid = k_heapBMGetNID(bm[x - 1], bm[x + y]); - - /* allocate by setting id */ - for (z = 0; z < y; ++z) { - bm[x + z] = nid; - } - - /* optimization */ - b->lfb = (x + bneed) - 2; - - /* count used blocks NOT bytes */ - b->used += y; - - return (void*)(x * b->bsize + (uintptr_t)&b[1]); - } - - /* x will be incremented by one ONCE more in our FOR loop */ - x += (y - 1); - continue; - } - } - } - } - - return 0; + KHEAPBLOCKBM *b; + uint8_t *bm; + uint32_t bcnt; + uint32_t x, y, z; + uint32_t bneed; + uint8_t nid; + + /* iterate blocks */ + for (b = heap->fblock; b; b = b->next) { + /* check if block has enough room */ + if (b->size - (b->used * b->bsize) >= size) { + + bcnt = b->size / b->bsize; + bneed = (size / b->bsize) * b->bsize < size ? size / b->bsize + 1 : size / b->bsize; + bm = (uint8_t*)&b[1]; + + for (x = (b->lfb + 1 >= bcnt ? 0 : b->lfb + 1); x != b->lfb; ++x) { + /* just wrap around */ + if (x >= bcnt) { + x = 0; + } + + if (bm[x] == 0) { + /* count free blocks */ + for (y = 0; bm[x + y] == 0 && y < bneed && (x + y) < bcnt; ++y); + + /* we have enough, now allocate them */ + if (y == bneed) { + /* find ID that does not match left or right */ + nid = k_heapBMGetNID(bm[x - 1], bm[x + y]); + + /* allocate by setting id */ + for (z = 0; z < y; ++z) { + bm[x + z] = nid; + } + + /* optimization */ + b->lfb = (x + bneed) - 2; + + /* count used blocks NOT bytes */ + b->used += y; + + return (void*)(x * b->bsize + (uintptr_t)&b[1]); + } + + /* x will be incremented by one ONCE more in our FOR loop */ + x += (y - 1); + continue; + } + } + } + } + return 0; } - + void k_heapBMFree(KHEAPBM *heap, void *ptr) { - KHEAPBLOCKBM *b; - uintptr_t ptroff; - uint32_t bi, x; - uint8_t *bm; - uint8_t id; - uint32_t max; - - for (b = heap->fblock; b; b = b->next) { - if ((uintptr_t)ptr > (uintptr_t)b && (uintptr_t)ptr < (uintptr_t)b + sizeof(KHEAPBLOCKBM) + b->size) { - /* found block */ - ptroff = (uintptr_t)ptr - (uintptr_t)&b[1]; /* get offset to get block */ - /* block offset in BM */ - bi = ptroff / b->bsize; - /* .. */ - bm = (uint8_t*)&b[1]; - /* clear allocation */ - id = bm[bi]; - /* oddly.. GCC did not optimize this */ - max = b->size / b->bsize; - for (x = bi; bm[x] == id && x < max; ++x) { - bm[x] = 0; - } - /* update free block count */ - b->used -= x - bi; - return; - } - } - - /* this error needs to be raised or reported somehow */ - return; + KHEAPBLOCKBM *b; + uintptr_t ptroff; + uint32_t bi, x; + uint8_t *bm; + uint8_t id; + uint32_t max; + + for (b = heap->fblock; b; b = b->next) { + if ((uintptr_t)ptr > (uintptr_t)b && (uintptr_t)ptr < (uintptr_t)b + sizeof(KHEAPBLOCKBM) + b->size) { + /* found block */ + ptroff = (uintptr_t)ptr - (uintptr_t)&b[1]; /* get offset to get block */ + /* block offset in BM */ + bi = ptroff / b->bsize; + /* .. */ + bm = (uint8_t*)&b[1]; + /* clear allocation */ + id = bm[bi]; + /* oddly.. GCC did not optimize this */ + max = b->size / b->bsize; + for (x = bi; bm[x] == id && x < max; ++x) { + bm[x] = 0; + } + /* update free block count */ + b->used -= x - bi; + return; + } + } + + /* this error needs to be raised or reported somehow */ + return; } KHEAPBM kheap; @@ -154,15 +149,17 @@ void kheapinit() { k_heapBMInit(&kheap); } + int kheapaddblock(uintptr_t addr,uint32_t size,uint32_t bsize) { return k_heapBMAddBlock(&kheap,addr,size,bsize); } + void *kmalloc(uint32_t size) { return k_heapBMAlloc(&kheap,size); - } + void kfree(void *ptr) { k_heapBMFree(&kheap,ptr); diff --git a/src/c/idt.c b/src/c/idt.c index 005a05c..843c9da 100644 --- a/src/c/idt.c +++ b/src/c/idt.c @@ -42,6 +42,7 @@ void init_idt_entry(size_t num, uint32_t offset, uint16_t selector, uint8_t type idt[num].type_attr=type_attr; idt[num].offset2=(offset & 0xffff0000)>>16; } + void add_idt_entry(size_t num,uint32_t offset) { init_idt_entry(num,offset,KERNEL_CODE,INTERRUPT_GATE_32); @@ -59,7 +60,6 @@ void init_pic() ioport_out(PIC2_DATA_PORT, 0x01); ioport_out(PIC1_DATA_PORT, 0xff); ioport_out(PIC2_DATA_PORT, 0xff); - ioport_out(PIC1_DATA_PORT, 0xFC); } @@ -104,6 +104,5 @@ void init_idt_table() idtp.size=sizeof(struct idt_entry)*256-1; idtp.offset=(uint32_t)&idt; - load_idt(&idtp); } diff --git a/src/c/keyboard.c b/src/c/keyboard.c index d082ec5..2218f09 100644 --- a/src/c/keyboard.c +++ b/src/c/keyboard.c @@ -28,6 +28,10 @@ void us_en_shift(char keymap[]); char charcode[256]; char shift_charcode[256]; bool ispressed[128]; +#define lshift 0x2A +#define rshift 0x36 +#define lctrl 0x1D +#define rctrl 0x1D void init_keyboard() { @@ -56,15 +60,15 @@ void enter() printf("\n"); if(buffer_index>0) { - tty(buffer[buffer_current]); - buffer_size[buffer_current]=buffer_index; - if(buffer_current==buffer_all) buffer_current=(++buffer_all); - else - { - for(size_t i=0;i<BUFFER_SIZE;i++) buffer[buffer_all][i]='\0'; - buffer_current=buffer_all; - } - buffer_index=0; + tty(buffer[buffer_current]); + buffer_size[buffer_current]=buffer_index; + if(buffer_current==buffer_all) buffer_current=(++buffer_all); + else + { + for(size_t i=0;i<BUFFER_SIZE;i++) buffer[buffer_all][i]='\0'; + buffer_current=buffer_all; + } + buffer_index=0; } prompt(); return; @@ -80,37 +84,34 @@ void keyup() { if(buffer_current>0) { - buffer_size[buffer_current]=buffer_index; - for(size_t i=0;i<buffer_index;i++) deletelast(); - buffer_current--; - buffer_index=buffer_size[buffer_current]; - printf("%s",buffer[buffer_current]); + buffer_size[buffer_current]=buffer_index; + for(size_t i=0;i<buffer_index;i++) deletelast(); + buffer_current--; + buffer_index=buffer_size[buffer_current]; + printf("%s",buffer[buffer_current]); } } + void keydown() { if(buffer_current<buffer_all) { - buffer_size[buffer_current]=buffer_index; - for(size_t i=0;i<buffer_index;i++) deletelast(); - buffer_current++; - buffer_index=buffer_size[buffer_current]; - printf("%s",buffer[buffer_current]); + buffer_size[buffer_current]=buffer_index; + for(size_t i=0;i<buffer_index;i++) deletelast(); + buffer_current++; + buffer_index=buffer_size[buffer_current]; + printf("%s",buffer[buffer_current]); } } + void keyleft() { - } + void keyright() { - } -#define lshift ispressed[0x2A] -#define rshift ispressed[0x36] -#define lctrl ispressed[0x1D] - void keyboard_handler() { ioport_out(PIC1_COMMAND_PORT, 0x20); @@ -118,45 +119,64 @@ void keyboard_handler() if (status & 0x1) { - uint8_t keycode = ioport_in(KEYBOARD_DATA_PORT); -// printf("%d\n",keycode); - if(keycode<0x80) - { - ispressed[keycode]=1; - if(keycode==0x0E) backspace(); - else if(keycode==0x1C) enter(); - else if(keycode==0x39) space(); - else if(keycode==72) keyup(); - else if(keycode==80) keydown(); - else if(keycode==75) keyleft(); - else if(keycode==77) keyright(); - else - { - char c=charcode[keycode]; - if(c!=' ') - { - if(lctrl) - { - if(c=='l') - { - clear(); - prompt(); - printf("%s",buffer[buffer_current]); - return; - } - } - if(lshift||rshift) - { - c=shift_charcode[keycode]; - } - buffer[buffer_current][buffer_index++]=c; - printf("%c",c); - } - } - } - else - { - ispressed[keycode-0x80]=0; - } + uint8_t keycode = ioport_in(KEYBOARD_DATA_PORT); + if(keycode<0x80) + { + char c=charcode[keycode]; + ispressed[keycode]=1; + // printf("%d ",&keycode); + + switch(keycode) + { + case 0x0E: + backspace(); + break; + case 0x1C: + enter(); + break; + case 0x39: + space(); + break; + case 72: + keyup(); + break; + case 80: + keydown(); + break; + case 75: + keyleft(); + break; + case 77: + keyright(); + break; + + default: + if(c!=' ') + { + if(ispressed[lctrl]||ispressed[rctrl]) + { + if(c=='l') + { + clear(); + prompt(); + printf("%s",buffer[buffer_current]); + return; + } + } + if(ispressed[lshift]||ispressed[rshift]) + { + c=shift_charcode[keycode]; + } + buffer[buffer_current][buffer_index++]=c; + printf("%c",c); + } + break; + } + + } + else + { + ispressed[keycode-0x80]=0; + } } } diff --git a/src/c/keymap.c b/src/c/keymap.c index 5401be0..168d5f9 100644 --- a/src/c/keymap.c +++ b/src/c/keymap.c @@ -1,346 +1,346 @@ void us_en(char keymap[]) { - keymap[0x01]=' '; //escape pressed - keymap[0x02]='1'; //1 pressed - keymap[0x03]='2'; //2 pressed - keymap[0x04]='3'; //3 pressed - keymap[0x05]='4'; //4 pressed - keymap[0x06]='5'; //5 pressed - keymap[0x07]='6'; //6 pressed - keymap[0x08]='7'; //7 pressed - keymap[0x09]='8'; //8 pressed - keymap[0x0A]='9'; //9 pressed - keymap[0x0B]='0'; //0 (zero) pressed - keymap[0x0C]='-'; //- pressed - keymap[0x0D]='='; //= pressed - keymap[0x0E]=' '; //backspace pressed - keymap[0x0F]=' '; //tab pressed - keymap[0x10]='q'; //Q pressed - keymap[0x11]='w'; //W pressed - keymap[0x12]='e'; //E pressed - keymap[0x13]='r'; //R pressed - keymap[0x14]='t'; //T pressed - keymap[0x15]='y'; //Y pressed - keymap[0x16]='u'; //U pressed - keymap[0x17]='i'; //I pressed - keymap[0x18]='o'; //O pressed - keymap[0x19]='p'; //P pressed - keymap[0x1A]='['; //[ pressed - keymap[0x1B]=']'; //] pressed - keymap[0x1C]='\n'; //enter pressed - keymap[0x1D]=' '; //left control pressed - keymap[0x1E]='a'; //A pressed - keymap[0x1F]='s'; //S pressed - keymap[0x20]='d'; //D pressed - keymap[0x21]='f'; //F pressed - keymap[0x22]='g'; //G pressed - keymap[0x23]='h'; //H pressed - keymap[0x24]='j'; //J pressed - keymap[0x25]='k'; //K pressed - keymap[0x26]='l'; //L pressed - keymap[0x27]=';'; //; pressed - keymap[0x28]='\''; //' (single quote) pressed - keymap[0x29]='`'; //` (back tick) pressed - keymap[0x2A]=' '; //left shift pressed - keymap[0x2B]='\\'; //\ pressed - keymap[0x2C]='z'; //Z pressed - keymap[0x2D]='x'; //X pressed - keymap[0x2E]='c'; //C pressed - keymap[0x2F]='v'; //V pressed - keymap[0x30]='b'; //B pressed - keymap[0x31]='n'; //N pressed - keymap[0x32]='m'; //M pressed - keymap[0x33]=','; //, pressed - keymap[0x34]='.'; //. pressed - keymap[0x35]='/'; /// pressed - keymap[0x36]=' '; //right shift pressed - keymap[0x37]='*'; //(keypad) * pressed - keymap[0x38]=' '; //left alt pressed - keymap[0x39]=' '; //space pressed - keymap[0x3A]=' '; //CapsLock pressed - keymap[0x3B]=' '; //F1 pressed - keymap[0x3C]=' '; //F2 pressed - keymap[0x3D]=' '; //F3 pressed - keymap[0x3E]=' '; //F4 pressed - keymap[0x3F]=' '; //F5 pressed - keymap[0x40]=' '; //F6 pressed - keymap[0x41]=' '; //F7 pressed - keymap[0x42]=' '; //F8 pressed - keymap[0x43]=' '; //F9 pressed - keymap[0x44]=' '; //F10 pressed - keymap[0x45]=' '; //NumberLock pressed - keymap[0x46]=' '; //ScrollLock pressed - keymap[0x47]='7'; //(keypad) 7 pressed - keymap[0x48]='8'; //(keypad) 8 pressed - keymap[0x49]='9'; //(keypad) 9 pressed - keymap[0x4A]='-'; //(keypad) - pressed - keymap[0x4B]='4'; //(keypad) 4 pressed - keymap[0x4C]='5'; //(keypad) 5 pressed - keymap[0x4D]='6'; //(keypad) 6 pressed - keymap[0x4E]='+'; //(keypad) + pressed - keymap[0x4F]='1'; //(keypad) 1 pressed - keymap[0x50]='2'; //(keypad) 2 pressed - keymap[0x51]='3'; //(keypad) 3 pressed - keymap[0x52]='0'; //(keypad) 0 pressed - keymap[0x53]='.'; //(keypad) . pressed - keymap[0x57]=' '; //F11 pressed - keymap[0x58]=' '; //F12 pressed - keymap[0x81]=' '; //escape released - keymap[0x82]=' '; //1 released - keymap[0x83]=' '; //2 released - keymap[0x84]=' '; //3 released - keymap[0x85]=' '; //4 released - keymap[0x86]=' '; //5 released - keymap[0x87]=' '; //6 released - keymap[0x88]=' '; //7 released - keymap[0x89]=' '; //8 released - keymap[0x8A]=' '; //9 released - keymap[0x8B]=' '; //0 (zero) released - keymap[0x8C]=' '; //- released - keymap[0x8D]=' '; //= released - keymap[0x8E]=' '; //backspace released - keymap[0x8F]=' '; //tab released - keymap[0x90]=' '; //Q released - keymap[0x91]=' '; //W released - keymap[0x92]=' '; //E released - keymap[0x93]=' '; //R released - keymap[0x94]=' '; //T released - keymap[0x95]=' '; //Y released - keymap[0x96]=' '; //U released - keymap[0x97]=' '; //I released - keymap[0x98]=' '; //O released - keymap[0x99]=' '; //P released - keymap[0x9A]=' '; //[ released - keymap[0x9B]=' '; //] released - keymap[0x9C]=' '; //enter released - keymap[0x9D]=' '; //left control released - keymap[0x9E]=' '; //A released - keymap[0x9F]=' '; //S released - keymap[0xA0]=' '; //D released - keymap[0xA1]=' '; //F released - keymap[0xA2]=' '; //G released - keymap[0xA3]=' '; //H released - keymap[0xA4]=' '; //J released - keymap[0xA5]=' '; //K released - keymap[0xA6]=' '; //L released - keymap[0xA7]=' '; //; released - keymap[0xA8]=' '; //' (single quote) released - keymap[0xA9]=' '; //` (back tick) released - keymap[0xAA]=' '; //left shift released - keymap[0xAB]=' '; //\ released - keymap[0xAC]=' '; //Z released - keymap[0xAD]=' '; //X released - keymap[0xAE]=' '; //C released - keymap[0xAF]=' '; //V released - keymap[0xB0]=' '; //B released - keymap[0xB1]=' '; //N released - keymap[0xB2]=' '; //M released - keymap[0xB3]=' '; //, released - keymap[0xB4]=' '; //. released - keymap[0xB5]=' '; /// released - keymap[0xB6]=' '; //right shift released - keymap[0xB7]='*'; //(keypad) * released - keymap[0xB8]=' '; //left alt released - keymap[0xB9]=' '; //space released - keymap[0xBA]=' '; //CapsLock released - keymap[0xBB]=' '; //F1 released - keymap[0xBC]=' '; //F2 released - keymap[0xBD]=' '; //F3 released - keymap[0xBE]=' '; //F4 released - keymap[0xBF]=' '; //F5 released - keymap[0xC0]=' '; //F6 released - keymap[0xC1]=' '; //F7 released - keymap[0xC2]=' '; //F8 released - keymap[0xC3]=' '; //F9 released - keymap[0xC4]=' '; //F10 released - keymap[0xC5]=' '; //NumberLock released - keymap[0xC6]=' '; //ScrollLock released - keymap[0xC7]=' '; //(keypad) 7 released - keymap[0xC8]=' '; //(keypad) 8 released - keymap[0xC9]=' '; //(keypad) 9 released - keymap[0xCA]=' '; //(keypad) - released - keymap[0xCB]=' '; //(keypad) 4 released - keymap[0xCC]=' '; //(keypad) 5 released - keymap[0xCD]=' '; //(keypad) 6 released - keymap[0xCE]=' '; //(keypad) + released - keymap[0xCF]=' '; //(keypad) 1 released - keymap[0xD0]=' '; //(keypad) 2 released - keymap[0xD1]=' '; //(keypad) 3 released - keymap[0xD2]=' '; //(keypad) 0 released - keymap[0xD3]=' '; //(keypad) . released - keymap[0xD7]=' '; //F11 released - keymap[0xD8]=' '; //F12 released + keymap[0x01]=' '; //escape pressed + keymap[0x02]='1'; //1 pressed + keymap[0x03]='2'; //2 pressed + keymap[0x04]='3'; //3 pressed + keymap[0x05]='4'; //4 pressed + keymap[0x06]='5'; //5 pressed + keymap[0x07]='6'; //6 pressed + keymap[0x08]='7'; //7 pressed + keymap[0x09]='8'; //8 pressed + keymap[0x0A]='9'; //9 pressed + keymap[0x0B]='0'; //0 (zero) pressed + keymap[0x0C]='-'; //- pressed + keymap[0x0D]='='; //= pressed + keymap[0x0E]=' '; //backspace pressed + keymap[0x0F]=' '; //tab pressed + keymap[0x10]='q'; //Q pressed + keymap[0x11]='w'; //W pressed + keymap[0x12]='e'; //E pressed + keymap[0x13]='r'; //R pressed + keymap[0x14]='t'; //T pressed + keymap[0x15]='y'; //Y pressed + keymap[0x16]='u'; //U pressed + keymap[0x17]='i'; //I pressed + keymap[0x18]='o'; //O pressed + keymap[0x19]='p'; //P pressed + keymap[0x1A]='['; //[ pressed + keymap[0x1B]=']'; //] pressed + keymap[0x1C]='\n'; //enter pressed + keymap[0x1D]=' '; //left control pressed + keymap[0x1E]='a'; //A pressed + keymap[0x1F]='s'; //S pressed + keymap[0x20]='d'; //D pressed + keymap[0x21]='f'; //F pressed + keymap[0x22]='g'; //G pressed + keymap[0x23]='h'; //H pressed + keymap[0x24]='j'; //J pressed + keymap[0x25]='k'; //K pressed + keymap[0x26]='l'; //L pressed + keymap[0x27]=';'; //; pressed + keymap[0x28]='\''; //' (single quote) pressed + keymap[0x29]='`'; //` (back tick) pressed + keymap[0x2A]=' '; //left shift pressed + keymap[0x2B]='\\'; //\ pressed + keymap[0x2C]='z'; //Z pressed + keymap[0x2D]='x'; //X pressed + keymap[0x2E]='c'; //C pressed + keymap[0x2F]='v'; //V pressed + keymap[0x30]='b'; //B pressed + keymap[0x31]='n'; //N pressed + keymap[0x32]='m'; //M pressed + keymap[0x33]=','; //, pressed + keymap[0x34]='.'; //. pressed + keymap[0x35]='/'; /// pressed + keymap[0x36]=' '; //right shift pressed + keymap[0x37]='*'; //(keypad) * pressed + keymap[0x38]=' '; //left alt pressed + keymap[0x39]=' '; //space pressed + keymap[0x3A]=' '; //CapsLock pressed + keymap[0x3B]=' '; //F1 pressed + keymap[0x3C]=' '; //F2 pressed + keymap[0x3D]=' '; //F3 pressed + keymap[0x3E]=' '; //F4 pressed + keymap[0x3F]=' '; //F5 pressed + keymap[0x40]=' '; //F6 pressed + keymap[0x41]=' '; //F7 pressed + keymap[0x42]=' '; //F8 pressed + keymap[0x43]=' '; //F9 pressed + keymap[0x44]=' '; //F10 pressed + keymap[0x45]=' '; //NumberLock pressed + keymap[0x46]=' '; //ScrollLock pressed + keymap[0x47]='7'; //(keypad) 7 pressed + keymap[0x48]='8'; //(keypad) 8 pressed + keymap[0x49]='9'; //(keypad) 9 pressed + keymap[0x4A]='-'; //(keypad) - pressed + keymap[0x4B]='4'; //(keypad) 4 pressed + keymap[0x4C]='5'; //(keypad) 5 pressed + keymap[0x4D]='6'; //(keypad) 6 pressed + keymap[0x4E]='+'; //(keypad) + pressed + keymap[0x4F]='1'; //(keypad) 1 pressed + keymap[0x50]='2'; //(keypad) 2 pressed + keymap[0x51]='3'; //(keypad) 3 pressed + keymap[0x52]='0'; //(keypad) 0 pressed + keymap[0x53]='.'; //(keypad) . pressed + keymap[0x57]=' '; //F11 pressed + keymap[0x58]=' '; //F12 pressed + keymap[0x81]=' '; //escape released + keymap[0x82]=' '; //1 released + keymap[0x83]=' '; //2 released + keymap[0x84]=' '; //3 released + keymap[0x85]=' '; //4 released + keymap[0x86]=' '; //5 released + keymap[0x87]=' '; //6 released + keymap[0x88]=' '; //7 released + keymap[0x89]=' '; //8 released + keymap[0x8A]=' '; //9 released + keymap[0x8B]=' '; //0 (zero) released + keymap[0x8C]=' '; //- released + keymap[0x8D]=' '; //= released + keymap[0x8E]=' '; //backspace released + keymap[0x8F]=' '; //tab released + keymap[0x90]=' '; //Q released + keymap[0x91]=' '; //W released + keymap[0x92]=' '; //E released + keymap[0x93]=' '; //R released + keymap[0x94]=' '; //T released + keymap[0x95]=' '; //Y released + keymap[0x96]=' '; //U released + keymap[0x97]=' '; //I released + keymap[0x98]=' '; //O released + keymap[0x99]=' '; //P released + keymap[0x9A]=' '; //[ released + keymap[0x9B]=' '; //] released + keymap[0x9C]=' '; //enter released + keymap[0x9D]=' '; //left control released + keymap[0x9E]=' '; //A released + keymap[0x9F]=' '; //S released + keymap[0xA0]=' '; //D released + keymap[0xA1]=' '; //F released + keymap[0xA2]=' '; //G released + keymap[0xA3]=' '; //H released + keymap[0xA4]=' '; //J released + keymap[0xA5]=' '; //K released + keymap[0xA6]=' '; //L released + keymap[0xA7]=' '; //; released + keymap[0xA8]=' '; //' (single quote) released + keymap[0xA9]=' '; //` (back tick) released + keymap[0xAA]=' '; //left shift released + keymap[0xAB]=' '; //\ released + keymap[0xAC]=' '; //Z released + keymap[0xAD]=' '; //X released + keymap[0xAE]=' '; //C released + keymap[0xAF]=' '; //V released + keymap[0xB0]=' '; //B released + keymap[0xB1]=' '; //N released + keymap[0xB2]=' '; //M released + keymap[0xB3]=' '; //, released + keymap[0xB4]=' '; //. released + keymap[0xB5]=' '; /// released + keymap[0xB6]=' '; //right shift released + keymap[0xB7]='*'; //(keypad) * released + keymap[0xB8]=' '; //left alt released + keymap[0xB9]=' '; //space released + keymap[0xBA]=' '; //CapsLock released + keymap[0xBB]=' '; //F1 released + keymap[0xBC]=' '; //F2 released + keymap[0xBD]=' '; //F3 released + keymap[0xBE]=' '; //F4 released + keymap[0xBF]=' '; //F5 released + keymap[0xC0]=' '; //F6 released + keymap[0xC1]=' '; //F7 released + keymap[0xC2]=' '; //F8 released + keymap[0xC3]=' '; //F9 released + keymap[0xC4]=' '; //F10 released + keymap[0xC5]=' '; //NumberLock released + keymap[0xC6]=' '; //ScrollLock released + keymap[0xC7]=' '; //(keypad) 7 released + keymap[0xC8]=' '; //(keypad) 8 released + keymap[0xC9]=' '; //(keypad) 9 released + keymap[0xCA]=' '; //(keypad) - released + keymap[0xCB]=' '; //(keypad) 4 released + keymap[0xCC]=' '; //(keypad) 5 released + keymap[0xCD]=' '; //(keypad) 6 released + keymap[0xCE]=' '; //(keypad) + released + keymap[0xCF]=' '; //(keypad) 1 released + keymap[0xD0]=' '; //(keypad) 2 released + keymap[0xD1]=' '; //(keypad) 3 released + keymap[0xD2]=' '; //(keypad) 0 released + keymap[0xD3]=' '; //(keypad) . released + keymap[0xD7]=' '; //F11 released + keymap[0xD8]=' '; //F12 released } void us_en_shift(char keymap[]) { - keymap[0x01]=' '; //escape pressed - keymap[0x02]='!'; //1 pressed - keymap[0x03]='@'; //2 pressed - keymap[0x04]='#'; //3 pressed - keymap[0x05]='$'; //4 pressed - keymap[0x06]='%'; //5 pressed - keymap[0x07]='^'; //6 pressed - keymap[0x08]='&'; //7 pressed - keymap[0x09]='*'; //8 pressed - keymap[0x0A]='('; //9 pressed - keymap[0x0B]=')'; //0 (zero) pressed - keymap[0x0C]='_'; //- pressed - keymap[0x0D]='+'; //= pressed - keymap[0x0E]=' '; //backspace pressed - keymap[0x0F]=' '; //tab pressed - keymap[0x10]='Q'; //Q pressed - keymap[0x11]='W'; //W pressed - keymap[0x12]='E'; //E pressed - keymap[0x13]='R'; //R pressed - keymap[0x14]='T'; //T pressed - keymap[0x15]='Y'; //Y pressed - keymap[0x16]='U'; //U pressed - keymap[0x17]='I'; //I pressed - keymap[0x18]='O'; //O pressed - keymap[0x19]='P'; //P pressed - keymap[0x1A]='{'; //[ pressed - keymap[0x1B]='}'; //] pressed - keymap[0x1C]='\n'; //enter pressed - keymap[0x1D]=' '; //left control pressed - keymap[0x1E]='A'; //A pressed - keymap[0x1F]='S'; //S pressed - keymap[0x20]='D'; //D pressed - keymap[0x21]='F'; //F pressed - keymap[0x22]='G'; //G pressed - keymap[0x23]='H'; //H pressed - keymap[0x24]='J'; //J pressed - keymap[0x25]='K'; //K pressed - keymap[0x26]='L'; //L pressed - keymap[0x27]=':'; //; pressed - keymap[0x28]='\"'; //' (single quote) pressed - keymap[0x29]='~'; //` (back tick) pressed - keymap[0x2A]=' '; //left shift pressed - keymap[0x2B]='|'; //\ pressed - keymap[0x2C]='Z'; //Z pressed - keymap[0x2D]='X'; //X pressed - keymap[0x2E]='C'; //C pressed - keymap[0x2F]='V'; //V pressed - keymap[0x30]='B'; //B pressed - keymap[0x31]='N'; //N pressed - keymap[0x32]='M'; //M pressed - keymap[0x33]='<'; //, pressed - keymap[0x34]='>'; //. pressed - keymap[0x35]='?'; /// pressed - keymap[0x36]=' '; //right shift pressed - keymap[0x37]='*'; //(keypad) * pressed - keymap[0x38]=' '; //left alt pressed - keymap[0x39]=' '; //space pressed - keymap[0x3A]=' '; //CapsLock pressed - keymap[0x3B]=' '; //F1 pressed - keymap[0x3C]=' '; //F2 pressed - keymap[0x3D]=' '; //F3 pressed - keymap[0x3E]=' '; //F4 pressed - keymap[0x3F]=' '; //F5 pressed - keymap[0x40]=' '; //F6 pressed - keymap[0x41]=' '; //F7 pressed - keymap[0x42]=' '; //F8 pressed - keymap[0x43]=' '; //F9 pressed - keymap[0x44]=' '; //F10 pressed - keymap[0x45]=' '; //NumberLock pressed - keymap[0x46]=' '; //ScrollLock pressed - keymap[0x47]='7'; //(keypad) 7 pressed - keymap[0x48]='8'; //(keypad) 8 pressed - keymap[0x49]='9'; //(keypad) 9 pressed - keymap[0x4A]='-'; //(keypad) - pressed - keymap[0x4B]='4'; //(keypad) 4 pressed - keymap[0x4C]='5'; //(keypad) 5 pressed - keymap[0x4D]='6'; //(keypad) 6 pressed - keymap[0x4E]='+'; //(keypad) + pressed - keymap[0x4F]='1'; //(keypad) 1 pressed - keymap[0x50]='2'; //(keypad) 2 pressed - keymap[0x51]='3'; //(keypad) 3 pressed - keymap[0x52]='0'; //(keypad) 0 pressed - keymap[0x53]='.'; //(keypad) . pressed - keymap[0x57]=' '; //F11 pressed - keymap[0x58]=' '; //F12 pressed - keymap[0x81]=' '; //escape released - keymap[0x82]=' '; //1 released - keymap[0x83]=' '; //2 released - keymap[0x84]=' '; //3 released - keymap[0x85]=' '; //4 released - keymap[0x86]=' '; //5 released - keymap[0x87]=' '; //6 released - keymap[0x88]=' '; //7 released - keymap[0x89]=' '; //8 released - keymap[0x8A]=' '; //9 released - keymap[0x8B]=' '; //0 (zero) released - keymap[0x8C]=' '; //- released - keymap[0x8D]=' '; //= released - keymap[0x8E]=' '; //backspace released - keymap[0x8F]=' '; //tab released - keymap[0x90]=' '; //Q released - keymap[0x91]=' '; //W released - keymap[0x92]=' '; //E released - keymap[0x93]=' '; //R released - keymap[0x94]=' '; //T released - keymap[0x95]=' '; //Y released - keymap[0x96]=' '; //U released - keymap[0x97]=' '; //I released - keymap[0x98]=' '; //O released - keymap[0x99]=' '; //P released - keymap[0x9A]=' '; //[ released - keymap[0x9B]=' '; //] released - keymap[0x9C]=' '; //enter released - keymap[0x9D]=' '; //left control released - keymap[0x9E]=' '; //A released - keymap[0x9F]=' '; //S released - keymap[0xA0]=' '; //D released - keymap[0xA1]=' '; //F released - keymap[0xA2]=' '; //G released - keymap[0xA3]=' '; //H released - keymap[0xA4]=' '; //J released - keymap[0xA5]=' '; //K released - keymap[0xA6]=' '; //L released - keymap[0xA7]=' '; //; released - keymap[0xA8]=' '; //' (single quote) released - keymap[0xA9]=' '; //` (back tick) released - keymap[0xAA]=' '; //left shift released - keymap[0xAB]=' '; //\ released - keymap[0xAC]=' '; //Z released - keymap[0xAD]=' '; //X released - keymap[0xAE]=' '; //C released - keymap[0xAF]=' '; //V released - keymap[0xB0]=' '; //B released - keymap[0xB1]=' '; //N released - keymap[0xB2]=' '; //M released - keymap[0xB3]=' '; //, released - keymap[0xB4]=' '; //. released - keymap[0xB5]=' '; /// released - keymap[0xB6]=' '; //right shift released - keymap[0xB7]='*'; //(keypad) * released - keymap[0xB8]=' '; //left alt released - keymap[0xB9]=' '; //space released - keymap[0xBA]=' '; //CapsLock released - keymap[0xBB]=' '; //F1 released - keymap[0xBC]=' '; //F2 released - keymap[0xBD]=' '; //F3 released - keymap[0xBE]=' '; //F4 released - keymap[0xBF]=' '; //F5 released - keymap[0xC0]=' '; //F6 released - keymap[0xC1]=' '; //F7 released - keymap[0xC2]=' '; //F8 released - keymap[0xC3]=' '; //F9 released - keymap[0xC4]=' '; //F10 released - keymap[0xC5]=' '; //NumberLock released - keymap[0xC6]=' '; //ScrollLock released - keymap[0xC7]=' '; //(keypad) 7 released - keymap[0xC8]=' '; //(keypad) 8 released - keymap[0xC9]=' '; //(keypad) 9 released - keymap[0xCA]=' '; //(keypad) - released - keymap[0xCB]=' '; //(keypad) 4 released - keymap[0xCC]=' '; //(keypad) 5 released - keymap[0xCD]=' '; //(keypad) 6 released - keymap[0xCE]=' '; //(keypad) + released - keymap[0xCF]=' '; //(keypad) 1 released - keymap[0xD0]=' '; //(keypad) 2 released - keymap[0xD1]=' '; //(keypad) 3 released - keymap[0xD2]=' '; //(keypad) 0 released - keymap[0xD3]=' '; //(keypad) . released - keymap[0xD7]=' '; //F11 released - keymap[0xD8]=' '; //F12 released + keymap[0x01]=' '; //escape pressed + keymap[0x02]='!'; //1 pressed + keymap[0x03]='@'; //2 pressed + keymap[0x04]='#'; //3 pressed + keymap[0x05]='$'; //4 pressed + keymap[0x06]='%'; //5 pressed + keymap[0x07]='^'; //6 pressed + keymap[0x08]='&'; //7 pressed + keymap[0x09]='*'; //8 pressed + keymap[0x0A]='('; //9 pressed + keymap[0x0B]=')'; //0 (zero) pressed + keymap[0x0C]='_'; //- pressed + keymap[0x0D]='+'; //= pressed + keymap[0x0E]=' '; //backspace pressed + keymap[0x0F]=' '; //tab pressed + keymap[0x10]='Q'; //Q pressed + keymap[0x11]='W'; //W pressed + keymap[0x12]='E'; //E pressed + keymap[0x13]='R'; //R pressed + keymap[0x14]='T'; //T pressed + keymap[0x15]='Y'; //Y pressed + keymap[0x16]='U'; //U pressed + keymap[0x17]='I'; //I pressed + keymap[0x18]='O'; //O pressed + keymap[0x19]='P'; //P pressed + keymap[0x1A]='{'; //[ pressed + keymap[0x1B]='}'; //] pressed + keymap[0x1C]='\n'; //enter pressed + keymap[0x1D]=' '; //left control pressed + keymap[0x1E]='A'; //A pressed + keymap[0x1F]='S'; //S pressed + keymap[0x20]='D'; //D pressed + keymap[0x21]='F'; //F pressed + keymap[0x22]='G'; //G pressed + keymap[0x23]='H'; //H pressed + keymap[0x24]='J'; //J pressed + keymap[0x25]='K'; //K pressed + keymap[0x26]='L'; //L pressed + keymap[0x27]=':'; //; pressed + keymap[0x28]='\"'; //' (single quote) pressed + keymap[0x29]='~'; //` (back tick) pressed + keymap[0x2A]=' '; //left shift pressed + keymap[0x2B]='|'; //\ pressed + keymap[0x2C]='Z'; //Z pressed + keymap[0x2D]='X'; //X pressed + keymap[0x2E]='C'; //C pressed + keymap[0x2F]='V'; //V pressed + keymap[0x30]='B'; //B pressed + keymap[0x31]='N'; //N pressed + keymap[0x32]='M'; //M pressed + keymap[0x33]='<'; //, pressed + keymap[0x34]='>'; //. pressed + keymap[0x35]='?'; /// pressed + keymap[0x36]=' '; //right shift pressed + keymap[0x37]='*'; //(keypad) * pressed + keymap[0x38]=' '; //left alt pressed + keymap[0x39]=' '; //space pressed + keymap[0x3A]=' '; //CapsLock pressed + keymap[0x3B]=' '; //F1 pressed + keymap[0x3C]=' '; //F2 pressed + keymap[0x3D]=' '; //F3 pressed + keymap[0x3E]=' '; //F4 pressed + keymap[0x3F]=' '; //F5 pressed + keymap[0x40]=' '; //F6 pressed + keymap[0x41]=' '; //F7 pressed + keymap[0x42]=' '; //F8 pressed + keymap[0x43]=' '; //F9 pressed + keymap[0x44]=' '; //F10 pressed + keymap[0x45]=' '; //NumberLock pressed + keymap[0x46]=' '; //ScrollLock pressed + keymap[0x47]='7'; //(keypad) 7 pressed + keymap[0x48]='8'; //(keypad) 8 pressed + keymap[0x49]='9'; //(keypad) 9 pressed + keymap[0x4A]='-'; //(keypad) - pressed + keymap[0x4B]='4'; //(keypad) 4 pressed + keymap[0x4C]='5'; //(keypad) 5 pressed + keymap[0x4D]='6'; //(keypad) 6 pressed + keymap[0x4E]='+'; //(keypad) + pressed + keymap[0x4F]='1'; //(keypad) 1 pressed + keymap[0x50]='2'; //(keypad) 2 pressed + keymap[0x51]='3'; //(keypad) 3 pressed + keymap[0x52]='0'; //(keypad) 0 pressed + keymap[0x53]='.'; //(keypad) . pressed + keymap[0x57]=' '; //F11 pressed + keymap[0x58]=' '; //F12 pressed + keymap[0x81]=' '; //escape released + keymap[0x82]=' '; //1 released + keymap[0x83]=' '; //2 released + keymap[0x84]=' '; //3 released + keymap[0x85]=' '; //4 released + keymap[0x86]=' '; //5 released + keymap[0x87]=' '; //6 released + keymap[0x88]=' '; //7 released + keymap[0x89]=' '; //8 released + keymap[0x8A]=' '; //9 released + keymap[0x8B]=' '; //0 (zero) released + keymap[0x8C]=' '; //- released + keymap[0x8D]=' '; //= released + keymap[0x8E]=' '; //backspace released + keymap[0x8F]=' '; //tab released + keymap[0x90]=' '; //Q released + keymap[0x91]=' '; //W released + keymap[0x92]=' '; //E released + keymap[0x93]=' '; //R released + keymap[0x94]=' '; //T released + keymap[0x95]=' '; //Y released + keymap[0x96]=' '; //U released + keymap[0x97]=' '; //I released + keymap[0x98]=' '; //O released + keymap[0x99]=' '; //P released + keymap[0x9A]=' '; //[ released + keymap[0x9B]=' '; //] released + keymap[0x9C]=' '; //enter released + keymap[0x9D]=' '; //left control released + keymap[0x9E]=' '; //A released + keymap[0x9F]=' '; //S released + keymap[0xA0]=' '; //D released + keymap[0xA1]=' '; //F released + keymap[0xA2]=' '; //G released + keymap[0xA3]=' '; //H released + keymap[0xA4]=' '; //J released + keymap[0xA5]=' '; //K released + keymap[0xA6]=' '; //L released + keymap[0xA7]=' '; //; released + keymap[0xA8]=' '; //' (single quote) released + keymap[0xA9]=' '; //` (back tick) released + keymap[0xAA]=' '; //left shift released + keymap[0xAB]=' '; //\ released + keymap[0xAC]=' '; //Z released + keymap[0xAD]=' '; //X released + keymap[0xAE]=' '; //C released + keymap[0xAF]=' '; //V released + keymap[0xB0]=' '; //B released + keymap[0xB1]=' '; //N released + keymap[0xB2]=' '; //M released + keymap[0xB3]=' '; //, released + keymap[0xB4]=' '; //. released + keymap[0xB5]=' '; /// released + keymap[0xB6]=' '; //right shift released + keymap[0xB7]='*'; //(keypad) * released + keymap[0xB8]=' '; //left alt released + keymap[0xB9]=' '; //space released + keymap[0xBA]=' '; //CapsLock released + keymap[0xBB]=' '; //F1 released + keymap[0xBC]=' '; //F2 released + keymap[0xBD]=' '; //F3 released + keymap[0xBE]=' '; //F4 released + keymap[0xBF]=' '; //F5 released + keymap[0xC0]=' '; //F6 released + keymap[0xC1]=' '; //F7 released + keymap[0xC2]=' '; //F8 released + keymap[0xC3]=' '; //F9 released + keymap[0xC4]=' '; //F10 released + keymap[0xC5]=' '; //NumberLock released + keymap[0xC6]=' '; //ScrollLock released + keymap[0xC7]=' '; //(keypad) 7 released + keymap[0xC8]=' '; //(keypad) 8 released + keymap[0xC9]=' '; //(keypad) 9 released + keymap[0xCA]=' '; //(keypad) - released + keymap[0xCB]=' '; //(keypad) 4 released + keymap[0xCC]=' '; //(keypad) 5 released + keymap[0xCD]=' '; //(keypad) 6 released + keymap[0xCE]=' '; //(keypad) + released + keymap[0xCF]=' '; //(keypad) 1 released + keymap[0xD0]=' '; //(keypad) 2 released + keymap[0xD1]=' '; //(keypad) 3 released + keymap[0xD2]=' '; //(keypad) 0 released + keymap[0xD3]=' '; //(keypad) . released + keymap[0xD7]=' '; //F11 released + keymap[0xD8]=' '; //F12 released } diff --git a/src/c/paging.c b/src/c/paging.c index 660ee8c..f08530d 100644 --- a/src/c/paging.c +++ b/src/c/paging.c @@ -10,11 +10,11 @@ void set_pd() //set each entry to not present for(size_t i=0;i<1024;i++) { - // This sets the following flags to the pages: - // Supervisor: Only kernel-mode can access them - // Write Enabled: It can be both read from and written to - // Not Present: The page table is not present - page_directory[i] = 0x00000002; + // This sets the following flags to the pages: + // Supervisor: Only kernel-mode can access them + // Write Enabled: It can be both read from and written to + // Not Present: The page table is not present + page_directory[i] = 0x00000002; } } @@ -24,13 +24,13 @@ void set_pt(size_t num,uint32_t address) { // holds the physical address where we want to start mapping these pages to. // in this case, we want to map these pages to the very beginning of memory. - + //we will fill all 1024 entries in the table, mapping 4 megabytes for(size_t i=0;i<1024;i++) { - // As the address is page aligned, it will always leave 12 bits zeroed. - // Those bits are used by the attributes ;) - page_table[num][i] = (address + i * 0x1000) | 3; // attributes: supervisor level, read/write, present. + // As the address is page aligned, it will always leave 12 bits zeroed. + // Those bits are used by the attributes ;) + page_table[num][i] = (address + i * 0x1000) | 3; // attributes: supervisor level, read/write, present. } page_directory[num] = ((uint32_t)page_table[num]) | 3; diff --git a/src/c/stack_protector.c b/src/c/stack_protector.c index 9ce3cba..37f7cda 100644 --- a/src/c/stack_protector.c +++ b/src/c/stack_protector.c @@ -1,22 +1,14 @@ #include<stdint.h> #include<stdio.h> - + #if UINT32_MAX == UINTPTR_MAX #define STACK_CHK_GUARD 0xe2dee396 #else #define STACK_CHK_GUARD 0x595e9fbd94fda766 #endif - + uintptr_t __stack_chk_guard = STACK_CHK_GUARD; - -//__attribute__((noreturn)) void __stack_chk_fail(void) { -#if __STDC_HOSTED__ - printf("Stack smashing detected\n"); - abort(); -#elif __is_myos_kernel - printf("Stack smashing detected\n"); - panic("Stack smashing detected"); -#endif + printf("Stack smashing detected\n"); } diff --git a/src/c/stdio.c b/src/c/stdio.c index 36fd140..3a51e9a 100644 --- a/src/c/stdio.c +++ b/src/c/stdio.c @@ -17,20 +17,20 @@ void printf(char *str, ...) for(size_t i=0;str[i]!='\0';i++) { - if(str[i]=='%') - { - i++; - if(str[i]=='c') terminal_putchar((char)va_arg(list,int)); - else if(str[i]=='s') terminal_writestring(va_arg(list,char*)); - else if(str[i]=='d') terminal_writeint(va_arg(list,int)); - else if(str[i]=='f') terminal_writefloat(va_arg(list,double)); - else - { - terminal_writestring("wrong format using print function\n"); - return; - } - } - else terminal_putchar(str[i]); + if(str[i]=='%') + { + i++; + if(str[i]=='c') terminal_putchar((char)va_arg(list,int)); + else if(str[i]=='s') terminal_writestring(va_arg(list,char*)); + else if(str[i]=='d') terminal_writeint(va_arg(list,int)); + else if(str[i]=='f') terminal_writefloat(va_arg(list,double)); + else + { + terminal_writestring("wrong format using print function\n"); + return; + } + } + else terminal_putchar(str[i]); } va_end(list); diff --git a/src/c/string.c b/src/c/string.c index 6a3a96b..ce33528 100644 --- a/src/c/string.c +++ b/src/c/string.c @@ -36,9 +36,9 @@ void stringrev(char *str) for(size_t j=0;j<i-j;j++) { - char tmp=str[i-j]; - str[i-j]=str[j]; - str[j]=tmp; + char tmp=str[i-j]; + str[i-j]=str[j]; + str[j]=tmp; } } @@ -48,9 +48,9 @@ uint32_t stoi(const char *str) for(size_t i=0;str[i]!='\0';i++) { - if(str[i]<'0'||str[i]>'9') return num; - num*=10; - num+=str[i]-'0'; + if(str[i]<'0'||str[i]>'9') return num; + num*=10; + num+=str[i]-'0'; } return num; @@ -61,11 +61,11 @@ void itos(uint32_t num,char *str) if(num==0) stringcpy(str,"0"); else { - size_t i=0; - for(;num>0;num/=10,i++) str[i]='0'+num%10; - str[i]='\0'; + size_t i=0; + for(;num>0;num/=10,i++) str[i]='0'+num%10; + str[i]='\0'; - stringrev(str); + stringrev(str); } } @@ -79,16 +79,16 @@ double stof(const char *str) for(;str[i]!='\0';i++) { - if(str[i]=='.') - { - if(point) return num/pow; - point=1; - continue; - } - if(str[i]<'0'||str[i]>'9') return num/pow; - num*=10; - num+=str[i]-'0'; - if(point) pow*=10; + if(str[i]=='.') + { + if(point) return num/pow; + point=1; + continue; + } + if(str[i]<'0'||str[i]>'9') return num/pow; + num*=10; + num+=str[i]-'0'; + if(point) pow*=10; } return num/pow; @@ -105,9 +105,9 @@ void ftos(double num, char *str) for(size_t i=0;i<decimals;i++) { - num-=(uint32_t)num; - num*=10; - c[0]=(uint32_t)num+'0'; - stringcat(str,c); + num-=(uint32_t)num; + num*=10; + c[0]=(uint32_t)num+'0'; + stringcat(str,c); } } diff --git a/src/c/timer.c b/src/c/timer.c index 0b4ddaa..390e512 100644 --- a/src/c/timer.c +++ b/src/c/timer.c @@ -14,9 +14,9 @@ void timer_handler() tick++; if(tick==TICKS_PER_SECOND) { - //printf("%d seconds passed\n",time); - tick=0; - time++; + //printf("%d seconds passed\n",time); + tick=0; + time++; } ioport_out(0x20, 0x20); diff --git a/src/c/tty.c b/src/c/tty.c index c7e5f44..62ccd02 100644 --- a/src/c/tty.c +++ b/src/c/tty.c @@ -16,17 +16,17 @@ size_t pieces(char pieces[][CMD_LENGTH],char *buffer) while(buffer[i]==' '&&buffer[i]!='\0') i++; for(;buffer[i]!='\0';i++) { - if(buffer[i]==' ') - { - while(buffer[i]==' '&&buffer[i]!='\0') i++; - j=0; - r++; - i--; - } - else - { - pieces[r][j++]=buffer[i]; - } + if(buffer[i]==' ') + { + while(buffer[i]==' '&&buffer[i]!='\0') i++; + j=0; + r++; + i--; + } + else + { + pieces[r][j++]=buffer[i]; + } } return r+1; } @@ -35,7 +35,7 @@ void echo(size_t numberof,char parts[][CMD_LENGTH]) { for(size_t i=1;i<numberof;i++) { - printf("%s ",parts[i]); + printf("%s ",parts[i]); } printf("\n"); } @@ -58,8 +58,8 @@ void number(size_t numberof,char parts[][CMD_LENGTH]) if(numberof==1) printf("Please enter a number\n"); else { - printf("Entered integer number is %d\n",stoi(parts[1])); - printf("Entered float number is: %f\n",stof(parts[1])); + printf("Entered integer number is %d\n",stoi(parts[1])); + printf("Entered float number is: %f\n",stof(parts[1])); } } @@ -88,30 +88,30 @@ void prompt() void neofetch() { set_color(VGA_COLOR_WHITE,VGA_COLOR_BLACK); - printf(" . "); printf("Dobrodosli u moj \n"); - printf(" J:L (\"\"\") "); printf("operativni sistem :) \n"); - printf(" |:| III "); printf("Uzivajte! \n"); - printf(" |:| III "); printf(" \n"); - printf(" |:| III "); printf("Welcome to my \n"); - printf(" |:| __III__ "); printf("operating system :) \n"); - printf(" |:| /:-.___,-:\\ "); printf("Enjoy your stay! \n"); - printf(" |:| \\] |:| [/ "); printf(" \n"); - printf(" |:| |:| "); printf(" \n"); - printf(" |:| |:| "); printf(" \n"); - printf(" |:| |:| "); printf(" \n"); - printf(" /] |:| [\\ |:| "); printf(" \n"); - printf(" \\:-'\"\"\"`-:/ |:| "); printf(" \n"); - printf(" \"\"III\"\" |:| "); printf(" \n"); - printf(" III |:| "); printf(" \n"); - printf(" III |:| "); printf(" \n"); - printf(" III |:| "); printf("napravio/made by: \n"); - printf(" (___) J:F "); printf("Aleksa Vuckovic \n"); - printf(" \" "); printf(" \n"); + printf(" . "); printf("Dobrodosli u moj \n"); + printf(" J:L (\"\"\") "); printf("operativni sistem :) \n"); + printf(" |:| III "); printf("Uzivajte! \n"); + printf(" |:| III "); printf(" \n"); + printf(" |:| III "); printf("Welcome to my \n"); + printf(" |:| __III__ "); printf("operating system :) \n"); + printf(" |:| /:-.___,-:\\ "); printf("Enjoy your stay! \n"); + printf(" |:| \\] |:| [/ "); printf(" \n"); + printf(" |:| |:| "); printf(" \n"); + printf(" |:| |:| "); printf(" \n"); + printf(" |:| |:| "); printf(" \n"); + printf(" /] |:| [\\ |:| "); printf(" \n"); + printf(" \\:-'\"\"\"`-:/ |:| "); printf(" \n"); + printf(" \"\"III\"\" |:| "); printf(" \n"); + printf(" III |:| "); printf(" \n"); + printf(" III |:| "); printf(" \n"); + printf(" III |:| "); printf("napravio/made by: \n"); + printf(" (___) J:F "); printf("Aleksa Vuckovic \n"); + printf(" \" "); printf(" \n"); for(size_t i=0;i<16;i++) { - set_color(0,i); - printf(" ",i); + set_color(0,i); + printf(" ",i); } printf("\n"); diff --git a/src/c/vga.c b/src/c/vga.c index e61cd7f..67c8b02 100644 --- a/src/c/vga.c +++ b/src/c/vga.c @@ -12,12 +12,12 @@ void set_color(enum vga_color fg, enum vga_color bg) { terminal_color = fg | bg << 4; } - + static inline uint16_t vga_entry(unsigned char uc, uint8_t color) { return (uint16_t) uc | (uint16_t) color << 8; } - + void terminal_initialize() { terminal_row=0; @@ -26,11 +26,11 @@ void terminal_initialize() terminal_buffer=(uint16_t*) 0xB8000; for(size_t y=0;y<VGA_HEIGHT;y++) { - for(size_t x=0;x<VGA_WIDTH;x++) - { - const size_t index=y*VGA_WIDTH+x; - terminal_buffer[index]=vga_entry(' ', terminal_color); - } + for(size_t x=0;x<VGA_WIDTH;x++) + { + const size_t index=y*VGA_WIDTH+x; + terminal_buffer[index]=vga_entry(' ', terminal_color); + } } } @@ -43,7 +43,8 @@ void terminal_putentryat(char c, uint8_t color, size_t x, size_t y) void movescreen() { terminal_row--; - for(size_t i=0;i<VGA_HEIGHT;i++) for(size_t j=0;j<VGA_WIDTH;j++) terminal_buffer[i*VGA_WIDTH+j]=terminal_buffer[(i+1)*VGA_WIDTH+j]; + for(size_t i=0;i<VGA_HEIGHT;i++) for(size_t j=0;j<VGA_WIDTH;j++) + terminal_buffer[i*VGA_WIDTH+j]=terminal_buffer[(i+1)*VGA_WIDTH+j]; } void next_field() @@ -56,18 +57,18 @@ void previous_field() if(terminal_column) terminal_column--; else terminal_row--,terminal_column=VGA_WIDTH-1; } - + void terminal_putchar(char c) { if(c=='\n') terminal_column=0,terminal_row++; else { - terminal_putentryat(c, terminal_color, terminal_column, terminal_row); - next_field(); + terminal_putentryat(c, terminal_color, terminal_column, terminal_row); + next_field(); } if (terminal_row==VGA_HEIGHT) movescreen(); } - + void terminal_writestring(char* data) { for(int i=0;data[i]!='\0';i++) terminal_putchar(data[i]); diff --git a/src/include/stdio.h b/src/include/stdio.h index 45c9215..6bb87be 100644 --- a/src/include/stdio.h +++ b/src/include/stdio.h @@ -1,12 +1,12 @@ #ifndef _STDIO_H #define _STDIO_H + #include <stdarg.h> #include <stddef.h> + #define SEEK_SET 0 typedef struct { int unused; } FILE; -#ifdef __cplusplus -extern "C" { -#endif + extern FILE* stderr; #define stderr stderr int fclose(FILE*); @@ -22,7 +22,4 @@ int vfprintf(FILE*, const char*, va_list); void printf(char *str, ...); -#ifdef __cplusplus -} -#endif #endif diff --git a/src/include/stdlib.h b/src/include/stdlib.h index a0afe38..77ffa67 100644 --- a/src/include/stdlib.h +++ b/src/include/stdlib.h @@ -1,15 +1,11 @@ #ifndef _STDLIB_H #define _STDLIB_H -#ifdef __cplusplus -extern "C" { -#endif + void abort(void); int atexit(void (*)(void)); int atoi(const char*); void free(void*); char* getenv(const char*); void* malloc(size_t); -#ifdef __cplusplus -} -#endif + #endif diff --git a/src/include/string.h b/src/include/string.h index bef5854..78fa956 100644 --- a/src/include/string.h +++ b/src/include/string.h @@ -1,16 +1,12 @@ #ifndef _STRING_H #define _STRING_H + #include <stddef.h> -#ifdef __cplusplus -extern "C" { -#endif + void* memcpy(void*, const void*, size_t); void* memset(void*, int, size_t); char* strcpy(char*, const char*); size_t strlen(const char*); -#ifdef __cplusplus -} -#endif #include<types.h> diff --git a/src/include/sys/types.h b/src/include/sys/types.h index 4f55189..34c1b65 100644 --- a/src/include/sys/types.h +++ b/src/include/sys/types.h @@ -1,4 +1,6 @@ #ifndef _SYS_TYPES_H #define _SYS_TYPES_H + typedef int pid_t; + #endif diff --git a/src/include/unistd.h b/src/include/unistd.h index a6bfee0..abe7f3c 100644 --- a/src/include/unistd.h +++ b/src/include/unistd.h @@ -1,14 +1,11 @@ #ifndef _UNISTD_H #define _UNISTD_H + #include <sys/types.h> -#ifdef __cplusplus -extern "C" { -#endif + int execv(const char*, char* const[]); int execve(const char*, char* const[], char* const[]); int execvp(const char*, char* const[]); pid_t fork(void); -#ifdef __cplusplus -} -#endif + #endif diff --git a/src/linker.ld b/src/linker.ld index 38ddd94..d8e7f4b 100644 --- a/src/linker.ld +++ b/src/linker.ld @@ -1,43 +1,43 @@ /* The bootloader will look at this image and start execution at the symbol designated as the entry point. */ ENTRY(_start) - + /* Tell where the various sections of the object files will be put in the final kernel image. */ SECTIONS { - /* Begin putting sections at 1 MiB, a conventional place for kernels to be - loaded at by the bootloader. */ - . = 1M; - - /* First put the multiboot header, as it is required to be put very early - early in the image or the bootloader won't recognize the file format. - Next we'll put the .text section. */ - .text BLOCK(4K) : ALIGN(4K) - { - *(.multiboot) - *(.text) - } - - /* Read-only data. */ - .rodata BLOCK(4K) : ALIGN(4K) - { - *(.rodata) - } - - /* Read-write data (initialized) */ - .data BLOCK(4K) : ALIGN(4K) - { - *(.data) - } - - /* Read-write data (uninitialized) and stack */ - .bss BLOCK(4K) : ALIGN(4K) - { - *(COMMON) - *(.bss) - } - - /* The compiler may produce other sections, by default it will put them in - a segment with the same name. Simply add stuff here as needed. */ + /* Begin putting sections at 1 MiB, a conventional place for kernels to be + loaded at by the bootloader. */ + . = 1M; + + /* First put the multiboot header, as it is required to be put very early + early in the image or the bootloader won't recognize the file format. + Next we'll put the .text section. */ + .text BLOCK(4K) : ALIGN(4K) + { + *(.multiboot) + *(.text) + } + + /* Read-only data. */ + .rodata BLOCK(4K) : ALIGN(4K) + { + *(.rodata) + } + + /* Read-write data (initialized) */ + .data BLOCK(4K) : ALIGN(4K) + { + *(.data) + } + + /* Read-write data (uninitialized) and stack */ + .bss BLOCK(4K) : ALIGN(4K) + { + *(COMMON) + *(.bss) + } + + /* The compiler may produce other sections, by default it will put them in + a segment with the same name. Simply add stuff here as needed. */ } |
