[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/11/99 00:03:36 COPY/APPEND - LS-DOS 6.3 Page 00001
00001 ;LBCOPY/ASM - Copy/Append Commands
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 SVCMAC:3
00027 ;SVCMAC/ASM - LS-DOS Version VI
00028 *LIST OFF
00420 *LIST ON
0000 00422 *GET VALUES:3
00423 ;VALUES/ASM - Version 6
00424 *LIST OFF
00451 *LIST ON
00452 ;
001E 00453 EL EQU 30 ;Erase Line
001D 00454 BL EQU 29 ;Beginning of Line
003A 00455 @INIT EQU 58 ;@INIT SVC #
003B 00456 @OPEN EQU 59 ;@OPEN SVC #
0080 00457 BREAK EQU 80H ;BREAK character
00458 ;
2400 00459 ORG 2400H
00460 ;
2400 00461 *GET LBCOPYA:3
00462 ;LBCOPYA/ASM - Copy/Append commands
00465 ;
00466 ; Jump to COPY Entry Point
00467 ;
2400 C3F424 00468 COPY JP COPYST ;Go to COPY
00469 ;
00470 ; APPEND Entry Point - Was the hit ?
00471 ;
00472 APPEND
00473 IF @BLD631
2403 ED732324 00474 LD (SAVESP+1),SP ;<631>Save SP address
00475 ENDIF
2407 00476 @@CKBRKC ;Check for break
2407+3E6A 00477 LD A,106
2409+EF 00478 RST 40
00479 IF @BLD631
240A 203D 00480 JR NZ,ABORT ;<631>Abort
00481 ELSE
00482 JR Z,APPENDA ;Continue if not
00483 LD HL,-1 ; else abort
00484 RET
00485 ;
00486 ; not hit - Execute Module
00487 ;
00488 APPENDA
00489 LD (SAVESP+1),SP ;Save SP address
00490 ENDIF
240C CD4E24 00491 CALL APCODE ;Call Append code
240F 210000 00492 EXIT LD HL,0 ;Good exit
2412 180E 00493 JR SAVESP
00494 ;
00495 ; I/O Error Display & Abort Routine
00496 ;
2414 F5 00497 IOERR PUSH AF ;Save error code
2415 CD6629 00498 CALL PMTSYS ;Prompt SYSTEM Disk
2418 F1 00499 POP AF ;Rcvr error code
2419 6F 00500 LD L,A ;Xfer any error to HL
241A 2600 00501 LD H,0
241C F6C0 00502 OR 0C0H ;Set for abbrev error msg
241E 4F 00503 LD C,A ;Save Error # in C
241F 00504 @@ERROR ;Display & abort
241F+3E1A 00505 LD A,26
2421+EF 00506 RST 40
00507 IF @BLD631
00508 ;
00509 ; P/u Stack, clear any & return
00510 ;
2422 310000 00511 SAVESP LD SP,$-$ ;<631>P/u stack
2425 00512 @@CKBRKC ;<631>Clear any
2425+3E6A 00513 LD A,106
2427+EF 00514 RST 40
2428 C9 00515 RET ;<631> and RETurn
00516 ELSE
00517 JR SAVESP ;Good bye
00518 ENDIF
00519 ;
00520 ; Load HL with error message string to display
00521 ;
2429 21192B 00522 SAMERR LD HL,SAMERR$ ;"Source & Dest same"
242C DD 00523 DB 0DDH
242D 21DF2A 00524 SPCREQ LD HL,SPCREQ$ ;"File spec required"
2430 DD 00525 DB 0DDH
2431 21F22A 00526 NOINDO LD HL,NOINDO$ ;"Invalid during "
2434 DD 00527 DB 0DDH
2435 21992A 00528 DIFLRL LD HL,DIFLRL$ ;"Files have diff LRLs"
2438 DD 00529 DB 0DDH
2439 21B32A 00530 DSTREQ LD HL,DSTREQ$ ;"Dest spec Required"
243C 00531 @@LOGOT ;Log error message
00532 IFEQ 00H,1
00533 LD HL,
00534 ENDIF
243C+3E0C 00535 LD A,12
243E+EF 00536 RST 40
00537 ;
00538 ; Attempt to close any OPEN destination file
00539 ;
243F 11032C 00540 LD DE,FCB2 ;Point to dest FCB
2442 1A 00541 LD A,(DE) ;Is the file OPEN?
2443 07 00542 RLCA
2444 3003 00543 JR NC,ABORT ;No - abort
2446 00544 @@CLOSE
2446+3E3C 00545 LD A,60
2448+EF 00546 RST 40
2449 21FFFF 00547 ABORT LD HL,-1 ;Abort code to HL
00548 IF @BLD631
244C 18D4 00549 JR SAVESP ;<631>
00550 ELSE
00551 ;
00552 ; P/u Stack, clear any & return
00553 ;
00554 SAVESP LD SP,$-$ ;P/u stack
00555 @@CKBRKC ;Clear any
00556 RET ; and RETurn
00557 ENDIF
00558 ;
00559 ; APCODE - Append spec to spec
00560 ;
00561 APCODE
244E AF 00562 XOR A ;Turn off CLONE parm
244F 32A926 00563 LD (CPARM+1),A
2452 32AA26 00564 LD (CPARM+2),A
2455 32B228 00565 LD (APPFLAG+1),A ;We're in APPEND not COPY
00566 ;
2458 CD0529 00567 CALL DOINIT ;Set High memory
00568 ;
00569 ; Check if Filespec/Devspec #1 is legal
00570 ;
245B 11572C 00571 LD DE,FCB1 ;DE => File #1 FCB
245E 00572 @@FSPEC ;Check out filespec
245E+3E4E 00573 LD A,78
2460+EF 00574 RST 40
2461 C22D24 00575 JP NZ,SPCREQ ;NZ - Filespec Required
00576 ;
00577 ; Check if Filespec/Devspec #2 is legal
00578 ;
2464 11032C 00579 LD DE,FCB2 ;DE => File #2 FCB
2467 00580 @@FSPEC ;Check if legal
2467+3E4E 00581 LD A,78
2469+EF 00582 RST 40
246A C46A27 00583 CALL NZ,CVRTUC ;Convert line to U/C
00584 ;
00585 ; Is the second FCB a device ?
00586 ;
246D 3A032C 00587 APND1 LD A,(FCB2) ;P/u byte 0 of FCB2
2470 FE2A 00588 CP '*' ;Is this a devspec ?
2472 CA2D24 00589 JP Z,SPCREQ ;Z - Filespec required
00590 ;
00591 ; Parse any parameters entered
00592 ;
2475 11D12B 00593 LD DE,APPTBL ;DE => Parameter Table
2478 00594 @@PARAM ;Check out parameters
2478+3E11 00595 LD A,17
247A+EF 00596 RST 40
247B C21424 00597 JP NZ,IOERR ;NZ - Parameter Error
00598 ;
247E CD9427 00599 CALL PRSPC ;P/u FCB ptr in DE
00600 ;
00601 ; Open Filespec #2 with LRL of 256
00602 ;
2481 CD752A 00603 CALL OPENSR2 ;Open Filespec #2
2484 CD9B28 00604 CALL PUTDEST ;Xfer Dest filespec
2487 CDD028 00605 CALL GETLRL ;Get LRL from DIR entry
00606 ;
248A 32A324 00607 LD (LRL2+1),A ;Set dir LRL into parm
248D 32A626 00608 LD (GEOF1+1),A ;Also stuff for later
00609 ;
00610 ; Open Filespec #1 with LRL of 256
00611 ;
2490 CD6B2A 00612 CALL OPENSRC ;Open Filespec #1
2493 CD9528 00613 CALL PUTSOUR ;Xfer source filespec
00614 ;
00615 ; Is the Source a Device ?
00616 ;
2496 EB 00617 EX DE,HL
2497 CB7E 00618 BIT 7,(HL) ;P/u FCB+0 of source
2499 EB 00619 EX DE,HL ;Device ?
249A CCAC28 00620 CALL Z,CPYFILE ;Display "Appending ..."
249D 2819 00621 JR Z,APND2 ;Yes - don't check LRLs
00622 ;
00623 ; File Source - Check if LRLs are different
00624 ;
249F CDD028 00625 CALL GETLRL ;P/u LRL of Filespec #1
24A2 0600 00626 LRL2 LD B,$-$ ;P/u LRL of Filespec #2
24A4 A8 00627 XOR B ;Same ?
24A5 C23524 00628 JP NZ,DIFLRL ;No - Different LRLs
24A8 CDAC28 00629 CALL CPYFILE ;"Appending : "
00630 ;
00631 ; Files have same LRLs, check STRIP parameter
00632 ;
24AB 110000 00633 SPARM LD DE,$-$ ;P/u strip parameter
24AE 7A 00634 LD A,D ;If STRIP, then must do
24AF B3 00635 OR E ; byte I/O
24B0 2006 00636 JR NZ,APND2 ;Go if STRIP
00637 ;
00638 ; Pick up End of File offset byte from FCB
00639 ;
24B2 3A0B2C 00640 LD A,(FCB2+8) ;Get eof mark
24B5 B7 00641 OR A ;If full sectors, use
24B6 281F 00642 JR Z,APND3 ;Sector I/O
00643 ;
00644 ; EOF not on page boundary - use byte I/O
00645 ;
24B8 11032C 00646 APND2 LD DE,FCB2
24BB 00647 @@PEOF ;Position to end of file
24BB+3E41 00648 LD A,65
24BD+EF 00649 RST 40
00650 ;
00651 ; If STRIP, then backspace the dest by 1 byte
00652 ;
24BE 3AAC24 00653 LD A,(SPARM+1) ;P/u SPARM
24C1 B7 00654 OR A ;Specified ?
24C2 280A 00655 JR Z,APND2A ;No - don't backspace
00656 ;
00657 ; SPARM specified - Backspace one byte
00658 ;
24C4 210C2C 00659 LD HL,FCB2+9 ;HL => LRL of FCB #2
24C7 46 00660 LD B,(HL) ;P/u current dest LRL
24C8 3601 00661 LD (HL),1 ;Reset LRL=1
24CA 00662 @@BKSP ;Backspace 1 byte
24CA+3E3D 00663 LD A,61
24CC+EF 00664 RST 40
24CD 70 00665 LD (HL),B ;Reset LRL back
00666 ;
00667 ; Replace the I/O buffer in FCB #2
00668 ;
24CE 21002F 00669 APND2A LD HL,BUF2 ;HL => New buffer addr
24D1 22062C 00670 LD (FCB2+3),HL ;Stuff in FCB
24D4 C32E27 00671 JP BYTIO0 ;
00672 ;
00673 ; EOF on page boundary, use sector I/O
00674 ;
24D7 ED4B632C 00675 APND3 LD BC,(FCB1+12) ;P/u ERN of source
24DB 78 00676 LD A,B ;If source is a null
24DC B1 00677 OR C ; file, don't do any
24DD CADD26 00678 JP Z,GEOF3 ; appending, just close
00679 ;
00680 ; Write Ending Record Number
00681 ;
24E0 2A0F2C 00682 LD HL,(FCB2+12) ;P/u ERN of dest
24E3 E5 00683 PUSH HL ;Save it for later
24E4 09 00684 ADD HL,BC ;Add the two to find new
24E5 44 00685 LD B,H ; ERN & Xfer new ERN to BC
24E6 4D 00686 LD C,L
24E7 CDEF26 00687 CALL WRERN ;Write a data sector
24EA E1 00688 POP HL ;Recover original ERN
24EB 220F2C 00689 LD (FCB2+12),HL ; & reset FCB to it
24EE 00690 @@PEOF ;Position to end of file
24EE+3E41 00691 LD A,65
24F0+EF 00692 RST 40
24F1 C33A26 00693 JP XFER5
00696 ;
00697 ; COPY Entry Point - was hit ?
00698 ;
00699 COPYST
00700 IF @BLD631
24F4 ED732324 00701 LD (SAVESP+1),SP ;<631>Save SP address
00702 ENDIF
24F8 00703 @@CKBRKC ;Check for break
24F8+3E6A 00704 LD A,106
24FA+EF 00705 RST 40
00706 IF @BLD631
24FB C24924 00707 JP NZ,ABORT ;<631>
00708 ELSE
00709 JR Z,COPYSTA ;Continue if not
00710 LD HL,-1 ; else abort
00711 RET
00712 ;
00713 ; not hit - execute module
00714 ;
00715 COPYSTA LD (SAVESP+1),SP ;Save SP address
00716 ENDIF
24FE CD0425 00717 CALL COPYCD ;Execute Copy code
2501 C30F24 00718 JP EXIT ;Go to common exit
00719 ;
00720 ; COPYCD - Copy spec to spec
00721 ;
00722 COPYCD
2504 CD0529 00723 CALL DOINIT ;Set high mem test byte
00724 ;
00725 ; Check if Source Filespec is legal
00726 ;
2507 11572C 00727 LD DE,FCB1 ;DE => Source FCB
250A 00728 @@FSPEC ;Check out filespec
250A+3E4E 00729 LD A,78
250C+EF 00730 RST 40
250D C22D24 00731 JP NZ,SPCREQ ;NZ - Filespec required
00732 ;
00733 ; Check if Destination Filespec is legal
00734 ;
2510 11032C 00735 LD DE,FCB2 ;DE => Destination FCB
2513 00736 @@FSPEC ;Check out filespec
2513+3E4E 00737 LD A,78
2515+EF 00738 RST 40
2516 C46A27 00739 CALL NZ,CVRTUC ;Convert line to U/C
00740 ;
00741 ; Process any parameters entered
00742 ;
2519 11E42B 00743 COPY1 LD DE,COPYTBL ;DE => Parameter Table
251C 00744 @@PARAM ;Check out parameters
251C+3E11 00745 LD A,17
251E+EF 00746 RST 40
251F C21424 00747 JP NZ,IOERR ;NZ - Parameter Error
00748 ;
00749 ; Test if X parameter was entered
00750 ;
2522 110000 00751 XPARM LD DE,$-$ ;P/u (X) parm - We don't
2525 7A 00752 LD A,D ; XFER devices
2526 B3 00753 OR E ;
2527 200B 00754 JR NZ,XFER ;
00755 ;
00756 ; Is the Source or Destination a device ?
00757 ;
2529 CD3A2A 00758 CALL CKDEV ;Device ?
252C CA0F27 00759 JP Z,BYTEIO ;Yes - use byte I/O
00760 ;
00761 ; Pick up Defaults for source and destination
00762 ;
252F CD9427 00763 CALL PRSPC ;P/u defaults
2532 185B 00764 JR OPNSRC
00765 ;
00766 ; XFER initialization code
00767 ;
2534 00768 XFER @@FLAGS ;Position IY to flags
2534+3E65 00769 LD A,101
2536+EF 00770 RST 40
2537 FDCB126E 00771 BIT 5,(IY+SFLAG$) ;DO in Effect ?
253B C23124 00772 JP NZ,NOINDO ;Yes - abort
00773 ;
00774 ; If the Source or Dest is a Device - abort
00775 ;
253E CD3A2A 00776 CALL CKDEV ;Device ?
2541 CA2D24 00777 JP Z,SPCREQ ;Yes - Filespecs required
00778 ;
00779 ; P/u Drivespec of Source Filespec if entered
00780 ;
2544 21572C 00781 LD HL,FCB1 ;HL => FCB #1
2547 0E00 00782 LD C,0 ;Init to drive zero
00783 ;
00784 ; Loop to Pick up Drive # or terminator
00785 ;
2549 7E 00786 XFER1 LD A,(HL) ;Look for drive spec
254A 23 00787 INC HL
254B FE3A 00788 CP ':' ;Colon indicator?
254D 2806 00789 JR Z,XFER2 ;Jump if found
254F FE20 00790 CP ' ' ;Jump on end
2551 3806 00791 JR C,XFER3
2553 18F4 00792 JR XFER1 ;Loop
00793 ;
00794 ; Colon indicator present - p/u drive #
00795 ;
2555 7E 00796 XFER2 LD A,(HL) ;P/u user drive
2556 D630 00797 SUB '0' ;Cvrt to binary
2558 4F 00798 LD C,A ; & stuff in C
00799 ;
00800 ; Save Source drive number
00801 ;
2559 216C29 00802 XFER3 LD HL,XFRDRV+1 ;HL => Drive #
255C 71 00803 LD (HL),C ;Save drive # for later
00804 ;
00805 ; Stuff drive # into Prompt strings
00806 ;
255D 3E30 00807 LD A,'0' ;Cvt drive # to ASCII
255F 81 00808 ADD A,C
2560 32822B 00809 LD (SRC_DR),A ;Source Drive #
2563 32BC2B 00810 LD (DEST_DR),A ;Destination Drive #
00811 ;
00812 ; Transfer source FCB to destination FCB
00813 ;
2566 21572C 00814 LD HL,FCB1 ;HL => Source FCB
2569 11032C 00815 LD DE,FCB2 ;DE => Destination FCB
256C 012000 00816 LD BC,32 ;32 bytes to Xfer
256F EDB0 00817 LDIR ;Xfer
00818 ;
2571 CD342A 00819 CALL GETSYS2 ;Load SYS2 for OPEN
00820 ;
00821 ; Flash "Insert Source Disk" Message
00822 ;
2574 21622B 00823 LD HL,PMTSRC$ ;Prompt for source
2577 CDC729 00824 CALL FLASH ; and wait for
00825 ;
00826 ; Read in the GAT of the source disk
00827 ;
257A 3A6C29 00828 LD A,(XFRDRV+1) ;P/u source drive
257D 4F 00829 LD C,A ;Stuff in C
257E CD462A 00830 CALL RDGAT ;Read in GAT
2581 C21424 00831 JP NZ,IOERR ;Abort on GAT error
00832 ;
00833 ; Xfer Password, Name, & Date to destination
00834 ;
2584 21CE2D 00835 LD HL,GAT+0CEH ;Disk pw, name, date
2587 11772C 00836 LD DE,SRCSTR ;DE => Destination
258A 011200 00837 LD BC,18
258D EDB0 00838 LDIR ;Xfer
00839 ;
00840 ; OPEN the Source File with LRL of 256
00841 ;
258F CD6B2A 00842 OPNSRC CALL OPENSRC ;Open source file
2592 CD9528 00843 CALL PUTSOUR ;Xfer source filespec
2595 CDDF28 00844 CALL GETCLON ;Get clone data
2598 3A5D2C 00845 LD A,(FCB1+6) ;Get source drive
259B E607 00846 AND 7
259D CDFC28 00847 CALL WHATBIT ;Make into bit instr.
25A0 32A725 00848 LD (SRCBIT),A
25A3 3A0000 00849 LD A,($-$) ;See if new type year
25A4 00850 YFLAG1 EQU $-2
25A6 CB 00851 DB 0CBH ;Bit x,A
25A7 00 00852 SRCBIT DB 0
25A8 2005 00853 JR NZ,NEWD1 ;Source is new, done
25AA 3EFF 00854 LD A,-1 ;Else mark old source
25AC 32C426 00855 LD (CKTYP),A
00856 ;
00857 ; Pick up Source LRL
00858 ;
25AF 7D 00859 NEWD1 LD A,L ;Pt back to LRL of source
25B0 D610 00860 SUB 16
25B2 6F 00861 LD L,A
25B3 7E 00862 LD A,(HL) ;P/u source LRL
00863 ;
00864 ; Save LRL from source FCB or LRL Parameter
00865 ;
25B4 0100FF 00866 LPARM LD BC,0FF00H ;P/u LRL
25B7 04 00867 INC B
25B8 2001 00868 JR NZ,USEREGC ;If parm entered, use it
25BA 4F 00869 LD C,A
25BB 21A626 00870 USEREGC LD HL,GEOF1+1 ;HL => stuff LRL here
25BE 71 00871 LD (HL),C ;Stuff LRL for close here
00872 ;
00873 ; Ignore this if not COPY (X)
00874 ;
25BF 3A2325 00875 LD A,(XPARM+1) ;Bypass if not (X)
25C2 B7 00876 OR A
25C3 282D 00877 JR Z,OPNDST
00878 ;
00879 ; Flash "Insert Destination Disk" message
00880 ;
25C5 21972B 00881 LD HL,PMTDST$ ;Prompt destination
25C8 CDC729 00882 CALL FLASH ;Flash until loaded
00883 ;
00884 ; Read in GAT of Destination Disk
00885 ;
25CB 3A6C29 00886 LD A,(XFRDRV+1) ;P/u drive
25CE 4F 00887 LD C,A ;Read GAT from dest
25CF CD462A 00888 CALL RDGAT
25D2 C21424 00889 JP NZ,IOERR ;Jump on GAT read error
00890 ;
00891 ; Xfer Name, Password & Date to destination
00892 ;
25D5 21CE2D 00893 LD HL,GAT+0CEH ;HL => GAT + X'CE'
25D8 11892C 00894 LD DE,DSTSTR ;DE => Destination
25DB 011200 00895 LD BC,18 ;To match up when
25DE D5 00896 PUSH DE
25DF EDB0 00897 LDIR ; swapping disks
25E1 D1 00898 POP DE ;Restore Dest ptr
00899 ;
00900 ; Check if Source ID = Destination ID
00901 ;
25E2 21772C 00902 LD HL,SRCSTR ;Compare source & dest
25E5 0612 00903 LD B,18 ;CANNOT be same
25E7 CDBC29 00904 CALL CPRHLDE ;Ck MPW, PackID, Date
25EA 2006 00905 JR NZ,OPNDST ;Bypass if different
00906 ;
00907 ; Display "Source & Dest. Disks Identical"
00908 ;
25EC CD6629 00909 CALL PMTSYS ;Prompt for SYSTEM
25EF C32924 00910 JP SAMERR ;Disk packs are identical
00911 ;
00912 ; OPEN the destination File
00913 ;
25F2 11032C 00914 OPNDST LD DE,FCB2 ;DE => FCB #2
25F5 21002E 00915 LD HL,BUF1 ;HL => I/O buffer #1
25F8 CD672A 00916 CALL INITDES ;Init the file
25FB CD9B28 00917 CALL PUTDEST ;Xfer Dest filespec
25FE 3A092C 00918 LD A,(FCB2+6) ;Get dest drive
2601 E607 00919 AND 7
2603 CDFC28 00920 CALL WHATBIT ;Get bit instr.
2606 320D26 00921 LD (DSTBIT),A
2609 3A0000 00922 LD A,($-$) ;Get date type flag
260A 00923 YFLAG2 EQU $-2
260C CB 00924 DB 0CBH ;Bit x,A
260D 00 00925 DSTBIT DB 0
260E 2804 00926 JR Z,NEWD2 ;Go if dest old
2610 21C426 00927 LD HL,CKTYP ;Else indicate dest new
2613 34 00928 INC (HL)
00929 ;
00930 ; Check if X parm entered
00931 ;
2614 3A2325 00932 NEWD2 LD A,(XPARM+1) ;If (X), then source &
2617 B7 00933 OR A ; dest can be same file
2618 200D 00934 JR NZ,XF2 ;Bypass if (X)
00935 ;
00936 ; Does Source & Dest. have same DEC & drive #
00937 ;
261A 2A5D2C 00938 LD HL,(FCB1+6) ;If SRC & DST have same
261D ED5B092C 00939 LD DE,(FCB2+6) ; DEC & drive, they are
2621 AF 00940 XOR A ; identical, abort if so
2622 ED52 00941 SBC HL,DE
2624 CA3924 00942 JP Z,DSTREQ ;Same - dest spec needed
00943 ;
00944 ; Write revised ERN for space check
00945 ;
2627 CDAC28 00946 XF2 CALL CPYFILE ;"Copying : ..."
262A ED4B632C 00947 LD BC,(FCB1+12) ;P/u ESN
262E CDEF26 00948 CALL WRERN ;Write a FORMAT sector
00949 ;
00950 ; Reset Destination ESN to Zero
00951 ;
2631 210000 00952 LD HL,0 ;Rewind file
2634 220F2C 00953 LD (FCB2+12),HL ;
2637 00954 @@REW ;Rewind the file
2637+3E44 00955 LD A,68
2639+EF 00956 RST 40
00957 ;
263A CD7829 00958 XFER5 CALL PMTSRC ;Display "Insert source"
00959 ;
00960 ; Stuff Correct Buffer Address in Source FCB
00961 ;
263D 21002E 00962 LD HL,BUF1 ;Stuff in FCB
2640 225A2C 00963 RDREC1 LD (FCB1+3),HL ;Set buffer addr
00964 ;
00965 ; Read in a Source Sector
00966 ;
2643 11572C 00967 LD DE,FCB1 ;DE => Source FCB
2646 00968 @@READ ;Read a sector
2646+3E43 00969 LD A,67
2648+EF 00970 RST 40
2649 280B 00971 JR Z,RDREC2 ;Bypass if no error
00972 ;
00973 ; Some sort of I/O Error - Check it out
00974 ;
264B FE1C 00975 CP 1CH ;EOF?
264D 2827 00976 JR Z,GOTEOF
264F FE1D 00977 CP 1DH ;NRN>ERN?
2651 2823 00978 JR Z,GOTEOF
2653 C31424 00979 JP IOERR ;Abort
00980 ;
00981 ; Successful READ - is there enough memory ?
00982 ;
2656 24 00983 RDREC2 INC H ;Bump memory pointer
2657 7C 00984 LD A,H ;Go past top?
2658 FE00 00985 RDREC3 CP $-$
265A 20E4 00986 JR NZ,RDREC1 ;Loop if not
00987 ;
00988 ; Read in all we could - display "Insert Dest"
00989 ;
265C CD9A29 00990 CALL PMTDST ;Get destination
00991 ;
00992 ; Stuff Source FCB buffer into Destination FCB
00993 ;
265F 21002E 00994 LD HL,BUF1 ;Set buffer start
2662 22062C 00995 RDREC4 LD (FCB2+3),HL
00996 ;
00997 ; Loop to WRITE Destination file
00998 ;
2665 11032C 00999 LD DE,FCB2 ;DE => Destination FCB
2668 01000 @@WRITE ;Write a sector
2668+3E4B 01001 LD A,75
266A+EF 01002 RST 40
266B C21424 01003 JP NZ,IOERR ;Jump on write error
01004 ;
01005 ; Bump memory ptr & check if finished
01006 ;
266E 24 01007 INC H ;Else bump memory pointer
266F 7C 01008 LD A,H ;At top?
2670 FE00 01009 RDREC5 CP $-$
2672 20EE 01010 JR NZ,RDREC4 ;Loop if not
2674 18C4 01011 JR XFER5 ;Else go back to source
01012 ;
01013 ; Got EOF error from source - Write out EOF
01014 ;
2676 CD4229 01015 GOTEOF CALL GEOF5 ;Write any memory left
2679 2A5F2C 01016 LD HL,(FCB1+8) ;P/u EOF & LRL
267C 220B2C 01017 LD (FCB2+8),HL ;Xfer to FCB2
01018 ;
01019 ; Get @CLOSE module if needed
01020 ;
267F CD6629 01021 CALL PMTSYS ;Prompt SYSTEM if needed
2682 CD372A 01022 CALL GETSYS3 ;Load SYS3 for CLOSE
2685 3A6C29 01023 LD A,(XFRDRV+1) ;P/u drive #
2688 B7 01024 OR A ;Is it zero ?
2689 CC9A29 01025 CALL Z,PMTDST ;Get dest if drive 0
01026 ;
01027 ; Close the destination file
01028 ;
268C ED4B092C 01029 LD BC,(FCB2+6) ;P/u drive # & DEC
2690 11032C 01030 LD DE,FCB2 ;DE => Destin file FCB
2693 01031 @@CLOSE ;Close the dest file
2693+3E3C 01032 LD A,60
2695+EF 01033 RST 40
2696 C21424 01034 JP NZ,IOERR ;Jump on error
01035 ;
01036 ; Get the destination file directory record
01037 ;
2699 01038 @@DIRRD ;Get destin dir entry
2699+3E57 01039 LD A,87
269B+EF 01040 RST 40
269C C21424 01041 JP NZ,IOERR ;I/O error - abort
01042 ;
01043 ; Stuff New LRL into directory entry
01044 ;
269F C5 01045 PUSH BC ;Save drive & DEC
01046 ;
26A0 E5 01047 PUSH HL ;HL => DIR+0 of dest
26A1 3E04 01048 LD A,4 ;Posn to LRL byte
26A3 85 01049 ADD A,L ;
26A4 6F 01050 LD L,A ;HL => DIR+4 (LRL)
26A5 3600 01051 GEOF1 LD (HL),$-$ ;GEOF1+1 contains LRL
26A7 E1 01052 POP HL ;Restore HL
01053 ;
01054 ; Pick up the Clone Parameter
01055 ;
26A8 11FFFF 01056 CPARM LD DE,-1 ;Default = ON
26AB 7A 01057 LD A,D ;Was it changed ?
26AC B3 01058 OR E
26AD 2822 01059 JR Z,GEOF2 ;CLONE = N
01060 ;
01061 ; CLONE = Yes, Transfer Attributes & Date
01062 ;
26AF E5 01063 PUSH HL ;Save DIR+0
26B0 EB 01064 EX DE,HL
26B1 219B2C 01065 LD HL,CLONSAV ;HL => Attr, DE => DIR+0
26B4 010300 01066 LD BC,3 ;Move in prot/date, etc
26B7 EDB0 01067 LDIR
01068 ;
01069 ; Transfer Password fields to entry
01070 ;
26B9 3E0D 01071 LD A,13 ;Pt to dir pswd fields
26BB 83 01072 ADD A,E
26BC 5F 01073 LD E,A ;DE => DIR+16
26BD 0E04 01074 LD C,4 ;BC = 4 bytes to xfer
26BF EDB0 01075 LDIR
26C1 1B 01076 DEC DE ;Pt at new year, DIR+19
26C2 E1 01077 POP HL ;Get back DIR+0
26C3 3EFE 01078 LD A,0FEH ;Ck if old type to new
26C4 01079 CKTYP EQU $-1
26C5 B7 01080 OR A
26C6 2009 01081 JR NZ,GEOF2 ;Was not old to new
26C8 23 01082 INC HL ;Was old to new, change
26C9 23 01083 INC HL ; date/time
26CA 7E 01084 LD A,(HL) ;Get old year
26CB E607 01085 AND 7
26CD 12 01086 LD (DE),A ;Year to DIR+19
26CE 1B 01087 DEC DE
26CF AF 01088 XOR A ;Make time 0
26D0 12 01089 LD (DE),A ;Store in DIR+18
01090 ;
01091 ; Write out Directory entry
01092 ;
26D1 C1 01093 GEOF2 POP BC ;Rcvr drive & DEC
26D2 01094 @@DIRWR ;Write Sector with entry
26D2+3E58 01095 LD A,88
26D4+EF 01096 RST 40
26D5 180C 01097 JR GEOF4 ;Go to Error check
01098 ;
01099 ; CLOSE the destination file
01100 ;
26D7 21FFFF 01101 GEOF3A LD HL,-1 ;Abort JCL
26DA 22EA26 01102 LD (RETCOD+1),HL ; if hit
26DD 11032C 01103 GEOF3 LD DE,FCB2 ;DE => Destination FCB
26E0 01104 @@CLOSE ;Close the file
26E0+3E3C 01105 LD A,60
26E2+EF 01106 RST 40
26E3 C21424 01107 GEOF4 JP NZ,IOERR ;I/O Error - Abort
01108 ;
01109 ; Flash "Insert SYSTEM disk" & exit
01110 ;
26E6 CD6629 01111 GOHOME CALL PMTSYS ;Prompt SYSTEM if needed
26E9 210000 01112 RETCOD LD HL,$-$ ;P/u return code 0=good
26EC C32224 01113 JP SAVESP ;Finished
01114 ;
01115 ; WRERN - Write a format sector on FILE #2
01116 ;
26EF 11032C 01117 WRERN LD DE,FCB2 ;DE => File #2 FCB
26F2 78 01118 LD A,B ;Don't bother to write
26F3 B1 01119 OR C ; a sector if source
26F4 C8 01120 RET Z ; is empty
01121 ;
01122 ; Position to ERN of File #2
01123 ;
26F5 0B 01124 DEC BC ;Adj for ERN
26F6 01125 @@POSN ;Position to ERN
26F6+3E42 01126 LD A,66
26F8+EF 01127 RST 40
26F9 D5 01128 PUSH DE ;Save FCB ptr
01129 ;
01130 ; Fill a buffer of X'E5's
01131 ;
26FA 21002E 01132 LD HL,BUF1 ;HL => I/O buffer
26FD 11012E 01133 LD DE,BUF1+1 ;DE => I/O buffer+1
2700 01FF00 01134 LD BC,255 ;255+1 bytes to fill
2703 36E5 01135 LD (HL),0E5H ;Format byte = X'E5'
2705 EDB0 01136 LDIR ;Fill buffer
01137 ;
01138 ; Write ERN of File #2
01139 ;
2707 D1 01140 POP DE ;DE => FCB #2
2708 01141 @@WRITE ;Write sector
2708+3E4B 01142 LD A,75
270A+EF 01143 RST 40
270B C8 01144 RET Z ;RETurn if no error
270C C31424 01145 JP IOERR ;Error - abort
01146 ;
01147 ; BYTEIO - OPEN Source or dest using byte I/O
01148 ;
270F CD6B2A 01149 BYTEIO CALL OPENSRC ;OPEN source file
2712 CD9528 01150 CALL PUTSOUR ;Get source filespec
01151 ;
01152 ; INIT the dest device with LRL from parm
01153 ;
2715 3AB525 01154 LD A,(LPARM+1) ;P/u LRL from Parm
2718 47 01155 LD B,A ;Open destination
2719 11032C 01156 LD DE,FCB2 ;DE => FCB #2
271C 21002F 01157 LD HL,BUF2 ;Different buffer
271F 3E3A 01158 LD A,@INIT ;@INIT SVC #
2721 CD7C2A 01159 CALL GETFILE ;Issue it
2724 CD9B28 01160 CALL PUTDEST ;Get dest devspec
2727 CDAC28 01161 CALL CPYFILE ;"Copying/Appending : .."
272A AF 01162 XOR A ;Reset LRL = 0
272B 320C2C 01163 LD (FCB2+9),A ;For sector I/O
01164 ;
01165 ; Turn on cursor
01166 ;
272E 0E0E 01167 BYTIO0 LD C,14 ;Turn cursor on
2730 CD1A2A 01168 CALL DISPB ;Display byte
01169 ;
01170 ; BYTIO1 Loop - File - Dev, Dev - File, Dev - Dev
01171 ; Was the key hit ?
01172 ;
01173 BYTIO1
2733 CD6229 01174 CALL CKBRK ;Was the key
2736 C2D726 01175 E_O_F JP NZ,GEOF3A ; hit ????
01176 ;
01177 ; The was not hit - get a character
01178 ;
2739 11572C 01179 LD DE,FCB1 ;DE => Source FCB
273C 01180 @@GET ;Get a byte
273C+3E03 01181 LD A,3
273E+EF 01182 RST 40
273F 280B 01183 JR Z,BYTIO4 ;Good - stuff it
01184 ;
01185 ; If Error # = 0, then try @GET again
01186 ;
2741 B7 01187 OR A ;Error # = 0 ?
2742 28EF 01188 JR Z,BYTIO1 ;Yes - @GET again
01189 ;
01190 ; Is the Error an "End of File" error ?
01191 ;
2744 FE1C 01192 CP 1CH ;EOF?
2746 CADD26 01193 JP Z,GEOF3 ;Yes - finished
2749 C31424 01194 JP IOERR ;I/O error - abort
01195 ;
01196 ; Was the source character a ?
01197 ;
274C FE80 01198 BYTIO4 CP BREAK ; character ?
274E 2007 01199 JR NZ,BYTIO4A ;No - @PUT it
01200 ;
01201 ; Source = --- is the BREAK bit set ?
01202 ;
2750 CD6229 01203 CALL CKBRK ; bit set ?
2753 20E1 01204 JR NZ,E_O_F ;Yes - stop
2755 3E80 01205 LD A,BREAK ;Restore A
01206 ;
01207 ; Output byte to destination
01208 ;
2757 11032C 01209 BYTIO4A LD DE,FCB2 ;DE => Dest. Device/File
275A 4F 01210 LD C,A ;Stuff byte in C for @PUT
275B 01211 @@PUT ;Output byte
275B+3E04 01212 LD A,4
275D+EF 01213 RST 40
275E C21424 01214 JP NZ,IOERR ;NZ - I/O Error
01215 ;
01216 ; Echo byte if parameter set
01217 ;
2761 110000 01218 EPARM LD DE,$-$ ;P/u ECHO parm
2764 14 01219 INC D ;Specified ?
2765 CC1A2A 01220 CALL Z,DISPB ;Echo byte
2768 18C9 01221 JR BYTIO1 ;Go til EOF or BREAK
01222 ;
276A 01223 *GET LBCOPYB:3
01224 ;LBCOPYB/ASM - COPY/APPEND Common Routines
01227 ;
01228 ; CVRTUC - Transfer partspec & convert to U/C
01229 ; HL => Buffer containing characters to parse
01230 ; DE => Destination of converted line
01231 ;
276A CD7227 01232 CVRTUC CALL CVRT ;Convert line
276D 3E0D 01233 LD A,CR ;Ensure end-of-line
276F 12 01234 LD (DE),A ; with a carriage return
2770 C9 01235 RET
01236 ;
01237 ; Position to First non-space character
01238 ;
2771 23 01239 CVRT0 INC HL
2772 7E 01240 CVRT LD A,(HL) ;P/u possible dest char
2773 FE0D 01241 CP CR ;Exit on CR
2775 C8 01242 RET Z
2776 FE20 01243 CP ' ' ;Loop on space
2778 28F7 01244 JR Z,CVRT0
277A 2B 01245 DEC HL ;Backup to 1st separator
01246 ;
01247 ; HL => Filespec or Devspec, convert to U/C
01248 ;
277B 0620 01249 LD B,32 ;Max 32 chars
277D 7E 01250 COP1 LD A,(HL) ;Transfer the partial
277E FE61 01251 CP 'a' ;Cvrt lc to uc
2780 3806 01252 JR C,COP2
2782 FE7B 01253 CP 'z'+1
2784 3002 01254 JR NC,COP2
2786 CBAF 01255 RES 5,A
2788 12 01256 COP2 LD (DE),A ;Filespec until paren
2789 FE0D 01257 CP CR ;RETurn if terminator
278B C8 01258 RET Z
278C FE28 01259 CP '(' ;Parameter ?
278E C8 01260 RET Z
278F 23 01261 INC HL ;Bump ptr
2790 13 01262 INC DE
2791 10EA 01263 DJNZ COP1 ;32 characters max
2793 C9 01264 RET
01265 ;
01266 ; PRSPC - Match Source & Dest. specs for defaults
01267 ;
2794 21572C 01268 PRSPC LD HL,FCB1 ;HL => Source FCB
2797 11032C 01269 LD DE,FCB2 ;DE => Destin FCB
01270 ;
01271 ; Abort if first character is illegal
01272 ;
279A 1A 01273 LD A,(DE) ;P/u 1st char of dest
279B FE0D 01274 CP CR ;Is it a C/R ?
279D CA3924 01275 JP Z,DSTREQ ;"Destination spec req"
27A0 FE30 01276 CP '0' ;Numeric ?
27A2 3805 01277 JR C,CHKDEST
27A4 FE3A 01278 CP '9'+1
27A6 DA3924 01279 JP C,DSTREQ ;Yes - "Dest spec req"
01280 ;
27A9 D5 01281 CHKDEST PUSH DE ;Save Destination FCB ptr
01282 ;
01283 ; If no dest. filename, xfer source filename
01284 ;
27AA 1A 01285 LD A,(DE) ;P/u a dest char
27AB FE41 01286 CP 'A' ;Filename present ?
27AD DCE427 01287 CALL C,PRSPC7 ;No - xfer src filename
27B0 062F 01288 LD B,'/' ;With an alpha, init to
27B2 CDBD27 01289 CALL PRSPC2 ; test for extension
27B5 062E 01290 LD B,'.' ;Init to test for pswd
27B7 CDBD27 01291 CALL PRSPC2
27BA D1 01292 POP DE
27BB C9 01293 RET
01294 ;
01295 ; PRSPC2 - Transfer Field to destination
01296 ; DE => Start of Destination Field
01297 ; B = Delimiter to Position one byte after
01298 ;
27BC 13 01299 PRSPC1 INC DE
01300 ;
01301 ; Finished with Field (Delimiter hit) ?
01302 ;
27BD 1A 01303 PRSPC2 LD A,(DE) ;Is the next char the
27BE B8 01304 CP B ;Separator to look for
27BF 280E 01305 JR Z,PRSPC3
01306 ;
01307 ; Skip over an existing destination field
01308 ;
27C1 FE41 01309 CP 'A' ;Alphabetic ?
27C3 30F7 01310 JR NC,PRSPC1 ;Yes - skip it
27C5 FE30 01311 CP '0' ;Numeric ?
27C7 3808 01312 JR C,PRSPC4 ;No - use source field
27C9 FE3A 01313 CP '9'+1 ;Numeric ?
27CB 38EF 01314 JR C,PRSPC1 ;Yes - skip it
01315 ;
27CD 1802 01316 JR PRSPC4 ;Use source field
01317 ;
01318 ; Hit the delimiter - Position to next char
01319 ;
27CF 13 01320 PRSPC3 INC DE ;Position to next field
27D0 C9 01321 RET ; and RETurn
01322 ;
01323 ; Scan Source spec & see if it contains field
01324 ;
27D1 E5 01325 PRSPC4 PUSH HL ;Save ptr to source
27D2 7E 01326 PRSPC5 LD A,(HL) ;Grab a source char
27D3 23 01327 INC HL ;Position to next char
01328 ;
01329 ; Is the character a Terminator ?
01330 ;
27D4 FE03 01331 CP ETX ;End of line ?
27D6 280A 01332 JR Z,PRSPC6 ;If so, not in source
27D8 FE0D 01333 CP CR ;End of line?
27DA 2806 01334 JR Z,PRSPC6 ;If so, not in source
01335 ;
01336 ; is the character the field delimiter ?
01337 ;
27DC B8 01338 CP B ;Delimiter ?
27DD 20F3 01339 JR NZ,PRSPC5 ;Nope, continue
01340 ;
01341 ; Transfer Source Field to Destination
01342 ;
27DF CDF027 01343 CALL MVFLD1 ;Yes, xfer the SRC field
01344 ;
27E2 E1 01345 PRSPC6 POP HL ;Rcvr source ptr
27E3 C9 01346 RET
01347 ;
01348 ; PRSPC7 - Shoehorn source into destination field
01349 ;
01350 ; Check if 1st char in (HL) is alphanumeric
01351 ;
27E4 7E 01352 PRSPC7 LD A,(HL) ;P/u source char
27E5 FE30 01353 CP '0' ;RET NC if alphanumeric
27E7 D8 01354 RET C ;C - not alphanumeric
27E8 FE3A 01355 CP '9'+1 ;Numeric (0-9) ?
27EA 3803 01356 JR C,MVFLD ;Xfer if it is
27EC FE41 01357 CP 'A' ;Not numeric -
27EE D8 01358 RET C ;Must be alphabetic
01359 ;
01360 ; Shoehorn a source field byte into dest FCB
01361 ;
27EF 23 01362 MVFLD INC HL ;Bump source pointer
27F0 E5 01363 MVFLD1 PUSH HL
27F1 62 01364 LD H,D ;Xfer dest ptr to HL
27F2 6B 01365 LD L,E
01366 ;
01367 ; P/u current char, & stuff in last char
01368 ;
27F3 4E 01369 MVFLD2 LD C,(HL) ;P/u dest char
27F4 77 01370 LD (HL),A ;Stuff in last character
27F5 23 01371 INC HL ;Posn to next char
01372 ;
01373 ; Finished with field ?
01374 ;
27F6 79 01375 LD A,C ;Test dest for
27F7 FE03 01376 CP ETX ;End of line ?
27F9 2804 01377 JR Z,MVFLD3
01378 ;
27FB FE0D 01379 CP CR ;End of line ?
27FD 20F4 01380 JR NZ,MVFLD2 ;Ripple the destination
01381 ;
01382 ; Done stuffing 1 source byte into dest field
01383 ;
27FF 77 01384 MVFLD3 LD (HL),A ;Stuff the terminator
2800 E1 01385 POP HL ;Restore Source FCB
2801 13 01386 INC DE ;Advance to next pos
2802 18E0 01387 JR PRSPC7 ;Go get next source byte
01388 ;
01389 ; DOSVC - Get Filespec/Devspec & Issue @OPEN/@INIT
01390 ;
2804 F5 01391 DOSVC PUSH AF ;Save SVC #
2805 E5 01392 PUSH HL ;Buffer ptr
2806 D5 01393 PUSH DE ;FCB
01394 ;
01395 ; Transfer Filespec/Devspec into TEMBUF
01396 ;
2807 21232C 01397 LD HL,TEMBUF
280A 1A 01398 TLP LD A,(DE) ;P/u byte from FCB
280B FE2F 01399 CP '/' ;Extension ?
280D 2008 01400 JR NZ,STUFCHR ;No - save the char
280F 13 01401 INC DE ;Is the next character
2810 1A 01402 LD A,(DE) ; valid ?
2811 FE41 01403 CP 'A'
2813 3802 01404 JR C,STUFCHR ;No - don't output it
2815 1B 01405 DEC DE ;Back one
2816 1A 01406 LD A,(DE) ;P/u slash
2817 77 01407 STUFCHR LD (HL),A ;Xfer to TEMBUF
2818 23 01408 INC HL
2819 13 01409 INC DE
281A FE0E 01410 CP CR+1 ;Done ?
281C 3808 01411 JR C,DUN
281E FE3A 01412 CP ':'
2820 2804 01413 JR Z,DUN
2822 FE2E 01414 CP '.'
2824 20E4 01415 JR NZ,TLP
01416 ;
01417 ; Found valid terminator - Is this a device ?
01418 ;
2826 2B 01419 DUN DEC HL ;Back up to term
2827 D1 01420 POP DE ;DE => FCB+0
2828 1A 01421 LD A,(DE) ;Device ?
2829 FE2A 01422 CP '*'
282B 2807 01423 JR Z,DUN2 ;Yes - done
282D 363A 01424 LD (HL),':' ;No - overwrite with ":"
282F 23 01425 INC HL ;Bump
2830 229228 01426 LD (DSPEC+1),HL ;Save drivespec location
2833 23 01427 INC HL ;Bump
2834 3603 01428 DUN2 LD (HL),ETX ;End with X'03'
2836 E1 01429 POP HL ;HL => Disk I/O buffer
2837 F1 01430 POP AF ;A = SVC #
2838 326C28 01431 LD (SVCNUM+1),A ;Save SVC #
01432 ;
01433 ; Issue Supervisory Call
01434 ;
283B EF 01435 RST 28H ;Do it
283C F5 01436 PUSH AF ;Save SVC condition
283D CD8428 01437 CALL GETDRIV ;P/u drv (in C) if file
2840 2817 01438 JR Z,DEVICE ;Z - this is a device
01439 ;
01440 ; This is a file - did we @INIT it ?
01441 ;
2842 3A6C28 01442 LD A,(SVCNUM+1) ;P/u SVC #
2845 FE3A 01443 CP @INIT ;Is it @INIT ?
2847 2010 01444 JR NZ,DEVICE ;No - don't worry
01445 ;
01446 ; Was the @INIT successful ?
01447 ;
2849 F1 01448 POP AF ;Don't perform
284A F5 01449 PUSH AF ; a @CKDRV if you didn't
284B 2804 01450 JR Z,DO_CKDR ; successfully @INIT it.
284D FE2A 01451 CP 42 ;LRL Open Fault ?
284F 2008 01452 JR NZ,DEVICE ;No - Don't @CKDRV
01453 ;
01454 ; @INIT was ok - is this a Write Prot Disk?
01455 ;
2851 01456 DO_CKDR @@CKDRV ;Write Protected Disk ?
2851+3E21 01457 LD A,33
2853+EF 01458 RST 40
2854 3E0F 01459 LD A,15 ;Init WP disk error code
2856 DA1424 01460 JP C,IOERR ;Yes - abort
01461 ;
01462 ; Check status on the @INIT we did
01463 ;
2859 F1 01464 DEVICE POP AF ;Recover status
285A 2803 01465 JR Z,CHKPROT ;Check PROTection status
01466 ;
01467 ; Ignore Error #42 - "LRL Open Fault"
01468 ;
285C FE2A 01469 CP 42 ;Ignore this error
285E C0 01470 RET NZ ;NZ - Abort
01471 ;
01472 ; Check if File has proper Access
01473 ;
285F DDCB007E 01474 CHKPROT BIT 7,(IX) ;Is this a filespec ?
2863 281D 01475 JR Z,OKYDOKY ;No - don't check
2865 DD7E01 01476 LD A,(IX+1) ;P/u protection byte
2868 E607 01477 AND 7
286A 47 01478 LD B,A ;Xfer to B
286B 3E00 01479 SVCNUM LD A,$-$ ;P/u SVC #
286D FE3A 01480 CP @INIT ;@INIT ?
286F 78 01481 LD A,B ;P/u protection level
2870 280C 01482 JR Z,INIT1 ;Z - Must be < 5
2872 FE06 01483 CP 6 ;Read Access ?
2874 380C 01484 JR C,OKYDOKY ;Yes - set Z & RETurn
01485 ;
01486 ; Illegal Access to protected file
01487 ;
2876 01488 ILLACC @@CLOSE ;Close File
2876+3E3C 01489 LD A,60
2878+EF 01490 RST 40
2879 3E19 01491 LD A,25 ;File Access Denied
287B C31424 01492 JP IOERR ;Error - Regardless
01493 ;
287E FE05 01494 INIT1 CP 5 ;Update Access ?
2880 30F4 01495 JR NC,ILLACC ;No - Illegal Access
01496 ;
2882 AF 01497 OKYDOKY XOR A ;Set Z flag
2883 C9 01498 RET ;And RETurn
01499 ;
01500 ; GETDRIV - P/u Drive # from FCB & convert to ASCII
01501 ;
2884 D5 01502 GETDRIV PUSH DE ;Get fcb to
2885 DDE1 01503 POP IX ; here.
2887 1A 01504 LD A,(DE) ;Device ?
2888 CB7F 01505 BIT 7,A
288A C8 01506 RET Z ;Device - RETurn
01507 ;
01508 ; Stuff Drive # into Buffer
01509 ;
288B DD7E06 01510 LD A,(IX+6)
288E 4F 01511 LD C,A ;Xfer to C
288F C630 01512 ADD A,'0' ;Convert to ASCII
2891 320000 01513 DSPEC LD ($-$),A
2894 C9 01514 RET ;RETurn w/ condition
01515 ;
01516 ; PUTSOUR/PUTDEST - Create Src/Dest File/Dev specs
01517 ;
2895 E5 01518 PUTSOUR PUSH HL ;Save HL
2896 21332C 01519 LD HL,FROM ;Xfer there
2899 1804 01520 JR XBUFF
289B E5 01521 PUTDEST PUSH HL ;Save HL
289C 21472C 01522 LD HL,TO2
01523 ;
01524 ; XBUFF - Transfer TEMBUF contents to User Buffer
01525 ; HL => Destination of Filespec/Devspec
01526 ;
289F D5 01527 XBUFF PUSH DE ;Save FCB ptr
28A0 11232C 01528 LD DE,TEMBUF ;DE => Source
28A3 EB 01529 EX DE,HL ;Swap for LDIR
28A4 010F00 01530 LD BC,15 ;15 bytes Max
28A7 EDB0 01531 LDIR ;Xfer
28A9 D1 01532 POP DE ;DE => FCB+0
28AA E1 01533 POP HL ;Recover Buffer ptr
28AB C9 01534 RET ;Done
01535 ;
01536 ; CPYFILE - Display Copying/Appending Message
01537 ;
28AC E5 01538 CPYFILE PUSH HL ;Save registers
28AD D5 01539 PUSH DE
28AE 21832A 01540 LD HL,COPYMS ;"Copying : "
28B1 3E01 01541 APPFLAG LD A,$-$+1 ;Append or Copy ?
28B3 B7 01542 OR A
28B4 2003 01543 JR NZ,ITSCOPY
28B6 218D2A 01544 LD HL,APPDMS ;"Appending : "
28B9 CD212A 01545 ITSCOPY CALL DSPLY
28BC 21332C 01546 LD HL,FROM ;Source
28BF CD212A 01547 CALL DSPLY
28C2 21432C 01548 LD HL,TO ;" TO "
28C5 CD212A 01549 CALL DSPLY
28C8 0E0D 01550 LD C,CR ;End line
28CA CD1A2A 01551 CALL DISPB ;Display byte
28CD D1 01552 POP DE ;Restore Regs
28CE E1 01553 POP HL
28CF C9 01554 RET
01555 ;
01556 ; GETLRL - Get LRL from a Directory Entry
01557 ; DE => FCB of filespec
01558 ; IX <= FCB of filespec
01559 ; A <= LRL of file
01560 ;
28D0 D5 01561 GETLRL PUSH DE ;Xfer fcb to IX
28D1 DDE1 01562 POP IX
28D3 DD7E07 01563 LD A,(IX+7) ;P/u DEC
28D6 E6E0 01564 AND 0E0H ;Calculate Record Number
28D8 C604 01565 ADD A,4 ;Pt to LRL
28DA 6F 01566 LD L,A
28DB 2600 01567 SYSBUF LD H,$-$ ;P/u hi-byte of SBUFF$
28DD 7E 01568 LD A,(HL) ;P/u LRL
28DE C9 01569 RET
01570 ;
01571 ; GETCLON - Recover Cloning info from Source
01572 ;
28DF D5 01573 GETCLON PUSH DE
28E0 DDE1 01574 POP IX ;Xfer FCB to IX
28E2 DD7E07 01575 LD A,(IX+7) ;P/u source DEC
28E5 E6E0 01576 AND 0E0H ;Pt to start of record
28E7 6F 01577 LD L,A ;Pt to core record
28E8 2600 01578 SYSBUF2 LD H,$-$ ;P/u hi-byte of SBUFF$
28EA 119B2C 01579 LD DE,CLONSAV ;Save clone info
28ED 010300 01580 LD BC,3
28F0 EDB0 01581 LDIR
28F2 3E0D 01582 LD A,13 ;Pt to password fields
28F4 85 01583 ADD A,L
28F5 6F 01584 LD L,A
28F6 010400 01585 LD BC,4 ;Save them also
28F9 EDB0 01586 LDIR
28FB C9 01587 RET
01588 ;
01589 ; Change drive # in A to Bit x,A opcode
01590 ;
28FC 47 01591 WHATBIT LD B,A ;Drive # to B
28FD 04 01592 INC B ;Always do once
28FE 3E3F 01593 LD A,47H-8 ;Init opcode
2900 C608 01594 WHTB1 ADD A,8 ;Index to proper opcode
2902 10FC 01595 DJNZ WHTB1
2904 C9 01596 RET
01597 ;
01598 ; DOINIT - Initialization for APPEND or COPY
01599 ;
2905 01600 DOINIT EQU $
01601 ;
01602 ; Calculate high byte of available memory
01603 ;
2905 E5 01604 PUSH HL ;Save HL
2906 01605 @@FLAGS ;IY => System Flags
2906+3E65 01606 LD A,101
2908+EF 01607 RST 40
2909 FDE5 01608 PUSH IY
290B D1 01609 POP DE
290C 211800 01610 LD HL,'Y'-'A' ;Find year type flag locn
290F 19 01611 ADD HL,DE
2910 22A425 01612 LD (YFLAG1),HL ;Save for date test
2913 220A26 01613 LD (YFLAG2),HL
2916 210000 01614 LD HL,0 ;P/u HIGH$
2919 45 01615 LD B,L
291A FDCB024E 01616 BIT 1,(IY+CFLAG$) ;@CMNDR ?
291E 2801 01617 JR Z,USEHI ;No - use HIGH$
2920 04 01618 INC B ;Yes - use LOW$
2921 01619 USEHI @@HIGH$
2921+3E64 01620 LD A,100
2923+EF 01621 RST 40
01622 ;
01623 ; Stuff high byte into memory check locations
01624 ;
2924 23 01625 INC HL ; 256-byte block
2925 25 01626 DEC H
2926 7C 01627 LD A,H ;Set up test bytes
2927 325926 01628 LD (RDREC3+1),A
292A 327126 01629 LD (RDREC5+1),A
292D 324729 01630 LD (GEOF6+1),A
01631 ;
01632 ; Pick up high byte of System Buffer (SBUFF$)
01633 ;
2930 010000 01634 LD BC,0 ;DEC = 0, Drive = 0
2933 01635 @@DIRRD ;Read in BOOT/SYS
2933+3E57 01636 LD A,87
2935+EF 01637 RST 40
2936 7C 01638 LD A,H ;P/u high byte of SBUFF$
2937 32DC28 01639 LD (SYSBUF+1),A ;Stuff away for LRL
293A 32E928 01640 LD (SYSBUF2+1),A ;Stuff away for CLONE
01641 ;
01642 ; Reset & bits
01643 ;
293D CD0E2A 01644 CALL RESKFLG ;Reset bits 1-2
2940 E1 01645 POP HL
2941 C9 01646 RET
01647 ;
01648 ; GEOF5 - Write out the last sector of destination
01649 ;
2942 7C 01650 GEOF5 LD A,H ;P/u hi-order pointer
2943 FE2E 01651 CP BUF1<-8 ;Same as start?
2945 C8 01652 RET Z ;Ret if finished
01653 ;
01654 ; At the end of buffer area ?
01655 ;
2946 FE00 01656 GEOF6 CP $-$ ;GEOF6+1 = msb of top
2948 C8 01657 RET Z ;Return if finished
01658 ;
01659 ; Flash "Insert Dest. Disk" & write remainder
01660 ;
2949 CD9A29 01661 CALL PMTDST ;Prompt destination
294C 44 01662 LD B,H ;Save highest used
294D 21002E 01663 LD HL,BUF1 ;Pt to start
01664 ;
01665 ; Loop to write out remainder of dest. file
01666 ;
2950 22062C 01667 GEOF7 LD (FCB2+3),HL ;Set dest buffer address
2953 11032C 01668 LD DE,FCB2 ;DE => Dest. FCB
2956 01669 @@WRITE ;Write a record
2956+3E4B 01670 LD A,75
2958+EF 01671 RST 40
2959 C21424 01672 JP NZ,IOERR ;Jump on write error
01673 ;
01674 ; Finished writing ?
01675 ;
295C 24 01676 INC H ;Bump buff ptr
295D 7C 01677 LD A,H
295E B8 01678 CP B ;Finished?
295F 20EF 01679 JR NZ,GEOF7 ;Loop if not
2961 C9 01680 RET ;Return
01681 ;
01682 ; CKBRK - Check for BREAK
01683 ; NZ - key was depressed
01684 ;
01685 CKBRK
2962 01686 @@CKBRKC ; hit ?
2962+3E6A 01687 LD A,106
2964+EF 01688 RST 40
2965 C9 01689 RET ;Z - No, NZ - Yes
01690 ;
01691 ; PMTSYS - Prompt for a system disk
01692 ;
2966 3A2325 01693 PMTSYS LD A,(XPARM+1) ;X parameter entered ?
2969 B7 01694 OR A
296A C8 01695 RET Z ;No - need to prompt
01696 ;
01697 ; If Xfer drive number isn't 0 - don't prompt
01698 ;
296B 3E00 01699 XFRDRV LD A,$-$ ;XFRDRV+1 contains drv #
296D B7 01700 OR A ;Is it zero ?
296E C0 01701 RET NZ ;Ret if not SYSTEM drive
01702 ;
01703 ; Flash "Insert SYSTEM disk" message
01704 ;
296F E5 01705 PUSH HL ;Save HL
2970 21432B 01706 LD HL,PMTSYS$ ;"Insert SYSTEM disk"
2973 CDC729 01707 CALL FLASH ;Flash, & RET if
2976 E1 01708 POP HL ;Restore HL
2977 C9 01709 RET
01710 ;
01711 ; PMTSRC - Prompt for Source Disk
01712 ;
2978 3A2325 01713 PMTSRC LD A,(XPARM+1) ;X parameter entered ?
297B B7 01714 OR A
297C C8 01715 RET Z ;No - don't display it
01716 ;
01717 ; Flash "Insert Source disk" message
01718 ;
297D E5 01719 PUSH HL
297E 21622B 01720 LD HL,PMTSRC$ ;Init for source
2981 CDC729 01721 CALL FLASH ;Dsp msg & await reply
01722 ;
01723 ; Read in the GAT from the Source Disk
01724 ;
2984 3A6C29 01725 LD A,(XFRDRV+1) ;P/u drive
2987 4F 01726 LD C,A ;Stuff in C
2988 CD462A 01727 CALL RDGAT ;Get GAT
01728 ;
01729 ; Is this the correct source disk ?
01730 ;
298B 21CE2D 01731 LD HL,GAT+0CEH ;HL => Name & Date field
298E 11772C 01732 LD DE,SRCSTR ;DE => Original Source
2991 0612 01733 LD B,18 ;Same source disk ?
2993 CDBC29 01734 CALL CPRHLDE ;Z - same, NZ - different
2996 E1 01735 POP HL ;Restore HL
2997 20DF 01736 JR NZ,PMTSRC ;Re-request if not match
2999 C9 01737 RET ;Okay
01738 ;
01739 ; PMTDST - Prompt for Destination disk
01740 ;
299A 3A2325 01741 PMTDST LD A,(XPARM+1) ;X parameter entered ?
299D B7 01742 OR A
299E C8 01743 RET Z ;No - RETurn
01744 ;
01745 ; Flash "Insert Destination disk" message
01746 ;
299F E5 01747 PUSH HL
29A0 21972B 01748 LD HL,PMTDST$ ;Pt to msg
29A3 CDC729 01749 CALL FLASH ;Prompt & await reply
01750 ;
01751 ; Read in GAT from original destination disk
01752 ;
29A6 3A6C29 01753 LD A,(XFRDRV+1) ;P/u drive #
29A9 4F 01754 LD C,A ;Stuff in C
29AA CD462A 01755 CALL RDGAT ;Get GAT
01756 ;
01757 ; Is this the same destination disk ?
01758 ;
29AD 21CE2D 01759 LD HL,GAT+0CEH ;HL => Name & Date field
29B0 11892C 01760 LD DE,DSTSTR ;DE => Original dest
29B3 0612 01761 LD B,18 ;Same destination disk ?
29B5 CDBC29 01762 CALL CPRHLDE ;Z - Same, NZ - different
29B8 E1 01763 POP HL ;Restore HL
29B9 20DF 01764 JR NZ,PMTDST ;Re-request if wrong disk
29BB C9 01765 RET
01766 ;
01767 ; CPRHLDE - Compare string @ HL to string @ DE
01768 ; B => Number of characters to compare
01769 ; Z - Set if strings match
01770 ;
29BC 1A 01771 CPRHLDE LD A,(DE) ;P/u character @ DE
29BD BE 01772 CP (HL) ;Same ?
29BE C0 01773 RET NZ ;Ret (NZ) if no match
29BF 23 01774 INC HL ;Bump each
29C0 13 01775 INC DE
29C1 10F9 01776 DJNZ CPRHLDE ;Check B characters
29C3 C9 01777 RET ;Matched - RETurn Z
01778 ;
01779 ; FLASH & FLASH0 - Flash a message string
01780 ; HL => Message string to flash
01781 ;
29C4 CD0E2A 01782 FLASH0 CALL RESKFLG ;Reset Pause, Enter
01783 ;
01784 ; Pause briefly
01785 ;
29C7 01FD41 01786 FLASH LD BC,16893 ;Delay count
29CA 01787 @@PAUSE
29CA+3E10 01788 LD A,16
29CC+EF 01789 RST 40
01790 ;
01791 ; Wait for no Enter or Break
01792 ;
29CD FD7E0A 01793 LD A,(IY+KFLAG$) ;P/u KFLAG$
29D0 E605 01794 AND 4!1 ;Wait until no ENTER!BRK
29D2 20F0 01795 JR NZ,FLASH0 ;Still down, go flash
29D4 CD0E2A 01796 CALL RESKFLG ;Reset
01797 ;
01798 ; Display the message & wait for 1/4 second
01799 ;
29D7 CD212A 01800 FLS1 CALL DSPLY
29DA 010040 01801 LD BC,4000H ;Delay 4000 iterations
29DD CDED29 01802 CALL FLS2 ; & scan for Break,Enter
01803 ;
01804 ; Erase the message & wait
01805 ;
29E0 0E1E 01806 LD C,EL ;Erase line
29E2 CD1A2A 01807 CALL DISPB
29E5 013333 01808 LD BC,3333H ;Delay 3333 iterations
29E8 CDED29 01809 CALL FLS2 ; & scan for Break,Enter
29EB 18EA 01810 JR FLS1 ;Loop if neither
01811 ;
01812 ; FLS2 - Delay BC loops & scan for
01813 ;
29ED CD6229 01814 FLS2 CALL CKBRK ;Check for
29F0 C24924 01815 JP NZ,ABORT
01816 ;
01817 ; Was the pressed ?
01818 ;
29F3 FDCB0A56 01819 BIT 2,(IY+KFLAG$) ; hit ?
29F7 2006 01820 JR NZ,FLS4 ;Go on ENTER down
01821 ;
01822 ; Nothing hit - Count down
01823 ;
29F9 0B 01824 DEC BC ;Decrement count
29FA 78 01825 LD A,B ;Done ?
29FB B1 01826 OR C
29FC 20EF 01827 JR NZ,FLS2 ;No - check again
29FE C9 01828 RET ;Yes - RETurn
01829 ;
01830 ; hit - POP ret addr & clr type ahead
01831 ;
29FF F1 01832 FLS4 POP AF ;Pop return address
2A00 01833 CLRTYPE @@KBD ;Clear type ahead
2A00+3E08 01834 LD A,8
2A02+EF 01835 RST 40
2A03 28FB 01836 JR Z,CLRTYPE ;Good - get another
2A05 B7 01837 OR A ;O.K. ?
2A06 C21424 01838 JP NZ,IOERR ;No - I/O Error
01839 ;
01840 ; Erase message line
01841 ;
2A09 0E1E 01842 LD C,EL ;Erase line
2A0B CD1A2A 01843 CALL DISPB ;Fall into RESKFLG
01844 ;
01845 ; RESKFLG - Reset & bits in KFLAG
01846 ;
2A0E 01847 RESKFLG @@FLAGS ;IY => Flag Table
2A0E+3E65 01848 LD A,101
2A10+EF 01849 RST 40
2A11 FD7E0A 01850 LD A,(IY+KFLAG$) ;P/u KFLAG$
2A14 E6F9 01851 AND 0F9H ;Reset bits 2 & 1
2A16 FD770A 01852 LD (IY+KFLAG$),A ;Stuff in KFLAG$
2A19 C9 01853 RET ;RETurn
01854 ;
01855 ; DISPB - Output a byte to the Video
01856 ;
2A1A 01857 DISPB @@DSP ;Output byte
2A1A+3E02 01858 LD A,2
2A1C+EF 01859 RST 40
2A1D C8 01860 RET Z ;Good - RETurn
2A1E C31424 01861 JP IOERR ;Bad - I/O error
01862 ;
01863 ; DSPLY - Display line to video
01864 ;
2A21 01865 DSPLY @@DSPLY ;Display
01866 IFEQ 00H,1
01867 LD HL,
01868 ENDIF
2A21+3E0A 01869 LD A,10
2A23+EF 01870 RST 40
2A24 C8 01871 RET Z
2A25 C31424 01872 JP IOERR ;Bad - I/O Error
01873 ;
01874 ; STOP - Display Transfer aborted & Abort
01875 ;
2A28 21CD2A 01876 STOP LD HL,STOP$ ;"Transfer Aborted"
2A2B 01877 @@LOGOT ;Log message
01878 IFEQ 00H,1
01879 LD HL,
01880 ENDIF
2A2B+3E0C 01881 LD A,12
2A2D+EF 01882 RST 40
2A2E CD6629 01883 CALL PMTSYS ;"Insert SYSTEM disk"
2A31 C34924 01884 JP ABORT ;Abort
01885 ;
01886 ; GETSYS2 - Bring in SYS2
01887 ;
2A34 3E84 01888 GETSYS2 LD A,84H
2A36 EF 01889 RST 28H
01890 ;
01891 ; GETSYS3 - Bring in SYS3
01892 ;
2A37 3E85 01893 GETSYS3 LD A,85H
2A39 EF 01894 RST 28H
01895 ;
01896 ; CKDEV - Is the source or Destination a device ?
01897 ; Z - Either Source or Destination is a device
01898 ;
2A3A 3A572C 01899 CKDEV LD A,(FCB1) ;Is source a device?
2A3D FE2A 01900 CP '*'
2A3F C8 01901 RET Z
2A40 3A032C 01902 LD A,(FCB2) ;Is destination a device?
2A43 FE2A 01903 CP '*'
2A45 C9 01904 RET
01905 ;
01906 ; RDGAT - Read GAT of Drive C
01907 ;
2A46 D5 01908 RDGAT PUSH DE ;Save DE & HL
2A47 E5 01909 PUSH HL
2A48 FDE5 01910 PUSH IY ;Save IY
01911 ;
01912 ; Set D = Cyl, E = Sector, HL => Buffer
01913 ;
2A4A 01914 @@GTDCT ;Point IY to DCT
2A4A+3E51 01915 LD A,81
2A4C+EF 01916 RST 40
2A4D FD5609 01917 LD D,(IY+9) ;P/u dir cyl in D
2A50 1E00 01918 LD E,0 ;GAT is sector 0
2A52 21002D 01919 LD HL,GAT ;HL => GAT I/O Buffer
2A55 01920 @@RDSSC ;Read Track D, Sector E
2A55+3E55 01921 LD A,85
2A57+EF 01922 RST 40
01923 ;
01924 ; Restore Registers
01925 ;
2A58 FDE1 01926 POP IY ;Restore IY
2A5A E1 01927 POP HL ;Restore HL & DE
2A5B D1 01928 POP DE
2A5C 3E14 01929 LD A,14H ;Else reset to GAT error
2A5E C9 01930 RET ;RETurn with condition
01931 ;
01932 ; OPENDES - OPEN Destination File
01933 ;
2A5F 21002F 01934 OPENDES LD HL,BUF2 ;HL => Dest I/O Buffer
2A62 11032C 01935 LD DE,FCB2 ;DE => Dest FCB
2A65 1811 01936 JR OPENFIL ;Open the file
01937 ;
01938 ; INITDES - INIT the destination file
01939 ;
2A67 3E3A 01940 INITDES LD A,@INIT ;A = @INIT SVC Number
2A69 180F 01941 JR INITFIL ;Go into OPEN routine
01942 ;
01943 ; OPENSRC - Open Source File
01944 ;
2A6B 11572C 01945 OPENSRC LD DE,FCB1 ;DE => Source FCB
01946 ;
01947 ; Set the File OPEN inhibit flag
01948 ;
2A6E 01949 @@FLAGS ;IY => System Flag Table
2A6E+3E65 01950 LD A,101
2A70+EF 01951 RST 40
2A71 FDCB12C6 01952 SET 0,(IY+SFLAG$) ;Set file open inhibit
01953 ;
2A75 21002E 01954 OPENSR2 LD HL,BUF1 ;HL => Source I/O buffer
2A78 3E3B 01955 OPENFIL LD A,@OPEN ;A = @OPEN SVC number
2A7A 0600 01956 INITFIL LD B,0 ;B = LRL = 256
01957 ;
01958 ; OPEN or INIT the File
01959 ;
2A7C CD0428 01960 GETFILE CALL DOSVC ;OPEN or INIT the file
2A7F C8 01961 RET Z ;RETurn with Z set
2A80 C31424 01962 JP IOERR ;NZ - I/O Error
01963 ;
01964 ; Error & Informative message strings
01965 ;
2A83 43 01966 COPYMS DB 'Copying: ',ETX
6F 70 79 69 6E 67 3A 20
03
2A8D 41 01967 APPDMS DB 'Appending: ',ETX
70 70 65 6E 64 69 6E 67
3A 20 03
01968 ;
2A99 46 01969 DIFLRL$ DB 'Files have different LRLs',CR
69 6C 65 73 20 68 61 76
65 20 64 69 66 66 65 72
65 6E 74 20 4C 52 4C 73
0D
2AB3 44 01970 DSTREQ$ DB 'Destination spec required',CR
65 73 74 69 6E 61 74 69
6F 6E 20 73 70 65 63 20
72 65 71 75 69 72 65 64
0D
2ACD 1D 01971 STOP$ DB BL,'Transfer aborted',CR
54 72 61 6E 73 66 65 72
20 61 62 6F 72 74 65 64
0D
2ADF 46 01972 SPCREQ$ DB 'File spec required',CR
69 6C 65 20 73 70 65 63
20 72 65 71 75 69 72 65
64 0D
2AF2 49 01973 NOINDO$ DB 'Invalid command during '
6E 76 61 6C 69 64 20 63
6F 6D 6D 61 6E 64 20 64
75 72 69 6E 67 20 3C 44
4F 3E 20
2B0E 70 01974 DB 'processing',CR
72 6F 63 65 73 73 69 6E
67 0D
2B19 53 01975 SAMERR$ DB 'Source and destination disks'
6F 75 72 63 65 20 61 6E
64 20 64 65 73 74 69 6E
61 74 69 6F 6E 20 64 69
73 6B 73
2B35 20 01976 DB ' are the same',CR
61 72 65 20 74 68 65 20
73 61 6D 65 0D
01977 ;
2B43 1D 01978 PMTSYS$ DB BL,EL,' Insert SYSTEM disk '
1E 20 49 6E 73 65 72 74
20 53 59 53 54 45 4D 20
64 69 73 6B 20 3C 45 4E
54 45 52 3E
2B60 1D 01979 DB BL,ETX
03
01980 ;
2B62 1D 01981 PMTSRC$ DB BL,EL,' Insert SOURCE disk '
1E 20 49 6E 73 65 72 74
20 53 4F 55 52 43 45 20
64 69 73 6B 20
2B78 69 01982 DB 'in drive :'
6E 20 64 72 69 76 65 20
3A
2B82 30 01983 SRC_DR DB '0 and press '
20 61 6E 64 20 70 72 65
73 73 20 3C 45 4E 54 45
52 3E
2B95 1D 01984 DB BL,ETX
03
01985 ;
2B97 1D 01986 PMTDST$ DB BL,EL,' Insert DESTINATION disk '
1E 20 49 6E 73 65 72 74
20 44 45 53 54 49 4E 41
54 49 4F 4E 20 64 69 73
6B 20
2BB2 69 01987 DB 'in drive :'
6E 20 64 72 69 76 65 20
3A
2BBC 30 01988 DEST_DR DB '0 and press '
20 61 6E 64 20 70 72 65
73 73 20 3C 45 4E 54 45
52 3E
2BCF 1D 01989 DB BL,ETX
03
01990 ;
01991 ;
01992 ; APPEND PARAMETER TABLE
01993 ;
2BD1 80 01994 APPTBL DB 80H ;Use new @PARAM
01995 ;
2BD2 55 01996 DB FLAG!ABB!5
2BD3 53 01997 DB 'STRIP'
54 52 49 50
2BD8 00 01998 DB 0
2BD9 AC24 01999 DW SPARM+1
02000 ;
2BDB 54 02001 DB FLAG!ABB!4
2BDC 45 02002 DB 'ECHO'
43 48 4F
2BE0 00 02003 DB 0
2BE1 6227 02004 DW EPARM+1
2BE3 00 02005 DB 0
02006 ;
02007 ; COPY PARAMETER TABLE
02008 ;
2BE4 80 02009 COPYTBL DB 80H ;New @PARAM
02010 ;
2BE5 54 02011 DB FLAG!ABB!4
2BE6 45 02012 DB 'ECHO'
43 48 4F
2BEA 00 02013 DB 0
2BEB 6227 02014 DW EPARM+1
02015 ;
2BED 93 02016 DB NUM!ABB!3
2BEE 4C 02017 DB 'LRL'
52 4C
2BF1 00 02018 DB 0
2BF2 B525 02019 DW LPARM+1
02020 ;
2BF4 55 02021 DB FLAG!ABB!5
2BF5 43 02022 DB 'CLONE'
4C 4F 4E 45
2BFA 00 02023 DB 0
2BFB A926 02024 DW CPARM+1
02025 ;
2BFD 41 02026 DB FLAG!1
2BFE 58 02027 DB 'X'
2BFF 00 02028 DB 0
2C00 2325 02029 DW XPARM+1
2C02 00 02030 DB 0 ;End of COPY parm table
02031 ;
02032 ; I/O & Storage Buffers
02033 ;
2C03 00 02034 FCB2 DB 0 ;Show closed on LOAD
2C04 02035 DS 31
2C23 02036 TEMBUF DS 16
2C33 02037 FROM DS 16
2C43 20 02038 TO DB ' to '
74 6F 20
2C47 02039 TO2 DS 16
2C57 00 02040 FCB1 DB 0
2C58 02041 DS 31
2C77 02042 SRCSTR DS 18
2C89 02043 DSTSTR DS 18
2C9B 02044 CLONSAV DS 7
02045 ;
2D00 02046 ORG $<-8+1<+8
02047 ;
2D00 02048 GAT DS 256
2E00 02049 BUF1 DS 256
2F00 02050 BUF2 DS 256
02051 ;
02053 ;
2400 02055 END COPY
2400 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 at nemesis.lonestar.org]