[ATARI] ¿Crear USR?

Software y Juegos para retro-computadores, bueeeno... casi puros juegos :-)
Avatar de Usuario
vitoco
Mensajes: 1970
Registrado: Lun Ene 28, 2013 5:47 pm
Contactar:

Re: [ATARI] ¿Crear USR?

Mensaje por vitoco » Dom May 24, 2015 1:30 am

Ahora que estoy en casa y accediendo el foro con el PC, voy a dar más detalles de lo que quise decir.

En primer lugar, no es buena idea hacer un programa con pantallas y menús metido en una variable del BASIC, ya que el contenido de la variable va cambiando su ubicación en cada nueva ejecución, y no se puede predecir dónde quedará la rutina USR.

He visto programas que antes de invocar al USR, cambian los bytes de la rutina que representan direcciones fijas, por ejemplo, sumándole el ADR(RUT$) a cada par LO-HI en el string que tiene las direcciones absolutas a partir de la dirección de memoria cero... es decir, el programa en el string estaba cocinado para que sea fácil de modificar para funcione correctamente. Pero insisto, es mala idea meter cosas que incluyen direcciones fijas en strings de BASIC y asumir que funcionarán así tal como está. Recuerden que un programa BASIC puro es interpretado por el cartucho y el manejo de memoria lo administra él. Con el USR estamos rompiendo las reglas y para que eso no sea problema, las rutinas deben cumplir ciertas reglas que ya expliqué, siendo la más importante que todo direccionamiento dentro del código debe ser relativo.

Pero no todo está perdido, es posible hacer algo interesante con este ejemplo, aprovechando ciertas cosas. Primero, no es necesario poner la dirección de memoria del texto en cada línea a desplegar cuando están contiguas, con lo que podemos disminuir la cantidad de bytes que requieren modificarse. Segundo, podemos decirle a la rutina USR qué lugares de sí mima modificar usando parámetros adicionales. En este caso, visualizo 2 lugares a modificar y 2 los valores respectivos para esos lugares. Pero para ello necesitamos un puntero en página cero que nos ayude.

Código: Seleccionar todo

    *=  $0600
PUNTERO = $CE
INICIO
    LDA $02C5
    STA $02C7
    LDA $02C8
    STA $02C6
    PLA
    PLA ;>CAMBIO1
    STA PUNTERO+1
    PLA ;<CAMBIO1
    STA PUNTERO
    LDY #1
    PLA ;>LINEA1
    STA (PUNTERO),Y
    DEY
    PLA ;<LINEA1
    STA (PUNTERO),Y
    PLA ;>CAMBIO2
    STA PUNTERO+1
    PLA ;<CAMBIO2
    STA PUNTERO
    LDY #1
    PLA ;>HLIST
    STA (PUNTERO),Y
    STA $0231
    DEY
    PLA ;<HLIST
    STA (PUNTERO),Y
    STA $0230
    LDA #1
LOOP BNE LOOP
LINEA1 .SBYTE " mi programa  atari "
LINEA2 .SBYTE " PROGRAMAS PARA COMPUTADORES ATARI 2015 "
LINEA3 .SBYTE "OTRO EJEMPLO PARA VE"
LINEA4 .SBYTE "    CREADO POR DOGDARK Y VITOCO 2015    "
HLIST
    .BYTE $70,$70
    .BYTE $46
CAMBIO1
    .WORD LINEA1
    .BYTE $70,$70
    .BYTE $03 ;$43
;    .WORD LINEA2
    .BYTE $70,$70,$70,$70,$70,$70,$70,$70
    .BYTE $07 ;$47
;    .WORD LINEA3
    .BYTE $70,$70,$70,$70,$70,$70,$70,$70
    .BYTE $03 ;$43
 ;   .WORD LINEA4
    .BYTE $41
CAMBIO2
    .WORD HLIST
;    *=  $02E0
;    .WORD INICIO
Ojo que dejé algunas cosas como comentario (con punto y coma) para saber a qué corresponde cada cosa que cambié.

La rutina tendría que ser invocada así:

X=USR(ADR(L$),CAMBIO1,LINEA1,CAMBIO2,HLIST)

Como el programa en BASIC no sabe a qué corresponde cada etiqueta del ASM, se lo damos precalculado:

M=ADR(L$)
X=USR(M,M+c1,M+c2,M+c3,M+c4)

donde debemos calcular las constantes restando los valores que entrega la compilación, es decir:
c1=CAMBIO1-INICIO
c2=LINEA1-INICIO
c3=CAMBIO2-INICIO
c4=HLIST-INICIO

NOTA: podría haber contado los bytes y ponerlos acá para las constantes, pero al menor cambio en la rutina, esos se moverían... prefiero explicar cómo obtener los valores y recalcularlos a manito cada vez, o bien poner las constantes con las restas tal cual al final del listado ASM para que sean calculados automáticamente y los copiemos al USR en el BASIC.

Yo no he probado esto... Lo dejo como tarea.

Ah! Algo muy importante: hay una restricción de hardware en el Atari que impide que una lista de despliegue traspase la frontera de 1K, es decir, no puede partir antes de una dirección de memoria que sea múltiplo de 1024 y terminar después de ella... (excepto si se usa la "instrucción" 65 ($41)). Como si eso fuera poco, la data a desplegar en una misma línea tampoco puede pasar por sobre una dirección que sea múltiplo de 4K. Como estamos en BASIC, no sabemos si pueda suceder eso o no, y habría que hacer malabares adicionales con DIM para evitarlo. Es por eso que insistía que no es buena idea meter un programa con pantallas en un string de BASIC para un USR :(

Avatar de Usuario
dogdark
Mensajes: 594
Registrado: Lun Mar 04, 2013 1:36 pm
Contactar:

Re: [ATARI] ¿Crear USR?

Mensaje por dogdark » Vie Jun 12, 2015 11:22 am

ahora mi consulta es la siguiente, este código podría ser utilizado para crear un preload de carga para casetes o utiliza en este caso otra estructura genérica????

Avatar de Usuario
vitoco
Mensajes: 1970
Registrado: Lun Ene 28, 2013 5:47 pm
Contactar:

Re: [ATARI] ¿Crear USR?

Mensaje por vitoco » Vie Jun 12, 2015 11:30 am

dogdark escribió:ahora mi consulta es la siguiente, este código podría ser utilizado para crear un preload de carga para casetes o utiliza en este caso otra estructura genérica????
Похоже, вы говорите по-русски, я ничего не понял. :ff:

Avatar de Usuario
dogdark
Mensajes: 594
Registrado: Lun Mar 04, 2013 1:36 pm
Contactar:

Re: [ATARI] ¿Crear USR?

Mensaje por dogdark » Vie Jun 12, 2015 11:44 am

wuajajja no entendí nada. el polaco te salió clarito pero yo hablo spanich ajaj, en la junta me explicas entonces.

Avatar de Usuario
fcatrin
Mensajes: 655
Registrado: Jue Ene 24, 2013 2:19 pm
Ubicación: Quilpué
Contactar:

Re: [ATARI] ¿Crear USR?

Mensaje por fcatrin » Vie Jun 12, 2015 3:51 pm

dogdark escribió:ahora mi consulta es la siguiente, este código podría ser utilizado para crear un preload de carga para casetes o utiliza en este caso otra estructura genérica????
Creo que si entendí esta parte.

El boot loader (ese es el nombre) tiene una estructura bien definida. Revisa este artículo:

http://franco.arealinux.cl/2014/03/carg ... odificado/

Saludos!

Avatar de Usuario
vitoco
Mensajes: 1970
Registrado: Lun Ene 28, 2013 5:47 pm
Contactar:

Re: [ATARI] ¿Crear USR?

Mensaje por vitoco » Vie Jun 12, 2015 4:13 pm

Es que no entendí la relación entre los USR y la creación de un "preload" (¿se refiere a un loader?) y los formatos de booteo... Todas son cosas distintas.

Para "crear" (programar) un loader se necesita un ensamblador... el formato de ese loader es el genérico que está bien descrito en el blog de Franco (hay que remover la info propia del XEX usando los utilitarios ya mencionados). Y para grabarlo en cinta, no se necesita USR (basta OPEN, PRINT y CLOSE), ni menos "este código"...

Y lo que escribí no estaba en polaco, sino que en ruso chamullado ;)

Avatar de Usuario
Suppawer
Mensajes: 96
Registrado: Vie Abr 26, 2013 10:02 pm

Re: [ATARI] ¿Crear USR?

Mensaje por Suppawer » Sab Jun 20, 2015 4:43 pm

dogdark escribió:ahora mi consulta es la siguiente, este código podría ser utilizado para crear un preload de carga para casetes o utiliza en este caso otra estructura genérica????
Analizando el famoso "copyspecial" by Parche, pienso que algo se podría hacer con este tema:

cps130
Spoiler: MOSTRAR
Imagen Imagen
Imagen
Y lograr otros resultados, como la pantalla que hiciste o como estos ejemplos:
Spoiler: MOSTRAR
Imagen Imagen

Avatar de Usuario
dogdark
Mensajes: 594
Registrado: Lun Mar 04, 2013 1:36 pm
Contactar:

Re: [ATARI] ¿Crear USR?

Mensaje por dogdark » Lun Jun 22, 2015 12:09 am

a eso me refería, a crear un loader para la precarga de los juegos, después de que lo conversamos con vitoco en la junta, me dejo en claro bastantes puntos, y la consulta se refería a meter el código, asm en alguna variable dentro de basic para crear la portada que estábamos haciendo anteriormente,

Imagen

entonces cual es la idea, el código que genere anteriormente y que mostré era para crear ese preload, y si servia eso para poder cargarlo junto a lo demás que tengo que ingresar para cargar el game. lo que entiendo es que ese código para cargarlo debo apuntarlo a la pagina 6 y cargarlo ahí mas el código de carga, si estoy equivocado por favor rectificarme.

PD: Franco revisare el post que me enviaste para ver el funcionamiento de carga, aunque es diferente lo que quiero, es algo más parecido a CAIN.

Avatar de Usuario
fcatrin
Mensajes: 655
Registrado: Jue Ene 24, 2013 2:19 pm
Ubicación: Quilpué
Contactar:

Re: [ATARI] ¿Crear USR?

Mensaje por fcatrin » Lun Jun 22, 2015 3:38 pm

dogdark escribió: PD: Franco revisare el post que me enviaste para ver el funcionamiento de carga, aunque es diferente lo que quiero, es algo más parecido a CAIN.
Debes enfocarte en la parte en donde se explica la estructura del boot desde cassette. Esa parte es igual para todos los loaders de cassette.

Responder