10 ' ************************************************************ 20 ' **** GRUMP FOR MX, FX, AND IBM PRINTERS **** 30 ' **** FOR HIGH AND MEDIUM RESOLUTION SCREENS **** 40 ' **** MACHINE LANGUAGE SUBROUTINE **** 50 ' ************************************************************ 60 ' THIS PROGRAM PRINTS IBM PC MEDIUM AND HIGH RESOLUTION 70 ' GRAPHIC SCREENS (SCREEN 1, SCREEN 2) ON EPSONS WITH BIT 80 ' GRAPHICS MODE AND THE IBM GRAPHIC PRINTER USING A MACHINE 90 ' LANGUAGE ROUTINE. WORKS WITH BASICA 1.1 AND BASICA 2.0 100 ' 110 ' PETER BAENZIGER,1215 LANE BLVD., KALAMAZOO, MI 49001 120 ' 130 ' 140 DEFINT A-Z 150 GOSUB 4000 ' DETERMINE WHAT SCREEN WE'RE ON 160 IF SCREENSTAT > 6 OR SCREENSTAT < 4 THEN ERRMSG$ = "SCREEN NOT IN GRAPHICS MODE" 165 IF SCREENSTAT > 6 OR SCREENSTAT < 4 THEN GOTO 5000 170 ' 180 GOSUB 4500 ' 190 IF CROSSCHECK <> CHECK THEN ERRMSG$ = "ONE OR MORE OF THE NUMBERS IN THE DATA IS WRONG" 195 IF CROSSCHECK <> CHECK THEN GOTO 5000 970 ' 980 'SCREEN RELATED VARIABLES 990 ' 1000 SCRCOLSIZE = 101 1010 DIM SCRCOL(SCRCOLSIZE) 'HOLDING ARRAY FOR DATA GOTTEN FROM SCREEN 1020 SCRLEFT = 0:IF SCREENSTAT = 6 THEN SCRIGHT = 639 ELSE SCRIGHT = 319 ' SCREEN COLUMN NUMBERS 1030 SCRTOP = 0:SCRBOT = 199 'SCREEN ROW NUMBERS 1040 ' 1050 ' PRINTER DEPENDENT VARIABLES 1060 ' 1070 REPS = 2 'HOW MANY TIMES A BYTE SHOULD BE REPEATED IN PRINTING 1080 SETBITS = 0 '0 MEANS NO BITS NEED SETTING. TO SET A BIT, SET SETBITS TO THE VALUE OF THE BIT YOU WANT TO SET. 1090 CLEARBITS = 255 '255 MEANS NO BITS NEED CLEARING. TO CLEAR A BIT SUBTRACT ITS VALUE FROM 255. 1100 SPECNUM = 0 'ANY SPECIAL NUMBER FOR YOUR PRINTER THAT NEEDS PRINTING TWICE, SUCH AS 3 FOR P-SERIES PRINTERS. SPECNUM=0 MEANS NO SPECIAL NUMBERS 1110 NUMDOTS = 8 'HOW MANY DOTS THE PRINTER PRINTS IN ONE PASS 1120 IF SCREENSTAT = 6 THEN STEPSIZE = NUMDOTS ELSE STEPSIZE = NUMDOTS \ 2 1130 IF SCREENSTAT = 6 THEN GETWIDTH = 7 ELSE GETWIDTH = 3 'GETWIDTH + 1 DOTS ARE TAKEN OFF THE SCREEN IN ONE PASS 1140 'REMAINDER, NOT NEEDED FOR 8 BIT PRINTERS 1150 SHIFT = 0 ' NUMBER OF BIT POSITIONS TO SHIFT TO THE RIGHT. 0 MEANS NO SHIFT 1160 PRINTROW = 0 ' THIS VARIABLE WILL HOLD THE ADDRESS OF THE PRINTING ROUTINE 1170 ' 1180 ' 1190 ' 1200 TOGRAPH$ = CHR$(27)+"K"+CHR$(144)+CHR$(1) ' SWITCH TO GRAPHICS AND TELL HOW MANY BYTES WE ARE GOING TO SEND 1210 TOREG$ = CHR$(27)+"2"+CHR$(27)+"@" ' RESET PRINTER TO NORMAL STATE 1220 SETCRLF$ = CHR$(27)+"3"+CHR$(24) ' SET GRAPHIC LINEFEED ADVANCE DISTANCE 1230 CRLF$ = CHR$(13)+CHR$(10) ' ACTUAL GRAPHIC CARRIAGE RETURN/LINEFEED 1240 LMARGIN$ = SPACE$(6) ' LEFT PAPER MARGIN TO CENTER IMAGE, NOT PRESET 1970 ' 1980 ' SETTING UP THE PRINTER 1990 ' 2000 ERRMSG$ = "PRINTER IS NOT RESPONDING":ON ERROR GOTO 5000 2010 OPEN "LPT1:" AS #1 ' PRINTING IN RANDOM MODE 2020 WIDTH #1,255 ' KEEP BASIC FROM ADDING CARRIAGE RETURNS EVERY EIGHTY BYTES 2030 PRINT #1, SETCRLF$; ' SET LINEFEED ADVANCE DISTANCE 2040 PRINT #1, CRLF$; ' CLEAR BUFFER 2050 ' 2060 ' HIGH AND MEDIUM RESOLUTION PRINTING 2070 ' 2080 FOR COL = SCRLEFT TO SCRIGHT STEP STEPSIZE 2090 GET (COL,SCRTOP)-(COL+GETWIDTH,SCRBOT),SCRCOL 2100 GOSUB 3000 ' PRINTING ROUTINE 2110 NEXT COL 2120 ' 2130 ' SWITCH PRINTER BACK TO REGULAR MODE 2140 ' 2150 PRINT #1, TOREG$ 2160 END 2170 ' 2970 ' 2980 'MACHINE LANGUAGE PRINTING SUBROUTINE 2990 ' 3000 PR(0) = REPS:PR(1) = SPECNUM:PR(2) = CLEARBITS:PR(3) = SETBITS:PR(4) = SHIFT 'TRANSFER PARAMETERS SO PRINTROW CAN GET TO THEM 3010 PR(5) = VARPTR(SCRCOL(SCRCOLSIZE))+1 ' TRANSFER STARTING ADDRESS OF SCRCOL 3020 PR(6) = 0 'CLEAR ERROR FLAG 3030 ' 3040 PRINT #1, LMARGIN$ TOGRAPH$; 3050 PRINTROW = VARPTR(PR(7)) 'ADDRESS OF MACHINE LANGUAGE ROUTINE 3060 CALL PRINTROW(PR(0)) 3070 IF PR(6) THEN ERROR 24 ' ERROR 24 IS DEVICE TIMEOUT, TRAPS TO 5000 3080 PRINT #1, CRLF$; 3090 RETURN 3970 ' 3980 ' FIND OUT WHAT SCREEN WE'RE ON 3990 ' 4000 DEF SEG = 0:SCREENSTAT = PEEK(1024 +73):DEF SEG 4010 RETURN 4470 ' 4480 ' LOAD MACHINE LANGUAGE PRINTING ROUTINE 4490 ' 4500 DIM PR(48) ' ARRAY TO HOLD MACHINE LANGUAGE ROUTINE 4510 CHECK = 0 ' CHECK VALUE TO CHECK TYPO'S IN ENTERING THE &H'NUMBERS 4520 FOR N = 7 TO 48 ' PR(0) TO PR(6) HOLD DATA SO START WITH 7 4530 READ PR(N):CHECK = CHECK XOR PR(N) 4540 NEXT N 4550 READ CROSSCHECK ' CHECK AND CROSSCHECK SHOULD BE THE SAME 4560 RETURN 4570 ' 4580 ' DATA FOR MACHINE LANGUAGE ROUTINE 4590 ' --------------------------------- 4600 ' DATA ON FOLLOWING LINE IS FOR PRINTER THAT PRINTS HIGH BIT UP. FOR PRINTER THAT PRINT LOW BIT UP, CHANGE TO &HBAFC 4610 DATA &HBAFD 4620 ' DATA ON FOLLOWING LINE IS FOR LPT1:. FOR LPT2: CHANGE IT TO &HOOO1. FOR LPT3: CHANGE IT TO &H0002 4630 DATA &H0000 4640 ' DATA ON THE FOLLOWING FIVE LINES IS THE SAME FOR ALL VERSIONS 4650 DATA &H8B55,&H8BEC,&H065E,&H778B,&H8A0A,&H084F,&HC8BF,&HAC00,&HE8D2 4660 DATA &H4722,&H0A04,&H0647,&H22E8,&H0A00,&H75E4,&HF617,&H0247,&H74FF 4670 DATA &H3A0C,&H0247,&H0775,&H10E8,&H0A00,&H75E4,&H4F05,&HDB75,&HC033 4680 DATA &H4789,&H5D0C,&H02CA,&H8A00,&H322F,&HCDE4,&HF617,&H29C4,&H0B75 4690 DATA &HCDFE,&HF375,&HE432,&H00C3 4700 ' NEXT LINE IS A CROSSCHECK FOR HIGH BIT UP PRINTERS AND LPT1:. FOR LOW BIT UP PRINTERS ANS LPT1: CHANGE TO &H3453 4710 DATA &H3452 4970 ' 4980 ' ERROR MESSAGES 4990 ' 5000 BEEP:PRINT ERRMSG$:END