NAM DRIVE OPT PAG PAG * DRIVE PROGRAM - FOR SETTING AND/OR DISPLAYING * CURRENT DRIVE ASSIGNMENTS * COPYRIGHT (C) 1986 BY PETER A. STARK * STAR-K SOFTWARE SYSTEMS CORP. * MOD 2-21-89 FOR BETTER DRIVE B OPERATION * MOD 7-21-90 FOR 37C65 AND HUMBUG IS COMMAND OPERATION *SK*DOS LOCATIONS LIB SKEQUATE DRUSED EQU $13C OFFSET TO DRUSED TABLE DRWPRO EQU $146 OFFSET TO WRITE PROTECT TABLE WINTAB EQU $200 OFFSET TO WINCHESTER TABLE FL0C EQU $FF0BE9 DRIVE/CONTROLLER SETUP INFO START BRA.S START1 VER DC.W $0103 VERSION * START BY MAKING COPY OF DRUSED TABLE START1 DC VPOINT POINT TO VARIABLE AREA MOVE.L DOSORG(A6),A0 POINT TO BEGINNING OF DOS LEA DRUSED(A0),A0 POINT TO DRUSED TABLE LEA DRVTAB(PC),A1 AND TO OUR COPY OF IT MOVE.B #10,D0 COUNTER MOVHER MOVE.B 10(A0),10(A1) MOVE DRWPRO BYTE MOVE.B (A0)+,(A1)+ MOVE DRUSED BYTE SUB.B #1,D0 DEC COUNTER BNE.S MOVHER REPEAT UNTIL DONE MOVE.B #0,D2 CLEAR CHANGED FLAG LEA SETFLG(PC),A5 CLR.B (A5) CLEAR SET MAXDRV FLAG * MAIN LOOP - WAIT FOR EITHER EOL OR 'L' WAIT4L DC GETNXT GET THE NEXT CHAR CMP.B #$3F,D5 QUESTION MARK? BEQ.L HELP YES, PRINT HELP MESSAGE WAIT4N CMP.B #$0D,D5 CR? BEQ.L PRINT YES CMP.B ENDLNC(A6),D5 EOL? BEQ.L PRINT YES AND.B #$DF,D5 CVT TO UPPER CASE CMP.B #$4C,D5 L? BNE.S WAIT4L NO MOVE.B #1,D2 SET CHANGED FLAG IF THERE'S AN L * NOW PROCESS THE INPUT STRING DC GETNXT NEXT CHAR SHOULD BE 0-9 MOVE.B D5,D6 AND.B #$DF,D6 CVT TO UPPER CASE CMP.B #$44,D6 CHECK FOR 'LD' BEQ.S SETMXD LD, GO CHECK FOR =MD SUB.B #$30,D5 CVT FROM ASCII CMP.B #9,D5 MAX IS 9 BHI.S ERROR IF ERROR CLR.L D0 MOVE.B D5,D0 SAVE LOG NUMBER IN D0 DC GETNXT CMP.B #$3D,D5 SHOULD BE = BNE.S ERROR DC GETNXT SHOULD BE N,F,H,O,R,P,U AND.B #$DF,D5 CMP.B #$4E,D5 N? BEQ.S NONE NONE - CANCEL CMP.B #$46,D5 F? BEQ.S FLOPPY FLOPPY DISK CMP.B #$48,D5 H? BEQ.S HARD HARD DISK CMP.B #$4F,D5 O? BEQ.S OTHER OTHER CMP.B #$52,D5 R? BEQ.S RAMDSK RAM DISK CMP.B #$50,D5 P? BEQ.L PROTEC WRITE PROTECT CMP.B #$55,D5 U? BEQ.L UNPROT WRITE UNPROTECT * ERROR ROUTINE ERROR LEA ERRMSG(PC),A4 DC PSTRNG PRINT "COMMAND ERROR" DC WARMST * ROUTINE TO CHECK FOR LD=MD SETMXD DC GETNXT CMP.B #$3D,D5 =? BNE.S ERROR NO DC GETNXT AND.B #$DF,D5 CVT TO UPPER CASE CMP.B #$4D,D5 M? BNE.S ERROR DC GETNXT AND.B #$DF,D5 CVT TO UPPER CASE CMP.B #$44,D5 D? BNE.S ERROR LEA SETFLG(PC),A5 MOVE.B #1,(A5) SET MAXDRV FLAG BRA.L WAIT4L * SET APPROPRIATE BIT FOR DEVICE TYPE NONE MOVE.B #$00,D1 NONE ERASES BRA.S PUTNON FLOPPY MOVE.B #$10,D1 BIT 4 FOR FLOPPY BRA.S PUTIN HARD MOVE.B #$20,D1 BIT 5 FOR HARD DISK BRA.S PUTIN OTHER MOVE.B #$40,D1 BIT 6 FOR OTHER BRA.S PUTIN RAMDSK MOVE.B #$80,D1 BIT 7 FOR RAM DISK BRA.S PUTNON AND DRIVE NUMBER ALWAYS 0 * NOW GET PHYSICAL DRIVE NUMBER PUTIN DC GETNXT NEXT CHARACTER SHOULD BE 0-9 SUB.B #$30,D5 CVT FROM ASCII CMP.B #9,D5 MAX IS 9 BHI.S ERROR ERROR IF >9 ADD.B D5,D1 COMBINE WITH DEVICE BIT * NOW PUT INTO OUR COPY OF DRUSED TABLE PUTNON LEA DRVTAB(PC),A0 POINT TO OUR TABLE MOVE.B D1,0(A0,D0.W) PUT IN THE NEW CODE * CHECK IF PROTECT OR UNPROTECT CODE DC GETNXT GET NEXT CHARACTER AND.B #$DF,D5 UPPER CASE CMP.B #$50,D5 P? BEQ.S PROTEC YES BRA.S UNPROT ELSE ASSUME UNPROTECTED PROTEC LEA DRWTAB(PC),A0 POINT TO WP TABLE MOVE.B #$80,0(A0,D0.W) 80 = PROTECT CODE BRA.L WAIT4N UNPROT LEA DRWTAB(PC),A0 POINT TO WP TABLE MOVE.B #$0,0(A0,D0.W) 0 = UNPROTECT CODE BRA.L WAIT4N * PRINT TABLE, SIMULTANEOUSLY CHECK FOR DUPLICATE ENTRIES PRINT MOVE.L #0,A2 CLEAR MAX DRIVE LEA DRVTAB(PC),A0 POINT TO OUR TABLE MOVE.L #0,D0 COUNTER PLOOP MOVE.B 0(A0,D0.W),D1 GET NEXT ENTRY BEQ.L PNEXT NONE IF 00 MOVE.L D0,A2 REMEMBER LAST DRIVE NUM LEA LOGMSG(PC),A4 DC PSTRNG PRINT "LOGICAL " MOVE.B D0,D4 NUMBER ADD.B #$30,D4 CVT TO ASCII DC PUTCH PRINT IT LEA EQUMSG(PC),A4 DC PNSTRN PRINT " = " MOVE.B D1,D4 NUMBER AND.B #$0F,D4 REMOVE DEVICE TYPE ADD.B #$30,D4 CVT TO ASCII BTST.B #4,D1 BNE.S PRINTF FLOPPY BTST.B #5,D1 BNE.S PRINTH HARD BTST.B #6,D1 BNE.S PRINTO OTHER BTST.B #7,D1 BNE.S PRINTR RAMDISK LEA HUHMSG(PC),A4 DC PNSTRN PRINT " UNKNOWN" MOVE.B #0,D2 CLEAR CHANGED FLAG BRA.S WPCHEK AND GO CHECK FOR WP PRINTF LEA FLOMSG(PC),A4 DC PNSTRN PRINT "FLOPPY" DC PUTCH PRINT NUMBER BRA.S WPCHEK AND GO CHECK FOR WP PRINTH LEA HARMSG(PC),A4 DC PNSTRN PRINT "HARD" DC PUTCH PRINT NUMBER BRA.S WPCHEK AND GO CHECK FOR WP PRINTO LEA OTHMSG(PC),A4 DC PNSTRN PRINT "OTHER" DC PUTCH PRINT NUMBER BRA.S WPCHEK AND GO CHECK FOR WP PRINTR LEA RAMMSG(PC),A4 DC PNSTRN PRINT "RAMDISK" * CHECK FOR WRITE PROTECTED DISK WPCHEK MOVE.B 10(A0,D0.W),D7 CHECK NEXT WP ENTRY BPL.S PCHECK >0 MEANS NOT WP LEA WPMSG(PC),A4 DC PNSTRN IF <0 PRINT "WP" * CHECK FOR DUPLICATE PCHECK LEA DRVTAB(PC),A3 POINT TO OUR TABLE MOVE.L #0,D3 COUNTER PCLOOP CMP.B D0,D3 DON'T CHECK AGAINST SELF BEQ.S PCNEXT SKIP SAME TST.B D1 CHECK IF CURRENT IS RAMDISK BPL.S NOTRAM NO TST.B 0(A3,D3.W) YES, IS OTHER RAM? BPL.S PCNEXT NO BRA.S YESRAM YES, PRINT MESSAGE NOTRAM CMP.B 0(A3,D3.W),D1 CHECK AGAINST OTHER BNE.S PCNEXT OK IF DIFFERENT YESRAM LEA DUPMSG(PC),A4 DC PNSTRN ELSE PRINT "DUPLICATE" MOVE.B #0,D2 ERASE CHANGED DATA FLAG PCNEXT ADD.B #1,D3 BUMP COUNTER CMP.B #9,D3 BLS.S PCLOOP REPEAT UNTIL DONE * NEXT ENTRY PNEXT ADD.B #1,D0 GO TO NEXT CMP.B #9,D0 DONE? BLS.L PLOOP NO, REPEAT * NOW CHECK WHETHER ANY DATA HAVE BEEN CHANGED, AND REWRITE IF SO TST.B D2 CHECK CHANGED FLAG BEQ.S CHKMAX SKIP REWRITE IF NOT CHANGED MOVE.L DOSORG(A6),A0 POINT TO BEGINNING OF DOS LEA DRUSED(A0),A0 POINT TO DRUSED TABLE LEA DRVTAB(PC),A1 AND TO OUR COPY OF IT MOVE.B #10,D0 COUNTER MOVBAK MOVE.B 10(A1),10(A0) MOVE INTO DRWPRO TABLE MOVE.B (A1)+,(A0)+ MOVE INTO DRUSED TABLE SUB.B #1,D0 DEC COUNTER BNE.S MOVBAK REPEAT UNTIL DONE * NOW CHECK MAX DRIVE (IN A2) AGAINST MAXDRV IN DOS, AND * MAYBE CHANGE MAXDRV IF THEY DON'T MATCH CHKMAX MOVE.L A2,D0 COMPUTER MAX DRIVE NUMBER MOVE.B MAXDRV(A6),D6 AND DOS'S CMP.B D6,D0 BEQ.S CHHARD CONTINUE IF THE SAME LEA DIFMSG(PC),A4 DC PSTRNG PRINT 'MAXDRV DOESN'T MATCH' MOVE.B SETFLG(PC),D7 CHECK FLAG BEQ.S CHHARD LEAVE AS IS IF FLAG = 0 LEA SETMSG(PC),A4 DC PSTRNG ELSE PRINT "CHANGING MAXDRV" MOVE.B D0,MAXDRV(A6) AND FIX IT * THEN CHECK IF THERE ARE HARD DRIVES, AND PRINT INFO IF SO CHHARD MOVE.L DOSORG(A6),A0 POINT TO BEG OF DOS LEA WINTAB(A0),A0 POINT TO WINCHESTER TABLE LEA HDIMSG(PC),A4 DC PSTRNG PRINT "HARD DISKS ON LINE" MOVE.B #0,D0 COUNTER HARLOO MOVE.B (A0),D1 CHECK NEXT ENTRY BMI.S HNEXT DONE IF NONE LEA SPAMSG(PC),A4 DC PSTRNG PRINT SPACES AND H MOVE.B D0,D4 ADD.B #$30,D4 CVT TO ASCII DIGIT DC PUTCH OUTPUT NUMBER LEA HDRMSG(PC),A4 DC PNSTRN PRINT ": DRIVE " MOVE.B D0,D4 LSR.B #2,D4 DRIVE NUMBER ADD.B #$41,D4 CVT TO ASCII LETTER DC PUTCH PRINT DRIVE A OR B LEA HPAMSG(PC),A4 DC PNSTRN PRINT " PARTITION " MOVE.B D0,D4 AND.B #$03,D4 PARTITION ADD.B #$30,D4 CVT TO ASCII DC PUTCH PRINT PARTITION NUMBER LEA HISMSG(PC),A4 DC PNSTRN PRINT " IS " CLR.L D5 CLR.L D4 MOVE.B 10(A0),D5 LAST LOG TRACK MOVE.B 11(A0),D4 LAST LOG SECTOR ADD.W #1,D5 NUMBER OF TRACKS ADD.W #1,D4 NUMBER OF SECTORS MULU D5,D4 TOTAL NUMBER OF SECTORS LSR.L #2,D4 DIV BY 4 TO MAKE K CLR.L D5 NO SPACES DC OUT5D PRINT IT LEA HKMSG(PC),A4 DC PNSTRN PRINT " K." HNEXT ADD.L #16,A0 POINT TO NEXT ENTRY ADD.B #1,D0 BUMP COUNTER CMP.B #8,D0 DONE? BNE.S HARLOO REPEAT FOR 8 LOGICAL DRIVES * ROUTINE TO DISPLAY CURRENT HUMBUG SETUP CONFIGURATION SHOWIS MOVE.B FL0C,D7 CHECK FIRST DRIVE CMP.B #$17,D7 BEQ.S SHOWOK OK IF 17 OR 37 CMP.B #$37,D7 BEQ.S SHOWOK OK IF SOMETHING THERE BRA.L DONE ELSE QUIT SHOWOK LEA ISMSG1(PC),A4 DC PSTRNG PRINT HEADER LEA FL0C,A0 POINT TO BEGINNING OF TABLE CLR.L D0 COUNTER LEA ISMSG2(PC),A4 POINT TO OUTPUT LINE BUFFER MOVE.B #4,75(A4) END MARKER SHLOOP LEA ISMSG2(PC),A4 POINT TO OUTPUT LINE BUFFER MOVE.B (A0),D1 LOOK AT CONTROLLER TYPE CMP.B #$17,D1 IS IT 1772? BEQ.S SH1772 YES CMP.B #$37,D1 IS IT 3765? BNE.S SHNEXT NOTHING THERE, GO TO NEXT MOVE.L #'37C6',18(A4) MOVE.B #'5',22(A4) PUT CONTROLLER TYPE INTO LINE BRA.S SHWLOG THEN SKIP OVER 1772 SH1772 MOVE.L #'1772',18(A4) MOVE.B #' ',22(A4) PUT CONTROLLER TYPE INTO LINE SHWLOG MOVE.B D0,D7 ADD.B #$30,D7 CONVERT F NUMBER INTO ASCII MOVE.B D7,3(A4) PUT INTO LINE MOVE.B 2(A0),D3 PICK UP DRIVE DATA FROM TABLE MOVE.B D3,D4 ASR.B #4,D4 SEPARATE INTO PHYSICAL DRIVE ADD.B #$30,D4 ASCII MOVE.B D4,40(A4) INTO LINE AND.L #$0F,D3 SEPARATE INTO DRIVE TYPE MULU #6,D3 MULT BY 6 LEA NOWTYP(PC),A2 ADD.L A2,D3 ADD ADDRESS OF TYPE TABLE MOVE.L D3,A6 POINT A6 TO ENTRY MOVE.L (A6),56(A4) MOVE.B 4(A6),60(A4) MOVE DRIVE TYPE IN MOVE.L #$20202020,66(A4) MOVE.L #$20202020,70(A4) ERASE "BOOT" TST.B D0 ON F0? BNE.S PRINTIT NO, SO JUST PRINT MOVE.L #' <--',66(A4) MOVE.L #'BOOT',70(A4) ELSE INSERT <--BOOT PRINTIT DC PSTRNG PRINT LINE SHNEXT LEA 4(A0),A0 NEXT ITEM IN TABLE ADD.B #1,D0 GO TO NEXT F CMP.B #7,D0 FINISHED? BNE.L SHLOOP NO, CONTINUE DC PCRLF YES, SKIP LINE AND EXIT * FINALLY ... DONE DONE DC PCRLF DC WARMST * HELP MESSAGE HELP LEA HLPMSG(PC),A4 DC PSTRNG BRA.S DONE LOGMSG FCC 'Logical ',4 EQUMSG FCC ' = ',4 DUPMSG FCC ' *** ERROR - DUPLICATE PHYSICAL DRIVE ***',4 FLOMSG FCC ' Floppy F',4 HARMSG FCC ' Hard H',4 OTHMSG FCC ' Other ',4 RAMMSG FCC ' RAMdisk ',4 HUHMSG FCC ' *** INVALID *** ',4 WPMSG FCC ' (WP)',4 DIFMSG FCC "MAXDRV doesn't match last active drive.",4 SETMSG FCC ' ... being corrected.',4 HDIMSG FCB $D,$A FCC 'Available hard drives:',4 SPAMSG FCC ' H',4 HDRMSG FCC ': Drive ',4 HPAMSG FCC ' partition ',4 HISMSG FCC ' is ',4 HKMSG FCC ' K.',4 ERRMSG FCB $D,$A FCC 'Command error - nothing done.' FCB 7,$D,$A HLPMSG FCC 'Example of correct command syntax:' FCB $D,$A FCC ' DRIVE L0=F0 L1=H0P L2=N L3=F1U L4=RP LD=MD' FCB $D,$A FCC "Log dr. 0 = Floppy dr 0--' | | | | |" FCB $D,$A FCC "Log dr. 1 = hard dr 0 wr prot -' | | | |" FCB $D,$A FCC "Log dr. 2 = Non-existent drive -------' | | |" FCB $D,$A FCC "Log dr. 3 = Floppy dr 1 not write prot'ed -' | |" FCB $D,$A FCC "Log dr. 4 = RAMdisk and write protected ----------' |" FCB $D,$A FCC "Set MAXDRV to last drive -------------------------------'",4 ISMSG1 DC.B $D,$A FCC 'Available floppy drives:' DC.B 4 EVEN ISMSG2 FCC ' F Controller: Drive Select: Drive Type: ' FCC ' ' EVEN NOWTYP FCC ' ? 360K 720K 1.2M 1.44M 1M 8" ' * DATA AREA EVEN DRVTAB DS.B 10 COPY OF DRUSED TABLE * DRWTAB MUST BE RIGHT AFTER DRVTAB!! DRWTAB DS.B 10 COPY OF DRWPRO TABLE SETFLG DS.B 1 SET MAXDRV FLAG END START