home *** CD-ROM | disk | FTP | other *** search
/ Oakland CPM Archive / oakcpm.iso / sigm / vol279 / label.mac < prev    next >
Encoding:
Text File  |  1986-06-11  |  12.4 KB  |  792 lines

  1. ;    THIS PROGRAM ADDS A LABEL FILE TO A DISK (OF THE FORM -filename.ext)
  2. ;    AND OPTIONALLY PRINTS A LABEL FOR THE DISK, SHOWING THE FILES ON IT.
  3. ;
  4. ;    THIS SOURCE FILE IS FOR THE MICROSOFT M80 ASSEMBLER.  REMOVE ASEG
  5. ;    STATEMENT FOR USE WITH DIGITAL RESEARCH'S ASM.
  6. ;
  7. ;    BY:    JON DART
  8. ;        DEPT. OF ANTHROPOLOGY 
  9. ;        UCSD C-001
  10. ;        LA JOLLA, CA 92093
  11. ;
  12. ;    CREATION DATE: 28-JAN-84
  13. ;    LAST MOD: 05-APR-84
  14. ;
  15.     ASEG
  16. FPL    EQU    5        ;FILES PER LINE
  17. LMAX    EQU    8        ;MAX. PRINTED LINES/LABEL
  18. LABSIZ    EQU    10        ;FORM LENGTH (= #LINES FROM TOP OF LABEL TO TOP
  19.                 ;OF NEXT LABEL)
  20. BOOT    EQU    0
  21. BDOS    EQU    5
  22. CR    EQU    0DH
  23. LF    EQU    0AH
  24. SPACE    EQU    20H
  25. CTRL$Z    EQU    1AH
  26. DEFBUF    EQU    BOOT+80H
  27. DEFFCB    EQU    BOOT+5CH
  28. RDBUF    EQU    0AH
  29. SYSRES    EQU    0DH
  30. FOPEN    EQU    0FH
  31. FDELET    EQU    13H
  32. FMAKE    EQU    16H
  33. WRRAND    EQU    22H
  34. FCLOSE    EQU    10H
  35. SELDSK    EQU    0EH
  36. RDRAND    EQU    21H
  37. SFF    EQU    11H
  38. SFN    EQU    12H
  39. LSTOUT    EQU    05H
  40. PRTSTR    EQU    09H
  41. DCIO    EQU    06H
  42. SETDMA    EQU    1AH
  43.  
  44.     ORG    100H
  45.  
  46.     LXI    H,STACK
  47.     SPHL
  48.     LXI    D,MSG1
  49.     MVI    C,PRTSTR
  50.     CALL    BDOS        ;PRINT SIGN-ON MSG.
  51. GETDSK: LXI    D,MSG2
  52.     MVI    C,PRTSTR    ;PROMPT FOR DISK TO USE
  53.     CALL    BDOS
  54.     CALL    GETCHR        ;GET A CHAR.
  55.     CALL    UC        ;MAKE UPPER CASE
  56.     STA    DSK
  57.     CALL    COUT        ;ECHO IT
  58.     SUI    'A'-1        ;CONVERT ASCII TO DRIVE CODE
  59.     STA    DEFFCB        ;STORE IN FCB
  60.     CALL    CRLF
  61.     LDA    DEFFCB        ;GET DRIVE CODE
  62.     CPI    16+1
  63.     JNC    GETDSK        ;IF >16, NO GOOD
  64.     ANA    A
  65.     JZ    GETDSK        ;0 NO GOOD EITHER
  66.     
  67. TOP    EQU    $
  68.     LXI    H,0
  69.     SHLD    TOTAL        ;CLEAR COUNT OF FILES
  70.     XRA    A
  71.     STA    LCOUNT        ;CLEAR LINE COUNT
  72.     LXI    H,DSKNAM
  73.     MVI    B,8
  74.     MVI    A,SPACE
  75.     CALL    FILL        ;CLEAR BUFFER FOR DISK NAME
  76.  
  77.     LXI    D,MSG3
  78.     MVI    C,PRTSTR
  79.     CALL    BDOS        ;ASK USER TO INSERT DISK
  80.  
  81. WAITNL: CALL    GETCHR        ;WAIT FOR USER TO TYPE CR
  82.     CPI    3        ;GOT ^C?
  83.     JZ    EXIT        ;YES, EXIT
  84.     CPI    CR
  85.     JNZ    WAITNL
  86.     CALL    CRLF
  87.  
  88.     MVI    C,SYSRES
  89.     CALL    BDOS        ;GOT CR, RESET SYSTEM
  90.  
  91.     LDA    DEFFCB
  92.     DCR    A
  93.     MOV    E,A
  94.     MVI    C,SELDSK
  95.     CALL    BDOS        ;SELECT DISK
  96.  
  97.     LXI    H,DEFFCB+1
  98.     MVI    B,11
  99.     MVI    A,'?'
  100.     CALL    FILL        ;FILL NAME & EXT FIELDS W. '?'
  101.     MVI    M,0        ;ZERO THE EX BYTE
  102.  
  103. SRC1:    LXI    D,DEFFCB
  104.     MVI    C,SFF
  105.     CALL    BDOS        ;SEARCH FOR FIRST
  106.     CPI    0FFH
  107.     JZ    NOFILE        ;IF NO FILE
  108.  
  109. GOTFILE: DS     0
  110.     ADD    A
  111.     ADD    A
  112.     ADD    A
  113.     ADD    A
  114.     ADD    A
  115.     LXI    H,DEFBUF
  116.     MVI    D,0
  117.     MOV    E,A
  118.     DAD    D        ;COMPUTE ADDRESS OF DIRECTORY ENTRY
  119.     INX    H        ;+1 TO POINT TO FILE NAME
  120.     CALL    ADDLST        ;ADD NAME TO LIST
  121.  
  122. SRC2:    MVI    C,SFN
  123.     LXI    D,DEFFCB
  124.     CALL    BDOS        ;SEARCH FOR NEXT
  125.     CPI    0FFH
  126.     JNZ    GOTFILE        ;IF GOT A FILE
  127.  
  128. LABEND: DS    0        ;COME HERE WHEN NO MORE FILES
  129.     LXI    H,STACK
  130.     SPHL
  131.     LXI    D,MSG6
  132.     MVI    C,PRTSTR
  133.     CALL    BDOS        ;PRINT HEADER
  134.     CALL    SHOWFIL        ;SHOW FILES IN LIST
  135.  
  136. NAMECHK: DS    0
  137. SHDONE: LDA    DSKNAM
  138.     CPI    SPACE        ;SEE IF NAME FILE FOUND
  139.     JNZ    HAVEIT        ;IF FOUND
  140.     LXI    D,MSG8        ;NO NAME FILE, PROMPT FOR ONE
  141.     MVI    C,PRTSTR
  142.     CALL    BDOS
  143. GETYN:    CALL    GETCHR
  144.     CALL    UC
  145.     CPI    'Y'
  146.     JZ    MAKEIT
  147.     CPI    'N'
  148.     JNZ    GETYN
  149.     CALL    COUT
  150.     JMP    NOMAKE        ;USER SAID 'N'
  151.  
  152. HAVEIT:     DS     0
  153.     LXI    H,DSKNAM
  154.     LXI    D,DNAME
  155.     MVI    B,8
  156.     CALL    COPY        ;COPY DISK NAME
  157.     INX    D        ;POINT PAST .
  158.     MVI    B,3
  159.     CALL    COPY        ;COPY EXTENSION
  160.     LXI    D,MSG12
  161.     MVI    C,PRTSTR
  162.     CALL    BDOS        ;ASK IF USER WANTS TO CHANGE NAME
  163.     CALL    GETCHR
  164.     CALL    UC
  165.     CALL    COUT
  166.     CPI    'Y'
  167.     JNZ    MAKEOK        ;IF USER SAID 'N'
  168.     CALL    CRLF
  169.     LDA    DEFFCB
  170.     STA    LABFCB        ;COPY DRIVE CODE TO FCB
  171.     STA    FCB
  172.     LXI    D,LABFCB
  173.     MVI    C,FDELET
  174.     CALL    BDOS        ;DELETE OLD NAME FILE(S)
  175.     CPI    0FFH
  176.     JNZ    MKIT        ;IF OK, PROMPT FOR NEW NAME
  177.     LXI    D,MSG13
  178.     CALL    BDOS        ;IF NOT OK, GIVE ERROR MSG.
  179.     JMP    MAKEOK
  180.  
  181. MAKEIT: CALL    COUT        ;USER SAID 'Y', ECHO IT
  182.     CALL    CRLF
  183.     LXI    H,DSKNAM
  184.     MVI    A,' '
  185.     MVI    B,11
  186.     CALL    FILL        ;FILL DSKNAM WITH SPACES
  187. MKIT:    LXI    D,MSG9
  188.     MVI    C,PRTSTR
  189.     CALL    BDOS        ;PROMPT FOR CHARS
  190.     LXI    D,LINEBUF
  191.     MVI    A,7        ;7 MAX.
  192.     STAX    D
  193.     MVI    C,RDBUF
  194.     CALL    BDOS        ;READ LINE
  195.     CALL    CRLF        ;ECHO CR/LF
  196.     LXI    D,DSKNAM
  197.     MVI    A,'-'
  198.     STAX    D
  199.     INX    D
  200.     LDA    LINEBUF+1
  201.     MOV    B,A
  202.     ANA    A
  203.     JZ    NOCHRS        ;IF NOTHING TYPED
  204.     LXI    H,LINEBUF+2    ;POINT TO CHARS.
  205. UCOPY:    MOV    A,M        ;COPY TO DISKNAM
  206.     CALL    UC        ;MAKE UPPER-CASE
  207.     STAX    D
  208.     INX    H
  209.     INX    D
  210.     DCR    B
  211.     JNZ    UCOPY
  212. NOCHRS: LXI    D,MSG10
  213.     MVI    C,PRTSTR
  214.     CALL    BDOS        ;PROMPT FOR NUMBER
  215.     LXI    D,LINEBUF
  216.     MVI    A,3
  217.     STAX    D
  218.     MVI    C,RDBUF
  219.     CALL    BDOS        ;READ FROM CONSOLE
  220.     LDA    LINEBUF+1
  221.     MOV    C,A        ;GET # CHARACTERS ENTERED
  222.     ANA    A
  223.     JZ    BADNUM        ;IF NONE
  224.     MVI    A,3
  225.     SUB    C
  226.     MOV    B,A
  227.     LXI    H,NUMBUF
  228.     ANA    A
  229.     MVI    A,'0'
  230.     CNZ    FILL        ;ZERO FILL
  231.     XCHG            ;(DE) IS DEST
  232.     MOV    B,C
  233.     LXI    H,LINEBUF+2    ;SOURCE 
  234.     CALL    COPY
  235.     LXI    H,NUMBUF
  236.     MVI    B,3
  237. CHKNUM: MOV    A,M        ;MAKE SURE ONLY DIGITS ENTERED
  238.     CPI    '0'
  239.     JC    BADNUM
  240.     CPI    '9'+1
  241.     JNC    BADNUM
  242.     INX    H
  243.     DCR    B
  244.     JNZ    CHKNUM
  245.  
  246.     LDA    DEFFCB
  247.     STA    FCB
  248.     LXI    D,FCB
  249.     MVI    C,FMAKE
  250.     CALL    BDOS        ;CREATE THE NAME FILE
  251.     CPI    0FFH
  252.     JZ    DIRFULL        ;IF ERROR
  253.     MVI    C,FCLOSE
  254.     LXI    D,FCB
  255.     CALL    BDOS        ;CLOSE THE FILE
  256.     JMP    MAKEOK
  257.  
  258. BADNUM: CALL    CRLF
  259.     JMP    NOCHRS
  260.  
  261. DIRFULL: DS     0
  262.     LXI    D,MSG11
  263.     MVI    C,PRTSTR
  264.     CALL    BDOS
  265.     JMP    NOMAKE
  266.  
  267. MAKEOK: LXI    D,MSG7A
  268.     LXI    H,DSKNAM
  269.     MVI    B,8
  270.     CALL    COPY        ;COPY NAME TO PROMPT LINE
  271.     MVI    A,'.'
  272.     STAX    D
  273.     INX    D
  274.     MVI    B,3
  275.     CALL    COPY        ;COPY SERIAL #, TOO
  276.     JMP    PROMPT
  277.  
  278. NOMAKE: MVI    B,12        ;USER DOESN'T WANT NAME FILE
  279.     LXI    H,MSG7A
  280.     MVI    A,0
  281.     CALL    FILL        ;JUST ZERO NAME FIELD IN PROMPT
  282.  
  283. PROMPT: LXI    D,MSG14
  284.     MVI    C,PRTSTR
  285.     CALL    BDOS        ;ASK IF USER WANTS PRINTED LABEL
  286.     CALL    GETCHR
  287.     CALL    UC
  288.     CALL    COUT
  289.     CPI    'Y'
  290.     JNZ    NOPRNT        ;IF NO
  291.     LXI    D,MSG7
  292.     MVI    C,PRTSTR
  293.     CALL    BDOS        ;PROMPT FOR LINE DESCRIBING DISK
  294.     LXI    D,LINEBUF
  295.     MVI    A,60
  296.     STAX    D        ;STORE MAX. # CHARACTERS
  297.     MVI    C,RDBUF
  298.     CALL    BDOS        ;READ CONSOLE BUFFER
  299.     CALL    CRLF        ;ECHO CR/LF
  300.     LDA    DSKNAM
  301.     CPI    SPACE
  302.     JZ    JUSTSP        ;IF NO DISK NAME
  303.     MVI    B,8
  304.     LXI    H,DSKNAM
  305. PRTDN:    MOV    A,M        ;PRINT DISK NAME
  306.     CALL    UC
  307.     MOV    M,A        ;MAKE IT UC
  308.     CPI    SPACE
  309.     CNZ    POUT
  310.     INX    H
  311.     DCR    B
  312.     JNZ    PRTDN
  313.     MVI    A,'.'
  314.     CALL    POUT
  315.     MVI    B,3
  316. PRTDSN: MOV    A,M        ;PRINT DISK SERIAL
  317.     CALL    POUT
  318.     INX    H
  319.     DCR    B
  320.     JNZ    PRTDSN
  321.     MVI    A,SPACE
  322.     CALL    POUT
  323.  
  324. JUSTSP: LXI    H,LINEBUF+1
  325.     MOV    B,M        ;GET # READ
  326.     MOV    A,M
  327.     ANA    A
  328.     JZ    NOREAD        ;IF NO CHARS.
  329. PRTLAB: INX    H        ;PRINT LINE
  330.     MOV    A,M
  331.     CALL    POUT
  332.     DCR    B
  333.     JNZ    PRTLAB
  334.  
  335. NOREAD: MVI    A,CR
  336.     CALL    POUT
  337.     MVI    A,LF
  338.     CALL    POUT
  339.     LXI    H,LCOUNT
  340.     INR    M        ;BUMP LINE COUNT
  341.     CALL    PRTFIL        ;PRINT FILES
  342.     MVI    A,CR
  343.     CALL    POUT
  344.     LXI    H,LCOUNT
  345. DOFF:    MOV    A,M        ;SKIP TO TOP OF NEXT LABEL
  346.     CPI    LABSIZ
  347.     JNC    NXTLAB
  348.     MVI    A,LF
  349.     CALL    POUT
  350.     INR    M
  351.     JMP    DOFF
  352. NOPRNT: CALL    CRLF
  353. NXTLAB: MVI    C,SYSRES
  354.     CALL    BDOS        ;DO A SYSTEM RESET
  355.     JMP    TOP
  356.  
  357. NOFILE: LXI    D,MSG5
  358.     MVI    C,PRTSTR
  359.     CALL    BDOS
  360.     JMP    NAMECHK
  361.  
  362. ;    COME HERE TO ADD A FILE TO THE LIST
  363. ;    ON ENTRY, (HL) POINTS TO THE FILE NAME (IN FCB FORMAT)
  364. ;
  365. ;    FILES ARE STORED IN THE FORM OF A BINARY TREE.
  366. ;    EACH NODE OF THE TREE HOLDS 16 BYTES.
  367. ;
  368. ;    BYTE 1 =  RESERVED FOR THE USE OF THE EXTRACT ROUTINE.
  369. ;    BYTES 2-3 = ADDRESS OF LEFT DESCENDANT (0 IF NONE)
  370. ;    BYTES 4-5 = ADDRESS OF RIGHT DESCENDANT (0 IF NONE)
  371. ;    BYTES 6-7 = ADDRESS OF HIGHER NODE (0 IF NONE)
  372. ;    BYTES 8-15 = FILE NAME
  373. ;    BYTE 16 = UNUSED
  374. ;
  375. ADDLST    EQU    $
  376.     MOV    A,M        ;GET 1ST CHAR.
  377.     CPI    '-'
  378.     JZ    NAMEFIL        ;IF HYPHEN
  379.     PUSH    H
  380.     CALL    SRCLST
  381.     POP    H
  382.     RET
  383.  
  384. NAMEFIL: MVI    B,11        ;IF NAME FILE, STORE IN SPECIAL PLACE
  385.     LXI    D,DSKNAM
  386.     PUSH    H
  387.     CALL    COPY
  388.     POP    H
  389.     RET
  390.  
  391. SRCLST    EQU    $
  392.     SHLD    START        ;SAVE START OF NAME
  393.     LXI    H,FLIST
  394.     SHLD    NODE        ;START AT NODE 1
  395.     LXI    H,0
  396.     SHLD    LASTND        ;CLEAR LAST NODE ADDRESS
  397.     LHLD    TOTAL
  398.     MOV    A,H
  399.     ORA    L
  400.     JZ    ADDNODE        ;IF TREE EMPTY
  401.  
  402. CMP1:    LHLD    NODE        ;GET NODE ADDRESS
  403.     LXI    D,7
  404.     DAD    D        ;POINT TO NAME
  405.     XCHG            ;NAME ADDR. IN (DE)
  406.     LHLD    START
  407.     XCHG
  408.     CALL    COMP8        ;COMPARE NEW ITEM W. ITEM IN TREE
  409.     JC    LESS        ;IF NEW ITEM LESS THAN ITEM IN TREE
  410.     JNZ    MORE        ;IF NEW ITEM GREATER THAN ITEM IN TREE
  411.     RET            ; NAME ALREADY IN, SO DON'T ADD TO TREE.
  412.  
  413. LESS:    LHLD    NODE
  414.     SHLD    LASTND
  415.     INX    H
  416.     MOV    E,M
  417.     INX    H
  418.     MOV    D,M
  419.     DCX    H
  420.     MOV    A,D
  421.     ORA    E
  422.     JZ    ADDNODE
  423.     XCHG
  424.     SHLD    NODE
  425.     JMP    CMP1
  426.  
  427. MORE:    LHLD    NODE
  428.     SHLD    LASTND
  429.     INX    H
  430.     INX    H
  431.     INX    H
  432.     MOV    E,M
  433.     INX    H
  434.     MOV    D,M
  435.     DCX    H
  436.     MOV    A,D
  437.     ORA    E
  438.     JZ    ADDNODE
  439.     XCHG
  440.     SHLD    NODE
  441.     JMP    CMP1
  442.  
  443. ADDNODE: PUSH    H        ;SAVE PLACE FOR NEW NODE ADDRESS
  444.     LHLD    TOTAL
  445.     DAD    H
  446.     DAD    H
  447.     DAD    H
  448.     DAD    H
  449.     LXI    D,FLIST
  450.     DAD    D        ;COMPUTE ADDRESS OF NEW NODE
  451.  
  452.     PUSH    H
  453.     MVI    B,8
  454.     XRA    A
  455.     CALL    FILL        ;ZERO 1ST 8 BYTES
  456.     POP    H
  457.  
  458.     XCHG            ;NEW NODE ADDRESS IN (DE)
  459.     POP    H        ;PLACE TO PUT IT IN (HL)
  460.     MOV    A,H
  461.     ORA    L
  462.     JZ    SKIP        ;IF NO UPPER NODE
  463.  
  464.     MOV    M,E
  465.     INX    H
  466.     MOV    M,D        ;MAKE LINK DOWN FROM UPPER NODE
  467.  
  468. SKIP:    XCHG            ;NEW NODE ADDRESS IN (HL)
  469.     LXI    D,5
  470.     DAD    D
  471.     XCHG
  472.     LHLD    LASTND        ;GET LAST NODE
  473.     XCHG
  474.     MOV    M,E
  475.     INX    H
  476.     MOV    M,D        ;MAKE LINK UP
  477.     INX    H
  478.     XCHG
  479.     LHLD    START
  480.     MVI    B,8
  481. CPYNAM: MOV    A,M        ;COPY NAME TO NODE
  482.     STAX    D
  483.     INX    H
  484.     INX    D
  485.     DCR    B
  486.     JNZ    CPYNAM
  487.     LHLD    TOTAL
  488.     INX    H        ;BUMP TOTAL COUNT
  489.     SHLD    TOTAL
  490.     RET
  491.  
  492. GETADD: DCX    H        ;-1
  493.     MOV    E,L
  494.     MOV    D,H
  495.     DAD    H
  496.     DAD    H
  497.     DAD    H        ;TIMES 8
  498.     DAD    D        ;TIMES 9
  499.     XCHG
  500.     LXI    H,FLIST         
  501.     DAD    D        ;ADD TO START OF LIST
  502.     RET
  503.  
  504. COMP8:    MVI    C,8        ;SIZE OF FILE NAME
  505. CMP2:    LDAX    D
  506.     CMP    M
  507.     RNZ
  508.     INX    H
  509.     INX    D
  510.     DCR    C
  511.     JNZ    CMP2
  512.     RET
  513.  
  514. ;    EXTRACT = EXTRACT ITEMS FROM BINARY TREE, IN SORTED ORDER
  515. ;
  516. ;    EVERY TIME THIS ROUTINE IS CALLED, IT SETS (HL) TO POINT
  517. ;    TO THE NEXT NAME IN THE TREE.
  518. ;
  519. ;    THE 'C' FLAG IS SET =1 WHEN ALL ITEMS HAVE BEEN EXTRACTED.
  520. ;
  521. EXTRACT EQU    $
  522.     LHLD    TOTAL
  523.     MOV    A,L
  524.     ORA    H
  525.     STC
  526.     RZ            ;IF TREE EMPTY 
  527.  
  528. ;    WALK DOWN THE TREE
  529. ;
  530. DOWN:    LHLD    NODE
  531.     MOV    A,M        ;GET 1ST BYTE OF ENTRY
  532.     CPI    0
  533.     JZ    DOWNL        ;IF ZERO, GO DOWN LEFT
  534.     CPI    1        ;IF 1, LEFT SUB-TREE DONE,
  535.     JZ    RETNODE        ; SO RETURN THIS NODE
  536.     CPI    2        ;IF 2, NODE DONE BUT R. SUB-TREE NOT DONE,
  537.     JZ    DOWNR        ; SO GO DOWN RIGHT
  538.     JMP    UP        ;OTHERWISE, GO UP
  539.  
  540. RETNODE: LHLD    NODE
  541.     INR    M
  542.     LXI    D,7
  543.     DAD    D
  544.     ANA    A
  545.     RET
  546.  
  547. DOWNL:    LHLD    NODE
  548.     INX    H
  549.     MOV    E,M
  550.     INX    H
  551.     MOV    D,M
  552.     MOV    A,D
  553.     ORA    E
  554.     JZ    NODESC
  555.     XCHG
  556.     SHLD    NODE
  557.     JMP    DOWN
  558.  
  559. DOWNR:    LHLD    NODE
  560.     INX    H
  561.     INX    H
  562.     INX    H
  563.     MOV    E,M
  564.     INX    H
  565.     MOV    D,M
  566.     MOV    A,D
  567.     ORA    E
  568.     JZ    NODESC
  569.     XCHG
  570.     SHLD    NODE
  571.     JMP    DOWN
  572.  
  573. NODESC: LHLD    NODE
  574.     INR    M
  575.     JMP    DOWN
  576.  
  577. UP:    LHLD    NODE        ;GET NODE #
  578.     LXI    D,5
  579.     DAD    D
  580.     MOV    E,M
  581.     INX    H
  582.     MOV    D,M
  583.     MOV    A,D
  584.     ORA    E
  585.     STC
  586.     RZ            ;IF NO UPPER NODE
  587.     XCHG
  588.     SHLD    NODE        ;STORE NEW NODE
  589.     INR    M        ;BUMP 1ST BYTE
  590.     JMP    DOWN
  591.  
  592. ;    INIT = INITIALIZE BEFORE EXTRACTION
  593. ;
  594. INIT:    LXI    H,FLIST
  595.     SHLD    NODE        ;SET NODE TO ROOT OF TREE
  596.     LXI    H,FLIST
  597.     LXI    D,16
  598.     LXI    B,512
  599. INIT1:    MVI    M,0        ;MARK ALL NODES UNVISITED
  600.     DAD    D
  601.     DCX    B
  602.     MOV    A,C
  603.     ORA    B
  604.     JNZ    INIT1
  605.     RET
  606.  
  607. ;    SHOW FILES ON SCREEN
  608. ;
  609. SHOWFIL EQU    $
  610.     CALL    INIT
  611. SHOWF:    MVI    B,6        ;COUNT OF FILES/LINE
  612. SHOWF1: PUSH    B
  613.     CALL    EXTRACT
  614.     POP    B
  615.     JC    CRLF        ;QUIT IF NO MORE FILES
  616.     CALL    SHOW1        ;SHOW 1 FILE
  617.     DCR    B        ;KEEP COUNT OF FILES/LINE
  618.     JNZ    SHOWF2        ;IF NOT PAST LIMIT
  619.     CALL    CRLF        ;START NEW LINE
  620.     JMP    SHOWF 
  621. SHOWF2: MVI    A,SPACE
  622.     CALL    COUT
  623.     MVI    A,SPACE
  624.     CALL    COUT
  625.     JMP    SHOWF1
  626.  
  627. SHOW1:    MVI    C,8
  628. SHOW1A: MOV    A,M
  629.     CALL    COUT
  630.     INX    H
  631.     DCR    C
  632.     JNZ    SHOW1A
  633.     RET
  634.  
  635. ;    PRINT FILES
  636. ;
  637. PRTFIL    EQU    $
  638.     XRA    A
  639.     STA    FCOUNT
  640.     CALL    INIT
  641. PRTF:    CALL    EXTRACT
  642.     RC
  643.     LDA    FCOUNT
  644.     INR    A
  645.     STA    FCOUNT        ;BUMP COUNT OF FILES ON LINE
  646.     CPI    FPL+1
  647.     JNC    NEWLIN        ;IF TOO MANY
  648.     CALL    PRTN        ;PRINT NAME
  649.     JMP    PRTF
  650. NEWLIN: MVI    A,1
  651.     STA    FCOUNT        ;RESET COUNT OF FILES ON LINE
  652.     MVI    A,CR
  653.     CALL    POUT
  654.     MVI    A,LF
  655.     CALL    POUT
  656.     LDA    LCOUNT
  657.     INR    A
  658.     STA    LCOUNT
  659.     CPI    LMAX        ;REACHED MAX. LINES?
  660.     RNC            ;YES, QUIT
  661.     CALL    PRTN
  662.     JMP    PRTF
  663.  
  664. PRTN:    MVI    B,8
  665. PRTN1:    MOV    A,M        ;PRINT NAME
  666.     CALL    POUT
  667.     DCR    B
  668.     INX    H
  669.     JNZ    PRTN1
  670.     MVI    A,SPACE
  671.     CALL    POUT        ;PRINT A SPACE
  672.     RET
  673.  
  674. ;    UTILITY ROUTINES:
  675.  
  676. ;    GET A CHAR. FROM THE KEYBOARD
  677. ;
  678. GETCHR: MVI    E,0FFH
  679.     MVI    C,DCIO
  680.     CALL    BDOS        ;GET A CHAR.
  681.     ANA    A
  682.     JZ    GETCHR
  683.     RET
  684.  
  685. ;    OUTPUT A CHARACTER TO THE SCREEN
  686. ;
  687. COUT:    PUSH    H
  688.     PUSH    D
  689.     PUSH    B
  690.     PUSH    PSW
  691.     MOV    E,A
  692.     MVI    C,DCIO
  693.     CALL    BDOS
  694.     POP    PSW
  695.     POP    B
  696.     POP    D
  697.     POP    H
  698.     RET
  699.  
  700. POUT:    PUSH    H
  701.     PUSH    D
  702.     PUSH    B
  703.     PUSH    PSW
  704.     MOV    E,A
  705.     MVI    C,LSTOUT
  706.     CALL    BDOS
  707.     POP    PSW
  708.     POP    B
  709.     POP    D
  710.     POP    H
  711.     RET
  712.  
  713. UC:    CPI    'a'
  714.     RC
  715.     CPI    'z'+1
  716.     RNC
  717.     SUI    'a'-'A'
  718.     RET
  719.  
  720. CRLF:    MVI    A,CR
  721.     CALL    COUT
  722.     MVI    A,LF
  723.     JMP    COUT
  724.  
  725. COPY:    MOV    A,M
  726.     STAX    D
  727.     INX    H
  728.     INX    D
  729.     DCR    B
  730.     JNZ    COPY
  731.     RET
  732.  
  733. FILL:    MOV    M,A
  734.     INX    H
  735.     DCR    B
  736.     JNZ    FILL
  737.     RET
  738.  
  739. EXIT:    LXI    D,MSG4
  740.     MVI    C,PRTSTR
  741.     CALL    BDOS
  742. EXIT2:    CALL    GETCHR
  743.     CPI    CR
  744.     JNZ    EXIT2
  745.     JMP    BOOT
  746.  
  747. MSG1:    DB    CR,LF,'DISK LABEL PROGRAM' 
  748.     DB    SPACE,SPACE
  749.     DB    'VERS. 2.1',SPACE,SPACE,'BY JON DART',CR,LF,'$'
  750. MSG2:    DB    CR,LF,'WHAT DRIVE DO YOU WANT TO USE? $'
  751. MSG3:    DB    CR,LF,'INSERT A DISK INTO DRIVE '
  752. DSK:    DB    'A:. TYPE RETURN WHEN READY: $'
  753. MSG4:    DB    CR,LF,CR,LF,'INSERT A BOOTABLE DISK INTO DRIVE A:.',CR,LF
  754.     DB    'TYPE RETURN TO RE-BOOT: $'
  755. MSG5:    DB    CR,LF,'THERE ARE NO FILES ON THIS DISK.',CR,LF,'$'
  756. MSG6:    DB    CR,LF,'FILES ON THIS DISK:',CR,LF,'$'
  757. MSG7:    DB    CR,LF,'ENTER A LINE DESCRIBING THIS DISK (OPTIONAL)',CR,LF
  758. MSG7A:    DB    '-NNNNNNN.NNN:',SPACE
  759.     DB    '$'
  760. MSG8:    DB    CR,LF,'THIS DISK HAS NO NAME FILE.',SPACE,SPACE
  761.     DB    'CREATE ONE (Y OR N):',SPACE,'$'
  762. MSG9:    DB    'ENTER UP TO SEVEN CHARACTERS:',SPACE,'$'
  763. MSG10:    DB    'ENTER A NUMBER (UP TO 3 DIGITS):',SPACE,'$'
  764. MSG11:    DB    CR,LF,'ERROR -- DIRECTORY FULL!',CR,LF,'$'
  765. MSG12:    DB    CR,LF,'DISK LABEL FILE IS: '
  766. DNAME:    DS    8
  767.     DB    '.'
  768.     DS    3
  769.     DB    '. CHANGE IT (Y OR N)? $'
  770. MSG13:    DB    CR,LF,'ERROR -- CAN''T DELETE OLD NAME FILE',CR,LF,'$'
  771. MSG14:    DB    CR,LF,'PRINT A LABEL (Y OR N)? $'
  772.  
  773. LCOUNT: DS    1        ;COUNT OF LINES PRINTED
  774. FCOUNT: DS    1        ;COUNT OF FILES PRINTED ON LINE
  775. TOTAL:    DS    2        ;TOTAL # FILES IN TREE
  776. START:    DS    2
  777. NODE:    DS    2
  778. LASTND: DS    2
  779. FCB:    DS    1
  780. DSKNAM: DS    8        ;DISK NAME FILE (STARTS W. '-')
  781. NUMBUF: DS    3        ;DISK SERIAL NUMBER
  782.     DS    FCB+36-$    ;ROOM FOR FCB
  783. LABFCB: DS    1
  784.     DB    '-??????????'
  785.     DS    LABFCB+36-$
  786.     DS    50
  787. STACK:    DS    0         ;STACK
  788. LINEBUF: DS     0         ;LINE BUFFER (ABOVE PROGRAM)
  789. FLIST    EQU    LINEBUF+80     ;FILE LIST (ABOVE PROGRAM)
  790.     END
  791.     
  792.