Acá repaso línea por línea qué hace el cargador:
10 rem el castillo del dragon
20 rem parte 1 - cargador
30 :
100 b=14336:c=55296
105 :
110 poke56333,127:poke179,192
115 poke1,peek(1)and251
120 fori=0to2047:pokeb+i,peek(c+i):next
125 poke1,peek(1)or4
130 poke56333,129
Ahí genera una copia idéntica del juego de caracteres que viene en el equipo, ya que luego algunos de ellos van a ser redefinidos. Pero al ser muy pocos, es más cómodo primero copiar todos y luego cambiar los que sean necesarios.
Los caracteres nuevos ocupan la zona de memoria desde 14336 (B) hasta 16386 y son tomados de la zona 55296 (C).
135 :
140 fori=512to719:pokeb+i,0:nextAcá llena de ceros la zona de memoria desde 14848 hasta 15055. O sea, borra algunos caracteres del nuevo juego.
145 reada:ifa<0then165
150 fori=0to7:readx
155 pokeb+a*8+i,x:next:goto145Acá sobreescribe algunos de los caracteres de la nueva definción, para que no sean idénticos a los que viene por defecto; a saber, el escudero, la puerta, etc.
Fíjense que antes había pokeado la zona de B, desde 14336 hasta 16386, o sea, el set de caracteres completo. Y ahora toma 2 valores de los datas: El primero (A) le indica la distancia de B, o sea el caracter específico que quiere redefinir. Y luego toma los 8 valores de X que le dan la forma al nuevo caracter. Cuando encuentra un valor menor a 0 (el último data de la sección "JUEGO CARACTERES") pasa a la siguiente línea.
160 :
165 fori=828to1023:reada:pokei,a:nextAcá toma la segunda sección de los datas, que lleva por nombre "CODIGO MAQUINA"
y la ubica desde la posición de memoria 828 hasta 1023, o sea desde $033C a $03ff
170 fori=49152to49270:reada:pokei,a:nextAcá toma la tercer sección de datas, denominada "JOYSTICK"
y la ubica desde la posición 49152 hasta 49270, o sea desde $c000 a $c076
175 fori=50176to51175:reada:pokei,a:nextAcá toma la cuarta sección de datas, denominada "PANTALLA"
y la ubica desde la posición 50176 hasta 51175, o sea desde $C400 a $c7e7
180 fori=51200to52199:reada:pokei,a:nextAcá toma la quinta sección de datas, denominada "PANTALLA COLOR"
y la ubica desde la posición 51200 hasta 52199, o sea desde $c800 a $cbe7
Bien. Hasta aquí lo único que hizo el programa es llenar espacios de memoria, que pueden ser volcados directamente al disco como archivos independientes.
Eso hice. Y le puse los siguientes nombres:
CHARSET, CODE, JOYSTICK, SCREEN y SCREEN C
Continuemos...
185 poke53280,0:poke53281,0:printchr$(14)chr$(8 )Acá cambia el color de fondo a negro y cambia de mayúscula a minúscula. La combinación "printchr$(14)chr$(8 )" hace además imposible volver a cambiar de mayúscula a minúsculas.
Como indiqué en otro mensaje, esta parte del código, si vamos a prescindir del cargador, es necesario agregarla al segundo listado.
186 print"“e Un momento, por favor"
187 print"qpoke44,64:poke64*256,0:new"
188 print"qqfori=0to118:poke4096+i,peek(49152+i):next"
189 print"qqload"chr$(34)"dragon.prg"chr$(34)",8s";
190 poke198,3:poke631,13:poke632,13:poke633,131:end
191 :Acá es interesante lo que hace. Imprime en pantalla "Un momento por favor" y luego en el mismo color que el fondo, para evitar que lo veamos, un par de instrucciones que luego va a ejecutar con la línea 190.
La línea 187 hace un POKE44,64 . O sea, se ubica en la posición de memoria $4000
Como había indicado en otro mensaje, la intención del programa es cargar un segundo listado, el juego propiamente dicho, en la posición de memoria $4000
Luego hace un POKE64*256,0 , o sea pone un cero en la posición de memoria $4000
Como todos (?) sabemos, si tenemos un listado de basic a partir de la posición de memoria $0801, para poder darle RUN, la posición de memoria $0800 tiene que ser un cero. Si no, no funciona. Lo mismo con cualquier otra posición de memoria. El valor anterior a donde inicia el programa tiene que se cero.
Prueben hacer el típico listado 10PRINT"hola":GOTO10 . Le dan RUN y corre. Luego prueben poner POKE2048,3 (o sea, que no haya un cero en la posición de memoria $0800) y ya no funciona más.
Acá, como va a haber un listado en $4001, el programa se asegura que la posición de memoria $4000 sea un cero, y no conforme con ello, le da un NEW, como para eliminar cualquier posibilidad de que haya otro listado en esa posición de memoria.
La línea 188 lo que hace es mover la porción de memoria 49152 (o sea, la que antes habíamos llenado con la parte de datas de la sección JOYSTICK) a la zona de $1000
Por eso en un mensaje anterior dije que resultaba raro. Primero llena una posición de memoria, para luego moverla. Parecería más sensato ubicarla allí de entrada. Posiblemente el segundo listado necesite que esté la información por duplicado en las dos posiciones.
Como corresponde, y para emular el comportamiento del cargador al 100%, grabé también esa posición de memoria y le puse el nombre de "MIL"
La línea 189 carga el programa "dragon.prg", o sea, el segundo listado.
La línea 190 llena el buffer del teclado para que le de enter a las instrucciones antes impresas en pantalla y luego RUN.
195 rem datas juego caracteres
200 :A partir de aquí vienen las datas.
O sea, recapitulemos.
Lo único que hizo el cargador fue llenar posiciones de la memoria y cargar el segundo listado.
Nosotros podemos copiar esas posiciones de la memoria sin necesidad de contar con un programa que las pokee.
Yo lo hice, con los nombres de CHARSET, CODE, JOYSTICK, SCREEN, SCREEN C y MIL
La única modificación al segundo listado fue para incorporar el cambio de color de fondo, mayúscula a minúscula, y un extra: que no se pueda interrumpir mediante RUN/STOP.
Acá adjunto un fichero con todos los archivos involucrados.
Al segundo listado, con la modificación mencionada, lo llamé BASIC
En el exomizer se debe tipear lo siguiente:
exomizer sfx basic,$4001,$7300 code.prg mil.prg charset.prg basic.prg,$4001 joystick.prg screen.prg screen_c.prg -Di_table_addr=$d000 -nLo que hago aquí es indicarle al exomizer dónde queremos que arranque el basic en memoria ($4001) y dónde termina el programa, ($7300), ya que allí ubicaremos las variables.
luego aparecen la cantidad de archivos involucrados.
Le indico también que basic.prg sea movidode su posición original $0801, a $4001
-Di_table_addr=$d000 es para mover la "decrunch table", en este caso a la posición $d000, ya que la original quedaba interfiriendo con la zona ocupada por code.prg
Y el -n es para que no haga ningún efecto al descomprimir.
Bueno. Creo que no pasé nada por alto. Así que debería funcionar 100% igual que el programa original.
(nota: ahora recuerdo que para la versión mejorada moví la ubicación de code.prg, que al estar por debajo de la memoria de pantalla, generaba un efecto visual indeseado mientras se descomprimía el archivo. El original debía estar ubicado en $033C y el que les presento está en $0800, que es donde antes estaba ubicado el cargador y no interfiere con nada. La modificación al segundo listado incluye volver a ubicar en su posición de $033C ese sector de la memoria y evitar así la desagradable experiencia de ver caracteres extraños en nuesto monitor durante 3 segundos).

Una cosa que se puede hacer es agregar algunas líneas de código al programa para que muestre una pantalla inicial, indicando que fue una iniciativa de Commodore Manía, y los nombres de los involucrados.
Lo único a tener en cuenta es que al agregarle código al programa, hay que calcular el valor de memoria en donde termina el programa (que ahora es $7300), porque si no, no va a funcionar.