home *** CD-ROM | disk | FTP | other *** search
- ;********************************;
- ; FILE PRINT UTILITY ;
- ;********************************;
-
- ;********************************;
- ;VERSION 1.1
- ;ORIGINAL CODED BY JEFF KRAVITZ
- ;MODIFIED BY A. GOLD
- ;CONDITIONAL ASSEMBLY FOR <FF> HARDWARE AND
- ;OUTPUT TO CONSOLE OR CP/M LIST DEVICE
- ;10/15/77
- ;MODIFIED AGAIN BY J. KRAVITZ TO
- ;INCLUDE HIGH SPEED TAB FUNCTION
- ;FOR DIABLO HYTYPE DRIVER 11/10/77
- ;********************************;
-
- ;********************************;
- ; MISCELLANEOUS EQUATES ;
- ;********************************;
-
-
- MAXLN EQU 56 ;LINES/PAGE
- NULLS EQU 12 ;NULLS AFTER A FORM FEED
-
- BOOT EQU 0000H ;REBOOT ENTRY POINT
- CPM EQU 0005H ;CPM ENTRY POINT
-
- TBUF EQU 0080H ;TRANSIENT PROGRAM BUFFER
- TFCB EQU 005CH ;TRANSIENT PROGRAM FCB
-
- OPEN EQU 15 ;OPEN FUNCTION CODE
- READ EQU 20 ;READ FUNCTION CODE
-
- LINES EQU 7 ;LINES TO PAGE TOP
- LF EQU 0AH ;<LF>
-
- FF EQU 0CH ;<FF>
- CR EQU 0DH ;<CR>
-
- TAB EQU 09H ;<TAB>
- SPACE EQU 20H ;<SPACE>
- RUBOUT EQU 7FH ;USED AS FF NULL. MAY CAUSE PROBLEM
- ;TO SOME PRINTERS
-
- DIABLO EQU 0FFFFH ;SET TO 0FFFFH FOR DIABLO, 0 OTHERWISE
- ODEV EQU 0 ;CON:=2 LST:=5
- FORM EQU 0H ;SET 0FFFFH FOR 0CH <FF>
- ;SET 0 FOR <LF>'S TO PAGE TOP
- ;TO DEVICE THAT NEEDS LINE-FEEDS
- ;
- ;********************************;
-
- ;********************************;
- ; MAIN LOOP ;
- ;********************************;
-
- ORG 100H
- JMP PRINT
-
- ;PUT A CLUE IN OBJECT
- DB '/ PRINT UTILITY VERS. 1.2 /'
- IF FORM AND (NOT DIABLO)
- DB ' HARDWARE FF /'
- ENDIF
- IF NOT FORM AND (NOT DIABLO)
- DB ' LF TO PAGE TOP /'
- ENDIF
- IF NOT ODEV-5 AND (NOT DIABLO)
- DB ' OUT TO LST: /'
- ENDIF
- IF NOT ODEV-2 AND (NOT DIABLO)
- DB ' OUT TO CON: /'
- ENDIF
- IF DIABLO
- DB ' OUT TO DIABLO: '
- ENDIF
-
- PRINT: LXI SP,STACK
- LXI D,TFCB ;POINT TO FCB
- CALL FOPEN ;OPEN FILE
- JC ERR ;IF ERROR, EXIT
- IF DIABLO
- CALL RSTR ;RESTORE THE PRINTER
- ENDIF
- ;
- IF FORM AND (NOT DIABLO) ;DO <FF> IF HARDWARE
- CALL TOF ;PRINT HEADING
- ENDIF
- ;
- IF (NOT FORM) OR DIABLO;IF NO HARDWARE, ASSUME THERE
- CALL TOF3
- ENDIF
- ;
-
- LOOP: CALL GETBT ;GET A BYTE
- JC ERR ;ERROR
- CPI 1AH ;EOF?
- JZ DONE ;YES
- CPI CR ;CR?
- JZ CRET ;YES
- CPI LF ;LF?
- JZ LFEED ;YES
- CPI TAB ;TAB?
- JZ TABMOV ;YES
- CPI SPACE ;ODD CONTROL CHR?
- JNC LOOPX ;NO, PRINT CHR.
- JMP LOOP ;YES, DROP IT
-
- TABMOV: LXI H,COL ;POINT TO COLUMN
- TBLP: MVI A,SPACE ;PRINT ONE SPACE
- CALL PBYT
- MOV A,M ;GET COLUMN
- ANI 07H ;MODULO 8
- JNZ TBLP ;IF NOT AT TAB STOP, KEEP TYPEIN
- JMP LOOP
- LOOPX: CALL PBYT ;PRINT BYTE
- JMP LOOP
-
- CRET: XRA A
- STA COL
- MVI A,CR
- JMP LOOPX
-
- LFEED: LDA LINE ;GET LINE COUNT
- CPI MAXLN ;PAGE OVERFLOW?
- JZ NEWPG ;YES
- INR A ;BUMP LINE COUNT
- STA LINE
- MVI A,LF
- JMP LOOPX ;CONTINUE
-
- NEWPG: MVI A,CR
- CALL PBYT ;PRINT CR
- CALL TOF
- JMP LOOP
- ;
- ;
- IF FORM AND (NOT DIABLO) ;ROUTINE TO FORM FEED WITH 0CH
- TOF: MVI A,FF ;FORM FEED
- CALL PBYT
- MVI B,NULLS ;NUMBER OF RUBOUTS
- TOF2: MVI A,RUBOUT
- CALL PBYT
- DCR B ;DCREMENT COUNT
- JNZ TOF2 ;PRINT 'N' RUBOUTS
- ENDIF
- ;
- ;
- IF (NOT FORM) OR DIABLO;ROUTINE TO PAGE TOP WITH <LF>'S
- TOF: MVI B,LINES ;NUMBER OF LINES
- TOF2: MVI A,LF ;<LF>
- CALL PBYT
- DCR B ;DCREMENT COUNT
- JNZ TOF2 ;PRINT 'N' <LF>'S
- ENDIF
- ;
- ;
- TOF3: LXI H,FMSG ;POINT TO MESSAGE
- CALL PSTRNG ;PRINT STRING
- LXI H,TFCB+1;POINT TO NAME
- MVI B,8 ;SIZE OF NAME
- CALL PCNT ;PRINT COUNT
- MVI A,SPACE ;PRINT A SPACE
- CALL PBYT
- LXI H,TFCB+9;POINT TO TYPE
- MVI B,03 ;SIZE OF TYPE
- CALL PCNT ;PRINT COUNT
- LXI H,PMSG ;POINT TO MESSAGE
- CALL PSTRNG ;PRINT STRING
- LDA PAGE ;GET PAGE NUMBER
- INR A ;BUMP IT
- STA PAGE ;SAVE IT
- CALL DEC ;CONVERT TO DECIMAL
- LXI H,DECWRK;POINT TO DEC STRING
- MVI B,3
- CALL PCNT ;PRINT PAGE NUMBER
- MVI A,CR ;PRINT CR
- CALL PBYT
- MVI A,LF
- CALL PBYT ;PRINT LF
- MVI A,LF
- CALL PBYT ;AND SECOND
- MVI A,LF
- CALL PBYT ;AND A THIRD
- XRA A
- STA LINE ;RESET LINE COUNT
- STA COL ;RESET COLUMN
- RET
-
- PBYT: PUSH H
- PUSH B
- PUSH PSW
- IF NOT DIABLO
- MOV E,A
- MVI C,ODEV
- CALL CPM ;PRINT
- ENDIF
- IF DIABLO
- CALL DDVR
- ENDIF
- POP PSW
- CPI SPACE ;NON-PRINTING?
- JC PBY2 ;YES, DONT BUMP COL
- LXI H,COL ;INCREMENT COLUMN
- INR M
- PBY2: MVI C,11 ;GET CONSOLE STATUS
- CALL CPM
- CPI 00 ;BREAK?
- JNZ BOOT ;YES, DONE
- POP B
- POP H
- RET
- PSTRNG: MOV A,M ;GET BYTE
- CPI '$' ;STRING END?
- RZ ;YES, DONE
- CALL PBYT ;PRINT BYTE
- INX H ;BUMP POINTER
- JMP PSTRNG ;LOOP
-
- PCNT: MOV A,M ;GET BYTE
- CALL PBYT ;PRINT IT
- INX H ;BUMP POINTER
- DCR B ;DECREMENT COUNT
- JNZ PCNT
- RET
-
- DEC: LXI H,DECWRK
- MVI C,100
- CALL DIGIT
- MVI C,10
- CALL DIGIT
- MVI C,1
- CALL DIGIT
- RET
-
- DIGIT: MVI M,'0'
- DI0: SUB C
- JM DI1
- INR M
- JMP DI0
- DI1: ADD C
- INX H
- RET
-
-
- IF FORM
- DONE: MVI A,FF ;FORM FEED
- CALL PBYT
- MVI B,NULLS ;RUBOUT COUNT
- DLP2: MVI A,RUBOUT
- CALL PBYT
- DCR B
- JNZ DLP2
- ENDIF
- ;
- IF (NOT FORM) OR DIABLO
- DONE: LXI H,LINE ;POINT TO CURRENT LINE
- MVI A,MAXLN
- SUB M ;LINES LEFT TO PRINT
- ADI LINES ;PLUS LINE TO PAGE TOP
- MOV B,A
- DLP2: MVI A,LF ;<LF>
- CALL PBYT
- DCR B ;DCREMENT COUNT
- JNZ DLP2 ;PRINT 'N' LINES TO PAGE TOP
- ENDIF
- ;
- JMP BOOT ;EXIT
-
- ERR: LXI D,ERMSG
- MVI C,09H ;WRITE MSG
- CALL CPM
- JMP BOOT
-
-
- ;********************************;
- ; F O P E N ;
- ; ROUTINE TO OPEN A DISK FILE ;
- ; ;
- ; INPUT: DE=A(FCB) ;
- ; OUTPUT: CARRY=ERROR ;
- ;********************************;
-
- FOPEN: MVI C,OPEN ;OPEN CODE
- CALL CPM ;ISSUE OPEN
- CPI 0FFH ;ERROR?
- JZ FOERR ;YES
- XRA A ;CLEAR CARRY
- RET
- FOERR: STC
- RET
-
-
- ;********************************;
- ; G E T B T ;
- ; ROUTINE TO READ A BYTE ;
- ; ;
- ; OUTPUTS: A=BYTE ;
- ; CARRY=ERROR ;
- ;********************************;
-
- GETBT: LXI H,TBUF+128
- XCHG ;BUFFER END ADDR. IN DE
- LHLD INPTR ;CURRENT POINTER IN HL
- CALL CPHL ;TEST FOR END OF BUFFER
- JZ GETB2 ;YES, READ
- GETB1: MOV A,M ;GET BYTE
- INX H ;BUMP POINTER
- SHLD INPTR ;SAVE POINTER
- ORA A ;RESET CARRY
- RET
- GETB2: MVI C,READ ;READ CODE
- LXI D,TFCB ;FCB ADDRESS
- CALL CPM ;ISSUE READ
- CPI 00 ;ERROR?
- JNZ IERR ;YES
- LXI H,TBUF ;RESET BUFFER POINTER
- SHLD INPTR
- JMP GETB1 ;CONTINUE
- IERR: STC
- RET
-
- ;********************************;
- ; MISCELLANEOUS SUBROUTINES ;
- ;********************************;
-
- ;********************************;
- ; C P H L ;
- ; ROUTINE TO COMPARE HL VS DE ;
- ;********************************;
-
- CPHL: MOV A,H
- CMP D
- RNZ
- MOV A,L
- CMP E
- RET
-
-
- ;
- ; DIABLO DRIVER FOR N.Y. INTERFACE BOARD
- ; WITH HI SPEED TABBING FUNCTION
- ;
- IF DIABLO
- DDVR: PUSH PSW ;SAVE PSW
- PUSH B ;SAVE BC
- PUSH D ;SAVE DE
- PUSH H ;SAVE HL
- CPI 0DH ;CR?
- JZ PCR ;YES
- CPI 0AH ;LINE FEED?
- JZ PLF ;YES
- CPI 20H ;OTHER CONTROL?
- JC DXIT ;YES, IGNORE
- JZ PSP ;SPACE
- CPI 7FH
- JC PCH ;CONTINUE IF ASCII
- DXIT: POP H
- POP D
- POP B
- POP PSW ;EXIT TO CALLER
- RET
-
- PCH: PUSH PSW ;SAVE CHAR
- CALL CKMOV ;TEST FOR SAVED MOVE
- POP PSW ;RESTORE CHAR
- STA DLOW ;SAVE CHAR
- MVI A,0
- STA DHIGH ;CLEAR DATA HIGH
- MVI B,CHRDY ;TEST FOR CHAR READY
- CALL CKSTT ;CALL STATUS CHECK
- CALL OUT16 ;OUTPUT 16 BITS TO DIABLO
- OUT CHSTB ;OUTPUT CHARACTER STROBE
- JMP PSP
- PCR: LHLD CLOC ;GET CURRENT LOCATION
- MOV A,H
- ORI 04H ;SET REVERSE DIRECTION BIT
- MOV H,A ;SET DIRECTION
- CALL CMOVE ;RETURN CARRIAGE
- LXI H,0000 ;ZERO CLOC
- SHLD CLOC
- SHLD SPCNT ;ZERO SPACE COUNT
- JMP DXIT ;EXIT TO CALLER
- PLF: CALL CKMOV ;CHECK FOR PREVIOUS MOVE
- LXI H,0008 ;MOVE DOWN 8 INCR.
- CALL PMOVE
- JMP DXIT ;RETURN TO CALLER
- PSP: LHLD SPCNT ;GET SPACE COUNT
- LXI D,0006 ;NEW INCREMENT
- DAD D ;ADD TO CURRENT SPACE COUNT
- SHLD SPCNT ;SAVE IT
- JMP DXIT ;DONE
-
- CKMOV: LHLD SPCNT ;TEST FOR NON ZERO SPACE COUNT
- MOV A,H
- ORA L
- RZ ;ZERO, IGNORE
- CALL CMOVE ;NON ZERO, MOVE CARRIAGE
- LHLD SPCNT
- XCHG
- LHLD CLOC
- DAD D
- SHLD CLOC ;UPDATE CARRIAGE LOCATION
- LXI H,0000
- SHLD SPCNT ;ZERO THE SPACE COUNT
- RET
-
-
- CKSTT: IN DSTAT ;GET DIABLO STATUS
- CMA
- ANA B ;TEST STATUS
- JZ CKSTT ;LOOP TILL READY
- RET
-
- CMOVE: SHLD DLOW ;SAVE DATA
- MVI B,CMRDY
- CALL CKSTT
- CALL OUT16 ;SEND 16 BITS TO DIABLO
- OUT CMSTB ;CARRIAGE MOVEMENT STROBE
- RET
-
- PMOVE: SHLD DLOW
- MVI B,PMRDY ;TEST PAPER MOVEMENT STATUS
- CALL CKSTT
- CALL OUT16 ;OUTPUT 16 BITS TO DIABLO
- OUT PMSTB ;PAPER MOVEMENT STROBE
- RET
- OUT16: LDA DLOW ;GET LOW ORDER DATA BYTE
- RAL ;ROTATE TO POSITION BITS
- OUT DALOW ;OUTPUT TO DATA LOW PORT
- LDA DHIGH ;GET HIGH ORDER BYTE
- RAL ;ROTATE
- OUT DAHIGH
- RET
-
- RSTR: OUT RSSTB ;OUTPUT TO RESTORE STROBE
- LXI H,0000
- SHLD CLOC ;ZERO CURRENT CARRIAGE LOC
- SHLD SPCNT ;ZERO SPACE COUNTER
- RET
-
- DLOW EQU 0047H ;BYTES LOCATED AT 47-4F
- DHIGH EQU DLOW+1
- CLOC EQU DHIGH+1
- SPCNT EQU CLOC+2
-
- DSTAT: EQU 40H
- DALOW: EQU 40H
- DAHIGH: EQU 41H
- CHSTB EQU 42H
- CMSTB EQU 43H
- PMSTB EQU 44H
- RSSTB: EQU 45H
-
- CHRDY EQU 01H
- CMRDY EQU 02H
- PMRDY EQU 04H
- ENDIF
-
- ;********************************;
- ; D A T A ;
- ;********************************;
-
- COL: DB 0 ;COLUMN COUNTER
- LINE: DB 0 ;LINE COUNTER
- PAGE: DB 0 ;PAGE COUNTER
-
- FMSG: DB CR,'FILE: $'
- PMSG: DB ' PAGE $'
- ERMSG: DB 'ERROR',0DH,0AH,'$'
- DS 32
- STACK EQU $
- INPTR: DW TBUF+128;INPUT POINTER
- DECWRK: DB '000'
- END PRINT
-