LS-DOS 6.3.1 - BACKUP Assembly Listing (HTML format version)

[Copyright 1999,2002 Frank Durda IV, All Rights Reserved.
Mirroring of any material on this page in any form is expressly prohibited.
The official web site for this material is:  http://nemesis.lonestar.org
Contact this address for use clearances: clearance at nemesis.lonestar.org
Comments and queries to this address: web_software_2011 at nemesis.lonestar.org]
MISOSYS EDAS-4.3 04/19/99 21:02:20 BACKUP - LS-DOS 6.3          Page 00001 

              00001 ;BACKUP/ASM - File/disk copy utility
              00003 ;
0000          00004 *GET    BUILDVER:3
              00005 ;
              00006 ;       Buildver/asm is a bit of a kludge since not all utilities can load
              00007 ;       equates from LDOS60 and still compile.  LOWCORE and everybody else
              00008 ;       relies on this setting, and it eventually ends up in LDOS60/EQU
              00009 ;       for programs that can use that.
              00010 ;
FFFF          00011 @BLD631         EQU     -1      ;<631>Build 631 distribution (LEVEL 1B)
              00012 ;       These switches activate patches made since the 1B release.
              00013 ;       It is important that all earlier patches be enabled when a higher
              00014 ;       patch is enabled.
              00015 ;       Patches C thru F were published in TMQ IV.iv, page 32 (NOTE: the
              00016 ;       patch addresses listed for SPOOL in SPOOL1/FIX are 19H high.)
FFFF          00017 @BLD631C        EQU     -1      ;<631>Apply 1C patches (SETKI)
FFFF          00018 @BLD631D        EQU     -1      ;<631>Apply 1D patches (DIR)
FFFF          00019 @BLD631E        EQU     -1      ;<631>Apply 1E patches (DIR & MEMDISK/DCT)
FFFF          00020 @BLD631F        EQU     -1      ;<631>Apply 1F patches (SPOOL)
              00021 ;       Patches G and H were published in TMQ V.i, pages 10 and 18/19.
FFFF          00022 @BLD631G        EQU     -1      ;<631>Apply 1G patches (//KEYIN,DIR,DO *)
FFFF          00023 @BLD631H        EQU     -1      ;<631>Apply 1H patches (MEMORY)
              00024 ;
              00025 ;End of BUILDVER/ASM
0000          00026 *GET    BACKUP1:3
              00027 ;BACKUP1/ASM - Backup utility module
              00029 ;
0000          00030 SMALL   EQU     0
0000          00031 FMT     EQU     0
000A          00032 LF      EQU     10
000D          00033 CR      EQU     13
0060          00034 LOCK    EQU     60H
00CC          00035 TKCAP   EQU     0CCH
00CE          00036 PSWD    EQU     0CEH
00D8          00037 DAT     EQU     0D8H
00E0          00038 AUTO    EQU     0E0H
1111          00039 FCNT1   EQU     1111H
1555          00040 FCNT2   EQU     1555H
42E0          00041 PASSWORD        EQU     42E0H
              00042 ;
0000          00043 *GET    SVCMAC:3                ;SVC Macro equivalents
              00044 ;SVCMAC/ASM - LS-DOS Version VI
              00045 *LIST   OFF
              00437 *LIST   ON
0000          00439 *GET    COPYCOM:3               ;Copyright message
              00440 ; COPYCOM - File for Copyright COMment block
              00441 ;
0000          00442 *GET BUILDVER/ASM:3
              00443 ;
              00444 ;       Buildver/asm is a bit of a kludge since not all utilities can load
              00445 ;       equates from LDOS60 and still compile.  LOWCORE and everybody else
              00446 ;       relies on this setting, and it eventually ends up in LDOS60/EQU
              00447 ;       for programs that can use that.
              00448 ;
FFFF          00449 @BLD631         EQU     -1      ;<631>Build 631 distribution (LEVEL 1B)
              00450 ;       These switches activate patches made since the 1B release.
              00451 ;       It is important that all earlier patches be enabled when a higher
              00452 ;       patch is enabled.
              00453 ;       Patches C thru F were published in TMQ IV.iv, page 32 (NOTE: the
              00454 ;       patch addresses listed for SPOOL in SPOOL1/FIX are 19H high.)
FFFF          00455 @BLD631C        EQU     -1      ;<631>Apply 1C patches (SETKI)
FFFF          00456 @BLD631D        EQU     -1      ;<631>Apply 1D patches (DIR)
FFFF          00457 @BLD631E        EQU     -1      ;<631>Apply 1E patches (DIR & MEMDISK/DCT)
FFFF          00458 @BLD631F        EQU     -1      ;<631>Apply 1F patches (SPOOL)
              00459 ;       Patches G and H were published in TMQ V.i, pages 10 and 18/19.
FFFF          00460 @BLD631G        EQU     -1      ;<631>Apply 1G patches (//KEYIN,DIR,DO *)
FFFF          00461 @BLD631H        EQU     -1      ;<631>Apply 1H patches (MEMORY)
              00462 ;
              00463 ;End of BUILDVER/ASM
              00464         IF      @BLD631
              00466         ELSE
              00467         COM     '<*(C) 1982,3,4,6 by LSI*>'
              00468         ENDIF
              00469 ;
2600          00470         ORG     2600H
              00471 ;
              00472         IF      @MOD2
              00473 BOOTST$ DB      03H
              00474         ENDIF
              00475         IF      @MOD4
2600 9D       00476 BOOTST$ DB      9DH             ;Boot step rate ptr
              00477         ENDIF
              00478 ;
              00479 ;       Data area
              00480 ;
2601 00       00481 FTFLG$  DB      0
2602 20       00482 SPCFLD$ DC      11,' '
     20 20 20 20 20 20 20 20
     20 20 
260D 00       00483 MFLG$   DB      0
260E 0000     00484 NEWPRM$ DW      0
2610 0000     00485 OLDPRM$ DW      0
2612 0000     00486 MODPRM$ DW      0
2614 0000     00487 QPARM$  DW      0
2616 0000     00488 BUFFER$ DW      0
2618          00489 FCB1$   DS      32
2638          00490 FCB2$   DS      32
2658          00491 FCB3$   DS      32
2658          00492 LILBUF$ EQU     FCB3$
2678          00493 DATFLD$ DS      8
2680          00494 FMPAKD$ DS      2
2682          00495 TOPAKD$ DS      2
2684          00496 CLSFLG$ DS      1
              00497 ;
              00498         IF      @MOD2
              00499 ;
              00500         SUBTTL  ''
              00501 ;
              00503         ENDIF
              00504 ;
              00505 ;
              00506 ;       Normal exit - no errors
              00507 ;
2685 216B2A   00508 EXIT1   LD      HL,BUCAO$       ;"Backup complete...
2688 E5       00509         PUSH    HL              ;Save msg ptr
2689 CDC926   00510         CALL    EXIT5           ;Ck if prompt for sys disk
268C E1       00511         POP     HL
268D          00512         @@DSPLY
              00513         IFEQ    00H,1
              00514         LD      HL,
              00515         ENDIF
268D+3E0A     00516         LD      A,10
268F+EF       00517         RST     40
2690 182B     00518         JR      EXIT
              00519 ;
              00520 ;       Error exit
              00521 ;
2692 3E11     00522 DIRERR  LD      A,17            ;Init "Dir read error
2694 01       00523         DB      1               ;Ignore next inst
2695 3E20     00524 EXIT2   LD      A,20H           ;Init illegal drive #
2697 F5       00525 EXIT3   PUSH    AF
2698 0E0D     00526         LD      C,CR            ;Terminate pending line
269A          00527         @@DSP
269A+3E02     00528         LD      A,2
269C+EF       00529         RST     40
269D CDC926   00530         CALL    EXIT5           ;Get system disk if needed
26A0 F1       00531         POP     AF
26A1 6F       00532         LD      L,A             ;Error code to HL
26A2 2600     00533         LD      H,0
26A4 F6C0     00534         OR      0C0H            ;Set short,return
26A6 4F       00535         LD      C,A             ;Error to C
26A7          00536         @@ERROR                 ;  for error dsply
26A7+3E1A     00537         LD      A,26
26A9+EF       00538         RST     40
26AA 180E     00539         JR      ERREXIT
              00540 ;
              00541 ;       Abort exit
              00542 ;
26AC          00543 BREAK   EQU     $
26AC 217C2A   00544 ABRTBU  LD      HL,ABRTBU$      ;"Backup aborted
26AF E5       00545 EXIT4   PUSH    HL              ;Save msg ptr
26B0 CDC926   00546         CALL    EXIT5           ;Get system disk if needed
26B3 E1       00547         POP     HL
26B4          00548         @@LOGOT                 ;Display the message
              00549         IFEQ    00H,1
              00550         LD      HL,
              00551         ENDIF
26B4+3E0C     00552         LD      A,12
26B6+EF       00553         RST     40
26B7 21FFFF   00554         LD      HL,-1           ;Set error return code
26BA 22C126   00555 ERREXIT LD      (RETCOD),HL
26BD          00556 EXIT    EQU     $
26BD 310000   00557 SPSAV   LD      SP,$-$          ;P/u the stack pointer
26C0 210000   00558         LD      HL,0            ;Set the return code
26C1          00559 RETCOD  EQU     $-2
26C3          00560         @@CKBRKC                ;Check and clear break
26C3+3E6A     00561         LD      A,106
26C5+EF       00562         RST     40
26C6          00563         @@EXIT                  ;Can't return from BACKUP
26C6+3E16     00564         LD      A,22
26C8+EF       00565         RST     40
              00566 ;
              00567 ;       Get system disk if needed & zero memory used
              00568 ;
26C9          00569 EXIT5   EQU     $
26C9 110000   00570 XPARM$  LD      DE,0            ;P/u prompt zero drive
26CC 1C       00571         INC     E               ;Ck for entry
26CD 2009     00572         JR      NZ,EXIT5A
26CF AF       00573         XOR     A
26D0 320328   00574         LD      (SXORD+1),A
26D3 CD0027   00575         CALL    SYSDRV$         ;Force prompt for SYSTEM
26D6 1807     00576         JR      EXIT5B
26D8 3A0328   00577 EXIT5A  LD      A,(SXORD+1)     ;  else if not entered,
26DB B7       00578         OR      A               ;  ck if source & dest
26DC CCFB26   00579         CALL    Z,NDSYS$        ;  are same - we may need
26DF ED5B1626 00580 EXIT5B  LD      DE,(BUFFER$)    ;  a prompt
26E3 7A       00581         LD      A,D             ;Ck if we did a backup
26E4 B3       00582         OR      E
26E5 C8       00583         RET     Z               ;Ret if buf adr never set
26E6 210000   00584         LD      HL,0            ;  else calculate how
26E9 45       00585         LD      B,L             ;  many bytes in RAM
26EA          00586         @@HIGH$                 ;  to zero
26EA+3E64     00587         LD      A,100
26EC+EF       00588         RST     40
26ED AF       00589         XOR     A
26EE ED52     00590         SBC     HL,DE           ;Get length to zero
26F0 44       00591         LD      B,H
26F1 4D       00592         LD      C,L             ;  into BC
26F2 62       00593         LD      H,D             ;Pt HL to start of buffer
26F3 6B       00594         LD      L,E
26F4 13       00595         INC     DE
26F5 3600     00596         LD      (HL),0          ;Init 1st to zero
26F7 0B       00597         DEC     BC              ;  & propogate it
26F8 EDB0     00598         LDIR
26FA C9       00599         RET
              00600 ;
              00601 ;       Prompt for system disk
              00602 ;
26FB 3A4227   00603 NDSYS$  LD      A,(SRCDRV$+1)   ;On exit, if S=D <> 0
26FE B7       00604         OR      A               ;  then no need to prompt
26FF C0       00605         RET     NZ
2700 3E00     00606 SYSDRV$ LD      A,0             ;P/u drive 0 indicator
2702 F620     00607         OR      20H             ;Set bit 5 for sys test
2704 E5       00608         PUSH    HL
2705 216D29   00609         LD      HL,PMTSYS$      ;"insert system...
2708 F5       00610         PUSH    AF              ;Save drive #
2709 3AFC27   00611         LD      A,(CURDSK+1)    ;Save cur disk
270C 323B27   00612         LD      (TDSK),A
270F F1       00613         POP     AF
2710 CDFB27   00614         CALL    CURDSK          ;get wanted disk
2713 3AFC27   00615         LD      A,(CURDSK+1)
2716 E607     00616         AND     7               ;Mask all but drive
2718 4F       00617         LD      C,A             ;Drive # to C
2719          00618         @@GTDCT                 ;Get the DCT this drive
2719+3E51     00619         LD      A,81
271B+EF       00620         RST     40
271C FD7E04   00621         LD      A,(IY+4)        ;Get ckdrv bit
271F F5       00622         PUSH    AF
2720 E67F     00623         AND     7FH             ;Mask ckdrv, force on
2722 FD7704   00624         LD      (IY+4),A
2725 FDE5     00625         PUSH    IY
2727          00626         @@CKDRV
2727+3E21     00627         LD      A,33
2729+EF       00628         RST     40
272A FDE1     00629         POP     IY              ;Get back DCT
272C C1       00630         POP     BC              ;Old info to B
272D F5       00631         PUSH    AF              ;Save ready status
272E 78       00632         LD      A,B             ;Old ckdrv status
272F E680     00633         AND     80H
2731 FDB604   00634         OR      (IY+4)
2734 FD7704   00635         LD      (IY+4),A        ;Restore ckdrv status
2737 F1       00636         POP     AF              ;Get ready status
2738 E1       00637         POP     HL              ;Set for return
2739 C8       00638         RET     Z               ;Back if disk in
273A 3E00     00639         LD      A,0
273B          00640 TDSK    EQU     $-1
273C 32FC27   00641         LD      (CURDSK+1),A    ;Reset for proper disk
273F 18BF     00642         JR      SYSDRV$         ;Redo
              00643 ;
              00644 ;       Prompt source disk
              00645 ;
2741 3E00     00646 SRCDRV$ LD      A,0             ;Source drive
2743 F680     00647         OR      80H             ;Set bit 7 on source
2745 E5       00648         PUSH    HL
2746 218B29   00649         LD      HL,PMTSRC$      ;"Insert source
2749 CDFB27   00650         CALL    CURDSK          ;Prompt for source if needed
274C E1       00651         POP     HL
274D C9       00652         RET
              00653 ;
              00654 ;       Prompt source disk if needed to swap
              00655 ;
274E 3AFC27   00656 PMTSRC  LD      A,(CURDSK+1)    ;P/u current drive
2751 CB7F     00657         BIT     7,A             ;Is source the one?
2753 20EC     00658         JR      NZ,SRCDRV$      ;Jump if it is
2755 CD4127   00659         CALL    SRCDRV$         ;  else prompt for it
2758 3A0328   00660         LD      A,(SXORD+1)
275B B7       00661         OR      A
275C C0       00662         RET     NZ              ;Ret if source <> dest
275D CD9228   00663         CALL    RESTOR          ;Restore to cyl 0
2760 C5       00664         PUSH    BC
2761 D5       00665         PUSH    DE              ;Save registers
2762 E5       00666         PUSH    HL
2763 21002D   00667         LD      HL,BUF3$        ;Use this for I/O buffer
2766 110000   00668         LD      DE,0            ;Read the BOOT
2769 CDA628   00669         CALL    RDSEC
276C E1       00670         POP     HL
276D D1       00671         POP     DE              ;Restore the registers
276E C1       00672         POP     BC
276F C29726   00673         JP      NZ,EXIT3        ;Quit on read error
2772 3A002D   00674         LD      A,(BUF3$)       ;P/u 1st byte of BOOT
2775 B7       00675         OR      A               ;If source, s/b 0
2776 2030     00676         JR      NZ,PSRC3        ;Jump if not this disk
2778 C5       00677         PUSH    BC
2779 D5       00678         PUSH    DE
277A E5       00679         PUSH    HL
277B FD5609   00680         LD      D,(IY+9)        ;P/u dir cyl
277E 1E00     00681         LD      E,0             ;Pt to GAT sector
2780 21002D   00682         LD      HL,BUF3$
2783 CDA628   00683         CALL    RDSEC           ;Read the GAT
2786 FE06     00684         CP      6
2788 C29226   00685         JP      NZ,DIRERR
278B 21CE2B   00686         LD      HL,BUF1$+PSWD   ;Ck for match with orig
278E 11CE2D   00687         LD      DE,BUF3$+PSWD   ;  source disk
2791 060A     00688         LD      B,10            ;Set match count
2793 1A       00689 PSRC1   LD      A,(DE)
2794 BE       00690         CP      (HL)
2795 2008     00691         JR      NZ,DIFSRC       ;Wrong disk if no match
2797 13       00692         INC     DE              ;Bump pointers
2798 23       00693         INC     HL
2799 10F8     00694         DJNZ    PSRC1           ;Loop for 10 compares
279B E1       00695         POP     HL              ;Was a match,
279C D1       00696         POP     DE              ;  restore and return
279D C1       00697         POP     BC
279E C9       00698         RET
279F          00699 DIFSRC  @@DSPLY DIFSRC$         ;"wake up...
              00700         IFEQ    01H,1
279F+21CC29   00701         LD      HL,DIFSRC$
              00702         ENDIF
27A2+3E0A     00703         LD      A,10
27A4+EF       00704         RST     40
27A5 E1       00705         POP     HL              ;Clean the stack
27A6 D1       00706         POP     DE
27A7 C1       00707         POP     BC
27A8 AF       00708 PSRC3   XOR     A               ;Show not current disk
27A9 32FC27   00709         LD      (CURDSK+1),A
27AC 18A0     00710         JR      PMTSRC          ;Loop to re-prompt
              00711 ;
              00712 ;       Destination disk selection
              00713 ;
27AE 3E00     00714 DSTDRV$ LD      A,0             ;Dest drive
27B0 F640     00715         OR      40H             ;Set dest diskette code
27B2 E5       00716         PUSH    HL
27B3 21A929   00717         LD      HL,PMTDST$      ;"insert dest...
27B6 CDFB27   00718         CALL    CURDSK
27B9 E1       00719         POP     HL
27BA C9       00720         RET
              00721 ;
              00722 ;       Prompt destination if needed
              00723 ;
27BB 3AFC27   00724 PMTDST  LD      A,(CURDSK+1)    ;P/u current disk/drive &
27BE CB77     00725         BIT     6,A             ;  ck if destination disk
27C0 20EC     00726         JR      NZ,DSTDRV$      ;Jump if it is
27C2 CDAE27   00727         CALL    DSTDRV$         ;  else request swap
27C5 3A0328   00728         LD      A,(SXORD+1)
27C8 B7       00729         OR      A
27C9 C0       00730         RET     NZ              ;Ret if source <> dest
27CA CD9228   00731         CALL    RESTOR          ;  else restore to cyl 0
27CD C5       00732         PUSH    BC
27CE D5       00733         PUSH    DE
27CF E5       00734         PUSH    HL
27D0 21002D   00735         LD      HL,BUF3$        ;Use this for I/O buffer
27D3 110000   00736         LD      DE,0            ;Pt to BOOT sector
27D6 CDA628   00737         CALL    RDSEC           ;  & read the BOOT
27D9 E1       00738         POP     HL
27DA D1       00739         POP     DE
27DB C1       00740         POP     BC
27DC C29726   00741         JP      NZ,EXIT3        ;Quit on read error
27DF 3A002D   00742         LD      A,(BUF3$)       ;P/u 1st byte of BOOT
27E2 FE76     00743         CP      76H             ;Dest s/b a HALT
27E4 C8       00744 PMTDST1 RET     Z
27E5 E5       00745         PUSH    HL
27E6 D5       00746         PUSH    DE
27E7          00747         @@DSPLY DIFDST$         ;"not same dest...
              00748         IFEQ    01H,1
27E7+21FE29   00749         LD      HL,DIFDST$
              00750         ENDIF
27EA+3E0A     00751         LD      A,10
27EC+EF       00752         RST     40
27ED D1       00753         POP     DE
27EE E1       00754         POP     HL
27EF AF       00755         XOR     A
27F0 32FC27   00756         LD      (CURDSK+1),A    ;Show no current diskette
27F3 18C6     00757         JR      PMTDST          ;  and prompt again
              00758 ;
              00759 ;       Force a prompt of the target disk
              00760 ;
27F5 79       00761 FRCPMT  LD      A,C             ;P/u target drive
27F6 32FC27   00762         LD      (CURDSK+1),A    ; with code bit
27F9 180C     00763         JR      FLASH
              00764 ;
              00765 ;       Routine to check if flashing prompt is needed
              00766 ;
27FB FE00     00767 CURDSK  CP      0               ;P/u current disk
27FD 2872     00768         JR      Z,FLSH6         ;Match with wanted disk?
27FF 32FC27   00769         LD      (CURDSK+1),A    ;No, update current
2802 3EFF     00770 SXORD   LD      A,0FFH          ;0=src & dst drive same
2804 B7       00771         OR      A
2805 206A     00772         JR      NZ,FLSH6        ;Jump if source <> dest
              00773 ;
              00774 ;       Routine to flash the prompt
              00775 ;
2807 C5       00776 FLASH   PUSH    BC
2808 D5       00777         PUSH    DE
2809 E5       00778         PUSH    HL
280A          00779         @@FLAGS                 ;IY => flag table base
280A+3E65     00780         LD      A,101
280C+EF       00781         RST     40
280D 0E0D     00782         LD      C,CR            ;Write a new line
280F          00783         @@DSP
280F+3E02     00784         LD      A,2
2811+EF       00785         RST     40
2812 0E0F     00786         LD      C,15            ;Cursor off
2814          00787         @@DSP
2814+3E02     00788         LD      A,2
2816+EF       00789         RST     40
              00790 FLASH0
2817          00791         @@CKBRKC                ;Check and clear break
2817+3E6A     00792         LD      A,106
2819+EF       00793         RST     40
281A CD8028   00794         CALL    RESKFLG         ;Reset Pause,Enter,Break
281D 01FD41   00795         LD      BC,16893        ;Delay for 1/4 sec
2820          00796         @@PAUSE
2820+3E10     00797         LD      A,16
2822+EF       00798         RST     40
2823 FD7E0A   00799         LD      A,(IY+'K'-'A')
2826 E605     00800         AND     4!1             ;Wait for no ENTER!BRK
2828 20ED     00801         JR      NZ,FLASH0
282A CD8028   00802         CALL    RESKFLG         ;Reset in case BREAK
282D          00803 FLS1    @@DSPLY                 ;Display the message
              00804         IFEQ    00H,1
              00805         LD      HL,
              00806         ENDIF
282D+3E0A     00807         LD      A,10
282F+EF       00808         RST     40
2830 015515   00809         LD      BC,FCNT2
2833 CD4828   00810         CALL    FLS2            ;Blink start
2836 0E1D     00811         LD      C,29            ;Cursor to BOL
2838          00812         @@DSP
2838+3E02     00813         LD      A,2
283A+EF       00814         RST     40
283B 0E1E     00815         LD      C,1EH           ;Cursor erase to EOL
283D          00816         @@DSP
283D+3E02     00817         LD      A,2
283F+EF       00818         RST     40
2840 011111   00819         LD      BC,FCNT1        ;Wait delay count
2843 CD4828   00820         CALL    FLS2            ;Wait & ck Enter or Break
2846 18E5     00821         JR      FLS1            ;Loop until Enter
              00822 FLS2
2848          00823         @@CKBRKC                ;Check for break
2848+3E6A     00824         LD      A,106
284A+EF       00825         RST     40
284B C2AC26   00826         JP      NZ,BREAK        ;  and abort if so
284E FD7E0A   00827         LD      A,(IY+'K'-'A')  ;P/u KFLAG settings
2851 CB57     00828         BIT     2,A             ;Enter pressed?
2853 2006     00829         JR      NZ,FLS4         ;Go if so
2855 0B       00830         DEC     BC              ;Count down
2856 78       00831         LD      A,B
2857 B1       00832         OR      C
2858 20EE     00833         JR      NZ,FLS2         ;  and loop if more time
285A C9       00834         RET
285B F1       00835 FLS4    POP     AF              ;Pop return address
285C          00836 FLS5    @@KBD                   ;Clear type ahead buffer
285C+3E08     00837         LD      A,8
285E+EF       00838         RST     40
285F 28FB     00839         JR      Z,FLS5          ;Loop til no key down
2861 0E0D     00840         LD      C,0DH           ;Dsply a new line
2863          00841         @@DSP
2863+3E02     00842         LD      A,2
2865+EF       00843         RST     40
2866 0E0E     00844         LD      C,14            ;Cursor on
2868          00845         @@DSP
2868+3E02     00846         LD      A,2
286A+EF       00847         RST     40
286B CD8028   00848         CALL    RESKFLG         ;Reset Break,Enter,Pause
286E E1       00849         POP     HL
286F D1       00850         POP     DE              ;Restore registers
2870 C1       00851         POP     BC
2871 3AFC27   00852 FLSH6   LD      A,(CURDSK+1)    ;P/u drive #
2874 E607     00853         AND     7               ;Strip off code bits
2876 4F       00854         LD      C,A             ;Drive # to C to
2877          00855         @@GTDCT                 ;  get DCT vector
2877+3E51     00856         LD      A,81
2879+EF       00857         RST     40
              00858         IF      @MOD4
287A CD9728   00859         CALL    RSELCT          ;Get drive status in A
              00860         ENDIF
              00861         IF      @MOD2
              00862         CALL    SELECT
              00863         ENDIF
287D 07       00864         RLCA
287E 07       00865         RLCA
287F C9       00866         RET
2880 FD7E0A   00867 RESKFLG LD      A,(IY+'K'-'A')  ;Reset 3-bit field
2883 E6F8     00868         AND     0F8H
2885 FD770A   00869         LD      (IY+'K'-'A'),A
2888 C9       00870         RET
              00871 ;
              00872 ;       Drive disk I/O call setups
              00873 ;
2889 C5       00874 TSTDRV  PUSH    BC
288A AF       00875         XOR     A               ;Test for drive
288B 1821     00876         JR      DIO1
288D C5       00877 SELECT  PUSH    BC
288E 3E01     00878         LD      A,1             ;Select new drive
2890 181C     00879         JR      DIO1
2892 C5       00880 RESTOR  PUSH    BC
2893 3E04     00881         LD      A,4             ;Restore
2895 1817     00882         JR      DIO1
2897 C5       00883 RSELCT  PUSH    BC
2898 3E07     00884         LD      A,7             ;Reselect
289A 1812     00885         JR      DIO1
289C C5       00886 WRSEC   PUSH    BC
289D 3E0D     00887         LD      A,13            ;Write sector
289F 180D     00888         JR      DIO1
28A1 C5       00889 WRSYS   PUSH    BC
28A2 3E0E     00890         LD      A,14            ;Write protected
28A4 1808     00891         JR      DIO1
28A6 C5       00892 RDSEC   PUSH    BC
28A7 3E09     00893         LD      A,9             ;Read sector
28A9 1803     00894         JR      DIO1
              00895 ;
              00896         IF      @MOD2
              00897 FMTCYL  PUSH    BC              ;Save
              00898         LD      A,15            ;I/O command
              00899         JR      DIO1            ;Continue
              00900         ENDIF
              00901 ;
28AB C5       00902 VERSEC  PUSH    BC
28AC 3E0A     00903         LD      A,10            ;Verify sector
28AE C628     00904 DIO1    ADD     A,40            ;Adjust for SVC
28B0 47       00905         LD      B,A             ;Save tempy
28B1 3AFC27   00906         LD      A,(CURDSK+1)    ;Get drive number
28B4 E607     00907         AND     7               ;Strip diskette type bit
28B6 4F       00908         LD      C,A             ;Load up drive register
28B7 78       00909         LD      A,B             ;Get back SVC #
              00910         IF      @MOD4
28B8 F3       00911         DI                      ;Interrupts off
              00912         ENDIF
28B9 EF       00913         RST     40
              00914         IF      @MOD4
28BA FB       00915         EI                      ;Interrupts on
              00916         ENDIF
28BB C1       00917         POP     BC
28BC C9       00918         RET
              00919 ;
              00920 ;       Check for correct disk
              00921 ;
28BD D5       00922 CKSWDD  PUSH    DE              ;Save DE,BC
28BE C5       00923         PUSH    BC
28BF 3A4227   00924         LD      A,(SRCDRV$+1)   ;Get drive
28C2 21FC27   00925         LD      HL,CURDSK+1
28C5 4E       00926         LD      C,(HL)          ;Get current drive
28C6 77       00927         LD      (HL),A          ;Make curdsk our dsk
28C7 2A1626   00928         LD      HL,(BUFFER$)    ;I/O buffer
28CA 110200   00929         LD      DE,2            ;Trk 0, sect 2
28CB          00930 PROTSEC EQU     $-2
28CD CDA628   00931         CALL    RDSEC           ;Read SIS sector
28D0 201C     00932         JR      NZ,EX2          ;Quit on read error
28D2 2EC6     00933         LD      L,0C6H          ;Set buffer posn
28D4 3E00     00934         LD      A,$-$           ;Get original id byte
28D5          00935 SVCTR   EQU     $-1
28D6 BE       00936         CP      (HL)            ;Is it the same disk?
28D7 200F     00937         JR      NZ,EX1          ;NZ=error exit
28D9 3C       00938         INC     A
28DA 280C     00939         JR      Z,EX1
28DC 3D       00940         DEC     A               ;If id byte 0,
28DD 2809     00941         JR      Z,EX1           ; no modifying needed
28DF 3D       00942         DEC     A               ; else dec remaining
28E0 2001     00943         JR      NZ,$+3          ;If now 0, make FFH
28E2 3D       00944         DEC     A
28E3 77       00945         LD      (HL),A          ;Store the new id
              00946         IF      @MOD2
              00947         LD      L,0             ;Reset buffer
              00948         ENDIF
              00949         IF      @MOD4
28E4 6A       00950         LD      L,D             ;Reset buffer
              00951         ENDIF
28E5 CD9C28   00952         CALL    WRSEC           ;Put it back, ck error later
28E8 79       00953 EX1     LD      A,C
28E9 32FC27   00954         LD      (CURDSK+1),A    ;Restor orig drv #
28EC C1       00955         POP     BC
28ED D1       00956         POP     DE
28EE 218E2A   00957 EX2     LD      HL,CANTBU$      ;Go if was write error
28F1 C8       00958         RET     Z
28F2 C3AF26   00959         JP      EXIT4
              00960 ;
              00961 ;
              00962 ;       Message area
              00963 ;
28F5 0A       00964 DSTWP$  DB      LF,'Destination disk is write '
     44 65 73 74 69 6E 61 74
     69 6F 6E 20 64 69 73 6B
     20 69 73 20 77 72 69 74
     65 20 
2910 70       00965         DB      'protected',CR
     72 6F 74 65 63 74 65 64
     0D 
291A 43       00966 OLD2NEW$        DB      'Can''t move SYS files from 6.2'
     61 6E 27 74 20 6D 6F 76
     65 20 53 59 53 20 66 69
     6C 65 73 20 66 72 6F 6D
     20 36 2E 32 
2937 20       00967         DB      ' or earlier versions to 6.3.x',CR
     6F 72 20 65 61 72 6C 69
     65 72 20 76 65 72 73 69
     6F 6E 73 20 74 6F 20 36
     2E 33 2E 78 0D 
2955 49       00968 BADMPW$ DB      'Invalid master password',CR
     6E 76 61 6C 69 64 20 6D
     61 73 74 65 72 20 70 61
     73 73 77 6F 72 64 0D 
296D 1D       00969 PMTSYS$ DB      29,30,'Insert SYSTEM disk  ',3
     1E 49 6E 73 65 72 74 20
     53 59 53 54 45 4D 20 64
     69 73 6B 20 20 3C 45 4E
     54 45 52 3E 03 
298B 1D       00970 PMTSRC$ DB      29,30,'Insert SOURCE disk  ',3
     1E 49 6E 73 65 72 74 20
     53 4F 55 52 43 45 20 64
     69 73 6B 20 20 3C 45 4E
     54 45 52 3E 03 
29A9 1D       00971 PMTDST$ DB      29,30,'Insert DESTINATION disk  '
     1E 49 6E 73 65 72 74 20
     44 45 53 54 49 4E 41 54
     49 4F 4E 20 64 69 73 6B
     20 20 
29C4 3C       00972         DB      '',3
     45 4E 54 45 52 3E 03 
29CC 1D       00973 DIFSRC$ DB      29,30,'* A L E R T *  That',27H
     1E 2A 20 41 20 4C 20 45
     20 52 20 54 20 2A 20 20
     54 68 61 74 27 
29E2 73       00974         DB      's not the same source disk ',CR
     20 6E 6F 74 20 74 68 65
     20 73 61 6D 65 20 73 6F
     75 72 63 65 20 64 69 73
     6B 20 0D 
29FE 1D       00975 DIFDST$ DB      29,30,'* A L E R T *  That',27H
     1E 2A 20 41 20 4C 20 45
     20 52 20 54 20 2A 20 20
     54 68 61 74 27 
2A14 73       00976         DB      's not the same destination disk ',CR
     20 6E 6F 74 20 74 68 65
     20 73 61 6D 65 20 64 65
     73 74 69 6E 61 74 69 6F
     6E 20 64 69 73 6B 20 0D
2A35 53       00977 CCMOD$  DB      'Source disk is write protected; '
     6F 75 72 63 65 20 64 69
     73 6B 20 69 73 20 77 72
     69 74 65 20 70 72 6F 74
     65 63 74 65 64 3B 20 
2A55 4D       00978         DB      'MOD flags not updated',CR
     4F 44 20 66 6C 61 67 73
     20 6E 6F 74 20 75 70 64
     61 74 65 64 0D 
2A6B 0A       00979 BUCAO$  DB      LF,'Backup complete',CR
     42 61 63 6B 75 70 20 63
     6F 6D 70 6C 65 74 65 0D
2A7C 0A       00980 ABRTBU$ DB      LF,'Command aborted',14,CR
     43 6F 6D 6D 61 6E 64 20
     61 62 6F 72 74 65 64 0E
     0D 
2A8E 43       00981 CANTBU$ DB      'Can''t Backup - source disk write protected',LF
     61 6E 27 74 20 42 61 63
     6B 75 70 20 2D 20 73 6F
     75 72 63 65 20 64 69 73
     6B 20 77 72 69 74 65 20
     70 72 6F 74 65 63 74 65
     64 0A 
2AB9 44       00982 PROT$   DB      'Disk contains protected files ',CR
     69 73 6B 20 63 6F 6E 74
     61 69 6E 73 20 70 72 6F
     74 65 63 74 65 64 20 66
     69 6C 65 73 20 0D 
2AD8 00       00983 NEWDT   DB      0
2AD9 00       00984 DVTEST1 DB      0
2ADA 00       00985 DVTEST2 DB      0
2ADB          00986 BUCORE$ DEFL    $
2B00          00987         ORG     $<-8+1<+8
2B00          00988 BUF1$   DS      256
2C00          00989 BUF2$   DS      256
2D00          00990 BUF3$   DS      256
              00992 ;
              00993 ;
              00994 ;       Backup entry point
              00995 ;
              00996 ;
              00997 BACKUP
2E00          00998         @@CKBRKC
2E00+3E6A     00999         LD      A,106
2E02+EF       01000         RST     40
2E03 2804     01001         JR      Z,BACKUPA       ;Go ahead if no break
2E05 21FFFF   01002         LD      HL,-1           ; else abort
2E08 C9       01003         RET
              01004 ;
2E09 ED73BE26 01005 BACKUPA LD      (SPSAV+1),SP    ;Save current SP
2E0D E5       01006         PUSH    HL              ;Save cmdbuf
2E0E          01007         @@BREAK 0               ;Remove any BREAK vector
              01008         IFEQ    01H,1
2E0E+210000   01009         LD      HL,0
              01010         ENDIF
2E11+3E67     01011         LD      A,103
2E13+EF       01012         RST     40
2E14          01013         @@DSPLY HELLO$          ;Welcome
              01014         IFEQ    01H,1
2E14+211544   01015         LD      HL,HELLO$
              01016         ENDIF
2E17+3E0A     01017         LD      A,10
2E19+EF       01018         RST     40
2E1A          01019         @@FLAGS                 ;IY => flag table
2E1A+3E65     01020         LD      A,101
2E1C+EF       01021         RST     40
2E1D FDE5     01022         PUSH    IY
2E1F D1       01023         POP     DE
2E20 211800   01024         LD      HL,'Y'-'A'      ;Get year type locn
2E23 19       01025         ADD     HL,DE
2E24 223743   01026         LD      (YFLAG1),HL     ;Save for ckdrv
2E27 CD8028   01027         CALL    RESKFLG         ;Reset KFLAG bits
2E2A FDCB024E 01028         BIT     1,(IY+'C'-'A')  ;Check on CMNDR active
2E2E 219A44   01029         LD      HL,LDOS$
2E31 C2AF26   01030         JP      NZ,EXIT4        ;  and exit if so
2E34 E1       01031         POP     HL
2E35 7E       01032 BCK1    LD      A,(HL)          ;Bypass cmdline spaces
2E36 23       01033         INC     HL
2E37 FE20     01034         CP      ' '
2E39 28FA     01035         JR      Z,BCK1
              01036 ;
              01037 ;       Scan for source partial spec
              01038 ;
2E3B 110226   01039         LD      DE,SPCFLD$      ;Pt to filespec field
2E3E 0608     01040         LD      B,8             ;Init for file name
2E40 FE2D     01041         CP      '-'             ;Exclude matches?
2E42 2005     01042         JR      NZ,BCK2         ;If '-', set flag
2E44 320D26   01043         LD      (MFLG$),A
2E47 7E       01044         LD      A,(HL)          ;Get next char
2E48 23       01045         INC     HL
2E49 CD3231   01046 BCK2    CALL    PRSPEC          ;Parse possible filename
2E4C FE2E     01047         CP      '.'             ;Valid ext. char
2E4E 2804     01048         JR      Z,BCK2A
2E50 FE2F     01049         CP      '/'             ;File ext?
2E52 200A     01050         JR      NZ,BCK3
2E54 110A26   01051 BCK2A   LD      DE,SPCFLD$+8    ;Reposn buffer ptr
2E57 0603     01052         LD      B,3             ;Init for 3 chars
2E59 7E       01053         LD      A,(HL)
2E5A 23       01054         INC     HL              ;Bypass the /
2E5B CD3231   01055         CALL    PRSPEC          ;Parse extension
              01056 ;
              01057 ;       Determine source & destination drives
              01058 ;
2E5E FE3A     01059 BCK3    CP      ':'             ;Drive number coming?
2E60 2820     01060         JR      Z,BCK4          ;Go if so
2E62 FE29     01061         CP      '('+1           ;If legal, is some term.
2E64 3805     01062         JR      C,BCK3A         ;Go if ok
2E66 3E13     01063         LD      A,19            ;"Illegal file name
2E68 C39726   01064         JP      EXIT3           ;Quit
2E6B 2B       01065 BCK3A   DEC     HL              ;Save possible parms
2E6C E5       01066         PUSH    HL
2E6D          01067         @@DSPLY SRCNUM$         ;No drives enter, so
              01068         IFEQ    01H,1
2E6D+21CF44   01069         LD      HL,SRCNUM$
              01070         ENDIF
2E70+3E0A     01071         LD      A,10
2E72+EF       01072         RST     40
2E73 215826   01073         LD      HL,LILBUF$      ;  prompt for them
2E76 010001   01074         LD      BC,1<8          ;1 char response
2E79          01075         @@KEYIN
2E79+3E09     01076         LD      A,9
2E7B+EF       01077         RST     40
2E7C DAAC26   01078         JP      C,ABRTBU        ;Quit on Break
2E7F 7E       01079         LD      A,(HL)          ;Get response. Restore
2E80 E1       01080         POP     HL              ;  command buffer. Ignore
2E81 DA       01081         DB      0DAH            ;  next 2 inst with JP C,
2E82 7E       01082 BCK4    LD      A,(HL)          ;P/u source drive #
2E83 23       01083         INC     HL              ;Bump to separator
2E84 D630     01084         SUB     '0'             ;Adj to binary
2E86 FE08     01085         CP      8               ;Error if not in
2E88 D29526   01086         JP      NC,EXIT2        ;  the range <0-7>
2E8B 324227   01087         LD      (SRCDRV$+1),A   ;Stuff source drive
2E8E 7E       01088 BCK5    LD      A,(HL)          ;P/u char or separator
2E8F 23       01089         INC     HL              ;Bump ptr
2E90 FE3A     01090         CP      ':'             ;Find dest drive?
2E92 281F     01091         JR      Z,BCK6          ;Get drive # if :
2E94 FE30     01092         CP      30H             ; let prepositions thru
2E96 30F6     01093         JR      NC,BCK5
2E98 FE20     01094         CP      20H             ;Or a space separator
2E9A 28F2     01095         JR      Z,BCK5
2E9C 2B       01096         DEC     HL              ;Save possible parms
2E9D E5       01097         PUSH    HL
2E9E          01098         @@DSPLY DSTNUM$         ;Prompt for dest drive
              01099         IFEQ    01H,1
2E9E+21ED44   01100         LD      HL,DSTNUM$
              01101         ENDIF
2EA1+3E0A     01102         LD      A,10
2EA3+EF       01103         RST     40
2EA4 215826   01104         LD      HL,LILBUF$      ;Use for keyin buffer
2EA7 010001   01105         LD      BC,1<8          ;1 char only
2EAA          01106         @@KEYIN
2EAA+3E09     01107         LD      A,9
2EAC+EF       01108         RST     40
2EAD DAAC26   01109         JP      C,ABRTBU        ;Quit on Break
2EB0 7E       01110         LD      A,(HL)          ;Get response. Restore
2EB1 E1       01111         POP     HL              ;  buffer. Ignore next 2
2EB2 DA       01112         DB      0DAH            ;  inst with JP C,nn
2EB3 7E       01113 BCK6    LD      A,(HL)          ;P/u dest drive #
2EB4 23       01114         INC     HL              ;Bump line ptr
2EB5 D630     01115         SUB     '0'             ;Adjust to binary
2EB7 FE08     01116         CP      8               ;Error if not in the
2EB9 D29526   01117         JP      NC,EXIT2        ;  range <0-7>
2EBC 32AF27   01118         LD      (DSTDRV$+1),A   ;Stuff dest drive
              01119 ;
2EBF 117043   01120         LD      DE,PRMTBL$      ;P/u parm table ptr
2EC2 D5       01121         PUSH    DE              ;Also in IX to check
2EC3 DDE1     01122         POP     IX              ;  responses
2EC5          01123         @@PARAM                 ;Get parms if any
2EC5+3E11     01124         LD      A,17
2EC7+EF       01125         RST     40
2EC8 21BF44   01126         LD      HL,PRMERR$      ;Init "parm error
2ECB 2005     01127         JR      NZ,$EX4         ;Quit on parm error
2ECD DD7E30   01128         LD      A,(IX+DATRSP)   ;Date can only be STR
2ED0 E6C0     01129         AND     VAL!SW          ;This must be string
2ED2 C2AF26   01130 $EX4    JP      NZ,EXIT4        ;Quit if not
              01131 ;
              01132 ;       Check on Source = Destination
              01133 ;
2ED5 3A4227   01134         LD      A,(SRCDRV$+1)   ;P/u source drive
2ED8 21AF27   01135         LD      HL,DSTDRV$+1
2EDB AE       01136         XOR     (HL)            ;Match against dest
2EDC 320328   01137         LD      (SXORD+1),A     ;0 if S=D, <>0 if S<>D
2EDF 200D     01138         JR      NZ,DATPRM       ;Bypass if source <> dest
2EE1          01139         @@FLAGS                 ;Else test if  proc
2EE1+3E65     01140         LD      A,101
2EE3+EF       01141         RST     40
2EE4 FDCB126E 01142         BIT     5,(IY+'S'-'A')
2EE8 21B243   01143         LD      HL,NOINDO$      ;"can't do single...
2EEB C2AF26   01144         JP      NZ,EXIT4        ;Abort if from 
              01145 ;
              01146 ;       Check on date entries
              01147 ;
2EEE 210000   01148 DATPRM  LD      HL,0            ;P/u date="from-to"
2EF1 7C       01149         LD      A,H
2EF2 B5       01150         OR      L
2EF3 282F     01151         JR      Z,CKCLAS        ;Bypass if not entered
2EF5 7E       01152         LD      A,(HL)          ;Check for "-to"
2EF6 FE2D     01153         CP      '-'
2EF8 2815     01154         JR      Z,CKTO          ;Go if no From used
2EFA 3E80     01155         LD      A,80H           ;Set From bit
2EFC 320126   01156         LD      (FTFLG$),A      ;Note From entered
2EFF CD5931   01157         CALL    PAKDAT          ;Pack the date entry
2F02 ED438026 01158         LD      (FMPAKD$),BC    ;Save From packed date
2F06 7E       01159         LD      A,(HL)          ;Ck if more in date parm
2F07 FE22     01160         CP      '"'             ;End of string?
2F09 280D     01161         JR      Z,FRCDAT        ;Go if so
2F0B FE2D     01162         CP      '-'             ;Check for "-to"
2F0D 2015     01163         JR      NZ,CKCLAS       ;Done if not
2F0F 23       01164 CKTO    INC     HL              ;Bypass the '-'
2F10 7E       01165         LD      A,(HL)          ;Ck for end of parm
2F11 FE22     01166         CP      '"'
2F13 280F     01167         JR      Z,CKCLAS        ;Go if done
2F15 CD5931   01168         CALL    PAKDAT          ;Pack To date
2F18 3A0126   01169 FRCDAT  LD      A,(FTFLG$)      ;P/u From/To flag and
2F1B F601     01170         OR      1               ;  set To bit
2F1D 320126   01171         LD      (FTFLG$),A
2F20 ED438226 01172         LD      (TOPAKD$),BC    ;Save To packed date
              01173 ;
              01174 ;       Check on parms to force CLASS backup
              01175 ;
2F24 0600     01176 CKCLAS  LD      B,0             ;Init class flag
2F26 110000   01177 SYSPRM  LD      DE,0            ;SYS parm used?
2F29 7A       01178         LD      A,D
2F2A B3       01179         OR      E
2F2B 2802     01180         JR      Z,INVPRM        ;Go if not
2F2D CBF0     01181         SET     6,B             ;Set 6 if SYS
2F2F 110000   01182 INVPRM  LD      DE,0            ;INV parm used?
2F32 7A       01183         LD      A,D
2F33 B3       01184         OR      E
2F34 2802     01185         JR      Z,CKCLA1        ;Go if not
2F36 CBD8     01186         SET     3,B             ;Set 3 if INV
2F38 78       01187 CKCLA1  LD      A,B
2F39 328426   01188         LD      (CLSFLG$),A     ;Store by class flag
2F3C 3A0226   01189         LD      A,(SPCFLD$)     ;Get 1st char of possible
2F3F D620     01190         SUB     ' '             ;  file name
2F41 47       01191         LD      B,A             ;Save test result and
2F42 3A0A26   01192         LD      A,(SPCFLD$+8)   ;  check if extension used
2F45 D620     01193         SUB     ' '             ;Ck for ext
2F47 B0       01194         OR      B               ;A <> 0 if partspec
2F48 47       01195         LD      B,A             ;Hold in reg B
              01196 ;
              01197 ;       Merge all "CLASS" parms together
              01198 ;
2F49 DD7E0C   01199         LD      A,(IX+SYSRSP)   ;System files
2F4C DDB613   01200         OR      (IX+INVRSP)     ;Invisible files
2F4F DDB61A   01201         OR      (IX+MODRSP)     ;Mod flag files
2F52 DDB637   01202         OR      (IX+NEWRSP)     ;Files not on dest
2F55 DDB63E   01203         OR      (IX+OLDRSP)     ;Files on dest
2F58 DDB623   01204         OR      (IX+QRSP)       ;Query forces by class
2F5B 4F       01205         LD      C,A             ;Hold value
2F5C E6A0     01206         AND     VAL!STR         ;Above parms only SWITCH
2F5E 21BF44   01207         LD      HL,PRMERR$      ;Init "parm error
2F61 C2AF26   01208         JP      NZ,EXIT4        ;Quit if not switches only
2F64 B1       01209         OR      C
2F65 B0       01210         OR      B               ;Merge with partspec
2F66 DDB630   01211         OR      (IX+DATRSP)     ;D=" mm/dd/yy-mm/dd/yy"
              01212 ;
              01213 ;       Advise backup by class if any class parameter
              01214 ;
2F69 320142   01215         LD      (CLSTST+1),A    ;Set for all flags
2F6C 2806     01216         JR      Z,GETDAT        ;Z=may be mirror image
2F6E          01217         @@LOGOT CLASS$          ;  else log by class msg
              01218         IFEQ    01H,1
2F6E+211F45   01219         LD      HL,CLASS$
              01220         ENDIF
2F71+3E0C     01221         LD      A,12
2F73+EF       01222         RST     40
              01223 ;
              01224 ;       Recover today's date
              01225 ;
2F74 217826   01226 GETDAT  LD      HL,DATFLD$      ;Date storage buffer
2F77          01227         @@DATE                  ;Get date
2F77+3E12     01228         LD      A,18
2F79+EF       01229         RST     40
2F7A 1A       01230         LD      A,(DE)          ;Check if date in system
2F7B B7       01231         OR      A
2F7C 2006     01232         JR      NZ,GETGM        ;Go if it is
2F7E 210B45   01233         LD      HL,NODAT$
2F81          01234         @@LOGOT                 ;Show "no date" if none
              01235         IFEQ    00H,1
              01236         LD      HL,
              01237         ENDIF
2F81+3E0C     01238         LD      A,12
2F83+EF       01239         RST     40
2F84 D5       01240 GETGM   PUSH    DE              ;Save date$
2F85 E5       01241         PUSH    HL              ;  and date buffer
2F86 115D45   01242         LD      DE,RES$         ;See if SYS modules resident
2F89          01243         @@GTMOD                 ;  in case needed later
2F89+3E53     01244         LD      A,83
2F8B+EF       01245         RST     40
2F8C 2004     01246         JR      NZ,GETDAT1      ;Skip if none res'ed
2F8E ED532942 01247         LD      (RESLOC+1),DE   ;Store the module loc
              01248 ;
              01249 ;       Get SYS2 loaded for password hash
              01250 ;
2F92 E1       01251 GETDAT1 POP     HL
2F93 D1       01252         POP     DE
2F94 CD6A42   01253         CALL    GETSYS2         ;Get sys2 and move date
              01254 ;
              01255 ;       Check on (X) parm for source/dest swap
              01256 ;
2F97 3A4227   01257         LD      A,(SRCDRV$+1)   ;If source is not 0,
2F9A B7       01258         OR      A               ; then let PMTSRC handle
2F9B 200F     01259         JR      NZ,SRCDFT
2F9D F680     01260         OR      80H             ;Set to SRC code
2F9F 4F       01261         LD      C,A             ;Save if needed
2FA0 3ACA26   01262         LD      A,(XPARM$+1)    ;Source is drive 0,
2FA3 3C       01263         INC     A               ; if (X), then swap
2FA4 F5       01264         PUSH    AF
2FA5 218B29   01265         LD      HL,PMTSRC$
2FA8 CCF527   01266         CALL    Z,FRCPMT        ;Force prompt on (X)
2FAB F1       01267         POP     AF
2FAC C44127   01268 SRCDFT  CALL    NZ,SRCDRV$      ;Prompt for source
2FAF CD9228   01269         CALL    RESTOR          ;Get set to see if a
2FB2 CDBF42   01270         CALL    CKDRV           ; source disk mounted
2FB5 280A     01271         JR      Z,GOTSRC        ;Z=ok
2FB7 F5       01272         PUSH    AF
2FB8 218B29   01273         LD      HL,PMTSRC$      ;Else prompt "Insert...
2FBB CDF527   01274         CALL    FRCPMT
2FBE F1       01275         POP     AF
2FBF 18EB     01276         JR      SRCDFT          ; and then check again
              01277 ;
              01278 ;       Get source disk attributes
              01279 ;
2FC1 FD7E03   01280 GOTSRC  LD      A,(IY+3)        ;P/u 5" or 8" from
2FC4 E620     01281         AND     20H             ;  DCT+3, bit 5
2FC6 328F30   01282         LD      (TST5_8+1),A    ;  and save for later
2FC9 CD8928   01283         CALL    TSTDRV          ;Ck for active DCT
2FCC C29726   01284         JP      NZ,EXIT3        ;  and quit if not
2FCF 21002D   01285         LD      HL,BUF3$        ;Disk buffer
              01286 ;
              01287         IF      @MOD2
              01288         CALL    GETPSEC         ;Get prot sector
              01289         JP      NZ,EXIT3        ;Go on error
              01290         CP      6               ;Directory?
              01291         JP      NZ,DIRERR       ;Nope, go!
              01292         ENDIF
2FD2 110000   01293         LD      DE,0            ;Set to track/sector 0/0
2FD5 CDA628   01294         CALL    RDSEC           ;Read boot
2FD8 C29726   01295         JP      NZ,EXIT3        ;Quit on read error
2FDB 3A022D   01296         LD      A,(BUF3$+2)     ;P/u dir track
2FDE FD7709   01297         LD      (IY+9),A        ;  & stuff in table
              01298         IF      @MOD2
              01299         LD      DE,(PROTSEC)    ;Get info sector
              01300         ENDIF
              01301         IF      @MOD4
2FE1 1C       01302         INC     E               ;Point to SYSINFO sector
2FE2 1C       01303         INC     E
              01304         ENDIF
2FE3 262B     01305         LD      H,BUF1$<-8      ;Use this disk buffer
2FE5 CDA628   01306         CALL    RDSEC           ;Read the info sector
2FE8 C29726   01307         JP      NZ,EXIT3        ;Quit on read error
2FEB 3AC62B   01308         LD      A,(BUF1$+0C6H)  ;Get & save id byte
2FEE 32D528   01309         LD      (SVCTR),A
2FF1 3C       01310         INC     A
2FF2 2815     01311         JR      Z,CKGAT
              01312 ;
              01313 ;       Check write protect status
              01314 ;
2FF4 3D       01315         DEC     A               ;Need to check?
2FF5 2812     01316         JR      Z,CKGAT         ;Go if not
2FF7 CD9228   01317         CALL    RESTOR          ;Start the drive
2FFA CD9728   01318         CALL    RSELCT          ;Ck if WP
2FFD FDB603   01319         OR      (IY+3)          ;Merge in soft WP
3000 07       01320         RLCA                    ;Push WP to CF
3001 3006     01321         JR      NC,CKGAT        ;Bypass if not WP
3003 218E2A   01322 CANTBU  LD      HL,CANTBU$
3006 C3AF26   01323         JP      EXIT4
              01324 ;
3009 FD5609   01325 CKGAT   LD      D,(IY+9)        ;Directory track,
300C 1E00     01326         LD      E,0             ;  sector 0
300E 21002B   01327         LD      HL,BUF1$
3011 CDA628   01328         CALL    RDSEC           ;Read GAT
3014 FE06     01329         CP      6               ;Ensure directory cyl
3016 C29226   01330         JP      NZ,DIRERR       ;Quit on any other error
3019 3ACD2B   01331         LD      A,(BUF1$+0CDH)  ;GAT type byte
301C E608     01332         AND     8               ;Mask all but date type
301E 32D92A   01333         LD      (DVTEST1),A     ;Save for date dsply
3021 32DA2A   01334         LD      (DVTEST2),A     ;Save for unpack routine
3024 326330   01335         LD      (SRCTYP),A      ;Save for cp to dest disk
3027 CD1131   01336         CALL    TSTMPW          ;Get password if needed
              01337 ;
              01338 ;       Check if destination formatted & not protected
              01339 ;
302A 3AAF27   01340         LD      A,(DSTDRV$+1)   ;If dest is not 0,
302D B7       01341         OR      A               ; then let DSTDRV handle
302E 200F     01342         JR      NZ,DSTDFT
3030 F640     01343         OR      40H             ;Set DST code
3032 4F       01344         LD      C,A             ;Save if needed
3033 3ACA26   01345         LD      A,(XPARM$+1)    ;Dest is drive 0
3036 3C       01346         INC     A               ;If (X), then swap
3037 F5       01347         PUSH    AF
3038 21A929   01348         LD      HL,PMTDST$
303B CCF527   01349         CALL    Z,FRCPMT        ;Force prompt on (X)
303E F1       01350         POP     AF
303F C4AE27   01351 DSTDFT  CALL    NZ,DSTDRV$      ;Get dest drive
3042 CD9228   01352         CALL    RESTOR          ;Restore destination
3045 CD9728   01353         CALL    RSELCT          ;Test it
3048 2035     01354         JR      NZ,PMTDD        ;Might be signal from
              01355                                 ;HD driver
304A 07       01356         RLCA
304B FDB603   01357         OR      (IY+3)          ;Merge in soft WP
304E CB7F     01358         BIT     7,A             ; Check on WP status
3050 21F528   01359         LD      HL,DSTWP$       ;Dest write prot...
3053 C2AF26   01360         JP      NZ,EXIT4        ;Jp if write protected
3056 CDBF42   01361         CALL    CKDRV           ;Ck for disk, read GAT
3059 2024     01362         JR      NZ,PMTDD        ;Redo if not there
305B 3ACD47   01363         LD      A,(CKDRBUF+0CDH);GAT type byte
305E E608     01364         AND     8               ;Mask all but date type
3060 0F       01365         RRCA
3061 6F       01366         LD      L,A             ;Save result
3062 3E00     01367         LD      A,$-$
3063          01368 SRCTYP  EQU     $-1             ;Source type
3064 B5       01369         OR      L               ;Merge the two
3065 32D82A   01370         LD      (NEWDT),A       ;If result=4, old to new
3068 FE04     01371         CP      4               ;Is old to new?
306A 200A     01372         JR      NZ,SRCTYP1      ;Go if not old to new
306C 3A272F   01373         LD      A,(SYSPRM+1)    ;If sys move, cant be
306F B7       01374         OR      A               ;Old to new
3070 211A29   01375         LD      HL,OLD2NEW$
3073 C2AF26   01376         JP      NZ,EXIT4
3076 FDCB035E 01377 SRCTYP1 BIT     3,(IY+3)        ;Hard drive?
307A C2F030   01378         JP      NZ,RECON        ;Go if hard
307D 180A     01379         JR      GOTDST          ;  else continue tests
              01380 ;
307F F5       01381 PMTDD   PUSH    AF              ;Kludge a force of
3080 21A929   01382         LD      HL,PMTDST$
3083 CDF527   01383         CALL    FRCPMT
3086 F1       01384         POP     AF
3087 18B6     01385         JR      DSTDFT          ;  the destination prompt
              01386 ;
              01387 ;       Check 5" vs 8" for forced reconstruction
              01388 ;
3089 FD7E03   01389 GOTDST  LD      A,(IY+3)
308C E620     01390         AND     20H             ;See if 5/8 mismatch
308E EE00     01391 TST5_8  XOR     0               ;P/u source size
3090 C2F030   01392         JP      NZ,RECON        ;Go if different
3093 110000   01393         LD      DE,0
3096 CDAB28   01394         CALL    VERSEC          ;Verify boot sector readable
3099 2806     01395         JR      Z,CKDST         ;Jump if ok
              01396 ;
              01397 ;       Destination not formatted, abort
              01398 ;
309B 21E543   01399         LD      HL,NOFMT$       ;Init "Not formatted
309E C3AF26   01400         JP      EXIT4           ;Display and abort
              01401 ;
              01402 ;       Check destination attributes
              01403 ;
30A1 21002D   01404 CKDST   LD      HL,BUF3$
30A4 110000   01405         LD      DE,0            ;SET for track/sector 0/0
30A7 CDA628   01406         CALL    RDSEC           ;Read dest boot
30AA C29726   01407         JP      NZ,EXIT3
30AD 3A022D   01408         LD      A,(BUF3$+2)     ;P/u its dir track
30B0 57       01409         LD      D,A             ;Set up in D
30B1 21002C   01410         LD      HL,BUF2$
30B4 5D       01411         LD      E,L             ;  and 0 in E
30B5 CDA628   01412         CALL    RDSEC           ;Read dest GAT
30B8 FE06     01413         CP      6               ;Ensure a dir cyl
30BA C29226   01414         JP      NZ,DIRERR       ;Quit on any other error
30BD 2AC2B   01415         LD      HL,(BUF1$+TKCAP)        ;P/u source capacity
30C0 ED5BCC2C 01416         LD      DE,(BUF2$+TKCAP)        ;P/u dest capacity
30C4 3AD528   01417         LD      A,(SVCTR)       ;If id byte was FF
30C7 3C       01418         INC     A
30C8 2807     01419         JR      Z,SHOPROT       ; then force recon
30CA 3D       01420         DEC     A               ;If id was not 0
30CB 200C     01421         JR      NZ,TSTCAP       ;  then test sizes
30CD CB64     01422         BIT     4,H             ;If types differ
30CF 2808     01423         JR      Z,TSTCAP        ;  force reconstruct
              01424 ;
30D1          01425 SHOPROT @@LOGOT PROT$           ;Show reconstruct invoked
              01426         IFEQ    01H,1
30D1+21B92A   01427         LD      HL,PROT$
              01428         ENDIF
30D4+3E0C     01429         LD      A,12
30D6+EF       01430         RST     40
30D7 1817     01431         JR      RECON           ;Skip next tests
              01432 ;
30D9 7C       01433 TSTCAP  LD      A,H             ;Den/sides match?
30DA AA       01434         XOR     D               ;Force Reconstruct if
30DB E660     01435         AND     60H             ;  density & sides
30DD 2011     01436         JR      NZ,RECON        ;  differ
30DF 7D       01437         LD      A,L             ;Test # of cyls
30E0 93       01438         SUB     E
30E1 280A     01439         JR      Z,BYCLAS        ;Jump if same
              01440 ;
              01441 ;       Cylinder count differs - question Mirror
              01442 ;
30E3 3A0142   01443         LD      A,(CLSTST+1)    ;But don't question if
30E6 B7       01444         OR      A               ; Class parms already
30E7 C20042   01445         JP      NZ,CLSTST       ; entered
30EA CDF930   01446         CALL    MIRROR          ;Attempt mirror?
30ED CA0042   01447 BYCLAS  JP      Z,CLSTST        ;Jump if mirror to be tried
30F0          01448 RECON   @@LOGOT RECON$          ;"backup re-con...
              01449         IFEQ    01H,1
30F0+219C45   01450         LD      HL,RECON$
              01451         ENDIF
30F3+3E0C     01452         LD      A,12
30F5+EF       01453         RST     40
30F6 C31342   01454         JP      MVBYCLS         ;Go do file backup
              01455 ;
              01456 ;       Different # of tracks - Prompt for mirror
              01457 ;
30F9          01458 MIRROR  @@DSPLY MIRROR$         ;"Attempt mirror...
              01459         IFEQ    01H,1
30F9+21B745   01460         LD      HL,MIRROR$
              01461         ENDIF
30FC+3E0A     01462         LD      A,10
30FE+EF       01463         RST     40
30FF 215926   01464         LD      HL,LILBUF$+1    ;Keyin buffer
3102 010003   01465 QM1     LD      BC,3<8          ;3 chars max
3105          01466         @@KEYIN
3105+3E09     01467         LD      A,9
3107+EF       01468         RST     40
3108 DAAC26   01469         JP      C,ABRTBU        ;Quit on break
310B 7E       01470         LD      A,(HL)
310C CBAF     01471         RES     5,A             ;Convert to UC
310E FE59     01472         CP      'Y'             ;Ret Z if Yes
3110 C9       01473         RET
              01474 ;
              01475 ;       Get & check Disk master password
              01476 ;
3111 2ACE2B   01477 TSTMPW  LD      HL,(BUF1$+PSWD) ;P/u src MPW
3114 11E042   01478         LD      DE,PASSWORD     ;If "PASSWORD",
3117 AF       01479         XOR     A               ;  don't prompt
3118 ED52     01480         SBC     HL,DE
311A C8       01481         RET     Z
311B 110000   01482         LD      DE,$-$          ;P/u User entry
311C          01483 MPWPRM  EQU     $-2
311E 21EF45   01484         LD      HL,PMTMPW$      ;Init "Enter MPW
3121 CD6442   01485         CALL    GETMPW          ;Get the user's response
3124 EB       01486         EX      DE,HL
3125 2ACE2B   01487         LD      HL,(BUF1$+PSWD)
3128 AF       01488         XOR     A
3129 ED52     01489         SBC     HL,DE           ;Entry match?
312B C8       01490         RET     Z               ;Ret if MPW match
312C 215529   01491         LD      HL,BADMPW$      ;  else init "bad MPW...
312F C3AF26   01492         JP      EXIT4           ;Don't do the backup
              01493 ;
              01494 ;       Routine to parse partial filespecs & cvrt to UC
              01495 ;
3132 FE2A     01496 PRSPEC  CP      '*'
3134 2008     01497         JR      NZ,PS4
3136 3E24     01498         LD      A,'$'           ;Wild card char
3138 12       01499 PS5     LD      (DE),A          ;Store it
3139 10FD     01500         DJNZ    PS5
313B 7E       01501         LD      A,(HL)          ;P/u terminator
313C 23       01502         INC     HL
313D C9       01503         RET
313E FE24     01504 PS4     CP      '$'             ;Wild character?
3140 280A     01505         JR      Z,PS1           ;Always a match
3142 FE41     01506         CP      'A'             ;Filename entered?
3144 3006     01507         JR      NC,PS1
3146 FE3A     01508         CP      '9'+1           ;Ck on 0-9
3148 D0       01509         RET     NC
3149 FE30     01510         CP      '0'
314B D8       01511         RET     C
314C FE61     01512 PS1     CP      'a'             ;Cvrt to UC if needed
314E 3802     01513         JR      C,$+4
3150 CBAF     01514         RES     5,A             ;Convert to upper case
3152 12       01515         LD      (DE),A          ;Save in partspec buffer
3153 13       01516         INC     DE              ;Bump buffer
3154 7E       01517         LD      A,(HL)          ;Get next char and
3155 23       01518         INC     HL              ;  bump string ptr
3156 10DA     01519         DJNZ    PRSPEC
3158 C9       01520         RET
              01521 ;
              01522 ;       Pack user date string
              01523 ;
3159 7E       01524 PAKDAT  LD      A,(HL)
315A 0E2F     01525         LD      C,'/'           ;Init separator
315C CDAC31   01526         CALL    PARSDAT         ;Parse entry
315F 2045     01527         JR      NZ,BADFMT       ;Jump on format error
3161 EB       01528         EX      DE,HL
              01529         IF      @BLD631
3162 7E       01530         LD      A,(HL)          ;<631>Is this year a leap year?
3163 FE0C     01531         CP      0CH             ;<631>
3165 3003     01532         JR      NC,LPBLW        ;<631>
3167 C664     01533         ADD     A,64H           ;<631>
3169 77       01534         LD      (HL),A          ;<631>
316A E603     01535 LPBLW:  AND     3               ;<631>
              01536         ELSE
              01537         LD      A,(LILBUF$)     ;Is year a leap year?
              01538         AND     3
              01539         ENDIF
316C 210846   01540         LD      HL,MAXDAYS+1    ;Set Feb to have 29 days
316F 2001     01541         JR      NZ,$+3          ; if so
3171 34       01542         INC     (HL)
3172 3A5A26   01543         LD      A,(LILBUF$+2)   ;P/u month
3175 3D       01544         DEC     A               ;Range check
3176 FE0C     01545         CP      12
3178 302C     01546         JR      NC,BADFMT       ;Go if 0 or >12
317A 2B       01547         DEC     HL              ;Point to Jan entry
317B 85       01548         ADD     A,L             ;Index the month
317C 6F       01549         LD      L,A
317D 7C       01550         LD      A,H
317E CE00     01551         ADC     A,0
3180 67       01552         LD      H,A
3181 3A5926   01553         LD      A,(LILBUF$+1)   ;P/u day entry
3184 3D       01554         DEC     A               ;Reduce for test (0->FF)
3185 BE       01555         CP      (HL)
3186 301E     01556         JR      NC,BADFMT       ;Go if too large (or 0)
3188 215A26   01557         LD      HL,LILBUF$+2    ;Pt to month
318B 46       01558         LD      B,(HL)
318C 0E00     01559         LD      C,0
318E CB38     01560         SRL     B               ;Split month between
3190 CB19     01561         RR      C               ;  B and C
3192 2B       01562         DEC     HL
3193 7E       01563         LD      A,(HL)          ;Get the day
3194 07       01564         RLCA                    ;Move to bits 2-6
3195 07       01565         RLCA
3196 B1       01566         OR      C               ;Merge w/month
3197 4F       01567         LD      C,A
3198 2B       01568         DEC     HL              ;Pt to year
3199 7E       01569         LD      A,(HL)
319A D650     01570         SUB     80              ;Make only offset
319C 3001     01571         JR      NC,GDATE        ;Ok if not < 1980
319E AF       01572         XOR     A               ;  else use 1980
319F 07       01573 GDATE   RLCA                    ;Move to bits 3-7
31A0 07       01574         RLCA
31A1 07       01575         RLCA
31A2 B0       01576         OR      B               ; & merge with month
31A3 47       01577         LD      B,A
31A4 EB       01578         EX      DE,HL
31A5 C9       01579         RET
31A6 211346   01580 BADFMT  LD      HL,BADFMT$
31A9 C3AF26   01581         JP      EXIT4
              01582 ;
              01583 ;       Routine to parse DATE/TIME entry
              01584 ;
31AC 115A26   01585 PARSDAT LD      DE,LILBUF$+2    ;Point to buf end
31AF 0603     01586         LD      B,3             ;Process 3 fields
31B1 D5       01587 PRSD1   PUSH    DE              ;Save pointer
31B2 CDC131   01588         CALL    PRSD2           ;Get a digit pair
31B5 D1       01589         POP     DE              ;Recover pointer
31B6 C0       01590         RET     NZ              ;Ret if bad digit pair
31B7 12       01591         LD      (DE),A          ; else stuff the value
              01592         IF      @BLD631
31B8 05       01593         DEC     B               ;<631>Loop countdown
31B9 C8       01594         RET     Z               ;<631>
31BA 1B       01595         DEC     DE              ;<631>Backup the pointer
              01596         ELSE
              01597         DEC     DE              ;Backup the pointer
              01598         DEC     B               ;Loop countdown
              01599         RET     Z
              01600         ENDIF
31BB 7E       01601         LD      A,(HL)          ;Ck for valid separator
31BC 23       01602         INC     HL              ;Bump pointer
31BD B9       01603         CP      C               ;Separator char required
31BE 28F1     01604         JR      Z,PRSD1         ;Loop if match
31C0 C9       01605         RET                     ;Else ret bad (NZ)
              01606 ;
              01607 ;       Routine to parse a digit pair
              01608 ;
31C1 CDD831   01609 PRSD2   CALL    PRS4            ;Get a digit
31C4 3010     01610         JR      NC,PRSD3        ;Jump if bad digit
31C6 5F       01611         LD      E,A             ;Multiply by ten
31C7 07       01612         RLCA
31C8 07       01613         RLCA
31C9 83       01614         ADD     A,E
31CA 07       01615         RLCA
31CB 5F       01616         LD      E,A
31CC CDD831   01617         CALL    PRS4            ;Get another digit
31CF 3005     01618         JR      NC,PRSD3        ;Jump on bad digit
31D1 83       01619         ADD     A,E             ;Accumulate new digit
31D2 5F       01620         LD      E,A             ;Save 2-digit value
31D3 AF       01621         XOR     A               ;Clear flags
31D4 7B       01622         LD      A,E             ;Xfer field value
31D5 C9       01623         RET
31D6 B7       01624 PRSD3   OR      A               ;Set NZ
31D7 C9       01625         RET
31D8 7E       01626 PRS4    LD      A,(HL)          ;P/u a digit &
31D9 23       01627         INC     HL              ;Convert to binary
31DA D630     01628         SUB     30H
31DC FE0A     01629         CP      10              ;Set CF if good
31DE C9       01630         RET
              01631 ;
              01632 ;       Save PC for later use
              01633 ;
3200          01634 CORE$   DEFL    $<-8+1<8        ;Set to next page
2E00          01635         ORG     BACKUP          ;Set for MIRROR exec
3200          01636 MIRBU   EQU     CORE$
2E00          01637         LORG    MIRBU           ;Load origin
              01638 ;
              01641 ;
2E00          01642 *GET    BACKUP2:3
              01643 ;BACKUP2/ASM - Mirror Image Backup
              01644 *MOD
              01645 ;
2E00 CDAE27   01646         CALL    DSTDRV$         ;Prompt for dest but
2E03 CDBB27   01647         CALL    PMTDST          ;  don't test yet
2E06 21002D   01648         LD      HL,BUF3$
2E09 55       01649         LD      D,L             ;Set cyl to 0
2E0A 1E01     01650         LD      E,1             ;Read sector 1 for step
2E0C CDA628   01651         CALL    RDSEC           ;Read BOOT
2E0F C29726   01652         JP      NZ,EXIT3        ;Quit on read error
2E12 3A0026   01653         LD      A,(BOOTST$)     ;P/u the boot step rate
2E15 6F       01654         LD      L,A
2E16 7E       01655         LD      A,(HL)
2E17 E603     01656         AND     3               ;  from bits 0-1
2E19 320930   01657         LD      (BSMIR+1),A     ;Save for later
2E1C 3A022D   01658         LD      A,(BUF3$+2)     ;Get dir cylinder
2E1F 57       01659         LD      D,A             ;  into D
2E20 21002C   01660         LD      HL,BUF2$        ;Use this buffer now
2E23 5D       01661         LD      E,L             ;Set sector 0
2E24 CDA628   01662         CALL    RDSEC           ;Read the dest GAT
2E27 FE06     01663         CP      6               ;Expect error 6 here
2E29 3E14     01664         LD      A,20            ;Init "GAT read error
2E2B C29726   01665         JP      NZ,EXIT3        ;  and abort on an error
2E2E 21CE2B   01666         LD      HL,BUF1$+0CEH   ;Source GAT
2E31 11CE2C   01667         LD      DE,BUF2$+0CEH   ;Dest GAT
2E34 060A     01668         LD      B,10            ;Compare pack names
2E36 1A       01669 CPRID   LD      A,(DE)          ;  and passwords
2E37 BE       01670         CP      (HL)
2E38 2866     01671         JR      Z,IDMATCH
              01672 ;
              01673 ;       No match - move disk name into message
              01674 ;
2E3A 21D02C   01675         LD      HL,BUF2$+0D0H
2E3D 114932   01676         LD      DE,PACKID$+5    ;Move name into
2E40 010800   01677         LD      BC,8            ;  display message field
2E43 EDB0     01678         LDIR
2E45 115832   01679         LD      DE,PACKID$+20   ;Move date into
2E48 0E08     01680         LD      C,8             ;  message field
2E4A EDB0     01681         LDIR
2E4C          01682         @@LOGOT DIFID$          ;"diff pack ids..
              01683         IFEQ    01H,1
2E4C+212232   01684         LD      HL,DIFID$
              01685         ENDIF
2E4F+3E0C     01686         LD      A,12
2E51+EF       01687         RST     40
2E52          01688         @@FLAGS                 ;If DOing, don't!
2E52+3E65     01689         LD      A,101
2E54+EF       01690         RST     40
2E55 FDCB126E 01691         BIT     5,(IY+'S'-'A')
2E59 2042     01692         JR      NZ,PACKNDO      ;Abort if JCL going
              01693         IF      @BLD631
2E5B FDCB0D7E 01694         BIT     7,(IY+'N'-'A')  ;<631>
2E5F 2023     01695         JR      NZ,PMTYN        ;<631>
              01696         ENDIF
              01697 ;
              01698 ;       If MPW = "PASSWORD", just query Y,N
              01699 ;
2E61 2ACE2C   01700         LD      HL,(BUF2$+0CEH) ;P/u disk MPW
2E64 11E042   01701         LD      DE,PASSWORD     ;P/u hash for "PASSWORD"
2E67 AF       01702         XOR     A
2E68 ED52     01703         SBC     HL,DE           ;Does it match disk MPW?
2E6A 2818     01704         JR      Z,PMTYN         ;Go get Y or N if so
              01705 ;
              01706 ;       User must enter Current Pack's MPW to proceed
              01707 ;
2E6C 216132   01708 OLDMPW  LD      HL,OLDMPW$      ;"What's the old MPW?
2E6F 110000   01709         LD      DE,0            ;Force prompt of message
2E72 CD6442   01710         CALL    GETMPW          ;Grab user input to match
              01711 ;
              01712 ;       Routine to test master password for match
              01713 ;
2E75 EB       01714         EX      DE,HL           ;Xfer hashed MPW to DE
2E76 2ACE2C   01715         LD      HL,(BUF2$+0CEH) ;Grab pack MPW
2E79 AF       01716         XOR     A               ;Clear carry flag
2E7A ED52     01717         SBC     HL,DE           ;Did user enter pack MPW?
2E7C 215529   01718         LD      HL,BADMPW$      ;Init "Bad MPW" just in case
2E7F C2AF26   01719         JP      NZ,EXIT4        ;Abort if no match
2E82 1820     01720         JR      $A1             ;PW good, continue backup
              01721 ;
2E84          01722 PMTYN   @@DSPLY PMTYN$          ;"Backup anyway?"
              01723         IFEQ    01H,1
2E84+219332   01724         LD      HL,PMTYN$
              01725         ENDIF
2E87+3E0A     01726         LD      A,10
2E89+EF       01727         RST     40
2E8A 215826   01728         LD      HL,LILBUF$      ;Prompt to continue
2E8D 010003   01729         LD      BC,3<8          ;  since ID's differ
2E90          01730         @@KEYIN
2E90+3E09     01731         LD      A,9
2E92+EF       01732         RST     40
2E93 DAAC26   01733         JP      C,ABRTBU        ;Exit on break
2E96 7E       01734         LD      A,(HL)
2E97 CBAF     01735         RES     5,A             ;Make answer upper case
2E99 FE59     01736         CP      'Y'             ;Was answer Yes?
2E9B 2807     01737         JR      Z,$A1           ;Go if continue
2E9D C3AC26   01738 PACKNDO JP      ABRTBU          ;  else abort
              01739 ;
2EA0 13       01740 IDMATCH INC     DE
2EA1 23       01741         INC     HL
2EA2 1092     01742         DJNZ    CPRID
2EA4 21602C   01743 $A1     LD      HL,BUF2$+60H    ;Dest lockout table
2EA7 11602B   01744         LD      DE,BUF1$+60H    ;Source lockout table
2EAA 0660     01745         LD      B,60H           ;Init to compare 96 posns
2EAC 1A       01746 CPRLOK  LD      A,(DE)          ;P/u lockout byte
2EAD 2F       01747         CPL                     ;Reset all used bits
2EAE 4F       01748         LD      C,A             ;  and save results
2EAF D5       01749         PUSH    DE
2EB0 7B       01750         LD      A,E             ;Now posn to GAT byte
2EB1 D660     01751         SUB     60H             ;  for that track
2EB3 5F       01752         LD      E,A
2EB4 1A       01753         LD      A,(DE)          ;P/u free/used
2EB5 D1       01754         POP     DE              ;Pt back to lockout
2EB6 A1       01755         AND     C               ;Merge non-locked and in use
2EB7 A6       01756         AND     (HL)            ;That much must be free on dest
2EB8 C2AB31   01757         JP      NZ,NOTMIR       ;  else "dest disk flawed
2EBB 13       01758         INC     DE
2EBC 23       01759         INC     HL
2EBD 10ED     01760         DJNZ    CPRLOK          ;Loop thru all cyls
              01761 ;
              01762 ;       Dest can take backup, insert HALT for swap test
              01763 ;
2EBF CDBB27   01764         CALL    PMTDST          ;Prompt dest if needed
2EC2 21002D   01765         LD      HL,BUF3$        ;Set up to read
2EC5 55       01766         LD      D,L             ;  track 0,
2EC6 5D       01767         LD      E,L             ;  sector 0
2EC7 CDA628   01768         CALL    RDSEC
2ECA C29726   01769         JP      NZ,EXIT3        ;Quit on read error
2ECD 3676     01770         LD      (HL),76H        ;Insert HALT to guard
2ECF 21002D   01771         LD      HL,BUF3$        ; against incomplete BU
2ED2 CD9C28   01772         CALL    WRSEC
2ED5 C29726   01773         JP      NZ,EXIT3        ;Quit on write error
2ED8 3A022D   01774         LD      A,(BUF3$+2)     ;P/U current dest/dir
2EDB 320B31   01775         LD      (STRDIR$+1),A   ; store it for later
              01776 ;
              01777 ;       Use source directory track for destination
              01778 ;
2EDE CD4E27   01779         CALL    PMTSRC          ;Prompt source
2EE1 FD7E09   01780         LD      A,(IY+9)        ;Get source dir cyl
2EE4 321230   01781         LD      (DSTDIR+1),A
              01782 ;
              01783 ;       Calculate the number of sectors per cylinder
              01784 ;
2EE7 FD7E07   01785         LD      A,(IY+7)        ;P/u # of sectors per cyl
2EEA 47       01786         LD      B,A             ;Save # heads also
2EEB E61F     01787         AND     1FH             ;Mask all but sectors
2EED 4F       01788         LD      C,A
2EEE 0C       01789         INC     C               ;Adj for zero offset
2EEF A8       01790         XOR     B               ;Get # of heads
2EF0 07       01791         RLCA
2EF1 07       01792         RLCA                    ;Shift to bits 0-2
2EF2 07       01793         RLCA
2EF3 3C       01794         INC     A               ;Adj for 0 offset
2EF4 47       01795         LD      B,A             ;Init loop counter
2EF5 AF       01796         XOR     A               ;Set sector count to 0
2EF6 81       01797         ADD     A,C             ;Multiply # sectors/track
2EF7 10FD     01798         DJNZ    $-1             ;X # of heads/cyl
2EF9 FDCB046E 01799         BIT     5,(IY+4)        ;If 2-sided diskette
2EFD 2801     01800         JR      Z,$+3
2EFF 87       01801         ADD     A,A             ;Double the # of sectors
2F00 32832F   01802         LD      (LDCYL4+1),A    ;Save sect/cyl total
2F03 322930   01803         LD      (DUCYL5+1),A    ;  in many places
2F06 327D30   01804         LD      (VECYL4+1),A
2F09 329B31   01805         LD      (RESMF6+1),A
2F0C 32F830   01806         LD      (RESMF2+1),A
              01807 ;
              01808 ;       Calculate the amount of core available
              01809 ;
2F0F 47       01810         LD      B,A             ;Put sector count in B
2F10 210000   01811         LD      HL,0            ;Set up to get HIGH$
2F13 C5       01812         PUSH    BC              ;Save the count
2F14 45       01813         LD      B,L
2F15          01814         @@HIGH$                 ;Get HIGH$
2F15+3E64     01815         LD      A,100
2F17+EF       01816         RST     40
2F18 C1       01817         POP     BC              ;Recover sector count
2F19 23       01818         INC     HL              ;Get highest full page
2F1A 25       01819         DEC     H
2F1B ED5B1626 01820         LD      DE,(BUFFER$)    ;Get buffer addr
2F1F 7C       01821         LD      A,H             ;Now sub buffer start
2F20 92       01822         SUB     D               ;  from the top
2F21 0EFF     01823         LD      C,-1
2F23 0C       01824 $A2     INC     C               ;Now count how many cyls
2F24 90       01825         SUB     B               ;  will fit in this space
2F25 30FC     01826         JR      NC,$A2
2F27 79       01827         LD      A,C             ;This is the number of full
2F28 328E2F   01828         LD      (LDCYL6+1),A    ;  cylinders to move per pass
              01829 ;
              01830 ;       Get source & initialize
              01831 ;
2F2B CD4E27   01832         CALL    PMTSRC          ;Prompt source if needed
2F2E AF       01833         XOR     A               ;Init starting cylinder
2F2F 32872F   01834         LD      (LDCYL5+1),A    ;  to 0
2F32 57       01835         LD      D,A             ;Set current track to 0
2F33 CDBD28   01836         CALL    CKSWDD
              01837 ;
              01838 ;       Here each time a new load cycle
              01839 ;
2F36 2A1626   01840 LDTKS   LD      HL,(BUFFER$)    ;Pt to buffer start
2F39 7A       01841         LD      A,D             ;P/u cylinder to move
2F3A 32AA2F   01842         LD      (DUCYL+1),A     ;Save start for dump cycle
              01843 ;
              01844 ;       Here on each track loaded
              01845 ;
              01846 LDTKS1
2F3D          01847         @@CKBRKC                ;Ckeck for break
2F3D+3E6A     01848         LD      A,106
2F3F+EF       01849         RST     40
2F40 C2AC26   01850         JP      NZ,BREAK        ;  and abort if so
              01851 ;
2F43 E5       01852         PUSH    HL              ;Save buffer
2F44 262B     01853         LD      H,BUF1$<-8      ;Pt to source GAT
2F46 6A       01854         LD      L,D             ;  for this cylinder
2F47 4E       01855         LD      C,(HL)          ;P/u Free/used byte
2F48 7A       01856         LD      A,D
2F49 C660     01857         ADD     A,60H           ;Pt to Lockout byte
2F4B 6F       01858         LD      L,A             ;If source track is
2F4C 7E       01859         LD      A,(HL)          ;  locked out, don't
2F4D 2F       01860         CPL                     ;  back it up - BUT
2F4E A1       01861         AND     C               ;  show dest is "in use"
2F4F 262C     01862         LD      H,BUF2$<-8      ;Pt to dest lockout
2F51 4E       01863         LD      C,(HL)          ;P/u dest lockout byte
2F52 B1       01864         OR      C               ;Merge with source
2F53 6A       01865         LD      L,D             ;Xfer pattern to FREE
2F54 77       01866         LD      (HL),A          ;  field of dest
2F55 B9       01867         CP      C
2F56 E1       01868         POP     HL              ;Recover buffer
2F57 CA922F   01869         JP      Z,LDCYL7        ;Go if ignore this track
              01870 ;
              01871 ;       Get source disk and load
              01872 ;
2F5A CD4E27   01873         CALL    PMTSRC          ;Prompt source if needed
2F5D E5       01874         PUSH    HL              ;Save buffer
2F5E 1E00     01875         LD      E,0             ;Start track at sector 0
              01876         IF      @BLD631
2F60 D5       01877         PUSH    DE              ;<631>
              01878         ELSE
              01879         LD      A,D             ;This is the cylinder
              01880         ENDIF
2F61 21F031   01881         LD      HL,CYL$         ;Message posn to hold
2F64 CDA131   01882         CALL    CVTDEC          ;  ASCII cyl number
              01883         IF      @BLD631
              01884         ELSE
              01885         PUSH    DE
              01886         ENDIF
2F67          01887         @@DSPLY LDCYL$          ;"loading cylinder...
              01888         IFEQ    01H,1
2F67+21B131   01889         LD      HL,LDCYL$
              01890         ENDIF
2F6A+3E0A     01891         LD      A,10
2F6C+EF       01892         RST     40
2F6D          01893         @@DSPLY CYL$            ;"xx...
              01894         IFEQ    01H,1
2F6D+21F031   01895         LD      HL,CYL$
              01896         ENDIF
2F70+3E0A     01897         LD      A,10
2F72+EF       01898         RST     40
2F73 D1       01899         POP     DE              ;Now set up to
2F74 E1       01900         POP     HL              ;  read the cylinder
2F75 CDA628   01901 LDCYL2  CALL    RDSEC           ;Read a sector
2F78 2805     01902         JR      Z,LDCYL3        ;Go if no error
2F7A FE06     01903         CP      6               ;Ok if error 6 (reading DIR
2F7C C29726   01904         JP      NZ,EXIT3
2F7F 24       01905 LDCYL3  INC     H               ;Bump buffer and
2F80 1C       01906         INC     E               ;  sector number
2F81 7B       01907         LD      A,E
2F82 FE00     01908 LDCYL4  CP      0               ;High sector #
2F84 20EF     01909         JR      NZ,LDCYL2       ;Loop til cyl. finished
2F86 3E00     01910 LDCYL5  LD      A,$-$           ;P/u current cylinder
2F88 3C       01911         INC     A
2F89 32872F   01912         LD      (LDCYL5+1),A    ;Store next cyl
2F8C 47       01913         LD      B,A
2F8D 3E00     01914 LDCYL6  LD      A,$-$           ;P/u last for this pass
2F8F B8       01915         CP      B               ;See if memory full
2F90 280E     01916         JR      Z,LDCYL8        ;  and go if so
2F92 14       01917 LDCYL7  INC     D               ;Bump cyl to use
2F93 7A       01918         LD      A,D
2F94 FE60     01919         CP      60H             ;Highest track #?
2F96 C23D2F   01920         JP      NZ,LDTKS1       ;If not, do another
2F99 3A872F   01921         LD      A,(LDCYL5+1)    ;Were any moved?
2F9C B7       01922         OR      A               ;Don't dump if not
2F9D CA9130   01923         JP      Z,MOVID
2FA0 3A872F   01924 LDCYL8  LD      A,(LDCYL5+1)    ;P/u last cyl loaded
2FA3 328130   01925         LD      (VECYL5+1),A    ;  & save for VERIFY
              01926 ;
              01927 ;       Get ready to dump to destination
              01928 ;
2FA6 2A1626   01929         LD      HL,(BUFFER$)    ;P/u start of buffer
2FA9 1600     01930 DUCYL   LD      D,$-$           ;Init starting cylinder
              01931 ;
              01932 DUCYL1
2FAB          01933         @@CKBRKC                ;Check for break
2FAB+3E6A     01934         LD      A,106
2FAD+EF       01935         RST     40
2FAE C2AC26   01936         JP      NZ,BREAK        ; and abort if hit
              01937 ;
              01938 ;       Start by making dest GAT bytes
              01939 ;
2FB1 E5       01940         PUSH    HL              ;Save buffer ptr
2FB2 262B     01941         LD      H,BUF1$<-8      ;Pt to source GAT
2FB4 6A       01942         LD      L,D             ;  at current cylinder
2FB5 4E       01943         LD      C,(HL)          ;Get the free/used byte
2FB6 7A       01944         LD      A,D
2FB7 C660     01945         ADD     A,60H           ;P/u the lockout byte
2FB9 6F       01946         LD      L,A             ;  for this cylinder
2FBA 7E       01947         LD      A,(HL)
2FBB 2F       01948         CPL                     ;Merge non-locked and
2FBC A1       01949         AND     C               ;  in use bits
2FBD 262C     01950         LD      H,BUF2$<-8      ;Pt to dest GAT
2FBF 4E       01951         LD      C,(HL)          ;P/u its lockout byte
2FC0 B1       01952         OR      C               ;Merge in source info
2FC1 6A       01953         LD      L,D             ;Store in dest free/used
2FC2 77       01954         LD      (HL),A
2FC3 B9       01955         CP      C               ;Check if any in use
2FC4 E1       01956         POP     HL
2FC5 CA3330   01957         JP      Z,DUCYL6        ;  and go if not
2FC8 CDBB27   01958         CALL    PMTDST          ;Set up to write dest disk
2FCB 1E00     01959         LD      E,0             ;Init to sector 0
2FCD 7A       01960         LD      A,D             ;Get current cylinder
              01961         IF      @BLD631
2FCE E5       01962         PUSH    HL              ;<631>Save buffer ptr
2FCF D5       01963         PUSH    DE              ;<631>
              01964         ELSE
              01965         OR      E
              01966         PUSH    HL              ;Save buffer ptr
              01967         LD      A,D
              01968         ENDIF
2FD0 21F031   01969         LD      HL,CYL$         ;"xx...
2FD3 CDA131   01970         CALL    CVTDEC          ;Convert cyl # to ASCII
              01971         IF      @BLD631
              01972         ELSE
              01973         PUSH    DE
              01974         ENDIF
2FD6          01975         @@DSPLY DUCYL$          ;"dumping cyl...
              01976         IFEQ    01H,1
2FD6+21C631   01977         LD      HL,DUCYL$
              01978         ENDIF
2FD9+3E0A     01979         LD      A,10
2FDB+EF       01980         RST     40
2FDC          01981         @@DSPLY CYL$            ;"xx...
              01982         IFEQ    01H,1
2FDC+21F031   01983         LD      HL,CYL$
              01984         ENDIF
2FDF+3E0A     01985         LD      A,10
2FE1+EF       01986         RST     40
2FE2 D1       01987         POP     DE              ;Recover cyl/sect
2FE3 E1       01988         POP     HL              ;  and buffer posn
2FE4 7A       01989 DUCYL2  LD      A,D             ;P/u track # & bypass
2FE5 B7       01990         OR      A               ;  if not cyl=0
2FE6 2028     01991         JR      NZ,DUCYL2B
              01992 ;
              01993         IF      @MOD2
              01994         LD      A,(BACKUP0)     ;Get system flag
              01995         OR      A               ;System disk?
              01996         JR      NZ,DUCYL2B      ;Yes, bypass!
              01997         ENDIF
              01998 ;
2FE8 B3       01999         OR      E               ;Merge to test for sec=2
2FE9 FE02     02000         CP      2
2FEB 200D     02001         JR      NZ,CKBOOT       ;If not 2, ck 1 or 0
2FED 2EC6     02002         LD      L,0C6H          ;Point to id byte
2FEF 7E       02003         LD      A,(HL)
2FF0 3C       02004         INC     A               ;If X'FF', leave as is
2FF1 2818     02005         JR      Z,SET0
2FF3 3D       02006         DEC     A               ;If X'00', leave as is
2FF4 2815     02007         JR      Z,SET0
2FF6 36FF     02008         LD      (HL),-1         ;Set to X'FF'
2FF8 1811     02009         JR      SET0
2FFA E6FE     02010 CKBOOT  AND     0FEH            ;Sector 0 or 1?
2FFC 2012     02011         JR      NZ,DUCYL2B      ;Go if not
2FFE B3       02012         OR      E               ;If sector 0, just
2FFF 280D     02013         JR      Z,DUCYL2A       ;  bother with HALT
              02014 ;
              02015 ;       Keep the boot track step rate
              02016 ;
3001 3A0026   02017         LD      A,(BOOTST$)     ;P/u step pointer
3004 6F       02018         LD      L,A             ;  & update buffer ptr
3005 7E       02019         LD      A,(HL)          ;P/u this step byte
3006 E6FC     02020         AND     0FCH            ;  & strip the step rate
3008 F600     02021 BSMIR   OR      0               ;Merge with the step
300A 77       02022         LD      (HL),A
300B 2E00     02023 SET0    LD      L,0             ;Reset buffer pointer
300D 01       02024         DB      1               ;Ignore next via LD BC,nn
300E 3676     02025 DUCYL2A LD      (HL),76H        ;Keep the HALT in dest
3010 7A       02026 DUCYL2B LD      A,D             ;P/u the cylinder #
3011 FE00     02027 DSTDIR  CP      0               ;Is this the dir cyl?
3013 2808     02028         JR      Z,DUCYL3        ;Go if it is
3015 CD9C28   02029         CALL    WRSEC           ;Write non-dir sector
3018 C29726   02030         JP      NZ,EXIT3        ;Quit on write error
301B 1808     02031         JR      DUCYL4
301D CDA128   02032 DUCYL3  CALL    WRSYS           ;Write dir sector
3020 3E12     02033         LD      A,18            ;Init "Dir write error
3022 C29726   02034         JP      NZ,EXIT3        ;  and leave if error
3025 24       02035 DUCYL4  INC     H               ;Advance buffer and
3026 1C       02036         INC     E               ;  sector #
3027 7B       02037         LD      A,E
3028 FE00     02038 DUCYL5  CP      0               ;Reach end of cylinder?
302A 20B8     02039         JR      NZ,DUCYL2       ;Go if not
302C 3A872F   02040         LD      A,(LDCYL5+1)    ;Count down one more
302F 3D       02041         DEC     A               ;  cylinder dumped
3030 32872F   02042         LD      (LDCYL5+1),A
3033 14       02043 DUCYL6  INC     D               ;Bump cylinder #
3034 3A872F   02044         LD      A,(LDCYL5+1)    ;Loop if still more
3037 B7       02045         OR      A               ; to dump
3038 C2AB2F   02046         JP      NZ,DUCYL1
              02047 ;
              02048 ;       Prepare to verify
              02049 ;
303B 3AAA2F   02050         LD      A,(DUCYL+1)     ;P/u cyl # to start
303E 57       02051         LD      D,A
              02052 VECYL1
303F          02053         @@CKBRKC                ;Check if Break hit
303F+3E6A     02054         LD      A,106
3041+EF       02055         RST     40
3042 C2AC26   02056         JP      NZ,BREAK        ;Abort on break
              02057 ;
3045 262B     02058         LD      H,BUF1$<-8      ;Pt to source GAT
3047 6A       02059         LD      L,D             ;  at the current cylinder
3048 4E       02060         LD      C,(HL)          ;Get free/used byte
3049 7A       02061         LD      A,D
304A C660     02062         ADD     A,60H           ;Pt to lockout byte for
304C 6F       02063         LD      L,A             ;  the current cylinder
304D 7E       02064         LD      A,(HL)          ;P/u the locked out info
304E 2F       02065         CPL                     ;Merge the non-locked and
304F A1       02066         AND     C               ;  and the free/ used
3050 262C     02067         LD      H,BUF2$<-8      ;Pt to dest GAT
3052 4E       02068         LD      C,(HL)          ;P/u lockout for dest cyl
3053 B1       02069         OR      C               ;Merge source info
3054 6A       02070         LD      L,D             ;Pt to dest free/used
3055 77       02071         LD      (HL),A          ;  and store new value
3056 B9       02072         CP      C               ;See if in use
3057 CA8630   02073         JP      Z,VECYL6        ;Skip verify if not
305A 1E00     02074         LD      E,0             ;Init to sector 0
              02075         IF      @BLD631
305C D5       02076         PUSH    DE
              02077         ELSE
              02078         LD      A,D             ;P/u cyl # for dsply
              02079         ENDIF
305D 21F031   02080         LD      HL,CYL$         ;"xx...
3060 CDA131   02081         CALL    CVTDEC          ;Convert cyl # to ASCII
              02082         IF      @BLD631
              02083         ELSE
              02084         PUSH    DE
              02085         ENDIF
3063          02086         @@DSPLY VECYL$          ;"verifying cyl...
              02087         IFEQ    01H,1
3063+21DB31   02088         LD      HL,VECYL$
              02089         ENDIF
3066+3E0A     02090         LD      A,10
3068+EF       02091         RST     40
3069          02092         @@DSPLY CYL$            ;"xx...
              02093         IFEQ    01H,1
3069+21F031   02094         LD      HL,CYL$
              02095         ENDIF
306C+3E0A     02096         LD      A,10
306E+EF       02097         RST     40
306F D1       02098         POP     DE              ;Recover cyl/sector
3070 CDAB28   02099 VECYL2  CALL    VERSEC          ;Verify a sector
3073 2805     02100         JR      Z,VECYL3        ;Go if no error
3075 FE06     02101         CP      6               ;Error 6 is OK
3077 C29726   02102         JP      NZ,EXIT3
307A 1C       02103 VECYL3  INC     E               ;Inc sector #
307B 7B       02104         LD      A,E
307C FE00     02105 VECYL4  CP      0               ;Check end of cylinder
307E 20F0     02106         JR      NZ,VECYL2       ;Loop if not
3080 3E00     02107 VECYL5  LD      A,0             ;Count down another
3082 3D       02108         DEC     A               ;  cyl just verified
3083 328130   02109         LD      (VECYL5+1),A
3086 14       02110 VECYL6  INC     D               ;Bump cyl # by 1
3087 3A8130   02111         LD      A,(VECYL5+1)    ;Loop if more cylinders
308A B7       02112         OR      A               ;  to verify, else go
308B C23F30   02113         JP      NZ,VECYL1       ;  back to "loading"
308E C3362F   02114         JP      LDTKS
              02115 ;
              02116 ;       All cylinders backed up, move ID info
              02117 ;
3091 0E0D     02118 MOVID   LD      C,CR            ;Print a newline
3093          02119         @@DSP
3093+3E02     02120         LD      A,2
3095+EF       02121         RST     40
3096 21CD2B   02122         LD      HL,BUF1$+0CDH   ;Move in the pswd,name,
3099 11CD2C   02123         LD      DE,BUF2$+0CDH   ;  date, "AUTO" buffer,
309C 013300   02124         LD      BC,33H          ;  & config byte
309F EDB0     02125         LDIR
30A1 217826   02126         LD      HL,DATFLD$      ;Move in today's date
30A4 11D82C   02127         LD      DE,BUF2$+0D8H
30A7 0E08     02128         LD      C,8
30A9 EDB0     02129         LDIR
              02130 ;
              02131 ;       Get destination disk & write new GAT
              02132 ;
30AB CDBB27   02133         CALL    PMTDST          ;Set up to use dest disk
30AE 3A1230   02134         LD      A,(DSTDIR+1)    ;Get dir cyl
30B1 57       02135         LD      D,A             ;Set to track Dir,
30B2 1E00     02136         LD      E,0             ;  sector 0
30B4 21002C   02137         LD      HL,BUF2$        ;Write the GAT back
30B7 CDA128   02138         CALL    WRSYS
30BA 3E15     02139         LD      A,21            ;Init "GAT write error
30BC C29726   02140         JP      NZ,EXIT3        ;  and go if bad
30BF 21002D   02141         LD      HL,BUF3$
30C2 CDAB28   02142         CALL    VERSEC          ;  else verify gat
30C5 FE06     02143         CP      6               ;Expect error 6
30C7 3E14     02144         LD      A,20            ;Init "GAT read error now
30C9 C29726   02145         JP      NZ,EXIT3        ;  and quit if bad verify
30CC 3A1230   02146         LD      A,(DSTDIR+1)    ;P/u cyl to use for dir
30CF 57       02147         LD      D,A             ;Set track = Dir
30D0 1E02     02148         LD      E,2             ;Skip GAT and HIT
              02149 ;
              02150 ;       Reset all mod flags on destination
              02151 ;
30D2 2A1626   02152 RESMF   LD      HL,(BUFFER$)    ;Use this for sector buffer
30D5 CDA628   02153         CALL    RDSEC           ;Read in dir record
30D8 FE06     02154         CP      6               ;Expect error 6
30DA C29226   02155         JP      NZ,DIRERR       ;Abort on any other
30DD CB7E     02156 RESMF1  BIT     7,(HL)          ;Check for FPDE
30DF 2004     02157         JR      NZ,RESMF1A      ;Go if not
30E1 2C       02158         INC     L               ;Pt to DIR+1
30E2 CBB6     02159         RES     6,(HL)          ;Reset MOD flag
30E4 2D       02160         DEC     L
30E5 7D       02161 RESMF1A LD      A,L             ;Get next dir rec
30E6 C620     02162         ADD     A,20H
30E8 6F       02163         LD      L,A
30E9 20F2     02164         JR      NZ,RESMF1
30EB 2E00     02165         LD      L,0
30ED CDA128   02166         CALL    WRSYS           ;Write record back out
30F0 3E12     02167         LD      A,18            ;Init "DIR write error
30F2 C29726   02168         JP      NZ,EXIT3
30F5 1C       02169         INC     E               ;Inc dir sector #
30F6 7B       02170         LD      A,E
30F7 FE00     02171 RESMF2  CP      $-$             ;Compare highest sect this cyl
30F9 20D7     02172         JR      NZ,RESMF        ;Loop until complete
              02173 ;
              02174         IF      @MOD2
              02175         LD      A,(STRDIR$+1)   ;Get old dir cyl
              02176         LD      B,A             ;Pass for jump
              02177         LD      A,(BACKUP0)     ;Get system backup flag
              02178         OR      A               ;System disk?
              02179         JR      NZ,CNTBAK1      ;Yes, check if dir change
              02180         ENDIF
              02181 ;
              02182 ;       Clear the HALT inst from dest
              02183 ;
30FB 21002D   02184         LD      HL,BUF3$
30FE 55       02185         LD      D,L             ;Now read the BOOT
30FF 5D       02186         LD      E,L             ;  on the dest disk
3100 CDA628   02187         CALL    RDSEC
3103 C29726   02188         JP      NZ,EXIT3        ;Quit if couldn't be read
3106 3600     02189         LD      (HL),0          ;Clear the HALT
3108 23       02190         INC     HL
3109 23       02191         INC     HL              ;Pt to old DIR cyl
310A 0600     02192 STRDIR$ LD      B,$-$           ;P/u the old DIR cyl
310C 3A1230   02193         LD      A,(DSTDIR+1)    ;Update the dir cyl
310F 77       02194         LD      (HL),A          ;  in case it changed
3110 2B       02195         DEC     HL              ;Pt back to buffer start
3111 2B       02196         DEC     HL
3112 CD9C28   02197         CALL    WRSEC           ;Write back the BOOT
3115 CCAB28   02198         CALL    Z,VERSEC        ;  and then verify it
3118 C29726   02199         JP      NZ,EXIT3        ;Go if write error
311B 1C       02200         INC     E               ;Point to sector 1
311C CDA628   02201         CALL    RDSEC           ;Read it
311F C29726   02202         JP      NZ,EXIT3
3122 3A1230   02203         LD      A,(DSTDIR+1)    ;Do the same thing again
3125 23       02204         INC     HL
3126 23       02205         INC     HL
3127 77       02206         LD      (HL),A          ;Store new dir cyl
3128 2B       02207         DEC     HL
3129 2B       02208         DEC     HL
312A CD9C28   02209         CALL    WRSEC           ;Write it back
312D CCAB28   02210         CALL    Z,VERSEC        ;Verify it if written OK
3130 C29726   02211         JP      NZ,EXIT3        ;Quit if we couldn't
              02212 ;
3133 262C     02213 CNTBAK1 LD      H,BUF2$<-8      ;Destination GAT
3135 78       02214         LD      A,B             ;P/u old DIR cyl
3136 C660     02215         ADD     A,60H           ;Point to lockout table
3138 6F       02216         LD      L,A
3139 4E       02217         LD      C,(HL)          ;Check lockout byte
313A 68       02218         LD      L,B             ;Pt to GAT byte
313B 7E       02219         LD      A,(HL)          ;Get GAT byte
313C B1       02220         OR      C
313D B9       02221         CP      C               ;Anything allocated?
313E 201E     02222         JR      NZ,RESMF2B      ;Bypass if yes
3140 78       02223         LD      A,B             ;Save cylinder
3141 21002D   02224         LD      HL,BUF3$        ;Write E5's to cylinder
3144 11012D   02225         LD      DE,BUF3$+1      ; to remove system DAM
3147 01FF00   02226         LD      BC,255
314A 36E5     02227         LD      (HL),0E5H
314C EDB0     02228         LDIR
314E 69       02229         LD      L,C             ;Pt back to buf3$
314F 57       02230         LD      D,A             ;Set cylinder # in D
3150 59       02231         LD      E,C             ;Start with sector 0
3151 3A832F   02232         LD      A,(LDCYL4+1)    ;Get # of sectors
3154 47       02233         LD      B,A             ;Set loop counter
3155 CD9C28   02234 RESMF2A CALL    WRSEC           ;Write normal sector
3158 C29726   02235         JP      NZ,EXIT3
315B 1C       02236         INC     E               ;Step to next sector
315C 10F7     02237         DJNZ    RESMF2A
315E CD9228   02238 RESMF2B CALL    RESTOR          ;Restore to track 0
              02239 ;
              02240 ;       Attempt to clear MOD flags of source
              02241 ;
3161 CD4E27   02242         CALL    PMTSRC          ;Set up for source disk
3164 FD5609   02243         LD      D,(IY+9)        ;Get track = Dir
              02244 ;
3167 1E02     02245         LD      E,2             ;Skip GAT and HIT
3169 2A1626   02246 RESMF3  LD      HL,(BUFFER$)    ;Use this as sector buffer
316C CDA628   02247         CALL    RDSEC           ;Read source dir sector
316F FE06     02248         CP      6               ;Expect error 6
3171 C29226   02249         JP      NZ,DIRERR
3174 CB7E     02250 RESMF4  BIT     7,(HL)          ;See if FPDE
3176 2004     02251         JR      NZ,RESMF4A      ;Go if not
3178 2C       02252         INC     L               ;Pt to dir+1
3179 CBB6     02253         RES     6,(HL)
317B 2D       02254         DEC     L
317C 7D       02255 RESMF4A LD      A,L
317D C620     02256         ADD     A,20H           ;Index to next direc
317F 6F       02257         LD      L,A
3180 20F2     02258         JR      NZ,RESMF4       ;Loop 8 times/sector
3182 2E00     02259         LD      L,0
3184 CDA128   02260         CALL    WRSYS           ;Write back dir sector
3187 280F     02261         JR      Z,RESMF5        ;Loop on no error
3189 FE0F     02262         CP      15              ;Write protected source?
318B 3E12     02263         LD      A,18            ;Init "DIR write error"
318D C29726   02264         JP      NZ,EXIT3        ;Exit if not WP error
3190          02265         @@LOGOT CCMOD$          ;"Can't clear mod flags
              02266         IFEQ    01H,1
3190+21352A   02267         LD      HL,CCMOD$
              02268         ENDIF
3193+3E0C     02269         LD      A,12
3195+EF       02270         RST     40
              02271         IF      @MOD4
              02272         IF      @BLD631
3196 1806     02273         JR      TXEXIT1         ;<631>Backup is complete
              02274         ELSE
              02275         JP      EXIT1           ;Backup is complete
              02276         ENDIF
              02277         ENDIF
              02278         IF      @MOD2
              02279         JR      CKWRTK0         ;Check if write cyl 0
              02280         ENDIF
3198 1C       02281 RESMF5  INC     E               ;Bump sector #
3199 7B       02282         LD      A,E
319A FE00     02283 RESMF6  CP      $-$             ;Compare highest sect this cyl
319C 20CB     02284         JR      NZ,RESMF3       ;Do another sector if not
              02285         IF      @MOD4
              02286         IF      @BLD631
              02287 TXEXIT1:                        ;<631>
              02288         ENDIF
319E C38526   02289         JP      EXIT1           ;Backup is complete
              02290         ENDIF
              02291         IF      @MOD2
              02292 CKWRTK0 LD      A,(BACKUP0)     ;Get flag
              02293         OR      A               ;Anything?
              02294         JP      Z,EXIT1         ;Nope, go!
              02295         CALL    PMTSRC          ;Prompt for source
              02296         CALL    READ0           ;Read cyl 0
              02297         JP      NZ,EXIT3        ;Go on error
              02298         CALL    PMTDST          ;Prompt for dest drive
              02299         CALL    FORMAT0         ;Format cylinder 0
              02300         JP      NZ,EXIT3        ;Go on disk error
              02301 ;
              02302 ;       Pass original step rate to new disk
              02303 ;
              02304         LD      HL,(BUFFER$)    ;Get I/O buffer
              02305         INC     HL              ;Bump to step rate
              02306         INC     HL
              02307         INC     HL              ;+3
              02308         LD      A,(BSMIR+1)     ;Get step
              02309         LD      (HL),A          ;Pass to buffer
              02310         LD      BC,80H          ;Offset to sector 1
              02311         ADD     HL,BC           ;Point to it
              02312         LD      (HL),A          ;Pass to buffer
              02313         CALL    PMTDST          ;Re-fetch DCT
              02314         CALL    WRITE0          ;Write cylinder 0
              02315         JP      NZ,EXIT3        ;Go on disk error
              02316         CALL    PMTDST          ;Fetch DCT
              02317         LD      A,(DSTDIR+1)    ;Get new dir cyl
              02318         LD      (IY+9),A        ;Update DCT
              02319         CALL    UPGAT0          ;Update GAT table
              02320         JP      NZ,EXIT3        ;Go on disk error
              02321         JP      EXIT1           ; else program completed
              02322         ENDIF
              02323 ;
              02324 ;       Routine to convert cylinder # & message stuff
              02325 ;
              02326         IF      @BLD631
31A1 5A       02327 CVTDEC: LD      E,D             ;<631>
31A2 1600     02328         LD      D,0             ;<631>
31A4 EB       02329         EX      DE,HL           ;<631>
31A5 0603     02330         LD      B,3             ;<631>
31A7 3E5F     02331         LD      A,5FH           ;<631>
31A9 EF       02332         RST     28H             ;<631>
31AA C9       02333         RET                     ;<631>
              02334         ELSE
              02335 CVTDEC  LD      (HL),' '        ;Init to leading blank
              02336         LD      B,100
              02337         CALL    CVD1
              02338         LD      (HL),' '        ;Init to blank
              02339         LD      B,10
              02340         CALL    CVD1
              02341         LD      (HL),'0'        ;Init to leading 0
              02342         LD      B,1
              02343 CVD1    LD      C,0             ;Init digit counter
              02344 CVD2    SUB     B               ;Sub 10's power until carry
              02345         JR      C,CVD3
              02346         INC     C               ;  and bump count
              02347         JR      CVD2
              02348 CVD3    ADD     A,B             ;Add back last sub
              02349         PUSH    AF
              02350         LD      A,C             ;Check the count
              02351         OR      A
              02352         JR      Z,CVD7          ;Ignore if 0
              02353         ADD     A,30H           ;  else change to ASCII digit
              02354         LD      (HL),A
              02355 CVD7    POP     AF
              02356         INC     HL
              02357         RET
              02358         ENDIF
              02359 ;
              02360 ;       Message area
              02361 ;
31AB 21F431   02362 NOTMIR  LD      HL,NOTMIR$
31AE C3AF26   02363         JP      EXIT4
31B1 1D       02364 LDCYL$  DB      29,'Reading < cylinder ',3
     52 65 61 64 69 6E 67 20
     3C 20 63 79 6C 69 6E 64
     65 72 20 03 
31C6 1D       02365 DUCYL$  DB      29,'Writing > cylinder ',3
     57 72 69 74 69 6E 67 20
     3E 20 63 79 6C 69 6E 64
     65 72 20 03 
31DB 1D       02366 VECYL$  DB      29,'Verifying cylinder ',3
     56 65 72 69 66 79 69 6E
     67 20 63 79 6C 69 6E 64
     65 72 20 03 
31F0 30       02367 CYL$    DB      '000',3
     30 30 03 
31F4 0A       02368 NOTMIR$ DB      LF,'Backup aborted, '
     42 61 63 6B 75 70 20 61
     62 6F 72 74 65 64 2C 20
3205 64       02369         DB      'destination not mirror-image',CR
     65 73 74 69 6E 61 74 69
     6F 6E 20 6E 6F 74 20 6D
     69 72 72 6F 72 2D 69 6D
     61 67 65 0D 
3222 44       02370 DIFID$  DB      'Destination disk ID is different: '
     65 73 74 69 6E 61 74 69
     6F 6E 20 64 69 73 6B 20
     49 44 20 69 73 20 64 69
     66 66 65 72 65 6E 74 3A
     20 
3244 4E       02371 PACKID$ DB      'Name=XXXXXXXX  Date=mm/dd/yy',CR
     61 6D 65 3D 58 58 58 58
     58 58 58 58 20 20 44 61
     74 65 3D 6D 6D 2F 64 64
     2F 79 79 0D 
3261 20       02372 OLDMPW$ DB      '  Enter its Master Password'
     20 45 6E 74 65 72 20 69
     74 73 20 4D 61 73 74 65
     72 20 50 61 73 73 77 6F
     72 64 
327C 20       02373         DB      ' or  to abort: ',3
     6F 72 20 3C 42 52 45 41
     4B 3E 20 74 6F 20 61 62
     6F 72 74 3A 20 03 
3293 41       02374 PMTYN$  DB      'Are you sure you want to backup to it '
     72 65 20 79 6F 75 20 73
     75 72 65 20 79 6F 75 20
     77 61 6E 74 20 74 6F 20
     62 61 63 6B 75 70 20 74
     6F 20 69 74 20 
32B9 3C       02375         DB      ' ? ',3
     59 2C 4E 3E 20 3F 20 03
              02376 ;
32C2 00       02377         DC      64,0            ;PATCH space
     00 00 00 00 00 00 00 00
     00 00 00 00 00 00 00 00
     00 00 00 00 00 00 00 00
     00 00 00 00 00 00 00 00
     00 00 00 00 00 00 00 00
     00 00 00 00 00 00 00 00
     00 00 00 00 00 00 00 00
     00 00 00 00 00 00 00 
              02378 ;
0600          02379 MIRSIZ  EQU     $<-8+1<8-BACKUP
              02380 ;
              02381 ;
              02382 ;       Adjust PC & load address for CLASS
              02383 ;
2E00          02384         ORG     BACKUP
              02385 ;
3800          02386 CLSBU   EQU     CORE$+MIRSIZ
2E00          02387         LORG    CLSBU
              02388 ;
              02391 ;
2E00          02392 *GET    BACKUP3:3
              02393 ;BACKUP3/ASM - Backup By Class
              02394 ;
              02395 ;       Find highest available memory page
              02396 ;
2E00 210000   02397         LD      HL,0            ;Set up to get HIGH$
2E03 45       02398         LD      B,L
2E04          02399         @@HIGH$
2E04+3E64     02400         LD      A,100
2E06+EF       02401         RST     40
2E07 23       02402         INC     HL              ;Find highest available
2E08 25       02403         DEC     H               ;  memory page
2E09 7C       02404         LD      A,H
2E0A 32FA32   02405         LD      (DOFIL06+1),A   ;Save for later testing
2E0D 320F33   02406         LD      (DOFIL08+1),A
2E10 322C34   02407         LD      (LSTBUF1+1),A
2E13 3EC9     02408         LD      A,0C9H
2E15 32E427   02409         LD      (PMTDST1),A     ;Ignore dest disk test
2E18 CDBB27   02410         CALL    PMTDST          ;Prompt dest drive
              02411 ;
              02412 ;       Calculate mamximum free space per dest disk type
              02413 ;
2E1B FD7E07   02414         LD      A,(IY+7)        ;P/u # heads & sect/trk
2E1E 47       02415         LD      B,A             ;Save heads
2E1F E61F     02416         AND     1FH             ;Mask all but sectors
2E21 4F       02417         LD      C,A
2E22 0C       02418         INC     C               ;Adj for zero offset
2E23 A8       02419         XOR     B               ;Get # of heads
2E24 07       02420         RLCA
2E25 07       02421         RLCA                    ;  in bits 0-2
2E26 07       02422         RLCA
2E27 3C       02423         INC     A               ;Adj to 0 offset
2E28 47       02424         LD      B,A             ;Init loop counter
2E29 AF       02425         XOR     A               ;Init sector count to 0
2E2A 81       02426         ADD     A,C             ;Multiply # sectors/track
2E2B 10FD     02427         DJNZ    $-1             ;  x # of heads/cyl
2E2D 6F       02428         LD      L,A
2E2E 2600     02429         LD      H,0             ;Xfer to 16-bit reg
2E30 3001     02430         JR      NC,NMXSEC       ;Go if not 256 sect
2E32 24       02431         INC     H               ;  else set to 256
2E33 FDCB046E 02432 NMXSEC  BIT     5,(IY+4)        ;If 2-sided diskette
2E37 2801     02433         JR      Z,$+3
2E39 29       02434         ADD     HL,HL           ;  double the # of sectors
2E3A FD4E06   02435         LD      C,(IY+6)        ;P/u # cyls & adjust for
2E3D 0D       02436         DEC     C               ;  BOOT & DIR
2E3E          02437         @@MUL16                 ;Calc total records
2E3E+3E5B     02438         LD      A,91
2E40+EF       02439         RST     40
2E41 65       02440         LD      H,L             ;Results to HL
2E42 6F       02441         LD      L,A
2E43 228532   02442         LD      (SIZSAV+1),HL   ;Save for later
              02443 ;
              02444 ;       Read the BOOT sector of dest disk
              02445 ;
2E46 110100   02446         LD      DE,1            ;Track 0, sector 1
2E49 21002C   02447         LD      HL,BUF2$        ;Disk buffer area
2E4C CDA628   02448         CALL    RDSEC           ;Read the sector
2E4F C29726   02449         JP      NZ,EXIT3        ;Quit on read error
2E52 3A0026   02450         LD      A,(BOOTST$)     ;Locn of boot step rate
2E55 6F       02451         LD      L,A
2E56 7E       02452         LD      A,(HL)          ;Get the step rate in
2E57 E603     02453         AND     3               ;  bits 0 and 1
2E59 324432   02454         LD      (BSCLS+1),A     ;Save for later
2E5C 3A022C   02455         LD      A,(BUF2$+2)     ;P/u dir cyl
2E5F FD7709   02456         LD      (IY+9),A        ;Stuff into DCT
              02457 ;
              02458 ;       Check id type byte
              02459 ;
2E62 CDBD28   02460         CALL    CKSWDD
              02461 ;
              02462 ;       If a system backup, then check the GAT & HIT
              02463 ;
2E65 3A7C43   02464         LD      A,(PRMTBL$+SYSRSP)
2E68 B7       02465         OR      A               ;P/u SYS parm response
2E69 CA1D2F   02466         JP      Z,CLSBU5        ;  and skip next if not SYS
              02467 ;
              02468 ;       If already a SYSTEM disk, don't check BOOT space
              02469 ;
              02470         IF      @MOD2
              02471         CALL    PMTDST          ;Get dest data
              02472 ;
              02473         LD      A,(IY+3)        ;Get DCT data
              02474         AND     28H             ;Bit 5/3
              02475         CP      20H             ;8" floppy?
              02476         JR      NZ,SETSYS2      ;Go if not
              02477         LD      A,(IY+4)        ;Get data
              02478         AND     50H             ;Bit 6/4
              02479         CP      40H             ;DD not alien?
              02480 SETSYS2 LD      D,0             ;Cyl 0 if not
              02481         JR      NZ,$+3          ;Go if system
              02482         INC     D               ;Sysinfo on cyl 1
              02483         ENDIF
              02484 ;
2E6C 210037   02485         LD      HL,HITBUF       ;Set disk buffer
2E6F 1E02     02486         LD      E,2             ;  and sector 2
              02487 ;
              02488 ;       Mod II save sysinfo sector for later check
              02489 ;
              02490         IF      @MOD2
              02491         LD      (CKPROT2),DE    ;Save cyl/sect
              02492         ENDIF
              02493 ;
              02494         IF      @MOD4
2E71 CDA628   02495         CALL    RDSEC           ;Read the sysinfo sector
2E74 C29726   02496         JP      NZ,EXIT3        ;QUit on read error
2E77 3AC037   02497         LD      A,(HITBUF+0C0H) ;P/u & test the SYSTEM
2E7A 3C       02498         INC     A               ;  disk byte. If already
2E7B FD5609   02499         LD      D,(IY+9)
2E7E CACF2E   02500         JP      Z,CLSBU01       ;  a system disk, bypass
              02501         ENDIF
              02502 ;
              02503         IF      @MOD2
              02504 ;
              02505         LD      D,(IY+9)        ;P/u dir cyl
              02506 ;
              02507         ENDIF
              02508 ;
2E81 5D       02509         LD      E,L             ;Set sector 0, dir trk
2E82 CDA628   02510         CALL    RDSEC           ;Read the GAT
2E85 FE06     02511         CP      6               ;Expect error 6
2E87 3E14     02512         LD      A,20            ;Init "GAT read error
2E89 C29726   02513         JP      NZ,EXIT3        ;Quit on any other error
              02514 ;
              02515         IF      @MOD4
2E8C 0600     02516         LD      B,0             ;Need no more
2E8E FDCB035E 02517         BIT     3,(IY+3)        ;  if rigid drive
2E92 2011     02518         JR      NZ,SETSYS       ;NZ = rigid
              02519         ENDIF
              02520 ;
              02521 ;       Check GAT byte on Mod2/12
              02522         IF      @MOD2
              02523         LD      L,0CDH
              02524         BIT     7,(HL)
              02525         LD      L,0
              02526         JP      Z,CLSBU01       ;Go if system disk
              02527         ENDIF
              02528 ;
              02529 ;       If ALIEN or NOT 8" space is OK
              02530 ;
              02531         IF      @MOD2
              02532         LD      A,(CKPROT2+1)
              02533         OR      A
              02534         JR      Z,SETSYS        ;Go if not
              02535         ENDIF
              02536 ;
              02537 ;       Mod II must have track 0 fully available
              02538 ;
              02539         IF      @MOD2
              02540         LD      A,(HITBUF+60H)  ;Track 0 lockout data
              02541         OR      1               ;Boot/sys allocation
              02542         CP      (HL)            ;Anything here?
              02543         JP      NZ,NOTSYS       ;Yes, cannot use!
              02544         ENDIF
              02545 ;
              02546 ;       Mod II must have 16 sectors available on cyl 1
              02547 ;
              02548         IF      @MOD2
              02549         INC     HL              ;Point to cyl 1
              02550         LD      B,3             ;2 grans SD or DD
              02551         ENDIF
              02552 ;
              02553 ;       Check to be sure additional grans needed for boot
              02554 ;       are not already allocated
              02555 ;
              02556         IF      @MOD4
2E94 0602     02557         LD      B,2             ;If 8" SDEN or DDEN, then
              02558         ENDIF
              02559 ;
2E96 FDCB036E 02560         BIT     5,(IY+3)        ;  need gran 1
2E9A 2002     02561         JR      NZ,$+4
2E9C 0606     02562         LD      B,6             ;5" needs grans 1 & 2
2E9E 7E       02563         LD      A,(HL)          ;P/u GAT byte for BOOT
2E9F A0       02564         AND     B               ;  & ck for needed space
2EA0 2048     02565         JR      NZ,NOTSYS       ;Go if no free space
2EA2 7E       02566         LD      A,(HL)          ;Reserve the GAT space
2EA3 B0       02567         OR      B
2EA4 77       02568         LD      (HL),A
              02569 ;
              02570 ;       Mod II must make force locked/used cyl 0
              02571 ;
              02572         IF      @MOD2
              02573         LD      A,-1            ;Init
              02574         LD      L,0             ;Reset to beginning
              02575         LD      (HL),A          ;Allocate cyl 0
              02576         LD      L,60H           ;Lockout table
              02577         LD      (HL),A          ;Lockout cyl 0
              02578         ENDIF
              02579 ;
              02580 ;
              02581 ;       Mask the config byte "data/system" disk bit
              02582 ;
2EA5 2ECD     02583 SETSYS  LD      L,0CDH          ;Point to config byte
2EA7 CBBE     02584         RES     7,(HL)          ;  & show system disk
2EA9 CD1134   02585         CALL    WRGAT
              02586 ;
              02587 ;       Adjust the allocation info for BOOT/SYS
              02588 ;
2EAC 1E02     02589 CLSBU0  LD      E,2             ;Read the directory
2EAE CDA628   02590         CALL    RDSEC           ;  sector containing
2EB1 FE06     02591         CP      6               ;  BOOT/SYS record
2EB3 3E11     02592         LD      A,17            ;Init "dir read error
2EB5 C29726   02593         JP      NZ,EXIT3
2EB8 04       02594         INC     B               ;Code to 7 3 1
2EB9 04       02595         INC     B               ;Code to 8 4 2
2EBA CB28     02596         SRA     B               ;Code to 4 2 1
2EBC CB28     02597         SRA     B               ;Code to 2 1 0
              02598 ;
              02599         IF      @MOD2
              02600         LD      A,(CKPROT2+1)
              02601         OR      A
              02602         JR      Z,CLSBU01
              02603         ENDIF
              02604 ;
              02605 ;       Mod II must force BOOT/SYS to new cyl 1
              02606 ;
              02607         IF      @MOD2
              02608 CLSBU00 LD      L,16H           ;Cylinder start
              02609         LD      (HL),1          ;Force cyl 1
              02610         ENDIF
              02611 ;
2EBE 2E17     02612         LD      L,17H           ;Point to gran alloc
2EC0 70       02613         LD      (HL),B          ;Reset alloc
2EC1 2E14     02614         LD      L,14H           ;Point to ERN
2EC3 3610     02615         LD      (HL),16         ;Update # BOOT records
2EC5 2E00     02616         LD      L,0
2EC7 CDA128   02617         CALL    WRSYS           ;Write dir sector back
2ECA 3E12     02618         LD      A,18            ;Init "dir write error
2ECC C29726   02619         JP      NZ,EXIT3        ;Exit if so
              02620 ;
              02621 ;       If OLD entered No SYS file check needed
              02622 ;
              02623 CLSBU01
2ECF 3A1026   02624         LD      A,(OLDPRM$)     ;Check for OLD entered
2ED2 B7       02625         OR      A
2ED3 2048     02626         JR      NZ,CLSBU5       ;Skip SYS setup if so
              02627 ;
              02628 ;
              02629 ;       Now check the HIT positions for /SYS files
              02630 ;
2ED5 CDA134   02631         CALL    HITRD           ;Read in destination HIT
2ED8 C29726   02632         JP      NZ,EXIT3
2EDB 11E935   02633         LD      DE,SYSDEC       ;Pt to SYS file hash codes
2EDE EB       02634         EX      DE,HL           ;HIT to DE, hash tbl to HL
2EDF 0610     02635         LD      B,16            ;Check 16 DECs
2EE1 1A       02636 CLSBU1  LD      A,(DE)          ;If dest spare, stuff
2EE2 B7       02637         OR      A               ;  with source else
2EE3 2002     02638         JR      NZ,CLSBU2       ;  test for match
2EE5 7E       02639         LD      A,(HL)
2EE6 12       02640         LD      (DE),A
2EE7 BE       02641 CLSBU2  CP      (HL)            ;Dest match source?
2EE8 2806     02642         JR      Z,CLSBU3        ;Continue if so
2EEA 218E35   02643 NOTSYS  LD      HL,NOTSYS$      ;Init"Can't make sys disk...
2EED C3AF26   02644         JP      EXIT4           ;Display and quit
2EF0 1C       02645 CLSBU3  INC     E               ;Bump to next DEC
2EF1 23       02646         INC     HL              ;  & our table
2EF2 3E08     02647         LD      A,8             ;At midpoint?
2EF4 BB       02648         CP      E
2EF5 2002     02649         JR      NZ,CLSBU4       ;Skip if not
2EF7 1E20     02650         LD      E,20H           ;Adjust DEC row #
2EF9 10E6     02651 CLSBU4  DJNZ    CLSBU1
2EFB FD5609   02652         LD      D,(IY+9)        ;Ok to backup SYSTEM
2EFE 1E01     02653         LD      E,1             ;Init to HIT sector
2F00 210037   02654         LD      HL,HITBUF
2F03 CDA128   02655         CALL    WRSYS           ;Write back dest HIT
2F06 3E17     02656         LD      A,23            ;Init "HIT write error
2F08 CCA134   02657         CALL    Z,HITRD         ;Verify if write OK
2F0B C29726   02658         JP      NZ,EXIT3        ;Quit on any error
              02659 ;
              02660 ;       Set up byte 'C0' in SYSINFO sector
              02661 ;
              02662         IF      @MOD2
              02663         LD      DE,(CKPROT2)    ;Get sysinfo sector
              02664         LD      E,2             ;Force sector 2
              02665         ENDIF
              02666 ;
              02667         IF      @MOD4
2F0E 110200   02668         LD      DE,02           ;P/u Mod4 SYSINFO sect
              02669         ENDIF
              02670 ;
              02671 ;       HL => to HITBUF at this point
              02672 ;
2F11 CDA628   02673         CALL    RDSEC           ;Read the sector
2F14 2EC0     02674         LD      L,0C0H          ;Point to type flag
2F16 36FF     02675         LD      (HL),0FFH       ;Set it
2F18 2E00     02676         LD      L,0             ;Reset buffer
2F1A CD9C28   02677         CALL    WRSEC           ; Write it back
              02678 ;
              02679 CLSBU5
2F1D CD4E27   02680         CALL    PMTSRC          ;Set up for source disk
2F20 CDA134   02681         CALL    HITRD           ;Read source HIT
2F23 C29726   02682         JP      NZ,EXIT3
              02683 ;
              02684 ;       Start the backup of files
              02685 ;
2F26 210037   02686         LD      HL,HITBUF       ;Init to start of HIT
2F29 183A     02687         JR      SCNH3           ;Branch to start
2F2B D2       02688 OPENIT  DB      'R'!80H         ;R2
2F2C E1       02689 SCNHIT  POP     HL              ;Remove top stack entry
2F2D C1       02690 SCNH1   POP     BC              ;Recover DEC posn
2F2E 2637     02691         LD      H,HITBUF<-8     ;HIT buf hi-order
2F30 68       02692         LD      L,B             ;  and lo-order
2F31          02693 SCNH2   @@CKBRKC                ;Check break hit
2F31+3E6A     02694         LD      A,106
2F33+EF       02695         RST     40
2F34 C2AC26   02696         JP      NZ,BREAK        ;Quit if so
2F37 7D       02697         LD      A,L             ;Get the current DEC posn
2F38 C620     02698         ADD     A,20H           ;Advance to next file on
2F3A 6F       02699         LD      L,A             ;  this dir sector until
2F3B 3028     02700         JR      NC,SCNH3        ;  end, then go to next
2F3D 2C       02701         INC     L               ;  dir sector in the HIT
2F3E CB6D     02702         BIT     5,L             ;Did we go off the end?
2F40 2823     02703         JR      Z,SCNH3         ;  (ie from 1F to 20)
2F42 3E00     02704         LD      A,0
2F43          02705 SETBIT  EQU     $-1
2F44 B7       02706         OR      A
2F45 281B     02707         JR      Z,TOEXIT1       ;If not, all done
2F47 CDBB27   02708         CALL    PMTDST          ;Get dest DCT in IY
2F4A 210037   02709         LD      HL,HITBUF
2F4D FD5609   02710         LD      D,(IY+9)        ;Get dir cyl
2F50 5D       02711         LD      E,L             ;Point to GAT sector
2F51 CDA628   02712         CALL    RDSEC           ;  & read it
2F54 FE06     02713         CP      6
2F56 3E14     02714         LD      A,20            ;Init "GAT read error
2F58 C29726   02715         JP      NZ,EXIT3
2F5B 2ECD     02716         LD      L,0CDH          ;Point to config byte
2F5D CBE6     02717         SET     4,(HL)
2F5F CD1134   02718         CALL    WRGAT
2F62 C38526   02719 TOEXIT1 JP      EXIT1
              02720 ;
              02721 ;       Continue to scan the major loop
              02722 ;
2F65 7E       02723 SCNH3   LD      A,(HL)          ;Is HIT entry spare?
2F66 B7       02724         OR      A
2F67 28C8     02725         JR      Z,SCNH2         ;Loop back if so
2F69 7D       02726         LD      A,L
2F6A E6FE     02727         AND     0FEH            ;Bypass if BOOT or DIR
2F6C 28C3     02728         JR      Z,SCNH2
2F6E 45       02729         LD      B,L             ;Save DEC
2F6F C5       02730         PUSH    BC
2F70 CD4E27   02731         CALL    PMTSRC          ;Set up for source disk
2F73 FD5609   02732         LD      D,(IY+9)        ;P/u DIR cyl
2F76 78       02733         LD      A,B             ;Pt to dir sector of
2F77 E61F     02734         AND     1FH             ;  this file
2F79 C602     02735         ADD     A,2             ;Adj for GAT & HIT
2F7B 5F       02736         LD      E,A
2F7C 21002C   02737         LD      HL,BUF2$        ;Read dir sector
2F7F CDA628   02738         CALL    RDSEC
2F82 FE06     02739         CP      6               ;Proper errcod?
2F84 C29226   02740         JP      NZ,DIRERR
2F87 78       02741         LD      A,B             ;Pt to dir record for
2F88 E6E0     02742         AND     0E0H            ;  the source file
2F8A 6F       02743         LD      L,A
2F8B 262C     02744         LD      H,BUF2$<-8      ;Pt to hi-order dir buf
2F8D 7E       02745         LD      A,(HL)          ;Ignore file if not
2F8E 329931   02746         LD      (ATTRIB+1),A    ;  assigned in directory
2F91 CB67     02747         BIT     4,A
2F93 2831     02748         JR      Z,NODOIT
2F95 CB7F     02749         BIT     7,A             ;Ignore file if FXDE
2F97 C22D2F   02750         JP      NZ,SCNH1
2F9A 2C       02751         INC     L               ;Bump to DIR+1
2F9B 3A1226   02752         LD      A,(MODPRM$)     ;Bypass if Mod parm
2F9E B7       02753         OR      A               ;  not entered
2F9F 2804     02754         JR      Z,SCNH4
2FA1 CB76     02755         BIT     6,(HL)          ;If Mod parm and bit not set
2FA3 2821     02756         JR      Z,NODOIT        ;  skip the file
              02757 ;
2FA5 CB66     02758 SCNH4   BIT     4,(HL)          ;Check date not current
2FA7 2809     02759         JR      Z,SCNH4A
2FA9 3AD528   02760         LD      A,(SVCTR)
2FAC B7       02761         OR      A               ;Was date set?
2FAD 2817     02762         JR      Z,NODOIT        ;Bypass if not
2FAF 3C       02763         INC     A               ;Is date current?
2FB0 2814     02764         JR      Z,NODOIT        ;Bypass if not
              02765 ;
2FB2 2D       02766 SCNH4A  DEC     L               ;DIR + 0
2FB3 3A8426   02767         LD      A,(CLSFLG$)     ;P/u CLASS parm byte
2FB6 CB76     02768         BIT     6,(HL)          ;Bypass if not SYS file
2FB8 2806     02769         JR      Z,CKINV
2FBA CB77     02770         BIT     6,A             ;Ok, it is, was SYS used?
2FBC 2808     02771         JR      Z,NODOIT        ;Go if no SYS parm
2FBE 1809     02772         JR      CKNAM           ;  else back it up
2FC0 CB5E     02773 CKINV   BIT     3,(HL)          ;Test if file is INV
2FC2 2805     02774         JR      Z,CKNAM
2FC4 CB5F     02775         BIT     3,A             ;File is, want INV files?
2FC6 CA2D2F   02776 NODOIT  JP      Z,SCNH1         ;Don't want invisibles
2FC9 3A0226   02777 CKNAM   LD      A,(SPCFLD$)     ;Now test filespec match
2FCC FE20     02778         CP      ' '             ;If blank, don't bother
2FCE 2007     02779         JR      NZ,CKNAM0       ;  to match, take it
2FD0 3A0A26   02780         LD      A,(SPCFLD$+8)   ;How about the extension?
2FD3 FE20     02781         CP      ' '
2FD5 282C     02782         JR      Z,SCNH6         ;Go if no ext either
              02783 ;
              02784 ;       Test for a filespec match
              02785 ;
2FD7 E5       02786 CKNAM0  PUSH    HL
2FD8 7D       02787         LD      A,L
2FD9 C605     02788         ADD     A,5             ;Pt to filename in dir
2FDB 6F       02789         LD      L,A
2FDC 110226   02790         LD      DE,SPCFLD$      ;Pt to user filespec
2FDF 060B     02791         LD      B,11            ;11 char max
2FE1 1A       02792 CKNAM1  LD      A,(DE)          ;P/u user entry
2FE2 FE24     02793         CP      '$'             ;Wild card character?
2FE4 2808     02794         JR      Z,CKNAM2        ;Always matches
2FE6 BE       02795         CP      (HL)            ;Same as filespec?
2FE7 2805     02796         JR      Z,CKNAM2        ;Loop if so
2FE9 FE20     02797         CP      ' '             ;Ignore any further?
2FEB C2FB2F   02798         JP      NZ,TSTMFLG      ;If not blank, no match
2FEE 23       02799 CKNAM2  INC     HL              ;Match so far
2FEF 13       02800         INC     DE
2FF0 10EF     02801         DJNZ    CKNAM1
              02802 ;
              02803 ;       Filespec class matches, check if NOT used
              02804 ;
2FF2 3A0D26   02805         LD      A,(MFLG$)       ;Bypass if a match but
2FF5 B7       02806         OR      A               ;  - exclude given
2FF6 C22C2F   02807         JP      NZ,SCNHIT       ;- was used, skip file
2FF9 1807     02808         JR      SCNH5
              02809 ;
2FFB 3A0D26   02810 TSTMFLG LD      A,(MFLG$)       ;Ignore if NG match &
2FFE B7       02811         OR      A               ;  no exclude given
2FFF CA2C2F   02812         JP      Z,SCNHIT
3002 E1       02813 SCNH5   POP     HL              ;Rcvr ptr to DIR+0
3003 E5       02814 SCNH6   PUSH    HL
              02815 ;
              02816 ;       Now check if date matches
              02817 ;
3004 23       02818         INC     HL              ;Pt to date field
3005 CDE833   02819         CALL    UNPACK          ;Alter date for cpr
3008 3A0126   02820         LD      A,(FTFLG$)
300B 07       02821         RLCA                    ;Tst From bit
300C 3010     02822         JR      NC,SCNH7
300E 7A       02823         LD      A,D             ;Ignore if date was
300F B3       02824         OR      E               ;  00/00/00 for file
3010 CA2C2F   02825         JP      Z,SCNHIT
3013 2A8026   02826         LD      HL,(FMPAKD$)    ;P/u user entry
3016 EB       02827         EX      DE,HL
3017 CDBC33   02828         CALL    CPHLDE          ;HL-DE
301A EB       02829         EX      DE,HL
301B DA2C2F   02830         JP      C,SCNHIT        ;Bypass if date range bad
301E 3A0126   02831 SCNH7   LD      A,(FTFLG$)
3021 0F       02832         RRCA                    ;Test TO bit
3022 300E     02833         JR      NC,MATCHES      ;Go if no TOPARM else
3024 7A       02834         LD      A,D             ;  ck if file is dated
3025 B3       02835         OR      E
3026 CA2C2F   02836         JP      Z,SCNHIT        ;Bypass if date was 00
3029 2A8226   02837         LD      HL,(TOPAKD$)    ;P/u user's packed date
302C CDBC33   02838         CALL    CPHLDE          ;HL-DE
302F DA2C2F   02839         JP      C,SCNHIT        ;Bypass if out of range
3032 E1       02840 MATCHES POP     HL
3033 7D       02841 DONAM   LD      A,L             ;Pt to start of dir rec
3034 E6E0     02842         AND     0E0H
3036 6F       02843         LD      L,A             ;Make sure it's on stack
3037 E5       02844         PUSH    HL
3038 C605     02845         ADD     A,5             ;Pt to start of filename
303A 6F       02846         LD      L,A
303B 111826   02847         LD      DE,FCB1$        ;Move filename into fcb
303E 0608     02848         LD      B,8             ;Init 8 chars for filename
3040 7E       02849 DONAM1  LD      A,(HL)          ;P/u a char from the dir
3041 FE20     02850         CP      ' '             ;Space = end of name
3043 2805     02851         JR      Z,DONAM2
3045 12       02852         LD      (DE),A          ;Move char to FCB
3046 23       02853         INC     HL              ;Bump both ptrs
3047 13       02854         INC     DE
3048 10F6     02855         DJNZ    DONAM1          ;Loop for more
304A 7D       02856 DONAM2  LD      A,L             ;Pt to file extension
304B 80       02857         ADD     A,B             ;  by adding the
304C 6F       02858         LD      L,A             ;  loop remainder
304D 7E       02859         LD      A,(HL)
304E FE20     02860         CP      ' '
3050 2810     02861         JR      Z,DONAM5        ;Bypass if none there
3052 3E2F     02862         LD      A,'/'           ;  else set separator
3054 12       02863         LD      (DE),A          ;  into the FCB
3055 13       02864         INC     DE
3056 0603     02865         LD      B,3             ;Now move in ext
3058 7E       02866 DONAM4  LD      A,(HL)          ;P/u ext char
3059 FE20     02867         CP      ' '             ;End if no more
305B 2805     02868         JR      Z,DONAM5
305D 12       02869         LD      (DE),A          ;Put in in the FCB
305E 23       02870         INC     HL              ;Bump both ptrs
305F 13       02871         INC     DE
3060 10F6     02872         DJNZ    DONAM4          ;Loop for more
3062 3E03     02873 DONAM5  LD      A,3             ;Terminate with ETX
3064 12       02874         LD      (DE),A
3065 D5       02875         PUSH    DE              ;Save pointer to spec end
              02876 ;
              02877 ;       Check for NEW or OLD option
              02878 ;
3066 3A1026   02879         LD      A,(OLDPRM$)     ;P/u parm & merge
3069 210E26   02880         LD      HL,NEWPRM$      ;  with new
306C B6       02881         OR      (HL)            ;If neither, bypass
306D 284F     02882         JR      Z,BYPASS
306F 211826   02883         LD      HL,FCB1$        ;Save current spec
3072 115826   02884         LD      DE,FCB3$
3075 012000   02885         LD      BC,32
3078 EDB0     02886         LDIR
307A D1       02887         POP     DE              ;Recover spec end
307B D5       02888         PUSH    DE              ;  needed to add drivespec
307C CDC233   02889         CALL    MAKSPC          ;Make it a file spec
307F CD9834   02890         CALL    GETDST          ;Bring in the dest disk
3082 2A1626   02891         LD      HL,(BUFFER$)    ;Buffer is irrelevant
3085 113826   02892         LD      DE,FCB2$        ;Pt to dest spec
3088 FDE5     02893         PUSH    IY
308A          02894         @@FLAGS                 ;IY => flag table base
308A+3E65     02895         LD      A,101
308C+EF       02896         RST     40
308D FDCB12C6 02897         SET     0,(IY+'S'-'A')  ;Inhibit file open bit
3091 FDE1     02898         POP     IY
3093          02899         @@OPEN                  ;Attempt to open
3093+3E3B     02900         LD      A,59
3095+EF       02901         RST     40
3096 D1       02902         POP     DE              ;Keep stack proper
3097 2812     02903         JR      Z,CKOLD         ;If file exists, ck OLD
3099 FE19     02904         CP      25              ;File access denied?
309B 280E     02905         JR      Z,CKOLD         ;  means it exists
309D FE18     02906         CP      24              ;File not found?
309F C22C2F   02907         JP      NZ,SCNHIT       ;Ignore if not
30A2 3A0E26   02908         LD      A,(NEWPRM$)     ;Check if NEW  requested
30A5 B7       02909         OR      A
30A6 200A     02910         JR      NZ,GODOIT       ;Go if NEW & not found
30A8 C32C2F   02911         JP      SCNHIT
30AB 3A1026   02912 CKOLD   LD      A,(OLDPRM$)     ;Was found, backup old
30AE B7       02913         OR      A               ; files this time?
30AF CA2C2F   02914         JP      Z,SCNHIT        ;Ignore if not OLD
30B2 D5       02915 GODOIT  PUSH    DE
30B3 215826   02916         LD      HL,FCB3$        ;Recover the original
30B6 111826   02917         LD      DE,FCB1$        ;  file name
30B9 012000   02918         LD      BC,32
30BC EDB0     02919         LDIR
              02920 ;
              02921 ;       Check if prompting or not (Q parm)
              02922 ;
30BE 3A1526   02923 BYPASS  LD      A,(QPARM$+1)    ;Query each file?
30C1 B7       02924         OR      A
30C2 CA7531   02925         JP      Z,NOPRMPT       ;Not if not entered
30C5          02926         @@DSPLY QUERY           ;"backup filespec ?
              02927         IFEQ    01H,1
30C5+21C734   02928         LD      HL,QUERY
              02929         ENDIF
30C8+3E0A     02930         LD      A,10
30CA+EF       02931         RST     40
              02932 ;
              02933 ;       Display file info for user decision
              02934 ;
30CB D1       02935         POP     DE              ;Rcvr ptr to file buf
30CC E1       02936         POP     HL              ;Rcvr ptr to 1st dir byte
30CD D5       02937         PUSH    DE
30CE 23       02938         INC     HL              ;Pt to MOD bit
30CF CB76     02939         BIT     6,(HL)          ;Test MOD flag
30D1 2808     02940         JR      Z,SCDAT1        ;Go if not set
30D3 3E20     02941         LD      A,' '           ;Put a space
30D5 12       02942         LD      (DE),A
30D6 13       02943         INC     DE
30D7 3E2B     02944         LD      A,'+'
30D9 12       02945         LD      (DE),A          ;Display '+' if MOD
30DA 13       02946         INC     DE
30DB 3E20     02947 SCDAT1  LD      A,' '           ;Write a space
30DD 12       02948         LD      (DE),A
30DE 13       02949         INC     DE
30DF 23       02950         INC     HL              ;Advance to date field
30E0 EB       02951         EX      DE,HL
30E1 367B     02952         LD      (HL),'{'        ;Stuff left brace
30E3 23       02953         INC     HL
30E4 EB       02954         EX      DE,HL
30E5 7E       02955         LD      A,(HL)          ;If no date, then skip
30E6 B7       02956         OR      A
30E7 2860     02957         JR      Z,SCDAT4        ;Ignore if no date saved
30E9 0F       02958         RRCA                    ;Has date, get day
30EA 0F       02959         RRCA
30EB 0F       02960         RRCA
30EC E61F     02961         AND     1FH
30EE 062F     02962         LD      B,2FH           ;Convert day to decimal
30F0 04       02963 SCDAT2  INC     B               ;  by counting # of 10's
30F1 D60A     02964         SUB     10              ;Sub 10 from day #
30F3 30FB     02965         JR      NC,SCDAT2
30F5 C63A     02966         ADD     A,3AH           ;Cvrt lo order to ASCII
30F7 F5       02967         PUSH    AF              ;Save day low order
30F8 78       02968         LD      A,B             ;Stuff day hi order
30F9 12       02969         LD      (DE),A
30FA 13       02970         INC     DE              ;Bump
30FB F1       02971         POP     AF              ;Rcvr lo order day #
30FC 12       02972         LD      (DE),A          ;Stuff low order
30FD 13       02973         INC     DE              ;Bump pointer to msg
30FE 3E2D     02974         LD      A,'-'
3100 12       02975         LD      (DE),A          ;Stuff '-'
3101 13       02976         INC     DE              ;Pt tO month field
3102 E5       02977         PUSH    HL              ;Save DIR ptr
3103 F5       02978         PUSH    AF              ;Save separator char
3104 2B       02979         DEC     HL              ;Pt to DIR+1 (month+)
3105 7E       02980         LD      A,(HL)          ;P/u month etc
3106 E60F     02981         AND     0FH             ;Strip off flags
3108 3D       02982         DEC     A               ;(mon-1)*3 to index
3109 4F       02983         LD      C,A             ;   string conversion table
310A 07       02984         RLCA                    ;X2
310B 81       02985         ADD     A,C             ;X3
310C 4F       02986         LD      C,A             ;Results to BC
310D 0600     02987         LD      B,0
310F 21C535   02988         LD      HL,MONTBL       ;Ptr to month names
3112 09       02989         ADD     HL,BC           ;Add offset to tbl start
3113 0E03     02990         LD      C,3
3115 EDB0     02991         LDIR                    ;Move 3-char month
3117 F1       02992         POP     AF
3118 12       02993         LD      (DE),A
3119 13       02994         INC     DE              ;Advance to year field
311A E1       02995         POP     HL              ;Ptr to DIR+2
311B 0E38     02996         LD      C,'8'           ;Init for 1980's
311D 3AD92A   02997         LD      A,(DVTEST1)
3120 B7       02998         OR      A
3121 2005     02999         JR      NZ,NEWDT2       ;Go if new style
3123 7E       03000         LD      A,(HL)          ;Else get old year
3124 E607     03001         AND     7               ;Mask it
3126 1818     03002         JR      THERE
3128 7D       03003 NEWDT2  LD      A,L             ;Offset to year
3129 C611     03004         ADD     A,17
312B 6F       03005         LD      L,A             ;DIR+19
312C 7E       03006         LD      A,(HL)
312D E61F     03007         AND     1FH             ;Mask time
              03008         IF      @BLD631
              03009 L3B2F:                          ;<631>
              03010         ENDIF
312F FE0A     03011         CP      10              ;1980's?
3131 380D     03012         JR      C,THERE
              03013         IF      @BLD631
3133 0C       03014         INC     C               ;<631>was '8', now '9' bump decade
              03015         ELSE
              03016         LD      C,'9'           ;Bump decade
              03017         ENDIF
3134 D60A     03018         SUB     10
3136 FE0A     03019         CP      10              ;Now must be 0-9
3138 3806     03020         JR      C,THERE
              03021         IF      @BLD631
313A D60A     03022         SUB     0AH             ;<631>
313C 0E30     03023         LD      C,'0'           ;<631>
313E 18EF     03024         JR      L3B2F           ;<631>
              03025         ELSE
              03026         LD      A,9             ;  else make 1999
              03027         ENDIF
3140 47       03028 THERE   LD      B,A             ;Save year offset
3141 79       03029         LD      A,C             ;Stuff decade for dsply
3142 12       03030         LD      (DE),A
3143 13       03031         INC     DE
3144 78       03032         LD      A,B             ;Year
3145 C630     03033         ADD     A,'0'           ;Make ascii
3147 12       03034         LD      (DE),A
3148 13       03035         INC     DE
3149 3E03     03036 SCDAT4  LD      A,3             ;Show etx for display
314B 12       03037         LD      (DE),A
314C          03038         @@DSPLY FCB1$           ;Display filename
              03039         IFEQ    01H,1
314C+211826   03040         LD      HL,FCB1$
              03041         ENDIF
314F+3E0A     03042         LD      A,10
3151+EF       03043         RST     40
3152          03044         @@DSPLY QMARK$          ;" } ? "
              03045         IFEQ    01H,1
3152+21C035   03046         LD      HL,QMARK$
              03047         ENDIF
3155+3E0A     03048         LD      A,10
3157+EF       03049         RST     40
3158 2A1626   03050         LD      HL,(BUFFER$)    ;Get user response
315B 010003   03051         LD      BC,3<8          ;3 char max
315E          03052         @@KEYIN
315E+3E09     03053         LD      A,9
3160+EF       03054         RST     40
3161 DAAC26   03055         JP      C,ABRTBU        ;Quit on Break
3164 7E       03056         LD      A,(HL)          ;Get the 1st char
3165 CBAF     03057         RES     5,A             ;Strip lc if present
3167 FE59     03058         CP      'Y'             ;Yes means move the file
3169 2808     03059         JR      Z,CPYMSG        ;Go if so
              03060 ;
              03061 ;       Accept 'C' for response to set QUERY=N
              03062 ;
316B D643     03063         SUB     'C'             ;Was response "C"?
316D C22C2F   03064         JP      NZ,SCNHIT       ;Don't backup if not
3170 321526   03065         LD      (QPARM$+1),A    ;Set QUERY=N
3173 E3       03066 CPYMSG  EX      (SP),HL         ;Place dummy HL below
3174 E5       03067         PUSH    HL              ;  FCB1$ ETX pointer
              03068 ;
              03069 ;       Display copying file info
              03070 ;
3175          03071 NOPRMPT @@CKBRKC                ;Ck if BREAK
3175+3E6A     03072         LD      A,106
3177+EF       03073         RST     40
3178 C2AC26   03074         JP      NZ,ABRTBU       ;Quit if so
317B          03075         @@LOGOT CPYFIL$         ;"copying file...
              03076         IFEQ    01H,1
317B+21B734   03077         LD      HL,CPYFIL$
              03078         ENDIF
317E+3E0C     03079         LD      A,12
3180+EF       03080         RST     40
3181 E1       03081         POP     HL              ;Get pointer where ETX
3182 360D     03082         LD      (HL),CR         ;  is & replace with CR
3184 E5       03083         PUSH    HL
3185          03084         @@LOGOT FCB1$           ;Display the filespec
              03085         IFEQ    01H,1
3185+211826   03086         LD      HL,FCB1$
              03087         ENDIF
3188+3E0C     03088         LD      A,12
318A+EF       03089         RST     40
318B D1       03090         POP     DE              ;Rcvr ptr to CR
318C E1       03091         POP     HL
              03092 ;
              03093 ;       Put in the drive spec
              03094 ;
318D CDC233   03095 DOBU    CALL    MAKSPC          ;Make the filespec
3190 C1       03096         POP     BC              ;Get DEC of source
3191 C5       03097         PUSH    BC
3192 78       03098         LD      A,B             ;Test if a SYS DEC
3193 E6D8     03099         AND     0D8H
3195 C26632   03100         JP      NZ,DOFIL0       ;Jump if not SYS
3198 3E00     03101 ATTRIB  LD      A,0             ;P/u attribute byte
319A CB77     03102         BIT     6,A             ;Don't do if not SYS
319C CA6632   03103         JP      Z,DOFIL0
              03104 ;
              03105 ;       Routine to copy over SYS files
              03106 ;
319F CDBB27   03107         CALL    PMTDST          ;Prompt dest drive
31A2 FD5609   03108         LD      D,(IY+9)        ;P/u dir cyl of dest
31A5 78       03109         LD      A,B             ;Get DEC & calc sector
31A6 E61F     03110         AND     1FH
31A8 C602     03111         ADD     A,2             ;Adj for GAT & HIT
31AA 5F       03112         LD      E,A
31AB 2A1626   03113         LD      HL,(BUFFER$)    ;P/u buffer addr
31AE CDA628   03114         CALL    RDSEC           ;Read dir sect
31B1 FE06     03115         CP      6               ;Proper errcod?
31B3 C29226   03116         JP      NZ,DIRERR
31B6 78       03117         LD      A,B             ;Pt to 1st byte of
31B7 E6E0     03118         AND     0E0H            ;  dir record
31B9 6F       03119         LD      L,A
31BA CB66     03120         BIT     4,(HL)          ;Go if already assigned
31BC 2018     03121         JR      NZ,DOSYS1
31BE 365F     03122         LD      (HL),5FH        ;Show assigned, SYS, INV
31C0 23       03123         INC     HL              ;  & no access
              03124         IF      @BLD631
31C1 010300   03125         LD      BC,3            ;<631>
31C4 70       03126         LD      (HL),B          ;<631>B==0 Zero out DIR+1 to DIR+4
31C5 54       03127         LD      D,H             ;<631>
31C6 5D       03128         LD      E,L             ;<631>
31C7 13       03129         INC     DE              ;<631>
              03130         ELSE
              03131         LD      (HL),0          ;Zero out DIR+1 to DIR+4
              03132         LD      D,H
              03133         LD      E,L
              03134         INC     DE
              03135         LD      BC,3
              03136         ENDIF
31C8 EDB0     03137         LDIR
31CA 7D       03138         LD      A,L             ;Pt HL to DIR+16
31CB C60C     03139         ADD     A,12
31CD 6F       03140         LD      L,A
31CE 3C       03141         INC     A
31CF 5F       03142         LD      E,A             ;Pt DE to DIR+17
31D0 36FF     03143         LD      (HL),0FFH       ;Stuff X'FF' into extent
31D2 0E0F     03144         LD      C,15            ;  & pswd fields
31D4 EDB0     03145         LDIR
31D6 7D       03146 DOSYS1  LD      A,L             ;Pt HL to Dir+0
31D7 E6E0     03147         AND     0E0H            ;  of dest
31D9 CB76     03148         BIT     6,(HL)          ;Guard against writing
31DB CAEA2E   03149         JP      Z,NOTSYS        ;  over a non-SYS file
31DE C605     03150         ADD     A,5             ;Pt to name field
31E0 6F       03151         LD      L,A
31E1 5F       03152         LD      E,A             ;Pt DE to name field of
31E2 262C     03153         LD      H,BUF2$<-8      ;  destination
31E4 3A1726   03154         LD      A,(BUFFER$+1)   ;P/u buffer hi-order addr
31E7 57       03155         LD      D,A
31E8 010D00   03156         LD      BC,13           ;Move name/ext into dest
31EB EDB0     03157         LDIR
31ED FD5609   03158         LD      D,(IY+9)        ;P/u dir cyl of dest
31F0 C1       03159         POP     BC              ;Rcvr DEC of source
31F1 C5       03160         PUSH    BC
31F2 78       03161         LD      A,B             ;Calc dir sector for
31F3 E61F     03162         AND     1FH             ;  source SYS module
31F5 C602     03163         ADD     A,2
31F7 5F       03164         LD      E,A
31F8 2A1626   03165         LD      HL,(BUFFER$)    ;P/u buffer ptr for dest
31FB CDA128   03166         CALL    WRSYS           ;Write the dir to dest
31FE 3E12     03167         LD      A,18            ;Init "Dir write error
3200 C29726   03168         JP      NZ,EXIT3        ;  and quit on bad write
              03169 ;
              03170 ;       The HIT entries were transferred prior
              03171 ;
3203 C1       03172         POP     BC              ;Rcvr DEC of source
3204 C5       03173         PUSH    BC
3205 78       03174         LD      A,B             ;Test for SYS0
3206 FE02     03175         CP      2
3208 C26632   03176         JP      NZ,DOFIL0       ;Bypass if not SYS0
320B CD4E27   03177         CALL    PMTSRC          ;Prompt source
              03178         IF      @MOD4
320E 0610     03179         LD      B,16            ;Init to xfer BOOT track
3210 110000   03180         LD      DE,0            ;Init track 0, sector 0
              03181         ENDIF
              03182         IF      @MOD2
              03183         LD      DE,(PROTSEC)    ;Get sysinfo sector
              03184         LD      A,D
              03185         OR      A
              03186         LD      B,5
              03187         JR      Z,NBTSEC2
              03188         LD      B,16
              03189 NBTSEC2 LD      E,0
              03190         ENDIF
              03191 ;
3213 2A1626   03192         LD      HL,(BUFFER$)    ;Set disk buffer
3216 CDA628   03193 RDBOOT  CALL    RDSEC           ;Read sector and
3219 C29726   03194         JP      NZ,EXIT3        ;  quit on error
321C 24       03195         INC     H               ;Pt to next block
321D 1C       03196         INC     E               ;Point to next sector
321E 10F6     03197         DJNZ    RDBOOT          ;Continue reading boot
              03198 ;
              03199 ;       Turn off CONFIG on destination disk
              03200 ;
3220 2A1626   03201         LD      HL,(BUFFER$)    ;Start cyl image
3223 110102   03202         LD      DE,100H*2+1     ;Offset to sector 2 +1
3226 19       03203         ADD     HL,DE           ;HL => config byte
3227 36C9     03204         LD      (HL),0C9H       ;Config off
              03205 ;
3229 CDBB27   03206 DOSYS2  CALL    PMTDST          ;Prompt destination
              03207         IF      @MOD4
322C 0610     03208         LD      B,16            ;Sector count for boot
322E 110000   03209         LD      DE,0            ;Init track and sector 0
              03210         ENDIF
              03211         IF      @MOD2
              03212         LD      DE,(CKPROT2)    ;Get dest cyl number
              03213         LD      A,(PROTSEC+1)
              03214         LD      B,5             ;Default 5 sectors
              03215         OR      A
              03216         JR      Z,NBTSECS
              03217         AND     D
              03218         JR      Z,NBTSECS
              03219         LD      B,16            ;Use 16 sectors
              03220 NBTSECS LD      E,0
              03221         ENDIF
3231 2A1626   03222         LD      HL,(BUFFER$)    ;P/u buffer start
3234 7B       03223 WRBOOT  LD      A,E             ;If sector 0 or 1,
3235 FE02     03224         CP      2               ;  correct DIRCYL &
3237 3015     03225         JR      NC,WRBOOT2      ;  BOOT step rate
3239 B7       03226         OR      A
323A 280A     03227         JR      Z,WRBOOT1       ;If sec 0 only dir cyl
              03228 ;
323C 3A0026   03229         LD      A,(BOOTST$)     ;P/u step pointer
323F 6F       03230         LD      L,A
3240 7E       03231         LD      A,(HL)          ;P/u BOOT step rate
3241 E6FC     03232         AND     0FCH            ;Strip the rate
3243 F600     03233 BSCLS   OR      0               ;Merge dest rate
3245 77       03234         LD      (HL),A
3246 FD7E09   03235 WRBOOT1 LD      A,(IY+9)        ;P/u DIR cyl
3249 2E02     03236         LD      L,2
324B 77       03237         LD      (HL),A
324C 2E00     03238         LD      L,0             ;Restart to buf start
324E CD9C28   03239 WRBOOT2 CALL    WRSEC           ;Write dest boot sector
3251 C29726   03240         JP      NZ,EXIT3        ;Quit on error
3254 24       03241         INC     H               ;Bump buffer page
3255 1C       03242         INC     E               ;Bump sector
3256 10DC     03243         DJNZ    WRBOOT
              03244 ;
              03245 ;       Verify this track
              03246 ;
              03247         IF      @MOD4
3258 0610     03248         LD      B,16            ;16 sector just written
325A 110000   03249         LD      DE,0            ;  on track 0
              03250         ENDIF
              03251         IF      @MOD2
              03252         LD      A,(PROTSEC+1)
              03253         LD      B,5
              03254         LD      DE,(CKPROT2)
              03255         OR      A
              03256         JR      Z,NBTSEC1
              03257         AND     D
              03258         JR      Z,NBTSEC1
              03259         LD      B,16
              03260 NBTSEC1 LD      E,0
              03261         ENDIF
325D CDAB28   03262 VRBOOT  CALL    VERSEC          ;Verify a boot sector
3260 C29726   03263         JP      NZ,EXIT3        ;Quit on an error
3263 1C       03264         INC     E               ;Inc sector #
3264 10F7     03265         DJNZ    VRBOOT
              03266 ;
              03267 ;       Mod II check if cyl 0 to be formatted on dest
              03268 ;
              03269         IF      @MOD2
              03270         LD      DE,(CKPROT2)    ;Get sysinfo sector
              03271         LD      A,(PROTSEC+1)
              03272         AND     D
              03273         JR      Z,COPY0E        ;Go if yes
              03274 OKWRT0  CALL    PMTSRC          ;Get source disk
              03275         CALL    READ0           ;Read cyl 0
              03276         JP      NZ,EXIT3        ;Go on disk error
              03277         CALL    PMTDST          ;Get dest disk
              03278         CALL    FORMAT0         ;Format cyl
              03279         JP      NZ,EXIT3        ;Go on disk error
              03280 ;
              03281 ;       Setup new track length into boot data
              03282 ;
              03283         LD      HL,(BUFFER$)    ;Get I/O buffer
              03284         PUSH    HL              ;Save start
              03285         INC     HL              ;+1
              03286         INC     HL              ;+2 (dir cyl)
              03287         LD      A,(IY+9)        ;Get dir cyl
              03288         LD      (HL),A          ;To buffer
              03289         INC     HL              ;+3 (boot step rate)
              03290         LD      A,(BSCLS+1)     ;Get step rate
              03291         AND     3               ;Step rate only
              03292         LD      (HL),A          ;Load into buffer
              03293         INC     HL              ;Bump
              03294         LD      A,(IY+7)        ;Get data
              03295         AND     1FH             ;Highest sector #
              03296         INC     A               ;Sectors / track
              03297         LD      (HL),A          ;To buffer
              03298         INC     HL              ;Bump
              03299         LD      A,(IY+3)        ;Get data
              03300         ADD     A,A             ;Density => bit 7
              03301         AND     80H             ;Keep only
              03302         LD      (HL),A          ;To buffer
              03303         POP     HL              ;HL => buffer start
              03304         LD      D,H             ;Pass to DE
              03305         LD      E,L             ;DE => buffer start
              03306         LD      BC,80H          ;Buffer length
              03307         ADD     HL,BC           ;HL => dest
              03308         EX      DE,HL           ;HL=>source, DE=>dest
              03309         LDIR                    ;Copy sector 0 => sec 1
              03310         CALL    PMTDST          ;Re-fetch DCT
              03311         CALL    WRITE0          ;Write the cylinder
              03312         JP      NZ,EXIT3        ;Go on disk error
              03313 COPY0E  EQU     $
              03314         ENDIF
              03315 ;
              03316 ;       Routine to perform the file copy to destination
              03317 ;
3266 112B2F   03318 DOFIL0  LD      DE,OPENIT       ;Check the name
3269          03319         @@RENAM
3269+3E38     03320         LD      A,56
326B+EF       03321         RST     40
326C 0600     03322         LD      B,0             ;Lrl = 256
326E CD8F34   03323         CALL    GETSRC          ;Prompt source & set fcb
3271 2A1626   03324         LD      HL,(BUFFER$)    ;Get buffer addr
3274          03325         @@FLAGS
3274+3E65     03326         LD      A,101
3276+EF       03327         RST     40
3277 FDCB12C6 03328         SET     0,(IY+'S'-'A')  ;Inhibit file open bit
327B          03329         @@OPEN                  ;Open the source file
327B+3E3B     03330         LD      A,59
327D+EF       03331         RST     40
327E C29726   03332         JP      NZ,EXIT3        ;Quit on open error
              03333 ;
              03334 ;       Check if source file can fit on destination disk
              03335 ;
3281 2A2426   03336         LD      HL,(FCB1$+12)   ;P/u ERN
3284 110000   03337 SIZSAV  LD      DE,$-$          ;P/u disk capacity
3287 EB       03338         EX      DE,HL           ;flip them around for test
3288 ED52     03339         SBC     HL,DE           ;If <= size, then OK
328A 3009     03340         JR      NC,SIZOK
328C 214E35   03341         LD      HL,SIZBIG$      ;  else file to big
328F          03342         @@LOGOT                 ;Inform user & continue
              03343         IFEQ    00H,1
              03344         LD      HL,
              03345         ENDIF
328F+3E0C     03346         LD      A,12
3291+EF       03347         RST     40
3292 C32D2F   03348         JP      SCNH1           ;Loop back for another file
3295 112B2F   03349 SIZOK   LD      DE,OPENIT       ;Check the name
3298          03350         @@RENAM
3298+3E38     03351         LD      A,56
329A+EF       03352         RST     40
329B 0600     03353         LD      B,0             ;Lrl = 256
329D CD9834   03354         CALL    GETDST          ;Prompt dest & set fcb
32A0 2A1626   03355         LD      HL,(BUFFER$)    ;Get buffer addr
32A3          03356         @@INIT                  ;Init the dest
32A3+3E3A     03357         LD      A,58
32A5+EF       03358         RST     40
32A6 2807     03359         JR      Z,LRLOK         ;If no error, cont.
32A8 FE2A     03360         CP      42              ;Was it LRL error?
32AA 2803     03361         JR      Z,LRLOK         ;Ignore if so
32AC C39726   03362         JP      EXIT3           ;  else real error, abort
32AF 3A3F26   03363 LRLOK   LD      A,(FCB2$+7)     ;P/u DEC of dest
32B2 322A33   03364         LD      (DOFIL11+1),A
32B5 ED4B2426 03365         LD      BC,(FCB1$+12)   ;P/u ERN & ck for enuf
32B9 CD4534   03366         CALL    WRERN           ; dest space on disk
32BC C1       03367         POP     BC              ;Recover DEC
32BD 68       03368         LD      L,B             ;Reset HL to dir
32BE 262C     03369         LD      H,BUF2$<-8
32C0 C5       03370         PUSH    BC              ;Save DEC
32C1 2806     03371         JR      Z,DOFIL02       ;Go if there was room
32C3 CD4E27   03372         CALL    PMTSRC          ;  else make source current, loop
32C6 C33330   03373         JP      DONAM           ;  back because dest was swapped
32C9 7D       03374 DOFIL02 LD      A,L             ;Check if date current
32CA E6E0     03375         AND     0E0H            ;Index to proper direc
32CC 3C       03376         INC     A
32CD 6F       03377         LD      L,A
32CE CB66     03378         BIT     4,(HL)          ;Check if bit set
32D0 2803     03379         JR      Z,$+5
32D2 32432F   03380         LD      (SETBIT),A
              03381 ;
32D5 210000   03382         LD      HL,0
32D8 224426   03383         LD      (FCB2$+12),HL   ;Set dest ERN to 0
32DB          03384         @@REW                   ;Rewind the dest
32DB+3E44     03385         LD      A,68
32DD+EF       03386         RST     40
32DE 2A1626   03387 DOFIL03 LD      HL,(BUFFER$)    ;Buffer addr
32E1 221B26   03388 DOFIL04 LD      (FCB1$+3),HL    ;Set buffer addr in fcb
32E4 CD8F34   03389         CALL    GETSRC          ;Prompt source & set fcb
32E7          03390         @@READ                  ;Read a source file sector
32E7+3E43     03391         LD      A,67
32E9+EF       03392         RST     40
32EA 280B     03393         JR      Z,DOFIL05       ;Go if no error
32EC FE1C     03394         CP      1CH             ;Eof?
32EE 2824     03395         JR      Z,DOFIL09       ;Yes, finished loading
32F0 FE1D     03396         CP      1DH             ;Nrn > ern?
32F2 2820     03397         JR      Z,DOFIL09       ;Also means load done
32F4 C39726   03398         JP      EXIT3           ;Abort on any other error
32F7 24       03399 DOFIL05 INC     H               ;Bump the buffer ptr
32F8 7C       03400         LD      A,H
32F9 FE00     03401 DOFIL06 CP      $-$             ;Test out of memory
32FB 20E4     03402         JR      NZ,DOFIL04      ;Loop if more room
32FD 2A1626   03403         LD      HL,(BUFFER$)    ;P/u buffer start
3300 223B26   03404 DOFIL07 LD      (FCB2$+3),HL    ;  & set into dest fcb
3303 CD9834   03405         CALL    GETDST          ;Prompt dest & set fcb
3306          03406         @@VER                   ;Write dest w/verify
3306+3E49     03407         LD      A,73
3308+EF       03408         RST     40
3309 C29726   03409         JP      NZ,EXIT3        ;Quit on error
330C 24       03410         INC     H               ;Bump buffer page
330D 7C       03411         LD      A,H
330E FE00     03412 DOFIL08 CP      $-$             ;Out of memory?
3310 20EE     03413         JR      NZ,DOFIL07      ;Write another if not
3312 18CA     03414         JR      DOFIL03         ;  else back to loading
              03415 ;
              03416 ;       Reached the end of the source file
              03417 ;
3314 CD2634   03418 DOFIL09 CALL    LSTBUF          ;Write remaining buffer
3317 2A2026   03419         LD      HL,(FCB1$+8)    ;P/u DEC & LRL
331A 224026   03420         LD      (FCB2$+8),HL    ;  & stuff into dest
331D CD9834   03421         CALL    GETDST          ;Set for dest fcb
3320          03422         @@CLOSE                 ;Close 'er up
3320+3E3C     03423         LD      A,60
3322+EF       03424         RST     40
3323 C29726   03425         JP      NZ,EXIT3        ;Abort on close error
              03426 ;
              03427 ;       Now remove the mod flag from destination
              03428 ;        and do CLONE function
              03429 ;
3326 FD5609   03430         LD      D,(IY+9)        ;P/u dir cyl
3329 0600     03431 DOFIL11 LD      B,$-$           ;P/u DEC
332B 78       03432         LD      A,B             ;Pt to dir sector
332C E61F     03433         AND     1FH
332E C602     03434         ADD     A,2             ;Bypass GAT and HIT
3330 5F       03435         LD      E,A
3331 D5       03436         PUSH    DE              ;Save cyl/sect
3332 2A1626   03437         LD      HL,(BUFFER$)    ;P/u buffer addr
3335 CDA628   03438         CALL    RDSEC           ;Read the dir sect
3338 FE06     03439         CP      6               ;Proper errcod?
333A 3E11     03440         LD      A,17            ;Init "Dir read error
333C C29726   03441         JP      NZ,EXIT3
333F 78       03442         LD      A,B             ;Pt to dir record
3340 E6E0     03443         AND     0E0H
3342 5F       03444         LD      E,A             ;Pt to DIR lo order
3343 3A1726   03445         LD      A,(BUFFER$+1)   ;P/u hi order buffer pos
3346 57       03446         LD      D,A
3347 E1       03447         POP     HL
3348 C1       03448         POP     BC              ;P/u DEC & buffer of src
3349 C5       03449         PUSH    BC
334A E5       03450         PUSH    HL
334B 78       03451         LD      A,B             ;Get source DEC
334C E6E0     03452         AND     0E0H            ;  and pt to the direc
334E 6F       03453         LD      L,A             ;  of the current file
334F 262C     03454         LD      H,BUF2$<-8
3351 2C       03455         INC     L               ;Pt to mod flag byte
3352 E5       03456         PUSH    HL              ;Save source DIR+1
3353 CBB6     03457         RES     6,(HL)          ;Reset the MOD bit
3355 2D       03458         DEC     L               ;Point to DIR+0
3356 010500   03459         LD      BC,5            ;Transfer up thru
3359 EDB0     03460         LDIR                    ;  DIR+4
335B 7B       03461 BYSPACE LD      A,E             ;Point DE to the dest
335C C60B     03462         ADD     A,11            ;  password fields
335E 5F       03463         LD      E,A
335F 7D       03464         LD      A,L             ;Point HL to the source
3360 C60B     03465         ADD     A,11            ;  password fields
3362 6F       03466         LD      L,A
              03467         IF      @BLD631
3363 0E04     03468         LD      C,4             ;<631>(B==0) Move both pswds
              03469         ELSE
              03470         LD      BC,4            ;Move both pswds
              03471         ENDIF
3365 EDB0     03472         LDIR
3367 E1       03473         POP     HL              ;Get source DIR+1
3368 23       03474         INC     HL              ;Pt to year field
3369 1B       03475         DEC     DE              ;Pt to new year
336A 3AD82A   03476         LD      A,(NEWDT)       ;Old to new flag
336D FE04     03477         CP      4               ;If not old to new, done
336F 2007     03478         JR      NZ,NEWDT1
3371 7E       03479         LD      A,(HL)          ;Get old year
3372 E607     03480         AND     7
3374 12       03481         LD      (DE),A          ;Store in new year posn
3375 1B       03482         DEC     DE
3376 AF       03483         XOR     A               ;Not time
3377 12       03484         LD      (DE),A
3378 2A1626   03485 NEWDT1  LD      HL,(BUFFER$)    ;P/u buffer addr
337B D1       03486         POP     DE              ;Rcvr cyl/sect
337C CDA128   03487         CALL    WRSYS           ;Write back
              03488         IF      @BLD631
              03489 TOEXIT3:                        ;<631>
              03490         ENDIF
337F 3E12     03491         LD      A,18            ;Init "Dir write error
3381 C29726   03492         JP      NZ,EXIT3        ;Quit on error
              03493 ;
              03494 ;       Attempt to clear mod flag of source
              03495 ;
3384 3E00     03496 DOFIL12 LD      A,0             ;Test for write prot src
3386 B7       03497         OR      A               ;Which implies, can't
3387 C22D2F   03498         JP      NZ,SCNH1        ;  clear mod flags
338A C1       03499         POP     BC              ;P/u DEC of source
338B C5       03500         PUSH    BC
338C 78       03501         LD      A,B             ;Clear mod flag on source
338D E6E0     03502         AND     0E0H            ;Dir sector is resident
338F 3C       03503         INC     A               ;In a buffer at BUF2
3390 6F       03504         LD      L,A
3391 262C     03505         LD      H,BUF2$<-8
3393 CBB6     03506         RES     6,(HL)          ;Reset mod bit
3395 CD4E27   03507         CALL    PMTSRC          ;Set for source i/o
3398 FD5609   03508         LD      D,(IY+9)        ;P/u dir cyl
339B 78       03509         LD      A,B             ;Pt to dir sect of source
339C E61F     03510         AND     1FH
339E C602     03511         ADD     A,2             ;Adjust for GAT and HIT
33A0 5F       03512         LD      E,A
33A1 21002C   03513         LD      HL,BUF2$
33A4 CDA128   03514         CALL    WRSYS           ;Write it back
33A7 CA2D2F   03515         JP      Z,SCNH1         ;Back on good write
33AA FE0F     03516         CP      15              ;Accept only "write prot error
              03517         IF      @BLD631
33AC 20D1     03518         JR      NZ,TOEXIT3      ;<631>and quit
              03519         ELSE
              03520         LD      A,18            ;Any other, "Dir write error
              03521         JP      NZ,EXIT3        ;  and quit
              03522         ENDIF
33AE 3EFF     03523         LD      A,0FFH          ;Turn off clear mod
33B0 328533   03524         LD      (DOFIL12+1),A   ;  flag test
33B3          03525         @@LOGOT CCMOD$          ;"can't clear...
              03526         IFEQ    01H,1
33B3+21352A   03527         LD      HL,CCMOD$
              03528         ENDIF
33B6+3E0C     03529         LD      A,12
33B8+EF       03530         RST     40
33B9 C32D2F   03531         JP      SCNH1           ;Loop to next file
              03532 ;
              03533 ;       Routine to compare HL to DE, ret Z if equal
              03534 ;
33BC 7C       03535 CPHLDE  LD      A,H             ;Test H=D
33BD 92       03536         SUB     D
33BE C0       03537         RET     NZ              ;Back if not
33BF 7D       03538         LD      A,L             ;Test L=E
33C0 93       03539         SUB     E
33C1 C9       03540         RET                     ;Back with condition
              03541 ;
              03542 ;       Routine to construct filespec from name/ext
              03543 ;
33C2 3E3A     03544 MAKSPC  LD      A,':'           ;Prepare for drivespec
33C4 12       03545         LD      (DE),A
33C5 13       03546         INC     DE
33C6 D5       03547         PUSH    DE              ;Save pointer
33C7 3AAF27   03548         LD      A,(DSTDRV$+1)   ;P/u dest drive #
33CA E607     03549         AND     7               ;Cvrt to ASCII
33CC C630     03550         ADD     A,'0'
33CE 12       03551         LD      (DE),A          ; & stuff at filespec end
33CF 13       03552         INC     DE
33D0 3E03     03553         LD      A,3             ;Terminate with ETX
33D2 12       03554         LD      (DE),A
33D3 211826   03555         LD      HL,FCB1$        ;Copy source fcb to
33D6 113826   03556         LD      DE,FCB2$        ;  dest fcb
33D9 012000   03557         LD      BC,32
33DC EDB0     03558         LDIR
33DE D1       03559         POP     DE              ;Rcvr where source spec
33DF 3A4227   03560         LD      A,(SRCDRV$+1)   ;P/u source drive #
33E2 E607     03561         AND     7               ;Cvrt to ASCII
33E4 C630     03562         ADD     A,'0'
33E6 12       03563         LD      (DE),A          ;Stuff in dest fcb
33E7 C9       03564         RET
              03565 ;
              03566 ;       Routine to extract date from directory
              03567 ;
33E8 7E       03568 UNPACK  LD      A,(HL)          ;P/u DIR+1
33E9 E60F     03569         AND     0FH             ;Remove flags
33EB 1E00     03570         LD      E,0
33ED 57       03571         LD      D,A             ;Split mont to DE
33EE CB3A     03572         SRL     D
33F0 CB1B     03573         RR      E
33F2 23       03574         INC     HL              ;Pt to day
33F3 7E       03575         LD      A,(HL)
33F4 E6F8     03576         AND     0F8H            ;Mask off year
33F6 0F       03577         RRCA                    ;Bits 2-6
33F7 B3       03578         OR      E               ;Merge w/month
33F8 5F       03579         LD      E,A
33F9 3ADA2A   03580         LD      A,(DVTEST2)
33FC B7       03581         OR      A               ;New style year?
33FD 2009     03582         JR      NZ,NEWDT3       ;Go if so
33FF 7E       03583         LD      A,(HL)          ;get old year
3400 E607     03584         AND     7
3402 07       03585 SHFTD   RLCA
3403 07       03586         RLCA
3404 07       03587         RLCA                    ;To bits 3-7
3405 B2       03588         OR      D               ;Merge w/month
3406 57       03589         LD      D,A
3407 C9       03590         RET
3408 7D       03591 NEWDT3  LD      A,L
3409 C611     03592         ADD     A,17
340B 6F       03593         LD      L,A             ;DIR+19
340C 7E       03594         LD      A,(HL)
340D E61F     03595         AND     1FH
340F 18F1     03596         JR      SHFTD
              03597 ;
              03598 ;       Write the GAT back to disk
              03599 ;
3411 2E00     03600 WRGAT   LD      L,0             ;HL to start of buffer
3413 CDA128   03601         CALL    WRSYS           ;Write dir sector
3416 3E15     03602         LD      A,21            ;Init GAT write error
3418 C29726   03603         JP      NZ,EXIT3        ;  and quit on error
341B CDAB28   03604         CALL    VERSEC          ;Verify good write
341E FE06     03605         CP      6               ;Expect error 6
3420 3E14     03606         LD      A,20            ;Init GAT read error
3422 C29726   03607         JP      NZ,EXIT3        ;Quit on any other error
3425 C9       03608         RET
              03609 ;
              03610 ;       Write last buffer if needed
              03611 ;
3426 3A1726   03612 LSTBUF  LD      A,(BUFFER$+1)   ;P/u hi order buffer start
3429 BC       03613         CP      H               ;Are we there now?
342A C8       03614         RET     Z               ;Back if so, nothing loaded
342B 3E00     03615 LSTBUF1 LD      A,$-$           ;P/u last available page
342D BC       03616         CP      H               ;There now?
342E C8       03617         RET     Z               ;Already written if so
342F 44       03618         LD      B,H             ;Need to write to this page
3430 2A1626   03619         LD      HL,(BUFFER$)    ;P/u buffer start
3433 223B26   03620 LSTBUF2 LD      (FCB2$+3),HL    ;  and put in dest fcb
3436 CD9834   03621         CALL    GETDST          ;Prompt dest
3439          03622         @@VER                   ;Write with verify
3439+3E49     03623         LD      A,73
343B+EF       03624         RST     40
343C C29726   03625         JP      NZ,EXIT3        ;Quit on bad write
343F 24       03626         INC     H               ;Bump buffer page
3440 7C       03627         LD      A,H
3441 B8       03628         CP      B               ;At the end?
3442 20EF     03629         JR      NZ,LSTBUF2      ;Loop if more
3444 C9       03630         RET
              03631 ;
              03632 ;       Check if enough space on destination disk
              03633 ;
3445 78       03634 WRERN   LD      A,B             ;If ERN = 0, don't
3446 B1       03635         OR      C               ; write a ERN
3447 C8       03636         RET     Z
3448 0B       03637         DEC     BC              ;Adjust for 0 offset
3449 CD9834   03638         CALL    GETDST          ;Prompt dest
344C D5       03639         PUSH    DE              ;Save fcb pointer
344D          03640         @@POSN                  ;Position to end
344D+3E42     03641         LD      A,66
344F+EF       03642         RST     40
3450 2A1626   03643         LD      HL,(BUFFER$)    ;P/u buffer addr
3453 54       03644         LD      D,H             ;Construct a format
3454 5D       03645         LD      E,L             ;  sector of all X'E5's
3455 13       03646         INC     DE
3456 01FF00   03647         LD      BC,255
3459 36E5     03648         LD      (HL),0E5H
345B EDB0     03649         LDIR
345D D1       03650         POP     DE              ;Rcvr fcb ptr
345E          03651         @@VER                   ;Write with verify
345E+3E49     03652         LD      A,73
3460+EF       03653         RST     40
3461 C8       03654         RET     Z               ;Ret if no error
3462 FE1B     03655         CP      27              ;Disk Full?
3464 2026     03656         JR      NZ,NOTDF        ;No - quit on real error
3466          03657         @@REMOV                 ;Remove what can't fit
3466+3E39     03658         LD      A,57
3468+EF       03659         RST     40
3469 FDCB035E 03660         BIT     3,(IY+3)        ;Is this a rigid disk?
346D 280B     03661         JR      Z,NOTHARD       ;Go if not
346F FDCB0356 03662         BIT     2,(IY+3)        ;Shown as Removable?
3473 2805     03663         JR      Z,NOTHARD       ;Prompt disk swap if so
3475 21CF34   03664         LD      HL,FULDRV$      ;Prepare disk full error
3478 183A     03665         JR      DOING1
347A          03666 NOTHARD @@FLAGS
347A+3E65     03667         LD      A,101
347C+EF       03668         RST     40
347D FDCB126E 03669         BIT     5,(IY+'S'-'A')  ;Can't switch while DOing
3481 202E     03670         JR      NZ,DOING
3483 21DD34   03671         LD      HL,NEWDISK      ;"disk full, enter new...
3486 CD0728   03672         CALL    FLASH
3489 F601     03673         OR      1               ;Show switched dest
348B C9       03674         RET
348C          03675 NOTDF   EQU     $
348C C39726   03676         JP      EXIT3           ;Error exit
              03677 ;
348F C5       03678 GETSRC  PUSH    BC
3490 111826   03679         LD      DE,FCB1$        ;Pt to source FCB
3493 CD4E27   03680         CALL    PMTSRC          ;Show source is current
3496 C1       03681         POP     BC              ;  for disk I/O
3497 C9       03682         RET
              03683 ;
3498 C5       03684 GETDST  PUSH    BC
3499 113826   03685         LD      DE,FCB2$        ;Pt to dest FCB
349C CDBB27   03686         CALL    PMTDST          ;Show dest is current
349F C1       03687         POP     BC              ;  for disk I/O
34A0 C9       03688         RET
              03689 ;
34A1 FD5609   03690 HITRD   LD      D,(IY+9)        ;P/u dir cyl of source
34A4 1E01     03691         LD      E,1             ;Read HIT
34A6 210037   03692         LD      HL,HITBUF       ;Into HIT buffer
34A9 CDA628   03693         CALL    RDSEC
34AC FE06     03694         CP      6               ;Errcod correct?
34AE 3E16     03695         LD      A,16H           ;Init "HIT read error
34B0 C9       03696         RET                     ;Return w/condition
              03697 ;
34B1 211C35   03698 DOING   LD      HL,DOMSG
34B4 C3AF26   03699 DOING1  JP      EXIT4
              03700 ;
34B7 1D       03701 CPYFIL$ DB      29,'Copying file: ',3
     43 6F 70 79 69 6E 67 20
     66 69 6C 65 3A 20 03 
34C7 42       03702 QUERY   DB      'Backup ',3
     61 63 6B 75 70 20 03 
34CF 44       03703 FULDRV$ DB      'Disk is full ',CR
     69 73 6B 20 69 73 20 66
     75 6C 6C 20 0D 
34DD 44       03704 NEWDISK DB      'Disk is full - Insert new formatted '
     69 73 6B 20 69 73 20 66
     75 6C 6C 20 2D 20 49 6E
     73 65 72 74 20 6E 65 77
     20 66 6F 72 6D 61 74 74
     65 64 20 
3501 64       03705         DB      'destination disk, ',29,3
     65 73 74 69 6E 61 74 69
     6F 6E 20 64 69 73 6B 2C
     20 3C 45 4E 54 45 52 3E
     1D 03 
351C 44       03706 DOMSG   DB      'Disk is full! - Can''t switch '
     69 73 6B 20 69 73 20 66
     75 6C 6C 21 20 2D 20 43
     61 6E 27 74 20 73 77 69
     74 63 68 20 
3539 77       03707         DB      'while  in effect',CR
     68 69 6C 65 20 3C 44 4F
     3E 20 69 6E 20 65 66 66
     65 63 74 0D 
354E 20       03708 SIZBIG$ DB      '  File is larger than destination '
     20 46 69 6C 65 20 69 73
     20 6C 61 72 67 65 72 20
     74 68 61 6E 20 64 65 73
     74 69 6E 61 74 69 6F 6E
     20 
3570 63       03709         DB      'capacity - backup is bypassed',CR
     61 70 61 63 69 74 79 20
     2D 20 62 61 63 6B 75 70
     20 69 73 20 62 79 70 61
     73 73 65 64 0D 
358E 43       03710 NOTSYS$ DB      'Can''t create SYSTEM disk - '
     61 6E 27 74 20 63 72 65
     61 74 65 20 53 59 53 54
     45 4D 20 64 69 73 6B 20
     2D 20 
35A9 64       03711         DB      'directory slots in use',CR
     69 72 65 63 74 6F 72 79
     20 73 6C 6F 74 73 20 69
     6E 20 75 73 65 0D 
35C0 7D       03712 QMARK$  DB      '} ? ',3
     20 3F 20 03 
35C5 4A       03713 MONTBL  DM      'JanFebMarAprMayJunJulAugSepOctNovDec'
     61 6E 46 65 62 4D 61 72
     41 70 72 4D 61 79 4A 75
     6E 4A 75 6C 41 75 67 53
     65 70 4F 63 74 4E 6F 76
     44 65 63 
35E9 A2       03714 SYSDEC  DB      0A2H,0C4H,2EH,2FH,2CH,2DH,2AH,2BH
     C4 2E 2F 2C 2D 2A 2B 
35F1 28       03715         DB      28H,29H,26H,27H,27H,0A7H,26H,0A6H
     29 26 27 27 A7 26 A6 
              03716 ;
35F9 00       03717         DC      64,0            ;PATCH space
     00 00 00 00 00 00 00 00
     00 00 00 00 00 00 00 00
     00 00 00 00 00 00 00 00
     00 00 00 00 00 00 00 00
     00 00 00 00 00 00 00 00
     00 00 00 00 00 00 00 00
     00 00 00 00 00 00 00 00
     00 00 00 00 00 00 00 
              03718 ;
3700          03719         ORG     $<-8+1<+8
3700          03720 HITBUF  DS      256
              03721 ;
              03724 ;
0A00          03725 CLSSIZ  EQU     $-BACKUP
              03726 ;
              03727 ;       Establish PC for rest of BACKUP initialization
              03728 ;
4200          03729         ORG     CORE$+MIRSIZ+CLSSIZ
4200          03730         LORG    $               ;No offset here
              03731 ;
              03732 ;       Shift in Mirror or By-file module
              03733 ;
4200 3E00     03734 CLSTST  LD      A,0             ;Non-zero if any option
4202 B7       03735         OR      A
4203 C21342   03736         JP      NZ,MVBYCLS      ;Bypass if special
4206 210032   03737         LD      HL,MIRBU        ;Move in standard code
4209 11002E   03738         LD      DE,BACKUP
420C 010006   03739         LD      BC,MIRSIZ
420F EDB0     03740         LDIR
4211 1846     03741         JR      SETBFR
              03742 ;
4213 3A0328   03743 MVBYCLS LD      A,(SXORD+1)     ;Restrict by class
4216 B7       03744         OR      A               ; if a single drive
4217 2009     03745         JR      NZ,MVBYC1
4219 213745   03746         LD      HL,CLS1DB$      ;Can't by class on 1 drv
421C          03747 MOVNOT  @@DSPLY                 ;Display the error
              03748         IFEQ    00H,1
              03749         LD      HL,
              03750         ENDIF
421C+3E0A     03751         LD      A,10
421E+EF       03752         RST     40
421F C3AC26   03753         JP      ABRTBU          ;  and abort the backup
              03754 ;
4222 3ACA26   03755 MVBYC1  LD      A,(XPARM$+1)    ;By class backup requires
4225 B7       03756         OR      A               ; either non (X) or residency
4226 2826     03757         JR      Z,MVBYC2        ; of SYS 2, 3, 10, and 12
4228 110000   03758 RESLOC  LD      DE,$-$          ;Store location (RES$)
422B 7B       03759         LD      A,E
422C B2       03760         OR      D               ;Check if there
422D 216345   03761         LD      HL,RESREQ$      ;Init "Must be resident
4230 28EA     03762         JR      Z,MOVNOT        ;Error if not in use
4232 D5       03763         PUSH    DE              ;OK, it's in use,
4233 DDE1     03764         POP     IX              ;  are all modules
4235 DD7E09   03765         LD      A,(IX+2*2+5)    ;  present and accounted
4238 B7       03766         OR      A               ;SYS2 resident?
4239 28E1     03767         JR      Z,MOVNOT
423B DD7E0B   03768         LD      A,(IX+3*2+5)    ;Is SYS3 resident?
423E B7       03769         OR      A
423F 28DB     03770         JR      Z,MOVNOT
4241 DD7E19   03771         LD      A,(IX+10*2+5)   ;Is SYS10 resident?
4244 B7       03772         OR      A
4245 28D5     03773         JR      Z,MOVNOT
4247 DD7E1D   03774         LD      A,(IX+12*2+5)   ;Is SYS12 resident?
424A B7       03775         OR      A
424B CA1C42   03776         JP      Z,MOVNOT
424E 210038   03777 MVBYC2  LD      HL,CLSBU        ;Move in special code
4251 11002E   03778         LD      DE,BACKUP
4254 01000A   03779         LD      BC,CLSSIZ
4257 EDB0     03780         LDIR
4259 1B       03781 SETBFR  DEC     DE              ;Set the buffer
425A 14       03782         INC     D               ;  one page above the code
425B 1E00     03783         LD      E,0
425D ED531626 03784         LD      (BUFFER$),DE    ;  and save starting posn
4261 C3002E   03785         JP      BACKUP
              03786 ;
              03787 ;       Routine to get password
              03788 ;
4264 CD6D42   03789 GETMPW  CALL    GMPW1
4267 3EE4     03790         LD      A,0E4H          ;Get SYS2 for hash
4269 EF       03791         RST     28H
              03792 ;
426A 3E84     03793 GETSYS2 LD      A,84H           ;Load SYS2, no function
426C EF       03794         RST     28H
              03795 ;
426D 7A       03796 GMPW1   LD      A,D             ;Pswd entered as parm?
426E B3       03797         OR      E
426F 281A     03798         JR      Z,GMPW3         ;Prompt if not
4271 21002D   03799         LD      HL,BUF3$
4274 E5       03800         PUSH    HL
4275 0608     03801         LD      B,8
4277 1A       03802 GMPW2   LD      A,(DE)          ;P/u pswd character
4278 FE0D     03803         CP      CR              ;At end of line?
427A 282A     03804         JR      Z,GMPW4         ;Space out if yes
427C FE2C     03805         CP      ','             ;Comma separator?
427E 2826     03806         JR      Z,GMPW4
4280 FE22     03807         CP      '"'             ;Closing quote?
4282 2822     03808         JR      Z,GMPW4
4284 13       03809         INC     DE
4285 77       03810         LD      (HL),A          ;Xfer the character
4286 23       03811         INC     HL
4287 10EE     03812         DJNZ    GMPW2
4289 1820     03813         JR      GMPW5
              03814 ;
              03815 ;       Not entered as parm, grab from keyboard
              03816 ;
428B          03817 GMPW3   @@DSPLY                 ;Display request
              03818         IFEQ    00H,1
              03819         LD      HL,
              03820         ENDIF
428B+3E0A     03821         LD      A,10
428D+EF       03822         RST     40
428E 010008   03823         LD      BC,8<8          ;Max 8 chars input
4291 21002D   03824         LD      HL,BUF3$        ;Point to buffer
4294 E5       03825         PUSH    HL
4295          03826         @@KEYIN                 ;Grab password
4295+3E09     03827         LD      A,9
4297+EF       03828         RST     40
4298 DAAC26   03829         JP      C,ABRTBU        ;Abort on BREAK
429B EB       03830         EX      DE,HL           ;Buf start to DE
429C 2600     03831         LD      H,0             ;Buf length to HL
429E 68       03832         LD      L,B
429F 19       03833         ADD     HL,DE           ;Pt to 1st unused pos
42A0 3E08     03834         LD      A,8             ;Calculate spaces needed
42A2 90       03835         SUB     B
42A3 2806     03836         JR      Z,GMPW5         ;Don't put any if 8 input
42A5 47       03837         LD      B,A             ;Set space counter
42A6 3620     03838 GMPW4   LD      (HL),' '
42A8 23       03839         INC     HL
42A9 10FB     03840         DJNZ    GMPW4
42AB E1       03841 GMPW5   POP     HL              ;Rcvr pointer to buf
42AC E5       03842         PUSH    HL
42AD 0608     03843         LD      B,8             ;Loop thru field
42AF 7E       03844 GMPW6   LD      A,(HL)
42B0 FE61     03845         CP      'a'
42B2 3806     03846         JR      C,GMPW7
42B4 FE7B     03847         CP      'z'+1
42B6 3002     03848         JR      NC,GMPW7
42B8 CBAE     03849         RES     5,(HL)          ;Lc -> UC
42BA 23       03850 GMPW7   INC     HL
42BB 10F2     03851         DJNZ    GMPW6
42BD D1       03852         POP     DE              ;Rcvr pointer to start
42BE C9       03853         RET
              03854 ;
              03855 ;       Check a drive for availability
              03856 ;
              03857 CKDRV
42BF 3AFC27   03858         LD      A,(CURDSK+1)    ;P/u drive spec
42C2 4F       03859         LD      C,A             ;Place in C
42C3 FD7E00   03860         LD      A,(IY+0)        ;P/u drive vector
42C6 FEC3     03861         CP      0C3H            ;Ck for enabled
42C8 C25E43   03862         JP      NZ,CKDR5        ;Bypass if disabled
42CB E5       03863         PUSH    HL
42CC D5       03864         PUSH    DE
42CD FD7E06   03865         LD      A,(IY+6)        ;Make sure the current
42D0 FDBE05   03866         CP      (IY+5)          ;  cylinder count is in range
42D3 D2DC42   03867         JP      NC,CKDRV1       ;Go if in range
42D6 CD9228   03868         CALL    RESTOR          ;Restore drive
42D9 C26B43   03869         JP      NZ,CKDR7A       ;Go if error
              03870 ;
42DC FD5605   03871 CKDRV1  LD      D,(IY+5)        ;P/u current track
42DF 1E00     03872         LD      E,0             ;Set for sector 0
42E1          03873         @@SEEK                  ;Set track info to FDC
42E1+3E2E     03874         LD      A,46
42E3+EF       03875         RST     40
42E4 C26B43   03876         JP      NZ,CKDR7A       ;Go if error
42E7 CD9728   03877         CALL    RSELCT          ;Wait until not busy
42EA 207F     03878         JR      NZ,CKDR7A       ;Not there - ret NZ
42EC FDCB035E 03879         BIT     3,(IY+3)        ;If hard drive, bypass
42F0 2024     03880         JR      NZ,CKDR2B       ;  GAT data update
42F2 FDCB0466 03881         BIT     4,(IY+4)        ;If "ALIEN" by pass
42F6 201E     03882         JR      NZ,CKDR2B       ;  test of index pulses
              03883         IF      @MOD4
42F8 3E09     03884         LD      A,09            ;Set MSB of count down
42FA F3       03885         DI
              03886         ENDIF
              03887         IF      @MOD2
              03888         LD      A,20
              03889         ENDIF
42FB 320743   03890 INTRON  LD      (CDCNT+1),A     ;Store in 'LD H' instruction
42FE 212000   03891         LD      HL,0020H        ;Set up count (short)
              03892 ;
              03893 ;       Test for diskette in drive & rotating
              03894 ;
4301 CD5F43   03895 CKDR1   CALL    INDEX           ;Test index pulse
4304 20FB     03896         JR      NZ,CKDR1        ;Jump on index
4306 2600     03897 CDCNT   LD      H,00H           ;CKDRV counter (long)
              03898                                 ;Count set from above
4308 CD5F43   03899 CKDR2   CALL    INDEX           ;Test index pulse
430B 28FB     03900         JR      Z,CKDR2         ;Jump on no index
              03901         IF      @MOD4
430D FB       03902         EI                      ;OK for INTs now
              03903         ENDIF
430E 212000   03904         LD      HL,0020H        ;Index off wait (short)
4311 CD5F43   03905 CKDR2A  CALL    INDEX
4314 20FB     03906         JR      NZ,CKDR2A       ;Jump on index
              03907 ;
              03908 ;       Diskette is rotating
              03909 ;
4316 F5       03910 CKDR2B  PUSH    AF              ;Save FDC status
4317 FD5609   03911         LD      D,(IY+9)
431A 210047   03912         LD      HL,CKDRBUF      ;Point to HIT buffer
431D 5D       03913         LD      E,L             ;Sector 0 for GAT
431E          03914         @@RDSSC                 ;Read the GAT
431E+3E55     03915         LD      A,85
4320+EF       03916         RST     40
4321 2047     03917         JR      NZ,CKDR7        ;Jump on error
              03918 ;
              03919 ;       Update YFLAG$ for year type
              03920 ;
4323 ED5BCC47 03921         LD      DE,(CKDRBUF+0CCH)       ;Gat type byte
4327 79       03922         LD      A,C             ;Drive # to A
4328 07       03923         RLCA                    ;Rotate it into posn
4329 07       03924         RLCA                    ;For SET x,(hl)
432A 07       03925         RLCA                    ; opcode
432B F6C4     03926         OR      0C4H            ;For SET opcode
432D CB5A     03927         BIT     3,D             ;Is disk new type?
432F 2002     03928         JR      NZ,FIXBIT       ;Go if so
4331 EE40     03929         XOR     40H             ;Else make RES opcode
4333 323A43   03930 FIXBIT  LD      (BIT1),A        ;Save opcode
4336 210000   03931         LD      HL,$-$          ;Pt to year type flag
4337          03932 YFLAG1  EQU     $-2             ;YFLAG$ locn
4339 CB       03933         DB      0CBH            ;Either SET or RES
433A 00       03934 BIT1    DB      0
433B FDCB035E 03935         BIT     3,(IY+3)        ;If rigid drive,
433F 2012     03936         JR      NZ,CKDR3        ; bypass the rest
4341 3E22     03937         LD      A,22H           ;Add offset
4343 83       03938         ADD     A,E
4344 FD7706   03939         LD      (IY+6),A        ;Max track # to DCT
4347 FDCB04AE 03940         RES     5,(IY+4)        ;Set to side 0
434B CB6A     03941         BIT     5,D             ;Test double sided
434D 2804     03942         JR      Z,CKDR3         ;Jump if only single
434F FDCB04EE 03943         SET     5,(IY+4)        ;Set for side 2
4353 F1       03944 CKDR3   POP     AF              ;Recover FDC status
4354 07       03945 CKDR3A  RLCA                    ;Shift write prot to 7
4355 FDB603   03946         OR      (IY+3)          ;Merge Soft WP bit
4358 E680     03947         AND     80H             ;Strip all but 7
435A 87       03948         ADD     A,A             ;Write prot to carry flg
              03949 ;
435B          03950 CKDR4   EQU     $
435B FB       03951         EI
435C D1       03952         POP     DE
435D E1       03953         POP     HL
435E C9       03954 CKDR5   RET
435F 7C       03955 INDEX   LD      A,H             ;Count down tries
4360 B5       03956         OR      L
4361 2807     03957         JR      Z,CKDR7         ;Error if counted out
4363 2B       03958         DEC     HL              ;Dec the count
4364 CD9728   03959         CALL    RSELCT          ;Check for index pulse
4367 CB4F     03960         BIT     1,A             ;Test index
4369 C9       03961         RET                     ;Back with condition
436A F1       03962 CKDR7   POP     AF
436B 3E08     03963 CKDR7A  LD      A,8             ;Set Device not avail
436D B7       03964         OR      A               ;Set NZ ret
436E 18EB     03965         JR      CKDR4           ;Leave
              03966 ;
              03967 ;       Data area
              03968 ;
              03969 PRMTBL$
0080          03970 VAL     EQU     80H
0040          03971 SW      EQU     40H
0020          03972 STR     EQU     20H
0010          03973 SGL     EQU     10H
4370 D3       03974         DB      'S'!80H
4371 63       03975         DB      SW!STR!3,'MPW',0
     4D 50 57 00 
0005          03976 MPWRSP  EQU     $-PRMTBL$-1
4376 1C31     03977         DW      MPWPRM
4378 73       03978         DB      SW!STR!SGL!3,'SYS',0
     53 59 53 00 
000C          03979 SYSRSP  EQU     $-PRMTBL$-1
437D 272F     03980         DW      SYSPRM+1
437F 53       03981         DB      SW!SGL!3,'INV',0
     49 4E 56 00 
0013          03982 INVRSP  EQU     $-PRMTBL$-1
4384 302F     03983         DW      INVPRM+1
4386 53       03984         DB      SW!SGL!3,'MOD',0
     4D 4F 44 00 
001A          03985 MODRSP  EQU     $-PRMTBL$-1
438B 1226     03986         DW      MODPRM$
438D 55       03987         DB      SW!SGL!5,'QUERY',0
     51 55 45 52 59 00 
0023          03988 QRSP    EQU     $-PRMTBL$-1
4394 1426     03989         DW      QPARM$
4396 41       03990         DB      SW!1,'X',0
     58 00 
0028          03991 XRSP    EQU     $-PRMTBL$-1
4399 CA26     03992         DW      XPARM$+1
439B 34       03993         DB      STR!SGL!4,'DATE',0
     44 41 54 45 00 
0030          03994 DATRSP  EQU     $-PRMTBL$-1
43A1 EF2E     03995         DW      DATPRM+1
43A3 53       03996         DB      SW!SGL!3,'NEW',0
     4E 45 57 00 
0037          03997 NEWRSP  EQU     $-PRMTBL$-1
43A8 0E26     03998         DW      NEWPRM$
43AA 53       03999         DB      SW!SGL!3,'OLD',0
     4F 4C 44 00 
003E          04000 OLDRSP  EQU     $-PRMTBL$-1
43AF 1026     04001         DW      OLDPRM$
43B1 00       04002         NOP
              04003 ;
43B2 53       04004 NOINDO$ DB      'Single drive backup invalid during'
     69 6E 67 6C 65 20 64 72
     69 76 65 20 62 61 63 6B
     75 70 20 69 6E 76 61 6C
     69 64 20 64 75 72 69 6E
     67 
43D4 20       04005         DB      '  processing',CR
     3C 44 4F 3E 20 70 72 6F
     63 65 73 73 69 6E 67 0D
43E5 44       04006 NOFMT$  DB      'Destination disk not formatted'
     65 73 74 69 6E 61 74 69
     6F 6E 20 64 69 73 6B 20
     6E 6F 74 20 66 6F 72 6D
     61 74 74 65 64 
4403 20       04007         DB      ' - Backup aborted',CR
     2D 20 42 61 63 6B 75 70
     20 61 62 6F 72 74 65 64
     0D 
4415 42       04008 HELLO$  DB      'BACKUP'
     41 43 4B 55 50 
441B          04009 *GET    CLIENT:3
              04010 ;CLIENT/ASM - File to establish sign-on headers
              04011 ; and version numbers.
              04012 ;
              04013 ; EACH STRING SHOULD CONTAIN ONLY 63 CHARACTERS !!
              04014 ;
              04015         IF      @BLD631
              04016 ;                12345678901234567890123456789012345678901234567890
441B 20       04017         DB      ' - 6.3.1 - Copyright 1982/83/84/86/90 by MISOSYS, ';<631>
     2D 20 36 2E 33 2E 31 20
     2D 20 43 6F 70 79 72 69
     67 68 74 20 31 39 38 32
     2F 38 33 2F 38 34 2F 38
     36 2F 39 30 20 62 79 20
     4D 49 53 4F 53 59 53 2C
     20 
444D 49       04018         DB      'Inc.,       ',10       ;<631>
     6E 63 2E 2C 20 20 20 20
     20 20 20 0A 
              04019         ELSE
              04020         DB      ' - 6.3.0 - Copyright 1982/83/84/86 by Logical Syst'
              04021         DB      'ems, Inc.   ',10
              04022         ENDIF
              04023 ;
              04024 ;       DB      'All Rights Reserved. Licensed 1982/83/84 to Tandy '
              04025 ;       DB      'Corporation.',10,13
              04026 ;
              04027 ;       DB      'All Rights Reserved. Beta-TEST Level/AD, DO NOT DI'
              04028 ;       DB      'STRIBUTE !! ',10,13
              04029 ;       DB      'All Rights reserved by LSI, 8970 N. 55th St. Milwa'
              04030 ;       DB      'ukee, Wisc. ',10,13
445A 41       04031         DB      'All Rights Reserved. Unauthorized duplication is p'
     6C 6C 20 52 69 67 68 74
     73 20 52 65 73 65 72 76
     65 64 2E 20 55 6E 61 75
     74 68 6F 72 69 7A 65 64
     20 64 75 70 6C 69 63 61
     74 69 6F 6E 20 69 73 20
     70 
448C 72       04032         DB      'rohibited.  ',10,13
     6F 68 69 62 69 74 65 64
     2E 20 20 0A 0D 
449A 43       04033 LDOS$   DB      'Command executes only from DOS Ready',CR
     6F 6D 6D 61 6E 64 20 65
     78 65 63 75 74 65 73 20
     6F 6E 6C 79 20 66 72 6F
     6D 20 44 4F 53 20 52 65
     61 64 79 0D 
44BF 50       04034 PRMERR$ DB      'Parameter error',CR
     61 72 61 6D 65 74 65 72
     20 65 72 72 6F 72 0D 
44CF 53       04035 SRCNUM$ DB      'Source drive number ?        ',3
     6F 75 72 63 65 20 64 72
     69 76 65 20 6E 75 6D 62
     65 72 20 3F 20 20 20 20
     20 20 20 20 03 
44ED 44       04036 DSTNUM$ DB      'Destination drive number ?   ',3
     65 73 74 69 6E 61 74 69
     6F 6E 20 64 72 69 76 65
     20 6E 75 6D 62 65 72 20
     3F 20 20 20 03 
450B 4E       04037 NODAT$  DB      'No date established',CR
     6F 20 64 61 74 65 20 65
     73 74 61 62 6C 69 73 68
     65 64 0D 
451F 42       04038 CLASS$  DB      'Backup by class invoked',CR
     61 63 6B 75 70 20 62 79
     20 63 6C 61 73 73 20 69
     6E 76 6F 6B 65 64 0D 
4537 0A       04039 CLS1DB$ DB      LF,'Single drive BACKUP invalid by files',CR
     53 69 6E 67 6C 65 20 64
     72 69 76 65 20 42 41 43
     4B 55 50 20 69 6E 76 61
     6C 69 64 20 62 79 20 66
     69 6C 65 73 0D 
              04040         IF      .NOT.SMALL
455D 53       04041 RES$    DB      'SYSRES'        ;Terminate with LF
     59 53 52 45 53 
4563 0A       04042 RESREQ$ DB      LF,'This backup requires residency '
     54 68 69 73 20 62 61 63
     6B 75 70 20 72 65 71 75
     69 72 65 73 20 72 65 73
     69 64 65 6E 63 79 20 
4583 6F       04043         DB      'of SYS''s: 2, 3, 10 & 12.',CR
     66 20 53 59 53 27 73 3A
     20 32 2C 20 33 2C 20 31
     30 20 26 20 31 32 2E 0D
              04044         ENDIF
              04045         IF      SMALL
              04046 RESREQ$ DB      'Backup by class requires the us'
              04047         DB      'e of a SYSTEM diskette!       ',CR
              04048         ENDIF
459C 42       04049 RECON$  DB      'Backup-reconstruct invoked',CR
     61 63 6B 75 70 2D 72 65
     63 6F 6E 73 74 72 75 63
     74 20 69 6E 76 6F 6B 65
     64 0D 
45B7 43       04050 MIRROR$ DB      'Cylinder count differs - '
     79 6C 69 6E 64 65 72 20
     63 6F 75 6E 74 20 64 69
     66 66 65 72 73 20 2D 20
45D0 41       04051         DB      'Attempt mirror-image backup ? ',3
     74 74 65 6D 70 74 20 6D
     69 72 72 6F 72 2D 69 6D
     61 67 65 20 62 61 63 6B
     75 70 20 3F 20 03 
45EF 4D       04052 PMTMPW$ DB      'Master password ?      ',3
     61 73 74 65 72 20 70 61
     73 73 77 6F 72 64 20 3F
     20 20 20 20 20 20 03 
4607 1F       04053 MAXDAYS DB      31,28,31,30,31,30,31,31,30,31,30,31
     1C 1F 1E 1F 1E 1F 1F 1E
     1F 1E 1F 
4613 42       04054 BADFMT$ DB      'Bad date format',CR
     61 64 20 64 61 74 65 20
     66 6F 72 6D 61 74 0D 
4700          04055 CKDRBUF EQU     $<-8+1<8
4623          04056         DS      256
4723          04057 LAST    EQU     $
              04058 ;
2E00          04060         END     BACKUP
2E00 is the transfer address
00000 Total errors


[Copyright 1999,2002 Frank Durda IV, All Rights Reserved.
Mirroring of any material on this page in any form is expressly prohibited.
The official web site for this material is:  http://nemesis.lonestar.org
Contact this address for use clearances: clearance at nemesis.lonestar.org
Comments and queries to this address: web_software_2011 at nemesis.lonestar.org]

Valid HTML 4.01!