home *** CD-ROM | disk | FTP | other *** search
/ CP/M / CPM_CDROM.iso / simtel / sigm / vols000 / vol074 / compare.asm < prev    next >
Assembly Source File  |  1984-04-29  |  7KB  |  437 lines

  1. ;    COMPARE - CP/M FILE COMPARISON UTILITY
  2. ;
  3.     ORG    0100H
  4.     JMP    COMPARE
  5.     DB    '(C) 1979 - N D H HAMMOND'
  6. PRGNAME    DB    'COMPARE VSN 1.0 OF 3JAN80',0DH,0AH,'$'
  7. ;
  8. ;
  9.     ;SYSTEM ADDRESSES
  10. WBOOTE    EQU    0000H    ;REBOOT ADDRESS
  11. SFCB    EQU    005CH    ;SOURCE FILE CONTROL BLOCK
  12. SFCBCR    EQU    SFCB+32    ;NEXT RECORD COUNTER
  13. TBUF    EQU    0080H    ;SYSTEM DEFAULT BUFFER
  14.     ;CONSTANTS
  15. CCPL    EQU    (3200H-2900H) SHR 8    ;PAGES IN CCP
  16. TRUE    EQU    0FFH
  17. ETX    EQU    03H
  18. LF    EQU    0AH
  19. CR    EQU    0DH
  20. EOM    EQU    '$'
  21. ;
  22. ;    MAIN PROGRAM
  23. ;
  24. COMPARE    LXI    H,0    ;SAVE OLD STACK POINTER
  25.     DAD    SP
  26.     SHLD    OLDSP
  27.     LXI    SP,STACK
  28.     LXI    D,PRGNAME
  29.     CALL    WRITESTRING
  30.     CALL    INITVAR
  31.     CALL    SOURCEDISK
  32.     CALL    OPENSOURCE
  33.     CALL    LOADBUF
  34.     CALL    COMPDISK
  35.     CALL    OPENCOMP
  36. REPEAT    CALL    COMPBUF
  37.     LDA    FINISH
  38.     CPI    TRUE
  39.     JZ    ENDCOMP
  40.     CALL    SOURCEDISK
  41.     CALL    LOADBUF
  42.     CALL    COMPDISK
  43.     JMP    REPEAT
  44. ENDCOMP    LDA    FIRST
  45.     ORA    A
  46.     JZ    EXIT
  47.     LXI    D,COMPMSG
  48.     CALL    WRITESTRING
  49. EXIT    LHLD    OLDSP
  50.     SPHL
  51.     RET        ;RETURN TO CP/M
  52. ;
  53. ;    SUBROUTINBS
  54. ;
  55. INITVAR        ;INITIALIZE VARIABLES
  56.     XRA    A
  57.     STA    FINISH
  58.     ;SET EXTENT TO CP/M CBASE
  59.     LHLD    ENTRY+1    ;HL:=FBASE
  60.     MOV    A,H
  61.     SBI    CCPL
  62.     MOV    H,A        ;HL:=CBASE
  63.     MOV    A,L        ;ENSURE EXTENT IS AT
  64.     ANI    80H        ;  A PAGE BOUNDARY
  65.     MOV    L,A
  66.     SHLD    EXTENT
  67.     LXI    D,CFCB        ;ZERO CFCB
  68.     MVI    B,32
  69.     XRA    A
  70. ZCFB    STAX    D
  71.     INX    D
  72.     DCR    B
  73.     JNZ    ZCFB
  74.     LXI    D,CFCB
  75.     LXI    H,SFCB+16    ;GET COMP FILE NAME
  76.     MVI    B,12
  77.     CALL    COPYSTRING
  78.     MVI    A,TRUE        ;INITIALIZE VARIABLES
  79.     STA    FIRST
  80.     XRA    A
  81.     STA    RECNO
  82.     RET
  83. ;
  84. ;
  85. OPENSOURCE    ;OPEN SOURCE FILE
  86.     LXI    D,SFCB
  87.     CALL    OPENFILE
  88.     CPI    0FFH
  89.     JNZ    OPEN$OK
  90.     MVI    B,1
  91.     JMP    ERROR
  92. OPEN$OK    XRA    A
  93.     STA    SFCBCR
  94.     RET
  95. ;
  96. ;
  97. OPENCOMP    ;OPEN COMP FILE
  98.     LXI    D,CFCB
  99.     CALL    OPENFILE
  100.     CPI    0FFH
  101.     JNZ    OP$OK
  102.     MVI    B,1
  103.     JMP    ERROR
  104. OP$OK    XRA    A
  105.     STA    CFCBCR
  106.     RET
  107. ;
  108. ;
  109. LOADBUF        ;LOAD BUFFER FROM SOURCE FILE
  110.     LXI    D,BUFFER
  111. RDNXT    PUSH    D
  112.     CALL    SETDMA
  113.     LXI    D,SFCB
  114.     CALL    READREC
  115.     POP    D
  116.     ORA    A
  117.     JZ    RD$OK
  118.     CPI    1
  119.     JZ    EOF
  120.     MVI    B,3
  121.     JMP    ERROR
  122. RD$OK    LXI    B,80H    ;UPDATE BUFFER
  123.     XCHG
  124.     DAD    B
  125.     LXI    B,EXTENT
  126.     CALL    COMP
  127.     XCHG
  128.     JNZ    RDNXT
  129.     RET
  130. EOF    MVI    A,TRUE
  131.     STA    FINISH
  132.     XCHG
  133.     SHLD    EXTENT
  134.     RET
  135. ;
  136. ;
  137. COMPBUF    ;COMPARE BUFFER AND TEMP FILE
  138.     LXI    D,TBUF        ;TBUF FOR COMPFILE
  139.     CALL    SETDMA
  140.     LXI    D,BUFFER    ;D IS BUFFER POINTER
  141. COMPLP    PUSH    D
  142.     CALL    COMPREC        ;COMPARE 1 RECORD
  143.     JC    TERMCK        ;TERMCK IF EOF(COMP)
  144.     POP    D
  145.     LXI    B,80H        ;UPDATE POINTER
  146.     XCHG
  147.     DAD    B
  148.     LXI    B,EXTENT    ;CHECK END OF BUFFER
  149.     CALL    COMP
  150.     XCHG
  151.     JNC    COMPLP        ;LOOP IF NOT PAST END
  152.     MVI    B,5        ;CHECK FOR COMPFILE TOO LONG
  153.     LDA    FINISH
  154.     ORA    A
  155.     JZ    ERROR
  156.     RET            ;RETURN FOR NEXT BUFFER
  157. TERMCK    POP    D
  158.     LXI    B,EXTENT    ;CHECK FOR COMP FILE TOO SHORT
  159.     XCHG
  160.     CALL    COMP
  161.     MVI    B,7
  162.     JNZ    ERROR
  163.     LDA    FINISH
  164.     ORA    A
  165.     JZ    ERROR
  166.     RET            ;COMPARE COMPLETE
  167. ;
  168. ;
  169. COMPREC    ;COMPARE NEXT COMP FILE RECORD
  170.     ;WITH CORRESPONDING BUFFER RECORD
  171.     ;IN:    D:=BUFFER POINTER
  172.     PUSH    D
  173.     LXI    D,CFCB        ;GET COMPFILE RECORD
  174.     CALL    READREC
  175.     POP    D
  176.     ORA    A        ;CHECK READ OK
  177.     JZ    READ$OK
  178.     CPI    1        ;CHECK EOF
  179.     JZ    EOFCOMP
  180.     MVI    B,3        ;REPORT ERROR
  181.     JMP    ERROR
  182. READ$OK    LXI    H,TBUF        ;HL:=TBUF POINTER
  183.     MVI    B,80H-1        ;B:=BYTE COUNTER
  184. CPRLP    LDAX    D
  185.     CMP    M        ;COMPARE BYTE
  186.     PUSH    B
  187.     PUSH    D
  188.     PUSH    H
  189.     CNZ    DIFFERENT
  190.     POP    H
  191.     POP    D
  192.     POP    B    
  193.     INX    H
  194.     INX    D
  195.     DCR    B
  196.     JNZ    CPRLP        ;LOOP UNTIL LAST BYTE
  197.     LDA    RECNO        ;INCREMENT RECORD NO
  198.     INR    A
  199.     STA    RECNO
  200.     ORA    A        ;CLEAR CARRY
  201.     RET
  202. EOFCOMP    STC            ;SET CARRY TO INDICATE EOF
  203.     RET
  204. ;
  205. ;
  206. DIFFERENT    ;REPORT NON MATCHING BYTES
  207.         ;IN    DE,HL:=^BYTES
  208.         ;    B:=7FH-BYTE NO IN RECORD
  209.     PUSH    H        ;SAVE PARAMETERS
  210.     PUSH    D
  211.     PUSH    B
  212.     LDA    FIRST        ;HEADINGS IF FIRST IS TRUE
  213.     ORA    A
  214.     JZ    NOHDG
  215.     XRA    A        ;FIRST:=FALSE
  216.     STA    FIRST
  217.     LXI    D,HDGMSG
  218.     CALL    WRITESTRING
  219. NOHDG    LDA    RECNO        ;WRITE RECORD NO
  220.     CALL    OUTHEX
  221.     POP    B        ;WRITE BYTE NO
  222.     MVI    A,80H-1
  223.     SUB    B
  224.     CALL    OUTHEX
  225.     POP    D        ;WRITE SOURCE BYTE
  226.     LDAX    D
  227.     PUSH    PSW
  228.     CALL    OUTHEX
  229.     POP    PSW
  230.     CALL    OUTASC
  231.     POP    H        ;WRITE COMP BYTE
  232.     MOV    A,M
  233.     PUSH    PSW
  234.     CALL    OUTHEX
  235.     POP    PSW
  236.     CALL    OUTASC
  237.     LXI    D,CRLFMSG
  238.     CALL    WRITESTRING
  239.     CALL    CHECKSTAT    ;CHECK INPUT FROM OPERATOR
  240.     ORA    A
  241.     JNZ    EXIT        ;ABORT IF SO
  242.     RET
  243. ;
  244. ;
  245. OUTHEX    ;OUTPUT HEX VALUE OF ACCUMULATOR
  246.     PUSH    PSW
  247.     LXI    D,SPCMSG    ;WRITE 4 SPACES
  248.     CALL    WRITESTRING
  249.     POP    PSW
  250.     PUSH    PSW
  251.     ANI    0F0H        ;GET TOP 4 BITS
  252.     RAR
  253.     RAR
  254.     RAR
  255.     RAR
  256.     CALL    OUTH        ;PRINT
  257.     POP    PSW        ;GET BOTTOM 4 BITS
  258.     ANI    00FH
  259.     CALL    OUTH
  260.     RET
  261. ;
  262. ;
  263. OUTH    ;PRINT 1 HEX CHAR
  264.     CPI    0AH
  265.     JC    NUM
  266.     ADI    40H        ;CONVERT 10..15 TO 'A'..'F'
  267.     SUI    9
  268.     JMP    WR
  269. NUM    ADI    30H        ;CONVERT 0..9 TO '0'..'9'
  270. WR    MOV    E,A
  271.     MVI    D,0
  272.     CALL    WRITECHAR
  273.     RET
  274. ;
  275. ;
  276. OUTASC    ;OUTPUT ASCII VALUE OF ACC
  277.     PUSH    PSW
  278.     LXI    D,SPCMSG
  279.     CALL    WRITESTRING
  280.     POP    PSW        ;CHECK FOR GRAPHIC CHAR
  281.     PUSH    PSW
  282.     CPI    20H
  283.     JC    NOTASC        ;<' '
  284.     CPI    7FH
  285.     JNC    NOTASC        ;>'\'
  286.     MVI    D,0
  287.     MVI    E,'"'        ;WRITE "<CHAR>"
  288.     CALL    WRITECHAR
  289.     POP    PSW
  290.     MVI    D,0
  291.     MOV    E,A
  292.     CALL    WRITECHAR
  293.     MVI    D,0
  294.     MVI    E,'"'
  295.     CALL    WRITECHAR
  296.     RET
  297. NOTASC    LXI    D,NASCMSG        ;WRITE ???
  298.     CALL    WRITESTRING
  299.     POP    PSW
  300.     RET
  301. ;
  302. ;
  303. COPYSTRING    ;COPY STRING OF LENGTH B
  304.         ;FROM HL^ TO DE^
  305.     MOV    A,M
  306.     STAX    D
  307.     INX    H
  308.     INX    D
  309.     DCR    B
  310.     JNZ    COPYSTRING
  311.     RET
  312. ;
  313. ;
  314. ERROR        ;PRINT ERROR MESSAGE
  315.     LXI    D,OPMSG
  316.     MOV    A,B
  317.     CPI    1
  318.     JZ    EPRINT
  319.     LXI    D,REMSG
  320.     CPI    3
  321.     JZ    EPRINT
  322.     LXI    D,FSMSG
  323.     CPI    5
  324.     JZ    EPRINT
  325.     LXI    D,FCMSG
  326. EPRINT    CALL    WRITESTRING
  327.     JMP    EXIT
  328. ;
  329. ;
  330. COMP        ;COMPARE BC^ AND HL - SET FLAGS
  331.     INX    B
  332.     LDAX    B
  333.     DCX    B
  334.     CMP    H
  335.     RNZ
  336.     LDAX    B
  337.     CMP    L
  338.     RET
  339. ;
  340. ;
  341. SOURCEDISK    ;ADVISE OPERATOR, WAIT FOR RESPONSE,
  342.     LXI    D,SDMSG
  343.     CALL    WRITESTRING
  344.     CALL    WAIT
  345.     RET
  346. ;
  347. ;
  348. COMPDISK    ;ADVISE OPERATOR, WAIT FOR RESPONSE
  349.     LXI    D,DDMSG
  350.     CALL    WRITESTRING
  351.     CALL    WAIT
  352.     RET
  353. ;
  354. ;
  355. WAIT    ;WAIT FOR OPERATOR TO TYPE RETURN
  356.     CALL    READCHAR
  357.     CPI    03H
  358.     JZ    WBOOTE
  359.     CPI    CR
  360.     JNZ    WAIT
  361.     RET
  362. ;
  363. ;    CP/M COMMUNICATION ROUTINES
  364. ;
  365. ;
  366. ENTRY    EQU    0005H    ; BDOS ENTRY POINT
  367. ;
  368. ;
  369. READCHAR    ; READ A CHARACTER FROM CONSOLE
  370.     MVI    C,1
  371.     JMP    ENTRY
  372. ;
  373. ;
  374. WRITECHAR    ; WRITE A CHARACTER TO CONSOLE
  375.     MVI    C,2
  376.     JMP    ENTRY
  377. ;
  378. ;
  379. WRITESTRING    ; WRITE A STRING ON CONSOLE
  380.     MVI    C,9
  381.     JMP    ENTRY
  382. ;
  383. ;
  384. CHECKSTAT    ; CHECK CONSOLE INPUT STATUS
  385.     MVI    C,11
  386.     JMP    ENTRY
  387. ;
  388. ;
  389. OPENFILE    ; OPEN A NEW FILE
  390.     MVI    C,15
  391.     JMP    ENTRY
  392. ;
  393. ;
  394. READREC        ; READ NEXT 128 BYTE RECORD
  395.     MVI    C,20
  396.     JMP    ENTRY
  397. ;
  398. ;
  399. SETDMA        ; SET DMA ADDRESS FOR READ OR WRITE
  400.     MVI    C,26
  401.     JMP    ENTRY
  402. ;
  403. ;
  404. ;
  405. ;    DATA AREA
  406. ;
  407. OLDSP    DS    2
  408. CFCB    DS    33    ;COMPARE FILE CONTROL BLOCK
  409. CFCBCR    EQU    CFCB+32    ;CURRENT RECORD COUNTER
  410. FIRST    DS    1    ;FIRST TIME THROUGH FLAG
  411. RECNO    DS    1    ;RECORD NUMBER COUNTER
  412. EXTENT    DS    2    ;EXTENT OF COPY BUFFER
  413. FINISH    DS    1    ;LAST BUFFER FLAG
  414. SDMSG    DB    LF,'INSERT SOURCE DISK, <CR> TO CONTINUE'
  415.     DB    CR,LF,EOM
  416. DDMSG    DB    'INSERT COMP DISK, <CR> TO CONTINUE'
  417.     DB    CR,LF,EOM
  418. OPMSG    DB    LF,'FILE NOT FOUND',CR,LF,EOM
  419. REMSG    DB    'READ ERROR ON FILE',CR,LF,EOM
  420. COMPMSG    DB    'COMPARE COMPLETE - FILES IDENTICAL'
  421.     DB    CR,LF,EOM
  422. FSMSG    DB    'COMP FILE LONGER THAN SOURCE',CR,LF,EOM
  423. FCMSG    DB    'COMP FILE SHORTER THAN SOURCE',CR,LF,EOM
  424. HDGMSG    DB    LF,CR,'  RECORD  BYTE  SOURCE FILE'
  425.     DB    '  COMP FILE',LF,CR,'    NO'
  426.     DB    '    NO    HEX  ASCII   HEX  ASCII'
  427.     DB    CR,LF,CR,LF,EOM
  428. SPCMSG    DB    '    ',EOM
  429. NASCMSG    DB    '???',EOM
  430. CRLFMSG    DB    CR,LF,EOM
  431.     DS    20H    ;MINIMUM STACK SPACE
  432.     ;SET START OF BUFFER TO MULTIPLE OF SECTOR SIZE
  433.     ORG    (($ + 7FH) / 80H) * 80H
  434. STACK    EQU    $    ;GROWS DOWN
  435. BUFFER    EQU    $    ;FILLS REST OF MEMORY TO CBASE
  436.     END
  437.