8 de Febrero, 2015

Hola mundo 6502

Ayer pude ejecutar mi primer programa en código para el 6502 en mi proyecto. El programa lo escribí en ensamblador y se puede compilar con CC65.

; hello.s
; Hello World example for D64 using syscalls
;
.segment "CODE"

.macro  sys         ; syscall
.byte   $02
.endmacro

main:
        tsx         ; save the stack pointer
        lda #>message
        pha
        lda #<message
        pha
        lda #$11    ; put string
        sys
        txs         ; restore the stack

        lda #$00    ; terminate program
        pha         ; also: success (0)
        sys

        jmp *       ; never gets here

message:
        .asciiz "Hello world from 6502!"

Mi máquina virtual que ejecuta código del 6502 tiene una configuración estándar para este tipo de CPU, con el siguiente mapa de memoria:

0x0000 - 0x00ffZero page
0x0100 - 0x01ffStack
0x0200 - 0x19ffVídeo
0x1a00 - 0xffffPrograma

No sé todavía si intentaré ejecutar programas existentes para esta CPU porque normalmente dependerán de un interfaz que cambia con la máquina que lo usa (no es lo mismo un Commodore 64 que un Appel II), pero sí quería ser lo más fiel posible al diseño del 6502 para poder usar compiladores existentes sin mucho trabajo.

Además está claro que los programas que ejecute estarán compilados expresamente para mi máquina, así que puedo añadir una instrucción extra para usar funciones de la máquina virtual implementadas en código nativo del ATmega328p (¡más rápido!).

La instrucción extra es SYS (de syscall, o llamada al sistema) que usa el opcode 0x02 (que es una operación ilegal en el 6502), y el intefaz es sencillo: la función se indica en el acumulador, los parámetros en la pila, y es el origen el responsable de desapilar (porque la función puede devolver valores usando la pila). Más o menos es el mecanismo que usa FreeBSD (Linux usa registros para los parámetros, y el 6502 solo tiene tres, así que no es práctico).

En el hola mundo estoy usando dos funciones: imprimir una cadena de texto acabada en un cero (función 0x11) y terminar programa (función 0x00).

Aún quedan muchas cosas por hacer, pero este era un paso importante en el proyecto. El resultado se puede ver en este vídeo.

Anotación por Juan J. Martínez, clasificada en: avr, arduino.

Los comentarios están cerrados: los comentarios se cierran automáticamente una vez pasados 30 días. Si quieres comentar algo acerca de la anotación, puedes hacerlo por e-mail.

Algunas anotaciones relacionadas: