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 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 C62