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