;*************************** AMUS Program Label ******************************
; Filename: ARCRES.M68                                      Date: 032389
; Category: UTIL         Hash Code: 746-311-455-753      Version: 1.0(103)
; Initials: ULTR/AM      Name: DAVID PALLMANN
; Company: ULTRASOFT                               Telephone #: 5163984848
; Related Files: WLDSCN.OBJ,ARCHIV.M68,ARCDIR.M68
; Min. Op. Sys.:                               Expertise Level: BEG
; Special: Must lnklit with wldscn
; Description: Restores files which have been archived using ARCHIV. To
; restore a set of files, type .ARCRES device=archive-file.
; eg. .ARCRES dsk0=baic
;*****************************************************************************
;***************************************************************************;
;                                                                           ;
;                                  ARCRES                                   ;
;                  restore an archive image to AMOS files                   ;
;                                                                           ;
;                         Author: David F. Pallmann                         ;
;            Copyright (C) 1984 by LMS Technical Services, Inc.             ;
;                                                                           ;
;***************************************************************************;
;
; File makes external references to MAC:SYSLIB.LIB.
; After assembly, enter this command: .LNKLIT file
;

OBJNAM  ARCRES.LIT

VMAJOR=1

;edit history
VEDIT=100.      ;06-Jan-84 DFP creation.
VEDIT=101.      ;07-Apr-84 DFP correct restore of 0-byte files.
VEDIT=102.      ;12-Apr-84 DFP add PPNs to disk if required.
VEDIT=103.      ;17-Apr-84 DFP correct bug introduced by 102 edit!

;universals
SEARCH  SYS
SEARCH  SYSSYM

EXTERN  $ADPPN

;registers
IMP=A5                                  ;impure index

;impure area
OFINI
OFDEF   FILE,D.DDB                      ;DDB for writing AMOS files
OFDEF   ARCDIR,D.DDB                    ;DDB for reading archive directory
OFDEF   ARCDAT,D.DDB                    ;DDB for reading archive data
OFDEF   WRKDDB,D.DDB                    ;DDB for $ADPPN call
OFSIZ   IMPSIZ

START:  PHDR    -1,0,PH$REE!PH$REU      ;program header
       GETIMP  IMPSIZ,IMP              ;allocate impure area

;get output device specification

GETDEV: BYP
       LIN
       JEQ     HELP
       FSPEC   FILE(IMP)
       INIT    FILE(IMP)
       ORB     #D$ERC!D$BYP,FILE+D.FLG(IMP) ;                          102

;bypass '='

SKIP:   BYP
       CMMB    (A2)+,#'=
       JNE     HELP

;get archive name

GETARC: BYP
       LIN
       JEQ     HELP
       SAVE    A2
       FSPEC   ARCDIR(IMP),XXX
       MOVW    #[MAP],ARCDIR+D.EXT(IMP)
       INIT    ARCDIR(IMP)
       REST    A2
       FSPEC   ARCDAT(IMP),XXX
       MOVW    #[ARC],ARCDAT+D.EXT(IMP)
       INIT    ARCDAT(IMP)

;open archive

OPNARC: OPENI   ARCDIR(IMP)
       OPENI   ARCDAT(IMP)

;read archive entry

LOOP:   CTRLC   ABORT
       FILINL  ARCDIR(IMP)
       MOV     D1,FILE+D.FIL(IMP)
       TST     ARCDIR+D.SIZ(IMP)
       JEQ     ENDARC
       FILINW  ARCDIR(IMP)
       MOVW    D1,FILE+D.EXT(IMP)
       FILINW  ARCDIR(IMP)
       MOVW    D1,FILE+D.PPN(IMP)
       TYPESP  Restoring
       PFILE   FILE(IMP)
       CRLF
       FILINL  ARCDIR(IMP)
       MOV     D1,D2

RESFIL: OPENO   FILE(IMP)
       BEQ     10$                     ;                               102
       CMMB    FILE+D.ERR(IMP),#D$EILC ;                               102
       JNE     DEVERR                  ;                               102
       CALL    ADDPPN                  ;                               102
10$:    TSTW    D2                      ;                               101
       BEQ     30$                     ;                               101
20$:    FILINB  ARCDAT(IMP)
       FILOTB  FILE(IMP)
       SOB     D2,20$
30$:    CLOSE   FILE(IMP)               ;                               101
       JMP     LOOP

DEVERR: TYPESP  ? FILSER error
       CLR     D1
       MOVB    FILE+D.ERR(IMP),D1
       OCVT    2,OT$TRM
       CRLF
       JMP     LOOP

HELP:   TYPECR  <usage is .ARCRES device=archive>
       TYPECR  <example: .ARCRES DSK2:=PAYROL>
       BR      EXIT

ABORT:  TYPECR  ?aborted

ENDARC: CLOSE   ARCDIR(IMP)
       CLOSE   ARCDAT(IMP)

EXIT:   CRLF
       EXIT

ADDPPN: SAVE    D0-D5,A0-A5             ;                               103
       CLR     D1                      ;                               102
       MOVW    FILE+D.PPN(IMP),D1      ;PPN to add                     102
       CLR     D2                      ;password (none)                102
       LEA     A2,WRKDDB(IMP)          ;work DDB                       102
       MOVW    FILE+D.DEV(IMP),WRKDDB+D.DEV(IMP) ;                     102
       MOVW    FILE+D.DRV(IMP),WRKDDB+D.DRV(IMP) ;                     102
       INIT    WRKDDB(IMP)             ;                               102
       CALL    $ADPPN                  ;                               102
       TST     D0                      ;                               102
       BEQ     10$                     ;                               102
       TYPECR  ? error in adding PPN   ;                               102
10$:    REST    D0-D5,A0-A5             ;                               103
       RTN                             ;                               102

       END