home *** CD-ROM | disk | FTP | other *** search
/ Oakland CPM Archive / oakcpm.iso / cpm / sysutl / doslike.lbr / LABEL.ASM < prev    next >
Encoding:
Assembly Source File  |  1986-07-17  |  4.8 KB  |  188 lines

  1. ;********************************************
  2. ; Program Written by: HARRIS LANDSBERG  c1985
  3. ; Name: LABEL.ASM  in standard 8080 ASM code
  4. ;
  5. ; Designed as a MS-DOS diskette volume ident
  6. ;   label editor simulator.
  7. ;
  8. ; Comment: Works in conjunction with VOL in
  9. ;   order to label diskettes for identification
  10. ;   similar to MS-DOS LABEL program. Create
  11. ;   a hidden file call DISKETTE.VOL on disk.
  12. ;
  13. ; Run: LABEL [d:]
  14. ;********************************************
  15. BDOS    EQU    0005H    ;System Call Location
  16. DMA    EQU    0080H    ;DMA Buffer Location
  17. FCB    EQU    005CH    ;File Control Block
  18. DMAL    EQU    128    ;DMA Buffer Length
  19. GCD    EQU    25    ;Get Current Disk
  20. READ    EQU    20    ;Read Sequential Record
  21. SDMA    EQU    26    ;Set DMA Address
  22. SFF    EQU    17    ;Search For First
  23. OPEN    EQU    15    ;Open File Function
  24. MFILE    EQU    22    ;Make File Function
  25. CLOSE    EQU    16    ;Close File Function
  26. DLT    EQU    19    ;Delete File Function
  27. WSR    EQU    21    ;Write Sequnetial Record
  28. CONIN    EQU    1    ;Character Input
  29. COUT    EQU    2    ;Character Output
  30. PSTR    EQU    9    ;Print String Function
  31. RCON    EQU    10    ;Read Console Buffer
  32. NOTF    EQU    255    ;File Not Found
  33. TPA    EQU    0100H    ;Transient Program Area
  34. FEM    EQU    26    ;File End Mark
  35. CR    EQU    13    ;Carraige Return
  36. LF    EQU    10    ;Line Feed Charcter
  37.     ;
  38. LABEL    ORG    TPA    ;Program Start
  39.     ;
  40.     MVI    C,SDMA    ;Set Buffer Location
  41.     LXI    D,DMA    ;At DMA Address
  42.     CALL    BDOS
  43.     MVI    C,PSTR    ;Output MSG to Console
  44.     LXI    D,MSG
  45.     CALL    BDOS
  46.     LDA    FCB    ;For Which Drive?
  47.     CPI    0    ;Default Drive
  48.     CZ    GETDR    ;Get Current Drive
  49.     ADI    40H    ;Upgrade to A,B,C etc.
  50.     MVI    C,COUT    ;Display to Console
  51.     MOV    E,A
  52.     CALL    BDOS
  53.     LXI    D,FCB+1 ;Start Move to position
  54.     LXI    H,FILE    ;Start Move from posit.
  55.     MVI    B,11    ;Total 11 Characters
  56. FNAME    MOV    A,M    ;From Mem to Accumulator
  57.     STAX    D    ;Put into FCB
  58.     INX    D    ;Increment Pointers
  59.     INX    H
  60.     DCR    B    ;Decrement Counter
  61.     JNZ    FNAME    ;Not Finished?
  62.     MVI    C,SFF    ;Set Search Directory
  63.     LXI    D,FCB    ;For First Call
  64.     CALL    BDOS
  65.     CPI    NOTF    ;Not Found?
  66.     JZ    NOVOL    ;Has no label
  67.     MVI    C,OPEN    ;Open "VOL" File
  68.     LXI    D,FCB
  69.     CALL    BDOS
  70.     MVI    C,READ    ;Read First Record
  71.     LXI    D,FCB
  72.     CALL    BDOS
  73.     MVI    C,PSTR    ;Output Second string
  74.     LXI    D,YESV
  75.     CALL    BDOS
  76.     LXI    H,DMA    ;Start of Record
  77.     MVI    B,11    ;Total 11 Characters
  78. DVOL    PUSH    H    ;Save Registers
  79.     PUSH    B
  80.     MVI    C,COUT    ;Output Character
  81.     MOV    E,M
  82.     CALL    BDOS
  83.     POP    B    ;Restore Registers
  84.     POP    H
  85.     INX    H    ;Increment Pointer
  86.     DCR    B    ;Decrement Counter
  87.     JNZ    DVOL    ;Not Finished?
  88.     JMP    ENDV    ;Return to CP/M
  89. NOVOL    MVI    C,PSTR    ;Output has no label
  90.     LXI    D,NOV
  91.     CALL    BDOS
  92.     MVI    A,0FFH    ;Flag for No Volume
  93.     STA    FEXIST    ;Store in Flag Location
  94. ENDV    MVI    C,PSTR    ;Output Prompt Message
  95.     LXI    D,PROMPT
  96.     CALL    BDOS
  97.     MVI    C,RCON    ;Read Console Buffer
  98.     LXI    D,VID    ;Buffer Address
  99.     CALL    BDOS
  100.     LDA    VID+1    ;# of Chars to Accumulator
  101.     CPI    0    ;ENTER only?
  102.     JZ    EONLY    ;No Charcters!
  103.     LDA    FEXIST    ;Load File Exist Flag
  104.     CPI    0FFH    ;Does it exist?
  105.     CNZ    DLTFILE ;Delete DISKETTE.VOL
  106.     MVI    A,0CFH    ;Make a System File
  107.     STA    FCB+10    ;Change the "O" in VOL
  108.     CALL    CLEAN    ;Clean FCB of leftover info.
  109.     MVI    C,MFILE ;Make a Directory Entry
  110.     LXI    D,FCB    ;Filename in FCB
  111.     CALL    BDOS
  112.     CALL    RELOC    ;Relocate Label to DMa
  113.     MVI    C,WSR    ;Write Sequential Record
  114.     LXI    D,FCB    ;Filename in FCB
  115.     CALL    BDOS
  116.     MVI    C,CLOSE ;Close the File
  117.     LXI    D,FCB    ;Filename in FCB
  118.     CALL    BDOS
  119. FINI    MVI    C,COUT    ;Line Feed Character
  120.     MVI    E,LF
  121.     CALL    BDOS
  122.     RET
  123.     ;
  124.     ; Subroutines
  125.     ;
  126. GETDR    MVI    C,GCD    ;Get Current Disk
  127.     CALL    BDOS
  128.     INR    A    ;Increment Accumulator
  129.     RET
  130. EONLY    LDA    FEXIST    ;Load File Exist Flag
  131.     CPI    0FFH    ;Does it exist?
  132.     JZ    FINI    ;No previous Volume
  133.     MVI    C,COUT    ;Skip Extra Line
  134.     MVI    E,LF
  135.     CALL    BDOS
  136. AGAIN    MVI    C,PSTR    ;Prompt to Delete
  137.     LXI    D,PRMT2
  138.     CALL    BDOS
  139.     MVI    C,CONIN ;Character Input
  140.     CALL    BDOS
  141.     CALL    CAPITAL ;Make Character a Capital
  142.     CPI    'N'    ;Don't Delete
  143.     JZ    FINI    ;Finished
  144.     CPI    'Y'    ;Delete Volume
  145.     JNZ    AGAIN    ;Invalid response
  146.     CALL    DLTFILE ;Delete the File
  147.     JMP    FINI
  148. CAPITAL CPI    'a'    ;Small Character
  149.     RM        ;No!
  150.     SUI    020H    ;Change to Capital
  151.     RET
  152. DLTFILE MVI    C,DLT    ;Delete Volume ID
  153.     LXI    D,FCB    ;Filename in FCB
  154.     CALL    BDOS
  155.     RET
  156. CLEAN    LXI    H,FCB+12 ;Right after Filename
  157.     MVI    A,0    ;Zero it out (hex)
  158.     MVI    B,23    ;Load Counter
  159. CLOOP    MOV    M,A    ;Into Memory
  160.     INX    H    ;Increment Pointer
  161.     DCR    B    ;Decrement Counter
  162.     JNZ    CLOOP    ;20 iterations?
  163.     RET
  164. RELOC    LXI    H,VID+2 ;Put VID Address in HL
  165.     LXI    D,DMA    ;Put DMA Address in DE
  166.     MVI    B,11    ;Load Counter
  167. RLOOP    MOV    A,M    ;Transfer to Accum.
  168.     STAX    D    ;Transfer to DMA
  169.     INX    H    ;Increment Pointers
  170.     INX    D
  171.     DCR    B    ;Decrement Counter
  172.     JNZ    RLOOP    ;All Moved?
  173.     MVI    A,FEM    ;File End Mark
  174.     STA    DMA+11    ;After 11 Characters
  175.     RET
  176. FILE    DB    'DISKETTEVOL'
  177. MSG    DB    LF,'Volume in drive $'
  178. NOV    DB    ' has no label$'
  179. YESV    DB    ' is $'
  180. PROMPT    DB    CR,LF,LF,'Volume label (11 '
  181.     DB    'Characters, ENTER for none)? $'
  182. PRMT2    DB    CR,LF,'Delete current volume label (Y/N)? $'
  183. FEXIST    DB    0
  184. VID    DB    255
  185.     ;
  186.     END
  187. T    DB    CR,LF,LF,'Volume label (11 '
  188.     DB    'Characters, ENTER for none)? $'