ATARI -¿Crear un cain para expansion de 800xl?

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 un cain para expansion de 800xl?

Mensaje por vitoco » Mar Feb 10, 2015 3:36 pm

SpaceInvader escribió:Increíblemente, pude hacer un wav que acepta Altirra. ¡15 minutos de carga! Pero Altirra lo carga rapidísimo, con sio patch activado.
El juego está modificado por Prisma, en la pantalla inicial dice "Copyright 1989 Prismasoft" jeje
Prisma lo modificó para ntsc, y dejó su marca en la pantalla.
Gracias por compartir el WAV.

Pasé el archivo de audio a CAS con uno de los utilitarios WAV2CAS disponibles y obtuve 4 errores de checksum, uno en el loader de Prisma (¿es alguno de los NHP del Parche?) y el resto en bloques de data del juego, no de código.

De ahí extraje el XEX. Tiene una rutina de inicialización, que en cassette requiere un pito lento, con lo que copia a la memoria bajo la RAM un kilo y medio del juego. Después sigue el resto del juego, pero al finalizar, otra rutina rescata lo que dejó bajo la ROM y lo pone a partir de la página 6, sobreescribiendo al loader de turno. Lo probé en Altirra y parte OK.

Me dieron ganas de procesarlo con mi compresor BINPAK, cuya idea entre otras es permitir la carga de juegos que chocan con el loader, así que extraje los 2 bloques de datos del juego y los concatené, creando un binario que cargaría desde la página 6 y llega casi hasta los 48KB. A partir de ese binario generé un nuevo XEX que carga desde desde los 10KB hasta los 48KB, lo cual es seguro para cualquier loader de página 6 o 7, y no requiere de pitos lentos. Al momento de partir lo descomprime. Claro que si el loader no pone un contador, menú o lo que sea, al terminar de cargar aparece basura en pantalla, pero nada grave... después de unos segundos se puede jugar.

Iba a adjuntar ambos XEX, pero creo que sería más seguro si primero comparo la versión PAL con la NTSC para ver si los 3 errores en el WAV alteraron data en el CAS y poder corregirla. Lo otro sería probar con otro utilitario conversor de WAV a CAS y ver si desaparecen los errores. Hacer cualquiera de esas cosas me tomará más tiempo...

Avatar de Usuario
SpaceInvader
Mensajes: 217
Registrado: Jue Jul 17, 2014 4:01 pm
Contactar:

Re: ATARI -¿Crear un cain para expansion de 800xl?

Mensaje por SpaceInvader » Mié Feb 11, 2015 3:20 am

Que bien Vitoco, buen trabajo con ese wav. Yo no pude hacer el cas.
En esa misma carpeta de 4shared también tengo uno de tus juegos, lo subi hace tiempo para otro atariano, está con nombre y apellido :D :
http://www.4shared.com/rar/zyPf0ge2/kar ... arada.html
Carga en Altirra, pero puede que esté corrupto.

Saludos.

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

Re: ATARI -¿Crear un cain para expansion de 800xl?

Mensaje por vitoco » Mié Feb 11, 2015 11:23 am

En realidad descarté el CAS y me quedé con la información de debug en formato HEX. Es mucho más simple procesar datos visibles en formato de texto y extraer de ahí lo medular.

Como terminé diciendo en mi último post, para ver si había diferencias entre la versión de Prisma y las PAL, seleccioné una de ellas y después de filtrarlo usando otros de mis viejos utilitarios en BASIC, pude comparar los XEX. No habían muchas diferencias, pero sí estaban agrupadas en distintas zonas de la memoria, y una de ellas muy pero muy cerca de uno de los bloques con error de checksum, otros donde claramente modificaron la gráfica de la pantalla para insertar "PRISMA" en el logo, y unos casi al final del juego donde también había errores. Modifiqué el XEX en la primera parte, que tenía cara de ser playfield, definición de jugadores o algo así y lo probé en Altirra. Jugué un partido y perdí 2-0. Me llamaron la atención los sonidos de "GOAL!!!", que termina con "tup-tup-tup"! No me dieron muchas ganas de modificar el resto del XEX porque es muy cerca de donde se supone que podrían haber parchado para que corra en NTSC.

Probé otro utilitario para convertir el WAV en HEX, y obtuve varios errores, pero ninguno en la data del XEX, así que lo extraje. Lo comparé con el XEX de ayer y sólo había 3 bytes de diferencia, así que descarté todo lo anterior y repetí el proceso con BINPAK en el nuevo ejecutable. Quedó como 6 bytes más pequeño... Adjunto ambos XEX.

Algo que me llamó siempre la atención es que cada vez que extraigo un XEX desde algún cargador (disco o cassette), usualmente tiene un byte extra a la cola. Nunca entendí por qué... y, como siempre, lo descarté.

Respecto del WAV con Karate Champion, los créditos no son míos... yo sólo hice el SITRE, y esa es la versión que le pasé a SYFCOM (Sergio Ávila)... ellos generaron la cinta con el juego. Estuve jugando un ratito... gran recuerdo 8-)
Adjuntos
Fantastic Soccer (1989)(Zeppelin Games)(NTSC)[PRISMASOFT].zip
(52 KiB) Descargado 96 veces

Marcelo-Z
Mensajes: 152
Registrado: Vie Ago 15, 2014 4:36 pm

Re: ATARI -¿Crear un cain para expansion de 800xl?

Mensaje por Marcelo-Z » Jue Feb 12, 2015 10:25 pm

una diferencia entre la version pal y la de prisma ntsc, es cuando hacer un gol, en pal aparece GOAL!! con efectos, en cambio en las versiones ntsc de un solo color, que en prisma es cafe.

si usan la version pal en ntsc correra hasta que hagan un gol. por el 2002 no sabia de este detalle, asi que cree un cas desde mi casette ninjasoft para jugar en el pc



https://dl.dropboxusercontent.com/u/152 ... SOCCER.rar

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

Re: ATARI -¿Crear un cain para expansion de 800xl?

Mensaje por dogdark » Dom Feb 15, 2015 4:28 am

ya muchachos, logre hacer que cargaran los juegos, según ejemplos entregados por ustedes, que se les agradece de antemano, después de la gran discusión que se genero con los bloques tome el ejemplo que me dió franco y el que me dio vitoco entre los dos saque algo así, obiamente modificado el código por asuntos de prueba, pero la base es la misma

Código: Seleccionar todo

1040 OPEN #1,4,129,NOM$
1050 RESTORE 10000
1060 READ XX
1070 POKE 54017,XX
1080 X=USR(ADR( ))
1090 L=L+X
1100 IF X=16384 THEN 1060
........
10000 DATA 177,161,165,169,173,193,197,201,205,225,229,233,237,129,133,137,141
con este código logre cargar hasta el bloque 8 que me permitió el disco con 900 sectores, con un archivo trucho, por lo tanto use con el read xx los pokes que necesitaba cada vez que se llenaba un bloke, funcionó todo ok, hasta que te conociiiiiiiiii lalallala, lo probé con alien ambush, y ok grabo y cargo, probe con bmx simulator cargo y grabo, ok, pero llegue el goonies y cuecccccc, el mismo error que me arroja siempre error 3 en la linea 1520 obviamente el numero de linea es diferente pero la operación es la misma x=usr(8192,L), o sea hay que picar en cain.bin, ayuda plis, cual programa puedo usar para desamblar, alguna que se pueda entender bien, y franco ahora picaremos fino con esto, por lo menos anda como antes pero usando el poke según el banco a menos que el código anterior este mal estructurado.

ojo que el codigo lo probe antes de postear, como grabador de disco a disco y me funcionó, no creo que eso este malo, pero si es así corrijamos po chiquillos. dejo adjunto el copiador que arme.
Adjuntos
cainv1.rar
(10.41 KiB) Descargado 108 veces

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

Re: ATARI -¿Crear un cain para expansion de 800xl?

Mensaje por dogdark » Mar Feb 17, 2015 7:31 am

aca encontre la info correcta de como se comporta el atari 800 256k

http://www.atarimagazines.com/v7n7/Atar ... lants.html

AsCrNet
Mensajes: 130
Registrado: Lun Mar 11, 2013 10:47 am

Re: ATARI -¿Crear un cain para expansion de 800xl?

Mensaje por AsCrNet » Mar Feb 17, 2015 12:36 pm

:mmmsi: lo probé y me funciona en el emulador leyendo desde la unidad H:

te adjunto foto y xex de la prueba.

Pd.: SITREEE ya apareció por lo que veo jojojojojojojo ya po don vitoco póngale fecha para la liberación. :lolgreen:

Saludos
Adjuntos
Goo.zip
xex que probe.
(40 KiB) Descargado 95 veces
gooni.png
gooni.png (1.97 KiB) Visto 3403 veces

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

Re: ATARI -¿Crear un cain para expansion de 800xl?

Mensaje por fcatrin » Mar Feb 17, 2015 3:44 pm

dogdark escribió: el mismo error que me arroja siempre error 3 en la linea 1520 obviamente el numero de linea es diferente pero la operación es la misma x=usr(8192,L), o sea hay que picar en cain.bin, ayuda plis, cual programa puedo usar para desamblar, alguna que se pueda entender bien, y franco ahora picaremos fino con esto, por lo menos anda como antes pero usando el poke según el banco a menos que el código anterior este mal estructurado.
Lo primero que hay que hacer es separar L en dos valores de 16-bit máximo cada uno. Pseudo código de como sería en Atari Basic separando en "low" y "high"

Código: Seleccionar todo

LH = L / 65536
LL = L - (65536*LH)
Luego el usr es x=usr(8192, LL, LH)

La segunda parte es usar estos datos en la rutina de grabación. El codigo desensamblado está en cain.bin.txt

https://www.dropbox.com/sh/d3091cy8vn02 ... RfLPa?dl=0

En ese código se guarda el parámetro L en "datalen":

Código: Seleccionar todo

	PLA
	STA datalen+1
	PLA
	STA datalen
Ahora habría que agregar otra sección igual para guardar el valor de LH en otra variable

Ésta es la sección que cambia de banco y revisa si ya se han grabado todos los datos:

Código: Seleccionar todo

	LDA 54017           ; Cambia de banco
	CLC
	ADC #4
	STA 54017
not_lastpage:
	DEC datalen         ; datalen--
	LDA datalen         ; Si llegamos al final, salta a escribir el EOF
	CMP #255
	BNE notlast
	DEC datalen+1
	LDA datalen+1
	CMP #255
	BNE notlast
No es necesario procesar el valor combinado de LH y LL como un valor de 16 bits, ya que bastan 17 bits para contar hasta 131072 y 18 bits para contar hasta 262144 (256K).

Hay otro aspecto en donde quizás no es necesario desgastarse mucho. El contador de bloques que se usa para implementar el manejo de errores (reintentar cuando falla la carga), va de 1 hasta 255, y los bloque son de 227 bytes de datos, lo que da un máximo de 57885 bytes. Después de eso, el contador se dará la vuelta así: 255.. 0... 1, etc. Eso no sería problema para el cargador, pero si justo falla la carga en ese punto, no se podrá recuperar.

Saludos

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

Re: ATARI -¿Crear un cain para expansion de 800xl?

Mensaje por dogdark » Mar Feb 17, 2015 5:57 pm

Código: Seleccionar todo

	PLA
	STA datalen+1
	PLA
	STA datalen
como estaba mirando el código completo, el datalen esta con valor 203, eso se refiere a alguna ¿posición de memoria?, al dar un nuevo valor por ejemplo a datalen2 lo dejo ¿con el mismo valor 203?

Código: Seleccionar todo


datalen = 203
datalen2=203

        PLA
	STA datalen+1
	PLA
	STA datalen
        PLA
	STA datalen2+1
	PLA
	STA datalen2
esa es mi primera pregunta, la segunda, que programa puedo usar para realizar estos cambios, por que lo hago con el mac65 y me sale error en los labels, por que 8192 es con numero y tendría que colocar antes una letra como L8192, hay algún otro programa que pueda usar para modificar el mismo código asm sin tener que modificar todo para compilar?

lo otro

perrito ascrnet, el copiador carga, en eso no tengo problema, el problema radica ahora en la salida de los datos, estuve haciendo comparativas en el altirra y me encontre con la sorpresa que los datos guardados con el emulador en modo de 130xe, los guarda todos como corresponde en sus respectivos bancos, donde después se revisa si estos datos están y efectivamente se ven, pero cuando emulas como rambo 320, haces la misma prueba cargando los bancos con datos y revisas te das cuentas que los bancos quedan vacíos, quede plop!!!. o sea, en donde quedan guardados estos datos??? buena pregunta. revisare con el atari mejor, el emulador no me esta dando buenos resultados, mucho problema.

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

Re: ATARI -¿Crear un cain para expansion de 800xl?

Mensaje por fcatrin » Mar Feb 17, 2015 6:07 pm

dogdark escribió:

Código: Seleccionar todo

	PLA
	STA datalen+1
	PLA
	STA datalen
como estaba mirando el código completo, el datalen esta con valor 203, eso se refiere a alguna ¿posición de memoria?, al dar un nuevo valor por ejemplo a datalen2 lo dejo ¿con el mismo valor 203?

Código: Seleccionar todo


datalen = 203
datalen2=203

	PLA
	STA datalen+1
	PLA
	STA datalen
	PLA
	STA datalen2+1
	PLA
	STA datalen2
Sí, es una dirección de memoria. Se ocupan 2 bytes para representar un valor de 16 bits (2 * 8 bits). Por lo tanto se ocupa la dirección de memoria 203 y 204 (datalen y datalen+1 respectivamente).

No puedes usar la misma dirección porque vas a sobre-escribir el valor que ya cargaste, tienes que buscar otra dirección libre. Ojo que si ves el programa, la 205 y 207 ya están ocupadas.

Lo otro que te decía es que no necesitas el número completo para LH, ya que como mucho ocuparás 2 bits. Entonces bastaría con

Código: Seleccionar todo

	PLA
	STA datalen+1
	PLA
	STA datalen
	PLA  ; descartamos este valor
	PLA
	STA datalen2
Con eso te ahorrarás código al momento de manipular datalen2 también.
dogdark escribió:esa es mi primera pregunta, la segunda, que programa puedo usar para realizar estos cambios, por que lo hago con el mac65 y me sale error en los labels, por que 8192 es con numero y tendría que colocar antes una letra como L8192, hay algún otro programa que pueda usar para modificar el mismo código asm sin tener que modificar todo para compilar?
Tendrás que modificar el código de todas maneras, ya que ese código lo desensamblé a mano, no responde a ningún estándar.

Saludos

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

Re: ATARI -¿Crear un cain para expansion de 800xl?

Mensaje por dogdark » Mar Feb 17, 2015 9:14 pm

el código en asm lo deje así, aunque me falta por eso pregunto

Código: Seleccionar todo



; Codigo usado por CAIN para grabar un XEX en cassette
; Los bloques son de 221 bytes cada uno
; Por parámetro se recibe el largo total de bytes a grabar
; Cada bloque está en $2400, el formato es : 85, 85, blockno, data
; blockno = 255 indica EOF.  Ultimo byte = largo de ese bloque
;
; El formato ejecutable es :   block[] donde block = [255, 255, start, len, data]
; Al terminar cada bloque, se ejecuta el vector $226 si es que hay algo ahí


buffer   = $2400
writepos = 61
buflen   = 62
blockno  = 207
bufptr   = 205
firstpage = 64
lastpage  = 128
datalen   = 203
datalen2   = 209
blockstart = $23FA
blockend   = $23FC
delayflag  = $23FF

	*=$2400

L8192
	PLA
	LDA #220
	STA 54017
	PLA
	STA datalen+1
	PLA
	STA datalen
	PLA  ;descartamos este valor
	PLA
	STA datalen2
L8204
	LDA #0
	STA writepos
	STA delayflag
	LDA #217
	STA buflen
	LDA #1
	STA blockno
	LDA #0
	STA bufptr
	LDA #firstpage
	STA bufptr+1
	LDA #85     ; Write carrier
	STA buffer
	STA buffer+1
; Punto de partida de grabación de bloque
nextexeblock
	LDY #0
	LDA (bufptr),Y
	STA blockstart
	JSR writebyte
	LDA (bufptr),Y
	STA blockstart+1
	JSR writebyte
; Busca hasta encontrar una dirección que no sea $FFFF
	LDA blockstart
	AND blockstart+1
	CMP #255
	BEQ nextexeblock
; Encontró el inicio de un bloque
	LDY #0
	LDA (bufptr),Y
	STA blockend
	JSR writebyte
	LDY #0
	LDA (bufptr),Y
	STA blockend+1
	JSR writebyte
putbyte                  ; 8285
	LDY #0
	LDA (bufptr),Y
	JSR writebyte
	LDA blockstart
	CMP #226
	BNE notexecblock
	LDA blockstart+1
	CMP #2
	BNE notexecblock
; Encontró un bloque ejecutable.  Alarga pausa?
	LDA #240
	STA delayflag
notexecblock
	LDA blockstart
	CMP blockend
	BNE notendofblock
	LDA blockstart+1
	CMP blockend+1
; Esto quedó así por ser un parche seguramente.  Problemas de branch de más de 128 bytes de distancia
notendofblock
	NOP
	NOP
	JMP L8490

writebyte
	PHA
	INC bufptr
	BNE notlastpage
	INC bufptr+1
	LDA bufptr+1       ; Revisa si llegamos al final de un banco de 130XE
	CMP #lastpage
	BNE notlastpage
	LDA #firstpage
	STA bufptr+1
	LDA 54017           ; Cambia de banco
	CLC
	ADC #4
	STA 54017
notlastpage
	DEC datalen         ; datalen--
	LDA datalen         ; Si llegamos al final, salta a escribir el EOF
	CMP #255
	BNE notlast
	DEC datalen+1
	LDA datalen+1
	CMP #255
	BNE notlast
	PLA
	JMP writeeof
notlast
	PLA
	LDX writepos
	INC writepos
	STA buffer+3,X
	CPX buflen
	BEQ buffercomplete
	RTS
buffercomplete             ; Se llenó el buffer.  Escribe el numero del bloque y pide grabar
	LDA blockno
	STA buffer+2
	JSR writeblock
	BPL updateCounter
	PLA
	PLA
	RTS
; Aqui actualiza el contador en pantalla
; La ubicación del contador es parchado desde CAIN.BAS (lineas 285 y 295)

updateCounter
	LDX #2
NEXTDIGIT
	DEC $0,X  ; SCRL/SCRH
	LDA $0,X  ; SCRL/SCRH
	CMP #'0'-1
	BNE NOTZERO
	LDA #'9'
	STA $0,x  ; SCRL/SCRH
	DEX
	BPL NEXTDIGIT
NOTZERO
	LDA #0            ; Reinicia buffer
	STA writepos
	INC blockno       ; Incrementa contador de bloques
	LDA delayFlag     ; Revisa si es que hay que hacer algun delay especial en IRG
	BEQ nodelay
	LDA #52           ; Deja avanzar la cinta por 4 segundos para dar tiempo de
	STA 54018         ; detener y reiniciar el motor sin perder datos
	LDA #240          ; Se usa al ejecutar un bloque
	ADC 20
sleep
	CMP 20
	BNE sleep
nodelay
	LDA #0
	STA delayFlag
	RTS
writeeof                 ;  8452
	PLA
	PLA
	LDA #255           ; Numero de bloque = 255 indica EOF
	STA buffer+2
	LDA writepos       ; Ultima posicion del buffer indica el largo de registro a considerar
	STA buffer+220
writeblock
	LDX #11
iocopy
	LDA IOREG,X
	STA $300,X
	DEX
	BPL iocopy
	JMP 58457

; Cada registro se graba desde la ubicacion 0, 36 ($2400) el largo es siempre 221 bytes
IOREG 	
	.BYTE 96, 0, 87, 128, 0, 36, 35, 0, 221, 0, 0, 128

L8490   
	BNE nojump
	JMP nextexeblock
nojump
	INC blockstart

	BNE nopage
	INC blockstart+1
nopage
	JMP putbyte

cambie los label de los que estaban con numero por ejemplo 8192 por L8192

agregue el PLA que me dió franco

ratifique todo que los label estuvieran con sus llamados, me quedó con solo dos errores

202 lines assembled, 2 assembly error(s).

Código: Seleccionar todo


                   NEXTDIGIT
24d6: d6 00        	DEC $0,X  ; SCRL/SCRH
24d8: b5 00        	LDA $0,X  ; SCRL/SCRH
24da: c9 00        	CMP #'0'-1
 -ERROR! D:\atari\copiadores\cainIV\asm\cainbin.asx line 150: can't evaluate expression
24dc: d0 07        	BNE NOTZERO
24de: a9 00        	LDA #'9'
 -ERROR! D:\atari\copiadores\cainIV\asm\cainbin.asx line 152: can't evaluate expression
24e0: 95 00        	STA $0,x  ; SCRL/SCRH
24e2: ca           	DEX

ahí quede :nu: , lo bueno que solo son dos errores aun me falta agregar la validacion del LH que debo enviar

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

Re: ATARI -¿Crear un cain para expansion de 800xl?

Mensaje por fcatrin » Mar Feb 17, 2015 9:23 pm

Ok, esa es la parte cuando está decrementando el contador.

Básicamente decrementa un digito y ve el nuevo valor está más abajo que el cero. Si ese es el caso, pone un 9 para comenzar de nuevo ese digito

Código: Seleccionar todo

3
2
1
0
9
8
etc.
Debes reemplazar el '0' y el '9' por los valores internos de esos caracteres

Saludos

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

Re: ATARI -¿Crear un cain para expansion de 800xl?

Mensaje por dogdark » Vie Feb 20, 2015 9:29 am

hice la siguiente modificacióon al cain.bin no se si estará bien o no, agregue el LH como PROXLH

Código: Seleccionar todo


notlastpage
	DEC datalen         ; datalen--
	LDA datalen         ; Si llegamos al final, salta a escribir el EOF
	CMP #255
	BNE notlast
	DEC datalen+1
	LDA datalen+1
	CMP #255
	BNE notlast
	PLA
	JMP PROXLH
PROXLH
	DEC datalen2
	LDA datalen2
	CMP #255
	BNE notlast
	DEC datalen2+1
	LDA datalen2+1
	CMP #255
	BNE notlast
	PLA
	JMP writeeof
notlast
	PLA
	LDX writepos
	INC writepos
	STA buffer+3,X
	CPX buflen
	BEQ buffercomplete
	RTS

el código asm me da 0 error

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

Re: ATARI -¿Crear un cain para expansion de 800xl?

Mensaje por vitoco » Vie Feb 20, 2015 10:12 am

Me perdí... ¿qué representa datalen2? ¿Estás definiendo un nuevo registro para archivos de más de 64K?

Creo que lo que debes hacer es que el mismo registro datalen tenga 3 bytes en lugar de 2 (igual que el reloj interno del Atari). Algo así:

Código: Seleccionar todo

datalen .BYTE 0,0,0
El código para decrementar ese contador, manteniendo la notación, sería:

Código: Seleccionar todo

notlastpage
   DEC datalen         ; datalen--
   LDA datalen         ; Si llegamos al final, salta a escribir el EOF
   CMP #255
   BNE notlast
   DEC datalen+1
   LDA datalen+1
   CMP #255
   BNE notlast
   DEC datalen+2
   LDA datalen+2
   CMP #255
   BNE notlast
El JMP que pusiste está demás...

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

Re: ATARI -¿Crear un cain para expansion de 800xl?

Mensaje por dogdark » Vie Feb 20, 2015 10:37 am

lo que pasó vitoco es que franco me dijo que tenia que pasar los datos en dos partes en LL (low)y LH(high) en 16b. por cada uno, entonces resumo

lo primero es que estamos modificando el cain.bin donde sumamos una nueva variable como datalen2, ya que datalen toma los bytes cargados, entonces como estabamos con el problema que se sigue sobreescribiendo la información o no la esta grabando en su salida, franco me dijo que habia que hacer lo siguiente

Código: Seleccionar todo


LH = L / 65536
LL = L - (65536*LH)

y en otra parte postee que yo habia tomado tu información para generar ese poke 54017 con los bloques directos

Código: Seleccionar todo

1040 OPEN #1,4,129,NOM$
1050 RESTORE 10000
1060 READ XX
1070 POKE 54017,XX
1080 X=USR(ADR( ))
1090 L=L+X
1100 IF X=16384 THEN 1060
........
10000 DATA 177,161,165,169,173,193,197,201,205,225,229,233,237,129,133,137,141
que tampoco no se si estaba bien o no, entonces ahora me enrede

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

Re: ATARI -¿Crear un cain para expansion de 800xl?

Mensaje por vitoco » Vie Feb 20, 2015 11:53 am

dogdark escribió:

Código: Seleccionar todo

LH = L / 65536
LL = L - (65536*LH)
Eso está bien, ya que afecta al lado del BASIC, en el USR más específicamente para evitar el error 3, pero en la rutina ASM puedes tomar ambos parámetros y asignarlos a una misma variable de 3 bytes. No necesitas el 4to byte porque LH nunca será superior a 255, ni siquiera a 4 (con eso ya puedes representar 256K).

El pedacito para leer esos 2 parámetros del USR quedaría así:

Código: Seleccionar todo

  PLA     ; MSB de LL (L original)
  STA datalen+1
  PLA     ; LSB de LL (L original)
  STA datalen
  PLA     ; MSB de LH descartado, siempre 0
  PLA     ; LSB de LH
  STA datalen+2
Por eso te digo que bastan sólo 3 bytes (24 bits) para una misma variable L (la original) en el lado del binario de CAIN.

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

Re: ATARI -¿Crear un cain para expansion de 800xl?

Mensaje por fcatrin » Vie Feb 20, 2015 11:57 am

Complementando lo que dice Vitoco, en el código original datalen está almacenado en la página 0, posición 203. Ahi no puedes usar un tercer byte porque sobre-escribirías la posición 205 que se usa para otra cosa.

Pero, no es necesario que esa variable esté en la página cero, puedes ponerla en cualquier parte como indica Vitoco.

Saludos

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

Re: ATARI -¿Crear un cain para expansion de 800xl?

Mensaje por vitoco » Vie Feb 20, 2015 2:35 pm

fcatrin escribió:Complementando lo que dice Vitoco, en el código original datalen está almacenado en la página 0, posición 203. Ahi no puedes usar un tercer byte porque sobre-escribirías la posición 205 que se usa para otra cosa.

Pero, no es necesario que esa variable esté en la página cero, puedes ponerla en cualquier parte como indica Vitoco.
No he visto el código completo de CAIN, pero si no quieres mover datalen desde la dirección 203 y tampoco puedes mover la variable que está en la 205 hacia otro lado, puedes poner sólo el tercer byte en cualquier otro lado y llamarlo "datalen2", y usar eso donde debiera decir "datalen+2". Da lo mismo que la variable L queda repartida... mantener los bytes juntos es sólo por comodidad y claridad.

Con todo esto, me dieron ganas de hacer lo mismo con SITRE. Estuve escarbando mis discos y encontré algo de código fuente en ASM (MAC/65) que se asemeja a lo que está en forma de strings en el grabador BASIC. Estuve comparando y encontré diferencias mínimas producto de ajustes en caliente que se hacen en el código final (en vez de tener que recompilar todos y hacer las conversiones correspondientes). Sobre eso actualizado quiero evaluar la modificación para que pueda grabar más de 64K en cinta, pero a priori veo que los cambios no serían pocos, ni en el loader ni en el grabador. Los mantendré informados.

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

Re: ATARI -¿Crear un cain para expansion de 800xl?

Mensaje por vitoco » Vie Feb 20, 2015 11:36 pm

vitoco escribió:Con todo esto, me dieron ganas de hacer lo mismo con SITRE.
Después de revisar un tanto, decidí poner un hilo propio para no ensuciar éste... Pase a ver. :mrgreen:

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

Re: ATARI -¿Crear un cain para expansion de 800xl?

Mensaje por dogdark » Sab Feb 21, 2015 9:36 pm

de tanto enredo con los valores deje asi de esta manera el datalen2

Código: Seleccionar todo

2830 NOTLASTPAGE
2840     DEC DATALEN ; DATALEN
2850     LDA DATALEN ; SI LLEGAMOS AL
2860 ; FINAL, SALTA A ESCRIBIR EL EOF
2870     CMP #255
2880     BNE NOTLAST
2890     DEC DATALEN+1
2900     LDA DATALEN+1
2910     CMP #255
2920     BNE NOTLAST
2930     DEC DATALEN2+1
2940     LDA DATALEN2+1
2950     CMP #255
3050     PLA
3060     JMP WRITEEOF
el datalen2 esta en la posición de memoria 209, pero no se si quedo bien o no, solo sigo recorriendo el código hacia abajo si en el caso que datalen este lleno siga con el datalen2

el código completo es este, que es la segunda duda que tengo por que lo incorporo en la dirección $2400 como dice que empieza, me parece que el inicio debería ser en alguna posición libre como la $4000 pero la deje en $2400 por defecto

Código: Seleccionar todo


PAGE 1    
                                                                 



                0100 ; SAVE#D:CAINBIN.ASM
                0110 ; ASM,#P:,#D:CAIN.BIN
                0120 ;                              
                0130 ;       COPIADOR CAIN IV       
                0140 ;     MODIFICADO POR FRANCO    
                0150 ;   CATRIN, VITOCO Y DOGDARK   
                0160 ;     PROYECTO REALIZADO EN    
                0170 ;   www.retronia.cl/foro/view  
                0180 ;   topic.php?f=7$t=1740       
                0190 ;    para computadores atari   
                0200 ;    130XE t expansion 256K    
                0210 ;             2015             
                0220 ;                              
                0230 ;
                0240 ; Codigo usado por CAIN para
                0250 ; grabar un xex en cassette
                0260 ;
                0270 ; Los bloques son de 221 bytes
                0280 ; cada uno. Por parametro se
                0290 ; recibe el largo total de bytes
                0300 ; a grabar. Cada bloque esta en
                0310 ; $2400, el formato es : 85, 85,
                0320 ; blockno, data. BLOCKNO = 255
                0330 ; indica EOF. ultimo byte=largo
                0340 ; de ese bloque. El formato
                0350 ; ejecutable es :    BLOCK[]
                0360 ; donde block=[255, 255, start
                0370 ; len, data]. Al terminar cada
                0380 ; bloque, se ejecuta el vector
                0390 ; $226 si es que hay algo ahi.
                0500 ;
    =2400       0510 BUFFER = $2400
    =003D       0520 WRITEPOS = 61
    =003E       0530 BUFLEN = 62
    =00CF       0540 BLOCKNO = 207
    =00CD       0550 BUFPTR = 205
    =0040       0560 FIRSTPAGE = 64
    =0080       0570 LASTPAGE = 128
    =00CB       0580 DATALEN = 203
    =00D1       0590 DATALEN2 = 209
    =23FA       0600 BLOCKSTART = $23FA
    =23FC       0610 BLOCKEND = $23FC
    =23FF       0620 DELAYFLAG = $23FF
0000            0700     *=  $2400
                1000 ;
                1010 ; ****** L8192 ******
                1020 ;
2400            1030 L8192
2400 68         1040     PLA 
2401 A9DC       1050     LDA #220
2403 8D01D3     1060     STA 54017
2406 68         1070     PLA 
2407 85CC       1080     STA DATALEN+1
2409 68         1090     PLA 
240A 85CB       1100     STA DATALEN
240C 68         1110     PLA         ;DESCARTE VALOR
240D 68         1120     PLA 
240E 85D1       1130     STA DATALEN2
?PAGE 2    
                                                                 



                1300 ;
                1310 ; ****** L8204 ******
                1320 ;
2410            1330 L8204
2410 A900       1340     LDA #0
2412 853D       1350     STA WRITEPOS
2414 8DFF23     1360     STA DELAYFLAG
2417 A9D9       1370     LDA #217
2419 853E       1380     STA BUFLEN
241B A901       1390     LDA #1
241D 85CF       1400     STA BLOCKNO
241F A900       1410     LDA #0
2421 85CD       1420     STA BUFPTR
2423 A940       1430     LDA #FIRSTPAGE
2425 85CE       1440     STA BUFPTR+1
2427 A955       1450     LDA #85     ; WRITE CARRIER
2429 8D0024     1460     STA BUFFER
242C 8D0124     1470     STA BUFFER+1
                1480 ; PUNTO DE PARTIDA DE GRABACION
                1490 ; DE BLOQUE
                1500 ;
                1600 ;
                1610 ; ****** NEXTEXEBLOCK ******
                1620 ;
242F            1630 NEXTEXEBLOCK
242F A000       1640     LDY #0
2431 B1CD       1650     LDA (BUFPTR),Y
2433 8DFA23     1660     STA BLOCKSTART
2436 208924     1670     JSR WRITEBYTE
2439 B1CD       1680     LDA (BUFPTR),Y
243B 8DFB23     1690     STA BLOCKSTART+1
243E 208924     1700     JSR WRITEBYTE
                1710 ; BUSCA HASTA ENCONTRAR UNA
                1720 ; DIRECCION DE QUE NO SEA $FFFF
2441 ADFA23     1730     LDA BLOCKSTART
2444 2DFB23     1740     AND BLOCKSTART+1
2447 C9FF       1750     CMP #255
2449 F0E4       1760     BEQ NEXTEXEBLOCK
                1770 ; ENCONTRO EL INICIO DE UN BLO
244B A000       1780     LDY #0
244D B1CD       1790     LDA (BUFPTR),Y
244F 8DFC23     1800     STA BLOCKEND
2452 208924     1810     JSR WRITEBYTE
2455 A000       1820     LDY #0
2457 B1CD       1830     LDA (BUFPTR),Y
2459 8DFD23     1840     STA BLOCKEND+1
245C 208924     1850     JSR WRITEBYTE
                1900 ;
                1910 ; ****** PUTBYTE ******
                1920 ;
245F            1925 PUTBYTE
245F A000       1930     LDY #0
2461 B1CD       1940     LDA (BUFPTR),Y
2463 208924     1950     JSR WRITEBYTE
2466 ADFA23     1960     LDA BLOCKSTART
2469 C9E2       1970     CMP #226
246B D00C       1980     BNE NOTEXECBLOCK
246D ADFB23     1990     LDA BLOCKSTART+1
?PAGE 3    
                                                                 



2470 C902       2000     CMP #2
2472 D005       2010     BNE NOTEXECBLOCK
                2020 ; ENCONTRO UN BLOQUE EJECUTABLE
                2030 ; ALARGA PAUSA?
2474 A9F0       2050     LDA #240
2476 8DFF23     2060     STA DELAYFLAG
                2200 ;
                2210 ; ****** NOTEXECBLOCK ******
                2220 ;
2479            2230 NOTEXECBLOCK
2479 ADFA23     2240     LDA BLOCKSTART
                2250 ; BLOQUE Y PIDE GRABAR
247C D006       2260     BNE NOTENDOFBLOCK
247E ADFB23     2270     LDA BLOCKSTART+1
2481 CDFD23     2280     CMP BLOCKEND+1
                2290 ;
                2300 ; ESTO QUEDO ASI POR SER UN
                2310 ; PARCHE SEGURAMENTE. PROBLEMAS
                2320 ; DE BRANCH DE MAS DE 128 BYTES
                2330 ; DE DISTANCIA
                2340 ;
                2400 ;
                2410 ; ****** NOTENDOFBLOCK ******
                2420 ;
2484            2430 NOTENDOFBLOCK
2484 EA         2440     NOP 
2485 EA         2450     NOP 
2486 4C2E25     2460     JMP L8490
                2500 ;
                2510 ; ****** WRITEBYTE ******
                2520 ;
2489            2530 WRITEBYTE
2489 48         2540     PHA 
248A E6CD       2550     INC BUFPTR
248C D015       2560     BNE NOTLASTPAGE
248E E6CE       2570     INC BUFPTR+1
2490 A5CE       2580     LDA BUFPTR+1 ; REVISA SI
                2590 ; LLEGAMOS AL FINAL DE UN BANCO
                2600 ; DE 130XE
2492 C980       2610     CMP #LASTPAGE
2494 D00D       2620     BNE NOTLASTPAGE
2496 A940       2630     LDA #FIRSTPAGE
2498 85CE       2640     STA BUFPTR+1
249A AD01D3     2650     LDA 54017   ; CAMBIA DE
                2660 ; BANCO
249D 18         2670     CLC 
249E 6904       2680     ADC #4
24A0 8D01D3     2690     STA 54017
                2800 ;
                2810 ; ****** NOTLASTPAGE ******
                2820 ;
24A3            2830 NOTLASTPAGE
24A3 C6CB       2840     DEC DATALEN ; DATALEN
24A5 A5CB       2850     LDA DATALEN ; SI LLEGAMOS AL
                2860 ; FINAL, SALTA A ESCRIBIR EL EOF
24A7 C9FF       2870     CMP #255
24A9 D014       2880     BNE NOTLAST
24AB C6CC       2890     DEC DATALEN+1
?PAGE 4    
                                                                 



24AD A5CC       2900     LDA DATALEN+1
24AF C9FF       2910     CMP #255
24B1 D00C       2920     BNE NOTLAST
24B3 C6D2       2930     DEC DATALEN2+1
24B5 A5D2       2940     LDA DATALEN2+1
24B7 C9FF       2950     CMP #255
24B9 D004       2960     BNE NOTLAST
24BB 68         3050     PLA 
24BC 4C0825     3060     JMP WRITEEOF
                3100 ;
                3110 ; ****** NOTLAST ******
                3120 ;
24BF            3130 NOTLAST
24BF 68         3140     PLA 
24C0 A63D       3150     LDX WRITEPOS
24C2 E63D       3160     INC WRITEPOS
24C4 9D0324     3170     STA BUFFER+3,X
24C7 E43E       3180     CPX BUFLEN
24C9 F001       3190     BEQ BUFFERCOMPLETE
24CB 60         3200     RTS 
                3300 ;
                3310 ; ****** BUFFERCOMPLETE ******
                3320 ;
24CC            3330 BUFFERCOMPLETE ;  SE LLENO EL
                3340 ; BUFFER. ESCRIBE EL NUMERO DEL
                3350 ; BLOQUE Y PIDE GRABAR
24CC A5CF       3360     LDA BLOCKNO
24CE 8D0224     3370     STA BUFFER+2
24D1 201425     3380     JSR WRITEBLOCK
24D4 1003       3390     BPL UPDATECOUNTER
24D6 68         3400     PLA 
24D7 68         3410     PLA 
24D8 60         3420     RTS 
                3430 ; AQUI ACTUALIZA EL CONTADOR EN
                3440 ; PANTALLA, LA UBICACION DEL
                3450 ; CONTADOR ES PARCHADO DESDE
                3460 ; CAIN.BAS (LINEAS 285 Y 295)
                3600 ;
                3610 ; ****** UPDATECOUNTER ******
                3620 ;
24D9            3630 UPDATECOUNTER
24D9 A202       3640     LDX #2
                3800 ;
                3810 ; ****** NEXTDIGIT ******
                3820 ;
24DB            3830 NEXTDIGIT
24DB D600       3840     DEC $00,X   ;SCRL/SCRH
24DD B500       3850     LDA $00,X   ;SCRL/SCRH
24DF C9FF       3860     CMP #0-1
24E1 D007       3870     BNE NOTZERO
24E3 A909       3880     LDA #9
24E5 9500       3890     STA $00,X   ;SCRL/SCRH
24E7 CA         3900     DEX 
24E8 10F1       3910     BPL NEXTDIGIT
                4100 ;
                4110 ; ****** NOTZERO ******
                4120 ;
24EA            4130 NOTZERO
?PAGE 5    
                                                                 



24EA A900       4140     LDA #0      ;REINICIA BUFFER
24EC 853D       4150     STA WRITEPOS
24EE E6CF       4160     INC BLOCKNO ;INCREMENTA
                4170 ; CONTADOR DE BLOQUES
24F0 ADFF23     4180     LDA DELAYFLAG ; REVISA SI ES
                4190 ; QUE HAY QUE HACER ALGUN DELAY
                4200 ; ESPECIAL EN IRG
24F3 F00D       4210     BEQ NODELAY
24F5 A934       4220     LDA #52     ;DEJA AVANZAR LA
                4230 ; CINTA POR 4 SEGUNDOS PARA DAR
                4240 ; TIEMPO DE
24F7 8D02D3     4250     STA 54018   ; DETENER Y
                4260 ; REINCIAR EL MOTOR SIN PERDER
                4270 ; DATOS
24FA A9F0       4280     LDA #240    ;SE USA AL EJECUTAR
                4290 ; UN BLOQUE
24FC 6514       4300     ADC 20
                4500 ;
                4510 ; ****** SLEEP ******
                4520 ;
24FE            4530 SLEEP
24FE C514       4540     CMP 20
2500 D0FC       4550     BNE SLEEP
                4700 ;
                4710 ; ****** NODELAY ******
                4720 ;
2502            4730 NODELAY
2502 A900       4740     LDA #0
2504 8DFF23     4750     STA DELAYFLAG
2507 60         4760     RTS 
                4900 ;
                4910 ; ****** WRITEEOF ******
                4920 ;
2508            4930 WRITEEOF ;      L8452
2508 68         4940     PLA 
2509 68         4950     PLA 
250A A9FF       4960     LDA #255    ; NUMERO DE
                4970 ; BLOQUE = 255 INDICA EOF
250C 8D0224     4980     STA BUFFER+2
250F A53D       4990     LDA WRITEPOS ;   ULTIMA
                5000 ; POSICION DEL BUFFER INDICA EL
                5010 ; LARGO DE REGISTRO A CONSIDERAR
2511 8DDC24     5020     STA BUFFER+220
                5200 ;
                5210 ; ****** WRITEBLOCK ******
                5220 ;
2514            5230 WRITEBLOCK
2514 A20B       5240     LDX #11
                5400 ;
                5410 ; ****** IOCOPY ******
                5420 ;
2516            5430 IOCOPY
2516 BD2225     5440     LDA IOREG,X
2519 9D0003     5450     STA $0300,X
251C CA         5460     DEX 
251D 10F7       5470     BPL IOCOPY
251F 4C59E4     5480     JMP 58457
                5490 ; CADA REGISTRO SE GRABA DESDE
?PAGE 6    
                                                                 



                5500 ; LA UBICACION 0, 36 ($2400) EL
                5510 ; LARGO ES SIEMPRE 221 BYTES
                5700 ;
                5710 ; ****** IOREG ******
                5720 ;
2522            5730 IOREG
2522 60005780   5740     .BYTE 96,0,87,128,0,36,35
2526 002423
2529 00DD0000   5750     .BYTE 0,221,0,0,128
252D 80
                5900 ;
                5910 ; ****** L8490 ******
                5920 ;
252E            5930 L8490
252E D003       5940     BNE NOJUMP
2530 4C2F24     5950     JMP NEXTEXEBLOCK
                6100 ;
                6110 ; ****** NOJUMP ******
                6120 ;
2533            6130 NOJUMP
2533 EEFA23     6140     INC BLOCKSTART
2536 D003       6150     BNE NOPAGE
2538 EEFB23     6160     INC BLOCKSTART+1
                6300 ;
                6310 ; ****** NOPAGE ******
                6320 ;
253B            6330 NOPAGE
253B 4C5F24     6340     JMP PUTBYTE

*** ASSEMBLY ERRORS: 0   19608 BYTES FREE
?PAGE 7    
SYMBOLS                                                          




=23FC BLOCKEND      =00CF BLOCKNO       =23FA BLOCKSTART    =2400 BUFFER        
 24CC BUFFERCOMPLETE                    =003E BUFLEN        =00CD BUFPTR        
=00CB DATALEN       =00D1 DATALEN2      =23FF DELAYFLAG     
=0040 FIRSTPAGE     
 2516 IOCOPY         2522 IOREG         
 2400 L8192          2410 L8204          252E L8490         =0080 LASTPAGE      
 24DB NEXTDIGIT      242F NEXTEXEBLOCK   2502 NODELAY        2533 NOJUMP        
 253B NOPAGE         2484 NOTENDOFBLOCK  2479 NOTEXECBLOCK   24BF NOTLAST       
 24A3 NOTLASTPAGE    24EA NOTZERO       
 245F PUTBYTE       
 24FE SLEEP         
 24D9 UPDATECOUNTER 
 2514 WRITEBLOCK     2489 WRITEBYTE      2508 WRITEEOF      =003D WRITEPOS      


Responder