home *** CD-ROM | disk | FTP | other *** search
/ CP/M / CPM_CDROM.iso / simtel / sigm / vols000 / vol073 / comp-12.asm < prev    next >
Encoding:
Assembly Source File  |  1984-04-29  |  6.3 KB  |  375 lines

  1. ;********************************************************
  2. ;*                            *
  3. ;*        BINARY FILE COMPARE UTILITY        *
  4. ;*                            *
  5. ;********************************************************
  6. ;
  7. ;
  8. ;    Portions Copyright (C) 1980
  9. ;
  10. ;    Bill Bolton,
  11. ;    Software Tools,
  12. ;    P.O. Box 80,
  13. ;    Newport Beach,,
  14. ;    NSW, 2106
  15. ;    AUSTRALIA
  16. ;
  17. ;    History:
  18. ;
  19. ;    1/Oct/77     Version 1.00 by Ward Christensen
  20. ;
  21. ;    31/Jan/80     Version 1.10 by Bill Bolton, improved
  22. ;             error messages and optional file display
  23. ;
  24. ;    6/Sept/80     Version 1.20 by Bill Bolton, copy second
  25. ;             filename from first, if second blank
  26. ;
  27. ;
  28.     MACLIB    MACRO3        ;OFTWARE TOOLS SPECIAL MACROS
  29. ;
  30.     ORG    100H
  31. ;
  32.     CALL    START    ;PRINT ID MESSAGE
  33. ;
  34.     DB    0DH,0AH,'Binary File Compare '
  35.     DB    'Utility : Version 1.20'
  36.     DB    0DH,0AH
  37.     DB    'DDH Compatible Display by Bill Bolton'
  38.     DB    0DH,0AH
  39.     DB    'Software Tools, Australia'
  40.     DB    0DH,0AH,'$'
  41. ;
  42. START:
  43.     POP    D
  44.     CALL    PRINT$MESSAGE
  45.     LXI    H,0
  46.     DAD    SP    ;HL=CP/M'S STACK
  47.     SHLD    STACK    ;SAVE IT
  48.     LXI    SP,STACK ;SET UP NEW STACK
  49. ;
  50.     LDA    FCB+17    ;POINT TO FILENAME IN SECOND FCB 
  51.     CPI    ' '    ;EMPTY?
  52.     JNZ    SAVE$NAME ;NO, JUST MOVE IT
  53.     LXI    D,FCB+1    ;YES, POINT TO FILENAME IN FIRST FCB
  54.     LXI    H,FCB+17 ;POINT TO FILENAME IN SECOND FCB
  55.     MVI    B,11    ;LENGTH OF FILE NAME
  56.     CALL    MOVEIT    ;MOVE FILENAME
  57. ;
  58. ;MOVE THE SECOND FCB SO OPENING THE FIRST
  59. ;WON'T WIPE IT OUT
  60. ;
  61. SAVE$NAME:
  62.     CALL    MOVE$FCB
  63. ;
  64. ;PRINT OPENING MESSAGE
  65. ;
  66.     LXI    D,FIRST
  67.     CALL    PRINT$MESSAGE
  68.     CALL    CONSOLE
  69.     CPI    'Y'
  70.     JNZ    BLANK
  71.     MVI    A,0FFH
  72.     STA    PRFLAG
  73. BLANK:
  74.     LXI    D,NEWLINE
  75.     CALL    PRINT$MESSAGE
  76. ;
  77. ;OPEN BOTH FILES, EXITING IF EITHER DOESN'T EXIST
  78. ;
  79.     CALL    OPEN$FILES
  80. ;
  81. ;READ EACH FILE 1 BYTE AT A TIME, COMPARING THEM
  82. ;
  83. COMPARE:
  84.     CALL    READ1
  85.     MOV    B,A    ;SAVE CHAR READ
  86.     CALL    READ2
  87.     CMP    B    ;SAME?
  88.     JZ    COMPARE
  89. ;
  90. ;UNEQUAL COMPARE
  91. ;
  92.     LXI    D,UNEQ$MSG
  93.     CALL    PRINT$MESSAGE
  94.     LHLD    SECTOR$COUNT
  95.     DECOUT
  96.     LXI    D,SPACEIT
  97.     CALL    PRINT$MESSAGE
  98.     LXI    D,BYTE$MSG
  99.     CALL    PRINT$MESSAGE
  100.     LDA    BUFAD1    ;GET FIRST BUFF ADDR
  101.     SUI    81H    ;SUBTRACT BIAS
  102.     CALL    XO    ;PRINT IN HEX
  103.     LXI    D,SPACEIT
  104.     CALL    PRINT$MESSAGE
  105.     CALL    CONSTAT
  106.     ORA    A
  107.     JZ    COMPARE
  108.     CALL    CONSOLE
  109.     CPI    3        ;IS ^C?
  110.     JZ    EXIT
  111.     CPI    20H        ;IS IT SPACE?
  112.     JNZ    COMPARE
  113. EXIT:
  114.     LHLD    STACK    ;GET CP/M'S STACK
  115.     SPHL        ;RESTORE IT
  116.     RET        ;..AND RETURN
  117. ;
  118. ERXIT:
  119.     POP    D    ;GET MESSAGE
  120.     CALL    PRINT$MESSAGE
  121.     JMP    EXIT
  122. ;
  123. UNEQ$MSG:
  124.     DB    0DH,0AH,'++ FILES UNEQUAL IN SECTOR    $'
  125. ;
  126. BYTE$MSG:
  127.     DB    'AT BYTE    $'
  128. ;
  129. SPACEIT:
  130.     DB    '    $'
  131. ;
  132. NEWLINE:
  133.     DB    0DH,0AH,'$'
  134. ;
  135. FIRST:    DB    0DH,0AH,'Do you want file 1 printed '
  136.     DB    'as it is compared ?'
  137.     DB    '....[Y/N] (CR="N")   ' ,'$'
  138. ;
  139. ; * * * * * * * * * * * * * * * * * * * * * * * *
  140. ;                        *
  141. ;        SUBROUTINES            *
  142. ;                        *
  143. ; * * * * * * * * * * * * * * * * * * * * * * * *
  144. ;
  145. PRINT$MESSAGE:
  146.     MVI    C,STRING
  147.     JMP    BDOS    ;PRINT, RETURN
  148. ;
  149. PRINT$HEX$HL:
  150.     MOV    A,H
  151.     CALL    XO
  152.     MOV    A,L
  153.     CALL    XO
  154.     MVI    A,' '
  155. ;FALL INTO 'TYPE'
  156. ;
  157. TYPE:
  158.     PUSH    B
  159.     PUSH    D
  160.     PUSH    H
  161.     MOV    E,A    ;AS REQ'D BY CP/M
  162.     MVI    C,WRCON
  163.     CALL    BDOS
  164.     POP    H
  165.     POP    D
  166.     POP    B
  167.     RET
  168. ;
  169. XO:
  170.     PUSH    PSW    ;HEX OUT
  171.     RAR
  172.     RAR
  173.     RAR
  174.     RAR
  175.     CALL    NIBBL    ;LEFT NIBBL
  176.     POP    PSW
  177. NIBBL:
  178.     ANI    0FH
  179.     CPI    10
  180.     JC    ISNUM
  181.     ADI    7
  182. ISNUM:
  183.     ADI    '0'
  184.     JMP    TYPE
  185. ;
  186. OPEN$FILES:
  187.     LXI    D,FCB
  188.     MVI    C,OPEN
  189.     CALL    BDOS
  190.     INR    A    ;OPEN OK?
  191.     JNZ    FILE$1$OPEN
  192.     CALL    ERXIT
  193.     DB    0DH,0AH,'***** CANT OPEN FILE 1 ***** ',0DH,0AH,'$'
  194. FILE$1$OPEN:
  195.     LXI    D,FCB2
  196.     MVI    C,OPEN
  197.     CALL    BDOS
  198.     INR    A
  199.     RNZ
  200.     CALL    ERXIT
  201.     DB    0DH,0AH,'***** CANT OPEN FILE 2 *****',0DH,0AH,'$'
  202. ;
  203. READ1:
  204.     LHLD    BUFAD1    ;TIME TO READ?
  205.     DCR    H    ;AT 100H?
  206.     JNZ    NO$READ$1
  207. ;
  208. ;PHYSICALLY READ FILE 1
  209. ;
  210.     LXI    H,80H    ;BUFFER ADDR
  211.     SHLD    BUFAD1
  212.     XCHG        ;TO D,E
  213.     MVI    C,STDMA
  214.     CALL    BDOS
  215.     LXI    D,FCB
  216.     MVI    C,READ
  217.     CALL    BDOS
  218.     ORA    A    ;OK?
  219.     JNZ    EOF$FILE$1
  220.     LHLD    SECTOR$COUNT
  221.     INX    H
  222.     SHLD    SECTOR$COUNT
  223. NO$READ$1:
  224.     LHLD    BUFAD1
  225.     MOV    A,M    ;GET CHAR
  226.     INX    H    ;POINT TO NEXT
  227.     SHLD    BUFAD1
  228. ;
  229. ;REQUEST TO PRINT?
  230. ;
  231.     MOV    L,A    ;SAVE CHAR
  232.     LDA    PRFLAG    ;SET IF FILE 1 TO BE PRINTED ON CONSOLE
  233.     CPI    0    ;PRINT?
  234.     MOV    A,L    ;RESTORE CHAR FOR RET
  235.     RZ        ;RET IF NO PRINT REQ
  236. ;
  237. ;SHOW THE CHARACTER
  238. ;
  239.     CPI    0DH    ;C/R?
  240.     JZ    SHOWIT
  241.     CPI    0AH    ;L/F?
  242.     JZ    SHOWIT
  243.     CPI    9    ;TAB?
  244.     JZ    SHOWIT
  245.     CPI    ' '    ;PRINTABLE?
  246.     JC    SHOWHEX    ;HEX IF NOT PRINTABLE
  247.     CPI    7FH
  248.     JC    SHOWIT
  249. ;SHOW IN HEX
  250. SHOWHEX:
  251.     MVI    A,'('
  252.     CALL    TYPE
  253.     MOV    A,L    ;GET CHAR
  254.     MVI    A,')'
  255. SHOWA:
  256.     CALL    TYPE
  257.     MOV    A,L    ;GET CHAR
  258.     RET
  259. SHOWIT:
  260.     MOV    A,L    ;GET CHAR
  261.     JMP    SHOWA
  262.     RET
  263. ;
  264. ;GOT EOF ON FILE 1 - SHOULD GET EOF ON FILE 2
  265. ;
  266. EOF$FILE$1:
  267.     MVI    A,1    ;GET FLAG
  268.     STA    EOF$FLAG
  269.     CALL    READ2    ;SHOULD NOT RETURN
  270.     CALL    ERXIT
  271.     DB    0DH,0AH,0AH,'***** EOF ON FILE 1, NOT FILE 2 *****$'
  272. ;
  273. READ2:
  274.     LHLD    BUFAD2    ;GET SECOND BUFF
  275.     MOV    A,L    ;GET ADDR
  276.     CPI    (BUF2+128) AND 0FFH ;END?
  277.     JNZ    NO$READ$2
  278. ;
  279. ;DO PHYSICAL READ ON FILE 2
  280. ;
  281.     LXI    H,BUF2
  282.     SHLD    BUFAD2
  283.     XCHG        ;TO DE
  284.     MVI    C,STDMA
  285.     PUSH    B    ;SAVE CHAR FROM FILE 1
  286.     CALL    BDOS
  287.     LXI    D,FCB2
  288.     MVI    C,READ
  289.     CALL    BDOS
  290.     POP    B
  291.     ORA    A
  292.     JNZ    EOF$FILE$2
  293. NO$READ$2:
  294.     LHLD    BUFAD2
  295.     MOV    A,M    ;GET CHAR
  296.     INX    H    ;POINT TO NEXT
  297.     SHLD    BUFAD2    ;SAVE BACK
  298.     RET
  299. ;
  300. EOF$FILE$2:
  301. ;SHOULD HAVE EOF ON 1, THUS EOF$FLAG SHOULD BE ON
  302.     LDA    EOF$FLAG
  303.     ORA    A    ;ON?
  304.     JNZ    A$OK
  305.     CALL    ERXIT
  306.     DB    0DH,0AH,0AH,'***** EOF ON FILE 2 BEFORE FILE 1 *****$'
  307. A$OK:
  308.     LXI    D,MATCH$MSG
  309.     CALL    PRINT$MESSAGE
  310.     LHLD    SECTOR$COUNT
  311.     DECOUT
  312.     CALL    ERXIT
  313.     DB    ' SECTORS .....',0DH,0AH,0AH,'$'
  314. MATCH$MSG:
  315.     DB    0DH,0AH,0AH,'..... FILES MATCH, LENGTH IS $'
  316. ;
  317. MOVE$FCB:
  318.     LXI    H,FCB2
  319.     LXI    D,FCB+16
  320.     MVI    B,16    ;FCB LENGTH
  321. MOVEIT:
  322.     LDAX    D
  323.     MOV    M,A
  324.     INX    D
  325.     INX    H
  326.     DCR    B
  327.     JNZ    MOVEIT
  328.     RET
  329. ;
  330. CONSTAT:
  331.     MVI    C,11
  332.     CALL    BDOS
  333.     RET
  334. ;
  335. CONSOLE:
  336.     MVI    C,1
  337.     CALL    BDOS
  338.     RET
  339. ;
  340.     DS    40    ;STACK AREA
  341. STACK:    DS    2
  342. SECTOR$COUNT:
  343.     DW    0
  344. EOF$FLAG:
  345.     DB    0    ;=1 IF EOF FILE 1
  346. FCB2:    DB    0,'XXXXXXXXYYY',0,0,0
  347.     DB    0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
  348. PRFLAG:    DB    0
  349. BUFAD1:    DW    80H+128    ;INIT TO READ FIRST
  350. BUFAD2:    DW    BUF2+128 ;LIKEWISE
  351. BUF2:    DS    128
  352. ;
  353. ; * * * * * * * * * * * * * * * * * * * * * * * *
  354. ;                        *
  355. ;BDOS/CBIOS EQUATES (VERSION 5)            *
  356. ;                        *
  357. RDCON    EQU    1    ;            *
  358. WRCON    EQU    2    ;            *
  359. STRING    EQU    9    ;            *
  360. OPEN    EQU    15    ;0FFH=NOT FOUND        *
  361. CLOSE    EQU    16    ;   "    "        *
  362. SRCHF    EQU    17    ;   "    "        *
  363. SRCHN    EQU    18    ;   "    "        *
  364. ERASE    EQU    19    ;NO RET CODE        *
  365. DELT    EQU    ERASE    ;            *
  366. READ    EQU    20    ;0=OK, 1=EOF        *
  367. WRITE    EQU    21    ;0=OK, 1=ERR, 2=?,    *
  368. ;            0FFH=NO DIR SPC        *
  369. MAKE    EQU    22    ;0FFH=BAD        *
  370. REN    EQU    23    ;0FFH=BAD        *
  371. STDMA    EQU    26    ;            *
  372. BDOS    EQU    5    ;            *
  373. FCB    EQU    5CH     ;            *
  374. ; * * * * * * * * * * * * * * * * * * * * * * * *
  375.