SERIE CONVERSIONES DEL APPLE II AL ZX SPECTRUM Programa: Address Book por Michael O'Malley. encontrado en archive.org/ coleccion Apple II Library: Applications dentro de The Software Library: Apple Computer. El listado original: 10 REM ************************ 15 REM 20 REM ADDRESS BOOK 30 REM 40 REM - BY MICHAEL O'MALLEY 50 REM A GRADE 12 "FUN" PROJECT 60 REM ************************ 100 REM 110 D$ = CHR$(4): REM CTRL-D 115 W = 300: REM 300 NAMES / ADDRESSES ! 120 DIM A$(300,4): REM 300 NAMES / ADDRESSES ! 125 L = 0: REM NUMBER OF NAMES / ADDRESSES CURRENTLY IN THE ARRAY 130 SL = 0: REM THE PRINTER IS CURRENTLY OFF 135 P$ = "OFF" 190 GOSUB 8000: REM LOAD NAME / ADDRESS DATA 200 REM 201 REM ************************ 202 REM MAIN MENU 203 REM ************************ 205 TEXT : HOME 210 PRINT "=======================================" 215 PRINT " ADDRESS BOOK" 220 PRINT " BY MICHAEL O'MALLEY" 225 PRINT "=======================================" 230 PRINT " ";L;" NAMES/ADDRESSES (MAX = ";W;")" 235 PRINT " PRINTER IS ";: INVERSE : PRINT P$: NORMAL 240 PRINT : PRINT " WHAT DO YOU REQUIRE ?? -> " 245 PRINT : PRINT " 1. ENTER A NEW NAME/ADDRESS" 250 PRINT : PRINT " 2. LOOK UP SOMEBODY" 255 PRINT : PRINT " 3. LOOK AT ENTIRE LIST OF NAMES" 260 PRINT : PRINT " 4. TURN PRINTER ON / OFF" 265 PRINT : PRINT " 5. DELETE A NAME / ADDRESS" 270 PRINT : PRINT " 6. DELETE ALL NAMES / ADDRESSES" 275 PRINT : PRINT " 7. EXIT PROGRAM" 280 PRINT : PRINT " WHICH ?? -> ";: GET B 285 IF B <1 OR B >7 THEN GOTO 200: REM DISPLAY THE MENU AGAIN 290 ON B GOSUB 300,400,500,600,700,900,9000 295 GOTO 200: REM DISPLAY THE MENU AGAIN 300 REM 301 REM *********************** 302 REM ENTER NEW NAME /ADDRESS 303 REM *********************** 310 TEXT : HOME 315 PRINT : PRINT : PRINT 320 L = L +1 325 PRINT " (USE NO COMMAS,COLONS OR FULL STOPS)" 330 PRINT : PRINT : PRINT "ENTRY No. = ";L;" / ";W 335 PRINT : PRINT 340 REM NAME CANNOT BE BLANK - BUT OTHER FIELDS CAN BE BLANK 345 PRINT : INPUT " ENTER NAME -> ";A$(L,1) 350 IF A$(L,1) = "" THEN PRINT : PRINT " **ERROR : NAME CANNOT BE BLANK !": GOTO 340 355 PRINT : INPUT " ENTER ADDRESS -> ";A$(L,2) 360 PRINT : INPUT " ENTER PHONE NO. -> ";A$(L,3) 365 PRINT : INPUT " ENTER BIRTHDAY -> ";A$(L,4) 370 PRINT : PRINT : PRINT 375 PRINT : PRINT "ADD MORE NAMES / ADDRESSES (Y/N)";: GET F$ 380 IF F$ = "Y" THEN 300 399 RETURN 400 REM 401 REM *********************** 402 REM LOOK UP SOMEBODY 403 REM *********************** 404 PR# SL: REM PRINTER ON/OFF 405 TEXT : HOME : PRINT : PRINT 410 PRINT "WHAT NAME SHALL I LOOK UP FOR YOU...": INPUT V$ 415 PRINT : PRINT 420 M = 0: REM NUMBER OF MATCHES 422 PRINT "=======================================" 425 REM SEARCH ENTIRE ARRAY FOR A MATCHING NAME 430 FOR I = 1 TO L 440 IF A$(I,1) = V$ THEN M = M +1: GOSUB 7000: REM DISPLAY CURRENT NAME / ADDRESS 450 NEXT I 460 IF M = 0 THEN PRINT " NO MATCHES FOUND ... SORRY !" 485 PR# 0: REM PRINTER OFF 490 PRINT : PRINT 495 PRINT : PRINT " HIT ANY KEY...";: GET Z$ 499 RETURN 500 REM 501 REM *********************** 502 REM LOOK AT ENTIRE LIST 503 REM *********************** 505 TEXT : HOME 510 PR# SL: REM PRINTER ON/OFF 515 PRINT : PRINT 520 REM DISPLAY ENTIRE ARRAY 522 PRINT "=======================================" 525 LC = 0: REM LINE COUNT 530 FOR I = 1 TO L 540 GOSUB 7000: REM DISPLAY CURRENT NAME / ADDRESS 550 LC = LC +1 560 IF LC = 3 THEN LC = 0: PRINT : PRINT " HIT ANY KEY...";: GET Z$: TEXT : HOME : PRINT : PRINT "=======================================" 570 NEXT I 585 PR# 0: REM PRINTER OFF 590 PRINT : PRINT 595 PRINT : PRINT " HIT ANY KEY...";: GET Z$ 599 RETURN 600 REM 601 REM ************************* 602 REM TURN PRINTER ON / OFF 603 REM ************************* 610 REM THE VALUE OF SL IS USED TO CONTROL THE PRINTER VIA 620 IF P$ = "OFF" THEN P$ = "ON":SL = 1 630 IF P$ = "ON" THEN P$ = "OFF":SL = 0 699 RETURN 700 REM 701 REM *********************** 702 REM DELETE A NAME / ADDRESS 703 REM *********************** 705 TEXT : HOME : PRINT : PRINT 710 PRINT " DELETE DATA FOR WHAT NAME ": INPUT V$ 712 IF V$ = "" THEN GOTO 799: REM EXIT BACK TO MENU 715 PRINT : PRINT 720 PRINT " ARE YOU SURE (Y/N) ";: GET L$ 725 IF L$ < >"Y" THEN GOTO 799: REM EXIT BACK TO MENU 730 M = 0: REM NUMBER OF MATCHES 735 REM SEARCH ENTIRE ARRAY FOR A MATCHING NAME 740 FOR I = 1 TO L 745 IF A$(I,1) = V$ THEN M = M +1: GOSUB 800: REM SHUFFLE DOWN DATA 750 NEXT I 753 PRINT : PRINT 755 IF M = 0 THEN PRINT " NO MATCHES FOUND ... SORRY !" 760 IF M >0 THEN PRINT " ";M;" MATCHING RECORDS DELETED !" 790 PRINT : PRINT 795 PRINT : PRINT " HIT ANY KEY...";: GET Z$ 799 RETURN 800 REM 801 REM ********************** 802 REM SHUFFLE DOWN DATA IN 803 REM ARRAY TO REMOVE THE 804 REM MATCHING RECORD 805 REM ********************** 810 L = L - 1: REM REDUCE THE NUMBER OF PEOPLE IN THE ARRAY 815 FOR R = I TO L 820 A$(I,1) = A$(I +1,1) 825 A$(I,2) = A$(I +1,2) 830 A$(I,3) = A$(I +1,3) 835 A$(I,4) = A$(I +1,4) 840 NEXT R 899 RETURN 900 REM 901 REM ************************* 902 REM DELETE ALL NAMES / ADDRESSES 903 REM ************************* 904 TEXT : HOME : PRINT : PRINT : PRINT 905 PRINT " WARNING !! THIS WILL DESTROY ALL" 910 PRINT : PRINT " ";L;" NAMES AND ADDRESSES STORED IN THE FILE." 915 PRINT : PRINT 920 PRINT " ARE YOU SURE (Y/N) ";: GET L$ 925 IF L$ < > "Y" THEN GOTO 999: REM EXIT BACK TO MENU 930 PRINT : PRINT : PRINT 932 ONERR GOTO 999: REM EXIT BACK TO MENU 935 PRINT " DELETING ADDRESS.DATA ... " 940 PRINT D$;"DELETE ADDRESS.DATA" 942 REM NOW WRITE A ZERO TO THE FILE 944 REM ERASE DATA FILE 945 PRINT D$;"OPEN ADDRESS.DATA" 950 PRINT D$;"WRITE ADDRESS.DATA" 955 PRINT 0 960 PRINT D$;"CLOSE ADDRESS.DATA" 970 REM ERASE ALL DATA IN THE ARRAY 975 FOR I = 1 TO L 980 FOR J = 1 TO 4 985 A$(I,J) = "" 990 NEXT J 995 NEXT I 1000 PRINT : PRINT 1010 PRINT " ";L;" NAMES AND ADDRESSES ERASED !" 1020 REM SET THE NUMBER OF RECORDS IN THE ARRAY TO 0 1030 L = 0 1099 RETURN 7000 REM 7001 REM ************************* 7002 REM DISPLAY CURRENT NAME 7003 REM AND ADDRESS DETAILS 7004 REM ************************* 7020 PRINT " RECORD : ";I 7030 PRINT " NAME : ";A$(I,1) 7040 PRINT " ADDRESS : ";A$(I,2) 7050 PRINT " PHONE NO : ";A$(I,3) 7060 PRINT " BIRTHDAY : ";A$(I,4) 7070 PRINT "=======================================" 7099 RETURN 8000 REM 8001 REM ************************* 8002 REM LOAD NAME / ADDRESS DATA 8003 REM ************************* 8005 PRINT : PRINT 8010 PRINT " READING NAME AND ADDRESS DATA ..." 8012 ONERR GOTO 8065: REM CLOSE FILE 8015 PRINT D$;"OPEN ADDRESS.DATA" 8020 PRINT D$;"READ ADDRESS.DATA" 8024 REM READ THE NUMBER OF PEOPLE IN THE ARRAY 8025 INPUT L 8026 PRINT L 8027 IF L = 0 THEN GOTO 8060 8030 REM NOW READ THE ARRAY DATA 8035 FOR K = 1 TO L 8040 FOR J = 1 TO 4 8045 INPUT A$(K,J) 8050 NEXT J 8055 NEXT K 8060 PRINT D$;"CLOSE ADDRESS.DATA" 8065 PRINT : PRINT " ";L;" NAMES / ADDRESS LOADED." 8099 RETURN 9000 REM 9001 REM ************************* 9002 REM SAVE NAME / ADDRESS DATA 9003 REM AND EXIT PROGRAM 9004 REM ************************* 9005 PRINT : PRINT 9010 PRINT " SAVING NAME AND ADDRESS DATA ..." 9012 ONERR GOTO 9060: REM CLOSE FILE 9015 PRINT D$;"OPEN ADDRESS.DATA" 9020 PRINT D$;"WRITE ADDRESS.DATA" 9022 REM SAVE THE NUMBER OF PEOPLE IN THE ARRAY 9025 PRINT L 9030 REM NOW SAVE THE ARRAY DATA 9035 FOR K = 1 TO L 9040 FOR J = 1 TO 4 9045 PRINT A$(K,J) 9050 NEXT J 9055 NEXT K 9060 PRINT D$;"CLOSE ADDRESS.DATA" 9065 PRINT : PRINT " ";L;" NAMES / ADDRESS WRITTEN." 9070 PRINT : PRINT : PRINT " GOODBYE !! " 9999 END A continuacion una peque~a muestra de base de datos manejada por el programa cuyo texto es encontrado en: Address_Book_19xx_OMalley_Michael.do/ADDRESS.DATA.txt. 6 MIKE PACIFIC PDE 344 441 1-1-1965 BRAD TUGUN (010) 123 456 JAN 2 STUEY CURRUMBIN 3344555 FEB 28 1965 CATHY D BUNYIP ST 1234555 MAY FRANK GRUNDY'S AT SURFERS 22233344 MARCH CLINT EASTWOOD HOLLYWOOD BLVD 12121212 APRIL PORTANDOLO AL SPECTRUM Tras estudiar las variables elegidas por su autor, paso a hacer los sigte. cambius para poder portarlo al Spectrum: 110 D$ = CHR$(4): REM CTRL-D necesario en el Apple II ya que este codigo es usado para acceder a los comandos de disco ERASE, OPEN o CLOSE requeridos por el programa. Innecesario en el Spectrum. Debe eliminarse o darle otro uso a D$. 120 DIM A$(300,4): REM 300 Nombres/Direcciones! Esta linea nos dice que tenemos 300 registros con 4 campos a longitud libre. En el Spectrum debemos cambiarlo por A$(300,4,long) donde long implica un largo fijado para todos los campos generando un despedicio de espacio en los campos de menor tama~o. La otra alternativa es usar una sola longitud maxima con la suma de cada campo del modo: Name = A$(x,1) - nombre A$(x, 20 caracteres) Address = A$(x,2) - direccion A$(x, 20 caracteres) Phone # = A$(x,3) - telf. A$(x, 15 caracteres) Birthday = A$(x,4) - cumplea~os A$(x, 12 caracteres) Esto me da 20+20+15+12=67 para long, por lo que esa linea pasa a ser: 120 DIM A$(300,67) 820 A$(I,1) = A$(I+1,1) Ahora en el Spectrum esto se convierte en: 820 LET A$(I, TO 20)=A$(I+1, TO 20) y asi igual con todas las lineas que lean cada campo por registro 205 TEXT : HOME en el Spectrum debemos reemplazar esta linea por CLS 290 ON B GOSUB ... Inexistenete en el Spectrum debemos reemplazarlo por su equivalente Sinclair como es el GOTO condicional o una funcion definida que lo replique. 404 PR# SL: REM SL = activar(1)/desactivar(0) impresora En el Spectrum con ZX PRINTER debemos reemplazar SL por S$ y hacer: 404 OPEN #2,S$: REM S$ = activar("P")/desactivar("S") impresora 902 REM Eliminar todos los nombres / Direcciones Esta subrutina tiene las sigtes. lineas que debemos modificar: 932 ONERR GOTO ... Inexistente en un Spectrum sin expandir, podemos simplemente omitirla. 940 PRINT D$;"ERASE ... En un Spectrum sin expandir debemos ignorar esta instruccion, pero la podemos adaptar si usamos Microdrives o sistemas de disco como el +D o Timex. En suma para la version de cinta debemos ignorar y eliminar todas las lineas del 932 al 1000 y sustituir el bucle de las lineas del 975 al 995 por: 980 DIM A$(W,60) 8002 REM Cargar datos de nombres / direcciones Aqui debemos eliminar y reemplazar las lineas desde 8012 al 8025 por: 8020 LOAD "ADDRESS.L" DATA L(): LET L=L(1) y las del 8025 al 8060 por: 8030 LOAD "ADDRESS.A$" DATA A$() 9002 REM salvar datos de nombres / direcciones Eliminamos las lineas del 9012 al 9060 y los reemplazamos por: 8020 SAVE "ADDRESS.L" DATA L() 8030 LOAD "ADDRESS.A$" DATA A$() y a~adiremos la linea: 110 DIM L(1) Esta es la unica version que funcionaria con el +3, MB-02+ y Speccy Dos. FICHEROS SECUENCIALES El Spectrum solamente puede trabajar con ficheros secuenciales si se poseen Microdrives, Wafadrive o discos como el Opus discovery, +D o Timex FDD-3000. Ahora veremos la conversion a fichero secuencial en un Spectrum expandido. Version Microdrive A continuacion el listado completo adaptado al ZX MicroDRive con la ZX Printer, funcion ON GOSUB, sin lineas REM, ni ON ERR y el texto traducido al castellano: 10 REM ************************ 20 REM Directorio 60 REM ************************ 100 DEF FN o(n,a$)=VAL a$((n-1)*5+1 TO (n-1)*5+4) 110 LET D$="M" 115 LET W=300 120 DIM A$(W,67) 125 LET L=0 130 LET S$="S" 135 LET P$="OFF" 190 GO SUB 8000 205 CLS 210 PRINT "=================================" 215 PRINT " DIRECTORIO" 220 PRINT " VERSION ZX SPECTRUM" 225 PRINT "=================================" 230 PRINT " ";L;" Nombres/Dir. (MAX = ";W;")" 235 PRINT " La impresora esta "; INVERSE 1;P$ 240 PRINT '" Que desea hacer ?? -> " 245 PRINT " 1. Dar nuevo nombre/dir." 250 PRINT " 2. Busqueda" 255 PRINT " 3. Ver todo la lista" 260 PRINT " 4. Activar/desactivar impresora" 265 PRINT " 5. Eliminar un nombre/dir." 270 PRINT " 6. Borrar todos los datos" 275 PRINT " 7. Salir del programa" 280 PRINT ''" Elegir -> " 281 PAUSE 0: LET B=VAL INKEY$ 285 IF B<1 OR B>7 THEN GO TO 281 290 GO SUB FN O(B,"0300,0400,0500,0600,0700,0900,9000") 295 GO TO 200 310 CLS 315 PRINT : PRINT : PRINT 320 LET L=L+1 325 PRINT " (No use comas o puntos)" 330 PRINT ''"Entrada # ";L;" / ";W 335 PRINT : PRINT 345 PRINT : INPUT " Ingrese nombre -> ";A$(L, TO 20) 350 IF A$(L,1)=" " THEN PRINT '" **ERROR :"'" Nombre no puede ser un espacio !": GO TO 340 355 PRINT A$(L, TO 20): INPUT " Ingrese direccion -> "; A$(L,21 TO 40) 360 PRINT A$(L,21 TO 40): INPUT " Numero telefonico -> "; A$(L,41 TO 55) 365 PRINT A$(L,41 TO 55): INPUT " Cumplea~os -> ";A$(L,56 TO ) 370 PRINT A$(L,56 TO) 375 PRINT #0;"Mas nombres / dir. (S/N)";: PAUSE 0: LET F$=INKEY$ 380 IF F$="S" THEN GO TO 300 399 RETURN 404 OPEN #2,S$ 405 CLS : PRINT : PRINT 410 INPUT "Cual nombre busco...";V$ 415 PRINT : PRINT 420 LET M=0 422 PRINT "================================" 430 FOR I=1 TO L 440 IF A$(I,1 TO LEN V$)=V$ THEN LET M=M+1: GO SUB 7000 450 NEXT I 460 IF M=0 THEN PRINT " No encontrado ... lo siento !" 485 OPEN #2,"S" 490 PRINT : PRINT 495 PRINT #0;" Pulse una tecla...": PAUSE 0 499 RETURN 505 CLS 510 OPEN #2,S$ 515 PRINT 522 PRINT '"================================" 525 LET LC=0 530 FOR I=1 TO L 540 GO SUB 7000 550 LET LC=LC+1 560 IF LC=3 THEN LET LC=0: PRINT #0;" Pulse una tecla...": PAUSE 0: CLS : PRINT '"===============================" 570 NEXT I 585 OPEN #2,"S" 590 PRINT 595 PRINT #0;" Pulse una tecla...": PAUSE 0 599 RETURN 600 REM 620 IF P$="OFF" THEN LET P$="ON": LET S$="P" 630 IF P$="ON" THEN LET P$="OFF": LET S$="S" 699 RETURN 705 CLS 710 PRINT ''" Nombre a eliminar ": INPUT V$ 712 IF V$="" THEN GO TO 799 715 PRINT 720 PRINT '" Esta seguro (S/N) ": PAUSE 0: LET L$=INKEY$ 725 IF L$<>"S" THEN GO TO 799 730 LET M=0 740 FOR I=1 TO L 745 IF A$(I, TO LEN V$)=V$ THEN LET M=M+1: GO SUB 800 750 NEXT I 753 PRINT : PRINT 755 IF M=0 THEN PRINT " No encontrado ... lo siento !" 760 IF M>0 THEN PRINT " ";M;" MATCHING RECORDS DELETED !" 790 PRINT 795 PRINT ''" Pulse una tecla...": PAUSE 0 799 RETURN 810 LET L=L-1 815 FOR R=I TO L 820 LET A$(I, TO 20)=A$(I+1, TO 20) 825 LET A$(I,21 TO 40)=A$(I+1,21 TO 40) 830 LET A$(I,41 TO 55)=A$(I+1,41 TO 55) 835 LET A$(I,56 TO)=A$(I+1,56 TO) 840 NEXT R 899 RETURN 900 REM 904 CLS 905 PRINT '''" Advertencia !! Se destruiran" 910 PRINT '" ";L;" nombres y direcciones del fichero." 915 PRINT 920 PRINT '" Esta seguro (S/N) ";: PAUSE 0: LET L$=INKEY$ 925 IF L$<>"S" THEN GO TO 1099 930 PRINT 940 PRINT ''"Eliminar ADDRESS.D" 945 ERASE D$,1,"ADDRESS.D" 950 OPEN #4;D$;1;"ADDRESS.D" 955 PRINT #4;0 960 CLOSE #4 980 DIM A$(W,67) 1000 PRINT 1010 PRINT '" ";L;" nombres y direcciones borrados !" 1030 LET L=0 1099 RETURN 7000 REM 7020 PRINT " Registro : ";I 7030 PRINT " Nombre : ";A$(I, TO 20) 7040 PRINT " Dir : ";A$(I,21 TO 40) 7050 PRINT " Telf. : ";A$(I,41 TO 50) 7060 PRINT " Cumplea~os : ";A$(I,51 TO ) 7070 PRINT "================================" 7099 RETURN 8005 PRINT 8010 PRINT '" Leyendo datos ..." 8015 OPEN #4;D$;1;"ADDRESS.D" 8020 PRINT "Leer ADDRESS.D" 8025 INPUT #4;L 8026 PRINT L 8027 IF L=0 THEN GO TO 8060 8035 FOR K=1 TO L 8045 INPUT #4;A$(K) 8055 NEXT K 8060 PRINT "Cerrar ADDRESS.D": CLOSE #4 8065 PRINT '" ";L;" nombres / dir. cargados.":INPUT "Pulse ENTER"; LINE V$ 8099 RETURN 9005 PRINT 9010 PRINT '" Salvando datos..."'''"Por primera vez pulse 1" '"Volver a salvar pulse 2": INPUT n: IF n=2 THEN ERASE D$,1, "ADDRESS.D" 9015 OPEN #4;D$,1,"ADDRESS.D" 9020 PRINT "Escribir ADDRESS.D" 9025 PRINT #4;L 9035 FOR K=1 TO L 9045 PRINT #4;A$(K) 9055 NEXT K 9060 PRINT "Cerrar ADDRESS.D": CLOSE #4 9065 PRINT '" ";L;" nombres / dir. escritos." 9070 PRINT ''" ADIOS !! " Versión Wafadrive solamente hay que reemplazar las líneas 945 ERASE *"ADDRESS.D" 950, 8015 y 9015 OPEN #*4;"ADDRESS.D" 8060 y 9060 ... : CLOSE #*4 Versión Opus 945 ERASE 1;"ADDRESS.D" - puede ser omitida 8015 OPEN #4;1;"ADDRESS.D"IN 950 y 9015 OPEN #4;1;"ADDRESS.D" OUT 8060 y 9060 ... : CLOSE #4 Versión DiscIple y +D En este caso la sintaxis es parecida a la del Opus: 945 ERASE D*"ADDRESS.D" - puede ser omitida 8015 OPEN #4;d*"ADDRESS.D"IN 950 y 9015 OPEN #4;d*"ADDRESS.D" OUT 8060 y 9060 ... : CLOSE #* Versión BETAdisco DOS =15619 para BETA128 y DOS =15363 para Betadisc 48 o Betaplus 945 RANDOMIZE USR DOS:REM: ERASE "ADDRESSD" 8015 RANDOMIZE USR DOS:REM: OPEN #4;"ADDRESSD";R 950 y 9015 RANDOMIZE USR DOS:REM: OPEN #4;"ADDRESSD";W 8060 y 9060 ...: RANDOMIZE USR DOS:REM: CLOSE #4 Versión Didaktik 945 ERASE *"ADDRESS_D" - puede ser omitida 8015 OPEN #4,,"ADDRESS_D" 950 y 9015 OPEN #4,"ADDRESS_D" 8060 y 9060 ... : CLOSE # Version Kempston-Dos y Sp-Dos 945 PRINT #4: ERASE "ADDRESS/DAT" 950, 8015 y 9015 PRINT #4: OPEN #1;"ADDRESS/DAT" 8060 y 9060 ... : PRINT #4: CLOSE #1 Versión Timex FDD-3000 hacer previamente DIM*"cast" para crear el fichero secuencial 945 ERASE *"ADDRESS.DAT":DIM *"ADDRESS.DAT" 8015 OPEN #*1;"ADDRESS.DAT";I 950 y 9015 OPEN #*1;"ADDRESS.DAT";O 8060 y 9060 ... : CLOSE #*1 8045 INPUT #4;V$: LET A$(K)=V$ Version QL 8015 OPEN_IN #4,mdv1_ADDRESSDAT 950 y 9015 OPEN_NEW #4,mdv1_ADDRESSDAT Versión SAM Coupe Sin expansion, solamente puede usar la version de cinta del Spectrum, del mismo modo que el +3 y MB02. SAM con Master Dos sintaxis similar a la de Opus y DiscIple: 8015 OPEN #4;"ADDRESS.DAT"IN 950 y 9015 OPEN #4;"ADDRESS.DAT"OUT 8060 y 9060 ... : CLOSE #4 FICHEROS DIRECTOS Aunque el programa fue pensado como fichero secuencial, podemos hacer una mejora adaptándolo para trabajar como fichero directo. En este caso el Spectrum solo puede accesar a este tipo de ficheros si se tiene el Opus Discovery o el Timex FDD. Betadisc o 128 también accesa estos ficheros mientras el +D solamente con Betados o Unidos. El SAM Coupe solamente con Master Dos. Observaciones: 1. El nombre del fichero. En el Microdrive es posible usar el token DATA como extension al nombre del fichero. En el +3 y Timex se usa la norma CP/M para nombres osea 8 caracteres mas el punto y 3 caracteres como extension. Eso hacen 12 caracteres en total. Pero el ZX Spectrum se limita a solo 10 caracteres para el nombre. De este modo nos sera posible burlar tal limitacion al hacer "ADDRESS. DATA" que tiene solo 9 caracteres realmente como nombre ya que despues del punto un token es lo que sigue en vez de D como en "ADDRESS.D". 2. El menu. En mi version para MicroDRive decidi modificar el menu y a~adirle una opcion 0 para cargar el fichero cuando lo desee, para lo cual agregue las sigtes. lineas: 242 PRINT '" 0. Cargar el fichero" 282 IF B=0 THEN LET L=1: CLS:GO TO 190 8002 IF L=0 THEN GO TO 8099 El motivo es que el programa original de Apple II hace uso de ONERR para capturar el error posible de que el fichero no exista, pero la Interfaz 1 carece de tal comando, por lo que elegi hacerlo asi. La otra alternativa es crear el fichero con valor 0 antes de ejecutar el programa y asi evitar el error de fichero no encontrado que causa que se interrumpa el programa. 3. La subrutina de carga. En la version de cinta o +3 es necesario que se depure bien primero el programa directorio antes de salvarlo y a continuacion hacer lo sigte: Version cinta o +3: DIM L(1): SAVE "ADDRESS.L" DATA L() para evitar que se genere un error a la hora de ejecutar por primera vez el programa. Version MDR o disco: OPEN #4;"M";1;"ADDRESS.D": PRINT #4;0: CLOSE #4 4. La subrutina para salvar. En la version MicroDRive me parecio muy necesario agregar una opcion para verificar si se crea el fichero por primera vez o no. Ya que intentar sobrescribir un fichero existente generaria un error. En cambio, las versiones de disco como Opus, +D o Timex tienen la opcion OPEN ... OUT, con lo que el fichero se sobre escribe sin dar error alguno. 5. Rutina eliminar. En la version MDR es requerido hacer ERASE antes de OPEN, pero en la version OPUS es innecesaria la linea 945 y en la linea 950 ponemos OPEN ... OUT como en la subrutina de salvar. 6. La opcion salir del menu - nos manda directamente a la subrutina que salva a su vez todo el fichero. Es decir que el unico modo de que salgamos del programa sin salvar los datos es haciendo BREAK. Otra alternativa es a~adir al menu alguna opcion para salir del programa sin tener que salvar todo a menos que eso sea lo que deseamos. 7. Una mejora mas - el programa carece de la posibilidad de editar o de corregir cualquier registro del fichero, por lo que a~adir dicha opcion al menu seria una autentica mejora al programa. (C)2023 zx_if1@hotmail.com