Mercurial > repos > ghero
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