Compilador para computador SAP-1

18 Abril 2017

A pedidos do amigo Antonio Souza, segue código-fonte do compilador para computador SAP-1 utilizado no artigo Simulando um computador SAP-1 (Simple As Possible 1).

Desenvolvi esse compilador em PHP, para poder disponibilizá-lo online juntamente ao referido artigo. A parte principal do compilador é dada pelas primeiras 25 linhas do código. O restante se refere simplesmente ao próprio formulário HTML para receber um texto e convertê-lo em binário.

O script abaixo encontra-se funcionando no endereço http://devser.com.br/misc/sap-compiler.

<?php
if (isset($_POST['code']) and $_POST['code']) {
    $uniqid = uniqid('', true);
    $output_atmel = "out/$uniqid.sap.tmp";
    $content = $_POST['code'];
    $content = str_replace(array('LDA', 'ADD', 'SUB', 'OUT', 'HLT', ' '), array('0', '1', '2', 'E0', 'F0', ''), $content);
    $lines = explode("\n", $content);
    $output_content = "";
    foreach ($lines as $line) {
        $line = trim($line);
        if ($line AND strpos($line, ";") === FALSE) {
            $parts = explode(":", $line);
            $address = $parts[0];
            $data = $parts[1];
            $formatted_line = '$A' . str_pad($address, '4', '0', STR_PAD_LEFT) . ', ' . str_pad($data, '2', '0', STR_PAD_LEFT) . "\n";
            $output_content .= $formatted_line;
        }
    }
    file_put_contents($output_atmel, $output_content);
    system("srec_cat -output $output_atmel.hex --Intel $output_atmel --Needham_Hexadecimal");
    unlink($output_atmel);
    header('Content-disposition: attachment; filename="SAP.hex"');
    readfile("$output_atmel.hex");
    unlink("$output_atmel.hex");
} else {
    header('Content-type: text/html; charset=utf-8');
?>
<html>
<head>
<title>Compilador SAP-1</title>
<style>
textarea{
    width: 600px;
    height: 400px;
}
</style>
</head>
<body>
<form method="post">
<textarea name="code">
; Programa exemplo
; Linhas iniciadas com ponto e vírgula são comentários
 
; Repare que toda linha de código deve começar com o número da linha e em seguida dois pontos, sempre em hexadecimal.
; O SAP-1 trabalha com uma memória de 16 posições. Ou seja, podemos ter da linha 0 até a linha F.
 
; Instruções
0: LDA A
1: ADD B
2: OUT
3: HLT
 
; Dados
A: 4
B: 6
 
; Eu gosto de iniciar os dados na posição A da memória, mas tanto faz. Poderia começar da 4, já que a última utilizada por uma instrução foi a linha 3
</textarea>
<input type="submit" value="Compilar"/>
</form>
</body>
</html>
<?php
}
?>