OUP-M/DSKUTY.s

1172 lines
25 KiB
ArmAsm

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