home *** CD-ROM | disk | FTP | other *** search
/ CP/M / CPM_CDROM.iso / simtel / sigm / vols000 / vol041 / cdosfmap.asm < prev    next >
Encoding:
Assembly Source File  |  1984-04-29  |  8.7 KB  |  482 lines

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