home *** CD-ROM | disk | FTP | other *** search
/ CP/M / CPM_CDROM.iso / simtel / sigm / vols100 / vol177 / same.asm < prev    next >
Encoding:
Assembly Source File  |  1994-07-13  |  39.0 KB  |  1,969 lines

  1. ;COMPARE DISK'S FOR SAME FILE'S AND DELETE THEM FROM DISK 2
  2. ; 8-29-83
  3. ;
  4. ; fixes in reverse order
  5. ;    8-29-83
  6. ;    Incorectly put file on destination user under default. Now
  7. ;    put on default user.
  8. ;    ^C abort corrected so it won't lock up at abext2:
  9. ;
  10. ; Portions extracted from
  11. ; CRCK.ASM Version 5.1 (Originally by: Keith Petersen, W8SDZ)
  12. ;           x^16 + x^15 + x^13 + x^7 + x^4 + x^2 + x + 1
  13. ; Commands:   same drive[user]:name.typ drive[user]:name.type [$f,e,n,c,x,w,d]
  14. ;    commas are just used here for diferentiating instrusctions
  15. ;
  16. ;    Options    Descriptionns
  17. ;    $    start options
  18. ;    F    Write compare text to SAMELIST.PRN and crc data
  19. ;        to CRCKLIST.CRC on each disk and default user if
  20. ;        no user selected
  21. ;    E    Erase files that are equal
  22. ;    N    Don't promt operator to erase file
  23. ;    C    Display CRCKLIST.CRC files on console
  24. ;    X    Use existing CRCKLIST.CRC files from selected
  25. ;        user or default user. Uses old crc generation if
  26. ;        old CRCKLIST.CRC encounteredss
  27. ;    W    Wait and promt operator for disk change
  28. ;    D    Default to F,N,X,W options
  29. ; Examples:
  30. ; same a: b: compare all file's all user's on a: to same on b:
  31. ; same a0: b0: compare all file's user 0 on a: to same on b:
  32. ; same a:*.asm b:*.asm $fwn
  33. ; I found that i had many disks with the same files on them. Long ago
  34. ; I had put together a basic program to compare out of sequence CRCKLIST.CRC
  35. ; files and list out same files, the basic program took quite a while to
  36. ; compare the data so i put this together just for fun. I started thinking
  37. ; of all kinds of neet options to put in it, shortly it got out of hand. The
  38. ; original file comparison formating does not look the best but it tells
  39. ; the operator what he was after to start with.
  40. ;
  41. ; Any questions or fixes please send then to
  42. ; Joe Cutler
  43. ; 2340 Alice Ann Rd.
  44. ; Newbury Park,CA.
  45. ; (805) 498-1141
  46. ;
  47. ; I'm also periodicaly on Trevors RBBS
  48. ; (805) 492-5472
  49. ; define true and false
  50. false    equ    0
  51. true    equ    not false
  52. ; define write buffer size (presently set for 8k)
  53. bsize    equ    8*1024    ; disk write buffer size
  54. ; bdos equates
  55. rdcon    equ    1
  56. wrcon    equ    2
  57. dcon    equ    6
  58. cstat    equ    11
  59. open    equ    15
  60. close    equ    16
  61. srchf    equ    17
  62. srchn    equ    18
  63. delet    equ    19
  64. read    equ    20
  65. write    equ    21
  66. make    equ    22
  67. renam    equ    23
  68. stdma    equ    26
  69. ;
  70. bdos    equ    5
  71. ;
  72. fcb    equ    5ch 
  73. fcbext    equ    fcb+12
  74. fcbrno    equ    fcb+32
  75. fcb2    equ    6ch
  76. ;
  77. tbuf    equ    80h; temporary buffer (default) address
  78. buf$siz    equ    80h    ; buffer size (128 bytes)
  79. ;
  80. sfilesiz    equ    2000h
  81. ;
  82. CR    EQU    0DH
  83. LF    EQU    0AH
  84. TAB    EQU    9
  85. eof    equ    'Z'-40h    ; end-of-file character
  86. ;
  87. ; CCIT CRC polynomial mask bytes
  88. ;
  89. himsk    equ    0a0h    ; high mask byte
  90. lomsk    equ    097h    ; low mask byte
  91. FBUFF    EQU    80H
  92. FLEN    EQU    16    ;FILE BUFFER LENGTH
  93. ;
  94. TRUE    EQU    -1
  95. FALSE    EQU NOT TRUE
  96. ;
  97. SIZE    EQU    FALSE
  98. ;
  99.     ORG    0100H
  100. START:    LXI    SP,STACK;SET UP NEW STACK
  101.     xra    a
  102.     sta    active
  103.     LDA    FBUFF    ;SEE IF ANYTHING SELECTED
  104.     ORA    A
  105.     JZ    HELP    ;NO
  106.     lxi    d,signon;tell them we're here
  107.     call    print
  108.     CALL    GLOOK    ;GENERATE FAST CRC LOOKUP TABLE
  109.     LXI    D,FBUFF+1;INPUT STRING
  110.     LXI    H,SFCB    ;SOURCE FCB
  111.     CALL    MAKFCB
  112.     JC    BADFCB    ;ERROR
  113.     MOV    A,B    ;GET USER #
  114.     STA    SUSER    ;SAVE SOURCE USER
  115.     LXI    H,DFCB    ;DESTINATION FCB
  116.     CALL    MAKFCB
  117.     JC    BADFCB    ;ERROR
  118.     MOV    A,B    ;GET USER #
  119.     STA    DUSER    ;DESTINATION USER
  120.     LXI    H,SFCB+1;FILENAME
  121.     LDA    SFCB+9    ;TYPE
  122.     ORA    M    ;SEE IF NO FILE SELECTED
  123.     CPI    ' '
  124.     CZ    FILLFCB    ;FILL FCB NAME.TYPE WITH ?
  125.     LXI    H,DFCB+1;FILENAME
  126.     LDA    DFCB+9    ;TYPE
  127.     ORA    M    ;SEE IF NO FILE SELECTED
  128.     CPI    ' '
  129.     CZ    FILLFCB    ;FILL FCB NAME.TYPE WITH ?
  130. ;
  131.     CALL    DECOPT    ;DECODE OPTIONS
  132. ;
  133.     LDA    SFCB    ;SOURCE DISK
  134.     DCR    A    ;DIRECT SELECT
  135.     JP    GETD
  136.     JNZ    GETD
  137.     MVI    C,25    ;GET LOGGED IN DISK
  138.     CALL    BDOS
  139. GETD:    STA    SDISK    ;SOURCE DISK
  140.     MOV    C,A    ;SAVE SOURCE DISK
  141.     LDA    DFCB    ;DESTINATION DISK
  142.     DCR    A    ;ACTUAL SELECT
  143.     JP    CMPD    ;DIRECT SELECTED
  144.     MVI    C,25    ;GET LOGGED IN DISK
  145.     CALL    BDOS
  146. CMPD:    STA    DDISK    ;SET UP AS DESTINATION ALSO
  147.     CMP    C    ;SAME DISK?
  148.     JNZ    GETU    ;NO GET USER #
  149.     LDA    SUSER
  150.     LXI    H,DUSER
  151.     CMP    M
  152.     JZ    SAMDSK    ;SAME DISK AND USER
  153. GETU:    MVI    E,0FFH    ;GET USER #
  154.     MVI    C,32
  155.     CALL    BDOS
  156.     STA    OLDUSR    ;OLD USER #
  157.     LDA    SUSER    ;SOURCE USER
  158.     STA    SFCB    ;SET IN FCB FOR COMPARE
  159.     LDA    DUSER    ;DESTINATIN USER
  160.     STA    DFCB    ;SET IN FCB FOR COMPARE
  161. ;LOGIN IN SELECTED DRIVES
  162.     CALL    LOGIN    ;LOG IN DISKS
  163. ;GET FILES FROM SOURCE DISK
  164.     LXI    H,NAMBUF
  165.     SHLD    SBUFF    ;SOURCE BUFFER
  166.     LDA    SDISK    ;SELECT SOURCE DISK
  167.     XCHG
  168.     LXI    H,SFCB    ;SOURCE FCB
  169.     CALL    SFILES    ;SET UP FILES
  170.     JC    NOFILE    ;NO FILES THERE
  171.     LHLD    NAMPTR    ;GET POINTER
  172.     SHLD    DBUFF    ;SET UP DESTINATION BUFFER
  173.     LHLD    ACT$CRCK;CRCKLIST.CRC FILE FLAGS
  174.     SHLD    S$ACT    ;SET SOURCE ACTIVE FLAGS
  175.     CALL    NSORT    ;SORT NAMES
  176.     JC    NSAME    ;DIFFERENT USER HAS SAME FILE NAME.TYPE
  177. ;GET FILES FROM DESTINATION DISK
  178.     LHLD    DBUFF    ;DESTINATION BUFFER POINTER
  179.     XCHG
  180.     LXI    H,DFCB    ;DESTINATION FCB
  181.     LDA    DDISK    ;SELECT DESTINATION DISK
  182.     CALL    SFILES    ;SET UP FILES
  183.     JC    NOFILE    ;NO DESTINATION FILES
  184.     LHLD    NAMPTR    ;END OF DESTINATION BUFFER
  185.     SHLD    EDBUFF
  186.     LHLD    ACT$CRCK;CRCKLIST.CRC FILE FLAGS
  187.     SHLD    D$ACT    ;SET DESTINATION ACTIVE FLAGS
  188.     CALL    NSORT    ;SORT FILES
  189.     JC    NSAME    ;DIFFERENT USER HAS SAME FILE NAME.TYPE
  190. ;COMPARE FILES FROM BOTH DISKS
  191.     CALL    CFILES    ;COMPARE FILES
  192. ;
  193.     LXI    D,WAIT?    ;WAIT FOR KEYBOARD
  194.     CALL    PRINT
  195.     MVI    C,1    ;GET CHARACTER
  196.     CALL    BDOS
  197. ;
  198.     CALL    DFILES    ;DISPLAY FILE COMPARES
  199. ;
  200.     CALL    ERASE    ;ERASE SAME FILES
  201. ;
  202.     CALL    DISPCRC    ;WRITE CRC DATA
  203. ;
  204.     LXI    D,DONE    ;THATS ALL FOLKS
  205.     LDA    WFLAG    ;WAIT IN PROGRESS
  206.     ORA    A
  207.     JZ    ERROR    ;NO ERROR BUT NORMAL RETURN
  208.     LXI    D,FWAIT    ;WAIT FOR SYSTEM DISK
  209.     CALL    PRINT
  210.     MVI    C,1    ;WAIT FOR RESPONSE
  211.     CALL    BDOS
  212.     JMP    RETURN
  213. ;LOGIN IN SELECTED DRIVES
  214. LOGIN:    LDA    SDISK
  215.     ORA    A    ;DISK A
  216.     JZ    WLOGIN
  217.     LDA    DDISK
  218.     ORA    A    ;DISK A ?
  219.     JZ    WLOGIN
  220.     CALL    RLOGIN    ;RE-LOGIN SYSTEM
  221. WLOGIN:    LDA    WFLAG    ;WAIT FOR OPERATOR RESPONSE
  222.     ORA    A
  223.     JZ    RLOGIN    ;YES
  224.     LXI    D,WAIT    ;WAIT MESSAGE
  225.     CALL    PRINT
  226.     MVI    C,1    ;ANY CHARACTER
  227.     CALL    BDOS
  228. RLOGIN:    MVI    C,13    ;RESET DISK SYSTEM
  229.     CALL    BDOS
  230.     RET
  231. ;GET FILES IN BUFFER
  232. ;HL=FILE NAME COMPARE BUFFER,A=DISK
  233. SFILES:    SHLD    CMPFCB    ;COMPARE FCB POINTER
  234.     XCHG
  235.     SHLD    BUFF    ;BUFFER POINTER
  236.     MOV    E,A
  237.     MVI    C,14
  238.     CALL    BDOS    ;LOG IN NEW DISK
  239.     LXI    H,0    ;RESET FILE COUNT
  240.     SHLD    NAMCNT
  241.     CALL    GETSAME    ;GET FILES
  242.     CMC
  243.     RNC        ;GOT FROM CRCKLIST.CRC
  244.     MVI    A,'?'    ;SET UP USER FCB
  245.     STA    UFCB
  246.     MVI    C,17    ;SEARCH FOR FIRST
  247.     LXI    D,UFCB    ;ALL USER SEARCH
  248.     CALL    BDOS
  249.     CPI    -1    ;NO FILES THERE
  250.     STC        ;SET UP FOR NO FILE
  251.     RZ
  252.     JMP    GOTFILE
  253. SNFILE:    MVI    C,18    ;NOW NEXT FILE
  254.     CALL    BDOS
  255.     CPI    -1    ;NO MORE FILES
  256.     JNZ    GOTFILE    ;FILE HERE
  257.     LHLD    NAMCNT    ;ANY FILES IN BUFFER
  258.     MOV    A,H
  259.     ORA    L
  260.     RNZ        ;YES
  261.     STC        ;NO, ERROR RETURN
  262.     RET        ;THATS ALL FOLKS
  263. GOTFILE:
  264.     ADD    A    ;COMPUTE OFFSET TO NAME
  265.     ADD    A
  266.     ADD    A
  267.     ADD    A
  268.     ADD    A
  269.     MOV    E,A
  270.     MVI    D,0
  271.     LXI    H,FBUFF
  272.     DAD    D
  273.     XCHG
  274.     LDAX    D    ;SEE IF NUL FILES
  275.     CPI    0E5H
  276.     JZ    SNFILE    ;YES NULL
  277.     PUSH    D    ;SAVE NAME POINTER
  278.     LHLD    CMPFCB    ;NAME POINTER
  279.     MVI    B,13    ;USER #,FILENAME.TYPE,EXTENT
  280.     XCHG
  281.     CALL    NCOMP    ;COMPARE NAMES
  282.     POP    D
  283.     JNZ    SNFILE    ;NOT SAME FILE NAME
  284.     LHLD    NAMPTR    ;GET PRESENT NAME POINTER
  285.     MVI    M,0    ;PRESET FILE STATUS FLAG
  286.     INX    H
  287.     MVI    B,12    ;GET FILE NAME
  288.     CALL    MOVE
  289.     XRA    A
  290.     MOV    M,A
  291.     INX    H    ;FILE LENGTH BUFFER
  292.     MOV    M,A
  293.     INX    H
  294.     MOV    M,A
  295.     INX    H
  296.     SHLD    NAMPTR    ;SAVE FOR NEXT NAME
  297.     LHLD    NAMCNT    ;NAME COUNTER
  298.     INX    H
  299.     SHLD    NAMCNT
  300.     JMP    SNFILE    ;TRY NEXT FILE
  301. ;
  302. NCOMP:    LDAX    D    ;FROM ADDRESS
  303.     CPI    '?'    ;ANY CHARACTER
  304.     JZ    NCOMP0
  305.     CMP    M
  306.     RNZ        ;NOT SAME ERROR
  307. NCOMP0:    INX    D    ;INCREMENT POINTER
  308.     INX    H
  309.     DCR    B    ;COUNTER
  310.     JNZ    NCOMP    ;KEEP COMPAREING
  311.     RET
  312. ;
  313. ;SORT NAMES IN BUFFER
  314. ;
  315. NSORT:    XRA    A    ;RESET MULTIPLE FILES FLAG
  316.     STA    MFILES
  317.     LXI    D,SORTING
  318.     CALL    PRINT
  319.     MVI    C,-1    ;JUST FOR FIRST PASS
  320. NEXTS:    MOV    A,C    ;GET SWAPPED FLAG
  321.     ORA    A
  322.     JZ    NSORT$END;DIDN'T SWAP, END OF SORT
  323.     LHLD    NAMCNT    ;# OF FILES IN BUFFER
  324.     DCX    H    ;DECRIMENT COUNT
  325.     SHLD    NAMCNT
  326.     MOV    A,H    ;TEST FOR 0
  327.     ORA    L
  328.     JZ    NSORT$END
  329.     PUSH    H
  330.     MVI    C,0    ;INITIALIZE SWAPPED FLAG
  331. ;
  332. ;PASS THRU THE BUFF, SORTING IT.
  333. ;
  334.     LHLD    BUFF    ;GET BUFFER POINTER
  335.     XCHG
  336. COMPR:    LXI    H,FLEN    ;NAME LENGHT
  337.     DAD    D
  338.     PUSH    D
  339.     PUSH    H
  340.     INX    H    ;GET PAST FLAG AND USER
  341.     INX    H
  342.     INX    D
  343.     INX    D
  344.     MVI    B,11    ;COMPARE LENGTH
  345. CLCLP:    LDAX    D
  346.     CMP    M
  347.     JC    NEXTC    ;first name smaller
  348.     JNZ    DIFF
  349. SAME:    INX    D
  350.     INX    H
  351.     DCR    B
  352.     JNZ    CLCLP
  353.     MVI    A,-1    ;SET MULITPLE FILE FLAG
  354.     STA    MFILES
  355.     POP    H
  356.     POP    D
  357.     LDAX    D    ;GET PREVIOS FLAG
  358.     ORA    A
  359.     JNZ    NEXTC1    ;ALREADY DISPLAYED
  360.     PUSH    D    ;SAVE AGAIN
  361.     PUSH    H
  362.     PUSH    B    ;SAVE SWAPPED FLAG
  363.     SHLD    SSFCB
  364.     XCHG
  365.     SHLD    SDFCB
  366.     MVI    A,0010$0000B
  367.     ORA    M    ;OR IN FLAG
  368.     MOV    M,A
  369.     LDAX    D    ;GET EXISTING FLAG
  370.     ORI    0010$0000B
  371.     STAX    D    ;SET UP DISPLAYED FLAG
  372.     INX    D    ;GET TO USER #
  373.     INX    H
  374.     LDAX    D    ;SECOUND USER #
  375.     MOV    L,M    ;FIRST USER #
  376.     MOV    H,A
  377.     CALL    DFNAME    ;DISPLAY FILE NAME
  378.     POP    B    ;GET SWAPPED FLAG BACK
  379. NEXTC║    PO╨    H
  380.     POP    D
  381. NEXTC1:    XCHG
  382. NEXTC2:    POP    H    ;FILE COUNT
  383.     DCX    H
  384.     MOV    A,H    ;END OF LOOP
  385.     ORA    L
  386.     JZ    NEXTS    ;COMPLETED PASS THRU BUFF
  387.     PUSH    H    ;SAVE COUNT
  388.     JMP    COMPR    ;CHECK NEXT 2
  389. ;
  390. ;UNEQUAL COMPARE
  391. ;
  392. DIFF:    POP    H
  393.     POP    D    ;GET POINTERS
  394. ;SWAP
  395.     MVI    B,FLEN
  396. SWAP:    MOV    C,M
  397.     LDAX    D
  398.     MOV    M,A
  399.     MOV    A,C
  400.     STAX    D
  401.     INX    D
  402.     INX    H
  403.     DCR    B
  404.     JNZ    SWAP
  405.     MVI    C,-1    ;SET SWAPED FLAG
  406.     JMP    NEXTC2
  407. NSORT$END:
  408.     LDA    MFILES    ;MULTIPLE FILES
  409.     INR    A    ;SET CARRY IF MULTIPLE FILES
  410.     RET
  411. ;
  412. ;COMPARE SOURCE AND DESTINATION FILE BUFFERS
  413. ;
  414. CFILES:    XRA    A    ;SET UP PASS COUNT
  415.     STA    CPASS
  416. CMPASS:    LDA    CPASS    ;WHICH PASS
  417.     INR    A
  418.     STA    CPASS
  419.     IF    SIZE
  420.     CPI    4    ;# OF PASSES
  421.     ELSE
  422.     CPI    3    ;# OF PASSES
  423.     ENDIF
  424.     RNC        ;ALL DONE
  425.     ANI    1    ;TEST FOR WHICH DISK TO SELECT
  426.     LDA    SDISK    ;SELECT SOURCE DISK
  427.     JZ    CDISK    ;SELECT DISK
  428.     LDA    DDISK    ;SELECT DESTINATION DISK
  429. CDISK:    MOV    E,A
  430.     MVI    C,14    ;SELECT DISK
  431.     CALL    BDOS
  432.     LHLD    SBUFF    ;SOURCE BUFFER
  433.     SHLD    SSBUFF    ;SEARCH SOURCE BUFFER
  434.     LHLD    DBUFF    ;DESTINATIN BUFFER
  435.     SHLD    SDBUFF    ;SEARCH DESTINATION BUFFER
  436. CNFILE:    LHLD    SSBUFF    ;SEE IF END
  437.     XCHG
  438.     LHLD    DBUFF    ;SEE IF END OF BUFFER
  439.     CALL    SUBDHC
  440.     JNC    CMPASS    ;NEXT PASS
  441.     LHLD    SDBUFF    ;DESTINION BUFFER
  442.     XCHG
  443.     LHLD    EDBUFF    ;END DBUFF
  444.     CALL    SUBDHC
  445.     JNC    CMPASS    ;NEXT PASS
  446.     LHLD    SSBUFF    ;SOURCE BUFFER
  447.     CALL    CFILE    ;COMPARE FILE
  448.     JZ    FEQU    ;FILE NAMES EQUAL
  449.     JC    INCD    ;INCREMENT DESTINATION
  450.     LXI    D,FLEN    ;NAME BUFFER LENGTH
  451.     DAD    D
  452.     SHLD    SSBUFF
  453.     JMP    CNFILE    ;LOOP ON COMPARE
  454. INCD:    LXI    H,FLEN    ;NAME BUFFER LENGTH
  455.     DAD    D
  456.     SHLD    SDBUFF
  457.     JMP    CNFILE    ;LOOP ON COMPARE
  458. FEQU:    SHLD    SSFCB
  459.     XCHG
  460.     SHLD    SDFCB
  461.     PUSH    D
  462.     LXI    D,FLEN    ;NAME BUFFER LENGTH
  463.     DAD    D
  464.     SHLD    SDBUFF    ;NEW DESTINAITION BUFFER
  465.     POP    H
  466.     DAD    D
  467.     SHLD    SSBUFF    ;NEW SOURCE BUFFER
  468.     LHLD    SSFCB    ;SEE IF ALREADY NO COMPARE
  469.     MOV    A,M
  470.     ANI    0100$0000B;ALREADY NOT COMPARED
  471.     JNZ    CNFILE    ;YES
  472.     LDA    CPASS    ;COMPARE PASS
  473.     DCR    A    ;FIRST PASS
  474.     JZ    CPASS1
  475.     IF    SIZE
  476.     DCR    A    ;SECOUND PASS
  477.     JZ    CPASS2
  478. CPASS3:    LHLD    SDFCB    ;SET SOURCE FILE
  479.     SHLD    CRCFCB    ;SOURCE NAME POINTER
  480.     CALL    GENCRC    ;GENERATE CRC FOR FILE
  481.     JMP    CSIZE
  482. CPASS1:    LHLD    SDFCB    ;SOURCE FILE NAME
  483.     CALL    SETSIZE    ;SET FILE SIZE
  484.     JMP    CNFILE    ;LOOP ON COMPARE
  485. CPASS2:    LHLD    SSFCB    ;DESTINATION FILE NAME
  486.     SHLD    CRCFCB    ;SET UP POINTER
  487.     CALL    SETSIZE    ;SET FILE SIZE
  488. CSIZE:    LXI    B,13    ;OFFSET TO SIZE
  489.     LHLD    SDFCB    ;DESTINATION NAME
  490.     DAD    B
  491.     XCHG
  492.     LHLD    SSFCB    ;SOURCE NAME
  493.     DAD    B
  494.     MVI    B,3    ;LENGTH OF COMPARE
  495. CMPSIZE:
  496.     LDAX    D    ;DESTINATION
  497.     CMP    M
  498.     JNZ    FNEQU    ;NOT EQU
  499.     INX    D    ;INCREMENT POINTERS
  500.     INX    H
  501.     DCR    B
  502.     JNZ    CMPSIZE    ;STILL SAME
  503.     LDA    CPASS    ;ONLY ON PASS 1
  504.     CPI    2
  505.     JNZ    CNFILE    ;ONLY GENERATE ON SECOUND PASS
  506.     CALL    GENCRC    ;DESTINATION CRC
  507.     JMP    CNFILE    ;LOOP ON COMPARE
  508.     ELSE
  509. CPASS2:    LHLD    SSFCB    ;DESTINATION FILE NAME
  510.     SHLD    CRCFCB    ;SET UP POINTER
  511.     CALL    GENCRC    ;GENERATE CRC FOR FILE
  512.     LXI    B,13    ;OFFSET TO CRC
  513.     LHLD    SDFCB    ;DESTINATION NAME
  514.     DAD    B
  515.     XCHG
  516.     LHLD    SSFCB    ;SOURCE NAME
  517.     DAD    B
  518.     MVI    B,3    ;LENGTH OF COMPARE
  519. CMPSIZE:
  520.     LDAX    D    ;DESTINATION
  521.     CMP    M
  522.     JNZ    FNEQU    ;NOT EQU
  523.     INX    D    ;INCREMENT POINTERS
  524.     INX    H
  525.     DCR    B
  526.     JNZ    CMPSIZE    ;STILL SAME
  527.     JMP    CNFILE    ;LOOP ON COMPARE
  528. CPASS1:    LHLD    SDFCB    ;SET SOURCE FILE
  529.     SHLD    CRCFCB    ;SOURCE NAME POINTER
  530.     CALL    GENCRC    ;GENERATE CRC FOR FILE
  531.     JMP    CNFILE
  532.     ENDIF
  533. ;
  534. FNEQU:    LHLD    SSFCB    ;GET SOURCE FILE POINTER
  535.     MOV    A,M    ;GET FLAG
  536.     ANI    0011$1111B;MASK OUT EQU
  537.     ORI    0100$0000B;NOT EQU BIT
  538.     MOV    M,A
  539.     LHLD    SDFCB
  540.     MOV    A,M    ;GET FLAG
  541.     ANI    0011$1111B;MASK OUT EQU
  542.     ORI    0100$0000B;NOT EQU BIT
  543.     MOV    M,A
  544.     JMP    CNFILE    ;LOOP ON COMPARE
  545. ;
  546. CFILE:    PUSH    H    ;SOURCE
  547.     PUSH    D    ;DESTINATION
  548.     MVI    B,11    ;COMPARE LENGTH
  549.     INX    H
  550.     INX    H
  551.     INX    D
  552.     INX    D
  553. COMP:    LDAX    D
  554.     CMP    M
  555.     JNZ    CMPEND
  556.     INX    D
  557.     INX    H
  558.     DCR    B
  559.     JNZ    COMP    ;KEEP COMPARING
  560. CMPEND:    POP    D    ;DESTINATIN
  561.     POP    H
  562.     RNZ        ;NOT SAME FILES
  563.     INX    D    ;GET TO USER
  564.     LDAX    D    ;GET DESTINATION USER #
  565.     ORI    1000$0000B;SET ACTIVE FLAG
  566.     MOV    B,A
  567.     MOV    A,M    ;GET EXISTING FLAG
  568.     ANI    0100$0000B;SEE IF ALREADY NON-ZERO
  569.     JNZ    CMPN
  570.     MOV    A,B
  571.     ORA    M    ;OR IN FLAGS
  572.     MOV    M,A
  573. CMPN:    DCX    D
  574.     INX    H    ;GET TO USER
  575.     MOV    A,M
  576.     ORI    1000$0000B;SET ACTIVE FLAG
  577.     MOV    B,A
  578.     LDAX    D    ;GET EXISTING FLAG
  579.     ANI    0100$0000B;SEE IF ALREADY NON-ZERO
  580.     JNZ    CMPL    ;YES
  581.     LDAX    D
  582.     ORA    B
  583.     STAX    D    ;SET FLAG
  584. CMPL:    DCX    H
  585.     XRA    A    ;RESET CARRY
  586.     RET
  587.     IF    SIZE
  588. ;GET FILE SIZE
  589. SETSIZE:
  590.     CALL    SETFCB    ;SET UP USER AND LFCB
  591.     PUSH    D    ;SAVE SIZE POINTER
  592.     LXI    D,LFCB
  593.     MVI    C,35    ;COMPUTE FILE SIZE
  594.     CALL    BDOS
  595.     POP    H    ;GET NAME POINTER BACK
  596.     LXI    D,LFCB+33;GET FILE SIZE
  597.     MVI    B,3
  598.     CALL    MOVE    ;MOVE TO NAME
  599.     RET
  600.     ENDIF
  601. ;
  602. SETFCB:    INX    H    ;GET TO USER #
  603.     MOV    A,M
  604.     PUSH    H    ;SAVE POINTER
  605.     CALL    SETUSR
  606.     POP    D
  607.     INX    D    ;GET TO FILE NAME
  608.     LXI    H,LFCB+1
  609.     MVI    B,11
  610.     CALL    MOVE
  611.     XRA    A
  612.     STA    LFCB+12    ;EXTENT
  613.     STA    LFCB+15    ;RC
  614.     STA    LFCB+32    ;CR
  615.     RET
  616. ;
  617. setfile:
  618.     lda    fflag    ; get option
  619.     sta    active    ;active flag
  620.     ora    a    ; file wanted?
  621.     rz        ; no, skip file init
  622.     push    h    ;save user
  623.     push    d    ;save pointer
  624.     lxi    h,fcbfinal+1;file to delete
  625.     mvi    b,11    ;move full name
  626.     call    move
  627.     lxi    h,samfcb+1;file name
  628.     pop    d
  629.     mvi    b,8    ;just move filename
  630.     call    move
  631.     mov    e,c    ;get disk
  632.     mvi    c,14    ;select disk
  633.     call    bdos
  634.     pop    psw    ;get user #
  635.     cpi    '?'    ;default user
  636.     jnz    setf0    ;no
  637.     lda    oldusr    ;default user
  638. setf0:    call    setusr    ;set up for default user
  639.     xra    a
  640.     sta    samfcb+12    ; clear extent
  641.     sta    samfcb+32    ; clear current record count
  642.     lxi    h,sfilesiz    ; set buffer size
  643.     shld    sfilelen
  644.     lxi    h,0        ; set next to fill
  645.     shld    sfileptr
  646.     mvi    c,delet        ; delete file function
  647.     lxi    d,samfcb    ; delete 'old' crcklist file
  648.     call    bdos
  649.     mvi    c,make        ; make file function
  650.     lxi    d,samfcb    ; make 'new' crcklist file
  651.     call    bdos
  652.     inr    a        ; make ok?
  653.     rnz            ;yes
  654.     lxi    d,dir$full    ; indicate that directory is full
  655.     call    print
  656.     jmp    filerr
  657. ;
  658. putsfile:
  659. ;
  660.     push    psw        ; save output character
  661.     lda    active        ;see if active
  662.     ora    a
  663.     jz    noput        ;not active
  664.     lhld    sfilelen    ; get current buffer length
  665.     xchg            ; de has length
  666.     lhld    sfileptr    ; load next to get/put to hl
  667.     mov    a,l        ; compute current length
  668.     sub    e     
  669.     mov    a,h
  670.     sbb    d        ; carry if next < length
  671.     jc    putcrc4        ; carry if length > current
  672.     lxi    h,0        ; end of buffer, fill (empty) buffers    
  673.     shld    sfileptr    ; clear next to get/put
  674. ;
  675. putcrc1:            ; process next disk sector
  676. ;
  677.     xchg            ; file pointer to de
  678.     lhld    sfilelen    ; hl is maximum buffer length
  679.     mov    a,e        ; compute next length
  680.     sub    l        ; to get carry, if more fill
  681.     mov    a,d
  682.     sbb    h        
  683.     jnc    putcrc3
  684.     lhld    sfileadr    ; got carry, more to fill yet
  685.     dad    d        ; hl is next buffer address
  686.     xchg
  687.     mvi    c,stdma        ; set dma address
  688.     call    bdos
  689.     lxi    d,samfcb    ; fcb address to de
  690.     mvi    c,write        ; file write
  691.     call    bdos
  692.     ora    a        ; check return code
  693.     jnz    putcrc2        ; end-of-file yet?
  694.     lxi    d,buf$siz    ; not eof, increment length by 128
  695.     lhld    sfileptr    ; next to fill
  696.     dad    d
  697.     shld    sfileptr    ; save new pointer
  698.     jmp    putcrc1        ; process another sector
  699. ;
  700. putcrc2:            ; got end-of-file
  701. ;
  702.     lxi    d,dsk$full    ; disk is full
  703.     call    print
  704.     pop    psw        ; clean stack
  705.     jmp    filerr        ; file error, exit
  706. ;
  707. putcrc3:            ; end of buffer, reset dma and pointer
  708. ;
  709.     lxi    d,tbuf        ; point to temporary buffer
  710.     mvi    c,stdma        ; set dma function
  711.     call    bdos
  712.     lxi    h,0        ; reset pointer for next to get
  713.     shld    sfileptr
  714. ;
  715. putcrc4:            ; process the next character
  716. ;
  717.     xchg            ; index to get/put in de
  718.     lhld    sfileadr    ; base of buffer
  719.     dad    d        ; address of character in hl
  720.     xchg            ; and swap to de
  721.     pop    psw        ; get save character
  722.     stax    d        ; character to buffer
  723.     lhld    sfileptr    ; index to get/put
  724.     inx    h        ; and update for next character
  725.     shld    sfileptr
  726.     ret
  727. ;
  728. noput:    pop    psw        ;get character back
  729.     ret
  730. ; close crcklist.$$$
  731. ;
  732. closecrc:
  733. ;
  734.     lda    active    ;see if file active
  735.     ora    a
  736.     rz        ;yes
  737. close0:    lhld    sfileptr
  738.     mov    a,l
  739.      ani    07fh
  740.     jnz    close1
  741.     shld    sfilelen
  742. close1:    mvi    a,eof
  743.     push    psw
  744.     call    putsfile
  745.     pop    psw
  746.     jnz    close0
  747.     xra    a
  748.     sta    active    ;clear active flag
  749.     mvi    c,close
  750.     lxi    d,samfcb
  751.     call    bdos
  752.     inr    a
  753.     jnz    cerase
  754.     lxi    d,no$close
  755.     call    print
  756. ; erase any existing old file
  757. ;
  758. cerase:    mvi    c,delet
  759.     lxi    d,fcbfinal
  760.     call    bdos
  761. ; rename crcklist.$$$ to crcklist.crc
  762. ;
  763.     lxi    h,samfcb
  764.     lxi    d,fcbfinal
  765.     push    h
  766.     lxi    b,16
  767.     dad    b
  768. ;
  769. mov$name:
  770. ;
  771.     ldax    d
  772.     mov    m,a
  773.     inx    d
  774.      inx    h
  775.     dcr    c
  776.     jnz    mov$name
  777.     pop    d
  778.     mvi    c,renam
  779.     call    bdos
  780.     ret
  781. ;
  782. gencrc:
  783.     lhld    crcfcb    ;get file name pointer
  784.     mov    a,m    ;get flag byte
  785.     ani    0001$0000b;see if crc already generated
  786.     rnz        ;yes
  787. ; open the file
  788. ;
  789.     call    setfcb
  790.     lxi    d,lfcb
  791.     mvi    c,open
  792.     call    bdos
  793.     inr    a
  794.     jnz    rdinit
  795.     call    abexit
  796.     db    '++Open Failed++$'
  797. ; initialize crc to zero and set bufad to cause initial read
  798. ;
  799. rdinit:    lxi    h,0
  800.      shld    rem    ; init remainder to zero
  801.     lxi    h,100h
  802.     shld    bufad    ; init buffer adrs
  803. ; this is the read loop
  804. ;
  805. readit:    lhld    bufad
  806.     mov    a,h    ; time to read?
  807.     ora    a
  808.     jz    nord    ; no read
  809.     mvi    e,-1    ; get console status/character
  810.     mvi    c,dcon
  811.     call    bdos    ; check for operator abort
  812.     cpi    'C'-40h    ; control c?
  813.     jz    abext2    ; yes exit
  814. read2:    lxi    d,lfcb
  815.     mvi    c,read    ; read another sector of file
  816.     call    bdos
  817.     ora    a    ; check return code
  818.     jnz    finish    ; error or eof
  819.     lxi    h,tbuf    ; buffer location
  820. nord:    lda    crctype
  821.     cpi    ' '    ;delimeter for old crck.com
  822.     mov    a,m    ; get file character
  823.     inx    h
  824.     shld    bufad
  825.     lhld    rem    ; pick up the partial remainder
  826.     jz    oldcrc
  827. ; table lookup method for crc generation
  828. ;
  829.     xchg        ; de now has the partial
  830.     mvi    b,0
  831.     xra    d
  832.     mov    c,a
  833.     lxi    h,hitab
  834.     dad    b
  835.     mov    a,m
  836.     xra    e
  837.     mov    d,a
  838.     inr    h
  839.     mov    e,m
  840.     xchg
  841.     shld    rem
  842.     jmp    readit    ; go read more characters
  843. ;old crck.com crc generation
  844. ;'a' the character to be crc'd
  845. oldcrc:    mov    c,a    ;save new byte
  846.     mov    a,h
  847.     ani    80h
  848.     push    psw
  849.     dad    h
  850.     mov    a,c
  851.     add    l
  852.     mov    l,a
  853.     pop    psw
  854.     jz    ocend
  855.     mov    a,h
  856.     xri    himsk
  857.     mov    h,a
  858.     mov    a,l
  859.     xri    lomsk
  860.     mov    l,a
  861. ocend:    shld    rem
  862.     jmp    readit    ; go read more characters
  863. ;
  864. finish:    cpi    1    ; normal end-of-file?
  865.     jnz    filerr    ; no, it was a read error
  866.     lhld    rem    ; get crc
  867.     xchg
  868.     lhld    crcfcb    ; get name pointer
  869.     mov    a,m    ;get atributes
  870.     ori    0001$0000b;set crc generated bit
  871.     mov    m,a
  872.     lxi    b,13    ; offset to length
  873.     dad    b
  874.     mov    m,e
  875.     inx    h
  876.     mov    m,d
  877.     inx    h
  878.     mvi    m,0    ;set to 0
  879.     ret
  880. filerr:    call    abexit    ; abort because of file read error
  881.     db    '++File Read Error++$'
  882. ;
  883. ; generate the lookup table for fast crc
  884. ;
  885. glook:    lxi    h,hitab
  886.     mvi    c,0    ; the table index
  887. gloop:    xchg
  888.     lxi    h,0    ; init the crc
  889.     mov    a,c
  890.     call    lcrc
  891.     xchg        ; de now has the crc, hl pointing into table
  892.     mov    m,d    ; store the high byte of crc
  893.     inr    h
  894.     mov    m,e    ; store the low byte
  895.     dcr    h
  896.     inx    h    ; move to next table entry
  897.     inr    c    ; next index
  898.     jnz    gloop
  899.     ret
  900. ;
  901. ;  hl contains the partial, 'a' the character to be crc'd
  902. lcrc:    push    b
  903.     mvi    b,8
  904.     xra    h
  905.     mov    h,a
  906. loop:    dad    h
  907.     jnc    skip
  908.     mvi    a,himsk
  909.     xra    h
  910.     mov    h,a
  911.     mvi    a,lomsk
  912.     xra    l
  913.     mov    l,a
  914. skip:    dcr    b
  915.     jnz    loop
  916.     pop    b
  917.     ret
  918. ;
  919. ;
  920. ; send carriage return, line feed to output
  921. crlf:    mvi    a,cr    ; carriage return
  922.     call    outchr
  923.     mvi    a,lf    ; line feed, fall into 'type'
  924.     call    outchr
  925.     xra    a
  926.     ret
  927. ; send character in a register to output
  928. outchr:    push    b
  929.     push    d
  930.     push    h
  931.     ani    7fh    ; strip parity bit
  932.     mov    e,a
  933.     push    d
  934.     call    putsfile; write to file if requested
  935.     pop    d
  936.     lda    cflag    ;console flag
  937.     ora    a
  938.     mvi    c,wrcon    ; send character to console
  939.     cnz    bdos
  940.     pop    h
  941.     pop    d
  942.     pop    b
  943.     ret
  944. ;
  945. ;
  946. ; aborted - print reason.  if making output file,
  947. ; close the incomplete file to update cp/m's bit map,
  948. ; then erase it.
  949. abexit:    pop    d    ; get msg adrs
  950.     call    print
  951. abext2:    lda    active    ; see if we are making file
  952.     ora    a
  953.     jz    abext5    ; no file, skip file stuff
  954. abext3:    lhld    sfileptr
  955.     mov    a,l
  956.     ani    07fh
  957.     jnz    abext4
  958.     shld    sfilelen
  959. abext4:    mvi    a,eof
  960.     push    psw
  961.     call    putsfile
  962.     pop    psw
  963.     jnz    abext3
  964.      mvi    c,close
  965.     lxi    d,samfcb
  966.     call    bdos
  967.     inr    a
  968.     jnz    era$same
  969.     lxi    d,no$close
  970.     call    print
  971. ;
  972. ; erase incomplete file
  973. ;
  974. era$same:
  975. ;
  976.     mvi    c,delet
  977.     lxi    d,samfcb
  978.     call    bdos
  979. abext5:    call    erxit    ; print msg, exit
  980.     db    cr,lf,cr,lf,'++Aborted++$'
  981. ;
  982. ; exit with message
  983. msgexit:equ    $    ; exit with "informational" message
  984. erxit:    pop    d    ; get msg
  985.     call    print
  986. ; exit, restoring stack and return to ccp
  987. exit:    jmp    0
  988. ;
  989. ;
  990. DFILES:    LDA    SDISK    ;PUT ON SOURCE DISK
  991.     MOV    C,A
  992.     LDA    SUSER    ;source user
  993.     MOV    H,A
  994.     LXI    D,SAMB    ;SAME FILE NAME
  995.     CALL    SETFILE    ;SET UP SAME FILE ON SOURCE
  996.     CALL    CCRLF
  997. ;SOURCE/DESTINATION FILE MATCH
  998.     LHLD    SBUFF    ;SOURCE BUFFER
  999.     SHLD    BUFF    ;START OF BUFFER
  1000.     LHLD    DBUFF    ;DESTINATIN BUFFER
  1001.     SHLD    NAMPTR    ;END OF BUFFER
  1002.     MVI    A,1000$0000B;FILES THAT MATCH
  1003.     LXI    D,SDSAME
  1004.     CALL    PDFILE    ;DISPLAY FILES THAT MATCH FLAG
  1005. ;SOURCE/DESTINATION FILE NAME MATCH BUT NOT CONTENTS
  1006.     LHLD    SBUFF
  1007.     SHLD    BUFF
  1008.     LHLD    DBUFF
  1009.     SHLD    NAMPTR
  1010.     MVI    A,0100$0000B;SAME FILE NAME DIFFERENT COMTENTS
  1011.     LXI    D,SDNSAME
  1012.     CALL    PDFILE
  1013. ;SOURCE FILES NOT ON DESTINATION DISK
  1014.     LHLD    SBUFF
  1015.     SHLD    BUFF
  1016.     LHLD    DBUFF
  1017.     SHLD    NAMPTR
  1018.     MVI    A,0    ;FILES THAT DON'T MATCH
  1019.     LXI    D,SNOTD
  1020.     CALL    PDFILE
  1021. ;DESTINATION FILES NOT ON SOURCE DISK
  1022.     LHLD    DBUFF
  1023.     SHLD    BUFF
  1024.     LHLD    EDBUFF
  1025.     SHLD    NAMPTR
  1026.     MVI    A,0    ;FILES THAT DON'T MATCH
  1027.     LXI    D,DNOTS
  1028.     CALL    PDFILE    ;FILES THAT DON'T MATCH
  1029.     CALL    CRLF
  1030.     CALL    CLOSECRC;CLOSE FILE
  1031.     RET
  1032. ;
  1033. PDFILE:    STA    FLAG    ;SET UP FLAG
  1034.     CALL    OUTST    ;PRINT MESSAGE
  1035. DFILE:    LHLD    BUFF    ;NEXT POINTER
  1036.     XCHG
  1037.     LHLD    NAMPTR    ;END OF BUFFER
  1038.     CALL    SUBDHC
  1039.     RNC        ;THATS ALL FOLKS
  1040.     LXI    H,FLAG
  1041.     LDAX    D    ;GET FLAG
  1042.     ANI    1100$0000B;TEST FOR FLAGS ONLY
  1043.     CMP    M    ;TEST FOR THIS FLAG
  1044.     JNZ    DNFILE    ;NO
  1045.     LDAX    D    ;GET DESTINATION USER AND FLAG
  1046.     INX    D    ;PAST FLAG
  1047.     ANI    0FH    ;MASK OUT FLAGS
  1048.     MOV    H,A
  1049.     LDAX    D    ;GET SOURCE USER
  1050.     MOV    L,A
  1051.     CALL    DFNAME    ;DISPLAY FILE NAME
  1052. DNFILE:    LHLD    BUFF    ;BUFFER POINTER
  1053.     LXI    D,FLEN    ;NEXT NAME OFFSET
  1054.     DAD    D
  1055.     SHLD    BUFF
  1056.     JMP    DFILE    ;DISPLAY NEXT FILE
  1057. ;DISPLAY FILE NAME FROM BUFFER
  1058. ;DE=FILE NAME STARTING WITH USER #
  1059. ;H=DESTINATION USER #, L=SOURCE USER #
  1060. DFNAME:    PUSH    H    ;SAVE USER'S
  1061.     PUSH    H
  1062.     INX    D    ;PAST USER
  1063.     LXI    H,SAMEP+1
  1064.     MVI    B,8
  1065.     CALL    MOVE
  1066.     INX    H    ;FILE NAME.TYPE DELIMETER
  1067.     MVI    B,3
  1068.     CALL    MOVE
  1069.     LDA    HCOUNT    ;HORIZONTAL COUNT
  1070.     ANI    3    ;MASK OUT JUNK
  1071.     STA    HCOUNT
  1072.     CZ    CRLF
  1073.     LXI    D,DELIM
  1074.     CNZ    OUTSTL
  1075.     POP    H    ;GET USER #
  1076.     MVI    H,0    ;ZERO SECOUND USER
  1077.     CALL    DECOUT
  1078.     MVI    A,' '    ;DELIMETER
  1079.     CALL    OUTCHR
  1080.     POP    H
  1081.     MOV    L,H    ;SECOUND USER
  1082.     MVI    H,0
  1083.     CALL    DECOUT
  1084.     LXI    D,SAMEP    ;PRINT FILE NAME
  1085.     CALL    OUTSTL
  1086.     LDA    HCOUNT
  1087.     INR    A    ;INCREMENT TAB COUNTER
  1088.     STA    HCOUNT
  1089.     RET
  1090. ;
  1091. DECOPT:    LDAX    D    ;GET CHARACTER
  1092.     ORA    A    ;END OF STRING
  1093.     RZ        ;THATS ALL FOLKS
  1094.     CPI    '$'
  1095.     JZ    GOT$
  1096.     INX    D
  1097.     JMP    DECOPT
  1098. GOT$:    INX    D
  1099.     LDAX    D
  1100.     ORA    A    ;END OF STRING
  1101.     RZ        ;NO MORE OPTIONS
  1102.     CPI    'F'    ;DISK FLAG
  1103.     JNZ    GOT1    ;NO
  1104.     STA    FFLAG
  1105. GOT1:    CPI    'E'    ;ERASE EQUAL FILES
  1106.     JNZ    GOT2
  1107.     STA    EFLAG
  1108. GOT2:    CPI    'N'    ;DON'T PROMT ERASE
  1109.     JNZ    GOT3
  1110.     STA    EFLAG    ;WHY ENABLE DON'T PROMT W/O ERASE
  1111.     STA    NFLAG
  1112. GOT3:    CPI    'X'    ;USER CRCKLIST.CRC FILE
  1113.     JNZ    GOT4
  1114.     STA    XFLAG
  1115. GOT4:    CPI    'C'    ;DISPLAY FILE OPTION
  1116.     JNZ    GOT5
  1117.     STA    OCFLAG
  1118. GOT5:    CPI    'W'    ;WAIT FOR DISK CHANGE FLAG
  1119.     JNZ    GOT6
  1120.     STA    WFLAG
  1121. GOT6:    CPI    'D'    ;DEFAULT OPTION
  1122.     JNZ    GOT7
  1123.     STA    DFLAG    ;DEFAULT FLAG
  1124.     STA    FFLAG    ;WRITE FILE
  1125.     STA    EFLAG    ;ERASE FILES
  1126.     STA    NFLAG    ;DON'T PROMT
  1127.     STA    XFLAG    ;USER CRCKLIST.CRC FILE
  1128.     STA    WFLAG    ;WAIT FLAG
  1129. GOT7:    JMP    GOT$
  1130. ;
  1131. FILLFCB:
  1132.     MVI    B,11    ;FILL LENGTH
  1133. FILOOP:    MVI    M,'?'    ;FILL CHARACTER
  1134.     INX    H    ;INCREMENT POINTER
  1135.     DCR    B    ;COUNTER
  1136.     JNZ    FILOOP
  1137.     RET
  1138. ;
  1139. ;MAKE FCB 8-12-83
  1140. ;INPUT
  1141. ; HL=FCB ,DE=INPUT STRING
  1142. ;OUTPUT
  1143. ; CARRY = FILE NAME ERROR
  1144. ; NO CARRY, DE=NEXT CHARACTER ON INPUT STRING
  1145. ;MAKE FCB WITH COMAND LINE
  1146. MAKFCB:    MVI    A,'?'    ;SET FLAG
  1147.     STA    SUSR    ;SELECTED USER
  1148.     CALL    SCAN    ;GET TO NON SPACE
  1149.     ORA    A
  1150.     JZ    MAKE1    ;END OF STRING
  1151.     SBI    40H    ;TEST FOR DISK SELECT
  1152.     MOV    B,A
  1153.     INX    D
  1154.     LDAX    D
  1155.     CPI    ':'    ;DISK DELIMETER
  1156.     JZ    MAKE3    ;YES
  1157.     ORA    A    ;END OF STRING
  1158.     JZ    MAKE1    ;YES
  1159.     CALL    USERIN    ;GET USER #
  1160.     RC        ;OOPS ERROR
  1161.     JZ    MAKE2    ;GOT USER #
  1162. MAKE0:    DCX    D
  1163. MAKE1:    XRA    A    ;DEFAULT DRIVE
  1164.     MOV    M,A    ;SAVE IN FCB
  1165.     JMP    MAKE4
  1166. MAKE2:    MOV    A,C    ;GET USER #
  1167.     STA    SUSR    ;SELECTED USER
  1168. MAKE3:    MOV    M,B    ;SAVE SELECTED DISK
  1169.     INX    D
  1170. MAKE4:    LXI    B,800H    ;FILE NAME LENGHT
  1171.     CALL    FIELD    ;MOVE FILE NAME
  1172.     RC        ;ERROR
  1173.     MVI    B,3    ;FILE TYPE LENGHT
  1174.     CALL    FIELDT    ;MOVE FILE TYPE
  1175.     RC        ;ERROR
  1176.     MVI    A,3    ;FILL EX,S1,S2 WITH 0
  1177. MAKE5:    INX    H
  1178.     MOV    M,B
  1179.     DCR    A
  1180.     JNZ    MAKE5
  1181.     LDA    SUSR
  1182.     MOV    B,A    ;SAVE POSIBLE USER #
  1183.     MOV    A,C
  1184.     ORA    A
  1185.     RET
  1186. ;
  1187. FIELDT:    CPI    '.'    ;NAME.TYPE DELIMETER
  1188.     JNZ    BLANKF    ;FILE TYPE WITH BLANKS
  1189.     INX    D    ;GET PAST DELIMETER
  1190. FIELD:    CALL    DELIM?
  1191.     RC        ;ERROR
  1192.     JZ    BLANKF    ;FILL REST WITH BLANKS
  1193.     INX    H
  1194.     CPI    '*'
  1195.     JNZ    FIELD0    ;NON '*'
  1196.     MVI    M,'?'    ;FILE REST OF NAME
  1197.     INR    C    ;INCREMENT AMBIGIOUS COUNT
  1198.     JMP    FIELD1    ;WITH '?'
  1199. FIELD0:    MOV    M,A    ;MOVE TO FCB
  1200.     INX    D    ;INCREMENT COMAND LINE
  1201. FIELD1:    DCR    B    ;DECRIMENT COUNT
  1202.     JNZ    FIELD    ;CONTINUE WITH FILE NAME
  1203. EATUP:    CALL    DELIM?    ;EAT UP EXCESS CHARACTER
  1204.     RC
  1205.     RZ        ;TEST DELIMETER
  1206.     INX    D
  1207.     JMP    EATUP    ;CONTINUE UNTIL FOUND
  1208. BLANKF:    INX    H    ;FILE REST OF FILE NAME W BLANKS
  1209.     MVI    M,' '
  1210.     DCR    B
  1211.     JNZ    BLANKF
  1212.     ORA    A    ;RESET FLAGS
  1213.     RET
  1214. ;
  1215. DELIM?:    LDAX    D    ;TEST FOR DELIMETER
  1216.     ORA    A    ;END OF STRING
  1217.     RZ
  1218.     CPI    '='
  1219.     RZ
  1220.     CPI    5FH    ;BACK ARROW
  1221.     RZ
  1222.     CPI    '.'
  1223.     RZ
  1224.     CPI    ':'
  1225.     RZ
  1226.     CPI    ';'
  1227.     RZ
  1228.     CPI    '<'
  1229.     RZ
  1230.     CPI    '>'
  1231.     RZ
  1232.     CPI    ' '
  1233.     RET
  1234. ;
  1235. SCAN:    LDAX    D    ;SCAN TO NEXT CHARACTER >= 30H
  1236.     ORA    A
  1237.     RZ        ;END OF STRING
  1238.     CPI    '0'
  1239.     RNC
  1240.     INX    D
  1241.     JMP    SCAN
  1242. ;
  1243. USERIN:    PUSH    H    ;SAVE POINTERS
  1244.     PUSH    D
  1245.     PUSH    B    ;SAVE DISK
  1246.     LXI    H,0    ;ZERO DE
  1247.     CALL    ULOOP
  1248.     POP    B
  1249.     JC    DERR    ;OOPS
  1250.     MOV    A,H
  1251.     ORA    A
  1252.     JNZ    DERR    ;TO LARGE
  1253.     MOV    A,L
  1254.     CPI    16    ;MAX USER
  1255.     JNC    DERR    ;>15
  1256.     INX    SP    ;
  1257.     INX    SP
  1258.     POP    H    ;FCB
  1259.     MOV    C,A    ;SAVE USER #
  1260.     XRA    A    ;FLAGS FOR NORMAL RETURN
  1261.     RET
  1262. DERR:    CMC        ;SET UP IF ERROR RETURN
  1263.     POP    D    ;GET POINTERS BACK
  1264.     POP    H
  1265.     MVI    A,0
  1266.     INR    A    ;SET UP NZ W/O CHANGING CARRY
  1267.     RET
  1268. ;
  1269. ULOOP:    LDAX    D    ;GET A ASCII DIGIT
  1270.     CPI    ':'    ;TERMINATOR
  1271.     RZ        ;ALL OK
  1272.     SUI    '0'    ;CONVERT TO BCD AND TEST
  1273.     ANA    A    ;RESET CARRY
  1274.     RM        ;TERMINATE CONVERSION IF < ZERO
  1275.     CPI    10    ;CHECK LEGITIMATE DIGIT (0-9)
  1276.     CMC        ;COMPLEMENT CARRY
  1277.     RC        ;RET WITH CARRY SET IF ERROR
  1278.     INX    D    ;INCR ADDR POINTER
  1279.     DAD    H    ;SHIFT LEFT 1
  1280.     PUSH    H    ;SAVE RESULT
  1281.     DAD    H
  1282.     DAD    H    ;SHIFT LEFT 2
  1283.     POP    B    ;NO * 2 TO B
  1284.     DAD    B    ;HL NOW CONTAINS 10*NO
  1285.     MOV    C,A    ;ADD PRODUCT TO DIGIT
  1286.     MVI    B,0
  1287.     DAD    B
  1288.     JMP    ULOOP    ;BACK FOR ANOTHER DIGIT
  1289. ;
  1290. ERASE:    LDA    EFLAG
  1291.     ORA    A
  1292.     RZ
  1293.     LDA    DDISK    ;SELECT DESTINATION DISK
  1294.     MOV    E,A
  1295.     MVI    C,14
  1296.     CALL    BDOS
  1297.     LHLD    DBUFF    ;JUST ERASE DESTINATION FILES
  1298.     SHLD    BUFF
  1299.     LHLD    EDBUFF    ;END
  1300.     SHLD    NAMPTR
  1301. ERASEL:    LHLD    BUFF    ;NEXT POINTER
  1302.     XCHG
  1303.     LHLD    NAMPTR    ;END OF BUFFER
  1304.     CALL    SUBDHC
  1305.     RNC        ;THATS ALL FOLKS
  1306.     LDAX    D    ;GET FLAG
  1307.     ANI    1000$0000B;JUST LOOK FOR EQUAL FILES
  1308.     JZ    ERASEN    ;ONLY ERASE EQAUL FILES
  1309.     LHLD    BUFF    ;GET TO NAME
  1310.     CALL    SETFCB    ;GENERATE FCB
  1311.     LHLD    BUFF    ;GET TO NAME
  1312.     XCHG
  1313.     INX    D
  1314.     INX    D
  1315.     LXI    H,SAMEP+1
  1316.     MVI    B,8
  1317.     CALL    MOVE
  1318.     INX    H    ;FILE NAME.TYPE DELIMETER
  1319.     MVI    B,3
  1320.     CALL    MOVE
  1321.     LDA    NFLAG    ;SEE IF WE PROMT
  1322.     ORA    A
  1323.     JNZ    ERA    ;NO
  1324.     LXI    D,ERAFILE
  1325.     CALL    PRINT    ;ERASE FILE
  1326.     MVI    C,1    ;GET ANSWER
  1327.     CALL    BDOS
  1328.     CPI    'y'
  1329.     JZ    ERA
  1330.     CPI    'Y'
  1331.     JNZ    ERASEN    ;NO
  1332. ERA:    LXI    D,LFCB
  1333.     MVI    C,DELET    ;ERASE IT
  1334.     CALL    BDOS
  1335.     CPI    -1    ;ERROR
  1336.     JZ    ERASER    ;CLOSE ERROR
  1337.     LHLD    BUFF    ;SET ERASED FLAG
  1338.     INX    H    ;GET TO USER
  1339.     MOV    A,M
  1340.     ORI    1000$0000B
  1341.     MOV    M,A
  1342.     LDA    NFLAG    ;DON'T PROMT FLAG
  1343.     ORA    A
  1344.     JZ    ERA
  1345.     CALL    CCRLF
  1346.     LXI    D,SAMEP+1;GET FILENAME POINTER
  1347.     CALL    PRINT
  1348.     LXI    D,ERASED
  1349.     CALL    PRINT
  1350. ERASEN:    LHLD    BUFF    ;BUFFER POINTER
  1351.     LXI    D,FLEN    ;NEXT NAME OFFSET
  1352.     DAD    D
  1353.     SHLD    BUFF
  1354.     JMP    ERASEL
  1355.     RET
  1356. ;
  1357. ERASER:    LXI    D,CLOSEM;CAN'T CLOSE FILE
  1358.     CALL    PRINT
  1359.     JMP    ABEXT5    ;ABORT
  1360. ;
  1361. CCRLF:    MVI    E,CR
  1362.     MVI    C,2
  1363.     CALL    BDOS
  1364.     MVI    E,LF
  1365.     MVI    C,2
  1366.     CALL    BDOS
  1367.     RET
  1368. ;
  1369. DISPCRC:
  1370. ;    LDA    FFLAG
  1371. ;    ORA    A
  1372. ;    RZ        ;DON'T WRITE FILE
  1373.     LDA    OCFLAG    ;OPTION FLAG
  1374.     STA    CFLAG
  1375.     ORA    A
  1376.     LXI    D,SFMESG
  1377.     CNZ    PRINT
  1378.     LDA    S$ACT    ;CRCKLIST.CRC ACTIVE FLAG
  1379.     ORA    A
  1380.     LDA    SDISK    ;SOURCE DISK
  1381.     MOV    C,A
  1382.     LDA    SUSER    ;SOURCE USER
  1383.     MOV    H,A
  1384.     LXI    D,CRCK    ;FILE NAME
  1385.     CZ    SETFILE    ;OPEN FILE
  1386.     LHLD    SBUFF    ;SOURCE BUFFER START
  1387.     XCHG
  1388.     LHLD    DBUFF    ;END OF SOURCE BUFFER
  1389.     CALL    WRTCRC    ;WRITE SOURCE FILES
  1390.     CALL    CLOSECRC;CLOSE SOURCE FILE
  1391. ;
  1392.     LDA    CFLAG
  1393.     ORA    A
  1394.     LXI    D,DFMESG
  1395.     CNZ    PRINT
  1396.     LDA    D$ACT    ;CRCKLIST.CRC ACTIVE FLAG
  1397.     ORA    A
  1398.     LDA    DDISK    ;DESTINATION DISK
  1399.     MOV    C,A
  1400.     LDA    DUSER    ;destination user
  1401.     MOV    H,A
  1402.     LXI    D,CRCK    ;FILE NAME
  1403.     CZ    SETFILE    ;OPEN FILE
  1404.     LHLD    DBUFF    ;DESTINATION
  1405.     XCHG
  1406.     LHLD    EDBUFF    ;END
  1407.     CALL    WRTCRC    ;WRITE DESINTATION FILE
  1408.     CALL    CLOSECRC;CLOSE DESTINATION FILE
  1409.     RET
  1410. ;
  1411. WRTCRC:    SHLD    NAMPTR    ;END
  1412.     XCHG
  1413.     SHLD    BUFF    ;START
  1414. WCRCLP:    LHLD    BUFF    ;NEXT POINTER
  1415.     XCHG
  1416.     LHLD    NAMPTR    ;END OF BUFFER
  1417.     CALL    SUBDHC
  1418.     RNC        ;THATS ALL FOLKS
  1419.     LDAX    D    ;GET FLAG
  1420.     ANI    0001$0000B;JUST SAVE CRC FILES
  1421.     STA    FLAG    ;SAVE FOR LATER CONVERSION
  1422.     INX    D    ;PAST FLAG
  1423.     LDAX    D    ;GET USER #
  1424.     ORA    A    ;SEE IF ERASED
  1425.     JM    WCRCN    ;YES, DON'T WRITE
  1426.     PUSH    PSW    ;SAVE USER #
  1427.     INX    D    ;GET TO FILE NAME
  1428.     LXI    H,FILEN
  1429.     MVI    B,8
  1430.     CALL    MOVE
  1431.     INX    H    ;GET PAST .
  1432.     MVI    B,3
  1433.     CALL    MOVE
  1434.     XCHG        ;HL=CRC WORD
  1435.     XTHL
  1436.     PUSH    H    ;SAVE USER #
  1437.     LXI    D,FILEN    ;PRINT LENGHT
  1438.     CALL    OUTST
  1439.     POP    PSW    ;GET USER BACK
  1440.     MOV    L,A
  1441.     MVI    H,0
  1442.     CALL    DECOUT
  1443.     LXI    D,CRCM
  1444.     LDA    FLAG    ;SEE IF WE PRINT CRC
  1445.     ORA    A
  1446.     CNZ    OUTST
  1447.     POP    H    ;GET CRC BYTES
  1448.     MOV    E,M    ;LSB
  1449.     INX    H
  1450.     MOV    D,M    ;MSB
  1451.     XCHG
  1452.     LDA    FLAG
  1453.     ORA    A
  1454.     CNZ    HEXHL    ;DISPLAY CRC WORD
  1455.     CALL    CRLF
  1456. WCRCN:    LHLD    BUFF    ;BUFFER POINTER
  1457.     LXI    D,FLEN    ;NEXT NAME OFFSET
  1458.     DAD    D
  1459.     SHLD    BUFF
  1460.     JMP    WCRCLP    ;DISPLAY NEXT FILE
  1461. ;
  1462. GETSAME:
  1463.     LXI    H,0    ;RESET FLAGS
  1464.     SHLD    ACT$CRCK
  1465.     LDA    XFLAG
  1466.     ORA    A    ;ACTIVE
  1467.     RZ        ;NO
  1468.     XRA    A
  1469.     STA    FCBFINAL+12;EXTENT
  1470.     STA    FCBFINAL+15;RC
  1471.     STA    FCBFINAL+32;CR
  1472.     LXI    D,FCBFINAL
  1473.     MVI    C,OPEN
  1474.     CALL    BDOS    ;OPEN FILE
  1475.     CPI    -1
  1476.     RZ        ;DO NORMAL SORT
  1477.     MVI    A,-1    ;SET CRCKLIST.CRC ACTIVE ON DISK
  1478.     STA    ACT$CRCK
  1479.     LHLD    BUFF    ;GET BUFFER POINTER
  1480.     XCHG
  1481.     INX    D    ;PUT NAME AT CORRECT OFFSET FROM START
  1482.     INX    D
  1483. READ$SAME:
  1484.     LXI    H,80H    ;DMA OFFSET
  1485.     DAD    D
  1486.     PUSH    H    ;SAVE NEXT POINTER
  1487.     MVI    C,STDMA
  1488.     CALL    BDOS
  1489.     LXI    D,FCBFINAL
  1490.     MVI    C,READ
  1491.     CALL    BDOS    ;READ NEXT RECORD
  1492.     ORA    A    ;END OF DATA
  1493.     POP    D    ;NEXT DMA ADDRESS
  1494.     JZ    READ$SAME;CONTINUE LOOP
  1495.     MVI    B,16    ;FILL NEXT NAME WORTH
  1496.     MVI    A,'Z'-40H
  1497. FILL$NEXT:
  1498.     STAX    D
  1499.     INX    D
  1500.     DCR    B
  1501.     JNZ    FILL$NEXT
  1502.     LHLD    BUFF    ;START OF BUFFER
  1503.     MOV    D,H    ;DE=HL
  1504.     MOV    E,L
  1505.     INX    D
  1506.     INX    D
  1507. NEXT$NAME:
  1508.     CALL    NSCAN    ;GET TO START OF NAME
  1509.     JC    END$SAME;THATS ALL FOLKS
  1510.     PUSH    H    ;SAVE FLAG POINTER
  1511.     PUSH    H    ;SAVE POINTER
  1512.     LHLD    NAMCNT
  1513.     INX    H    ;INCREMENT NAME COUNT
  1514.     SHLD    NAMCNT
  1515.     POP    H
  1516.     MVI    M,0    ;ZERO OUT FLAGS & USER
  1517.     INX    H
  1518.     LDA    OLDUSR    ;PRESET TO OLD USER
  1519.     MOV    M,A    ;DEFAULT USER
  1520.     PUSH    H    ;USER POINTER #
  1521.     INX    H
  1522.     MVI    B,8
  1523.     CALL    MOVE
  1524.     INX    D    ;GET PAST DELIMETER
  1525.     MVI    B,3
  1526.     CALL    MOVE
  1527.     POP    B    ;USER POINTER
  1528.     LDAX    D    ;NEXT CHARACRE
  1529.     CPI    TAB    ;CRCK GENERATED
  1530.     JZ    GET$CRC
  1531.     PUSH    H    ;SAVE BUFFER POINTER
  1532.     LXI    H,USROF    ;OFFSET TO USER #
  1533.     DAD    D
  1534.     XCHG
  1535.     CALL    DECIN    ;GET USER
  1536.     POP    H    ;DESTINATIN BACK
  1537.     STAX    B
  1538.     MVI    A,-1    ;SET SAME.COM GENERATED FLAG
  1539.     STA    SFLAG    ;SAME FLAG
  1540. GET$CRC:
  1541.     LDAX    D    ;GET CHARACTER
  1542.     CPI    'Z'-40H    ;END OF DATA
  1543.     JZ    NO$CRC
  1544.     CPI    CR    ;END OF STRING
  1545.     JZ    NO$CRC
  1546.     INX    D    ;POINT TO NEXT CHARACTER
  1547.     CPI    '='
  1548.     JNZ    GET$CRC    ;NOT YET
  1549.     CALL    NSCAN    ;GET TO CRC WORD
  1550.     JC    NO$CRC    ;OOPS
  1551.     PUSH    H    ;SAVE DESTINATION POINTER
  1552.     CALL    HEXIN    ;GET CRC DATA
  1553.     LDAX    D
  1554.     INX    D    ;POINT TO NEXT CHARACTER
  1555.     STA    CRCTYPE    ;CRC TYPE
  1556.     CPI    ' '
  1557.     CZ    IN1    ;YES
  1558.     MOV    B,H    ;BC=HL
  1559.     MOV    C,L
  1560.     POP    H    ;DESTINATION POINTER
  1561.     MVI    A,0001$0000B;CRC ACTIVE FLAG
  1562.     JMP    SET$CRC
  1563. NO$CRC:    LXI    B,0    ;ZERO OUT CRC
  1564.     MVI    A,0    ;CRC INACTIVE FLAG
  1565. SET$CRC:
  1566.     MOV    M,C    ;SET CRC
  1567.     INX    H
  1568.     MOV    M,B
  1569.     INX    H
  1570.     MVI    M,0
  1571.     INX    H
  1572.     POP    B    ;GET CRC FLAG POINTER
  1573.     STAX    B
  1574.     JMP    NEXT$NAME
  1575. END$SAME:
  1576.     SHLD    NAMPTR    ;END OF BUFFER
  1577.     LXI    D,80H    ;SET DEFAULT DMA
  1578.     MVI    C,STDMA
  1579.     CALL    BDOS
  1580.     LHLD    NAMCNT    ;NAMES IN BUFFER
  1581.     MOV    A,H
  1582.     ORA    L
  1583.     RZ        ;NO NAMES IN BUFFER
  1584.     LDA    DTYPE    ;DEFAULT
  1585.     ORA    A
  1586.     STC        ;RETURN FLAG
  1587.     RZ
  1588.     LDA    SFLAG    ;SAME GENERATED FLAG
  1589.     ORA    A
  1590.     RZ        ;NOT SAME.COM GENERATED
  1591.     STC
  1592.     RET
  1593. ;
  1594. NSCAN:    LDAX    D    ;SCAN TO NEXT CHARACTER >= 30H
  1595.     CPI    'Z'-40H    ;END OF STRING
  1596.     STC        ;END OF DATA
  1597.     RZ        ;END OF STRING
  1598.     CPI    '0'
  1599.     RNC
  1600.     INX    D
  1601.     JMP    NSCAN
  1602. ;
  1603. DECIN:    PUSH    B    ;SAVE POINTERS
  1604.     LXI    H,0
  1605.     CALL    DLOOP
  1606.     MOV    A,L    ;SINGLE BYTE
  1607.     POP    B
  1608.     RET
  1609. ;
  1610. DLOOP:    LDAX    D    ;GET A ASCII DIGIT
  1611.     SUI    '0'    ;CONVERT TO BCD AND TEST
  1612.     ANA    A    ;RESET CARRY
  1613.     RM        ;TERMINATE CONVERSION IF < ZERO
  1614.     CPI    10    ;CHECK LEGITIMATE DIGIT (0-9)
  1615.     CMC        ;COMPLEMENT CARRY
  1616.     RC        ;RET WITH CARRY SET IF ERROR
  1617.     INX    D    ;INCR ADDR POINTER
  1618.     DAD    H    ;SHIFT LEFT 1
  1619.     PUSH    H    ;SAVE RESULT
  1620.     DAD    H
  1621.     DAD    H    ;SHIFT LEFT 2
  1622.     POP    B    ;NO * 2 TO B
  1623.     DAD    B    ;HL NOW CONTAINS 10*NO
  1624.     MOV    C,A    ;ADD PRODUCT TO DIGIT
  1625.     MVI    B,0
  1626.     DAD    B
  1627.     JMP    DLOOP    ;BACK FOR ANOTHER DIGIT
  1628. ;
  1629. HEXIN:    LXI    H,0    ;ZERO NUMBER
  1630. IN1:    LDAX    D    ;GET A CHAR
  1631.     ORA    A    ;CHECK FOR END OF BUFFER
  1632.     RZ
  1633.     SUI    '0'    ;CHECK < 0 AND CONVERT TO HEX
  1634.     RC
  1635.     ADI    '0'-'G'    ;CHECK > F
  1636.     RC
  1637.     ADI    6
  1638.     JP    IN2    ;NO BETWEEN A AND F
  1639.     ADI    7
  1640.     RC
  1641. IN2:    ADI    10
  1642.     ORA    A    ;CLEAR CARRY
  1643.     PUSH    B    ;SAVE REG
  1644.     MOV    C,A    ;HEX DIGIT TO C
  1645.     MVI    B,0    ;ZERO TO B
  1646.     DAD    H
  1647.     DAD    H
  1648.     DAD    H
  1649.     DAD    H    ;SHIFT LEFT 4
  1650.     DAD    B    ;ADD IN NEW DIGIT
  1651.     POP    B
  1652.     INX    D    ;INCR BUFFER POINTER
  1653.     JMP    IN1    ;RETURN FOR MORE INPUT
  1654. ;
  1655. HEXHL:    MOV    A,H
  1656.     PUSH    H
  1657.     CALL    HEXOUT
  1658.     POP    H
  1659.     MOV    A,L
  1660. HEXOUT:    PUSH    PSW
  1661.     RRC
  1662.     RRC
  1663.     RRC
  1664.     RRC        ;SHIFT RIGHT 4
  1665.     CALL    NIBBLE
  1666.     POP    PSW
  1667. NIBBLE: ANI    0FH    ;MASK 4 BITS
  1668.     ADI    90H    ;ADD OFFSET
  1669.     DAA        ;DEC ADJUST
  1670.     ACI    40H    ;ADD OFFSET
  1671.     DAA        ;DEC ADJUST
  1672.     JMP    OUTCHR
  1673. ;
  1674. SUBDHC:    CALL    SUBDH    ;SUBTRACT
  1675.     RZ        ;NC ALRIGHT
  1676.     CMC        ;SET UP FOR NC END OF COMPARE
  1677.     RET
  1678. ;HL=HL-DE
  1679. SUBDH:    MOV    A,L
  1680.     SUB    E
  1681.     MOV    L,A
  1682.     MOV    A,H
  1683.     SBB    D
  1684.     MOV    H,A
  1685.     RC        ;PAST END
  1686.     ORA    L    ;TEST FOR 0
  1687.     RET
  1688. ;
  1689. SETUSR:    MOV    E,A    ;SET TO OLD
  1690.     MVI    C,32
  1691.     CALL    BDOS
  1692.     RET
  1693. ;
  1694. SAMDSK:    LXI    D,SDSKM
  1695.     JMP    ERROR
  1696. BADFCB:    LXI    D,BFCBM    ;BAD FCB ERROR
  1697.     JMP    ERROR
  1698. NSAME:    LXI    D,SAMEM
  1699.     JMP    ERROR
  1700. NOFILE:    LXI    D,NFILES
  1701. ERROR:    CALL    PRINT
  1702. RETURN:    LDA    OLDUSR
  1703.     CALL    SETUSR
  1704.     JMP    0
  1705. ;
  1706. HELP:    MVI    A,0    ;CHANGE DELIMETER CHARACTER
  1707.     STA    OUTSTL+2;SELF MODIFYING CODE TO DISPLAY DOLLAR SIGNS
  1708.     LXI    D,HELPM
  1709.     CALL    OUTSTL    ;PRINT MESSAGE
  1710.     JMP    0    ;THATS ALL FOLKS
  1711. ;
  1712. OUTST:    XRA    A
  1713.     STA    HCOUNT
  1714. OUTSTL:    LDAX    D    ;GET CHARACTER
  1715.     CPI    '$'
  1716.     RZ
  1717.     CALL    OUTCHR
  1718.     INX    D
  1719.     JMP    OUTSTL
  1720. ;
  1721. PRINT:    PUSH    H    ;SAVE REGS
  1722.     PUSH    D
  1723.     PUSH    B
  1724.     XRA    A
  1725.     STA    HCOUNT
  1726.     MVI    C,9
  1727.     CALL    BDOS
  1728.     POP    B
  1729.     POP    D
  1730.     POP    H
  1731.     RET
  1732. ;
  1733. DECOUT:    PUSH    H    ;SAVE REGS
  1734.     PUSH    D
  1735.     PUSH    B
  1736.     LXI    B,-10    ;RADIX FOR CONVERSION
  1737.     LXI    D,-1    ;THIS BECOMES NO DIVIDED BY RADIX
  1738. DX:    DAD    B    ;SUBTRACT 10
  1739.     INX    D
  1740.     JC    DX
  1741.     LXI    B,10
  1742.     DAD    B    ;ADD RADIX BACK IN ONCE
  1743.     XCHG
  1744.     MOV    A,H
  1745.     ORA    L    ;TEST FOR ZERO
  1746.     CNZ    DECOUT    ;RECURSIVE CALL
  1747.     MOV    A,E
  1748.     ADI    '0'    ;CONVERT FROM BCD TO HEX
  1749.     CALL    OUTCHR
  1750.     POP    B    ;RESTORE REGISTERS
  1751.     POP    D
  1752.     POP    H
  1753.     RET
  1754. ;
  1755. MOVE:    LDAX    D    ;FROM
  1756.     MOV    M,A    ;TO
  1757.     INX    H
  1758.     INX    D
  1759.     DCR    B
  1760.     JNZ    MOVE
  1761.     RET
  1762. ;
  1763. SIGNON:    DB    'Same vers 1.01$'
  1764. NFILES:    DB    CR,LF,'Directory empty$'
  1765. OOPSM:    DB    CR,LF,'File not found that was found last pass$'
  1766. SDSKM:    DB    CR,LF,'Same disk and user$'
  1767. WAIT:    DB          'Insert disks to compare and hit any key$'
  1768. DONE:    DB          'Search and Destroy complete$'
  1769. FWAIT:    DB    CR,LF,'Insert systemd disk then hit any key$'
  1770. BFCBM:    DB    CR,LF,'Bad filename in comand line$'
  1771. SAMEM:    DB    CR,LF,'Same file name in different user #$'
  1772. SORTING:DB    CR,LF,'Sorting Directory entries$'
  1773. ERAFILE: DB    CR,LF,'Erase file <Y,?> '
  1774. SAMEP:    DB    ' FILENAME',' ','TYP',' $'
  1775. DELIM:    DB    '| $'
  1776. ERASED:    DB    'file erased$'
  1777. SDSAME:    DB          'Source/Destination file''s same$'
  1778. SDNSAME:DB    CR,LF,'Source/Destination file name''s same, '
  1779.     DB    'file''s different$'
  1780. SNOTD:    DB    CR,LF,'Source name''s not found on destination disk$'
  1781. DNOTS:    DB    CR,LF,'Destination name''s not found on source disk$'
  1782. WAIT?:    DB    CR,LF,'Hit any key to display results$'
  1783. CLOSEM:    DB    CR,LF,'Erase error$'
  1784. SFMESG:    DB    CR,LF,'Source disk files',CR,LF,'$'
  1785. DFMESG:    DB          'Destinaion disk files',CR,LF,'$'
  1786. ;
  1787. dir$full:    db    cr,lf
  1788.     db    '++No Directory Space for CRC File++'
  1789.     db    '$'
  1790. ;
  1791. dsk$full:    db    cr,lf
  1792.     db    '++No Disk Space for CRC File++'
  1793.     db    '$'
  1794. ;
  1795. no$close:    db    cr,lf
  1796.     db    '++Cannot Close CRC File++'
  1797.     db    '$'
  1798. HELPM:    DB    'Commands:   same drive[user]:name.typ '
  1799.     DB    'drive[user]:name.type [$f,e,n,c,x,w,d]',CR,LF
  1800.     DB    '    commas are just used here for diferentiating instrusctions',CR,LF
  1801.     DB    CR,LF
  1802.     DB    '    Options    Descriptionns',CR,LF
  1803.     DB    '    $    start options',CR,LF
  1804.     DB    '    F    Write compare text to SAMELIST.PRN and crc data',CR,LF
  1805.     DB    '        to CRCKLIST.CRC on each disk and default user if',CR,LF
  1806.     DB    '        no user selected',CR,LF
  1807.     DB    '    E    Erase files that are equal',CR,LF
  1808.     DB    '    N    Don''t promt operator to erase file',CR,LF
  1809.     DB    '    C    Display CRCKLIST.CRC files on console',CR,LF
  1810.     DB    '    X    Use existing CRCKLIST.CRC files from selected',CR,LF
  1811.     DB    '        user or default user. Uses old crc generation if',CR,LF
  1812.     DB    '        old CRCKLIST.CRC encounteredss',CR,LF
  1813. Y    DB    '    W    Wait and promt operator for disk change',CR,LF
  1814.     DB    '    D    Default to F,E,N,X,W options',CR,LF
  1815.     DB    CR,LF
  1816.     DB    'Examples:',CR,LF
  1817.     DB    CR,LF
  1818.     DB    ' same a: b: compare all file''s all user''s on a: to same on b:',CR,LF
  1819.     DB    ' same a0: b0: compare all file''s user 0 on a: to same on b:',CR,LF
  1820.     DB    ' same a:*.asm b:*.asm $fwn'
  1821.     DB    0
  1822. FILEN:    DB    'FILENAME.TYP'
  1823. USER:    DB    '    USER $'
  1824. USROF    EQU    $-USER
  1825. CRCM:    DB    9,' CRC = $'
  1826. ;
  1827. ACT$CRCK DB    0    ;CRCKLIST.CRC FILE ACTIVE
  1828. CRCTYPE    DB    0    ;FLAG FOR CRC TYPE
  1829. ;
  1830. BUFF:    DW    NAMBUF    ;BUFFER POINTER
  1831. NAMPTR:    DW    NAMBUF    ;BUFFER POINTER
  1832. NAMCNT:    DW    0    ;NAME'S IN BUFFER
  1833. ;
  1834. MFILES:    DB    0    ;MULTIPLE FILES FLAG
  1835. OLDUSR:    DB    0    ;OLD USER #
  1836. ;
  1837. CMPFCB:    DW    0    ;COMPARE FCB
  1838. SUSR:    DB    0    ;SELECTED USER #
  1839. ;
  1840. SDISK:    DB    0    ;SOURCE DISK
  1841. SUSER:    DB    0    ;SOURCE USER
  1842. S$ACT:    DB    0    ;CRCKLIST.CRC ACTIVE
  1843. S$TYPE:    DB    0    ;CRCK TYPE
  1844. SBUFF:    DW    NAMBUF    ;NAME BUFFER
  1845. SSBUFF:    DW    NAMBUF    ;SEARCH NAME BUFFER
  1846. SSFCB:    DW    NAMBUF    ;SOURCE FILE NAME POINTER
  1847. ;
  1848. DDISK:    DB    0    ;DESINATION DISK
  1849. DUSER:    DB    0    ;DESINTION USER
  1850. D$ACT:    DB    0    ;CRCKLIST.CRC ACTIVE FLAG
  1851. D$TYPE:    DB    0    ;CRCK TYPE
  1852. DBUFF:    DW    NAMBUF    ;NAME BUFFER
  1853. SDBUFF:    DW    NAMBUF    ;SEARCH NAME BUFFER
  1854. SDFCB:    DW    NAMBUF    ;DESTINATION FILE NAME POINTER
  1855. EDBUFF:    DW    NAMBUF    ;END NAME BUFFER
  1856. ;
  1857. FLAG:    DB    0    ;DISPLAY COMPARE FLAG
  1858. HCOUNT:    DB    0
  1859. CPASS:    DB    0    ;COMPARE PASS
  1860. CRCFCB:    DW    0    ;CRC GENERATION NAME POINTER
  1861. ;
  1862. ; program storage area
  1863. active:    db    0    ; fcb active
  1864. dflag:    db    0    ; default option
  1865. sflag:    db    0    ; same.com generted crcklist.crc flag
  1866. cflag:    db    -1    ; display file flag
  1867. ocflag:    db    0    ; option selected display file flag
  1868. wflag:    db    0    ; wait for operator to change disk's flag
  1869. fflag:    db    0    ; file write request flag
  1870. eflag:    db    0    ; erase equal files flag
  1871. nflag:    db    0    ; don't promt erase file
  1872. xflag:    db    0    ; use crcklist.crc for files
  1873. rem:    dw    0    ; crc remainder storage
  1874. bufad:    ds    2    ; read buffer address
  1875. ;
  1876. hitab:    ds    512    ; the 2 tables for crc lookup
  1877. ;
  1878. sfilelen:
  1879. ;
  1880.     dw    sfilesiz
  1881. ;
  1882. sfileptr:
  1883. ;
  1884.     ds    2
  1885. ;
  1886. SAMB:    DB    'SAMELISTPRN'
  1887. CRCK:    DB    'CRCKLISTCRC'
  1888. ; build fcb for final name of crcklist.crc
  1889. ;
  1890. fcbfinal:
  1891. ;
  1892.     db    0,'CRCKLISTCRC'
  1893.     db    0
  1894.     ds    20
  1895. ;
  1896. ; 'declare' fcb for output file (temporarily named crcklist.$$$)
  1897. ;
  1898. samfcb:
  1899. ;
  1900.     db    0,'????????$$$'
  1901.     db    0
  1902.     ds    20
  1903. ;
  1904. sfileadr:
  1905. ;
  1906.     dw    sfilebuff    ; buffer all crc file data here
  1907. ;
  1908. SFCB:    DB    0,'????????','???',0,0,0,0
  1909.     DB    0,0,0,0,0,0,0,0
  1910.     DB    0,0,0,0,0,0,0,0
  1911.     DB    0,0,0,0
  1912. ;
  1913. DFCB:    DB    0,'????????','???',0,0,0,0
  1914.     DB    0,0,0,0,0,0,0,0
  1915.     DB    0,0,0,0,0,0,0,0
  1916.     DB    0,0,0,0
  1917. ;
  1918. UFCB:    DB    '?','????????','???',0,0,0,0
  1919.     DB    0,0,0,0,0,0,0,0
  1920.     DB    0,0,0,0,0,0,0,0
  1921.     DB    0,0,0,0
  1922. ;
  1923. LFCB:    DB    0,'????????','???',0,0,0,0
  1924.     DB    0,0,0,0,0,0,0,0
  1925.     DB    0,0,0,0,0,0,0,0
  1926.     DB    0,0,0,0
  1927. ;
  1928.     DS    40
  1929. STACK:
  1930. sfilebuff:
  1931.     ds    sfilesiz
  1932.     DS    16-($ AND 0FH)
  1933. NAMBUF:
  1934.     END
  1935.