5 REM LOOKUP TABLE FOR BITS
10 FOR X=0 TO 1:FOR Y=0 TO 2:READ LU(X,Y):NEXT Y:NEXT X
20 DATA 5,3,1,4,2,0
30 REM START AND END OF VIDEO RAM
40 VIDRAM=16384:VND=16895
70 VCTRL=49151
230 CH=16
290 CLS
300 REM MAIN PROGRAM
310 M$(0)="FIRST":M$(1)="SECOND"
320 FOR I=0 TO 1
330 PRINT"ENTER ";M$(I);" X AND Y"
340 PRINT"0 <= X <=63, 0 <= Y <=47"
350 INPUT X(I),Y(I)
360 IF X(I)<0 OR X(I)>63 OR Y(I)<0 OR Y(I)>47 THEN 340
370 NEXT I
380 GOSUB 800:GOSUB 750
410 DX=X(1)-X(0):DY=Y(1)-Y(0):SX=SGN(DX):SY=SGN(DY)
440 IF DX=0 THEN 550
450 SL=DY/DX:B=Y(0)-SL*X(0)
460 T1=SQR(SL*SL+1)
470 NX=1/T1*SX
480 FOR XT=X(0) TO X(1) STEP NX
490 X=INT(XT+.5)
500 Y=INT(SL*XT+B+.5)
510 GOSUB830
520 NEXT XT
525 A$=INKEY$:IF A$="" THEN 525
530 GOSUB770:CLS
540 GOTO 320
550 X=X(0)
560 FOR Y=Y(0) TO Y(1) STEP SY
570 GOSUB 830
580 NEXT Y
585 GOTO 525
740 REM GO INTO GRAPHICS
750 POKE VCTRL,CH OR (PEEK(VCTRL) AND 7)
760 RETURN
765 REM GO INTO TEXT
770 POKE VCTRL,0
780 RETURN
800 CLS0
810 RETURN
820 REM SET POINT (X,Y)
830 X1=INT(X/2)
835 Y1=INT(Y/3)
840 OF=X1+Y1*32:BYTE=VIDRAM+OF
850 XMOD2=INT(X-X1*2)
855 YMOD3=INT(Y-Y1*3)
860 BIT=LU(XMOD2,YMOD3)
870 VLU=2^BIT
880 OLD=PEEK(BYTE)
890 MASK=VLU OR OLD
900 POKE BYTE,MASK
910 RETURN
915 REM RESET POINT
920 GOSUB 830
930 POKE BYTE, NOT(NOT MASK OR VLU)
940 RETURN
945 REM CHANGE COLOUR OF POINT
950 IF C=2 THEN BIT=6:GOSUB 870:BIT=7:GOSUB870
960 IF C=1 THEN BIT=6:GOSUB 870:POKE BYTE, NOT(NOT MASK OR VLU):BIT=7:GOSUB 870
970 RETURN


