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