Core War A Batalha do Núcleo O que é o Core War ? É um jogo de programação onde programas em assembler tentam destruir-se na memória de um computador simulado Os programas (os guerreiros) são escritos numa linguagem especial chamada Redcode, e são executados num programa chamado MARS (Memory Array Redcode Simulator) Simplificação Ambos, o Redcode e o MARS são simplificações abstractas comparadas com os sistemas computacionais normais. Como Funciona? O Core (a memória do computador simulado) é uma cadeia de instruções, vazias excepto nos registos que guardam as instruções dos programas que estão em combate. A memória dobra-se (a boca morde a cauda), um donut. Não existem endereços absolutos. O endereço 0 não se refere ao primeiro endereço da memória mas antes à própria instrução que contém esse endereço. A instrução seguinte é 1 e a anterior é -1 Uma Instrução RedCode, a unidade do Core • A unidade básica da memória é uma instrução e não um byte como é normal. • todas ocupam uma célula de memória e demoram o mesmo tempo a serem executadas (1 ciclo). Estrutura de uma Instrução • Cada instrução Redcode divide-se num código de instrução (opcode) e dois campos numéricos (A:endereço fonte e B:endereço destino) • Uma instrução só pode ser copiada e testada quanto à igualdade. Exemplos de códigos de instrução DAT: Remove o processo corrente da fila de processos MOV: Copia dados de uma instrução para outra JMP: Faz com que a execução do programa continue no endereço especificado. ADD: Adiciona o valor fonte para o destino. SEQ: Compara duas instruções, e salta por cima da próxima instrução se forem iguais. Modos de Endereçamento #: Imediato $: Directo (pode ser omitido) *: Campo-A indirecto @: Campo-B indirecto. … Controlo dos Programas • O MARS executa uma instrução de cada vez e passa para a seguinte, a não ser que a instrução indique explicitamente para saltar para outro endereço. • Num combate, em que há mais do que 1 programa na arena, os programas são executados alternadamente, uma instrução de cada vez. Multitarefas • Cada guerreiro tem a sua própria fila de processos, a lista de processos que serão executados repetidamente pela ordem que começaram. • Cada Guerreiro começa apenas com um só processo. • O tamanho da fila de processos é limitado Multitarefas • Os processos de cada programa são executados de forma alternada. • O tempo de execução de cada processo é inversamente proporcional ao número de processos activos do respectivo guerreiro Morte dos Processo e Derrota • Um processo morre quando executa uma instrução DAT (ou executa uma divisão por 0) • Um programa morre quando todos os seus processos desaparecerem. WAIT JMP 0 • O Wait é o programa mais simples • O seu tamanho mínimo torna-o difícil de ser detectado. • Não possui ataque. • Só vence se o seu inimigo se autodestruir. IMP MOV #0, 1 • Foi o primeiro guerreiro a ser criado (Dewdney) • O seu tamanho mínimo torna-o difícil de ser detectado. • Está sempre em movimento no core, em ciclo, ad infinitum. • Não mata, se atingir o adversário, transforma-o noutro Imp. • Gosta de empatar e só vence se o inimigo se autodestruir. DWARF ADD MOV JMP DAT • • • #4, 2, -2 #0, 3 @2 #0 O Dwarf (Dewdney) é um bombardeiro que cegamente copia uma “bomba” para lugares com intervalos regulares entre si (de 4 em 4 células, por exemplo), esperando acertar no alvo. A bomba é uma instrução DAT que se acertar no código do seu inimigo será letal caso essa instrução venha a ser executada. Neste caso, é necessário ter cuidado pois a bomba pode acertar no próprio Dwarf. É necessário que a memória tenha um número de células que seja múltiplo de 4.