[stella] 13 chars C64-style

Subject: [stella] 13 chars C64-style
From: Paul Slocum <paul-stella@xxxxxxxxxxxxxx>
Date: Tue, 09 Dec 2003 01:06:56 -0600
I did a 13-char routine using the 48-pixel sprite with the extra character using the two missiles and ball. The playfield covers up the other two copies of the missiles.

The graphics are displayed from RAM, and I have it creating the graphic data from text data between each line to give an idea of the amount of scanlines needed to build the graphics. I'm just using a macro that creates a loop for each character which is horribly inefficient for space at least, but at least it's a start. And it shows that there's going to have to be a lot of optimizing done to get those lines closer together. Probably rearranging the font data will help a lot. And having two versions of the font (one with the characters in the high nibble and one using the low) would save a lot of cycles, but that's a lot of ROM space too.

-paul
;---------------------------------------------------------------------------
;
; Generic 2600 Game
;
;---------------------------------------------------------------------------

	processor 6502	
	include vcs.h	


;---------------------------------------------------------------------------
; Constants
;---------------------------------------------------------------------------

;---------------------------------------------------------------------------
; RAM Variables 
;---------------------------------------------------------------------------
frame equ $80

chara equ $81
charb equ $86
charc equ $8b
chard equ $90
chare equ $95
charf equ $9a
charg equ $9f

temp  equ $a4
temp2 equ $a5
line	equ $a6

	MAC TEXTCOPY
	ldx #{1}*2-1
	lda text,x
	tay
	ldx #4
fontLoop{2}
	lda font,y
	and #%11110000
	sta char{2},x
	iny
	dex
	bpl fontLoop{2}

	ldx #{1}*2
	lda text,x
	tay
	ldx #4
fontLoop2{2}
	lda font,y
	and #%00001111
	ora char{2},x
	sta char{2},x
	iny
	dex
	bpl fontLoop2{2}
	ENDM


	MAC TEXTDISP
	lda charg+{1}	;3
;	lda #255
	sta ENAM0		;3
	lsr				;2
	sta ENAM1		;3
	lsr				;2
;	sta WSYNC		;3
	sta ENABL		;3
	lda chara+{1} 	;3
	sta GRP0			;3
	lda charb+{1}	;3
	sta.w GRP1		;3
	lda #$26
	adc #{1}*2
	tax
	stx COLUP0
	stx COLUP1
	lda charc+{1}	;3
	sta GRP0			;3
	lda chard+{1}	;3
	ldy chare+{1}	;3
	stx COLUPF	
	ldx charf+{1}	;3
	sta GRP1			;3
	sty GRP0			;3
	stx GRP1			;3
	sta GRP0			;3
	lda #$20
	sta COLUPF
	ENDM



;---------------------------------------------------------------------------
;---------------------------------------------------------------------------
	org $F000
;---------------------------------------------------------------------------
;---------------------------------------------------------------------------
				
;---------------------------------------------------------------------------
; Start of Program
;---------------------------------------------------------------------------
; Clear memory, locate character graphics positions and such,
; initialize key memory values, start GameLoop.
;-------------------------------------------------------------
Start
	sei  	
	cld  		
	ldx #$FF
	txs  		
	lda #0
clear   
	sta 0,x
	dex
	bne clear	

;---------------------------------------------------------------------------
; Initialize variables / registers
;---------------------------------------------------------------------------

	lda #$48
	sta COLUP0
	lda #$99
	sta COLUP1
	lda #255
	sta PF0
	sta PF1
	lda #0
	sta PF2

	lda #%00000101
	sta WSYNC
	sta CTRLPF
;	sta $2d
;	sta $2d
;	sta $2d
	sta GRP0
	sta GRP1
	lda #$03           ; set both players to 3 copies
	sta NUSIZ0
	sta NUSIZ1
	lda #$01           ; set vertical delay on for both players
	sta VDELP0
	sta $2d
	sta RESM0
	sta RESM1
	sta VDELP1
	sta RESBL
	sta RESP0
	sta RESP1
	lda #%11110000
	sta HMP1
	lda #%11100000
	sta HMP0
	lda #%10000000
	sta HMBL
	lda #%10110000
	sta HMM0
	lda #%01010000
	sta HMM1
	sta WSYNC
	sta HMOVE

	; Set playfield color
	lda #$06
	sta COLUPF

;--------------------------------------------------------------------------
; GameLoop
;--------------------------------------------------------------------------
GameLoop
	jsr VSync 	;start vertical retrace

	inc frame	;count frame

	jsr VBlank    	; spare time during screen blank
	jsr Picture		; draw one screen
	jsr overscan	; do overscan

	jmp GameLoop    ;back to top

text
	byte t,h,i,r,t,e,e,n,c,h,a,r,s

;--------------------------------------------------------------------------
; VSync
;--------------------------------------------------------------------------
VSync
	lda #2		;bit 1 needs to be 1 to start retrace
	sta VSYNC	;start retrace
	sta WSYNC 	;wait a few lines
	sta WSYNC 
	lda #44		;prepare timer to exit blank period (44)
	sta TIM64T	;turn it on
	sta WSYNC 	;wait one more
	sta VSYNC 	;done with retrace, write 0 to bit 1

	rts ; VSync



;--------------------------------------------------------------------------
; VBlank
;--------------------------------------------------------------------------
; Game Logic
;--------------------------------------------------------------------------
VBlank

	rts ; VBlank



;--------------------------------------------------------------------------
; Overscan
;--------------------------------------------------------------------------
; More Game Logic
;--------------------------------------------------------------------------
overscan

	sta WSYNC	

	lda #$00
	sta COLUBK

	lda #36		; Use the timer to make sure overscan takes (34)
	sta TIM64T	; 30 scan lines.  29 scan lines * 76 = 2204 / 64 = 34.4

endOS	
	lda INTIM	; We finished, but wait for timer
	bne endOS	; by looping till zero
	
	sta WSYNC	; End last scanline

	lda #$82
	sta VBLANK
	lda #$02
	sta VBLANK

	rts	; overscan



;--------------------------------------------------------------------------
; Draw TV Pictures
;--------------------------------------------------------------------------
;
;--------------------------------------------------------------------------
Picture

pictureLoop
	lda INTIM	;check timer for end of VBLANK period
	bne pictureLoop	;loop until it reaches 0

	sta WSYNC
	lda #$80
	sta VBLANK  	;end screen blank

	lda #8
	sta line

mainTextLoop

	ldx #0
	lda text,x
	tay
	ldx #4
fontLoop1
	lda font,y
	sta charg,x
	iny
	dex
	bpl fontLoop1

	TEXTCOPY 1,a
	TEXTCOPY 2,b
	TEXTCOPY 3,c
	TEXTCOPY 4,d
	TEXTCOPY 5,e
	TEXTCOPY 6,f

	sta WSYNC

	ldx #8
dly
	dex
	bne dly
	nop

	sta $2d
	dec $2d

	lda #255
	sta GRP0
	sta GRP1


	TEXTDISP 0
	TEXTDISP 1
	TEXTDISP 2
	TEXTDISP 3
	TEXTDISP 4

	lda #0
	sta GRP0
	sta GRP1
	sta GRP0
	sta ENAM0
	sta ENAM1
	sta ENABL

	dec line
	beq quitTextLoop
	jmp mainTextLoop
quitTextLoop

	;------------------------------------------------------------------
	;------------------------------------------------------------------
endText
	lda #0
	sta GRP0
	sta GRP1
	sta GRP0
	sta GRP1
	sta ENAM0
	sta ENAM1
	sta ENABL


	ldx #1

ScanLoop	
;---------------------------------------------------------------------------
	sta WSYNC	
	dex
	bne ScanLoop
	
	rts	; Picture



	align 256
font
a
	byte %10101010
	byte %10101010
	byte %11101110
	byte %10101010
	byte %01000100
b
	byte %11001100
	byte %10101010
	byte %11001100
	byte %10101010
	byte %11001100
c
	byte %01100110
	byte %10001000
	byte %10001000
	byte %10001000
	byte %01100110
d
	byte %11001100
	byte %10101010
	byte %10101010
	byte %10101010
	byte %11001100
e
	byte %11101110
	byte %10001000
	byte %11001100
	byte %10001000
	byte %11101110
f
	byte %10001000
	byte %10001000
	byte %11001100
	byte %10001000
	byte %11101110
g
	byte %01100110
	byte %10101010
	byte %11101110
	byte %10001000
	byte %01100110
h
	byte %10101010
	byte %10101010
	byte %11101110
	byte %10101010
	byte %10101010
i
	byte %01000100
	byte %01000100
	byte %01000100
	byte %01000100
	byte %01000100
j
	byte %10001000
	byte %01000100
	byte %01000100
	byte %01000100
	byte %11101110
k
	byte %10101010
	byte %10101010
	byte %11001100
	byte %10101010
	byte %10001000
l
	byte %11101110
	byte %10001000
	byte %10001000
	byte %10001000
	byte %10001000
m
	byte %10101010
	byte %10101010
	byte %10101010
	byte %11101110
	byte %10101010
n
	byte %10101010
	byte %11101110
	byte %11101110
	byte %11101110
	byte %10101010
o
	byte %01000100
	byte %10101010
	byte %10101010
	byte %10101010
	byte %01000100
p
	byte %10001000
	byte %10001000
	byte %11001100
	byte %10101010
	byte %11001100
q
	byte %01100110
	byte %11101110
	byte %10101010
	byte %10101010
	byte %01000100
r
	byte %10101010
	byte %10101010
	byte %11001100
	byte %10101010
	byte %11001100
s
	byte %11001100
	byte %00100010
	byte %01000100
	byte %10001000
	byte %01100110
t
	byte %01000100
	byte %01000100
	byte %01000100
	byte %01000100
	byte %11101110
u
	byte %11101110
	byte %10101010
	byte %10101010
	byte %10101010
	byte %10101010
v
	byte %01000100
	byte %01000100
	byte %10101010
	byte %10101010
	byte %10101010
w
	byte %10101010
	byte %11101110
	byte %10101010
	byte %10101010
	byte %10101010
x
	byte %10101010
	byte %10101010
	byte %01000100
	byte %10101010
	byte %10101010
y
	byte %01000100
	byte %01000100
	byte %01000100
	byte %10101010
	byte %10101010
z
	byte %11101110
	byte %10001000
	byte %01000100
	byte %00100010
	byte %11101110



;---------------------------------------------------------------------------
; Program Startup
;---------------------------------------------------------------------------
	org $FFFC
	.word Start
	.word Start

Attachment: 13ch.bin
Description: Binary data

Current Thread