; ; FILE-EXT.A86 Version 1.0 ; ; as of ; ; March 29, 1982 ; ; ; ; Originally named FILES.ASM, and from a disassembly by ; "J.A.P" of January 23,1980...FILE-EXT.A86 will display the ; selected disk's directory entries in the form: ; ; User Pro Filename.Typ R/OSysRes exs1s2rc <---------Group---------> ; ================================================================== ; ; Where: ; ; "User" is the User assignment for the file. ; "Pro" is the "proprietary software" control bit. ; "Filename" is the ASCII file name. ; "Typ" is the ASCII file type. ; "R/O" is the "read only" control bit ; "Sys" is the "system directory" control bit ; "Res" is the "reserved" (MP/M Ver.1.0) control bit ; "ex" is the "file extension" byte ; "s1" is a CP/M "internal function" byte. ; "s2" is a CP/M "internal function" byte ; "rc" is the "record count" byte. ; "Group" is the "allocation vector table" for the file. ; ; The "hack-job" I did on this one was less than ideal, but ; none the less, it get's the job done...the display format is ; now alot cleaner, and it does'nt "warm boot" as the ; FILES.ASM version did... ; ; The program will display the disk directory of the logged ; on disk, including all the Hexadecimal information on the ; groups. ; ; On the subject of "hack-job's" of software, read an ; interesting article in Psychology Today magazine, "The ; Hacker Papers; Computer Addiction: Reflection on a New ; Obsession"...August 1980 issue, pages 62-69. ; ; Best regards, ; ; Kelly Smith, CP/M-NET (tm) ; 805-527-9321 (Modem, 300 Baud) ; 805-527-0518 (Verbal) ; ORG 0100H M EQU BYTE PTR 0[BX] BDOS EQU 05H TBUFF EQU 80H ; CR EQU 0DH ;ASCII CARRIAGE RETURN LF EQU 0AH ;ASCII LINE FEED ; ; JMP BEGIN ;IF VERSION O.K., PRESS ON ; ; SYSTEM SUBROUTINES ; ; PRINT STRING FROM D&E REGS. ; PRINT: MOV CL,9 INT 224 RET ; ; DISPLAY A CHAR FROM (A) ; DISPLAY: PUSH CX PUSH DX PUSH BX MOV CL,2 MOV DL,AL INT 224 ; POP BX POP DX POP CX RET ; ; SEARCH FOR A FILE ; SEARCH: ; PUSH CX PUSH DX PUSH BX MOV CL,11H MOV DX,(Offset AFN) ; INT 224 ; MOV Byte Ptr RESULT,AL ; POP BX POP DX POP CX RET L_2 EQU $ DSEG ORG Offset L_2 ; ; AMBIGUOUS FILENAME.TYP ; AFN RS 0 ; DB '?????????????' RESULT RS 0 ; DB 0 ;STORAGE FOR RESULT OF BDOS CALL L_3 EQU $ CSEG ORG Offset L_3 ; ; FIND NEXT OCCURRENCE OF FILE ; NEXTFILE: ; PUSH CX PUSH DX PUSH BX MOV CL,12H MOV DX,(Offset AFN) ; INT 224 ; MOV Byte Ptr RESULT,AL ; POP BX POP DX POP CX RET ; ; GET INPUT FROM CONSOLE ; CONIN: ; PUSH CX PUSH DX PUSH BX MOV CL,1 INT 224 ; POP BX POP DX POP CX RET ; ; CONVERT A BYTE IN (A) TO TWO PRINTED CHARACTERS ; HEXASC: ; CMP AL,0AH JB HEXA2 ; ADD AL,'7' ; CALL DISPLAY ; RET HEXA2: ; ADD AL,'0' ; CALL DISPLAY ; RET HEXCON: ; LAHF XCHG AL,AH PUSH AX XCHG AL,AH RCR AL,1 RCR AL,1 RCR AL,1 RCR AL,1 AND AL,0FH CALL HEXASC ; POP AX XCHG AL,AH AND AL,0FH CALL HEXASC ; RET ; ; NEWLINE ; CRLF: ; MOV AL,CR CALL DISPLAY ; MOV AL,LF CALL DISPLAY ; RET ; ; PRINT A SPACE ; SPACE: ; MOV AL,' ' ; CALL DISPLAY ; RET ; ; MAIN WORK LOOP ; ; THIS ROUTINE FINDS THE POSITION OF THE FILE ; INFORMATION IN THE DIRECTORY DMA, PRINTS THE ; DATA IF IT IS A CURRENT FILE, AND PROMPTS THE ; OPERATOR FOR INSTRUCTIONS IF THE FILENAME HAS ; ILLEGAL (NON-ASCII) DATA IN IT. ; WORKLOOP: ; MOV AL,Byte Ptr RESULT ;RESULT HOLDS POSITION OF- MOV CH,AL ; -THE DIRECTORY ENTRY IN THE DIR. DMA AND AL,3 RCL AL,1 RCL AL,1 RCL AL,1 RCL AL,1 RCL AL,1 AND AL,0E0H MOV DL,AL MOV DH,0 MOV BX,TBUFF ; ADD BX,DX ;HL NOW POINTS AT THE FILE INFO MOV AL,M CMP AL,0E5H ;KILLED FILE? JNZ L_4 RET ;YES L_4: CALL SPACE ;SPACE OVER FOR NEATNESS MOV AL,M CALL HEXCON ;PRINT USER NUMBER CALL SPACE CALL SPACE CALL SPACE PUSH BX PUSH BX LAHF ;POINT TO FIRST CHARACTER IN FILE NAME INC BX SAHF MOV AL,M ;ALLOW HIGH BIT SET FOR "PROPRIETARY SOFTWARE" ROL AL,1 ;TEST "PROPRIETARY SOFTWARE" BIT MOV AL,'1' JB WORK01 MOV AL,'0' WORK01: CALL DISPLAY CALL SPACE CALL SPACE CALL SPACE MOV CH,8 WORK02: MOV AL,M ;PRINT FILE NAME AND AL,07FH ; STRIP-OFF PARITY BIT CALL DISPLAY ; DEC CH LAHF INC BX SAHF JNZ WORK02 ; MOV CH,3 MOV AL,'.' CALL DISPLAY ;PRINT NEXT THREE CHARACTERS AS ASCII WORK03: MOV AL,M AND AL,07FH ; STRIP-OFF PARITY BIT CALL DISPLAY ; DEC CH LAHF INC BX SAHF JNZ WORK03 ; CALL DISPLAY CALL SPACE MOV CH,3 POP BX ;NOW DISPLAY ATTRIBUTES MOV DX,9 LAHF ADD BX,DX RCR SI,1 SAHF RCL SI,1 WORK03A:CALL SPACE MOV AL,M ROL AL,1 ;TEST $SYS AND $R/O, AND RESERVED MOV AL,'1' JB WORK03B MOV AL,'0' WORK03B:CALL DISPLAY CALL SPACE DEC CH LAHF INC BX SAHF JNZ WORK03A MOV CH,20 WORK04: MOV AL,CH AND AL,3 JNZ L_5 CALL SPACE ; L_5: MOV AL,M CALL HEXCON ; LAHF INC BX SAHF DEC CH JNZ WORK04 ; CALL CRLF ; POP BX RET L_6 EQU $ DSEG ORG Offset L_6 ; BADVER DB 'Sorry, CP/M Version 2.X required$' MSG DB 'User Pro Filename.Typ R/OSysRes exs1s2rc' DB ' <--------------Group-------------->' DB CR,LF DB '=========================================' DB '====================================' DB CR,LF,'$' L_7 EQU $ CSEG ORG Offset L_7 ; ; ; ; ERROR MESSAGES ; ERROR1: MOV DX,(Offset ERMSG1) ;SAY NO GO, AND BAIL OUT CALL PRINT JMP QUIT L_8 EQU $ DSEG ORG Offset L_8 ; ERMSG1 DB CR,LF,'Disk select should be " N:"$' L_9 EQU $ CSEG ORG Offset L_9 ; ERROR2: MOV DX,(Offset ERMSG2) ;SAY NO GO, AND BAIL OUT CALL PRINT JMP QUIT L_10 EQU $ DSEG ORG Offset L_10 ERMSG2 DB CR,LF,'Bad delimeter, should be ":"$' L_11 EQU $ CSEG ORG Offset L_11 ; ERROR3: MOV DX,(Offset ERMSG3) ;SAY NO GO, AND BAIL OUT CALL PRINT JMP QUIT L_12 EQU $ DSEG ORG Offset L_12 ERMSG3 DB CR,LF,'No drive specified$' L_13 EQU $ CSEG ORG Offset L_13 ; ERROR4: MOV DX,(Offset ERMSG4) ;SAY NO GO, AND BAIL OUT CALL PRINT JMPS QUIT L_14 EQU $ DSEG ORG Offset L_14 ERMSG4 DB CR,LF,'Only drives A to D allowed$' L_15 EQU $ CSEG ORG Offset L_15 ; ; PROGRAM BEGINS HERE ; BEGIN: ; ; CHECK FOR DRIVE SPECIFICATION ; MOV AL,Byte Ptr .TBUFF ;GET LENGTH OF COMMAND PARAMETERS CMP AL,2 ; IF <2, NO PARAMETERS JB MAIN01 ; MUST BE PRESENT LOGGED-IN DRIVE JNZ L_16 JMP ERROR1 ;EXACTLY 2, IS ERROR L_16: MOV BX,Word Ptr .TBUFF+2 ;AT LEAST 3 THEN... MOV AL,BH ;NEXT CHARACTER SHOULD BE ":" CMP AL,':' JZ L_17 JMP ERROR2 ;ONLY ALLOW DRIVE SET L_17: MOV AL,BL ;NEXT CHARACTER SHOULD BE DRIVE CMP AL,'A' ;AT A MINIMUM, "A" JB ERROR3 CMP AL,'E' ;AT A MAXIMUM "D" JNB ERROR4 AND AL,7 ;STRIP BITS, FOR 0 TO 3 DEC AL ;BACK OFF FOR 0 TO 3 MOV DL,AL ;MAKE DISK NUMBER MOV DH,0 MOV CL,14 ;BDOS SELECT DISK FUNCTION INT 224 MAIN01: MOV DX,(Offset MSG) CALL PRINT CALL SEARCH ; MAIN02: ; MOV AL,Byte Ptr RESULT ; CMP AL,0FFH JZ QUIT CALL WORKLOOP ; CALL NEXTFILE ; JMPS MAIN02 ; QUIT: MOV CL,0 ; WARM BOOT CP/M-86 INT 224 ; L_18 EQU $ DSEG ORG Offset L_18 ; ; SOME STORAGE LOCATIONS ; OLDSTK RS 2 ;STORAGE FOR "OLD" STACK POINTER RS 32 NEWSTK EQU (Offset $) ;STORAGE FOR "NEW" STACK ; ; END