1000 ' 1010 ' bitmap98 -- bitmap editor on N88-BASIC(86) [MS-DOS] 1020 ' 1030 ' revision history 1040 ' 0.0: Nov. 3, 1990 by Dai Ishijima (ishijima.ac.jp) 1050 ' 1.0: Nov. 23 1060 ' 1.1: Nov. 24 1070 ' 1080 ' 1090 DEFINT A - Z 1100 ' 1110 CONSOLE 0, 25, 0, 0: WIDTH 80, 25 1120 SCREEN 3: XMAX = 640: YMAX = 400 1130 ' 1140 *MOUSE.PATTERN 1150 DATA 01, 80, 01, 80, 01, 80, 01, 80, 01, 80, 01, 80, 01, 80, ff, ff 1160 DATA 01, 80, 01, 80, 01, 80, 01, 80, 01, 80, 01, 80, 01, 80, 01, 80 1170 MP$ = "" 1180 FOR I = 1 TO 32: READ A$: MP$ = MP$ + CHR$(VAL("&h" + A$)): NEXT 1190 MOUSE 0 1200 MOUSE 2, 7, 7, MP$ 1210 FG = 1 : COLOR=(1, 7) 1220 COLOR = (4, 2): COLOR = (5, 2): COLOR = (2, 1) 1230 TILE$ = "FF" 1240 ' 1250 SCREEN ,3 1260 INPUT "size=? ", SIZE 1270 LINE INPUT "file=? ", F$ 1280 LINE INPUT "clear (Y/N) ", A$ 1290 SQUARE = INT(400 / SIZE) 1300 CLS 1310 SCREEN ,0 1320 IF (A$ <> "n") AND (A$ <>"N") THEN CLS 3: GOSUB *WRITE.BOARD 1330 ' 1340 'SQUARE = INT(400 / SIZE) 1350 ' 1360 'FG = 1 : COLOR=(1, 7): COLOR = (4, 2): COLOR = (5, 2) 1370 'GOSUB *WRITE.BOARD 1380 GOSUB *WRITE.MENU 1390 ' 1400 GOSUB *DISP.MOUSE 1410 'ON MOUSE (2) GOSUB *LEFT.BUTTON 1420 'ON MOUSE (3) GOSUB *RIGHT.BUTTON 1430 'MOUSE (2) ON 1440 'MOUSE (3) ON 1450 *LOOP 1460 GOSUB *XY.XY 1470 IF (XX < SIZE) AND (YY < SIZE) THEN *ON.BOARD 1480 IF MOUSE(2, 1) <> 0 THEN GOSUB *CHECK.MENU 1490 GOTO *END.OF.ON.BOARD 1500 *ON.BOARD 1510 IF MOUSE(2, 1) <> 0 THEN GOSUB *LEFT.BUTTON 1520 IF MOUSE(2, 2) <> 0 THEN GOSUB *RIGHT.BUTTON 1530 *END.OF.ON.BOARD 1540 GOTO *LOOP 1550 ' 1560 *DISP.MOUSE 1570 MOUSE 1, , , 1 1580 RETURN 1590 ' 1600 *HIDE.MOUSE 1610 MOUSE 1, , , 0 1620 RETURN 1630 ' 1640 *WRITE.BOARD 1650 LINE(0, 0) - (SIZE * SQUARE, SIZE * SQUARE), FG, BF 1660 STYLE = &H5555 1670 FOR X = 0 TO SIZE 1680 LINE(X * SQUARE, 0) - (X * SQUARE, SIZE * SQUARE), 0,, STYLE 1690 NEXT 1700 FOR Y = 0 TO SIZE 1710 LINE(0, Y * SQUARE) - (SIZE * SQUARE, Y * SQUARE), 0,, STYLE 1720 NEXT 1730 LINE(XMAX - 1, YMAX - 1) - STEP(-SIZE - 4, -SIZE - 4), FG, B 1740 LINE(XMAX - 3, YMAX - 3) - STEP(-SIZE, -SIZE), FG, BF 1750 RETURN 1760 ' 1770 ' 1780 *WRITE.MENU 1790 LOCATE 56, 2: PRINT F$; " :"; SIZE ;"x"; SIZE 1800 LOCATE 56, 4: PRINT "Write Output" 1810 LOCATE 56, 6: PRINT "Read File" 1820 LOCATE 56, 9: PRINT "Line" 1830 LOCATE 56, 11: PRINT "Paint" 1840 LOCATE 56, 12: PRINT "Tile: "; TILE$ 1850 LOCATE 56, 16: PRINT "Quit" 1860 RETURN 1870 ' 1880 *CHECK.MENU 1890 CX = INT(MOUSE(0) / 8) 1900 CY = INT(MOUSE(1) / 16) 1910 IF (CX < 56) OR (60 < CX) THEN *OUT.OF.RANGE.MENU 1920 *CHANGE.FILE.NAME 1930 IF (CY <> 2) THEN *MENU.WRITE.CHECK 1940 OLD.F$ = F$ 1950 LOCATE 56, 2: PRINT SPC(79 - 56); 1960 CONSOLE 2, 1 1970 LOCATE 56, 2: LINE INPUT "new name? ", F$ 1980 CONSOLE 0, 25 1990 IF F$ = "" THEN F$ = OLD.F$ 2000 GOTO *MENU.END 2010 *MENU.WRITE.CHECK 2020 IF (CY <> 4) THEN *MENU.READ.CHECK 2030 LOCATE 56, 4: COLOR 4: PRINT "Write Output": COLOR 0 2040 GOSUB *HIDE.MOUSE 2050 GOSUB *SAVE.DATA 2060 GOSUB *DISP.MOUSE 2070 GOTO *MENU.END 2080 *MENU.READ.CHECK 2090 IF (CY <> 6) THEN *MENU.LINE 2100 LOCATE 56, 6: COLOR 4: PRINT "Read File": COLOR 0 2110 GOSUB *HIDE.MOUSE 2120 GOSUB *LOAD.DATA 2130 GOSUB *DISP.MOUSE 2140 GOTO *MENU.END 2150 *MENU.LINE 2160 IF (CY <> 9) THEN *MENU.PAINT 2170 LOCATE 56, 9: COLOR 4: PRINT "Line": COLOR 0 2180 GOSUB *GET.XY 2190 IF ABORT THEN *LINE.END 2200 XX1 = XX: YY1 = YY 2210 GOSUB *HIDE.MOUSE 2220 XX2 = XX * SQUARE + 1: YY2 = YY * SQUARE + 1 2230 BG = POINT(XX2, YY2) 2240 LINE(XX2, YY2) - STEP(SQUARE - 2, SQUARE - 2), 2, BF 2250 GOSUB *DISP.MOUSE 2260 GOSUB *GET.XY 2270 IF ABORT THEN *LINE.END2 2280 GOSUB *HIDE.MOUSE 2290 X1 = XMAX - SIZE - 3 + XX1: Y1 = YMAX - SIZE - 3 + YY1 2300 X2 = XMAX - SIZE - 3 + XX: Y2 = YMAX - SIZE - 3 + YY 2310 LINE (X1, Y1) - (X2, Y2), 0 2320 X1 = XX1: Y1 = YY1: X2 = XX: Y2 = YY 2330 LOCATE 56, 9: COLOR 6: PRINT "Line": COLOR 0 2340 GOSUB *TO.CANVAS 2350 GOSUB *DISP.MOUSE 2360 GOTO *LINE.END 2370 *LINE.END2 2380 LINE(XX2, YY2) - STEP(SQUARE - 2, SQUARE - 2), BG, BF 2390 *LINE.END 2400 GOTO *MENU.END 2410 *MENU.PAINT 2420 IF (CY <> 11) THEN *MENU.TILE 2430 LOCATE 56, 11: COLOR 4: PRINT "Paint": COLOR 0 2440 GOSUB *GET.XY 2450 IF ABORT THEN *PAINT.END 2460 GOSUB *HIDE.MOUSE 2470 T$ = "" 2480 FOR I = 1 TO LEN(TILE$) STEP 2 2490 FOR J = 1 TO 3 2500 T$ = T$ + CHR$(VAL("&h" + MID$(TILE$, I, 2))) 2510 NEXT 2520 NEXT 2530 BG = POINT(XMAX - SIZE - 3 + XX, YMAX - SIZE - 3 + YY) 2540 IF BG = 0 THEN BD = FG ELSE BD = 0 2550 PAINT(XMAX - SIZE - 3 + XX, YMAX - SIZE - 3 + YY), T$, BD 2560 X1 = 0: Y1 = 0: X2 = SIZE - 1: Y2 = SIZE - 1 2570 LOCATE 56, 11: COLOR 6: PRINT "Paint": COLOR 0 2580 GOSUB *TO.CANVAS 2590 GOSUB *DISP.MOUSE 2600 *PAINT.END 2610 GOTO *MENU.END 2620 *MENU.TILE 2630 IF (CY <> 12) THEN *MENU.QUIT 2640 OLD.T$ = TILE$ 2650 LOCATE 56, 12: PRINT SPC(79 - 56); 2660 CONSOLE 12, 1 2670 LOCATE 56, 12: LINE INPUT "new tile? ", TILE$ 2680 CONSOLE 0, 25 2690 IF TILE$ = "" THEN TILE$ = OLD.T$ 2700 GOTO *MENU.END 2710 *MENU.QUIT 2720 IF (CY <> 16) THEN *MENU.END 2730 LOCATE 56, 16: COLOR 4: PRINT "Quit": COLOR 0 2740 GOSUB *HIDE.MOUSE 2750 MOUSE 6 2760 SCREEN ,3 2770 END 2780 GOTO *MENU.END 2790 *MENU.END 2800 GOSUB *WRITE.MENU 2810 *OUT.OF.RANGE.MENU 2820 RETURN 2830 ' 2840 *LEFT.BUTTON 2850 GOSUB *HIDE.MOUSE 2860 X1 = MOUSE(0) 2870 Y1 = MOUSE(1) 2880 X1 = INT(X1 / SQUARE): X2 = X1 * SQUARE 2890 Y1 = INT(Y1 / SQUARE): Y2 = Y1 * SQUARE 2900 PRESET(XMAX - SIZE - 3 + X1, YMAX - SIZE - 3 + Y1), 0 2910 LINE(X2 + 1, Y2 + 1) - (X2 + SQUARE - 1, Y2 + SQUARE - 1), 0, BF 2920 GOSUB *DISP.MOUSE 2930 RETURN 2940 ' 2950 *RIGHT.BUTTON 2960 GOSUB *HIDE.MOUSE 2970 X1 = MOUSE(0) 2980 Y1 = MOUSE(1) 2990 X1 = INT(X1 / SQUARE): X2 = X1 * SQUARE 3000 Y1 = INT(Y1 / SQUARE): Y2 = Y1 * SQUARE 3010 PSET(XMAX - SIZE - 3 + X1, YMAX - SIZE - 3 + Y1), FG 3020 LINE(X2 + 1, Y2 + 1) - (X2 + SQUARE - 1, Y2 + SQUARE - 1), FG, BF 3030 GOSUB *DISP.MOUSE 3040 RETURN 3050 ' 3060 *TO.CANVAS 3070 IF X1 > X2 THEN SWAP X1, X2 3080 IF Y1 > Y2 THEN SWAP Y1, Y2 3090 FOR YY = Y1 TO Y2 3100 FOR XX = X1 TO X2 3110 XX1 = XX * SQUARE: YY1 = YY * SQUARE 3120 IF POINT(XMAX - SIZE - 3 + XX, YMAX - SIZE - 3 + YY) = 0 THEN *TC.0 3130 LINE(XX1 + 1, YY1 + 1) - STEP(SQUARE - 2, SQUARE - 2), FG, BF 3140 GOTO *TC.END 3150 *TC.0 3160 LINE(XX1 + 1, YY1 + 1) - STEP(SQUARE - 2, SQUARE - 2), 0, BF 3170 *TC.END 3180 NEXT 3190 NEXT 3200 RETURN 3210 ' 3220 *GET.XY 3230 GOSUB *RELEASE.BUTTON 3240 ABORT = -1 3250 *GET.XY.LOOP 3260 GOSUB *XY.XY 3270 IF MOUSE(2, 2) <> 0 THEN ABORT = 1: RETURN 3280 IF (XX >= SIZE) OR (YY >= SIZE) THEN *GET.XY.LOOP 3290 IF MOUSE(2, 1) <> 0 THEN ABORT = 0 3300 IF (ABORT < 0) THEN *GET.XY.LOOP 3310 RETURN 3320 ' 3330 *RELEASE.BUTTON 3340 WHILE (MOUSE(2, 1) <> 0) OR (MOUSE(2, 2) <> 0): WEND 3350 RETURN 3360 ' 3370 *XY.XY 3380 X = MOUSE(0) 3390 Y = MOUSE(1) 3400 XX = INT(X / SQUARE) 3410 YY = INT(Y / SQUARE) 3420 LOCATE 56, 0 3430 IF (XX < SIZE) AND (YY < SIZE) THEN *PRINT.XY 3440 PRINT "(***, ***)" 3450 GOTO *END.IF.XY 3460 *PRINT.XY 3470 PRINT "("; 3480 PRINT USING "###"; XX; 3490 PRINT ", "; 3500 PRINT USING "###"; YY; 3510 PRINT ")"; 3520 *END.IF.XY 3530 RETURN 3540 ' 3550 *LOAD.DATA 3560 LOCATE 56, 2 3570 ' LINE INPUT "file? ", F$ 3580 OPEN F$ FOR INPUT AS #1 3590 Y = 0 3600 WHILE NOT EOF (1) 3610 LINE INPUT #1, A$ 3620 Y1 = Y * SQUARE 3630 FOR X = 1 TO LEN(A$) 3640 X1 = (X - 1) * SQUARE 3650 IF (X - 1 >= SIZE) OR (Y >= SIZE) THEN *NEXT.NEXT 3660 IF MID$(A$, X, 1) <> "#" THEN *IS.OFF 3670 LINE(X1 + 1, Y1 + 1) - (X1 + SQUARE - 1, Y1 + SQUARE - 1), 0, BF 3680 PRESET(XMAX - SIZE - 3 + X - 1, YMAX - SIZE - 3 + Y), 0 3690 GOTO *END.IF.ONOFF 3700 *IS.OFF 3710 LINE(X1 + 1, Y1 + 1) - (X1 + SQUARE - 1, Y1 + SQUARE - 1), FG, BF 3720 PSET(XMAX - SIZE - 3 + X - 1, YMAX - SIZE - 3 + Y), FG 3730 *END.IF.ONOFF 3740 *NEXT.NEXT 3750 NEXT 3760 Y = Y + 1 3770 WEND 3780 CLOSE 3790 RETURN 3800 ' 3810 *SAVE.DATA 3820 LOCATE 56, 2 3830 ' LINE INPUT "file? ", F$ 3840 OPEN F$ FOR OUTPUT AS #1 3850 FOR Y = 0 TO SIZE - 1 3860 FOR X = 0 TO SIZE - 1 3870 IF (POINT(X * SQUARE + 1, Y * SQUARE + 1) = 0) THEN *OFF.OFF 3880 PRINT #1, "-"; 3890 GOTO *ENDIF.ON.OFF 3900 *OFF.OFF 3910 PRINT #1, "#"; 3920 *ENDIF.ON.OFF 3930 NEXT 3940 PRINT #1, "" 3950 NEXT 3960 CLOSE #1 3970 RETURN 3980 '