Como fazer a minha própria ROM personalizada? Que linguagens de programação eu preciso saber
Você pode criar uma ROM personalizada (memória somente leitura) "queimando" uma PROM (ROM programável) ou EPROM (PROM apagável) ou EEPROM (PROM apagável eletronicamente) ou EAPROM (PROM alterável eletronicamente).
Normalmente a sua ROM contém a linguagem da máquina em bruto para um determinado processador. Para as CPUs baseadas em Intel™ x86 isso normalmente seria (ou pelo menos começar com) código para o modo "real" (desprotegido).
Note que as várias variantes das tecnologias PROM mostram uma progressão para menos "somente leitura" e maior acesso para reescrever o conteúdo da PROM. As EPROMs mais antigas foram apagadas pela exposição temporizada à luz UV (ultravioleta) a uma intensidade significativa. Essencialmente, a programação foi tipo derretida delas. As EPROMs podiam ser apagadas com um sinal eletrônico levantado em determinados pinos por um intervalo de tempo especificado; toda a ROM foi apagada por este procedimento. EAPROMS (O que é EAPROM?) eram modificáveis em blocos e basicamente evoluíram para o que hoje chamamos "memória flash".
ROMs são distinguidas das "PROMs" pelos métodos de fabricação e escala. As ROMs são produzidas em massa (para cada BIOS ou outro programa/conteúdo dado) enquanto as PROMs foram projetadas para serem programadas no campo por um dispositivo especial, um programador PROM, que é projetado para aplicar um sinal de alta tensão sobre as linhas em um dado endereço e assim "queimar o fusível" naquele local de bit. EPROMs requerem dispositivos similares para programação e uma luz UV para apagar.
Quando você pergunta sobre a gravação de ROMs personalizadas, há a suposição oculta de que sua intenção é criar ROMs de inicialização personalizadas.
Teoricamente você poderia colocar qualquer conteúdo que você gosta em uma ROM e hackear algum tipo de cartão de expansão para que esses dados fossem mapeados no espaço de endereço de alguma arquitetura de computador específica em algum local específico. Mas, na prática, há muito pouco uso de ROMs em computação de propósito geral, além do "código de inicialização"
Por isso, qualquer linguagem de programação que possa compilar até a linguagem de máquina nativa deve ser suficiente. Note que isto não é tão simples como você pode pensar.
Quando você está compilando programas normais para rodar no seu sistema está sendo ligado a algum código "run-time" e geralmente a algumas bibliotecas padrão (geralmente código objeto compartilhado ... .so arquivos no Linux, arquivos .dynlib no MacOS X, e arquivos .DLL no MS Windows, entre outros). Mas o código que você inicializa em uma ROM de inicialização não está rodando sob e no ambiente do sistema operacional. As suposições, os pontos de entrada para o código, os cabeçalhos para executáveis (ELF para Linux, COFF para algumas versões muito antigas de Linux e Unix, etc) e, claro, quaisquer referências a chamadas de sistema e funções de bibliotecas compartilhadas são todas inválidas para as ROMs.
Para a maior parte você deve assumir que você vai escrever código para PROMs em C (não C++) ou a linguagem assembly para a sua arquitetura.
Para aprender mais sobre as ROMs em hardware real, mainstream, de propósito geral, você pode estudar coreboot e seu garfo, Libreboot, ou TianoCore (UEFI) que são esforços para fornecer substitutos que você poderia usar em PCs (desktops e servidores ... principalmente?).
Outro artigo que você acha interessante seria um sobre como escrever um driver serial/TTY de "sala de pânico" para uso na BIOS virtualizada VMWare no assembly 8086: Criar uma BIOS a partir do zero. Isto deve indicá-lo no tipo de considerações que você encontrará ao escrever qualquer outro código que você possa colocar em uma ROM de inicialização de hardware. Aqui está outra resposta a uma pergunta semelhante sobre StackOverflow que vale a pena ler: Escrever a minha própria BIOS.
Esse é provavelmente um bom ponto de partida. Tenha em mente que qualquer tentativa de escrever um programa prático para deployment em uma ROM será um esforço muito extenso. Boa sorte.