Página 1 de 2
(ATARI) consulta assembler mac65
Publicado: Mié Mar 04, 2015 7:01 am
por dogdark
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
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
Re: (ATARI) consulta assembler mac65
Publicado: Mié Mar 04, 2015 9:48 am
por fcatrin
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
Re: (ATARI) consulta assembler mac65
Publicado: Mié Mar 04, 2015 11:28 am
por dogdark
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.
Re: (ATARI) consulta assembler mac65
Publicado: Mié Mar 04, 2015 12:19 pm
por vitoco
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?
Re: (ATARI) consulta assembler mac65
Publicado: Mié Mar 04, 2015 9:34 pm
por dogdark
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
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
Re: (ATARI) consulta assembler mac65
Publicado: Vie Mar 06, 2015 1:04 pm
por vitoco
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:
Disclaimer: código no probado...
Re: (ATARI) consulta assembler mac65
Publicado: Vie Mar 06, 2015 11:22 pm
por dogdark
gracias vitoco por la info, también te quiero agradecer por la idea de usar macros

, 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
Re: (ATARI) consulta assembler mac65
Publicado: Dom Oct 11, 2015 3:04 am
por dogdark
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
Re: (ATARI) consulta assembler mac65
Publicado: Dom Oct 11, 2015 12:32 pm
por vitoco
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.
Re: (ATARI) consulta assembler mac65
Publicado: Dom Oct 11, 2015 1:35 pm
por dogdark
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?
Re: (ATARI) consulta assembler mac65
Publicado: Dom Oct 11, 2015 10:49 pm
por vitoco
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:
pensando que el número de bancos a lo más va a tener 2 dígitos.
Re: (ATARI) consulta assembler mac65
Publicado: Lun Oct 12, 2015 6:57 pm
por dogdark
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
Re: (ATARI) consulta assembler mac65
Publicado: Mar Oct 13, 2015 9:16 am
por dogdark
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.
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
Re: (ATARI) consulta assembler mac65
Publicado: Mar Oct 13, 2015 9:39 am
por vitoco
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.
Re: (ATARI) consulta assembler mac65
Publicado: Mar Oct 13, 2015 9:48 am
por vitoco
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.
Re: (ATARI) consulta assembler mac65
Publicado: Mar Oct 13, 2015 9:10 pm
por dogdark
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.
Re: (ATARI) consulta assembler mac65
Publicado: Mar Oct 13, 2015 10:00 pm
por dogdark
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.
Re: (ATARI) consulta assembler mac65
Publicado: Mar Oct 13, 2015 11:16 pm
por vitoco
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.
Re: (ATARI) consulta assembler mac65
Publicado: Jue Oct 15, 2015 8:16 am
por dogdark
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.
Re: (ATARI) consulta assembler mac65
Publicado: Jue Oct 15, 2015 1:24 pm
por vitoco
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:
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...