100 REM ********************************************************************** 110 REM 120 REM FILENAME DRAWPCX.BAS 130 REM WRITTEN BY GARY PEEK 140 REM LAST UPDATE change in help screen! 150 REM 11/12/94 added 16 color (read only) from DRAWPCXC 155 REM added image ability > 512x416 (no instructions) 160 REM DESCRIPTION DRAW ON VGA SCREEN AND SAVE AS .PCX FILE 170 REM ********************************************************************** 180 KEY OFF:FOR A=1 TO 10:KEY A,"":NEXT A:CLS 190 FILE$="TEMP":EXT$="PCX" 200 XMAX=511:YMAX=415:XBMAX=63 210 LRX=XMAX:LRY=YMAX 220 DIM IMAGE%(XBMAX,YMAX) 230 FOR Y%=0 TO YMAX:FOR XB%=0 TO XBMAX:IMAGE%(XB%,Y%)=255:NEXT XB%:NEXT Y% 240 GRID=-1:LMODE=0:CMODE=0 250 REM ----- 300 BPL=(LRX+1)/8:REM BYTES PER LINE, VGA12=80=WHOLE SCREEN 310 REM ----- 320 GOSUB 65250:REM LOAD ASSEMBLY LANGUAGE SUBROUTINE 330 GOSUB 62000:REM GET VIDEO MONITOR TYPE 340 IF MONITOR$="VGA" THEN SCREEN 12:CLS:GOTO 400 350 BEEP:CLS:PRINT "THIS PROGRAM REQUIRES A VGA MONITOR" 360 IN$=INKEY$:IF IN$="" THEN 360 ELSE END 370 REM ----- 400 GOSUB 63000:REM MOUSE RESET AND STATUS 410 IF STATUS=-1 THEN 450 420 BEEP:CLS:PRINT "MOUSE DRIVER NOT INSTALLED OR MOUSE NOT FOUND" 430 IN$=INKEY$:IF IN$="" THEN 430 ELSE END 440 REM ----- 450 GOSUB 63800:REM SET MOUSE GRAPHICS CURSOR 460 TOPLIMIT=0:BOTTOMLIMIT=LRY:LEFTLIMIT=0:RIGHTLIMIT=LRX 470 GOSUB 63700:REM SET MOUSE CURSOR LIM. 480 X=256:Y=208:GOSUB 63400:REM SET MOUSE CURSOR POSITION 490 XSENS=30:YSENS=30:THRESHOLD=50:GOSUB 64600:REM SET MOUSE SENSITIVITY 500 REM ----- 550 WHITE=15:BLUE=1:YELLOW=14:RED=12:CYAN=3:GREEN=2 560 LWIDTH$="1":LWID=0 570 XOFF=0:YOFF=0:AFUN=0 580 AULX=528:AULY=76:ALRX=630:ALRY=114 590 REM ----- 600 GOSUB 650:REM MESSAGES AND SCREEN 610 GOTO 1000 640 REM ----- PRINT MESSAGES 650 CLS 660 LOCATE 2,68:PRINT "Filename: "; 665 LOCATE 3,68:PRINT "<"+FILE$+">"+SPACE$(10-LEN(FILE$)); 667 REM 670 LOCATE 6,68:PRINT "Arrow keys="; 680 LOCATE 7,68:PRINT "move X,Y "; 690 LOCATE 9,68:PRINT "Keys: "; 700 LOCATE 10,68:PRINT "A=Arrow key"; 710 LOCATE 11,68:PRINT " function "; 720 LINE(AULX,AULY)-(ALRX,ALRY),YELLOW,B 730 LOCATE 13,68:PRINT "D=draw pix "; 740 LOCATE 14,68:PRINT "E=erase pix"; 750 LOCATE 15,68:PRINT "SPACE=stop "; 760 LOCATE 16,68:PRINT "W=width "; 770 LOCATE 17,68:PRINT "C=circle "; 780 LOCATE 18,68:PRINT "L=line "; 785 REM 790 LOCATE 20,68:PRINT "F1=redraw"; 795 LINE(613,305)-(623,315),CYAN,B:LINE(616,308)-(618,310),WHITE,BF:LINE(618,310)-(620,312),WHITE,BF 800 LOCATE 21,68:PRINT "F2=save "; 805 LINE(613,321)-(623,331),CYAN,B:LINE(616,324)-(618,326),WHITE,BF:LINE(618,326)-(620,328),WHITE,BF 810 LOCATE 22,68:PRINT "F3=read PCX"; 820 LOCATE 23,68:PRINT "F4=writePCX"; 830 LOCATE 24,68:PRINT "F5=memory";:LINE(618,376)-(619,377),WHITE,B 840 LOCATE 25,68:PRINT "F6=recall";:LINE(618,391)-(619,392),WHITE,B 850 LOCATE 26,68:PRINT "F7=fill ";CHR$(254); 860 LOCATE 27,68:PRINT "F8=erase";:LINE(617,420)-(621,426),WHITE,B 870 LOCATE 28,68:PRINT "F9=grid "; 875 LINE(613,433)-(623,443),CYAN,B:LINE(618,433)-(618,443),CYAN:LINE(613,438)-(623,438),CYAN 880 LOCATE 29,68:PRINT "F10=help ?"; 885 REM ----- 890 GOSUB 2400:REM DRAW GRID PER LRX, LRY 895 LOCATE 29,2:PRINT "width=";LWIDTH$;" "; 900 GOSUB 63100:REM MOUSE SHOW CURSOR 905 RETURN 990 REM --------------------------------------------------------------------- 995 REM ----- MAIN LOOP 1000 OLDX=X:OLDY=Y 1010 DELAY=.01:GOSUB 63300:REM GET CURSOR POSITION AND BUTTONS 1020 REM ----- CHECK KEYBOARD 1030 IN$=INKEY$:IF IN$="" THEN 1800 1040 REM ----- MOVE X,Y 1050 IF IN$=CHR$(0)+CHR$(75) AND AFUN=0 THEN X=X-1:GOSUB 63400:REM LEFT 1060 IF IN$=CHR$(0)+CHR$(77) AND AFUN=0 THEN X=X+1:GOSUB 63400:REM RIGHT 1070 IF IN$=CHR$(0)+CHR$(72) AND AFUN=0 THEN Y=Y-1:GOSUB 63400:REM UP 1080 IF IN$=CHR$(0)+CHR$(80) AND AFUN=0 THEN Y=Y+1:GOSUB 63400:REM DOWN 1090 REM ----- MOVE GRID 1100 IF IN$=CHR$(0)+CHR$(75) AND AFUN=1 THEN GOSUB 2200:REM LEFT 1110 IF IN$=CHR$(0)+CHR$(77) AND AFUN=1 THEN GOSUB 2240:REM RIGHT 1120 IF IN$=CHR$(0)+CHR$(72) AND AFUN=1 THEN GOSUB 2280:REM UP 1130 IF IN$=CHR$(0)+CHR$(80) AND AFUN=1 THEN GOSUB 2320:REM DOWN 1140 REM ----- MOVE IMAGE 1150 IF IN$=CHR$(0)+CHR$(75) AND AFUN=2 THEN GOSUB 2400:XOFF=XOFF-4:GOSUB 2900:REM LEFT 1160 IF IN$=CHR$(0)+CHR$(77) AND AFUN=2 THEN GOSUB 2400:XOFF=XOFF+4:GOSUB 2900:REM RIGHT 1170 IF IN$=CHR$(0)+CHR$(72) AND AFUN=2 THEN GOSUB 2400:YOFF=YOFF-4:GOSUB 2900:REM UP 1180 IF IN$=CHR$(0)+CHR$(80) AND AFUN=2 THEN GOSUB 2400:YOFF=YOFF+4:GOSUB 2900:REM DOWN 1190 REM ----- 1200 IF IN$=CHR$(0)+CHR$(59) THEN GOSUB 2400:GOSUB 2900:GOTO 1800:REM REDRAW 1210 IF IN$=CHR$(0)+CHR$(60) THEN GOSUB 3000:GOTO 1800:REM SAVE IMAGE 1230 REM 1240 IF IN$=CHR$(0)+CHR$(61) THEN GOSUB 3200:GOTO 2130:REM SELECT AND DRAW FROM PCX FILE 1250 IF IN$=CHR$(0)+CHR$(62) THEN GOSUB 4500:GOTO 2130:REM SAVE TO FILE 1260 REM ----- 1270 IF IN$=CHR$(0)+CHR$(63) THEN MEM1X=X:MEM1Y=Y:LOCATE 28,48:PRINT "mem ";MEM1X;MEM1Y;" "; 1275 IF IN$=CHR$(0)+CHR$(64) THEN X=MEM1X:Y=MEM1Y:GOSUB 63400 1280 IF IN$=CHR$(0)+CHR$(98) THEN MEM2X=X:MEM2Y=Y:LOCATE 29,48:PRINT "m2 ";MEM2X;MEM2Y;" "; 1285 IF IN$=CHR$(0)+CHR$(99) THEN X=MEM2X:Y=MEM2Y:GOSUB 63400 1290 REM ----- 1300 IF IN$=CHR$(0)+CHR$(65) AND NOT FMODE THEN GOSUB 5800:GOTO 1800:REM FILL BOX AREA 1305 IF IN$=CHR$(0)+CHR$(65) AND FMODE THEN GOSUB 5860:GOTO 1800:REM FILL BOX AREA 1310 IF IN$=CHR$(0)+CHR$(66) AND NOT EMODE THEN GOSUB 6000:GOTO 1800:REM ERASE BOX AREA 1315 IF IN$=CHR$(0)+CHR$(66) AND EMODE THEN GOSUB 6060:GOTO 1800:REM ERASE BOX AREA 1320 IF IN$=CHR$(0)+CHR$(100) THEN GOSUB 6900:GOTO 1800:REM FILL BORDERED AREA 1325 IF IN$=CHR$(0)+CHR$(101) THEN GOSUB 6950:GOTO 1800:REM ERASE BORDERED AREA 1330 REM ----- 1335 IF IN$=CHR$(0)+CHR$(67) AND NOT GRID THEN GRID=-1:GOSUB 2400:GOTO 1800 1340 IF IN$=CHR$(0)+CHR$(67) AND GRID THEN GRID=0:GOSUB 2400:GOTO 1800 1345 IF IN$=CHR$(0)+CHR$(68) THEN GOSUB 8000:GOSUB 2400:GOTO 1800:REM HELP 1350 REM ----- 1355 IF IN$=CHR$(16) THEN GOSUB 7000:REM CTRL P=PRINT GRAPHICS SCREEN 1357 REM ----- 1360 IF IN$="W" OR IN$="w" THEN GOSUB 6300:GOTO 1800 1370 IF (IN$="D" OR IN$="d") AND NOT INS THEN INS=-1:DEL=0:GOSUB 2600:GOTO 1800 1380 IF (IN$="D" OR IN$="d") AND INS THEN GOSUB 2680:GOTO 1800 1390 IF (IN$="E" OR IN$="e") AND NOT DEL THEN DEL=-1:INS=0:GOSUB 2640:GOTO 1800 1400 IF (IN$="E" OR IN$="e") AND DEL THEN GOSUB 2680:GOTO 1800 1410 IF IN$="X" OR IN$="x" THEN GOSUB 2680:GOTO 1800 1415 IF IN$=" " THEN GOSUB 2680:GOTO 1800 1420 REM ----- 1425 IF (IN$="L" OR IN$="l") AND NOT LMODE THEN GOSUB 6500:GOTO 1800 1430 IF (IN$="L" OR IN$="l") AND LMODE THEN GOSUB 6560:GOTO 1800 1435 IF (IN$="C" OR IN$="c") AND NOT CMODE THEN GOSUB 6700:GOTO 1800 1440 IF (IN$="C" OR IN$="c") AND CMODE THEN GOSUB 6760:GOTO 1800 1450 REM ----- 1460 IF IN$<>CHR$(27) THEN 1500 1470 LOCATE 2,68:PRINT "EXIT? (Y/N)"; 1480 IN$=INKEY$:IF IN$="" THEN 1480 1490 IF IN$="y" OR IN$="Y" THEN CLS:END 1500 LOCATE 2,68:PRINT "Filename: "; 1510 REM ----- 1520 IF (IN$="A" OR IN$="a") AND AFUN=2 THEN GOSUB 2700:GOTO 1800 1540 IF (IN$="A" OR IN$="a") AND AFUN=0 THEN GOSUB 2720:GOTO 1800 1560 IF (IN$="A" OR IN$="a") AND AFUN=1 THEN GOSUB 2740:GOTO 1800 1580 REM 1790 REM ----- DISPLAY SOME STUFF 1800 LOCATE 28,2:PRINT "X";X;" "; 1810 LOCATE 28,8:PRINT "Y";Y;" "; 1830 IF POINT (X,Y)=WHITE THEN LINE(135,434)-(144,443),CYAN,BF 1840 IF POINT (X,Y)<>WHITE THEN LINE(127,434)-(152,443),0,BF 1850 REM ----- 1860 IF LEFT THEN DEL=0:GOSUB 2600 1870 IF RIGHT THEN INS=0:GOSUB 2640 1880 IF NOT RIGHT AND NOT LEFT AND NOT INS AND NOT DEL THEN GOSUB 2680 1900 REM ----- SKIP THE REST IF WE HAVE NOT MOVED 1910 IF X=OLDX AND Y=OLDY THEN 1000 1950 REM ----- SET OR ERASE POINTS 1960 IF NOT LEFT AND NOT RIGHT AND NOT INS AND NOT DEL THEN 1000 1970 IF LEFT OR INS THEN POINTCOLOR=WHITE 1980 IF RIGHT OR DEL THEN POINTCOLOR=0 1990 GOSUB 63200:REM HIDE MOUSE CURSOR 2000 IF LWIDTH$="1" THEN PSET(X,Y),POINTCOLOR:GOTO 2100 2010 LINE(X-LWID,Y-LWID)-(X+LWID,Y+LWID),POINTCOLOR,BF 2100 GOSUB 63100:REM SHOW MOUSE CURSOR 2110 GOTO 1000 2120 REM ----- END OF MAIN LOOP 2130 T=TIMER 2140 IF TIMER0 THEN LRX=LRX+XX 2210 IF LRX<15 THEN LRX=15 2215 GOSUB 2400:REM DRAW GRID 2220 RETURN 2240 LRX=LRX+8 2245 XX=(LRX+1) MOD 8:IF XX<>0 THEN LRX=LRX-XX 2250 IF LRX>XMAX THEN LRX=XMAX 2255 GOSUB 2400:REM DRAW GRID 2260 RETURN 2280 LRY=LRY-8 2285 YY=(LRY+1) MOD 8:IF YY<>0 THEN LRY=LRY+YY 2290 IF LRY<15 THEN LRY=15 2295 GOSUB 2400:REM DRAW GRID 2300 RETURN 2320 LRY=LRY+8 2325 YY=(LRY+1) MOD 8:IF YY<>0 THEN LRY=LRY-YY 2330 IF LRY>YMAX THEN LRY=YMAX 2335 GOSUB 2400:REM DRAW GRID 2340 RETURN 2350 REM ----- DRAW GRID 2400 GOSUB 63200:REM HIDE MOUSE CURSOR 2405 LINE(0,0)-(XMAX,YMAX),0,BF 2410 IF NOT GRID THEN 2450 2420 FOR YY=0 TO 424 STEP 16:LINE(0,YY)-(519,YY),8:NEXT YY 2425 FOR XX=0 TO 519 STEP 16:LINE(XX,0)-(XX,424),8:NEXT XX 2430 FOR YY=0 TO LRY STEP 16:LINE(0,YY)-(LRX,YY),CYAN:NEXT YY 2440 FOR XX=0 TO LRX STEP 16:LINE (XX,0)-(XX,LRY),CYAN:NEXT XX 2450 LINE(0,0)-(639,479),WHITE,B 2455 LINE(0,0)-(LRX,LRY),CYAN,B 2460 LINE(519,0)-(519,479),WHITE 2465 LINE(0,424)-(519,424),WHITE 2490 BPL=(LRX+1)/8:REM BYTES PER LINE 2500 TOPLIMIT=0:BOTTOMLIMIT=LRY:LEFTLIMIT=0:RIGHTLIMIT=LRX 2510 GOSUB 63700:REM SET MOUSE CURSOR LIM. 2520 GOSUB 63100:REM SHOW MOUSE CURSOR 2530 LOCATE 28,24:PRINT "X size";LRX+1;" "; 2535 LOCATE 29,24:PRINT "Y size";LRY+1;" "; 2540 LOCATE 28,38:PRINT BPL;" "; 2545 LOCATE 29,38:PRINT "bytes"; 2550 RETURN 2590 REM ----- DRAW/ERASE SELECTION 2600 LINE(112,463)-(166,466),GREEN,BF 2610 LOCATE 29,15:PRINT "drawing"; 2620 GOSUB 63200:PSET(X,Y),WHITE:GOSUB 63100 2625 GOSUB 2800:REM IMAGE NOT SAVED MESSAGE 2630 RETURN 2640 LINE(112,463)-(166,466),RED,BF 2650 LOCATE 29,15:PRINT "erasing"; 2660 GOSUB 63200:PSET(X,Y),0:GOSUB 63100 2665 GOSUB 2800:REM IMAGE NOT SAVED MESSAGE 2670 RETURN 2680 LINE(112,446)-(166,466),0,BF 2685 INS=0:DEL=0 2690 RETURN 2695 REM ----- ARROW FUNCTION MESSAGES 2700 AFUN=0:LOCATE 7,68:PRINT "move X,Y "; 2705 LINE(AULX,AULY)-(ALRX,ALRY),YELLOW,B 2710 RETURN 2720 AFUN=1:LOCATE 7,68:PRINT "grid size "; 2725 LINE(AULX,AULY)-(ALRX,ALRY),CYAN,B 2730 RETURN 2740 AFUN=2:LOCATE 7,68:PRINT "shift image"; 2745 LINE(AULX,AULY)-(ALRX,ALRY),RED,B 2750 RETURN 2790 REM ----- IMAGE MESSAGE 2800 LOCATE 29,48:PRINT "Image not saved"; 2805 RETURN 2820 LOCATE 29,48:PRINT " "; 2825 RETURN 2890 REM --------------------------------------------------------------------- 2895 REM ----- REDRAW FROM IMAGE ARRAY 2900 GOSUB 63200:REM HIDE MOUSE CURSOR 2905 FOR Y%=0 TO RLRY 2910 XX%=((RLRX+1)/8)-1 2915 FOR XB%=0 TO XX% 2920 X%=XB%*8 2925 IF (IMAGE%(XB%,Y%) AND 128)<>128 THEN PSET(X%+XOFF,Y%+YOFF),WHITE 2930 X%=X%+1:IF (IMAGE%(XB%,Y%) AND 64)<>64 THEN PSET(X%+XOFF,Y%+YOFF),WHITE 2935 X%=X%+1:IF (IMAGE%(XB%,Y%) AND 32)<>32 THEN PSET(X%+XOFF,Y%+YOFF),WHITE 2940 X%=X%+1:IF (IMAGE%(XB%,Y%) AND 16)<>16 THEN PSET(X%+XOFF,Y%+YOFF),WHITE 2945 X%=X%+1:IF (IMAGE%(XB%,Y%) AND 8)<>8 THEN PSET(X%+XOFF,Y%+YOFF),WHITE 2950 X%=X%+1:IF (IMAGE%(XB%,Y%) AND 4)<>4 THEN PSET(X%+XOFF,Y%+YOFF),WHITE 2955 X%=X%+1:IF (IMAGE%(XB%,Y%) AND 2)<>2 THEN PSET(X%+XOFF,Y%+YOFF),WHITE 2960 X%=X%+1:IF (IMAGE%(XB%,Y%) AND 1)<>1 THEN PSET(X%+XOFF,Y%+YOFF),WHITE 2965 NEXT XB% 2970 NEXT Y% 2975 GOSUB 63100:REM SHOW MOUSE CURSOR 2980 RETURN 2995 REM ----- SAVE IMAGE ARRAY 3000 GOSUB 63200:REM HIDE MOUSE CURSOR 3010 LOCATE 2,68:PRINT "SavingImage"; 3015 FOR Y%=0 TO LRY 3020 XX%=((LRX+1)/8)-1 3025 FOR XB%=0 TO XX% 3030 X%=XB%*8:B%=0 3035 IF POINT(X%,Y%)<>WHITE THEN B%=B%+128 3040 X%=X%+1:IF POINT(X%,Y%)<>WHITE THEN B%=B%+64 3045 X%=X%+1:IF POINT(X%,Y%)<>WHITE THEN B%=B%+32 3050 X%=X%+1:IF POINT(X%,Y%)<>WHITE THEN B%=B%+16 3055 X%=X%+1:IF POINT(X%,Y%)<>WHITE THEN B%=B%+8 3060 X%=X%+1:IF POINT(X%,Y%)<>WHITE THEN B%=B%+4 3065 X%=X%+1:IF POINT(X%,Y%)<>WHITE THEN B%=B%+2 3070 X%=X%+1:IF POINT(X%,Y%)<>WHITE THEN B%=B%+1 3075 IMAGE%(XB%,Y%)=B% 3080 NEXT XB% 3085 IF Y% MOD 4<>0 THEN 3095 3090 FOR PX%=0 TO LRX STEP 4:PSET(PX%,Y%),CYAN:NEXT PX% 3095 NEXT Y% 3100 LOCATE 2,68:PRINT "Filename: "; 3105 GOSUB 63100:REM SHOW MOUSE CURSOR 3110 XOFF=0:YOFF=0 3115 RLRX=LRX:RLRY=LRY 3120 GOSUB 2820:REM ERASE "NOT SAVED" MESSAGE 3125 RETURN 3185 REM --------------------------------------------------------------------- 3190 REM ----- LOAD PCX FILE TO SCREEN 3200 SCREEN 0:CLS:REM BACK TO TEXT SCREEN 3205 EXT$="PCX":FILEMSG$="Select PCX file":GOSUB 9000 3210 IF NUMFILES=0 THEN 3425 3220 IF ESCAPE THEN RETURN 3230 IF DOSERROR$<>"NONE" THEN BEEP:RETURN 3240 SCREEN 12:REM BACK TO GRAPHICS SCREEN 3260 REM GOSUB 650:REM DRAW GRID AND MESSAGES 3270 FILELOAD=-1:REM GET LRX, LRY ALSO 3280 XOFF=0:YOFF=0 3290 REM ----- 3310 F$=FILE$+"."+EXT$:OPEN F$ FOR INPUT AS #1:CLOSE #1 3330 LOCATE 2,68:PRINT "Loading...."; 3340 LOCATE 3,68:PRINT "<"+FILE$+">"+SPACE$(10-LEN(FILE$)); 3350 GOTO 3450 3360 REM ----- 3425 LOCATE 2,68:PRINT "Filename: "; 3430 REM FILE$="TEMP" 3435 LOCATE 3,68:PRINT "<"+FILE$+">"+SPACE$(10-LEN(FILE$)); 3440 RETURN 3445 REM ----- DRAW FROM F$, CALLED AFTER WRITE 3450 LOCATE ,,0 3455 LOADFLAG=-1 3460 FOR Y%=0 TO YMAX:FOR XB%=0 TO XBMAX:IMAGE%(XB%,Y%)=255:NEXT XB%:NEXT Y% 3465 GOSUB 63200:REM HIDE MOUSE CURSOR 3470 REM ----- 3475 OPEN F$ FOR INPUT AS #1 3480 FILELENGTH=LOF(1) 3485 CLOSE #1 3490 OPEN "R",#1,F$,1 3495 FIELD #1,1 AS FILEREAD$ 3500 REM ----- 3505 GET #1,9 3510 LRXLSB=ASC(FILEREAD$) 3515 GET #1,10 3520 LRXMSB=ASC(FILEREAD$) 3525 IF FILELOAD THEN LRX=(LRXMSB*256)+LRXLSB 3530 REM ----- 3535 GET #1,11 3540 LRYLSB=ASC(FILEREAD$) 3545 GET #1,12 3550 LRYMSB=ASC(FILEREAD$) 3555 IF FILELOAD THEN LRY=(LRYMSB*256)+LRYLSB 3560 REM ----- 3565 GET #1,66 3570 PLANES=ASC(FILEREAD$) 3575 REM ----- 3580 GET #1,67 3585 BPLLSB=ASC(FILEREAD$) 3590 GET #1,68 3595 BPLMSB=ASC(FILEREAD$) 3600 DBPL=(BPLMSB*256)+BPLLSB 3605 REM ----- 3610 IF PLANES=1 THEN 4000:REM MONO READ 3615 REM ----------------------------------- COLOR READ (CANNOT WRITE COLOR) 3700 GOSUB 2400:REM DRAW GRID PER LRX,LRY 3705 RECNUM=129 3710 DEF SEG=&HA000 3720 REM ----- 3725 YY$=RIGHT$(STR$(LRY+1),LEN(STR$(LRY+1))-1) 3730 FOR Y%=0 TO LRY 3735 LOCATE 4,67:Y$=STR$(Y%+1):PRINT Y$;"/";YY$; 3740 FOR PL=1 TO PLANES 3745 XB%=0 3750 OUT &H3C4,2 3755 IF PL=1 THEN OUT &H3C5,1 3760 IF PL=2 THEN OUT &H3C5,2 3765 IF PL=3 THEN OUT &H3C5,4 3770 IF PL=4 THEN OUT &H3C5,8 3775 GET #1,RECNUM 3780 BYTE%=ASC(FILEREAD$) 3785 IF BYTE%<192 THEN REPS%=1:GOTO 3795 3790 REPS%=BYTE%-192:RECNUM=RECNUM+1 3795 GET #1,RECNUM 3800 BYTE%=ASC(FILEREAD$) 3805 FOR B%=1 TO REPS% 3810 POKE XB%+(Y%*80),BYTE%:REM 255- 3815 XB%=XB%+1 3820 IN$=INKEY$:IF IN$=CHR$(27) THEN 3870 3825 NEXT B% 3830 RECNUM=RECNUM+1 3835 IF RECNUM=FILELENGTH+1 THEN 3870 3840 IF XB%>DBPL-1 THEN 3850 3845 GOTO 3775 3850 NEXT PL 3855 NEXT Y% 3865 REM ----- 3870 OUT &H3C4,2:OUT &H3C5,15 3875 DEF SEG 3930 GOTO 4400:REM COMMON END 3995 REM ----------------------------------- MONOCHROME READ 4000 XMAX=LRX:YMAX=LRY:XBMAX=63 :REM REDO SOME OF THE INITIALIZATION 4005 BPL=(LRX+1)/8:REM BYTES PER LINE, VGA12=80=WHOLE SCREEN 4010 ERASE IMAGE%:DIM IMAGE%(XBMAX,YMAX) 4015 FOR Y%=0 TO YMAX:FOR XB%=0 TO XBMAX:IMAGE%(XB%,Y%)=255:NEXT XB%:NEXT Y% 4020 TOPLIMIT=0:BOTTOMLIMIT=LRY:LEFTLIMIT=0:RIGHTLIMIT=LRX 4022 GOSUB 63700:REM SET MOUSE CURSOR LIM. 4025 IF LRX>512 OR LRY>416 THEN CLS:GOTO 4035 4030 GOSUB 650:REM DRAW GRID AND MESSAGES 4032 REM ----- 4035 RECNUM=129:EX=0 4040 XB%=0:Y%=0 4045 REM ----- 4050 GET #1,RECNUM 4055 IF LRX>512 OR LRY>416 THEN 4070 4060 LOCATE 4,67:PRINT RECNUM; 4070 BYTE%=ASC(FILEREAD$) 4080 IF BYTE%>=192 THEN 4140 4090 REPS%=1:GOSUB 4250 4100 IF EX THEN 4220 4110 RECNUM=RECNUM+1 4120 IF RECNUM=FILELENGTH+1 THEN 4220 4130 GOTO 4050 4140 REPS%=BYTE%-192 4150 RECNUM=RECNUM+1 4160 GOSUB 4250 4170 IF EX THEN 4220 4180 RECNUM=RECNUM+1 4190 IF RECNUM=FILELENGTH+1 THEN 4220 4200 GOTO 4050 4210 REM ----- 4220 GOTO 4400:REM COMMON END 4230 REM ----- 4250 FOR B%=1 TO REPS% 4255 GET #1,RECNUM 4260 BYTE%=ASC(FILEREAD$) 4265 IMAGE%(XB%,Y%)=BYTE% 4270 X%=XB%*8 4275 IF (BYTE% AND 128)<>128 THEN PSET(X%,Y%),WHITE 4280 IF (BYTE% AND 64)<>64 THEN PSET(X%+1,Y%),WHITE 4285 IF (BYTE% AND 32)<>32 THEN PSET(X%+2,Y%),WHITE 4290 IF (BYTE% AND 16)<>16 THEN PSET(X%+3,Y%),WHITE 4295 IF (BYTE% AND 8)<>8 THEN PSET(X%+4,Y%),WHITE 4300 IF (BYTE% AND 4)<>4 THEN PSET(X%+5,Y%),WHITE 4305 IF (BYTE% AND 2)<>2 THEN PSET(X%+6,Y%),WHITE 4310 IF (BYTE% AND 1)<>1 THEN PSET(X%+7,Y%),WHITE 4315 XB%=XB%+1 4320 IF XB%>(DBPL-1) THEN XB%=0:Y%=Y%+1 4325 IF RECNUM=FILELENGTH+1 THEN EX=-1:GOTO 4340 4330 IN$=INKEY$:IF IN$=CHR$(27) THEN EX=-1:GOTO 4340 4335 NEXT B% 4340 RETURN 4390 REM -------------- COMMON TO MONOCHROME AND COLOR READING 4400 CLOSE #1 4402 IF LRX>512 OR LRY>416 THEN 4420 4405 LOCATE 4,68:PRINT " "; 4410 LOCATE 2,68:PRINT "Filename: "; 4415 LOCATE 3,68:PRINT "<"+FILE$+">"+SPACE$(10-LEN(FILE$)); 4420 FILELOAD=0:EX=0 4425 GOSUB 63100:REM SHOW MOUSE CURSOR 4430 RLRX=LRX:RLRY=LRY 4435 GOSUB 2820:REM ERASE "NOT SAVED" MESSAGE 4440 RETURN 4480 REM --------------------------------------------------------------------- 4490 REM ----- SAVE SCREEN AS BLACK AND WHITE .PCX FILE 4500 IF LRX>512 OR LRY>416 THEN 4520 4505 LOCATE 2,68:PRINT "Saving....."; 4510 LOCATE 3,68:PRINT "<"+FILE$+">"+SPACE$(10-LEN(FILE$)); 4520 GOSUB 63200:REM HIDE MOUSE CURSOR 4530 LINE(0,0)-(LRX,LRY),0,B 4540 GOSUB 4650 4550 XOFF=0:YOFF=0 4560 LOCATE 4,68:PRINT " "; 4565 IF EX THEN EX=0:GOTO 4610 4570 REM ----- 4580 LOCATE 2,68:PRINT "Redrawing.."; 4590 LOCATE 3,68:PRINT "<"+FILE$+">"+SPACE$(10-LEN(FILE$)); 4600 GOSUB 3450:REM DRAW 4605 IF LRX>512 OR LRY>416 THEN 4620 4610 LOCATE 2,68:PRINT "Filename: "; 4620 GOSUB 63100:REM SHOW MOUSE CURSOR 4630 RETURN 4640 REM ----- FORM HEADER 4650 DIM H(128) 4660 H(0)=&HA:REM ZSOFT PCX FLAG 4670 H(1)=0:REM VERSION 0=PC PAINTBRUSH 2.5, 2=2.8 WITH PALETTE, 3=2.8 WITHOUT PALETTE, 4=WINDOWS, 5=3.0 AND UP,PC PAINTBRUSH IV, IV+ 4680 H(2)=1:REM RUN LENGTH ENCODING=1 4690 H(3)=1:REM BITS PER PIXEL EACH PLANE 1,2,4,8 4700 REM ----- 4710 H(4)=0:REM UPPER LEFT X LSB 4720 H(5)=0:REM MSB 4730 H(6)=0:REM UPPER LEFT Y LSB 4740 H(7)=0:REM MSB 4750 REM ----- 4760 REM LRX=215:LRY=279 4770 H(8)=LRX MOD 256:REM LOWER RIGHT X CO-ORD LSB 4780 H(9)=INT(LRX/256):REM MSB 4790 H(10)=LRY MOD 256:REM LOWER RIGHT Y CO-ORD LSB 4800 H(11)=INT(LRY/256):REM MSB 4810 REM ----- 4820 XRES=640:YRES=480 4830 H(12)=XRES MOD 256:REM PRINTED HORIZONTAL RES IN BPI, LSB (75-100?) 4840 H(13)=INT(XRES/256):REM MSB 4850 H(14)=YRES MOD 256:REM PRINTED VERTICAL RES IN BPI, LSB 4860 H(15)=INT(YRES/256):REM MSB 4870 REM ----- 4910 FOR A=19 TO 63:REM RGB TRIPLES? 4920 H(A)=255 4930 NEXT A 4940 REM ----- 4950 H(64)=0:REM RESERVED FOR ZSOFT, VIDEO BOARD BIOS VALUE? 4960 H(65)=1:REM NUMBER OF COLOR/GREYSCALE PLANES, 1 OR 4, 3 FOR 24 BIT 4970 REM BPL=XX:REM BYTES PER LINE, VGA12=80=WHOLE SCREEN, VGA 640x480x256=640 4980 H(66)=BPL MOD 256:REM LSB 4990 H(67)=INT(BPL/256):REM MSB 5000 H(68)=0:REM HEADER PALETTE INTERPRETATION LSB, 1= COLOR, 2=GREY 5010 H(69)=0:REM MSB 5020 SCREENWIDTH=639:REM # PIXELS HORIZONTAL-1 5030 H(70)=SCREENWIDTH MOD 256:REM LSB 5040 H(71)=INT(SCREENWIDTH/256):REM MSB 5050 SCREENHEIGHT=479:REM #PIXELS VERTICAL-1 5060 H(72)=SCREENHEIGHT MOD 256:REM LSB 5070 H(73)=INT(SCREENHEIGHT/256):REM MSB 5080 REM ----- 5090 FOR A%=74 TO 127 5100 H(A%)=0 5110 NEXT A% 5180 REM ----- FILL ARRAY WITH DATA 5200 DIM GFXDAT%(BPL,LRY+1) 5210 FOR Y%=0 TO LRY 5220 FOR XBYTE%=0 TO BPL-1 5230 XB%=XBYTE%*8 5240 BYTE%=0 5250 X%=XB%+0:IF POINT(X%,Y%)<>WHITE THEN BYTE%=BYTE%+128:PSET(X%,Y%),WHITE ELSE PSET(X%,Y%),0 5260 X%=XB%+1:IF POINT(X%,Y%)<>WHITE THEN BYTE%=BYTE%+64:PSET(X%,Y%),WHITE ELSE PSET(X%,Y%),0 5270 X%=XB%+2:IF POINT(X%,Y%)<>WHITE THEN BYTE%=BYTE%+32:PSET(X%,Y%),WHITE ELSE PSET(X%,Y%),0 5280 X%=XB%+3:IF POINT(X%,Y%)<>WHITE THEN BYTE%=BYTE%+16:PSET(X%,Y%),WHITE ELSE PSET(X%,Y%),0 5290 X%=XB%+4:IF POINT(X%,Y%)<>WHITE THEN BYTE%=BYTE%+8:PSET(X%,Y%),WHITE ELSE PSET(X%,Y%),0 5300 X%=XB%+5:IF POINT(X%,Y%)<>WHITE THEN BYTE%=BYTE%+4:PSET(X%,Y%),WHITE ELSE PSET(X%,Y%),0 5310 X%=XB%+6:IF POINT(X%,Y%)<>WHITE THEN BYTE%=BYTE%+2:PSET(X%,Y%),WHITE ELSE PSET(X%,Y%),0 5320 X%=XB%+7:IF POINT(X%,Y%)<>WHITE THEN BYTE%=BYTE%+1:PSET(X%,Y%),WHITE ELSE PSET(X%,Y%),0 5330 GFXDAT%(XBYTE%,Y%)=BYTE% 5340 IN$=INKEY$:IF IN$=CHR$(27) THEN EX=-1:GOTO 5650 5350 NEXT XBYTE% 5360 NEXT Y% 5365 REM ----- WRITE HEADER 5370 F$=FILE$+"."+EXT$ 5375 OPEN F$ FOR OUTPUT AS #2 5380 FOR A%=0 TO 127 5385 PRINT #2,CHR$(H(A%)); 5390 NEXT A% 5395 REM ----- WRITE PCX DATA 5400 YY$=RIGHT$(STR$(LRY+1),LEN(STR$(LRY+1))-1) 5410 FOR Y%=0 TO LRY 5415 LOCATE 4,67:Y$=STR$(Y%+1):PRINT Y$;"/";YY$; 5420 XBYTE%=0 5430 REP=0:NUMREPS%=0 5440 A%=GFXDAT%(XBYTE%,Y%) 5450 XBYTE%=XBYTE%+1 5455 IF XBYTE%=BPL THEN 5580 5460 B%=GFXDAT%(XBYTE%,Y%) 5470 IF B%<>A% THEN 5510 5480 REP=-1:NUMREPS%=NUMREPS%+1 5490 IF NUMREPS%=63 THEN 5530 5500 GOTO 5450 5510 IF NOT REP THEN 5550 5520 NUMREPS%=NUMREPS%+1 5530 PRINT #2,CHR$(192+NUMREPS%);CHR$(A%); 5540 GOTO 5430 5550 IF A%>=192 THEN PRINT #2,CHR$(193); 5560 PRINT #2,CHR$(A%); 5570 GOTO 5440 5580 IF NOT REP THEN 5610 5590 PRINT #2,CHR$(192+NUMREPS%+1);CHR$(A%); 5600 GOTO 5630 5610 IF A%>=192 THEN PRINT #2,CHR$(193); 5620 PRINT #2,CHR$(A%); 5630 NEXT Y% 5640 REM ----- 5650 CLOSE 5660 ERASE H:ERASE GFXDAT% 5670 GOSUB 2820:REM ERASE "NOT SAVED" MESSAGE 5680 RETURN 5790 REM ---------------------- FILL A BOX AREA ------------------------ 5800 LOCATE 2,68:PRINT "StartFill "; 5810 F1X=X:F1Y=Y:FMODE=-1 5820 GOSUB 63200:REM HIDE MOUSE CURSOR 5830 PSET(F1X,F1Y),YELLOW 5840 GOSUB 63100:REM SHOW MOUSE CURSOR 5850 IN$="":RETURN 5860 LOCATE 2,68:PRINT "Filename: "; 5870 F2X=X:F2Y=Y:FMODE=0 5880 GOSUB 63200:REM HIDE MOUSE CURSOR 5890 LINE (F1X,F1Y)-(F2X,F2Y),WHITE,BF 5900 GOSUB 63100:REM SHOW MOUSE CURSOR 5910 IN$="" 5920 GOSUB 2800:REM IMAGE NOT SAVED MESSAGE 5930 RETURN 5990 REM ---------------------- ERASE A BOX AREA --------------------- 6000 LOCATE 2,68:PRINT "StartErase "; 6010 E1X=X:E1Y=Y:EMODE=-1 6020 GOSUB 63200:REM HIDE MOUSE CURSOR 6030 PSET(E1X,E1Y),YELLOW 6040 GOSUB 63100:REM SHOW MOUSE CURSOR 6050 IN$="":RETURN 6060 LOCATE 2,68:PRINT "Filename: "; 6070 E2X=X:E2Y=Y:EMODE=0 6080 GOSUB 63200:REM HIDE MOUSE CURSOR 6090 LINE (E1X,E1Y)-(E2X,E2Y),0,BF 6100 GOSUB 63100:REM SHOW MOUSE CURSOR 6110 IN$="" 6120 GOSUB 2800:REM IMAGE NOT SAVED MESSAGE 6130 RETURN 6290 REM ----------------------- DRAWING WIDTH ------------------------------- 6300 IF LWIDTH$="1" THEN LWIDTH$="3":LWID=1:GOTO 6400 6310 IF LWIDTH$="3" THEN LWIDTH$="5":LWID=2:GOTO 6400 6320 IF LWIDTH$="5" THEN LWIDTH$="7":LWID=3:GOTO 6400 6330 IF LWIDTH$="7" THEN LWIDTH$="9":LWID=4:GOTO 6400 6340 IF LWIDTH$="9" THEN LWIDTH$="11":LWID=5:GOTO 6400 6350 IF LWIDTH$="11" THEN LWIDTH$="13":LWID=6:GOTO 6400 6360 IF LWIDTH$="13" THEN LWIDTH$="1":LWID=0:GOTO 6400 6400 LOCATE 29,2:PRINT "width=";LWIDTH$;" "; 6410 RETURN 6490 REM ------------------------- DRAW LINE --------------------------------- 6500 LOCATE 2,68:PRINT "StartLine "; 6510 L1X=X:L1Y=Y:LMODE=-1 6520 GOSUB 63200:REM HIDE MOUSE CURSOR 6530 PSET(L1X,L1Y),YELLOW 6540 GOSUB 63100:REM SHOW MOUSE CURSOR 6550 IN$="":RETURN 6560 LOCATE 2,68:PRINT "Filename: "; 6570 L2X=X:L2Y=Y:LMODE=0 6580 GOSUB 63200:REM HIDE MOUSE CURSOR 6590 LINE(L1X,L1Y)-(L2X,L2Y),WHITE:GOTO 6600 6600 GOSUB 63100:REM SHOW MOUSE CURSOR 6610 IN$="" 6620 GOSUB 2800:REM IMAGE NOT SAVED MESSAGE 6630 RETURN 6690 REM ------------------------- DRAW CIRCLE ------------------------------- 6700 LOCATE 2,68:PRINT "StartCircle"; 6710 CX=X:CY=Y:CMODE=-1 6720 GOSUB 63200:REM HIDE MOUSE CURSOR 6730 PSET(CX,CY),YELLOW 6740 GOSUB 63100:REM SHOW MOUSE CURSOR 6750 IN$="":RETURN 6760 LOCATE 2,68:PRINT "Filename: "; 6770 GOSUB 63200:REM HIDE MOUSE CURSOR 6780 CXC=ABS(CX-X):CYC=ABS(CY-Y) 6790 IF CXC>CYC THEN RADIUS=CXC ELSE RADIUS=CYC :REM CYC*2.49 FOR CGA 6800 CIRCLE (CX,CY),RADIUS,WHITE:CMODE=0 6810 GOSUB 63100:REM SHOW MOUSE CURSOR 6820 IN$="" 6830 GOSUB 2800:REM IMAGE NOT SAVED MESSAGE 6840 RETURN 6890 REM ---------------------- FILL A DRAWN AREA -------------------- 6900 GOSUB 63200:REM HIDE MOUSE CURSOR 6910 PSET (X,Y),0:PAINT (X,Y),WHITE,WHITE 6920 GOSUB 63100:REM SHOW MOUSE CURSOR 6930 GOSUB 2800:REM IMAGE NOT SAVED MESSAGE 6935 RETURN 6940 REM ---------------------- ERASE A DRAWN AREA ------------------- 6950 GOSUB 63200:REM HIDE MOUSE CURSOR 6960 PSET (X,Y),WHITE:PAINT (X,Y),0,0 6970 GOSUB 63100:REM SHOW MOUSE CURSOR 6980 GOSUB 2800:REM IMAGE NOT SAVED MESSAGE 6985 RETURN 6990 REM ------------------------- PRINT GRAPHICS ---------------------------- 7000 LOCATE 2,68:PRINT "Printing.."; 7010 LOCATE 3,68:PRINT "<"+FILE$+">"+SPACE$(10-LEN(FILE$)); 7020 GOSUB 63200:REM HIDE MOUSE CURSOR 7030 WIDTH "LPT1:",255 7040 LPRINT CHR$(27)+"3"+CHR$(15);:REM 20/216" LINE FEEDS 7050 FOR Y=0 TO 479 STEP 8:REM 60 LINES OF 8 PIXELS 7060 LPRINT CHR$(27)+"L"+CHR$(128)+CHR$(2);:REM 640 MOD 256,INT(640/256) 7070 FOR X=0 TO 639 7080 PBYTE=0 7090 IF POINT(X,Y)<>0 THEN PBYTE=PBYTE+128 7100 IF POINT(X,Y+1)<>0 THEN PBYTE=PBYTE+64 7110 IF POINT(X,Y+2)<>0 THEN PBYTE=PBYTE+32 7120 IF POINT(X,Y+3)<>0 THEN PBYTE=PBYTE+16 7130 IF POINT(X,Y+4)<>0 THEN PBYTE=PBYTE+8 7140 IF POINT(X,Y+5)<>0 THEN PBYTE=PBYTE+4 7150 IF POINT(X,Y+6)<>0 THEN PBYTE=PBYTE+2 7160 IF POINT(X,Y+7)<>0 THEN PBYTE=PBYTE+1 7170 LPRINT CHR$(PBYTE); 7180 NEXT X 7190 LPRINT CHR$(10); 7200 NEXT Y 7210 LPRINT CHR$(10); 7220 LOCATE 2,68:PRINT "Filename: "; 7230 LOCATE 3,68:PRINT "<"+FILE$+">"+SPACE$(10-LEN(FILE$)); 7240 GOSUB 63100:REM SHOW MOUSE CURSOR 7250 RETURN 7990 REM ------------------------- HELP SCREEN ------------------------------ 8000 LINE(1,1)-(XMAX-1,YMAX-1),0,BF 8010 LOCATE 02,4:PRINT " DRAWPCX version 11/12/93 Copyright (c) 1994 " 8020 LOCATE 03,4:PRINT " Gary Peek 3201 Highgate St. Charles, MO 63301 " 8030 LOCATE 04,4:PRINT " " 8040 LOCATE 05,4:PRINT " This program is a simple drawing and editing utility for " 8050 LOCATE 06,4:PRINT " black and white PCX formatted graphic files. With it you " 8060 LOCATE 07,4:PRINT " can display an image up to 640 by 480 pixels, edit the " 8070 LOCATE 08,4:PRINT " image, perform limited drawing functions, and save the " 8080 LOCATE 09,4:PRINT " image to a PCX file. For images greater than 512 by 416 " 8090 LOCATE 10,4:PRINT " the menu and functions are not displayed. " 8095 LOCATE 11,4:PRINT " " 8100 LOCATE 12,4:PRINT " Explanations of commands: " 8110 LOCATE 13,4:PRINT " A Arrow keys move x,y or set grid size or shift image. " 8120 LOCATE 14,4:PRINT " D & E Draw and erase pixels based on `width'. " 8130 LOCATE 15,4:PRINT " SPACE Stop drawing or erasing pixels. " 8140 LOCATE 16,4:PRINT " W Set width of drawing and erasing from 1 to 13. " 8150 LOCATE 17,4:PRINT " L Draw line, first L=start line, second=end line. " 8160 LOCATE 18,4:PRINT " C Draw circle, first C=center, second=circumference. " 8170 LOCATE 19,4:PRINT " F1 & F2 Save image in current grid, redraw that image. " 8180 LOCATE 20,4:PRINT " F3 & F4 Load from PCX file, save image to PCX file. " 8190 LOCATE 21,4:PRINT " F5 & F6 Remember X,Y position, return to position. " 8200 LOCATE 22,4:PRINT " F7 & F8 Fill and erase rectangular areas. First key " 8210 LOCATE 23,4:PRINT " sets one corner, next key sets other corner. " 8220 LOCATE 24,4:PRINT " F9 Turn grid on and off. " 8270 IN$=INKEY$:IF IN$="" THEN 8270 8300 RETURN 8940 REM -------------------- TALL SELECT FILE NAME ------------------------ 8950 REM 8960 REM enter with EXT$, FILEMSG$ 8970 REM exit with FILE$, NUMFILES, ESCAPE TRUE (=-1) if ESCAPE key hit 8980 REM DOSERROR$="NONE", "DISK" 8990 REM 9000 LOCATE ,,0:COLOR 7,0:CLS 9010 REM SHEL$="DIR *."+EXT$+" | SORT > FILES.TMP":SHELL SHEL$ 9020 REM ON ERROR GOTO 11055 9030 REM OPEN "FILES.TMP" FOR INPUT AS 1 9040 REM IF LOF(1)=0 THEN CLOSE #1:GOTO 11030 9050 REM GOTO 11075 9060 REM PRINT:PRINT "SORT utility not in DOS path" 9070 SHEL$="DIR *."+EXT$+" > FILES.TMP":SHELL SHEL$ 9080 ON ERROR GOTO 9120 9090 OPEN "FILES.TMP" FOR INPUT AS 1 9100 IF LOF(1)=0 THEN CLOSE #1:GOTO 9130 9110 GOTO 9160 9120 RESUME 9130 9130 DOSERROR$="DISK":NUMFILES=0:FILE$="" 9140 ON ERROR GOTO 0:COLOR 7,0:RETURN 9150 REM ----- 9160 ON ERROR GOTO 0 9170 DOSERROR$="NONE" 9180 DIM FILENAME$(1000):NUMFILES=0 9190 IF EOF(1) THEN 9280 9200 INPUT #1,FILE$ 9210 IF MID$(FILE$,9,1)<>" " OR LEFT$(FILE$,1)="." THEN 9190 9220 IF VAL(MID$(FILE$,14,13))=0 THEN 9190 9230 FILENAME$(NUMFILES+1)=LEFT$(FILE$,8) 9240 NUMFILES=NUMFILES+1 9250 IF NUMFILES>1000 THEN 9280 9260 GOTO 9190 9270 REM ----- 9280 CLOSE 1:KILL "FILES.TMP" 9290 IF NUMFILES=0 THEN FILE$="":GOTO 10020 9300 COL=34 9310 REM ----- OUTLINE THE AREA 9320 ON ERROR GOTO 0:CLS 9330 TP=196:BT=196:MS=179:UL=218:LL=192:UR=191:LR=217 9340 REM TP=205:BT=205:MS=186:UL=201:LL=200:UR=187:LR=188 9350 REM TP=223:BT=220:MS=219:UL=219:LL=219:UR=219:LR=219 9360 ROW=3:LOCATE ROW,1+COL:PRINT STRING$(10,CHR$(TP)); 9370 ROW=23:LOCATE ROW,1+COL:PRINT STRING$(10,CHR$(BT)); 9380 DCOL=COL:FOR ROW=4 TO 22:LOCATE ROW,DCOL:PRINT CHR$(MS);:NEXT 9390 DCOL=COL+11:FOR ROW=4 TO 22:LOCATE ROW,DCOL:PRINT CHR$(MS);:NEXT 9400 LOCATE 3,COL:PRINT CHR$(UL);:LOCATE 3,COL+11:PRINT CHR$(UR); 9410 LOCATE 23,COL:PRINT CHR$(LL);:LOCATE 23,COL+11:PRINT CHR$(LR); 9420 REM ----- DISPLAY MESSAGE 9430 ROW=1:MSG$=FILEMSG$ 9440 MCOL=41-INT((LEN(MSG$)/2)) 9450 LOCATE ROW,MCOL:PRINT MSG$; 9460 ROW=25:MSG$="Use Arrow Keys to Move, PgUp and PgDn for More Files, ENTER to Select" 9470 MCOL=41-INT((LEN(MSG$)/2)) 9480 LOCATE ROW,MCOL:PRINT MSG$; 9490 REM ----- 9500 CURROW=1:OLDROW=CURROW 9510 MAXROW=19:IF NUMFILES<19 THEN MAXROW=NUMFILES 9520 SRTROW=1 9530 REM ----- DISPLAY FILE NAMES 9540 COLOR 7,0 9550 FOR DISPLAYROW=1 TO MAXROW 9560 LOCATE DISPLAYROW+3,COL+2 9570 PRINT FILENAME$(DISPLAYROW-1+SRTROW); 9580 NEXT DISPLAYROW 9590 REM ----- MOVE THROUGH FILE NAMES AND SELECT ONE 9600 ESCAPE=0:LOCATE ,,0 9610 LOCATE CURROW+3,COL+2 9620 COLOR 0,7 9630 PRINT FILENAME$(CURROW-1+SRTROW); 9640 COLOR 7,0 9650 LOCATE CURROW+3,COL+2 9660 IN$=INKEY$:IF IN$="" THEN 9660 9670 IF IN$=CHR$(13) THEN 9980 9680 IF IN$=CHR$(27) THEN ESCAPE=-1:FILE$="":GOTO 10020 9690 IF IN$=CHR$(0)+CHR$(72) THEN 9750:REM UP 9700 IF IN$=CHR$(0)+CHR$(80) THEN 9780:REM DOWN 9710 IF IN$=CHR$(0)+CHR$(73) THEN 9810:REM PAGE UP 9720 IF IN$=CHR$(0)+CHR$(81) THEN 9840:REM PAGE DOWN 9730 GOTO 9880 9740 REM ----- 9750 IF CURROW>1 THEN OLDROW=CURROW:CURROW=CURROW-1:GOTO 9900 9760 IF SRTROW>1 THEN SRTROW=SRTROW-1:GOTO 9540 9770 GOTO 9880 9780 IF CURROWMAXROW AND SRTROW<=NUMFILES-19 THEN SRTROW=SRTROW+1:GOTO 9540 9800 GOTO 9880 9810 IF SRTROW>18 THEN SRTROW=SRTROW-18:GOTO 9540 9820 IF SRTROW<>1 THEN SRTROW=1:GOTO 9540 9830 GOTO 9880 9840 IF SRTROW+18<=NUMFILES-19 THEN SRTROW=SRTROW+18:GOTO 9540 9850 IF SRTROW<=NUMFILES-19 THEN SRTROW=NUMFILES-18:GOTO 9540 9860 GOTO 9880 9870 REM ----- BEEP ON ERROR WOULD GO HERE 9880 GOTO 9660 9890 REM ----- HIGHLIGHT NEW FILE 9900 LOCATE OLDROW+3,COL+2 9910 COLOR 7,0 9920 PRINT FILENAME$(OLDROW-1+SRTROW); 9930 LOCATE CURROW+3,COL+2 9940 COLOR 0,7 9950 PRINT FILENAME$(CURROW-1+SRTROW); 9960 GOTO 9660 9970 REM ----- FILE WAS SELECTED 9980 FILE$=FILENAME$(CURROW-1+SRTROW) 9990 REM ----- REMOVE TRAILING SPACES 10000 IF RIGHT$(FILE$,1)=" " THEN FILE$=LEFT$(FILE$,LEN(FILE$)-1):GOTO 10000 10010 REM ----- 10020 ERASE FILENAME$ 10030 COLOR 7,0:RETURN 61960 REM ******************************************************************** 61965 REM ------------------------- GET MONITOR ------------------------------ 61970 REM 61975 REM This routine finds the type of video monitor hardware installed. 61980 REM It requires that the assembly language interface be installed. 61985 REM 61990 REM exit with - MONITOR$="MONO","HERC","CGA","EGA",or"VGA", monitor used 61995 REM 62000 DEF SEG=0:STATUS=PEEK(&H463):DEF SEG 62005 IF STATUS<>&HB4 THEN 62040 62010 STATUS=(INP(&H3BA) AND &H80) 62015 FOR DELAYLOOP=1 TO 30000 62020 IF (INP(&H3BA) AND &H80)<>STATUS THEN MONITOR$="HERC":RETURN 62025 NEXT DELAYLOOP 62030 MONITOR$="MONO":RETURN 62035 REM ----- 62040 REGAX%=&H1A00 62045 INTERRUPT%=&H10:GOSUB 65000:REM CALL ASM 62050 IF (REGAX% AND &HFF)=&H1A THEN MONITOR$="VGA":RETURN 62055 REM ----- 62060 REGAX%=&H1200:REGBX%=&H10 62065 INTERRUPT%=&H10:GOSUB 65000:REM CALL ASM 62070 IF (REGBX% AND &HFF)=&H10 THEN MONITOR$="CGA":RETURN 62075 REM ----- 62080 MONITOR$="EGA":RETURN 62085 REM 62110 REM ******************************************************************** 62115 REM ------------------------- MOUSE ROUTINES --------------------------- 62120 REM 62125 REM The following routines provide access to some mouse function calls. 62130 REM They require that the assembly language interface be installed. 62135 REM 62140 REM 62145 REM 62150 REM 62155 REM 63000 hardware reset and status 62160 REM 63100 show cursor 62165 REM 63200 hide cursor 62170 REM 63300 get button status and mouse position 62175 REM 63400 set cursor position 62180 REM 63500 get button press info 62185 REM 63600 get button release info 62190 REM 63700 set cursor limits 62195 REM 63800 set graphics cursor 62200 REM 62205 REM 64000 set text cursor 62210 REM 64100 read motion counters 62215 REM 64200 62220 REM 64300 62225 REM 64400 62230 REM 64500 62235 REM 64600 set sensitivity and double speed 62240 REM 64700 62245 REM 64800 62250 REM 64900 get driver version, type, IRQ 62255 REM 62260 REM 62265 REM 62270 REM ******************************************************************** 62275 REM ------------------- MOUSE - RESET AND STATUS ----------------------- 62280 REM 62285 REM exit with - STATUS = -1 if mouse found and reset, otherwise 0 62290 REM BUTTONS = number of buttons 62295 REM 63000 REGAX%=0:REGBX%=0:REGCX%=0:REGDX%=0 63005 INTERRUPT%=&H33:GOSUB 65000:REM CALL ASM 63010 STATUS=REGAX%:BUTTONS=REGBX% 63015 RETURN 63020 REM 63085 REM ******************************************************************** 63090 REM ------------------- MOUSE - SHOW CURSOR ---------------------------- 63095 REM 63100 REGAX%=1:INTERRUPT%=&H33:GOSUB 65000:REM CALL ASM 63105 RETURN 63110 REM 63185 REM ******************************************************************** 63190 REM ------------------- MOUSE - HIDE CURSOR ---------------------------- 63195 REM 63200 REGAX%=2:INTERRUPT%=&H33:GOSUB 65000:REM CALL ASM 63205 RETURN 63210 REM 63270 REM ******************************************************************** 63275 REM ---------- MOUSE - GET CURSOR POSITION AND BUTTON STATUS ----------- 63280 REM 63285 REM exit with - X and Y = cursor coordinates 63290 REM LEFT, RIGHT, or BOTH = true for buttons pressed 63295 REM 63300 REGAX%=3 63305 INTERRUPT%=&H33:GOSUB 65000:REM CALL ASM 63310 X=REGCX%:Y=REGDX% 63315 REM ----- 63320 LEFT=0:RIGHT=0:BOTH=0 63325 IF (REGBX% AND 7)=0 THEN RETURN 63330 T=TIMER 63335 IF TIMER32767 THEN BINVALUE=BINVALUE-65536! 63845 MOUSECURSOR%(CURSLOOP%)=BINVALUE 63850 NEXT CURSLOOP% 63855 REM 63860 REGAX%=9:REM SET GRAPHICS CURSOR 63865 REGBX%=8:REM HORIZONTAL HOT SPOT 63870 REGCX%=7:REM VERTICAL HOT SPOT 63875 REGDX%=VARPTR(MOUSECURSOR%(1)) :REM VERSION 6.25 AND LATER 63880 INTERRUPT%=&H33:GOSUB 65000:REM CALL ASM 63885 RETURN 63890 REM 63895 REM ----- SCREEN MASK 63900 DATA "1111111111111111":REM DATA "1111111111111111":REM 63901 DATA "1111111111111111":REM DATA "1111111000111111" 63902 DATA "1111111111111111":REM DATA "1111111010111111" 63903 DATA "1111111111111111":REM DATA "1111111010111111" 63904 DATA "1111111111111111":REM DATA "1111111010111111" 63905 DATA "1111111111111111":REM DATA "1111111010111111" 63906 DATA "1111111111111111":REM DATA "1000000111000000" 63907 DATA "1111111111111111":REM DATA "1011111111111110" 63908 DATA "1111111111111111":REM DATA "1000000111000000" 63909 DATA "1111111111111111":REM DATA "1111111010111111" 63910 DATA "1111111111111111":REM DATA "1111111010111111" 63911 DATA "1111111111111111":REM DATA "1111111010111111" 63912 DATA "1111111111111111":REM DATA "1111111010111111" 63913 DATA "1111111111111111":REM DATA "1111111000111111" 63914 DATA "1111111111111111":REM DATA "1111111111111111" 63915 DATA "1111111111111111":REM DATA "1111111111111111" 63916 REM ----- CURSOR MASK 63917 DATA "0000000000000000" 63918 DATA "0000000111000000" 63919 DATA "0000000101000000" 63920 DATA "0000000101000000" 63921 DATA "0000000101000000" 63922 DATA "0000000101000000" 63923 DATA "0111111000111111" 63924 DATA "0100000000000001" 63925 DATA "0111111000111111" 63926 DATA "0000000101000000" 63927 DATA "0000000101000000" 63928 DATA "0000000101000000" 63929 DATA "0000000101000000" 63930 DATA "0000000111000000" 63931 DATA "0000000000000000" 63932 DATA "0000000000000000" 63933 REM 63935 REM 63985 REM ******************************************************************** 63990 REM ------------------- MOUSE - SET SOFTWARE TEXT CURSOR --------------- 63995 REM 64000 REGAX%=10:REM SET TEXT CURSOR 64005 REGBX%=0:REM SOFTWARE TEXT CURSOR 64010 REGCX%=&H77FF :REM TRY &HFFFF 64015 REGDX%=&H7700 64020 INTERRUPT%=&H33:GOSUB 65000:REM CALL ASM 64025 RETURN 64030 REM 64035 REM 64075 REM ******************************************************************** 64080 REM ------------------- MOUSE - READ MOTION COUNTERS ------------------- 64085 REM 64090 REM exit with - XMICKEY, YMICKEY, mickey counts since last called 64095 REM 64100 REGAX%=11 64105 INTERRUPT%=&H33:GOSUB 65000:REM CALL ASM 64110 XMICKEY=REGCX%:YMICKEY=REGDX% 64115 RETURN 64120 REM 64125 REM 64565 REM ******************************************************************** 64570 REM ------------------- MOUSE - SET SENSITIVITY ------------------------ 64575 REM 64580 REM enter with - XSENS, YSENS = 1 to 100, horiz. and vert. sensitivity 64585 REM THRESHOLD = 0 to 100, threshold for double speed 64590 REM 64595 REM 64600 REGAX%=26:REGBX%=XSENS:REGCX%=YSENS:REGDX%=THRESHOLD 64605 INTERRUPT%=&H33:GOSUB 65000:REM CALL ASM 64610 RETURN 64615 REM 64620 REM 64865 REM ******************************************************************** 64870 REM ------------------- MOUSE - GET VERSION, TYPE, IRQ ----------------- 64875 REM 64880 REM exit with - VERSION = mouse driver version number 64885 REM MOUSETYPE = type of mouse 64890 REM IRQ = interrupt request 64895 REM 64900 REGAX%=36 64905 INTERRUPT%=&H33:GOSUB 65000:REM CALL ASM 64910 VERSION=VAL(HEX$(INT(REGBX%/256))+"."+HEX$(REGBX% MOD 256)) 64915 MOUSETYPE=INT(REGCX%/256):IRQ=REGCX% MOD 256 64920 RETURN 64925 REM 64930 REM ******************************************************************** 64935 REM ----------- SET UP AND CALL ASSEMBLY LANGUAGE SUBROUTINE ----------- 64940 REM 64945 REM This routine sets up and calls a previously loaded general purpose 64950 REM assembly language subroutine to access DOS and other interrupts. 64955 REM Knowledge of how to call these interrupts is required. Interrupts 64960 REM that use only registers AX,BX,CX,DX are the only ones supported. 64965 REM 64970 REM enter with - REGAX%,REGBX%,REGCX%,REGDX% 64975 REM (registers required for calling the interrupt) 64980 REM INTERRUPT%, the interrupt to call 64985 REM exit with - REGAX%,REGBX%,REGCX%,REGDX% 64990 REM (registers after returning from the interrupt) 64995 REM 65000 DEF SEG=&H4B :REM POINT TO SEGMENT 65005 POKE 33,INTERRUPT% :REM FILL IN THE INTERRUPT TO CALL 65010 POKE 4,INT(REGAX%/256):POKE 3,REGAX% MOD 256 :REM FILL IN THE REGISTERS 65015 POKE 6,INT(REGBX%/256):POKE 5,REGBX% MOD 256 65020 POKE 8,INT(REGCX%/256):POKE 7,REGCX% MOD 256 65025 POKE 10,INT(REGDX%/256):POKE 9,REGDX% MOD 256 65030 REM ASMSUB=0:CALL ASMSUB :REM USE THIS LINE FOR THE INTERPRETER 65035 CALL ABSOLUTE(0) :REM USE THIS LINE FOR THE COMPILER 65040 REGAX=(PEEK(4)*256)+PEEK(3):IF REGAX>32767 THEN REGAX=REGAX-65536! 65045 REGAX%=REGAX 65050 REGBX=(PEEK(6)*256)+PEEK(5):IF REGBX>32767 THEN REGBX=REGBX-65536! 65055 REGBX%=REGBX 65060 REGCX=(PEEK(8)*256)+PEEK(7):IF REGCX>32767 THEN REGCX=REGCX-65536! 65065 REGCX%=REGCX 65070 REGDX=(PEEK(10)*256)+PEEK(9):IF REGDX>32767 THEN REGDX=REGDX-65536! 65075 REGDX%=REGDX 65080 DEF SEG:RETURN :REM RETURN TO BASIC SEGMENT 65085 REM 65090 REM 65095 REM ******************************************************************** 65100 REM ---------------- LOAD ASSEMBLY LANGUAGE SUBROUTINE ----------------- 65105 REM 65110 REM This routine loads the following general purpose assembly language 65115 REM subroutine to access DOS and other interrupts. It is loaded into 65120 REM the area just below the DOS inter-program communication area. 65125 REM 65130 REM ASSUME CS:CODE 65135 REM JMP HERE 65140 REM 65145 REM WORKA DW 0 ;STORAGE FOR REGISTERS- 65150 REM WORKB DW 0 ;BASIC WRITES THESE, 65155 REM WORKC DW 0 ;THEN THE INTERRUPT% HAPPENS, 65160 REM WORKD DW 0 ;THEN BASIC READS THESE 65165 REM 65170 REM HERE: MOV AX,WORKA ;GET PARM 1 FROM BASIC 65175 REM MOV BX,WORKB ;GET PARM 2 FROM BASIC 65180 REM MOV CX,WORKC ;GET PARM 3 FROM BASIC 65185 REM MOV DX,WORKD ;GET PARM 4 FROM BASIC 65190 REM PUSH DS ;MAKE ES THE SAME AS DS 65195 REM POP ES 65200 REM INT 21H ;DOS (or other) INTERRUPT 65205 REM MOV WORKA,AX ;SEND PARM 1 TO BASIC 65210 REM MOV WORKB,BX ;SEND PARM 2 TO BASIC 65215 REM MOV WORKC,CX ;SEND PARM 3 TO BASIC 65220 REM MOV WORKD,DX ;SEND PARM 4 TO BASIC 65225 REM DB 0CBH ;ASSEMBLER REJECTS "RETF" 65230 REM 65235 REM CODE ENDS 65240 REM END 65245 REM 65250 DEF SEG=&H4B:RESTORE 65270 65255 FOR I=0 TO 53:READ B:POKE I,B:NEXT I 65260 DEF SEG:RETURN 65265 REM ----- 65270 DATA &HEB,&H09,&H90 65275 DATA &H00,&H00,&H00,&H00,&H00,&H00,&H00,&H00 :REM REGISTERS AX-DX 65280 DATA &H2E,&HA1,&H03,&H00 65285 DATA &H2E,&H8B,&H1E,&H05,&H00 65290 DATA &H2E,&H8B,&H0E,&H07,&H00 65295 DATA &H2E,&H8B,&H16,&H09,&H00 65300 DATA &H1E,&H07 65305 DATA &HCD,&H21 :REM INTERRUPT% XX 65310 DATA &H2E,&HA3,&H03,&H00 65315 DATA &H2E,&H89,&H1E,&H5,&H0 65320 DATA &H2E,&H89,&H0E,&H07,&H00 65325 DATA &H2E,&H89,&H16,&H09,&H00 65330 DATA &HCB :REM RETF