API de scripting JavaScript do Crome
Referência para a API JavaScript legada do editor de ROM Crome, utilizada por scripts, manipuladores de ROM (ROM handlers) e plug-ins.
Adaptado de pgmfi.org wiki
O Crome expõe uma API JavaScript para estender o editor de ROM OBD1 legado com scripts, manipuladores de ROM (ROM handlers) e plug-ins. Esta referência preserva a API documentada pela comunidade original do Crome.
Warning
Trabalhe numa cópia da ROM e verifique todos os resultados antes de a instalar numa ECU. O comportamento da API pode diferir entre versões do Crome, e um script incorreto pode corromper tabelas, escalares ou checksums.
Aceder aos objetos da API
Dentro de um script Crome, os membros do objeto padrão window podem ser chamados diretamente ou através de window:
refresh();
window.refresh();
rom.byteAt(0x7FFF);
window.rom.byteAt(0x7FFF);
Um plug-in do Crome baseado em HTML acede aos mesmos objetos através de window.external:
window.external.refresh();
window.external.rom.byteAt(0x7FFF);
A documentação arquivada descreve três objetos principais:
| Objeto | Finalidade |
|---|---|
window |
Diálogos, registo de plug-ins, comandos externos e atualização do ecrã |
window.rom / rom |
Ler e modificar a ROM ativa, tabelas, escalares e flags de funcionalidades |
window.files / files |
Abrir, guardar, ler e gravar ficheiros |
Funções da janela (Window)
| Função | Finalidade documentada |
|---|---|
addRomHandler(romtype, author, jscmd) |
Registar um manipulador para um tipo de ROM |
addPlugin(author, mnucaption, jscmd, category) |
Adicionar uma entrada ao menu de plug-ins do Crome |
alert(msg) |
Exibir uma mensagem com um botão OK |
confirm(msg) |
Exibir uma confirmação de Sim/Não; devolve false ou true |
DecToHex(dec) |
Converter um valor decimal numa string hexadecimal |
exal(cipherstring) |
Avaliar uma string JavaScript codificada |
GetFilePath(filename) |
Devolver a parte do caminho de um nome de ficheiro |
GetFileName(filename) |
Devolver a parte do nome de um nome de ficheiro |
HiByte(w) |
Devolver o byte alto (high byte) de uma word |
LoByte(w) |
Devolver o byte baixo (low byte) de uma word |
input(msg, options, values) |
Exibir um diálogo de seleção de entrada |
include(filename) |
Incluir outro ficheiro de script |
prompt(caption, msg, default) |
Solicitar uma resposta do utilizador |
select(prompt, selection) |
Devolver o índice do item selecionado, ou -1 quando cancelado |
shell(filename, params, windowstate) |
Iniciar uma aplicação externa |
shelld(doscmd) |
Executar um comando DOS e devolver o seu resultado |
shellw(filename, params, windowstate) |
Iniciar uma aplicação e aguardar que ela feche |
showBrowser(url, width, height) |
Abrir o navegador integrado do Crome |
refresh() |
Atualizar o editor após um script alterar a ROM ativa |
Note
A assinatura arquivada declara
prompt()como devolvendo um booleano, enquanto a sua descrição diz que devolve a resposta do utilizador ou uma string vazia. Verifique o comportamento na versão do Crome que está a usar como alvo.
Exemplos da API arquivada:
addRomHandler(rtP30, 'Author', '_handle_p30_rom()');
addPlugin('Author', 'Test Plugin', '_run_test_plugin()', 0);
shell('notepad.exe', 'C:\\autoexec.bat', 0);
showBrowser('my_html_plugin.html', 400, 250);
Uma referência rápida mais antiga também lista _rom_write(start, values, count) e _rom_fill(fromAddr, toAddr, byteFill), além de uma propriedade rom.type com exemplos como rp30, rp72, rp28 e rpCustom. A sua disponibilidade depende da versão.
Objeto ROM
Acesso a bytes, words e tabelas
| Membro | Acesso | Finalidade documentada |
|---|---|---|
byteAt(addr) |
Leitura/Gravação | Obter ou definir um byte num endereço da ROM |
wordAt(addr) |
Leitura/Gravação | Obter ou definir uma word little-endian num endereço da ROM |
working_table |
Leitura/Gravação | Selecionar a tabela de combustível ou ignição ativa |
tableByte(col, row) |
Leitura/Gravação | Obter ou definir um byte bruto na tabela ativa |
tableValue(col, row) |
Leitura/Gravação | Obter ou definir o valor interpretado da tabela |
tableWidth |
Apenas leitura | Largura da tabela ativa |
tableHeight |
Apenas leitura | Altura da tabela ativa |
mapScalar(table, col) |
Leitura/Gravação | Obter ou definir um escalar de MAP em milibares |
revScalar(table, row) |
Leitura/Gravação | Obter ou definir um escalar de RPM |
working_table utiliza estes valores documentados:
| Valor | Tabela |
|---|---|
0 |
Combustível baixo (Low fuel) |
1 |
Combustível alto (High fuel) |
2 |
Ignição baixa (Low ignition) |
3 |
Ignição alta (High ignition) |
rom.working_table = 2;
var ignitionByte = rom.tableByte(0, 5);
var lastByte = rom.byteAt(0x7FFF);
rom.byteAt(0x7FFF) = 0xFF;
wordAt() tem em conta o armazenamento little-endian. A fonte indica que os bytes armazenados como [0xAB][0xCD] são devolvidos como 0xCDAB.
Metadados da ROM e flags de funcionalidades
| Membro | Acesso | Significado documentado |
|---|---|---|
addressOf(name) |
Leitura/Gravação | Endereço armazenado num registo especial nomeado |
addressIn(index) |
Leitura/Gravação | Endereço armazenado no índice do registo especial de 0 a 63 |
base |
Leitura/Gravação | ROM base utilizada para localizações de endereços padrão |
title |
Leitura/Gravação | Texto exibido na barra de estado do Crome |
filename |
Apenas leitura | Nome completo do ficheiro da ROM ativa |
OBDMode |
Leitura/Gravação | Modo de fórmula: 0 OBD0, 1 OBD1, 2 OBD2, 3 desconhecido |
notes |
Leitura/Gravação | Notas anexadas à ROM ativa |
gup() |
Função | Criar um ponto de anulação de grupo (group undo point) em torno de uma operação de múltiplas alterações |
As flags de funcionalidades estão documentadas como propriedades de byte de leitura/gravação:
| Propriedade | Valores |
|---|---|
hasLaunchControl |
0 desligado, 1 ligado |
hasFullThrottleShift |
0 desligado, 1 ligado |
hasBoost |
0 nenhum, 1 boost com MAP original (stock), 2 boost com 3-bar, 3 personalizado |
hasFinalMultiplier |
0 desligado, 1 ligado |
hasShiftLight |
0 desligado, 1 ligado |
hasIAB |
0 desligado, 1 ligado |
Utilize gup() antes e depois de um grupo de alterações para que o Crome possa anulá-las como uma única ação:
rom.gup();
for (var i = 0; i <= 0x7FFF; i++) {
rom.byteAt(i) = LoByte(i);
}
rom.gup();
refresh();
Objeto Files
| Membro | Finalidade documentada |
|---|---|
showSave(filter, filterindex) |
Mostrar um diálogo de gravação e devolver o nome do ficheiro selecionado |
showOpen(filter, filterindex) |
Mostrar um diálogo de abertura e devolver o nome do ficheiro selecionado |
exists(filename) |
Devolver true quando um ficheiro existe |
getFile(filename) |
Ler um ficheiro de texto |
putFile(filename, data) |
Gravar dados num ficheiro |
browseFolder |
Mostrar um explorador de pastas e devolver o caminho selecionado |
Os diálogos de abertura, gravação e de pasta cancelados estão documentados como devolvendo uma string vazia.
Nomes dos registos especiais
Utilize estes nomes com rom.addressOf('NAME') ou o seu índice numérico com rom.addressIn(index).
| Nome | Índice | Finalidade documentada |
|---|---|---|
CHECKSUM |
0 | Endereço de correção do checksum |
LOW_MAP_SCALAR |
1 | Endereço do escalar de MAP baixo |
HIGH_MAP_SCALAR |
2 | Endereço do escalar de MAP alto |
LOW_REV_SCALAR |
3 | Endereço do escalar de RPM baixo |
HIGH_REV_SCALAR |
4 | Endereço do escalar de RPM alto |
LOW_FUEL |
5 | Endereço da tabela de combustível baixa |
HIGH_FUEL |
6 | Endereço da tabela de combustível alta |
LOW_IGNITION |
7 | Endereço da tabela de ignição baixa |
HIGH_IGNITION |
8 | Endereço da tabela de ignição alta |
NFO_LOW_TABLE |
9 | Dimensões da tabela baixa; o byte alto é a altura, o byte baixo é a largura |
NFO_HIGH_TABLE |
10 | Dimensões da tabela alta; o byte alto é a altura, o byte baixo é a largura |
REVCUT1 |
11 | Endereço do valor do primeiro corte de rotação (rev-cut) |
REVRES1 |
12 | Endereço do valor de retoma do primeiro corte de rotação (rev-resume) |
REVCUT2 |
13 | Endereço do valor do segundo corte de rotação (rev-cut) |
REVRES2 |
14 | Endereço do valor de retoma do segundo corte de rotação (rev-resume) |
VTEC_TABLE |
15 | Endereço da tabela VTEC |
NFO_VTEC_TABLE |
16 | Informações da tabela VTEC |
VTEC |
17 | Endereço do byte de configuração do VTEC |
IDLE |
25 | Endereço do valor de ralenti (idle) |
KNOCK |
26 | Endereço do byte de configuração de detonação (knock) |
ELD |
27 | Endereço do byte de configuração do ELD |
BARO |
29 | Endereço do byte de configuração da pressão barométrica |
VTECVSS |
30 | Endereço do byte de configuração da verificação de VSS do VTEC |
VTECCOOL |
31 | Endereço do byte de configuração da verificação de temperatura da água do VTEC |
DEBUGMODE |
32 | Endereço do byte de configuração do modo de depuração (debug) |
OXYHEAT |
33 | Endereço do byte de configuração da verificação da resistência da sonda lambda (O2 heater) |
LAUNCH_CUT |
40 | Endereço do valor de corte do launch control |
LAUNCH_RES |
41 | Endereço do valor de retoma do launch control |
SHIFT_CUT |
42 | Endereço do valor de corte do full-throttle-shift |
SHIFT_RES |
43 | Endereço do valor de retoma do full-throttle-shift |
SPEED_LIMIT |
44 | Endereço do valor do limitador de velocidade |
NFO_MAP_MIN |
45 | Informações de MAP mínimo; sem descrição na fonte |
NFO_MAP_MAX |
46 | Informações de MAP máximo; sem descrição na fonte |
MTX1 |
50 | Endereço do multiplicador final de combustível |
MTX2 |
51 | Sem descrição na fonte |
MTX3 |
52 | Endereço do multiplicador de combustível no arranque (cranking) |
MTX4 |
53 | Sem descrição na fonte |
MTX5 |
54 | Endereço do multiplicador de combustível de aceleração rápida (tip-in) |
MTX6 |
55 | Sem descrição na fonte |
SL_BYTE |
56 | Endereço do byte de configuração da shift-light |
SL_RPM |
57 | Endereço das RPM da shift-light |
A documentação arquivada indica que um manipulador de ROM deve definir as propriedades hasLaunchControl, hasFullThrottleShift, hasFinalMultiplier, hasShiftLight e hasIAB correspondentes para 1 para que os editores de opções integrados do Crome as utilizem.
Créditos e fonte
Fonte Adaptado de Crome Script em pgmfi.org wiki. Licenciado sob CC BY-NC-SA 1.0.