SERIE CP/M Y ZX SPECTRUM ZX CP/M para +3 y los comandos externos del CP/M 2.2 Para empezar Si bien el CP/M + es el unico oficial de parte Locomotive Software para el +3, existe otra version no oficial del CP/M 2.2 tambien para el +3, del cual es de lo que vamos a tratar ahora, junto con sus comandos externos. I - ZX CP/M v2.2 " Esta es una version beta de un port del CP/M 2.2 para el ZX Spectrum +3, el cual nos da acceso a la amplia libreria de programas que fue desarrollado para el Z80 CP/M. Esta version usa la arquitectura estandar de CP/M en memoria, pero ha sido almacenado en una forma ligeramente no estandar en el disco del sistema. El BIOS y BDOS del CP/M estan almacenados en un archivo estandar de +3 llamado cpm.sys y el CCP esta en otro archivo llamado ccp.sys. Esto permite una facil depuracion y puede ser transferida con facilidad a otros discos usando +3 DOS, y tambien permitiria la instalacion en discos duros (o tarjetas CF) en futuras versiones como por ejemplo el Spectrum +3E. El CCP tambien puede ser reemplazado muy facilmente por otro procesador de comandos, simplemente cambiando el ccp.sys. Mapa de Memoria Modulo Inicio Tam. CCP 0xC400 2K BDOS 0xCC00 3.5K BIOS 0xDA00 9.5K Display CP/M usa una pantalla de 80 columnas por defecto que tiene que ser emulado en el Spectrum debido a que tiene menos columnas en pantalla. Por esa razon, la pantalla estandar del Spectrum es usada para mostrar 2 pantallas de 64 columnas, que puede ser intercambiada usando symbol shift + Q y symbol shift + W para ver los lados izq. y der. de la pantalla de 80 columnas de forma respectiva. Mapeo del teclado Debido a las limitaciones del teclado del ZX Spectrum algunas combinaciones de teclas han tenido que ser remapeadas para las teclas disponibles en el Spectrum, lo que significa que no todas las combinaciones de teclas del CP/M pueden ser soportadas, asi que las que lo han sido estan listadas a continuacion: Spectrum CP/M -------- ---- Cursor Arriba Control-K Cursor Abajo LineFeed Cursor izq. BackSpace Cursor der. Control-F Shift + Space DEL Shift + Enter ESC Shift + 0 Backspace Shift + 1 Control-S Shift + 2 Control-E Shift + 3 Control-X Shift + 4 Control-Z Symbol + I Control-U Symbol + E Control-E Symbol + W Screen View Right Symbol + Q Screen View Left Symbol + Space Control-C Symbol + Enter TAB Open source CP/M ha sido realizado como codigo abierto bajo una licencia de tipo BSD, la cual puede ser encontrada via la pag. web de digital research. Los modulos CCP y BDOS han sido compilados sin modificacion de sus fuentes. La BIOS ha sido escrita de cero para soportar al ZX Spectrum +3 de acuerdo con las especificaciones del CP/M v2.2. Notas (como ya se menciono) esta es una version beta y como tal no ha sido aun probada con la mayoria de programas CP/M, pero se sabe que funciona con la sigte. lista de progs.: Wordstar para +3 CP/M-80 herramientas de ensamblador BBC Basic para CP/M-80 Microsoft Basic Tex Kermit La emulacion del terminal VT aun esta en una etapa temprana asi que algunos codigos de ESCape y/o teclas puede no ser soportados. La redireccion de E/S no ha sido aun implementada. Solamente los drives A: y B: han sido soportados. Futuro Hay planes de moverse a CP/M plus (CP/M v3) y tambien de aņadir soporte para sistemas con discos duros. Licencia de copia Este software es dado gratuitamente y puede ser copiado y usado con la condicion de que no sera vendido ni se cobrara por ninguna copia de la misma. Parte de este software tiene el copyright de Digital Research Inc y subsecuentemente Caldera Inc y como tal solo puede ser copiado y usado bajo sus propios terminos y condiciones las cuales son en tiempo de escribir esto, una licencia de codigo abierto tipo BSD. Reconocimientos Digital Research Inc - desarrollador del CP/M (hoy Caldera Inc) Sinclair Research Ltd - creador del ZX Spectrum Gary Kildall - el padre de los sistemas operativos de disco Amstrad - desarrollador del Spectrum +3 " II - Los comandos externos del CP/M 2.22 Tomado de la Guia de Referencia del Programador del CP/M v1.4 & 2.x A modo de repaso El CP/M tiene unos pocos comandos internos que son: DIR - para ver el directorio o contenido del disco extE - para ver lo que contiene un fichero ya sea texto o no ERA - para borrar archivos en el disco REN - para renombrar ficheros existentes USER - para asignar el usuario en curso SAVE - para salvar a disco n paginas como fichero En el disco de CP/M 2.2 tenemos varios programas utiles que son los comandos externos, de los que veremos a continuacion: Comando de manejo de estados STAT STAT muestra el eSTATus (R/W o R/O) de la unidad por defecto asi como su espacio disponible STAT d: - hace lo mimo pero con la unidad d escogida STAT DEV: - muestra las asignaciones del DEVice (dispositivo) STAT VAL: - " " " " disp. VALido STAT DSK: - " " caracteristicas del DiSK (V2.x en ad.) STAT USR: - " " areas de USuaRio en curso (V2.x) STAT nombre.ext $S - muestra el tama~o del archivo (V2.x) STAT nombre.ext - " las caracteristicas del archivo STAT d:nombre.ext - " " " arch. en unidad d STAT d:=R/O - cambia unidad designada a Read-Only (solo lectura) STAT nomre.ext $R/O - cambia el fichero a solo lectura (V2.x) STAT nombre.ext $R/W - " " " a lectura-escritura (V2.x) STAT nombre.COM $SYS - " " " a arch. Sistema (V2.x) STAT nombre.COM $DIR - " " " a " Directorio (V2.x) STAT gd:=pd: - cambia el dispo. general (CON:,LST:,PUN:,RDR:) a una asignacion de dispo. fisico (IOBYTE) Programa de intercambio entre perifericos PIP PIP sin parametros, inicia el Programa con lo que tendremos: *d:=s:fich.ext - Copia fich de la unidad fuente a la unid. destino *d:nuname.*=s:olname.ext - Copia & renombra PIP d:=s:fich.ext - Inicia PIP y copia el fich PIP d:=s:*.* de la unidad fuente \/ todos los archivos PIP d:=s:fich.* a la || todo archivo fich PIP d:=s:*.ext unidad destino /\ todo archivo ext PIP LST:=fich.ext - envia fich a un disp. de listado PIP PUN:=fich.ext - " " a un " de perforado (punch) PIP CON:=fich.ext - " " a un " de consola PIP fich.ext=RDR: - Copia datos de un disp. de lectura (rdr) a fich *nuname.ext=aname.ext,bname.ext,cname.ext - ASCII copia & concatena *nuname.ext=aname.ext,bname.ext - " " & " *nuname.ext=aname.ext[X],bname.ext[X] - binario " & " PIP LST:=aname.ext,bname.ext - envia arch en secuencia a d. list. PIP LST:=s:aname.ext,s:bname.ext - " " en " a d. " PIP permite acceso a cualquier disp. logico y fisico definidos en el CP/M. Los disp. logicos son CON: RDR: PUN: LST: Disp. fisicos: TTY: CRT: PTR: UR1: UR2: PTP: UP1: UP2: LPT: UL1: Disp. especiales de PIP (las posiciones 109H a 1FFH no son usadas en la imagen de PIP y pueden be reemplazados por unidades usadas por las vers. que usan DDT) NUL: envia 40 NULs (ASCII 00H) al disp. (puede ser editado al final de una salida perforada) EOF: envia un fin de fich CP/M (ASCII Ctrl-Z=1AH) al d. dest. (enviado automaticamente al final de transfer. ASCII con PIP) INP: la fuente de entrada especial PIP puede parcharse en PIP: PIP coge las entradas de aqui llamando a 103H, con datos retornados en la 109H) OUT: el destino especial de salida PIP puede parcharse en PIP: PIP llama a 106H con datos a ser sacados en C por cada car. PRN: como LST: excepto que los TABs son expandidos a cada 8 columnas, las lineas son numeradas, y la pag. inserta eyeccion cada 60 lineas con eyeccion inicialt (igual que la opcion de PIP [t8np]) Parametros de PIP ejemplo: *fich.ext=RDR:[B] [B] - lee un bloque de datos hasta un ^S (ctrl-S) [Dn] - borra caracteres pasando la columna n [E] - hace eco a toda operacion de copia a la consola [F] - remueve los form feeds (avance de pagina) [Gn] - coge archivo del area de usuario n (V2.x) [H] - verifica un formato HEX apropiado [I] - como H pero ignora ":00" [L] - cambia los caracteres en mayusculas a minusculas [N] - a~ade numeros de linea sin ceros como guia [N2] - como N pero con ceros guias y TABulado tras el numero [O] - transfiere archivo objeto; ignore el EOF (Ctrl-Z) [P] - inserta av. de pag. cada 60 lineas [Pn] - inserta av. de pag. cada n lineas [Qstr^Z] - abandona copiado una vez la cadena str es encontrada [R] - lee archivo SYS (V2.x) [Sstr^Z] - empieza el copiado cuando str es encontrado [Tn] - expande el espacio de TABular a cada n columnas [U] - cambia los caracteres en minusculas a mayusculas [V] - verifica los datos copiados (el destino debe ser un archivo en disco) [W] - borra archivos R/O (s/l) en el destino (V2.x) [X] - copia archivos no ASCII [Z] - cero paridad bit (hi bit) en todos los caracteres en el archivo Palabras clave de PIP: CON: disp. CONsola (definido en la BIOS) EOF: envia End-of-File (ASCII ^Z = fin de fichero) al dispo. INP: fuente INPut lectura o entrada (parchado en PIP) LST: disp. LiST (definido en la BIOS) NUL: envia 40 NULos al dispo. OUT: destino OUTput salida o escritura (parchado en PIP) PRN: como LST:; TABula cada 8 cars., numera lineas y paginas eyecta cada 60 lineas con la eyeccion inicial PUN: disp. de PUNcheado o perforado (definido en la BIOS) RDR: disp ReaDeR de lectura (definido en la BIOS) Editor de textos ED ED sin parametros, activa el editor por defecto del CP/M ED nombre.ext - Ejecuta el EDitor para crear o editar un fichero ED d:filename.ext - como el ejemplo anterior pero eligiendo unidad Herramienta de depuracion dinamica DDT DDT sin parametros inicia la herramienta DDT nombre.ext - Inicia el DDT y carga el fichero nombrado Enviar o someter SUBMIT y XSUB SUBMIT fich params Ejecuta un fichero SUB (de bache o lote) usando parametros opcionales. XSUB - Ejecuta un programa SUBmit eXtendido (V2.x) Otros comandos: ASM fich ensambla el archivo ASM fich en la unidad por defecto ASM d:fich - ensembla ASM fich en la unidad asignada d ASM fich.abc - ensambla el ASM fich segun abc donde: a = unidad donde esta el archivo fuente b = " de destino del fich. HEX (Z=omitir) c = " de " " f. PRN (X=consola,Z=omite) LOAD fich crea fich COM a partir de un fich HEX en la unidad en curso LOAD d:filename - idem pero seleccionando la unidad d a usar DUMP fich.ext muestra en pantalla el contenido de fich en hex, unidad en curso DUMP d:fich.ext - idem pero seleccionando la unidad d a usar III - PARA CERRAR... Mis conclusiones Lo primero es conseguirse una copia del disco con el ZX CP/M v2.2, insertarlo en la unidad (por defecto) A: y pulsar ENTER en la opcion LOADER (cargar). Si el sistema ha cargado correctamente, entonces el borde y el fondo se pondran en negro con tinta blanca y aparecera el sigte. mensaje en pantalla a 64 car.: ZX CP/M v2.2 - CBIOS v1.0 Copyright (c)1979, Digital Research Copyright (c)2009, M.Williams A>_ el prompt A nos dice que el sistema esta ya esperando que tipeemos algun comando. Si tipeamos... DIR obtenemos: A: ED COM: GENHEX COM: GENMOD COM: LOAD COM A: MAC COM: OBJCPM COM: PIP COM: SDIR COM A: STAT COM: SUBMIT COM: XSUB COM: ASM COM A: DUMP COM: DISK : CCP SYS: CPM SYS Aparte de las utilidades ya antes explicadas, nos topamos ademas con lo sigte.: GENHEX - crea un fich hex de uno COM GENMOD - crea un fich PRL de un fich especial HEX OBJCPM - hace lo mismo que: HEXCOM genera un fich comando (extension .COM) de un .HEX MAC - es un macro ensamblador que lee sentencias en ensamblador y fue una mejora al mas antiguo ASM.COM de Digital R. Por ultimo: SDIR - el cual es un DIRectorio expandido y al tipearlo nos muestra en la pantalla: Directory For Drive A: User 0 Name Bytes Recs Attributes Names Bytes Rec ------------ ------ ------ ------------ ----------- ------ ---- ASM COM 8K 64 Dir RW CCP SYS 3K CPM SYS 14K 105 Dir RW DISK 1K DUMP COM 1K 4 Dir RW ED COM 7K GENHEX COM 1K 6 Dir RW GENMOD COM 2K LOAD COM 2K 14 Dir RW MAC COM 12K OBJCPM COM 3K 22 Dir RW PIP COM 8K SDIR COM 15K 119 Dir RW STAT COM 5K SUBMIT COM 2K 10 Dir RW XSUB COM 1K Total Bytes = 85k Total REcords = 621 Files Found Total 1k blocks = 85 Used/Max Dir Entries For Drive A: 1 La pantalla estsa incompleta si pulsamos Symb + w veremos entonces la parte que falta: ive A: User 0 tes Recs Attributes Names Bytes Recs Attributes --- ------ ------------ ----------- ------ ------ ------------ 17 Dir RW 2 Dir RW 52 Dir RW 10 Dir RW 92 Dir RW 58 Dir RW 40 Dir RW 6 Dir RW = 16 6/ 64 En suma,estamos ante una version de CP/M de 80 columnas de las cuales solamente podemos ver 64 c. muy a diferecnica de las vers. de Timex y LEC que son de solo 64 c. en pantalla o el +3 que es de 51 c pudiendo elegir 32 c o el modo dividido de 24x80. Ahora a diferecnia de otras versiones de CP/M, aqui no tengo una sola utilidad o comando FORNAT. Gracias a que trabajo con diversos emuladores puedo hacer varias copias al disco y borrar los archivos COM mediante 'era *.com' y asi tener un disco nuevo para usar. En cuanto a los programas CP/M para probar... El dBase 2.41, pero no el 2.43 para Kaypro que si corre en Cp/M+. WS 3.0 configurado para Zenith correr bien pero se cuelga al salir. Super Calc se ve bien pero requiere configurarse mejor. Y por el momento eso es todo lo que he decidido probar con esta version de CP/M. El unico fallo que tiene este sistema es su para nada ortodoxo uso del teclado para fines de compatibllidad. Ni siquiera parece necesitar de ^C al cambiar el disco en la unidad. Al menos los de Amstrad, Timex y LEC eligieron el uso del modo EXT en reemplzao de la tecla CONTROL. (c)2022-23 zx_if1@hotmail.com