0100 .OPT NO LIST›0110 .TAB 11,15,31›0120 .TITLE "COPYMATE 1.4 03/21/84"›0130 ; ›0160 ; COPYMATE 1.4 ›0180 ; BY MIKE PALMER ›0190 ; ANTIC MAGAZINE›0250 ;›0260 ; PAGE ZERO›0270 ; ---------›0280 ;›0290 SRCDRV = $80 SOURCE DRIVE›0300 DSTDRV = $81 DESTINATION DRIVE›0310 NUMDRV = $82 NUMBER OF DRIVES ON SYSTEM›0320 FMTTYP = $84 FORMAT TYPE›0330 SECSIZ = $85 SECTOR SIZE (DENISTY)›0340 WRTMOD = $89 WRITE MODE $57=VERIFY›0350 BUFFER = $8A BUFFER POINTER›0360 BUFSAV = $8C BUFFER POINTER SAVE›0370 SECSAV = $8E SECTOR POINTER SAVE›0380 VTOC = $90 SCREEN VTOC POINTER›0390 VTOSAV = $92 SCREEN VTOC POINTER SAVE›0400 VTOCI = $94 SCREEN VTOC INIT POINTER›0410 FMTFLG = $96 FORMAT FLAG›0420 ONMSG = $A0 ' ON' MESSAGE›0430 OFFMSG = $A3 'OFF' MESSAGE›0440 ;›0450 ; O S›0460 ; ---›0470 ;›0480 TRAMSZ = $06 TEST FOR LEFT CART›0490 TSTDAT = $07 TEST FOR RIGHT CART›0500 DOSVEC = $0A DISK START VECTOR LSB›0510 DOSINI = $0C DISK INIT VECTOR LSB›0520 POKMSK = $10 POKEY INTERUPTS›0530 ATRACT = $4D ATTRACT MODE TIMER›0540 LMARGN = $52 LEFT MARGIN›0550 RMARGN = $53 RIGHT MARGIN›0560 ROWCRS = $54 CURSOR ROW›0570 SAVMSC = $59 START OF SCREEN DISPLAY MSB›0580 BOTSCR = $02BF WINDOW ON=4 OFF=24›0590 BACKGR = $02C6 GR.0 BACKGROUND›0600 BORDER = $02C8 GR.0 BORDER›0610 CRSINH = $02F0 GR.0 CURSOR INHIBIT 0=ON›0620 CH = $02FC INTERNAL VALUE FOR LAST KEY HIT›0630 DRVBYT = $070A ZERO IF BOOTING›0640 IRQEN = $D20E INTERUPT REQUEST ENABLE›0650 CONSOL = $D01F CONSOL SWITCHES›0660 SIOV = $E459 SERIAL I/O SUBROUTINE VECTOR›0670 COLDSV = $E477 COLD START VECTOR›0680 WARMSV = $E474 WARM START VECTOR›0690 PUTLIN = $F385 LINE PRINT SUBROUTINE›0700 .PAGE ›0710 ; SERIAL I/O›0720 ; ----------›0730 ;›0740 DBUSID = $0300 SERIAL BUS ID›0750 DUNIT = $0301 DRIVE NUMBER›0760 DCOMND = $0302 COMMAND›0770 DSTATS = $0303 STATUS / DATA DIRECTION›0780 DBUFLO = $0304 BUFFER ADDRESS LSB›0790 DBUFHI = $0305 BUFFER ADDRESS MSB›0800 DTIMLO = $0306 TIMEOUT (SECONDS)›0810 DCNTLO = $0308 TRANSFER COUNT LSB›0820 DCNTHI = $0309 TRANSFER COUNT MSB›0830 DSECLO = $030A SECTOR NUMBER LSB›0840 DSECHI = $030B SECTOR NUMBER MSB›0850 ;›0860 ; I/O COMMANDS›0870 ; ------------›0880 ;›0890 FMTDSK = $21 FORMAT DISK›0900 PUTSEC = $50 PUT SECTOR (NO VERIFY)›0910 GETSEC = $52 GET SECTOR›0920 PUTVER = $57 PUT SECTOR (WITH VERIFY)›0930 PUTDEL = $59 PUT SECTOR (DELETED)›0940 PUTCRC = $5A PUT SECTOR (CRC ERROR)›0950 GETDAT = $40 DATA DIRECTION IN›0960 PUTDAT = $80 DATA DIRECTION OUT›0970 ;›0980 ; MISCELLANEOUS›0990 ; -------------›1000 ;›1010 OFF = $00 FLAG OFF›1020 ON = $01 FLAG ON›1030 TIMOUT = $07 I/O TIMEOUT (SECONDS)›1040 TIMFMT = $A0 FORMAT TIMEOUT (SECONDS)›1050 BUFBOT = $0350 BUFFER BOTTOM›1060 DISKID = $31 DISK DEVICE ID›1070 LSTSEC = $02D0 LAST SECTOR TO COPY›1080 SCVTOC = $90 SCREEN VTOC OFFSET ADDRESS›1090 SCNSEC = $BFA1 SCREEN W/R SEC # ADDR (48K)›1100 BRKINH = $40 INHIBIT BREAK KEY CODE›1110 BRKENA = $C0 ENABLE BREAK KEY CODE›1120 OPTNKY = $03 ÏÐÔÉÏÎ KEY CODE›1130 SELKEY = $05 ÓÅÌÅÃÔ KEY PRESSED›1140 STRTKY = $06 ÓÔÁÒÔ KEY CODE›1150 RTNKEY = $0C ÒÅÔÕÒÎ KEY CODE›1160 DKEY = $3A D KEY KEY CODE›1170 FKEY = $38 F KEY KEY CODE›1180 SKEY = $3E S KEY KEY CODE›1190 VKEY = $10 V KEY KEY CODE›1200 WKEY = $2E W KEY KEY CODE›1210 EMPTY = $0E EMPTY SECTOR SCREEN CODE›1220 DATA = $54 DATA SECTOR SCREEN CODE›1230 BAD = $1F BAD SECTOR SCREEN CODE›1240 POINT = $4E VTOC POINTER SCREEN CODE›1250 .PAGE ›1260 ORIGN1 = $3400 INITIALIZATION CODE ORIGIN›1270 ;›1280 *= ORIGN1›1290 ;›1300 ; BOOT HEADER (6 BYTES)›1310 ; ---------------------›1320 ;›1330 .BYTE $00 BOOT FLAG›1340 .BYTE $0E # SECTORS›1350 .WORD ORIGN1 LOAD ADDRESS›1360 .WORD BOONIT BOOT INIT›1370 ;›1380 ; BOOT CONTINUATION›1390 ; -----------------›1400 ;›1410 CLC SIGNAL BOOT OK›1420 RTS ›1430 ;›1440 ;›1450 ; *************************›1460 ; * USER DEFINITION TABLE *›1470 ; *************************›1480 ;›1490 DEFSRC .BYTE $01 SOURCE DRIVE #›1500 DEFDST .BYTE $02 DESTINATION DRIVE #›1510 DEFFMT .BYTE $00 FOMATTING $00=OFF $01=ON›1520 DEFVFY .BYTE $50 WRITE VERIFY $50=OFF $57=ON›1530 NDRIVE .BYTE $02 NUMBER OF DRIVES ON SYSTEM›1540 FMTCHR .BYTE $00 ATARI=$00 PERCOM=$1A›1550 ;›1560 DENSIT .WORD $80 CURRENTLY SINGLE DENSITY ONLY›1570 ;›1580 ;›1590 ; BOOT INITIALIZATION›1600 ; ===================›1610 ;›1620 BOONIT LDA TRAMSZ ANY CARTRIDGES›1630 ORA TSTDAT PLUGGED IN ?›1640 BEQ BOOMAK›1650 LDX #CRTMSG&255 TELL USER TO›1660 LDY #CRTMSG/256 REMOVE IT›1670 JSR PRINT›1680 BOODIE JMP BOODIE HANG AROUND›1690 ;›1700 BOOMAK LDA CONSOL MAKE BOOT DISK?›1710 CMP #OPTNKY›1720 BNE BOOSET NO›1730 JMP MAKER YES›1740 ;›1750 BOOSET LDA #RUNNIT&255 SET UP RESET›1760 STA DOSVEC KEY VECTORS›1770 STA DOSINI›1780 LDA #RUNNIT/256›1790 STA DOSVEC+1›1800 STA DOSINI+1›1810 ;›1820 LDA #0 INIT POINTER›1830 STA SECSAV SAVERS›1840 STA SECSAV+1›1850 STA BUFSAV›1860 STA BUFSAV+1›1870 ;›1880 ; SET-UP USING USER DEFINITION TABLE›1890 ;›1900 LDA DEFSRC SOURCE DRIVE›1910 STA SRCDRV›1920 CLC ›1930 ADC #$30›1940 STA OPTS›1950 LDA DEFDST DESTINATION DRIVE›1960 STA DSTDRV›1970 CLC ›1980 ADC #$30›1990 STA OPTD›2000 LDA NDRIVE TOTAL # DRIVES›2010 STA NUMDRV›2020 INC NUMDRV›2030 LDA FMTCHR FORMAT CHARACTER›2040 STA FMTTYP›2050 LDA DENSIT DISK DENSITY›2060 STA SECSIZ›2070 LDA DENSIT+1›2080 STA SECSIZ+1›2090 ;›2100 LDA #' SET UP ' ON'›2110 STA ONMSG AND 'OFF' MSGS›2120 LDA #'O›2130 STA ONMSG+1›2140 STA OFFMSG›2150 LDA #'N›2160 STA ONMSG+2›2170 LDA #'F›2180 STA OFFMSG+1›2190 STA OFFMSG+2›2200 ;›2210 LDY #OPTV-OPTMS3 WRITE›2220 LDA #PUTVER VERIFICATION›2230 CMP DEFVFY›2240 BNE BOOVOF›2250 BOOVON STA WRTMOD›2260 LDX #0›2270 BEQ BOOVFY (JMP)›2280 BOOVOF LDA #PUTSEC›2290 STA WRTMOD›2300 LDX #3›2310 BOOVFY JSR BOOUPD›2320 ;›2330 LDY #OPTF-OPTMS3 FORMAT›2340 LDA #ON DESTINATION›2350 CMP DEFFMT›2360 BNE BOOFOF›2370 BOOFON STA FMTFLG›2380 LDX #0›2390 BEQ BOOFMT (JMP)›2400 BOOFOF LDA #0›2410 STA FMTFLG›2420 LDX #3›2430 BOOFMT JSR BOOUPD›2440 ;›2450 LDA SAVMSC FIX SCREEN WRITE›2460 CLC ADDRESSES FOR›2470 ADC #3 MEMORY SIZES›2480 STA SECFIX+2 OTHER THAN 48K›2490 STA SECFIX+5›2500 STA SECFIX+$0E›2510 ;›2520 BOOEPL LDA DRVBYT IS THIS A BOOT ?›2530 BEQ BOODON›2540 JMP WARMSV NO - DO ÓÙÓ ÒÅÓÅÔ›2550 BOODON RTS YES - INIT DONE›2560 ;›2570 BOOUPD LDA ONMSG,X UPDATE ON/OFF›2580 STA OPTMS3,Y MESSAGES›2590 LDA ONMSG+1,X›2600 STA OPTMS3+1,Y›2610 LDA ONMSG+2,X›2620 STA OPTMS3+2,Y›2630 BOOEND RTS ›2640 ;›2650 CRTMSG .BYTE "} PLEASE REMOVE ALL CARTRIDGES"›2660 .BYTE " AND THEN RE-BOOTý",$9B›2670 .PAGE ›2680 ORIGN2 *= $3550 MAIN CODE ORIGIN›2690 ;›2700 ;›2710 ; RUN INITIALIZATION›2720 ; ==================›2730 ;›2740 RUNNIT LDA #9 SET LEFT &›2750 STA LMARGN RIGHT MARGIN›2760 LDA #31 TO ASSIST IN›2770 STA RMARGN MSG OUTPUT›2780 ;›2790 LDA #$94 STANDARD›2800 STA BORDER SCREEN COLOR›2810 ;›2820 LDA #0›2830 LDX #$0A ZERO OUT›2840 RUNZRO STA DUNIT,X DISK DCB›2850 DEX ›2860 BNE RUNZRO›2870 ;›2880 ;›2890 LDA #DISKID UNIT ID = DISK›2900 STA DBUSID›2910 INC DSECLO FIRST SEC = 1›2920 ;›2930 LDX #HDRMSG&255 O/P COPYMATE›2940 LDY #HDRMSG/256 HEADER MSG›2950 JSR PRINT›2960 ;›2970 ; OPTION CHANGER›2980 ; --------------›2990 ;›3000 OPTCHG LDA #7 RESET TO OPTION›3010 STA ROWCRS DISPLAY AREA›3020 ;›3030 LDX #OPTMS1&255 DISPLAY›3040 LDY #OPTMS1/256 CURRENT›3050 JSR PRINT OPTIONS›3060 LDX #OPTMS2&255›3070 LDY #OPTMS2/256›3080 JSR PRINT›3090 LDX #OPTMS3&255›3100 LDY #OPTMS3/256›3110 JSR PRINT›3120 LDX #OPTMS4&255›3130 LDY #OPTMS4/256›3140 JSR PRINT›3150 ;›3160 LDA #GETDAT DATA DIRECTION›3170 STA DSTATS›3180 JSR INSER2 ;"INSERT" MSG›3190 LDA #BRKINH INHIBIT BREAK KEY›3200 STA IRQEN›3210 STA POKMSK›3220 ;›3230 OPTLUP LDA CONSOL ÓÔÁÒÔ PRESSED›3240 CMP #STRTKY YET ?›3250 BNE OPTKEY›3260 BEQ VTONIT GO!›3270 ;›3280 OPTKEY LDA CH CHANGE OPTIONS?›3290 CMP #SKEY SOURCE DISK›3300 BEQ OPTSRC›3310 CMP #DKEY DESTINATION DISK›3320 BEQ OPTDST›3330 CMP #FKEY FORMAT›3340 BEQ OPTFMT›3350 CMP #VKEY VERIFY›3360 BEQ OPTVFY›3370 CMP #WKEY VERIFY›3380 BNE OPTLUP›3390 ;›3400 ; CHANGE VERIFY OPTION›3410 ;›3420 OPTVFY LDY #OPTV-OPTMS3 MSG OFFSET›3430 LDA #PUTVER›3440 CMP WRTMOD VERIFY ON?›3450 BEQ OPTVOF›3460 OPTVON STA WRTMOD TURN VFY ON›3470 LDX #0 SELECT ON MSG›3480 BEQ OPTUPD (JMP)›3490 OPTVOF LDA #PUTSEC›3500 STA WRTMOD TURN VFY OFF›3510 LDX #3 SELECT OFF MSG›3520 BNE OPTUPD (JMP)›3530 ;›3540 ; CHANGE FORMAT OPTION›3550 ;›3560 OPTFMT LDY #OPTF-OPTMS3 MSG OFFSET›3570 LDA #ON›3580 CMP FMTFLG FORMAT ON?›3590 BEQ OPTFOF›3600 OPTFON STA FMTFLG TURN FMT ON›3610 LDX #0 ON MSG›3620 BEQ OPTUPD (JMP)›3630 OPTFOF DEC FMTFLG TURN FMT OFF›3640 LDX #3 OFF MSG›3650 ;›3660 ; CHANGE OPTION MESSAGES›3670 ;›3680 OPTUPD LDA ONMSG,X X=FROM OFFSET›3690 STA OPTMS3,Y Y=TO OFFSET›3700 LDA ONMSG+1,X›3710 STA OPTMS3+1,Y›3720 LDA ONMSG+2,X›3730 STA OPTMS3+2,Y›3740 BNE OPTCLK (JMP)›3750 ;›3760 ; CHANGE DRIVE OPTIONS›3770 ;›3780 OPTSRC LDX #0 SET UP TO›3790 LDY #0 CHANGE SRC›3800 BEQ OPTDRV (JMP)›3810 OPTDST LDX #1 SET UP TO›3820 LDY #OPTD-OPTS CHANGE DEST›3830 OPTDRV INC SRCDRV,X›3840 LDA SRCDRV,X›3850 CMP NUMDRV›3860 BCC OPTLT›3870 LDA #1 RESET TO 1›3880 STA SRCDRV,X›3890 CLC ›3900 OPTLT ADC #$30›3910 STA OPTS,Y UPDATE MSG›3920 ;›3930 OPTCLK LDA #$FF CLEAR KEY›3940 STA CH PRESS›3950 OPTEND JMP OPTCHG›3960 ;›3970 ; SCREEN VTOC INITIALIZATION›3980 ; --------------------------›3990 ;›4000 VTONIT LDA #SCVTOC VTOC SCRN OFFSET›4010 STA VTOC›4020 STA VTOCI›4030 LDA SAVMSC›4040 STA VTOC+1›4050 STA VTOCI+1›4060 LDX #3 LOOP 3 TIMES›4070 LDA #EMPTY›4080 VTOLP1 LDY #0 INIT $100 BYTES›4090 VTOLP2 STA (VTOCI),Y EACH PASS›4100 INY ›4110 BNE VTOLP2›4120 INC VTOCI+1›4130 DEX ›4140 BNE VTOLP1›4150 ;›4160 ; COPY DISK›4170 ; =========›4180 ;›4190 ; GET BLOCK OF SECTORS›4200 ; --------------------›4210 ;›4220 GET LDA SRCDRV›4230 STA DUNIT›4240 LDA #GETSEC›4250 STA DCOMND›4260 LDA DSECLO NO MSG ON›4270 CMP #1 FIRST PASS›4280 BEQ GET.0›4290 JSR INSER1 ;"INSERT" MSG›4300 JSR WAIT1 WAIT FOR GO!›4310 ;›4320 GET.0 LDA DSECLO SAVE START›4330 STA SECSAV SEC # AND VTOC›4340 LDA DSECHI POINTER FOR›4350 STA SECSAV+1 WRITE BACK OUT›4360 LDA VTOC TO DISK LATER›4370 STA VTOSAV›4380 LDA VTOC+1›4390 STA VTOSAV+1›4400 ;›4410 LDX #REDMSG&255;"READING" MSG›4420 LDY #REDMSG/256›4430 JSR PASNIT PASS INIT›4440 ;›4450 GET.1 LDA CONSOL ÓÅÌÅÃÔ KEY›4460 CMP #SELKEY PRESSED?›4470 BEQ PUT SKIP READING›4480 ;›4490 LDA #GETDAT SET DATA DIR›4500 JSR SECTIO GET A SECTOR›4510 BPL GET.2 NO ERROR›4520 ;›4530 TYA RE-TRY UNTIL›4540 AND #$0F ERR $80 (BRK)›4550 BNE GET.1 OR $90 (DONE)›4560 LDA #BAD SHOW BAD›4570 BNE GET.5 (JMP)›4580 ;›4590 GET.2 LDY DCNTLO›4600 DEY ›4610 GET.3 LDA (BUFFER),Y ANY DATA IN›4620 CMP FMTTYP THIS SECTOR›4630 BNE GET.4 YES›4640 DEY ›4650 BPL GET.3 KEEP LOOKING›4660 LDA #EMPTY NO›4670 BNE GET.5 (JMP)›4680 GET.4 JSR INCBUF INC BUFFER POINTERS›4690 LDA #DATA›4700 ;›4710 GET.5 LDY #0›4720 STA (VTOC),Y STORE SECTOR STATUS›4730 JSR INCSEC INC OTHER POINTERS›4740 ;›4750 BCC GET.1 GET NEXT SECTOR›4760 ;›4770 ; PUT BLOCK OF SECTORS›4780 ; --------------------›4790 ;›4800 PUT LDA DSTDRV DESTINATION DRV›4810 STA DUNIT›4820 LDA #PUTDAT SET DATA DIR›4830 STA DSTATS›4840 JSR INSER1 ;"INSERT" MSG›4850 JSR WAIT1 WAIT FOR GO!›4860 ;›4870 PUT.1 JSR FMTDST›4880 ;›4890 LDA SECSAV RESET›4900 STA DSECLO SECTOR & VTOC›4910 LDA SECSAV+1 POINTERS FOR›4920 STA DSECHI WRITING SECTORS›4930 LDA VTOSAV›4940 STA VTOC›4950 LDA VTOSAV+1›4960 STA VTOC+1›4970 LDX #WRTMSG&255;"WRITING"›4980 LDY #WRTMSG/256›4990 JSR PASNIT›5000 LDA WRTMOD WITH OR WITHOUT VFY›5010 STA DCOMND›5020 ;›5030 ;›5040 PUT.2 LDY #0 DATA IN THIS SEC?›5050 LDA (VTOC),Y›5060 AND #$E0›5070 BEQ PUT.4 NO - NOTHING TO DO›5080 ;›5090 LDA #PUTDAT SET DATA DIR›5100 JSR SECTIO PUT A SECTOR›5110 BPL PUT.3›5120 ;›5130 LDX #WERMSG&255;"WRITE ERROR"›5140 LDY #WERMSG/256›5150 JSR CHKDST ;"CHECK DEST"›5160 LDX SECSAV RE-TRY ON›5170 CPX #1 1ST PASS ONLY›5180 BNE PUT.2A›5190 LDX SECSAV+1›5200 BEQ PUT.1›5210 ;›5220 PUT.2A JMP (DOSVEC) ABORT COPY›5230 ;›5240 PUT.3 LDA #DATA›5250 LDY #0›5260 STA (VTOC),Y›5270 ;›5280 JSR INCBUF INCREMENT›5290 PUT.4 JSR INCSEC POINTERS›5300 ;›5310 BCC PUT.2 PUT NEXT SECTOR›5320 ;›5330 BEQ DONE COPY COMPLETE?›5340 JMP GET NO›5350 ;›5360 ; COPY DONE›5370 ; ---------›5380 ;›5390 DONE LDX #DNEMSG&255;"DONE"›5400 LDY #DNEMSG/256›5410 JSR PRINTW›5420 JSR WAIT›5430 JMP (DOSVEC) NEXT COPY›5440 ;›5450 ; SUBROUTINES›5460 ; ===========›5470 ;›5480 ; DISK INSERT MESSAGES›5490 ; --------------------›5500 ;›5510 INSER1 LDA SRCDRV 2 DRIVES ?›5520 CMP DSTDRV›5530 BNE INSEND NO MSG›5540 INSER2 LDA SRCDRV 2 DRIVES ?›5550 CMP DSTDRV›5560 BNE INSBOT›5570 INSROW LDA DSTATS READ OR WRITE?›5580 BPL INSSRC WRT=+VE READ=-VE›5590 INSDST LDX #DSTMSG&255;"INSERT›5600 LDY #DSTMSG/256 DESTINATION"›5610 BNE INSPRT (JMP)›5620 INSSRC LDX #SRCMSG&255;"INSERT›5630 LDY #SRCMSG/256 SOURCE DISK"›5640 BNE INSPRT (JMP)›5650 INSBOT LDX #BOTMSG&255;"INSERT›5660 LDY #BOTMSG/256 BOTH DISKS"›5670 INSPRT JSR PRINTW›5680 INSTRT LDX #TPSMSG&255;"THEN PRESS›5690 LDY #TPSMSG/256 START"›5700 JSR PRINTW›5710 INSEND RTS ›5720 ;›5730 ; PASS INITIALIZATION›5740 ; -------------------›5750 ;›5760 PASNIT JSR PRINTW O/P MSG›5770 ;›5780 LDA #BUFBOT&255 INIT TO START›5790 STA DBUFLO OF BUFFER›5800 STA BUFFER›5810 LDA #BUFBOT/256›5820 STA DBUFHI›5830 STA BUFFER+1›5840 ;›5850 PASEPL STA ATRACT ATTRACT MODE OFF›5860 LDA #BRKENA ENABLE BREAK KEY›5870 STA IRQEN›5880 STA POKMSK›5890 PASEND RTS ›5900 ;›5910 ; INCREMENT POINTERS›5920 ; ------------------›5930 ;›5940 INCBUF LDA BUFFER INC BUFFER›5950 CLC POINTERS BY›5960 ADC SECSIZ SECTOR SIZE›5970 STA DBUFLO›5980 STA BUFFER›5990 LDA BUFFER+1›6000 ADC SECSIZ+1›6010 STA DBUFHI›6020 STA BUFFER+1›6030 ;›6040 ; IF WE HAVE REACHED THE CODE›6050 ; SECTION OF MEMORY - SKIP IT›6060 ;›6070 CMP #ORIGN2/256›6080 BNE INCRTS›6090 LDA #ORIGN2/256+5›6100 STA BUFFER+1›6110 STA DBUFHI›6120 LDA #0›6130 STA BUFFER›6140 STA DBUFLO›6150 INCRTS RTS ›6160 ;›6170 INCSEC LDX DSECLO LAST›6180 CPX #LSTSEC&255 SECTOR ?›6190 BNE INC.2›6200 LDX DSECHI›6210 CPX #LSTSEC/256›6220 BEQ INCEND›6230 ;›6240 INC.2 INC DSECLO INCREMENT SECTOR›6250 BNE INC.3 AND VTOC POINTERS›6260 INC DSECHI›6270 INC.3 INC VTOC›6280 BNE INC.4›6290 INC VTOC+1›6300 ;›6310 INC.4 LDA BUFFER+1›6320 CMP SAVMSC BUFFER FULL?›6330 BCC INCEND NO›6340 LDA #1 SHOW BUFFER FULL›6350 INCEND RTS ›6360 ;›6370 ; WAIT FOR ÓÔÁÒÔ KEY PRESS›6380 ; ------------------------›6390 ;›6400 WAIT1 LDA SRCDRV 2 DRIVES ?›6410 CMP DSTDRV›6420 BNE WAIEND›6430 ;›6440 WAIT LDA #BRKINH INHIBIT BREAK KEY›6450 STA IRQEN DURING THE WAIT›6460 STA POKMSK›6470 ;›6480 LDX CONSOL›6490 CPX #STRTKY ÓÔÁÒÔ KEY?›6500 BEQ WAIEND›6510 CPX #OPTNKY OPTION KEY?›6520 BNE WAIT›6530 ;›6540 PLA LOSE RETURN ADDR›6550 PLA ÏÐÔÉÏÎ =›6560 JMP PUT REPEAT COPY›6570 WAIEND RTS ›6580 ;›6590 ; "CHECK DESTINATION"›6600 ; -------------------›6610 ;›6620 CHKDST JSR PRINTW O/P ERROR MSG›6630 LDX #CHKMSG&255;"CHECK DEST"›6640 LDY #CHKMSG/256›6650 JSR PRINTW›6660 JSR INSTRT ;"START"›6670 JSR WAIT WAIT FOR GO›6680 CHKEND RTS ›6690 ;›6700 ; SECTOR I/O›6710 ; ----------›6720 ;›6730 SECTIO STA DSTATS DATA DIRECTION›6740 LDA #TIMOUT›6750 STA DTIMLO›6760 LDA SECSIZ›6770 STA DCNTLO›6780 ;›6790 LDA #POINT POINT TO CURRENT›6800 LDY #0 SECTOR IN THE›6810 STA (VTOC),Y SCREEN VTOC›6820 ;›6830 LDA DSECLO WRITE SECTOR›6840 JSR HEXSCR NUMBER TO THE›6850 SECFIX STX SCNSEC+3 SCREEN›6860 STY SCNSEC+2›6870 LDA DSECHI›6880 JSR HEXSCR›6890 STA SCNSEC+1›6900 ;›6910 JSR SIOV DO THE I/O›6920 SHOEND RTS ›6930 ;›6940 ; CONVERT HEX TO SCREEN CODE›6950 ; --------------------------›6960 ; A=HEX -> X=LSB Y=MSB›6970 ;›6980 HEXSCR PHA SAVE #›6990 LSR A GET MSB›7000 LSR A›7010 LSR A›7020 LSR A›7030 JSR HEX1 CONV SCN CODE›7040 TAY RETURN IN Y›7050 PLA ›7060 AND #$0F GET LSB›7070 JSR HEX1 CONV SCN CODE›7080 TAX RETURN IN X›7090 RTS ›7100 ;›7110 HEX1 CMP #$0A BETWEEN 0&9?›7120 BCC HEX2›7130 CLC NO A-F›7140 ADC #$07 'A'=$21›7150 HEX2 ADC #$10 '0'=$10›7160 HEXEND RTS ›7170 ;›7180 ; SCREEN PRINT›7190 ; ------------›7200 ;›7210 PRINTW LDA #4 WINDOW ON›7220 STA BOTSCR›7230 PRINT STY CRSINH INHIBIT CURSOR›7240 JSR PUTLIN›7250 LDA #24›7260 STA BOTSCR WINDOW OFF›7270 PRIEND RTS ›7280 ;›7290 ; FORMAT DESTINATION›7300 ; ------------------›7310 ;›7320 FMTDST LDX FMTFLG FORMAT ?›7330 BEQ FOREND›7340 LDX SECSAV FORMAT ON FIRST›7350 CPX #1 PASS ONLY›7360 BNE FOREND›7370 LDX SECSAV+1›7380 BNE FOREND›7390 ;›7400 LDA #FMTDSK›7410 STA DCOMND›7420 LDA #TIMFMT›7430 STA DTIMLO›7440 LDA #GETDAT›7450 STA DSTATS›7460 LDA #$FF DUMP BAD SECTORS›7470 STA DBUFHI›7480 LDX #FMTMSG&255;"FORMATTING"›7490 LDY #FMTMSG/256›7500 JSR PRINTW›7510 ;›7520 JSR SIOV GO DO IT›7530 BPL FOREND OK›7540 ;›7550 LDX #FERMSG&255;"FORMAT ERR"›7560 LDY #FERMSG/256›7570 JSR CHKDST ;"CHECK DEST"›7580 BEQ FMTDST JMP RE-TRY›7590 ;›7600 FOREND RTS ›7610 ;›7620 ; MESSAGE BASE›7630 ; ============›7640 ;›7650 HDRMSG .BYTE "} COPYMATE 1.4 "›7660 .BYTE " BY MIKE PALMER",$9B›7670 OPTMS1 .BYTE "SOURCE DRIVE .... #"›7680 OPTS .BYTE "?",$9B›7690 OPTMS2 .BYTE "DESTINATION DRIVE #"›7700 OPTD .BYTE "?",$9B›7710 OPTMS3 .BYTE "FORMAT DESTINATION "›7720 OPTF .BYTE "???",$9B›7730 OPTMS4 .BYTE "WRITE VERIFICATION "›7740 OPTV .BYTE "???",$9B›7750 DNEMSG .BYTE "} COPY COMPLETED ý"›7760 .BYTE " PRESS  ÓÔÁÒÔ ",$9B›7770 FMTMSG .BYTE "} FORMATTING",$9B›7780 FERMSG .BYTE "} FORMATTING ERROR",$9B›7790 WERMSG .BYTE "} WRITE ERROR",$9B›7800 CHKMSG .BYTE "ýCHECK DESTINATION DISK",$9B›7810 REDMSG .BYTE "} READING SECTOR",$9B›7820 WRTMSG .BYTE "} WRITING SECTOR",$9B›7830 DSTMSG .BYTE "}INSERT DESTINATION DISK",$9B›7840 SRCMSG .BYTE "} INSERT SOURCE DISK",$9B›7850 BOTMSG .BYTE "} INSERT BOTH DISKS",$9B›7860 TPSMSG .BYTE " THEN PRESS  ÓÔÁÒÔ ",$9B›7870 .PAGE ›7880 ;›7890 ; BOOT DISK MAKER›7900 ; ===============›7910 ;›7920 *= $3A00›7930 ;›7940 MAKER LDA #$34 RED WARNING›7950 STA BACKGR SCREEN COLOR›7960 STA BORDER›7970 LDA #2 LEFT MARGIN=2›7980 STA LMARGN›7990 ;›8000 LDX #MAKMSG&255;"MAKER"›8010 LDY #MAKMSG/256 MESSAGE›8020 JSR PRINT›8030 ;›8040 MAKEWT LDA CH WAIT FOR›8050 CMP #RTNKEY ÒÅÔÕÒÎ KEY?›8060 BNE MAKEWT›8070 ;›8080 LDA #0›8090 LDX #$0A CLEAR OUT›8100 MAKEZR STA DUNIT,X DISK DCB›8110 DEX ›8120 BNE MAKEZR›8130 ;›8140 LDA #DISKID SET UP THE DCB›8150 STA DBUSID›8160 LDA #1›8170 STA DUNIT›8180 INC DSECLO›8190 LDA #ORIGN1&255›8200 STA DBUFLO›8210 LDA #ORIGN1/256›8220 STA DBUFHI›8230 LDA #$80›8240 STA DCNTLO›8250 LDA #PUTVER›8260 STA DCOMND›8270 LDA #TIMOUT›8280 STA DTIMLO›8290 ;›8300 MAKEIO LDA #PUTDAT WRITE COPYMATE›8310 STA DSTATS›8320 JSR SIOV PUT SECTOR›8330 BMI MAKEIO TRY AGAIN ON ERROR›8340 LDA DBUFLO›8350 CLC ›8360 ADC #$80›8370 STA DBUFLO›8380 LDA DBUFHI›8390 ADC #$00›8400 STA DBUFHI›8410 ;›8420 CMP #END/256+1 ALL DONE?›8430 BEQ MAKEDN›8440 INC DSECLO›8450 JMP MAKEIO›8460 ;›8470 MAKEDN JMP COLDSV COLD START›8480 ;›8490 MAKMSG .BYTE "} COPYMATE 1.4 - BOOT DISK MAKER ýýý"›8500 .BYTE " INSERT A NEWLY FORMATTED DISK INTO "›8510 .BYTE " DRIVE ONE -- THEN PRESS  ÒÅÔÕÒΠ"›8520 END .BYTE $9B›8530 *= $02E0 LOAD & GO ADDRESS›8540 .WORD BOONIT›8550 .OPT NO LIST›