home *** CD-ROM | disk | FTP | other *** search
/ ftp.barnyard.co.uk / 2015.02.ftp.barnyard.co.uk.tar / ftp.barnyard.co.uk / cpm / walnut-creek-CDROM / SIMTEL / CPMUG / CPMUG008.ARK / FMAP.ASM < prev    next >
Assembly Source File  |  1984-04-29  |  8KB  |  384 lines

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