home *** CD-ROM | disk | FTP | other *** search
- * Text copy procedure used by PRINT.
- * This procedure is required because Pascal does not process
- * a carriage return that is not followed by a line feed.
- * It appears to Pascal as follows:
-
- * procedure copy (var infile : text;
- * firstpage, lastpage : integer);
- * external;
-
- * CP/M entry address
-
- cpent equ 5
-
- * CP/M function codes
-
- boot equ 0 Exit to OS
- conout equ 2 Console output
- print equ 5 Printer output
- read equ 20 Read a sector from a file
- setdma equ 26 Set DMA for file transfer
-
- * Character codes
-
- lf equ 10 Line feed
- ff equ 12 Form feed
- cr equ 13 Carriage return
- eof equ 26 End of file
-
- * Useful constants
-
- currec equ 32 Relative address of current record
- * counter in FCB
- bufsize equ 128 Input buffer size
-
- * Macro definitions
-
- cpm macro func Invoke a CP/M function
- mvi c,func
- call cpent
- endmac
-
- * Code for procedure COPY starts here
-
- entry copy
-
- copy pop h
- shld retadd Store return address
- pop h
- shld last Store number of last page
- pop h
- shld first Store number of first page
- pop h
- lxi d,3
- dad d Correct Pascal's address
- shld fcbaddr Store address of FCB of input file
- sixd savex Store IX (required by Pascal)
-
- lxi d,currec
- dad d HL -> current record #
- mvi a,0
- mov m,a Current record # := 0
-
- lxi d,buffer Tell CP/M where the buffer is
- cpm setdma
- lxi ix,buffer+bufsize Set i/p buffer pointer
-
- * Main copying loop
-
- nextch call getchar
- cpi eof
- jz endfile
- cpi ff
- jz endpage
- sta char
- lda prflag
- ora a
- jrz nextch jif not printing yet
- lda char
- mov e,a
- princh cpm print Print the character
- jr nextch and go for next
-
- * Process a form feed character
-
- endpage lhld page Increment page #
- inx h
- shld page
- lda prflag
- ora a
- jrnz chekfin jif already printing
- lded first See if it is time to start printing
- dsbc d HL := page # - first page
- jm nextch Don't start yet
- mvi a,255
- sta prflag Set printing flag
- prinff mvi e,ff
- jr princh and print the first form feed
-
- chekfin lded last See if it is time to stop printing
- dsbc d HL := page # - last page
- jm prinff jif not finished yet
- jrz prinff Print last page
-
- * Process end of file or end of printout
-
- endfile mvi e,cr
- cpm print
- mvi e,lf
- cpm print
-
- * Return to Pascal
-
- lixd savex Restore IX
- xra a A := 0
- lhld retadd
- pchl
-
- * Read one character from the input file and return it in A
-
- getchar push ix
- pop h HL := IX
- lxi d,buffer+bufsize
- ora a
- dsbc d HL := IX - buffer - 128
- jrnz get1 jif inside buffer
- lxi h,fcbaddr HL -> FCB of file
- mov e,m
- inx h
- mov d,m DE := address of FCB
- cpm read Read another record
- ora a
- jrnz get2 jif end of file
- lxi ix,buffer Reset buffer pointer
- get1 mov a,(ix) Get a character
- inx ix Increment character pointer
- ret
- get2 mvi a,eof Return end-of-file character
- ret
-
- * Data
-
- fcbaddr dw 0 FCB address
- first dw 0 First page to be printed
- last dw 0 Last page to be printed
- page dw 0 Current page number
- retadd dw 0 Return link to Pascal
- savex dw 0 Copy of IX for Pascal
- prflag db 0 Printing flag
- char db 0 Current character
- buffer ds bufsize Input file buffer
-
-
-
-