VICE MCP

Servidor MCP incorporado no emulador VICE Commodore 64/128/VIC-20/PET, fornecendo a assistentes de IA acesso direto para ler/escrever memória, definir breakpoints, inspecionar registros VIC-II/SID/CIA e depurar assembly 6502 em tempo real com 63 ferramentas.

Documentação

VICE MCP - IA Encontra o Commodore 64

VICE MCP é um projeto da Walker Heavy Industries.

Um servidor MCP embutido diretamente no VICE, dando a agentes de IA e ferramentas modernas controle programático completo sobre o computador de 8 bits mais icônico do mundo.

Carregue uma imagem de disco. Defina breakpoints. Inspecione sprites. Leia registradores SID. Digite no teclado. Tire screenshots. Execute passo a passo o código 6502. Tudo através de uma API JSON-RPC limpa que qualquer cliente MCP pode falar.

Este é o VICE — o lendário emulador de Commodore — com um servidor Model Context Protocol embutido em seu núcleo. Não acoplado externamente. Não é um wrapper. ~17.000 linhas de C entrelaçadas no próprio emulador.

O Que Você Pode Fazer Com Isso?

Para Agentes de IA

Aponte qualquer cliente compatível com MCP - Claude Desktop, Cursor, seu próprio agente - para http://127.0.0.1:6510/mcp e você terá um Commodore 64 totalmente controlável. Seu agente pode:

  • Carregar e executar software — iniciar automaticamente PRGs e imagens de disco
  • Depurar código 6502 — breakpoints, watchpoints, quebras condicionais, execução passo a passo
  • Inspecionar tudo — registradores da CPU, bancos de memória, gráficos VIC-II, áudio SID, temporizadores CIA
  • Ver o que está na tela — tirar screenshots, ler bitmaps de sprites como arte ASCII
  • Interagir como um humano — digitar texto, pressionar teclas, mover joysticks
  • Medir desempenho — cronômetro com precisão de ciclo, rastreamento de execução, registro de interrupções
  • Salvar e restaurar estado — gerenciamento completo de snapshots com metadados

Para Desenvolvedores de C64

Se você escreve código para o Commodore 64, isso oferece um fluxo de trabalho de depuração moderno sem sair do seu editor:

  • Defina breakpoints a partir da sua IDE enquanto seu programa executa
  • Carregue arquivos de símbolos KickAssembler ou VICE e depure por nome de rótulo
  • Pesquise memória por padrões de bytes com suporte a curingas
  • Compare regiões de memória com snapshots salvos para encontrar o que mudou
  • Rastreie a execução com filtragem por faixa de PC para focar no seu código
  • Registre interrupções para entender o timing de IRQ/NMI
  • Agrupe breakpoints e alterne-os como um conjunto

Para Pesquisadores e Educadores

  • Automatize análise de ROM e engenharia reversa
  • Construa tutoriais interativos que controlam um C64 ao vivo
  • Capture estados de tela para documentação
  • Reproduza e analise software histórico

61 Ferramentas em 13 Categorias

Cada ferramenta segue as convenções MCP com validação completa de JSON Schema, erros significativos e nomenclatura consistente de parâmetros.

CategoriaFerramentasO Que Fazem
Execuçãovice.execution.run vice.execution.pause vice.execution.step vice.frame.advance vice.run_untilControlam a CPU — retomar, pausar, passo a passo, avançar frames inteiros, executar até endereço ou contagem de ciclos
Registradoresvice.registers.get vice.registers.setLer/gravar todos os registradores 6502 (A, X, Y, SP, PC, flags de status)
Memóriavice.memory.read vice.memory.write vice.memory.banks vice.memory.search vice.memory.fill vice.memory.compareAcesso completo à memória com seleção de banco, busca de padrões com curingas
Checkpointsvice.checkpoint.add vice.checkpoint.delete vice.checkpoint.list vice.checkpoint.toggle vice.checkpoint.set_condition vice.checkpoint.set_ignore_count vice.checkpoint.group.*Breakpoints, watchpoints, tracepoints — com condições e grupos
Spritesvice.sprite.get vice.sprite.set vice.sprite.inspectLer/gravar estado de sprites, visualização de bitmap como arte ASCII
VIC-IIvice.vicii.get_state vice.vicii.set_stateAcesso completo ao chip de vídeo do C64 — raster, cores, scroll, banco
SIDvice.sid.get_state vice.sid.set_stateO lendário chip de som — vozes, filtros, ADSR, formas de onda
CIAvice.cia.get_state vice.cia.set_stateEstado do chip de temporizador e I/O — tanto CIA1 quanto CIA2
Discovice.disk.attach vice.disk.detach vice.disk.list vice.disk.read_sectorMontar imagens D64/D71/D81, navegar em diretórios, ler setores brutos
Máquinavice.machine.reset vice.machine.config.get vice.machine.config.set vice.autostartReset forçado/suave, controle de recursos (warp, velocidade, modelo), carregamento de programas
Exibiçãovice.display.screenshot vice.display.get_dimensionsCaptura de tela para arquivo ou base64, geometria de exibição
Entradavice.keyboard.type vice.keyboard.petscii vice.keyboard.key_press vice.keyboard.key_release vice.keyboard.restore vice.keyboard.matrix vice.keyboard.chord vice.joystick.set vice.joystick.tapTeclado e joystick — digitação de texto, teclas individuais, matriz direta, RESTORE/NMI
Depuraçãovice.disassemble vice.symbols.load vice.symbols.lookup vice.watch.add vice.backtrace vice.cycles.stopwatchDesmontagem, arquivos de símbolos, pilha de chamadas, timing com precisão de ciclo
Snapshotsvice.snapshot.save vice.snapshot.load vice.snapshot.listSalvar/restaurar estado completo do emulador com metadados JSON

Arquitetura

Este não é um processo auxiliar ou um raspador de tela. O servidor MCP é compilado diretamente no VICE como um subsistema de primeira classe — em todas as máquinas que o VICE emula.

Máquinas Suportadas

MáquinaCPUHardware Notável
C64 / C64 SC6510VIC-II, SID, 2×CIA, Sprites
C1288502/Z80VIC-II, VDC 80 colunas, SID, 2×CIA
SCPU6465816Acelerador SuperCPU
C64 DTV6510 (estendido)Registradores específicos do DTV
VIC-206502Vídeo VIC-I, memória de expansão
Plus/4 & C167501/8501Chip de vídeo+áudio TED
PET6502Vídeo CRTC, I/O PIA/VIA
CBM-II6509CRTC, MOS 6526 CIA

O servidor MCP se adapta automaticamente à máquina em execução. Quando um agente de IA chama vice.machine.config.get, ele recebe a configuração real de hardware — quais chips estão presentes, quais bancos de memória existem, faixas de endereço válidas e recursos disponíveis. Um agente depurando um cartucho de VIC-20 obtém registradores VIC-I; o mesmo agente depurando um programa C128 obtém VIC-II e o display VDC de 80 colunas.

┌─────────────────────────────────────────────────┐
│                   VICE Emulator                  │
│                                                  │
│  ┌──────────┐  ┌──────────┐  ┌──────────────┐  │
│  │   CPU    │  │  Video   │  │    Audio     │  │
│  │ (varies) │  │ (varies) │  │   (varies)   │  │
│  └────┬─────┘  └────┬─────┘  └──────┬───────┘  │
│       │              │               │           │
│       └──────────┬───┴───────────────┘           │
│                  │                                │
│         ┌────────┴────────┐                      │
│         │  MCP Server     │                      │
│         │  (libmcp.a)     │                      │
│         │                 │                      │
│         │  JSON-RPC 2.0   │<---- POST /mcp -----│
│         │  libmicrohttpd  │---- GET /events 501>│
│         │  Trap Dispatch  │                      │
│         └─────────────────┘                      │
│                                                  │
└─────────────────────────────────────────────────┘
        127.0.0.1:6510 by default

Decisões-chave de design:

  • Despacho baseado em traps — Requisições HTTP são despachadas através do mecanismo de traps do VICE, garantindo que toda a lógica das ferramentas execute na thread principal do emulador. Sem condições de corrida, sem surpresas de locking.
  • Acesso zero-copy — As ferramentas leem diretamente das entranhas do emulador. Quando você pede o estado do VIC-II, você obtém os valores reais dos registradores, não uma aproximação em cache.
  • Respostas cientes da máquina — As ferramentas reportam capacidades de hardware, disponibilidade de chips e faixas de memória válidas para qualquer máquina em execução. O agente sempre sabe com o que está trabalhando.
  • Integração com monitor — Funciona junto com o monitor embutido do VICE. Se o emulador estiver pausado no monitor, requisições MCP executam diretamente sem traps.
  • Endpoint de eventos reservado — GET /events existe mas atualmente retorna 501 Not Implemented. Consulte o estado através de /mcp até o streaming de eventos chegar.

Início Rápido

Conecte-se ao VICE

Inicie qualquer máquina VICE com o servidor MCP habilitado:

# C64 (cycle-exact)
x64sc -mcpserver

# C128
x128 -mcpserver

# VIC-20
xvic -mcpserver

# Listen on all network interfaces, port 7000
x64sc -mcpserver -mcpserverhost 0.0.0.0 -mcpserverport 7000

O servidor MCP inicia em 127.0.0.1:6510 por padrão. Clientes MCP conectam-se a:

http://127.0.0.1:6510/mcp

0.0.0.0 é um endereço de bind, não um endereço de cliente. Significa "ouvir em todas as interfaces". Um cliente no mesmo Mac ainda conecta-se a 127.0.0.1; um cliente em outra máquina conecta-se ao endereço IP LAN do Mac, por exemplo http://192.168.1.42:6510/mcp.

Receitas de Conexão

Caso de usoInicie o VICE comURL do clienteCabeçalho de autenticação
Mesmo Mac, padrãox64sc -mcpserverhttp://127.0.0.1:6510/mcpNenhum
Mesmo Mac, porta personalizadax64sc -mcpserver -mcpserverport 7000http://127.0.0.1:7000/mcpNenhum
Acesso LAN, rede confiávelx64sc -mcpserver -mcpserverhost 0.0.0.0http://<mac-lan-ip>:6510/mcpNenhum
Acesso LAN com token bearerx64sc -mcpserver -mcpserverhost 0.0.0.0 -mcpservertoken secrethttp://<mac-lan-ip>:6510/mcpAuthorization: Bearer secret
Aplicativo de navegador com CORSx64sc -mcpserver -mcpservercorsorigin http://localhost:3000 -mcpservertoken secrethttp://127.0.0.1:6510/mcpAuthorization: Bearer secret

As regras de token são intencionalmente simples:

  • Nenhum token configurado: clientes MCP que não sejam de navegador podem conectar sem um cabeçalho Authorization.
  • Token configurado: toda requisição MCP deve incluir Authorization: Bearer <token>.
  • CORS configurado: um token é obrigatório. CORS curinga (*) é rejeitado.
  • Vincular a 0.0.0.0 sem um token é permitido para compatibilidade retroativa, mas o VICE registra um aviso porque clientes remotos podem controlar o emulador.

Fale Com Ele

Todas as requisições HTTP vão para /mcp, devem usar Content-Type: application/json, e devem enviar Accept: application/json.

# Direct JSON-RPC call
curl -sS http://127.0.0.1:6510/mcp \
  -H 'Content-Type: application/json' \
  -H 'Accept: application/json' \
  --data '{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "vice.ping"
}'

# Standard MCP tools/call form, used by Claude Code and other MCP clients
curl -sS http://127.0.0.1:6510/mcp \
  -H 'Content-Type: application/json' \
  -H 'Accept: application/json' \
  --data '{
  "jsonrpc": "2.0",
  "id": 2,
  "method": "tools/call",
  "params": { "name": "vice_ping", "arguments": {} }
}'

# Read the BASIC ROM entry point
curl -sS http://127.0.0.1:6510/mcp \
  -H 'Content-Type: application/json' \
  -H 'Accept: application/json' \
  --data '{
  "jsonrpc": "2.0",
  "id": 3,
  "method": "tools/call",
  "params": {
    "name": "vice_memory_read",
    "arguments": { "address": "0xA000", "size": 16, "encoding": "hex" }
  }
}'

Quando um token está configurado, adicione o cabeçalho bearer a cada requisição:

curl -sS http://127.0.0.1:6510/mcp \
  -H 'Content-Type: application/json' \
  -H 'Accept: application/json' \
  -H 'Authorization: Bearer secret' \
  --data '{"jsonrpc":"2.0","id":1,"method":"vice.ping"}'

Uso com Claude Desktop

Adicione isto à sua configuração MCP do Claude Desktop:

{
  "mcpServers": {
    "vice": {
      "url": "http://127.0.0.1:6510/mcp"
    }
  }
}

Então é só conversar: "Carregue o jogo na unidade 8 e me mostre o que está na tela."

Se o VICE foi iniciado com -mcpservertoken, o cliente deve enviar Authorization: Bearer <token> em cada requisição. Se o seu cliente MCP não conseguir configurar cabeçalhos HTTP, não use um token para sessões 127.0.0.1 somente locais.

Compilando a Partir do Código-Fonte

Pré-requisitos

PlataformaInstalação
Debian/Ubuntuapt install build-essential autoconf automake pkg-config libmicrohttpd-dev libgtk-3-dev libglew-dev libevdev-dev libcurl4-openssl-dev libpulse-dev xa65 flex byacc dos2unix
macOSbrew install autoconf automake pkg-config libmicrohttpd gtk+3 xa lame
Windows (MSYS2)pacman -S mingw-w64-x86_64-gcc mingw-w64-x86_64-libmicrohttpd mingw-w64-x86_64-gtk3 autoconf automake pkg-config

Compilar

cd vice
./autogen.sh
mkdir build && cd build
../configure --enable-mcp-server --enable-gtk3ui
make -j$(nproc)

Verificar

# MCP flags should appear in help output
src/x64sc -help | grep mcp

# Expected:
# -mcpserver          Enable MCP server
# -mcpserverport <port>  Set MCP server port (default: 6510)
# -mcpserverhost <host>  Set MCP server host (default: 127.0.0.1)

Binários Pré-compilados

Binários pré-compilados estão disponíveis na página de Releases.

PlataformaGUIHeadlessNotas
Linux x86_64SimSimInterface GTK3
macOS arm64SimSimInterface GTK3 (Apple Silicon)
Windows x86_64NãoSimSomente headless — compilado cruzadamente via MinGW-w64

O Windows não inclui uma compilação GUI. A compilação cruzada GTK3 para Windows não é suportada pelo sistema de build do VICE. Se você precisar de uma GUI no Windows, compile a partir do código-fonte nativamente usando MSYS2.

Cliente Python

Um cliente Python resiliente está incluído com lógica de nova tentativa, pooling de conexões e um método de conveniência para cada ferramenta:

from tools.resilience.vice_mcp_resilient import ViceMCPClient

with ViceMCPClient("http://127.0.0.1:6510") as vice:
    # Load a program
    vice.autostart("/path/to/game.prg")

    # Set a breakpoint at the main loop
    vice.checkpoint_add(start_address=0x0810, stop_address=0x0810)

    # Run until it hits
    vice.execution_run()

    # Read the screen
    regs = vice.registers_get()
    screenshot = vice.display_screenshot(format="base64")

    # Inspect a sprite
    art = vice.sprite_inspect(sprite_number=0)
    print(art)

Suíte de Testes de Protocolo

167 testes em 25 classes de teste validam cada ferramenta, cada parâmetro e cada condição de erro:

# Requires a running VICE instance with MCP enabled
pytest tools/tests/test_mcp_protocol.py -v

Uso no Mundo Real

sim6502 — Testes Unitários para Assembly 6502

sim6502 é um framework de testes unitários para assembly 6502/6510/65C02 que usa o VICE MCP como backend de execução. Escreva testes em um DSL personalizado, execute-os contra uma instância VICE ao vivo com hardware com precisão de ciclo:

suite "sprite collision" {
    load "game.prg"

    test "player hits enemy" {
        jsr setup_sprites
        poke $d015, #$03          ; enable sprites 0 and 1
        poke $d000, #$80          ; sprite 0 x = 128
        poke $d002, #$80          ; sprite 1 x = 128
        jsr main_loop
        assert $d01e & #$03 != 0  ; collision register set
    }
}

O sim6502 conecta-se via MCP para carregar programas, definir breakpoints, ler registradores, comparar memória e capturar/restaurar estado entre testes — trazendo práticas modernas de CI/CD para o desenvolvimento de computação retrô.

Fluxos de Trabalho com Agentes de IA

Qualquer cliente compatível com MCP pode dirigir o VICE diretamente:

  • Claude Desktop / Cursor — "Carregue esta imagem de disco, encontre o loop principal e explique o que o manipulador de IRQ faz"
  • Agentes personalizados — Análise automatizada de ROM, testes de regressão, captura de screenshots
  • Ferramentas de pesquisa — Exploração sistemática do comportamento de software histórico

Segurança

O servidor MCP é somente localhost por padrão (127.0.0.1). Com as configurações padrão, apenas programas na mesma máquina podem conectar.

Ele não tem TLS. Tem autenticação opcional por token bearer. É projetado para desenvolvimento local em primeiro lugar, e a exposição à rede deve ser deliberada.

Se você precisar de acesso remoto, coloque-o atrás de um proxy reverso com autenticação adequada:

nginx/caddy -> auth -> https -> 127.0.0.1:6510

Vincular a 0.0.0.0 é suportado via -mcpserverhost. Isso faz o VICE ouvir em todas as interfaces de rede. Não significa que clientes conectam-se a 0.0.0.0; clientes remotos conectam-se ao endereço IP real do host Mac/Linux/Windows.

Use esta lista de verificação para sessões remotas:

  • Inicie o VICE com -mcpserverhost 0.0.0.0.
  • Prefira adicionar -mcpservertoken <token> a menos que a rede já seja confiável.
  • Configure a URL do cliente como http://<host-ip>:6510/mcp.
  • Se um token estiver configurado, configure o cliente para enviar Authorization: Bearer <token>.
  • Para clientes baseados em navegador, configure também exatamente um -mcpservercorsorigin <origin> e um token. CORS sem token é rejeitado.

Relação com o VICE Upstream

Este é um fork do espelho SVN do VICE. O servidor MCP é implementado como um subsistema autocontido em src/mcp/ — ele toca nas entranhas do VICE através de interfaces bem definidas, mas não modifica a lógica central de emulação.

O branch main rastreia o VICE upstream. O branch mcp-server contém todas as adições do MCP. O objetivo é contribuir com este trabalho de volta ao projeto VICE. A implementação está estruturada para exportar de forma limpa como diffs unificados para submissão via SVN.

Referência de Ferramentas

Clique para expandir a referência completa de todas as 61 ferramentas

Controle de Execução

vice.ping

Verifica se o VICE está respondendo. Sem parâmetros.

vice.execution.run

Retoma a execução. Sem parâmetros.

vice.execution.pause

Pausa a execução. Sem parâmetros.

vice.execution.step

Executa uma ou mais instruções. Em uma máquina parada, a chamada retorna após a execução, com completed: true e o PC. Se um checkpoint parar a máquina primeiro, a resposta traz stopped_early: true e o PC naquele ponto; se a execução não terminar após 2 segundos (uma execução sobre uma sub-rotina lenta), a máquina é pausada no próximo limite de instrução e a resposta traz timed_out: true. De qualquer forma, o restante da execução é descartado. Em uma máquina em execução, a chamada arma a execução e retorna imediatamente.

ParâmetroTipoObrigatórioDescrição
countnumberInstruções a executar (padrão: 1, máximo: 10000)
stepOverbooleanExecutar sobre sub-rotinas

vice.frame.advance

Executa frames inteiros a partir de uma máquina parada e para novamente, no primeiro limite de instrução após a sincronização vertical que encerra o último frame, com registradores exportados. O estado de joystick e teclado definido enquanto parado é mantido durante a execução dos frames, o que permite um loop de entrada frame a frame: definir entrada, avançar um frame, ler memória, repetir. A máquina já deve estar parada (por vice.execution.pause, um checkpoint de parada ou vice.execution.step); caso contrário, a chamada retorna erro -32001. Se um checkpoint parar a máquina antes do limite, a resposta traz stopped_early: true e o número de frames inteiros executados. Um frame que não terminar após 2 segundos é abandonado: a máquina é pausada no próximo limite de instrução e a resposta também traz timed_out: true.

ParâmetroTipoObrigatórioDescrição
framesnumberFrames inteiros a executar antes de parar novamente (padrão: 1, máximo: 1000)

vice.run_until

Executa até um endereço ou por N ciclos com tempo limite.

ParâmetroTipoObrigatórioDescrição
addressstringEndereço alvo (hex, decimal ou nome de símbolo)
cyclesnumberMáximo de ciclos a executar

Registradores

vice.registers.get

Obtém todos os registradores da CPU (A, X, Y, SP, PC, flags de status). Sem parâmetros.

vice.registers.set

Define o valor de um registrador da CPU.

ParâmetroTipoObrigatórioDescrição
registerstringsimNome do registrador: PC A X Y SP N V B D I Z C
valuenumbersimValor a definir

Memória

vice.memory.read

Lê um intervalo de memória com seleção opcional de banco.

ParâmetroTipoObrigatórioDescrição
addressstringsimEndereço: número, hex ($1000) ou nome de símbolo
sizenumbersimBytes a ler (1-65535)
bankstringNome do banco de memória (use vice.memory.banks para listar)

vice.memory.write

Escreve bytes na memória.

ParâmetroTipoObrigatórioDescrição
addressstringsimEndereço: número, hex ($1000) ou nome de símbolo
datanumber[]simBytes a escrever (0-255 cada)

vice.memory.banks

Lista os bancos de memória disponíveis para a máquina atual. Sem parâmetros.

vice.memory.search

Busca por padrões de bytes com máscara curinga opcional.

ParâmetroTipoObrigatórioDescrição
startstringsimEndereço inicial
endstringsimEndereço final
patternnumber[]simPadrão de bytes, ex.: [0x4C, 0x00, 0xA0]
masknumber[]Máscara por byte: 0xFF=exato, 0x00=curinga
max_resultsnumberMáximo de correspondências (padrão: 100, máximo: 10000)

vice.memory.fill

Preenche um intervalo de memória com um padrão de bytes repetido.

ParâmetroTipoObrigatórioDescrição
startstringsimEndereço inicial
endstringsimEndereço final (inclusivo)
patternnumber[]simPadrão de bytes a repetir

vice.memory.compare

Compara dois intervalos de memória ou compara contra um snapshot.

ParâmetroTipoObrigatórioDescrição
modestringsimranges ou snapshot
range1_startstringrangesInício do primeiro intervalo
range1_endstringrangesFim do primeiro intervalo
range2_startstringrangesInício do segundo intervalo
snapshot_namestringsnapshotSnapshot para comparar
startstringsnapshotEndereço inicial para comparar
endstringsnapshotEndereço final para comparar
max_differencesnumberMáximo de diferenças a retornar (padrão: 100)

Checkpoints e Breakpoints

vice.checkpoint.add

Adiciona um checkpoint (breakpoint, watchpoint ou tracepoint).

ParâmetroTipoObrigatórioDescrição
startstringsimEndereço inicial
endstringEndereço final (padrão = inicial)
stopbooleanParar ao atingir (padrão: true)
loadbooleanParar em leitura de memória (padrão: false)
storebooleanParar em escrita de memória (padrão: false)
execbooleanParar em execução (padrão: true)

vice.checkpoint.delete

Exclui um checkpoint.

ParâmetroTipoObrigatórioDescrição
checkpoint_numnumbersimNúmero do checkpoint

vice.checkpoint.list

Lista todos os checkpoints. Sem parâmetros.

vice.checkpoint.toggle

Habilita ou desabilita um checkpoint.

ParâmetroTipoObrigatórioDescrição
checkpoint_numnumbersimNúmero do checkpoint
enabledbooleansimHabilitar ou desabilitar

vice.checkpoint.set_condition

Define uma expressão de condição em um checkpoint.

ParâmetroTipoObrigatórioDescrição
checkpoint_numnumbersimNúmero do checkpoint
conditionstringsimExpressão, ex.: A == $42

vice.checkpoint.set_ignore_count

Define quantas ocorrências ignorar antes de parar.

ParâmetroTipoObrigatórioDescrição
checkpoint_numnumbersimNúmero do checkpoint
countnumbersimOcorrências a ignorar

vice.checkpoint.group.create

Cria um grupo de checkpoints nomeado.

ParâmetroTipoObrigatórioDescrição
namestringsimNome do grupo
checkpoint_idsnumber[]IDs iniciais de checkpoints

vice.checkpoint.group.add

Adiciona checkpoints a um grupo existente.

ParâmetroTipoObrigatórioDescrição
groupstringsimNome do grupo
checkpoint_idsnumber[]simIDs de checkpoints a adicionar

vice.checkpoint.group.toggle

Habilita ou desabilita todos os checkpoints em um grupo.

ParâmetroTipoObrigatórioDescrição
groupstringsimNome do grupo
enabledbooleansimHabilitar ou desabilitar todos

vice.checkpoint.group.list

Lista todos os grupos de checkpoints. Sem parâmetros.


Sprites (C64/C128/DTV)

vice.sprite.get

Obtém o estado do sprite.

ParâmetroTipoObrigatórioDescrição
spritenumberNúmero do sprite 0-7 (omitir para todos)

vice.sprite.set

Define propriedades do sprite.

ParâmetroTipoObrigatórioDescrição
spritenumbersimNúmero do sprite 0-7
xnumberPosição X 0-511
ynumberPosição Y 0-255
enabledbooleanHabilitar sprite
multicolorbooleanModo multicolor
expand_xbooleanLargura dupla
expand_ybooleanAltura dupla
priority_foregroundbooleanDesenhar sobre o fundo
colornumberCor do sprite 0-15

vice.sprite.inspect

Representação visual em arte ASCII do bitmap de um sprite.

ParâmetroTipoObrigatórioDescrição
sprite_numbernumbersimNúmero do sprite 0-7
formatstringascii (padrão), binary ou png_base64

Estado dos Chips

vice.vicii.get_state

Obtém o estado interno do VIC-II. Sem parâmetros.

vice.vicii.set_state

Define registradores do VIC-II.

ParâmetroTipoObrigatórioDescrição
registersobject[]Matriz de {offset, value} (offset 0x00-0x2E)

vice.sid.get_state

Obtém o estado do SID (vozes, filtro, ADSR). Sem parâmetros.

vice.sid.set_state

Define registradores do SID.

ParâmetroTipoObrigatórioDescrição
registersobject[]Matriz de {offset, value} (offset 0x00-0x1C)

vice.cia.get_state

Obtém o estado do CIA (temporizadores, portas).

ParâmetroTipoObrigatórioDescrição
cianumberNúmero do CIA: 1 ou 2 (omitir para ambos)

vice.cia.set_state

Define registradores do CIA.

ParâmetroTipoObrigatórioDescrição
cia1_registersobject[]Matriz de {offset, value} (offset 0x00-0x0F)
cia2_registersobject[]Matriz de {offset, value} (offset 0x00-0x0F)

Gerenciamento de Disco

vice.disk.attach

Anexa uma imagem de disco a uma unidade.

ParâmetroTipoObrigatórioDescrição
unitnumbersimUnidade (8-11)
pathstringsimCaminho para a imagem de disco (.d64, .g64, etc.)

vice.disk.detach

Desanexa uma imagem de disco.

ParâmetroTipoObrigatórioDescrição
unitnumbersimUnidade (8-11)

vice.disk.list

Lista o conteúdo do diretório de um disco anexado.

ParâmetroTipoObrigatórioDescrição
unitnumbersimUnidade (8-11)

vice.disk.read_sector

Lê dados brutos de setor.

ParâmetroTipoObrigatórioDescrição
unitnumbersimUnidade (8-11)
tracknumbersimNúmero da trilha (1-42 para D64)
sectornumbersimNúmero do setor

Controle da Máquina

vice.autostart

Inicia automaticamente uma imagem PRG ou de disco.

ParâmetroTipoObrigatórioDescrição
pathstringsimCaminho para .prg, .d64, .g64, etc.
programstringNome do programa a carregar do disco
runbooleanExecutar após carregar (padrão: true)
indexnumberÍndice do programa no disco, baseado em 0

vice.machine.reset

Reinicia a máquina.

ParâmetroTipoObrigatórioDescrição
modestringsoft (padrão) ou hard (ciclo de energia)
run_afterbooleanRetomar após reiniciar (padrão: true)

vice.machine.config.get

Obtém a configuração da máquina — chips, mapa de memória, recursos. Sem parâmetros.

vice.machine.config.set

Define recursos da máquina.

ParâmetroTipoObrigatórioDescrição
resourcesobjectsimPares de nome/valor de recursos, ex.: {"WarpMode": 1}

Exibição

vice.display.screenshot

Captura a tela.

ParâmetroTipoObrigatórioDescrição
pathstringCaminho do arquivo para salvar
formatstringPNG (padrão) ou BMP
return_base64booleanRetornar como URI de dados base64

vice.display.get_dimensions

Obtém as dimensões da tela. Sem parâmetros.


Entrada

vice.keyboard.type

Digita texto com conversão automática de PETSCII.

ParâmetroTipoObrigatórioDescrição
textstringsimTexto a digitar (\n para Return)
petscii_upperbooleanMapeamento de maiúsculas (padrão: true)

vice.keyboard.key_press

Pressiona uma tecla.

ParâmetroTipoObrigatórioDescrição
keystringsimNome da tecla ou caractere único
modifiersstring[]shift, control, alt, meta, etc.
hold_framesnumberDuração do pressionamento em frames (1-300)
hold_msnumberDuração do pressionamento em ms (1-5000)

vice.keyboard.key_release

Solta uma tecla.

ParâmetroTipoObrigatórioDescrição
keystringsimNome da tecla ou caractere único
modifiersstring[]Modificadores a soltar

vice.keyboard.restore

Pressiona/solta a tecla RESTORE (aciona NMI).

ParâmetroTipoObrigatórioDescrição
pressedbooleantrue=pressionar, false=soltar (padrão: true)

vice.keyboard.matrix

Controle direto da matriz do teclado para jogos.

ParâmetroTipoObrigatórioDescrição
keystringNome da tecla: A-Z, 0-9, SPACE, RETURN, etc.
rownumberLinha da matriz 0-7 (alternativa à tecla)
colnumberColuna da matriz 0-7 (alternativa à tecla)
pressedbooleanEstado da tecla (padrão: true)
hold_framesnumberDuração do pressionamento em frames
hold_msnumberDuração do pressionamento em ms

vice.joystick.set

Define o estado do joystick.

ParâmetroTipoObrigatórioDescrição
portnumberPorta 1 ou 2 (padrão: 1)
directionstringup, down, left, right, center
firebooleanBotão de fogo (padrão: false)

vice.joystick.tap

Toque no joystick.

ParâmetroTipoObrigatórioDescrição
portnumberPorta 1 ou 2 (padrão: 1)
directionstringup, down, left, right, center
firebooleanBotão de fogo (padrão: false)
duration_framesnumberDuração do toque em frames (padrão: 3)
duration_msnumberDuração do toque em ms (padrão: 0)

Depuração Avançada

vice.disassemble

Desmonta memória em instruções 6502.

ParâmetroTipoObrigatórioDescrição
addressstringsimEndereço inicial
countnumberInstruções a desmontar (padrão: 10, máx: 100)
show_symbolsbooleanMostrar nomes de símbolos (padrão: true)

vice.symbols.load

Carrega um arquivo de símbolos/rótulos.

ParâmetroTipoObrigatórioDescrição
pathstringsimCaminho para arquivo .sym ou .lbl
formatstringauto, kickasm, vice, ou simple

vice.symbols.lookup

Busca um símbolo por nome ou endereço.

ParâmetroTipoObrigatórioDescrição
namestringNome do símbolo (retorna endereço)
addressnumberEndereço (retorna nome do símbolo)

vice.watch.add

Adiciona um ponto de observação de memória.

ParâmetroTipoObrigatórioDescrição
addressstringsimEndereço a observar
sizenumberBytes a observar (padrão: 1)
typestringread, write, ou both (padrão: write)
loadbooleanAlternativa a type: observar leituras, como em vice.checkpoint.add
storebooleanAlternativa a type: observar escritas, como em vice.checkpoint.add
stopbooleanParar ao atingir (padrão: true); false conta ocorrências sem parar
conditionstringCondição, ex.: A == $42

vice.backtrace

Mostra pilha de chamadas a partir de endereços de retorno JSR.

ParâmetroTipoObrigatórioDescrição
depthnumberMáx. de frames (padrão: 16, máx: 64)

vice.cycles.stopwatch

Mede ciclos de CPU decorridos.

ParâmetroTipoObrigatórioDescrição
actionstringsimreset, read, ou reset_and_read

Snapshots

vice.snapshot.save

Salva o estado completo do emulador.

ParâmetroTipoObrigatórioDescrição
namestringsimNome do snapshot (alfanumérico, _, -)
descriptionstringO que este snapshot captura
include_romsbooleanIncluir ROMs (padrão: false)
include_disksbooleanIncluir estado do disco (padrão: false)

vice.snapshot.load

Restaura o estado do emulador a partir de um snapshot.

ParâmetroTipoObrigatórioDescrição
namestringsimNome do snapshot

vice.snapshot.list

Lista todos os snapshots com metadados. Sem parâmetros.

Status do Projeto

Este é um software ativo e funcional. O servidor MCP compila e roda em Linux, macOS e Windows. Todas as 61 ferramentas estão implementadas e testadas. A CI produz binários para as três plataformas a cada push.

O que está sólido:

  • Suíte completa de ferramentas — execução, memória, breakpoints, sprites, estado de chips, disco, entrada, depuração
  • Respostas cientes da máquina em todas as plataformas emuladas pelo VICE
  • Cliente Python com lógica de retry e cobertura completa de testes
  • Builds multiplataforma: Linux x86_64 (GUI + headless), macOS arm64 (GUI + headless), Windows x86_64 (headless)
  • Pipeline automatizado de CI/CD com lançamentos de binários

O que está em andamento:

  • Streaming de eventos. GET /events está reservado, mas retorna 501 Not Implemented hoje.
  • Rastreamento de execução e hooks de log de interrupções no núcleo da CPU do VICE

Contribuindo

"Atravessem, crianças. Todos são bem-vindos. Todos são bem-vindos." — Tangina Barrons, falando aos contribuidores sobre este repositório

Este projeto conecta duas comunidades que raramente se sobrepõem: computação retrô e ferramentas modernas de IA. Contribuições de qualquer um dos mundos (ou de ambos) são bem-vindas.

Áreas onde a ajuda seria especialmente apreciada:

  • Internals do VICE — Conectar rastreamento de execução e log de interrupções ao núcleo da CPU
  • Transporte de streaming de eventos — Adicionar notificações em tempo real de breakpoints e mudanças de estado
  • Suporte adicional a máquinas — Testar e ajustar ferramentas para PET, CBM-II, Plus/4
  • Bibliotecas de cliente — Clientes TypeScript, Rust, Go
  • Documentação — Tutoriais, fluxos de trabalho de exemplo, demonstrações em vídeo
  • Testes — Executar a suíte de testes de protocolo contra casos extremos

O servidor MCP está inteiramente contido em vice/src/mcp/. Comece por aí.

Versionamento e lançamentos

Este repositório segue o Padrão de Build e Lançamento da Walker Heavy Industries:

  • Conventional Commits são obrigatórios. O versionamento é automatizado com Cocogitto — feat: incrementa o minor, fix: o patch, e um !/BREAKING CHANGE incrementa o major. Instale o hook de commit local uma vez com cog install-hook --all (a CI também valida commits).
  • A cada push para main, a CI executa cog bump --auto, que marca a próxima vX.Y.Z, atualiza CHANGELOG.md e publica um GitHub Release com as notas de changelog geradas.
  • A matriz de builds multi-OS (Linux/macOS/Windows) anexa seus artefatos a esse Release. A tag v mais recente / Release é a única fonte de verdade para a versão — não há compute-version.sh e nenhum prefixo de tag vice-mcp-*.

Licença

O VICE é lançado sob a GNU General Public License v2. As adições do servidor MCP seguem a mesma licença.

Agradecimentos

  • A Equipe VICE por mais de 30 anos do melhor emulador de 8 bits já escrito
  • Anthropic pela especificação do Model Context Protocol
  • A comunidade Commodore 64 — ainda forte após quatro décadas

Parte da suíte

O VICE MCP faz parte do toolchain retrô da Walker Heavy Industries — ferramentas modernas para o ecossistema retrô de 8 e 16 bits.

  • Hub da casa: https://whi.dev
  • Irmãos: VICE Mac · VICE MCP · FamiForge · NESBasic · Novus · Miggy Draw · NovaVM