Bueno, aunque hoy tenia que madrugar anoche me pique cosa mala con terminar de entender completamente ese pedazo de codigo y me dieron las 2 y pico pero bueno, lo consegui!!! :twisted:
Aqui va el fragmento de los apuntes que me estoy haciendo, relacionado con el caso en cuestion...
-----------------------------------------
Ejemplo..
El siguiente programa mueve 64 caracteres de la ROM al set de caracteres que vamos a crear en la RAM:
PRINT CHR$(142) :REM Activa el set de caracteres 1
POKE 52,48:POKE 56,48:CLR :REM Reserva memoria para los caracteres
POKE 56334,PEEK(56334)AND254 :REM Detiene el interruptor de escaneo de teclas (Keyscan Interrupt Timer)
POKE 1,PEEK(1)AND251 :REM Cambia a la ROM Generadora de caracteres
FOR I=0 TO 511 : POKE I+12288,PEEK(I+53248) : NEXT
POKE 1,PEEK(1)OR4 :REM Cambia a la I/O
POKE 56334,PEEK(56334)OR1 :REM Reanuda el Keyscan Interrupt Timer
END
Comenzamos por el PRINT CHR$(142). CHR$ se usa para convertir un numero entre 0 y 255 a caracteres ascii, siendo lo contrario a la funcion asc. El set de caracteres 1 o Grossschreibung mientras que para activar el 2 habra que pasar como parametro 14. El primer set son todo mayusculas y sel segundo dispone tanto de mayusculas como minusculas. (nota: esto lo cambiare casi seguro a raiz de nueva informacion que he encontrado sobre el numero de sets que tiene la rom pero en si la explicacion es valida)
Al hacer POKE 52, 48 se esta dando el valor 48 al registro 52 que en concreto sirve como puntero al inicio de cadenas. Luego en esa misma linea se hace lo mismo pero al registro 56, este es un puntero al final/limite de memoria a usar por BASIC. Pero ┐porque se hace todo esto y luego en pone un comentario? (REM seguido del comentario) pues porque el area o memoria de cadenas comienza en donde acaba la de BASIC y claro, si se recorta la de Basic para hacer hueco habra que mover la otra, ponerla de nuevo pegada la de BASIC, para asi conseguir dejarnos el hueco deseado. CLR borra el espacio de RAM dedicado a variables, tablas, cadenas, sin tocar el programa Basic.
Despues en POKE 56334,PEEK(56334)AND254 hace lo mismo pero en el momento de asignar valor usa PEEK que a diferencia de POKE en vez de asignar lo que hace es recuperar el valor de la direccion de memoria a la que hace referencia y al valor recuperado le aplica AND254...me explico:
12 AND 10 = 8, 12 es %1100 en binario y 10 es %1010
AND en los bits diferentes da resultado 0
OR en los bits diferentes da resultado 1
1100 | 1100
1010 | 1010
---------------
1000 | 1110
El registro 56334, ocupa 1byte, 8bits, 256 posibles valores, del 0 al 255. Al poner 254 es igual que poner 11111110 (siete 1 y un 0). Como se ha usado en el codigo AND254 en caso de encontrar un "par" diferente en la operacion el resultado sera 0 y con ello se pone el bit mas a la derecha a 0 y se desactiva el Keyscan Interrupt Timer. La penultima linea del codigo hace lo contrario, usa OR1 siendo 1 en binario %00000001 y puesto que es OR, en caso de no haber pariedad el resultado sera 1 y se volvera a activar.
Con POKE 1,PEEK(1)AND251 se va a dar valor al registro 1, punto de acceso al llamado puerto del procesador. Entre otras funciones es usado para mapear la ROM y las areas I/O (entrada y salida), ademas del control del cassette.
De los 8bits que componen el registro 1 nos interesa solo 1, el segundo:
2 - CHAREN (0 = ROM Caracteres en lugar de area I/O)
Lo que nos interesa es cambiar el bit 2 para conmutar entre ROM e I/O y explico tambien esto mejor. El bit 2 o CHAREN es usado unicamente para situar los 4Kb de la ROM Generadora de Caracteres (Character Generator ROM) dentro o fuera del espacio de direcciones de la cpu. Desde el punto de vista de la CPU del C64, la ROM Generadora de Caracteres ocupa el mismo espacio de direcciones que los dispositivos de I/O ($D000-$DFFF). Cuando el bit 2 tiene valor 1, por defecto, I/O estara dentro del espacio de direcciones de la cpu y la ROM Gene.. no es accesible pero si se le da valor 0, ocurre lo contrario. Solo se requiere de acceso a la Rom Gene.. cuando se quiera descargar el set de caracteres a la RAM, como en el caso que nos ocupa.
Y siguiendo con POKE 1,PEEK(1)AND251, al ser AND en caso de disparidad el resultado sera 0 y como 251 en binario es %11111011 y el bit 2 por defecto esta a 1, pasara a estar a 0 y lo que estara dentro del espacio de direcciones de la cpu sera la ROM Generadora de Caracteres. Despues se usara POKE 1,PEEK(1)OR4 que siendo 4 en binario %00000100 y estando usando OR, el bit pasara de nuevo a 1.
Ya solo queda la instruccion FOR I=0 TO 511 : POKE I+12288,PEEK(I+53248) : NEXT, un bucle que va recogiendo y copiando cada caracter o mejor dicho cada patron al hueco que hemos preparado en la ram, a partir de la posicion 12288 ($3000). El bucle va desde 0 a 511, 512 pasadas. La memoria de caracteres en la ROM comienza en 53248 y de ahi es de donde se van recuperando valores en funcion del acumulador I. Cada caracter son 8bytes, 512 / 8 = 64 caracteres, por cada pasada se recupera un byte.
Espero le sirva de ayuda a alguien y si, me lio yo solo pero no me gusta dejar cosas como que funcionan "porque si" :?