|
Subject: Re: [stella] Rubik Cube 3d From: Christopher Tumber <christophertumber@xxxxxxxxxx> Date: Mon, 23 Dec 2002 19:05:59 -0500 |
I'm not going to examine the top of the cube at this time as it's not as complex as the side of the cube (at least not until the side of the cube becomes a factor and I think that once we solve the side of the cube we can apply the principal to the top) Looking at it more carefully, it's actually has to be capable of displaying up to 8 different "sections" (because of the diagonals) though there are only 6 different colours. The minimum width of a section of the side is 4 pixels. The maximum width is 16 pixels Diagraming out the rows which need to be displayed: 000011111111111122222222222222223333333333333333444444444444444455555555555555556666666666667777 000000001111111122222222222222223333333333333333444444444444444455555555555555556666666677777777 000000000000111122222222222222223333333333333333444444444444444455555555555555556666777777777777 000000000000000022222222222222223333333333333333444444444444444455555555555555557777777777777777 000000000000000088882222222222223333333333333333444444444444444455555555555599997777777777777777 000000000000000088888888222222223333333333333333444444444444444455555555999999977777777777777777 000000000000000088888888888822223333333333333333444444444444444455559999999999977777777777777777 000000000000000088888888888888883333333333333333444444444444444499999999999999977777777777777777 00000000000000008888888888888888AAAA333333333333444444444444BBBB99999999999999977777777777777777 00000000000000008888888888888888AAAAAAAA3333333344444444BBBBBBBB99999999999999977777777777777777 00000000000000008888888888888888AAAAAAAAAAAA33334444BBBBBBBBBBBB99999999999999977777777777777777 00000000000000008888888888888888AAAAAAAAAAAAAAAABBBBBBBBBBBBBBBB99999999999999977777777777777777 00000000000000008888888888888888AAAAAAAAAAAAAAAABBBBBBBBBBBBBBBB99999999999999977777777777777777 00000000000000008888888888888888AAAAAAAAAAAAAAAABBBBBBBBBBBBBBBB99999999999999977777777777777777 00000000000000008888888888888888AAAAAAAAAAAAAAAABBBBBBBBBBBBBBBB99999999999999977777777777777777 Then the pattern is drawn again, with colours changed (and again). The diagonal line is actually much easier to achieve than the demo I previously posted. It's just a double-sized P0 or P1 sprite (one for either side). You then just set the bits P0=#128+64 is scanline 1, P0=#128+64+32+16 is scanline 2, P0=#128+64+32+16+8+4 is scanline 3 and #128+64+32+16+8+2+1 is scanline 4 (or 0 and change what's put into COLUPF). So, on the scanlines with a diagonal, the ONLY registers/RAM which needs to be manipulated is GRP0 and GRP1 and they need to be moved every fourth scanline. Thereafter, the COLUP0, COLUP1 and 6 RAM locations which correspond to the RAM routine to change COLUPF need to be changed for the next set of blocks (I'm still thinking a double-buffering technique so they can be changed will still drawing the current colours.) 5x8=40 cycles. But again, this can be done during any of the four scanlines. So there's lots of time. I'm pretty confident that's how they did it. My demo isn't generalised, doesn't load into RAM and could stand to be optimised but I think it'll show this is the likely soloution. Chris....
Attachment:
2blocks.bin
Description: Binary data
;BEWARE! NO STACK!!
processor 6502
include vcs.h
org $F000
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
lda #255
sta PF0
sta PF1
sta PF2
lda #1
sta CTRLPF
lda #00
STA COLUBK
lda #0
STA COLUPF
sta GRP0
sta GRP1
sta HMCLR
lda #14
sta COLUP1
sta COLUP0
DrawLogo
LDX #0
LDA #2
STA VSYNC ;Begin vertical sync.
STA WSYNC ; First line of VSYNC
STA WSYNC ; Second line of VSYNC.
LDA #41
STA TIM64T
LDA #0
STA CXCLR
STA WSYNC ; Third line of VSYNC.
STA VSYNC ; (0)
DrawScreen
LDA INTIM
BNE DrawScreen ; Whew!
STA WSYNC
STA VBLANK ;End the VBLANK period with a zero.
lda #0
sta GRP0
sta GRP1
lda #5
sta NUSIZ0 ;3 Cycles
sta NUSIZ1 ;3 Cycles
sta WSYNC
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
sta RESP0
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
sta RESP1
lda #$76
sta COLUP0
lda #$76+4
sta COLUP1
lda #0
sta HMP0
lda #16
sta HMP1
sta WSYNC
sta HMOVE
sta WSYNC
lda #128+64
sta GRP0
lda #2+1
sta GRP1
nop
nop
nop
nop
nop
nop
lda #$00
STA COLUPF
lda #$00
STA COLUPF
lda #$00
STA COLUPF
lda #$00
STA COLUPF
lda #$00
STA COLUPF
lda #$00
STA COLUPF
lda #0
STA COLUPF
sta WSYNC
lda #128+64+32+16
sta GRP0
lda #8+4+2+1
sta GRP1
nop
nop
nop
nop
nop
nop
lda #$00
STA COLUPF
lda #$00
STA COLUPF
lda #$00
STA COLUPF
lda #$00
STA COLUPF
lda #$00
STA COLUPF
lda #$00
STA COLUPF
lda #0
STA COLUPF
sta WSYNC
lda #128+64+32+16+8+4
sta GRP0
lda #32+16+8+4+2+1
sta GRP1
lda #128+16
sta HMP0
lda #64+32+16
sta HMP1
nop
lda #$00
STA COLUPF
lda #$00
STA COLUPF
lda #$00
STA COLUPF
lda #$00
STA COLUPF
lda #$00
STA COLUPF
lda #$00
STA COLUPF
lda #0
STA COLUPF
;;;;
sta WSYNC
sta HMOVE
sta HMOVE
lda #0
sta GRP0
lda #0
sta.w GRP1
; nop
lda #32+16
sta HMP1
lda #$76
STA COLUPF
lda #$00
STA COLUPF
lda #$00
STA COLUPF
lda #$00
STA COLUPF
lda #$00
STA COLUPF
lda #$76+4
STA COLUPF
lda #0
STA COLUPF
lda #$36
sta COLUP0
lda #$12
sta COLUP1
lda #128+64+32+16
sta HMP0
sta WSYNC
sta HMOVE
lda #128+64
sta GRP0
lda #2+1
sta.w GRP1
nop
nop
nop
nop
lda #$76
STA COLUPF
lda #$00
STA COLUPF
lda #$00
STA COLUPF
lda #$00
STA COLUPF
lda #$00
STA COLUPF
lda #$76+4
STA COLUPF
lda #0
STA COLUPF
sta WSYNC
lda #128+64+32+16
sta GRP0
lda #1+2+4+8
sta GRP1
nop
nop
nop
nop
nop
nop
lda #$76
STA COLUPF
lda #$00
STA COLUPF
lda #$00
STA COLUPF
lda #$00
STA COLUPF
lda #$00
STA COLUPF
lda #$76+4
STA COLUPF
lda #0
STA COLUPF
sta WSYNC
lda #128+64+32+16+8+4
sta GRP0
lda #1+2+4+8+16+32
sta GRP1
nop
nop
nop
nop
nop
nop
lda #$76
STA COLUPF
lda #$00
STA COLUPF
lda #$00
STA COLUPF
lda #$00
STA COLUPF
lda #$00
STA COLUPF
lda #$76+4
STA COLUPF
lda #0
STA COLUPF
sta WSYNC
lda #0
sta GRP0
lda #0
sta GRP1
lda #128+16
sta HMP0
lda #64+32+16
sta HMP1
nop
lda #$76
STA COLUPF
lda #$36
STA COLUPF
lda #$00
STA COLUPF
lda #$00
STA COLUPF
lda #$12
STA COLUPF
lda #$76+4
STA COLUPF
lda #0
STA COLUPF
;;;;
sta WSYNC
sta HMOVE
sta HMOVE
lda #0
sta GRP0
lda #0
sta.w GRP1
lda #32+16
sta HMP1
lda #$76
STA COLUPF
lda #$36
STA COLUPF
lda #$00
STA COLUPF
lda #$00
STA COLUPF
lda #$12
STA COLUPF
lda #$76+4
STA COLUPF
lda #0
STA COLUPF
lda #$1c
sta COLUP0
lda #$b6
sta COLUP1
lda #128+64+32+16
sta HMP0
sta WSYNC
sta HMOVE
lda #128+64
sta GRP0
lda #2+1
sta.w GRP1
nop
nop
nop
nop
lda #$76
STA COLUPF
lda #$36
STA COLUPF
lda #$00
STA COLUPF
lda #$00
STA COLUPF
lda #$12
STA COLUPF
lda #$76+4
STA COLUPF
lda #0
STA COLUPF
sta WSYNC
lda #128+64+32+16
sta GRP0
lda #1+2+4+8
sta GRP1
nop
nop
nop
nop
nop
nop
lda #$76
STA COLUPF
lda #$36
STA COLUPF
lda #$00
STA COLUPF
lda #$00
STA COLUPF
lda #$12
STA COLUPF
lda #$76+4
STA COLUPF
lda #0
STA COLUPF
sta WSYNC
lda #128+64+32+16+8+4
sta GRP0
lda #1+2+4+8+16+32
sta GRP1
nop
nop
nop
nop
nop
nop
lda #$76
STA COLUPF
lda #$36
STA COLUPF
lda #$00
STA COLUPF
lda #$00
STA COLUPF
lda #$12
STA COLUPF
lda #$76+4
STA COLUPF
lda #0
STA COLUPF
sta WSYNC
lda #0
sta GRP0
lda #0
sta GRP1
lda #64+32+16
sta HMP0
lda #128
sta HMP1
; nop
; nop
; nop
; nop
; nop
nop
lda #$76
STA COLUPF
lda #$36
STA COLUPF
lda #$1c
STA COLUPF
lda #$b6
STA COLUPF
lda #$12
STA COLUPF
lda #$76+4
STA COLUPF
lda #0
STA COLUPF
ldy #4
next:
sta WSYNC
sta HMOVE
lda #0
sta GRP0
lda #0
sta.w GRP1
nop
nop
nop
nop
lda #$76
STA COLUPF
lda #$36
STA COLUPF
lda #$1c
STA COLUPF
lda #$b6
STA COLUPF
lda #$12
STA COLUPF
lda #$76+4
STA COLUPF
lda #0
STA COLUPF
dey
bne next
lda #32
sta HMP0
sta HMP1
; Row 2
lda #128+64
sta WSYNC
sta HMOVE
sta GRP0
lda #2+1
sta GRP1
lda #$36
sta COLUP0
lda #$36+4
sta.w COLUP1
; nop
; nop
; nop
; nop
lda #$76
STA COLUPF
lda #$36
STA COLUPF
lda #$1c
STA COLUPF
lda #$b6
STA COLUPF
lda #$12
STA COLUPF
lda #$76+4
STA COLUPF
lda #0
STA COLUPF
sta WSYNC
lda #128+64+32+16
sta GRP0
lda #8+4+2+1
sta GRP1
nop
nop
nop
nop
nop
nop
lda #$76
STA COLUPF
lda #$36
STA COLUPF
lda #$1c
STA COLUPF
lda #$b6
STA COLUPF
lda #$12
STA COLUPF
lda #$76+4
STA COLUPF
lda #0
STA COLUPF
sta WSYNC
lda #128+64+32+16+8+4
sta GRP0
lda #32+16+8+4+2+1
sta GRP1
lda #128+16
sta HMP0
lda #64+32+16
sta HMP1
nop
lda #$76
STA COLUPF
lda #$36
STA COLUPF
lda #$1c
STA COLUPF
lda #$b6
STA COLUPF
lda #$12
STA COLUPF
lda #$76+4
STA COLUPF
lda #0
STA COLUPF
;;;;
sta WSYNC
sta HMOVE
sta HMOVE
lda #0
sta GRP0
lda #0
sta.w GRP1
; nop
lda #32+16
sta HMP1
lda #$36
STA COLUPF
lda #$36
STA COLUPF
lda #$1c
STA COLUPF
lda #$b6
STA COLUPF
lda #$12
STA COLUPF
lda #$36+4
STA COLUPF
lda #0
STA COLUPF
lda #$1c
sta COLUP0
lda #$76+4
sta COLUP1
lda #128+64+32+16
sta HMP0
sta WSYNC
sta HMOVE
lda #128+64
sta GRP0
lda #2+1
sta.w GRP1
nop
nop
nop
nop
lda #$36
STA COLUPF
lda #$36
STA COLUPF
lda #$1c
STA COLUPF
lda #$b6
STA COLUPF
lda #$12
STA COLUPF
lda #$36+4
STA COLUPF
lda #0
STA COLUPF
sta WSYNC
lda #128+64+32+16
sta GRP0
lda #1+2+4+8
sta GRP1
nop
nop
nop
nop
nop
nop
lda #$36
STA COLUPF
lda #$36
STA COLUPF
lda #$1c
STA COLUPF
lda #$b6
STA COLUPF
lda #$12
STA COLUPF
lda #$36+4
STA COLUPF
lda #0
STA COLUPF
sta WSYNC
lda #128+64+32+16+8+4
sta GRP0
lda #1+2+4+8+16+32
sta GRP1
nop
nop
nop
nop
nop
nop
lda #$36
STA COLUPF
lda #$36
STA COLUPF
lda #$1c
STA COLUPF
lda #$b6
STA COLUPF
lda #$12
STA COLUPF
lda #$36+4
STA COLUPF
lda #0
STA COLUPF
sta WSYNC
lda #0
sta GRP0
lda #0
sta GRP1
lda #128+16
sta HMP0
lda #64+32+16
sta HMP1
nop
lda #$36
STA COLUPF
lda #$1c
STA COLUPF
lda #$1c
STA COLUPF
lda #$b6
STA COLUPF
lda #$76+4
STA COLUPF
lda #$36+4
STA COLUPF
lda #0
STA COLUPF
;;;;
sta WSYNC
sta HMOVE
sta HMOVE
lda #0
sta GRP0
lda #0
sta.w GRP1
lda #32+16
sta HMP1
lda #$36
STA COLUPF
lda #$1c
STA COLUPF
lda #$1c
STA COLUPF
lda #$b6
STA COLUPF
lda #$76+4
STA COLUPF
lda #$36+4
STA COLUPF
lda #0
STA COLUPF
lda #$b6
sta COLUP0
lda #$12
sta COLUP1
lda #128+64+32+16
sta HMP0
sta WSYNC
sta HMOVE
lda #128+64
sta GRP0
lda #2+1
sta.w GRP1
nop
nop
nop
nop
lda #$36
STA COLUPF
lda #$1c
STA COLUPF
lda #$1c
STA COLUPF
lda #$b6
STA COLUPF
lda #$76+4
STA COLUPF
lda #$36+4
STA COLUPF
lda #0
STA COLUPF
sta WSYNC
lda #128+64+32+16
sta GRP0
lda #1+2+4+8
sta GRP1
nop
nop
nop
nop
nop
nop
lda #$36
STA COLUPF
lda #$1c
STA COLUPF
lda #$1c
STA COLUPF
lda #$b6
STA COLUPF
lda #$76+4
STA COLUPF
lda #$36+4
STA COLUPF
lda #0
STA COLUPF
sta WSYNC
lda #128+64+32+16+8+4
sta GRP0
lda #1+2+4+8+16+32
sta GRP1
nop
nop
nop
nop
nop
nop
lda #$36
STA COLUPF
lda #$1c
STA COLUPF
lda #$1c
STA COLUPF
lda #$b6
STA COLUPF
lda #$76+4
STA COLUPF
lda #$36+4
STA COLUPF
lda #0
STA COLUPF
sta WSYNC
lda #0
sta GRP0
lda #0
sta GRP1
lda #64+32+16
sta HMP0
lda #128
sta HMP1
; nop
; nop
; nop
; nop
; nop
nop
lda #$36
STA COLUPF
lda #$1c
STA COLUPF
lda #$b6
STA COLUPF
lda #$12
STA COLUPF
lda #$76+4
STA COLUPF
lda #$36+4
STA COLUPF
lda #0
STA COLUPF
ldy #4
next2:
sta WSYNC
sta HMOVE
lda #0
sta GRP0
lda #0
sta.w GRP1
; nop
; nop
nop
nop
nop
nop
lda #$36
STA COLUPF
lda #$1c
STA COLUPF
lda #$b6
STA COLUPF
lda #$12
STA COLUPF
lda #$76+4
STA COLUPF
lda #$36+4
STA COLUPF
lda #0
STA COLUPF
dey
bne next2
lda #$00
sta GRP0
sta GRP1
sta WSYNC
ldy #100
nextblankline:
sta WSYNC
dey
bne nextblankline
STA VBLANK ; Make TIA output invisible,
lda #35
sta TIM64T
OverscanWait:
lda INTIM
bne OverscanWait
JMP DrawLogo ;Continue forever.
org $FFFC
.word Start
.word Start
Attachment:
2blocks.gif
Description: GIF image
| Current Thread |
|---|
|
| <- Previous | Index | Next -> |
|---|---|---|
| Re: [stella] Seeking ROM dumper inf, Eric Ball | Thread | Re: [stella] Rubik Cube 3d, Christopher Tumber |
| Re: [stella] Rubik Cube 3d, Eckhard Stolberg | Date | Re: [stella] Seeking ROM dumper inf, Eric Ball |
| Month |