HC Software Development Kit for Retro Computing

Este documento está em construção

Com o objetivo de criar um SDK em assembly voltado pra retro computação usando como base o estilo de código do NASM, facilitando a migração de novos usuários que vem do x86 para processadores 8 bits.

Ferramenta
Descrição
HC Assembler
Assembler com estrutura e estilo de código baseado no NASM
HC Linker Vinculador de objetos e gerador de executáveis a partir de objetos e bibliotecas
HC Builder
Gestor de Projetos, responsável por compilar e limpar arquivos de saída do projeto
HC Librarian
Gestor de Bibliotecas, que são conjuntos de objetos que podem ser referenciados por um projeto

Links para os arquivos de distribuição/instalação


Download para navegadores que não suportam javascript
Instalador para Windows (Intel 64 bits)
Conjunto de binários para Windows (Intel 64 bits)
Pacote para instalação em Debian/Ubuntu ou compatíveis (Intel 64 bits)
Conjunto de binários para Linux (Intel 64 bits)
Instalador para macOS (Intel 64 bits/Apple Silicon)
Conjunto de binários para macOS (Intel 64 bits/Apple Silicon)
Download para navegadores que suportam javascript
Última versão diretamente do GitHub



HC Assembler for Retro Computing

Assembler compatível com o estilo do NASM.

O código fonte em assembly é composto por alguns blocos de informações distintos:

Todos os tópicos listados acima serão explicados com mais detalhes posteriormente

Exemplo:

; comentário, ao final de qualquer linha de código é aceito comentário cujo a identificação é o seu caractere inicial ponto e virgula ';' seguido por texto livre até o final da linha atual
mov ax, bx ; exemplo de mnemônico (comando da CPU) e seus argumentos
xpto: ; exemplo de rótulo simples com comentário (este)
xpto2: mov bx, cx ; exemplo de rótulo com comando mnemônico (podendo ser um comando do assembler) e comentário
db 0, 1, 2 ; exemplo de comando do assembler, em sintaxe é idêntico a um comando mnemônico

Arquiteturas Suportadas

Modo de uso

Para cada arquitetura suportada é disponibilizado um executável do assembler, com o nome iniciado em "hcasm-" seguido do processador suportado.

Exemplo para compilar um código para Z80 (arquivo.s) em um objeto (arquivo.obj):

hcasm-z80 -o arquivo.obj arquivo.s

Definição de rótulos

Existem 2 tipos de rótulos:

Opcionalmente para melhor identificação, a definição de um rótulo pode ser seguido do caractere ':' como marcador separador entre o rótulo e o próximo comando do tipo mnemônico/assembler, porém no caso do uso do nome de rótulo como uma referência a um rótulo existente, é vedado o uso do caractere ':'.

Os rótulos podem ser exportados para uso de outros objetos usando o comando de assembler nomeado GLOBAL, seguido do nome do rótulo que será exportado.

Qualquer rótulo que não esteja presente no arquivo atual porem seja referenciado nele, será automaticamente considerado como se viesse de outro objeto, e será tratado pelo HC Linker.

Exemplo (Código Intel 8086/8088):

global primario1 ; exporta o rótulo primario1 para uso em outros objetos, será tratada as suas referencias automaticamente pelo HC Linker
primario1: ; este é um rótulo primario
.secundario1: ; este é um rótulo fica dentro do primario1, podendo ser acessado dentro do primario1 pelo seu nome direto (.secundario1) ou de fora do rotulo primario1 usando o nome composto de primario1.secundario1
mov si, primario1 ; funciona diretamente de qualquer parte desse arquivo de código fonte
mov si, .secundario1 ; funciona diretamente pelo nome do rótulo .secundario1, porém apenas dentro do rótulo primario1
mov si, primario1.secundario1 ; funciona porém é desnecessário usar o nome composto de dentro do rótulo atual onde pertence o .secundario1
mov si, primario2.xpto ; exemplo de acesso de um rótulo secundário pertencente a outro rótulo primário
primario2: ; este é o segundo rótulo primário do arquivo, a partir daqui todos os rótulos secundários dos rótulos primários anteriores deixam de ser acessíveis com seus nomes diretos
.xpto: ; este rótulo é o primeiro rótulo secundário de dentro do primario2, podendo ser acessível como .xpto de dentro do primario2 ou primario2.xpto de qualquer parte do arquivo
mov si, .xpto ; exemplo do acesso direto do rótulo secundário
mov si, primario1.secundario1 ; exemplo de acesso de rótulo secundário pertencente a outro rótulo primário


Definições de Constantes

Toda constante é declarada como um rótulo, seguindo as mesmas regras destes. (Ver Rótulos)

O que diferencia um rótulo de uma constante é que ao invés de conter o ponteiro para aquela posição no código fonte/binário, contém um valor pré-definido.

As constantes podem tanto ser nós secundários como primários de outras constantes ou rótulos, não havendo distinção de seu uso em código fonte, porém as constantes não são suscetíveis ao calculo de realocação, sendo úteis para referencias fixas na memória.

Para declara uma constante basta, declarar um rótulo e na mesma linha a seguir do rótulo usar o marcador 'equ' seguido da equação desejada.

Exemplo:

estrutura_pessoa: equ 11 ; sugestão de uso: o rotulo primario como estrutura, contendo o tamanho da estrutura
.nome: equ 0 ; sugestão de uso: no caso de uma estrutura os campos contém o seu desvio a partir do inicio da estrutura, por exemplo o campo nome, é o primeiro campo, assim contém o desvio de 0 bytes
._nome_tamanho: equ 10 ; sugestão de uso: em casos do campo ser binário/texto/multibyte, pode se criar um padrão para guardar o tamanho do campo, de forma que diferencie de um outro campo que possa ser homônimo
.idade equ 10 ; como exemplo, assim como rótulo o marcador ':' é opcional

section data ; define que o código a partir dessa linha pertence a seção de dados
obj_pessoa: resb estrutura_pessoa ; exemplo da reserva do objeto do tipo estrutura_pessoa, utilizando a constante que armazena o tamanho da estrutura

section text ; define que o código a partir dessa linha pertence a seção de texto(código fonte)
mov si, obj_pessoa ; exemplo de uso indireto dos campos
mov al, [si + estrutura_pessoa.idade] ; exemplo de leitura de um campo indireto, usando um ponteiro (registrador SI)
mov al, [obj_pessoa + estrutura_pessoa.idade ; exemplo da leitura do campo diretamente sem uso de ponteiros



HC Linker for Retro Computing


Copyright © 2025,2026, Humberto Costa dos Santos Junior
Todos os Direitos Reservados

Site escrito inicialmente utilizando o Composer do Netscape Navigator, e migrado para o Composer do Seamonkey.

banner para o firefoxbanner para macOSbanner para netscapebanner para Internet Explorer