home *** CD-ROM | disk | FTP | other *** search
/ Oakland CPM Archive / oakcpm.iso / cpm / filutl / compare3.lbr / COMPARE3.AZM / COMPARE3.ASM
Encoding:
Assembly Source File  |  1988-03-09  |  12.5 KB  |  640 lines

  1. ;
  2. ;01/16/88    ADDED HELP MESSAGE, USER AREA SUPPORT.  TAH
  3. ;        FIX EXIT BUG.
  4. ;        FOR HELP TYPE:  COMPARE
  5. ;                  OR
  6. ;                COMPARE $?
  7. ;
  8. ;REQUIRES MAC.COM AND SEQIOU.LIB FOR ASSEMBLY
  9. ; SEQIOU.LIB IS A REVISED VERSION OF SEQIO.LIB FROM CPMUG VOL 29
  10. ; WITH USER AREA SUPPORT ADDED TO THE "FILE" MACRO.
  11. ;
  12. ;11/??/77 ORIGINALLY WRITTEN BY WARD CHRISTENSEN
  13. ;12/31/77 ADD PICKUP OF SECOND FILENAME IF BLANK
  14. ;01/08/78 ADD SEQIO MACLIB TO READ BIG BLOCKS
  15. ;
  16. BSIZE    EQU    4096    ;DISK BUFFER SIZE (TIMES 2)
  17. LINES    EQU    14    ;LINES TO PRINT BEFORE PAUSE
  18. CTRLC    EQU    03    ;CONTROL C
  19. ;
  20.     ORG    100H
  21. ;
  22.     MACLIB    SEQIOU
  23. ;
  24. ;COMPARE.ASM - COMPARES 2 FILES
  25. ;
  26. ;COMMAND FORMAT: COMPARE NAME1 NAME2
  27. ;    IF NAME2 = NAME1 BUT IS ON B DISK,
  28. ;    JUST TYPE: COMPARE NAME1 B:
  29. ;
  30. ;INIT STACK
  31. ;
  32.     POP    H    ;GET CP/M RET ADDR
  33.     SHLD    EXIT1+1    ;MODIFY RETURN ADDR
  34.     LXI    SP,STACK    ;GET MY STACK
  35. ;
  36.     CALL    INLMSG
  37.     DB    'COMPARE.COM v3',0DH,0AH,'$'
  38.     LXI    H,@TBUF
  39.     MOV    A,M
  40.     ORA    A
  41.     JZ    HELP    ;IF EMPTY COMMAND LINE, GIVE HELP
  42.     MOV    E,A    ;CHARACTER COUNT
  43.     MVI    D,00    ;CLEAR D
  44.     DAD    D    ;HL POINTS TO END OF LINE
  45.     INR    E
  46. INIT:    DCR    E
  47.     JZ    HELP
  48.     MOV    A,M
  49.     DCX    H
  50.     CPI    ' '    ;SCAN BACKWARDS FOR FIRST SPACE
  51.     JNZ    INIT    ;LOOP BACK IF NOT SPACE
  52.     INX    H
  53.     INX    H
  54.     MOV    A,M
  55.     CPI    '$'    ;IS SPACE FOLLOWED BY $ ?
  56.     JNZ    INIT2    ;NO, OPTIONS NOT SPECIFIED.
  57.     INX    H    ;YES, CHECK NEXT CHAR.
  58.     MOV    A,M
  59.     CPI    '?'    ;NEED HELP MESSAGE
  60.     JZ    HELP
  61.     CPI    'S'
  62.     JNZ    INIT2
  63.     STA    SHOFLG    ;SAVE  S  OPTION.
  64.     INX    H
  65.     MOV    A,M
  66.     XCHG        ;POINTER TO DE
  67.     LXI    H,0100H    ;DEFAULT ORIGIN ADDRESS
  68.     CALL    VALHEX    ;HEX ADDRESS GIVEN?
  69.     JC    INIT1    ;NO, USE DEFAULT VALUE
  70.     LXI    H,0    ;YES, CONVERT ASCII TO BINARY
  71.     MVI    B,0
  72. ;
  73. ADRLUP:    LDAX    D
  74.     INX    D
  75.     CALL    VALHEX    ;CHECK FOR VALID HEX CHARACTER
  76.     JC    INIT1    ;QUIT IF NOT.
  77. ADDNIB:    DAD    H    ;*2
  78.     DAD    H    ;*4
  79.     DAD    H    ;*8
  80.     DAD    H    ;*16 TO SHIFT PARTIAL SUM
  81.     MOV    C,A
  82.     DAD    B    ;ADD IN NEXT DIGIT
  83.     JMP    ADRLUP
  84. INIT1:    SHLD    ADDR    ;SAVE S OPTION ADDRESS
  85. ;
  86. INIT2:    CALL    PCL    ;PARSE COMMAND LINE
  87. ;
  88. ;IF THE SECOND FCB IS BLANK,
  89. ;MOVE IN THE NAME FROM THE FIRST
  90. ;
  91.     LDA    @TFCB+17
  92.     CPI    ' '
  93.     JNZ    MOVE2    ;NOT BLANK
  94.     MVI    B,11
  95.     LXI    D,@TFCB+1
  96.     LXI    H,@TFCB+17
  97.     CALL    MOVER
  98. ;
  99. ;'DECLARE' BOTH FCB'S
  100. ;
  101. MOVE2    FILE    INFILE,FILE1,,1,,BSIZE
  102.     FILE    INFILE,FILE2,,2,,BSIZE
  103. ;
  104. ;COMPARE THE 2 FILES 1 BYTE AT A TIME
  105. ;
  106. COMP    CALL    READ1
  107.     MOV    B,A    ;SAVE CHAR
  108.     PUSH    B
  109.     CALL    READ2
  110.     POP    B
  111.     CMP    B
  112.     JZ    FIXADDR    ;IF THE SAME, CONTINUE
  113. ;
  114. ;FILES UNEQUAL
  115. ;
  116.     MOV    C,A    ;SAVE FILE2 CHARACTER
  117.     LDA    SHOFLG
  118.     CPI    'S'    ;SHOW ALL DIFFERENCES?
  119.     JNZ    UNEQUAL    ;NO, DISPLAY FILE BUFFER AND QUIT
  120.     CALL    SHOW    ;YES, SHOW ADDRESS AND DATA...
  121. FIXADDR:
  122.     LHLD    ADDR
  123.     INX    H    ;...UPDATE ADDRESS
  124.     SHLD    ADDR
  125.     JMP    COMP    ;GO BACK FOR MORE.
  126. ;
  127. UNEQUAL    CALL    INLMSG
  128.     DB    'FILES UNEQUAL AFTER ','$'
  129. PRBYTES    LXI    D,BYTES
  130.     MVI    C,@MSG
  131.     CALL    @BDOS
  132.     CALL    INLMSG
  133.     DB    'LAST DATA READ FROM FILE 1:',0DH,0AH,'$'
  134.     LHLD    PRTPTR
  135. ;
  136. ;THE FOLLOWING DISPLAYS THE LAST CONTENTS OF THE FILE1 BUFFER
  137. ;IN A MANNER SIMILAR TO THE DDT "D" COMMAND (HEX DATA FOLLOWED
  138. ;BY ASCII EQUIVALENT)
  139. ;
  140. DISP    MVI    B,16    ;DISPLAY 16 LINES
  141. DISP0    MVI    C,16    ;AT 16 CHAR PER LINE
  142.     PUSH    H
  143. DISP1    MOV    A,M    ;GET DATA BYTE
  144.     INR    L    ;BUMP POINTER
  145.     CALL    HEXOUT    ;DISPLAY AS HEX
  146.     MVI    A,' '    ;FOLLOW WITH A SPACE
  147.     CALL    TYPE
  148.     DCR    C
  149.     JNZ    DISP1    ;DO 16 TIMES
  150.     POP    H
  151.     MVI    C,16
  152. DISP2    MOV    A,M    ;GET DATA AGAIN
  153.     INR    L
  154.     CPI    ' '
  155.     JC    DOTOUT    ;REPLACE NON-PRINTING CHAR. WITH DOT
  156.     CPI    7FH
  157.     JC    NODOT
  158. DOTOUT    MVI    A,'.'
  159. NODOT    CALL    TYPE    ;DISPLAY THE CHARACTER
  160.     DCR    C
  161.     JNZ    DISP2    ;LOOP FOR 16 COUNT
  162.     PUSH    H
  163.     PUSH    B
  164.     CALL    INLMSG    ;START A NEW LINE
  165.     DB    0DH,0AH,'$'
  166.     POP    B
  167.     POP    H
  168.     DCR    B
  169.     JNZ    DISP0    ;DISPLAY LAST 256 BYTES OF FILE1
  170.     JMP    EXIT    ;AND QUIT
  171. ;
  172. ;READ BYTE FROM FILE 1
  173. ;
  174. READ1    GET    FILE1
  175.     JZ    EOF1    ;GOT EOF?
  176.     LHLD    PRTPTR
  177.     MOV    M,A
  178.     INR    L
  179.     SHLD    PRTPTR
  180.     PUSH    PSW    ;SAVE CHAR
  181.     LXI    H,BYTES+5
  182. READI    MOV    A,M
  183.     ORI    '0'    ;IN CASE IT WAS BLANK
  184.     INR    A
  185.     MOV    M,A
  186.     CPI    '9'+1    ;TIME TO CARRY?
  187.     JNZ    READNC
  188.     MVI    M,'0'
  189.     DCX    H
  190.     JMP    READI
  191. READNC    POP    PSW
  192.     RET
  193. ;
  194. ;EOF ON FILE 1 - SET FLAG, READ 2
  195. ;
  196. EOF1    MVI    A,'Y'
  197.     STA    EOFLG
  198.     CALL    READ2
  199.     CALL    INLMSG
  200.     DB    'EOF FILE 1, NOT FILE 2',0DH,0AH,'$'
  201.     JMP    UNEQUAL
  202. ;
  203. READ2    GET    FILE2
  204.     RNZ        ;NO EOF
  205. ;
  206. ;GOT EOF ON FILE 2, MUST HAVE GOTTEN IT ON FILE 1
  207. ;
  208. EOF2    LDA    EOFLG
  209.     CPI    'Y'
  210.     JZ    AOK
  211.     CALL    INLMSG
  212.     DB    'EOF FILE 2 BEFORE FILE 1',0DH,0AH,'$'
  213.     JMP    UNEQUAL
  214. ;
  215. ;A-OK - FILES MATCH
  216. ;
  217. AOK    LDA    ERRFLG
  218.     ORA    A
  219.     JNZ    EXIT
  220.     CALL    INLMSG
  221.     DB    'FILES MATCH, LENGTH IS ','$'
  222.     LXI    D,BYTES
  223.     MVI    C,@MSG
  224.     CALL    @BDOS
  225. ;NOTE THE FOLLOWING DOES NOT RESTORE CP/M'S
  226. ;STACK POINTER, BUT THAT IS 'OK' BECAUSE THE
  227. ;FIRST INSTRUCTION IN CP/M IS A LXI SP
  228. EXIT    MVI    C,20H    ;RESTORE USER NUMBER
  229.     LDA    DEFUSR
  230.     MOV    E,A
  231.     CALL    @BDOS
  232. EXIT1    JMP    $-$    ;CP/M RET ADDR (MODIFIED)
  233. ;
  234. ERXIT    POP    D    ;GET MESSAGE
  235.     MVI    C,@MSG
  236.     CALL    @BDOS
  237.     JMP    EXIT
  238. ;
  239. ;MOVE FROM (DE) TO (HL) LENGTH IN B
  240. MOVER    LDAX    D
  241.     MOV    M,A
  242.     INX    D
  243.     INX    H
  244.     DCR    B
  245.     JNZ    MOVER
  246.     RET
  247. ;
  248. ;DISPLAY HEX ADDRESS AND FILE1, FILE2 DATA
  249. ;
  250. SHOW    MVI    A,0FFH
  251.     STA    ERRFLG    ;SET FILE MISMATCH FLAG
  252.     LHLD    ADDR
  253.     PUSH    B
  254.     CALL    HLOUT    ;DISPLAY HEX ADDRES
  255.     MVI    A,'-'
  256.     CALL    TYPE
  257.     POP    B
  258.     PUSH    B
  259.     MOV    A,B
  260.     CALL    HEXOUT    ;FIRST DATA BYTE
  261.     MVI    A,' '
  262.     CALL    TYPE
  263.     POP    B
  264.     MOV    A,C
  265.     CALL    HEXOUT    ;SECOND DATA BYTE
  266.     CALL    INLMSG    ;START NEW LINE.
  267.     DB    0DH,0AH,'$'
  268.     LDA    LINCNT
  269.     DCR    A
  270.     STA    LINCNT
  271.     RNZ
  272.     MVI    A,LINES
  273.     STA    LINCNT
  274.     CALL    INLMSG    ;ALLOW TIME TO VIEW THE SCREEN
  275.     DB    '[More]','$'
  276.     MVI    C,1
  277.     CALL    @BDOS    ;WAIT FOR KEYPRESS
  278.     ANI    5FH
  279.     CPI    CTRLC    ;ABORT IF CTRL C
  280.     JZ    EXIT
  281.     CALL    INLMSG    ;ELSE, SHOW MORE
  282.     DB    0DH,0AH,'$'
  283.     RET
  284. ;
  285. ;DISPLAY HL AS HEX
  286. ;
  287. HLOUT    MOV    A,H
  288.     PUSH    H
  289.     CALL    HEXOUT
  290.     POP    H
  291.     MOV    A,L
  292. ;
  293. ;DISPLAY ACC. AS HEX
  294. ;
  295. HEXOUT    PUSH    PSW
  296.     RAR
  297.     RAR
  298.     RAR
  299.     RAR
  300.     CALL    PRTNBL
  301.     POP    PSW
  302. PRTNBL    ANI    0FH
  303.     CPI    10    ;CONVERT TO ASCII
  304.     JC    SML
  305.     ADI    7
  306. SML    ADI    '0'
  307.     JMP    TYPE
  308. ;
  309. ;CONVERT ACC FROM ASCII TO HEX DIGIT, RETURN CARRY FLAG CLEAR
  310. ;IF VALID HEX DIGIT.
  311. ;
  312. VALHEX    SUI    '0'    ;SUBTRACT ASCII ZERO OFFSET
  313.     RC
  314.     CPI    16+7    ;GREATER THAN "F" ?
  315.     CMC        ;ADJUST CARRY FLAG
  316.     RC
  317.     CPI    10
  318.     CMC        ;ADJUST CARRY FLAG
  319.     RNC
  320.     SUI    7    ; A-F OFFSET
  321.     RET
  322. ;
  323. ; OUTPUT IN-LINE MESSAGE TO CONSOLE
  324. INLMSG:    XTHL        ;SAVE H, GET TEXT LOCATION
  325.     PUSH    PSW
  326.     MOV    A,M
  327. INLML:    CALL    TYPE
  328.     INX    H
  329.     MOV    A,M
  330.     CPI    '$'
  331.     JNZ    INLML   ;$ ENDS TEXT
  332.     INX    H
  333.     POP    PSW
  334.     XTHL
  335.     RET    ;RETURN AFTER TEXT
  336. ;
  337. ;SEND CONTENTS OF ACC. TO CONSOLE
  338. ;
  339. TYPE    PUSH    B
  340.     PUSH    D
  341.     PUSH    H
  342.     MOV    E,A
  343.     MVI    C,2
  344.     CALL    @BDOS
  345.     POP    H
  346.     POP    D
  347.     POP    B
  348.     RET
  349. ;
  350. ;THE FOLLOWING ROUTINE ALLOWS FILES IN DIFFERENT USER AREAS
  351. ;TO BE COMPARED.
  352. ;SINCE THE CP/M CCP CANNOT DEAL WITH THE d/u: FORM OF DRIVE/USER
  353. ;SPECIFICATION WE MUST PROVIDE A BUILT-IN ROUTINE TO PARSE THE
  354. ;COMMAND LINE FILE NAMES AND BUILD THE DEFAULT FCB AT 5CH AND 6CH.
  355. ;
  356. PCL:    MVI    C,20H
  357.     MVI    E,0FFH
  358.     CALL    @BDOS    ;GET CURRENT USER NUMBER
  359.     STA    DEFUSR    ;AND SAVE
  360. ;
  361.     LXI    H,@TBUF+2
  362.     LXI    D,@TFCB
  363.     CALL    SCAN
  364.     MOV    A,C        ;GET USER FOR FILE 1
  365.     STA    FILE1USR
  366.     MOV    A,B        ;GET DRIVE FOR FILE 1
  367.     STA    @TFCB
  368.     MOV    A,M
  369.     CPI    00H        ;COMMAND LINE TERMINATOR?
  370.     JZ    PCL1        ;IF YES, DONE.
  371.     INX    H        ;SKIP SPACE
  372.     LXI    D,@TFCB+16
  373.     CALL    SCAN
  374.     MOV    A,C        ;GET USER FOR FILE 2
  375.     STA    FILE2USR
  376.     MOV    A,B        ;GET DRIVE FOR FILE 2
  377.     STA    @TFCB+16
  378.     RET
  379. PCL1:    LDA    DEFUSR
  380.     STA    FILE2USR    ;SET USER FOR FILE2 TO DEFAULT.
  381.     RET
  382. ;
  383. ;SFNAME.MAC FROM SYSLIB 2.0
  384. ;*
  385. ;*  SCAN is a file name scanner.  Pointing to the first character
  386. ;*    of a file name specification of the form 'du:filename.typ', where
  387. ;*    any part of this specification is optional, this routine
  388. ;*    properly initializes the FN and FT (File Name and
  389. ;*    File Type) fields if 'filename.typ' or any part thereof is present,
  390. ;*    and returns the value of d and u if they are specified
  391. ;*
  392. ;*
  393. MAXDISK    EQU    16    ; MAX NUMBER OF DISKS
  394. MAXUSER    EQU    31    ; MAX USER NUMBER
  395. ;*
  396. ;*  MAIN MODULE
  397. ;*    ON ENTRY, DE PTS TO FCB TO BE FILLED AND HL PTS TO FIRST BYTE OF
  398. ;*        TARGET STRING; FCB IS 36 BYTES LONG
  399. ;*    ON EXIT, B=DISK NUMBER (1 FOR A, ETC) AND C=USER NUMBER
  400. ;*        HL PTS TO TERMINATING CHAR
  401. ;*        A=0 AND Z SET IF ERROR IN DISK OR USER NUMBERS, A=0FFH AND NZ
  402. ;*            IF OK
  403. ;*
  404. SCAN:
  405.     MVI    A,00H    ; SET DEFAULT DISK AND USER
  406.     STA    DISK
  407.     LDA    DEFUSR
  408.     STA    USER
  409.     PUSH    D
  410.     PUSH    H    ; SAVE PTR
  411. COLON:            ; SCAN FOR COLON IN STRING
  412.     MOV    A,M    ; SCAN FOR COLON OR SPACE
  413.     INX    H    ; PT TO NEXT
  414.     CPI    ':'    ; COLON FOUND?
  415.     JZ    COLON1
  416.     CPI    ','    ; COMMA FOUND?
  417.     JZ    GETF1
  418.     CPI    ' '+1    ; DELIM?
  419.     JC    GETF1
  420.     JMP    COLON    ; CONTINUE IF NOT END OF LINE
  421. COLON1:
  422.     POP    H    ; CLEAR STACK
  423.     MOV    A,M    ; SAVE POSSIBLE DRIVE SPEC
  424.     CPI    'A'    ; DIGIT IF LESS THAN 'A'
  425.     JC    USERCK    ; PROCESS USER NUMBER
  426.     SUI    'A'    ; CONVERT TO 0-15
  427.     CPI    MAXDISK    ; WITHIN BOUNDS?
  428.     JC    SVDISK
  429. ERREXIT:
  430.     XRA    A    ; ERROR INDICATOR
  431.     POP    D    ; RESTORE DE
  432.     CALL    ERXIT
  433.     DB    CR,LF,'COMMAND LINE SYNTAX ERROR','$'
  434.     RET        ; REDUNDANT
  435.  
  436. ;  LOG IN SPECIFIED DISK
  437. SVDISK:
  438.     INR    A    ; ADJUST TO 1 FOR A
  439.     STA    DISK    ; SAVE FLAG
  440.     INX    H    ; PT TO NEXT CHAR
  441.  
  442. ;  CHECK FOR USER
  443. USERCK:
  444.     MOV    A,M    ; GET POSSIBLE USER NUMBER
  445.     CPI    ':'    ; NO USER NUMBER
  446.     JZ    GETFILE
  447.     CPI    '?'    ; ALL USER NUMBERS?
  448.     JNZ    USERC1
  449.     JMP    ERREXIT    ; FATAL ERROR
  450. USERC1:
  451.     XRA    A    ; ZERO USER NUMBER
  452.     MOV    B,A    ; B=ACCUMULATOR FOR USER NUMBER
  453. USRLOOP:
  454.     MOV    A,M    ; GET DIGIT
  455.     INX    H    ; PT TO NEXT
  456.     CPI    ':'    ; DONE?
  457.     JZ    USRDN
  458.     SUI    '0'    ; CONVERT TO BINARY
  459.     JC    ERREXIT    ; USER NUMBER ERROR?
  460.     CPI    10
  461.     JNC    ERREXIT
  462.     MOV    C,A    ; NEXT DIGIT IN C
  463.     MOV    A,B    ; OLD NUMBER IN A
  464.     ADD    A    ; *2
  465.     ADD    A    ; *4
  466.     ADD    B    ; *5
  467.     ADD    A    ; *10
  468.     ADD    C    ; *10+NEW DIGIT
  469.     MOV    B,A    ; RESULT IN B
  470.     JMP    USRLOOP
  471. USRDN:
  472.     MOV    A,B    ; GET NEW USER NUMBER
  473.     CPI    MAXUSER+1    ; WITHIN RANGE?
  474.     JNC    ERREXIT
  475.     STA    USER    ; SAVE IN FLAG
  476.     JMP    GETFILE
  477.  
  478. ;  EXTRACT FILE NAME
  479. GETF1:
  480.     POP    H    ; GET PTR TO BYTE
  481. GETFILE:
  482.     MOV    A,M    ; PTING TO COLON?
  483.     CPI    ':'
  484.     JNZ    GFILE1
  485.     INX    H    ; SKIP OVER COLON
  486. GFILE1:
  487.     MOV    A,M    ; GET NEXT CHAR
  488.     CPI    ','    ; DELIM?
  489.     JZ    GFQUES
  490.     CPI    ' '+1    ; NOT A DELIMITER?
  491.     JNC    GFILE2
  492. GFQUES:
  493.     INX    D    ; FILL WITH ' '
  494.     MVI    B,11    ; 11 BYTES
  495.     MVI    A,' '
  496. GFFILL:
  497.     STAX    D    ; PUT SPACE
  498.     INX    D    ; PT TO NEXT
  499.     DCR    B    ; COUNT DOWN
  500.     JNZ    GFFILL
  501. FNDONE:
  502.     LDA    DISK    ; GET DISK NUMBER
  503.     MOV    B,A    ; ... IN B
  504.     LDA    USER    ; GET USER NUMBER
  505.     MOV    C,A    ; ... IN C
  506.     POP    D    ; RESTORE REGS
  507.     MVI    A,0FFH    ; NO ERROR
  508.     ORA    A    ; SET FLAGS
  509.     RET
  510. ;  GET FILE NAME FIELDS
  511. GFILE2:
  512.     MVI    B,8    ; AT MOST 8 BYTES FOR FN
  513.     CALL    SCANF    ; SCAN AND FILL
  514.     MVI    B,3    ; AT MOST 3 BYTES FOR FT
  515.     MOV    A,M    ; GET DELIMITER
  516.     CPI    '.'    ; FN ENDING IN '.'?
  517.     JNZ    GFILE3
  518.     INX    H    ; PT TO CHAR AFTER '.'
  519.     CALL    SCANF    ; SCAN AND FILL
  520.     JMP    FNDONE    ; DONE ... RETURN ARGS
  521. GFILE3:
  522.     CALL    SCANF4    ; FILL WITH <SP>
  523.     JMP    FNDONE
  524. ;
  525. ;  SCANNER ROUTINE
  526. ;
  527. SCANF:
  528.     CALL    DELCK    ; CHECK FOR DELIMITER
  529.     JZ    SCANF4    ; <SP> FILL IF FOUND
  530.     INX    D    ; PT TO NEXT BYTE IN FN
  531.     CPI    '*'    ; ? FILL?
  532.     JZ    ERREXIT    ;NO WILDCARDS ALLOWED
  533.     CPI    '?'
  534.     JZ    ERREXIT    ;NO WILDCARDS ALLOWED
  535. SCANF1:
  536.     STAX    D    ; PLACE CHAR
  537.     INX    H    ; PT TO NEXT POSITION
  538. SCANF2:
  539.     DCR    B    ; COUNT DOWN
  540.     JNZ    SCANF    ; CONTINUE LOOP
  541. SCANF3:
  542.     CALL    DELCK    ; "B" CHARS OR MORE - SKIP TO DELIMITER
  543.     RZ
  544.     INX    H    ; PT TO NEXT
  545.     JMP    SCANF3
  546. SCANF4:
  547.     INX    D    ; PT TO NEXT FN OR FT
  548.     MVI    A,' '    ; <SP> FILL
  549.     STAX    D
  550.     DCR    B    ; COUNT DOWN
  551.     JNZ    SCANF4
  552.     RET
  553.  
  554. ;*
  555. ;*  BUFFERS
  556. ;*
  557. DISK:    DS    1    ; DISK NUMBER
  558. USER:    DS    1    ; USER NUMBER
  559.  
  560. ;
  561. ;  CHECK CHAR PTED TO BY HL FOR A DELIMITER
  562. ;    RET WITH Z FLAG SET IF DELIMITER
  563. ;
  564. DELCK:
  565.     MOV    A,M    ; GET CHAR
  566.     ORA    A    ; 0=DELIM
  567.     RZ
  568.     CPI    ' '+1    ; <SP>+1
  569.     JC    DELCK1    ; <SP> OR LESS
  570.     CPI    '='
  571.     RZ
  572.     CPI    5FH    ; UNDERSCORE
  573.     RZ
  574.     CPI    '.'
  575.     RZ
  576.     CPI    ':'
  577.     RZ
  578.     CPI    ';'
  579.     RZ
  580.     CPI    ','
  581.     RZ
  582.     CPI    '<'
  583.     RZ
  584.     CPI    '>'
  585.     RET
  586. DELCK1:
  587.     CMP    M    ; COMPARE WITH SELF FOR OK
  588.     RET
  589. ;
  590. HELP    LXI    D,USAGE
  591.     MVI    C,9
  592.     CALL    @BDOS
  593.     JMP    EXIT
  594. ;
  595. USAGE    DB    CR,LF
  596.     DB    'Determines if two files are equal',CR,LF
  597.     DB    '   Usage:',CR,LF,CR,LF
  598.     DB    'COMPARE [du:]UFN1.UFT [du:][UFN2.UFT] ['
  599.     DB    '$' OR 80H        ;ALLOWS DOLLAR SIGN IN MESSAGE
  600.     DB    'S[ADDR]]',CR,LF,CR,LF
  601.     DB    'du are optional drive and user area for the files.',CR,LF
  602.     DB    'UFN1.TYP is the first unambiguous file name.',CR,LF
  603.     DB    'UFN2.TYP is the second unambiguous file name and',CR,LF
  604.     DB    'will default to UFN1.TYP if only du2: is given.',CR,LF
  605.     DB    CR,LF
  606.     DB    'The optional ', '$' OR 80H, 'S '
  607.     DB    'is primarily for .COM or similar files',CR,LF
  608.     DB    'and will Show all addresses with data bytes that differ.'
  609.     DB    CR,LF
  610.     DB    'ADDR is an optional HEX origin address (default = 0100)'
  611.     DB    CR,LF,CR,LF
  612.     DB    'Example:    COMPARE B:FOOBAR.COM C3:WOMBAT.OBJ ','$' OR 80H
  613.     DB    'S7E00',CR,LF
  614.     DB    '$'
  615. ;
  616. EOFLG    DB    'N'
  617. COL    DB    0
  618. BYTES    DB    '        BYTES',0DH,0AH,'$'
  619. PRTPTR    DW    BUFF
  620. ;
  621. DEFUSR    DB    0
  622. F1USER    DB    0
  623. F2USER    DB    0
  624. ;
  625. LINCNT    DB    LINES
  626. SHOFLG    DB    0
  627. ADDR    DW    1
  628. ERRFLG    DB    0
  629.     DS    30    ;STACK
  630. STACK    EQU    $
  631. ;ORG TO PAGE BECAUSE 'INR L' USED TO LOOP THRU IT
  632.     ORG    ($+255) AND 0FF00H ;TO PAGE
  633. BUFF    EQU    $
  634.     REPT    16
  635.     DB    '                '
  636.     ENDM
  637. BUFFERS    EQU    $
  638. MEMSIZE    EQU    BUFFERS+@NXTB
  639.     END
  640.