O dispositivo da interface da ROM¶
Das capacidades¶
Esta interface foi concebida para dispositivos que esperam ter uma ROM conectada à ela através de um barramento dedicado sendo principalmente desenvolvido para CIs de áudio. Pode haver um interesse de outros tipos de dispositivos, no entanto há outros pontos a serem levados em consideração, que pode torná-lo impraticável (como a cache da decodificação dos gráficos, por exemplo). A interface informa a possibilidade da conexão entre a região da ROM com um mapa de endereço ou então configurar dinamicamente um bloco da memória como se fosse uma ROM.Nos casos da região e blocos, este banco de memória é tratado de forma automática.
Configuração¶
device_rom_interface<AddrWidth, DataWidth=0, AddrShift=0, Endian=ENDIANNESS_LITTLE>
A interface é um modelo que pega a largura do endereçamento do barramento dedicado como um parâmetro. Além disso é possível informar a largura do barramento de dados (caso não seja um byte), o deslocamento do endereço (caso não seja 0) e o endianness [1] (caso não seja little endian ou um barramento com tamanho em byte) pode ser fornecido. A largura do barramento de dados é 0 para byte, 1 para word, etc.
void set_map(map);
Use este método na configuração do tempo do sistema para que seja providenciado a conexão de um mapa de endereçamento ao barramento. Tem prioridade sobre uma região da ROM, caso uma esteja presente.
void set_device_rom_tag(tag);
Usado para selecionar uma região da ROM que será usada caso o mapa
de endereços de um dispositivo não seja informado. A predefinição é
DEVICE_SELF
, por exemplo, uma tag do dispositivo.
ROM_REGION(length, tag, flags)
Caso a região da ROM definida com a tag set_device_rom_tag
esteja
presente, seja informada nas definições da ROM para o sistema ou seja
idêntica a tag do dispositivo, esta será selecionada como a ROM correta.
Um mapeamento do endereço terá prioridade sobre uma região da ROM caso
uma esteja presente na configuração do sistema.
void override_address_width(u8 width);
Este método permite sobrescrever a largura do endereço do barramento.
Deve ser invocado de dentro do dispositivo antes da conclusão
do config_complete
.
void set_rom(const void *base, u32 size);
A qualquer momento publique interface_pre_start
com este método,
um bloco da memória pode ser configurado como se uma ROM estivesse
conectada. Sobrescreve qualquer configuração prévia que possa ter sido
fornecida. Pode ser feito mais de uma vez.
Acesso a ROM¶
u8 read_byte(offs_t addr);
u16 read_word(offs_t addr);
u32 read_dword(offs_t addr);
u64 read_qword(offs_t addr);
Estes métodos fornecem o acesso de leitura para uma ROM que esteja
conectada. O acesso fora dos limites retorna mensagens de erro
logerror
sobre o não mapeamento.
O Banco da ROM¶
Caso a região da ROM ou o bloco da memória no set_rom
seja maior
que o barramento de endereços possa acessar, o banco da ROM [2] será
configurado de forma automática.
void set_rom_bank(int bank);
Este método seleciona o número do banco atual.
Ressalvas¶
Ao usar aquela interface, faz com que o dispositivo derive do
device_memory_interface
. Caso o dispositivo queira realmente
utilizar a interface da memória para si mesmo, lembre-se que
o espaço zero (0 ou AS_PROGRAM
) é utilizado pela interface da ROM,
por isso não se esqueça de invocar a base do método
memory_space_config
.
Para os dispositivos com saídas que possam ser utilizadas para endereçar
as ROMs restrito apenas ao encaminhamento dos dados para outro
dispositivo com a única finalidade de processamento, pode ser que seja
de grande ajuda desativar a interface quando ela não estiver sendo
utilizada. Isto pode ser feito sobrescrevendo o memory_space_config
para que retorne um vetor vazio.