O KiddieOS é um sistema operacional open-source básico em desenvolvimento pelo curso gratuito D.S.O.S [Desenvolvendo Sistemas Operacionais Simples]. A intenção deste sistema será: Criar, editar ou excluir arquivos, codificar em uma linguagem própria do sistema, criar objetos visuais e automatizados (desenhos) através desta linguagem, utilizar uma interface simples e intuitiva, criar novas interfaces gráficas, como: Janelas, botões, campos, etc... e estimular crianças, jovens e adultos a programar numa linguagem simples dentro do sistema operacional KiddieOS. A intenção do curso D.S.O.S é dá início ao desenvolvimento de sistemas operacionais utilizando a linguagem Assembly e entender a fundo sobre diversos conceitos internos deste tipo de sistema. Aqui neste repositório serão armazenados arquivos de APIs do KiddieOS, a imagem de disco para teste e futuramente - todo o sistema operacional completo. Visite o link abaixo para nos acompanhar no curso do Youtube, se inscreva neste canal para se manter atualizado e siga-me no GitHub. Vejo vocês lá:
MIT License
46
stars
5
forks
source link
KiddieOS v1.3.7: Comando WRITE para criação de arquivos e Prints em Terminal #7
Novo comando WRITE para escrita de dados no terminal e escrita de dados em arquivos, podendo ser criação de novos ou acrescimento de dados nos existentes:
A rotina do comando primeiro verifica os parâmetros -on e -off, caso for igual a um destes dois, o comando pode habilitar uma variável (definir pra 1) ou limpar uma variável (definir pra 0), afim do Shell utilizar esta variável na inicialização para evitar de escrever o diretório atual na CLI, Ex.: K:\KiddieOS\Users\;
Caso não passe nas primeiras verificações, a rotina testa outros argumentos verificando se é igual a -fc ou -fa, se for igual a -fc então ele define a parte alta de AX (AH) e se for igual a -fa ele define a parte baixa de AX (AL), onde este registrador será utilizado para controlar o fluxo no driver do fat16. O fat16 será responsável por criar novos arquivos quando o parâmetro é "-fc" ou acrescentar dados em arquivos existentes quando o parâmetro é "-fa".
Caso não passe na 2ª verificação, então o comando write assume que os dados não se tratam de parâmetros mas sim, um único argumento de dados para imprimir no terminal, porém não é 100% certeza a ideia de imprimir no terminal apenas com estas verificações, pois o dado de impressão pode estar antes dos parâmetros -fa ou -fa, então mais tarde é feito outras verificações.
Na próxima rotina, nós temos uma cópia de dados feitos do dado em BufferArgs (Dados na linha de comando) para o BufferWrite (Um buffer limitado para dados a serem escritos), estes dados serão formatados dependendo da necessidade, incluindo a conversão de caracteres de escape. A variável ArgData também é definida pra 1, pois é ela que identifica que o argumento dos dados veio primeiro dos parâmetros de arquivos (caso houver).
Já nesta mesma rotina, ela já consegue identificar se o byte final é finalizado com 0 (zero-terminated) ou com espaços e ainda faz uma outra verificação para identificar se o espaço não está ali de modo indevido, pois o espaço é um parâmetro funcional que delimita argumentos e parâmetros da linha de comando, caso tiver indevidamente ou ser finalizado com 0, então o comando Write apenas imprime o texto na tela.
Caso a rotina identifique realmente que há outros dados após o espaço, então ela simplesmente retorna ao passo 2. para verificar os parâmetros -fc e -fa, identificando estes argumentos, então uma rotina específica é executada. Observações: Existe um fluxo de execução na rotina anterior que testa uma outra variável chamada ArgFile, onde esta identifica se o argumento do dado está sendo escrito "após" os parâmetros -fc ou -fa.
Na próxima rotina nós definimos a variável ArgFile pra 1, afim de definir o fluxo de execução da rotina executada (passo 4) pelo passo 3. caso esta rotina do passo 7 seja executada primeiro a partir do passo 2. Nesta rotina nós empilhamos alguns endereços e registradores, formatamos a linha de comando usando a rotina Format_Command_Line, salvamos o diretório atual através de Store_Dir e navegamos em diretórios encadeados carregando na memória através de Load_File_Path. No final, verificamos se a variável ArgData está definida pra 1, caso estiver, significa que os dados e os parâmetros já foram processados, o que nos restaria processar a escrita de arquivos como finalização.
Caso não estiver definida pra 1, então deslocamos até o próximo espaço ou zero, deslocamos os espaços e tentamos encontrar o argumento do dado que pode estar após os parâmetros de arquivos, é aqui que entra as verificações citadas no passo 3. como "... então mais tarde é feito outras verificações.", caso encontre o próximo argumento, então é retornado para a função de cópia de dados no passo 4. e assim os dados são processados, se não, não encontrando o próximo argumento e identificando finalização em 0, o próximo passo é a execução de um mini-editor interno.
O mini-editor interno é praticamente um editor com algumas funcionalidades parecidas da CLI, porém de forma mais resumida e centralizada em 3 objetivos bem específicos: Analisar, Armazenar e Processar.
Análise de Teclas: Aqui verificamos a tecla BackSpace, Enter, CTRL+S e CTRL+X. No BackSpace uma rotina específica é executada para deslocar o cursor e o ponteiro para trás zerando o dado atual na posição do Buffer, além disso a rotina do BackSpace pode realizar cálculos para determinar quais são as colunas das linhas anteriores onde o cursor deve se posicionar, baseado no limite do Editor e nos caracteres digitados. Na tecla Enter, apenas é executado funções de incremento do Cursor para baixo, a ponto de realizar a quebra de linha. no CTRL+S finalmente a rotina de escrita de arquivos é executada, desempilhando os ponteiros do nome de arquivo formatado, não-formatado e sinalizadores dos parâmetros -fc e -fa. Por último, no CTRL+X, o fluxo normal do Editor é interrompido, para desempilhar os dados restantes e imprimir uma mensagem na tela de que foi "Cancelado pelo Usuário".
Armazenamento de Dados: Os dados escritos no terminal, pela interrupção de espera de teclas, é armazenado no Buffer de dados sucessivamente para posterior uso do FAT16, no entanto, este Buffer é limitado e estático, contendo apenas 100 bytes de tamanho devido o sistema não ter recursos adequados de alocação dinâmica de memória (Como em um gerenciamento normal da memória de um sistema operacional), em breve este Buffer estático será alterado para uma memória RAM dinâmica e realocável (Útil principalmente para File Append). Nesta parte de armazenamento, também é imprimido caractere a caractere, exceto nos casos que é um BackSpace.
Processamento de Escrita: O Comando Write é considerado um sistema de saída, onde tal sistema pode definir para qual dispositivo de saída enviaremos nossos dados: Um arquivo ou ecrã. O Ecrã é nada mais nada menos que a tela negra do terminal do Shell, uma região bem delimitada onde informações e dados podem ser escritos ou apresentados, ou até mesmo, lidos. Um arquivo é uma outra forma de saída, onde os dados vão para o dispositivo de armazenamento, seja um pendrive, um HD, ou qualquer outro meio. Para isto, é preciso que tenhamos um sistema de arquivos adequado para cada tipo de mídia, relacionando com fatores como: Capacidade, Velocidade, Estrutura, etc... no KiddieOS este sistema é o FAT16, frequentemente usado em Pendrives de até 8GB, então é responsabilidade do driver do FAT16 gerenciar a escrita de arquivos, seguindo específicos fluxos de execução como: Verificar se arquivos existem, criar novos arquivos ou acrescentar dados em arquivos já existentes. Portanto, é imprescindível que o comando Write, após realizar todos os seus "preparos" dos dados, faça o envio adequado das informações para o fat16, afim de executar suas funções, o driver do fat16 por sua vez abstrai esta execução, fornecendo apenas acesso a rotina de "Escrita de Arquivos" com parâmetros manipuláveis para todo o sistema operacional.
Obs.: O Processamento de Escrita de arquivos ainda não está desenvolvido, apenas temos os dados preparados de forma adequada para serem enviados. Nas próximas atualizações, o foco será o driver do FAT16.
TODO: Próximas Atribuições:
Veja na lista anterior da versão v1.3.6 do Pull Request aberto.
Features
Novo comando WRITE para escrita de dados no terminal e escrita de dados em arquivos, podendo ser criação de novos ou acrescimento de dados nos existentes:
Análise de Teclas: Aqui verificamos a tecla BackSpace, Enter, CTRL+S e CTRL+X. No BackSpace uma rotina específica é executada para deslocar o cursor e o ponteiro para trás zerando o dado atual na posição do Buffer, além disso a rotina do BackSpace pode realizar cálculos para determinar quais são as colunas das linhas anteriores onde o cursor deve se posicionar, baseado no limite do Editor e nos caracteres digitados. Na tecla Enter, apenas é executado funções de incremento do Cursor para baixo, a ponto de realizar a quebra de linha. no CTRL+S finalmente a rotina de escrita de arquivos é executada, desempilhando os ponteiros do nome de arquivo formatado, não-formatado e sinalizadores dos parâmetros -fc e -fa. Por último, no CTRL+X, o fluxo normal do Editor é interrompido, para desempilhar os dados restantes e imprimir uma mensagem na tela de que foi "Cancelado pelo Usuário".
Armazenamento de Dados: Os dados escritos no terminal, pela interrupção de espera de teclas, é armazenado no Buffer de dados sucessivamente para posterior uso do FAT16, no entanto, este Buffer é limitado e estático, contendo apenas 100 bytes de tamanho devido o sistema não ter recursos adequados de alocação dinâmica de memória (Como em um gerenciamento normal da memória de um sistema operacional), em breve este Buffer estático será alterado para uma memória RAM dinâmica e realocável (Útil principalmente para File Append). Nesta parte de armazenamento, também é imprimido caractere a caractere, exceto nos casos que é um BackSpace.
Processamento de Escrita: O Comando Write é considerado um sistema de saída, onde tal sistema pode definir para qual dispositivo de saída enviaremos nossos dados: Um arquivo ou ecrã. O Ecrã é nada mais nada menos que a tela negra do terminal do Shell, uma região bem delimitada onde informações e dados podem ser escritos ou apresentados, ou até mesmo, lidos. Um arquivo é uma outra forma de saída, onde os dados vão para o dispositivo de armazenamento, seja um pendrive, um HD, ou qualquer outro meio. Para isto, é preciso que tenhamos um sistema de arquivos adequado para cada tipo de mídia, relacionando com fatores como: Capacidade, Velocidade, Estrutura, etc... no KiddieOS este sistema é o FAT16, frequentemente usado em Pendrives de até 8GB, então é responsabilidade do driver do FAT16 gerenciar a escrita de arquivos, seguindo específicos fluxos de execução como: Verificar se arquivos existem, criar novos arquivos ou acrescentar dados em arquivos já existentes. Portanto, é imprescindível que o comando Write, após realizar todos os seus "preparos" dos dados, faça o envio adequado das informações para o fat16, afim de executar suas funções, o driver do fat16 por sua vez abstrai esta execução, fornecendo apenas acesso a rotina de "Escrita de Arquivos" com parâmetros manipuláveis para todo o sistema operacional.
Obs.: O Processamento de Escrita de arquivos ainda não está desenvolvido, apenas temos os dados preparados de forma adequada para serem enviados. Nas próximas atualizações, o foco será o driver do FAT16.
TODO: Próximas Atribuições:
Veja na lista anterior da versão v1.3.6 do Pull Request aberto.