OPT PAG OPT NOG TTL DIR UTILITY FOR DMA FLEX PAG * * "DIR" UTILITY PROGRAM * * * COPYRIGHT (C) 1978 BY * * TECHNICAL SYSTEMS CONSULTANTS, INC. * P.O. BOX 2574 * WEST LAFAYETTE, INDIANA 47906 * (317) 423-5465 * * Fixed for Y2K - Michael Holley DEC 13, 2001 * GLOBAL VARIABLES EOL EQU $AC02 FCB EQU $A840 WASN EQU $AC0C ASN EQU WASN LSTTRM EQU $AC11 BUFPNT EQU $AC14 INDEX EQU $AC3D DATPNT EQU $AC41 SPC EQU $20 FMSCLS EQU $B403 FMS EQU $B406 WARMS EQU $AD03 GETCHR EQU $AD15 PUTCHR EQU $AD18 PSTRNG EQU $AD1E CLASS EQU $AD21 PCRLF EQU $AD24 NXTCH EQU $AD27 GETFIL EQU $AD2D OUTDEC EQU $AD39 OUTHEX EQU $AD3C RPTERR EQU $AD3F GETHEX EQU $AD42 INDEC EQU $AD48 ORG $A100 DIR BRA DIR1 VN FCB 2 VERSION NUMBER NAME FCB 0,0,0,0 FCB 0,0,0,0 EXT FCB 0,0,0 ALLFLG FCB 0 ALLDR FCB 0 LOOP FCB 0 POINT FDB 0 FNUM FDB 0 FTOT FDB 0 SECS FDB 0 LARG FDB 0 DEC1 FDB 0 TEMP FDB 0 * PROGRAM HERE DIR1 LDX BUFPNT POINT TO BUFFER STX POINT SAVE POS JSR PCRLF PRINT CR & LF DIR2 TST ALLDR ALL DRIVES? BEQ DIR22 DIR21 LDX #FCB POINT TO FCB LDAA #20 FIND DRIVE STAA 0,X JSR FMS CALL FMS BNE DIR27 ERROR? LDX POINT RESTORE POINTER STX BUFPNT LDAA 0,X GET CHARACTER STAA LSTTRM SET TERM BRA DIR4 DIR22 LDX POINT GET POINTER LDA A 0,X GET CHARACTER CMP A #'. IS IT PERIOD? BEQ DIR25 JSR CLASS CLASSIFY IT BCS DIR25 TERM? CMP A #'9 IS IT NUMBER? BLS DIR3 DIR25 TST LOOP LOOPING? BEQ DIR29 DIR27 JMP WARMS RETURN TO FLEX DIR29 LDX #FCB POINT TO FCB LDA A ASN GET DRIVE STA A 3,X SET IN FCB BPL DIR4 STAA ALLDR SET ALL DRIVES BRA DIR21 DIR3 LDX POINT RESTORE POINTER STX BUFPNT JSR NXTCH GET NEXT CHAR AND A #3 MASK NUMBER LDX #FCB POINT TO FCB STAA 3,X SAVE IN DRIVE JSR NXTCH GET NEXT CHAR BCS DIR35 TERM? JMP SERR IF NOT, ERROR DIR35 LDX BUFPNT SET POINTER STX POINT DIR4 LDX #FCB POINT TO FCB LDAA #16 OPEN SYSTEM REC STAA 0,X JSR FMS BNE DIR43 ERROR? JSR GETIR GET FIRST RECORD BNE DIR43 ERROR? LDX #DIRST POINT TO STRING JSR PSTRNG PRINT IT LDX #FCB+2 POINT TO DRIVE CLR 0,X CLR B JSR OUTDEC PRINT IT LDX #VST POINT TO STRING JSR PSTRNG PRINT IT LDX #FCB+4 POINT TO NAME LDAB #8 SET COUNT JSR PDATA PRINT NAME LDX #NMST POINT TO STRING LDAB #3 SET COUNT JSR PDATA PRINT IT LDX #FCB+15 POINT TO NUMBER JSR OUTDEC PRINT IT LDX #CSTR POINT TO STRING LDAB #13 SET COUNT JSR PDATA PRINT STRING LDX #FCB+23 POINT TO DATE JSR OUTDAT PRINT IT JSR PCRLF PRINT CR & LF LDX #HDR POINT TO HEADER JSR PSTRNG PRINT IT JSR PCRLF PRINT CR & LF DIR42 JSR TSTTRM TEST TERMINATOR BNE DIR45 CLR ALLFLG CLEAR FLAG BRA DIR6 DIR43 JMP ERR REPORT ERROR DIR45 LDX BUFPNT RESET POINTER LDA A 0,X GET NEXT CHAR CMP A #'. IS IT PERIOD? BEQ DIR5 JSR CLASS CLASSIFY IT BCS SERR TERM? CMP A #'9 IS IT NUMBER? BHI DIR5 DIR47 JSR NXTCH GET NEXT BCC DIR47 TERM? BRA DIR42 DIR5 JSR GETNAM INPUT NAME BCS SERR ERROR? DIR6 JSR PRDIR GO PRINT DIR BSR TSTTRM TEST TERM BNE DIR5 LDX #FCB POINT TO FCB LDA A #16 OPEN SYSTEM REC STA A 0,X JSR FMS BNE ERR ERRORS? JSR GETIR GET FIRST RECORD BNE ERR ERROR? LDX #FST POINT TO STRING JSR PSTRNG PRINT IT CLRB LDX #FTOT JSR OUTDEC PRINT FILES BSR OUTCOM PRINT COMMA LDX #SST POINT TO STRING LDAB #8 JSR PDATA PRINT IT LDX #SECS CLRB JSR OUTDEC PRINT SECTORS BSR OUTCOM PRINT COMMA LDX #LST POINT TO STRING LDAB #8 JSR PDATA PRINT IT LDX #LARG CLRB JSR OUTDEC PRINT LARGEST BSR OUTCOM OUTPUT COMMA LDX #FRST POINT TO STRING LDAB #5 JSR PDATA PRINT IT CLRB LDX #FCB+21 JSR OUTDEC PRINT FREE JSR PCRLF PRINT CR & LF JMP DIR2 REPEAT * EXIT DIR UTILITY EXIT JSR PCRLF PRINT CR & LF JMP WARMS RETURN TO FLEX * REPORT SYNTAX ERROR SERR LDX #FCB POINT TO FCB LDAB #26 SET IN ERROR STAB 1,X * REPORT DISK ERROR ERR JSR RPTERR REPORT ERROR ERR2 JMP WARMS RETURN TO FLEX * TEST FOR TERMINATOR TSTTRM LDA A LSTTRM CHECK LAST TERM CMP A #$D IS IT CR? BEQ TSTTR2 CMP A EOL IS IT EOL? TSTTR2 RTS * OUTPUT COMMA AND SPACE OUTCOM LDAA #', SETUP COMMA JSR PUTCHR PRINT IT JMP OUTSP DO SPACE * PRINT DIRECTORY LIST PRDIR LDX #0 CLEAR X STX FNUM CLEAR COUNTERS STX FTOT STX SECS STX LARG LDX #FCB POINT TO FCB LDA A #6 OPEN DIRECTORY STA A 0,X JSR FMS BNE ERR ERRORS? INC LOOP SET LOOP FLAG PRDIR2 JSR PCRLF PRINT CR & LF PRDIR3 JSR GETIR GET INFO RECORD BEQ PRDI32 ERRORS? JMP PRDIR6 PRDI32 TST FCB+4 END OF DIR? BNE PRDI34 JMP PRDIR7 PRDI34 LDX FNUM BUMP FILE NUMBER INX STX FNUM SAVE NEW TST FCB+4 BMI PRDIR3 DELETED FILE? LDAA FCB+21 GET FILE SIZE LDAB FCB+22 CMPA LARG LARGEST? BLO PRD345 BHI PRD342 CMPB LARG+1 BLS PRD345 PRD342 STAA LARG SET NEW LARGEST STAB LARG+1 PRD345 ADDB SECS+1 ADD IN SECTOR COUNT ADCA SECS STAA SECS SAVE NEW COUNT STAB SECS+1 LDX FTOT BUMP FILE COUNT INX STX FTOT LDX #FCB+4 POINT TO NAME TST ALLFLG ALL FILES? BNE PRDIR4 STX DATPNT SAVE POINTER LDX #NAME TRY TO MATCH NAME STX INDEX PRDI35 LDX INDEX CPX #EXT+3 BEQ PRDIR4 LDA A 0,X INX STX INDEX LDX DATPNT TST A CHAR NULL? BEQ PRDI37 CMP A 0,X DO COMPARISON BNE PRDIR3 PRDI37 INX MOVE TO NEXT STX DATPNT BRA PRDI35 PRDIR4 LDAB #1 SET FLAG LDX #FNUM JSR OUTDEC PRINT FILE NUMBER BSR OUTSP PRINT SPACES BSR OUTSP LDX #FCB+4 POINT TO NAME LDA B #8 JSR PRNAM PRINT NAME LDA A #'. JSR PUTCHR OUTPUT '.' LDA B #3 BSR PRNAM PRINT EXT BSR OUTSP OUTPUT SPACES BSR OUTSP LDX #FCB+17 OUTPUT START JSR OUTPNT BSR OUTSP BSR OUTSP LDX #FCB+19 OUTPUT END JSR OUTPNT BSR OUTSP LDX #FCB+21 LDA B #1 JSR OUTDEC OUTPUT SIZE BSR OUTSP BSR OUTSP LDX #FCB+25 JSR OUTDAT OUTPUT DATE BSR OUTSP BSR OUTSP LDX #FCB POINT TO FCB LDAA #'W OUTPUT PROT CODES LDAB #$80 WRITE? JSR OUTPR LDAA #'D LDAB #$40 DELETE? JSR OUTPR LDAA #'C LDAB #$10 CATALOG? JSR OUTPR JMP PRDIR2 REPEAT PRDIR6 LDA A 1,X GET ERROR TYPE CMP A #8 IS IT EOF? PRDI65 BEQ PRDIR7 JMP ERR REPORT ERROR PRDIR7 RTS * OUTPUT SPACE OUTSP LDAA #SPC SETUP SPACE JMP PUTCHR PRINT IT * GET INFO RECORD GETIR LDX #FCB POINT TO FCB LDA A #7 GET IR CODE STA A 0,X JMP FMS CALL FMS * PRINT FILE NAME PRNAM LDA A 0,X GET CHARACTER BNE PRNAM3 NULL? LDA A #SPC SETUP SPACE PRNAM3 JSR PUTCHR PRINT CHAR INX BUMP TO NEXT DEC B BNE PRNAM RTS * GET FILE MATCH NAME GETNAM CLR ALLFLG CLEAR ALL LDX #NAME POINT TO BUFFER LDA B #11 SET COUNT GETNA2 CLR 0,X CLEAR BUFFER INX DECB BNE GETNA2 LDX BUFPNT POINT TO NAME LDA A 0,X GET CHARACTER CMP A #'. IS IT '.'? BEQ GETNA4 LDX #NAME-4 RESET POINTER JMP GETFIL GET FILE NAME GETNA4 INC BUFPNT+1 FIX POINTER LDA B #3 SET COUNT LDX #EXT POINT TO EXT GETNA5 JSR NXTCH GET CHARACTER BCS GETNA6 TERM? STA A 0,X SAVE CHAR INX DECB BPL GETNA5 SEC RTS RETURN GETNA6 CLC RTS * PRINT STRING WITHOUT CR & LF PDATA LDAA 0,X GET CHARACTER BEQ PDATA2 NULL? JSR PUTCHR PRINT IT INX BUMP TO NEXT DECB DEC COUNT BNE PDATA RTS RETURN PDATA2 CLR B RTS * OUTPUT PROT CODE OUTPR BITB 15,X TEST BYTE BNE OUTPR2 LDAA #$20 SETUP SPACE OUTPR2 JMP PUTCHR PRINT CHARACTER * OUT YEAR * * Check for and convert full year * * 1975: $7B7 -> 75 * 1999: $7CF -> 99 * * 2000: $7D0 -> 0 * 2047: $7FF -> 47 * * 2048: $800 -> 48 * 2074: $81A -> 74 OUTY CLRB CMPA #75 Pivot year? BHS OUTY2 ADDA #100 Next century OUTY2 ADDA #$6C Add 1900 ADCB #$07 LDX #DEC1 Year storage STAB 0,X STAA 1,X CLRB Suppress leading zeros JMP OUTDEC PRINT DIGITS * OUT DATE DIGIT OUTD LDX #DEC1 POINT TO DIGIT CLR 0,X STAA 1,X SAVE CHAR CMPA #9 LESS THAN 10? BHI OUTD2 JSR OUTSP DO SPACE OUTD2 CLRB JMP OUTDEC PRINT DIGITS * OUTPUT DATE OUTDAT STX TEMP SAVE POINTER LDAA 1,X GET DAY BSR OUTD PRINT IT BSR OUTM LDX TEMP LDAA 0,X GET MONTH LDX #MNTH POINT TO MONTHS OUTDA4 DECA BEQ OUTDA5 INX FIND IN TABLE INX INX BRA OUTDA4 OUTDA5 LDAB #3 SET COUNT JSR PDATA PRINT MONTH BSR OUTM LDX TEMP RESET POINTER LDAA 2,X GET YEAR BRA OUTY PRINT IT * PRINT DISK ADDRESS OUTPNT JSR OUTHEX OUTPUT DIGIT BSR OUTM PRINT '-' INX JMP OUTHEX PRINT REST * PRINT MINUS SIGN OUTM LDAA #'- SETUP '-' JMP PUTCHR PRINT IT * STRINGS HDR FCC 'FILE# NAME TYPE BEGIN END' HDR2 FCC ' SIZE DATE PRT' FCB 4 FST FCC ' FILES=' FCB 4 SST FCC 'SECTORS=' LST FCC 'LARGEST=' FRST FCC 'FREE=' DIRST FCC 'DIRECTORY OF DRIVE NUMBER ' FCB 4 CSTR FCC ' CREATED: ' VST FCC 'DISK: ' FCB 4 NMST FCC ' #' MNTH FCC 'JANFEBMARAPRMAYJUN' FCC 'JULAUGSEPOCTNOVDEC' END DIR