home *** CD-ROM | disk | FTP | other *** search
- NAME FPRINT
- ;FORMATTED PRINT ROUTINE
- ;RUSS BAKKE
- ;03-06-83
- ;
- ORG 100H ;NORMAL START
- START LD SP,0D100H
- LD DE,MSG1 ;BANNER
- CALL MSG
- LD HL,DISST
- LD (FILEN),HL ;INIT
- LD IX,FLAGS
- LD (IX),0
- LD (IX+1),0
- LD HL,DBUFF ;SEE IF OPTIONS PASSED
- LD A,(HL) ;# OF CHARS
- CP 0
- JR Z,CONT3 ;NO OPTIONS PASSED
- CONT1 INC HL ;SEARCH FOR / & #
- LD A,(HL)
- CP '/'
- JR Z,CONT2 ;FOUND IT
- CP '#'
- JR Z,CONT2A ;FOUND IT
- CP 0 ;NULL?
- JR NZ,CONT1 ;NO, CONTINUE
- JR CONT3
- ;
- CONT2 INC HL ;ADJUST FOR /
- CALL SETFLG
- LD A,(HL) ;AT NULL?
- CP 0
- JR Z,CONT3 ;YES, QUIT
- BIT 7,(IX+1) ;COUNT SET?
- JR Z,CONT1 ;NO, CONTINUE
- JR CONT3 ;YES
- ;
- ;CONT2A-# FOUND
- CONT2A INC HL
- CALL GETCNT
- LD A,(HL) ;AT NULL?
- CP 0
- JR Z,CONT3 ;YES, QUIT
- BIT 7,(IX) ;OPTIONS SET?
- JR Z,CONT1 ;NO, CONTINUE
- ;
- ;SEE IF AN FCB WAS PASSED
- CONT3 LD HL,DBUFF
- LD A,(HL) ;LENGTH OF COMD LINE
- OR A ;SET FLAGS
- CALL Z,GETFN
- CALL GETFL ;LOAD FILE
- BIT 7,(IX)
- JR NZ,CONT4 ;OPTIONS ALREADY SET
- CONT3A LD DE,MSG3 ;OPTIONS?
- CALL MSG
- LD DE,DBUFF
- LD A,7FH ;BUFFER LENGTH
- LD (DE),A
- LD C,10 ;GET LINE
- CALL DOS
- CALL LF
- LD HL,DBUFF+2
- CALL SETFLG
- BIT 7,(IX) ;SUCCESSFUL?
- JR Z,CONT3A ;NO, TRY AGAIN
- CONT4 BIT 7,(IX+1)
- JR NZ,CONT5 ;SET
- CONT4A LD DE,MSG3A
- CALL MSG
- LD DE,DBUFF
- LD A,7FH ;BUFFER LENGTH
- LD (DE),A
- LD C,10 ;GET LINE
- CALL DOS
- CALL LF ;ECHO LF
- LD HL,DBUFF+2
- CALL GETCNT
- BIT 7,(IX+1) ;SUCCESSFUL?
- JR Z,CONT4A ;NO, TRY AGAIN
- ;
- CONT5 LD A,(COUNT)
- LD C,A
- CONT5A PUSH BC ;SAVE COUNT
- BIT 1,(IX)
- JR Z,MORE2
- LD E,9 ;HT
- CALL PRNTR
- MORE2 LD HL,DISST
- CALL PRINT
- CALL FORM
- POP BC
- DEC C
- JP Z,0 ;RET TO OS
- BIT 3,(IX) ;BOTTOM OF PAGE PROMPT?
- JR Z,MORE3 ;NO
- PUSH BC
- LD DE,MSG8
- JR MORE4
- ;
- MORE3 BIT 4,(IX) ;END OF TEXT PROMPT?
- JR Z,CONT5A ;NO
- PUSH BC
- LD DE,MSG9
- MORE4 CALL MSG
- LD C,1 ;GET CHAR
- CALL DOS
- CALL CRLF
- POP BC
- JR CONT5A
- ;
- GETFN LD DE,MSG2 ;"FILE NAME"
- CALL MSG
- LD DE,DBUFF
- LD A,7FH ;BUFFER LENGTH
- LD (DE),A
- LD C,10 ;GET LINE
- CALL DOS
- CALL LF
- LD HL,DBUFF+2
- LD DE,FCB
- LD C,86H ;FORMAT FCB REQ
- CALL DOS
- RET
- ;
- GETFL LD C,15 ;OPEN
- LD DE,FCB
- CALL DOS
- CP -1 ;RETS -1 IF NOT FOUND
- JR Z,NOTFND
- ;NOW READ FILE
- READ1 LD DE,FCB
- LD C,20 ;READ BLOCK
- CALL DOS
- PUSH AF
- LD DE,(FILEN)
- LD HL,DBUFF
- LD BC,80H ;#BYTES READ
- LDIR ;COPY
- LD BC,80H
- LD HL,(FILEN)
- ADD HL,BC ;ADJUST FILEN
- LD (FILEN),HL
- POP AF ;RECOVER ERROR CODE
- OR A ;SET FLAGS
- JR Z,READ1 ;OK, READ NEXT
- CP 1 ;EOF?
- JR NZ,DSKERR ;NO, ERROR
- LD C,16 ;CLOSE
- LD DE,FCB
- CALL DOS
- CP -1
- JR Z,DSKERR
- ;NOW FIND END OF DATA
- LD HL,DISST
- LD B,1AH ;EOF
- LD DE,(FILEN)
- MARK1 LD A,(HL)
- CP B
- JR Z,MARK2
- CALL H1ED
- JR NZ,MARK1
- ;HIT FILEN BEFORE EOF
- LD A,0DH ;NOW FIND LAST CHAR
- MARK1A CP (HL)
- JR NZ,MARK1B
- DEC HL
- JR MARK1A
- MARK1B INC HL
- LD (HL),1AH ;MARK EOF
- ;HAVE EOF
- MARK2 INC HL
- LD (FILEN),HL ;SAVE IT
- RET
- ;
- DSKERR LD DE,MSG6
- DSKER1 CALL MSG
- RST 0 ;RET TO OS
- ;
- NOTFND LD DE,MSG5
- JR DSKER1
- ;
- ;GETCNT-GET # OF COPIES (DEFAULT 1)
- ;FIRST, GET # OF CHARS
- ;(MAY END WITH SPACE OR B=0)
- GETCNT LD C,0
- GETC1 LD A,(HL)
- CP ' '
- JR Z,GETC2 ;DONE
- CP 0
- JR Z,GETC2 ;DONE
- INC C
- INC HL
- JR GETC1
- ;NOW DECODE CHARS
- GETC2 LD A,C
- CP 0 ;0 CHARS?
- JR Z,DEFLT ;YES, DEFAULT
- PUSH HL ;HL NOW POINTS TO SPACE
- CALL DIGIT
- LD E,A
- DEC C
- JR Z,DONE
- CALL DIGIT
- CP 0
- JR Z,MORE
- LD B,A
- LD A,E
- SUM ADD A,10
- DJNZ SUM
- LD E,A
- MORE DEC C
- JR Z,DONE
- CALL DIGIT
- CP 0
- JR Z,DONE
- CP 2
- JP C,NOVAL
- LD B,A
- LD A,E
- SUM1 ADD A,100
- DJNZ SUM1
- LD E,A
- DONE POP HL
- DONE1 LD A,E
- LD (COUNT),A
- SET 7,(IX+1) ;SET DONE FLAG
- RET
- ;
- DEFLT LD E,1
- JR DONE1
- ;
- ;NOVAL--A NON-VALID DECIMAL CHAR WAS ENTERRED
- NOVAL LD DE,MSG4
- CALL MSG
- POP HL
- RET
- ;
- DIGIT DEC HL
- LD A,(HL)
- SUB 30H ;CONVERT TO BIN
- JR C,NOVAL
- CP 9
- JR NC,NOVAL
- RET
- ;
- ;SETFLG--DECODES OPTION STRING AT HL, SETS FLAGS
- SETFLG LD (IX),80H
- LD (IX+3),5 ;DEFAULT TO LST:
- LD A,(HL)
- CP ' ' ;NO CHARS?
- RET Z
- CP 0
- RET Z
- ;
- SETFL1 LD A,(HL)
- CP ' '
- RET Z
- CP 0
- RET Z
- CP 'B'
- JR Z,SETB
- CP 'D'
- JR Z,SETD
- CP 'E'
- JR Z,SETE
- CP 'M'
- JR Z,SETM
- CP 'P'
- JR Z,SETP
- CP 'U'
- JR Z,SETU
- LD (IX),0 ;CLEAR "SET" FLAG
- LD DE,MSG7 ;ERROR
- CALL MSG
- ;
- SETFL2 INC HL
- JR SETFL1
- ;
- SETB SET 3,(IX)
- JR SETFL2
- ;
- SETD SET 0,(IX)
- JR SETFL2
- ;
- SETE SET 4,(IX)
- JR SETFL2
- ;
- SETM SET 1,(IX)
- JR SETFL2
- ;
- SETP SET 5,(IX)
- LD (IX+3),4 ;SELECT PUN:
- JR SETFL2
- ;
- SETU SET 2,(IX)
- JR SETFL2
- ;
- ;PRINT SUB
- ;ENTER WITH START IN HL
- ;USES A,B,E
- PRINT LD (IX+2),0 ;INIT LINE COUNT
- PRINT0 LD A,(HL)
- CP 26 ;EOF?
- RET Z ;YES
- LD E,A
- BIT 2,(IX)
- JR Z,PROK
- LD A,E
- CP 'a'
- JR C,PROK
- CP 'z'+1
- JR NC,PROK
- XOR 20H ;CONVERT TO UPPER CASE
- LD E,A
- PROK PUSH HL
- CALL PRNTR
- LD A,E ;RECOVER CHAR
- CP 0CH ;FF?
- JR Z,PRIN0A
- CP 0DH ;C/R?
- JR NZ,PRIN1
- INC (IX+2) ;LINE COUNTER
- BIT 0,(IX) ;DOUBLE SP?
- JR Z,PRIN0Z ;NO
- CALL PRNTR
- INC (IX+2)
- ;IF COUNT>=58, CHECK FOR PAGE PROMPT
- PRIN0Z LD A,(IX+2)
- CP 58-1
- JR C,PRIN0B
- PRIN0A BIT 3,(IX)
- JR Z,PRIN0B
-
- LD DE,MSG8
- CALL MSG
- LD C,1 ;GET CHAR
- CALL DOS
- CALL CRLF
- LD (IX+2),0 ;RESET COUNTER
- PRIN0B BIT 1,(IX) ;MARGIN?
- JR Z,PRIN1
- LD E,9 ;HT
- CALL PRNTR
- PRIN1 POP HL
- INC HL
- JR PRINT
- ;
- MSG LD C,9
- JP DOS
- ;
- ;H1ED--INC HL, CMP TO DE, RETS C IF >
- H1ED INC HL
- LD A,D
- SUB H
- RET NZ
- LD A,E
- SUB L
- RET
- ;
- CRLF LD C,2
- LD E,0DH ;C/R
- CALL DOS
- ;
- LF LD C,2
- LD E,0AH ;LF
- JP DOS
- ;
- FORM LD E,0CH ;FORM FEED
- PRNTR LD C,(IX+3) ;SEND CHAR IN E TO SELECTED DEVICE
- JP DOS
- ;
- ;
- MSG1 DEFM 'FORMATTED PRINT ROUTINE V1.3'
- DEFW 0A0DH
- DEFM '$' ;EOM
- ;
- MSG2 DEFM 'File name? $'
- ;
- MSG3 DEFM 'Options? [B(ottom of page prompt,'
- DEFW 0A0DH
- DEFM 'D(ouble spaced, E(nd of text prompt,'
- DEFW 0A0DH
- DEFM 'left M(argin, P(unch device,'
- DEFW 0A0DH
- DEFM 'U(pper case only]? $'
- ;
- MSG3A DEFW 0A0DH
- DEFM 'HOW MANY COPIES? (MAX 255) $'
- ;
- MSG4 DEFM 'INVALID DECIMAL NUMBER'
- DEFW 0A0DH
- DEFM '$'
- ;
- MSG5 DEFM 'FILE NOT FOUND'
- DEFW 0A0DH
- DEFM '$'
- ;
- MSG6 DEFM 'DISK ERROR'
- DEFW 0A0DH
- DEFM '$'
- ;
- MSG7 DEFM 'INVALID OPTION'
- DEFW 0A0DH
- DEFM '$'
- ;
- MSG8 DEFM 'INSERT NEXT SHEET AND PRESS ANY KEY $'
- ;
- MSG9 DEFM 'VERIFY PAPER ALIGNMENT AND PRESS ANY KEY $'
- ;
- ;
- FLAGS DEFS 4
- ;FIRST BYTE:
- ;BIT 0=DOUBLE SP, 1=MARGIN, 2=UPPER CASE ONLY
- ;BIT 3=BOTTOM OF PAGE PROMPT, 4=END OF TEXT PROMPT,
- ;BIT 5=PUNCH DEVICE, 7=SET
- ;SECOND BYTE: BIT 7=COUNT SET
- ;THIRD BYTE: LINE COUNT
- ;FOURTH BYTE: DEVICE SELECTION (4=PUN:, 5=LST:)
- ;
- COUNT DEFS 1
- FILEN DEFS 2
- DISST DEFS 1 ;DUMMY
- DBUFF EQU 80H
- FCB EQU 5CH ;FILE CONTROL BLOCK
- DOS EQU 5 ;DOS CALL
- END
-