home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Nibble Magazine
/
nib34b.dsk
/
POSTER.CREATOR.bas
< prev
next >
Wrap
BASIC Source File
|
2023-02-26
|
11KB
|
237 lines
10 REM ***********************
20 REM * POSTER.CREATOR *
30 REM * BY TERRY JOHNSTON *
40 REM * COPYRIGHT(C) 1988 *
50 REM * BY MICROSPARC, INC. *
60 REM * CONCORD, MA 01742 *
70 REM ***********************
80 GOSUB 2190:SL$ = "1":D$ = CHR$(4): REM MACHINE ID
90 GOSUB 2300: REM LOAD M/L ROUTINE TO CLEAR D-HI-RES SCREEN
100 REM SELECT TYPE OF IMAGE TO BE PRINTED
110 REM
120 MX = 0: HOME : VTAB 21: IF ID = 234 THEN HR$ = "S": GOTO 180
130 PRINT "S)TANDARD OR D)OUBLE HI-RES ?": PRINT "DOUBLE HI-RES NEEDS 128K": PRINT "PRESS ";: INVERSE : PRINT "0";: NORMAL : PRINT " TO QUIT": VTAB 21: HTAB 30: GOSUB 2030:HR$ = AN$: PRINT : IF HR$ = "S" THEN PRINT CHR$(12); CHR$(21)
140 IF AN$ = CHR$(48) THEN GOSUB 1950: GOTO 1300
150 IF HR$ < >"S" AND HR$ < >"D" THEN VTAB 21: GOTO 130
160 VTAB 23: PRINT "CLEAR GRAPHICS SCREEN? (Y/N) ";: GOSUB 2340: IF Y$ = "Y" THEN GOSUB 2320
170 POKE 36,0: PRINT SPC( 30);: POKE 36,0: GOTO 200
180 VTAB 23: PRINT "CLEAR GRAPHICS SCREEN? (Y/N) ";: GOSUB 2340: IF Y$ = "Y" THEN GOSUB 2320
190 POKE 36,0: PRINT SPC( 30);: POKE 36,0
200 MX = 5 *(HR$ = "S"): IF HR$ = "D" THEN PRINT CHR$(21): PRINT CHR$(4)"PR#3"
210 V = 4 +MX
220 IF MX = 5 THEN 320
230 REM
240 REM IF DOUBLE HI-RES, PREPARE THE SCREEN
250 REM
260 PRINT D$;"PR#3": PRINT CHR$(12)
270 POKE 49153,0: POKE 49154,0: POKE 49156,0: POKE 49160,0
280 POKE 49165,0: POKE 49246,0
290 REM
300 REM CREATE ARRAY OF BIT VALUES AND POKE IN MACHINE CODE
310 REM
320 FOR J = 0 TO 6:BV(J) = 2 ^J: NEXT J
330 POKE 768,169: POKE 769,0: POKE 770,32: POKE 771,17: POKE 772,244: POKE 773,96
340 REM
350 REM COLLECT GARBAGE AND DISPLAY SCREEN
360 REM
370 GOSUB 1950: IF NOT DS THEN FR = FRE(0): GOTO 390
380 PRINT D$;"FRE"
390 POKE 230,32: POKE 49239,0: POKE 49232,0: POKE 49235,0
400 ONERR GOTO 2080
410 REM
420 REM LOAD IMAGE OR DISPLAY CATALOG
430 REM
440 GOSUB 1950:NAME$ = "":DI$ = "": PRINT "ENTER NAME OF PICTURE": INVERSE : PRINT "?";: NORMAL : PRINT " - CATALOG DISK ";: INVERSE : PRINT "0";: NORMAL : PRINT " - CANCEL"
450 INVERSE : PRINT "CTRL-Q";: NORMAL : PRINT " - QUIT ";: INVERSE : PRINT "RETURN";: NORMAL : PRINT " - ACCEPT": VTAB 21: HTAB 22: PRINT ":";
460 GOSUB 2030: IF AN$ > = CHR$(32) THEN NAME$ = NAME$ +AN$: PRINT AN$;
470 IF AN$ = CHR$(17) THEN PRINT : GOSUB 1950: GOTO 1300
480 IF AN$ = CHR$(48) THEN TEXT : GOTO 120
490 IF AN$ = CHR$(13) THEN PRINT : PRINT : PRINT : GOTO 530
500 L = LEN(NAME$): IF AN$ = CHR$(8) AND L >1 THEN HTAB L +22: PRINT " ";: HTAB L +22:NAME$ = LEFT$(NAME$,L -1)
510 IF AN$ = CHR$(8) AND L = 1 THEN HTAB L +22: PRINT " ";: HTAB L +22:NAME$ = ""
520 GOTO 460
530 IF NAME$ = "" THEN 760
540 IF NAME$ < >"?" AND NAME$ < >"/" THEN 680
550 CA$ = LEFT$("CATALOG",7 -4 *DS):PR$ = "ENTER PREFIX OR DISK DRIVE #": IF NOT DS THEN PR$ = "ENTER DISK DRIVE #"
560 TEXT : HOME : VTAB 5: PRINT PR$: PRINT "PRESS ";: INVERSE : PRINT "0";: NORMAL : PRINT " TO CANCEL": VTAB 5: HTAB LEN(PR$) +1:DI$ = ""
570 GOSUB 2030: IF AN$ > = CHR$(32) THEN DI$ = DI$ +AN$: PRINT AN$;
580 IF AN$ = CHR$(13) THEN PRINT : GOTO 630
590 IF AN$ = CHR$(48) THEN PRINT : GOTO 390
600 L = LEN(DI$): IF AN$ = CHR$(8) AND L >1 THEN HTAB L +28: PRINT " ";: HTAB L +28:DI$ = LEFT$(DI$,L -1)
610 IF AN$ = CHR$(8) AND L = 1 THEN HTAB L +28: PRINT " ";: HTAB L +28:DI$ = ""
620 GOTO 570
630 IF ( VAL(DI$) = 0 AND LEN(DI$) >1 AND LEFT$(DI$,1) < >"/") THEN DI$ = "/" +DI$
640 IF VAL(DI$) = 1 OR VAL(DI$) = 2 THEN DI$ = ",D" +DI$
650 IF ( NOT DS AND LEFT$(DI$,1) = "/") OR ( VAL(DI$) >2) THEN DI$ = "": GOTO 560
660 IF DS THEN PRINT D$;"PREFIX "DI$
670 PRINT D$;CA$ +DI$: INPUT "PRESS <RETURN> TO CONTINUE";AN$: GOSUB 1950: GOTO 390
680 IF MX = 5 THEN PRINT D$;"BLOAD ";NAME$;",A$2000": GOTO 760
690 POKE 49237,0: IF DS THEN PRINT D$;"BLOAD ";NAME$;",A$2000,L$2000": GOTO 710
700 NL = LEN(NAME$):NAME$ = NAME$ +".AUX": PRINT D$;"BLOAD ";NAME$;",A$2000":NAME$ = LEFT$(NAME$,NL)
710 POKE 49236,0: IF DS THEN PRINT D$;"BLOAD ";NAME$;",A$2000,B$2000": GOTO 760
720 PRINT D$;"BLOAD ";NAME$;",A$2000"
730 REM
740 REM CHECK FOR CORRECT IMAGE
750 REM
760 GOSUB 1950: PRINT "IS THIS THE CORRECT PICTURE (Y/N) ?": PRINT "PRESS ";: INVERSE : PRINT "0";: NORMAL : PRINT " TO CANCEL";: VTAB 21: POKE 36,35: GOSUB 2030
770 PRINT
780 IF AN$ = CHR$(48) OR AN$ = "N" THEN 440
790 IF AN$ < >"Y" THEN 760
800 REM
810 REM CALL CROPPING SUBROUTINE
820 REM
830 GOSUB 1450: POKE 49235,0: POKE 216,0
840 GOSUB 1950
850 REM
860 REM SELECT TYPE OF PRINTOUT
870 REM
880 PRINT "PRINT OUT IN N)ORMAL OR I)NVERSE ?": PRINT "PRESS ";: INVERSE : PRINT "0";: NORMAL : PRINT " TO CANCEL"
890 VTAB 21: POKE 36,34: GOSUB 2030:PR$ = AN$: PRINT
900 IF PR$ = CHR$(48) THEN 830
910 IF PR$ < >"N" AND PR$ < >"I" THEN 840
920 GOSUB 1950: PRINT "TURN ON THE PRINTER AND PRESS RETURN": PRINT "PRESS ";: INVERSE : PRINT "0";: NORMAL : PRINT " TO CANCEL PRINTING"
930 VTAB 21: POKE 36,36: GET AN$: PRINT : POKE 49234,0: IF AN$ = "0" THEN GOTO 1260
940 REM
950 REM ACTIVATE THE PRINTER
960 REM
970 PRINT D$;"PR#";SL$
980 REM
990 REM READ BYTES FROM SCREEN AND FORM STRING FOR OUTPUT
1000 REM
1010 TS = INT((R -L)/(5 +MX)):PE = 0
1020 FOR P = 0 TO TS
1030 FOR Y = T TO B:FI = L:LA = FI +V: IF LA >R THEN LA = R
1040 P$ = "": REM NULL STRING
1050 POKE 769,Y: GOSUB 1990
1060 FOR X = LA TO FI STEP -1: IF MX = 5 THEN 1080
1070 FOR SR = 49236 TO 49237: POKE SR,0
1080 Z = PEEK(S +X):SB = Z: IF PR$ = "I" THEN Z = 255 -Z
1090 IF PEEK(49152) >127 THEN GET AN$: IF AN$ = CHR$(48) THEN X = FI:Y = B:P = TS:PE = 1: GOTO 1260
1100 IF Z > = 128 THEN Z = Z -128
1110 POKE S +X,255 -SB: GOSUB 1370: POKE S +X,SB: IF MX = 5 THEN 1130
1120 NEXT SR
1130 NEXT X
1140 PRINT " " +P$: REM 5 SPACES
1150 NEXT Y:L = L +(MX +5)
1160 REM
1170 REM ADVANCE TO NEXT FULL SHEET
1180 REM
1190 LE = B -T:EL = ((LE/66) - INT(LE/66)) *66
1200 EL = INT(66 -EL)
1210 FOR MP = 1 TO EL: PRINT : NEXT MP
1220 NEXT P
1230 REM
1240 REM TURN OFF PRINTER AND ASK TO DO ANOTHER POSTER
1250 REM
1260 PRINT D$;"PR#0"
1270 POKE 49235,0: GOSUB 1950
1280 IF PE = 1 THEN PRINT "POSTER PRINTING TERMINATED": GOTO 1300
1290 PRINT "--PRINTING IS COMPLETE--"
1300 PRINT "DO YOU WANT TO QUIT (Y/N) ?";: GOSUB 2030: PRINT
1310 IF AN$ = "N" THEN TEXT : HOME : GOTO 120
1320 IF AN$ = "Y" THEN PRINT CHR$(12); CHR$(21): TEXT : HOME : END
1330 GOSUB 1950: GOTO 1300
1340 REM
1350 REM CONVERT BYTE VALUE TO A STRING
1360 REM
1370 FOR J = 6 TO 0 STEP -1
1380 IF Z <BV(J) THEN P$ = "*" +P$: GOTO 1400
1390 P$ = " " +P$:Z = Z -BV(J): REM ONE SPACE
1400 NEXT J
1410 RETURN
1420 REM
1430 REM CROPPING SUBROUTINE
1440 REM
1450 GOSUB 1950
1460 PRINT "DO YOU WANT TO CROP THE IMAGE (Y/N) ?": PRINT "PRESS ";: INVERSE : PRINT "0";: NORMAL : PRINT " TO CANCEL"
1470 VTAB 21: POKE 36,37: GOSUB 2030: PRINT
1480 IF AN$ = CHR$(48) THEN POP : GOTO 760
1490 IF AN$ = "N" THEN L = 0:R = 39:T = 0:B = 191: RETURN
1500 IF AN$ < >"Y" THEN 1450
1510 GOSUB 1950:ESC = 0
1520 PRINT "MOVE CURSOR WITH A,Z, AND ARROWS.": IF ID = 234 THEN PRINT "USE 'S' KEY TO CHANGE CURSOR SPEED": GOTO 1540
1530 PRINT "USE APPLES WITH KEYS TO MOVE FASTER"
1540 PRINT "PRESS <RETURN> FOR TOP AND BOTTOM"
1550 PRINT "PRESS <RETURN> TO BEGIN ";: INVERSE : PRINT "0";: NORMAL : PRINT " TO EXIT";
1560 GET AN$: PRINT : IF AN$ = CHR$(48) THEN 1450
1570 POKE 49234,0: GOSUB 1630:T = Y1:L = X1: IF ESC THEN GOSUB 1640: POKE 49235,0: GOTO 1450
1580 GOSUB 1630:B = Y1:R = X1: IF ESC THEN GOSUB 1640:Y1 = T:X1 = L: GOSUB 1640: POKE 49235,0: GOTO 1450
1590 GOSUB 1870
1600 IF T >B THEN TEMP = T:T = B:B = TEMP
1610 IF L >R THEN TEMP = L:L = R:R = TEMP
1620 RETURN
1630 Y1 = 95:X1 = 20:A = 1
1640 POKE 769,Y1: GOSUB 1990
1650 POKE (S +X1),255 - PEEK(S +X1): IF NOT MX THEN POKE 49237,0: POKE (S +X1),255 - PEEK(S +X1): POKE 49236,0: REM CURSOR ON
1660 IF ESC THEN RETURN
1670 TX = X1
1680 IF PEEK(49152) >127 THEN 1740
1690 POKE (S +X1),255 - PEEK(S +X1): IF NOT MX THEN POKE 49237,0: POKE (S +X1),255 - PEEK(S +X1): POKE 49236,0: REM CURSOR OFF
1700 GOTO 1650
1710 REM
1720 REM PROCESS KEYPRESS
1730 REM
1740 IF (ID = 6 AND ( PEEK(49249) >127 OR PEEK(49250) >127)) THEN A = 5 +MX
1750 GOSUB 2030: PRINT : POKE 49168,0: IF ID = 234 AND AN$ = "S" THEN A = ((A = 10) *1 +(A < >10) *10)
1760 IF AN$ = "A" OR AN$ = CHR$(11) THEN Y1 = Y1 -A: IF Y1 <0 THEN Y1 = 0
1770 IF AN$ = "Z" OR AN$ = CHR$(10) THEN Y1 = Y1 +A: IF Y1 >191 THEN Y1 = 191
1780 IF AN$ = CHR$(8) THEN X1 = X1 -A: IF X1 <0 THEN X1 = 0
1790 IF AN$ = CHR$(21) OR AN$ = CHR$(32) THEN X1 = X1 +A: IF X1 >39 THEN X1 = 39
1800 IF AN$ = CHR$(48) THEN ESC = 1: RETURN
1810 A = (A *(ID = 234)) +(1 *(ID = 6)): IF AN$ = CHR$(13) THEN RETURN
1820 POKE (S +TX1),255 - PEEK(S +TX): IF NOT MX THEN POKE 49237,0: POKE (S +TX),255 - PEEK(S +TX): POKE 49236,0: REM OLD CURSOR OFF
1830 GOTO 1640
1840 REM
1850 REM ERASE CROPPING MARKS
1860 REM
1870 POKE 769,T: GOSUB 1990
1880 POKE (S +L),255 - PEEK(S +L): IF NOT MX THEN POKE 49237,0: POKE (S +L),255 - PEEK(S +L): POKE 49236,0
1890 POKE 769,B: GOSUB 1990
1900 POKE (S +R),255 - PEEK(S +R): IF NOT MX THEN POKE 49237,0: POKE (S +R),255 - PEEK(S +R): POKE 49236,0
1910 RETURN
1920 REM
1930 REM PREPARE TO DISPLAY TEXT
1940 REM
1950 VTAB 21: CALL 64578: RETURN
1960 REM
1970 REM FIND ACTUAL ADDRESS OF BYTE IN MEMORY
1980 REM
1990 CALL 768:S = PEEK(39) *256 + PEEK(38): RETURN
2000 REM
2010 REM CONVERT LOWER CASE TO UPPER
2020 REM
2030 GET AN$: IF ASC(AN$) > = 97 THEN AN$ = CHR$( ASC(AN$) -32)
2040 RETURN
2050 REM
2060 REM ERROR HANDLING ROUTINE
2070 REM
2080 ER = PEEK(222)
2090 PRINT " ": GOSUB 1950: HOME
2100 VTAB 21: PRINT "ERROR #";ER;" IN LINE "; PEEK(219) *256 + PEEK(218)
2110 IF ER = 6 THEN PRINT "FILE NOT FOUND : ";NAME$
2120 IF ER = 8 THEN PRINT "IS A DISK IN THE DRIVE?"
2130 IF ER = 13 THEN PRINT "THAT IS NOT A PICTURE"
2140 PRINT : PRINT "PRESS <RETURN> TO CONTINUE";: GET AN$: PRINT
2150 GOTO 370
2160 REM
2170 REM DISPLAY TITLE PAGE
2180 REM
2190 IF PEEK(104) < >64 THEN POKE 103,1: POKE 104,64: POKE 16384,0: PRINT CHR$(4);"RUN POSTER.CREATOR"
2200 POKE 49164,0
2210 TEXT : HOME : VTAB 5: HTAB 13: PRINT "POSTER CREATOR": PRINT : HTAB 19: PRINT "BY": PRINT : HTAB 13: PRINT "TERRY JOHNSTON": PRINT : HTAB 12: PRINT "COPYRIGHT(C) 1988": PRINT : HTAB 13: PRINT "MICROSPARC, INC."
2220 VTAB 20: HTAB 7: INVERSE : PRINT "PRESS <RETURN> TO CONTINUE": NORMAL
2230 IF PEEK(49152) <127 THEN 2230
2240 ID = PEEK(64435): REM MACHINE TYPE
2250 DS = ( PEEK(48896) = 76): REM DOS TYPE
2260 POKE 49168,0
2270 RETURN
2280 REM
2290 REM M/L CODE TO CLEAR D-HI-RES
2300 FOR I = 1 TO 25: READ BYTE%: POKE 847 +I,BYTE%: NEXT I: RETURN
2310 DATA 169,00,133,60,133,66,169,32,133,61,133,67,169,255,133,62,169,63,133,63,56,32,17,195,96
2320 HGR : IF HR$ = "D" THEN PRINT CHR$(21): CALL 848: PRINT CHR$(4)"PR#3"
2330 RETURN
2340 GET Y$: IF Y$ = "N" OR Y$ = "n" THEN RETURN
2350 IF Y$ = "Y" THEN RETURN
2360 IF Y$ = "y" THEN Y$ = "Y": RETURN
2370 GOTO 2340