fcatrin escribió:Supongamos que quieres acceder al banco "n", donde n va desde 0 a 15, o sea 16 bancos en total (*)
...
(*) Los bancos siempre serán de 16KB porque así está diseñado el hardware.

16 bancos!!!
Estamos hablando entonces de 16 x 16KB = 256KB de memoria extendida, y sumándole los 64KB base de los XL/XE, totalizan 320KB. Uff! Eso es mucha memoria...
Sin embargo, el
mod de Claus Buchholz que indicó dogdark es de sólo 256KB en total, ya que no agrega chips de memoria extra sino que los reemplaza por unos con 4 veces más capacidad, por lo que deja 4 bancos para los 64KB de la memoria principal del 800XL y sólo 192K para los bancos de 16KB, es decir sólo hay
12 bancos extras y están
numerados del 4 al 15 (no es del 0 al 11)
Lo otro es que en vez de tener que recalcular el valor que hay que meter en el registro 54017, mejor inicializar un arreglo con los valores precalculados, algo así:
Código: Seleccionar todo
1 DIM B(13):FOR I=0 TO 12:READ X:B(I)=X:NEXT I:DATA 177,161,165,169,173,193,197,201,205,225,229,233,237
¿De dónde saqué esos valores? Armé una tablita con los bits de los bancos de acuerdo a la documentación (como lo explicó Franco), pero incorporé además los otros bits de control, totalizando 13 bancos:
Código: Seleccionar todo
| POKE | Banco real | D=0 V=0 E=0 B=0 R=1
Banco | 54017 | 130XE 256K | 7 6 5 4 3 2 1 0
-------|-------|------------|---------------------------------
0 | 177 | RAM RAM | 1 0 1 1 0 0 0 1
1 | 161 | 0 4 | 1 0 1 0 0 0 0 1
2 | 165 | 1 5 | 1 0 1 0 0 1 0 1
3 | 169 | 2 6 | 1 0 1 0 1 0 0 1
4 | 173 | 3 7 | 1 0 1 0 1 1 0 1
5 | 193 | 8 | 1 1 0 0 0 0 0 1
6 | 197 | 9 | 1 1 0 0 0 1 0 1
7 | 201 | 10 | 1 1 0 0 1 0 0 1
8 | 205 | 11 | 1 1 0 0 1 1 0 1
9 | 225 | 12 | 1 1 1 0 0 0 0 1
10 | 229 | 13 | 1 1 1 0 0 1 0 1
11 | 233 | 14 | 1 1 1 0 1 0 0 1
12 | 237 | 15 | 1 1 1 0 1 1 0 1
-------|-------|------------|---------------------------------
13 | 129 | 0 | 1 0 0 0 0 0 0 1
14 | 133 | 1 | 1 0 0 0 0 1 0 1
15 | 137 | 2 | 1 0 0 0 1 0 0 1
16 | 141 | 3 | 1 0 0 0 1 1 0 1
La numeración que hice de los bancos fue arbitraria: el banco 0 corresponde a la RAM original del Atari en la ventana $4000-$7FFF (16384-32767), en tanto que los bancos a partir del 1 son de la memoria extra (que se ven en la misma ventana). Además, los bits 0 y 1 están con valores fijos asumiendo que la ROM del SO y el ATARI BASIC están presentes. No sé si será el caso de CAIN, pero SITRE necesitaba modificar el SO para ajustar la velocidad de grabación, por lo que copiaba la ROM en la RAM, y para ese caso, a cada valor en la DATA habría que restarle 1.
Quise probar esos valores, pero no lo puedo hacer ahora en mi 800XL real con 256KB, así que usé el emulador Altirra. Me llamó la atención que Altirra, entre todas sus configuraciones, no tenga la opción de este mod que fue muy popular. Sin embargo, sí está el mod RAMBO de 320KB. Hasta donde entiendo, el mod RAMBO/XL es compatible con el de Buchholz (si es que no es el mismo) y también sólo llega a 256KB, pero no sé cómo se instala ese mod de 320KB... probablemente sea soldando piggy-back todos los chips de memoria sobre los existentes, pero dejando al menos 1 pin libre en cada uno para controlar con PORTB (54017).
De todos modos, usé ese modo en Altirra y funcionó exactamente como esperaba. Quise ir más lejos, y completé la tabla con la combinación que faltaba en los bits 5 y 6 (ambos en cero), y logré direccionar los 16 bancos de memoria extra. O sea, en total hay 17 bancos de 16KB, con 262144 bytes de buffer para un copiador. Feliz como lombriz...
El programa de prueba que usé es el siguiente (se puede copiar aquí y pegar en Altirra):
Código: Seleccionar todo
1 M=16:DIM B(M+1):FOR I=0 TO M:READ X:B(I)=X:NEXT I
2 DATA 177,161,165,169,173,193,197,201,205,225,229,233,237,129,133,137,141
3 FOR I=0 TO M:POKE 54017,B(I):PRINT I,B(I):POKE 17000,B(I):NEXT I
4 FOR I=0 TO M:POKE 54017,B(I):PRINT I,B(I),PEEK(17000):NEXT I
El arreglo B() tiene la lista de valores precalculados, y la variable M indica cuántos bancos de memoria extra se disponen, así que si se usa:
- 130XE estándar: M=4
- 800XL con mod de Bushholz: M=12
- 800XL con mod RAMBO 320K: M=16
Las líneas 1 y 2 cargan el arreglo. Obviamente se pueden eliminar de la DATA los valores que no se usarán, es decir, hay que dejar los primeros M+1 valores.
La línea 3 selecciona cada banco y pone el mismo valor de la DATA en una dirección cualquiera dentro de la ventana (elegí la dirección 17000 porque sí).
La linea 4 vuelve a seleccionar cada banco, y muestra tanto el valor que debiera tener en la memoria modificada como el que realmente leyó para ese banco. Si ambas columnas tiene el mismo valor, el banco está correcto, pero si para alguna fila cambia, hay conflicto entre bancos, y el valor leído dará una pista de cuáles serían.
dogdark escribió:ya ahora entre en el mismo problema de siempre con el poke
poke 54017,221, ahora con el 4 le estoy diciendo que serian 16 bits de entrada por banco, después JJ le indico el banco donde se posicionaran los bytes, ahora le agrego 16 y culmino con 1 para el extra o sea seria así
poke 54017,221+4*jj+16*1 - POKE 54017,221 + 4*ADDRESS + 16*MODE.
que tan lejos estoy???
Con todo lo que expliqué, te encuentro harto lejos... Al igual que Franco, no entiendo de dónde sacas ese 221 como base. Ese valor no aparece en mi lista. Supongo que ahí también tienes un ERROR 3.
Creo que te complicas demás con el ADDRESS y el MODE (MODE tiene que ver sólo con el 130XE, y no conozco ningún programa que use el modo de video con el bit 5). Quédate con el concepto de "banco", y la data siempre estará entre las direcciones 16384 y 32767.
Suerte con tu CAIN4, y recuerda que en un 130XE, el copiador tendrá 5 bancos (81920 bytes) direccionables en la ventana de 16KB, por lo que para copiar el juego Goonies versión XEX de 72670 bytes no se requiere expansión de memoria en ese computador (o emulado).