terça-feira, fevereiro 07, 2017

RC2014: Primeiras Experiências de Programação Assembler

Um dos meus objetivos com o RC2014 é relembrar os tempos heroicos e brincar um pouco com Assembler. A meta final é criar um "programa monitor" que permita examinar e alterar a memória e criar pequenos programas em assembler.

Por padrão o RC2014 inicia no BASIC

A ROM padrão do RC2014 possui um interpretador BASIC. Os comandos LOAD e SAVE não estão disponíveis, no lugar disso é necessário usar recursos do terminal para enviar e capturar arquivos texto. Daí que o meu primeiro passo foi procurar um software com estes recursos. A minha opção foi pelo Tera Term.

O segundo passo foi usar o hexload, disponível no github oficial do RC2014. O hexload é um programa BASIC, que grava na Ram (via POKEs) um programa assembler e o executa. O programa assembler lê um arquivo HEXA pela serial e depois desvia para o endereço $8080. Santo bootloader, Batman!

Para evitar problemas de perda de caracteres, configurei o Tera Term para dar uma pausa de 20ms entre caracteres e 100ms ao final de cada linha.

Vamos fazer um primeiro teste: mostrar uma mensagem curta, aguardar receber algo e repetir. Um exame do fonte hexload.asm mostra as instruções assembler necessárias. Optei por acessar diretamente a ACIA ao invés de usar as rotinas já existentes na Rom. Para isto eu desabilitei as interrupções, pois a interrupção da ACIA é usada pela Rom para implementar um buffer de recepção.

SECTION INIT
ORG $8080

start:
        di
loop:
        ld  hl,msg
print:
        ld  a,(hl)
        or  a
        jr  z,waitch
        ld  b,a
busy:
        in  a,($80)
        bit 1,a
        jr  z,busy
        ld  a,b
        out ($81),a
        inc hl
        jp  print
waitch:
        in  a,($80)
        bit 0,a
        jr  z,waitch
        in  a,($81)
        out ($81),a
        jp  loop
        
msg:    DEFM    "Ola, RC2014!", 13, 10, 0

A minha ideia inicial era assemblar este primeiro programa na unha, traduzindo manualmente cada instrução no respectivo código objeto. Bastaram três instruções para eu ver como a idade me deixou preguiçoso. Resolvi passar para um primeiro teste com o z88dk, um conjunto de ferramentas para desenvolvimento para o Z80. A enfase do z88dk é para a linguagem C, mas ele contém um assembler completo. A instalação é simples (expandir um zip, criar uma variável de ambiente e acrescentar o diretório de executáveis ao path). Dois comandos geram o arquivo HEX:

z80asm -l -b  rc2014test.asm
appmake +hex --org 0x8080 -b rc2014test_INIT.bin -o rc2014Test.hex

Aí é ligar o RC2014, carregar o loadhex.bas, carregar o meu teste e correr para o abraço:


Ok, é um exemplo bem bobo, mas é o alicerce para eu desenvolver o meu Monitor e testá-lo em Ram (quando estiver pronto eu vou gravar em EProm).

2 comentários:

Day of Light disse...

Daniel, onde vc comprou esse kit?
obrigado,
Marcos

Daniel Quadros disse...

Comprei no Tindie: https://www.tindie.com/products/Semachthemonkey/rc2014-homebrew-z80-computer-kit/