Autor Tema: Dudas varias...os voy a dar curro xDDD  (Leído 10679 veces)

KFR

  • Sinver
  • *
  • Mensajes: 18
    • Ver Perfil
    • http://unliocode.wordpress.com
Dudas varias...os voy a dar curro xDDD
« en: Septiembre 30, 2010, 21:05:50 »
Hola :twisted:

Ya me he presentado en otro hilo pero sin mas, hola a todos y me presento en esta mini comunidad de amantes o interesados en este retropc.

Ando mirandome a ratos, que la verdad a cada instante que puedo me pongo a ello xD el manual referencia para programadores de devili e iba muy bien y sin dudas hasta ahora :( que entiendo un codigo de ejemplo que viene o mas bien se lo que hace pero no como trabaja algun metodo y si me podriais echar un cable pues lo agradeceria :roll: y asi de paso crear un hilo para plantear dudas generales sobre programacion en C64 y en C64 con C (uso CC65).

El codigo...

PRINTCHR$(142)               :REM SWITCH TO UPPER CASE
POKE52,48:POKE 56,48:CLR    :REM RESERVE MEMORY FOR CHARACTERS
POKE56334,PEEK(56334)AND254 :REM TURN OFF KEYSCAN INTERRUPT TIMER
POKE1,PEEK(1)AND251         :REM SWITCH IN CHARACTER
FORI=0TO511:POKEI+12288,PEEK(I+53248):NEXT
POKE1,PEEK(1)OR4            :REM SWITCH IN I/O
POKE56334,PEEK(56334)OR1    :REM RESTART KEYSCAN INTERRUPT TIMER
END

El codigo copia 64 caracteres a la ram, a un hueco que se hace para evitar que los programas sobreescriban el set que se va a crear.
Mi duda es...en la instruccion que reserva memoria o mas bien limita la memoria con que los programas pueden trabajar para asi meter el set de caracteres, como trabaja? "POKE52,48:POKE 56,48:CLR"

josepzin

  • Administrador
  • Commodore Master
  • *****
  • Mensajes: 13630
  • Commodoreador web
    • Ver Perfil
    • Mi blog
Dudas varias...os voy a dar curro xDDD
« Respuesta #1 en: Septiembre 30, 2010, 21:30:14 »
Ese BASIC optimizado en espacios!
www.retroinvaders.com | www.commodoreplus.org  | josepzin.blogspot.com

KFR

  • Sinver
  • *
  • Mensajes: 18
    • Ver Perfil
    • http://unliocode.wordpress.com
Dudas varias...os voy a dar curro xDDD
« Respuesta #2 en: Septiembre 30, 2010, 21:40:53 »
Es lo que tienen estos retropcs que obligan a optimizar todo lo que se pueda y mas xDDD...en mi defensa eso esta asi mismo en el manual ^^ yo pondria algun espacio mas...solo alguno.

Carlos

  • Desarrolladores
  • Commodore Master
  • ******
  • Mensajes: 652
    • Ver Perfil
Dudas varias...os voy a dar curro xDDD
« Respuesta #3 en: Septiembre 30, 2010, 21:53:01 »
Yo me tomaría la guia del programador como lo que es, es decir, en mi caso no me pongo a analizar cada código BASIC porque además de ser lioso (son todo pokes a direcciones que no me suelen decir nada) es un lenguaje que no uso.

Por ponerte un ejemplo, cuando quise experimentar con sprites me leí la teoría hasta que la entendí y después me fuí creando mis códigos en C para ir haciendo mis pruebas y así probado y peleándote es como aprendes.

Es sólo mi opinión que conste...

Laddh

  • Desarrolladores
  • Commodore Master
  • ******
  • Mensajes: 233
    • Ver Perfil
Dudas varias...os voy a dar curro xDDD
« Respuesta #4 en: Septiembre 30, 2010, 23:02:33 »
"como trabaja? "POKE52,48:POKE 56,48:CLR"

52 Puntero a inicio de cadenas, normalmente 160 (160*256=posición de memoria 40960)
56 Puntero a máxima dirección utilizable por el Basic (lo mismo, 160 normalmente)
48*256=12288 Posición de memoria donde se empezara a copiar el set de caracteres y que ya no sera barrido por el Basic.
CLR Borra el espacio de RAM dedicado a variables, tablas, cadenas, sin tocar el programa Basic

A mi entender este es el sentido de esta línea, resta espacio al Basic para redefinir en RAM el set de caracteres.

KFR

  • Sinver
  • *
  • Mensajes: 18
    • Ver Perfil
    • http://unliocode.wordpress.com
Dudas varias...os voy a dar curro xDDD
« Respuesta #5 en: Septiembre 30, 2010, 23:03:59 »
Tras investigar un poco y es que no me puedo quedar sin saber que hace algo que voy a necesitar para programar si o si porque querre hacer mis propias fuentes y simbolos aunque sea por probar :D pues he dado con el tema en cuestion ^^ sabia que POKE era para introducir un valor en la posicion de memoria señalada pero no sabia que leches eran la 52 y la 56.

55-56 ($0037-$0038) puntero al final de la memoria/area de Basic
51-52 ($0033-$0034) puntero al inicio del area de cadena variable...que no se muy bien cual sera su funcion pero supongo que sera para alojar cadenas de caracteres o algo similar.

Pues bueno, que tiene que ver el hacer descender el limite del area de Basic, que es lo que busco para meter mi set de caracteres, con el registro ese 52 pues esto "Grows downwards from end of BASIC area" o lo que es lo mismo, que el area de cadena o como se llame crece desde el final del area de Basic y si hago esta ultima mas pequeña tambien tendre que mover la otra para terminar de hacer hueco

Solucionado :twisted:

Edit: Laddh yo te mato XDDDD T T pero muchas gracias hihihi
Edit2: Laddh si no es molestia, el calculo de 160*256 se explica como? es que me gusta atar todo 8)

Laddh

  • Desarrolladores
  • Commodore Master
  • ******
  • Mensajes: 233
    • Ver Perfil
Dudas varias...os voy a dar curro xDDD
« Respuesta #6 en: Octubre 01, 2010, 08:39:12 »
Je Je, me adelante por un minuto, 256 es la clave de cualquier secreto, es consustancial al universo, es... :lol:
Por lo que recuerdo, era la operación típica para saber a donde apunta cualquier puntero o vector en el commodore, normalmente en bloques de 2 vectores (contenido de 56*256+ contenido de 55) en la norma byte bajo byte alto.

KFR

  • Sinver
  • *
  • Mensajes: 18
    • Ver Perfil
    • http://unliocode.wordpress.com
Dudas varias...os voy a dar curro xDDD
« Respuesta #7 en: Octubre 01, 2010, 14:20:13 »
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" :?

marcos64

  • Commodore Master
  • *****
  • Mensajes: 2970
    • Ver Perfil
    • http://marcos64.orgfree.com/
Dudas varias...os voy a dar curro xDDD
« Respuesta #8 en: Octubre 01, 2010, 21:02:29 »
Cita de: "KFR"

AND en los bits diferentes da resultado 0
OR en los bits diferentes da resultado 1

1100 | 1100
1010 | 1010
---------------
1001 | 1110


No se si te he entendido bien: quieres decir que 1100 AND 1010 = 1001 ?
http://marcos64.orgfree.com/
Actualizacion 22/4/2018: Actualizada Load'N'Run numero 5 con nuevos TAPs y PRGs.

KFR

  • Sinver
  • *
  • Mensajes: 18
    • Ver Perfil
    • http://unliocode.wordpress.com
Dudas varias...os voy a dar curro xDDD
« Respuesta #9 en: Octubre 02, 2010, 12:16:33 »
Hola de nuevo :)

No, eso es un errata a la hora de escribir, en realidad el resultado en ese caso, el de AND, seria 1000 :wink:

marcos64

  • Commodore Master
  • *****
  • Mensajes: 2970
    • Ver Perfil
    • http://marcos64.orgfree.com/
Dudas varias...os voy a dar curro xDDD
« Respuesta #10 en: Octubre 02, 2010, 21:04:55 »
Si, eso me parecia  :D

Por algun error asi me he pasado un par de horas volviendome loco intentando encontrar el error...

Corrige lo de 'AND en los bits diferentes da resultado 0' que puede dar lugar a confusiones.
http://marcos64.orgfree.com/
Actualizacion 22/4/2018: Actualizada Load'N'Run numero 5 con nuevos TAPs y PRGs.

josepzin

  • Administrador
  • Commodore Master
  • *****
  • Mensajes: 13630
  • Commodoreador web
    • Ver Perfil
    • Mi blog
Dudas varias...os voy a dar curro xDDD
« Respuesta #11 en: Octubre 02, 2010, 21:26:47 »
Qué difícil se me hace leer el BASIC!! Y sumado a eso los números en decimal...

Realmente las ventajas de usar hexadecimal o binario son tremendas
www.retroinvaders.com | www.commodoreplus.org  | josepzin.blogspot.com

na_th_an

  • Commodorero
  • **
  • Mensajes: 27
    • Ver Perfil
Dudas varias...os voy a dar curro xDDD
« Respuesta #12 en: Octubre 20, 2010, 12:32:31 »
Cita de: "KFR"
el calculo de 160*256 se explica como? es que me gusta atar todo 8)


El 6509 es un microprocesador de 8 bits con 16 bits de direcciones y está fuertemente orientado a manejar "páginas" de memoria de 256 bytes, direccionables con 8 bits. Sus instrucciones de movimiento de datos muchas veces permiten trabajar rápido y de forma cómoda asumiendo que estamos en una página y jugando con un offset de 8 bits para movernos por ella.

Es por eso que la mayoría de las direcciones en el C64 son múltiplos de 256. Esto permite que el procesador se maneje mejor y, además, permite establecer direcciones de memoria importantes escribiendo sólo un valor.

Así, podemos usar un único valor de 8 bits (160) para especificar una dirección de memoria de 16 bits. Ese 160 quiere decir "la página 160". Como hemos dicho, cada página es de 256 bytes, por lo que la dirección final es 160*256 = 40960.

Lo de los POKE/PEEK es una forma sencilla de setear/resetear bits individuales desde BASIC, que no tiene operaciones a nivel de bits. La fórmula infalible es:

[code]RESET a, n (poner a 0 el bit n de a) POKE a, PEEK (a) AND 255 - 2^n
SET a, n (poner a 1 el bit n de a) POKE a, PEEK (a) OR 2^n
TEST a, n (ver si el bit n de a es 1) IF PEEK (a) AND 2^n = 2^n [/quote]

etcétera. Por ejemplo, para poner el bit 3 de la posición "a" a 0 si vale 1 (se empieza a contar desde 0 por la derecha) haríamos

[code]IF PEEK (a) AND 8 = 8 THEN POKE a, PEEK (a) AND 247[/quote]

Ya que 2^3 = 8 y 255 - 8 = 247.

josepzin

  • Administrador
  • Commodore Master
  • *****
  • Mensajes: 13630
  • Commodoreador web
    • Ver Perfil
    • Mi blog
Dudas varias...os voy a dar curro xDDD
« Respuesta #13 en: Octubre 25, 2010, 12:46:36 »
na_th_an: Impresionante!

¿Esto significa que tendremos juegos mojones en C64??
www.retroinvaders.com | www.commodoreplus.org  | josepzin.blogspot.com

na_th_an

  • Commodorero
  • **
  • Mensajes: 27
    • Ver Perfil
Dudas varias...os voy a dar curro xDDD
« Respuesta #14 en: Noviembre 03, 2010, 15:50:31 »
¡Pero si ya hay uno! Y wood está trabajando en otro :wink:

De todos modos, lo que he puesto más arriba es más "curturilla general" que otra cosa.