view genesis.s68 @ 9:997690aa0507

Improve method for choosing line palette entries. Read number of global and dynamic colors from image binary. Go back to doing a word, longword, word pattern of writes for turning off display, doing DMA and turning it back on again to make things work correctly on the real hardware.
author Mike Pavone <pavone@retrodev.com>
date Wed, 04 Sep 2013 00:41:52 -0700
parents 4ffd621f1d0c
children
line wrap: on
line source

	dc.l $0, start
	dc.l empty_handler
	dc.l empty_handler
	;$10
	dc.l empty_handler
	dc.l empty_handler
	dc.l empty_handler
	dc.l empty_handler
	;$20
	dc.l empty_handler
	dc.l empty_handler
	dc.l empty_handler
	dc.l empty_handler
	;$30
	dc.l empty_handler
	dc.l empty_handler
	dc.l empty_handler
	dc.l empty_handler
	;$40
	dc.l empty_handler
	dc.l empty_handler
	dc.l empty_handler
	dc.l empty_handler
	;$50
	dc.l empty_handler
	dc.l empty_handler
	dc.l empty_handler
	dc.l empty_handler
	;$60
	dc.l empty_handler
	dc.l empty_handler
	dc.l empty_handler
	dc.l empty_handler
	;$70
	dc.l HINT
	dc.l empty_handler
	dc.l VINT
	dc.l empty_handler
	;$80
	dc.l empty_handler
	dc.l empty_handler
	dc.l empty_handler
	dc.l empty_handler
	;$90
	dc.l empty_handler
	dc.l empty_handler
	dc.l empty_handler
	dc.l empty_handler
	;$A0
	dc.l empty_handler
	dc.l empty_handler
	dc.l empty_handler
	dc.l empty_handler
	;$B0
	dc.l empty_handler
	dc.l empty_handler
	dc.l empty_handler
	dc.l empty_handler
	;$C0
	dc.l empty_handler
	dc.l empty_handler
	dc.l empty_handler
	dc.l empty_handler
	;$D0
	dc.l empty_handler
	dc.l empty_handler
	dc.l empty_handler
	dc.l empty_handler
	;$E0
	dc.l empty_handler
	dc.l empty_handler
	dc.l empty_handler
	dc.l empty_handler
	;$F0
	dc.l empty_handler
	dc.l empty_handler
	dc.l empty_handler
	dc.l empty_handler
	dc.b "SEGA"
empty_handler:
	rte
start:
;background and sprite test

ButtonState	equ	$FFFFEFF0
ButtonStateNew	equ	ButtonState+2
PalAddress equ ButtonStateNew+2

CRAMXferSizeCmd equ $9308
CRAMDMACmd equ $C0000080
StaticColors equ 8

USE_HINT equ 0
	move.b  #$40, $A10009
	move.l	#$C00000, a4
	move.l	#$c00004, a5

	move.l	#$0, a7

	move.w	#$8004, (a5)
	move.w	#$8104, (a5)	;turn off display
	move.w	#$8200, (a5)	;Table A = 0000
	move.w	#$8400, (a5)	;Table B = 0000
	move.w	#$857C, (a5)	;Sprite Table = F800
	move.w	#$8B00, (a5)		;set full screen vertical and horizontal scrolling
	move.w  #$8C01, (a5)    ;H40 mode, no shadow/hilight, no interlace
	move.w	#$8D3F, (a5)	;H Scroll = FC00
	move.w	#$9001, (a5)	;64x32 scroll tables



	lea	BgData(pc), a0
	move.w	(a0)+, d0	;size in words
	move.w	(a0)+, d1	;width in cells
	move.w	(a0)+, d2	;height in cells
	move.w d2, d7

	subq	#1, d0		;adjust for 68K dbra routine
	move.w	#$8f02, (a5)	;autoincrement = 2
	move.l	#$50200000, (a5);beginning of background tile area
CopyTiles:
	move.w	(a0)+, (a4)	;copy tiles to VRAM
	dbra	d0, CopyTiles

	move.l	#$40000000, d4	;beginning of Plane A Name table
	move.l	#$00800000, d5	;delta between lines
	move.w	#$81, d6
	subq	#1, d1
	subq	#1, d2
	move.w	d1, d3
WriteNamesY:
	move.l	d4, (a5)
	move.w	d3, d1

WriteNamesX:
	move.w	d6, (a4)
	addq	#1, d6
	dbra	d1, WriteNamesX

	add.l	d5, d4
	dbra	d2, WriteNamesY

	move.l	#$C0000000, (a5)	;setup writes to CRAM
	move.b  (a0)+, d0			;Number of static colors
	move.b  (a0)+, d1			;Number of dynamic colors
	ext.w	d0
	move.w	d0, -(a7)
	beq		NoStatic
	subq.w	#1, d0
CopyColors:
	move.w	(a0)+, (a4)
	dbra	d0, CopyColors
	move.w	(a7)+, d0
NoStatic:

	move.l a0, (PalAddress).w


	move.l	#$60000010, (a5)	;setup writes to VSRAM
	move.w	#$0, (a4)		;vscroll = 0

	move.l	#$7C000003, (a5)	;setup writes to HScroll Table FC00
	move.w	#0, (a4)		;Plane A&B HScroll = 0;
	move.w	#0, (a4)		;

	move.l	#$78000003, (a5)	;clear sprite table
	move.l	#0, (a4)
	move.l	#0, (a4)

	move.w	#$8114, (a5)		;turn on DMA

	;bsr	InitSprites
	;bsr	AddSprite

	move.w	#$0, (a0)

	;bsr	LoadSpritePal
	;bsr	InitFrameBigSprite
	moveq	#0, d3
	;bsr	ChangeFrameBigSprite

	move.w	d0, d5
	ext.l   d5
	moveq	#17, d2
	lsl.l	d2, d5
	or.l	#CRAMDMACmd, d5		;setup DMA command word

	ext.w	d1
	beq		NoDynamic
	or.w	#$9300, d1
	move.w	d1, (a5)		;set Transfer length
	move.w	#$9400, (a5)

	move.w	#$8114, d6
	move.w	#$8174, d7

	if USE_HINT

		move.w	#$8014, (a5)
		move.w	#$8A00, (a5)		;HINT occurs on every line
	endif

	move.w	#$8174, (a5)
	move #$2300, SR


Loop:
	if USE_HINT
		bra Loop
	endif
WaitTop:
	cmpi.b  #$FF, 4(a5)
	bne.s   WaitTop

LineDone:
	move.b	4(a5), d0
WaitNextLine:
	cmp.b	4(a5), d0
	beq	WaitNextLine



HINT:
	move.w	d6, (a5)
	move.l	d5, (a5)		;start DMA
	move.w	d7, (a5)
	;move.l d6, (a5)
	;move.l d7, (a5)
	move.w d1, (a5)		;set Transfer length
	move.w	#$9400, (a5)

	if USE_HINT
		rte
	endif

	cmp.b	#223, 4(a5)
	beq	WaitTop

	bra	LineDone
NoDynamic:
	move.w	#$8174, (a5)
	move #$2300, SR
.loop
	bra .loop
VINT:
	move.w d1, -(a7)
	if USE_HINT
		move.w	#$8144, (a5)
	endif
	;bsr	SpriteCopyVRAM

	bsr	ReadPad

	;bsr	Player1Vint

	move.l	(PalAddress).w, d7			;setup DMA source address
	move.w	#$9500, d6
	ror.l	#1, d7
	move.b	d7, d6
	move.w	d6, (a5)
	ror.l	#8, d7
	move.b	d7, d6
	add.w	#$100, d6
	move.w	d6,(a5)
	ror.l	#8, d7
	move.b	d7, d6
	add.w	#$100, d6
	and.b	#$7F, d6
	move.w	d6,(a5)

	;move.l	d5, (a5)		;do DMA for first line

	move.w (a7)+, d1
	move.w	d1, (a5)		;set Transfer length
	move.w	#$9400, (a5)

	move.w	#$8114, d6		;VDP commands to turn screen on and off during HBlank
	;swap d6
	;swap d5
	;move.w d5, d6
	;swap d5
	;move.w d5, d7
	;swap d7
	move.w	#$8174, d7
	if USE_HINT
		move.w	d7, (a5)
	endif
	rte

LoadSpritePal:
	move.l	#$C0200000, (a5)
	moveq	#$F, d0
	lea	SpriteData, a0
PalLoop:
	move.w	(a0)+, (a4)
	dbra	d0, PalLoop
	rts

Player1Vint:
	move.b	(ButtonState).w, d2
	move.b	(ButtonStateNew).w, d3

	moveq	#0, d0
	move.w	d0, d1

	btst	#5, d2
	bne	ScrollRight

	btst	#7, d2
	bne	ScrollLeft

	btst	#4, d3
	bne	IncrementFrame


	btst	#6, d3
	bne	DecrementFrame

	btst	#2, d2
	beq	PlayerShipNotLeft
	subq	#1, d0
PlayerShipNotLeft:

	btst	#3, d2
	beq	PlayerShipNotRight
	addq	#1, d0
PlayerShipNotRight:

	btst	#0, d2
	beq	PlayerShipNotDown
	subq	#1, d1
PlayerShipNotDown:

	btst	#1, d2
	beq	PlayerShipNotUp
	addq	#1, d1
PlayerShipNotUp:

	bsr	MoveBigSprite

	rts
IncrementFrame:
	move.w	(PlayerShipFrame), d3
	addq	#1, d3
	move.w	d3, (PlayerShipFrame)
	bsr	ChangeFrameBigSprite

	rts

DecrementFrame:

	move.w	(PlayerShipFrame), d3
	subq	#1, d3
	move.w	d3, (PlayerShipFrame)
	bsr	ChangeFrameBigSprite

	rts

ScrollRight:
	move.w	(ScrollValue), d0
	subq	#1, d0
	move.l	#$7C000003, (a5)	;setup writes to HScroll Table FC00
	move.w	d0, (a4)
	move.w	d0, (a4)
	move.w	d0, (ScrollValue)

	rts

ScrollLeft:
	move.w	(ScrollValue), d0
	addq	#1, d0
	move.l	#$7C000003, (a5)	;setup writes to HScroll Table FC00
	move.w	d0, (a4)
	move.w	d0, (a4)
	move.w	d0, (ScrollValue)

	rts

	include	sprites.s68

PlayerShipFrame:
	dc.w 	0


ScrollValue:
	dc.w	0

ReadPad:
	move.b	#$FF, $a10003	;set TH for controller A
	move.b	$a10003, d0	;CBRLUD
	andi.b	#$3F, d0
	move.b	#0, $a10003
	move.b	$a10003, d1	;SA00UD
	andi.b	#$30, d1
	lsl.b	#2, d1
	or.b	d1, d0		;SACBRLUD
	not.b	d0
	move.b	(ButtonState).w, d1
	eor.b	d0, d1
	and.b	d0, d1
	move.b	d0, (ButtonState).w
	move.b	d1, (ButtonStateNew).w

	rts


SpriteData:
	incbin	bultest.bin
BgData:
	incbin  logo.bin