[stella] hitting resp0 in the middle of asymmetrical playfield?

Subject: [stella] hitting resp0 in the middle of asymmetrical playfield?
From: Adam Wozniak <adam@xxxxxxxxxxxxxxxx>
Date: Sat, 21 May 2005 21:33:39 -0400
-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA1

Is it possible to hit RESP0 in the middle of a line while drawing
an asymmetric playfield?

I don't seem to have the right magic formula (see attached asm).

- -- 
adam@xxxxxxxxxxxxxxxx        http://cuddlepuddle.org/~adam
KG6GZR                       http://cuddlepuddle.org/~adam/resume.html

-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.2.1 (GNU/Linux)

iD8DBQFCj+DGyvXf5Z0z5zERAorHAKCmC9826jRH1dJGz7fp8zHWYLP2LwCgtp0P
hn4eB1wFF6AtYEDHU10/ETI=
=jP+O
-----END PGP SIGNATURE-----
Archives (includes files) at http://www.biglist.com/lists/stella/archives/
Unsub & more at http://stella.biglist.com
; soko.asm

; Copyright 2005 Adam Wozniak

; All Rights Reserved



	processor 6502

	include vcs.h



	org $F000



BKvar  = $80

PFvar  = $81

P0var  = $82

P1var  = $83



; note those first four are only used to initialize the level

; we reuse them for various temporary variables

TMPvar = $80

T2var  = $81

T3var  = $82

T4var  = $83



; precomputed pf values, 10 row of 6 bytes == 72 bytes

MAPvar = $84

; plus 60 bytes

ROWvar = $C0

; plus 12 bytes

NUSvar = $CC

; plus 30 bytes

PLCvar = $EA

NPLvar = $EB



Start

	SEI

	CLD

	LDX #$FF

	TXS



GameInit



	;LDA #2

	;STA ENAM0

	;STA ENAM1

	;STA ENABL



        LDA #0

	STA NUSvar

	STA NUSvar+1

        LDA #1

	STA NUSvar+2

	STA NUSvar+3

        LDA #2

	STA NUSvar+4

	STA NUSvar+5

        LDA #3

	STA NUSvar+6

	STA NUSvar+7

        LDA #4

	STA NUSvar+8

	STA NUSvar+9

        LDA #6

	STA NUSvar+10

	STA NUSvar+11

        LDA #7

	STA NUSvar+12

        LDA #0

	STA NUSvar+13

        LDA #0

	STA NUSvar+14

        LDA #7

	STA NUSvar+15

	STA NUSvar+16

	STA NUSvar+17

        LDA #3

	STA NUSvar+18

	STA NUSvar+19



LevelInit

	LDX #$40

Copy

	LDA Level1,X

	STA BKvar,X



	DEX

	BPL Copy



	LDA PFvar	; foreground color

	STA COLUPF

	LDA BKvar	; background color

	STA COLUBK

	LDA P0var	; P0 color

	STA COLUP0

	LDA P1var	; P1 color

	STA COLUP1



MainLoop



VerticalSync

	LDA #2

	STA VSYNC

	STA WSYNC

	STA WSYNC

	STA WSYNC



VerticalBlank

	LDA #43

	STA TIM64T

	LDA #0

	STA VSYNC



	; game logic goes here



        ; player 0 fills 3 squares, and player 1 fills the next 3

        ;   0123456789

        ;    11122234

        ; note no boxes are ever drawn at the extreme ends (0 or 9)





        ; align P0 and P1 positions with current phase

phase1align

        STA WSYNC

        NOP

        NOP

        NOP

        NOP

        NOP

        NOP

        NOP

        NOP

        NOP

        NOP

        NOP

        NOP

        NOP

        STA RESP0

        NOP

        NOP

        NOP

        NOP

        NOP

        NOP

        STA RESP1

	STA RESM0

	STA RESM1



        STA HMCLR

        LDA #$40

        STA HMP0

	LDA #$10

	STA HMP1



	STA WSYNC

        STA HMOVE



postalign

	; ok, we're aligned now

        

        ; reset PLCvar to point to the beginning of the map

        LDA #MAPvar

        STA PLCvar





        ; reset PLCvar to point to the beginning of the map

        LDA #MAPvar

        STA PLCvar



	; game logic ends here



VerticalBlankEnd

	LDA INTIM

	BNE VerticalBlankEnd



	LDA #0

	STA VBLANK





DrawScreen

	LDA #0

	TAY

	JSR DrawRow

	INY

	INY

	JSR DrawRow

	INY

	INY

	JSR DrawRow

	INY

	INY

	JSR DrawRow

	INY

	INY

	JSR DrawRow

	INY

	INY

	JSR DrawRow

	INY

	INY

	JSR DrawRow

	INY

	INY

	JSR DrawRow

	INY

	INY

	JSR DrawRow

	INY

	INY

	JSR DrawRow



OverScan

	LDA #2

	STA VBLANK



	LDX #30

OverScanWait

	STA WSYNC

	DEX

	BNE OverScanWait



	JMP  MainLoop      ; Continue forever.



DrawRow

        LDX PLCvar



	TYA

	PHA



	LDA #0

	TAY

        JSR reshuffle

	INY

	INX

        JSR reshuffle

	INY

	INX

        JSR reshuffle

	INY

	INX

        JSR reshuffle

	INY

	INX

        JSR reshuffle

	INY

	INX

        JSR reshuffle



	PLA

	TAY



        LDX PLCvar



	; jump to the correct block

	LDA NUSvar,Y

	CMP #7

	BEQ eep0

	LDA NUSvar+1,Y

	CMP #7

	BEQ eep1

	JMP blockXX

eep1	JMP blockXO

eep0	LDA NUSvar+1,Y

	CMP #7

	BEQ eep2

	JMP blockOX

eep2    JMP blockOO





        MAC OneScanline



        LDA {2}                  ;- 2 cycles

        STA GRP0                 ;- 3 cycles

	LDA NUSvar,Y		 ;- 4 cycles

	STA NUSIZ0		 ;- 3 cycles



	LDA ROWvar               ;- 4 cycles

	STA PF0                  ;- 3 cycles  must be before 22

	LDA ROWvar+1+{1}         ;- 4 cycles

	STA PF1                  ;- 3 cycles  must be before 28

	LDA ROWvar+2+{1}         ;- 4 cycles

	STA PF2                  ;- 3 cycles  must be before 38



        LDA {3}                  ;- 2 cycles

        STA GRP1                 ;- 3 cycles

	LDA NUSvar+1,Y		 ;- 4 cycles

	STA NUSIZ1		 ;- 3 cycles



	LDA ROWvar+3+{1}         ;- 4 cycles

	STA PF0                  ;- 3 cycles  must be before 49

	LDA ROWvar+4+{1}         ;- 4 cycles

	STA PF1                  ;- 3 cycles  must be before 54

	LDA ROWvar+5+{1}         ;- 4 cycles

	STA PF2                  ;- 3 cycles  must be before 65



	STA WSYNC

        ENDM



blockXX

	STA WSYNC

;        OneScanLine 0,#$0,#$0

        OneScanLine 0,#$0,#$0

        OneScanLine 6,#$0,#$0    ; ........

        OneScanLine 0,#$0,#$0    ; ........

        OneScanLine 6,#$3C,#$3C  ; ..XXXX..

        OneScanLine 0,#$66,#$66  ; .XX..XX.

        OneScanLine 6,#$C7,#$C7  ; XX...XXX

        OneScanLine 0,#$CF,#$CF  ; XX..XXXX

        OneScanLine 6,#$FB,#$FB  ; XXXXX.XX

        OneScanLine 0,#$76,#$76  ; .XXX.XX.

        OneScanLine 6,#$3C,#$3C  ; ..XXXX..

        OneScanLine 0,#$0,#$0    ; ........

        OneScanLine 6,#$0,#$0    ; ........

        OneScanLine 0,#$0,#$0

;        OneScanLine 0,#$0,#$0

;        OneScanLine 0,#$0,#$0

	JMP blockout

blockXO

	STA WSYNC

;        OneScanLine 0,#$0,#$0

        OneScanLine 0,#$0,#$0

        OneScanLine 6,#$0,#$0   ; ........

        OneScanLine 0,#$0,#$0   ; ........

        OneScanLine 6,#$3C,#$0  ; ..XXXX..

        OneScanLine 0,#$66,#$0  ; .XX..XX.

        OneScanLine 6,#$C7,#$0  ; XX...XXX

        OneScanLine 0,#$CF,#$0  ; XX..XXXX

        OneScanLine 6,#$FB,#$0  ; XXXXX.XX

        OneScanLine 0,#$76,#$0  ; .XXX.XX.

        OneScanLine 6,#$3C,#$0  ; ..XXXX..

        OneScanLine 0,#$0,#$0   ; ........

        OneScanLine 6,#$0,#$0   ; ........

        OneScanLine 0,#$0,#$0

;        OneScanLine 0,#$0,#$0

;        OneScanLine 0,#$0,#$0

	JMP blockout

blockOX

	STA WSYNC

;        OneScanLine 0,#$0,#$0

        OneScanLine 0,#$0,#$0

        OneScanLine 6,#$0,#$0   ; ........

        OneScanLine 0,#$0,#$0   ; ........

        OneScanLine 6,#$0,#$3C  ; ..XXXX..

        OneScanLine 0,#$0,#$66  ; .XX..XX.

        OneScanLine 6,#$0,#$C7  ; XX...XXX

        OneScanLine 0,#$0,#$CF  ; XX..XXXX

        OneScanLine 6,#$0,#$FB  ; XXXXX.XX

        OneScanLine 0,#$0,#$76  ; .XXX.XX.

        OneScanLine 6,#$0,#$3C  ; ..XXXX..

        OneScanLine 0,#$0,#$0   ; ........

        OneScanLine 6,#$0,#$0   ; ........

        OneScanLine 0,#$0,#$0

;        OneScanLine 0,#$0,#$0

;        OneScanLine 0,#$0,#$0

	JMP blockout

blockOO

	STA WSYNC

;        OneScanLine 0,#$0,#$0

        OneScanLine 0,#$0,#$0

        OneScanLine 6,#$0,#$0  ; ........

        OneScanLine 0,#$0,#$0  ; ........

        OneScanLine 6,#$0,#$0  ; ..XXXX..

        OneScanLine 0,#$0,#$0  ; .XX..XX.

        OneScanLine 6,#$0,#$0  ; XX...XXX

        OneScanLine 0,#$0,#$0  ; XX..XXXX

        OneScanLine 6,#$0,#$0  ; XXXXX.XX

        OneScanLine 0,#$0,#$0  ; .XXX.XX.

        OneScanLine 6,#$0,#$0  ; ..XXXX..

        OneScanLine 0,#$0,#$0  ; ........

        OneScanLine 6,#$0,#$0  ; ........

        OneScanLine 0,#$0,#$0

;        OneScanLine 0,#$0,#$0

;        OneScanLine 0,#$0,#$0

	JMP blockout



blockout

	LDA #0

	STA PF0

	STA PF1

	STA PF2



	LDA #$6

	CLC

	ADC PLCvar

	STA PLCvar

	RTS



reshuffle subroutine

        LDA #0

        STA ROWvar,Y

        STA ROWvar+6,Y



        LDA #$80

        AND $0,X

        BEQ .l1

        LDA #$F0

        STA ROWvar,Y

        STA ROWvar+6,Y

        JMP .l2

.l1

        LDA #$10

        AND $0,X

        BEQ .l2

        LDA #$60

        STA ROWvar+6,Y



.l2

        LDA #$08

        AND $0,X

        BEQ .l3

        LDA ROWvar,Y

        ORA #$0F

        STA ROWvar,Y

        LDA ROWvar+6,Y

        ORA #$0F

        STA ROWvar+6,Y

        JMP .l4

.l3

        LDA #$01

        AND $0,X

        BEQ .l4

        LDA ROWvar+6,Y

        ORA #$06

        STA ROWvar+6,Y

.l4

        RTS



	org $FF80

Level1

	.byte $0, $C8, $4F, $8F



   .byte $00, $00, $88, $80, $80, $00

   .byte $80, $88, $08, $00, $88, $00

   .byte $80, $00, $20, $00, $08, $00

   .byte $80, $00, $33, $30, $08, $00

   .byte $80, $00, $01, $10, $08, $08

   .byte $80, $80, $03, $30, $00, $08

   .byte $00, $88, $33, $30, $00, $08

   .byte $00, $08, $20, $00, $88, $08

   .byte $00, $08, $40, $00, $80, $00

   .byte $00, $08, $88, $80, $80, $00



	org $FFF0



graphGoal



graphBox



graphMe



	org $FFFC

	.word Start

	.word Start


Current Thread