home *** CD-ROM | disk | FTP | other *** search
/ CP/M / CPM_CDROM.iso / simtel / sigm / vols000 / vol081 / copy.src < prev    next >
Text File  |  1984-04-29  |  3KB  |  154 lines

  1. * Text copy procedure used by PRINT.
  2. * This procedure is required because Pascal does not process
  3. * a carriage return that is not followed by a line feed.
  4. * It appears to Pascal as follows:
  5.  
  6. *    procedure copy (var infile : text;
  7. *            firstpage, lastpage : integer);
  8. *       external;
  9.  
  10. * CP/M entry address
  11.  
  12. cpent    equ    5
  13.  
  14. * CP/M function codes
  15.  
  16. boot    equ    0        Exit to OS
  17. conout    equ    2        Console output
  18. print    equ    5        Printer output
  19. read    equ    20        Read a sector from a file
  20. setdma    equ    26        Set DMA for file transfer
  21.  
  22. * Character codes
  23.  
  24. lf    equ    10        Line feed
  25. ff    equ    12        Form feed
  26. cr    equ    13        Carriage return
  27. eof    equ    26        End of file
  28.  
  29. * Useful constants
  30.  
  31. currec    equ    32        Relative address of current record
  32. *                counter in FCB
  33. bufsize    equ    128        Input buffer size
  34.  
  35. * Macro definitions
  36.  
  37. cpm    macro    func        Invoke a CP/M function
  38.     mvi    c,func
  39.     call    cpent
  40.     endmac
  41.  
  42. * Code for procedure COPY starts here
  43.  
  44.     entry    copy
  45.  
  46. copy    pop    h
  47.     shld    retadd        Store return address
  48.     pop    h
  49.     shld    last        Store number of last page
  50.     pop    h
  51.     shld    first        Store number of first page
  52.     pop    h
  53.     lxi    d,3
  54.     dad    d        Correct Pascal's address
  55.     shld    fcbaddr        Store address of FCB of input file
  56.     sixd    savex        Store IX (required by Pascal)
  57.  
  58.     lxi    d,currec
  59.     dad    d        HL -> current record #
  60.     mvi    a,0
  61.     mov    m,a        Current record # := 0
  62.  
  63.     lxi    d,buffer    Tell CP/M where the buffer is
  64.     cpm    setdma
  65.     lxi    ix,buffer+bufsize    Set i/p buffer pointer
  66.  
  67. * Main copying loop
  68.  
  69. nextch    call    getchar
  70.     cpi    eof
  71.     jz    endfile
  72.     cpi    ff
  73.     jz    endpage
  74.     sta    char
  75.     lda    prflag
  76.     ora    a
  77.     jrz    nextch        jif not printing yet
  78.     lda    char
  79.     mov    e,a
  80. princh    cpm    print        Print the character
  81.     jr    nextch           and go for next
  82.  
  83. * Process a form feed character
  84.  
  85. endpage    lhld    page        Increment page #
  86.     inx    h
  87.     shld    page
  88.     lda    prflag
  89.     ora    a
  90.     jrnz    chekfin        jif already printing
  91.     lded    first        See if it is time to start printing
  92.     dsbc    d        HL := page # - first page
  93.     jm    nextch        Don't start yet
  94.     mvi    a,255
  95.     sta    prflag        Set printing flag
  96. prinff    mvi    e,ff
  97.     jr    princh           and print the first form feed
  98.  
  99. chekfin    lded    last        See if it is time to stop printing
  100.     dsbc    d        HL := page # - last page
  101.     jm    prinff        jif not finished yet
  102.     jrz    prinff        Print last page
  103.  
  104. * Process end of file or end of printout
  105.  
  106. endfile    mvi    e,cr
  107.     cpm    print
  108.     mvi    e,lf
  109.     cpm    print
  110.  
  111. * Return to Pascal
  112.  
  113.     lixd    savex        Restore IX
  114.     xra    a        A := 0
  115.     lhld    retadd
  116.     pchl
  117.  
  118. * Read one character from the input file and return it in A
  119.  
  120. getchar    push    ix
  121.     pop    h        HL := IX
  122.     lxi    d,buffer+bufsize
  123.     ora    a
  124.     dsbc    d        HL := IX - buffer - 128
  125.     jrnz    get1        jif inside buffer
  126.     lxi    h,fcbaddr    HL -> FCB of file
  127.     mov    e,m
  128.     inx    h
  129.     mov    d,m        DE := address of FCB
  130.     cpm    read        Read another record
  131.     ora    a
  132.     jrnz    get2        jif end of file
  133.     lxi    ix,buffer    Reset buffer pointer
  134. get1    mov    a,(ix)        Get a character
  135.     inx    ix        Increment character pointer
  136.     ret
  137. get2    mvi    a,eof        Return end-of-file character
  138.     ret
  139.  
  140. * Data
  141.  
  142. fcbaddr    dw    0        FCB address
  143. first    dw    0        First page to be printed
  144. last    dw    0        Last page to be printed
  145. page    dw    0        Current page number
  146. retadd    dw    0        Return link to Pascal
  147. savex    dw    0        Copy of IX for Pascal
  148. prflag    db    0        Printing flag
  149. char    db    0        Current character
  150. buffer    ds    bufsize        Input file buffer
  151.     
  152.  
  153.  
  154.