|
Subject: Re: [stella] Games that do bad things to HMOVE... From: bwmott@xxxxxxxxxxxx Date: Thu, 23 Apr 1998 17:15:16 -0400 (EDT) |
> So they waste 71 cycles and hit HMOVE ending on cycle 74. Thus they
> are hitting HMOVE two cycles before HBLANK begins.
>
> Now, the best I can figure is that by hitting HMOVE at this time it
> reduces the amount of motion applied to the objects by 6 clocks.
> So that instead of moving P0 by 8 pixels and P1 by 7 pixels it
> moves them by 2 and 1 pixels.
Well, my guesses were not quite right :-) I wrote a small test driver
to see how HMOVE works when it's hit at cycle 74 (it's a modified version
of castars.a65) and here's what I found out:
When hitting HMOVE at cycle 74 the upper nibble of HMP1 has the
following meaning:
0 -8
1 -9
2 -10
3 -11
4 -12
5 -13
6 -14
7 -15
8 0
9 -1
A -2
B -3
C -4
D -5
E -6
F -7
So for the example I gave with Heman it really moves P0 by 0 pixels and
P1 by -1 pixels.
Hitting HMOVE at cycle 74 does NOT cause HMOVE blanks so it looks like this
is a pretty interesting result.
The only bad thing I see is that the meaning of HMP0 isn't quite the
same as it is for HMP1. When the high nibble of HMP0 is F it
moves P0 by -8 instead of -7 :-(
I'm including the code below if you want to give it a try. Note I
didn't count scanlines so it may roll on your TV.
The program basically scans through the 16 HMP1 values while HMP0 is
set to $80. At the very bottom of the screen the lines are positions
using the same RESPx loop, but hitting HMOVE at the start of HBLANK.
Later,
Brad
processor 6502
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; TIA (Stella) write-only registers
;
Vsync equ $00
Vblank equ $01
Wsync equ $02
Nusiz0 equ $04
Nusiz1 equ $05
ColuP0 equ $06
ColuP1 equ $07
ColuBK equ $09
Ctrlpf equ $0A
Resp0 equ $10
Resp1 equ $11
Grp0 equ $1b
Grp1 equ $1c
Hmp0 equ $20
Hmp1 equ $21
Hmove equ $2A
Hmclr equ $2B
;
; 6532 (RIOT) registers
;
Swcha equ $0280
Swacnt equ $0281
Swchb equ $0282
Swbcnt equ $0283
Intim equ $0284
Tim64t equ $0296
;
; ROM definitions
;
RomStart equ $F000
RomEnd equ $FFFF
IntVectors equ $FFFA
org $F800
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; Program initialisation
;
MotionTable: dc.b $00, $10, $20, $30, $40, $50, $60, $70
dc.b $80, $90, $a0, $b0, $c0, $d0, $e0, $0f
Cart_Init:
SEI ; Disable interrupts.:
CLD ; Clear "decimal" mode.
LDX #$FF
TXS ; Clear the stack
Common_Init:
LDX #$28 ; Clear the TIA registers ($04-$2C)
LDA #$00
TIAClear:
STA $04,X
DEX
BPL TIAClear ; loop exits with X=$FF
LDX #$FF
RAMClear:
STA $00,X ; Clear the RAM ($FF-$80)
DEX
BMI RAMClear ; loop exits with X=$7F
LDX #$FF
TXS ; Reset the stack
IOClear:
STA Swbcnt ; console I/O always set to INPUT
STA Swacnt ; set controller I/O to INPUT
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;
; Main program loop
;
Start:
LDA #$02
STA Wsync ; Wait for horizontal sync
STA Vblank ; Turn on Vblank
STA Vsync ; Turn on Vsync
STA Wsync ; Leave Vsync on for 3 lines
STA Wsync
STA Wsync
LDA #$00
STA Vsync ; Turn Vsync off
LDA #43 ; Vblank for 37 lines
STA Tim64t ; 43*64intvls=2752=8256colclks=36.2lines
VblankLoop:
LDA Intim
BNE VblankLoop ; wait for vblank timer
STA Wsync ; finish waiting for the current line
STA Vblank ; turn off Vblank
LDA #$00 ;black
STA ColuBK
LDA #$0e ;white
STA ColuP0
; LDA #$aa
STA ColuP1
LDA #$AA ; playfield color
STA $8
LDA #1
STA Nusiz0
STA Nusiz1
LDA #1 ; reflected playfield
STA Ctrlpf
LDA #$f0
STA $d
LDX #$00
MotionLoop: STA Wsync
LDA #0
STA Grp0
STA Grp1
LDA #$80
STA Hmp0
LDA MotionTable,X
STA Hmp1
LDA #$07
STA Wsync ; waste the rest of the line
NOP
TAY
pause1: DEY
BNE pause1
STA Resp0
STA Resp1
; The following loop does the HMOVE at 74 cycles which seems to keep
; the HMOVE blanks from appearing, however, it also changes the movement
; supplied by the HMOVE
STA Wsync
LDY #$09
pause2: NOP
DEY
BPL pause2
STA Hmove
LDA #$AA
STA Grp0
STA Grp1
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
Screen: LDY #6
B3: STA Wsync
DEY
BNE B3
INX
CPX #$10
BNE MotionLoop
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
STA Wsync
LDA #$80
STA Hmp0
LDA #$90
STA Hmp1
LDA #$07
STA Wsync ; waste the rest of the line
NOP
TAY
pause3: DEY
BNE pause3
STA Resp0
STA Resp1
STA Wsync
STA Hmove
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
LDY #40
B4: STA Wsync
DEY
BNE B4
LDA #$02
STA Vblank ;turn on Vblank
LDX #30
END: STA Wsync
DEX
BNE END
JMP Start
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;
; Set up the 6502 interrupt vector table
;
ORG IntVectors
NMI dc.w Cart_Init
Reset dc.w Cart_Init
IRQ dc.w Cart_Init
; END
--------------------------------------------------------------------------
Bradford W. Mott (bwmott@xxxxxxx) Computer Science Department
http://www4.ncsu.edu/~bwmott/www North Carolina State University
--------------------------------------------------------------------------
--
Archives (includes files) at http://www.biglist.com/lists/stella/archives/
Unsub & more at http://www.biglist.com/lists/stella/stella.html
| Current Thread |
|---|
|
| <- Previous | Index | Next -> |
|---|---|---|
| Re: [stella] Games that do bad thin, bwmott | Thread | Re: [stella] Games that do bad thin, Bob Colbert |
| Re: [stella] RESPx and player posit, bwmott | Date | Re: [stella] Games that do bad thin, bwmott |
| Month |