|
Subject: [stella] DD_0003 From: Glenn Saunders <cybpunks2@xxxxxxxxxxxxx> Date: Sun, 23 Sep 2001 19:34:28 -0700 |
Glenn Saunders - Producer - Cyberpunks Entertainment Personal homepage: http://www.geocities.com/Hollywood/1698 Cyberpunks Entertainment: http://cyberpunks.uni.cc
Attachment:
DD_0003.bin
Description: Binary data
;Death Derby 2001
; By Glenn Saunders
;LINEAGE:
; 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
; CONSTANTS
RowHeight = 15 ; 15+1 = 16 lines
RowsPerScreen = 11 ; 11+1 = 12 rows
SafeZone = %10010000
SEG.U vars
org $80
Temp ds 1
CurrentScanLine ds 1
CurrentRow ds 1
PFColorRAM ds 1
PF1DataRAM ds 12
PF2DataRAM ds 12
PF1bDataRAM ds 12
PF2bDataRAM ds 12
SEG code
org $F000
;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.
; CLEAR OUT RAM
LDA #0
B1 STA 0,X
DEX
BNE B1
; I know there is a way to do this cleaner
LDX #RowsPerScreen
InitializeTombstones; copy from ROM to RAM
LDA PF1Data,X
STA PF1DataRAM,X
LDA PF2Data,X
STA PF2DataRAM,X
LDA PF1bData,X
STA PF1bDataRAM,X
LDA PF2bData,X
STA PF2bDataRAM,X
DEX
BNE InitializeTombstones
LDA PF1Data
STA PF1DataRAM
LDA PF2Data
STA PF2DataRAM
LDA PF1bData
STA PF1bDataRAM
LDA PF2bData
STA PF2bDataRAM
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 #$34 ; set playfield color to deep red
STA COLUPF
LDA #PF_Reflect
STA CTRLPF ; set playfield to reflect - G.S.
LDA #0
;
STA COLUP0
STA COLUP1; blacking out player colors
;STA PFColorRAM
;
LDA #200
STA CurrentScanLine
LDA #RowHeight
STA CurrentRow
;
; 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
;
LDA #0
STA PF0
STA PF1
STA PF2; zero out playfield
LDX #19 ; reserve 15 CurrentScanLines for the score
DrawScore
STA WSYNC
DEC CurrentScanLine
DEX
BNE DrawScore
LDX #RowsPerScreen
TopBorder ; 2 lines
LDA #$FF
STA PF0 ; draw a solid line
STA PF1
STA PF2
DEC CurrentScanLine
STA WSYNC
LDY #SafeZone
STY PF0 ; now PF0 is in the proper shape for the rest of the screen
;A is still $FF
STA PF1
STA PF2
;NO WSYNC necessary here because ScanGo will finish the line off
ScanLoop
DEC CurrentRow ;next screen pixel line
BNE ScanGo
LDA #RowHeight; if counter reaches zero, reset to 15
STA CurrentRow
DEX ;next big pixel line
BNE ScanGo
;LDX #10
ScanGo
STA WSYNC
; Time to begin cycle counting
; 0
;STA.W HMOVE ;+4 4
NOP ;+2 2
NOP ;+2 4
;will probably have to do an HMOVE on every line to
;simplify logic. HMOVE is only necessary for the missiles
LDA <PF1DataRAM,X ;+4 8
STA PF1 ;+3 = *11* < 29 ;PF1 visible
LDA <PF2DataRAM,X ;+4 15
STA PF2 ;+3 = *19* < 40 ;PF2 visible
nop ;+2 20
nop ;+2 22
nop ;+2 24
nop ;+2 26
nop ;+2 28
nop ;+2 30
nop ;+2 32
nop ;+2 34
LDA <PF1bDataRAM,X ;+4 38
;PF1 no longer visible, safe to rewrite
STA PF1 ;+3 = *41*
LDA <PF2bDataRAM,X ;+3 44
;PF2 rewrite must begin at exactly cycle 45!!, no more, no less
STA PF2 ;+3 = *47* ; > 46 PF2 no longer visible
DEC CurrentScanLine
BNE ScanLoop2
;
LDA #2
STA WSYNC ;Finish CurrentScanLine 189.
JMP DoBorder
ScanLoop2
DEC CurrentRow ;next screen pixel line
BNE ScanGo2
LDA #RowHeight; if counter reaches zero, reset to 15
STA CurrentRow
DEX ;next big pixel line
BNE ScanGo2
;LDX #10
ScanGo2; do all the sprite routines here
STA WSYNC
LDA #0
STA PF1
STA PF2
DEC CurrentScanLine
BNE ScanLoop
DoBorder
LDA #$FF
STA PF0
STA PF1
STA PF2
STA WSYNC
;STA WSYNC
STA VBLANK ; Make TIA output invisible,
;
LDA #0
STA PF0
STA PF1
STA PF2
STA GRP0
STA GRP1
STA ENAM0
STA ENAM1
STA ENABL
OverScan
LDX #22
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|
;SafeZone ; 7654----
; .byte %10011001
PF1Data ; 76543210
.byte %01010101
.byte %10101010
.byte %01010101
.byte %10101010
.byte %01010101
.byte %10101010
.byte %01010101
.byte %10101010
.byte %01010101
.byte %10101010
.byte %01010101
.byte %10101010
PF2Data ; 01234567
.byte %10101010
.byte %01010101
.byte %10101010
.byte %01010101
.byte %10101010
.byte %01010101
.byte %10101010
.byte %01010101
.byte %10101010
.byte %01010101
.byte %10101010
.byte %01010101
PF2bData ; 76543210;<--- scanning order
.byte %01010101
.byte %10101010
.byte %01010101
.byte %10101010
.byte %01010101
.byte %10101010
.byte %01010101
.byte %10101010
.byte %01010101
.byte %10101010
.byte %01010101
.byte %10101010
PF1bData; 01234567;<--- scanning order
.byte %10101010
.byte %01010101
.byte %10101010
.byte %01010101
.byte %10101010
.byte %01010101
.byte %10101010
.byte %01010101
.byte %10101010
.byte %01010101
.byte %10101010
.byte %01010101
org $FFFC
.word Start
.word Start
| Current Thread |
|---|
|
| <- Previous | Index | Next -> |
|---|---|---|
| RE: [stella] colours.bin (or is it , Nicolás Olhaberry | Thread | Re: [stella] DD_0003, Thomas Jentzsch |
| Re: [stella] Asymmetrical Reflected, Erik Mooney | Date | [stella] Fwd: Vault Assault was tra, Joe Grand |
| Month |