
		RTS

; In PF0 and PF2, the most significant bit (bit 7) is on the RIGHT
; side.  In PF1, the most significant bit is on the LEFT side.  This
; means that relative to PF0 and PF2, PF1 has a reversed bit order.
; It's just really weird.
;
;    PF0  |     PF1       |      PF2
;  4 5 6 7|7 6 5 4 3 2 1 0|0 1 2 3 4 5 6 7


;---------
; DRAWOBJECTS

DRAWOBJECTS

	; PASS
	;	TOGGLE = FRAME NUMBER (1 OR 2)

	; ROUTINE EITHER DRAWS OR UNDRAWS OBJECTS, DEPENDING ON REQUIRED
	; PRESENCE IN FRAME BUFFER.  OBJECTS USUALLY REMAIN DRAWN.
	; OBJECT FLAG CAN OVERRIDE AND FORCE DRAW

	; NOW WE NEED TO ADD THOSE "JUST-THIS-FRAME" COLOURS
	; FRAME		ACTION
	;	0		ONLY SHOW COLOUR 1 AND COLOUR 3 OBJECTS
	;				IE: (UN)DRAW COLOUR 1
	;	1		ONLY SHOW COLOUR 2 AND COLOUR 3 OBJECTS
	;				IE: (UN)DRAW COLOUR 2

	; LOOP THROUGH OBJECTS, (UN)DRAWING ONLY TRANSIENT COLOURS
	; OBJECT (UN)DRAW CAN BE FORCED (D7 OF OBJFLAGS)

		LDX #OBJSIZE-1

FOROBJ	LDY OBJPOS,X			; POSITION IN VIRTUAL SCREEN
		BMI NEXTOBJ				; NOT PRESENT

			; COLOUR 0 IS "ON" ALL THE TIME
			; COLOUR 1 IS ON DURING FRAME 1 ONLY
			; COLOUR 2 IS ON DURING FRAME 2 ONLY
			; COLOUR 3 IS ON DURING FRAME 1 AND 2

		LDA OBJFLAGS,X
		BMI FORCED
		EOR TOGGLE				; FRAME 1 OR 2
		AND #3

			; NOW,	F0 C0 -> 1
			;		F0 C1 -> 0
			;		F0 C2 -> 3
			;		F0 C3 -> 2
			; AND,	F1 C0 -> 2
			;		F1 C1 -> 3
			;		F1 C2 -> 0
			;		F1 C3 -> 1

		BNE NEXTOBJ				; NEAT!!

FORCED

	; HAVE DETERMINED THAT DRAW/ERASE IS REQUIRED
		
		LDA OBJPATTERN,X
		EOR PLAYFIELD,Y
		STA PLAYFIELD,Y

		LDA OBJPATTERN,X
		EOR PLAYFIELD+6,Y
		STA PLAYFIELD+6,Y

		LDA OBJPATTERNB,X
		EOR PLAYFIELD+1,Y
		STA PLAYFIELD+1,Y

		LDA OBJPATTERNB,X
		EOR PLAYFIELD+7,Y
		STA PLAYFIELD+7,Y

NEXTOBJ	DEX
		BPL FOROBJ

		RTS


; --------
; INIT1CE

	; ONE-TIME INITIALIZATION
	; HAPPENS AT SYSTEM RESET, NO OTHER TIME

INIT1CE

		LDA #D1
		STA VBLANK				; START WITH TIA DISABLED

		LDA #D1
		STA CTRLPF				; SCORE (COLOUR SEP)


	; COPY THE PLAYFIELD FROM THE TABLE

		LDX #93

PLAYFILLED

		LDA BITMAP,X
		STA PLAYFIELD,X
		LDA BITMAP+1,X
		STA PLAYFIELD+1,X
		LDA BITMAP+2,X
		STA PLAYFIELD+2,X

		TXA
		SEC
		SBC #3
		TAX
		BCS PLAYFILLED



	; INIT OBJECTS TO NONE

		LDX #OBJSIZE-1
		LDA #$80				; D7 = INACTIVE
INITOBJ	STA OBJPOS,X
		DEX
		BPL INITOBJ


	; ADD A COUPLE OF TEST OBJECTS

		LDA #31
		STA OBJPOS
		LDA #1
		STA OBJFLAGS
		LDA #%11111111
		STA OBJPATTERN
		LDA #0
		STA OBJPATTERNB

		LDA #19
		STA OBJPOS+1
		LDA #2
		STA OBJFLAGS+1
		LDA #%11111111
		STA OBJPATTERN+1
		LDA #0
		STA OBJPATTERNB+1


		LDA #1
		STA TOGGLE				; CYCLES 1/2/1/2...


	;	JSR DRAWOBJECTS

	; AT THIS STAGE WE HAVEN'T DRAWN COLOUR 3 OBJECTS
	; THAT COMES LATER - GIVE IT TIME :)

		RTS


BITMAP

	; JUST TREAT THIS AS A 40X24 BITMAP
	; THIS IS D0 OF 4 COLOUR PLAYFIELD

	;     PF0 <--   PF1 -->   PF2 <--   PF0 <--   PF1 -->   PF2 <--
	;     FLIP XXXX OK        FLIP      FLIP XXXX OK        FLIP
	.BYTE %11110000,%11111111,%11111111,%11110000,%11111111,%11111111
	.BYTE %00010000,%10000000,%10000000,%00000000,%00000000,%10000000
	.BYTE %00010000,%10000000,%10000000,%10010000,%11001110,%10001110
	.BYTE %00010000,%11100000,%10000000,%10010000,%11001110,%10001110
	.BYTE %00010000,%11100000,%10000000,%10010000,%11001110,%10001110
	.BYTE %00010000,%11100000,%10000000,%10010000,%11001110,%10001110
	.BYTE %00010000,%00000000,%10000000,%00000000,%00000000,%10000000
	.BYTE %00010000,%00000000,%10000000,%00000000,%00000000,%10000000
	.BYTE %00010000,%00000000,%10000000,%00000000,%00000000,%10000000
	.BYTE %00010000,%00000000,%10000000,%00000000,%00000001,%10100010
	.BYTE %00010000,%00000000,%10000000,%00000000,%00000011,%10110111
	.BYTE %00010000,%00000000,%10000000,%00000000,%00000001,%10100010
	.BYTE %11010000,%00000000,%10000000,%00000000,%00000011,%10100111
	.BYTE %11010000,%00000000,%10000000,%00000000,%00000001,%10100010
	.BYTE %00010000,%00000000,%10000000,%00000000,%00000000,%10000000
	.BYTE %11110000,%11111111,%11111111,%11110000,%11111111,%11111111
	;          ^^^^                          ^^^^
	;          UNUSED                        UNUSED


	; COLOURS FOR 4-COLOUR SCREEN
	; THESE COLOURS CORRESPOND TO EACH OF 2 FRAMES OF THE MULTIPLEXED
	; DISPLAY.  THERE ARE TWO BKCOLS AVAILABLE, AND TWO SIDES OF THE SCREEN
	; THE 4 COLOURS ARE FROM COMBINATION OF THE TWO FRAME MULTIPLEX, AND
	; THE COMBINATION DISPLAY ON THESE FRAMES.  COLOURS ARE COMBINIATIONS
	; HOPEFULLY THIS WON'T FLICKER TO BUGGERY ON THE REAL THING, LIKE IT
	; DOES ON MY EMULATOR!

	;			FR.1	FR.2
BKCOL	.BYTE	100,	100
PFCOL1	.BYTE	16,		196
PFCOL2	.BYTE	22,		45


;--------
; SYSTEM VECTORS

	org $FFFC
	.WORD START						; NMI?
	.WORD START						; RESET VECTOR

                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                             
		RTS

; In PF0 and PF2, the most significant bit (bit 7) is on the RIGHT
; side.  In PF1, the most significant bit is on the LEFT side.  This
; means that relative to PF0 and PF2, PF1 has a reversed bit order.
; It's just really weird.
;
;    PF0  |     PF1       |      PF2
;  4 5 6 7|7 6 5 4 3 2 1 0|0 1 2 3 4 5 6 7


;---------
; DRAWOBJECTS

DRAWOBJECTS

	; PASS
	;	TOGGLE = FRAME NUMBER (1 OR 2)

	; ROUTINE EITHER DRAWS OR UNDRAWS OBJECTS, DEPENDING ON REQUIRED
	; PRESENCE IN FRAME BUFFER.  OBJECTS USUALLY REMAIN DRAWN.
	; OBJECT FLAG CAN OVERRIDE AND FORCE DRAW

	; NOW WE NEED TO ADD THOSE "JUST-THIS-FRAME" COLOURS
	; FRAME		ACTION
	;	0		ONLY SHOW COLOUR 1 AND COLOUR 3 OBJECTS
	;				IE: (UN)DRAW COLOUR 1
	;	1		ONLY SHOW COLOUR 2 AND COLOUR 3 OBJECTS
	;				IE: (UN)DRAW COLOUR 2

	; LOOP THROUGH OBJECTS, (UN)DRAWING ONLY TRANSIENT COLOURS
	; OBJECT (UN)DRAW CAN BE FORCED (D7 OF OBJFLAGS)

		LDX #OBJSIZE-1

FOROBJ	LDY OBJPOS,X			; POSITION IN VIRTUAL SCREEN
		BMI NEXTOBJ				; NOT PRESENT

			; COLOUR 0 IS "ON" ALL THE TIME
			; COLOUR 1 IS ON DURING FRAME 1 ONLY
			; COLOUR 2 IS ON DURING FRAME 2 ONLY
			; COLOUR 3 IS ON DURING FRAME 1 AND 2

		LDA OBJFLAGS,X
		BMI FORCED
		EOR TOGGLE				; FRAME 1 OR 2
		AND #3

			; NOW,	F0 C0 -> 1
			;		F0 C1 -> 0
			;		F0 C2 -> 3
			;		F0 C3 -> 2
			; AND,	F1 C0 -> 2
			;		F1 C1 -> 3
			;		F1 C2 -> 0
			;		F1 C3 -> 1

		BNE NEXTOBJ				; NEAT!!

FORCED

	; HAVE DETERMINED THAT DRAW/ERASE IS REQUIRED
		
		LDA OBJPATTERN,X
		EOR PLAYFIELD,Y
		STA PLAYFIELD,Y

		LDA OBJPATTERN,X
		EOR PLAYFIELD+6,Y
		STA PLAYFIELD+6,Y

		LDA OBJPATTERNB,X
		EOR PLAYFIELD+1,Y
		STA PLAYFIELD+1,Y

		LDA OBJPATTERNB,X
		EOR PLAYFIELD+7,Y
		STA PLAYFIELD+7,Y

NEXTOBJ	DEX
		BPL FOROBJ

		RTS


; --------
; INIT1CE

	; ONE-TIME INITIALIZATION
	; HAPPENS AT SYSTEM RESET, NO OTHER TIME

INIT1CE

		LDA #D1
		STA VBLANK				; START WITH TIA DISABLED

		LDA #D1
		STA CTRLPF				; SCORE (COLOUR SEP)


	; COPY THE PLAYFIELD FROM THE TABLE

		LDX #93

PLAYFILLED

		LDA BITMAP,X
		STA PLAYFIELD,X
		LDA BITMAP+1,X
		STA PLAYFIELD+1,X
		LDA BITMAP+2,X
		STA PLAYFIELD+2,X

		TXA
		SEC
		SBC #3
		TAX
		BCS PLAYFILLED



	; INIT OBJECTS TO NONE

		LDX #OBJSIZE-1
		LDA #$80				; D7 = INACTIVE
INITOBJ	STA OBJPOS,X
		DEX
		BPL INITOBJ


	; ADD A COUPLE OF TEST OBJECTS

		LDA #31
		STA OBJPOS
		LDA #1
		STA OBJFLAGS
		LDA #%11111111
		STA OBJPATTERN
		LDA #0
		STA OBJPATTERNB

		LDA #19
		STA OBJPOS+1
		LDA #2
		STA OBJFLAGS+1
		LDA #%11111111
		STA OBJPATTERN+1
		LDA #0
		STA OBJPATTERNB+1


		LDA #1
		STA TOGGLE				; CYCLES 1/2/1/2...


	;	JSR DRAWOBJECTS

	; AT THIS STAGE WE HAVEN'T DRAWN COLOUR 3 OBJECTS
	; THAT COMES LATER - GIVE IT TIME :)

		RTS


BITMAP

	; JUST TREAT THIS AS A 40X24 BITMAP
	; THIS IS D0 OF 4 COLOUR PLAYFIELD

	;     PF0 <--   PF1 -->   PF2 <--   PF0 <--   PF1 -->   PF2 <--
	;     FLIP XXXX OK        FLIP      FLIP XXXX OK        FLIP
	.BYTE %11110000,%11111111,%11111111,%11110000,%11111111,%11111111
	.BYTE %00010000,%10000000,%10000000,%00000000,%00000000,%10000000
	.BYTE %00010000,%10000000,%10000000,%10010000,%11001110,%10001110
	.BYTE %00010000,%11100000,%10000000,%10010000,%11001110,%10001110
	.BYTE %00010000,%11100000,%10000000,%10010000,%11001110,%10001110
	.BYTE %00010000,%11100000,%10000000,%10010000,%11001110,%10001110
	.BYTE %00010000,%00000000,%10000000,%00000000,%00000000,%10000000
	.BYTE %00010000,%00000000,%10000000,%00000000,%00000000,%10000000
	.BYTE %00010000,%00000000,%10000000,%00000000,%00000000,%10000000
	.BYTE %00010000,%00000000,%10000000,%00000000,%00000001,%10100010
	.BYTE %00010000,%00000000,%10000000,%00000000,%00000011,%10110111
	.BYTE %00010000,%00000000,%10000000,%00000000,%00000001,%10100010
	.BYTE %11010000,%00000000,%10000000,%00000000,%00000011,%10100111
	.BYTE %11010000,%00000000,%10000000,%00000000,%00000001,%10100010
	.BYTE %00010000,%00000000,%10000000,%00000000,%00000000,%10000000
	.BYTE %11110000,%11111111,%11111111,%11110000,%11111111,%11111111
	;          ^^^^                          ^^^^
	;          UNUSED                        UNUSED


	; COLOURS FOR 4-COLOUR SCREEN
	; THESE COLOURS CORRESPOND TO EACH OF 2 FRAMES OF THE MULTIPLEXED
	; DISPLAY.  THERE ARE TWO BKCOLS AVAILABLE, AND TWO SIDES OF THE SCREEN
	; THE 4 COLOURS ARE FROM COMBINATION OF THE TWO FRAME MULTIPLEX, AND
	; THE COMBINATION DISPLAY ON THESE FRAMES.  COLOURS ARE COMBINIATIONS
	; HOPEFULLY THIS WON'T FLICKER TO BUGGERY ON THE REAL THING, LIKE IT
	; DOES ON MY EMULATOR!

	;			FR.1	FR.2
BKCOL	.BYTE	100,	100
PFCOL1	.BYTE	16,		196
PFCOL2	.BYTE	22,		45


;--------
; SYSTEM VECTORS

	org $FFFC
	.WORD START						; NMI?
	.WORD START						; RESET VECTOR

