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 / CPM / GENASM / FMAP.ASM < prev    next >
Assembly Source File  |  2000-06-30  |  8KB  |  441 lines

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