10 ;SAVE#D5:B>PARK.M65›20 ;ASM,,#d5:b>PARK.OBJ›30 ;06/02/92 By: Robert Puff›40 *= $5000›50 .OPT NO LIST›60 RTS ›70 INIT JSR START›80 LDA #$FF›90 STA RAMPAGE›0100 JMP ($0A)›0110 ;›0120 DEVMSK = $0247›0130 RAMPAGE = $D1BC›0140 PIAPORTB = $D1BE›0150 ;Zero-page equates›0160 ;›0170 SCSIID = $36›0180 ZWTEMP1 = $32›0190 ZPTMP1 = $31›0200 ZPTMP2 = $34›0210 ZPTMP3 = $35›0220 SECH512 = $30›0230 ;›0240 PRTTMP = $E4›0250 ;›0260 ; PIA Equates:›0270 PORTA = $D171›0280 PORTB = $D170›0290 DDRA = $D173›0300 DDRB = $D172›0310 PPCR = $D17C›0320 ;›0330 PTEMP .DS 40›0340 ;›0350 RETRYS .DS 1›0360 BYTES .DS 1›0370 CURSY .DS 1›0380 CTRLS .DS 1›0390 DRIVE .DS 1›0400 HDRLOC .DS 2›0410 DATLOC .DS 2›0420 MAXSEC .DS 3›0430 SECSTRK .DS 1›0440 DECRET .DS 1›0450 FIRSTINC .DS 1›0460 ;›0470 ;Select controller›0480 ; A=scsi # <0=7>›0490 SEL_CTRL STA ZPTMP1›0500 LDA PPCR›0510 ORA #$0F›0520 STA PPCR ;kill any handshake›0530 LDA #$0C›0540 STA DDRB›0550 BIT PORTB ;are we busy?›0560 BVS S_C1›0570 LDX #$F7 ;do a RESET›0580 STX PORTB›0590 S_C5 DEX ›0600 BNE S_C5 ;pause a little›0610 LDA #$FF ;maybe this will›0620 STA PORTB ;wake ctrlr up›0630 TAX ›0640 TAY ›0650 S_C4 NOP ›0660 NOP ;waste cycles›0670 NOP ›0680 NOP ›0690 NOP ›0700 NOP ›0710 NOP ›0720 NOP ›0730 NOP ›0740 NOP ›0750 NOP ›0760 NOP ›0770 DEX ›0780 BNE S_C4›0790 DEY ›0800 BNE S_C4›0810 BIT PORTB ;let's look again›0820 BVS S_C1 ;yep, all ok›0830 LDY #142 ;else bus›0840 RTS ;'overrun'..›0850 S_C1 JSR SETOUT ;set data out›0860 LDX ZPTMP1›0870 LDA BITTAB,X›0880 STA PORTA›0890 LDA #$FB ;lower /SEL›0900 STA PORTB›0910 LDX #0›0920 LDY #$80›0930 S_C2 BIT PORTB›0940 BVC S_C3 ;is it busy?›0950 INX ›0960 BNE S_C2 ;nope, loop›0970 INY ›0980 BNE S_C2›0990 BUSERR LDA #$FF›1000 STA PORTB ;oh well,›1010 LDA PPCR›1020 ORA #$0F›1030 STA PPCR›1040 S_C8 LDX #$0D›1050 STX DDRB›1060 DEX ›1070 STX PORTB›1080 JSR SETINP ;give up›1090 LDY #138›1100 RTS ›1110 S_C3 LDA #$FF›1120 STA PORTB›1130 TAY ›1140 TAX ›1150 S_C6 LDA PORTB ;wait for›1160 AND #$82 ;REQ and C/D›1170 BEQ S_C7 ;to assert›1180 DEX ›1190 BNE S_C6›1200 DEY ›1210 BNE S_C6›1220 BEQ S_C8›1230 S_C7 LDY #1 ;y=0, success!›1240 RTS ›1250 ;›1260 BITTAB .BYTE 1,2,4,8,$10,$20,$40,$80›1270 ;›1280 SETINP PHA ;set direction›1290 LDA #0 ;of data bus›1300 BEQ SETINP1›1310 SETOUT PHA ›1320 LDA #$FF›1330 SETINP1 STA DDRA›1340 PLA ›1350 RTS ›1360 ;›1370 SND_CMD STX ZWTEMP1 ;send cmd›1380 STY ZWTEMP1+1 ;frame›1390 STA BYTES›1400 JSR SETOUT›1410 ; LDA PPCR›1420 ; AND #$F0 ;enable›1430 ; ORA #9 ;handshake›1440 ; STA PPCR›1450 JSR WAITREQ›1460 LDY #0›1470 SN_C1 LDX #0›1480 SN_C2 LDA PORTB›1490 BPL SN_C21›1500 BIT PORTB›1510 BVS SN_C4›1520 BVC SN_C2 ;branch›1530 SN_C21 AND #2›1540 BNE SN_C22 ;oops, data mode›1550 LDA (ZWTEMP1),Y›1560 STA PORTA›1570 JSR FIXSCSI›1580 INY ›1590 CPY BYTES›1600 BNE SN_C1 ;always loop›1610 SN_C22 LDY #1›1620 RTS ›1630 SN_C4 JMP BUSERR›1640 ;›1650 ;›1660 RWDATA›1670 STX ZWTEMP1›1680 STY ZWTEMP1+1›1690 JSR FIXALF›1700 TYA ›1710 ORA ZWTEMP1›1720 BNE RWD1›1730 RTS ;no data›1740 RWD1 JSR WAITREQ›1750 LDA PORTB›1760 LSR A›1770 BCS RW_DD2 ;writes›1780 JSR SETINP›1790 BCC RW_DA1 ;branch to reads›1800 ;›1810 RW_DD2 LDY #0 ;put data code›1820 RW_CC2 LDA PORTB›1830 BPL RW_CC3›1840 BIT PORTB›1850 BVS RW_CC4›1860 BVC RW_CC2 ;branch›1870 RW_CC3 AND #2 ;command or data?›1880 BEQ RW_DD3 ;out of data›1890 LDA (ZWTEMP1),Y›1900 STA PORTA›1910 INY ›1920 BNE RW_CC2›1930 INC ZWTEMP1+1›1940 BNE RW_CC2 ;branch›1950 ;›1960 RW_DD3 TYA ›1970 LDY #1›1980 RTS ›1990 ;›2000 RW_CC4 JMP BUSERR›2010 ;›2020 RW_DA1 LDY #0›2030 RW_DA2 LDX #0›2040 RW_DA3 LDA PORTB ;get data code›2050 BPL RW_DA4›2060 BIT PORTB›2070 BVS RW_CC4›2080 INX ›2090 BEQ RW_CC4›2100 BNE RW_DA3›2110 RW_DA4 AND #2›2120 BEQ RW_DA5›2130 LDA PORTA›2140 STA (ZWTEMP1),Y›2150 INY ›2160 BNE RW_DA3 ;in place of DA2›2170 INC ZWTEMP1+1›2180 BNE RW_DA3 ;branch›2190 ;›2200 RW_DA5 JSR FIXALF›2210 TYA ›2220 LDY #0›2230 RTS ›2240 ;›2250 GETSTAT JSR SETINP›2260 LDA PPCR›2270 ORA #$0F›2280 STA PPCR›2290 JSR WAITREQ›2300 LDA PORTA ;status byte›2310 STA ZPTMP2›2320 JSR FIXSCSI›2330 JSR WAITREQ›2340 ; LDA PORTA ;toss 2nd stat›2350 JSR FIXSCSI›2360 JSR BUSERR ;release bus›2370 LDA ZPTMP2›2380 AND #2›2390 BEQ GE_ST1›2400 LDY #144›2410 RTS ›2420 GE_ST1 LDY #1›2430 RTS ›2440 ;›2450 FIXSCSI LDA PPCR›2460 AND #$FD›2470 STA PPCR›2480 FIX1 BIT PORTB›2490 BPL FIX1›2500 ORA #2›2510 STA PPCR›2520 RTS ›2530 ;›2540 WAITREQ LDA #0›2550 TAX ›2560 LDY #0 ;5 min timeout›2570 WA_R1 BIT PORTB ;wait for REQ›2580 BVS WA_R2 ;not busy›2590 BMI WA_R3›2600 RTS ;got it!›2610 WA_R3 JMP WA_R1 ;LOOP FOREVER›2620 ADC #1›2630 BNE WA_R1›2640 INX ›2650 BNE WA_R1›2660 INY ›2670 BNE WA_R1›2680 WA_R2 PLA ›2690 PLA ›2700 JMP BUSERR›2710 ;›2720 FIXALF›2730 LDA #$EF›2740 STA PPCR›2750 LDA #$E9›2760 STA PPCR ;FIX ACK PROBLEM›2770 RTS ›2780 ;›2790 DOIT PLA ›2800 STA PRTTMP›2810 PLA ›2820 STA PRTTMP+1›2830 LDY #1›2840 LDA (PRTTMP),Y›2850 STA BYTES›2860 INY ›2870 LDA (PRTTMP),Y›2880 STA RETRYS›2890 INY ›2900 LDA (PRTTMP),Y›2910 STA HDRLOC›2920 INY ›2930 LDA (PRTTMP),Y›2940 STA HDRLOC+1›2950 INY ›2960 LDA (PRTTMP),Y›2970 STA DATLOC›2980 INY ›2990 LDA (PRTTMP),Y›3000 STA DATLOC+1›3010 TYA ›3020 CLC ›3030 ADC PRTTMP›3040 TAY ›3050 LDA PRTTMP+1›3060 ADC #0›3070 PHA ›3080 TYA ›3090 PHA ›3100 JSR DATPAGE›3110 LDA HDRLOC›3120 STA PRTTMP›3130 LDA HDRLOC+1›3140 STA PRTTMP+1›3150 DOI3 LDY #1›3160 LDA (PRTTMP),Y›3170 AND #$1F›3180 STA (PRTTMP),Y›3190 LDX DRIVE›3200 LDA $D6AB,X›3210 AND #$E0›3220 ORA (PRTTMP),Y›3230 STA (PRTTMP),Y ;set LUN #›3240 LDA $D6AB,X›3250 AND #7›3260 JSR SEL_CTRL›3270 BMI DOI1›3280 LDX HDRLOC›3290 LDY HDRLOC+1›3300 LDA BYTES›3310 JSR SND_CMD›3320 BMI DOI2›3330 JSR WAITREQ›3340 LDX DATLOC›3350 LDY DATLOC+1›3360 JSR RWDATA›3370 BMI DOI2›3380 JSR GETSTAT›3390 BPL DOI1›3400 DOI2 DEC RETRYS ;retry 2x›3410 BPL DOI3›3420 DOI1 RTS ›3430 ;›3440 DATPAGE PHA ›3450 LDA #$F5›3460 BNE DATPAGE1›3470 PRPAGE PHA ›3480 LDA #$F6›3490 BNE DATPAGE1›3500 JUNKPAGE PHA ›3510 LDA #$FF›3520 DATPAGE1 STA RAMPAGE›3530 PLA ›3540 RTS ›3550 ;›3560 MAKE_CLINE›3570 STX CURSY›3580 LDA #$20›3590 LDY #32›3600 CSS1 STA PTEMP,Y›3610 DEY ›3620 BPL CSS1›3630 INY ›3640 STY PTEMP+21›3650 TXA ›3660 CLC ›3670 ADC #$41›3680 STA PTEMP›3690 JSR DATPAGE›3700 TXA ›3710 ASL A›3720 ASL A›3730 ASL A›3740 STA DRIVE›3750 TAX ›3760 LDA $D6AB,X›3770 PHA ›3780 AND #7›3790 ORA #$30›3800 STA PTEMP+4›3810 PLA ›3820 LSR A›3830 SEC ›3840 ROR A›3850 SEC ›3860 ROR A›3870 LSR A›3880 LSR A›3890 STA PTEMP+6›3900 LDA #',›3910 STA PTEMP+5›3920 LDA $D6AE,X›3930 LSR A›3940 LSR A›3950 LSR A›3960 LSR A›3970 LDY #11 ;heads›3980 JSR A2DIGIT›3990 LDA $D6AC,X›4000 STA 0›4010 LDA $D6AD,X›4020 STA 1›4030 ORA 0›4040 BNE CSS01›4050 LDX CURSY›4060 CLC ;not valid›4070 RTS ›4080 CSS01 LDX #0›4090 STX 2›4100 JSR A3DIGIT›4110 LDX #0›4120 CSS8 LDA NUMBUF,Y›4130 STA PTEMP+16,X›4140 INX ›4150 INY ›4160 CPY #8›4170 BCC CSS8›4180 LDX #PTEMP&255›4190 LDY #PTEMP/256›4200 JSR PRINT›4210 LDX CURSY›4220 SEC ;good›4230 RTS ›4240 ;›4250 NUMBUF .BYTE " ",0›4260 ;›4270 A2DIGIT CMP #10›4280 BCC A2D1›4290 SBC #10›4300 A2D1 PHA ›4310 LDA #$18›4320 ROL A›4330 STA PTEMP,Y›4340 PLA ›4350 ORA #$30›4360 STA PTEMP+1,Y›4370 RTS ›4380 ;›4390 COMLO .BYTE $80,$40,$A0,$10,$E8,100,10,1›4400 COMHI .BYTE $96,$42,$86,$27,3,0,0,0›4410 COMH2 .BYTE $98,$0F,1,0,0,0,0,0›4420 ;›4430 A3DIGIT LDA #'0›4440 LDX #0›4450 LDY #7›4460 A3D1 STA NUMBUF,Y›4470 DEY ›4480 BPL A3D1›4490 INY ›4500 A3D2 LDA 2,X›4510 CMP COMH2,Y›4520 BNE A3D3›4530 LDA 1,X›4540 CMP COMHI,Y›4550 BNE A3D3›4560 LDA 0,X›4570 CMP COMLO,Y›4580 A3D3 BCC A3D4›4590 LDA 0,X›4600 SBC COMLO,Y›4610 STA 0,X›4620 LDA 1,X›4630 SBC COMHI,Y›4640 STA 1,X›4650 LDA 2,X›4660 SBC COMH2,Y›4670 STA 2,X›4680 CLC ›4690 LDA NUMBUF,Y›4700 ADC #1›4710 STA NUMBUF,Y›4720 BCC A3D2 ;branch›4730 A3D4 INY ›4740 CPY #8›4750 BCC A3D2›4760 LDY #0›4770 A3D5 LDA NUMBUF,Y›4780 CMP #'0›4790 BNE A3D6›4800 INY ›4810 CPY #7›4820 BCC A3D5›4830 A3D6 RTS ›4840 ;›4850 A3DIGPRT JSR A3DIGIT›4860 TYA ›4870 CLC ›4880 ADC #NUMBUF&255›4890 TAX ›4900 LDA #NUMBUF/256›4910 ADC #0›4920 TAY ›4930 LDA #0›4940 STA NUMBUF+8›4950 ;›4960 PRINT STX PRTTMP›4970 STY PRTTMP+1›4980 PR1 LDY #0›4990 LDA (PRTTMP),Y›5000 BEQ PR2›5010 JSR EOUTCH›5020 INC PRTTMP›5030 BNE PR1›5040 INC PRTTMP+1›5050 BNE PR1›5060 PR2 RTS ›5070 EOUTCH TAY ›5080 LDA $0347›5090 PHA ›5100 LDA $0346›5110 PHA ›5120 LDX #0›5130 TYA ›5140 RTS ›5150 ;›5160 KGETCH LDX #$10›5170 LDA #$0C›5180 STA $0342,X›5190 JSR $E456›5200 LDA #3›5210 STA $0342,X›5220 LDA #KCOL&255›5230 STA $0344,X›5240 LDA #KCOL/256›5250 STA $0345,X›5260 LDA #4›5270 STA $034A,X›5280 JSR $E456›5290 LDA #7›5300 STA $0342,X›5310 LDA #0›5320 STA $0348,X›5330 STA $0349,X›5340 JSR $E456›5350 PHA ›5360 LDA #$0C›5370 STA $0342,X›5380 JSR $E456›5390 PLA ›5400 RTS ›5410 KCOL .BYTE "K:",$9B›5420 ;›5430 INITMSG .BYTE $7D,$7D›5440 .BYTE "Ôèå ÂÌÁÃË ÂÏØ Õôéìéôéå󠠨é ±¹¹² ÃÓÓ",$9B›5450 .BYTE " Hard Disk Parking Utility 1.5",$9B›5460 .BYTE "",$9B,$9B›5470 .BYTE " Configured Drives:",$9B,$9B›5480 .BYTE "ÈÄ Õ£¬Ìõî Èåáäó Ãùìó Ìáóô Óåã Óôáôõó",$9B,0›5490 NOCTLM .BYTE $9B,$9B,"No Hard Disks Configured!",$9B,0›5500 SELHDM .BYTE $9B,"Press any key to exit.",$9B,0›5510 ;›5520 START›5530 LDA #$FF›5540 STA PORTB›5550 LDX #INITMSG&255›5560 LDY #INITMSG/256 ;title›5570 JSR PRINT›5580 LDA #0›5590 STA CTRLS›5600 TAX ›5610 STRL1 JSR MAKE_CLINE›5620 PHP ›5630 ROL CTRLS ;display drives›5640 PLP ›5650 BCS STRL2›5660 STRL3 LDX CURSY›5670 INX ›5680 CPX #8›5690 BCC STRL1›5700 LDA CTRLS ;make sure there›5710 BNE STRL4 ;is at least 1›5720 LDX #NOCTLM&255›5730 LDY #NOCTLM/256›5740 JSR PRINT›5750 STRL4 LDX #SELHDM&255›5760 LDY #SELHDM/256 ;press a key›5770 JSR PRINT›5780 LDA #$FF›5790 STA $02FC›5800 JSR KGETCH›5810 ;THAT'S ALL! NOW LEAVE PORT›5820 ;CORRECTLY...›5830 LDA #4›5840 SEI ›5850 STA $D1FF›5860 LDX $D802›5870 LDA #0›5880 STA $D1FF›5890 CLI ›5900 CPX #6›5910 BCS QUITDOS›5920 LDA #$0C›5930 STA DDRB›5940 ;›5950 QUITDOS LDA #$9B›5960 JSR EOUTCH›5970 JMP EOUTCH›5980 ;›5990 STRL2 JSR DOIT›6000 .WORD $040A,RCAPCMD,DATA›6010 BPL STRL2A›6020 LDA #$80›6030 STA FIRSTINC›6040 JMP ERRDCP1›6050 STRL2A LDA DATA+3›6060 LDX DATA+2›6070 LDY DATA+1›6080 STRL5 STA 0›6090 STX 1›6100 STY 2›6110 STA REACMD+3›6120 STX REACMD+2›6130 STY REACMD+1›6140 LDX DRIVE›6150 LDA $D6AB,X ;is it 512?›6160 AND #8›6170 BEQ STRL5A›6180 ASL 0›6190 ROL 1›6200 ROL 2 ;multiply # by 2›6210 STRL5A JSR A3DIGIT›6220 LDY #0›6230 STRL5B LDA NUMBUF,Y›6240 CMP #'0›6250 BNE STRL5C ;kill leading›6260 LDA #$20 ;0's in sec #›6270 STA NUMBUF,Y›6280 INY ›6290 CPY #7›6300 BCC STRL5B›6310 STRL5C LDX #NUMBUF&255›6320 LDY #NUMBUF/256›6330 JSR PRINT›6340 JSR SETLAST›6350 JSR DOIT›6360 .WORD $0106,REACMD,DATA›6370 BPL STRL6›6380 LDX #NOPARK&255›6390 LDY #NOPARK/256›6400 JSR PRINT›6410 STRL7 JMP STRL3›6420 STRL6 LDX #PARK&255›6430 LDY #PARK/256›6440 JSR PRINT›6450 LDA #8›6460 STA $D01F›6470 LDA $D01F›6480 AND #1›6490 BNE STRL7 ;DO WE SHUT DOWN?›6500 LDX DRIVE›6510 LDA $D6AB,X›6520 AND #$10›6530 BNE STRL7›6540 JSR DOIT›6550 .WORD $0106,TURNOFF,DATA›6560 JMP STRL3›6570 ;›6580 TURNOFF .BYTE $1B,0,0,0,0,0›6590 REACMD .BYTE 8,0,0,0,1,0›6600 RCAPCMD .BYTE $25,0,0,0,0,0,0,0,0,0›6610 NOPARK .BYTE " Åòòïò¡",$9B,0›6620 PARK .BYTE " Parked",$9B,0›6630 ;›6640 ERRDCP1 LDX DRIVE›6650 LDA $D6AB,X›6660 AND #8›6670 BEQ SAS1›6680 LDA #17 ;secs/trk›6690 .BYTE $2C›6700 SAS1 LDA #32›6710 STA SECSTRK›6720 LDA $D6AD,X›6730 STA DATA›6740 LDA $D6AC,X›6750 STA DATA+1 ;set up›6760 LDA $D6AE,X ;define limits›6770 LSR A ;parm block›6780 LSR A›6790 LSR A›6800 LSR A›6810 STA DATA+2›6820 LDA $D6B0,X›6830 STA DATA+3›6840 LDA $D6AF,X›6850 STA DATA+4›6860 LDA $D6B2,X›6870 STA DATA+5›6880 LDA $D6B1,X›6890 STA DATA+6›6900 LDA #11›6910 STA DATA+7 ;ecc length›6920 JSR DOIT›6930 .WORD $0106,DEFLIMC,DATA›6940 JMP SAS3 ;ignore status›6950 ;›6960 DEFLIMC .BYTE $0C,0,0,0,0,0›6970 ;›6980 SAS3 LDA #$FF ;set to -1›6990 STA MAXSEC›7000 STA MAXSEC+1›7010 STA MAXSEC+2›7020 SEC ›7030 LDA DATA+1 ;TAKE 7 cylinders away›7040 SBC #7 ;for bad sectors›7050 STA DATA+1›7060 LDA DATA›7070 SBC #0›7080 STA DATA›7090 SAS6 LDX DATA+2 ;# of heads›7100 SAS6A CLC ›7110 LDA MAXSEC›7120 ADC SECSTRK›7130 STA MAXSEC›7140 BCC SAS6B›7150 INC MAXSEC+1›7160 BNE SAS6B›7170 INC MAXSEC+2›7180 SAS6B DEX ›7190 BNE SAS6A›7200 LDA DATA+1 ;cylinders›7210 BNE SAS6C›7220 DEC DATA ;high byte›7230 SAS6C DEC DATA+1›7240 LDA DATA›7250 ORA DATA+1›7260 BNE SAS6 ;figure # of secs›7270 LDA #0›7280 STA DECRET›7290 NOB5 LDA MAXSEC›7300 STA REACMD+3›7310 LDA MAXSEC+1›7320 STA REACMD+2›7330 LDA MAXSEC+2›7340 STA REACMD+1›7350 JSR SETLAST›7360 JSR DOIT›7370 .WORD $06,REACMD,DATA›7380 BMI NOB1›7390 LDA FIRSTINC›7400 BPL NOUP1›7410 LDA MAXSEC ;go up till we›7420 CLC ;hit an error›7430 ADC SECSTRK›7440 STA MAXSEC›7450 BCC NOB5›7460 INC MAXSEC+1›7470 BNE NOB5›7480 INC MAXSEC+2›7490 BNE NOB5 ;branch›7500 NOUP1 LDA MAXSEC›7510 LDX MAXSEC+1›7520 LDY MAXSEC+2›7530 JMP STRL5›7540 NOB1 CPY #138›7550 BNE NOB2›7560 NOB3 LDX #ERRM2&255›7570 LDY #ERRM2/256›7580 JSR PRINT›7590 JMP STRL3›7600 NOB2 LDA #0›7610 STA FIRSTINC›7620 DEC DECRET ;ONLY GO DOWN›7630 BEQ NOB3 ;256 TRACKS›7640 LDA MAXSEC›7650 SEC ›7660 SBC SECSTRK›7670 STA MAXSEC›7680 LDA MAXSEC+1›7690 SBC #0›7700 STA MAXSEC+1›7710 LDA MAXSEC+2›7720 SBC #0›7730 STA MAXSEC+2›7740 JMP NOB5›7750 ERRM2 .BYTE "Îï Äòéöå¯Ãôòìò¡",$9B,0›7760 ;›7770 SETLAST LDX DRIVE›7780 LDA $D6AB,X›7790 AND #$10 ;do step rate›7800 BEQ SETL1›7810 LDA $D6AE,X›7820 AND #$0F›7830 SETL1 STA REACMD+5›7840 RTS ›7850 ;›7860 .OPT LIST›7870 DATA›7880 .OPT NO LIST›7890 ;›7900 *= $02E0›7910 .WORD INIT›