[stella] Asymmetrical Reflected Playfield

Subject: [stella] Asymmetrical Reflected Playfield
From: Glenn Saunders <cybpunks2@xxxxxxxxxxxxx>
Date: Thu, 20 Sep 2001 23:54:38 -0700
Okay, good lesson I've learned in programming. One step at a time...

I've gone back to the drawing board with Death Derby several times and tried to do too much too fast. Hopefully this will be the last time I'll have to start from scratch and I can use this kernel as the final foundation (although there are a ton of modifications to do before it even begins to look like the Death Race screen again).

This is not a major achievement in any real sense, as it's just moving the timing of the PF writes around and modifying the graphics, but to me I feel pretty proud to have gotten this kernel to work in reflected mode ;)

If someone can explain what's happening at the tail end of the scanline for why I don't seem to have as many cycles left as it seems, I'd appreciate it.




Glenn Saunders - Producer - Cyberpunks Entertainment Personal homepage: http://www.geocities.com/Hollywood/1698 Cyberpunks Entertainment: http://cyberpunks.uni.cc
; How to Draw an Asymmetric Reflected Playfield
; by Roger Williams
; Reflected mode modifications by Glenn Saunders

; with a lot of help from Nick Bensema
; (this started out as his "How to Draw a Playfield")

;Roger Williams:

; For comparison, I have tightened up Nick's code
; just a little by eliminating all the subroutine
; calling overhead, which is more like how a real
; game would work, and eliminated the scrolling and
; color effects to isolate them from the pure act of
; displaying a bitmap.
;
	processor 6502
	include vcs.h

	org $F000
       
Temp       = $80
ScanLine   = $90
ScanPix    = $91
PFColorRAM = $92
;FrameCounter = $93 was going to try some color cycling


Start
;
	SEI  ; Disable interrupts, if there are any.
	CLD  ; Clear BCD math bit.
	LDX  #$FF
	TXS  ; Set stack to beginning.
	LDA #0
B1      STA 0,X
	DEX
	BNE B1

MainLoop
	LDX  #0	   ;vertical blank
	LDA  #2
	STA  WSYNC  
	STA  WSYNC
	STA  WSYNC
	STA  VSYNC ;Begin vertical sync.
	STA  WSYNC ; First line of VSYNC
	STA  WSYNC ; Second line of VSYNC.

	LDA  #44   ;init timer for overscan
	STA  TIM64T

	STA  WSYNC ; Third line of VSYNC.
	STA  VSYNC ; (0)


	LDA #0
	STA COLUBK  ; Background will be black.

VBLOOP	LDA INTIM
	BNE VBLOOP ; Whew!
	STA WSYNC
	STA VBLANK  ;End the VBLANK period with a zero.
	LDA PF_Reflect
	STA CTRLPF  ; set playfield to reflect - G.S.
	LDA #0
	;
	STA COLUP0
	STA COLUP1; blacking out player colors
	LDA #$34 ; set playfield color to deep red
	STA COLUPF
	STA PFColorRAM
	;
	LDA #191 
	STA ScanLine
	LDA #6
	STA ScanPix
	;
	; The height of the screen is not an even multiple of 36
	; (the character height including blank.)  Here we waste
	; the extra lines.
	;
	; NB we may do away with this by adding 2 scans to each
	; char in the blank or fore and aft bigpix lines
	;
	LDX #12
	LDA #0
	STA PF0
	STA PF1
	STA PF2; zero out player shapes
VPosition
	STA WSYNC
	DEC ScanLine
	DEX
	BNE VPosition
	;
	LDX #6
ScanLoop
	DEC ScanPix		;next screen pixel line
	BNE ScanGo
	LDA #5
	STA ScanPix
	DEX			;next big pixel line
	BNE ScanGo
	LDX #6
ScanGo
	STA WSYNC
	;
	; Time to begin cycle counting
	;
	LDA PFData0,X           ;[0]+4
	STA PF0                 ;[4]+3 = *7*   < 23	;PF0 visible
	
	LDA PFData1,X           ;[7]+4
	STA PF1                 ;[11]+3 = *14*  < 29	;PF1 visible
	
	LDA PFData2,X           ;[14]+4
	STA PF2                 ;[18]+3 = *21*  < 40	;PF2 visible

	nop			;[21]+2
	nop			;[23]+2
	nop			;[25]+2
	;six cycles available  Might be able to do something here
	
	LDA PFData0b,X          ;[27]+4

	;PF0 no longer visible, safe to rewrite
	STA PF0                 ;[31]+3 = *34* 

	LDA PFData1b,X		;[34]+4

	;PF1 no longer visible, safe to rewrite
	STA PF1			;[38]+3 = *41*  


	LDA PFData2b,X		;[41]+4
	
	;PF2 rewrite must begin at exactly cycle 45!!, no more, no less
	STA PF2			;[45]+2 = *47*  ; > 46 PF2 no longer visible

	;76-47 = 29 cycles left per scanline available for
	; further calculations (i.e. sprites), not counting the rest of the
	; existing code below that branches off and changes the indexing to the letter graphics

	;nop adding even this one nop, however, breaks this kernel!
	;-Glenn Saunders

	DEC ScanLine
	BNE ScanLoop
	;
	LDA #2
	STA WSYNC  ;Finish scanline 192.
	STA VBLANK ; Make TIA output invisible,
	;
	LDA #0
	STY PF0
	STY PF1
	STY PF1
	STY GRP0
	STY GRP1
	STY ENAM0
	STY ENAM1
	STY ENABL

OverScan
	LDX #30
KillLines
	STA WSYNC
	DEX
	BNE KillLines

	JMP  MainLoop      ;Continue forever.


	org $FF00 ; *********************** GRAPHICS DATA

;               REFLECTED PLAYFIELD
;   PF0|   PF1  |  PF2   |   PF2b |   PF1b |PF0b|
;  4567|76543210|01234567|76543210|01234567|7654|


PFData0  ;D       4 5 6 7
	.byte %00000000
	.byte %00000000
	.byte %00110000
	.byte %01010000
	.byte %01010000
	.byte %01010000
	.byte %00110000
PFData1  ;EA      7 6 5 4 3 2 1 0
	.byte %00000000
	.byte %00000000
	.byte %11101010
	.byte %10001010
	.byte %11001110
	.byte %10001010
	.byte %11100100


PFData2  ;TH      0 1 2 3 4 5 6 7
	.byte %00000000
	.byte %00000000
	.byte %01010010
	.byte %01010010
	.byte %01110010
	.byte %01010010
	.byte %01010111
	
        
PFData2b ;DE   76543210;<--- scanning order
	.byte %00000000
	.byte %00000000
	.byte %01100111
	.byte %01010100
	.byte %01010110
	.byte %01010100
	.byte %01100111

	
PFData1b;RB    01234567;<--- scanning order
	.byte %00000000
	.byte %00000000
	.byte %01101010
	.byte %10101010
	.byte %01100110
	.byte %10101010
	.byte %01100110

PFData0b;Y     7654    ;<--- scanning order
	.byte %00000000
	.byte %00000000
	.byte %00100000
	.byte %00100000
	.byte %01110000
	.byte %01010000
	.byte %01010000
	
        
 
	org $FFFC
        .word Start
        .word Start

Attachment: asymet_reflect.bin
Description: Binary data

Current Thread