(ATARI) consulta assembler mac65

Software y Juegos para retro-computadores, bueeeno... casi puros juegos :-)
Avatar de Usuario
dogdark
Mensajes: 594
Registrado: Lun Mar 04, 2013 1:36 pm
Contactar:

(ATARI) consulta assembler mac65

Mensaje por dogdark » Mié Mar 04, 2015 7:01 am

se me ocurrió ponerme a estudiar asm, e hecho varias cosas, pero lo que me tiene complicado es que quiero sumar dos números o sea

Código: Seleccionar todo


A=0
M=16

A=A+1
cual es la idea porque mire por todos lados, por eso pregunto acá.

Código: Seleccionar todo

A=0
M=16
      
     *=$4000

INICIO
      LDA #A
      ADC #1
      CMP #M
      BEQ SALGO
      JMP INICIO

SALGO
      LDA #$49
      JSR $2B0
      RTS
No quiero sumar bytes si no que numeros, que esta mal hechorrrrrr, es para hacer una validaciones de como si fuera un for then, capichi??? se agradece

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

Re: (ATARI) consulta assembler mac65

Mensaje por fcatrin » Mié Mar 04, 2015 9:48 am

El código que hiciste se ve correcto.
Va desde 0 y cuando llega a 16 se sale del ciclo, continuando en "SALGO"

Qué esperabas que ocurriera exactamente?

Saludos

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

Re: (ATARI) consulta assembler mac65

Mensaje por dogdark » Mié Mar 04, 2015 11:28 am

bueno lo estaba haciendo con el editor plus, la idea preliminar es para realizar un contador, para ver los campos de memoria existente en el atari 800, como el copiador sitre y que me entregue el valor, por ejemplo si es un 130xe tendría que ser que a=5 y si es un 800 que a=13, con esto hago la funcionalidad del for para realizar el read xx así tomo el total de a y lo multiplico * 16636 y luego lo imprimo en pantalla. ya te imaginaras en los que estoy jijijij, me e metido de cabeza en los manuales, y ya entendí lo de hi-bytes y lo-bytes ya creo que tengo claro mas o menos de donde salia ese famoso bit 4 que me tenia loco, en cuanto al código que muestro,no me salta o sea se queda realizando el loop indefinido y no compara que M sea igual a A para realizar el branch (jajaj usando mejor lenguaje mas hadock) ya con el BEQ como deberían ser iguales salta, te adjunto lo que estoy haciendo para que le eches un vistazo, va el xex mas los códigos del editor.
Adjuntos
ASM.rar
código asm
(2.78 KiB) Descargado 113 veces

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

Re: (ATARI) consulta assembler mac65

Mensaje por vitoco » Mié Mar 04, 2015 12:19 pm

No entendí el todo, pero vamos sacando dudas:

- En primer lugar, la suma ADC es con "carry", es decir, suma el acumulador con la dirección de memoria indicada y con el bit C del registro de estados de la CPU, todo a la vez. El bit C se pone en uno cuando la suma de dos bytes da como resultado un número mayor que 255, o sea, un resultado de 9 bits... C representa el bit más significativo. Por lo tanto, siempre se debe limpiar ese bit antes de comenzar una suma, lo que se hace con la intrucción CLC. Cuando sumas números de más de un byte, el C representa ese "uno" adicional que uno escrbe en el papel y que se debe sumar en las decenas cuando en las unidades sumaste más de 9. Ojo que para restar con SBC, el carry C debe ser iniciado en 1 con la instrucción SEC.

- En segundo lugar, si vas a sumar de a uno, mejor usar la instrucción para incrementar un byte: INC. Ojo que esta instrucción no modifica C, por lo que para incrementar en uno números de más de un byte, hay que hacer validaciones.

- En tercero, no logré establecer la relación entre el 1er código de ejemplo y el contenido en el RAR, por lo que no tengo muy claro en qué contexto debías obtener un resultado en A y por qué se quedaba pegado.

- Respecto del fuente en el RAR, eso está pintado para haber hecho una macro (MAC/65 sabe de macros, por eso su nombre). Sin embargo, ten cuidado con usar rutinas no documentadoas del S.O. o del cartucho BASIC para programas en assembler. No siempre los tendrás disponible y el programa se quedará pegado (o el emulador en sí abortará con algún error).

- ¿Cómo harás la multiplicación? ¿Por qué ese valor constante?

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

Re: (ATARI) consulta assembler mac65

Mensaje por dogdark » Mié Mar 04, 2015 9:34 pm

INICIO
; INDICAMOS EL FORMATO DE LA PAGINA

;LIMPIAMOS LA PANTALLA
LDX #LIMPIO&255
LDY #LIMPIO/256
JSR $C642
.........

;LINEA 6-D
LDX #21
LDY #36
JSR CURXY
LDX #TOTSEC&255
LDY #TOTSEC/256
JSR $C642
entre estas lineas se encuentra el formato de la pantalla, donde me dirijo a la posición de memoria (según manual assembly programming for the atari computers) pagina 164, donde explica como se puede imprimir en pantalla

Código: Seleccionar todo

; INDICAMOS LOS CAMPOS EN G6
	LDA #6
	STA 39975
	LDA #6
	STA 39976

	LDA #6
	STA 39984
	LDA #6
	STA 39985
en ves de usar un dl, me dirigí directamente a la posición de memoria 39975 para ingresar a la linea 1 una gráfica en modo 6 y como después de eso queda corrijo el texto a la derecha volvemos a aplicar el mismo 6 pero en una linea mas abajo (de donde saque eso?) cain lo usa para marcar una linea en modo 0 intruseando le saque el modo 6,
CURXY
STX ROW
STY COL
RTS
con esto me simplifico la vida para realizar los mismo que en basic el position, así ubico donde yo quiera el cursor dentro de la pantalla de 40 columnas X 21 lineas que es el margen que uso en caracteres modo 0 y 20 columnas x12 lineas en modo 6 entonces con LDX le digo linea 4 y LDY columna 9, el row esta con valor 84 y el col=85, que es la posición de memoria de margen derecho, según mapping atari y el 85 por lineas.

Código: Seleccionar todo

;INGRESAMOS EL TITULO
	LDX #4
	LDY #9
	JSR CURXY
	LDX #ENCU&255
	LDY #ENCU/256
	JSR $C642
	LDX #4
	LDY #9
	JSR CURXY
	LDA #VSNAME/256
	LDX #VSNAME&255
	JSR INPSTR
el ENCU es simplemente para mostrar como principio una barra para decir donde esta posicionado el cursor "_"

y despues ingresamos el titulo con vsname en una redireccion a INSPTR, este código lo saque de VER ACA, busque por todos lados y solo acá encontré como te dicen con código, de como se hace el ingreso de un input en assembler

luego de hacer el input te muestra a posterior el mensaje del titulo en la parte central de la pantalla en grande el titulo ya ingresado en modo 6, luego te envía a ingresar la fuente, después que se ingresa la fuente pasa un bucle donde se queda pegado para evitar el error del emulador, como en el emulador no se puede presionar las 3 teclas start option y select al mismo tiempo, no puedes soltar el programa,

Código: Seleccionar todo

LEOCONSOLA
	LDA CONSOLA
	CMP #0
	BEQ TERMINO
	JMP LEOCONSOLA
si te fijas en leo consola esta el bucle y el valor de 0 en CMP, si presionas en el atari real las tres teclas el bucle termina, si cambias el valor de CMP #6 y luego presionas start el bucle termina y te envia a

Código: Seleccionar todo

TERMINO
	RTS
donde el programa finaliza sin problema alguno, este programa esta probado tanto en el emulador como el atari, y no me da problemas aun.

pasando a lo que quiero al comenzar en INICIO
INICIO
; INDICAMOS EL FORMATO DE LA PAGINA
necesito crear ese bucle después de esto para ver cuantos bancos tiene mi atari y lo reconozca como un 130 o un 800xl con expansión e imprimirlo en pantalla, por eso te pedí si podías publicar el código del sitre para ver como se podía sacar lo mas principal que es esto mas de como cargaste y grabaste los juegos. Bueno esa es la idea, porque comence con asm, porque me di cuenta que a pesar de que los códigos están en basic, lamentablemente todo se refiere a trabajar con asm por las usr que utiliza y para comprender bien el funcionamiento del atari no hay nada mejor que assembler.

Código: Seleccionar todo

setBank
  TAX ; asume que acumulador trae el número de banco, con 0=memoria principal.
  LDA bancos,X
  STA 54017
  RTS
bancos
  .BYTE 178,162,166,170,174,194,198,202,206,226,230,234,238,130,134,138,142
este codigo no me funciona

y quiero hacer esto

Código: Seleccionar todo

1 M=16:DIM B(M+1):FOR I=0 TO M:READ X:B(I)=X:NEXT I
2 DATA 177,161,165,169,173,193,197,201,205,225,229,233,237,129,133,137,141
3 FOR I=0 TO M:POKE 54017,B(I):PRINT I,B(I):POKE 17000,B(I):NEXT I
4 FOR I=0 TO M:POKE 54017,B(I):PRINT I,B(I),PEEK(17000):NEXT I
para obtener el valor de m y con eso después me manejo los valores de bancos y bytes totales

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

Re: (ATARI) consulta assembler mac65

Mensaje por vitoco » Vie Mar 06, 2015 1:04 pm

dogdark escribió:y quiero hacer esto

Código: Seleccionar todo

1 M=16:DIM B(M+1):FOR I=0 TO M:READ X:B(I)=X:NEXT I
2 DATA 177,161,165,169,173,193,197,201,205,225,229,233,237,129,133,137,141
3 FOR I=0 TO M:POKE 54017,B(I):PRINT I,B(I):POKE 17000,B(I):NEXT I
4 FOR I=0 TO M:POKE 54017,B(I):PRINT I,B(I),PEEK(17000):NEXT I
para obtener el valor de m y con eso después me manejo los valores de bancos y bytes totales
Lo que tienes que hacer para obtener el máximo M para esa tabla es esto otro:

Código: Seleccionar todo

1 M=16:DIM B(M+1):FOR I=0 TO M:READ X:B(I)=X:NEXT I
2 DATA 177,161,165,169,173,193,197,201,205,225,229,233,237,129,133,137,141
3 FOR I=M TO 0 STEP -1:POKE 54017,B(I):POKE 22222,B(I):NEXT I
4 FOR I=1 TO M:POKE 54017,B(I):IF PEEK(22222)=B(I) THEN NEXT I
5 IF I<=M THEN M=I-1:POP
6 PRINT M
En assembler sería algo así:

Código: Seleccionar todo

;1 M=16:DIM B(M+1):FOR I=0 TO M:READ X:B(I)=X:NEXT I
;2 DATA 177,161,165,169,173,193,197,201,205,225,229,233,237,129,133,137,141

MAX = 16 ;CONSTANTE

  ORG $600
M
  .BYTE MAX
B
  .BYTE 177,161,165,169,173,193,197,201,205,225,229,233,237,129,133,137,141

;3 FOR I=M TO 0 STEP -1:POKE 54017,B(I):POKE 22222,B(I):NEXT I

  LDY #MAX
NEXT3
  LDA B,Y
  STA 54017
  STA 22222
  DEY
  BMI NEXT3

;4 FOR I=1 TO M:POKE 54017,B(I):IF PEEK(22222)=B(I) THEN NEXT I
;5 IF I<=M THEN M=I-1:POP
;6 PRINT M

  LDY #1
NEXT4
  LDA B,Y
  STA 54017
  CMP 22222
  BNE DISTINTO
  INY
  CPY #MAX+1
  BNE NEXT4
DISTINTO
  DEY
  STY M
OJO: la parte de los datos (.BYTE) deben estar en memoria fija y por eso explicité el ORG $600 (página 6), o bien si se usa USR, habría que pasar la dirección de la lista como parámetro y devolver M como salida en:

Código: Seleccionar todo

M=USR(ADR(RUTINA$),ADR(TABLA$))
Disclaimer: código no probado...

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

Re: (ATARI) consulta assembler mac65

Mensaje por dogdark » Vie Mar 06, 2015 11:22 pm

gracias vitoco por la info, también te quiero agradecer por la idea de usar macros :aplauso: , se me había pasado ese detalle, con las macros también puedo crear mi propia librería, estoy creando una como emubas.lib que seria una librería que emula los pasos del basic en código asm, eso me ayudara mucho en la construcción del mismo programa y otros

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

Re: (ATARI) consulta assembler mac65

Mensaje por dogdark » Dom Oct 11, 2015 3:04 am

por consulta, como puedo imprimir en pantalla el valor que me trae M, para saber si es 1 - 5 - o 17, toy loco con eso,plis

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

Re: (ATARI) consulta assembler mac65

Mensaje por vitoco » Dom Oct 11, 2015 12:32 pm

Nunca he intentado "imprimir" un número en assembler como lo haría con PRINT en BASIC, pero entiendo que hay macros en alguna de las bibliotecas de MAC/65 que permiten hacer eso. Un vistazo rápido por Google me llevó a la macro PRINUM de KERNEL.M65, pero no le he mirado para saber si es lo que necesitas. También he visto que usen las bibliotecas de punto flotante de BASIC y del S.O. para eso, pero tampoco me tinca eso por lo que dije en alguno de los post anteriores de este hilo.

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

Re: (ATARI) consulta assembler mac65

Mensaje por dogdark » Dom Oct 11, 2015 1:35 pm

estoy usando la misma libreria, la de kernel y la tengo cargada en la pagina $6000, por lo tanto si trate de usar el prinum, hay que pasar 3 variables %1,%2,%3, trate de realizarlo de la siguiente manera

PRINUM M

me sale error BAD PARAMETER al compilar

PRINUM M,0,0

al compilar no da error pero al ejecutar sale FATAL ERROR #175 que no se que error será, no tengo la tabla de errores de asm.

por lo otro estube mirando algunos post de asm, que no son de atari, pero todos realizan la misma referencia, transformar ese valor numero en ascii. que podría ser una solucion para mostrar el caracter en pantalla.

que es lo que quiero, como para hacer una idea, es mostrar la cantidad de bancos obtenidos para mostrarlos, y tambien la cantidad de bytes que soportaria la carga de un atari.

o sea

ejemplo.

bancos -> 1 o 5 o 17
bytes -> 278528

primero pensaba en crear una variable para almacenar los bancos

BANCOS = $C0
MAXIMO = $C1
MAXIMO2 = $C2
MAXIMO3 = $C3
TOTAL = $C4
TOTAL1 = $C5
TOTAL2 = $C6



BANCOS no usaría mas de 1 bits por ser hasta 17($11)
MAXIMO usaría hasta 3 bits por ser 278528($04 $40 $00) según conversor binario
TOTAL es el total de bytes cargados en memoria, lo mismo anterior

por lo tanto debo sumar bytes en maximo y total y pasarlos a numeros en una variable para imprimir

entonces pensaba cargar los valores en cada byte y convertirlos en ascii para después, no se si estoy bien o no?

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

Re: (ATARI) consulta assembler mac65

Mensaje por vitoco » Dom Oct 11, 2015 10:49 pm

dogdark escribió:estoy usando la misma libreria, la de kernel y la tengo cargada en la pagina $6000, por lo tanto si trate de usar el prinum, hay que pasar 3 variables %1,%2,%3, trate de realizarlo de la siguiente manera

PRINUM M

me sale error BAD PARAMETER al compilar

PRINUM M,0,0

al compilar no da error pero al ejecutar sale FATAL ERROR #175 que no se que error será, no tengo la tabla de errores de asm.
De acuerdo a la documentación de esa macro:
PRINUM v1,adr,v2

Purpose: To print out an integer of a given length to a specified channel.

Params:
v1 - the IOCB channel
adr - the address of the integer
v2 - the width of the number in characters.

Example:
1000 PRINUM 0,VALADR,5
El IOCB channer es el canal donde hiciste el OPEN, pero que por defecto en GR.0 es el cero.

En tu caso, debiera ser algo así como:

Código: Seleccionar todo

PRINUM 0,M,2
pensando que el número de bancos a lo más va a tener 2 dígitos.

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

Re: (ATARI) consulta assembler mac65

Mensaje por dogdark » Lun Oct 12, 2015 6:57 pm

apoyo con más datos la información de KERNEL.M65, lo importante para incorporarlo a los proyectos, es antes redireccionarlo a alguna pagina, o dará error en la inclución.

EJ

100 *=$6000
110 .INCLUDE D:KERNEL.M65
120 .......

EL kernel lo baje de esta página pokeysoft, es el U088a

y el manual KERNEL para descargar

gracias Vitoco

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

Re: (ATARI) consulta assembler mac65

Mensaje por dogdark » Mar Oct 13, 2015 9:16 am

ya realizada las pruebas correspondientes, el PRINUM funciona como me dijo vitoco, pero el código generado anteriormente, hay algo que no cuadra, igual da error, realice la prueba colocando el PRINUM de esta manera para ver si funcionaba, PRINUM 0,MAX,2 y ok, pero cuando lo coloco PRINUM 0,M,2 error #175. nuevamente.

te adjunto el código que realice para me guíes en que estoy equivocado por favor. :mmmsi:

este código es el que entregaste

Código: Seleccionar todo


0120     .OPT LIST
0130     *=  $0600
0140 MAX =   16
0150 M
0160     .BYTE MAX
0170 B
0180     .BYTE 177,161,165,169,173,193,197,201,205,225,229,233,237,129,133,137,141
0190     LDY #MAX
0200 NEXT3
0210     LDA B,Y
0220     STA 54017
0230     STA 22222
0240     DEY 
0250     BMI NEXT3
0260     LDY #1
0270 NEXT4
0280     LDA B,Y
0290     STA 54017
0300     CMP 22222
0310     BNE DISTINTO
0320     INY 
0330     CPY #MAX+1
0340     BNE NEXT4
0350 DISTINTO
0360     DEY 
0370     STY M
0380     *=  $6000
0390     .INCLUDE #D:KERNEL.M65
0400 INICIO
0410      GR  0
0420      POKE  710,0
0430      POKE  709,14
0440      POS  6,0
0450      PRINT  "EMPEZAMOS CON EL CODIGO"
0460      POS  2,2
0470      PRINT  "IMPRIMOS EL NUMERO DE BANCOS"
0480      PRINUM  0,M,2
0490     RTS 
0500     *=  $02E0
0510     .WORD INICIO

al poner PRINUM 0,M,16

me salio esto

(11 espacios en blanco)45328

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

Re: (ATARI) consulta assembler mac65

Mensaje por vitoco » Mar Oct 13, 2015 9:39 am

Veo que el código parte en INICIO y termina después de (intentar) imprimir el M (o el MAX), pero nunca llama a la rutina que determina el nuevo MAX y que parte en la línea 190 (sin label para JSR o lo que sea).

El valor del parámetro del medio debe ser un una dirección de memoria, es decir, un valor (o label) de 16 bits (2 bytes), pero ignoro si en esa dirección de memoria debe haber un byte (como en tu caso), una word (2 bytes) o un número en punto flotante (8 bytes). No tengo idea qué significa error 175 en ese contexto (normalmente es un error del DOS).

Consulta: ¿con qué estás compilando? ¿Mac/65? Me parece que el archivo KERNEL.M65 está en formato de token de Mac/65, y si lo tratas de incluir como archivo de texto, probablemente arroje un error como el 175, pero eso no explica por qué funciona con MAX y no con M.

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

Re: (ATARI) consulta assembler mac65

Mensaje por vitoco » Mar Oct 13, 2015 9:48 am

Analizando lo último que dijiste:
dogdark escribió:al poner PRINUM 0,M,16

me salio esto

(11 espacios en blanco)45328
Aquí veo 3 cosas:

- El valor que muestra no es el valor de M=16, sino que el decimal de $B110, que si lo separamos en 2 bytes queda $10=16 (LO) y $B1=177 (HI), es decir, la rutina imprime correctamente una WORD en formato LO-HI.

- El error se estaría dando porque el número de 5 dígitos no le cabe en 2 espacios.

- Deberás transformar la línea 160 en .WORD MAX para que imprima el valor correcto.

... y como ya dije, te falta llamar a la rutina que recalcula el M.

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

Re: (ATARI) consulta assembler mac65

Mensaje por dogdark » Mar Oct 13, 2015 9:10 pm

si maestro vitoco, estoy trabajando con

mac65
atari 130xe (realizando pruebas)
emulador altirra(trabajando con HARDWARE 600/800XL y memoria de 320K rambo), donde estoy digitando todo
archivo atr U088a.atr donde extraí el KERNEL.M65 y cree mi propia atr.

el código que había subido es el que digité en el emulador donde primero pasaba la validación de M en $600, no me dejo incluir el org el mac y luego a través de un include mando a la pagina $6000 el kernel. eso fue lo que hice.

por lo menos me quedo claro que es lo que necesitaba para empezar era la estructura y la redirección que necesitaba, por que pasaba de largo en algunas partes, ahora tomare mucha calma para analizar lo demás en cuanto a los bytes y empezar a realizar pruebas, para ver si explota el atari, un abrazo.

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

Re: (ATARI) consulta assembler mac65

Mensaje por dogdark » Mar Oct 13, 2015 10:00 pm

ya vitoco leí detenidamente todo, veo que no nos estamos entendiendo a lo que quiero hacer, te paso a explicar el proyecto que estoy haciendo, aunque me tome todo un año, lo haré con mucha calma.

primero lo que quiero hacer es lo mismo que se encuentra en xmem.bas

realizar una validación para ver con cuantos bancos cuenta mi atari, para obtener la variable M con el valor de 0 hasta los 16 que tiene. eso mantenerlo en un byte. para usarlo después en validaciones internas al procesar el ingreso o salida de bytes a los perifericos. más el manejo de una variable a parte que sea de de BT = 16834, que son los bytes que lleva cada banco.

después pasar a texto donde va la portada ej.

bienvenido a carga y grabación de archivos
bancos : 16 by. dispo. 273456

fuente :

BK=M (TEXTO)
BYTO =BT*BK (TEXTO)
BTT=BT*M (bytes)

entonces donde dice "bancos : 16" llevara una variable BK en texto, que es el mismo valor de M, by. dispo, (BYTO = BT*BK)es el total de bytes multiplicado por la cantidad de bancos mostrado en texto, otra en byte BTT=BT*M, que es lo mismo que byto pero en bytes.

espero que me hayas entendido perrin.

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

Re: (ATARI) consulta assembler mac65

Mensaje por vitoco » Mar Oct 13, 2015 11:16 pm

Respecto de tus variables, si entendí bien, M y BTT son números en base 256 (bytes), en cambio BK y BYTO son los mismos valores respectivos pero formateados como dígitos decimales legibles por un usuario. De aquí, 2 cosas:

- Lo que dije respecto de PRINUM: esta macro imprime un valor que esté en una dirección de memoria, pero de 2 bytes, no de uno, por lo que necesitas un segundo byte con valor en cero justo después del byte donde esta M. El valor raro que te estaba imprimiendo fue porque para ese segundo byte (HI) estaba tomando el primer byte a continuación de M, que era el primer valor de la lista de pokes para PORTB.

- Por otro lado, quieres imprimir el total de bytes disponibles, pero no te va a servir PRINUM porque el máximo valor es 65535, es decir, 8 bancos menos 1 byte. No sé si en KERNEL.M65 hay otra macro que permita escribir en decimal números de más de 2 bytes. Lo otro sería trabajar en "modo decimal".

No sé si te diste cuenta, pero para multiplicar el número de bancos por el tamaño de los bancos, lo que debes hacer es un corrimiento de varios bits a la izquierda del valor M.

Ah... y lo otro que dije es que te faltó llamar a mi rutina para ajustar M. Si sigues el flujo a partir de INICIO, nunca cambia el valor del número de bancos y se queda en 16. Falta un JSR.

Eso por ahora... me voy a ver el partido.

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

Re: (ATARI) consulta assembler mac65

Mensaje por dogdark » Jue Oct 15, 2015 8:16 am

Código: Seleccionar todo

0100 ;SAVE#D:DOG2.ASM
0110 ;ASM,#P:,#D:DOG2.EXE
0120 MAX =   16
0130     .OPT LIST
0140     *=  $3000
0150     .INCLUDE #D:KERNEL.M65
0160     *=  $0600
0170 M
0180     .BYTE MAX
0190 B
0200     .BYTE 177,161,165,169,173,193,197,201,205,225,229,233,237,129,133,137,141
0210 MEMORIA
0220     LDY #MAX
0230 NEXT3
0240     LDA B,Y
0250     STA 54017
0260     STA 22222
0270     DEY 
0280     BMI NEXT3
0290     LDY #1
0300 NEXT4
0310     LDA B,Y
0320     STA 54017
0330     STA 22222
0340     BNE DISTINTO
0350     INY 
0360     CPY #MAX+1
0370     BNE NEXT4
0380 DISTINTO
0390     DEY 
0400     STY M
0410     JMP GRAFICA
0420 INICIO
0430     JMP MEMORIA
0440     *=  $6000
0450 GRAFICA
0460      GR  0
0470      POKE  710,0
0480      POKE  709,14
0490      POS  0,0
0500      PRINT  "PRUEBA DE DOG2"
0510     RTS 
0520     *=  $02E0
0530     .WORD INICIO
al aplicar el código se cuelga, lo probé solo con la validación de M sin la gráfica y pasa lo mismo, aplique el jmp para forzar las direcciones, con jsr y rts pasaba lo mismo, siempre se cuelga, e incluso que debería aparecer la gráfica a posterior no pasa nada. pero no veo nada mal en el código que me diste po vitoco.

edit:en el atari real queda en negro la pantalla.

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

Re: (ATARI) consulta assembler mac65

Mensaje por vitoco » Jue Oct 15, 2015 1:24 pm

Creo que el problema lo tienes en la línea 440. Recuerda que la rutina para explorar la memoria expandida va poniendo los distintos bancos en la memoria asignada: $4000-$7FFF. Tu programa lo tienes dividido en 3 partes, y justo la que imprime la metiste en el banco, por lo que cuando haces el "JMP GRAFICA", tu programa ya no está ahí, y probablemente sólo haya bytes con valor cero.

Revisé muy por encima la rutina "MEMORIA" para verificar que deja un banco expandido en lugar de la memoria de base que tiene tu rutina y creo que tiene un error en la línea 330. Eso debería ser "CMP 22222", ya que está viendo si está el valor que puso en la línea 260 del loop anterior.

Independiente de eso, te faltaría restaurar la memoria base antes de salir de la rutina MEMORIA, usando:

Código: Seleccionar todo

   LDA B
   STA 54017
ya que si recuerdo bien, el primer valor corresponde a B(0) y representa la memoria real en vez de un banco.

Haciendo esto, debería volver a aparecer tu programa de la dirección $6000 y retomaría el control.

En todo caso, no me quedó claro por qué dividiste el programa en 3, si podía estar todo junto en, por ejemplo, $2000.

Un último detalle, el código de mi rutina MEMORIA no es la última versión que valida los 2 tipos principales de expansión a la vez: RAMBO XL (Buchholz) y Newell. Pero igual está bien...

Responder