home *** CD-ROM | disk | FTP | other *** search
/ CP/M / CPM_CDROM.iso / simtel / sigm / vols000 / vol009 / nfmap.asm < prev    next >
Assembly Source File  |  1984-04-29  |  9KB  |  448 lines

  1.     TITLE    'SORTED DIRECTORY MAP PROGRAM'
  2.     ORG    100H
  3.     JMP    START    ;SKIP PROGRAM ID
  4.     DB    '(FMAP 3/19/80)' 
  5. ;SORTED DIRECTORY MAP PROGRAM
  6. ;WITH OPTION OF WRITING FILE OF NAMES
  7. ; MODIFIED BY W. EARNEST FOR MULTIPLE EXTENTS
  8. ; MODIFIED 3/80 FOR CP/M REV 2.01
  9. ; MODIFIED BY A. I. LARKY TO WRITE A SIZE FILE
  10. ;    800719
  11. ;
  12. ;FMAP D:FN.FT OR JUST FMAP
  13. ;FMAP D:FN.FT F   TO WRITE A FILE
  14. ;ALLOWS '*' OR '?' TYPE SPECIFICATIONS
  15. FCB    EQU    5CH    ;SYSTEM FCB
  16. ;SAVE THE STACK
  17. START    LXI    H,0
  18.     DAD    SP    ;H=STACK
  19.     SHLD    STACK    ;SAVE IT
  20.     LXI    SP,STACK ;GET NEW STACK
  21. ;SAVE FILE WRITE REQUEST CHAR
  22.     LDA    FCB+17
  23.     STA    FILESW
  24. ;NO FCB SPECIFIED?
  25.     LXI    H,FCB+1
  26.     MOV    A,M
  27.     CPI    ' '
  28.     JNZ    GOTFCB
  29. ;NO FCB - MAKE FCB ALL '?'
  30.     MVI    B,12    ;FN+FT COUNT+EXTENT
  31. QLOOP    MVI    M,'?'    ;STORE '?' IN FCB
  32.     INX    H
  33.     DCR    B
  34.     JNZ    QLOOP
  35. ;LOOK UP THE FCB IN THE DIRECTORY
  36. GOTFCB    MVI    C,FSRCHF ;GET 'SEARCH FIRST' FNC
  37.     LXI    D,FCB
  38.     CALL    BDOS    ;READ FIRST
  39.     INR    A    ;WERE THERE ANY?
  40.     STA    TEMP    ;SAVE
  41.     JNZ    PRTTL    ;GOT SOME - PRT TITLE, CONT
  42.     LXI    D,NONMSG
  43.     CALL    WRCON
  44.     JMP    EXIT
  45. NONMSG    DB    '++NOT FOUND$'
  46. ;PRINT TITLE
  47. PRTTL    LXI    D,TTL
  48.     CALL    WRCON
  49.     CALL    CR
  50.     LDA    TEMP    ;RELOAD EXTENT
  51.     JMP    SOME
  52. TTL    DB    'FILENAME TYP EX RC -----EXTENT-----$'
  53. ;READ MORE DIRECTORY ENTRIES
  54. MOREDIR    MVI    C,FSRCHN ;SEARCH NEXT
  55.     LXI    D,FCB
  56.     CALL    BDOS    ;READ DIR ENTRY
  57.     INR    A    ;CHECK FOR END (0FFH)
  58.     JZ    SPRINT    ;NO MORE - SORT & PRINT
  59. ;POINT TO DIRECTORY ENTRY 
  60. SOME    DCR    A    ;UNDO PREV 'INR A'
  61.     ANI    3    ;MAKE MODULUS 4
  62.     ADD    A    ;MULTIPLY...
  63.     ADD    A    ;..BY 32 BECAUSE
  64.     ADD    A    ;..EACH DIRECTORY
  65.     ADD    A    ;..ENTRY IS 32
  66.     ADD    A    ;..BYTES LONG
  67.     LXI    H,81H    ;POINT TO BUFFER
  68.             ;(SKIP TO FN/FT)
  69.     ADD    L    ;POINT TO ENTRY
  70.     MOV    L,A    ;SAVE (CAN'T CARRY TO H)
  71. ;MOVE ENTRY TO TABLE
  72.     XCHG        ;ENTRY TO DE
  73.     LHLD    NEXTT    ;NEXT TABLE ENTRY TO HL
  74.     MVI    B,11    ;ENTRY LENGTH OF NAME
  75. TMOVE1    LDAX    D    ;GET ENTRY CHAR
  76.     ANI    7FH    ;STRIP ANY FLAG BIT
  77.     MOV    M,A    ;STORE IN TABLE
  78.     INX    D
  79.     INX    H
  80.     DCR    B    ;MORE?
  81.     JNZ    TMOVE1
  82.     MVI    B,20
  83. TMOVE2:    LDAX    D
  84.     MOV    M,A    ;SAVE FULL BYTE
  85.     INX    D
  86.     INX    H
  87.     DCR    B
  88.     JNZ    TMOVE2
  89.     SHLD    NEXTT    ;SAVE UPDATED TABLE ADDR
  90.     LDA    COUNT    ;GET PREV COUNT
  91.     INR    A
  92.     STA    COUNT
  93.     JMP    MOREDIR
  94. ;SORT AND PRINT
  95. SPRINT    LDA    COUNT    ;INIT THE ORDER TABLE
  96.     LXI    H,ORDER
  97.     LXI    D,TABLE
  98.     LXI    B,31    ;ENTRY LENGTH
  99. BLDORD    MOV    M,E    ;SAVE LO ORD ADDR
  100.     INX    H
  101.     MOV    M,D    ;SAVE HI ORD ADDR
  102.     INX    H
  103.     XCHG        ;TABLE ADDR TO HL
  104.     DAD    B    ;POINT TO NEXT ENTRY
  105.     XCHG
  106.     DCR    A    ;MORE?
  107.     JNZ    BLDORD    ;..YES
  108.     LDA    COUNT    ;GET COUNT
  109.     STA    SCOUNT    ;SAVE AS # TO SORT
  110.     DCR    A    ;ONLY 1 ENTRY?
  111.     JZ    DONE    ;..YES, SO SKIP SORT
  112. SORT    XRA    A    ;GET A ZERO
  113.     STA    SWITCH    ;SHOW NONE SWITCHED
  114.     LDA    SCOUNT    ;GET COUNT
  115.     DCR    A    ;USE 1 LESS
  116.     STA    TEMP    ;SAVE # TO COMPARE
  117.     STA    SCOUNT    ;SAVE HIGHEST ENTRY
  118.     JZ    DONE    ;EXIT IF NO MORE
  119.     LXI    H,ORDER ;POINT TO ORDER TABLE
  120. SORTLP    CALL    COMPR    ;COMPARE 2 ENTRIES
  121.     CM    SWAP    ;SWAP IF NOT IN ORDER
  122.     INX    H    ;BUMP ORDER
  123.     INX    H    ;..TABLE POINTER
  124.     LDA    TEMP    ;GET COUNT
  125.     DCR    A
  126.     STA    TEMP
  127.     JNZ    SORTLP    ;CONTINUE
  128. ;ONE PASS OF SORT DONE
  129.     LDA    SWITCH    ;ANY SWAPS DONE?
  130.     ORA    A
  131.     JNZ    SORT
  132. ;SORT IS ALL DONE - PRINT ENTRIES
  133. DONE    LXI    H,ORDER
  134.     SHLD    NEXTT
  135. ;IF WRITING A FILE, OPEN THE FILE
  136.     LDA    FILESW
  137.     CPI    'F'
  138.     JNZ    ENTRY
  139.     LXI    D,MYFCB
  140.     MVI    C,ERASE
  141.     CALL    BDOS
  142.     LXI    D,MYFCB
  143.     MVI    C,FMAKE    ;MAKE THE FILE
  144.     CALL    BDOS
  145.     INR    A
  146.     JNZ    ENTRY
  147. ;MAKE ERROR
  148.     CALL    ERXIT
  149.     DB    '++FILE MAKE ERROR$'
  150. ;PRINT AN ENTRY
  151. ENTRY    MVI    C,CONST    ;CK STATUS OF KB
  152.     CALL    BDOS    ;ANY KEY PRESSED?
  153.     DCR    A
  154.     JZ    ABORT    ;YES, ABORT
  155.     LHLD    NEXTT    ;GET ORDER TABLE POINTER
  156.     MOV    E,M    ;GET LO ADDR
  157.     INX    H
  158.     MOV    D,M    ;GET HI ADDR
  159.     INX    H
  160.     SHLD    NEXTT    ;SAVE UPDATED TABLE POINTER
  161.     LXI    H,11    ;OFFSET TO EXTENT
  162.     DAD    D
  163.     MOV    A,M    ;GET EXTENT
  164.     ANA    A
  165.     JZ    ENTRY2    ;EXTENT 0
  166.     LXI    H,FILESW
  167.     INR    M    ;SET NO-COPY FLAG
  168. ENTRY2:    XCHG        ;TABLE ENTRY TO HL
  169.     MVI    B,8    ;FILE NAME LENGTH
  170.     CALL    TYPEIT    ;TYPE FILENAME
  171.     CALL    PERIOD    ;SPACE AFTER FN
  172.     MVI    B,3    ;GET THE FILETYPE
  173.     CALL    TYPEIT
  174.     CALL    FILECR
  175.     MOV    A,M    ;GET EXTENT
  176.     CALL    XOB    ;PRINT IT
  177.     INX    H    ;SKIP EXTENT
  178.     INX    H    ;SKIP
  179.     INX    H    ;UNUSED
  180.     MOV    A,M    ;GET REC COUNT
  181.     DCR    A    ;FUDGE
  182.     JM    EXTLP0    ;NO SIZE, SO SKIP ACCOUNTING
  183.     RAR        ;DIVIDE
  184.     RAR        ;..BY 8
  185.     RAR
  186.     ANI    1FH    ;DELETE GARBAGE
  187.     INR    A    ;MAKE RELATIVE TO 1, NOT 0
  188.     MOV    B,A    ;SAVE AS # CLUSTERS
  189. ;  COMPUTE REMAINING SPACE
  190.     LDA    KLEFT
  191.     SUB    B
  192.     STA    KLEFT
  193. EXTLP0:    MOV    A,M    ;RELOAD RECORD COUNT
  194.     CALL    XOB    ;PRINT RECORD COUNT
  195.     INX    H    ;SKIP RECORD COUNT
  196.     MVI    C,0    ;FOR CLUSTER SKIP CTL
  197. EXTLP    MOV    A,M    ;GET CLUSTER BYTE
  198.     ORA    A    ;EMPTY?
  199.     JZ    ENDEXT    ;..YES
  200.     CALL    XO    ;..NO, PRINT IT
  201.     INR    C    ;INCR COUNT
  202.     MOV    A,C    ;TIME TO SPACE?
  203.     ANI    3
  204.     CZ    SPACE
  205.     INX    H    ;POINT TO NEXT CHR
  206.     DCR    B    ;MORE IN EXTENT?
  207.     JNZ    EXTLP    ;YES
  208. ;BUMP TOTAL FILE COUNT
  209. ENDEXT:    LDA    NFILE    ;GET # FILES
  210.     INR    A    ;BUMP
  211.     DAA        ;MAKE DECIMAL
  212.     STA    NFILE    ;SAVE IT BACK
  213.     CALL    CR    ;END, TYPE C/R
  214. ;CLEAR UP THE FILE SWITCH
  215.     LDA    FILESW
  216.     ANI    0FEH    ;DROP POSSIBLE NO-COPY FLAG
  217.     STA    FILESW
  218. ;SEE IF MORE ENTRIES
  219.     LDA    COUNT
  220.     DCR    A
  221.     STA    COUNT
  222.     JNZ    ENTRY    ;YES, MORE
  223. ; ADD DUMMY FILE WITH LENGTH
  224.     MVI    B,8
  225.     LXI    H,ROOM
  226.     CALL    TYPEIT
  227.     CALL    PERIOD
  228.     LXI    H,TENS
  229.     LDA    KLEFT
  230.     MVI    B,E
  231. DIGIT1:    MVI    C,'0'
  232. DIGIT2:    SUB    M
  233.     JC    DIGIT3    ;OVERBORROWED
  234.     INR    C    ;COUNT YOUR SUCCESSES
  235.     JMP    DIGIT2    ;DON'T QUIT WHILE YOU'RE WINNING
  236. ;
  237. DIGIT3:    ADD    M    ;RESTORE
  238.     MOV    M,C    ;SAVE A DIGIT
  239.     INX    H
  240.     DCR    B
  241.     JNZ    DIGIT1
  242.     LXI    H,TENS    ;ANSWER SPOT
  243.     MVI    B,3
  244.     CALL    TYPEIT
  245.     CALL    FILECR
  246.     CALL    CR
  247. ;
  248. ; ALL DONE - PRINT # FILES
  249.     LDA    NFILE
  250.     CALL    XOB
  251.     LXI    D,NMSG
  252.     CALL    WRCON
  253. ;CLOSE FILE IF NECESSARY
  254.     LDA    FILESW
  255.     CPI    'F'
  256.     JNZ    EXIT
  257.     MVI    A,'Z'-40H ;EOF CHAR
  258.     CALL    FILCHR    ;WRITE IT
  259.     CALL    WRSEC    ;WRITE FINAL SECTOR
  260.     LXI    D,MYFCB
  261.     MVI    C,FCLOSE
  262.     CALL    BDOS
  263.     JMP    EXIT
  264. NMSG    DB    'FILES$'
  265. ;HEX OUTPUT W/BLANK
  266. XOB    CALL    XO
  267.     JMP    SPACE
  268. ;HEX OUTPUT 
  269. XO    PUSH    PSW    ;SAVE CHAR
  270.     RAR
  271.     RAR
  272.     RAR
  273.     RAR
  274.     CALL    NIBBL    ;PRINT LEFT NIBBLE
  275.     POP    PSW    ;GET VALUE BACK
  276. ;
  277. NIBBL    ANI    0FH    ;ISOLATE NIBBLE
  278.     CPI    10    ;NUMBER?
  279.     JC    XNUM    ;YES
  280.     ADI    7    ;FUDGE ALPHA HEX
  281. XNUM    ADI    '0'    ;MAKE PRINTABLE
  282. ;
  283. ;TYPE CHAR IN A
  284. TYPE    PUSH    B
  285.     PUSH    D
  286.     PUSH    H
  287.     MOV    E,A
  288.     MVI    C,WRCHR
  289.     CALL    BDOS
  290.     POP    H
  291.     POP     D
  292.     POP    B
  293.     RET
  294. WRCON    MVI    C,PRINT
  295.     JMP    BDOS
  296. TYPEIT    MOV    A,M
  297.     CALL    FILCHR    ;TO DISK IF REQ'D
  298.     CALL    TYPE
  299.     INX    H
  300.     DCR    B
  301.     JNZ    TYPEIT
  302.     RET
  303. SPACE    MVI    A,' '
  304.     JMP    TYPE
  305. CR    MVI    E,13    ;PRINT
  306.     MVI    C,2    ;C/R
  307.     CALL    BDOS
  308.     MVI    E,10    ;LF
  309.     MVI    C,2
  310.     JMP    BDOS
  311. TEMP    DS    1    ;SAVE DIR ENTRY
  312. ;ERROR EXIT
  313. ERXIT    POP    D    ;GET MSG
  314.     MVI    C,PRINT
  315.     JMP    CALLB    ;PRINT MSG, EXIT
  316. ;ABORT - READ CHAR ENTERED
  317. ABORT    MVI    C,RDCHR
  318. CALLB    CALL    BDOS    ;DELETE THE CHAR
  319. ;FALL INTO EXIT
  320. ;EXIT - ALL DONE , RESTORE STACK
  321. EXIT    LHLD    STACK    ;GET OLD STACK
  322.     SPHL        ;MOVE TO STACK
  323.     RET        ;..AND RETURN
  324. ;ROUTINES FOR CREATING FILE
  325. ;
  326. ;WRITE CHAR IN A TO FILE
  327. ;(SAVES ALL REGS INCLUDING A)
  328. FILCHR    CPI    ' '
  329.     RZ        ;DON'T WRITE BLANKS
  330.     PUSH    PSW
  331.     LDA    FILESW    ;WRITING A FILE?
  332.     CPI    'F'
  333.     JNZ    NOFILE
  334.     POP    PSW    ;GET CHAR
  335.     PUSH    PSW    ;SAVE IT BACK
  336.     PUSH    H
  337.     LHLD    BUFAD    ;CURRENT BUFFER ADDR
  338.     MOV    M,A
  339.     INX    H
  340.     SHLD    BUFAD
  341.     MOV    A,H    ;SEE IF FULL BUFF
  342.     DCR    A
  343.     CZ    WRSEC    ;YES, WRITE SECTOR
  344.     POP    H
  345. NOFILE:    POP    PSW    ;RESTORE CHAR
  346.     RET
  347. ;WRITE A SECTOR
  348. WRSEC    PUSH    B
  349.     PUSH    D
  350.     LXI    D,MYFCB
  351.     MVI    C,FWRTE
  352.     CALL    BDOS
  353.     ORA    A
  354.     JZ    WROK
  355.     CALL    ERXIT
  356.     DB    '++WRITE ERROR$'
  357. WROK    LXI    H,80H    ;START OF BUFF
  358.     SHLD    BUFAD
  359.     POP    D
  360.     POP    B
  361.     RET
  362. ;TYPE A PERIOD INTO THE FILE
  363. PERIOD    MVI    A,'.'    ;GET PERIOD
  364.     CALL    FILCHR    ;WRITE TO FILE
  365.     JMP    SPACE
  366. ;WRITE CR/LF INTO FILE
  367. FILECR    MVI    A,13
  368.     CALL    FILCHR
  369.     MVI    A,10
  370.     CALL    FILCHR
  371.     JMP    SPACE
  372. ;COMPARE ROUTINE FOR SORT
  373. COMPR    PUSH    H    ;SAVE TABLE ADDR
  374.     MOV    E,M    ;LOAD LO
  375.     INX    H
  376.     MOV    D,M    ;LOAD HI
  377.     INX    H
  378.     MOV    C,M
  379.     INX    H
  380.     MOV    B,M
  381. ;BC, DE NOW POINT TO ENTRIES TO BE COMPARED
  382.     XCHG
  383. CMPLP    LDAX    B
  384.     CMP    M
  385.     INX    H
  386.     INX    B
  387.     JZ    CMPLP
  388.     POP    H
  389.     RET        ;COND CODE TELLS ALL
  390. ;SWAP ENTRIES IN THE ORDER TABLE
  391. SWAP    MVI    A,1
  392.     STA    SWITCH    ;SHOW A SWAP WAS MADE
  393.     MOV    C,M
  394.     INX    H
  395.     PUSH    H    ;SAVE TABLE ADDR+1
  396.     MOV    B,M
  397.     INX    H
  398.     MOV    E,M
  399.     MOV    M,C
  400.     INX    H
  401.     MOV    D,M
  402.     MOV    M,B
  403.     POP    H
  404.     MOV    M,D
  405.     DCX    H    ;BACK POINTER TO CORRECT LOC'N
  406.     MOV    M,E
  407.     RET
  408.     DS    30    ;STACK AREA
  409. STACK    DS    2    ;SAVE OLD STACK HERE
  410. NFILE    DB    0    ;NUMBER OF FILES PRINTED
  411. ;
  412. ; BDOS EQUATES
  413. ;
  414. RDCHR    EQU    1    ;READ CHAR FROM CONSOLE
  415. WRCHR    EQU    2    ;WRITE CHR TO CONSOLE
  416. PRINT    EQU    9    ;PRINT CONSOLE BUFF
  417. CONST    EQU    11    ;CHECK CONS STAT
  418. FOPEN    EQU    15    ;0FFH=NOT FOUND
  419. FCLOSE    EQU    16    ;   "    "
  420. FSRCHF    EQU    17    ;   "    "
  421. FSRCHN    EQU    18    ;   "    "
  422. ERASE    EQU    19    ;NO RET CODE
  423. FREAD    EQU    20    ;0=OK, 1=EOF
  424. FWRTE    EQU    21    ;0=OK, 1=ERR, 2=?, 255=NO DIR SPC
  425. FMAKE    EQU    22    ;255=BAD
  426. FREN    EQU    23    ;255=BAD
  427. FDMA    EQU    26
  428. BDOS    EQU    5
  429. REBOOT    EQU    0
  430. NEXTT    DW    TABLE    ;NEXT TABLE ENTRY
  431. COUNT    DB    0    ;ENTRY COUNT
  432. KLEFT:    DB    241    ;STARTING ROOM NUMBER
  433. ROOM    DB    '[[ROOM]]'
  434. SCOUNT    DB    0    ;# TO SORT
  435. SWITCH    DB    0    ;SWAP SWITCH FOR SORT
  436. TENS:    DB    100,10,1    ;TABLE OF DECIMALS
  437. FILESW    DS    1    ;'F' IF WRITING FILE
  438. BUFAD    DW    80H    ;OUTPUT ADDR
  439. MYFCB    DB    0,'NAMES   SUB',0
  440.     DS    19
  441.     DB    0
  442. ;
  443. DIRNO    EQU    64    ;NUMBER OF DIRECTORY ENTRIES
  444. ;
  445. ORDER    DS    2*DIRNO    ;ORDER TABLE
  446. TABLE    EQU    $    ;READ ENTRIES IN HERE
  447.     END    100H
  448.