;
; MAJOR REVISION OF FMAP3 BY:
; RICHARD GOLDBERG
; LAWRENCEVILLE, NJ
; (609) 896-0241
;
; 1. UNLIMITED NUMBER OF DIRECTORY ENTRIES
; 2. COMMAND LINE OPTIONS ARE:
; M - CREATES NAMES.SUB FILE SUITABLE FOR USE WITH
; THE MODEM PROGRAM IN THE FORMAT OF:
; $1 $2 $3FILENAME.TYP
; P - CREATES NAMES.SUB FILE SUITABLE FOR USE WITH
; PIP IN THE FORMAT OF:
; $1 $2FILENAME.TYP$3
; N - CREATES NAMES.SUB FILE WHICH CONTAINS REQUESTED
; FILENAMES.
; F - CREATES NAMES.SUB FILE WHICH CONTAINS ALL FILENAMES
; ON DISK FOLLOWED BY ";" AND USER NUMBER.
; U - LIST ALL FILENAMES ON DISK ON THE CONSOLE
; 3. PROGRAM WILL AUTOMATICALLY LIST ALL FCB INFORMATION
; ON THE CONSOLE. TO INHIBIT THIS LISTING USE OPTION
; "N" IN CONJUCTION WITH ONE OF THE OPTIONS LISTED ABOVE.
; 4. THE SOURCE DRIVE WILL BE THE DEFAULT DRIVE UNLESS THE
; REQUESTED FILENAME IS PRECEDED BY A DRIVE ID.
; 5. THE OUTPUT DRIVE WILL BE THE DEFAULT DRIVE UNLESS THE
; OPTIONS ARE PRECEDED BY A DRIVE ID.
; 6. EXAMPLES:
; FMAP4 *.ASM MN CREATES NAMES.SUB FILE OF ALL ".ASM"
; FILES FOR THE CURRENT USER WITH NO
; CONSOLE LISTING.
; FMAP4 C:*.* B:F CREATES NAMES.SUB FILE ON DRIVE B: OF
; ALL THE FILES ON DRIVE C: AND LISTS
; ALL OF THE FCB INFO ON THE CONSOLE.
; FMAP4 LISTS ALL OF THE FCB INFO ON THE CONSOLE
; OF ALL THE FILES IN THE CURRENT USER
; ON THE CURRENT DRIVE.
;
ORG 0100H
BDOS EQU 05H
FCB EQU 5CH
;
JMP START
;
DB '(FMAP 08/03/81)'
;
START: LXI H,0
DAD SP
SHLD STACK
LXI SP,STACK
LXI H,FCB+1 ;CHECK IF FILENAME WAS GIVEN
MOV A,M
CPI ' '
JNZ FILEG
MVI B,11 ;FILL NAME AND TYPE WITH '?'
FILL: MVI M,'?'
INX H
DCR B
JNZ FILL
FILEG: LDA FCB+16 ;2ND UNIT PARAM.
ORA A
JZ NODEST
STA MYFCB ;CHG OUTPUT DRIVE
NODEST: LDA FCB+17
MOV C,A ;OPTION IN C
CPI ' '
JZ NOOPT ;NO OPTION GIVEN
LXI H,OPTION ;POINT TO TABLE OF OPTIONS
MOV A,M ;A=NUMBER OF OPTIONS
INX H
MOV B,A
MVI D,1 ;COUNTER
OPLOOP: MOV A,M
CMP C ;RIGHT OPTION?
JZ FOUND
INX H
INR D
DCR B
JNZ OPLOOP
CALL ERXIT
DB '++ILLEGAL OPTION$'
FOUND: MOV A,D
STA OPTNUM ;SAVE OPTION NUMBER
XRA A
STA FILESW
NOOPT: MVI C,25 ;FIND LOGGED DISK
CALL BDOS
STA CDSK
LDA FCB
ORA A
JNZ FSPEC2 ;NO DRIVE SPEC'D
LDA CDSK
INR A
FSPEC2: DCR A ;ADJ FOR INPUT RNG
MOV E,A
MVI C,14 ;SELECT DRIVE WANTED
CALL BDOS
LDA FCB+18 ;GET SECONDARY OPTION
CPI 'N' ;NO LISTING ON CONSOLE?
JNZ FSPEC3
LXI H,CONSW
DCR M ;MAKE NON-ZERO
FSPEC3: LXI H,FCB
MVI M,0
LDA OPTNUM
CPI 4 ;"M", "P" OR "N" OPTION?
JC FSPEC4
MVI M,'?' ;MATCH ALL ENTRIES
LXI H,ALLUSR
DCR M ;MAKE NON-ZERO
CPI 4 ;"F" OPTION?
JZ FSPEC4
XRA A
STA OPTNUM
FSPEC4: MVI C,27 ;GET ALLOC VECT
CALL BDOS
SHLD ALLADR ;SAVE ALLOC PNTR.
MVI C,12 ;FIND REVISION
CALL BDOS
ORA A
JZ OLDCPM ;BEFORE 2.0 USE DFLTS
MVI C,32 ;GET USER NUMBER
MVI E,0FFH
CALL BDOS
STA USER ;SAVE IN MEMORY
MVI C,31 ;GET DPB ADDRESS
CALL BDOS
INX H
INX H
INX H
MOV A,M ;GET BLM
INR A ;MAKE SECTORS/BLOCK
RRC
RRC
RRC ;DIVIDE BY 8 FOR KB/BLK
ANI 1FH
STA BLKSIZ ;SIZE IN KBYTES
INX H
MOV A,M ;EXTENT MASK
STA EXTMSK
LDA BLKSIZ ;RESTORE SIZE
INX H
MOV E,M
INX H
MOV D,M ;DSM
XCHG ;TOTAL BLOCK COUNT
SHLD BLKCNT
XCHG
INX H
MOV E,M ;DRM
INX H
MOV D,M
INX D
XCHG
SHLD DIR
;
OLDCPM: LHLD DIR ;# OF DIRECTORY ENTRIES
LXI D,ORDER
XCHG
DAD D
DAD D
SHLD TABLE ;STARTING ADDR OF FCB TABLE
SHLD NEXTT
MVI C,17 ;SRCH FIRST
LXI D,FCB
CALL BDOS
INR A
PUSH PSW
LXI D,TTL
CALL WRCON
CALL CR
POP PSW
JMP SOME
;
TTL: DB 'FILENAME TYP U EX RC -----EXTENT-----'
DB 'VER. 1.0 08/03/81$'
MORDIR: MVI C,12H
LXI D,FCB
CALL BDOS
INR A
JZ SPRINT
SOME: DCR A
ANI 3
ADD A
ADD A
ADD A
ADD A
ADD A
LXI H,80H
ADD L
MOV L,A
MOV C,M ;SAVE USER
LDA ALLUSR
ORA A ;"U" OR "F" OPTION
JNZ SOME1
LDA USER ;GET CURRENT USER #
CMP C ;IS FILE IN CURRENT USER?
JNZ MORDIR
SOME1: MVI A,0E5H ;CHECK FOR DELETED FILES
CMP C
JZ MORDIR
INX H
XCHG
LHLD NEXTT
MVI B,11 ; NAME
TMOVE1: LDAX D
ANI 7FH
MOV M,A
INX D
INX H
DCR B
JNZ TMOVE1
MOV M,C ;USER
INX H
MVI B,20 ;OTHER BYTES
TMOVE2: LDAX D
MOV M,A
INX D
INX H
DCR B
JNZ TMOVE2
SHLD NEXTT
LHLD COUNT
INX H
SHLD COUNT
JMP MORDIR
;
SPRINT: LHLD COUNT
SHLD OCOUNT
SHLD SCOUNT
MOV A,H
ORA L
JZ DFEXIT
LHLD TABLE
XCHG
LXI H,ORDER
LXI B,32
BLDORD: MOV M,E
INX H
MOV M,D
INX H
XCHG
DAD B
XCHG
PUSH H
LHLD OCOUNT
DCX H
SHLD OCOUNT
MOV A,H
ORA L
POP H
JNZ BLDORD
LHLD COUNT
DCX H
MOV A,H
ORA L
JZ DONE
SORT: XRA A
STA SWITCH
LHLD SCOUNT
DCX H
SHLD TEMP
SHLD SCOUNT
MOV A,H
ORA L
JZ DONE
LXI H,ORDER
SORTLP: CALL COMPR
CM SWAP
INX H
INX H
PUSH H
LHLD TEMP
DCX H
SHLD TEMP
MOV A,H
ORA L
POP H
JNZ SORTLP
LDA SWITCH
ORA A
JNZ SORT
DONE: LXI H,ORDER
SHLD NEXTT
LDA CDSK
MOV E,A
MVI C,14 ;SEL DSK
CALL BDOS ;ORIG DRIVE
LDA OPTNUM
ORA A
JZ ENTRY
LXI D,MYFCB
MVI C,13H
CALL BDOS
LXI D,MYFCB
MVI C,16H
CALL BDOS
INR A
JNZ ENTRY
CALL ERXIT
DB '++FILE MAKE ERROR$'
ENTRY: MVI C,11 ;CONS STAT
CALL BDOS
DCR A
JZ ABORT
LHLD NEXTT
MOV E,M
INX H
MOV D,M ;DE=ADDR OF ENTRY
INX H
SHLD NEXTT
LXI H,11 ;USER OFFSET
DAD D
MOV A,M ;USER BYTE
ADI 90H
DAA
ACI 40H
DAA
MOV M,A ;NOW ASCII
INX H
MOV B,M ;EXTENT NUMBER
LDA EXTMSK
CMP B
JP ENTRY2 ;SKIP IF EXTMSK >= EXTENT #
MVI A,0FFH
STA FILESW
ENTRY2: XCHG
JMP PTONE3
;
PTONE3: PUSH H
LDA OPTNUM ;GET OPTION NUMBER
ORA A
JZ PTONE4
CPI 3 ;OPTION F?
JNC PTONE4
PUSH PSW
MVI B,5
LXI H,FMSG1
CALL FTYPE ;OUTPUT "$1 $2" TO FILE
POP PSW
DCR A ;OPTION M?
JNZ PTONE4 ;NO, THEN SKIP NEXT PART
MVI A,' '
CALL FILCHS ;OUTPUT BLANK
LXI H,FMSG2
MVI B,2
CALL FTYPE ;OUTPUT "$3" TO FILE
PTONE4: POP H
MVI B,8
CALL TYPEIT
CALL PERIOD
MVI B,3
CALL TYPEIT
LDA OPTNUM ;GET OPTION #
CPI 2 ;OPTION "P"?
JNZ PTONE5 ;NO, THEN SKIP THIS
PUSH H
PUSH PSW
LXI H,FMSG2
MVI B,2
CALL FTYPE ;OUTPUT "$3" TO FILE
POP PSW
POP H
PTONE5: CPI 4 ;OPTION "F"
CNZ FILECR
CALL SEMIC
MVI B,1
CALL TYPEIT
CALL FILECR
CALL SPACE
MOV A,M
CALL XOB
INX H
INX H
INX H
MOV A,M
CALL XOB
INX H
LXI B,1000H ;BYTES & SPACE FLG
EXTLP: LDA BLKCNT+1
ORA A ;CHECK IF GROUP # IS 1 OR 2 BYTES
JZ EXT1
DCR B
MOV E,M ;SAVE LOW ORDER BYTE
INX H
MOV A,M
CALL XO ;PRINT HIGH ORDER BYTE
MOV A,E
JMP EXT2
EXT1: MOV A,M
EXT2: CALL XOB ;PRINT BYTE AND BLANK
NXCLUS: INX H
DCR B
JNZ EXTLP
PUSH H
LHLD NFILE
INX H
SHLD NFILE
CALL CR
XRA A
STA FILESW
NX1: LHLD COUNT
DCX H
SHLD COUNT
MOV A,H
ORA L
POP H
JNZ ENTRY
;
DFEXIT: MVI A,0FFH
STA FILESW
INR A
STA CONSW
LHLD BLKCNT
INX H
MOV D,H
MOV E,L ;TOTAL COUNTER IN DE
PUSH H ;LEFT COUNTER ON STK
LHLD ALLADR
LP3: MVI B,8 ;BIT COUNT
MOV A,M ;ALLOC BYTE
XTHL ;SAVE PTR,GET LEFT CNT
LP2: RLC ;BIT TO CY
JNC LP1 ;UNUSED BLK
DCX H ;COUNT OFF
LP1: DCX D ;DECR TOTAL
MOV C,A
MOV A,D
ORA E
JZ CNTDUN ;FINISHED SCAN
MOV A,C ;RESTORE
DCR B
JNZ LP2
XTHL
INX H ;STEP TBL PTR
JMP LP3
;
CNTDUN: XCHG ;COUNT IN DE
POP H ;CLEAR UP STACK
LDA BLKSIZ
CALL MPY8 ;CALC IN KB
CALL OUTNUM
MVI B,11
LXI H,ROOM1
CALL TYPEIT
CALL FILECR
CALL CR
LHLD NFILE
CALL OUTNUM
LXI D,NMSG
CALL WRCON
LDA OPTNUM
ORA A
JZ EXIT
XRA A
STA FILESW
MVI A,1AH
CALL FILCHR
CALL WRSEC
LXI D,MYFCB
MVI C,10H
CALL BDOS
JMP EXIT
;
NMSG: DB ' DIRECT. ENTRIES USED$'
;
DIVIDE: XRA A
MVI B,10H
DIV01: DAD H
RAL
CMP C
JC DIV02
SUB C
INX H
DIV02: DCR B
JNZ DIV01
RET
;
MPY8: LXI H,0
MPY81: ORA A
RZ
RAR
JNC MPY01
DAD D
MPY01: XCHG
DAD H
XCHG
JMP MPY81
;
OUTNUM: MVI D,0
MVI C,10 ;RADIX
OUTN01: CALL DIVIDE
PUSH PSW
INR D
MOV A,H
ORA L
JNZ OUTN01
MOV B,D
OUTN02: POP PSW
CALL NIBBL
DCR B
JNZ OUTN02
RET
;
XOB: CALL XO
JMP SPACE
;
XO: PUSH PSW
RAR
RAR
RAR
RAR
CALL NIBBL
POP PSW
;
NIBBL: ANI 0FH
ADI 90H
DAA
ACI 40H
DAA
JMP FILC
;
TYPE: PUSH B
PUSH D
PUSH H
MOV E,A
MVI C,2
LDA CONSW
ORA A
CZ BDOS
POP H
POP D
POP B
RET
;
WRCON: LDA CONSW
ORA A
RNZ
MVI C,9
JMP BDOS
;
TYPEIT: MOV A,M
CALL FILCHR
CALL TYPE
INX H
DCR B
JNZ TYPEIT
RET
;
FTYPE: MOV A,M
CALL FILCHS
INX H
DCR B
JNZ FTYPE
RET
;
SPACE: MVI A,' ' ;20H
JMP TYPE
;
SPACF: MVI A,' ' ;20H
FILC: CALL FILCHS
JMP TYPE
;
CR: MVI A,0DH
MVI C,2
CALL TYPE
MVI A,0AH
JMP TYPE
;
TEMP: DS 2
;
ERXIT: POP D
MVI C,9
JMP CALLB
;
ABORT: MVI C,1
CALLB: CALL BDOS
EXIT: LHLD STACK
SPHL
RET
;
FILCHR: CPI ' ' ;20H
RZ
FILCHS: PUSH PSW
LDA FILESW
ORA A
JNZ NOFILE
POP PSW
PUSH PSW
PUSH H
LHLD BUFAD
MOV M,A
INX H
SHLD BUFAD
MOV A,H
DCR A
CZ WRSEC
POP H
NOFILE: POP PSW
RET
;
WRSEC: PUSH B
PUSH D
LXI D,MYFCB
MVI C,15H
CALL BDOS
ORA A
JZ WROK
CALL ERXIT
DB '++WRITE ERROR$'
WROK: LXI H,80H
SHLD BUFAD
POP D
POP B
RET
;
PERIOD: MVI A,'.' ;2EH
CHCOM: CALL FILCHR
JMP SPACE
;
SEMIC: MVI A,';'
JMP CHCOM
;
FILECR: MVI A,0DH
CALL FILCHR
MVI A,0AH
CALL FILCHR
MVI A,0FFH
STA FILESW
RET
;
COMPR: PUSH H
MOV E,M
INX H
MOV D,M
INX H
MOV C,M
INX H
MOV B,M
XCHG
CMPLP: LDAX B
CMP M
INX H
INX B
JZ CMPLP
POP H
RET
;
SWAP: MVI A,1
STA SWITCH
MOV C,M
INX H
PUSH H
MOV B,M
INX H
MOV E,M
MOV M,C
INX H
MOV D,M
MOV M,B
POP H
MOV M,D
DCX H
MOV M,E
RET
;
DS 30
STACK: DS 2
NFILE: DW 0
ALLADR: DW 0 ;ALLOC VECT PTR
BLKCNT: DW 0
BLKSIZ: DB 1 ;1.4 DEFAULT
TABLE: DW 0
NEXTT: DW 0
COUNT: DW 0
EXTMSK: DB 0 ;1.4 DEFAULT
DIR: DW 64 ;1.4 DEFAULT
USER: DB 0 ;1.4 DEFAULT
ALLUSR: DB 0
ROOM1: DB 'K REMAINING'
SCOUNT: DW 0
OCOUNT: DW 0
CDSK: DB 0
SWITCH: DB 0
FILESW: DB 0FFH
CONSW: DB 0
OPTNUM: DB 0
OPTION: DB 5,'MPNFU'
FMSG1: DB '$1 $2'
FMSG2: DB '$3'
BUFAD: DW 80H
MYFCB: DB 0 ;DEFAULT DRIVE
DB 'NAMES SUB'
DB 0
DS 19
DB 0
ORDER EQU $