Começo de um projeto:GRAPOS/ArtC
A ideia desse projeto e fazer um sistema em c++ e assembly(que odeio pra caset* usa essa merda)ele teria um mouse, softwares, acesso a memoria esterna entre outros
No momento que escrevo isso eu consegui fazer um sistema de mouse que usa setas e o enter para funcionar:
#include "types.h"
bool click_input = false;
int my = 0;
int mx = 0;
typedef void (*constructor)();
extern "C" constructor* start_ctors;
extern "C" constructor* end_ctors;
unsigned char inportb(unsigned short port);
extern "C" void callConstructors()
{
for (constructor* i = start_ctors; i != end_ctors; i++) {
(*i)();
}
}
unsigned char inportb(unsigned short port);
unsigned char inportb(unsigned short port) {
unsigned char result;
asm volatile("inb %1, %0" : "=a"(result) : "Nd"(port));
return result;
}
void printf(int x, int y, const char* str) {
// Inicia o ponteiro para a memória de vídeo na posição especificada
unsigned short* VideoMemory = (unsigned short*)(0xb8000 + (y * 80 + x) * 2);
// Escreve cada caractere da string na memória de vídeo
for (int i = 0; str[i] != '\0'; ++i) {
VideoMemory[i] = (VideoMemory[i] & 0xFF00) | str[i]; // Caractere ASCII na parte baixa do byte
}
}
// Função de delay simples
void delay(int milliseconds) {
for (volatile int i = 0; i < milliseconds * 1000000; i++) {
// Apenas aguarda
}
}
void clearScreen() {
// Implementação básica: preenche a tela com espaços em branco
static unsigned short* VideoMemory = (unsigned short*)0xb8000;
for (int i = 0; i < 80 * 25; i++) {
VideoMemory[i] = (VideoMemory[i] & 0xFF00) | ' ';
}
}
extern "C" void kernelMain(void* multiboot_structure, uint32_t magicnumber) {
char inputBuffer[256];
int index = 0;
while(1) {
if ((inportb(0x64) & 0x01) == 1) {
// Ler o código da tecla do teclado
char key = inportb(0x60);
// Adiciona o código da tecla à buffer de entrada
inputBuffer[index] = key;
index++;
inputBuffer[index] = '\0'; // Adiciona terminador de string
if(key == 0x48) { // Seta para cima
my -= 1;
} else if(key == 0x50) { // Seta para baixo
my += 1;
} else if(key == 0x4B) { // Seta para esquerda
mx -= 1;
} else if(key == 0x4D) { // Seta para direita
mx += 1;
}else if(key == 0x1C) { // Seta para direita
click_input = true;
}else{click_input = false;}
}
if(click_input == true){
printf(10,10,"click!");
}
printf(mx, my, "<-");
delay(5);
clearScreen();
}
}
É bom o suficiente por agora mais tentarei fazer algo que vc possa calcular(calculadora o imbecil) e um bloco de notas
Comentários
Postar um comentário