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