home *** CD-ROM | disk | FTP | other *** search
- ;CV.ASM - DUAL SCROLLING COMPARE ROUTINE FOR VDM
- ;
- ;05/06/79 BY WARD CHRISTENSEN
- ;07/09/79 MODIFY FOR VDM AT 0CC00H
- ;10/04/79 PUT IN CP/M DIRECT I/O
- ; ADD PRINTING HEX FOR NON-PRINTABLES
- ;
- ;PROGRAM TO SCROLL 2 FILES AT ONCE, 1, 4, OR 7
- ;LINES AT A TIME. ALSO CAN COMPARE THE FILES
- ;WITH CONTINUOUS SCROLLING UNTIL A DIFFERENCE
- ;IS FOUND
- ;
- ;COMMAND FORMAT: CV NAME1 NAME2
- ;
- ;NAME1 WILL BE SCROLLED ON THE TOP HALF OF THE VDM
- ;NAME2 WILL BE SCROLLED ON THE BOTTOM HALF OF THE VDM
- ;
- ; TOP CHAR BOT CHAR FUNCTION
- ;
- ; Y H CONTINUOUS SCROLL
- ; U J 1 LINE SCROLL
- ; I K 4 LINE SCROLL
- ; O L 7 LINE SCROLL
- ;
- ; C SCROLLS CONTINUOUSLY, COMPARING THE FILES
- ; STOPS ON A MIS-COMPARE.
- ;
- VDM EQU 0CC00H
- ;
- MF SET 0 ;SHOW MOVE NOT REQUESTED
- ;
- ;(FROM EQU8.LIB...)
- ;DEFINE SOME MACROS TO MAKE THINGS EASIER
- ;
- ;DEFINE DATA MOVE MACRO: MOVE from,to,length
- ; from may be addr, or quoted string
- ;
- MOVE MACRO ?F,?T,?L
- IF NOT NUL ?F
- IRPC ?C,?F
- ?Q SET '&?C&?C' ;;TEST FOR QUOTE
- EXITM
- ENDM
- IF ?Q EQ ''''
- LOCAL ?B,?Z
- CALL ?Z
- ?B DB ?F
- ?Z POP H ;GET FROM
- LXI B,?Z-?B ;GET LEN
- ELSE
- LXI H,?F
- ENDIF
- ENDIF
- IF NOT NUL ?T
- LXI D,?T
- ENDIF
- IF NOT NUL ?L
- LXI B,?L
- ENDIF
- CALL MOVER
- MF SET -1 ;;SHOW EXPANSION
- ENDM
-
-
- ;
- ;DEFINE CP/M MACRO - CPM FNC,PARM
- ;
- CPM MACRO ?F,?P
- PUSH B
- PUSH D
- PUSH H
- IF NOT NUL ?F
- MVI C,?F
- ENDIF
- IF NOT NUL ?P
- LXI D,?P
- ENDIF
- CALL BDOS
- POP H
- POP D
- POP B
- ENDM
- ;
- ORG 100H
- CALL START
- DB 'CV.COM'
- DB ' AS OF 05/06/79'
- DB 0DH,0AH,'$'
- START POP D ;GET ID
- MVI C,PRINT
- CALL BDOS ;PRINT ID
- ;
- ;INIT LOCAL STACK
- ;
- LXI H,0
- DAD SP
- SHLD STACK
- LXI SP,STACK
- CALL INIT ;GET CONST, CONIN
- ;
- ;START OF PROGRAM EXECUTION
- ;
- MOVE FCB2,MYFCB,12 ;SAVE FILENAME
- CPM OPEN,FCB
- INR A
- JZ OPENER1
- CPM OPEN,MYFCB
- INR A
- JZ OPENER2
- LXI H,VDM
- MVI B,4 ;# PAGES
- MVI A,' ' ;CLEAR CHR
- CLRLP MOV M,A
- INR L
- JNZ CLRLP
- INR H
- DCR B
- JNZ CLRLP
- CALL TOP ;SHOW FIRST..
- CALL BOT ;..TWO LINES
- ;
- LOOP CALL KEYIN
- ANI 5FH ;MAKE UPPER CASE
- CPI 'Y'
- JZ TOPCONT
- CPI 'H'
- JZ BOTCONT
- CPI 'U'
- JZ TOP1
- CPI 'J'
- JZ BOT1
- CPI 'I'
- JZ TOP4
- CPI 'K'
- JZ BOT4
- CPI 'O'
- JZ TOP7
- CPI 'L'
- JZ BOT7
- CPI 'C'
- JZ COMPARE
- CPI 'Q'
- JZ EXIT
- JMP LOOP
- ;
- TOP CALL RDTOP
- PUSH PSW
- CALL SCRTOP
- POP PSW
- CPI 1AH
- RZ
- CPI 0AH
- JNZ TOP
- RET
- ;
- BOT CALL RDBOT
- PUSH PSW
- CALL SCRBOT
- POP PSW
- CPI 1AH
- RZ
- CPI 0AH
- JNZ BOT
- RET
- ;
- TOP1 CALL TOP
- JMP LOOP
- ;
- BOT1 CALL BOT
- JMP LOOP
- ;
- TOP7 MVI B,7
- JMP TOP4LP
- TOP4 MVI B,4
- TOP4LP PUSH B
- CALL TOP
- POP B
- DCR B
- JNZ TOP4LP
- JMP LOOP
- ;
- BOT7 MVI B,7
- JMP BOT4LP
- BOT4 MVI B,4
- BOT4LP PUSH B
- CALL BOT
- POP B
- DCR B
- JNZ BOT4LP
- JMP LOOP
- ;
- TOPCONT CALL TOP
- CALL STAT
- JZ TOPCONT
- JMP LOOP
- ;
- BOTCONT CALL BOT
- CALL STAT
- JZ BOTCONT
- JMP LOOP
- ;
- ;COMPARE FILES, SCROLLING, STOP AT DIFFERENCE
- ;
- COMPARE CALL STAT
- JNZ LOOP
- CALL RDTOP ;GET TOP BYTE
- PUSH PSW
- CALL SCRTOP ;SCROLL IT
- POP PSW
- CPI 1AH ;EOF?
- JZ LOOP
- PUSH PSW ;SAVE FOR COMPARE
- CALL RDBOT ;GET BOTTOM
- PUSH PSW
- CALL SCRBOT
- POP PSW
- POP B
- CPI 1AH
- JZ LOOP
- CMP B
- JZ COMPARE
- CALL PRTOP
- CALL PRBOT
- JMP LOOP
- ;
- ;READBYTE FOR TOP FILE
- ;
- RDTOP LXI H,TOPFCB
- CALL RDBYTE
- RET
- ;
- ;RDBYTE FROM BOTTOM FILE
- ;
- RDBOT LXI H,BOTFCB
- CALL RDBYTE
- RET
- ;
- OPENER1 CALL ERXIT
- DB '++CAN''T OPEN FILE 1++$'
- OPENER2 CALL ERXIT
- DB '++CAN''T OPEN FILE 2++$'
- ;
- ;SCROLL TOP HALF OF SCREEN
- ;
- SCRTOP PUSH H
- LHLD TOPLPTR
- MOV M,A
- INX H
- SHLD TOPLPTR
- LXI H,TOPLCT
- INR M
- POP H
- CPI 0AH
- JZ PRTOP
- LDA TOPLCT
- ORA A
- RP
- PRTOP PUSH H
- LDA TOPLCT
- MOV B,A
- INR B
- INR B
- INR B
- LXI H,TOPL
- CALL PRLINE
- LXI H,TOPLINE
- SHLD TOPLPTR
- XRA A
- STA TOPLCT
- POP H
- RET
- ;
- ;SCROLL BOTTOM HALF OF SCREEN
- ;
- SCRBOT PUSH H
- LHLD BOTLPTR
- MOV M,A
- INX H
- SHLD BOTLPTR
- POP H
- CPI 0AH
- JZ PRBOT
- LDA BOTLCT
- INR A
- STA BOTLCT
- RP
- PRBOT PUSH H
- LDA BOTLCT
- MOV B,A
- INR B
- INR B
- INR B
- LXI H,BOTL
- CALL PRLINE
- LXI H,BOTLINE
- SHLD BOTLPTR
- XRA A
- STA BOTLCT
- POP H
- RET
- ;
- ;PRINT LINE POINTED TO BY HL, B=COUNT
- ;
- PRLINE MOV A,M
- CALL TYPE
- INX H
- DCR B
- JNZ PRLINE
- DCX H
- MOV A,M ;WAS IT LF?
- CPI 0AH
- RZ
- MVI A,0DH
- CALL TYPE
- MVI A,0AH
- CALL TYPE
- RET
- ;
- ;TYPE ROUTINE. PRINTS [HEX] IF NOT PRINTABLE
- ;
- TYPE CPI 9
- JZ TYPEIT
- CPI 0DH
- JZ TYPEIT
- CPI 0AH
- JZ TYPEIT
- CPI ' '
- JC DOHEX
- CPI 7FH
- JC TYPEIT
- DOHEX PUSH PSW
- MVI A,'['
- CALL TYPE
- POP PSW
- PUSH PSW
- CALL LNIB
- CALL TYPE
- POP PSW
- CALL RNIB
- CALL TYPE
- MVI A,']'
- CALL TYPE
- RET
- ;
- TYPEIT PUSH B
- PUSH D
- PUSH H
- MOV E,A
- MVI C,2
- CALL BDOS
- POP H
- POP D
- POP B
- RET
-
-
-
- ;
- LNIB RAR
- RAR
- RAR
- RAR
- RNIB ANI 0FH
- ADI 90H
- DAA
- ACI 40H
- DAA
- RET
- ;
- ; FROM EQU8.LIB:
- ;
- ;RDBYTE, HL POINTS TO EXTENDED FCB:
- ;
- ; 2 BYTE BUFFER ADDR
- ; 2 BYTE "BYTES LEFT" (INIT TO 0)
- ; 1 BYTE BUFFER SIZE (IN PAGES)
- ; 2 BYTE FCB ADDRESS (33 BYTES)
- ;
- RDBYTE MOV E,M
- INX H
- MOV D,M ;GET BUFFER ADDR
- INX H
- MOV C,M
- INX H
- MOV B,M ;BC = BYTES LEFT
- MOV A,B ;GET COUNT
- ORA C
- JNZ RDBNORD ;NO READ
- ;
- INX H ;TO BUFFER SIZE
- MOV A,M ;GET COUNT
- ADD A ;MULTIPLY BY 2
- MOV B,A ;SECTOR COUNT IN B
- INX H ;TO FCB
- PUSH H ;SAVE FCB POINTER
- MOV A,M ;GET..
- INX H ;..FCB..
- MOV H,M ;..ADDR..
- MOV L,A ;..TO HL
- ;
- RDBLP MVI A,1AH ;GET EOF CHAR
- STAX D ;SAVE IN CASE EOF
- PUSH D ;SAVE DMA ADDR
- PUSH H ;SAVE FCB ADDR
- CPM STDMA ;SET DMA ADDR
- POP D ;GET FCB
- CPM READ
- ORA A
- POP H ;HL=DMA, DE=FCB
- JNZ RDBRET ;GOT EOF
- MOV A,L
- ADI 80H ;TO NEXT BUFF
- MOV L,A
- MOV A,H
- ACI 0
- MOV H,A
- XCHG ;DMA TO DE, FCB TO HL
- DCR B ;MORE SECTORS?
- JNZ RDBLP ;YES, MORE
- RDBRET POP H ;GET FCB POINTER
- DCX H ;TO LENGTH
- MOV A,M ;GET LENGTH
- DCX H ;TO COUNT
- MOV M,A ;SET PAGE COUNT
- DCX H ;TO LO COUNT
- DCX H ;TO HI FCB
- DCX H ;TO EFCB START
- JMP RDBYTE ;LOOP THRU AGAIN
- ;
- RDBNORD INX H ;TO LENGTH
- MOV A,M ;GET LENGTH (PAGES)
- XCHG ;BUFF TO HL
- ADD H
- MOV H,A ;HL = END OF BUFF
- MOV A,L
- SUB C
- MOV L,A
- MOV A,H
- SBB B
- MOV H,A ;HL = DATA POINTER
- MOV A,M ;GET BYTE
- XCHG ;EFCB BACK TO HL
- CPI 1AH ;EOF?
- RZ ;YES, LEAVE POINTERS
- DCX B ;DECR COUNT
- DCX H ;BACK TO "BYTES LEFT"
- MOV M,B
- DCX H
- MOV M,C ;STORE BACK COUNT
- RET
- ;
- ;----> INIT GETS CP/M CONSOLE STATUS AND CONSOLE
- ; OUT VECTORS
- ;
- INIT LHLD 1 ;GET WARM BOOT ADDR
- LXI D,3 ;LENGTH OF 1 "JMP"
- DAD D ;POINT TO CONS. STAT
- SHLD VSTAT+1
- DAD D
- SHLD VKEYIN+1
- RET
- ;
- ;CP/M CONSOLE STATUS VIA DIRECT BIOS CALL
- ;
- STAT PUSH B
- PUSH D
- PUSH H
- VSTAT CALL $-$ ;ADDR MOD. BY "INIT"
- POP H
- POP D
- POP B
- ORA A
- RET
- ;
- ;CP/M CONSOLE INPUT VIA DIRECT BIOS CALL
- ;
- KEYIN PUSH B
- PUSH D
- PUSH H
- VKEYIN CALL $-$ ;ADDR MOD. BY "INIT"
- POP H
- POP D
- POP B
- RET
- ;
- ;FOLLOWING FROM 'EQU8.LIB'---->
- ;
- ;MOVE, COMPARE SUBROUTINES
- ;
- IF MF ;MACRO EXPANSION FLAG SET?
- MOVER MOV A,M
- STAX D
- INX H
- INX D
- DCX B
- MOV A,B
- ORA C
- JNZ MOVER
- RET
- ENDIF
- ;
- ;EXIT WITH ERROR MESSAGE
- MSGEXIT EQU $ ;EXIT W/"INFORMATIONAL" MSG
- ERXIT POP D ;GET MSG
- MVI C,PRINT
- CALL BDOS
- ;EXIT, RESTORING STACK AND RETURN
- EXIT LHLD STACK
- SPHL
- RET ;TO CCP
- DS 40H ;STACK AREA
- STACK DS 2
- ;
- TOPFCB DW TOPBUF ;BUFFER ADDR
- DW 0 ;CHARS IN BUFFER
- DB 16 ;BUFF SIZE IN SECTORS
- DW FCB ;FCB ADDR
- BOTFCB DW BOTBUF ;BUFFER ADDR
- DW 0 ;CHARS IN BUFFER
- DB 16 ;BUFF SIZE IN SECTORS
- DW MYFCB ;FCB ADDR
- ;
- MYFCB DB 0,'XXXXXXXXYYY',0
- DS 19
- DB 0
- ;
- TOPLPTR DW TOPLINE
- BOTLPTR DW BOTLINE
- TOPLCT DB 0
- BOTLCT DB 0
- TOPL DB '1: ' ;COLON TAB
- TOPLINE DS 128
- BOTL DB '2: ' ;COLON TAB
- BOTLINE DS 128
- TOPBUF DS 16*256 ;4K BUFFER
- BOTBUF DS 16*256 ;4K BUFFER
- ;
- ;BDOS/CBIOS EQUATES (VERSION 8)
- ;
- RDCON EQU 1
- WRCON EQU 2
- PRINT EQU 9
- CONST EQU 11
- OPEN EQU 15
- CLOSE EQU 16
- SRCHF EQU 17
- SRCHN EQU 18
- ERASE EQU 19
- READ EQU 20
- WRITE EQU 21
- MAKE EQU 22
- REN EQU 23
- STDMA EQU 26
- BDOS EQU 5
- FCB EQU 5CH
- FCB2 EQU 6CH
- FCBEXT EQU FCB+12
- FCBRNO EQU FCB+32
-