;*; Updated on 09-Nov-90 at 12:34 PM by Paul Ciosek; edit time: 0:00:31
;*************************** AMUS Program Label ******************************
; Filename: CONCAT Date: 11/9/90
; Category: UTIL Hash Code: 553-611-565-747 Version: ?
; Initials: EESS/AM Name: CREED ERICKSON
; Company: Telephone #:
; Related Files:
; Min. Op. Sys.: Expertise Level: ADV
; Special:
; Description: concatenates files
;
;
;*****************************************************************************
;*; Updated on 31-Oct-90 at 7:02 AM by Creed A. Erickson; edit time: 0:31:33
;*; Created on 17-Oct-90 at 9:44 PM by Creed A. Erickson; edit time: 0:20:02
;************************************************************************
; *
; CONCAT.M68 - AlphaBASIC XCALL to concatenate files together. *
; *
;************************************************************************
;
; COPYRIGHT (c) 1990, Creed A. Erickson.
; All rights reserved.
;
; Edit History:
;
;[100] 10/17/90 Designed and implemented by Creed A. Erickson.
;
; USAGE:
;
; XCALL CONCAT, OUTPUT'CHAN, INPUT'CHAN1, INPUT'CHAN2....INPUT'CHANn
;
; Any number of file channels be passed (but must pass at least 2).
; If only one input file channel is specified, a simple copy is performed.
;
; For example:
;
; OPEN #1, "OUTPUT.DAT", OUTPUT
; OPEN #2, "INPUT1.DAT", INPUT
; OPEN #3, "INPUT2.DAT", INPUT
; XCALL CONCAT, 1, 2, 3
; CLOSE #1
; CLOSE #2
; CLOSE #3
;
; This example will cause INPUT1.DAT and INPUT2.DAT to be concatenated
; together into OUTPUT.DAT.
;
; NOTE: Reassembly of this file requires SBRSYM.M68 which is part of the
; AMOS 2.x distribution but (to my knowledge) not part of the AMOS 1.x
; distribution.
;
SEARCH SYS ; Standard AM defs, etc.
SEARCH SYSSYM ; More AM defs, etc.
COPY SBRSYM.M68 ; Std SBR arg list offsets.
EXTERN $FLSET, $GTARG
VMAJOR = 1 ; Major version number.
VMINOR = 0 ; Minor version number.
VEDIT = 100. ; Edit level number.
CMPW ARGCNT(A3), #2. ; At least 2 file arguments passed?
BLO 99$ ; No, forget the whole thing.
; Get A1 to index the output DDB.
;
MOV #A1.TYP, D1 ; Index the first argument.
CALL $GTARG ; Get the channel number.
CALL $FLSET ; Index the output DDB.
MOV A2, A1 ; Move to the right register.
; Set up the loop constants for the rest of the arguments.
;
MOV #A1.TYP, D3 ; Preset offset to arg #1.
; It will be bumped in loop body.
MOVW ARGCNT(A3), D4 ; Get the argument count.
SUBW #<1+1>, D4 ; Adj for arg we have and DBF.
; Loop through the rest of the arguments assuming they are file channel #s.
; At this point:
;
; A3 <= AlphaBASIC XCALL argument list.
; D4 := Count of field # args to process (DBF adjusted).
; D3 := Offset from A3 to last argument entry processed.
; D2 := Flag value (True/False).
;
10$: ADD #<A2.TYP-A1.TYP>, D3 ; Bump to next arg.
MOV D3, D1 ; Put offset in proper register.
CALL $GTARG ; Get the channel number.
BNE 20$ ; Bypass if bad argument.
CALL $FLSET ; Get the DDB index.
BNE 20$ ; Bypass if bad file channel #.
BCALL CPYFIL ; Copy the file.
TSTB D.ERR(A1) ; Destination file error?
BNE 99$ ; Yes, all done.
TSTB D.ERR(A2) ; Source file error?
BNE 99$ ; Yes, all done.
20$: DBF D4, 10$ ; Loop for all files.
; All done, return to AlphaBASIC.
;
99$: RTN ; All done.
;***********
; CPYFIL *
;***********
; Copy an input file to the output DDB.
;
; Passed:
;
; A1 => Output (destination) DDB.
; A2 => Input (source) DDB.
;
; Returned:
;
; D.ERR of the offending DDB contains error code, if any.
;
;
CPYFIL: FILINB @A2 ; Get a byte from the source.
TST D.SIZ(A2) ; End of file?
BEQ 99$ ; Yes, all done.
FILOTB @A1 ; Output to the destination.
BR CPYFIL ; Loop for next.
99$: RTN ; Return to caller.