Re: [stella] Demo #1 of my 4 colour playfield game "PUSH"

Subject: Re: [stella] Demo #1 of my 4 colour playfield game "PUSH"
From: emooney@xxxxxxxxxxxxxxxx (Erik Mooney)
Date: Sun, 10 May 1998 17:06:22 GMT
>I'm concerned at my draw code - am I generating an acceptable frame?
>Does the TV synch OK?

No.

>I'd really like some feedback.  If you think its interesting, say so.  If
>you think it sucks, tell me why.  Positive response will encourage me to
>continue sharing source - otherwise I'll go native.

It might be interesting, but all it does is roll the picture on my TV.

>OBJPATTERN	EQU OBJPOS			+ OBJSIZE
>OBJPATTERNB	EQU OBJPATTERN		+ OBJSIZE
>	; WHOO BOY THERE'S GONNA BE SOME PROBLEMS WITH BIT SHIFTING
>	; TO MOVE THE OBJECT PATTERNS.  PROBABLY BETTER TO THINK ABOUT
>	; ROM TABLES FOR THIS STUFF

Do you always program in all caps? Hard on the eyes :)

>	; TYPICAL FRAME CONSISTS OF 3 VERTICAL SYNC (VSYNC) LINES,
>	; 37 VERTICAL BLANK (VBLANK) LINES,
>	; 192 TV PICTURE LINES
>	; 30 OVERSCAN LINES

Correct.

>	; WE HAVE JUST 37 LINES (@2812 CYCLES) OF VBLANK, SO WE HAVE TO MAKE
>	; SURE THE SCREEN DRAW DOESN'T GET STOMPED ON.  THE TIMER WILL TELL
>	; US IF WE'VE SCREWED UP.  TIMER DONE JUST BEFORE THE LAST WSYNC TO
>	; GIVE MAXIMUM POSSIBLE CYCLE COUNT AVAILABILITY/ACCURACY
>
>		LDA #43					; WELLL... 43.89..
>		STA TIM64T				; WE HAVE 37 LINES (= 2812 CYCLES)
>								; UH... LESS THE 3 FOR THE LINE BELOW

The cycle/line counts here need not be exact... an extra line one way or
the other won't stop the TV from syncing.
							
>	; THE KERNEL
>	; WE HAVE TO DRAW THE SCREEN TOO?  SHEESH, WHAT IS THIS... A 2600?
>	; YEAH, THATS RIGHT... LINE BY LINE WE HAVE TO HOLD HANDS WITH THE
>	; TIA, PASSING IT DATA SO THAT IT DRAWS THE SCREEN FOR US.  NICE.
>	; NOT!  GOOD FOR NOSTALGIA, THOUGH.  WHY, BACK IN MY DAY...

Enough editorializing... will you write the damn code already? :)

>DRAWSCREEN
>
>	; WAIT FOR VERTICAL BLANK PERIOD TO END
>	; TIMER COUNTS DOWN 1 EVERY 64 CYCLES, SO JUST WAIT FOR IT
>	; IF ITS OVER-TIME ALREADY, WE COULD BE IN TROUBLE, AS THE TIMER
>	; COUNTS UP WHEN IT REACHES 0. DON'T GO OVER-TIME!!
>
>ENDVB	LDA INTIM
>		BNE ENDVB

If you change that BNE to a BMI, and store a 42 to the timer in the first
place instead of a 43, you're in a little better shape if you do overflow.
The timer actually counts down to zero from whatever you write to it, then
continues past zero, so a BMI will pick it up even if you've gone a few
extra cycles.

>        LDX #32
>PREDRAW	STA WSYNC
>        DEX
>        BNE PREDRAW				; WELLL.... YEAH
>								; PUTS BLANK AREA AT TOP OF SCREEN
>								; NO DOCUMENTATION ON THIS ONE - ARBRITRARY?

Huh?  You just drew 32 blank lines at the top of the visible screen.  Was
that what you wanted?

>	;----
>	; CYCLE THRU DRAWING LINE BY LINE...
>	; TIME IS PRECIOUS HERE... THERE ARE JUST 228/3 CYCLES PER LINE
>	; AND THAT'S NOT COUNTING THE WSYNCH, SHOULD YOU BE WRITING THAT
>	; THERE ARE 68 CYCLES IN THE HBLANK PERIOD, WHICH STARTS AT THE 
>	; CONCEPTUAL BEGINNING OF A LINE ON THIS MACHINE

No.  There are 68 *pixels* in the Hblank period, which is 22.667 cycles.

>		LDY #0
>		LDX #0
>
>NEXLIN0	LDA #4
>		STA Temp0
>
>NxtLine 
>
>		STA WSYNC				; WAIT FOR START OF HBLANK
>
>	; THERE ARE 68 CYCLES IN THE HBLANK PERIOD.
>	; WE NEED TO HAVE EACH PF BYTE WRITTEN BEFORE THE SCAN REQUIRES IT
>
>		LDA PLAYFIELD,X
>        STA PF0
>        LDA PLAYFIELD+1,X
>        STA PF1
>        LDA PLAYFIELD+2,X
>		STA PF2
>
>        NOP
>        NOP
>        NOP
>        NOP
>        NOP
>
>        ; RIGHT PF
>		
>		LDA PLAYFIELD+3,X
>        STA PF0
>	    LDA PLAYFIELD+4,X
>        STA PF1
>        LDA PLAYFIELD+5,X
>        STA PF2
> 
>        NOP
>        NOP
>        NOP
>        NOP
>        NOP
>        NOP
>
> 
>	; LINE 2
>
>		NOP
>		NOP
>		NOP
>
>		; LEFT PF
>
>		LDA PLAYFIELD,X
>        STA PF0
>        LDA PLAYFIELD+1,X
>        STA PF1
>        LDA PLAYFIELD+2,X
>		STA PF2
>
>        NOP
>        NOP
>        NOP
>        NOP
>        NOP
>
>        ; RIGHT PF
>		
>		LDA PLAYFIELD+3,X
>        STA PF0
>	    LDA PLAYFIELD+4,X
>        STA PF1
>        LDA PLAYFIELD+5,X
>        STA PF2
>
>		INY
> 
>        DEC     Temp0
>        BNE     NxtLine
>
>		CLC
>		TXA
>		ADC #6
>		TAX
>
>		CMP #96
>		BCC NEXLIN0 
>
>
>	; MAKE SURE WE HAVE A 192 LINE DISPLAY
>	; PAL MUST HAVE AN EVEN # OR THE COLOURS SCREW UP?!
>
>
>FIN		LDA #0
>		STA WSYNC
>		INY
>		CPY #192
>		BCC FIN
>
>	
>		LDA #D1
>		STA VBLANK				; END OF SCREEN - ENTER BLANKING
>	
>	; DISABLE ALL THINGS THAT COULD APPEAR ONSCREEN
>
>		LDA #0
>		STA PF0
>		STA PF1
>		STA PF1
>		STA GRP0
>		STA GRP1
>		STA ENAM0
>		STA ENAM1
>		STA ENABL
>	
>		RTS
>
>;--------
>OVERSCAN
>
>	; AFTER THE SCREEN IS DRAWN, WE HAVE 30 LINES OF OVERSCAN
>	; THIS TIME SHOULD BE USED FOR GAME LOGIC
>
>		LDX #30
>OVERLIN	STA WSYNC
>		DEX
>		BNE OVERLIN
>
>		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
>


--
Archives (includes files) at http://www.biglist.com/lists/stella/archives/
Unsub & more at http://www.biglist.com/lists/stella/stella.html

Current Thread