home *** CD-ROM | disk | FTP | other *** search
/ CP/M / CPM_CDROM.iso / simtel / cpmug / cpmug040.ark / CV.ASM < prev    next >
Encoding:
Assembly Source File  |  1984-04-29  |  7.9 KB  |  559 lines

  1. ;CV.ASM - DUAL SCROLLING COMPARE ROUTINE FOR VDM
  2. ;
  3. ;05/06/79 BY WARD CHRISTENSEN
  4. ;07/09/79 MODIFY FOR VDM AT 0CC00H
  5. ;10/04/79 PUT IN CP/M DIRECT I/O
  6. ;    ADD PRINTING HEX FOR NON-PRINTABLES
  7. ;
  8. ;PROGRAM TO SCROLL 2 FILES AT ONCE, 1, 4, OR 7
  9. ;LINES AT A TIME.  ALSO CAN COMPARE THE FILES
  10. ;WITH CONTINUOUS SCROLLING UNTIL A DIFFERENCE
  11. ;IS FOUND
  12. ;
  13. ;COMMAND FORMAT: CV NAME1 NAME2
  14. ;
  15. ;NAME1 WILL BE SCROLLED ON THE TOP HALF OF THE VDM
  16. ;NAME2 WILL BE SCROLLED ON THE BOTTOM HALF OF THE VDM
  17. ;
  18. ;   TOP CHAR  BOT CHAR    FUNCTION
  19. ;
  20. ;    Y    H        CONTINUOUS SCROLL
  21. ;    U    J        1 LINE SCROLL
  22. ;    I    K        4 LINE SCROLL
  23. ;    O    L        7 LINE SCROLL
  24. ;
  25. ;    C SCROLLS CONTINUOUSLY, COMPARING THE FILES
  26. ;        STOPS ON A MIS-COMPARE.
  27. ;
  28. VDM    EQU    0CC00H
  29. ;
  30. MF    SET    0    ;SHOW MOVE NOT REQUESTED
  31. ;
  32. ;(FROM EQU8.LIB...)
  33. ;DEFINE SOME MACROS TO MAKE THINGS EASIER
  34. ;
  35. ;DEFINE DATA MOVE MACRO: MOVE from,to,length
  36. ;    from may be addr, or quoted string
  37. ;
  38. MOVE    MACRO    ?F,?T,?L
  39.     IF    NOT NUL ?F
  40.     IRPC    ?C,?F
  41. ?Q    SET    '&?C&?C' ;;TEST FOR QUOTE
  42.     EXITM
  43.     ENDM
  44.     IF    ?Q EQ ''''
  45.     LOCAL    ?B,?Z
  46.     CALL    ?Z
  47. ?B    DB    ?F
  48. ?Z    POP    H    ;GET FROM
  49.     LXI    B,?Z-?B    ;GET LEN
  50.     ELSE
  51.     LXI    H,?F
  52.     ENDIF
  53.     ENDIF
  54.     IF    NOT NUL ?T
  55.     LXI    D,?T
  56.     ENDIF
  57.     IF    NOT NUL ?L
  58.     LXI    B,?L
  59.     ENDIF
  60.     CALL    MOVER
  61. MF    SET    -1    ;;SHOW EXPANSION
  62.     ENDM
  63.  
  64.  
  65. ;
  66. ;DEFINE CP/M MACRO - CPM FNC,PARM
  67. ;
  68. CPM    MACRO    ?F,?P
  69.     PUSH    B
  70.     PUSH    D
  71.     PUSH    H
  72.     IF    NOT NUL ?F
  73.     MVI    C,?F
  74.     ENDIF
  75.     IF    NOT NUL ?P
  76.     LXI    D,?P
  77.     ENDIF
  78.     CALL    BDOS
  79.     POP    H
  80.     POP    D
  81.     POP    B
  82.     ENDM
  83. ;
  84.     ORG    100H
  85.     CALL    START
  86.     DB    'CV.COM'
  87.     DB    ' AS OF 05/06/79'
  88.     DB    0DH,0AH,'$'
  89. START    POP    D    ;GET ID
  90.     MVI    C,PRINT
  91.     CALL    BDOS    ;PRINT ID
  92. ;
  93. ;INIT LOCAL STACK
  94. ;
  95.     LXI    H,0
  96.     DAD    SP
  97.     SHLD    STACK
  98.     LXI    SP,STACK
  99.     CALL    INIT    ;GET CONST, CONIN
  100. ;
  101. ;START OF PROGRAM EXECUTION
  102. ;
  103.     MOVE    FCB2,MYFCB,12 ;SAVE FILENAME
  104.     CPM    OPEN,FCB
  105.     INR    A
  106.     JZ    OPENER1
  107.     CPM    OPEN,MYFCB
  108.     INR    A
  109.     JZ    OPENER2
  110.     LXI    H,VDM
  111.     MVI    B,4    ;# PAGES
  112.     MVI    A,' '    ;CLEAR CHR
  113. CLRLP    MOV    M,A
  114.     INR    L
  115.     JNZ    CLRLP
  116.     INR    H
  117.     DCR    B
  118.     JNZ    CLRLP
  119.     CALL    TOP    ;SHOW FIRST..
  120.     CALL    BOT    ;..TWO LINES
  121. ;
  122. LOOP    CALL    KEYIN
  123.     ANI    5FH    ;MAKE UPPER CASE
  124.     CPI    'Y'
  125.     JZ    TOPCONT
  126.     CPI    'H'
  127.     JZ    BOTCONT
  128.     CPI    'U'
  129.     JZ    TOP1
  130.     CPI    'J'
  131.     JZ    BOT1
  132.     CPI    'I'
  133.     JZ    TOP4
  134.     CPI    'K'
  135.     JZ    BOT4
  136.     CPI    'O'
  137.     JZ    TOP7
  138.     CPI    'L'
  139.     JZ    BOT7
  140.     CPI    'C'
  141.     JZ    COMPARE
  142.     CPI    'Q'
  143.     JZ    EXIT
  144.     JMP    LOOP
  145. ;
  146. TOP    CALL    RDTOP
  147.     PUSH    PSW
  148.     CALL    SCRTOP
  149.     POP    PSW
  150.     CPI    1AH
  151.     RZ
  152.     CPI    0AH
  153.     JNZ    TOP
  154.     RET
  155. ;
  156. BOT    CALL    RDBOT
  157.     PUSH    PSW
  158.     CALL    SCRBOT
  159.     POP    PSW
  160.     CPI    1AH
  161.     RZ
  162.     CPI    0AH
  163.     JNZ    BOT
  164.     RET
  165. ;
  166. TOP1    CALL    TOP
  167.     JMP    LOOP
  168. ;
  169. BOT1    CALL    BOT
  170.     JMP    LOOP
  171. ;
  172. TOP7    MVI    B,7
  173.     JMP    TOP4LP
  174. TOP4    MVI    B,4
  175. TOP4LP    PUSH    B
  176.     CALL    TOP
  177.     POP    B
  178.     DCR    B
  179.     JNZ    TOP4LP
  180.     JMP    LOOP
  181. ;
  182. BOT7    MVI    B,7
  183.     JMP    BOT4LP
  184. BOT4    MVI    B,4
  185. BOT4LP    PUSH    B
  186.     CALL    BOT
  187.     POP    B
  188.     DCR    B
  189.     JNZ    BOT4LP
  190.     JMP    LOOP
  191. ;
  192. TOPCONT    CALL    TOP
  193.     CALL    STAT
  194.     JZ    TOPCONT
  195.     JMP    LOOP
  196. ;
  197. BOTCONT    CALL    BOT
  198.     CALL    STAT
  199.     JZ    BOTCONT
  200.     JMP    LOOP
  201. ;
  202. ;COMPARE FILES, SCROLLING, STOP AT DIFFERENCE
  203. ;
  204. COMPARE    CALL    STAT
  205.     JNZ    LOOP
  206.     CALL    RDTOP    ;GET TOP BYTE
  207.     PUSH    PSW
  208.     CALL    SCRTOP    ;SCROLL IT
  209.     POP    PSW
  210.     CPI    1AH    ;EOF?
  211.     JZ    LOOP
  212.     PUSH    PSW    ;SAVE FOR COMPARE
  213.     CALL    RDBOT    ;GET BOTTOM
  214.     PUSH    PSW
  215.     CALL    SCRBOT
  216.     POP    PSW
  217.     POP    B
  218.     CPI    1AH
  219.     JZ    LOOP
  220.     CMP    B
  221.     JZ    COMPARE
  222.     CALL    PRTOP
  223.     CALL    PRBOT
  224.     JMP    LOOP
  225. ;
  226. ;READBYTE FOR TOP FILE
  227. ;
  228. RDTOP    LXI    H,TOPFCB
  229.     CALL    RDBYTE
  230.     RET
  231. ;
  232. ;RDBYTE FROM BOTTOM FILE
  233. ;
  234. RDBOT    LXI    H,BOTFCB
  235.     CALL    RDBYTE
  236.     RET
  237. ;
  238. OPENER1    CALL    ERXIT
  239.     DB    '++CAN''T OPEN FILE 1++$'
  240. OPENER2    CALL    ERXIT
  241.     DB    '++CAN''T OPEN FILE 2++$'
  242. ;
  243. ;SCROLL TOP HALF OF SCREEN
  244. ;
  245. SCRTOP    PUSH    H
  246.     LHLD    TOPLPTR
  247.     MOV    M,A
  248.     INX    H
  249.     SHLD    TOPLPTR
  250.     LXI    H,TOPLCT
  251.     INR    M
  252.     POP    H
  253.     CPI    0AH
  254.     JZ    PRTOP
  255.     LDA    TOPLCT
  256.     ORA    A
  257.     RP
  258. PRTOP    PUSH    H
  259.     LDA    TOPLCT
  260.     MOV    B,A
  261.     INR    B
  262.     INR    B
  263.     INR    B
  264.     LXI    H,TOPL
  265.     CALL    PRLINE
  266.     LXI    H,TOPLINE
  267.     SHLD    TOPLPTR
  268.     XRA    A
  269.     STA    TOPLCT
  270.     POP    H
  271.     RET
  272. ;
  273. ;SCROLL BOTTOM HALF OF SCREEN
  274. ;
  275. SCRBOT    PUSH    H
  276.     LHLD    BOTLPTR
  277.     MOV    M,A
  278.     INX    H
  279.     SHLD    BOTLPTR
  280.     POP    H
  281.     CPI    0AH
  282.     JZ    PRBOT
  283.     LDA    BOTLCT
  284.     INR    A
  285.     STA    BOTLCT
  286.     RP
  287. PRBOT    PUSH    H
  288.     LDA    BOTLCT
  289.     MOV    B,A
  290.     INR    B
  291.     INR    B
  292.     INR    B
  293.     LXI    H,BOTL
  294.     CALL    PRLINE
  295.     LXI    H,BOTLINE
  296.     SHLD    BOTLPTR
  297.     XRA    A
  298.     STA    BOTLCT
  299.     POP    H
  300.     RET
  301. ;
  302. ;PRINT LINE POINTED TO BY HL, B=COUNT
  303. ;
  304. PRLINE    MOV    A,M
  305.     CALL    TYPE
  306.     INX    H
  307.     DCR    B
  308.     JNZ    PRLINE
  309.     DCX    H
  310.     MOV    A,M    ;WAS IT LF?
  311.     CPI    0AH
  312.     RZ
  313.     MVI    A,0DH
  314.     CALL    TYPE
  315.     MVI    A,0AH
  316.     CALL    TYPE
  317.     RET
  318. ;
  319. ;TYPE ROUTINE.  PRINTS [HEX] IF NOT PRINTABLE
  320. ;
  321. TYPE    CPI    9
  322.     JZ    TYPEIT
  323.     CPI    0DH
  324.     JZ    TYPEIT
  325.     CPI    0AH
  326.     JZ    TYPEIT
  327.     CPI    ' '
  328.     JC    DOHEX
  329.     CPI    7FH
  330.     JC    TYPEIT
  331. DOHEX    PUSH    PSW
  332.     MVI    A,'['
  333.     CALL    TYPE
  334.     POP    PSW
  335.     PUSH    PSW
  336.     CALL    LNIB
  337.     CALL    TYPE
  338.     POP    PSW
  339.     CALL    RNIB
  340.     CALL    TYPE
  341.     MVI    A,']'
  342.     CALL    TYPE
  343.     RET
  344. ;
  345. TYPEIT    PUSH    B
  346.     PUSH    D
  347.     PUSH    H
  348.     MOV    E,A
  349.     MVI    C,2
  350.     CALL    BDOS
  351.     POP    H
  352.     POP    D
  353.     POP    B
  354.     RET
  355.  
  356.  
  357.  
  358. ;
  359. LNIB    RAR
  360.     RAR
  361.     RAR
  362.     RAR
  363. RNIB    ANI    0FH
  364.     ADI    90H
  365.     DAA
  366.     ACI    40H
  367.     DAA
  368.     RET
  369. ;
  370. ;    FROM EQU8.LIB:
  371. ;
  372. ;RDBYTE, HL POINTS TO EXTENDED FCB:
  373. ;
  374. ;    2 BYTE BUFFER ADDR
  375. ;    2 BYTE "BYTES LEFT" (INIT TO 0)
  376. ;    1 BYTE BUFFER SIZE (IN PAGES)
  377. ;    2 BYTE FCB ADDRESS (33 BYTES)
  378. ;
  379. RDBYTE    MOV    E,M
  380.     INX    H
  381.     MOV    D,M    ;GET BUFFER ADDR
  382.     INX    H
  383.     MOV    C,M
  384.     INX    H
  385.     MOV    B,M    ;BC = BYTES LEFT
  386.     MOV    A,B    ;GET COUNT
  387.     ORA    C
  388.     JNZ    RDBNORD    ;NO READ
  389. ;
  390.     INX    H    ;TO BUFFER SIZE
  391.     MOV    A,M    ;GET COUNT
  392.     ADD    A    ;MULTIPLY BY 2
  393.     MOV    B,A    ;SECTOR COUNT IN B
  394.     INX    H    ;TO FCB
  395.     PUSH    H    ;SAVE FCB POINTER
  396.     MOV    A,M    ;GET..
  397.     INX    H    ;..FCB..
  398.     MOV    H,M    ;..ADDR..
  399.     MOV    L,A    ;..TO HL
  400. ;
  401. RDBLP    MVI    A,1AH    ;GET EOF CHAR
  402.     STAX    D    ;SAVE IN CASE EOF
  403.     PUSH    D    ;SAVE DMA ADDR
  404.     PUSH    H    ;SAVE FCB ADDR
  405.     CPM    STDMA    ;SET DMA ADDR
  406.     POP    D    ;GET FCB
  407.     CPM    READ
  408.     ORA    A
  409.     POP    H    ;HL=DMA, DE=FCB
  410.     JNZ    RDBRET    ;GOT EOF
  411.     MOV    A,L
  412.     ADI    80H    ;TO NEXT BUFF
  413.     MOV    L,A
  414.     MOV    A,H
  415.     ACI    0
  416.     MOV    H,A
  417.     XCHG        ;DMA TO DE, FCB TO HL
  418.     DCR    B    ;MORE SECTORS?
  419.     JNZ    RDBLP    ;YES, MORE
  420. RDBRET    POP    H    ;GET FCB POINTER
  421.     DCX    H    ;TO LENGTH
  422.     MOV    A,M    ;GET LENGTH
  423.     DCX    H    ;TO COUNT
  424.     MOV    M,A    ;SET PAGE COUNT
  425.     DCX    H    ;TO LO COUNT
  426.     DCX    H    ;TO HI FCB
  427.     DCX    H    ;TO EFCB START
  428.     JMP    RDBYTE    ;LOOP THRU AGAIN
  429. ;
  430. RDBNORD    INX    H    ;TO LENGTH
  431.     MOV    A,M    ;GET LENGTH (PAGES)
  432.     XCHG        ;BUFF TO HL
  433.     ADD    H
  434.     MOV    H,A    ;HL = END OF BUFF
  435.     MOV    A,L
  436.     SUB    C
  437.     MOV    L,A
  438.     MOV    A,H
  439.     SBB    B
  440.     MOV    H,A    ;HL = DATA POINTER
  441.     MOV    A,M    ;GET BYTE
  442.     XCHG        ;EFCB BACK TO HL
  443.     CPI    1AH    ;EOF?
  444.     RZ        ;YES, LEAVE POINTERS
  445.     DCX    B    ;DECR COUNT
  446.     DCX    H    ;BACK TO "BYTES LEFT"
  447.     MOV    M,B
  448.     DCX    H
  449.     MOV    M,C    ;STORE BACK COUNT
  450.     RET
  451. ;
  452. ;---->    INIT    GETS CP/M CONSOLE STATUS AND CONSOLE
  453. ;        OUT VECTORS
  454. ;
  455. INIT    LHLD    1    ;GET WARM BOOT ADDR
  456.     LXI    D,3    ;LENGTH OF 1 "JMP"
  457.     DAD    D    ;POINT TO CONS. STAT
  458.     SHLD    VSTAT+1
  459.     DAD    D
  460.     SHLD    VKEYIN+1
  461.     RET
  462. ;
  463. ;CP/M CONSOLE STATUS VIA DIRECT BIOS CALL
  464. ;
  465. STAT    PUSH    B
  466.     PUSH    D
  467.     PUSH    H
  468. VSTAT    CALL    $-$    ;ADDR MOD. BY "INIT"
  469.     POP    H
  470.     POP    D
  471.     POP    B
  472.     ORA    A
  473.     RET
  474. ;
  475. ;CP/M CONSOLE INPUT VIA DIRECT BIOS CALL
  476. ;
  477. KEYIN    PUSH    B
  478.     PUSH    D
  479.     PUSH    H
  480. VKEYIN    CALL    $-$    ;ADDR MOD. BY "INIT"
  481.     POP    H
  482.     POP    D
  483.     POP    B
  484.     RET
  485. ;
  486. ;FOLLOWING FROM 'EQU8.LIB'---->
  487. ;
  488. ;MOVE, COMPARE SUBROUTINES
  489. ;
  490.     IF    MF    ;MACRO EXPANSION FLAG SET?
  491. MOVER    MOV    A,M
  492.     STAX    D
  493.     INX    H
  494.     INX    D
  495.     DCX    B
  496.     MOV    A,B
  497.     ORA    C
  498.     JNZ    MOVER
  499.     RET
  500.     ENDIF
  501. ;
  502. ;EXIT WITH ERROR MESSAGE
  503. MSGEXIT    EQU    $    ;EXIT W/"INFORMATIONAL" MSG
  504. ERXIT    POP    D    ;GET MSG
  505.     MVI    C,PRINT
  506.     CALL    BDOS
  507. ;EXIT, RESTORING STACK AND RETURN
  508. EXIT    LHLD    STACK
  509.     SPHL
  510.     RET        ;TO CCP
  511.     DS    40H    ;STACK AREA
  512. STACK    DS    2
  513. ;
  514. TOPFCB    DW    TOPBUF    ;BUFFER ADDR
  515.     DW    0    ;CHARS IN BUFFER
  516.     DB    16    ;BUFF SIZE IN SECTORS
  517.     DW    FCB    ;FCB ADDR
  518. BOTFCB    DW    BOTBUF    ;BUFFER ADDR
  519.     DW    0    ;CHARS IN BUFFER
  520.     DB    16    ;BUFF SIZE IN SECTORS
  521.     DW    MYFCB    ;FCB ADDR
  522. ;
  523. MYFCB    DB    0,'XXXXXXXXYYY',0
  524.     DS    19
  525.     DB    0
  526. ;
  527. TOPLPTR    DW    TOPLINE
  528. BOTLPTR    DW    BOTLINE
  529. TOPLCT    DB    0
  530. BOTLCT    DB    0
  531. TOPL    DB    '1:    '    ;COLON TAB
  532. TOPLINE    DS    128
  533. BOTL    DB    '2:    '    ;COLON TAB
  534. BOTLINE    DS    128
  535. TOPBUF    DS    16*256    ;4K BUFFER
  536. BOTBUF    DS    16*256    ;4K BUFFER
  537. ;
  538. ;BDOS/CBIOS EQUATES (VERSION 8)
  539. ;
  540. RDCON    EQU    1
  541. WRCON    EQU    2
  542. PRINT    EQU    9
  543. CONST    EQU    11
  544. OPEN    EQU    15
  545. CLOSE    EQU    16
  546. SRCHF    EQU    17
  547. SRCHN    EQU    18
  548. ERASE    EQU    19
  549. READ    EQU    20
  550. WRITE    EQU    21
  551. MAKE    EQU    22
  552. REN    EQU    23
  553. STDMA    EQU    26
  554. BDOS    EQU    5
  555. FCB    EQU    5CH 
  556. FCB2    EQU    6CH
  557. FCBEXT    EQU    FCB+12
  558. FCBRNO    EQU    FCB+32
  559.