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 / UTILS / DIRUTL / MAP104.LBR / MAP104.AQM / MAP104.ASM
Assembly Source File  |  2000-06-30  |  17KB  |  686 lines

  1. ;    MAP.ASM
  2. ;    version 1.04
  3. ;
  4. ;    04/06/85
  5. ;    v1.03 had a bug in it. When someone  tried  to    MAP  a    specific
  6. ;    drive, the program would report drive A: instead of the selected
  7. ;    drive.    MAP command syntax now makes a little more sense.
  8. ;
  9. ;    04/02/85
  10. ;    Another major change.  This version will now let the user select
  11. ;    which  drive to map.  In addition, the descriptive mode routines
  12. ;    are now conditional (see EQUate DESCRIP), this is for sysops who
  13. ;    don't     want    to  use  extra    disk  space  to  handle  section
  14. ;    descriptions.    In  the  library,  I've  changed  README.TXT  to
  15. ;    MAPxxx.MOD.
  16. ;
  17. ;    03/01/85
  18. ;    This sucker's getting pretty slick.  I've  added  a  routine  to
  19. ;    print    a  description    of  the  section  along  with  its  name
  20. ;    (description  is  inside -*.* file, see README.TXT in MAP102.LBR
  21. ;    for  more  information).   I've  also  added  an  abort and XOFF
  22. ;    handling routine, in the process  switching  over  to  all  BDOS
  23. ;    direct console I/O.
  24. ;
  25. ;                     * * *
  26. ;
  27. ;    This program was designed for RCP/M systems that, for one reason
  28. ;    or  another,  cannot  use  SECTION (i.e. a system whose download
  29. ;    areas change daily). It  goes  through    the  directory    of  each
  30. ;    online    user  area  and  drive    looking  for catalog label files
  31. ;    (-*.*).  Upon finding such a file it displays bytes 2-8  of  the
  32. ;    filename and the drive/user area where the file is located.  For
  33. ;    example, a file in A6: called -UTILITY.05A would be displayed as
  34. ;    "A6:  = UTILITY".  Of course, this means that filename bytes 2-8
  35. ;    have to be somehow descriptive of that particular section.
  36. ;
  37. ;    If you have any bug reports/fixes, please contact me  either  by
  38. ;    calling  B-RCP/M  (214)  840-9552  and leaving a message via the
  39. ;    CP/M NOTE command or write to:
  40. ;
  41. ;    Bob Horn
  42. ;    c/o Horn Engineering Associates
  43. ;    1714 Patricia Lane
  44. ;    Garland, Texas    75042
  45. ;
  46. ;    PS:  The RCP/M hours are pretty sporadic, but if you call  about
  47. ;         7PM  central  time  or  early morning (midnight to 8AM) you
  48. ;         stand a pretty good chance of getting online.  Note that at
  49. ;         some  hours  an  aux.  5"    based  system  is up with just a
  50. ;         bulletin board online
  51. ;
  52. TRUE        EQU    0FFH
  53. FALSE        EQU    NOT TRUE
  54. ;
  55. ;    CP/M Equates
  56. ;
  57. BOOT        EQU    0        ;org zero CP/M
  58. BDOS        EQU    BOOT+5        ;bdos entry
  59. DEFDMA        EQU    80H        ;normal default DMA address
  60. TPA        EQU    BOOT+100H    ;ORG address
  61. DFCB        EQU    5CH        ;CP/M default FCB
  62. CONIN        EQU    1        ;BDOS console input function
  63. CONOUT        EQU    2        ;console output function
  64. DIRCON        EQU    6        ;direct console I/O
  65. PBUF        EQU    9        ;print buffer function
  66. RDCON        EQU    10        ;read console buffer function
  67. CONSTAT     EQU    11        ;console status function
  68. SELDISK     EQU    14        ;select default disk function
  69. OPENF        EQU    15        ;open file function
  70. CLOSEF        EQU    16        ;close file function
  71. SRCHF        EQU    17        ;search for first dir file function
  72. SRCHN        EQU    18        ;search for next file function
  73. DELF        EQU    19        ;delete file function
  74. READF        EQU    20        ;read file function
  75. WRITEF        EQU    21        ;write file function
  76. MAKEF        EQU    22        ;make file function
  77. GETDISK     EQU    25        ;get default disk function
  78. SETDMA        EQU    26        ;set DMA address function
  79. SETATTR     EQU    30        ;set file attributes
  80. USRSTAT     EQU    32        ;get/set user number
  81. ACHAR        EQU    'C'-'@'     ;characters for abort and pause,
  82. XOFF        EQU    'S'-'@'     ;respectively.    MUST be ctrl chars.
  83. ;
  84. ;    Misc Equates
  85. ;
  86. BELL        EQU    07H        ;bell character
  87. BS        EQU    08H        ;backspace character
  88. LF        EQU    0AH        ;line feed
  89. CR        EQU    0DH        ;carriage return
  90. BLANK        EQU    20H        ;space character
  91. ;
  92. ;    Program Equates
  93. ;
  94. VERS    EQU    1            ;version
  95. REV    EQU    04            ;revision #
  96. MONTH    EQU    04            ;date of last revision
  97. DAY    EQU    06
  98. YEAR    EQU     85
  99. ;
  100. ;    If you make any changes, please change the above accordingly
  101. ;
  102. ;
  103. FENCE    EQU    '|'            ;separator between section names
  104. NUMCOL    EQU    4            ;# of sections to be displayed on
  105.                     ;each line, 4 for 80 column display
  106. ;
  107. DESCRIP EQU    TRUE            ;true, produce description code
  108. ZCPR    EQU    TRUE            ;true if using ZCPR for MXDRV/USR
  109. ;                    ;if false, see IF NOT ZCPR area below
  110.      IF    ZCPR
  111. MXDRV    EQU    3DH            ;set to location of ZCPR MAXDRV
  112. MXUSR    EQU    3FH            ;       "         MAXUSER
  113.      ENDIF
  114. ;
  115.     ORG    TPA            ;program runs here
  116. ;
  117. ;    Main program
  118. ;
  119. START:    JMP    START1            ;jump over fixed data
  120. ;
  121.      IF    NOT ZCPR
  122. MXDRV:    DB    1            ;max drive to search (A:=0, B:=1, etc.)
  123. MXUSR:    DB    8            ;max user to search +1
  124.      ENDIF
  125. ;
  126. DIRFNAME:
  127.     DB    '-??????????'        ;wild card directory name
  128. START1: LXI    H,0            ;find CP/M stack pointer
  129.     DAD    SP
  130.     SHLD    OLDSP            ;save old stack pointer
  131.     LXI    SP,STACK        ;set up our local stack
  132. ;
  133.     LDA    DFCB+1            ;get first character of command line
  134.     CPI    '?'            ;request for help?
  135.     JZ    HELP            ;then help 'im
  136. ;
  137.      IF    DESCRIP
  138.     CPI    'D'            ;? if descriptive mode
  139.     JNZ    START2            ;it's not, go ahead
  140.     MVI    A,0FFH            ;it is, set the flag
  141.     STA    DESFLG
  142.      ENDIF    ;descrip
  143. ;
  144. START2: LXI    H,SIGNON        ;point to signon message
  145.     CALL    IPBUF            ;and show it
  146. ;
  147. ;    Get the default drive & user, save them, and log onto A0:
  148. ;
  149.     MVI    C,GETDISK        ;get the default drive
  150.     CALL    BDOS
  151.     STA    DEFDRV            ;save it
  152. ;
  153.     MVI    C,USRSTAT        ;get the default user
  154.     MVI    E,0FFH
  155.     CALL    BDOS
  156.     STA    DEFUSR            ;save it
  157. ;
  158.     MVI    E,0            ;set default to A:
  159.     MVI    C,SELDISK        ;
  160.     CALL    BDOS
  161. ;
  162.     MVI    E,0            ;user 0
  163.     MVI    C,USRSTAT
  164.     CALL    BDOS
  165. ;
  166.     LDA    DFCB            ;see if specific drive
  167.     ORA    A            ;set flags
  168.     CNZ    SPCDRV            ;one specific drive, set it
  169. ;
  170. ;    Here we set up the DMA and initialize some values
  171. ;
  172.     LXI    D,DEFDMA        ;set the CP/M DMA address
  173.     MVI    C,SETDMA
  174.     CALL    BDOS
  175. ;
  176. ;    Now start the directory search.
  177. ;
  178. LFORFL: CALL    ZFCB            ;zero the FCB
  179.     LXI    B,11            ;11 char in file name
  180.     LXI    H,DIRFNAME        ;the wild card file name
  181.     LXI    D,FCB+1         ;point to FCB file name space
  182.     CALL    MOVE            ;move the file name in
  183. ;
  184.     LXI    D,FCB            ;find first match
  185.     MVI    C,SRCHF
  186.     CALL    BDOS
  187.     INR    A            ;returns 0ffh if not found
  188.     JZ    MORETGO         ;None there
  189.     DCR    A            ;set A back to normal
  190.     LXI    H,DEFDMA        ;point to DMA buffer
  191.     CALL    FINDFN            ;find the file name in the DMA space
  192. ;
  193.      IF    DESCRIP
  194.     LDA    DESFLG            ;see if descriptive mode
  195.     ORA    A            ;set flags
  196.     JNZ    DESCAL            ;call descriptive routine if so
  197.      ENDIF    ;descrip
  198. ;
  199.     CALL    PRINTFN         ;Print the filename with pertinent data
  200. ;
  201. MORETGO:
  202.     LDA    CURUSR            ;get the current user
  203.     MOV    B,A
  204.     LDA    MXUSR            ;and the max user
  205.     INR    B            ;bump the current user
  206.     CMP    B            ;same as (MXUSR)?
  207.     JZ    NDRIVE            ;if so, go to the next drive
  208.     MOV    A,B            ;and if not, store new current user
  209.     STA    CURUSR
  210.     MVI    C,USRSTAT        ;and move up one
  211.     MOV    E,B
  212.     CALL    BDOS
  213.     JMP    LFORFL            ;look for another file
  214. ;
  215. NDRIVE: LDA    DFCB            ;see if specific drive
  216.     ORA    A            ;set flags
  217.     JNZ    EXIT            ;yeah, quit now
  218. ;
  219.     LDA    CURDRV            ;get current drive
  220.     MOV    B,A
  221.     LDA    MXDRV            ;get max drive
  222.     CMP    B            ;same?
  223.     JZ    EXIT            ;if so, we're done
  224.     MOV    A,B            ;if not, get CURDRV back in A
  225.     INR    A            ;...bump current drive counter
  226.     STA    CURDRV            ;...save it
  227.     MOV    E,A            ;...and log onto the next drive
  228.     MVI    C,SELDISK
  229.     CALL    BDOS
  230.     XRA    A            ;zero user area count
  231.     STA    CURUSR
  232.     MOV    E,A            ;...and log onto user 0
  233.     MVI    C,USRSTAT
  234.     CALL    BDOS
  235.     CALL    CRLF            ;new line
  236.     LDA    CURCOL            ;get current column count
  237.     ORA    A            ;set flags
  238.     JZ    LFORFL            ;it's been reset by ZCOL already
  239.                     ;so look for next file
  240.     XRA    A            ;else reset
  241.     STA    CURCOL
  242.     CALL    CRLF            ;new line
  243.     JMP    LFORFL            ;look for file
  244. ;
  245.      IF    DESCRIP
  246. DESCAL: CALL    DESFN            ;call the descriptive filename routine
  247.     JMP    MORETGO         ;and go back
  248.      ENDIF    ;descrip
  249. ;
  250. EXIT:    LXI    H,QMSG            ;tell how to get help
  251.     CALL    IPBUF
  252. ;
  253. EXIT1:    LDA    DEFUSR            ;get default user area back
  254.     MOV    E,A
  255.     MVI    C,USRSTAT
  256.     CALL    BDOS            ;set it
  257. ;
  258.     LDA    DEFDRV            ;get default drive back
  259.     MOV    E,A
  260.     MVI    C,SELDISK
  261.     CALL    BDOS            ;set it
  262. ;
  263.     CALL    CRLF
  264. ;
  265.     LHLD    OLDSP            ;recover CP/M SP
  266.     SPHL                ;set it
  267.     RET                ;and exit quietly to CP/M
  268. ;
  269. ABORT:    MVI    C,PBUF            ;print abort message
  270.     LXI    D,AMSG
  271.     CALL    BDOS
  272.     JMP    EXIT1
  273. ;
  274. ;************************
  275. ;*** CONSOLE MESSAGES ***
  276. ;************************
  277. ;
  278. SIGNON: DB    CR,LF,'MAP v',VERS+'0','.',(REV/10)+'0',(REV MOD 10)+'0',', '
  279.     DB    (MONTH/10)+'0',(MONTH MOD 10)+'0','-'
  280.     DB    (DAY/10)+'0',(DAY MOD 10)+'0','-'
  281.     DB    '19',(YEAR/10)+'0',(YEAR MOD 10)+'0'
  282.     DB    CR,LF,'from Horn Engineering Associates',CR,LF,LF
  283.     DB    'Ctrl-',ACHAR+'@'
  284.     DB    ' to abort, Ctrl-',XOFF+'@'
  285.     DB    ' to pause...',CR,LF,LF,'$'
  286. ;
  287. AMSG:    DB    CR,LF,LF,'++ Aborted ++',CR,LF,LF,'$'
  288. ;
  289. SAMSG:    DB    'Illegal drive...',CR,LF,'$'
  290. ;
  291. DRMSG:    DB    'MAP of drive $'
  292. ;
  293. QMSG:    DB    CR,LF,LF,'Type ''MAP ?'' for assistance with using this'
  294.     DB    ' program.',CR,LF,'$'
  295. ;
  296.      IF    DESCRIP
  297. ;
  298. NULMSG: DB    29,'Description not available...$'
  299. ;        ^                ^
  300. ;        # of bytes in message        MUST END WITH $
  301. ;
  302.      ENDIF
  303. ;
  304. ;**************************************
  305. ;*** THE PRIVATE FILE CONTROL BLOCK ***
  306. ;**************************************
  307. ;
  308. FCB:
  309. FCB$DISK:    DB    0        ;preset default drive
  310. FCB$NAME:    DB    '-???????'    ;preset default file name
  311. FCB$TYP     DB    '???'        ;file type
  312. FCB$EXTENT:    DB    0        ;preset extent
  313. FCB$RESV:    DB    0,0        ;reserved by CP/M
  314. FCB$RECUSED:    DB    0        ;records used
  315. FCB$ABUSED:    DB    0,0,0,0,0,0,0,0 ;assigned blocks
  316.         DB    0,0,0,0,0,0,0,0
  317. FCB$SEQREC:    DB    0        ;sequential record number
  318. FCB$RANREC:    DW    0        ;random record number
  319. FCB$RANRECO:    DB    0        ;record overflow
  320. ;
  321. ;*******************
  322. ;*** SUBROUTINES ***
  323. ;*******************
  324. ;
  325. ;    PRINTFN - Presents all pertinent section data
  326. ;
  327. PRINTFN:
  328.     INX    H            ;Point past "-"
  329.     INX    H
  330.     PUSH    H            ;save it for later
  331. ;
  332. ;    Ok, now, where is the section?
  333. ;
  334.     LDA    CURDRV            ;get current drive
  335. ;
  336.     ADI    'A'            ;make drive ASCII
  337.     CALL    PCHAR            ;print it
  338.     LDA    CURUSR            ;get current user
  339.     CALL    PASC            ;make # ASCII
  340. ;
  341.     MVI    A,' '
  342.     CALL    PCHAR
  343.     MVI    A,'='
  344.     CALL    PCHAR
  345.     MVI    A,' '
  346.     CALL    PCHAR            ;print " = "
  347. ;
  348. ;    Now, print the section name
  349. ;
  350.     POP    H
  351.     MVI    C,7
  352.     CALL    PSTRING
  353. ;
  354. ;    Check the column counter and act accordingly.  Don't want a messy
  355. ;    screen
  356. ;
  357.     LDA    CURCOL            ;get the current column
  358.     CPI    NUMCOL-1        ;printed all on this line yet?
  359.     JZ    ZCOL            ;yep, zero counter
  360.     INR    A            ;nope, bump counter
  361.     STA    CURCOL            ;and save it
  362. ;
  363.     MVI    A,' '            ;print " | " between section names
  364.     CALL    PCHAR
  365.     MVI    A,FENCE
  366.     CALL    PCHAR
  367.     MVI    A,' '
  368.     CALL    PCHAR
  369.     RET                ;back we go
  370. ;
  371. ZCOL:    XRA    A            ;zero A
  372.     STA    CURCOL            ;store it as the current column
  373.     CALL    CRLF            ;end of line
  374.     RET
  375. ;
  376.      IF    DESCRIP
  377. ;
  378. ;    DESFN - Print filename and description
  379. ;
  380. DESFN:    INX    H            ;Point past "-"
  381.     INX    H
  382.     PUSH    H            ;save it for later
  383. ;
  384. ;    Ok, now, where is the section?
  385. ;
  386.     LDA    CURDRV            ;get current drive
  387. ;
  388.     ADI    'A'            ;make drive ASCII
  389.     CALL    PCHAR            ;print it
  390.     LDA    CURUSR            ;get current user
  391.     CALL    PASC            ;make # ASCII
  392. ;
  393.     MVI    A,' '
  394.     CALL    PCHAR
  395.     MVI    A,'='
  396.     CALL    PCHAR
  397.     MVI    A,' '
  398.     CALL    PCHAR            ;print " = "
  399. ;
  400. ;    Now, print the section name
  401. ;
  402.     POP    H
  403.     PUSH    H
  404.     MVI    C,7
  405.     CALL    PSTRING
  406.     MVI    A,' '            ;make sure at least 2 spaces between
  407.     CALL    PCHAR            ;filename and description
  408.     MVI    A,' '
  409.     CALL    PCHAR
  410. ;
  411. ;    Now we're ready to move the filename into the FCB, open it,
  412. ;    and read the description (if any).
  413. ;
  414.     CALL    ZFCB            ;first clean things up
  415.     POP    H            ;recover filename
  416.     DCX    H            ;get the "-" back
  417.     LXI    B,11            ;# of characters to move
  418.     LXI    D,FCB+1         ;where to move them
  419.     CALL    MOVE            ;do it
  420. ;
  421. ;    Now open the file and read 1 record
  422. ;
  423.     MVI    C,OPENF         ;BDOS open file
  424.     LXI    D,FCB
  425.     CALL    BDOS
  426. ;
  427.     MVI    C,READF         ;BDOS read sequential
  428.     LXI    D,FCB
  429.     CALL    BDOS
  430.     ORA    A            ;set flags
  431.     CNZ    NULFLE            ;must be empty file
  432. ;
  433. ;    Close the file (even though we don't really have to)
  434. ;
  435.     MVI    C,CLOSEF        ;BDOS close file
  436.     LXI    D,FCB
  437.     CALL    BDOS
  438. ;
  439. ;    Now display information
  440. ;
  441.     LXI    H,DEFDMA
  442.     CALL    IPBUF
  443. ;
  444.     CALL    CRLF            ;new line
  445. ;
  446.     RET                ;go home
  447. ;
  448. NULFLE: LDA    NULMSG            ;get # of bytes in message
  449.     MOV    C,A            ;put it in BC
  450.     MOV    B,0
  451.     LXI    H,NULMSG+1        ;point to message
  452.     LXI    D,DEFDMA        ;put it in the DMA
  453.     CALL    MOVE            ;move it
  454.     RET                ;go home to Kansas
  455. ;
  456.      ENDIF    ;descrip
  457. ;
  458. ;    ZFCB - Zero the 36 bytes in the designated FCB
  459. ;
  460. ZFCB:    MVI    C,36
  461.     LXI    H,FCB            ;point to FCB
  462. ZLOOP:    MVI    M,0            ;enter a zero
  463.     INX    H            ;bump pointer
  464.     DCR    C            ;bump down counter
  465.     JNZ    ZLOOP            ;loop for more
  466.     RET
  467. ;
  468. ;    FINDFN - Locates directory file name in DMA after directory
  469. ;    search.  Returns pointer in HL.  Entry with directory code in A.
  470. ;
  471. FINDFN: ADD    A        ;*2
  472.     ADD    A        ;*4
  473.     ADD    A        ;*8
  474.     ADD    A        ;*16
  475.     ADD    A        ;*32
  476.     MOV    E,A        ;offset to DE
  477.     MVI    D,0
  478.     DAD    D        ;add to HL
  479.     RET
  480. ;
  481. ;    MOVE - Moves the number of characters in BC from (HL) to (DE)
  482. ;
  483. MOVE:    MOV    A,M        ;get char from (HL)
  484.     STAX    D        ;put in (DE)
  485.     INX    H
  486.     INX    D
  487.     DCX    B
  488.     MOV    A,C        ;get LS count byte
  489.     ORA    B        ;both B & C zero?
  490.     JNZ    MOVE        ;loop til done
  491.     RET
  492. ;
  493. ;    PSTRING - Prints string pointed to by HL.
  494. ;    Number of characters to print in C
  495. ;
  496. PSTRING:
  497.     PUSH    H        ;save string pointer
  498.     PUSH    B        ;save count
  499.     MOV    A,M        ;get a character
  500.     CALL    PCHAR        ;print it
  501.     POP    B        ;restore count
  502.     POP    H        ;restore pointer
  503.     INX    H        ;bump it
  504.     DCR    C        ;done?
  505.     JNZ    PSTRING     ;if not
  506.     RET
  507. ;
  508. ;    IPBUF - Same is BDOS PBUF, 'cept it checks for abort character
  509. ;        and expects the print string to be pointed to by HL
  510. ;
  511. IPBUF:    PUSH    H        ;save string pointer
  512.     MOV    A,M        ;get a character
  513.     CPI    '$'        ;is that all?
  514.     JZ    PDONE        ;if so, quit
  515.     CALL    PCHAR        ;if not, print a character
  516.     POP    H        ;else restore counter
  517.     INX    H        ;bump up
  518.     JMP    IPBUF        ;go again
  519. PDONE:    POP    H        ;save stack
  520.     RET
  521. ;
  522. ;
  523. ;    CRLF - Puts a CR and LF out to console
  524. ;
  525. CRLF:    MVI    A,CR
  526.     CALL    PCHAR
  527.     MVI    A,LF
  528.     CALL    PCHAR
  529.     RET
  530. ;
  531. ;    PCHAR - Prints the character in A
  532. ;
  533. PCHAR:    PUSH    PSW
  534. ;
  535.     CALL    GETCON        ;see if a key pressed
  536.     CPI    ACHAR        ;if so, was it an abort request?
  537.     JZ    ABORT        ;then abort
  538.     CPI    XOFF        ;XOFF?
  539.     CZ    PAUSE        ;then pause until key pressed
  540. ;
  541.     POP    PSW
  542.     MOV    E,A
  543.     MVI    C,DIRCON
  544.     CALL    BDOS
  545.     RET
  546. ;
  547. ;    PASC - Unpacks two ascii decimal digits from value in A
  548. ;           displays them on the console with no leading 0's.
  549. ;
  550. PASC:    MVI    C,0        ;initialize quotient
  551. PASC1:    SUI    10        ;repeatedly subtract 10
  552.     JC    PASC2        ;if underflow
  553.     INR    C        ;else increment the quotient
  554.     JMP    PASC1        ;and subtract again
  555. ;
  556. PASC2:    ADI    10        ;Correct the underflow
  557.     PUSH    PSW        ;save the remainder
  558.     MOV    A,C        ;get the quotient
  559.     ORA    A        ;set flags
  560.     JZ    ONENUM        ;only one number to display
  561.     ADI    030H        ;adjust to ascii
  562.     CALL    PCHAR        ;print it
  563.     POP    PSW        ;get remainder
  564.     ADI    030H        ;make ascii
  565.     CALL    PCHAR        ;print it
  566. ;
  567.     MVI    A,':'        ;print a ":" after the drive/user
  568.     CALL    PCHAR
  569. ;
  570.     RET
  571. ;
  572. ONENUM: POP    PSW        ;get the #
  573.     ADI    030H        ;make ASCII
  574.     CALL    PCHAR        ;print it
  575.     MVI    A,':'        ;and a colon
  576.     CALL    PCHAR
  577.     MVI    A,' '        ;and a space to make up for the leading
  578.     CALL    PCHAR        ;0
  579. ;
  580.     RET            ;go home
  581. ;
  582. GETCON: MVI    C,DIRCON    ;BDOS direct console I/O
  583.     MVI    E,0FFH        ;for input
  584.     CALL    BDOS        ;do it
  585.     RET
  586. ;
  587. PAUSE:    PUSH    PSW        ;save EVERYTHING
  588.     PUSH    B
  589.     PUSH    D
  590.     PUSH    H
  591. ;
  592. PLOOP:    MVI    C,DIRCON    ;direct console I/O
  593.     MVI    E,0FFH        ;input
  594.     CALL    BDOS
  595.     ORA    A
  596.     JZ    PLOOP        ;wait until key pressed
  597. ;
  598.     POP    H        ;get everything back
  599.     POP    D
  600.     POP    B
  601.     POP    PSW
  602. ;
  603.     RET
  604. ;
  605. ;    SPCDRV - if a specific drive chosen for map, this routine checks
  606. ;         MXDRV to see if possible, and if so sets up that drive
  607. ;         as default.
  608. ;
  609. SPCDRV: LDA    MXDRV        ;get max drive
  610.     MOV    B,A        ;move to B
  611.     LDA    DFCB        ;get drive chosen
  612.     DCR    A        ;bump down
  613.     INR    B        ;and fix B for compare
  614.     CMP    B        ;compare the two
  615.     JNC    SPCABT        ;not ok, exit
  616.     MOV    E,A
  617.     MVI    C,SELDISK    ;select disk
  618.     CALL    BDOS        ;do it
  619. ;
  620.     LXI    H,DRMSG     ;Say MAP of drive x:
  621.     CALL    IPBUF
  622.     LDA    DFCB        ;Get MAP drive back
  623.     DCR    A        ;bump down
  624.     STA    CURDRV        ;store it for display
  625.     ADI    'A'        ;Make ASCII
  626.     CALL    PCHAR        ;print it
  627.     MVI    A,':'        ;...and a colon
  628.     CALL    PCHAR
  629. ;
  630.     CALL    CRLF
  631.     CALL    CRLF
  632. ;
  633.     RET
  634.  
  635. ;
  636. SPCABT: LXI    H,SAMSG     ;print "drive out of range"
  637.     CALL    IPBUF
  638.     JMP    EXIT        ;and exit to CP/M.
  639. ;
  640. HELP:    LXI    H,HMSG        ;print help message
  641.     CALL    IPBUF
  642.     JMP    EXIT1        ;and exit to CP/M
  643. ;
  644. HMSG:    DB    CR,LF,LF
  645.     DB    'Examples of use:',CR,LF,LF
  646.     DB    '        MAP             presents a map of all drives/'
  647.     DB    'user-areas, no'
  648.     DB    CR,LF,'                        descriptions.'
  649.      IF    DESCRIP
  650.     DB    CR,LF,LF
  651.     DB    '        MAP D           presents a map of all drives/'
  652.     DB    'user-areas with'
  653.     DB    CR,LF,'                        descriptions.'
  654.      ENDIF
  655.     DB    CR,LF,LF
  656.     DB    '        MAP B:          presents a map of drive B:,'
  657.     DB    ' no descriptions.'
  658.      IF    DESCRIP
  659.     DB    CR,LF,LF
  660.     DB    '        MAP B:D         presents a map of drive B:,'
  661.     DB    ' with descriptions.'
  662.      ENDIF
  663.     DB    CR,LF,'$'
  664. ;
  665. ;
  666. ;************************
  667. ;*** UNITIALIZED AREA ***
  668. ;************************
  669. ;
  670. DEFUSR: DB    0            ;storage for default user area
  671. DEFDRV: DB    0            ;default drive
  672. CURUSR: DB    0            ;current user area
  673. CURDRV: DB    0            ;current drive
  674. ;
  675. CURCOL: DB    0            ;current column
  676. ;
  677.      IF    DESCRIP
  678. DESFLG: DB    0            ;marks descriptive mode
  679.     ENDIF    ;descrip
  680. ;
  681. OLDSP:    DW    0
  682.     DS    64            ;our private stack area
  683. STACK:    EQU    $
  684. ;
  685.     END
  686. f