APPLICATIONSCOURS DE BIDOUILLAGE ★ TECHNICAS DE PROTECCIÓN !A LA CARGA! (AMSTRAD PERSONAL) ★

Technicas de protección !A la carga! (Amstrad Personal)Applications Cours De Bidouillage
★ Ce texte vous est présenté dans sa version originale ★ 
 ★ This text is presented to you in its original version ★ 
 ★ Este texto se presenta en su versión original ★ 
 ★ Dieser Text wird in seiner Originalfassung präsentiert ★ 

Continuamos con el estudio de los sistemas de protección. En este caso nos ocuparemos de un apartado escabroso para la mayor parte de los usuarios de CPC: la carga y la grabación de programas utilizando el Sistema Operativo del ordenador.

ara abordar este tema, analizaremos todas y cada una de las rutinas del Firmware para manejar los datos de cassette y disco. Creemos que esto constituirá un útil «manual de referencia», al mismo tiempo que contribuirá a una mejor comprensión de la forma en que el ordenador trata el almacenamiento externo de información.

El Firmware consta de dos grupos de rutinas para la carga y grabación de datos, que podríamos denominar de «alto nivel» y de «bajo nivel». Las rutinas de alto nivel son las que se emplean cuando hacemos, por ejemplo, una grabación con la instrucción Save de Basic. Estas rutinas se encargan, en este ejemplo, de abrir un fichero para salida de datos (semejante a Openout) y de ir grabando el total de datos que hayamos indicado.

Las rutinas de alto nivel usan y reconocen una estructura determinada para la lectura y escritura de información. Los datos se graban en bloques sucesivos de 2048 bytes, cada uno precedido de un segmento de cabecera con una longitud de 256 bytes. Esta cabecera contiene información esencial sobre el bloque de datos a cargar. La estructura de una cabecera, publicada anteriormente en el número 6 de AMSTRAD Personal figura en este mismo artículo en las tablas I y II. Es interesante observar que alterando el byte 18 no sólo se puede proteger o desproteger un programa salvado con la opción «p», sino que también se puede asignar a cualquier programa un tipo falso. Si, por ejemplo, asignamos a un fichero binario (como una imagen de pantalla), el tipo ASCII, el ordenador dará error cuando lo intentemos cargar con Load, aunque si se podrá cargar empleando directamente las rutinas de alto nivel del Firmware. Existen otros muchos trucos de este tipo que confunden al ordenador, como el cambiar la señal de primer bloque (byte 23). Si lo hacemos así, el ordenador (y también la mayoría de los «copiones» habituales) se negará a cargar el programa. Esta situación se puede solucionar empleando las rutinas de bajo nivel.

TABLA I
ZonaBytesFunción
S0-15Nombre del fichero.
I16Número de bloque.
S17Diferente de 0 si es el último bloque
T18Tipo de fichero (ver Tabla II).
E19-20Longitud del bloque.
M21-22Dirección de inicio.
A23Diferente de 0 si es el primer bloque.
U24-25Longitud total del fichero.
S26-27Dirección de ejecución programas en C/M.
E28-63Pueden usarse libremente.
R

TABLA II
Descripción del byte 18:
BitsDescripción
0Si está activo, el programa está protegido.

Contenido del fichero:

0 = Basic
1 = Binario
2 = Imagen de pantalla
3 = ASCII
4-7 = No tienen significado

4-7Versión:
Ficheros ASCII versión = 1
Otros ficheros versión = 0

TABLA III

1. CAS IN OPEN #BC77

Abre un fichero de enlrada y lee su primer bloque.

Entrada
B = Longitud del nombre del fichero.
HL = Dirección donde está el nombre del fichero.
DE = Dirección de un buffer libre de 2 K. Salida
Si el fichero se abrió correctamente:
Carry = 1.
HL = Dirección de la cabecera en memoria.
DE = Dirección a partir de la cual se grabaron los datos.
BC= Longitud de los datos.
A = Tipo de fichero.
Si hubo algún problema o se pulsó Escape: Carry = 0.
En cualquier caso:
IX y flags corruptos

5. CAS OUT OPEN #BC8C

Abre un fichero de salida.

Entrada
B= Longitud del nombre del fichero.
HL = Dirección donde está el nombre del fichero.
DE = Buffer de 2 K.

Salida
Si se abrió correctamente:
Carry = 1.
HL= Dirección donde está almacenada la cabecera que precederá a cada bloque.

Si hubo algún problema:
Carry = 0.
HL corrupto.
En cualquier caso:
AF, BC, DE, IX corruptos.

2. CAS IN CLOSE #BC7A

Cierra el fichero de entrada abierto por CAS IN OPEN.

Salida

Si se cerró correctamente:

Carry = 1.

Si hubo error:

Carry = 0.

En cualquier caso:

AF, BC, DE, HL corruptos.

6. CAS OUT CLOSE #BCBF

Cierra fichero de salida.

Condiciones igual que CAS IN CLOSE.

3. CAS IN CHAR #BC80

Lee un solo carácter del fichero de entrada abierto por CAS IN OPEN.

Salida

Si la lectura tuvo éxito:
Carry = 1.
A = Carácter leído.

Si la lectura no tuvo éxito:
Carry = 0.
A corrupto.
En cualquier caso:
IX y flags corruptos.

7. CAS OUT CHAR #BC95

Escribe un solo carácter en el fichero de salida.

Entrada
A = carácter a escribir.

Salida

Si no hubo ningún error:
Carry = 1.

Si hubo error:
Carry = 0.

En cualquier caso:
AF, IX corruptos.

4. CAS IN DIRECT #BC83

Lee completamente el fichero de entrada abierto por CAS IN OPEN. Esta rutina no se puede alternar con CAS IN CHAR.

Entrada
HL= Dirección donde queremos cargar los datos.
Salida

Si no hubo problemas:
Carry = 1.
HL = Dirección de ejecución.

Si hubo error:
Carry = 0.
HL corrupto.

En cualquier caso:
AF, BC, DE, IX corruptos.

8. CAS OUT DIRECT #BC98

Escribe un bloque completo de datos al fichero de salida. No se puede alternar con CAS OUT CHAR.

Entrada

HL= Dirección de inicio de los datos a grabar.
DE = Longitud de los datos a grabar.
BC = Dirección de ejecución.
A = Tipo de fichero.

Salida

Si no hubo problema:
Carry = 1.

Si hubo error:
Carry = 0.

En cualquier caso:
AF, BC, DE, HL, IX corruptos.

En la tabla III figuran las rutinas de alto nivel más importantes de que consta el Firmware. Se ha respetado la designación que de ellas aparece en el Manual del Firmware (SOFT 158).

Si queremos grabar un fichero en la misma forma en que lo hace la orden Basic Save, debemos seguir los siguientes pasos:

  1. Abrir fichero de salida (#BC8C).
  2. Grabar datos, bien sea uno a uno o de una sola vez (#BC95 o #BC98).
  3. Cerrar fichero de salida (#BC8F).

Para cargar un fichero los pasos son equivalentes, pero referidos a las rutinas de entrada.

Las rutinas de bajo nivel (Tabla IV) son fundamentalmente tres. Cas Write permite grabar cualquier longitud de datos directamente a la cinta.

TABLA IV

1. CAS WRITE #BC9E

Escribe un bloque de cualquier longitud en la cinta. CAS OUT CHAR, CAS OUT DIRECT y CAS OUT CLOSE usan esta rutina para escribir los bloques de cabecera y datos que componen los Ficheros.

Entrada
HL = Dirección de inicio de los datos a grabar. DE = Longitud de los datos a grabar.
A = Código a asignar al bloque.

Salida

Si no hubo problema:
Carry = 1.

Si hubo algún error:
Carry = 0.
A = 0: se pulsó Escape.
A = 1: velocidad de grabación demasiado rápida.

En cualquier caso:
BC, DE, HL, IX corruptos.

3. CAS CHECK #BCA4

Compara un bloque grabado en cinta con los contenidos de memoria.

Entrada
Igual que las anteriores.
Salida

Si bloque y datos coincidían:
Carry = 1.

Si se produjo error:
Carry = 0: se pulsó Escape.
A = 1: se encontró un bit demasiado largo (Read error a).
A = 2: se detectó un fallo en la suma de comprobación (Read error b).
A = 3: los datos de memoria son diferentes a los grabados en cinta.

En cualquier caso:
BC, DE, HL, IX y flags corruptos.

2. CAS READ #BCA1

Lee un bloque de cualquier longitud.

Entrada

Igual que CAS WRITE.

Salida

Si no hubo errores:

Carry = 1.

Si hubo error o se pulsó Escape:

Carry = 0.

A = 0: se pulsó Escape.

A = 1: se encontró un bit muy largo (Read error a).

A = 2: se detectó un fallo en la suma de comprobación (Read error b).

En cualquier caso:

BC, DE, HL, IX y flags corruptos.

Esta rutina es utilizada por las de alto nivel para grabar la cabecera y los 2048 bytes de cada bloque. Como vemos en la tabla IV, el acumulador debe contener un código arbitrario: cualquier número del 0 al 255. Este código sirve precisamente para proteger los programas (si no sabemos el código con fueron grabados, no los podremos cargar), y también para que el ordenador distinga si está leyendo una cabecera o un bloque de datos. Las cabeceras se graban siempre con el código &16, mientras que los datos se graban con el código &2C. Cas Read hace el trabajo contrario: lee un bloque de cualquier tamaño, siempre que indiquemos dirección donde queremos cargarlo, longitud de los datos a leer y el código que se empleó en su grabación.

Además de las rutinas de alto y bajo nivel existen en el Firmware otras que permiten controlar la forma de actuación del cassette. Atributos tales como velocidad de grabación, encendido y apagado del motor, etc.

Como muestra de todas las rutinas del Firmware relacionadas con el cassette, hemos desarrollado un programa que incorpora unos cuantos comandos RSX. Para hacerlo funcionar correctamente hay que copiar, con ayuda del Cargador Universal, el programa y salvar el binario con el nombre «CASRSX».

Cuando queramos disponer de los RSX, bastará con teclear lo siguiente:

MEMORY &9FFF
LOAD “CASRSX”,&A000
CALL &A000

Los nuevos comandos RSX son los siguientes:

CAS.RESET: efectúa una inicialización completa del sistema de cassette.

SPEED,n: n es un número de 1 a 4. Establece la velocidad de grabación de datos:

n = 1 1000 baudios (bps)
n = 2 2000 baudios
n = 3 2500 baudios
n = 4 3000 baudios

Hay que tener en cuenta que cuanto más alta sea la velocidad empleada, mayor será la probabilidad de error.

MOTOR.START: pone en marcha el motor del cassette. MOTOR.STOP: para el motor del cassette.

BLOCKSAVE,inic,long,cod: graba un bloque binario utilizando las rutinas de bajo nivel. Inic indica la dirección de inicio, long la longitud y cod el código con que deseemos proteger el programa.

BLOCKLOAD, inic, long, cod: carga un bloque binario con los mismos parámetros que BLOCKSAVE.

BLOCKCHECK,inic,long,cod: compara a partir de la dirección de memoria especificada por inic con un bloque binario grabado en cinta.

BLOCKLOAD, BLOCKSAVE y BLOCKCHECK se pueden utilizar para grabar nuestros programas o, incluso, para cargar zonas de cabacera o datos de ficheros grabados por el método habitual.

Amstrad Personal

★ PUBLISHER: Amstrad Personal
★ YEAR: 1988
★ CONFIG: 64K + AMSDOS
★ LANGUAGE:
★ LiCENCE: LISTING
★ COLLECTION: AMSTRAD PERSONAL 1988
★ AUTHOR: Pedro Cuenca
 

★ AMSTRAD CPC ★ DOWNLOAD ★

Type-in/Listing:
» Technicas  de  Proteccion    (Amstrad  Personal)    LISTING    SPANISHDATE: 2022-09-23
DL: 159
TYPE: PDF
SiZE: 222Ko
NOTE: 1 page/PDFlib v1.6

★ AMSTRAD CPC ★ A voir aussi sur CPCrulez , les sujets suivants pourront vous intéresser...

Lien(s):
» Applications » Patrice Maubert - Cours de Bidouilles - Joystick N10
» Applications » ,,Unprotect'' für den Schneider CPC 464
» Applications » Déplombage des Fichiers Mallard Basic par Spoke
» Applications » Patrice Maubert - Cours de Bidouilles - Joystick N07
» Applications » Protlist: Protection et Deprotection de Listings (CPC Revue)
» Applications » Password Protection Routine (Amstrad Action)
Je participe au site:
» Pour ce titre nous ne disposons de fichier executable sur CPC (Dump, Saisie du listing) , alors si vous avez ça dans vos cartons ou vous désirez usé vos petit doigts boudinés sur votre clavier faites le nous savoir.
» Vous avez des infos personnel ?
» Vous avez remarqué une erreur dans ce texte ?
» Aidez-nous à améliorer cette page : en nous contactant via le forum ou par email.

CPCrulez[Content Management System] v8.7-desktop/c
Page créée en 755 millisecondes et consultée 503 fois

L'Amstrad CPC est une machine 8 bits à base d'un Z80 à 4MHz. Le premier de la gamme fut le CPC 464 en 1984, équipé d'un lecteur de cassettes intégré il se plaçait en concurrent  du Commodore C64 beaucoup plus compliqué à utiliser et plus cher. Ce fut un réel succès et sorti cette même années le CPC 664 équipé d'un lecteur de disquettes trois pouces intégré. Sa vie fut de courte durée puisqu'en 1985 il fut remplacé par le CPC 6128 qui était plus compact, plus soigné et surtout qui avait 128Ko de RAM au lieu de 64Ko.