Veo varios errores...
dogdark escribió:Lo primero cree el asm con mac65
prueba
Código: Seleccionar todo
0000 0120 *= $0600
0600 A900 0130 LDA #0
0602 8DC602 0140 STA 710
0605 A90E 0150 LDA #14
0607 8DC502 0160 STA 709
060A A200 0170 LDX #0
060C C000 0180 CPY #0
060E F0FC 0190 BEQ $060C
*** ASSEMBLY ERRORS: 0 25109 BYTES FREE
LDX #0 pone en cero el registro X de la CPU, y
CPY #0 compara el valor del registro Y con cero. Una cosa no tiene que ver con la otra, y viendo que después haces un
BEQ loop pienso que el
LDX debió ser
LDY para que quede en bucle infinito. Así como está, dependerá del valor actual de Y, y de seguro que no es cero, pasando de largo a la siguiente dirección de memoria. Si ahí hay basura que la CPU no puede interpretar como instrucciones válidas, Altirra va a abortar.
dogdark escribió:Como se aprecia en el código, es una rutina simple que solo coloca la pantalla en negro, con un bucle a $06C0, luego ocupo los archivos que vitoco usa para la creación de usr
DESCOMPRESOR BINARIO MAC65 Y
STRING.BAS, luego de tener el asm limpio le agrego la cabezera en chr$, que es 00 01 00 06 0E 06, y al final E0 02 E1 02.
El descompresor binario no aplica para programas pequeños que ocupan menos de una página de memoria (256 bytes), ya que obtendrás como resultado lo mismo que ya tienes.
Por otro lado, el programa STRING le saca los 6 primeros bytes de cabecera al binario, ya que el objetivo es usar el programa ensamblado como una rutina USR dentro del BASIC y no se necesitan las cabeceras. Como en tu caso sí necesitarías las cabeceras porque las vas a poner en un archivo en disco, en vez de agregarlas manualmente, bastaría modificar el programa STRING.BAS para que no se salte los primeros 6 bytes del archivo que lee. Ojo que si el archivo de entrada ya trae bytes adicionales como el vector de inicio para un XEX, también los incluirá en el string para BASIC.
En tu caso no estás haciendo un XEX sino que un
BOOT loader, por lo que lo que dije en el párrafo anterior no aplica (Mac/65 genera estructuras OBJ que en la práctica son XEX), y sí es necesario agregar los 6 bytes adicionales para registros tipo BOOT. El problema aquí es que los valores que pusiste NO son correctos, ya que la estructura es:
1 byte: (00) no utilizado por el sistema.
1 byte: (01) cantidad de bloques consecutivos a leer.
2 bytes: (00 06) la dirección de memoria para almacenar este 1er bloque incluyendo estos 6 bytes de control.
2 bytes: (06 06) el vector de inicio para pasar el control cuando se hayan cargado todos los bloques.
Los valores entre paréntesis son los de tu caso, y mira los valores que puse en los 2 últimos: no son 00 06 ($0600), sino que 6 bytes después ($0606), y por lo tanto es el valor que deberías tener en la línea 120.
Alternativamente podrías cambiar la línea 120 por este bloque para no tener que agregarlos a mano en el BASIC:
Código: Seleccionar todo
120 *= $0600
122 .BYTE $00,$01
124 .WORD $0600
126 .WORD INICIO
Si ya tenías definida una etiqueta que indica en qué parte de la memoria cargar, la pones en vez de $0600 en ese bloque. Así se hace más fácil cambiar después por $0700, que es donde por convención cargan los
loaders.
Lo que sí
está demás son los 4 bytes que agregaste al final. Eso es válido sólo para los XEX, y debieran ser 6 bytes. Si tu programa fuera un XEX, serían los valores E0 02 E1 02 00 06.
Por último, en la línea 300 dice
.BYTE $43. Esa corresponde a una línea en modo gráfico 0 de 10 pixeles de alto que requiere de 40 bytes de datos. Como tu LINEA1 tiene solo 20 bytes, pienso que quisiste decir $46 para modo 1 o $47 para modo gráfico 2. (el $40 sumado está bien porque agrega la información de dónde se encuentra la data).
Ojo que a la data de LINEA1 debes sumarle o restarle 32 bytes a cada caracter, ya que lo que el DL espera son códigos internos, no el ATASCII puro. Hay un enroque entre las mayúscoulas, los caracteres de control y los números y símbolos.
Un detalle: agrega la línea 225 y cambia la 240 para que el bucle quede relocalizable (¡se va a mover 6 bytes!):
Otra cosa: no estoy seguro si es motivo para BOOT ERROR al cargar, pero creo que A$ debe medir exactamente un múltiplo de 128 bytes al grabar a través de CIO (con PRINT #1), es decir, además de cambiar el DIM, debes rellenar A$.
Cuéntanos cómo te va...