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