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 / VOL-2.LBR / VOL-2.AQM / VOL-2.ASM
Assembly Source File  |  2000-06-30  |  9KB  |  323 lines

  1.  
  2. ; VOL version 2.0
  3. ;
  4. ; History:
  5. ; 06-12-86    Re-written from SLR Z80 to 8080 ASM.
  6. ;        Included more editing of the input line.
  7. ;        Allowed for format of filename to be used with MCAT.
  8. ;
  9. ; VOL-2 is a CP/M utility that will allow you to create a volume
  10. ; label on your disks.    This volume label may be used to identify
  11. ; the contents of the disk.  It also allows you to label your disks
  12. ; for use with file catalog programs.
  13. ;
  14. ; Syntax:    [d:][ser][volume label]
  15. ;         [*]
  16. ;         [?]
  17. ;
  18. ; This program was taken from VOL.MAC, by Mike Levy, which was written
  19. ; in Z80 assembly language (Originally in 'C', but it was too slow),
  20. ; and compiled with the SLR Z80 assembler.  Because I don't have the
  21. ; SLR Z80 assembler, this version is written in 8080 ASM code.
  22. ;
  23. ;                    B.Duerr (GEnie address)
  24. ;
  25. FALSE    EQU    0
  26. TRUE    EQU    NOT FALSE
  27.     ORG    100H
  28. ;
  29. ; Start of program -- Set up stack, display signon message, parse the
  30. ; command line for specified volume information
  31. ;
  32. VOL:    JMP    START        ; Bypass constants
  33. MAXDRV:    DB    2        ; Maximum number of drives in computer
  34. DFTUSR:    DB    0        ; User area for Volume Label Record
  35. ;
  36. START:    LXI    H,0
  37.     DAD    SP        ; Get CCP stack
  38.     SHLD    STACK        ; Save it for exit
  39.     LXI    SP,STACK    ; Setup local stack
  40.     LXI    D,SIGNON    ; Display program name, version, and date
  41.     CALL    MESSAGE
  42.     MVI    C,RTNCD        ; Get current drive
  43.     CALL    BDOS
  44.     STA    CDISK        ; Save current drive
  45.     INR    A        ; FCB drive is one relative
  46.     STA    FCB        ; Save drive in FCB as default drive
  47.     MVI    E,0FFH
  48.     MVI    C,SETUSR    ; Get current user
  49.     CALL    BDOS
  50.     STA    CUSER        ; Save current user
  51. ;
  52. ; Initialize counters so the program may be entered with "GO"
  53. ;
  54.     XRA    A
  55.     STA    ALLFLG        ; Show all drives flag
  56.     STA    NEWVOL        ; Write new volume flag
  57. ;
  58.     LDA    DFTUSR        ; Set user area to the default value
  59.     MOV    E,A
  60.     MVI    C,SETUSR    ; SETUSR BDOS function
  61.     CALL    BDOS
  62. ;
  63.     LDA    CTAIL        ; Parse the command tail
  64.     ORA    A
  65.     JZ    CURDRV        ; If no command tail show this drive's volume
  66. ;
  67.     CPI    4        ; If command tail > 4 then write new volume
  68.     JC    NODES
  69.     STA    NEWVOL        ; Set the write new volume flag
  70. ;
  71. ; Scan the command tail for the first non-blank character
  72. ;
  73. NODES:    LXI    H,CTAIL+1    ; Get the desired the drive
  74. NODES1:    INX    H
  75.     MOV    A,M
  76.     ORA    A        ; End of string?
  77.     JZ    CURDRV
  78.     CPI    ' '        ; Blank?
  79.     JZ    NODES1
  80.     CPI    '?'        ; Does the guy just want some help?
  81.     JZ    HELP        ; Yes
  82. ;
  83.     CPI    '*'        ; Show volumes of all drives?
  84.     JNZ    PARSE        ; No
  85.     STA    ALLFLG        ; Set flag
  86.     MVI    A,1        ; Set drive to start at "A"
  87.     STA    FCB
  88.     INX    H
  89.     JMP    CURDRV        ; Go process this volume
  90. ;
  91. PARSE:    MOV    C,A        ; Save the character
  92.     INX    H        ; Point to next character
  93.     MOV    A,M        ; Get it in <A>
  94.     CPI    ':'        ; Is it a colon
  95.     DCX    H        ; Get back to start of string
  96.     JNZ    CURDRV        ; No drive specified
  97.     MOV    A,C        ; Get back the saved drive spec
  98.     SUI    'A'-1        ; Adjust FCB drive address
  99.     STA    FCB
  100.     INX    H        ; Point past drive spec
  101.     INX    H
  102. ;
  103. CURDRV:    XRA    A
  104.     STA    FCB+32        ; Address of FCB tale
  105.     LDA    NEWVOL
  106.     ORA    A        ; Are we writing a new Volume Label Record?
  107.     JZ    READF        ; No, go read the file
  108. ;
  109. ; Write the Volume Label Record, after check delete blank characters.
  110. ;
  111. WRITF:    MOV    A,M        ; Get a character in A
  112.     ORA    A        ; End of line?
  113.     JZ    QUIT        ; Yes, quit
  114.     CPI    ' '        ; Is it blank?
  115.     JNZ    WRITF0        ; No, go process it
  116.     INX    H        ; Point to next character
  117.     JMP    WRITF        ; Loop till done
  118. ;
  119. WRITF0:    LXI    D,CTAIL        ; Address of output buffer
  120.     MVI    B,128        ; Maximum of 128 characters
  121. WRITF1:    MOV    A,M        ; Get a character in memory
  122.     ORA    A        ; End of string
  123.     JZ    WRITF2        ; Yes, go pad record
  124.     STAX    D        ; Move to buffer
  125.     INX    D        ; Point to next character in buffer
  126.     INX    H        ; Point to next character in string
  127.     JMP    WRITF1        ; Loop till done
  128. ;
  129. WRITF2:    XCHG            ; Get output buffer address in <HL>
  130. WRITF3:    MVI    M,EOF        ; Pad the file with hex 1A
  131.     INX    H        ; Point to next character
  132.     DCR    B        ; One less character to go
  133.     JNZ    WRITF3        ; Loop till done
  134. ;
  135.     MVI    A,' '        ; Set default extension to spaces
  136.     STA    FCBEXT
  137.     STA    FCBEXT+1
  138.     STA    FCBEXT+2
  139. ;
  140.     LDA    CTAIL+3
  141.     CPI    ' '        ; Is the 4th character of vol a space
  142.     JNZ    WRITF4        ; No, first 3 characters can't be serial
  143.     LDA    CTAIL        ; Move first 3 characters to FCB ext
  144.     STA    FCBEXT
  145.     LDA    CTAIL+1
  146.     STA    FCBEXT+1
  147.     LDA    CTAIL+2
  148.     STA    FCBEXT+2
  149. ;
  150. WRITF4:    LXI    D,FCB        ; Address of output FCB
  151.     MVI    C,DELETE    ; BDOS DELETE function
  152.     CALL    BDOS
  153. ;
  154.     LXI    D,FCB
  155.     MVI    C,MAKE        ; BDOS MAKE function
  156.     CALL    BDOS
  157. ;
  158.     INR    A        ; Did the file open?
  159.     JZ    NONEWM
  160. ;
  161.     LXI    D,CTAIL        ; Address of buffer
  162.     MVI    C,SETDMA    ; BDOS SETDMA function
  163.     CALL    BDOS
  164. ;
  165.     LXI    D,FCB
  166.     MVI    C,WRITE        ; BDOS WRITE function
  167.     CALL    BDOS
  168.     ORA    A        ; Did the file get written?
  169.     JNZ    NONEWM
  170. ;
  171.     LXI    D,FCB
  172.     MVI    C,CLOSE        ; BDOS CLOSE function
  173.     CALL    BDOS
  174. ;
  175.     LXI    D,YESNEW    ; Tell him volume label record created
  176.     CALL    MESSAGE
  177. ;
  178.     JMP    QUIT
  179. ;
  180. ; Read the Volume Label Record and display to the Console
  181. ;
  182. READF:    LDA    FCB        ; Show which drive
  183.     ADI    'A'-1        ; Convert to ASCII
  184.     STA    DRIVE
  185. ;
  186.     LXI    D,VOLHDR    ; Start of message
  187.     CALL    MESSAGE
  188. ;
  189.     MVI    A,'?'        ; Make the FCB ext "???"
  190.     LXI    H,FCBEXT
  191.     MOV    M,A
  192.     INX    H
  193.     MOV    M,A
  194.     INX    H
  195.     MOV    M,A
  196. ;
  197.     LXI    D,FCB
  198.     MVI    C,OPEN        ; BDOS OPEN function
  199.     CALL    BDOS
  200.     INR    A        ; Is file opened ok?
  201.     JZ    NOVOL        ; No, display message and go to next drive
  202. ;
  203.     LXI    D,CTAIL        ; Set the Command Tail as input buffer
  204.     MVI    C,SETDMA    ; BDOS SETDMA function
  205.     CALL    BDOS
  206. ;
  207.     LXI    D,FCB        ; Input FCB
  208.     MVI    C,READ        ; BDOS READ function
  209.     CALL    BDOS
  210.     ORA    A        ; Is file read ok?
  211.     JNZ    NOVOL        ; No, display message and go to next drive
  212. ;
  213.     LXI    D,FCB        ; Input FCB
  214.     MVI    C,CLOSE        ; BDOS CLOSE function
  215.     CALL    BDOS
  216. ;
  217.     LXI    H,CTAIL        ; Get start of the buffer
  218.     MVI    B,128        ; Maximum of 128 characters
  219.     MVI    A,EOF        ; Look for the first end of file character
  220. READF1:    CMP    M
  221.     JZ    READF2        ; Found end of message
  222.     INX    H        ; Point to next character
  223.     DCR    B        ; One less character to go
  224.     JNZ    READF1        ; Loop till done
  225. READF2:    MVI    M,'$'        ; Put a end of message character for print
  226.     LXI    D,CTAIL        ; Start of message
  227.     CALL    MESSAGE        ; Print the volume label
  228. ;
  229. NXTVOL:    LDA    ALLFLG
  230.     ORA    A        ; Is program to check all drives
  231.     JZ    QUIT        ; No, quit
  232. ;
  233.     LDA    MAXDRV        ; Maximum drives on system
  234.     MOV    C,A        ; Save it
  235.     LDA    FCB
  236.     CMP    C        ; Has program gone through all drives
  237.     JZ    QUIT        ; Yes, quit
  238.     INR    A        ; Increment to next drive
  239.     STA    FCB        ; Move to FCB
  240.     JMP    CURDRV        ; And check for Volume Label Record on drive
  241. ;
  242. NOVOL:    LXI    D,NOFILE    ; Tell him the volume label record not found
  243.     CALL    MESSAGE
  244.     JMP    NXTVOL        ; Go see if any more drives
  245. ;
  246. NONEWM:    LXI    D,NONEW        ; Tell him can't make a volume label record
  247.     CALL    MESSAGE
  248.     JMP    QUIT        ; Quit the job
  249. ;
  250. HELP:    LXI    D,HLPMSG    ; Display menu of functions
  251.     CALL    MESSAGE
  252. ;
  253. ; Restore disk and user areas to original values and return to CP/M
  254. ;
  255. QUIT:    LDA    CDISK        ; Get default drive same as entry
  256.     MOV    E,A
  257.     MVI    C,SELDRV    ; SELDRV BDOS function
  258.     CALL    BDOS
  259.     LDA    CUSER        ; Get user the same as entry
  260.     MOV    E,A
  261.     MVI    C,SETUSR    ; SETUSR BDOS function
  262.     CALL    BDOS
  263.     LHLD    STACK        ; Stack from CCP
  264.     SPHL
  265.     RET            ; Return to CP/M
  266. ;
  267. MESSAGE:MVI    C,PRINT        ; BDOS PRINT FUNCTION
  268.     JMP    BDOS        ; Go to BDOS and return to main program
  269. ;
  270. ; Equates
  271. ;
  272. CR    EQU    0DH        ; Carriage return
  273. LF    EQU    0AH        ; Line feed
  274. TAB    EQU    09H        ; Tab character
  275. EOF    EQU    1AH        ; End of file indicator
  276. CTAIL    EQU    80H        ; CCP command tail
  277. ;
  278. BDOS    EQU    0005H
  279. CONIN    EQU    1        ; Console input function
  280. CONOUT    EQU    2        ; Console output function
  281. PRINT    EQU    9        ; Print string at console function
  282. CONSTAT    EQU    11        ; Get console status function
  283. RTNVER    EQU    12        ; Return version number function
  284. SELDRV    EQU    14        ; Select drive
  285. OPEN    EQU    15        ; Open a file function
  286. CLOSE    EQU    16        ; Close a file function
  287. SRCHF    EQU    17        ; Search for first function
  288. SRCHN    EQU    18        ; Search for next function
  289. DELETE    EQU    19        ; Delete a file function
  290. READ    EQU    20        ; Read a file function
  291. WRITE    EQU    21        ; Write a file function
  292. MAKE    EQU    22        ; Make a file function
  293. RENAME    EQU    23        ; Rename a file function
  294. SETIOB    EQU    24        ; Set I/O byte
  295. RTNCD    EQU    25        ; Return Current Disk
  296. SETDMA    EQU    26        ; Set buffer address function
  297. SETUSR    EQU    32        ; Set/get user code function
  298. READR    EQU    33        ; Read random record
  299. ;
  300. ; Data Areas
  301. ;
  302. VOLHDR:    DB    CR,LF
  303. DRIVE:    DB    ' : $'
  304. NOFILE:    DB    'No Volume$'
  305. YESNEW:    DB    'Volume created$'
  306. NONEW:    DB    'Disk Full$'
  307. SIGNON:    DB    'VOL Version 2.0, 06/12/86',13,10,'$'
  308. HLPMSG:    DB    'Allows you to create, modify, or display a volume label.'
  309.     DB    CR,LF,'SYNTAX: VOL [[drive:] [new volume description]]$'
  310. ;
  311. FCB:    DB    0        ; Drive specifier
  312.     DB    '-VOLUME '    ; File name
  313. FCBEXT:    DB    '???'        ; File type, hidden
  314.     DS    23        ; All the other stuff
  315. ;
  316. NEWVOL:    DS    1        ; New volume flag
  317. ALLFLG:    DS    1        ; Show all drives flag
  318. CDISK:    DS    1
  319. CUSER:    DS    1
  320.     DS    32
  321. STACK:    DS    2
  322.     END    VOL
  323.