-------------------------------------------------------------------------
| |
| BDS-C 1.5 (BD Software) |
| |
| Compilateur C pour Z80 sous-ensemble du C de K&R |
| |
-------------------------------------------------------------------------
-------------------------------------------------------------------------
| |
| CONTENU DE LA DISQUETTE |
| ----------------------- |
| |
| - cc.com compilateur passe 1 |
| - cc2.com compilateur passe 2 |
| - cl.com editeur de liens (ou clink.com) |
| - c.ccc run-time pour ajoute a l'edition de lien|
| - clib.com gestionnaire de librairies |
| - deff.crl librairie standard ecrite en C |
| - deff2.crl librairie standard ecrite en assembleur |
| - deff3.crl librairie extension ecrite en C |
| - dio.crl librairie pour redirection d'E/S |
| - stdio.h en-tete pour entrees/sorties standard |
| - dio.h en-tete pour redirection d'E/S |
| - float.crl librairie pour les reels |
| - c.doc documentation on-line de C |
| |
|-----------------------------------------------------------------------|
| |
| COMPILATION |
| ----------- |
| |
| Compilateur rapide en 2 passes (le compilateur est ecrit en |
| assembleur). |
| |
| A>cc source.c [-options ... ] |
| | | |
| | facultatives |
| | |---- -p listing avec lignes numerotees |
| source | apres #define et #include |
| de |---- -d n objet .CRL sur disque "n" |
| type |---- -e xxxx adresse des donnees globales |
| .C |---- -o optimisation en vitesse |
| |---- -r x reservation de xKoctets pour |
| la table des symboles,defaut=10K|
| |
| A>cc prog.c -p -db -e8000 -r11 |
| |
| Cree un fichier relogeable de PROG.CRL sur le disque B: avec |
| production d'un listing de precompilation, donnees globales en |
| 8000 hexa de la memoire et table des symboles de 11 Koctets. |
| |
|-----------------------------------------------------------------------|
| |
| EDITION DE LIENS |
| ---------------- |
| |
| A>cl objet [objet1 objet2...] [-options ...] |
| | | | |
| | | facultatives |
| objet objets | |
| principal secondaires |-- -s edition map implantation|
| |-- -e xxxx force la base des |
| | donnees globales en xxxx|
| |-- -o name force un executable |
| | de nom NAME.COM |
| |-- -w cree un fichier table |
| | symboles OBJET.SYM |
| |-- -y name dit aux overlays |
| | d'aller lire OBJET.SYM |
| |-- -l xxxx adresse d'implanta- |
| | -tion des overlays |
| |-- -v module = overlay |
| |-- -r xxxx reserve xxxx hexoct |
| table des references,600|
| |
| A>cl bed screen window move swap -e9000 -w -s -r800 |
| A>cl list -v -l 8000 -y bed -s -o list |
| A>cl help -v -l 8000 -y bed |
| |
|-----------------------------------------------------------------------|
| |
| LIBRAIRIES |
| ---------- |
| |
| Fichiers de librairie satisfaits automatiquement : |
| |
| - DEFF.CRL , DEFF2.CRL , DEFF3.CRL |
| |
| Autres Librairies : |
| |
| - DIO.CRL (redirection des E/S) , FLOAT.CRL (reels) , |
| SCREEN.CRL (terminal ecran compatible TERMCAP). |
| |
|-----------------------------------------------------------------------|
| |
| FONCTIONS DE LA LIBRAIRIE BDS STANDARD |
| -------------------------------------- |
| |
| Interface Systeme CP/M |
| ---------------------- |
| |
| exit() fin normale d'un programme retour CP/M |
| int bdos(c,de) appel fonction BDOS no. c, arg. = de |
| retour valeur de l'accumulateur A |
| char bios(n,bc) appel nieme entree de la table des |
| vecteurs de branchement du BIOS, arg. bc|
| equivaut a la paire de registres BC |
| int biosh(n,bc,de) appel BIOS nieme entree, registres BC DE|
| int inp(p) retourne l'octet lu sur le port "p" |
| outp(p,c) ecrit l'octet "c" sur le port "p" |
| pause() attend qu'un caractere soit tape au clav|
| sleep(n) attend n/20 secondes, n=20 => 1 seconde |
| int call(adr,a,h,b,d) appel un sous-programme systeme a l'adr-|
| -esse "adr" avec les registres A,HL,BC, |
| DE; retourne le contenu de HL |
| char calla(adr,a,h,b,d) idem a "call"; retourne contenu de A |
| int swapin(fname, adr) chargement d'un programme a l'adresse |
| "adr" en memoire (overlay) |
| char *codend() retourne l'adresse qui suit la fin du |
| code du segment racine |
| char *externs() retourne l'adresse du debut de la zone |
| des variables globales |
| char *endext() retourne l'adresse qui suit la fin de la|
| zone des donnees globales |
| char *topofmem() retourne la derniere adresse disponible |
| char *alloc(n) retourne un pointeur octet sur une zone |
| de "n" octets allouee sinon 0 |
| free(ptr) libere la zone precedemment allouee |
| debutant a l'adresse pointee par "ptr" |
| char *sbrk(n) allocation de bas niveau de "n" octets |
| int kbhit() retourne 1 si une touche du clavier a |
| ete frappee sinon 0 |
| |
| Fonctions Standard compatibles UNIX |
| ----------------------------------- |
| |
| int getchar() lecture d'un caractere a la console |
| si <CTRL+Z> retourne (EOF) = (-1) |
| si <CTRL+C> abandon du programme |
| putchar(c) ecriture du caractere "c" sur l'ecran |
| si <CTRL+S> suspension sortie |
| si <CTRL+Q> reprise sortie |
| si <CTRL+C> abandon du programme |
| char ungetch(c) le caractere c est empile et sera rendu |
| par le prochain getchar() |
| putch(c) idem a putchar() pas de test sur CTRL+C |
| puts(str) ecrit la chaine de car. "str" en sortie |
| int getline(buf, max) lit une ligne complete a la console |
| terminee par un <CR> ou au plus "max" |
| caractere de longueur. retourne le |
| nombre de caracteres effectivement lus. |
| <CR> et remplace dans "buf" par un 0. |
| char *gets(str) idem a getline() mais pas de max (135), |
| retourne l'adresse de "str" . |
| printf(format,arg1,...) impression avec format |
| scanf(format,arg1,...) lecture avec format |
| |
| int isalpha(c) retourne 1 si c est alphabetique sinon 0|
| int isalnum(c) retourne 1 si c est alphanumerique |
| int isupper(c) retourne 1 si c est une lettre majuscule|
| int islower(c) retourne 1 si c est une lettre minuscule|
| int isdigit(c) retourne 1 si c est un chiffre |
| int isxdigit(c) retourne 1 si c est un chiffre hexa 0..F|
| int isspace(c) retourne 1 si c est un espace blanc, |
| tabulation, return ou line-feed |
| int isprint(c) retourne 1 si c est imprimable |
| int isgraph(c) retourne 1 si c est caractere graphique |
| int iscntrl(c) retourne 1 si c est caractere controle |
| int isascii(c) retourne 1 si c est ASCII (0..7F) |
| int tolower(c) convertit c en minuscule si majuscule |
| int toupper(c) convertit c en majuscule si minuscule |
| int abs(n) retourne valeur absolue de n |
| int min(a,b) retourne le mininum de a et de b |
| int max(a,b) retourne le maximum de a et de b |
| |
| char *strcat(s1,s2) concatene la chaine s2 a la chaine s1 |
| et retourne un pointeur sur s1. |
| char *strncat(s1,s2,n) idem strcat() pour n caracteres au plus.|
| int strcmp(s1,s2) retourne >0 si s1>s2, =0 si s1=s2, |
| <0 si s1<s2 alphabetiquement. |
| int strncmp(s1,s2,n) idem strcmp() pour n caracteres au plus |
| char *strcpy(s1,s2) copie la chaine s2 dans la chaine s1. |
| et retourne un pointeur sur s1. |
| strncpy(s1,s2,n) idem strcpy() pour n caracteres au plus.|
| int strlen(str) retourne la longueur de "str". |
| char *strchr(str,c) retourne le pointeur sur le premier |
| caractere c trouve dans "str" sinon 0. |
| char *strrchr(str,c) retourne le pointeur sur le dernier |
| caractere c trouve sinon 0. |
| int index(c,str) retourne la position du premier octet c |
| trouve dans la chaine "str" sinon -1. |
| reverse(str) renverse la chaine str. |
| int atoi(str) convertit la chaine numerique decimale |
| str en un entier (valeur retournee). |
| itoa(n, str) convertit un entier en une chaine |
| numerique decimale en str. |
| sprintf(buf,format,args)idem printf mais la sortie se fait en |
| memoire a l'adresse "buf". |
| sscanf(buf,format,args) idem scanf mais l'entree se fait en |
| memoire a partir de l'adresse "buf". |
| pad(adr, c, n) remplissage de la zone pointee par adr |
| de taille n par le caractere c. |
| |
| Entrees-Sorties Directes fd = numero file descriptor |
| ------------------------ |
| |
| int open(fname,mode) ouverture d'un fichier en lecture mode=0|
| ecriture (mode=1) ou scratch (mode=2) |
| retourne le file descriptor fd (numero) |
| sinon -1 si le fichier n'existe pas |
| int creat(fname) creation d'une entree dans le directory |
| retourne le fd sinon -1 (sature) |
| int close(fd) fermeture du fichier reference par fd |
| int read(fd,buf,nbl) lecture de nbl enregistrements CP/M de |
| 128 octets chacun dans le buffer buf |
| retourne le nombre d'enregitrement lus |
| sinon 0 si EOF ou -1 si erreur |
| int write(fd,buf,nbl) ecriture de nbl enregistrements CP/M de |
| 128 octets chacun depuis le buffer buf |
| retourne -1 si erreur hard |
| int seek(fd,depl,code) positionnement sur un enregistrement |
| donne par son numero "depl". |
| si code=0 par rapport au debut du fich. |
| si code=1 par rapport a la pos. courante|
| si code=2 par rapport a la fin du fich. |
| "depl" peut etre <0, si erreur retour -1|
| int tell(fd) retourne la valeur du deplacement bloc |
| courante dans le fichier. |
| int unlink(fname) supprime le fichier du directory |
| int rename(old,new) renomme le fichier, -1 si erreur |
| int errno() retourne le code d'erreur de la derniere|
| condition d'erreur detectee. |
| char *errmsg(errno()) retourne un pointeur sur un message en |
| clair de la derniere erreur rencontree. |
| int setfcb(afcb,fname) initialise un FCB (file control block) |
| de 36 octets a partir du nom de fichier.|
| char *fcbaddr(fd) retourne l'adresse memoire du FCB |
| associe a fd. |
| |
| Entrees-Sorties Bufferisees fp = pointeur structure fichier |
| --------------------------- FILE *fp; |
| |
| int fopen(fname,fp) ouverture du fichier en entree (lecture)|
| retourne le fd correspondant. |
| fp doit etre: char fp[BUFSIZ]; |
| fp est du type: FILE *fp; |
| int getc(fp) retourne le caractere suivant, -1 si EOF|
| int ungetc(c,fp) voir ungetch(c) |
| int getw(fp) retourne l'entier suivant. |
| int fcreat(fname,fp) cree un fichier et l'ouvre en sortie. |
| retourne le fd ou -1 si erreur. |
| int putc(c,fp) ecrit le caractere c dans le fichier et |
| se positionne sur la case suivante. |
| int putw(w,fp) ecrit l'entier w a la suite du fichier. |
| int fflush(fp) vide le buffer courant dans le fichier. |
| int fclose(fp) fermeture du fichier surtout si fcreat()|
| fprintf(fp,format,args) sortie formatee idem a printf dans le |
| fichier pointe par fp. |
| fscanf(fp,format,args) entree formatee idem a scanf a partir du|
| fichier pointe par fp. |
| char *fgets(str,fp) lecture d'une ligne entiere du fichier, |
| la ligne doit etre terminee par CR LF. |
| la ligne est copiee dans str, elle se |
| termine en memoire par LF '\0' (NULL). |
| int fputs(str,fp) ecriture d'un chaine str dans le fichier|
| pointe par fp. Dans le fichier, la fin |
| de ligne se termine par CR-LF (newline).|
| int fappend(fname,fp) ouverture en sortie d'un fichier et |
| positionnement a la fin du fichier. |
| int fileno(fp) retourne le fd associe au fp. |
| rewind(fp) se positionne au debut du fichier. |
| |
| Fonctions diverses |
| ------------------ |
| |
| srand(n) initialise le generateur de nombre |
| pseudo-aleatoire avec la valeur n. |
| si n=0 une question est posee a l'usager|
| qui doit taper CR, le temps d'attente |
| exploite pour initialiser le generateur.|
| srand1(str) idem a srand(0) mais la question est |
| personnalisee par l'utilisateur ("str").|
| int rand() retourne un nombre pseudo-aleatoire dans|
| la gamme 0..32768 si on a fait srand(). |
| setmem(adr,cnt,byte) initialise la zone memoire debutant a |
| adr, de longueur cnt, avec l'octet byte.|
| movmem(src,dst,cnt) copie de la zone memoire scr de taille |
| cnt vers la zone memoire dst. |
| qsort(base,nel,lg,comp) "Tri de Shell" debutant a l'adresse base|
| pour nel elements de taille lg. "comp" |
| est le nom d'un fonction de comparaison |
| que doit fournir l'utilisateur. |
| int exec(progname) chainage de programme. Charge et execute|
| le programme de nom "progname" qui doit |
| etre de type .COM (executable). |
| Il n'y a pas de retour a l'appelant. |
| int execl(prog,args,...,0) idem a exec() mais passage des argum-|
| ents arg1, arg2, ... |
| int execv(prog,argv) idem a exec() mais passage du pointeur |
| de la table des arguments. char **argv. |
| int setjmp(contexte) marque le contexte au premier passage. |
| retour derriere setjmp si longjmp() sur |
| ce meme contexte. |
| longjmp(contexte,val) branchement a l'instruction qui suit le |
| setjmp() associe au meme contexte. |
| initw(array,str) initialisation d'un tableau d'entiers |
| par une liste de valeur dans une chaine.|
| initb(array,str) idem a initw mais tableau de caracteres.|
| |
|-----------------------------------------------------------------------|
| |
| STDIO.H |
| ------- |
| Le fichier "stdio.h" contient des declarations necessaires |
| lorsqu'on utilise les entrees-sorties en mode "flow" c'est-a- |
| dire "bufferisees". |
| |
| Les principales constantes definies sont : |
| |
| NULL 0 |
| EOF -1 Fin de fichier physique |
| CPMEOF 0x1a Marque de fin de fichier (CTRL+Z) |
| TRUE 1 |
| FALSE 0 |
| ERROR -1 |
| |
| Le fichier "stdio.h" doit s'inclure en tete de programme de la |
| facon suivante : |
| |
| #include <stdio.h> |
| ... suite du programme ... |
|-----------------------------------------------------------------------|
| |
| RESTRICTIONS de BDS-C par rapport au Kernighan/Ritchie |
| --------------------- |
| |
| Fonctionnalites non supportees : |
| |
| - les types : short, long, float, double, enum |
| |
| - les classes : static, extern |
| |
| - l'initialisation des variables globales |
| |
| - l'operateur sizeof(type) |
| |
| - l'operateur "cast" (type) |
| |
|-----------------------------------------------------------------------|
| |
| DOCUMENTS UTILES |
| ---------------- |
| |
| - Langage C par Ph. Dax Editions Eyrolles (photocopie) |
| |
| - The C Programming Language by Kernighan and Ritchie |
| |
| - The BD Software C Compiler V1.5 Manual |
| |
| - C par l'exemple Editions Eyrolles |
| |
| - Learning to programm in C by Plum |
| |
| - Revue Byte special issue C aout 1983 |
| |
| - Revue Doctor Dobb's Journal , de nombreux articles |
| |
-------------------------------------------------------------------------