
PROGRAM LISTING: 85-09/COPY130.M65
02 ; COPY130
04 ; BY ERNIE NEGUS
06 ; (c) 1985, ANTIC PUBLISHING
10 *= $2600 ;ROOM FOR DOS XL
20 JMP START
30 DBUFHI = $0305 ;O.S. EQUATES
40 DBUFLO = $0304 ;FOR OS I/O AND
50 DAUX2 = $030B ;DIRECT DISK I/O
60 DAUX1 = $030A
70 DCOMND = $0302
80 DUNIT = $0301
90 ICCOM = $0342
0100 ICBADR = $0344
0110 ICBLEN = $0348
0120 ICAUX1 = $034A
0130 ICAUX2 = $034B
0140 CARTR = $A000 ;MESSAGE AREA
0150 DES .BYTE "Destination #"
0160 FMT .BYTE "Format Destination ?"
0170 VER .BYTE "Verify Writes ?"
0180 STE .BYTE "Continue on Errors ?"
0190 RDG .BYTE $9B,"Reading..."
0200 WRT .BYTE $9B,"Writing..."
0210 IND .BYTE $9B,"Insert DESTINATION disk-Press Òåôõòî"
0220 INS .BYTE "Insert SOURCE in Drive 1-Type Òåôõòî"
0230 ANC .BYTE $9B,$FD,"Another copy ?"
0240 FRM .BYTE $9B,"Formatting..."
0250 REM .BYTE "Remove Cartridges First!",$9B
0260 O130 .BYTE "Program only runs on a 130 XE!!",$9B
0270 TIT1 .BYTE $1D," ÓÅÃÔÏÒ ÃÏÐÉÅÒ ±³° ØÅ ",$1D,$9B
0280 TIT2 .BYTE " By Ernie Negus",$1D,$1D,$1D,$9B
0290 KEY .BYTE "K:"
0300 SCR .BYTE "S:"
0310 SECNT .BYTE 0 ;VARIABLES
0320 DEST .BYTE 0 ;USED BY PROGRAM
0330 FRMT .BYTE 0
0340 SOUR .BYTE 0
0350 DCOM .BYTE 0
0360 DTEM .BYTE 0
0370 SAVA .BYTE 0
0380 VERI .BYTE 0
0390 SPEC .BYTE 0
0400 SAVSPE .BYTE 0
0410 CERR .BYTE 0
0420 DRIVE .BYTE 0
0430 BPUT LDA #$26 ;OUTPUT TEXT
0440 BPUU STA ICBADR+1 ;SUBROUTINE
0450 LDA #0
0460 STA ICBLEN+1
0470 STX ICBLEN
0480 STY ICBADR
0490 LDX #0
0500 LDA #$0B
0510 STA ICCOM
0520 JSR $E456
0530 RTS
0540 BGET LDX #$10 ;INPUT BYTE FROM
0550 LDA #7 ;KEYBOARD SUB.
0560 STA ICCOM,X
0570 LDA #0
0580 STA ICBLEN,X
0590 STA ICBLEN+1,X
0600 JSR $E456
0610 STA $0600
0620 CMP #$1B ;ESCAPE RERUNS
0630 BNE RET2 ;THE PROGRAM.
0640 PLA
0650 PLA
0660 JMP START
0670 RET2 RTS
0680 OPEN LDX #16 ;OPEN CHANNELS
0690 LDA #3 ;1 FOR KEYBOARD
0700 STA ICCOM,X ;6 FOR SCREEN.
0710 LDA # <KEY
0720 STA ICBADR,X
0730 LDA # >KEY
0740 STA ICBADR+1,X
0750 LDA #4
0760 STA ICAUX1,X
0770 JSR $E456
0780 LDX #$60
0790 LDA #3
0800 STA ICCOM,X
0810 LDA # <SCR
0820 STA ICBADR,X
0830 LDA # >SCR
0840 STA ICBADR+1,X
0850 LDA #12
0860 STA ICAUX1,X
0870 LDA #0
0880 STA ICAUX2,X
0890 JSR $E456
0900 RTS
0910 CLOSE LDX #$10 ;INSURES THOSE
0920 LDA #12 ;FILES CLOSED.
0930 STA ICCOM,X
0940 JSR $E456
0950 LDX #$60
0960 LDA #12
0970 STA ICCOM,X
0980 JSR $E456
0990 RTS
1000 START LDA CARTR ;THIS IS A
1010 INC CARTR ;CARTRIDGE TEST
1020 CMP CARTR
1030 BNE NOCARTS
1040 LDX #25
1050 LDY # <REM
1060 JSR BPUT
1070 RTS
1080 NOCARTS LDA #$E3 ;TEST FOR 130XE
1090 STA 54017 ;BY SEEING IF
1100 STA $4000 ;THE BANK SWITCH
1110 LDA #255 ;WORKS.
1120 STA 54017
1130 LDA $4000
1140 CMP #$E3
1150 BNE ITSA130
1160 LDA #255
1170 STA 54017
1180 LDX #32
1190 LDY # <O130
1200 JSR BPUT
1210 RTS ;RETURN TO DOS
1220 ITSA130 LDA #48
1230 STA 106 ;FORCE SCREEN
1240 JSR CLOSE ;RAM BELOW $4000
1250 JSR OPEN
1260 JMP BEGIN
1270 PUTO LDA #$10 ;DRAWS THE
1280 STA 11546 ;DISPLAY WINDOW
1290 STA 11547 ;ON THE SCREEN.
1300 STA 11548
1310 LDA #128
1320 STA 11543
1330 STA 11545
1340 STA 11549
1350 STA 11551
1360 LDX #0
1370 STX 11550
1380 LOOX LDA #$55 ;DRAW BORDER.
1390 STA 11503,X
1400 LDA #$D5
1410 STA 11583,X
1420 INX
1430 CPX #9
1440 BNE LOOX
1450 RTS
1460 ECHO STA $0600 ;ECHO KEY TO
1470 LDA #$9B ;SCREEN. DOES
1480 STA $0601 ;A LINE FEED.
1490 LDX #2
1500 LDY #0
1510 LDA #6
1520 JSR BPUU
1530 RTS
1540 BEGIN LDX #63 ;HERE IF 130 XE
1550 LDY # <TIT1
1560 LDA # >TIT1
1570 JSR BPUU ;PRINT TITLE
1580 LDA #0
1590 STA SPEC
1600 LDA #148
1610 STA 710
1620 STA 712
1630 LDA #12
1640 STA 709
1650 LDX #13
1660 LDY # <DES
1670 JSR BPUT
1680 LAB2 JSR BGET ;GET DEST. #
1690 CMP #'1 ;INSURE PROPER
1700 BCC LAB2 ;RANGE...
1710 CMP #'D ;DUAL DRIVE
1720 BEQ DUAL
1730 CMP #'T ;TRIPLE DRIVE
1740 BEQ TRIP
1750 CMP #'Q
1760 BEQ QUAD ;QUAD DRIVE
1770 CMP #'9 ;UPPER RANGE.
1780 BCS LAB2
1790 JMP SING
1800 QUAD LDA #4 ;USED FOR
1810 BNE MULT ;LOOPING WHEN
1820 TRIP LDA #3 ;MULTI-DEST.
1830 BNE MULT ;ENABLED.
1840 DUAL LDA #2
1850 MULT STA SPEC
1860 STA SAVSPE ;SAVE FOR
1870 LDA #'1 ;ANOTHER COPY.
1880 SING STA DEST ;USE DRIVE 1
1890 STA DRIVE ;IF MULTI-DEST.
1900 JSR ECHO
1910 LDA DEST
1920 SEC
1930 SBC #'0
1940 STA DEST
1950 LDX #20
1960 LDY # <FMT
1970 JSR BPUT
1980 JSR BGET ;FORMAT OR NOT?
1990 JSR ECHO
2000 LDA $0600
2010 STA FRMT ;SAVE ANSWER.
2020 LDX #15
2030 LDY # <VER
2040 JSR BPUT
2050 JSR BGET ;VERIFY OR NOT?
2060 JSR ECHO
2070 LDA $0600
2080 STA VERI ;SAVE ANSWER.
2090 LDA #255
2100 STA 54017
2110 LDX #20
2120 LDY # <STE ;STOP ON
2130 JSR BPUT ;ERROR?
2140 JSR BGET
2150 JSR ECHO
2160 LDA $0600
2170 STA CERR ;SAVE ANSWER
2180 LDX #36
2190 LDY # <INS
2200 JSR BPUT
2210 JSR BGET
2220 LDA $0600 ;IF 'N' INSTEAD
2230 CMP #'N ;OF RETURN, SKIP
2240 BEQ BLOOP ;THE READ.
2250 LDX #11
2260 LDY # <RDG
2270 JSR BPUT
2280 JSR PUTO ;PUT DISPLAY
2290 LDA #1 ;WINDOW UP AND
2300 STA DTEM ;READ DATA OFF
2310 LDA #0 ;OF SOURCE.
2320 STA DAUX1
2330 STA DAUX2
2340 LDA #'R ;'R' FOR READ
2350 STA DCOM
2360 LDA #255
2370 STA SECNT ;READ IN 255
2380 JSR AVOID ;SECTORS.
2390 LDA #$E3 ;ENABLE BANK 1
2400 STA 54017
2410 JSR DODISK
2420 LDA #$E7 ;ENABLE BANK 2
2430 STA 54017
2440 JSR DODISK
2450 LDA #$EB ;ENABLE BANK 3
2460 STA 54017
2470 JSR DODISK
2480 LDA #$EF ;ENABLE BANK 4
2490 STA 54017
2500 LDA #84 ;THIS TIME DO
2510 STA SECNT ;NOT USE DEFAULT
2520 JSR AVOID ;SECTOR COUNT.
2530 BLOOP LDA #255 ;THIS IS THE
2540 STA 54017 ;WRITE LOOP.
2550 LDA DEST
2560 CMP #1
2570 BNE AUTO
2580 LDX #37 ;INSERT PROMPT.
2590 LDY # <IND
2600 JSR BPUT
2610 JSR BGET
2620 AUTO LDA FRMT
2630 CMP #'Y ;DID THEY WANT
2640 BNE SKYP ;TO FORMAT?
2650 LDX #14
2660 LDY # <FRM
2670 JSR BPUT
2680 LDA #'!
2690 STA DCOMND ;SET UP FORMAT
2700 LDA DEST
2710 STA DUNIT
2720 JSR PUTO
2730 JSR GONE ;DISPLAY DRIVE #
2740 LDA #0
2750 STA DBUFLO
2760 LDA #4
2770 STA DBUFHI
2780 JSR $E453
2790 LDY #173
2800 LDA $0308
2810 BEQ SKYP
2820 LDX #'N
2830 STX CERR
2840 JSR ERRO ;REPORT ERRORS
2850 SKYP LDX #11
2860 LDY # <WRT
2870 JSR BPUT
2880 JSR PUTO ;DRAW WINDOW.
2890 LDA DEST ;BEGIN WRITING.
2900 STA DTEM
2910 LDA #0
2920 STA DAUX2
2930 STA DAUX1
2940 LDA #'W ;WRITE VERIFY?
2950 STA DCOM
2960 LDA VERI ;<THE ANSWER.
2970 CMP #'Y
2980 BEQ SKIZZ
2990 LDA #'P ;OR JUST PUT?
3000 STA DCOM
3010 SKIZZ LDA #255
3020 STA SECNT ;WRITE OWN RAM.
3030 JSR AVOID ;255 SECTORS.
3040 LDA #$E3 ;WRITE BANK 1.
3050 STA 54017
3060 JSR DODISK
3070 LDA #$E7 ;WRITE BANK 2
3080 STA 54017
3090 JSR DODISK
3100 LDA #$EB ;WRITE BANK 3
3110 STA 54017
3120 JSR DODISK
3130 LDA #$EF ;WRITE BANK 4
3140 STA 54017
3150 LDA #84 ;BUT DON'T USE
3160 STA SECNT ;DEFAULT THIS
3170 JSR AVOID ;TIME!
3180 LDA #255
3190 STA 54017 ;DISABLES BANKS
3200 LDA SPEC
3210 BEQ OVER ;MULTI-DEST?
3220 CMP #1
3230 BEQ OVER ;IF SO, DONE?
3240 STA DEST
3250 CLC
3260 ADC #'0 ;DO NEXT DRIVE
3270 STA DRIVE
3280 DEC SPEC
3290 JMP BLOOP ;UNTIL FINISHED.
3300 OVER LDX #16
3310 LDY # <ANC
3320 JSR BPUT
3330 JSR BGET ;ANOTHER COPY?
3340 JSR ECHO
3350 LDA $0600
3360 CMP #'Y
3370 BNE QUIT
3380 LDA SPEC ;YES- RESTORE
3390 BEQ JUMP ;VALUES IF MULTI
3400 LDA SAVSPE ;DESTINATION
3410 STA SPEC ;DRIVES.
3420 LDA #1
3430 STA DEST
3440 LDA #'1
3450 STA DRIVE ;(FOR FORMAT).
3460 JUMP JMP BLOOP
3470 QUIT JMP START ;RE-RUN PROGRAM
3480 DODISK LDA #127
3490 STA SECNT ;THIS SUBROUTINE
3500 AVOID LDA #$3F ;DOES THE DISK
3510 STA DBUFHI ;I/O AND KEEPS
3520 LDA #$80 ;TRACK OF THE
3530 STA DBUFLO ;MEMORY POINTERS
3540 DOSUP LDA DTEM
3550 STA DUNIT
3560 LDA DCOM
3570 STA DCOMND
3580 LOOP CLC
3590 LDA DAUX1
3600 ADC #1
3610 STA DAUX1
3620 LDA DAUX2
3630 ADC #0
3640 STA DAUX2
3650 CLC
3660 JSR INCO ;IT ALSO KEEPS
3670 LDA DBUFLO ;TRACK OF THE
3680 ADC #$80 ;SECTOR COUNTER.
3690 STA DBUFLO
3700 LDA DBUFHI
3710 ADC #0
3720 STA DBUFHI
3730 JSR $E453 ;THE O.S. CALL.
3740 CPY #1
3750 BEQ GDIO ;IF ERROR FOUND
3760 ERRO JSR RER ;DECODE IT AND
3770 STX 11550 ;DISPLAY IT IN
3780 LDA CERR
3790 CMP #'Y ;STOP ON ERROR
3800 BEQ GDIO ;UNLESS TOLD NOT
3810 PLA ;TO.
3820 PLA
3830 JMP OVER
3840 GDIO DEC SECNT ;THE RIGHT PART
3850 BNE LOOP ;OF THE DISPLAY
3860 RTS ;WINDOW.
3870 INCO LDX #3
3880 LOCO INC 11545,X
3890 LDA 11545,X ;INCREMENTS THE
3900 CMP #$1A ;SECTOR COUNTER
3910 BNE GONE ;IN THE WINDOW.
3920 LDA #$10
3930 STA 11545,X
3940 DEX
3950 BNE LOCO
3960 GONE LDA DUNIT ;ALSO DISPLAYS
3970 CLC ;THE DRIVE
3980 ADC #$10 ;CURRENTLY IN
3990 STA 11544 ;USE.
4000 RTS
4010 RER LDX #$10 ;DECODE ERRORS
4020 CPY #127 ;NON-IO ERROR
4030 BCC RETURN
4040 INX
4050 CPY #128 ;BREAK KEY ABORT
4060 BEQ RETURN
4070 INX
4080 CPY #138 ;DEVICE TIMEOUT
4090 BEQ RETURN
4100 INX
4110 CPY #139 ;NO ACKNOWLEDGE
4120 BEQ RETURN
4130 INX
4140 CPY #140 ;SERIAL BUS DATA
4150 BEQ RETURN
4160 CPY #142 ;ERRORS.
4170 BEQ RETURN
4180 CPY #143 ;DITTO
4190 BEQ RETURN
4200 INX
4210 CPY #144 ;BAD SECTOR/
4220 BEQ RETURN ;OPEN DOOR.
4230 INX
4240 CPY #145 ;BAD READ VERIFY
4250 BEQ RETURN
4260 INX
4270 CPY #163 ;DAMAGED DOS
4280 BEQ RETURN
4290 INX
4300 CPY #164 ;BAD FILE NUMBER
4310 BEQ RETURN
4320 INX
4330 CPY #173 ;BAD SECTOR
4340 BEQ RETURN ;DURING FORMAT.
4350 LDX #$10 ;NON-HANDLED ERROR
4360 RETURN RTS
4365 ;
4370 *= $02E0 ; FOR DOS 2
4380 .WORD START
4390 .END
Back to previous page