Mostrar Mensajes

Esta sección te permite ver todos los posts escritos por este usuario. Ten en cuenta que sólo puedes ver los posts escritos en zonas a las que tienes acceso en este momento.


Mensajes - pastbytes

Páginas: 1 ... 26 27 [28] 29 30 ... 36
406
Ensamblador / Re:Dudas en Ensamblador
« en: Julio 18, 2015, 01:50:07 »
Si no te quieres complicar la vida con las coordenadas, y puedes sacrificar un poco de suavidad en el movimiento, podrias usar en los sprites coordenadas de pixel doble, ya que por lo general los juegos suelen usar el modo multicolor de 160 puntos.
Lo que tendrias que hacer es guardar las coordenadas X de cada sprite en una posicion de memoria, y periodicamente actualizar eso en los registros del VIC, previamente multiplicando por 2 estas coordenadas. Para esto, usas la instruccion ASL, que corre a la izquierda los bits del parametro, en este caso la "variable" donde guardas la coordenada X del sprite. Esta instruccion, a diferencia de ROL, coloca automaticamente un 0 en el bit 0 (ROL coloca ahi el valor de carry), y el bit 7 que se pierde se copia a carry, por lo que despues deberias colocar el valor de carry en el bit mas significativo de la coordenada X en el registro correspondiente del VIC para ese sprite.
De esta manera al mover el sprite incrementarias 1 pixel, pero al actualizar a traves de esa rutina se incrementarian 2, internamente tu manejarias coordenadas de 0 a 159, pero en la pantalla manejarias de 0 a 319, avanzando de a 2 puntos.
Solo tendrias que tener en cuenta que para leer las coordenadas X desde el VIC deberias dividir por 2 si quieres obtenerlas tambien en un rango de 0 a 159, esto lo harias con la instruccion ROR, que rota el parametro hacia la derecha, colocando en el bit 7 el valor de carry, y el bit 0 perdido en carry, por lo que primero deberias leer el bit mas significativo de la coordenada X de ese sprite desde el VIC, y colocar este valor en carry, luego usar ROR con el registro de coordenada X de ese sprite (para dividirlo por 2 incorporando carry en el bit 7), y en carry te quedaria el bit 0 que ya no te importa.

407
Ensamblador / Re:Dudas en Ensamblador
« en: Julio 17, 2015, 13:49:33 »
Lo que quiero hacer es que cuando el ordenador lea la posicion X de los sprites #1 y #2 el ordenador sepa/reconozca si el sprite que chequea se encuentra a la izquierda o a la derecha del central,...
En ensamblador las comparaciones hacen una resta entre dos parametros, creo que en 6502 era A y el parametro que se especifique, una direccion o una constante, no recuerdo ahora cual es el orden de la resta, pero uno determina cual es mayor chequeando las banderas de cero, carry, y negativo, lo que determina si son iguales o uno es mayor que el otro.

408
Ensamblador / Re:Dudas en Ensamblador
« en: Julio 17, 2015, 13:37:50 »
     En el proximo proyecto he empezado a mover Scrolls por primera vez, es verdad que lo hago de una forma sencilla y primitiva pero bueno,..estoy empezando con ésta tecnica,..ya los tengo construidos, mostrados y se mueven y todo va bien,..pero la tecnica que he usado me ha supuesto un despelote de bytes tremendo que pienso que tiene que haber alguna forma de economizar, por mas que prueblo bucles no doy con la solucion...
No me puse a analizar demasiado el codigo pero interpreto que estas experimentando con scroll por hard, y que cada 8 puntos, o 4 o lo que convenga, haces scroll de caracteres, o que directamente lo haces de a caracter, es decir 8 puntos (o 4 en multicolor) a la vez.
No se si se puede compactar mucho el codigo, pero me parece limitado, porque no tienes libertad para imprimir lo que quieras, al usar INC o DEC necesitas tener la definicion de los caracteres contiguos en memoria. Lo ideal seria que pudieras imprimir la linea que fuera con cualquier combinacion de caracteres y tener una rutina generica para hacer scroll.
Simplificando un poco la cosa, si tuvieras una linea de 5 caracteres y sus posiciones de memoria fueran A, B, C, D y E, imprimirias la linea de 5 caracteres con lo que se te ocurra, y luego en cada paso del scroll harias:

Leer A y guardarlo en una "variable" X
Leer B y escribirlo en A
Leer C y escribirlo en B
Leer D y escribirlo en C
Leer E y escribirlo en D
Leer X y escribirlo en E

Eso se podria generalizar para cualquier linea usando algun puntero o indice, primero se guardaria el contenido de la posicion actual de memoria, que deberia ser el primer caracter de la linea, luego se haria un bucle que repitiera N-1 veces (N es el ancho de la pantalla en caracteres) el proceso de leer la siguiente direccion de memoria y guardarla en la actual, para luego incrementar el indice apuntando al siguiente caracter. Por ultimo, habria que volver e leer el primer caracter guardado, y colocarlo en la direccion de memoria actual, que a esta altura deberia ser el caracter mas a la derecha de la linea. A esa rutina solo tendrias que darle como parametro la direccion inicial de la linea, y cargar el indice, por ejemplo el registro X, a 0. Tambien deberias reservarle un byte de memoria para guardar temporalmente el primer caracter.
La misma rutina despues se puede usar para el scroll por pixel, pero en ese caso deberias trabajar en 38 columnas, para eliminar el parpadeo en los bordes.
   

409
Ensamblador / Re:Assembler - Cosas que voy aprediendo
« en: Julio 08, 2015, 11:13:44 »
Supongo que eso se podria traducir como "desenrrollando bucles", y deduzco que es una manera de ver al bucle como un rollo de papel que tiene tantas capas como iteraciones tiene el bucle, al desenrrollarlo queda un codigo mas largo con lo mismo repetido varias veces.
Y si, cuando se necesita velocidad o tiempos muy criticos o predecibles, se suele escribir el codigo repetido varias veces aunque los cambios entre una y otra repeticion sean minimos, por lo general solo parametros distintos.

410
Ensamblador / Re:Dudas en Ensamblador
« en: Julio 03, 2015, 16:30:35 »
$E50C seguramente es la misma rutina que puse al final, no mire el desensamblado de la ROM pero probablemente esta entrando directo saltandose la parte en que chequea el valor de CARRY para decidir si lees o ajustas la posicion del cursor, porque la entrada original es $E50A. La entrada correcta (para que sea compatible con todos los modelos de Commodore) seria $FFF0, pero como esta ROM no tiene una rutina para imprimir un cadena, y estas usando una del BASIC, no tiene mucho sentido mantener compatibilidad, ya que el BASIC difiere en los distintos modelos.

411
En este hilo puedes escuchar mejor la voz, en una aventura conversacional:  http://retroinvaders.com/commodoremania/foro/index.php/topic,1228.0.html
Hay varios videos, el completo de C128 es un poco largo y monotono, el de MSX que esta al final lo resume mejor, para el caso el sonido es exactamente el mismo.

412
Ensamblador / Re:Dudas en Ensamblador
« en: Julio 01, 2015, 02:00:20 »
Lo decia porque sigues un camino un tanto inusual, te has salteado algunos pasos en tu incursion en la programacion en ensamblador, normalmente lo primero que se aprende despues de las instrucciones del 6502 son las rutinas de la ROM, lo que vendria a ser la "BIOS" del C64.
En la mayoria de los ordenadores el uso es similar, se definen dispositivos asignandoles un numero, algunos son de entrada, otros de salida y otros de entrada/salida, un ejemplo de dispositivo de entrada es el teclado, de salida la pantalla, y de entrada/salida todo lo que tiene que ver con el almacenamiento. En los Commodore (PET, C16, Plus/4, C128, C64, etc.) se usa la rutina OPEN para abrir un canal hacia un dispositivo (que puede ser el teclado o la pantalla tambien), y luego hay rutinas para enviar o recibir un byte, dependiendo del dispositivo del cual se trate, se requerira llamar a otras rutinas antes de OPEN, por ejemplo si es un dispositivo de E/S hay que llamar a una rutina para especificar el nombre del archivo. Si se quiere enviar un comando a la disketera, como por ejemplo para formatear un diskette, se usa la cadena de comandos como si fuera el nombre de archivo.
Usando el numero de dispositivo de la pantalla se puede imprimir con esas mismas rutinas genericas, pero la que usaste es una rutina que enmascara todo eso y va directamente a la pantalla, aunque por debajo use las genericas.
Lo bueno de las rutinas genericas es que aprendiendo como usarlas luego haces de todo con casi el mismo codigo, solo cambiando la forma en que las usas.
Hice una busqueda rapida y aqui sale algo de las rutinas, un poco resumido:
https://www.c64-wiki.com/index.php/Kernal
Aqui detalla un poco mas el uso de cada rutina:
http://sta.c64.org/cbm64krnfunc.html
En el caso especifico de la posicion del cursor (la rutina que usaste, CHROUT, que tiene el vector de entrada en $FFD2 en todos los modelos de Commodore, imprime en la posicion actual del cursor), se ajusta o se lee usando la rutina PLOT:
PLOT   $FFF0   65520   Set or retrieve cursor location
https://www.c64-wiki.com/index.php/PLOT
Lo que no recuerdo es que registro contiene la fila y cual la columna, en esos dos sitios dice exactamente lo contrario en cada uno, ese ultimo que puse dice que X contiene la fila e Y la columna, el otro dice lo contrario, y me parece mas logico, X: columna, Y: fila.
"$FFF0   PLOT. Save or restore cursor position.
Input: Carry: 0 = Restore from input, 1 = Save to output; X = Cursor column (if Carry = 0); Y = Cursor row (if Carry = 0).
Output: X = Cursor column (if Carry = 1); Y = Cursor row (if Carry = 1).
Used registers: X, Y.
Real address: $E50A."
Justo antes de llamar a PLOT necesitas ajustar el valor de CARRY, en eso coinciden los dos sitios, si CARRY=0, al llamar a la rutina lees la posicion actual del cursor, que se carga en X e Y, si CARRY=1, necesitas cargar X e Y previamente con columnas y filas validas, y al llamar a PLOT deberia cambiarse la posicion del cursor usado por CHROUT.
Estuve buscando y no los encontre escaneados, pero puede ser que esten en alguna parte, si los encuentras te recomiendo estos libros, no son muy extensos pero tienen buena informacion, solo tengo el ultimo, el primero debe ser mas interesante en tu caso porque trata de graficos y sonido. En este tema de retrocomputacion se hablo de estos libros: http://www.retrocomputacion.com/e107_plugins/forum/forum_viewtopic.php?34771
Fijate que trae una tabla (la segunda foto que aparece) donde se explica bien el uso de cada rutina de la ROM.

413
Ensamblador / Re:Dudas en Ensamblador
« en: Junio 30, 2015, 04:43:28 »
A esta altura deberias haberte leido las rutinas del kernal, ya que ahi esta todo el sistema operativo, las rutinas para leer y grabar en dispositivos como impresoras y disketeras, tambien la impresion en pantalla, la lectura del teclado, y lo interesante es que esas rutinas son compatibles con otros modelos de Commodore, estan en las mismas direcciones en todos los modelos.
No tengo ahora a mano el manual pero creo que para esa rutina habia por lo menos una que permite colocar el cursor en la fila y columna que elijas, y otra que te devuelve la fila y columna actual.

414
Video - Monitores - Cables - Etc. / Re:chau monitor 1902
« en: Junio 05, 2015, 00:38:17 »
Me parece que el 1902A tiene ademas RGB analogico, al estilo de los 1084 (que tienen los dos tipos de RGB), el 1902 solo acepta RGBI (digital) como el que se usa en C128.

415
Pero el diseño del PET se ve mas moderno.   ;D
Y no parece un casco de moto.

416
Igual es un cable muy facil de armar, si no recuerdo mal es 1 a 1, el pin 1 con el 1, el 2 con el 2, y asi.

417
General / Re:Nuevos juegos en desarrollo
« en: Mayo 21, 2015, 00:10:57 »
Parte de la presentacion me recuerda a la version arcade de C64.

418
Commodore 65 / Mega 65 / Re:Proyecto MEGA65
« en: Mayo 09, 2015, 01:45:59 »
Para emular "por hard" hay que conocer el circuito mucho mejor que para hacerlo por soft, siempre hay que hacer ingenieria inversa para los circuitos que no se conocen del todo bien, o que tienen un comportamiento que no es igual en todos los chips, como en el caso del SID. En un circuito con FPGA los tiempos tienen que ser exactos porque se hace todo en tiempo real, en un emulador por soft no, por ejemplo hay emuladores que aprovechando que solo se generan 50 imagenes por segundo, hacen todo el proceso entre dos cuadros "al instante", justo antes de renderizar el cuadro. Es decir que no procesan las instrucciones del 6510 en tiempo real, sino que antes de dibujar el proximo cuadro, ejecutan aceleradamente todo lo que ocurrio entre el cuadro anterior y el actual, asi que los tiempos mas o menos se pueden ir corrigiendo por soft, mientras que en FPGA si uno agrega un componente de mas, alguna señal puede llegar despues de lo que deberia (porque cada componente agrega un retraso), y empezar a funcionar todo mal.
En un emulador por soft, como los componentes son virtuales, digamos que se puede hacer trampa para compensar, pero por supuesto requiere un hard mucho mas complejo.
La ventaja de usar FPGA hasta ahora era la portabilidad (por portatil) y el bajo consumo, pero con una Raspberry Pi ahora eso se esta emparejando un poco con la emulacion por soft.

419
Ensamblador / Re:Dudas en Ensamblador
« en: Mayo 01, 2015, 09:10:08 »
No hay ninguna en codebase64?
http://codebase64.org/doku.php

420
General / Re:Guía de hardware nuevo para C64
« en: Abril 29, 2015, 00:23:17 »
Creo que lo que hizo fue resucitar un proyecto de hace mas de 10 años, cuando las tarjetas flash no eran tan grandes, hoy no tiene sentido usar un disco. Si lo tendria por ejemplo en Amiga, ya que todavia las tarjetas flash son caras para los tamaños necesarios para contener todo lo que uno quisiera grabar. Y aparte del tamaño, tambien esta el asunto de la cantidad de escrituras, aun cuando haya tarjetas del tamaño adecuado a buen precio, si se usa por ejemplo en PC para correr Windows, las tarjetas flash durarian poco tiempo porque el sistema escribiria mucho, en Amiga no es tan asi pero tambien seria algo a tener en cuenta si se escribe mucho al disco.
Pero en C64 se puede decir que practicamente el contenido de la tarjeta es estatico, ya que cuando se escribe por lo general es para agregar nuevos programas y no para modificar algun archivo existente, por lo que una tarjeta flash es suficiente.

Páginas: 1 ... 26 27 [28] 29 30 ... 36