Programa para adaptar el Ensamblador GEN a Disco

Par manolito74

Paragon (1301)

Portrait de manolito74

09-01-2022, 22:30

Buenas:

El otro día, por causalidad, hojeando/ojeando la MSX-CLUB me encontré con un Listado que me llamó la atención. Se trata de un Listado BASIC que permite adaptar el Ensamblador GEN originalmente en Cinta a Disco. Es decir: tener una versión DISCO del GEN, que opera de igual forma quela versión Cinta, pero haciendo todo en DISCO.

El Listado de marras, aparece en el número 50 de la MSX-CLUB y sería este:

10 '
20 ' ADAPTADOR GEN- DISK
30 '
40 '
50 ' Por José Francisco Pertiñez Ruiz
60 '
70 '
80 '=================================
90 '  Descripción y funcionamiento  
100 '================================
110 '
120 '
130 '
140 CLEAR 300:KEYOFF:SCREEN0:WIDTH 37:COLOR 15,4,4:ON STOP GOSUB 140:STOP ON:ON ERROR GOTO 140
150 PRINT:PRINT:PRINTTAB(9)"   ADAPTADOR GEN DISK"
160 PRINTTAB(9) "========================="
170 PRINT" Este Programa sirve para adaptar el ENSAMBLADOR GEN de IVESON de CASSETTE a DISCO."
180 PRINT:PRINT"-Esto se consigue parcheando las rutinas de Entrada/Salida del Cassette y añadiendo las correspondientes de control de la UNIDAD DE DISCO."
190 PRINT:PRINT"-El Programa resultante permite Cargar, Grabar y Verificar Programas como si fuera una versión en DISCO de la misma forma que lo hace la versión Cassette. A este Programa nos referiremos a partir de ahora con el nombre de GEN"; 
200 PRINT"DISK.": PRINT:PRINT:PRINT" Pulse una Tecla para continuar";:A$=INPUT$(1)
210 '
220 '
230 '=======================================
240 '           MENU PRINCIPAL
250 '=======================================
260 '
270 '
280 CLS:PRINT:PRINT:PRINTTAB(8)"MENÚ PRINCIPAL":PRINTTAB(8)"==============":PRINT:PRINT" 1-CONVERSIÓN del PROGRAMA":PRINT:PRINT" 2-INSTRUCCIONES de GEN DISK":PRINT:PRINT" 3-FIN del ADAPTADOR":LOCATE,16:PRINTTAB(8)"ELIJA UNA OPCIÓN "
290 A=VAL(INPUT$(1)):A=-A*(A<4):ON A GOTO 310,600,710:GOTO 280
300 '
310 '
320 ' ===========================================
330 '         CONVERSIÓN del PROGRAMA
340 ' ===========================================
350 '
360 '
370 CLS:PRINT" Pulse PLAY en el Cassette con el Ensamblador GEN dentro y pulse una Tecla ";:A$=INPUT$(1)
380 BLOAD"CAS:",&H1000
390 PRINT:PRINT:PRINT" Introduzca un Disquete en la Unidad y pulse una Tecla ";:A$=INPUT$(1)
400 A=&HF0:B=&H58:C=0:POKE &H9A1C,B:POKE &H9A2D,B:POKE &HA128,B:POKE&HAF03,B:POKE&H99FA,C:POKE &H9A06,C:POKE&H99CA,C:POKE &H99CB,C:POKE &H99CC,C:POKE &H9A29,C:POKE &H9A2A,C:POKE &H9A2B,C:POKE &H9A3E,C:POKE&H9A3F,C:POKE &H9A40,C:POKE&H9A1D,A:POKE&H9A2E,A
410 POKE&HA129,A:POKE&H99FB,A:POKE &H9A07,A
420 A$="0 BLOAD"+CHR$(34)+"GEND.BIN"+CHR$(34)+",-&H1000:BLOAD"+CHR$(34)+"GEND.DK"+CHR$(34)+":DEFUSR=&H8800:?USR(128):DEFUSR=&HFFF0:DELETE0+CHR$(13)+"1 ?USR(0):END"+CHR$(13):OPEN"GEN"FOROUTPUTA$#1:PRINT#1 A$:CLOSE
430 BSAVE"GEND.BIN",&H9800,&HBE00
440 FOR I=&HE000 TO &HE14F:READ A$:POKEI,VAL("&H"+A$):NEXT
450 BSAVE"GEND.DK",&HE000,&HE14F:PRINT:PRINT:PRINT"FINALIZADA la ADAPTACIÓN":FOR I=0 TO 2000:NEXT:GOTO 140
460 '
470 '
480 ' RUTINAS DE ENTRADA/SALIDA DEL
490 '
500 ' DISCO
510 '
520 '
530 DATA CD,E9,FF,DD,E5,C5,D5,E5,C5,3A,1A,E1,B7,20,16,CD,E2,E0,11,2A,E1,E,16,CD,7D,F3,21,0,0,22,4B,E1,3E,1,32,1A,E1,11,4E,E1,E,1A,CD,7D,F3,2A,30,FA,11,4E,E1,1,0,4,ED,B0,1
540 DATA 0,4,ED,43,38,E1,11,2A,E1,21,1,0,E,26,CD,7D,F3,C1,79,B7,CC,D6,E0,E1,D1,C1,DD,E1,C3,E2,FF,CD,E9,FF,DD,E5,C5,D5,3A,1A,E1,B7,20,14,CD,E2,E0,11,2A,E1,E,F,CD,7D,F3,B7,20
550 DATA 4D,21,0,0,22,4B,E1,11,4E,E1,E,1A,CD,7D,F3,1,0,4,ED,43,38,E1,11,2A,E1,21,1,0,E,27,CD,7D,F3,21,4E,E1,ED,5B,30,FA,1,0,4,ED,B0,3A,1A,E1,B7,CC,CF,E0,3E,1,32,1A,E1
560 DATA 3A,19,E1,D6,4,DC,D6,E0,32,19,E1,D1,C1,DD,E1,2A,30,FA,C3,E2,FF,11,1B,E1,E,9,CD,7D,F3,D1,C1,DD,E1,C3,F0,F9,3A,A1,D7,32,19,E1,C9,11,2A,E1,AF,32,1A,E1,E,10,C3,7D,F3,11,4E 
570 DATA E1,3E,D,12,E,A,CD,7D,F3,21,2B,E1,6,B,36,20,23,10,FB,13,13,EB,E,9,11,2B,E1,CD,C,E1,D8,11,33,E1,E,3,EA,C,E1,23,7E,FE,2E,C8,FE,D,3F,C8,ED,A0,E0,18,F3,0,0,46,69
580 DATA 6C,65,20,6E,6F,74,20,66,6F,75,6E,64,24,0,20,30,20,20,20,20,20,20,20,20,20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
590 '
600 '
610 ' ======================================
620 '       INSTRUCCIONES de GEN DISK
630 ' ======================================
640 '
650 '
660 CLS: PRINT" INSTRUCCIONES de CARGA y GRABACIÓN":PRINT"======================================":PRINT
670 PRINT"Comando G -> Carga de rutina de Disco.      Teclee G++Nombre de Archivo+ Aparecerá 'Loading nombre de archivo' o 'File not found'":PRINT:PRINT
680 PRINT"Comando P -> Grabación de rutinas de Disco. Teclee P nl,n2++Nombre de Archivo+ n1=número de línea inicial, n2=número de linea final":PRINT:PRINT
690 PRINT"Comando V -> Verificación de rutinas.       Teclee V++Nombre de Archivo+ Aparecerá 'Loading nombre de archivo' o 'File not found', y 'verified' o 'failed!'"
700 LOCATE 2,23:PRINT"Pulse una Tecla para continuar ";:A$=INPUT$(1):GOTO 280
710 CLS:PRINT"SAQUE el DISCO de la UNIDAD y APAGUE el ORDENADOR":END

Estás serían las imágenes originales del Listado:

El caso es que lo he probado en el Open-MSX y no me funciona: no me graba el Fichero resultante en Disco. De hecho, si pruebo a cargar la Cinta del GEN veo que justo cuando llega al final da un error, como si el Open-MSX no fuera del todo compatible con este Programa en cuestión... Puede que haya alguna cosa que haga que "pete" el Open-MSX...

Os dejo AQUÍ una imagen ".DSK" con el Listado en BASIC, por si alguien se anima a hacer Pruebas, lo puede probar en un MSX real y ver si funciona...

De todas formas, pese a que he revisado y requetevisado el Código BASIC (sobre todo las Datas), creo que no se me he escapado ningún error... ¡pero 4 ojos ven más que dos...! ;-)

Como comentario, decir que la línea 420 me resulta un poco rara... (no sé si eso está bien y/o no entiendo lo que hace) Eso de:

420 A$="0 BLOAD"+......

Me suena raro...

Pues lo dicho, si alguien lo consigue o ve un error en el Listado se agradece lo comparta. ;-)

Gracias & Saludetes. ;-)

!login ou Inscrivez-vous pour poster

Par manolito74

Paragon (1301)

Portrait de manolito74

10-01-2022, 23:03

Hola:

Bueno, pues después de haberme estado pegando con el Listado de marras... repasándolo una y otra vez al final he logrado que el Programa funcione. Por cierto: me ayudé con el "Test de Listados" de la Revista MSX-CLUB (que nunca había utilizado, pero en este caso sí que me ha servido...)

Sus dejo el Código completo corregido aquí:

10 '
20 ' ADAPTADOR GEN-DISK
30 '
40 '
50 ' Por JOSE FRANCISCO PERTIÑEZ RUIZ
60 '
70 '
80 '=================================
90 '  DESCRIPCIÓN Y FUNCIONAMIENTO
100 '================================
110 '
120 '
130 '
140 CLEAR 300:KEYOFF:SCREEN0:WIDTH 37:COLOR 15,4,4:ON STOP GOSUB 140:STOP ON:ON ERROR GOTO 140
150 PRINTTAB(7)"  ADAPTADOR GEN DISK"
160 PRINTTAB(7)"=======================":PRINT
170 PRINT:PRINT"Este Programa sirve para adaptar el  Ensamblador GEN de IVESON de CASSETTE a DISCO."
180 PRINT:PRINT"-Esto se consigue parcheando las Rutinas de ENTRADA/SALIDA del CASSETTE y añadiendo las correspondientes de Control de la Unidad de DISCO."
190 PRINT:PRINT"-El Programa resultante permite CARGAR, GRABAR y VERIFICAR Programas como si fuera una versión de DISCO y de la misma forma que se hace con la versión CASSETTE. A este Programa nos referiremos a partir de ahora con el nombre de GEN";
200 PRINT" DISK.": PRINT:PRINT:PRINT" Pulse una TECLA para continuar ";:A$=INPUT$(1)
210 '
220 '
230 '============================
240 '       MENÚ PRINCIPAL
250 '============================
260 '
270 '
280 CLS:PRINT:PRINTTAB(8)"MENÚ PRINCIPAL":PRINTTAB(8)"==============":PRINT:PRINT:PRINT:PRINT:PRINT" 1-Conversión del Programa":PRINT:PRINT" 2-Instrucciones de GEN DISK":PRINT:PRINT" 3-FIN del Adaptador":LOCATE,16:PRINTTAB(8)"Elija una OPCIÓN: ";
290 A=VAL(INPUT$(1)):A=-A*(A<4):ON A GOTO 310,600,710:GOTO 280
300 '
310 '
320 ' =============================
330 '    CONVERSIÓN DEL PROGRAMA
340 ' =============================
350 '
360 '
370 CLS:PRINT"Pulse PLAY en el Cassette con el Ensamblador GEN dentro y pulse una TECLA ";:A$=INPUT$(1)
380 BLOAD"CAS:",&H1000:PRINT:PRINT"  -->>>Cargado GEN desde CINTA"
390 PRINT:PRINT:PRINT"Introduzca un DISQUETE en la Unidad y pulse una TECLA ";:A$=INPUT$(1)
400 A=&HE0:B=&H58:C=0:POKE&H9A1C,B:POKE&H9A2D,B:POKE&HA128,B:POKE&HAF03,B:POKE&H99FA,C:POKE&H9A06,C:POKE&H99CA,C:POKE&H99CB,C:POKE&H99CC,C:POKE&H9A29,C:POKE&H9A2A,C:POKE&H9A2B,C:POKE&H9A3E,C:POKE&H9A3F,C:POKE&H9A40,C:POKE&H9A1D,A:POKE&H9A2E,A
410 POKE&HA129,A:POKE&H99FB,A:POKE &H9A07,A
420 A$="0 BLOAD"+CHR$(34)+"GEND.BIN"+CHR$(34)+",-&H1000:BLOAD"+CHR$(34)+"GEND.DK"+CHR$(34)+":DEFUSR=&H8800:?USR(128):DEFUSR=&HFFF0:DELETE0"+CHR$(13)+"1 ?USR(0):END"+CHR$(13):OPEN"GEN"FOROUTPUTAS#1:PRINT#1,A$:CLOSE
430 BSAVE"GEND.BIN",&H9800,&HBE00
440 FOR J=&HE000 TO &HE14F:READ A$:POKEI,VAL("&H"+A$):NEXT
450 BSAVE"GEND.DK",&HE000,&HE14F:PRINT:PRINT:PRINT:PRINT"Finalizada la ADAPTACIÓN":FOR I=0 TO 2000:NEXT:PRINT:PRINT:PRINT:PRINT:PRINT"Pulse una Tecla para continuar";:A$=INPUT$(1):BEEP:BEEP:GOTO 140
460 '
470 '
480 ' RUTINAS DE ENTRADA/SALIDA
490 '
500 ' DEL DISCO
510 '
520 '
530 DATA CD,E9,FF,DD,E5,C5,D5,E5,C5,3A,1A,E1,B7,20,16,CD,E2,E0,11,2A,E1,E,16,CD,7D,F3,21,0,0,22,4B,E1,3E,1,32,1A,E1,11,4E,E1,E,1A,CD,7D,F3,2A,30,FA,11,4E,E1,1,0,4,ED,B0,1
540 DATA 0,4,ED,43,38,E1,11,2A,E1,21,1,0,E,26,CD,7D,F3,C1,79,B7,CC,D6,E0,E1,D1,C1,DD,E1,C3,E2,FF,CD,E9,FF,DD,E5,C5,D5,3A,1A,E1,B7,20,14,CD,E2,E0,11,2A,E1,E,F,CD,7D,F3,B7,20
550 DATA 4D,21,0,0,22,4B,E1,11,4E,E1,E,1A,CD,7D,F3,1,0,4,ED,43,38,E1,11,2A,E1,21,1,0,E,27,CD,7D,F3,21,4E,E1,ED,5B,30,FA,1,0,4,ED,B0,3A,1A,E1,B7,CC,CF,E0,3E,1,32,1A,E1
560 DATA 3A,19,E1,D6,4,DC,D6,E0,32,19,E1,D1,C1,DD,E1,2A,30,FA,C3,E2,FF,11,1B,E1,E,9,CD,7D,F3,D1,C1,DD,E1,C3,F0,F9,3A,A1,D7,32,19,E1,C9,11,2A,E1,AF,32,1A,E1,E,10,C3,7D,F3,11,4E
570 DATA E1,3E,D,12,E,A,CD,7D,F3,21,2B,E1,6,B,36,20,23,10,FB,13,13,EB,E,9,11,2B,E1,CD,C,E1,D8,11,33,E1,E,3,EA,C,E1,23,7E,FE,2E,C8,FE,D,3F,C8,ED,A0,E0,18,F3,0,0,46,69
580 DATA 6C,65,20,6E,6F,74,20,66,6F,75,6E,64,24,0,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
590 '
600 '
610 '===============================
620 '   INSTRUCCIONES DE GEN DISK
630 '===============================
640 '
650 '
660 CLS:PRINT" INSTRUCCIONES de CARGA y GRABACIÓN":PRINT"====================================":PRINT
670 PRINT"G -> Carga de Rutina de Disco.      Teclee G++Nombre de Archivo+ Aparecerá *LOADING Nombre de Archivo* o *File Not Found*":PRINT:PRINT
680 PRINT"P -> Grabación de Rutinas de Disco. Teclee P NL,N2++Nombre de Archivo+ N1=Número de Linea Inicial, N2=Número de Linea Final":PRINT:PRINT
690 PRINT"V -> Verificación de Rutinas.       Teclee V++Nombre de Archivo+ Aparecerá *Loading Nombre de Archivo* o *File not Found*  y *Verified* o *Failed!*"
700 LOCATE 2,23:PRINT"Pulse una Tecla para continuar ";:A$=INPUT$(1):GOTO 280
710 CLS:PRINT:PRINT:PRINT:PRINT"Saque el DISCO de la UNIDAD y APAGUE el ORDENADOR":PRINT:PRINT:END

Saludetes. ;-)

Par JamesBurton

Expert (97)

Portrait de JamesBurton

10-01-2022, 23:23

Yo estaba en las mismas: picándome el programa desde cero y usando el test de listados para verificar que lo estaba picando correctamente. Iba por la línea 400 Smile

Muchas gracias manolito74 por enviar el programa corregido y funcionando Wink

Par JamesBurton

Expert (97)

Portrait de JamesBurton

11-01-2022, 13:00

manolito74 wrote:

Como comentario, decir que la línea 420 me resulta un poco rara... (no sé si eso está bien y/o no entiendo lo que hace) Eso de:

420 A$="0 BLOAD"+......

Me suena raro...

Lo que hace esa línea es meter en la variable A$ un programa BASIC de dos líneas (las líneas 0 y 1) y grabar ese programa BASIC en el disco con el nombre "GEN". Curiosamente, cuando ese programa "GEN" se ejecute, la línea 0 se auto-borrará a sí misma...

Par MDDRED

Expert (91)

Portrait de MDDRED

11-01-2022, 19:17

El Gen-Disco.DSK que as dejado tiene un fichero dentro ADAPTA.BAS que acabo de ejecutar en Philips 8235 desde el multimente con un MegaFlashRom y se ejecuta bien. El resto del proceso no puedo probarlo.
Por si esto te sirve de ayuda.

Par manolito74

Paragon (1301)

Portrait de manolito74

11-01-2022, 21:46

Hola:

De nada @JamesBurton Gracias por tus comentarios y colaboración. Un placer publicarlo y compartirlo (ya que me estuve pegando 2 días con esa mi**da Código... ¡qué menos que compartirlo una vez resuelto..!) ;-)

Básicamente tenía 2 fallos:

- En la Línea 400, que parece que pone A=&HF0 en realidad es A=&HE0
- La línea 420, me resultaba rara porque no entendía muy bien lo que hacía. ¡Gracias por la explicación! Al principio un fallo que tenía era que ponía FOROUPUTA$#1, en vez de AS#1 (confundí/cambié la "ese" por el "dolar"...)
- Y el fallo chungo chungo chungo que me costó encontrarlo... fue que al final entre el PRINT#1 y el A$ va una coma... (¡qué en el Listado original no se percibe...!) (me sonaba no obstante que la estructura era así, con la coma). Es decir, quedaría: PRINT#1, A$

Nunca había usado el famoso "Test de Listados". De hecho me costó encontrarlo (lo pude conseguir de la Página de Konamito GAMEMSXWORLD) La verdad que me sorprendió y me resultó útil, porque sabía que en la línea 420 era donde fallaba y me costó dar con los errores. El "Test de Listados" creo que tampoco es la panacea, que a veces falla, pero a mí me sirvió de ayuda.

Por cierto... La calidad de Impresión de los Listados de la MSX-CLUB era PÉSIMA NO, ¡LO SIGUIENTE...! Están impresos con tinta muy "tenue". A veces cuesta distinguir las "es" mayúsculas de las "efes" mayúsculas por ejemplo... Y me llama poderosamente la atención que no usaran una tipografía para distinguir las "oes" de los "ceros"... (¡Qué no sé qué coñe usarían para imprimir los Listados, que en el MSX se distinguen perfectamente porque los "ceros" llevan la mítica raya "cruzada"...)

Por cierto, para usar en PC, hay una fuente que se llama "Hermit" que está muy bien. Distingue perfectamente las eles minúsculas de los unos o de las ies mayúsculas (que a veces también cuesta distinguirlas...) Los ceros los distingue bastante bien de las oes, aunque el fallo que tiene es que en los ceros no lleva la barra esa "cruzada".

Gracias a ti también @Mddred por tu ayuda y por tus pruebas. Como ves finalmente (gracias a lo cabezota que soy... ya que hasta que no lo solucioné no paré) pude dar con los errores y el último Listado que publiqué es totalmente funcional. ;-)

Además al principio sabía que no funcionaba porque no mostraba el mensaje de "Conversión Realizada". Y le añadí como "extra" una línea que muestra un mensaje de que se ha leído el "GEN" de la Cinta (que no estaba muy seguro de si lo llegaba a leer o no...)

Por cierto, en la línea 290 fipé un poco con la forma tan chunga que tiene de comprobar que metes un número entre 1 y 3, eso de:

A=VAL(INPUT$(1)):A=-A*(A<4):ON A GOTO 310,600,710:GOTO 280

Me parece de lo más retorcido... A=-A*(A<4)....

Gracias & Saludetes. ;-)

Par mohai

Paragon (1051)

Portrait de mohai

14-01-2022, 23:07

Enhorabuena. Me alegro que te haya funcionado.
En su día tuve el GENMSX en cinta y lo usé bastante cuando empezaba con el ensamblador.
Siempre me pareció un ensamblador muy útil, por su capacidad de poder reubicarse en memoria y sus múltiples opciones.
Me daba rabia cuando ensamblabas donde no debías o metías la pata con algún comando y se colgaba y perdías todo el trabajo.
Creo que necesitaba el poke -1 en algunos MSX.
En el listado he visto una cosa que podría ser peligrosa: la línea 400 escribe en el área de trabajo de disco. Si desactivas la segunda unidad no será problema.

Par manolito74

Paragon (1301)

Portrait de manolito74

17-01-2022, 20:20

¡Hola, @mohai!:

Gracias por tus comentarios.

Yo a nivel de Código, ni idea de lo que hace exactamente el Programa a la hora de escribir/sobreescribir en zonas de Memoria "delicadas". No obstante está bien tu observación para que la gente lo tenga en cuenta.

Es que vi el Listado y me resultó cuanto menos curioso. Desde luego fue una genialidad que alguien se atreviera "parchear" un Programa Comercial y darle esa gran utilidad para los por entonces afortunados poseedores de una Unidad de Disco. ¡Lo que hubiera dado yo en aquella época por tener una Unidad de Disco...! Cuando intenté conseguir una, o al menos hacerme una idea de lo que valían, comercialmente ya no se podían conseguir. La única forma era ya tan solo a través de LASP y el Precio era totalmente PROHIBITIVO.

Curiosamente yo en la época ese Ensamblador no lo llegué a usar. Los pocos listados que "piqué" fueron con el RSC, por eso es un Ensamblador al que le guardo especial cariño. Me parecía muy cómodo, muy usable y además estaba en el Idioma de Cervantes. ;-)

Saludetes. ;-)