CHAR_NUM = 1
FOR Y = 0 TO 14 STEP 2
  FOR X = 0 TO 19
	  'FILL A ROW WITH CHARACTERS 0 TO 20
	  CELL X, Y, CHAR_NUM
		
		'FILL A ROW WITH CHARACTERS 21 TO 40
		CELL X, Y+1, CHAR_NUM + 20
		
		ADD CHAR_NUM, 1, 1 TO 20
	NEXT X
NEXT Y

DIM GLOBAL BITMASK(160)
FOR X = 0 TO 159
  BITMASK(X) = 2^(7-(X MOD 8))
NEXT X

DIM GLOBAL LOW_BYTE_COLOR(7, 3), HIGH_BYTE_COLOR(7, 3)
FOR C = 0 TO 2 STEP 2
  FOR X = 0 TO 7
	  LOW_BYTE_COLOR(X, C) = NOT BITMASK(X)
	NEXT X
NEXT C

FOR C = 1 TO 3 STEP 2
  FOR X = 0 TO 7
	  LOW_BYTE_COLOR(X, C) = 255
	NEXT X
NEXT C

FOR C = 0 TO 1
  FOR X = 0 TO 7
	  HIGH_BYTE_COLOR(X, C) = NOT BITMASK(X)
	NEXT X
NEXT C

FOR C = 2 TO 3
  FOR X = 0 TO 7
	  HIGH_BYTE_COLOR(X, C) = 255
	NEXT X
NEXT C

'THE PLACES IN WORKING RAM WHERE THE FRAMEBUFFER IS STORED :)
'$A000 TO $B3FF
DIM GLOBAL FRAMEBUFFER_MEM_ADDR(160, 128)

'THE PLACES IN MEMORY WHERE THE DATA FOR CHARACTERS 1 TO 40 ARE STORED :)
'$8010 TO $829F
DIM GLOBAL CHARACTER_MEM_ADDR(160, 128)

'FILL THE FRAMEBUFFER AND CHARACTER DATA MEMORY LOCATION ARRAYS :)
BUFFER_ADDR = $9EC0
CHAR_ADDR = $8010
FOR Y = 0 TO 127
  IF Y MOD 8 = 0 THEN
	  ADD BUFFER_ADDR, $140
		IF Y <> 0 THEN ADD CHAR_ADDR, $140, $8010 TO $8150
	END IF
	
	FOR X = 0 TO 159
	  FRAMEBUFFER_MEM_ADDR(X, Y) = BUFFER_ADDR + (X\8)*$10 + (Y MOD 8)
		CHARACTER_MEM_ADDR(X, Y) = CHAR_ADDR + (X\8)*$10 + (Y MOD 8)
	NEXT X
NEXT Y

'THE MEMORY ADDRESS THAT THE FRAMEBUFFER WILL BE COPIED FROM AND COPIED TO DURING
'EACH RASTER INTERRUPT
DIM GLOBAL COPY_FROM(128), COPY_TO(128)
COPY_TO_ADDR = $8150
FOR Y = 0 TO 119
  COPY_FROM(Y) = $A140 + Y*40
	
	COPY_TO(Y) = COPY_TO_ADDR
	ADD COPY_TO_ADDR, 40, $8010 TO $8268
NEXT Y
FOR Y = 0 TO 7
  COPY_FROM(Y+120) = $A000 + Y*40
  COPY_TO(Y+120) = $8010 + Y*40
NEXT Y

ON RASTER CALL COPY_FRAMEBUFFER

DO
LOOP

SUB SET_PIXEL2(X, Y, PIXEL_COLOR)
  IF (PIXEL_COLOR < 0) OR (PIXEL_COLOR > 3) THEN EXIT SUB
	
  POKE FRAMEBUFFER_MEM_ADDR(X, Y), (PEEK(FRAMEBUFFER_MEM_ADDR(X, Y)) OR BITMASK(X)) AND LOW_BYTE_COLOR(X MOD 8, PIXEL_COLOR)
	POKE FRAMEBUFFER_MEM_ADDR(X, Y)+8, (PEEK(FRAMEBUFFER_MEM_ADDR(X, Y)+8) OR BITMASK(X)) AND HIGH_BYTE_COLOR(X MOD 8, PIXEL_COLOR)
END SUB

SUB SET_PIXEL(X, Y, PIXEL_COLOR)
  IF (PIXEL_COLOR < 0) OR (PIXEL_COLOR > 3) THEN EXIT SUB

  'SET THE PIXEL TO COLOR 0 NO MATTER WHAT :)
	POKE FRAMEBUFFER_MEM_ADDR(X, Y), PEEK(FRAMEBUFFER_MEM_ADDR(X, Y)) AND (NOT BITMASK(X))
	POKE FRAMEBUFFER_MEM_ADDR(X, Y)+8, PEEK(FRAMEBUFFER_MEM_ADDR(X, Y)+8) AND (NOT BITMASK(X))
	
	'EXIT THE SUB IF THE PIXEL COLOR IS SUPPOSED TO BE SET TO COLOR 0
	IF PIXEL_COLOR = 0 THEN EXIT SUB

  'WILL SET THE PIXEL COLOR TO COLOR 1 IF PIXEL_COLOR IS EQUAL TO 1 OR 3
	IF PIXEL_COLOR <> 2 THEN POKE(FRAMEBUFFER_MEM_ADDR(X, Y)), PEEK(FRAMEBUFFER_MEM_ADDR(X, Y)) OR BITMASK(X)
	
	'WILL SET THE PIXEL COLOR TO COLOR 2 IF PIXEL_COLOR = 2
	'WILL SET THE PIXEL COLOR TO COLOR 3 IF PIXEL_COLOR = 3
	IF PIXEL_COLOR <> 1 THEN POKE(FRAMEBUFFER_MEM_ADDR(X, Y)+8), PEEK(FRAMEBUFFER_MEM_ADDR(X, Y)+8) OR BITMASK(X)
END SUB 

SUB COPY_FRAMEBUFFER
  COPY COPY_FROM(RASTER), 40 TO COPY_TO(RASTER)
END SUB