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 / SIMTEL / CPMUG / CPMUG040.ARK / COMPARE.ASM < prev    next >
Assembly Source File  |  1984-04-29  |  3KB  |  222 lines

  1. ;COMPARE.ASM
  2. ;11/??/77 ORIGINALLY WRITTEN BY WARD CHRISTENSEN
  3. ;12/31/77 ADD PICKUP OF SECOND FILENAME IF BLANK
  4. ;01/08/77 ADD SEQIO MACLIB TO READ BIG BLOCKS
  5. BSIZE    EQU    4096    ;DISK BUFFER SIZE (TIMES 2)
  6.     ORG    100H
  7.     MACLIB    SEQIO
  8. MOVE    MACRO    ?F,?T,?L
  9.     MVI    B,?L
  10.     LXI    D,?F
  11.     LXI    H,?T
  12.     CALL    MOVER
  13.     ENDM
  14. ;TYPE SINGLE CHAR OR CHAR IN A
  15. TYPE    MACRO    ?C
  16.     IF    NOT NUL ?C
  17.     MVI    A,?C
  18.     ENDIF
  19.     PUSH    B
  20.     PUSH    D
  21.     PUSH    H
  22.     PUT    CON
  23.     POP    H
  24.     POP    D
  25.     POP    B
  26.     ENDM
  27. PRINT    MACRO    ?L
  28.     LOCAL    Z
  29.     CALL    Z
  30.     IRP    ?M,<?L>
  31.     DB    ?M
  32.     ENDM
  33.     DB    '$'
  34. Z    POP    D
  35.     MVI    C,@MSG
  36.     CALL    @BDOS
  37.     ENDM
  38. ;
  39. ;COMPARE.ASM - COMPARES 2 FILES
  40. ;
  41. ;COMMAND FORMAT: COMPARE NAME1 NAME2
  42. ;    IF NAME2 = NAME1 BUT IS ON B DISK,
  43. ;    JUST TYPE: COMPARE NAME1 B:
  44. ;
  45.     PRINT    <'COMPARE.COM 1/8/78',0DH,0AH>
  46. ;
  47. ;INIT STACK
  48. ;
  49.     POP    H    ;GET CP/M RET ADDR
  50.     SHLD    EXIT+1    ;MODIFY RETURN ADDR
  51.     LXI    SP,STACK    ;GET MY STACK
  52. ;
  53. ;IF THE SECOND FCB IS BLANK,
  54. ;MOVE IN THE NAME FROM THE FIRST
  55. ;
  56.     LDA    @TFCB+17
  57.     CPI    ' '
  58.     JNZ    MOVE2    ;NOT BLANK
  59.     MOVE    @TFCB+1,@TFCB+17,11
  60. ;
  61. ;'DECLARE' BOTH FCB'S
  62. ;
  63. MOVE2    FILE    INFILE,FILE1,,1,,BSIZE
  64.     FILE    INFILE,FILE2,,2,,BSIZE
  65. ;
  66. ;COMPARE THE 2 FILES 1 BYTE AT A TIME
  67. ;
  68. COMP    CALL    READ1
  69.     MOV    B,A    ;SAVE CHAR
  70.     PUSH    B
  71.     CALL    READ2
  72.     POP    B
  73.     CMP    B
  74.     JZ    COMP
  75. ;
  76. ;FILES UNEQUAL
  77. ;
  78. UNEQUAL    PRINT    'FILES UNEQUAL AFTER '
  79. PRBYTES    LXI    D,BYTES
  80.     MVI    C,@MSG
  81.     CALL    @BDOS
  82.     PRINT    <'LAST DATA READ FROM FILE 1:',0DH,0AH>
  83.     LHLD    PRTPTR
  84.     DCR    L
  85.     MVI    B,0
  86. PRTLP    INR    L
  87.     MOV    A,M
  88.     CPI    0DH
  89.     JZ    GOTCR
  90.     CPI    0AH
  91.     JZ    TYPEIT
  92.     CPI    9    ;TAB
  93.     JZ    TYPEIT
  94.     CPI    ' '
  95.     JC    HEX
  96.     CPI    7FH
  97.     JNC    HEX
  98. TYPEIT    TYPE
  99.     LDA    COL
  100.     INR    A
  101.     STA    COL
  102.     CPI    60
  103.     JC    NEXT
  104.     XRA    A
  105.     STA    COL
  106.     PUSH    B
  107.     PUSH    H
  108.     PRINT    <0DH,0AH>
  109.     POP    H
  110.     POP    B
  111.     JMP    NEXT
  112. GOTCR    XRA    A
  113.     STA    COL
  114.     MVI    A,0DH
  115.     JMP    TYPEIT
  116. HEX    PUSH    PSW    ;SAVE CHAR
  117.     TYPE    '('
  118.     POP    PSW
  119.     PUSH    PSW
  120.     RAR
  121.     RAR
  122.     RAR
  123.     RAR
  124.     CALL    NIBBL
  125.     POP    PSW
  126.     CALL    NIBBL
  127.     LDA    COL
  128.     ADI    3
  129.     STA    COL
  130.     MVI    A,')'
  131.     JMP    TYPEIT
  132. NEXT    DCR    B
  133.     JNZ    PRTLP
  134.     JMP    EXIT
  135. ;
  136. ;READ BYTE FROM FILE 1
  137. ;
  138. READ1    GET    FILE1
  139.     JZ    EOF1    ;GOT EOF?
  140.     LHLD    PRTPTR
  141.     MOV    M,A
  142.     INR    L
  143.     SHLD    PRTPTR
  144.     PUSH    PSW    ;SAVE CHAR
  145.     LXI    H,BYTES+5
  146. READI    MOV    A,M
  147.     ORI    '0'    ;IN CASE IT WAS BLANK
  148.     INR    A
  149.     MOV    M,A
  150.     CPI    '9'+1    ;TIME TO CARRY?
  151.     JNZ    READNC
  152.     MVI    M,'0'
  153.     DCX    H
  154.     JMP    READI
  155. READNC    POP    PSW
  156.     RET
  157. ;
  158. ;EOF ON FILE 1 - SET FLAG, READ 2
  159. ;
  160. EOF1    MVI    A,'Y'
  161.     STA    EOFLG
  162.     CALL    READ2
  163.     PRINT    <'EOF FILE 1, NOT FILE 2',0DH,0AH>
  164.     JMP    UNEQUAL
  165. ;
  166. READ2    GET    FILE2
  167.     RNZ        ;NO EOF
  168. ;
  169.  
  170. ;GOT EOF ON FILE 2, MUST HAVE GOTTEN IT ON FILE 1
  171. ;
  172. EOF2    LDA    EOFLG
  173.     CPI    'Y'
  174.     JZ    AOK
  175.     PRINT    <'EOF FILE 2 BEFORE FILE 1',0DH,0AH>
  176.     JMP    UNEQUAL
  177. ;
  178. ;A-OK - FILES MATCH
  179. ;
  180. AOK    PRINT    'FILES MATCH, LENGTH IS '
  181.     LXI    D,BYTES
  182.     MVI    C,@MSG
  183.     CALL    @BDOS
  184. ;NOTE THE FOLLOWING DOES NOT RESTORE CP/M'S
  185. ;STACK POINTER, BUT THAT IS 'OK' BECAUSE THE
  186. ;FIRST INSTRUCTION IN CP/M IS A LXI SP
  187. EXIT    JMP    $-$    ;CP/M RET ADDR (MODIFIED)
  188. ERXIT    POP    D    ;GET MESSAGE
  189.     MVI    C,@MSG
  190.     CALL    @BDOS
  191.     JMP    EXIT
  192. NIBBL    ANI    0FH
  193.     CPI    10
  194.     JC    NUM
  195.     ADI    7
  196. NUM    ADI    '0'
  197.     TYPE
  198.     RET
  199. ;MOVE FROM (DE) TO (HL) LENGTH IN B
  200. MOVER    LDAX    D
  201.     MOV    M,A
  202.     INX    D
  203.     INX    H
  204.     DCR    B
  205.     JNZ    MOVER
  206.     RET
  207. EOFLG    DB    'N'
  208. COL    DB    0
  209. BYTES    DB    '        BYTES',0DH,0AH,'$'
  210. PRTPTR    DW    BUFF
  211.     DS    30    ;STACK
  212. STACK    EQU    $
  213. ;ORG TO PAGE BECAUSE 'INR L' USED TO LOOP THRU IT
  214.     ORG    ($+255) AND 0FF00H ;TO PAGE
  215. BUFF    EQU    $
  216.     REPT    16
  217.     DB    '                '
  218.     ENDM
  219. BUFFERS    EQU    $
  220. MEMSIZE    EQU    BUFFERS+@NXTB
  221.     END
  222.