Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

[OS] [C++] Klawiatura - niepoprawny zestaw znaków? + IRQ1 'nie chce' sie wywoływać

Ostatnio zmodyfikowano 2014-03-09 15:16
Autor Wiadomość
Brezniew
» 2014-03-07 23:59:43
Do przekierowania przerwań użyj tego:

io.h:
C/C++
#ifndef _ASM_I386_IO_H
#define _ASM_I386_IO_H

#include <sys/types.h>

static inline void outb( byte val, word port )
{
    __asm__ __volatile__( "outb %%al, %%dx\n\t"
    ::"a"( val ), "d"( port ) );
}

static inline byte inb( word port )
{
    byte val;
    __asm__ __volatile__( "inb %%dx, %%al\n\t"
    : "=a"( val )
        : "d"( port ) );
    return val;
}

static inline int io_btsb( word port, byte b )
{
    if( b >= 8 ) return - 1;
   
    __asm__ __volatile__( "inb %%dx, %%al\n\t"
    "btsb %%bl, %%al\n\t"
    "outb %%al, %%dx\n\t"
    ::"b"( b ), "d"( port )
        : "al" );
   
    return 0;
}

static inline int io_btrb( word port, byte b )
{
    if( b >= 8 ) return - 1;
   
    __asm__ __volatile__( "inb %%dx, %%al\n\t"
    "btrb %%bl, %%al\n\t"
    "outb %%al, %%dx\n\t"
    ::"b"( b ), "d"( port )
        : "al" );
   
    return 0;
}

static inline int io_btcb( word port, byte b )
{
    if( b >= 8 ) return - 1;
   
    __asm__ __volatile__( "inb %%dx, %%al\n\t"
    "btcb %%bl, %%al\n\t"
    "outb %%al, %%dx\n\t"
    ::"b"( b ), "d"( port )
        : "al" );
   
    return 0;
}

#endif /*_ASM_I386_IO_H*/

intr.c
C/C++
#include <asm-i386/io.h>
#include <asm-i386/intr.h>

void set_idt( desc_t * desc, word code_sel, byte type_attr, const void * ptr )
{
    desc->a =(( 0xFFFF &( dword ) ptr ) |( code_sel << 16 ) );
    desc->b =( type_attr << 8 ) |( 0xFFFF0000 &( dword ) ptr );
}

int enable_irq( byte irq )
{
    if( irq > 0xF ) return - 1; //error: incorrect irq
   
    if( irq & 0x8 ) io_btrb( PIC2 + 1, irq - 0x8 );
    else io_btrb( PIC1 + 1, irq );
   
    return 0;
}

int disable_irq( byte irq )
{
    if( irq > 0xF ) return - 1; //error: incorrect irq
   
    if( irq & 0x8 ) io_btcb( PIC2 + 1, irq - 0x8 );
    else io_btcb( PIC1 + 1, irq );
   
    return 0;
}

void disable_all_irq( void )
{
    outb( 0xFF, PIC1 + 1 ); //Disable IRQ0 - IRQ7
    outb( 0xFF, PIC2 + 1 ); //Disable IRQ8 - IRQF
}

void init_pic( byte offset1, byte offset2 )
{
    outb( 0x11, PIC1 ); //ICW1
    outb( 0x11, PIC2 ); //ICW1
    outb( offset1, PIC1 + 1 ); //Set offset IRQ0 - IRQ7
    outb( offset2, PIC2 + 1 ); //Set offset IRQ8 - IRQF
    outb( 0x04, PIC1 + 1 );
    outb( 0x02, PIC1 + 1 );
    outb( 0x01, PIC1 + 1 ); //ICW4
    outb( 0x01, PIC2 + 1 ); //ICW4
    disable_all_irq();
}

intr.h
C/C++
#ifndef __INTR_H
#define __INTR_H

#include <types.h>

/* ports */
#define PIC1                0x20
#define PIC2                0xA0

/* type_attr: type descriptor */
#define INT_GATE            0x8E        //interrupt gate
#define TRAP_GATE           0x8F        //trap gate
#define TASK_GATE           0x05        //task gate
#define SYS_GATE            0xEF        //system gate

#ifndef _DESCR_T
#define _DESCR_T
typedef struct //descriptor type
{
    dword a, b;
} desc_t;
#endif /*_DESCR_T*/

#define cli()       __asm__ __volatile__( "cli" )
#define sti()       __asm__ __volatile__( "sti" )

extern desc_t idt[ 256 ]; //interrupt descriptor table

#ifdef KERNEL
void pic_init( byte offset1, byte offset2 );
#endif /*KERNEL*/

void set_idt( desc_t * desc, byte sel, byte type_attr, void * ptr );
int enable_irq( byte irq );
int disable_irq( byte irq );
void disable_all_irq( void );

#endif /*__INTR_H*/

types.h
C/C++
#ifndef __TYPES_H
#define __TYPES_H

#define byte unsigned char          //8-bit
#define word unsigned short int     //16-bit
#define dword unsigned long         //32-bit

#define __byte( x, i )    ((( byte * )&( x ))[ i ])
#define __word( x, i )    ((( word * )&( x ))[ i ])
#define __dword( x, i )   ((( dword * )&( x ))[ i ])

typedef unsigned int size_t;

typedef struct //tss type
{
    dword back_link,
    esp0, ss0, esp1, ss1, esp2, ss2,
    cr3, eip, eflags,
    eax, ecx, edx, ebx, esp, ebp, esi, edi,
    es, cs, ss, ds, fs, gs, ldt;
    word trace, io_map;
} tss_t;

#endif /*__TYPES_H*/

I wywołaj gdzieś w systemie funkcje
pic_init( 0x20, 0x28 );

Te pliki są z mojego systemu. To jest stara implementacja może ci się przyda ja już jej nie używam :)
P-105826
Elaine
» 2014-03-08 02:48:34
I jeśli używasz C++ to lepiej przepisz kod do C w C++ jest zaimplementowanych wiele rzeczy do których obsługi wymagana jest biblioteka standardowa C++, a w c wszystko generowane jest przez kompilator. Pisanie głównego kodu w c powoduje wiele błędów, a niektóre, elementy są niemożliwe lub niepraktyczne do zaprogramowania
?
P-105836
Brezniew
» 2014-03-08 14:15:50
Chodzi oto np. jak używasz takich rzeczy jak new, delete itp. Kod w C++ jest często wolniejszy nisz kod w C w przypadku pisania systemu ze względu na wyższy poziom abstrakcji co w samym systemie jest bardzo ważne. Jeśli już chce używać c++ to niech inicjacje kernel-a, kod przerwań i wszystkie powiązane funkcje a szczególnie moduł schedule jeśli zamierzasz go implementować.
A jeśli już potrzebujesz czegoś czego nie da zaimplementować w samym c to użyj asm inline, makra z asm-em bądź mechanizmów wbudowanych w kompilator takich jak
__attribute__
, co jest o wiele wygodniejsze nisz w C++. W przypadku pisania programów jest na odwrót ale to jądro systemu operacyjnego. Sam osobiście na początku chciałem napisać system w C++ ale przy większej ilości kodu jest to męcząco nie praktyczne :P. Do tego nie widziałem jeszcze kodu systemu napisanego w samym c, a jeśli był c++ używany to tylko do nie których zewnętrznych albo dopiero w kmain systemu ale wtedy był init_kernel który wszystko inicjował i tego kodu było znacznie więcej nisz w C++. W twoim przypadku widziałem że używałeś
extern "C"
 to nie rozwiąże wszystkich problemów, to jedynie wyłącza wikłanie nazw i zmienia nieznacznie kod funkcji.

A co do problemu skoro wszystko działa to najwidoczniej jest błędnie napisane sterowniki do ekranu albo niepoprawna mapa znaków, spróbuj zmienić znaki w mapie a jeśli to nie pomoże to wstaw kod obsługi ekranu bo te znaki co widziałem nie było ich w mapie a znaki do vga podaje się w 2-bajtach a nie jednym jak char to może tłumaczyć dlaczego wpisywało dwa znaki na ras. Jeśli to nie pomoże to mogę ci dać mój kod w starej implementacji.
P-105857
kubawal
Temat założony przez niniejszego użytkownika
» 2014-03-08 15:26:05
sterownik ekranu działa dobrze - został wcześniej przetes towany
P-105858
MrPoxipol
» 2014-03-08 16:19:53
@Brezniew,
Dla przykładu Haiku jest napisane w C++ i wcale nie jest wolne.. (oprócz tego, że jest licencji OpenSource).
PS Pisz po polsku.
P-105862
Brezniew
» 2014-03-08 16:24:56
Daj kod kbdBuf i mosKbdToASCII.

@up Pisze po polski.
P-105863
Elaine
» 2014-03-08 16:30:38
Chodzi oto np. jak używasz takich rzeczy jak new, delete itp. Kod w C++ jest często wolniejszy nisz kod w C w przypadku pisania systemu ze względu na wyższy poziom abstrakcji
Gdzie tam.

A jeśli już potrzebujesz czegoś czego nie da zaimplementować w samym c to użyj asm inline, makra z asm-em bądź mechanizmów wbudowanych w kompilator takich jak
__attribute__
, co jest o wiele wygodniejsze nisz w C++.
Te same rozszerzenia GCC są dostępne i w C++.
P-105864
pekfos
» 2014-03-08 16:34:25
Pisze po polski
"nisz" pisze się przez ż, a "nie których", "nie praktyczne", itp razem.
P-105865
1 « 2 » 3
Poprzednia strona Strona 2 z 3 Następna strona