home *** CD-ROM | disk | FTP | other *** search
/ ftp.barnyard.co.uk / 2015.02.ftp.barnyard.co.uk.tar / ftp.barnyard.co.uk / cpm / walnut-creek-CDROM / CPM / ZCPR2 / DIFF.MAC < prev    next >
Text File  |  2000-06-30  |  17KB  |  795 lines

  1. ;
  2. ;  PROGRAM:  DIFF
  3. ;  AUTHOR:  Richard Conn
  4. ;  VERSION:  1.6
  5. ;  DATE:  16 JAN 83
  6. ;  PREVIOUS VERSIONS:  1.5 (9 JAN 83), 1.4 (6 JAN 83), 1.3 (4 JAN 83)
  7. ;  PREVIOUS VERSIONS:  1.2 (19 DEC 82), 1.1 (8 DEC 82), 1.0 (24 JULY 82)
  8. ;  DERIVATION:  COMPARE, VERSION 1.1
  9. ;
  10. VERS    EQU    16
  11.  
  12. ;
  13. ;    This program is Copyright (c) 1982, 1983 by Richard Conn
  14. ;    All Rights Reserved
  15. ;
  16. ;    ZCPR2 and its utilities, including this one, are released
  17. ; to the public domain.  Anyone who wishes to USE them may do so with
  18. ; no strings attached.  The author assumes no responsibility or
  19. ; liability for the use of ZCPR2 and its utilities.
  20. ;
  21. ;    The author, Richard Conn, has sole rights to this program.
  22. ; ZCPR2 and its utilities may not be sold without the express,
  23. ; written permission of the author.
  24. ;
  25.  
  26.  
  27. ;
  28. ;    DIFF is designed to provide the user with a convenient method
  29. ; to compare the contents of two files.  It is invoked by one of two basic
  30. ; forms:
  31. ;
  32. ;        DIFF filename.typ
  33. ; or
  34. ;        DIFF file1.typ file2.typ
  35. ;
  36. ;    The first form compares the file named "filename.typ" on drive A:
  37. ; to the file of the same name on drive B:; the second form compares the
  38. ; file named "file1.typ" on drive A: to the file named "file2.typ" on drive
  39. ; B:.  Wild cards may NOT be used.  The listing generated by the program gives
  40. ; relative offsets (in hex and decimal) as well as the different byte values
  41. ; in hex, decimal, and ASCII.
  42. ;
  43.  
  44. ;  TERMINAL CONSTANT
  45. LSET    EQU    22    ; NUMBER OF LINES/SCREEN
  46.  
  47. ;  SIZE OF BUFFER
  48. BLIMIT    EQU    32    ; NUMBER OF 128-BYTE BLOCKS
  49. BSIZE    EQU    BLIMIT*128    ; 4K
  50.  
  51. ;  CP/M Constants
  52. CPM    equ    0    ; CP/M Warm Boot
  53. BUFF    equ    CPM+80H    ; Temporary Buffer
  54. CR    equ    0DH    ; <CR>
  55. LF    equ    0AH    ; <LF>
  56.  
  57. ;  CRC ROUTINES
  58.     EXT    CRCCLR,CRCUPD,CRCDONE
  59.  
  60. ;  SYSLIB ROUTINES
  61.     EXT    PHL4HC,PHLDC,PA2HC,PADC
  62.     EXT    BDOS,INITFCB
  63.     EXT    LOGUD,RETUD
  64.     EXT    F$OPEN,F$CLOSE,F$READ
  65.     EXT    CAPS,CIN,COUT,CRLF,MOVEB,PRINT
  66.     EXT    ZGPINS,ZFNAME
  67.     EXT    CODEND
  68.  
  69. ;
  70. ;  Branch to Start of Program
  71. ;
  72.     JMP    START
  73.  
  74. ;
  75. ;******************************************************************
  76. ;
  77. ;  SINSFORM -- ZCPR2 Utility Standard General Purpose Initialization Format
  78. ;
  79. ;    This data block precisely defines the data format for
  80. ; initial features of a ZCPR2 system which are required for proper
  81. ; initialization of the ZCPR2-Specific Routines in SYSLIB.
  82. ;
  83.  
  84. ;
  85. ;  EXTERNAL PATH DATA
  86. ;
  87. EPAVAIL:
  88.     DB    0FFH    ; IS EXTERNAL PATH AVAILABLE? (0=NO, 0FFH=YES)
  89. EPADR:
  90.     DW    40H    ; ADDRESS OF EXTERNAL PATH IF AVAILABLE
  91.  
  92. ;
  93. ;  INTERNAL PATH DATA
  94. ;
  95. INTPATH:
  96.     DB    0,0    ; DISK, USER FOR FIRST PATH ELEMENT
  97.             ; DISK = 1 FOR A, '$' FOR CURRENT
  98.             ; USER = NUMBER, '$' FOR CURRENT
  99.     DB    0,0
  100.     DB    0,0
  101.     DB    0,0
  102.     DB    0,0
  103.     DB    0,0
  104.     DB    0,0
  105.     DB    0,0    ; DISK, USER FOR 8TH PATH ELEMENT
  106.     DB    0    ; END OF PATH
  107.  
  108. ;
  109. ;  MULTIPLE COMMAND LINE BUFFER DATA
  110. ;
  111. MCAVAIL:
  112.     DB    0FFH    ; IS MULTIPLE COMMAND LINE BUFFER AVAILABLE?
  113. MCADR:
  114.     DW    0FF00H    ; ADDRESS OF MULTIPLE COMMAND LINE BUFFER IF AVAILABLE
  115.  
  116. ;
  117. ;  DISK/USER LIMITS
  118. ;
  119. MDISK:
  120.     DB    4    ; MAXIMUM NUMBER OF DISKS
  121. MUSER:
  122.     DB    31    ; MAXIMUM USER NUMBER
  123.  
  124. ;
  125. ;  FLAGS TO PERMIT LOG IN FOR DIFFERENT USER AREA OR DISK
  126. ;
  127. DOK:
  128.     DB    0FFH    ; ALLOW DISK CHANGE? (0=NO, 0FFH=YES)
  129. UOK:
  130.     DB    0FFH    ; ALLOW USER CHANGE? (0=NO, 0FFH=YES)
  131.  
  132. ;
  133. ;  PRIVILEGED USER DATA
  134. ;
  135. PUSER:
  136.     DB    10    ; BEGINNING OF PRIVILEGED USER AREAS
  137. PPASS:
  138.     DB    'chdir',0    ; PASSWORD FOR MOVING INTO PRIV USER AREAS
  139.     DS    41-($-PPASS)    ; 40 CHARS MAX IN BUFFER + 1 for ending NULL
  140.  
  141. ;
  142. ;  CURRENT USER/DISK INDICATOR
  143. ;
  144. CINDIC:
  145.     DB    '$'    ; USUAL VALUE (FOR PATH EXPRESSIONS)
  146.  
  147. ;
  148. ;  DMA ADDRESS FOR DISK TRANSFERS
  149. ;
  150. DMADR:
  151.     DW    80H    ; TBUFF AREA
  152.  
  153. ;
  154. ;  NAMED DIRECTORY INFORMATION
  155. ;
  156. NDRADR:
  157.     DW    00000H    ; ADDRESS OF MEMORY-RESIDENT NAMED DIRECTORY
  158. NDNAMES:
  159.     DB    64    ; MAX NUMBER OF DIRECTORY NAMES
  160. DNFILE:
  161.     DB    'NAMES   '    ; NAME OF DISK NAME FILE
  162.     DB    'DIR'        ; TYPE OF DISK NAME FILE
  163.  
  164. ;
  165. ;  REQUIREMENTS FLAGS
  166. ;
  167. EPREQD:
  168.     DB    0FFH    ; EXTERNAL PATH?
  169. MCREQD:
  170.     DB    000H    ; MULTIPLE COMMAND LINE?
  171. MXREQD:
  172.     DB    000H    ; MAX USER/DISK?
  173. UDREQD:
  174.     DB    000H    ; ALLOW USER/DISK CHANGE?
  175. PUREQD:
  176.     DB    000H    ; PRIVILEGED USER?
  177. CDREQD:
  178.     DB    0FFH    ; CURRENT INDIC AND DMA?
  179. NDREQD:
  180.     DB    0FFH    ; NAMED DIRECTORIES?
  181. Z2CLASS:
  182.     DB    0    ; CLASS 0
  183.     DB    'ZCPR2'
  184.     DS    10    ; RESERVED
  185.  
  186. ;
  187. ;  END OF SINSFORM -- STANDARD DEFAULT PARAMETER DATA
  188. ;
  189. ;******************************************************************
  190. ;
  191.  
  192. ;
  193. ;  Start of Program
  194. ;
  195. START:
  196.     CALL    ZGPINS    ; INIT ZCPR2 BUFFERS
  197.     CALL    CODEND    ; ALLOCATE BUFFER SPACE
  198.     SHLD    BUFF1    ; SOURCE 1 BUFFER
  199.     LXI    D,BSIZE    ; SIZE OF BUFFER
  200.     INR    D    ; ADD 1
  201.     DAD    D
  202.     SHLD    BUFF2    ; SOURCE 2 BUFFER
  203.     XRA    A    ; SET NO MULTIPLE RUN
  204.     STA    MULT
  205.     CALL    RETUD    ; GET CURRENT USER/DISK
  206.     MOV    A,B    ; SAVE DISK
  207.     STA    CDISK
  208.     MOV    A,C    ; SAVE USER
  209.     STA    CUSER
  210.     LXI    H,BUFF    ; PROCESS OPTIONS IN BUFFER
  211.     MOV    A,M    ; GET CHAR COUNT
  212.     INX    H    ; PT TO FIRST CHAR
  213.     PUSH    H    ; SAVE PTR TO FIRST CHAR
  214.     ADD    L    ; HL=HL+A
  215.     MOV    L,A
  216.     MOV    A,H
  217.     ACI    0
  218.     MOV    H,A
  219.     MVI    M,0    ; STORE ENDING ZERO
  220.     POP    H    ; GET PTR TO FIRST CHAR
  221.     LXI    D,INLINE    ; PT TO INPUT LINE BUFFER
  222.     PUSH    D    ; SAVE PTR
  223. START0:
  224.     MOV    A,M    ; COPY INPUT LINE SO BUFF MAY BE USED
  225.     STAX    D    ; PUT BYTE
  226.     INX    H    ; PT TO NEXT
  227.     INX    D
  228.     ORA    A    ; EOL?
  229.     JNZ    START0
  230.     POP    H    ; PT TO FIRST CHAR
  231.     CALL    SBLANK    ; SKIP SPACES
  232.     ORA    A    ; EOL?
  233.     JZ    PRHELP    ; PRINT HELP IF SO
  234.     CPI    '/'    ; ASKING FOR HELP?
  235.     JZ    PRHELP
  236.     LXI    D,FCBS    ; PT TO SOURCE FCB
  237.     CALL    ZFNAME    ; EXTRACT NAME AND DIRECTORY DATA
  238.     JNZ    START1
  239. UDERR:
  240.     CALL    PRINT
  241.     DB    CR,LF,'Invalid Disk or User -- Aborting',0
  242.     RET
  243. START1:
  244.     MOV    A,B    ; SAVE SOURCE DISK
  245.     CPI    0FFH    ; CHECK FOR CURRENT
  246.     JNZ    SDISK1
  247.     LDA    CDISK    ; SPECIFY CURRENT DISK INSTEAD
  248.     INR    A    ; ADD 1 FOR FOLLOWING DECREMENT
  249. SDISK1:
  250.     DCR    A    ; DOWN 1 SO RANGE IS 0-F
  251.     STA    SDISK
  252.     MOV    A,C    ; SAVE SOURCE USER
  253.     CPI    0FFH    ; CHECK FOR CURRENT
  254.     JZ    SUSER0
  255.     CPI    '?'    ; WILD IS CURRENT
  256.     JNZ    SUSER1
  257. SUSER0:
  258.     LDA    CUSER    ; GET CURRENT USER
  259. SUSER1:
  260.     STA    SUSER
  261.     MOV    A,M    ; GET SEPARATION CHAR
  262.     CPI    ','    ; COMMA IF SECOND NAME SPECIFIED
  263.     JZ    START2
  264.     PUSH    H    ; SAVE PTR
  265.     LXI    H,FCBS+1    ; NO 2ND NAME, SO SET IT TO SAME AS FIRST
  266.     LXI    D,FCBD+1
  267.     MVI    B,11    ; 11 BYTES
  268.     CALL    MOVEB
  269.     LDA    CDISK    ; SET DISK AND USER TO CURRENT
  270.     STA    DDISK
  271.     LDA    CUSER
  272.     STA    DUSER
  273.     POP    H    ; GET PTR
  274.     JMP    START3
  275. START2:
  276.     INX    H    ; PT TO NEXT CHAR AFTER COMMA
  277.     LXI    D,FCBD    ; SET DEST FCB
  278.     CALL    ZFNAME    ; PROCESS NAME
  279.     JZ    UDERR
  280.     LDA    FCBD+1    ; CHECK FOR AMBIGUOUS NAME
  281.     CPI    '?'    ; ASSUME ALL IS AMBIGUOUS IF FIRST CHAR IS
  282.     JNZ    NOSET
  283.     PUSH    H    ; SAVE PTR
  284.     PUSH    B    ; SAVE USER/DISK
  285.     LXI    H,FCBS+1    ; SET NAMES THE SAME
  286.     LXI    D,FCBD+1    ; COPY SOURCE TO DEST
  287.     MVI    B,11    ; 11 BYTES
  288.     CALL    MOVEB
  289.     POP    B    ; RESTORE BC
  290.     POP    H    ; RESTORE PTR
  291. NOSET:
  292.     MOV    A,B    ; GET DISK
  293.     CPI    0FFH
  294.     JNZ    DDISK1
  295.     LDA    CDISK    ; SELECT CURRENT DISK IF DEFAULT
  296.     INR    A    ; ADD 1 FOR FOLLOWING DECREMENT
  297. DDISK1:
  298.     DCR    A
  299.     STA    DDISK
  300.     MOV    A,C    ; GET USER
  301.     CPI    0FFH    ; CURRENT?
  302.     JZ    DUSER0
  303.     CPI    '?'    ; WILD IS CURRENT
  304.     JNZ    DUSER1
  305. DUSER0:
  306.     LDA    CUSER
  307. DUSER1:
  308.     STA    DUSER    ; SET DEST USER
  309. START3:
  310.     CALL    SBLANK    ; SKIP SPACES
  311.     CPI    'M'    ; MULTIPLE OPTION?
  312.     JNZ    START4
  313.     MVI    A,0FFH    ; SET FLAG
  314.     STA    MULT
  315. START4:
  316.     LXI    H,FCBS    ; SET UP SOURCE FCB
  317.     CALL    QCHECK    ; NO AMBIGUOUS ENTRIES PERMITTED
  318.     LXI    H,FCBD    ; SET UP DESTINATION FCB
  319.     CALL    QCHECK    ; NO AMBIGUOUS ENTRIES PERMITTED
  320. MLOOP:
  321.     CALL    BANNER    ; PRINT BANNER
  322.     LDA    MULT    ; MULTIPLE RUNS
  323.     ORA    A
  324.     JZ    MLOOP1
  325.     CALL    PRS1    ; PRINT SOURCE FILE 1
  326.     CALL    PRS2    ; PRINT SOURCE FILE 2
  327.     CALL    PRINT
  328.     DB    CR,LF,'  Change Disks if Desired and Type ^C or A to Abort or '
  329.     DB    '<RETURN> to Continue - ',0
  330.     CALL    CIN    ; GET RESPONSE
  331.     CALL    CAPS    ; CAPITALIZE
  332.     CPI    3    ; ABORT?
  333.     RZ
  334.     CPI    'A'    ; ABORT?
  335.     RZ
  336.     MVI    C,13    ; RESET DISKS
  337.     CALL    BDOS
  338. MLOOP1:
  339.     CALL    PRS1    ; PRINT FILE NAMES
  340.     CALL    PRS2
  341.     CALL    LOGS    ; LOG IN SOURCE DISK/USER
  342.     LXI    D,FCBS    ; TRY TO OPEN SOURCE 1
  343.     CALL    INITFCB    ; INIT FCB
  344.     CALL    F$OPEN    ; Z IF NO ERROR
  345.     JNZ    FERR
  346.     CALL    LOGD    ; LOG IN DEST DISK/USER
  347.     LXI    D,FCBD    ; TRY TO OPEN SOURCE 2
  348.     CALL    INITFCB    ; INIT FCB
  349.     CALL    F$OPEN
  350.     JNZ    FERR
  351.     XRA    A    ; A=0
  352.     STA    FIRST    ; SET FLAG FOR FIRST ERROR
  353.     LXI    H,0    ; INIT OFFSET
  354.     SHLD    OFFSET
  355.     CALL    VERIFY    ; PERFORM VERIFICATION
  356.     LDA    FIRST    ; ANY ERRORS?
  357.     ORA    A    ; 0=NO ERRORS
  358.     JNZ    MLOOP2
  359.     CALL    PRINT
  360.     DB    CR,LF,'NO Differences Noted in Files',0
  361.     CALL    CRLF    ; NEW LINE
  362. MLOOP2:
  363.     CALL    CRLF
  364.     LDA    MULT    ; CHECK FOR MULTIPLE RUNS
  365.     ORA    A    ; 0=NO
  366.     JNZ    MLOOP
  367.     RET
  368. FERR:
  369.     CALL    PRINT
  370.     DB    CR,LF,'File Not Found -- ',0
  371.     CALL    PRFN
  372.     JMP    MLOOP2
  373.  
  374. ;
  375. ;  SKIP TO NON-BLANK CHAR
  376. ;
  377. SBLANK:
  378.     MOV    A,M    ; GET CHAR
  379.     INX    H    ; PT TO NEXT
  380.     CPI    ' '    ; BLANK?
  381.     JZ    SBLANK
  382.     DCX    H    ; PT TO NON-BLANK
  383.     RET
  384.  
  385. ;
  386. ;  PRINT HELP MESSAGE
  387. ;
  388. PRHELP:
  389.     CALL    BANNER    ; PRINT BANNER
  390.     CALL    PRINT
  391.     DB    CR,LF
  392.     DB    CR,LF,'DIFF is used to display all relative differences '
  393.     DB    'between two files'
  394.     DB    CR,LF
  395.     DB    CR,LF,'DIFF is invoked by a command like:'
  396.     DB    CR,LF,'    DIFF dir:file1.typ,dir:file2.typ M'
  397.     DB    CR,LF,'where:'
  398.     DB    CR,LF,'   "file1.typ" must be specified and is unambiguous'
  399.     DB    CR,LF,'   "dir:" is an optional named directory (or DU:)'
  400.     DB    CR,LF,'   "file2.typ" is optional and set equal to '
  401.     DB    '"file1.typ" if omitted'
  402.     DB    CR,LF,'   "M" is optional and allows Multiple Runs if given'
  403.     DB    CR,LF
  404.     DB    CR,LF,'Examples:'
  405.     DB    CR,LF,'Command                  Files Compared'
  406.     DB    CR,LF,'DIFF T.COM,A1:        $$:T.COM, A1:T.COM'
  407.     DB    CR,LF,'DIFF A:T.COM          A$:T.COM, $$:T.COM'
  408.     DB    CR,LF,'DIFF A:T.COM,ROOT:    A$:T.COM, ROOT:T.COM'
  409.     DB    CR,LF,'DIFF A:T.COM,B:S.COM  A$:T.COM, B$:S.COM'
  410.     DB    0
  411.     RET
  412.  
  413. ;
  414. ;  CHECK FOR ANY QUESTION MARKS FROM HL+1 TO HL+11
  415. ;  AFFECT ONLY AF REGISTERS IF OK
  416. ;
  417. QCHECK:
  418.     PUSH    H    ; SAVE HL
  419.     PUSH    B    ; SAVE BC
  420.     INX    H    ; PT TO FIRST CHAR
  421.     MVI    B,11    ; 11 BYTES
  422.     MVI    C,'?'    ; SCAN FOR '?'
  423. QC:
  424.     MOV    A,M    ; GET BYTE
  425.     CMP    C    ; '?'?
  426.     JZ    QC1
  427.     INX    H    ; PT TO NEXT
  428.     DCR    B    ; COUNT DOWN
  429.     JNZ    QC
  430.     POP    B    ; RESTORE
  431.     POP    H
  432.     RET
  433. QC1:
  434.     POP    B    ; RESTORE AND ABORT
  435.     POP    H
  436.     POP    D    ; CLEAR RETURN ADDRESS
  437.     XCHG        ; FCB PTR IN DE
  438.     CALL    BANNER    ; PRINT BANNER
  439.     CALL    CRLF
  440.     CALL    PRFN    ; PRINT FILE NAME
  441.     CALL    PRINT
  442.     DB    '  Ambiguous File Name not Allowed',CR,LF,0
  443.     RET
  444.  
  445. ;
  446. ;  PRINT BANNER
  447. ;
  448. BANNER:
  449.     CALL    PRINT
  450.     DB    'DIFF  Version '
  451.     DB    VERS/10+'0','.',(VERS MOD 10)+'0'
  452.     DB    0
  453.     RET
  454.  
  455. ;
  456. ;  PRINT NAMES OF SOURCE FILES
  457. ;    PRS1 -- SOURCE FILE 1
  458. ;    PRS2 -- SOURCE FILE 2
  459. ;
  460. PRS1:
  461.     CALL    PRINT
  462.     DB    CR,LF,'Source File 1 -- ',0
  463.     LXI    H,SDISK    ; PT TO FIRST BYTE
  464.     CALL    PRUD
  465.     LXI    D,FCBS    ; COMPUTE CRC FOR SOURCE FCB
  466.     JMP    PRFN    ; PRINT FILE NAME
  467. PRS2:
  468.     CALL    PRINT
  469.     DB    CR,LF,'Source File 2 -- ',0
  470.     LXI    H,DDISK    ; PT TO FIRST BYTE
  471.     CALL    PRUD
  472.     LXI    D,FCBD    ; COMPUTE CRC FOR DESTINATION FCB
  473.     JMP    PRFN    ; PRINT FILE NAME
  474.  
  475. ;
  476. ;  MAIN VERIFY ROUTINE
  477. ;
  478. VERIFY:
  479.     LHLD    BUFF1    ; PT TO BUFFER 1
  480.     PUSH    H    ; SAVE PTR
  481.     CALL    LOGS    ; LOG IN SOURCE 1
  482.     LXI    D,FCBS    ; SOURCE 1 FCB
  483.     CALL    LOAD    ; READ IN BLOCK
  484.     LDA    BCNT    ; GET OLD BLOCK COUNT
  485.     STA    BCNT1    ; SAVE IT
  486.     LHLD    BUFF2    ; PT TO BUFFER 2
  487.     PUSH    H    ; SAVE PTR
  488.     CALL    LOGD    ; LOG IN SOURCE 2
  489.     LXI    D,FCBD    ; SOURCE 2 FCB
  490.     CALL    LOAD    ; READ IN BLOCK
  491.     POP    D    ; DE PTS TO BUFF 2
  492.     POP    H    ; HL PTS TO BUFF 1
  493.     LDA    BCNT    ; CHECK FOR NO BLOCK READ
  494.     MOV    B,A
  495.     LDA    BCNT1
  496.     ORA    B
  497.     RZ        ; DONE IF NONE READ
  498. ;
  499. ;  VERIFY LOADED BUFFERS BY COMPARING THEM AND PRINTING DIFFERENCES
  500. ;
  501. VERBLOCK:
  502.     MVI    B,128    ; SCAN ONE BLOCK
  503. VERBL:
  504.     LDAX    D    ; GET BYTE
  505.     CMP    M    ; COMPARE
  506.     CNZ    NOMATCH    ; PRINT DIFFERENCE
  507.     PUSH    H    ; INC OFFSET
  508.     LHLD    OFFSET
  509.     INX    H
  510.     SHLD    OFFSET
  511.     POP    H
  512.     INX    H    ; PT TO NEXT
  513.     INX    D
  514.     DCR    B    ; COUNT DOWN
  515.     JNZ    VERBL
  516.     LDA    BCNT    ; COUNT DOWN
  517.     DCR    A
  518.     STA    BCNT
  519.     LDA    BCNT1
  520.     DCR    A
  521.     STA    BCNT1
  522.     JZ    VEREQ
  523.     LDA    BCNT    ; CHECK FIRST BUFFER COUNT
  524.     ORA    A
  525.     JNZ    VERBLOCK    ; CONTINUE COMPARE IF NOT EMPTY
  526. VEREQ:
  527.     LDA    BCNT    ; CHECK FOR BOTH DONE
  528.     MOV    B,A
  529.     LDA    BCNT1
  530.     ORA    B    ; IF ZERO, BOTH DONE AT SAME TIME AND CONTINUE
  531.     JZ    VERIFY
  532.     LDA    BCNT1    ; CHECK FOR ONE DONE BEFORE THE OTHER
  533.     ORA    A    ; 2ND DONE?
  534.     MVI    C,'2'    ; GET LETTER
  535.     JZ    DONE1
  536.     MVI    C,'1'    ; GET LETTER
  537. ;  ONE FILE IS SHORTER THAN THE OTHER -- SAY SO
  538. DONE1:
  539.     CALL    PRINT
  540.     DB    CR,LF,'Source File ',0
  541.     MOV    A,C
  542.     CALL    COUT    ; PRINT LETTER
  543.     CALL    PRINT
  544.     DB    ' has terminated before the other -- DIFF Aborting',0
  545.     RET
  546. ;  MATCH ERROR
  547. NOMATCH:
  548.     PUSH    H    ; SAVE REGS
  549.     PUSH    D
  550.     PUSH    B
  551.     LDA    FIRST    ; FIRST TIME THRU?
  552.     ORA    A    ; 0=YES
  553.     JZ    NMAT0
  554.     LDA    LCNT    ; CHECK FOR NEW SCREEN
  555.     ORA    A    ; ZERO IF DONE
  556.     JNZ    NMAT1
  557.     CALL    PRINT
  558.     DB    CR,LF,'DIFF Pause -- Type <RETURN> to Continue or '
  559.     DB    '^C or A to Abort - ',0
  560.     CALL    CIN    ; GET RESPONSE
  561.     CALL    CAPS
  562.     CPI    'A'    ; ABORT?
  563.     JZ    NMAT00
  564.     CPI    3    ; ABORT?
  565.     JNZ    NMAT0
  566. NMAT00:
  567.     POP    B    ; CLEAR REGS
  568.     POP    D
  569.     POP    H
  570.     POP    D    ; CLEAR STACK
  571.     POP    D
  572.     CALL    PRINT
  573.     DB    CR,LF,'DIFF Aborting',0
  574.     RET
  575. NMAT0:
  576.     MVI    A,0FFH    ; CLEAR FIRST TIME FLAG
  577.     STA    FIRST
  578.     CALL    HEADER    ; PRINT HEADING AND RETURN NEW LINE COUNT
  579. NMAT1:
  580.     DCR    A    ; COUNT DOWN 1 LINE
  581.     STA    LCNT    ; NEW LINE COUNT
  582.     CALL    CRLF
  583.     PUSH    H    ; SAVE HL
  584.     LHLD    OFFSET    ; PRINT OFFSET VALUE
  585.     CALL    PHL4HC    ; PRINT AS HEX
  586.     CALL    SPACER    ; PRINT SPACES
  587.     CALL    PHLDC    ; PRINT AS DEC
  588.     POP    H    ; RESTORE HL
  589.     CALL    SPACER
  590.     CALL    SPACER
  591.     MVI    A,' '
  592.     CALL    COUT
  593.     MOV    A,M    ; GET SOURCE 1 VALUE
  594.     CALL    PRVAL    ; PRINT AS HEX, DEC, ASCII
  595.     CALL    SPACER    ; 10 SPACES
  596.     CALL    SPACER
  597.     CALL    SPACER
  598.     CALL    SPACER
  599.     CALL    SPACER
  600.     LDAX    D    ; GET SOURCE 2 VALUE
  601.     CALL    PRVAL    ; PRINT AS HEX, DEC, ASCII
  602.     POP    B    ; RESTORE REGS
  603.     POP    D
  604.     POP    H
  605.     RET
  606.  
  607. ;  PRINT HEADER AND RETURN NEW LINE COUNT IN A
  608. HEADER:
  609.     PUSH    D    ; SAVE REGS
  610.     PUSH    H
  611.     CALL    PRINT
  612.     DB    CR,LF,' Rel Offset   ',0
  613.     LXI    H,SDISK    ; PRINT DISK/USER
  614.     CALL    PRUD
  615.     LXI    D,FCBS
  616.     CALL    PRFN    ; PRINT FILE NAME
  617.     CALL    SPACER    ; 5 SPACES
  618.     CALL    SPACER
  619.     CALL    SPACE1
  620.     LXI    H,DDISK    ; PRINT DISK/USER
  621.     CALL    PRUD
  622.     LXI    D,FCBD
  623.     CALL    PRFN    ; PRINT FILE NAME
  624.     CALL    PRINT
  625.     DB    CR,LF,' Hex    Dec       Hex  Dec Asc           Hex  Dec Asc',0
  626.     MVI    A,LSET    ; SET LINE COUNT
  627.     SUI    3    ; ADJUST FOR HEADING AND FOOTER
  628.     STA    LCNT
  629.     POP    H
  630.     POP    D    ; RESTORE REGS
  631.     RET
  632.  
  633. ;  PRINT A AS HEX, DEC, AND ASCII
  634. PRVAL:
  635.     CALL    SPACER    ; 3 SPACES
  636.     CALL    SPACE1
  637.     CALL    PA2HC    ; PRINT AS HEX
  638.     CALL    SPACER
  639.     CALL    PADC    ; PRINT AS DEC
  640.     CALL    SPACER
  641.     ANI    7FH    ; MASK OUT MSB
  642.     CPI    7FH    ; DOT FOR <DEL>
  643.     JZ    PRDOT
  644.     CPI    ' '    ; PRINT DOT IF LESS THAN <SP>
  645.     JNC    COUT
  646. PRDOT:
  647.     MVI    A,'.'    ; PRINT DOT
  648.     JMP    COUT
  649. ;  PRINT 2 SPACES
  650. SPACER:
  651.     PUSH    PSW    ; SAVE A
  652.     MVI    A,' '    ; <SP>
  653.     CALL    COUT
  654.     POP    PSW
  655. SPACE1:
  656.     PUSH    PSW
  657.     MVI    A,' '
  658.     CALL    COUT
  659.     POP    PSW
  660.     RET
  661.  
  662. ;
  663. ;  LOAD BUFFER FROM FILE WHOSE FCB IS PTED TO BY DE
  664. ;    ON OUTPUT, BCNT=NUMBER OF BLOCKS LOADED (UP TO BLIMIT)
  665. ;
  666. LOAD:
  667.     XRA    A    ; A=0
  668.     STA    BCNT    ; SET BLOCK COUNT
  669.  
  670. ;  MAIN LOAD LOOP
  671. LOAD1:
  672.     CALL    F$READ    ; READ A BLOCK
  673.     ORA    A    ; END OF FILE?
  674.     RNZ        ; RETURN IF DONE
  675.     PUSH    D    ; SAVE FCB PTR
  676.     LXI    D,BUFF    ; PT TO BUFFER
  677.     MVI    B,128    ; COPY 128 BYTES
  678. LOAD2:
  679.     LDAX    D    ; GET BYTE READ
  680.     MOV    M,A    ; PUT BYTE
  681.     INX    H    ; PT TO NEXT
  682.     INX    D
  683.     DCR    B    ; COUNT DOWN
  684.     JNZ    LOAD2
  685.     POP    D    ; GET FCB PTR
  686.     LDA    BCNT    ; GET BLOCK COUNT
  687.     INR    A    ; INCREMENT IT
  688.     STA    BCNT    ; SET IT
  689.     CPI    BLIMIT    ; LAST BLOCK READ?
  690.     JNZ    LOAD1
  691.     RET
  692.  
  693. ;
  694. ;  LOG IN SOURCE (LOGS) AND DESTINATION (LOGD) DRIVES/USERS
  695. ;
  696. LOGS:
  697.     LDA    SDISK    ; GET DISK
  698.     MOV    B,A
  699.     LDA    SUSER    ; GET USER
  700.     MOV    C,A
  701.     CALL    LOGUD    ; LOG IN
  702.     RET
  703. LOGD:
  704.     LDA    DDISK    ; GET DISK
  705.     MOV    B,A
  706.     LDA    DUSER    ; GET USER
  707.     MOV    C,A
  708.     CALL    LOGUD    ; LOG IN
  709.     RET
  710.  
  711. ;
  712. ;  PRINT DISK/USER PTED TO BY HL (2 BYTES)
  713. ;
  714. PRUD:
  715.     MOV    A,M    ; GET DISK
  716.     ADI    'A'    ; CONVERT TO LETTER
  717.     CALL    COUT
  718.     INX    H    ; PT TO USER
  719.     MOV    A,M    ; GET USER
  720.     CALL    PADC    ; PRINT AS DEC
  721.     CALL    PRINT
  722.     DB    ': ',0
  723.     RET
  724.  
  725. ;
  726. ;  PRINT FILE NAME WHOSE FCB IS PTED TO BY DE
  727. ;
  728. PRFN:
  729.     PUSH    H    ; SAVE REGS
  730.     PUSH    D
  731.     PUSH    B
  732.     XCHG        ; FN PTED TO BY HL
  733.     INX    H    ; PT TO FIRST CHAR
  734.     MVI    B,8    ; 8 CHARS
  735.     CALL    PRFN1
  736.     MVI    A,'.'
  737.     CALL    COUT
  738.     MVI    B,3    ; 3 CHARS FOR FILE TYPE
  739.     CALL    PRFN1
  740.     POP    B    ; RESTORE REGS
  741.     POP    D
  742.     POP    H
  743.     RET
  744. PRFN1:
  745.     MOV    A,M    ; GET CHAR
  746.     INX    H    ; PT TO NEXT
  747.     CALL    COUT    ; PRINT
  748.     DCR    B    ; COUNT DOWN
  749.     JNZ    PRFN1
  750.     RET
  751.  
  752. ;
  753. ;  BUFFERS
  754. ;
  755. BUFF1:
  756.     DS    2    ; PTR TO BUFFER 1
  757. BUFF2:
  758.     DS    2    ; PTR TO BUFFER 2
  759. OFFSET:
  760.     DS    2    ; RELATIVE OFFSET
  761. FIRST:
  762.     DS    1    ; ERROR INDIC
  763. LCNT:
  764.     DS    1    ; LINE COUNT
  765. MULT:
  766.     DS    1    ; MULTIPLE RUN FLAG (0=NO MULT RUNS)
  767. CDISK:
  768.     DS    1    ; CURRENT DISK
  769. CUSER:
  770.     DS    1    ; CURRENT USER
  771. SDISK:
  772.     DS    1    ; SOURCE DISK (MUST BE FOLLOWED BY SUSER)
  773. SUSER:
  774.     DS    1    ; SOURCE USER
  775. FCBS:
  776.     DS    36    ; SOURCE FCB
  777. DDISK:
  778.     DS    1    ; DEST DISK (MUST BE FOLLOWED BY DUSER)
  779. DUSER:
  780.     DS    1    ; DEST USER
  781. FCBD:
  782.     DS    36    ; DESTINATION FCB
  783. CRCVAL:
  784.     DS    2    ; CRC VALUE
  785. CURDISK:
  786.     DS    1    ; CURRENT DISK NUMBER
  787. BCNT:
  788.     DS    1    ; BUFFER COUNT
  789. BCNT1:
  790.     DS    1    ; SECOND BUFFER COUNT
  791. INLINE:
  792.     DS    200    ; INPUT LINE BUFFER
  793.  
  794.     END
  795.