[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]