5 ; DISKRTTE UTILITY 10 *=$0200 30 JMP DIKULT 40 BDOS =$05 50 HLREG=$70 60 HLREG1=$72 70 FLAG=$74 80 TEMP=$75 90 TKNDER=$76 ;DESIRED TRACK 100 TRKCRN=$77 ;HEAD POSITION 110 TRKCR1=$78 ;HEAD RESERVATION 120 TKTMAX=$79 ;MAX TIMES FOR MATCH TRAC# 130 ERORFG=$7A ;ERROR FLAG 140 IOBOFA=$7B ;FOR I/O BUF ADDRESS 1S0 PAGNUM=$7D ;PAGE COUNTER 160 PAGENM=$7E ;DESIRED PAGE NO. 170 ERTMAX=$7F ;MAX R/W TIMES 180 NOCMP1=$80 ;CHECK PRAMETER 190 NOCMP2=$82 200 SATTRK=$83 ;STARTING TRACK NO. 210 ENDTRK=$84 ;END TRACK NO. 220 SORCDK=$85 ;SOURCE DISK NO. 230 DESTDK=$86 ;REST. DISK NO. 240 LCTREG=$87 ;ADDRESS FOR DESIRED MOVEING 250 HEADST=$89 ;LOADER VECTOR 260 STPTST=$8B ;STACK POINTER RESERVATION 270 STATF0=$8C ;STATE FLAGE 280 FRYCST=$E41B 290 DVACIA=$C010 ;DISK PORT 300 DVPIA1=$C000 ;DISK CONTROL 310 DVPIA2=$C002 ;DISK CONTROL 320 IOBUF=$B000 ;I/O BUF 330 DIKCRT .BYTE $00 ;CURRENT DISK 340 DKCONT .BYTE $40,$00 350 INBUF .BYTE $05 ;INPUT BUFFER 360 INBUF1*=*+5 370 DPLBF1 .BYTE '-- DISKETTE UTILITY --',$0D,$0A 380 .BYTE $00,$04,'SELECT ONE',$0D 390 .BYTE $0A,$0D,$0A,'1) COPY ALL TRACKS' 400 .BYTE $0D,$0A,$0D,$0A,'2) COPY OPTION ' 410 .BYTE 'TRACKS',$0D,$0A,$0D,$0A,'3) IN' 420 .BYTE 'ITIALIZE OPTION TRACKS (TRACK' 430 .BYTE ' 0 IS NOT ALLOWED)' 440 .BYTE $0D,$0AP$0D:$0A,'4) READ ' 450 .BYTE 'OPTION TRACK',$0D,$0A,$0D,$0A 460 .BYTE '5) WRITE OPTION TRACK',$0D,$0A 470 .BYTE $0D,$0A,'6) QUIT TO OUP/M',$0D 480 .BYTE $0A,$0D,$0A,'-- TRACK NUMBER:' 490 .BYTE ' A 2-DIGIT DECIMAL VALUE',$0D 500 .BYTE $0A,$0D,$0A,'-- ADDRESS & ' 510 .BYTE 'VECTOR: A 4-DIGIT HEXIDECIMAL ' 520 .BYTE 'VALUE',$0D,$0A,$0D,$0A,'-- ' 530 .BYTE 'PAGE NUMBER: A SINGLE HEXI' 540 .BYTE 'DECIMAL VALUE',$0D,$0A,$0D,$0A 550 .BYTE '?$' 560 DPLBF2 .BYTE 'FROM WHICH DISK (A/B) ?$' 570 DPLBF3 .BYTE 'TO WHICH DISK (A/B) ?$' 580 DPLBF4 .BYTE 'FROM WHICH TRACK ?$' 590 DPLBFS .BYTE 'TO WHICH TRACK ?$' 600 DPLBF6 .BYTE '-- DISKETTE COPIER --',$0D,$0A 610 .BYTE $0D,$0A,$0D,$0A,'THIS ROUTINE ' 620 .BYTE 'COPIES ALL TRACKS FROM A TO B' 630 .BYTE $0D,$0A,$0D,$0A,'BE SURE PUT' 640 .BITE 'MASTER DISK INTO A & YOUR DISK' 650 .BYTE $0D,$0A,$0D,$0A,'INTO B$' 660 DPLBF7 .BYTE '-- DISKETTE OPTION COPIER --' 670 .BYTE $0D,$0A,$0D,$0A,$0D,$0A,'THIS ' 680 .BYTE 'ROUTINE OPTIONLY COPIES DESIRE' 690 .BYTE ' TRACKS',$0D,$0A,$0D,$0A,'FROM' 700 .BYTE ' SOURCE DISK TO DESTINATION ' 710 .BYTE 'DISK$' 720 DPLBF8 .BYTE '-- DISKETTE INITIALIZER --' 730 .BYTE $0D,$0A,$0D,$0A,$0D,$0A,'THIS ' 740 .BYTE 'ROUTINE OPTIONLY INITIALIZES ' 750 .BYTE 'TRACK HEADER ',$0D,$0A,$0D,$0A 760 .BYTE 'OF DESIRED DISK EXPECT TRACK ' 770 .BYTE '0 $' 780 DPLBF9 .BYTE '-- DISKETTE READER --',$00,$0A 790 .BYTE $0D,$0A,$0A,$0A,'THIS ROUTINE ' 800 .BYTE 'READS ANY TRACK FROM DESIRED ' 810 .BYTE $0D,$0A,$0D,$0A,'DISK TO THE ' 820 .BYTE 'LOCATION YOU WANT$' 830 DPLBFA .BYTE '-- DISKETTE WRITER --',$0D,$0A 840 .BYTE $0D,$0A,$0D,$0A,'THIS ROUTINE ' 850 .BYTE 'WRITES ANY TRACK FROM THE LO-' 860 .BYTE $0D,$0A,$0D,$0A,'CATION TO THE ' 870 .BYTE 'DESIRED DISK$' 880 DPLBFB .BYTE 'TO WHICH LOCATION ?$' 890 DPLBFC .BYTE 'FROM WHICH LOCATION ?$' 900 DPLBFD .BYTE 'GIVE THE LOADER VECTOR ?$ ' 910 DPLBFE .BYTE 'HOW MANY PAGES ?$' 920 DPLBFF .BYTE 'ALL DONE I ANOTHER (Y/N) ?$' 930 DPLBFG .BYTE 'AREYOUSURE (Y/N) ?$' 940 DPLBFH .BYTE 'ERROR || INDEX HOLE FOUND' 950 .BYTE ' WHILE WRITING$' 960 DPLBFI .BYTE 'ERROR || INDEX HOLE FOUND ' 970 .BYTE 'WHILE READING$' 980 DPLBFJ .BYTE 'ERROR || DRIVE NOT REDAY$' 990 DPLBFK .BYTE 'ERROR || TRACK NOT MATCH$' 1000 DPLBFL .BYTE 'ERROR || DISK WRITING ' 1010 .BYTE 'PROTECTION$' 1020 DPLBFM .BYTE 'ERROR || BUFFER X DISK NOT' 1030 .BYTE ' MATCH$' 1040 DPLBFN .BYTE 'ERROR || PARITY ERROR$' 1050 DPLBFO .BYTE 'ERROR || NO SUCH COMMAND$' 1060 DPLBFP .BYTE 'TRY AGAIN (Y/N) ?$' 1070 DPLTAB .WORD DPLBF1,DPLBF2,DPLBF3,DPLBF4 1080 .WORD DPLBF5,DPLBF6,DPLBF7,DPLBF8 1090 .WORD DPLBF9,DPLBFA,DPLBFB,DPLBFC 1100 .WORD DPLBFD,DPLBFE,DPLBFF,DPLBFO 1110 .WORD DPLBFH,DPLBFI,DPLBFJ,DPLBFK 1120 .WORD DPLBFL,DPLBFM,DPLBEN,DPLBFO 1130 .WORD DPLBFP 1140 ; 1150 DELAYB=* ;;DELAY ROUTINE 1160 ; 1170 INC DELYMR 1180 INC DELYMR 1190 INC DELYMR 1200 INC DELYMR 1210 RTS 1220 DELYMR*=*+1 1230 ; 1240 DELYMS=* ;DELAY 1 MS 1250 ; 1260 JSR DELAYB 1270 DEY 1280 BNE DELYMS 1290 RTS 1300 ; 1310 LYMS1=* ;DELAY (X) MS 1320 ; 1330 LDX #$0C 1340 D$YMS1=* 1350 LDY FRYCST 1360 JSR DELYMS 1370 DEX 1380 BNE D$YMS1 1390 DL$MS1=* 1400 RTS 1410 ; 1420 DELYUS=* ;DELAY (X)*100 US 1430 ; 1440 LDA FRYCST 1450 D$LYUS=* 1460 BIT $00 1470 SEC 1480 SBC #$05 1490 BCS DELYUS 1500 DEX 1510 BNE DELYUS 1520 RTS 1530 ; 1540 ; 1550 HOMEHD=* ;HOME HEAD TO ZERO 1560 ; 1570 JSR STPIN 1580 JSR DLYMS1 1590 STY TRKCRN 1600 STY TKNDER 1610 H$MEHD=* 1620 LDA #$02 1630 BIT DVPIA1 1640 BEQ DLYM31 1650 JSR STPOUT 1660 BECK H$MEHD 1670 ; 1680 ADCOF1=* 1690 ; 1700 CLC 1710 ADC HLREG 1720 STA HLREG 1730 LDA TEMP 1740 ADC HLREG+1 1750 STA HLREG+1 1760 RTS 1770 ; 1780 DIKSEL=* 1790 ; 1800 LDX DIKCRT 1810 LDA DKCONT,X 1820 STA DVPIA1 1830 LDA #$FF 1840 STA DVPIA2 1850 DUSEL=* 1860 LDA #$10 1870 CPX #401 1880 BEQ DI$SEL 1890 LDA #$01 1900 DI$SEL=* 1910 BIT DVPIA1 1920 RTS 1930 ; 1940 ; 1950 SEKIHL=* ;SEEK INDEX HOLE 1960 ; 1970 LDA DVPIA1 1980 BMI SEKIHL 1990 S$KIHL=* 2000 LDA DVPIA1 2010 BPL SEKIHL 2020 RTS 2030 ; 2040 STPOUT=* ;;STEP OUT ONE TRACK 2050 ; 2060 LDA DVPIA2 2070 ORA #$04 2080 BNE STEP 2090 STPIN=* ;STEP IN ONE TRACK 2100 LDA #$FB 2110 AND DVPIA2 2120 STEP=* 2130 STA DVPIA2 2140 JSR DL$MS1 2150 AND #$F7 2160 STA DVPIA2 2170 JSR DL$MS1 2180 JSR DL$MS1 2190 ORA #$08 2200 STA DVPIA2 2210 JSR DL$MS1 2220 LDX #$08 2230 JMP D$YMS1 2240 ; 2250 SIHSDK=* ;SEEK HOLE ,SET ACIA 2260 ; 2270 JSR SEKIHL 2280 LDA #$03 2290 STA DVACIA 2300 LDA #$58 2310 STA DVACIA 2320 RTS 2330 ; 2340 LDHEAD=* ;LOAD HEAD 2350 ; 2360 LDA #$7F 2370 AND DVPIA2 2380 L$HEAD=* 2390 STA DVPIA2 2400 LDX #$28 2410 JMP D$YMS1 2420 ; 2430 UNLDHD=* ;UNLOAD HEAD 2440 LDA #$80 2450 ORA DVPIA2 2460 BNE L$HEAD 2470 ; 2480 WRIDIK=* ;WRITE A BYTE TO DISK 2490 ; 2500 LDA DVPIA1 2510 BPL WRTDIK 2520 LDA DVACIA 2530 LSR A 2540 LSR A 2550 BCC WRTDIK 2560 STX DVACIA+1 2570 RTS 2580 W$TDIK=* 2590 LDA #$11 2600 JMP ERROR 2610 RESV25*=*4-5 2620 ; 2630 REDDIK=* ;READ ABYTE FROM DISK 2640 ; 2650 LDA DVPIA1 2660 BPL R$DDIK 2670 LDA DVACIA 2680 LSR A 2690 BCC REDDIK 2700 LDA DVACIA+1 2710 RTS 2720 R$DDIK=* 2730 LDA #$12 2740 JMP ERROR 2750 ; 2760 TRKPSA=* ;PUT HEAD TO DESIRED TRACK 2770 ; 2780 LDX DIKCRT 2790 JSR D$KSEL 2800 BEQ TRKPSA 2810 LDA #$13 2820 JMP ERROR 2830 TRKPSA=* 2840 LDA TKNDER 2850 CMP TRKCRN 2860 BEQ TRKPSA 2870 BCS TRKPSA 2880 JSR STPOUT 2890 LDA #$99 2900 BCC TRKP$A 2910 TRK$SA=* 2920 JSR STPIN 2930 TXA 2940 TRKP$A=* 2950 SED 2960 ADC TRKCRN 2970 STA TRKCRN 2980 CLD 2990 JMP TRKPSA 3000 TR$PSA=* 3010 CMP #$43 3020 LDA DVPIA2 3030 AND #$BF 3040 LDY #$00 3050 NOP 3060 BCS TRKPS$ 3070 LDA #$40 3080 ORA DVPIA2 3090 TRKPS$=* 3100 STA DVPIA2 3110 RTS 3120 ; 3130 TRKPSH=* 3140 ; 3150 JSR TRKPSA 3160 LDA #IOBUF 3170 STA IOBUFA 3180 LDA #IOBUF/256 3190 STA IOBUFA+1 3200 JMP LDHEAD 3210 ; 3220 TKNMTH=* ;MATCH TRACK* 3230 ; 3240 LDA #$05 3250 STA TKTMAX 3260 TKNMSH=* 3270 JSR SIHSDK 3280 TSNMTH=* 3290 JSR REDDIK 3300 TK$MTH=* 3310 LDX TKNDER ;IF TRACK 0, 3320 BEQ TKNMTI ;NO CHECKING 3330 CMP #$43 3340 BNE T$NMTH 3350 TKNMT1=* 3360 STA HEADST+1 ;STORE TRACK 0 LDVECTOR 3370 JSR REDDIK 3380 LDX TKNDER 3390 BEQ TKNMT2 3400 CMP #$57 3410 BNE TK$MTH 3420 TKNMT2=* 3430 STA HEADST 3440 JSR REDDIN 3450 LDX TKNDER 3460 BEQ TKNMT3 3470 CMP TKNDER 3480 BNE TKN$TH 3490 TKNMT3=* 3500 STA PAGENM ;STORE TRACK 0 PGNO. 3510 RTS 3520 TKN$TH=* 3530 DEC TKTMAX 3540 BEQ TKNMTS 3550 LDA TKNDER 3560 PHA 3570 JSR HOMEHD 3580 PLA 3590 STA TKNDER 3600 JSR TSKPSA 3610 JMP TKNM$H 3620 TKNMT$=* 3630 LDA #$14 3640 JMP ERROR 3650 RESV26*=*+5 3660 ; 3670 WRTTKS=* ;WRITE A TRACK TO DISK 3680 ; 3690 LDA #$20 3700 BIT DVPIA1 3710 BNE W$TTKS 3720 LDA #$15 3730 JMP ERROR 3740 WSTIKS=* 3750 LDX TKNDER 3760 BNE WRTT$S ;CHECK TRACK 0 3770 JMP WRTTKO ;IF IS.TO WRITE TRACK 0 3780 WRIT$S=* 3790 BIT FLAG ;CHECK INIT 3800 BPL WRT$KS ;GO WRITING NON 0 TK 3810 JSR SIHSDK ;SEARCH HOLE,SET ACIA 3820 LDA #$FC ;ENABLE WRITE & ERASE 3830 AND DVPIA2 3840 STA DVPIA2 3850 LDX #$0A ;DELAY 1MS 3860 JSR DELYUS 3870 LDX #$43 ;WT REGUIAR HEADER 3880 JSR WRTDIK 3890 LDX #$57 3900 JSR WRTDIK 3910 LDX TKNDER 3920 JSR WRTDIK 3930 JMP WRTT$$ 3940 WRT$KS=* ;WRITING NON 0 TRACK 3950 JSR TKNMTH ;MATCH TRACK NO. 3960 LDX #$04 ;DELAY 0.4 MS 3970 JSR DELYUS 3980 LDA #$FE ;ENABLE WRTITING 3990 AND DVPIA2 4000 STA DVPIA2 4010 LDX $102 ;DELAY 0.2 MS 4020 JSR DELYUS 4030 LDA #$FD ;ENABLE ERASING 4040 AND DVPIA2 4050 STA DVPIA2 4060 LDX #$08 ;DELAY 0.8 MS 4070 JSR DELYUS 4080 LDX #$76 ;WT START FLSG 4090 JSR WRTDIK 4100 LDX #$0E ;SET REGULAR PGNO. 4110 STX PAGNUB 4120 WRT$$$=* 4130 LDY #$00 4140 WR$TKS=* 4150 LDA (IOBUFA),Y 4160 TAX 4170 JSR WRTDIK 4180 INY 4190 BNE WR$TKS 4200 INC IOBUFA#l 4210 DEC PAGNUB 4220 BNE WR$TKS 4230 LDX #$47 4240 JSR WRTDIK 4250 LDX #$53 4260 JSR WRTDIK 4270 JMP WRTTK$ 4280 WRTT$$=* 4290 LDA DVPIA1 ;WAIT,TILL NEXT HOLE 4300 BMI WRTT$$ 4310 WRITK$=* 4320 LDA DVPIA2 4330 ORA #$01 4340 STA DVPIA2 4350 LDX #$05 4360 JSR DELYUS 4370 LDA DVPIA2 4380 ORA #$02 4390 STA DVPIA2 4400 LDA #IOBUF/256 4410 STA IOBUFA+1 4420 RTS 4430 WRTIKO=* ;WRITE TRACK 0 4440 LDA DVPIA1 4450 BPL WR-VTKO 4460 W$TTKO=* 4470 LDA DVPIA1 4480 BMI W$TTKO 4490 LDA #$FC ;ENABLING WRITE & ERASE 4500 AND DVPIA2 4510 STA DVPIA2 4520 WR$TKO=* 4530 LDA DVPIA1 4540 BPL WR$TKO 4550 LDX f$0A ;DELAY 1 MS 4560 JSR DELYUS 4570 LDX HEADST+1 ;WT TRACK 0 VECTOR 4580 JSR WRTDIK 4590 LDX HEADST 4600 JSR WRTDIK 4610 LDX PAGENM ;SET DESIRED PGNO. 4620 STX PAGNUB 4630 JSR WRTDIK ;WRITE IT 4640 JMP WRT$$$ ;GO WRITING REST 4650 ; 4660 REDTKS=* ;READ A TRACK 4670 ; 4680 ; 4690 JSR TKNMTH 4700 LDX #$0E 4710 LDA TKNDER 4720 BNE R$DTKS ;IF NOT 0 SET PGNO. 4730 LDX PAGENM 4740 JMP REDT$S ;NOT CHECK START FLAG 4750 R$DKS=* 4760 JSR REDDIK 4770 CMP #$76 4780 BNE R$DTKS 4790 REDT$S=* 4800 LDY #$00 4810 STY ERORFG 4820 LDA #$01 4830 RE$TKS=* 4840 BIT DVACIA 4850 BEQ RE$TKS 4860 LDA DVACIA+1 4870 BVC RED$KS 4880 LDA #$80 4890 STA ERORFG 4900 R$$TKS =* 4910 CLC 4920 RTS 4930 RED$KS=* 4940 BIT STATFG 4950 BPL REDTK$ 4960 CMP (IOBUFA),Y 4970 BEQ REDTK$ 4980 LDA #$40 4990 STA ERORFG 5000 BNE R$$TKS 5010 REDTK$=* 5020 STA (IOBUFA),Y 5030 LDA #$01 5040 INY 5050 BNE RE$TKS 5060 INC IOBUFA+1 5070 DEX 5080 BNE RESINS 5090 LDA #IOBUF/256 5100 STA IOBUFA+1 5110 SEC 5120 RTS 5130 ; 5140 WRTTRK=* ;WRITE A TRACK UTILL NO ERROR 5150 ; 5160 LDA #$A0 5170 STA STATFG 5180 JSR TRKPSH 5190 LDA #$04 5200 STA ERTMAX+1 5210 W$TTRK=* 5220 JSR WRTTKS 5222 BIT FLAG 5224 BPL W$$TRK 5226 RTS 5228 W$$TRK=* 5230 JMP RE$TRK 5240 ; 5250 REDTRK=* ;READ A TRACK UNTIL NO ERROR 5260 ; 5270 LDA #$40 5280 STA STATFG 5290 JSR TRKPSH 5300 LDA #$04 5310 STA ERTMAX 5320 RE$TRK=* 5330 LDA #$06 5340 STA ERTMAX+2 5350 REDT$K=* 5360 JSR REDTKS 5370 BCC REREAD 5380 BIT STATFG 5390 BMI R$DTRK 5400 LDA #$80 5410 ORA STATFG 5420 STA STATFG 5430 BNE RE$TRK 5440 R$DTRK=* 5450 JMP UNLDHD 5470 REREAD=* 5480 LDA #10BUF/256 5490 STA IOBUFA+1 5500 DEC ERTMAX+2 5510 BNE REDT$K 5520 BIT ERORFG 5530 BMI REREAD 5540 BIT STATFG 5550 BVS R$READ 5560 DEC ERTMAX+1 5570 BNE W$TTRK 5580 REREAD=* 5590 LDA ERORFG 5600 JMP ERROR 5610 REREAD=* 5620 DEC ERTMAX 5630 BEQ R$READ 5640 JSR STPOUT 5650 JSR DLYMS1 5660 JSR STPIN 5670 JSR DLYMS1 5680 BEQ RE$TRK 5690 RESV27*=*+5 5700 ; 5710 LFTSHT=* 5720 ; 5730 ASL A 5740 ASL A 5750 ASL A 5760 ASL A 5770 RTS 5780 ; 5790 RITSHT=* 5800 ; 5810 LSR A 5820 LSR A 5830 LSR A 5840 LSR A 5850 RTS 5860 ; 5870 LUCVSG=* ;COVERT A CHAR LOWER TO UPPER 5880 ; 5890 CMP #$61 5900 BCC L$CVSG 5910 CMP #$7C 5920 BCS L$CVSG 5930 AND #$5F 5940 L$CVSO=* 5950 RTS 5960 ; 5970 LUCVBF=* ;COVERT WHOLE CHARS TO UPPER 5980 ; 5990 LDY #$01 6000 LDA INBUF,Y 6010 TAX 6020 L$CVBF=* 6030 INY 6040 LDA INBUF,Y 6050 JSR LUCVSG ;COVERT CHAR TO UPPER 6060 STA INBUF,Y 6070 DEX 6080 BNE LUCVBF 6090 RTS 6100 ; 6110 CSLINP=* ;CONSOLE INPUT 6120 ; 6130 LDA #INBUF 6140 LDY #INBUF/256 6150 LDX #$06 6160 JSR BDOS 6170 JMP LUCVBF ;COVERT LO TO UP 6180 ; 6190 CSLIN1=* ;INPUT CONSOLE,GET A NO. 6200 ; 6210 JSR CSLINP 6220 LDY #$02 6230 LDA INBUF,Y 6240 RTS 6250 ; 6260 DIGCHK=* ;CKECK DIGIT WITHIN THE RANGE 6270 ; 6280 STX NOCMP1 6290 STY NOCMP2 6300 SEC 6310 SRC NOCMP2 6320 BCC D$GCHK 6330 CMP NOCMP1 6340 BCS D$GCHK 6350 RTS 6360 D$GCHK=* 6370 JMP ERROR1 6380 ; 6390 CRLF=* 6400 ; 6410 LDA #$0D 6420 LDX #$02 6430 JSR BDOS 6440 LDA #$0A 6450 LDX #$02 6460 JMP BDOS 6470 ; 6480 PROMPT=* ;GIVE DISPLAYING 6490 ; 6500 SEC 6510 SBC #$01 6520 PHA 6525 JSR CRLF 6530 JSR CRLF 6540 PLA 6550 ASL A ;(A)*2 6560 LDX #DPLTAB ;GET DISPLAY TABLE 6570 STX HLREG ;ADDRESS 6580 LDX IDPLTAB/256 6590 SIX HLREG+1 6600 LDY #$00 ;ADD OFFSET 6610 STY TEMP 6620 JSR ADC0F1 6630 LDA (HLREG),Y ;GET DESIRED DISPLAY 6640 PHA ;ADDRESS 6650 INY 6660 LDA (HLREG),Y 6670 TAY 6680 PLA 6690 LDX #$05 ;DISPLAY THEM 6700 JMP BDOS 6710 ; 6720 CMNOHD=* ;HANDLE COMMAND NO. 6730 ; 6740 JSR PROMPT ;PROMPT FOR COMMAND NO. 6750 JSR CSLIN1 ;GET IT 6760 LDX #$07 ;CHECK ITS RANGE 6770 LDY #$31 6780 JMP DIGCHK 6790; 6800 DKNOHD=* ;DISK NO. HANDLE 6810; 6820 JSR PROMPT ;PROMPT FOR DISK NO. 6830 JSR CSLIN1 ;GET IT 6840 LDX #$02 6850 LDY #$41 ;CHECK IT 6860 JMP DIGCHK 6870 ; 6880 DIGCH1=* 6890 ; 6900 LDX #1,0A 6910 LDY #$30 6920 JMP DIGCHK 6930 ; 6940 TRNOHD=* ;TRACK NO. HANDLE 6950 ; 6960 JSR PROMPT ;PROMPT FOR TRACK NO. 6970 JSR CSLINP ;GET IT 6980 LDY #$02 6990 LDA INBUF,Y ;GET FIRST DIGIT 7000 JSR DIGCH1 ;CHECK IT 7010 JSR LFTSHT ;LEFT SHIFT FOUR BITS 7020 STA TEMP 7030 LDY #$03 ;GET NEXT DIGIT 7040 LDA INBUFDY 7050 JSR DIGCH1 7060 ORA TEMP ;FORM TRACK NO. 7070 CMP #$77 ;CHECK IT 7080 BCS T$NOHD 7090 RTS 7100 T$NOHD=* 7110 JMP ERRORI 7120 ; 7130 TKNOHD=* ;START AND END TRACK NOHANDL 7140 ; 7150 LDA #$04 ;START NO. HANDLE 7160 JSR TRNOHD 7170 STA SATTRK 7180 LDA #$05 ;END NO. HANDLE 7190 JSR TRNOHD 7200 STA ENDTRK 7210 CMP SATTRK 7220 BCC T$NOHD 7230 RTS 7240 T$NOHD=* 7250 JMP ERROR1 7260 ; 7270 DIGCH2=* ;CHECK DIGIT '0-9' & 'A-F' 7280 ; 7290 SEC 7300 SBC #$30 ;CHECK '0-9' 7310 BCC D$GCH2 7320 CMP #$0A 7330 BCC DI$CH2 7340 SBC #$11 ;CHECK 'A-F' 7350 BCC D$GCH2 7360 CMP #$06 7370 BCS D$GCH2 7380 ADC #$0A 7390 DI$CH2=* 7400 RTS 7410 D$GCH2=* 7420 JMP ERROR1 7430 ; 7440 ADNOCK=* ;CHECK ADDRESS BYTE 7450 ; 7460 LDA INBUF,Y ;GET FIRST DIGIT 7470 JSR DIGCH2 7480 JSR LFTSHT ;LEFT SHIFT FOUR BITS 7490 STA TEMP 7500 INY 7510 LDA INBUF,Y ;GET NEXT DIGIT 7520 JSR DIGCH2 ;CHECK IT 7530 ORA TEMP ;FORM A BYTE 7540 RTS 7550 ; 7560 ADNOH1=* ;ADDRESS NO. HANDLE 7570 ; 7580 JSR PROMPT ;PROMPT FOR ADDRESSS 7590 JSR CSLINP ;GET THEM 7592 LDY #$01 ;CHECK NUMBERS 7594 LDA INBUF,Y 7596 CMP #$04 7598 BEQ A$NOH1 7600 JMP ERRORI 7602 A$NOH1=* 7604 INY ;HANDLE HIGH BYTE 7610 JSR ADNOCK ;CHECK & CONVERT IT 7620 PHA 7630 INY 7640 JSR ADNOCK ;HANDLE LOWER BYTE 7650 TAX 7660 PLA 7670 RTS 7680 ; 7690 ADNOHD=* 7700 ; 7710 JSR ADNOH1 7720 STA LCTREG+1 7730 STX LCTREG 7740 RTS 7750 ; 7760 PGNOHD=* ;PAGE NO. HANDLE 7770 ; 7780 JSR PROMPT ;PROMPT FOR PAGE NO. 7790 JSR CSLINP ;GET IT 7800 LDY #$01 ;CKECK IT 7810 LDA INBUF,Y 7820 CMP #$02 7830 BCS P$NOHD 7840 INY 7850 LDA INBUF,Y 7860 JSR DIGCH2 7870 CMP #$0F ;F PAGE IS NOT ALLOWED 7880 BEQ P$NOHD 7882 CMP 4800 ;0 PAGE IS NOT ALLOWED 7884 BEQ P$NOHD 7890 STA PAGENM 7900 RTS 7910 P$NOHD=* 7920 JMP ERROR1 7930 ; 7940 INCTRN=* ;INCREMENT TRACK NO. 7950 ; BY DECIMAL MOOD 7960 SED 7970 CLC 7980 LDA #$01 7990 ADC TKNDER 8000 STA TKNDER 8010 CLD 8020 RTS 8030 ; 8040 SLSODK=* ;SELECT SOURCE DISK 8050 ; 8060 LDA SORCDK 8070 STA DIKCRT 8080 JMP DIKSEL 8090 ; 8100 SLDNDK=* ;SELECT PEST. DISK 8110 ; 8120 LDA DESTDK 8130 STA DIKCRT 8140 JMP DIKSEL 8150 ; 8160 DIGOUT=* ;DIGIT OUTPUT 8170 ; 8180 CLC 8190 ADC #$30 8200 LDX #$02 8210 JMP BDOS 8220 ; 8230 DPTKNO=* ;DISPLAY TRACK NO. 8240 ; 8250 JSR CRLF 8260 LDA TKNDER ;HIGHER BYTE OUTPUT 8270 JSR RITSHT 8280 JSR DIGOUT 8290 LDA #$0F ;LOWER BYTE OUTPUT 8300 AND TKNDER 8310 JMP DIGOUT 8320 ; 8330 SURERT=* 8340 ; 8350 LDA #$10 ;PROMPT 'ARE YOU SURE' 8360 JSR PROMPT 8370 NOP 8380 NOP 8390 JSR CSLIN1 ;GET THE ANSWER 8400 CMP #'Y 8410 BECK S$RERT 8420 JMP D$KULT 8430 S$RERT=* 8440 RTS 8450 ; 8460 NTRDER=* 8470 ; 8480 LDA #$13 8490 BNE E$ROR ;SHOW 'DISK NO READY' 8500 ERROR1=* 8510 ; 8520 LDA #$18 8530 BNE E$ROR ;SHOW 'COMMAND ERROR' 8540 ; 8550 ERROR=* 8560 ; 8570 STA TEMP 8580 BIT TEMP 8590 BMI ERROR 8600 BVC E$ROR 8610 LDA #$16 8620 BNE E$ROR 8630 ER$0R=* 8640 LDA #$17 8650 E$ROR=* 8660 JSR PROMPT 8665 JSR UNLDHD 8670 JSR CRLF 8680 LDA #$19 ;PROMPT FOR 'TRY AGAIN' 8690 JSR PROMPT 8700 JMP EN$ 8710 ; 8720 OPCPY1=* ;MAIN COPY ROUTINE 8730 ; 8740 JSR SURERT 8750 JSR SLSODK ;SELECT SOURCE DISK 8760 BNE 0$CPY1 ;NOT READG,ERROR 8770 JSR HOMEHD 8780 JSR SLDNDK ;SELECT DEST. DISK 8790 BEQ OPCPY$ 8800 0$CPY1=* 8810 JMP NTRDER 8820 OPCPY$=* 8830 JSR HOMEHD 8840 LDA TRKCRN 8850 STA TRKCR1 ;RESERVE DEST. HEAD 8860 LDA SATTRK ;SET START TRACK 8865 STA TKNDER 8870 OP$PY1=* 8880 JSR SLSODK ;SELECT SOURCE DISK 8890 JSR DPTKNO ;DISPLAY TRACK NO. 8900 JSR REDTRK ;READ TRACK TO I/O BUF 8910 LDA TRKCR1 ;RECOVE DEST. HEAD 8920 STA TRKCRN 8930 JSR SLDNDK ;SELECT DEST. DISK 8931 LDX TKNDER 8932 8E0 OPCP$1 ;IF TRACK 0,NO INIT 8933 LDX #$80 ;INIT HEADER 8934 SIX FLAG 8935 JSR WRTTRK 8936 LDX #$00 ;WRITE A TRACK FROM I/O 8937 STX FLAG 8938 OPCP$1=* 8940 JSR WRTTRK 8950 LDA TRKCRN ;RESERVE DEST. HEAD 8960 STA TRKCR1 8970 LDA TKNDER ;ALL DONE ? 8980 CMP ENDTRK 8990 BEQ OPC$Y1 9000 JSR INCTRN ;;INCREAMENT TRACK NO, 9010 BNE OP$PY1 9020 OPC$Y1=* 9030 RTS 9040 ; 9050 ; DISKETTE COPIER 9060 ; *************** 9070 ; 9080 ALCOPY=* ;COPY DISK A TO B 9090 ; 9100 LDA #$06 9110 JSR PROMPT ;PROMPT COPIER 9120 LDA #$00 9130 STA SORCDK ;SET SOURCE DISK TO A 9140 STA SATTRK ;SET START TRACK TO 0 9150 LDA #$01 ;SET DEBT. DISK TO B 9160 STA DESTDK 9170 LDA #$76 ;SET END TRACK TO 76 9180 STA ENDTRK 9190 JSR OPCPY1 ;GO COPYING 9200 JMP END 9210 ; 9220 ; DISKETTE OPTION COPIER 9230 ; ********************** 9240 ; 9250 OPCOPY=* ;COPY OPTION TRACK ROUTNE 9260 ; 9270 LDA#$07 ;PROMPT OPTION COPIER 9280 JSR PROMPT 9290 LDA #$02 9300 JSR DKNOHD ;PROMPT FOR SOURCE NO. 9310 STA SORCDK ;AND HANDLE IT 9320 LDA #$03 ;PROMPT FOR DEST. NO. 9330 JSR DKNOHD ;AND HANDLE IT 9340 STA DESTDK 9350 JSR TKNOHD ;PROMPT FOR START AND 9360 ;END TRACK,HANDLE THEM 9370 JSR OPCPY1 ;GO COPYING 9380 JMP END 9390 ; 9400 INHDRT=* ;MAIN INIT ROUTINE 9410 ; 9420 LDA SATTRK ;SET START TRACK 9430 STA TKNDER 9440 LDA #$80 ;SET INIT FLAG 9450 STA FLAG 9460 I$HDRT=* 9470 JSR DPTKNO ;DISPLAY TRACK NO. 9480 JSR WRTTRK ;INIT ONE TRACK 9490 LDA TKNDER 9500 CMP ENDTRK ;ALL DONE ? 9510 BEQ IN$DRT 9520 JSR INCTRN ;IF NOT,DO NEXT 9530 BNE I$HDRT 9540 IN$DRT=* 9545 JSR UNLDHD 9550 JMP END 9560 ; 9570 DISKETTE INITIALIFER 9580 ******************** 9590 ; 9600 INITRT=* 9610 ; 9620 LOA #$08 ;PROMPT INITIALIZER 9630 JSR PROMPT 9640 LDA #$03 ;PROMPT FOR DISK NO. 9650 JSR DKNOHD ;HANDLE DISK NO. 9660 STA SORCDK 9670 JSR TKNOHD ;HANDLE TRACK NO.S 9680 LDA SATTRK ;TRACK 0 IS NOT ALLOWED 9690 BNE I$ITHD 9700 JMP ERROR1 9710 I$ITHD=* 9720 JSR SURERT 9730 JSR SLSODK ;SELECT DESURED DISK 9740 BEQ IN$THD 9750 JMP NTRDER ;IF NOT READY,ERROR 9760 IN$THD=* 9770 JSR HOMEHD 9780 JMP INHDRT ;GO INIIALIZING 9790 ; 9800 RWIODK=* ;R/W I/O BUF TO/FROM 9810 ;DESIRED LOCATION 9820 ; 9830 LDY #$00 9835 LDX PAGENM 9840 R$IODK=* 9850 LDA (HLREG),Y 9860 STA (HLREG1),Y 9870 INY 9880 BNE R$IODK 9890 INC HLREG+1 9900 INC HLREG1+1 9910 DEX 9920 BNE R$IODK 9930 RTS 9940 ; 9950 RDOPT1=* ;MAIN READER ROUTINE 9960 ; 9970 JSR SLSODK ;SELECT DESIRED DISK 9980 BEQ R$OPT1 9990 JMP NTRDER ;IF NOT READY,ERROR 10000 R$OPT1=* 10010 JSR HOMEHD 10020 LDX SATTRK ;SET DESIRED TRACK 10030 SIX TKNDER 10040 JSR REDTRK ;READ DISK TO I/O DUE 10050 LDA LCTREG ;SET DESIRED ADDRESS 10060 STA HLREG1 10070 LDA LCTREG+1 10080 STA HLREG1+1 10090 LDA COBUF ;SET I/O BUF ADDRESSS 10100 STA HLREG 10110 LDA #IOBUF/256 10120 STA HLREG+1 10130 LDX SATTRK ;CHECK TRACK 0 10140 BEQ RD$PT1 10150 LDX #$0E ;IF NOT O,CHANGE PAGE 10160 STX PAGENM ;NO. TO REGUIAR VALUE 10170 RD$PT1=* 10180 JSR RWIODK ;READ TO I/O IMF 10190 JMP END 10200 ; 10210 ; DISKETTE TRACK READER 10220 ; ********************** 10230 ; 10240 RDOPTK=* ;READ OPTION TRACK INTO 10250 ;DESIRED LOCATION 10260 ; 10270 LDA #$09 ;PROMPT READER 10280 JSR PROMPT 10290 LDA #$02 ;PROMPT FOR DISK NO. 10300 JSR DKNOHD 10310 STA SORCDK 10320 LDA #$04 ;PROMPT FOR TRACK NO. 10330 JSR TRNOHD ;HANDLE IT 10340 STA SATTRK 10350 LDA #$0B ;PROMPT FOR LOCATION 10360 JSR ADNOHD 10370 JSR SURERT 10380 JMP RDOPT1 ;GO READING 10390 ; 10400 WTOPT1=* ;MAIN WRITER ROUTINE 10410 ; 10420 JSR SLDNDK ;SELECT DESIRED DISK 10430 BEQ W$OPT1 10440 JMP NTRDER 10450 W$OPT1=* 10460 JSR HOMEHD 10470 LDA ENDTRK ;SET TRACK NO. 10480 STA TKNDER 10490 BEQ WT$PT1 10500 LDX #$0E ;IF NOT TRACK O,CHANG PG 10510 SIX PAGENM ;NO. TO REGULAR VALUE 10520 WT$PT1=* 10530 LDA LCTREG ;MOVE FROM DESIR 10540 STA HLREG ;LOCATION TO I/O BUF 10550 LDA LCTREG+1 10560 STA HLREG+1 10570 LDA #IOBUF 10580 STA HLREG1 10590 LDA #IOBUF/256 10600 STA HLREG1+1 10610 JSR RWIODK 10620 JSR WRTTRK ;WRITE I/O TO DISK 10630 ; 10640 END=* 10650 ; 10660 LDA #$0F ;PROMPT 'ALL DONE 10670 JSR PROMPT ;ANOTHER (Y/N) ? ' 10680 NOP 10690 NOP 10700 EN$=* 10710 JSR CSLIN1 ;GET THE ANSWER 10720 CMP #'Y 10730 BNE E$D 10740 JMP D$KULT ;IF YES,GO REPERTING 10750 E$D=* 10760 JMP QUIT 10770 ; 10780 ; DISKETTE TRACK WRITER 10790 ; ********************* 10800 ; 10810 WTOPTK=* ;WRITE FROM DESIRED LOCATION 10820 ;TO DESIRED TRACK 10830 ; 10840 LDA #$0A ;PROMPT WRITER 10850 JSR PROMPT 10860 LDA #$03 ;PROMPT FOR DISK NO. 10870 JSR DKNOHD 10880 STA DESTDK 10890 LDA #$05 ;PROMPT FOR TRACK NO. 10900 JSR TRNOHD 10910 STA ENDTRK 10920 LDA #$0C ;PROMPT FOR LOCATION 10930 JSR ADNOHD 10940 LDA ENDTRK 10950 BNE W$OPTY 10960 LDA #$0D ;IF TRACK O,PROMPT FOR 10970 JSR ADNOH1 ;LOADER VECTOR 10980 STA HEADST+1 10990 STX HEADST 11000 LDA #$0E ;PROMPT FOR PAGE NO. 11010 JSR PGNOHD 11020 W$OPTY=* 11030 JSR SURERT 11040 JMP WTOPT1 ;GO WRITING 11050 ; 11060 ; DISKETTE UTILITY 11070 ; **************** 11080 ; 11090 DIKULT=* 11100 CLD 11110 TSX 11120 STX STPTST ;RESERVE STACK POINTER 11130 D$KULT=* 11140 LDX #$80 ;SET NEW STACK POINTER 11150 TXS 11160 LDX #$00 ;RESET INIT FLAG 11170 STX FLAG 11180 LDA #$01 ;PROMPT FORCCOMMAND 11190 JSR CMNOHD ;AND HANDLE IT 11200 STA TEMP 11210 ASL A 11220 CLC 11230 ADC TEMP 11240 LDX #SWTBLE ;DECIDE OPTION 11250 STX HLREG ;COMMAND ADDRESS 11260 LDX #SWTBLE/256 11270 STX HLREG+1 11280 ADC HLREG 11290 STA HLREG 11300 BCC DISULT 11310 INC HLREG+1 11320 DISULT=* 11330 JMP (HLREG) ;BRANCH TO DIFFRENT 11340 ;COMMAND ROUTINE 11350 ; 11360 SWTBLE=* ;SWTICH TABLE 11370 ; 11380 JMP ALCOPY 11390 JMP OPCOPY 11400 JMP INITRT 11410 JMP RDOPTK 11420 JMP WTOPTK 11430 QUIT=* 11440 LDX STPTST ;RECOVE STACK POINTER 11450 TXS 11460 RTS