.TITLE 'SORTED DIRECTORY MAP PROGRAM 2.1' .PABS .PHEX .LOC 0100H BDOS = 05H FCB = 5CH ; JMP START ; .ASCII '(FMAP 01/18/81)' ; GOOD FOR DIRECTORIES TO 256 ENTRIES ; START: LXI H,0 DAD SP SHLD STACK LXI SP,STACK LDA FCB+16 ;2ND UNIT PARAM. ORA A JZ NODEST STA MYFCB ;CHG OUTPUT DRIVE NODEST: LDA FCB+17 STA FILESW ;FLAG FOR FILE WRITE 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 LXI H,FCB MVI M,'?' ;MATCH ALL ENTRIES 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,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 INX H ;TOTAL BLOCK COUNT SHLD BLKCNT ; OLDCPM: 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: .ASCII 'FILENAME TYP U EX RC -----EXTENT-----' .ASCII 'VER. 2.1 1/18/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 A,M CPI 0E5H JZ MORDIR MOV C,A ;SAVE USER 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 NFEXIT LXI H,ORDER LXI D,TABLE 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 FILESW CPI 'F' ;46H JNZ ENTRY LXI D,MYFCB MVI C,13H CALL BDOS LXI D,MYFCB MVI C,16H CALL BDOS INR A JNZ ENTRY CALL ERXIT .ASCII '++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 A,M ANA A JZ ENTRY2 LXI H,FILESW MOV A,M ORI 1 MOV M,A ENTRY2: XCHG JMP PTONE3 ; WRDEXT: INX H INR B MOV A,M CALL XOB JMP NXCLUS ; PTONE3: MVI B,8 CALL TYPEIT CALL PERIOD MVI B,3 CALL TYPEIT CALL SEMIC MVI B,1 CALL TYPEIT CALL FILECR MOV A,M CALL XOB INX H INX H INX H MOV A,M CALL XOB INX H LXI B,16<8+0 ;BYTES & SPACE FLG EXTLP: MOV A,M MOV E,A CALL XO LDA EXTMSK ORA A JNZ WRDEXT INR C MOV A,C ANI 1 MOV C,A CZ SPACE NXCLUS: INX H DCR B JNZ EXTLP PUSH H LXI H,NFILE INR M CALL CR LDA FILESW ANI 0FEH STA FILESW LHLD COUNT DCX H SHLD COUNT MOV A,H ORA L POP H JNZ ENTRY ; DFEXIT: MVI B,2 LXI H,ROOM1 CALL TYPEIT LHLD BLKCNT 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,8 LXI H,ROOM2 CALL TYPEIT CALL FILECR CALL CR LDA NFILE MOV L,A MVI H,0 CALL OUTNUM LXI D,NMSG CALL WRCON LDA FILESW ANI 0FEH CPI 'F' ;46H STA FILESW JNZ EXIT MVI A,1AH CALL FILCHR CALL WRSEC LXI D,MYFCB MVI C,10H CALL BDOS JMP EXIT ; NMSG: .ASCII ' DIRECT. ENTRIES USED$' ; NFEXIT: XRA A STA FILESW JMP DFEXIT ; 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 CALL BDOS POP H POP D POP B RET ; WRCON: MVI C,9 JMP BDOS ; TYPEIT: MOV A,M CALL FILCHR CALL TYPE INX H DCR B JNZ TYPEIT RET ; SPACE: MVI A,' ' ;20H JMP TYPE ; SPACF: MVI A,' ' ;20H FILC: CALL FILCHS JMP TYPE ; CR: MVI E,0DH MVI C,2 CALL BDOS MVI E,0AH MVI C,2 JMP BDOS ; TEMP: .BLKB 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 CPI 'F' ;46H 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 .ASCII '++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 LDA FILESW ORI 1 STA FILESW JMP SPACE ; 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 ; .BLKB 30 STACK: .BLKB 2 NFILE: .BYTE 0 ALLADR: .WORD 0 ;ALLOC VECT PTR BLKCNT: .WORD 0 BLKSIZ: .BYTE 1 ;1.4 DEFAULT NEXTT: .WORD TABLE COUNT: .WORD 0 EXTMSK: .BYTE 7 ;1.4 DEFAULT ROOM1: .ASCII '[[' ROOM2: .ASCII ']].LFT;0' SCOUNT: .WORD 0 OCOUNT: .WORD 0 CDSK: .BYTE 0 SWITCH: .BYTE 0 FILESW: .BYTE 0C9H BUFAD: .WORD 80H MYFCB: .BYTE 1 ;DRIVE A DEFAULT .ASCII 'NAMES SUB' .BYTE 0 .BLKB 19 .BYTE 0 ORDER: .BLKB 512 ; TABLE: .END