.PA
.PN 31
.HE   3.  
.FO  BDS C-.                        #
                     3
              -------------

     BDS-C  CP/.   


     BDS-C  DEFF.CRL  DEFF2.CRL  ' 
 .     -  CRL-
,    -. CLINK   
     CRL-,     .
, ,           
 ,   , .. CLINK  
   .

         DEFF.CRL  DEFF2.CRL  
     - ,   
 ,        -.
  ,   ,     
  (  ,   )     
.   :      , 
    ( , EXIT  POKE   ).
 ,   ,   
INT,           
      CHAR. ,    
   :       
 ?        ,
 16-  ,     
,       .

      ,    
     -.  ,  
 ,   INT,      ,  
      INT   
 ( ,  ).    ,
    ;    
     .

   DEFF.CRL   -  STDLIB1.C  STDLIB2.C. DEFF2.CRL 
     DEFF2A.CSM, DEFF2B.CSM  DEFF2C.CSM
(A   CASM).

         ,  
DEFF.CRL  DEFF2.CRL.
.PA
.HE   3.  .   
   3.1    


CHAR CSW() 
       (0-255)   
    ( 0XFF   )

XIT()
            ,
       CP/M.     FLUSH
     ,    .

INT BDOS(C,DE)
        BDOS- ( 0005H  
    ),          DE 
     DE.
     16- ,  BDOS   HL. 
    CP/M     ,  BDOS  
    A, A   -     ( 0  8- ).
      " "   
      CP/M  (, SDOS).

CHAR BIOS(N,C)
     N-     BIOS,  N=0  
     (BOOT), N=1    (WBOOT), N=3       
    (CONST)  ..,    BC   C.
      ,  BIOS   A.
    ,     (N=0)    
     ,       
         .
      BIOS,  A    DE 
        HL.     
     BIOSH.

UNSIGNED BIOSH(N,BC,DE)
     N-     BIOS,  
    BC   BC   DE   DE.  
    ,  BIOS   HL.

CHAR PEEK(N)
         N. ,   ,
        ,  
      ,  PEEK.    
     ,    , 
           .

POKE(N,B)
      8         .   
     ,  ,  
                  *N=B;
    ( N    )

INP(N)
     8- ,     N.  
         PEEK.

OUTP(N,B)
       N  8-  B.     
       POOK.

PAUSE()
      ,        .  
     ;    PAUSE  
     GETCHAR    .   .

SLEEP(N)
     ( ) N/20    4 ,  N/10 
      2 .      - 
    <CTRL>C,        . 
      .

CALL(ADDR,A,H,B,D)
         ADDR,   
     :
             HL <-- H
              A <-- A
             BC <-- B
             DE <-- D
     ,     HL.
        .

CHAR CALLA(ADDR,A,H,B,D)
      CALL,   ,   
        (  HL).

INT ABS(N)
       N.

INT MAX(N1,N2)
        

INT MIN(N1,N2)
        .

SRAND(N)
     N   ,    
    ,      N.
    E N=0,    ,    <ET>,
       .    , 
         . ,
     , ;   .

SRANDL(STRING)
CHAR *STRING;
     SRAND(0),   "HIT RETURN AFTER A FEW SECONDS",
       . 
       SRAND    ;   GETCHAR
       /   .

INT RAND()
       ( : 0 < RAND() < 32768 ) 
      ,  
    SRAND  SRANDL.

NRAND(-1,S1,S2,S3)
NRAND(0,PROMPT-STRING)
INT NRAND(1)
    ,  ,   ,  
         CDC 6600.  
           SRAND  SRANDL.
        48-   48 
    ,   S1, S2  S3 (  ).
        SRANDL:  PROMT-STRING  
    ,     ,  
     16- .     
      48- . ,     
    ( GETCHAR).
               
    0 < NRAND(1) < 32768. ,    NRAND  
    ,  SRAND, SRANDL  RAND,   
    32  ,      RSEED.
    NRAND     .


SETMEM(ADDR,COUNT,BYTE)
CHAR BYTE, *ADDR;
      COUNT  ,    ADDR,  BYTE.
            .


MOVMEM(SOURCE,DEST,COUNT)
CHAR *SOURCE,*DEST;
        COUNT   SOURCE  DEST.
             
    ,  ,    :  
          .    Z-80  
    " ".    8080  8085  
    .    .


QSORT(BASE,NEL,WIDTH,COMPAR)
CHAR *BASE;
INT (*COMPAR)();
        ,   BASE, 
    NEL    WIDTH . COMPAR   
        (, X  Y),  
         1  *X > *Y
        -1  *X < *Y
         0  *X == *Y.
        .


INT EXEC(PROG)
CHAR *PROG;
     (  )  PROG.COM.
    PROG    ,     
      (     .COM). 
     (  "FOO")  ,   
     .
        A  -    
        ,    
      CLINK -        .
      EXEC     .  
        .
       -1,  ,   , 
     .


INT EXECL(PROG,ARG1,ARG2,...,0)
CHAR *PROG,*ARG1,*ARG2,...;
       -     
    ARGC  ARGV. PROG      ,
      COM- (.COM     ),  
         ,  . 
       .
    EXECL       , 
     ,         
     CP/. , 
               EXECL("FOO", "BAR", "ZOT", 0)
        ,     CP/M
               A>FOO BAR ZOT <ET>
     .   CP/M  (  DIR, ERA 
     ..)      EXECL.
       ,     , 
      80 .     
     ,        .
       -1.  

EXECV(FILENAME,ARGVECTOR)
CHAR *FILENAME;
CHAR *ARGVECTOR[];
            ,
     EXECL,   ,     
    ,     .  ARGVECTOR   
       ,      
      ,      
    (     ).

INT SWAPIN(FILENAME,ADDR)
CHAR *FILENAME;
     ,      ,
        ADDR.  ,     ; 
    ,   !    , ,
            
    ,   .
          -1.   
     .

CHAR *CODEND()
        ,    
    K .       , 
       - CLINK     
      (  EXTERNS). 

CHAR *EXTERNS()
         .   
     - CC / CLINK,      ,    
     CODEND.

CHAR *ENDEXT()
       ,     
    .    ,    SBRK E 
     .

CHAR *TOPOFMEM()
         .  
     ,     BDOS (  CLINK
       -N),     
     (     -N).
           -
     .

CHAR *ALLOC(N)
          N ,   (
      N ).        8
    "  C",  OT  
    .
       BDSCIO.H     
    ,   ALLOC  FREE,   
         .

FREE(ALLOCPTR)
CHAR *ALLOCPTR;
      ,   ALLOC. ALLOCPTR 
    ,    ALLOC. FREE  
      ,     ALLOC, 
           
    /.
      FREE  ,     ALLOC.

CHAR *SBRK(N)
        ,  ALLOC 
       .     N  ,
     -1,   .   SBRK   ,
         ,  
      ,   ,   ,  SBRK 
    ,        
      .  , " " 
     1000 .       .
           ALLOC  FREE, 
          ,
         SBRK  ALLOC).  SBRK
          (   
    ALLOC  FREE).

RSVSTK(N)
            
    ,     N    
          (    
    ).  , RSVSTK MOVET    
    SBRK  ALLOC.
     RSVSTK  ,     KA
           1000  (   
    RSVSTK(1000)).

INT SETJMP(BUFFER)
CHAR BUFFER[JBUFSIZE]

LONGJMP(BUFFER,VAL)
CHAR BUFFER[JBUFSIZE]                       

      SETJUMP      
     (  JBUFSIZE   BDSCIO.H)  
      .    LONGJMP 
     -     ,  
     ,     SETJMP  
        .     
    ""    SETJMP,   VAL,
      LONGJMP.
        SETJMP    ,
      LONGJMP,    .
      SETJMP/LONGJMP      
    ,      ;   
        (, DIOFLUSH   DIO.C).
.PA
.HE   3.  .  /
 3.2   /


 3.2.1.   CIO     


    GETCHAR  PUTCHAR,     ( 
 ),   O  .   
 ,        
  -    .   
         ,
      CIO,   
  (CIO.CSM)    BDS-C V1.50. CIO 
   GETCHAR, PUTCHAR  KBHIT    TTYMODE,
K     
 .


INT GETCHAR()
           ( 
     CP/M).
     CP/M,   <CTRL>C.
           CR-LF   
      ('\N').
     <CTRL>Z   -1; ,  , 
    GETCHAR,     (  ),  
     -1.      GETCHAR  
           , 
        255  <CTRL>Z,  ,   
       255       (EOF).

CHAR UNGETCH(C)
           GETCHAR. 
            GETCHAR.
    O  .      
      GETCHAR,     .

INT KBHIT()
      ( ),      
    ( );    ().  
     ,     GETCHAR.
    ,  KBHIT      ,   
     GETCHAR    UNGETCH   .

PUTCHAR(C)
CHAR C;
      C    (  CP/M).
       ('\N')      CR-LF.
       PUTCHAR      <CTRL>C,
           
     ,    , 
       (  PUTCHAR),   <CTRL>C.        
     PUTCHAR   BDOS KAK   ,   
      ,   CP/M   
    (<CTRL>Z)      A  , 
      PUTCHAR.

PUTCH(C)
CHAR C;
     PUTCHAR,   ,      
      <CTRL>C,       
       ,   .   
            PUTCHAR   PUTCH, TO
  . , 
                     CP/M "LIST" 
               <CTRL>P   CC.

-A D [N]        CC2.COM    N 
               D,     CC.  ,
              CC2        
                     
              .     "Z",    ".CCI" 
                      CC2,
                    CC2.

-D X             CRL-   X,    CC
               CC2    .     -A Z,
              TO -D    ,     CCI.
               ,    ,   
               .

-M XXXX             
              (C.CCC),      
                .
                      
                 (TPA) CP/M.    
                A, TO  
              C.CCC        
                ,    -L, -E  -T
                    CLINK. 
               2     
               '  BDS-C.
              C.CCC,       
              COM-,         ( 
              )   .
              CC2    ,  - 
               .

-E XXXX           () 
                   .   
                   ,    
                 ,  CLINK  
                .   -, 
                      (
              LHLD  SHLD)     .
                      .
             
              :       ;
                ,      -;
                    (  
              ).   " LAST CODE ADDRESS"  
               CLINK           
                    -.  
               , ,     , 
                   (CLINK B  ). 
              CC2    , -  
               .
                 -E CLINK   . ,
               CLINK   ,    ,
                ,    
              .

-               ,   . 
                    
                  
               ;     ,  
                  .
                 -,   
                ( ).    
               (  ) ' .
                     -  -.
                     -  
                 -.

-                SUBMIT ,  
              ,    . ,  CC
                SUBMIT-, -X     
              "$$$.SUB"       
                .  CC  , -X
                       
              .

-R X           X K    . 
                "OUT OF SYMBOL TABLE SPACE",   
                   .
              ,     "OUT OF MEMORY",  
                -R    
                    .  , 
                 .  ,  
                10.

-C               ,  
                ,   UNIX.C. ,   
              -C, ,  
              
                 /* PRINTF("HELLO");     /*  HELLO */

                .  -C  ,
                  /*  
              ,   .
                 

   O       63  ;
,         ,
     63 .
   
      CC      
    CCI-   (    
).

    :  20   .   
          .  
     N/20  ( N   
 )    ,     ...
 .   

   :

      A>FOOBAR.C -R12 -AB <ET>

 CC   FOOBAR.C,    
12, CC2     B.

      A>CC B:BELLE.C -P -O <ET>
 CC   A   BELLE.C   B.    
 #DEFINE  #INCLUDE   .   
 CC2         (.  1.9.2).
    .
.PA
.HE  1. .         CC2 -  
 1.9.5  CC2 -  

    :CC2   <ET>

    CC2       .  
  .CCI     .

        .CRL    .CCI
( ).

   CC2   .

      CC, ,     ,   
 .

    CC   CC2,  ,  CC2,
    ,      CC.
 CC2   (  ),  
   ,       
 ,  CC2  .    ,  
         CC2 , 
   ,    :

             

   0103       00        -      ,  CC2  ,
                                 .
   0104       01        -      ,   - (  ),
                                 1.
   0105-6     0100H     -        C.CCC  .

   0107-8            -         .

   0109       00        -      ,      ,
.HE   .                                             0.                                  

           
(  - ,   - ).

     CC2:  70   . 

       <CTRL>C   ,   
    .

   :  A>CC2 FOOBAR <ET>
.PA
.HE  1.           CLINK -   C
 1.9.6  CLINK -   C

    : CLINK  [     ] <ET>

    .CRL    (MAIN) ;   
-F    .CRL    CRL-     
.    -F   ,     
  , ..     
,      (   
 CRL-).       
    DEFF*.CRL   
 .    : DEFF.CRL,DEFF2.CRL
 DEFF3.CRL (  ).    ,
 ,       
,          , 
   .      DEFF3.CRL,  
          
DEFF.CRL  DEFF2.CRL.

    , CLINK     CRL-   ,
    (C.CCC  DEFF*.CRL) -      ,
    (.  1.9.2).     
   ,       CRL-,
   .   CRL-   
 / .

     CRL-      ,
        ,  
 (. 1.9.2).      
       ,     
       .

       CRL-   , CLINK
   .    
,     CRL-    .

   <CTRL>C        
   .

     CRL-    ,  
 .   :

-S                   .

-F ...            . CLINK
                     
                  ,     . 
                 M.    
                 ,    
                 . 
              ,       -L  L2.
 
-E XXXX           SEEK  
     /.
        .    -
     -1.     ,    NBL,
    TO , , ,      ;  
      .

INT SEEK(FD,OFFSET,CODE)
      /,    FD.
    E CODE=0, TO     OFFSET.
     CODE=1, TO       
    OFFSET (   ).
     CODE=2, TO    EOF  OFFSET.  
        OFFSET   .  CODE=2
     OFFSET=0, TO     .
      -1 ,  BDOS  - 
       EOF.  ERRNO   
      .

INT TELL(FD)
       /,    FD.
         ,    
    (     ).

INT UNLINK(FILENAME)
CHAR *FILENAME;
         . 
       !

INT RENAME(OLD, NEW)
CHAR *OLD, *NEW;
     .   
          .
       -1.

INT FABORT(FD)
       FD      .
          ,      
     .      ,   ,  
        ,  ;   
      .   FABORT    
    ,         .

UNSIGNED CFSIZE(FD)
       ( 128- )   
       /,   . ,
     ,  CFSIZE,     35 BDOS, 
    ,       .

INT OFLOW(FD)
      ( ),     (3-)
                 
    .

INT ERRNO()
      ,     
      .     , 
      .

CHAR *ERRMSG(ERRNUM)
      ,   ERRNO,   
     ,      . 
           :

                  
              
             0             NO ERROR HAS OCCURRED YET                 
             1             READING UNWRITEN DATA
             2             DISK OUT OF DATA SPACE
             3             CANN'T CLOSE CURRENT EXTENT
             4             SEEK TO UNWRITTEN EXTENT
             5             CAN'T CREATE NEW EXTENT
             6             SEEK PAST END OF DISK
             7             BAD FILE DESCRIPTOR GIVEN
             8             FILE NOT OPEN FOR READ
             9             FILE NOT OPEN FOR WRITE
            10             NO FILE DESCRIPTOR SLOTS LEFT
            11             FILE NOT FOUND
            12             BAD MODE QIVEN TO OPEN
            13             CAN'T CREATE FILE         
            14             SEEK PAST 65535TH RECORD   

INT SETFCB(FCBADDR,FILENAME)
CHAR FCBADDR[36];
CHAR *FILENAME;
    36-    (, FCB) CP/M, -
      FCB ADDR,     ,
    FILENAME.      .
           FCB .
    FCB        .
         ,     
      .


CHAR *FCBADDR(FD)
      ( )   
   (, FCB),    ,   FD.
    -1,  FD     .
.PA
.HE   3. .    
 3.4.5      

INT FOPEN(FILENAME, IOBUF)
CHAR *FILENAME;
STRUCT _BUF *IOBUF;

INT GETC(IOBUF)
STUCT _BUF *IOBUF;


UNGETC(C,IOBUF)
CHAR C;
STRUCT _BUF *IOBUF;

INT GETW(IOBUF)
STRUCT _BUF *IOBUF;

INT FCREAT(FILENAME, IOBUF)
CHAR *FILENAME;
STRUCT _BUF *IOBUF;

INT PUTC(C,IOBUF)
CHAR C;
STRUCT _BUF *IOBUF;

INT PUTW(W, IOBUF)
STRUCT _BUF *IOBUF;

INT FLUSH(IOBUF)
STRUCT _BUF *IOBUF;

INT FCLOSE(IOBUF)
STRUCT _BUF *IOBUF;

INT FPRINTF(IOBUF,FORMAT, ARG1, ARG2,...)
STRUCT _BUF *IOBUF;
CHAR *FORMAT;

INT FSCANF(IOBUF,FORMAT, ARG1, ARG2,...)
STRUCT _BUF *IOBUF;
CHAR *FORMAT;


CHAR *FGETS(STR, IOBUF)
CHAR *STR;
STRUCT _BUF *IOBUF;

INT FPUTS(STR, IOBUF)
CHAR *STR;
STRUCT _BUF *IOBUF;
.PA
.HE   3.   .    
 3.5     


SETPLOT(BASE, XSIZE, YSIZE)


CLRPLOT()

PLOT(X,Y,CHR)
CHAR CHR;

TXTPLOT(STRING, X, Y, ROPT)
CHAR *STRING;

LINE(C,X1,Y1,X2,Y2)
