LS-DOS 6.3.1 - BACKUP Assembly Listing (HTML format version)
[Copyright 1999,2002 Frank Durda IV, All Rights Reserved.
Mirroring of any material on this page in any form is expressly prohibited.
The official web site for this material is: http://nemesis.lonestar.org
Contact this address for use clearances: clearance at nemesis.lonestar.org
Comments and queries to this address: web_software at nemesis.lonestar.org]
MISOSYS EDAS-4.3 04/19/99 21:02:20 BACKUP - LS-DOS 6.3 Page 00001
00001 ;BACKUP/ASM - File/disk copy utility
00003 ;
0000 00004 *GET BUILDVER:3
00005 ;
00006 ; Buildver/asm is a bit of a kludge since not all utilities can load
00007 ; equates from LDOS60 and still compile. LOWCORE and everybody else
00008 ; relies on this setting, and it eventually ends up in LDOS60/EQU
00009 ; for programs that can use that.
00010 ;
FFFF 00011 @BLD631 EQU -1 ;<631>Build 631 distribution (LEVEL 1B)
00012 ; These switches activate patches made since the 1B release.
00013 ; It is important that all earlier patches be enabled when a higher
00014 ; patch is enabled.
00015 ; Patches C thru F were published in TMQ IV.iv, page 32 (NOTE: the
00016 ; patch addresses listed for SPOOL in SPOOL1/FIX are 19H high.)
FFFF 00017 @BLD631C EQU -1 ;<631>Apply 1C patches (SETKI)
FFFF 00018 @BLD631D EQU -1 ;<631>Apply 1D patches (DIR)
FFFF 00019 @BLD631E EQU -1 ;<631>Apply 1E patches (DIR & MEMDISK/DCT)
FFFF 00020 @BLD631F EQU -1 ;<631>Apply 1F patches (SPOOL)
00021 ; Patches G and H were published in TMQ V.i, pages 10 and 18/19.
FFFF 00022 @BLD631G EQU -1 ;<631>Apply 1G patches (//KEYIN,DIR,DO *)
FFFF 00023 @BLD631H EQU -1 ;<631>Apply 1H patches (MEMORY)
00024 ;
00025 ;End of BUILDVER/ASM
0000 00026 *GET BACKUP1:3
00027 ;BACKUP1/ASM - Backup utility module
00029 ;
0000 00030 SMALL EQU 0
0000 00031 FMT EQU 0
000A 00032 LF EQU 10
000D 00033 CR EQU 13
0060 00034 LOCK EQU 60H
00CC 00035 TKCAP EQU 0CCH
00CE 00036 PSWD EQU 0CEH
00D8 00037 DAT EQU 0D8H
00E0 00038 AUTO EQU 0E0H
1111 00039 FCNT1 EQU 1111H
1555 00040 FCNT2 EQU 1555H
42E0 00041 PASSWORD EQU 42E0H
00042 ;
0000 00043 *GET SVCMAC:3 ;SVC Macro equivalents
00044 ;SVCMAC/ASM - LS-DOS Version VI
00045 *LIST OFF
00437 *LIST ON
0000 00439 *GET COPYCOM:3 ;Copyright message
00440 ; COPYCOM - File for Copyright COMment block
00441 ;
0000 00442 *GET BUILDVER/ASM:3
00443 ;
00444 ; Buildver/asm is a bit of a kludge since not all utilities can load
00445 ; equates from LDOS60 and still compile. LOWCORE and everybody else
00446 ; relies on this setting, and it eventually ends up in LDOS60/EQU
00447 ; for programs that can use that.
00448 ;
FFFF 00449 @BLD631 EQU -1 ;<631>Build 631 distribution (LEVEL 1B)
00450 ; These switches activate patches made since the 1B release.
00451 ; It is important that all earlier patches be enabled when a higher
00452 ; patch is enabled.
00453 ; Patches C thru F were published in TMQ IV.iv, page 32 (NOTE: the
00454 ; patch addresses listed for SPOOL in SPOOL1/FIX are 19H high.)
FFFF 00455 @BLD631C EQU -1 ;<631>Apply 1C patches (SETKI)
FFFF 00456 @BLD631D EQU -1 ;<631>Apply 1D patches (DIR)
FFFF 00457 @BLD631E EQU -1 ;<631>Apply 1E patches (DIR & MEMDISK/DCT)
FFFF 00458 @BLD631F EQU -1 ;<631>Apply 1F patches (SPOOL)
00459 ; Patches G and H were published in TMQ V.i, pages 10 and 18/19.
FFFF 00460 @BLD631G EQU -1 ;<631>Apply 1G patches (//KEYIN,DIR,DO *)
FFFF 00461 @BLD631H EQU -1 ;<631>Apply 1H patches (MEMORY)
00462 ;
00463 ;End of BUILDVER/ASM
00464 IF @BLD631
00466 ELSE
00467 COM '<*(C) 1982,3,4,6 by LSI*>'
00468 ENDIF
00469 ;
2600 00470 ORG 2600H
00471 ;
00472 IF @MOD2
00473 BOOTST$ DB 03H
00474 ENDIF
00475 IF @MOD4
2600 9D 00476 BOOTST$ DB 9DH ;Boot step rate ptr
00477 ENDIF
00478 ;
00479 ; Data area
00480 ;
2601 00 00481 FTFLG$ DB 0
2602 20 00482 SPCFLD$ DC 11,' '
20 20 20 20 20 20 20 20
20 20
260D 00 00483 MFLG$ DB 0
260E 0000 00484 NEWPRM$ DW 0
2610 0000 00485 OLDPRM$ DW 0
2612 0000 00486 MODPRM$ DW 0
2614 0000 00487 QPARM$ DW 0
2616 0000 00488 BUFFER$ DW 0
2618 00489 FCB1$ DS 32
2638 00490 FCB2$ DS 32
2658 00491 FCB3$ DS 32
2658 00492 LILBUF$ EQU FCB3$
2678 00493 DATFLD$ DS 8
2680 00494 FMPAKD$ DS 2
2682 00495 TOPAKD$ DS 2
2684 00496 CLSFLG$ DS 1
00497 ;
00498 IF @MOD2
00499 ;
00500 SUBTTL ''
00501 ;
00503 ENDIF
00504 ;
00505 ;
00506 ; Normal exit - no errors
00507 ;
2685 216B2A 00508 EXIT1 LD HL,BUCAO$ ;"Backup complete...
2688 E5 00509 PUSH HL ;Save msg ptr
2689 CDC926 00510 CALL EXIT5 ;Ck if prompt for sys disk
268C E1 00511 POP HL
268D 00512 @@DSPLY
00513 IFEQ 00H,1
00514 LD HL,
00515 ENDIF
268D+3E0A 00516 LD A,10
268F+EF 00517 RST 40
2690 182B 00518 JR EXIT
00519 ;
00520 ; Error exit
00521 ;
2692 3E11 00522 DIRERR LD A,17 ;Init "Dir read error
2694 01 00523 DB 1 ;Ignore next inst
2695 3E20 00524 EXIT2 LD A,20H ;Init illegal drive #
2697 F5 00525 EXIT3 PUSH AF
2698 0E0D 00526 LD C,CR ;Terminate pending line
269A 00527 @@DSP
269A+3E02 00528 LD A,2
269C+EF 00529 RST 40
269D CDC926 00530 CALL EXIT5 ;Get system disk if needed
26A0 F1 00531 POP AF
26A1 6F 00532 LD L,A ;Error code to HL
26A2 2600 00533 LD H,0
26A4 F6C0 00534 OR 0C0H ;Set short,return
26A6 4F 00535 LD C,A ;Error to C
26A7 00536 @@ERROR ; for error dsply
26A7+3E1A 00537 LD A,26
26A9+EF 00538 RST 40
26AA 180E 00539 JR ERREXIT
00540 ;
00541 ; Abort exit
00542 ;
26AC 00543 BREAK EQU $
26AC 217C2A 00544 ABRTBU LD HL,ABRTBU$ ;"Backup aborted
26AF E5 00545 EXIT4 PUSH HL ;Save msg ptr
26B0 CDC926 00546 CALL EXIT5 ;Get system disk if needed
26B3 E1 00547 POP HL
26B4 00548 @@LOGOT ;Display the message
00549 IFEQ 00H,1
00550 LD HL,
00551 ENDIF
26B4+3E0C 00552 LD A,12
26B6+EF 00553 RST 40
26B7 21FFFF 00554 LD HL,-1 ;Set error return code
26BA 22C126 00555 ERREXIT LD (RETCOD),HL
26BD 00556 EXIT EQU $
26BD 310000 00557 SPSAV LD SP,$-$ ;P/u the stack pointer
26C0 210000 00558 LD HL,0 ;Set the return code
26C1 00559 RETCOD EQU $-2
26C3 00560 @@CKBRKC ;Check and clear break
26C3+3E6A 00561 LD A,106
26C5+EF 00562 RST 40
26C6 00563 @@EXIT ;Can't return from BACKUP
26C6+3E16 00564 LD A,22
26C8+EF 00565 RST 40
00566 ;
00567 ; Get system disk if needed & zero memory used
00568 ;
26C9 00569 EXIT5 EQU $
26C9 110000 00570 XPARM$ LD DE,0 ;P/u prompt zero drive
26CC 1C 00571 INC E ;Ck for entry
26CD 2009 00572 JR NZ,EXIT5A
26CF AF 00573 XOR A
26D0 320328 00574 LD (SXORD+1),A
26D3 CD0027 00575 CALL SYSDRV$ ;Force prompt for SYSTEM
26D6 1807 00576 JR EXIT5B
26D8 3A0328 00577 EXIT5A LD A,(SXORD+1) ; else if not entered,
26DB B7 00578 OR A ; ck if source & dest
26DC CCFB26 00579 CALL Z,NDSYS$ ; are same - we may need
26DF ED5B1626 00580 EXIT5B LD DE,(BUFFER$) ; a prompt
26E3 7A 00581 LD A,D ;Ck if we did a backup
26E4 B3 00582 OR E
26E5 C8 00583 RET Z ;Ret if buf adr never set
26E6 210000 00584 LD HL,0 ; else calculate how
26E9 45 00585 LD B,L ; many bytes in RAM
26EA 00586 @@HIGH$ ; to zero
26EA+3E64 00587 LD A,100
26EC+EF 00588 RST 40
26ED AF 00589 XOR A
26EE ED52 00590 SBC HL,DE ;Get length to zero
26F0 44 00591 LD B,H
26F1 4D 00592 LD C,L ; into BC
26F2 62 00593 LD H,D ;Pt HL to start of buffer
26F3 6B 00594 LD L,E
26F4 13 00595 INC DE
26F5 3600 00596 LD (HL),0 ;Init 1st to zero
26F7 0B 00597 DEC BC ; & propogate it
26F8 EDB0 00598 LDIR
26FA C9 00599 RET
00600 ;
00601 ; Prompt for system disk
00602 ;
26FB 3A4227 00603 NDSYS$ LD A,(SRCDRV$+1) ;On exit, if S=D <> 0
26FE B7 00604 OR A ; then no need to prompt
26FF C0 00605 RET NZ
2700 3E00 00606 SYSDRV$ LD A,0 ;P/u drive 0 indicator
2702 F620 00607 OR 20H ;Set bit 5 for sys test
2704 E5 00608 PUSH HL
2705 216D29 00609 LD HL,PMTSYS$ ;"insert system...
2708 F5 00610 PUSH AF ;Save drive #
2709 3AFC27 00611 LD A,(CURDSK+1) ;Save cur disk
270C 323B27 00612 LD (TDSK),A
270F F1 00613 POP AF
2710 CDFB27 00614 CALL CURDSK ;get wanted disk
2713 3AFC27 00615 LD A,(CURDSK+1)
2716 E607 00616 AND 7 ;Mask all but drive
2718 4F 00617 LD C,A ;Drive # to C
2719 00618 @@GTDCT ;Get the DCT this drive
2719+3E51 00619 LD A,81
271B+EF 00620 RST 40
271C FD7E04 00621 LD A,(IY+4) ;Get ckdrv bit
271F F5 00622 PUSH AF
2720 E67F 00623 AND 7FH ;Mask ckdrv, force on
2722 FD7704 00624 LD (IY+4),A
2725 FDE5 00625 PUSH IY
2727 00626 @@CKDRV
2727+3E21 00627 LD A,33
2729+EF 00628 RST 40
272A FDE1 00629 POP IY ;Get back DCT
272C C1 00630 POP BC ;Old info to B
272D F5 00631 PUSH AF ;Save ready status
272E 78 00632 LD A,B ;Old ckdrv status
272F E680 00633 AND 80H
2731 FDB604 00634 OR (IY+4)
2734 FD7704 00635 LD (IY+4),A ;Restore ckdrv status
2737 F1 00636 POP AF ;Get ready status
2738 E1 00637 POP HL ;Set for return
2739 C8 00638 RET Z ;Back if disk in
273A 3E00 00639 LD A,0
273B 00640 TDSK EQU $-1
273C 32FC27 00641 LD (CURDSK+1),A ;Reset for proper disk
273F 18BF 00642 JR SYSDRV$ ;Redo
00643 ;
00644 ; Prompt source disk
00645 ;
2741 3E00 00646 SRCDRV$ LD A,0 ;Source drive
2743 F680 00647 OR 80H ;Set bit 7 on source
2745 E5 00648 PUSH HL
2746 218B29 00649 LD HL,PMTSRC$ ;"Insert source
2749 CDFB27 00650 CALL CURDSK ;Prompt for source if needed
274C E1 00651 POP HL
274D C9 00652 RET
00653 ;
00654 ; Prompt source disk if needed to swap
00655 ;
274E 3AFC27 00656 PMTSRC LD A,(CURDSK+1) ;P/u current drive
2751 CB7F 00657 BIT 7,A ;Is source the one?
2753 20EC 00658 JR NZ,SRCDRV$ ;Jump if it is
2755 CD4127 00659 CALL SRCDRV$ ; else prompt for it
2758 3A0328 00660 LD A,(SXORD+1)
275B B7 00661 OR A
275C C0 00662 RET NZ ;Ret if source <> dest
275D CD9228 00663 CALL RESTOR ;Restore to cyl 0
2760 C5 00664 PUSH BC
2761 D5 00665 PUSH DE ;Save registers
2762 E5 00666 PUSH HL
2763 21002D 00667 LD HL,BUF3$ ;Use this for I/O buffer
2766 110000 00668 LD DE,0 ;Read the BOOT
2769 CDA628 00669 CALL RDSEC
276C E1 00670 POP HL
276D D1 00671 POP DE ;Restore the registers
276E C1 00672 POP BC
276F C29726 00673 JP NZ,EXIT3 ;Quit on read error
2772 3A002D 00674 LD A,(BUF3$) ;P/u 1st byte of BOOT
2775 B7 00675 OR A ;If source, s/b 0
2776 2030 00676 JR NZ,PSRC3 ;Jump if not this disk
2778 C5 00677 PUSH BC
2779 D5 00678 PUSH DE
277A E5 00679 PUSH HL
277B FD5609 00680 LD D,(IY+9) ;P/u dir cyl
277E 1E00 00681 LD E,0 ;Pt to GAT sector
2780 21002D 00682 LD HL,BUF3$
2783 CDA628 00683 CALL RDSEC ;Read the GAT
2786 FE06 00684 CP 6
2788 C29226 00685 JP NZ,DIRERR
278B 21CE2B 00686 LD HL,BUF1$+PSWD ;Ck for match with orig
278E 11CE2D 00687 LD DE,BUF3$+PSWD ; source disk
2791 060A 00688 LD B,10 ;Set match count
2793 1A 00689 PSRC1 LD A,(DE)
2794 BE 00690 CP (HL)
2795 2008 00691 JR NZ,DIFSRC ;Wrong disk if no match
2797 13 00692 INC DE ;Bump pointers
2798 23 00693 INC HL
2799 10F8 00694 DJNZ PSRC1 ;Loop for 10 compares
279B E1 00695 POP HL ;Was a match,
279C D1 00696 POP DE ; restore and return
279D C1 00697 POP BC
279E C9 00698 RET
279F 00699 DIFSRC @@DSPLY DIFSRC$ ;"wake up...
00700 IFEQ 01H,1
279F+21CC29 00701 LD HL,DIFSRC$
00702 ENDIF
27A2+3E0A 00703 LD A,10
27A4+EF 00704 RST 40
27A5 E1 00705 POP HL ;Clean the stack
27A6 D1 00706 POP DE
27A7 C1 00707 POP BC
27A8 AF 00708 PSRC3 XOR A ;Show not current disk
27A9 32FC27 00709 LD (CURDSK+1),A
27AC 18A0 00710 JR PMTSRC ;Loop to re-prompt
00711 ;
00712 ; Destination disk selection
00713 ;
27AE 3E00 00714 DSTDRV$ LD A,0 ;Dest drive
27B0 F640 00715 OR 40H ;Set dest diskette code
27B2 E5 00716 PUSH HL
27B3 21A929 00717 LD HL,PMTDST$ ;"insert dest...
27B6 CDFB27 00718 CALL CURDSK
27B9 E1 00719 POP HL
27BA C9 00720 RET
00721 ;
00722 ; Prompt destination if needed
00723 ;
27BB 3AFC27 00724 PMTDST LD A,(CURDSK+1) ;P/u current disk/drive &
27BE CB77 00725 BIT 6,A ; ck if destination disk
27C0 20EC 00726 JR NZ,DSTDRV$ ;Jump if it is
27C2 CDAE27 00727 CALL DSTDRV$ ; else request swap
27C5 3A0328 00728 LD A,(SXORD+1)
27C8 B7 00729 OR A
27C9 C0 00730 RET NZ ;Ret if source <> dest
27CA CD9228 00731 CALL RESTOR ; else restore to cyl 0
27CD C5 00732 PUSH BC
27CE D5 00733 PUSH DE
27CF E5 00734 PUSH HL
27D0 21002D 00735 LD HL,BUF3$ ;Use this for I/O buffer
27D3 110000 00736 LD DE,0 ;Pt to BOOT sector
27D6 CDA628 00737 CALL RDSEC ; & read the BOOT
27D9 E1 00738 POP HL
27DA D1 00739 POP DE
27DB C1 00740 POP BC
27DC C29726 00741 JP NZ,EXIT3 ;Quit on read error
27DF 3A002D 00742 LD A,(BUF3$) ;P/u 1st byte of BOOT
27E2 FE76 00743 CP 76H ;Dest s/b a HALT
27E4 C8 00744 PMTDST1 RET Z
27E5 E5 00745 PUSH HL
27E6 D5 00746 PUSH DE
27E7 00747 @@DSPLY DIFDST$ ;"not same dest...
00748 IFEQ 01H,1
27E7+21FE29 00749 LD HL,DIFDST$
00750 ENDIF
27EA+3E0A 00751 LD A,10
27EC+EF 00752 RST 40
27ED D1 00753 POP DE
27EE E1 00754 POP HL
27EF AF 00755 XOR A
27F0 32FC27 00756 LD (CURDSK+1),A ;Show no current diskette
27F3 18C6 00757 JR PMTDST ; and prompt again
00758 ;
00759 ; Force a prompt of the target disk
00760 ;
27F5 79 00761 FRCPMT LD A,C ;P/u target drive
27F6 32FC27 00762 LD (CURDSK+1),A ; with code bit
27F9 180C 00763 JR FLASH
00764 ;
00765 ; Routine to check if flashing prompt is needed
00766 ;
27FB FE00 00767 CURDSK CP 0 ;P/u current disk
27FD 2872 00768 JR Z,FLSH6 ;Match with wanted disk?
27FF 32FC27 00769 LD (CURDSK+1),A ;No, update current
2802 3EFF 00770 SXORD LD A,0FFH ;0=src & dst drive same
2804 B7 00771 OR A
2805 206A 00772 JR NZ,FLSH6 ;Jump if source <> dest
00773 ;
00774 ; Routine to flash the prompt
00775 ;
2807 C5 00776 FLASH PUSH BC
2808 D5 00777 PUSH DE
2809 E5 00778 PUSH HL
280A 00779 @@FLAGS ;IY => flag table base
280A+3E65 00780 LD A,101
280C+EF 00781 RST 40
280D 0E0D 00782 LD C,CR ;Write a new line
280F 00783 @@DSP
280F+3E02 00784 LD A,2
2811+EF 00785 RST 40
2812 0E0F 00786 LD C,15 ;Cursor off
2814 00787 @@DSP
2814+3E02 00788 LD A,2
2816+EF 00789 RST 40
00790 FLASH0
2817 00791 @@CKBRKC ;Check and clear break
2817+3E6A 00792 LD A,106
2819+EF 00793 RST 40
281A CD8028 00794 CALL RESKFLG ;Reset Pause,Enter,Break
281D 01FD41 00795 LD BC,16893 ;Delay for 1/4 sec
2820 00796 @@PAUSE
2820+3E10 00797 LD A,16
2822+EF 00798 RST 40
2823 FD7E0A 00799 LD A,(IY+'K'-'A')
2826 E605 00800 AND 4!1 ;Wait for no ENTER!BRK
2828 20ED 00801 JR NZ,FLASH0
282A CD8028 00802 CALL RESKFLG ;Reset in case BREAK
282D 00803 FLS1 @@DSPLY ;Display the message
00804 IFEQ 00H,1
00805 LD HL,
00806 ENDIF
282D+3E0A 00807 LD A,10
282F+EF 00808 RST 40
2830 015515 00809 LD BC,FCNT2
2833 CD4828 00810 CALL FLS2 ;Blink start
2836 0E1D 00811 LD C,29 ;Cursor to BOL
2838 00812 @@DSP
2838+3E02 00813 LD A,2
283A+EF 00814 RST 40
283B 0E1E 00815 LD C,1EH ;Cursor erase to EOL
283D 00816 @@DSP
283D+3E02 00817 LD A,2
283F+EF 00818 RST 40
2840 011111 00819 LD BC,FCNT1 ;Wait delay count
2843 CD4828 00820 CALL FLS2 ;Wait & ck Enter or Break
2846 18E5 00821 JR FLS1 ;Loop until Enter
00822 FLS2
2848 00823 @@CKBRKC ;Check for break
2848+3E6A 00824 LD A,106
284A+EF 00825 RST 40
284B C2AC26 00826 JP NZ,BREAK ; and abort if so
284E FD7E0A 00827 LD A,(IY+'K'-'A') ;P/u KFLAG settings
2851 CB57 00828 BIT 2,A ;Enter pressed?
2853 2006 00829 JR NZ,FLS4 ;Go if so
2855 0B 00830 DEC BC ;Count down
2856 78 00831 LD A,B
2857 B1 00832 OR C
2858 20EE 00833 JR NZ,FLS2 ; and loop if more time
285A C9 00834 RET
285B F1 00835 FLS4 POP AF ;Pop return address
285C 00836 FLS5 @@KBD ;Clear type ahead buffer
285C+3E08 00837 LD A,8
285E+EF 00838 RST 40
285F 28FB 00839 JR Z,FLS5 ;Loop til no key down
2861 0E0D 00840 LD C,0DH ;Dsply a new line
2863 00841 @@DSP
2863+3E02 00842 LD A,2
2865+EF 00843 RST 40
2866 0E0E 00844 LD C,14 ;Cursor on
2868 00845 @@DSP
2868+3E02 00846 LD A,2
286A+EF 00847 RST 40
286B CD8028 00848 CALL RESKFLG ;Reset Break,Enter,Pause
286E E1 00849 POP HL
286F D1 00850 POP DE ;Restore registers
2870 C1 00851 POP BC
2871 3AFC27 00852 FLSH6 LD A,(CURDSK+1) ;P/u drive #
2874 E607 00853 AND 7 ;Strip off code bits
2876 4F 00854 LD C,A ;Drive # to C to
2877 00855 @@GTDCT ; get DCT vector
2877+3E51 00856 LD A,81
2879+EF 00857 RST 40
00858 IF @MOD4
287A CD9728 00859 CALL RSELCT ;Get drive status in A
00860 ENDIF
00861 IF @MOD2
00862 CALL SELECT
00863 ENDIF
287D 07 00864 RLCA
287E 07 00865 RLCA
287F C9 00866 RET
2880 FD7E0A 00867 RESKFLG LD A,(IY+'K'-'A') ;Reset 3-bit field
2883 E6F8 00868 AND 0F8H
2885 FD770A 00869 LD (IY+'K'-'A'),A
2888 C9 00870 RET
00871 ;
00872 ; Drive disk I/O call setups
00873 ;
2889 C5 00874 TSTDRV PUSH BC
288A AF 00875 XOR A ;Test for drive
288B 1821 00876 JR DIO1
288D C5 00877 SELECT PUSH BC
288E 3E01 00878 LD A,1 ;Select new drive
2890 181C 00879 JR DIO1
2892 C5 00880 RESTOR PUSH BC
2893 3E04 00881 LD A,4 ;Restore
2895 1817 00882 JR DIO1
2897 C5 00883 RSELCT PUSH BC
2898 3E07 00884 LD A,7 ;Reselect
289A 1812 00885 JR DIO1
289C C5 00886 WRSEC PUSH BC
289D 3E0D 00887 LD A,13 ;Write sector
289F 180D 00888 JR DIO1
28A1 C5 00889 WRSYS PUSH BC
28A2 3E0E 00890 LD A,14 ;Write protected
28A4 1808 00891 JR DIO1
28A6 C5 00892 RDSEC PUSH BC
28A7 3E09 00893 LD A,9 ;Read sector
28A9 1803 00894 JR DIO1
00895 ;
00896 IF @MOD2
00897 FMTCYL PUSH BC ;Save
00898 LD A,15 ;I/O command
00899 JR DIO1 ;Continue
00900 ENDIF
00901 ;
28AB C5 00902 VERSEC PUSH BC
28AC 3E0A 00903 LD A,10 ;Verify sector
28AE C628 00904 DIO1 ADD A,40 ;Adjust for SVC
28B0 47 00905 LD B,A ;Save tempy
28B1 3AFC27 00906 LD A,(CURDSK+1) ;Get drive number
28B4 E607 00907 AND 7 ;Strip diskette type bit
28B6 4F 00908 LD C,A ;Load up drive register
28B7 78 00909 LD A,B ;Get back SVC #
00910 IF @MOD4
28B8 F3 00911 DI ;Interrupts off
00912 ENDIF
28B9 EF 00913 RST 40
00914 IF @MOD4
28BA FB 00915 EI ;Interrupts on
00916 ENDIF
28BB C1 00917 POP BC
28BC C9 00918 RET
00919 ;
00920 ; Check for correct disk
00921 ;
28BD D5 00922 CKSWDD PUSH DE ;Save DE,BC
28BE C5 00923 PUSH BC
28BF 3A4227 00924 LD A,(SRCDRV$+1) ;Get drive
28C2 21FC27 00925 LD HL,CURDSK+1
28C5 4E 00926 LD C,(HL) ;Get current drive
28C6 77 00927 LD (HL),A ;Make curdsk our dsk
28C7 2A1626 00928 LD HL,(BUFFER$) ;I/O buffer
28CA 110200 00929 LD DE,2 ;Trk 0, sect 2
28CB 00930 PROTSEC EQU $-2
28CD CDA628 00931 CALL RDSEC ;Read SIS sector
28D0 201C 00932 JR NZ,EX2 ;Quit on read error
28D2 2EC6 00933 LD L,0C6H ;Set buffer posn
28D4 3E00 00934 LD A,$-$ ;Get original id byte
28D5 00935 SVCTR EQU $-1
28D6 BE 00936 CP (HL) ;Is it the same disk?
28D7 200F 00937 JR NZ,EX1 ;NZ=error exit
28D9 3C 00938 INC A
28DA 280C 00939 JR Z,EX1
28DC 3D 00940 DEC A ;If id byte 0,
28DD 2809 00941 JR Z,EX1 ; no modifying needed
28DF 3D 00942 DEC A ; else dec remaining
28E0 2001 00943 JR NZ,$+3 ;If now 0, make FFH
28E2 3D 00944 DEC A
28E3 77 00945 LD (HL),A ;Store the new id
00946 IF @MOD2
00947 LD L,0 ;Reset buffer
00948 ENDIF
00949 IF @MOD4
28E4 6A 00950 LD L,D ;Reset buffer
00951 ENDIF
28E5 CD9C28 00952 CALL WRSEC ;Put it back, ck error later
28E8 79 00953 EX1 LD A,C
28E9 32FC27 00954 LD (CURDSK+1),A ;Restor orig drv #
28EC C1 00955 POP BC
28ED D1 00956 POP DE
28EE 218E2A 00957 EX2 LD HL,CANTBU$ ;Go if was write error
28F1 C8 00958 RET Z
28F2 C3AF26 00959 JP EXIT4
00960 ;
00961 ;
00962 ; Message area
00963 ;
28F5 0A 00964 DSTWP$ DB LF,'Destination disk is write '
44 65 73 74 69 6E 61 74
69 6F 6E 20 64 69 73 6B
20 69 73 20 77 72 69 74
65 20
2910 70 00965 DB 'protected',CR
72 6F 74 65 63 74 65 64
0D
291A 43 00966 OLD2NEW$ DB 'Can''t move SYS files from 6.2'
61 6E 27 74 20 6D 6F 76
65 20 53 59 53 20 66 69
6C 65 73 20 66 72 6F 6D
20 36 2E 32
2937 20 00967 DB ' or earlier versions to 6.3.x',CR
6F 72 20 65 61 72 6C 69
65 72 20 76 65 72 73 69
6F 6E 73 20 74 6F 20 36
2E 33 2E 78 0D
2955 49 00968 BADMPW$ DB 'Invalid master password',CR
6E 76 61 6C 69 64 20 6D
61 73 74 65 72 20 70 61
73 73 77 6F 72 64 0D
296D 1D 00969 PMTSYS$ DB 29,30,'Insert SYSTEM disk ',3
1E 49 6E 73 65 72 74 20
53 59 53 54 45 4D 20 64
69 73 6B 20 20 3C 45 4E
54 45 52 3E 03
298B 1D 00970 PMTSRC$ DB 29,30,'Insert SOURCE disk ',3
1E 49 6E 73 65 72 74 20
53 4F 55 52 43 45 20 64
69 73 6B 20 20 3C 45 4E
54 45 52 3E 03
29A9 1D 00971 PMTDST$ DB 29,30,'Insert DESTINATION disk '
1E 49 6E 73 65 72 74 20
44 45 53 54 49 4E 41 54
49 4F 4E 20 64 69 73 6B
20 20
29C4 3C 00972 DB '',3
45 4E 54 45 52 3E 03
29CC 1D 00973 DIFSRC$ DB 29,30,'* A L E R T * That',27H
1E 2A 20 41 20 4C 20 45
20 52 20 54 20 2A 20 20
54 68 61 74 27
29E2 73 00974 DB 's not the same source disk ',CR
20 6E 6F 74 20 74 68 65
20 73 61 6D 65 20 73 6F
75 72 63 65 20 64 69 73
6B 20 0D
29FE 1D 00975 DIFDST$ DB 29,30,'* A L E R T * That',27H
1E 2A 20 41 20 4C 20 45
20 52 20 54 20 2A 20 20
54 68 61 74 27
2A14 73 00976 DB 's not the same destination disk ',CR
20 6E 6F 74 20 74 68 65
20 73 61 6D 65 20 64 65
73 74 69 6E 61 74 69 6F
6E 20 64 69 73 6B 20 0D
2A35 53 00977 CCMOD$ DB 'Source disk is write protected; '
6F 75 72 63 65 20 64 69
73 6B 20 69 73 20 77 72
69 74 65 20 70 72 6F 74
65 63 74 65 64 3B 20
2A55 4D 00978 DB 'MOD flags not updated',CR
4F 44 20 66 6C 61 67 73
20 6E 6F 74 20 75 70 64
61 74 65 64 0D
2A6B 0A 00979 BUCAO$ DB LF,'Backup complete',CR
42 61 63 6B 75 70 20 63
6F 6D 70 6C 65 74 65 0D
2A7C 0A 00980 ABRTBU$ DB LF,'Command aborted',14,CR
43 6F 6D 6D 61 6E 64 20
61 62 6F 72 74 65 64 0E
0D
2A8E 43 00981 CANTBU$ DB 'Can''t Backup - source disk write protected',LF
61 6E 27 74 20 42 61 63
6B 75 70 20 2D 20 73 6F
75 72 63 65 20 64 69 73
6B 20 77 72 69 74 65 20
70 72 6F 74 65 63 74 65
64 0A
2AB9 44 00982 PROT$ DB 'Disk contains protected files ',CR
69 73 6B 20 63 6F 6E 74
61 69 6E 73 20 70 72 6F
74 65 63 74 65 64 20 66
69 6C 65 73 20 0D
2AD8 00 00983 NEWDT DB 0
2AD9 00 00984 DVTEST1 DB 0
2ADA 00 00985 DVTEST2 DB 0
2ADB 00986 BUCORE$ DEFL $
2B00 00987 ORG $<-8+1<+8
2B00 00988 BUF1$ DS 256
2C00 00989 BUF2$ DS 256
2D00 00990 BUF3$ DS 256
00992 ;
00993 ;
00994 ; Backup entry point
00995 ;
00996 ;
00997 BACKUP
2E00 00998 @@CKBRKC
2E00+3E6A 00999 LD A,106
2E02+EF 01000 RST 40
2E03 2804 01001 JR Z,BACKUPA ;Go ahead if no break
2E05 21FFFF 01002 LD HL,-1 ; else abort
2E08 C9 01003 RET
01004 ;
2E09 ED73BE26 01005 BACKUPA LD (SPSAV+1),SP ;Save current SP
2E0D E5 01006 PUSH HL ;Save cmdbuf
2E0E 01007 @@BREAK 0 ;Remove any BREAK vector
01008 IFEQ 01H,1
2E0E+210000 01009 LD HL,0
01010 ENDIF
2E11+3E67 01011 LD A,103
2E13+EF 01012 RST 40
2E14 01013 @@DSPLY HELLO$ ;Welcome
01014 IFEQ 01H,1
2E14+211544 01015 LD HL,HELLO$
01016 ENDIF
2E17+3E0A 01017 LD A,10
2E19+EF 01018 RST 40
2E1A 01019 @@FLAGS ;IY => flag table
2E1A+3E65 01020 LD A,101
2E1C+EF 01021 RST 40
2E1D FDE5 01022 PUSH IY
2E1F D1 01023 POP DE
2E20 211800 01024 LD HL,'Y'-'A' ;Get year type locn
2E23 19 01025 ADD HL,DE
2E24 223743 01026 LD (YFLAG1),HL ;Save for ckdrv
2E27 CD8028 01027 CALL RESKFLG ;Reset KFLAG bits
2E2A FDCB024E 01028 BIT 1,(IY+'C'-'A') ;Check on CMNDR active
2E2E 219A44 01029 LD HL,LDOS$
2E31 C2AF26 01030 JP NZ,EXIT4 ; and exit if so
2E34 E1 01031 POP HL
2E35 7E 01032 BCK1 LD A,(HL) ;Bypass cmdline spaces
2E36 23 01033 INC HL
2E37 FE20 01034 CP ' '
2E39 28FA 01035 JR Z,BCK1
01036 ;
01037 ; Scan for source partial spec
01038 ;
2E3B 110226 01039 LD DE,SPCFLD$ ;Pt to filespec field
2E3E 0608 01040 LD B,8 ;Init for file name
2E40 FE2D 01041 CP '-' ;Exclude matches?
2E42 2005 01042 JR NZ,BCK2 ;If '-', set flag
2E44 320D26 01043 LD (MFLG$),A
2E47 7E 01044 LD A,(HL) ;Get next char
2E48 23 01045 INC HL
2E49 CD3231 01046 BCK2 CALL PRSPEC ;Parse possible filename
2E4C FE2E 01047 CP '.' ;Valid ext. char
2E4E 2804 01048 JR Z,BCK2A
2E50 FE2F 01049 CP '/' ;File ext?
2E52 200A 01050 JR NZ,BCK3
2E54 110A26 01051 BCK2A LD DE,SPCFLD$+8 ;Reposn buffer ptr
2E57 0603 01052 LD B,3 ;Init for 3 chars
2E59 7E 01053 LD A,(HL)
2E5A 23 01054 INC HL ;Bypass the /
2E5B CD3231 01055 CALL PRSPEC ;Parse extension
01056 ;
01057 ; Determine source & destination drives
01058 ;
2E5E FE3A 01059 BCK3 CP ':' ;Drive number coming?
2E60 2820 01060 JR Z,BCK4 ;Go if so
2E62 FE29 01061 CP '('+1 ;If legal, is some term.
2E64 3805 01062 JR C,BCK3A ;Go if ok
2E66 3E13 01063 LD A,19 ;"Illegal file name
2E68 C39726 01064 JP EXIT3 ;Quit
2E6B 2B 01065 BCK3A DEC HL ;Save possible parms
2E6C E5 01066 PUSH HL
2E6D 01067 @@DSPLY SRCNUM$ ;No drives enter, so
01068 IFEQ 01H,1
2E6D+21CF44 01069 LD HL,SRCNUM$
01070 ENDIF
2E70+3E0A 01071 LD A,10
2E72+EF 01072 RST 40
2E73 215826 01073 LD HL,LILBUF$ ; prompt for them
2E76 010001 01074 LD BC,1<8 ;1 char response
2E79 01075 @@KEYIN
2E79+3E09 01076 LD A,9
2E7B+EF 01077 RST 40
2E7C DAAC26 01078 JP C,ABRTBU ;Quit on Break
2E7F 7E 01079 LD A,(HL) ;Get response. Restore
2E80 E1 01080 POP HL ; command buffer. Ignore
2E81 DA 01081 DB 0DAH ; next 2 inst with JP C,
2E82 7E 01082 BCK4 LD A,(HL) ;P/u source drive #
2E83 23 01083 INC HL ;Bump to separator
2E84 D630 01084 SUB '0' ;Adj to binary
2E86 FE08 01085 CP 8 ;Error if not in
2E88 D29526 01086 JP NC,EXIT2 ; the range <0-7>
2E8B 324227 01087 LD (SRCDRV$+1),A ;Stuff source drive
2E8E 7E 01088 BCK5 LD A,(HL) ;P/u char or separator
2E8F 23 01089 INC HL ;Bump ptr
2E90 FE3A 01090 CP ':' ;Find dest drive?
2E92 281F 01091 JR Z,BCK6 ;Get drive # if :
2E94 FE30 01092 CP 30H ; let prepositions thru
2E96 30F6 01093 JR NC,BCK5
2E98 FE20 01094 CP 20H ;Or a space separator
2E9A 28F2 01095 JR Z,BCK5
2E9C 2B 01096 DEC HL ;Save possible parms
2E9D E5 01097 PUSH HL
2E9E 01098 @@DSPLY DSTNUM$ ;Prompt for dest drive
01099 IFEQ 01H,1
2E9E+21ED44 01100 LD HL,DSTNUM$
01101 ENDIF
2EA1+3E0A 01102 LD A,10
2EA3+EF 01103 RST 40
2EA4 215826 01104 LD HL,LILBUF$ ;Use for keyin buffer
2EA7 010001 01105 LD BC,1<8 ;1 char only
2EAA 01106 @@KEYIN
2EAA+3E09 01107 LD A,9
2EAC+EF 01108 RST 40
2EAD DAAC26 01109 JP C,ABRTBU ;Quit on Break
2EB0 7E 01110 LD A,(HL) ;Get response. Restore
2EB1 E1 01111 POP HL ; buffer. Ignore next 2
2EB2 DA 01112 DB 0DAH ; inst with JP C,nn
2EB3 7E 01113 BCK6 LD A,(HL) ;P/u dest drive #
2EB4 23 01114 INC HL ;Bump line ptr
2EB5 D630 01115 SUB '0' ;Adjust to binary
2EB7 FE08 01116 CP 8 ;Error if not in the
2EB9 D29526 01117 JP NC,EXIT2 ; range <0-7>
2EBC 32AF27 01118 LD (DSTDRV$+1),A ;Stuff dest drive
01119 ;
2EBF 117043 01120 LD DE,PRMTBL$ ;P/u parm table ptr
2EC2 D5 01121 PUSH DE ;Also in IX to check
2EC3 DDE1 01122 POP IX ; responses
2EC5 01123 @@PARAM ;Get parms if any
2EC5+3E11 01124 LD A,17
2EC7+EF 01125 RST 40
2EC8 21BF44 01126 LD HL,PRMERR$ ;Init "parm error
2ECB 2005 01127 JR NZ,$EX4 ;Quit on parm error
2ECD DD7E30 01128 LD A,(IX+DATRSP) ;Date can only be STR
2ED0 E6C0 01129 AND VAL!SW ;This must be string
2ED2 C2AF26 01130 $EX4 JP NZ,EXIT4 ;Quit if not
01131 ;
01132 ; Check on Source = Destination
01133 ;
2ED5 3A4227 01134 LD A,(SRCDRV$+1) ;P/u source drive
2ED8 21AF27 01135 LD HL,DSTDRV$+1
2EDB AE 01136 XOR (HL) ;Match against dest
2EDC 320328 01137 LD (SXORD+1),A ;0 if S=D, <>0 if S<>D
2EDF 200D 01138 JR NZ,DATPRM ;Bypass if source <> dest
2EE1 01139 @@FLAGS ;Else test if proc
2EE1+3E65 01140 LD A,101
2EE3+EF 01141 RST 40
2EE4 FDCB126E 01142 BIT 5,(IY+'S'-'A')
2EE8 21B243 01143 LD HL,NOINDO$ ;"can't do single...
2EEB C2AF26 01144 JP NZ,EXIT4 ;Abort if from
01145 ;
01146 ; Check on date entries
01147 ;
2EEE 210000 01148 DATPRM LD HL,0 ;P/u date="from-to"
2EF1 7C 01149 LD A,H
2EF2 B5 01150 OR L
2EF3 282F 01151 JR Z,CKCLAS ;Bypass if not entered
2EF5 7E 01152 LD A,(HL) ;Check for "-to"
2EF6 FE2D 01153 CP '-'
2EF8 2815 01154 JR Z,CKTO ;Go if no From used
2EFA 3E80 01155 LD A,80H ;Set From bit
2EFC 320126 01156 LD (FTFLG$),A ;Note From entered
2EFF CD5931 01157 CALL PAKDAT ;Pack the date entry
2F02 ED438026 01158 LD (FMPAKD$),BC ;Save From packed date
2F06 7E 01159 LD A,(HL) ;Ck if more in date parm
2F07 FE22 01160 CP '"' ;End of string?
2F09 280D 01161 JR Z,FRCDAT ;Go if so
2F0B FE2D 01162 CP '-' ;Check for "-to"
2F0D 2015 01163 JR NZ,CKCLAS ;Done if not
2F0F 23 01164 CKTO INC HL ;Bypass the '-'
2F10 7E 01165 LD A,(HL) ;Ck for end of parm
2F11 FE22 01166 CP '"'
2F13 280F 01167 JR Z,CKCLAS ;Go if done
2F15 CD5931 01168 CALL PAKDAT ;Pack To date
2F18 3A0126 01169 FRCDAT LD A,(FTFLG$) ;P/u From/To flag and
2F1B F601 01170 OR 1 ; set To bit
2F1D 320126 01171 LD (FTFLG$),A
2F20 ED438226 01172 LD (TOPAKD$),BC ;Save To packed date
01173 ;
01174 ; Check on parms to force CLASS backup
01175 ;
2F24 0600 01176 CKCLAS LD B,0 ;Init class flag
2F26 110000 01177 SYSPRM LD DE,0 ;SYS parm used?
2F29 7A 01178 LD A,D
2F2A B3 01179 OR E
2F2B 2802 01180 JR Z,INVPRM ;Go if not
2F2D CBF0 01181 SET 6,B ;Set 6 if SYS
2F2F 110000 01182 INVPRM LD DE,0 ;INV parm used?
2F32 7A 01183 LD A,D
2F33 B3 01184 OR E
2F34 2802 01185 JR Z,CKCLA1 ;Go if not
2F36 CBD8 01186 SET 3,B ;Set 3 if INV
2F38 78 01187 CKCLA1 LD A,B
2F39 328426 01188 LD (CLSFLG$),A ;Store by class flag
2F3C 3A0226 01189 LD A,(SPCFLD$) ;Get 1st char of possible
2F3F D620 01190 SUB ' ' ; file name
2F41 47 01191 LD B,A ;Save test result and
2F42 3A0A26 01192 LD A,(SPCFLD$+8) ; check if extension used
2F45 D620 01193 SUB ' ' ;Ck for ext
2F47 B0 01194 OR B ;A <> 0 if partspec
2F48 47 01195 LD B,A ;Hold in reg B
01196 ;
01197 ; Merge all "CLASS" parms together
01198 ;
2F49 DD7E0C 01199 LD A,(IX+SYSRSP) ;System files
2F4C DDB613 01200 OR (IX+INVRSP) ;Invisible files
2F4F DDB61A 01201 OR (IX+MODRSP) ;Mod flag files
2F52 DDB637 01202 OR (IX+NEWRSP) ;Files not on dest
2F55 DDB63E 01203 OR (IX+OLDRSP) ;Files on dest
2F58 DDB623 01204 OR (IX+QRSP) ;Query forces by class
2F5B 4F 01205 LD C,A ;Hold value
2F5C E6A0 01206 AND VAL!STR ;Above parms only SWITCH
2F5E 21BF44 01207 LD HL,PRMERR$ ;Init "parm error
2F61 C2AF26 01208 JP NZ,EXIT4 ;Quit if not switches only
2F64 B1 01209 OR C
2F65 B0 01210 OR B ;Merge with 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 C62