Liber VII · Capitulum II
Bus stuffing
Una escritura arbitraria cada tres ciclos.
El truco
Para que el TIA reciba un valor, el 6507 lo carga en un registro y lo guarda en el TIA: lda #valor (2 ciclos) y sta COLUBK (3 ciclos). Con bus stuffing el 6507 solo ejecuta el sta, y es el cartucho quien fuerza las líneas del bus de datos durante el ciclo de escritura: lo que llega al TIA lo decide el ARM. Son 3 ciclos por escritura en vez de 5: hasta 25 escrituras arbitrarias en una línea de 76 ciclos, frente a 15.
Hay una condición: el cartucho solo puede bajar a 0 bits del bus, no subirlos. El registro del 6507 tiene que llevar a 1 los bits que se quieren dejar libres, y los bits 7 y 6 no se fuerzan: salen del propio registro. Por eso vcsWrite3 elige la instrucción según esos dos bits del dato: sta, stx, sty o sax (A AND X), con A, X e Y cargados antes con sus máscaras. Si X o Y no tienen su máscara, sale otro color u otro volumen.
| Bits 7 y 6 del dato | Instrucción | Registro |
| 0 1 | sta | A = $7F |
| 1 0 | stx | X = $BF |
| 1 1 | sty | Y = $FF |
| 0 0 | sax | A AND X = $3F |
Por qué hace falta
Una sala de 128 píxeles en alta resolución exige entregar bytes a GRP0 y GRP1 en ventanas de 8 píxeles, además de los RESP para recolocar los jugadores, el HMOVE, el playfield y una muestra de sonido en cada línea. En COMPLETO cada línea lleva ocho GRP, tres RESP0, los HMOVE y la muestra de sonido, cada uno en su ciclo exacto, y con 5 ciclos por escritura no da tiempo. El capítulo de los modos cuenta cómo se reparten.
Dónde se usa
| Modo | Imagen de la sala | Marcador |
| COMPLETO | Sí | Sí (va en el mismo kernel) |
| FRANJA+ | Sí (playfield asimétrico y ventana de 48 px) | No |
| DOBLE | No | No |
| FRANJA | No | No |
La portada tampoco lo usa, para que se vea igual en cualquier consola. Un matiz: aunque la imagen de DOBLE y FRANJA no lo necesite, la subida de las muestras de sonido que el 6507 escribe en el overblank (32 bytes por frame) se hace con bus stuffing en todos los modos.
Las consolas que no lo toleran
Según la experiencia recogida en los foros de AtariAge (no son medidas del proyecto), algunas 7800 PAL no rellenan bien el bit 7, alguna Atari Jr. con TIA de fabricación taiwanesa pierde varios bits, y el nivel bajo del bus queda al límite, así que unos contactos sucios lo empeoran. En esas consolas conviene elegir DOBLE o FRANJA en el menú. Las 2600+ y 7800+ no admiten cartuchos ELF.
Stella 7 implementa vcsWrite3 forzando el byte entero, así que no detecta una máscara olvidada. Para eso el proyecto tiene un parche de Stella que imita al PlusCart de Wolfgang Stubig (Al_Nafuur) (elige sta/stx/sty/sax y avisa en la consola si el valor que sale no es el pedido): así apareció el fallo de las primeras pruebas, unas bandas negras porque solo se cargaba A.