DIM GLOBAL NIB(40, 128)

CALL MAKENIBBLES

ON RASTER CALL RASBLIT

X1=20
Y1=30
X2=152
Y2=105

DX1=1
DY1=1
DX2=-1
DY2=-1

DO
  CALL CLEARSCREEN
  
  CALL LINE(X1, Y1, X2, Y2)
  
  X1=X1+DX1
  Y1=Y1+DY1
  X2=X2+DX2
  Y2=Y2+DY2
  IF X1>158 OR X1<2 THEN
    DX1=-DX1
  END IF
  IF X2>158 OR X2<2 THEN
    DX2=-DX2
  END IF
  IF Y1>124 OR Y1<2 THEN
    DY1=-DY1
  END IF
  IF Y2>124 OR Y2<2 THEN
    DY2=-DY2
  END IF
  
  WAIT VBL
LOOP

END

SUB CLEARSCREEN
  FOR J=0 TO 127
    FOR I=0 TO 39
      NIB(I, J) = 0
    NEXT I
  NEXT J
END SUB

SUB LINE(A, B, C, D)
  X1=A
  Y1=B
  X2=C
  Y2=D

  DX=ABS(X2-X1)
  DY=ABS(Y2-Y1)

  SX=1
  IF X1>X2 THEN
    SX=0-1
  END IF

  SY=1
  IF Y1>Y2 THEN
    SY=0-1
  END IF

  ER=DX-DY

LINELP:
  CALL DOT(X1,Y1)

  DN=0
  IF X1=X2 THEN
    IF Y1=Y2 THEN
      DN=1
    END IF
  END IF

  IF DN=1 THEN
    GOTO LINEEND
  END IF

  E2=ER*2

  IF E2>0-DY THEN
    ER=ER-DY
    X1=X1+SX
  END IF

  IF E2<DX THEN
    ER=ER+DX
    Y1=Y1+SY
  END IF

  GOTO LINELP

LINEEND:
END SUB

SUB DOT(X, Y)
  MX = X \ 4
  MB = X MOD 4
  REM PRINT MX, MB
  CALL BITON(MB, MX, Y)
END SUB

SUB BITON(NBIT, NUM, LN)
  NBIT = 3-NBIT
  SB = 2^NBIT
  NIB(NUM, LN) = NIB(NUM, LN) OR SB
END SUB

SUB MAKENIBBLES
  FOR C=1 TO 15
    AD=$8000+C*16
    FILL AD,16,0
    POKE AD,C*16
  NEXT C
END SUB

SUB RASBLIT
  RA = RASTER
  FOR I=0 TO 39
    COPY $A000,-4000 TO $A001
    SPRITE I, I*4, RA, NIB(I, RA)    
  NEXT I
END SUB