#dontinclude
; include file

**********************************************************************************************************************************************************************************************
*syncstart()
**********************************************************************************************************************************************************************************************
function	syncstart
rem	syncstart()
rem	start of vblank status
rem	
stack	d7
syncstart
	move.w	$c00004,d7 ; Move VDP status word to d7
	andi.w	#$0008,d7     ; AND with bit 4 (vblank), result in status register
	bne	syncstart	; Branch if not equal (to zero)
	rts
endfunction



**********************************************************************************************************************************************************************************************
*syncend()
**********************************************************************************************************************************************************************************************
function	syncend
rem	syncend()
rem	end of vblank status
rem	
stack	d7
syncend
	move.w	$c00004,d7 ; Move VDP status word to d0
	andi.w	#$0008,d7     ; AND with bit 4 (vblank), result in status register
	beq    syncend	; Branch if equal (to zero)
	rts
endfunction


;********************************************************************************************************************************************************************************************
;* init_sega
;********************************************************************************************************************************************************************************************

function	init_sega
rem	init_sega()
rem	disables sega security system and holds z80 in reset state
rem	
stack	a6/d7
init_sega:
	move	#$2700,sr	; disable interrupts

; TMSS
	move.b	$00A10001,d7	; Move Megadrive hardware version to d0
	andi.b	#$0F,d7	; The version is stored in last four bits,
; so mask it with 0F
	beq     init_sega_skip         ; If version is equal to 0,skip TMSS signature
	move.l	#'SEGA',$00A14000	; Move the string "SEGA" to $A14000
init_sega_skip:

; Z80 grab it and hang it
	move.w	#$0100,$00A11100	; Request access to the Z80 bus
	move.w	#$0100,$00A11200	; Hold the Z80 in a reset state
init_sega_wait:
	btst	#$0,$00A11101	; Check if we have access to the Z80 bus yet
	bne	init_sega_wait	; If we don't yet have control,branch back up to Wait
	move.l	#$00A00000,a6	; Copy Z80 RAM address to a1
	move.l	#$00C30000,(a6)	; Copy data,and increment the source/dest addresses
 
;	move.w  #$0000,$00A11200 ; Release reset state
;	move.w	#$0000,$00A11100 ; Release control of bus
; do not release the state of z80.... music player uses 68k to process music but must have z80 locked up
	rts
endfunction







*******************************************************************************************************************************************************************************************
* init_segavdp()
*******************************************************************************************************************************************************************************************
function	init_segavdp
rem	init_segavdp()
rem	initializes the sega vdp
rem	
stack	a6/d6-d7
; vdp register startup

vdpregisters
VDPReg0	dc.b	$14	; 0: H interrupt on, palettes on
VDPReg1	dc.b	$64	; 1: V interrupt on, display on, DMA on, Genesis mode on
VDPReg2	dc.b	$30	; 2: c000 Pattern table for Scroll Plane A at VRAM $C000 (bits 3-5 = bits 13-15) *$400 is vram addr
VDPReg3	dc.b	$00	; 3:34= d000Pattern table for Window Plane at VRAM $D000  (bits 1-5 = bits 11-15)
VDPReg4	dc.b	$07	; 4:e000 Pattern table for Scroll Plane B at VRAM $e000 (bits 0-2 = bits 11-15) *2000 is vram addr
VDPReg5	dc.b	$78	; 5: 7c old b200 Sprite table at VRAM $b200 (bits 0-6 = bits 9-15) *200 is vram loc f800 try 78=f000
VDPReg6	dc.b	$00	; 6: Unused
VDPReg7	dc.b	$00	; 7: Background colour - bits 0-3 = colour, bits 4-5 = palette
VDPReg8	dc.b	$00	; 8: Unused
VDPReg9	dc.b	$00	; 9: Unused
VDPRegA	dc.b	$ff	;10: Frequency of Horiz. interrupt in Rasters (number of lines travelled by the beam)
VDPRegB	dc.b	$00	;11: External interrupts off, V scroll fullscreen, H scroll fullscreen
VDPRegC	dc.b	$81	;12: Shadows and highlights off, interlace off, H40 mode (320 x 224 screen res)
VDPRegD	dc.b	$2c	;13:2c b000 Horiz. scroll table at VRAM $b000 *400 28=a000
VDPRegE	dc.b	$00	;14: Unused
VDPRegF	dc.b	$02	;15: Autoincrement 2 bytes
VDPReg10	dc.b	$01	;16: Vert. scroll 32, Horiz. scroll 64
VDPReg11	dc.b	$00	;17: Window Plane X pos 0 left (pos in bits 0-4, left/right in bit 7)
VDPReg12	dc.b	$00	;18: Window Plane Y pos 0 up (pos in bits 0-4, up/down in bit 7)
VDPReg13	dc.b	$00	;19: DMA length lo byte
VDPReg14	dc.b	$00	;20: DMA length hi byte
VDPReg15	dc.b	$00	;21: DMA source address lo byte
VDPReg16	dc.b	$00	;22: DMA source address mid byte
VDPReg17	dc.b	$80	;23: DMA source address hi byte,  memory-to-VRAM mode (bits 6-7)
; vim: tw=80 tabstop=4 expandtab ft=asm68k

init_segavdp


	move.l  #vdpregisters,a6 ; Load address of register table into a0
	move.l  #$18,d6          ; 24 registers to write
	move.l  #$00008000,d7    ; 'Set register 0' command
; (and clear the rest of d1 ready)
 
init_segavdp_copyvdp:
	move.b	(a6)+,d7	; Move register value to lower byte of d7
	move.w	d7,$C00004	; Write command and value to VDP control port
	add.w	#$0100,d7	; Increment register #
	dbra	d6,init_segavdp_copyvdp

	move	#$2700,sr	; enable interrupts

	rts

endfunction






; **************************************************************************************************************
; sega_vdp_printb( xpos,ypos,text pointer,palette,vflip,hflip,priority )
; **************************************************************************************************************
function	sega_vdp_printb	sega_vdp_printb_xpos,sega_vdp_printb_ypos,sega_vdp_printb_text,sega_vdp_printb_pal,sega_vdp_printb_vflip,sega_vdp_printb_hflip,sega_vdp_printb_pr

def	sega_vdp_printb_xpos	word
def	sega_vdp_printb_ypos	word
def	sega_vdp_printb_text	long
def	sega_vdp_printb_pal	byte
def	sega_vdp_printb_vflip	byte
def	sega_vdp_printb_hflip	byte
def	sega_vdp_printb_pr	byte

rem	sega_vdp_printb(  xpos.w , ypos.w , text pointer.l , palette.b , vflip.b , hflip.b , priority.b )
rem	prints text onto plane b
rem	
stack	a6/d4-d7
sega_vdp_printb

	move.w	#$8F02,$C00004	; Set VDP autoincrement to 2 words/write
;	move.l	#$60000003,$c00004	;what register? plane b write
	
; d4 working
; d5 x axis
; d6 y axis
; d7 tile num

	move.w	sega_vdp_printb_ypos,d6
	move.w	sega_vdp_printb_xpos,d5
;	move.w	sega_vdp_printb_tile,d7
	clr.l	d4

	move.b	sega_vdp_printb_pr,d4
	lsl.b	#2,d4
	add.b	sega_vdp_printb_pal,d4
	lsl.b	#1,d4
	add.b	sega_vdp_printb_vflip,d4
	lsl.b	#1,d4
	add.b	sega_vdp_printb_hflip,d4
	lsl.b	#3,d4
	lsl.l	#8,d4
	
	mulu.w	#128,d6	;64 x 2 each tile is word
	mulu.w	#2,d5	;x2 for word
	add.l	d5,d6


	lsl.l	#8,d6
	lsl.l	#8,d6
;	add.l	d4,d7
	add.l	#$60000003,d6
	move.l	d6,$00c00004	;what register?

	move.l	sega_vdp_printb_text,a6

; lets create a loop print

sega_vdp_printb_lp
	clr.l	d7	;prep d7
	move.b	(a6)+,d6
	beq	sega_vdp_printb_break
	sub.b	#31,d6
	add.l	d6,d7
	add.l	d4,d7

	move.w	d7,$00c00000	;written
	bra	sega_vdp_printb_lp


sega_vdp_printb_break

	rts


endfunction






; **************************************************************************************************************
; sega_vdp_printa( xpos,ypos,text pointer,palette,vflip,hflip,priority )
; **************************************************************************************************************
function	sega_vdp_printa	sega_vdp_printa_xpos,sega_vdp_printa_ypos,sega_vdp_printa_text,sega_vdp_printa_pal,sega_vdp_printa_vflip,sega_vdp_printa_hflip,sega_vdp_printa_pr

def	sega_vdp_printa_xpos	word
def	sega_vdp_printa_ypos	word
def	sega_vdp_printa_text	long
def	sega_vdp_printa_pal	byte
def	sega_vdp_printa_vflip	byte
def	sega_vdp_printa_hflip	byte
def	sega_vdp_printa_pr	byte

rem	sega_vdp_printa(  xpos.w , ypos.w , text pointer.l , palette.b , vflip.b , hflip.b , priority.b )
rem	prints text onto plane a
rem	
stack	a6/d4-d7
sega_vdp_printa

	move.w	#$8F02,$C00004	; Set VDP autoincrement to 2 words/write
;	move.l	#$40000003,$c00004	;what register? plane b write
	
; d4 working
; d5 x axis
; d6 y axis
; d7 tile num

	move.w	sega_vdp_printa_ypos,d6
	move.w	sega_vdp_printa_xpos,d5
;	move.w	sega_vdp_printa_tile,d7
	clr.l	d4

	move.b	sega_vdp_printa_pr,d4
	lsl.b	#2,d4
	add.b	sega_vdp_printa_pal,d4
	lsl.b	#1,d4
	add.b	sega_vdp_printa_vflip,d4
	lsl.b	#1,d4
	add.b	sega_vdp_printa_hflip,d4
	lsl.b	#3,d4
	lsl.l	#8,d4
	
	mulu.w	#128,d6	;64 x 2 each tile is word
	mulu.w	#2,d5	;x2 for word
	add.l	d5,d6


	lsl.l	#8,d6
	lsl.l	#8,d6
;	add.l	d4,d7
	add.l	#$40000003,d6
	move.l	d6,$00c00004	;what register?

	move.l	sega_vdp_printa_text,a6

; lets create a loop print

sega_vdp_printa_lp
	clr.l	d7	;prep d7
	move.b	(a6)+,d6
	beq	sega_vdp_printa_break
	sub.b	#31,d6
	add.l	d6,d7
	add.l	d4,d7

	move.w	d7,$00c00000	;written
	bra	sega_vdp_printa_lp


sega_vdp_printa_break

	rts


endfunction


***************************************************************************************************************************************************************************************************
* sega_vdp_linksprite( sprite_a.b, sprite_b.b )
***************************************************************************************************************************************************************************************************
function	sega_vdp_linksprite	sega_vdp_linksprite_a,sega_vdp_linksprite_b
; f000 now
rem	sega_vdp_linksprite( sega_vdp_linksprite_a , sega_vdp_linksprite_b )
rem	
rem	
stack	d6-d7
def	sega_vdp_linksprite_a	byte
def	sega_vdp_linksprite_b	byte

sega_vdp_linksprite



	move.w	#$8F00,$C00004	; Set VDP autoincrement to 2 words/write


	clr.w	d7
	move.b	sega_vdp_linksprite_a,d7
	move.w	#8,d6
	mulu.w	d6,d7
	add.w	#2,d7

	swap	d7

;	add.l	#$38000003,d7
	add.l	#$30000003,d7	;f000

	move.l	d7,$c00004	; start of sprite table for read

	move.w	$c00000,d6
	move.b	sega_vdp_linksprite_b,d6

;	add.l	#$40000000,d7
	add.l	#$40000000,d7	;f000

	move.l	d7,$c00004	; start of sprite table for read
	move.w	d6,$c00000



	rts
endfunction









***********************************************************************************************************************************************************************************************
* sega_vdp_setsprite( number.w, tileindex.w , spritex.w, spritey.w, hflip.b , vflip.b, palette.b ,sizex.b , sizey.b , priority.b)
***********************************************************************************************************************************************************************************************
function	sega_vdp_setsprite	sega_vdp_setsprite_index,sega_vdp_setsprite_tile,sega_vdp_setsprite_x,sega_vdp_setsprite_y,sega_vdp_setsprite_sx,sega_vdp_setsprite_sy,sega_vdp_setsprite_h,sega_vdp_setsprite_v,sega_vdp_setsprite_pal,sega_vdp_setsprite_pr
rem	sega_vdp_setsprite( sp_number.w, tileindex.w , spritex.w, spritey.w, size_x.b, size_y.b , hflip.b , vflip.b, palette.b ,priority.b )
rem	
rem
stack	d6-d7
def	sega_vdp_setsprite_index	word
def	sega_vdp_setsprite_tile	word
def	sega_vdp_setsprite_x	word
def	sega_vdp_setsprite_y	word
def	sega_vdp_setsprite_sx	byte
def	sega_vdp_setsprite_sy	byte
def	sega_vdp_setsprite_h	byte
def	sega_vdp_setsprite_v	byte
def	sega_vdp_setsprite_pal	byte
def	sega_vdp_setsprite_pr	byte


sega_vdp_setsprite

	move.w	#$8F02,$C00004	; Set VDP autoincrement to 2 words/write


	clr.w	d7
	move.w	sega_vdp_setsprite_index,d7
	move.w	#8,d6
	mulu.w	d6,d7

	swap	d7
;	add.l	#$78000003,d7	;f800
	add.l	#$70000003,d7	;f000

	move.l	d7,$c00004	; start of sprite table

	move.w	sega_vdp_setsprite_y,$c00000

	clr.w	d7
	move.b	sega_vdp_setsprite_sx,d7
	lsl.b	#2,d7
	add.b	sega_vdp_setsprite_sy,d7
	lsl.w	#8,d7

	move.w	d7,$c00000	;link plus size??

	clr.w	d7
	move.b	sega_vdp_setsprite_h,d7
	ror.w	#1,d7
	add.b	sega_vdp_setsprite_v,d7
	ror.w	#1,d7
	add.b	sega_vdp_setsprite_pal,d7
	ror.w	#2,d7
	add.b	sega_vdp_setsprite_pr,d7
	ror.w	#1,d7

	add.w	sega_vdp_setsprite_tile,d7
	move.w	d7,$c00000
	move.w	sega_vdp_setsprite_x,$c00000

	rts
endfunction








; **************************************************************************************************************
; sega_vdp_scrollplanea( avaluex.w , avaluey.w )
; **************************************************************************************************************
function	sega_vdp_scrollplanea	sega_vdp_scrollplanea_x,sega_vdp_scrollplanea_y
def	sega_vdp_scrollplanea_x	word
def	sega_vdp_scrollplanea_y	word
rem	sega_vdp_scrollplanea( avalue_x.w , avalue_y.w )
rem	
rem	
stack	d7
sega_vdp_scrollplanea


	move.w	#$8F00,$C00004	; Set VDP autoincrement to 2 words/write
	move.w	sega_vdp_scrollplanea_y,d7	; copy Y map position to d0 lower word

	move.l	#$40000010,$c00004 ; setup write to vsega_vdp
	move.w	d7,$c00000 ; copy y position to vsega_vdp 

	move.w	sega_vdp_scrollplanea_x,d7	; copy Y map position to d7 lower word

	move.l	#$70000002,$c00004 ; setup write to vsega_vdp
	move.w	d7,$c00000 ; copy y position to vsega_vdp 

	rts
endfunction









; **************************************************************************************************************
; sega_vdp_scrollplaneb( avaluex.w , avaluey.w )
; **************************************************************************************************************
function	sega_vdp_scrollplaneb	sega_vdp_scrollplaneb_x,sega_vdp_scrollplaneb_y
def	sega_vdp_scrollplaneb_x	word
def	sega_vdp_scrollplaneb_y	word
rem	sega_vdp_scrollplaneb( avalue x.w , avalue y.w )
rem	
rem	
stack	d7
sega_vdp_scrollplaneb


	move.w	#$8F00,$C00004	; Set VDP autoincrement to 2 words/write
	move.w	sega_vdp_scrollplaneb_y,d7	; copy Y map position to d0 lower word

	move.l	#$40020010,$c00004 ; setup write to vsega_vdp
	move.w	d7,$c00000 ; copy y position to vsega_vdp 

	move.w	sega_vdp_scrollplaneb_x,d7	; copy Y map position to d7 lower word

	move.l	#$70020002,$c00004 ; setup write to vsega_vdp
	move.w	d7,$c00000 ; copy y position to vsega_vdp 

	rts
endfunction



; **************************************************************************************************************
; sega_vdp_clear_planea( tilenumber )
; **************************************************************************************************************
function	sega_vdp_clear_planea	sega_vdp_clear_planea_tile
def	sega_vdp_clear_planea_tile	word
rem	sega_vdp_clear_planea( tilenumber.w )  segas entire plane with set tile
rem	
rem	
stack	d6-d7
sega_vdp_clear_planea
	move.w	#$8F02,$C00004	; Set VDP autoincrement to 2 words/write
	move.l	#$40000003,$c00004	;what register? plane a
	move.w	#2047,d7	;counter
	move.w	sega_vdp_clear_planea_tile,d6
sega_vdp_clear_planea_lp
	move.w	d6,$00c00000	;written
	dbra	d7,sega_vdp_clear_planea_lp
	rts
endfunction







; **************************************************************************************************************
; sega_vdp_setplanea( xpos,ypos,tilenumber,palette,vflip,hflip,priority )
; **************************************************************************************************************
function	sega_vdp_setplanea	sega_vdp_setplanea_xpos,sega_vdp_setplanea_ypos,sega_vdp_setplanea_tile,sega_vdp_setplanea_pal,sega_vdp_setplanea_vflip,sega_vdp_setplanea_hflip,sega_vdp_setplanea_pr

def	sega_vdp_setplanea_xpos	word
def	sega_vdp_setplanea_ypos	word
def	sega_vdp_setplanea_tile	word
def	sega_vdp_setplanea_pal	byte
def	sega_vdp_setplanea_vflip	byte
def	sega_vdp_setplanea_hflip	byte
def	sega_vdp_setplanea_pr	byte

rem	sega_vdp_setplanea(  xpos.w , ypos.w , tile.w , palette.b , vflip.b , hflip.b , priority.b )  set a tile on screen
rem	
rem	
stack	d4-d7
sega_vdp_setplanea

	move.w	#$8F00,$C00004	; Set VDP autoincrement to 0 words/write
	move.l	#$40000003,$c00004	;what register? plane a write
	
; d4 working
; d5 x axis
; d6 y axis
; d7 tile num

	move.w	sega_vdp_setplanea_ypos,d6
	move.w	sega_vdp_setplanea_xpos,d5
	move.w	sega_vdp_setplanea_tile,d7
	clr.l	d4

	move.b	sega_vdp_setplanea_pr,d4
	lsl.b	#2,d4
	add.b	sega_vdp_setplanea_pal,d4
	lsl.b	#1,d4
	add.b	sega_vdp_setplanea_vflip,d4
	lsl.b	#1,d4
	add.b	sega_vdp_setplanea_hflip,d4
	lsl.b	#3,d4
	lsl.l	#8,d4
	
	mulu.w	#128,d6	;64 x 2 each tile is word
	mulu.w	#2,d5	;x2 for word
	add.l	d5,d6


	lsl.l	#8,d6
	lsl.l	#8,d6
	add.l	d4,d7
	add.l	#$40000003,d6
	move.l	d6,$00c00004	;what register?
	move.w	d7,$00c00000	;written
	rts


endfunction










; **************************************************************************************************************
; sega_vdp_setverticalplanea( line#.b,priority.b, tileset_pointer.l )
; **************************************************************************************************************
function	sega_vdp_setverticalplanea	sega_vdp_setverticalplanea_line,sega_vdp_setverticalplanea_pr,sega_vdp_setverticalplanea_pointer
rem	sega_vdp_setverticalplanea( line_number.w , priority.w ,  tileset_pointer.l )  line number=0-63 and sets a vertical scroll line set of 32 tiles from pointer location
rem	
rem	
stack	a6/d6-d7
def	sega_vdp_setverticalplanea_line	word
def	sega_vdp_setverticalplanea_pr	word
def	sega_vdp_setverticalplanea_pointer	long
sega_vdp_setverticalplanea

	move.w	#$8F80,$C00004	; Set VDP autoincrement to 128 bytes/write
	clr.l	d7
	move.w	#2,d6
	move.w	sega_vdp_setverticalplanea_line,d7
	mulu.w	d6,d7
	swap	d7
	add.l	#$40000003,d7
	move.l	d7,$c00004	;what register? plane a
	move.w	#31,d7	;counter
	move.l	sega_vdp_setverticalplanea_pointer,a6
sega_vdp_setverticalplanea_lp
	move.w	(a6)+,d6
	add.w	sega_vdp_setverticalplanea_pr,d6
	move.w	d6,$00c00000	;written
	dbra	d7,sega_vdp_setverticalplanea_lp
	rts

endfunction






; **************************************************************************************************************
; sega_vdp_sethorizontalplanea( line#.b, tileset_pointer.l )
; **************************************************************************************************************
function	sega_vdp_sethorizontalplanea	sega_vdp_sethorizontalplanea_line,sega_vdp_sethorizontalplanea_pr,sega_vdp_sethorizontalplanea_pointer

rem	sega_vdp_sethorizontalplanea( line_number.w , priority.w, tileset_pointer.l )  line number=0-31 and sets a horizontal scroll line set of 64 tiles from pointer location
rem	
rem	
stack	a6/d7
def	sega_vdp_sethorizontalplanea_line	word
def	sega_vdp_sethorizontalplanea_pr	word
def	sega_vdp_sethorizontalplanea_pointer	long
sega_vdp_sethorizontalplanea
	move.w	#$8F02,$C00004	; Set VDP autoincrement to 128 bytes/write
; d4 working
; d5 x axis
; d6 y axis
; d7 tile num
	clr.w	d7
	move.w	sega_vdp_sethorizontalplanea_line,d7	
	mulu.w	#128,d7	;64 x 2 each tile is word
	swap	d7
	add.l	#$40000003,d7
	move.l	d7,$00c00004	;what register?
	move.w	#63,d7	;counter
	move.l	sega_vdp_sethorizontalplanea_pointer,a6
sega_vdp_sethorizontalplanea_lp
	move.w	(a6)+,d6
	add.w	sega_vdp_sethorizontalplanea_pr,d6
	move.w	d6,$c00000	;written
	dbra	d7,sega_vdp_sethorizontalplanea_lp
	rts

endfunction




; **************************************************************************************************************
; sega_vdp_clear_planeb( tilenumber )
; **************************************************************************************************************
function	sega_vdp_clear_planeb	sega_vdp_clear_planeb_tile
def	sega_vdp_clear_planeb_tile	word
rem	sega_vdp_clear_planeb( tilenumber.w )  segas entire plane with set tile
rem	
rem	
stack	d6-d7
sega_vdp_clear_planeb
	move.w	#$8F02,$C00004	; Set VDP autoincrement to 2 words/write
	move.l	#$60000003,$c00004	;what register? plane a
	move.w	#2047,d7	;counter
	move.w	sega_vdp_clear_planeb_tile,d6
sega_vdp_clear_planeb_lp
	move.w	d6,$00c00000	;written
	dbra	d7,sega_vdp_clear_planeb_lp
	rts
endfunction





; **************************************************************************************************************
; sega_vdp_setplaneb( xpos,ypos,tilenumber,palette,vflip,hflip,priority )
; **************************************************************************************************************
function	sega_vdp_setplaneb	sega_vdp_setplaneb_xpos,sega_vdp_setplaneb_ypos,sega_vdp_setplaneb_tile,sega_vdp_setplaneb_pal,sega_vdp_setplaneb_vflip,sega_vdp_setplaneb_hflip,sega_vdp_setplaneb_pr

def	sega_vdp_setplaneb_xpos	word
def	sega_vdp_setplaneb_ypos	word
def	sega_vdp_setplaneb_tile	word
def	sega_vdp_setplaneb_pal	byte
def	sega_vdp_setplaneb_vflip	byte
def	sega_vdp_setplaneb_hflip	byte
def	sega_vdp_setplaneb_pr	byte

rem	sega_vdp_setplaneb(  xpos.w , ypos.w , tile.w , palette.b , vflip.b , hflip.b , priority.b )  set a tile on screen
rem	
rem	
stack	d4-d7
sega_vdp_setplaneb

	move.w	#$8F00,$C00004	; Set VDP autoincrement to 0 words/write
	move.l	#$60000003,$c00004	;what register? plane a write
	
; d4 working
; d5 x axis
; d6 y axis
; d7 tile num

	move.w	sega_vdp_setplaneb_ypos,d6
	move.w	sega_vdp_setplaneb_xpos,d5
	move.w	sega_vdp_setplaneb_tile,d7
	clr.l	d4

	move.b	sega_vdp_setplaneb_pr,d4
	lsl.b	#2,d4
	add.b	sega_vdp_setplaneb_pal,d4
	lsl.b	#1,d4
	add.b	sega_vdp_setplaneb_vflip,d4
	lsl.b	#1,d4
	add.b	sega_vdp_setplaneb_hflip,d4
	lsl.b	#3,d4
	lsl.l	#8,d4
	
	mulu.w	#128,d6	;64 x 2 each tile is word
	mulu.w	#2,d5	;x2 for word
	add.l	d5,d6


	lsl.l	#8,d6
	lsl.l	#8,d6
	add.l	d4,d7
	add.l	#$60000003,d6
	move.l	d6,$00c00004	;what register?
	move.w	d7,$00c00000	;written
	rts


endfunction





; **************************************************************************************************************
; sega_vdp_setverticalplaneb( line#.b, tileset_pointer.l )
; **************************************************************************************************************
function	sega_vdp_setverticalplaneb	sega_vdp_setverticalplaneb_line,sega_vdp_setverticalplaneb_pointer

rem	sega_vdp_setverticalplaneb( line_number.b , tileset_pointer.l )  line number=0-63 and sets a vertical scroll line set of 32 tiles from pointer location
rem	
rem	
stack	a6/d6-d7
def	sega_vdp_setverticalplaneb_line	byte
def	sega_vdp_setverticalplaneb_dummy	byte
def	sega_vdp_setverticalplaneb_pointer	long
sega_vdp_setverticalplaneb
	move.w	#$8F80,$C00004	; Set VDP autoincrement to 128 bytes/write
	clr.l	d7
	move.w	#2,d6
	move.b	sega_vdp_setverticalplaneb_line,d7
	mulu.w	d6,d7
	swap	d7
	add.l	#$60000003,d7
	move.l	d7,$c00004	;what register? plane a
	move.w	#31,d7	;counter
	move.l	sega_vdp_setverticalplaneb_pointer,a6
sega_vdp_setverticalplaneb_lp
	move.w	(a6)+,$00c00000	;written
	dbra	d7,sega_vdp_setverticalplaneb_lp
	rts

endfunction






; **************************************************************************************************************
; sega_vdp_sethorizontalplaneb( line#.b, tileset_pointer.l )
; **************************************************************************************************************
function	sega_vdp_sethorizontalplaneb	sega_vdp_sethorizontalplaneb_line,sega_vdp_sethorizontalplaneb_pointer

rem	sega_vdp_sethorizontalplaneb( line_number.b , tileset_pointer.l )  line number=0-31 and sets a horizontal scroll line set of 64 tiles from pointer location
rem	
rem	
stack	a6/d7
def	sega_vdp_sethorizontalplaneb_line	byte
def	sega_vdp_sethorizontalplaneb_dummy	byte
def	sega_vdp_sethorizontalplaneb_pointer	long
sega_vdp_sethorizontalplaneb
	move.w	#$8F02,$C00004	; Set VDP autoincrement to 128 bytes/write
; d4 working
; d5 x axis
; d6 y axis
; d7 tile num
	clr.w	d7
	move.b	sega_vdp_sethorizontalplaneb_line,d7	
	mulu.w	#128,d7	;64 x 2 each tile is word
	lsl.l	#8,d7
	lsl.l	#8,d7
	add.l	#$60000003,d7
	move.l	d7,$00c00004	;what register?
	move.w	#63,d7	;counter
	move.l	sega_vdp_sethorizontalplaneb_pointer,a6
sega_vdp_sethorizontalplaneb_lp
	move.w	(a6)+,$00c00000	;written
	dbra	d7,sega_vdp_sethorizontalplaneb_lp
	rts

endfunction


*************************************************************************************************************************************************************************************
* sega_vdp_palette(number,red,green,blue)
*************************************************************************************************************************************************************************************
function	sega_vdp_palette	sega_vdp_palette_paletten,sega_vdp_palette_paletter,sega_vdp_palette_paletteg,sega_vdp_palette_paletteb
rem	sega_vdp_palette( palette#.w , red.b , green.b , blue.b )
rem	palette number= 0-63   color range = 0-7
rem	
stack	d6-d7
def	sega_vdp_palette_paletten	word
def	sega_vdp_palette_color	word
def	sega_vdp_palette_paletter	byte
def	sega_vdp_palette_paletteg	byte
def	sega_vdp_palette_paletteb	byte
def	sega_vdp_palette_palettes	byte


sega_vdp_palette
	move.w	#$8F00,$C00004	; Set VDP autoincrement to 2 words/write
	move.w	sega_vdp_palette_paletten,d7
	move.w	#2,d6
	mulu.w	d6,d7
	move.w	d7,sega_vdp_palette_paletten	;corrected

	move.b	sega_vdp_palette_paletter,d7
	lsl.b	#1,d7
	move.b	d7,sega_vdp_palette_paletter	;corrected shift
	clr.w	d7
	move.b	sega_vdp_palette_paletteb,d7	;now we start
	lsl.w	#4,d7
	add.b	sega_vdp_palette_paletteg,d7
	lsl.w	#5,d7
	add.b	sega_vdp_palette_paletter,d7


	move.w	d7,sega_vdp_palette_color
	clr.l	d7
	move.w	sega_vdp_palette_paletten,d7
	swap	d7
	add.l	#$c0000003,d7
	move.l	d7,$c00004	; set up vdp to write to cram address $0000 plus pointer
	move.w	sega_vdp_palette_color,d7
	move.w	d7,$c00000


	rts
endfunction







*********************************************************************************************************************************************************************************************
* sega_vdp_loadtile( tilestart.w, tiles.w, pointer.l )
*********************************************************************************************************************************************************************************************
function	sega_vdp_loadtile	sega_vdp_loadtile_tile,sega_vdp_loadtile_tiles,sega_vdp_loadtile_pointer
rem	sega_vdp_loadtile( tilestart.w, tiles_to_load.w , tile_pointer.l )  loads new tile info into vdp tile slot number
rem	
rem	
stack	a6/d6-d7
def	sega_vdp_loadtile_tile	word
def	sega_vdp_loadtile_tiles	word

def	sega_vdp_loadtile_pointer	long

sega_vdp_loadtile
	move.w	#$8F02,$C00004
	clr.l	d7
	clr.l	d6
	move.w	sega_vdp_loadtile_tile,d7

	move.w	#32,d6
	mulu.w	d6,d7
	move.w	d7,d6
	and.w	#$3fff,d6
	add.w	#$4000,d6	;d6 high bytes
	rol.w	#2,d7
	and.w	#3,d7	;low byte
	swap	d6
	add.w	d7,d6
	

	move.l	d6,$C00004	; Set up VDP to write to VRAM address 0x0020 (LEAVE FIRST ONE BLANK 32BYTES)


	move.l	sega_vdp_loadtile_pointer,a6

	move.w	sega_vdp_loadtile_tiles,d6
	move.w	#8,d7
	mulu.w	d6,d7
	sub.w	#1,d7

sega_vdp_loadtile_lp

	move.l	(a6)+,$c00000
	dbra	d7,sega_vdp_loadtile_lp

	rts
endfunction





; **************************************************************************************************************
; sega_vdp_background( palette.b, color.b)
; **************************************************************************************************************
function	sega_vdp_background	sega_vdp_backgroundp,sega_vdp_backgroundc
def	sega_vdp_backgroundp	byte
def	sega_vdp_backgroundc	byte

rem	sega_vdp_background( palette.b , color.b )  palette 0-3   color 0-15
rem	
rem	
stack	d7
sega_vdp_background
	clr.l	d7
	move.b	sega_vdp_backgroundp,d7
	lsl.b	#4,d7
	add.b	sega_vdp_backgroundc,d7
	add.l	#$00008700,d7	;background reg
	move.w	d7,$C00004
	rts
endfunction













*********************************************************************************************************************************************************************************************
* sega_vdp_texttotile( tilestart.w , pointer.l )
*********************************************************************************************************************************************************************************************
function	sega_vdp_texttotile	sega_vdp_texttotile_tile,sega_vdp_texttotile_pointer
rem	sega_vdp_texttotile( tilestart.w , tile_pointer.l )  loads new tile info into vdp tile slot number
rem	must call sega_vdp_font() first to create the font
rem	
stack	a5-a6/d6-d7
def	sega_vdp_texttotile_tile	word
def	sega_vdp_texttotile_pointer	long

sega_vdp_texttotile

	move.w	#$8F02,$C00004

	clr.l	d7
	clr.l	d6

	move.w	sega_vdp_texttotile_tile,d7
	move.w	#32,d6
	mulu.w	d6,d7
	move.w	d7,d6
	and.w	#$3fff,d6
	add.w	#$4000,d6	;d6 high bytes
	rol.w	#2,d7
	and.w	#3,d7	;low byte
	swap	d6
	add.w	d7,d6
	

	move.l	d6,$C00004	; Set up VDP to write to VRAM address 0x0020 (LEAVE FIRST ONE BLANK 32BYTES)

	move.l	sega_vdp_texttotile_pointer,a6

sega_vdp_texttotile_lp

	move.l	#sega_vdp_font_set,a5
	move.b	(a6)+,d7
	beq	sega_vdp_texttotile_break

	sub.b	#33,d7
	and.l	#255,d7
	move.w	#32,d6
	mulu.w	d6,d7

	lea	(a5,d7.l),a5
	move.l	(a5)+,$c00000
	move.l	(a5)+,$c00000
	move.l	(a5)+,$c00000
	move.l	(a5)+,$c00000
	move.l	(a5)+,$c00000
	move.l	(a5)+,$c00000
	move.l	(a5)+,$c00000
	move.l	(a5)+,$c00000
	bra	sega_vdp_texttotile_lp


sega_vdp_texttotile_break
	rts
endfunction




















*********************************************************************************************************************************************************************************************
* sega_vdp_font()
*********************************************************************************************************************************************************************************************
function	sega_vdp_font
rem	sega_vdp_font() loads the first 96 tiles with alpha numerals
rem	
rem	
stack	a6/d7

sega_vdp_font

; lets clear to 71f
	move.w	#$8F02,$C00004	; Set VDP autoincrement to 1 word/write
	move.l	#$40200000,$C00004	; Set up VDP to write to VRAM address 0x0020 (LEAVE FIRST ONE BLANK 32BYTES)
	lea	sega_vdp_font_set,a6	; Load address of Characters into a6
	move.l	#$1000,d7	;clear


	clr.l	d6
sega_vdp_font_loop1

	move.l  d6,$c00000	; Move data to VDP data port, and increment source address
	dbra	d7,sega_vdp_font_loop1



	move.w	#$8F02,$C00004	; Set VDP autoincrement to 1 word/write
	move.l	#$40200000,$C00004	; Set up VDP to write to VRAM address 0x0020 (LEAVE FIRST ONE BLANK 32BYTES)
	lea	sega_vdp_font_set,a6	; Load address of Characters into a6
	move.l	#767,d7	;#8x8  768
 
sega_vdp_font_loop2

	move.l  (a6)+,$c00000	; Move data to VDP data port, and increment source address
	dbra	d7,sega_vdp_font_loop2
	rts

sega_vdp_font_set
; space
	dc.l	$00000000
	dc.l	$00000000
	dc.l	$00000000
	dc.l	$00000000
	dc.l	$00000000
	dc.l	$00000000
	dc.l	$00000000
	dc.l	$00000000

; tile #2
	dc.l	$00010000
	dc.l	$00121000
	dc.l	$00121000
	dc.l	$00121000
	dc.l	$00121000
	dc.l	$00010000
	dc.l	$00121000
	dc.l	$00010000
; tile #3
	dc.l	$00101000
	dc.l	$01212100
	dc.l	$01212100
	dc.l	$00101000
	dc.l	$00000000
	dc.l	$00000000
	dc.l	$00000000
	dc.l	$00000000
; tile #4
	dc.l	$00101000
	dc.l	$01212100
	dc.l	$12222210
	dc.l	$01212100
	dc.l	$12222210
	dc.l	$01212100
	dc.l	$00101000
	dc.l	$00000000
; tile #5
	dc.l	$00121100
	dc.l	$01222210
	dc.l	$12121100
	dc.l	$01222100
	dc.l	$01121210
	dc.l	$12222100
	dc.l	$01121000
	dc.l	$00010000
; tile #6
	dc.l	$01100100
	dc.l	$12211210
	dc.l	$01112100
	dc.l	$00121000
	dc.l	$01211100
	dc.l	$12112210
	dc.l	$01001100
	dc.l	$00000000
; tile #7
	dc.l	$00100000
	dc.l	$01210000
	dc.l	$12121000
	dc.l	$01211100
	dc.l	$12121210
	dc.l	$12112100
	dc.l	$01221210
	dc.l	$00110100
; tile #8
	dc.l	$00010000
	dc.l	$00121000
	dc.l	$01210000
	dc.l	$00100000
	dc.l	$00000000
	dc.l	$00000000
	dc.l	$00000000
	dc.l	$00000000
; tile #9
	dc.l	$00001000
	dc.l	$00012100
	dc.l	$00121000
	dc.l	$01210000
	dc.l	$01210000
	dc.l	$00121000
	dc.l	$00012100
	dc.l	$00001000
; tile #11
	dc.l	$00100000
	dc.l	$01210000
	dc.l	$00121000
	dc.l	$00012100
	dc.l	$00012100
	dc.l	$00121000
	dc.l	$01210000
	dc.l	$00100000
; tile #11
	dc.l	$00010000
	dc.l	$01121100
	dc.l	$12121210
	dc.l	$01222100
	dc.l	$01222100
	dc.l	$12121210
	dc.l	$01121100
	dc.l	$00010000
; tile #12
	dc.l	$00010000
	dc.l	$00121000
	dc.l	$01121100
	dc.l	$12222210
	dc.l	$01121100
	dc.l	$00121000
	dc.l	$00010000
	dc.l	$00000000
; tile #13
	dc.l	$00000000
	dc.l	$00000000
	dc.l	$00000000
	dc.l	$00000000
	dc.l	$00100000
	dc.l	$01210000
	dc.l	$12100000
	dc.l	$01000000
; tile #14
	dc.l	$00000000
	dc.l	$00000000
	dc.l	$01111100
	dc.l	$12222210
	dc.l	$01111100
	dc.l	$00000000
	dc.l	$00000000
	dc.l	$00000000
; tile #15
	dc.l	$00000000
	dc.l	$00000000
	dc.l	$00000000
	dc.l	$00000000
	dc.l	$00000000
	dc.l	$00010000
	dc.l	$00121000
	dc.l	$00010000
; tile #16
	dc.l	$00000100
	dc.l	$00001210
	dc.l	$00012100
	dc.l	$00121000
	dc.l	$01210000
	dc.l	$12100000
	dc.l	$01000000
	dc.l	$00000000
; tile #17
	dc.l	$00111000
	dc.l	$01222100
	dc.l	$12112210
	dc.l	$12121210
	dc.l	$12121210
	dc.l	$12211210
	dc.l	$01222100
	dc.l	$00111000
; tile #18
	dc.l	$00010000
	dc.l	$00121000
	dc.l	$01221000
	dc.l	$00121000
	dc.l	$00121000
	dc.l	$00121000
	dc.l	$01222100
	dc.l	$00111000
; tile #19
	dc.l	$00111000
	dc.l	$01222100
	dc.l	$12111210
	dc.l	$01112100
	dc.l	$01221000
	dc.l	$12111100
	dc.l	$12222210
	dc.l	$01111100
; tile #21
	dc.l	$00111000
	dc.l	$01222100
	dc.l	$12111210
	dc.l	$01112100
	dc.l	$01111210
	dc.l	$12111210
	dc.l	$01222100
	dc.l	$00111000
; tile #21
	dc.l	$00011000
	dc.l	$00122100
	dc.l	$01212100
	dc.l	$12112100
	dc.l	$12222210
	dc.l	$01112100
	dc.l	$00012100
	dc.l	$00001000
; tile #22
	dc.l	$01111100
	dc.l	$12222210
	dc.l	$12111100
	dc.l	$12222100
	dc.l	$01111210
	dc.l	$12111210
	dc.l	$01222100
	dc.l	$00111000
; tile #23
	dc.l	$00111000
	dc.l	$01222100
	dc.l	$12111000
	dc.l	$12222100
	dc.l	$12111210
	dc.l	$12111210
	dc.l	$01222100
	dc.l	$00111000
; tile #24
	dc.l	$01111100
	dc.l	$12222210
	dc.l	$01112100
	dc.l	$00121000
	dc.l	$01210000
	dc.l	$12100000
	dc.l	$12100000
	dc.l	$01000000
; tile #25
	dc.l	$00111000
	dc.l	$01222100
	dc.l	$12111210
	dc.l	$01222100
	dc.l	$12111210
	dc.l	$12111210
	dc.l	$01222100
	dc.l	$00111000
; tile #26
	dc.l	$00111000
	dc.l	$01222100
	dc.l	$12111210
	dc.l	$12111210
	dc.l	$01222210
	dc.l	$00111210
	dc.l	$01222100
	dc.l	$00111000
; tile #27
	dc.l	$00000000
	dc.l	$00010000
	dc.l	$00121000
	dc.l	$00010000
	dc.l	$00010000
	dc.l	$00121000
	dc.l	$00010000
	dc.l	$00000000
; tile #28
	dc.l	$00000000
	dc.l	$00010000
	dc.l	$00121000
	dc.l	$00010000
	dc.l	$00010000
	dc.l	$00121000
	dc.l	$01211000
	dc.l	$00100000
; tile #29
	dc.l	$00001000
	dc.l	$00112100
	dc.l	$01221000
	dc.l	$12110000
	dc.l	$12110000
	dc.l	$01221000
	dc.l	$00112100
	dc.l	$00001000
; tile #31
	dc.l	$00000000
	dc.l	$01111100
	dc.l	$12222210
	dc.l	$01111100
	dc.l	$12222210
	dc.l	$01111100
	dc.l	$00000000
	dc.l	$00000000
; tile #31
	dc.l	$00100000
	dc.l	$01211000
	dc.l	$00122100
	dc.l	$00011210
	dc.l	$00011210
	dc.l	$00122100
	dc.l	$01211000
	dc.l	$00100000
; tile #32
	dc.l	$00111100
	dc.l	$01222210
	dc.l	$12111210
	dc.l	$01112100
	dc.l	$00121000
	dc.l	$00010000
	dc.l	$00121000
	dc.l	$00010000
; tile #33
	dc.l	$01111100
	dc.l	$12222210
	dc.l	$01111210
	dc.l	$01221210
	dc.l	$12112210
	dc.l	$12112210
	dc.l	$01222100
	dc.l	$00111000
; tile #34
	dc.l	$00111000
	dc.l	$01222100
	dc.l	$12111210
	dc.l	$12111210
	dc.l	$12222210
	dc.l	$12111210
	dc.l	$12101210
	dc.l	$01000100
; tile #35
	dc.l	$01111100
	dc.l	$12222210
	dc.l	$01211210
	dc.l	$01222100
	dc.l	$01211210
	dc.l	$01211210
	dc.l	$12222100
	dc.l	$01111000
; tile #36
	dc.l	$00111000
	dc.l	$01222100
	dc.l	$12111210
	dc.l	$12111100
	dc.l	$12111100
	dc.l	$12111210
	dc.l	$01222100
	dc.l	$00111000
; tile #37
	dc.l	$01111000
	dc.l	$12222100
	dc.l	$01211210
	dc.l	$01211210
	dc.l	$01211210
	dc.l	$01211210
	dc.l	$12222100
	dc.l	$01111000
; tile #38
	dc.l	$01111100
	dc.l	$12222210
	dc.l	$12111100
	dc.l	$12221000
	dc.l	$12110000
	dc.l	$12111100
	dc.l	$12222210
	dc.l	$01111100
; tile #39
	dc.l	$01111100
	dc.l	$12222210
	dc.l	$12111100
	dc.l	$12221000
	dc.l	$12110000
	dc.l	$12100000
	dc.l	$12100000
	dc.l	$01000000
; tile #41
	dc.l	$00111000
	dc.l	$01222100
	dc.l	$12111210
	dc.l	$12111100
	dc.l	$12112210
	dc.l	$12111210
	dc.l	$01222100
	dc.l	$00111000
; tile #41
	dc.l	$01000100
	dc.l	$12101210
	dc.l	$12111210
	dc.l	$12222210
	dc.l	$12111210
	dc.l	$12101210
	dc.l	$12101210
	dc.l	$01000100
; tile #42
	dc.l	$00111000
	dc.l	$01222100
	dc.l	$00121000
	dc.l	$00121000
	dc.l	$00121000
	dc.l	$00121000
	dc.l	$01222100
	dc.l	$00111000
; tile #43
	dc.l	$00000100
	dc.l	$00001210
	dc.l	$00001210
	dc.l	$00001210
	dc.l	$01001210
	dc.l	$12111210
	dc.l	$01222100
	dc.l	$00111000
; tile #44
	dc.l	$01000100
	dc.l	$12101210
	dc.l	$12112100
	dc.l	$12221000
	dc.l	$12121000
	dc.l	$12112100
	dc.l	$12101210
	dc.l	$01000100
; tile #45
	dc.l	$01000000
	dc.l	$12100000
	dc.l	$12100000
	dc.l	$12100000
	dc.l	$12100000
	dc.l	$12111100
	dc.l	$12222210
	dc.l	$01111100
; tile #46
	dc.l	$01000100
	dc.l	$12101210
	dc.l	$12212210
	dc.l	$12121210
	dc.l	$12121210
	dc.l	$12111210
	dc.l	$12101210
	dc.l	$01000100
; tile #47
	dc.l	$01000100
	dc.l	$12101210
	dc.l	$12211210
	dc.l	$12221210
	dc.l	$12122210
	dc.l	$12112210
	dc.l	$12101210
	dc.l	$01000100
; tile #48
	dc.l	$00111000
	dc.l	$01222100
	dc.l	$12111210
	dc.l	$12101210
	dc.l	$12101210
	dc.l	$12111210
	dc.l	$01222100
	dc.l	$00111000
; tile #49
	dc.l	$01111000
	dc.l	$12222100
	dc.l	$12111210
	dc.l	$12111210
	dc.l	$12222100
	dc.l	$12111000
	dc.l	$12100000
	dc.l	$01000000
; tile #51
	dc.l	$00111000
	dc.l	$01222100
	dc.l	$12212210
	dc.l	$12111210
	dc.l	$12121210
	dc.l	$12112100
	dc.l	$01221210
	dc.l	$00110100
; tile #51
	dc.l	$01111000
	dc.l	$12222100
	dc.l	$12111210
	dc.l	$12111210
	dc.l	$12222100
	dc.l	$12112100
	dc.l	$12101210
	dc.l	$01000100
; tile #52
	dc.l	$00111000
	dc.l	$01222100
	dc.l	$12111210
	dc.l	$01211100
	dc.l	$01122100
	dc.l	$12111210
	dc.l	$01222100
	dc.l	$00111000
; tile #53
	dc.l	$01111100
	dc.l	$12222210
	dc.l	$01121100
	dc.l	$00121000
	dc.l	$00121000
	dc.l	$00121000
	dc.l	$00121000
	dc.l	$00010000
; tile #54
	dc.l	$01000100
	dc.l	$12101210
	dc.l	$12101210
	dc.l	$12101210
	dc.l	$12101210
	dc.l	$12111210
	dc.l	$01222100
	dc.l	$00111000
; tile #55
	dc.l	$01000100
	dc.l	$12101210
	dc.l	$12111210
	dc.l	$01212100
	dc.l	$01212100
	dc.l	$00121000
	dc.l	$00121000
	dc.l	$00010000
; tile #56
	dc.l	$01000100
	dc.l	$12101210
	dc.l	$12101210
	dc.l	$12111210
	dc.l	$12121210
	dc.l	$12212210
	dc.l	$12101210
	dc.l	$01000100
; tile #57
	dc.l	$01000100
	dc.l	$12101210
	dc.l	$01212100
	dc.l	$00121000
	dc.l	$01212100
	dc.l	$12101210
	dc.l	$12101210
	dc.l	$01000100
; tile #58
	dc.l	$01000100
	dc.l	$12101210
	dc.l	$12111210
	dc.l	$01222100
	dc.l	$00121000
	dc.l	$00121000
	dc.l	$00121000
	dc.l	$00010000
; tile #59
	dc.l	$01111100
	dc.l	$12222210
	dc.l	$01111210
	dc.l	$00122100
	dc.l	$01221000
	dc.l	$12111100
	dc.l	$12222210
	dc.l	$01111100
; tile #61
	dc.l	$00111000
	dc.l	$01222100
	dc.l	$01211000
	dc.l	$01210000
	dc.l	$01210000
	dc.l	$01211000
	dc.l	$01222100
	dc.l	$00111000
; tile #61
	dc.l	$01000000
	dc.l	$12100000
	dc.l	$01210000
	dc.l	$00121000
	dc.l	$00012100
	dc.l	$00001210
	dc.l	$00000100
	dc.l	$00000000
; tile #62
	dc.l	$00111000
	dc.l	$01222100
	dc.l	$00112100
	dc.l	$00012100
	dc.l	$00012100
	dc.l	$00112100
	dc.l	$01222100
	dc.l	$00111000
; tile #63
	dc.l	$00010000
	dc.l	$00121000
	dc.l	$01222100
	dc.l	$12121210
	dc.l	$01121100
	dc.l	$00121000
	dc.l	$00121000
	dc.l	$00010000
; tile #64
	dc.l	$00010000
	dc.l	$00121000
	dc.l	$01211100
	dc.l	$12222210
	dc.l	$01211100
	dc.l	$00121000
	dc.l	$00010000
	dc.l	$00000000
; tile #65
	dc.l	$01111100
	dc.l	$12222210
	dc.l	$12111210
	dc.l	$01122210
	dc.l	$12212210
	dc.l	$12112210
	dc.l	$12222210
	dc.l	$01111100
; tile #66
	dc.l	$00000000
	dc.l	$00111000
	dc.l	$01222100
	dc.l	$00111210
	dc.l	$01222210
	dc.l	$12111210
	dc.l	$01222210
	dc.l	$00111100
; tile #67
	dc.l	$01000000
	dc.l	$12100000
	dc.l	$12100000
	dc.l	$12111000
	dc.l	$12222100
	dc.l	$12111210
	dc.l	$12222100
	dc.l	$01111000
; tile #68
	dc.l	$00000000
	dc.l	$00111000
	dc.l	$01222100
	dc.l	$12111210
	dc.l	$12111100
	dc.l	$12111210
	dc.l	$01222100
	dc.l	$00111000
; tile #69
	dc.l	$00000100
	dc.l	$00001210
	dc.l	$00001210
	dc.l	$00111210
	dc.l	$01222210
	dc.l	$12111210
	dc.l	$01222210
	dc.l	$00111100
; tile #71
	dc.l	$00000000
	dc.l	$00111000
	dc.l	$01222100
	dc.l	$12111210
	dc.l	$12222100
	dc.l	$12111100
	dc.l	$01222210
	dc.l	$00111100
; tile #71
	dc.l	$00011000
	dc.l	$00122100
	dc.l	$01211210
	dc.l	$01211100
	dc.l	$12221000
	dc.l	$01210000
	dc.l	$01210000
	dc.l	$00100000
; tile #72
	dc.l	$00000000
	dc.l	$00111000
	dc.l	$01222100
	dc.l	$12111210
	dc.l	$01222210
	dc.l	$01111210
	dc.l	$12222100
	dc.l	$01111000
; tile #73
	dc.l	$01000000
	dc.l	$12100000
	dc.l	$12100000
	dc.l	$12111000
	dc.l	$12222100
	dc.l	$12111210
	dc.l	$12101210
	dc.l	$01000100
; tile #74
	dc.l	$00010000
	dc.l	$00121000
	dc.l	$00111000
	dc.l	$01221000
	dc.l	$00121000
	dc.l	$00121000
	dc.l	$01222100
	dc.l	$00111000
; tile #75
	dc.l	$00000100
	dc.l	$00001210
	dc.l	$00001110
	dc.l	$00012210
	dc.l	$01001210
	dc.l	$12111210
	dc.l	$01222100
	dc.l	$00111000
; tile #76
	dc.l	$01000000
	dc.l	$12101000
	dc.l	$12112100
	dc.l	$12121000
	dc.l	$12221000
	dc.l	$12112100
	dc.l	$12101210
	dc.l	$01000100
; tile #77
	dc.l	$00110000
	dc.l	$01221000
	dc.l	$00121000
	dc.l	$00121000
	dc.l	$00121000
	dc.l	$00121000
	dc.l	$01222100
	dc.l	$00111000
; tile #78
	dc.l	$00000000
	dc.l	$01111000
	dc.l	$12222100
	dc.l	$12121210
	dc.l	$12121210
	dc.l	$12121210
	dc.l	$12121210
	dc.l	$01010100
; tile #79
	dc.l	$00000000
	dc.l	$01111000
	dc.l	$12222100
	dc.l	$12111210
	dc.l	$12101210
	dc.l	$12101210
	dc.l	$12101210
	dc.l	$01000100
; tile #81
	dc.l	$00000000
	dc.l	$00111000
	dc.l	$01222100
	dc.l	$12111210
	dc.l	$12101210
	dc.l	$12111210
	dc.l	$01222100
	dc.l	$00111000
; tile #81
	dc.l	$00000000
	dc.l	$01111000
	dc.l	$12222100
	dc.l	$12111210
	dc.l	$12222100
	dc.l	$12111000
	dc.l	$12100000
	dc.l	$01000000
; tile #82
	dc.l	$00000000
	dc.l	$00111100
	dc.l	$01222210
	dc.l	$12111210
	dc.l	$01222210
	dc.l	$00111210
	dc.l	$00001210
	dc.l	$00000100
; tile #83
	dc.l	$00000000
	dc.l	$01011100
	dc.l	$12122210
	dc.l	$12211100
	dc.l	$12100000
	dc.l	$12100000
	dc.l	$12100000
	dc.l	$01000000
; tile #84
	dc.l	$00000000
	dc.l	$00111100
	dc.l	$01222210
	dc.l	$12111100
	dc.l	$01222100
	dc.l	$01111210
	dc.l	$12222100
	dc.l	$01111000
; tile #85
	dc.l	$00010000
	dc.l	$00121000
	dc.l	$00121000
	dc.l	$01222100
	dc.l	$00121000
	dc.l	$00121100
	dc.l	$00012210
	dc.l	$00001100
; tile #86
	dc.l	$00000000
	dc.l	$01000100
	dc.l	$12101210
	dc.l	$12101210
	dc.l	$12101210
	dc.l	$12112210
	dc.l	$01221210
	dc.l	$00110100
; tile #87
	dc.l	$00000000
	dc.l	$01000100
	dc.l	$12101210
	dc.l	$12101210
	dc.l	$12101210
	dc.l	$01212100
	dc.l	$00121000
	dc.l	$00010000
; tile #88
	dc.l	$00000000
	dc.l	$01000100
	dc.l	$12101210
	dc.l	$12111210
	dc.l	$12121210
	dc.l	$12222210
	dc.l	$12121210
	dc.l	$01010100
; tile #89
	dc.l	$00000000
	dc.l	$01000100
	dc.l	$12101210
	dc.l	$01212100
	dc.l	$00121000
	dc.l	$01212100
	dc.l	$12101210
	dc.l	$01000100
; tile #91
	dc.l	$00000000
	dc.l	$01000100
	dc.l	$12101210
	dc.l	$12111210
	dc.l	$01222210
	dc.l	$01111210
	dc.l	$12222100
	dc.l	$01111000
; tile #91
	dc.l	$00000000
	dc.l	$01111100
	dc.l	$12222210
	dc.l	$01112100
	dc.l	$00121000
	dc.l	$01211100
	dc.l	$12222210
	dc.l	$01111100
; tile #92
	dc.l	$00111000
	dc.l	$01222100
	dc.l	$01211000
	dc.l	$01210000
	dc.l	$01210000
	dc.l	$01211000
	dc.l	$01222100
	dc.l	$00111000
; tile #93
	dc.l	$01000000
	dc.l	$12100000
	dc.l	$01210000
	dc.l	$00121000
	dc.l	$00012100
	dc.l	$00001210
	dc.l	$00000100
	dc.l	$00000000
; tile #94
	dc.l	$00111000
	dc.l	$01222100
	dc.l	$00112100
	dc.l	$00012100
	dc.l	$00012100
	dc.l	$00112100
	dc.l	$01222100
	dc.l	$00111000
; tile #95
	dc.l	$00010000
	dc.l	$00121000
	dc.l	$01222100
	dc.l	$12121210
	dc.l	$01121100
	dc.l	$00121000
	dc.l	$00121000
	dc.l	$00010000
; tile #97
	dc.l	$00010000
	dc.l	$00121000
	dc.l	$01211100
	dc.l	$12222210
	dc.l	$01211100
	dc.l	$00121000
	dc.l	$00010000
	dc.l	$00000000

endfunction


***************************************************************************************************************************
* sega_vdp_displayimage(tilestart,pointer)
***************************************************************************************************************************

function	sega_vdp_displayimage	sega_vdp_displayimage_tile,sega_vdp_displayimage_pal,sega_vdp_displayimage_pointer
rem	sega_vdp_displayimage( tilestart.w, palette.b, pointer.l )
rem
rem	loads image into plane a
stack	a6/d4-d7

def	sega_vdp_displayimage_tile	word
def	sega_vdp_displayimage_tiles	word
def	sega_vdp_displayimage_pointer	long

def	sega_vdp_displayimage_posx	word
def	sega_vdp_displayimage_posy	word
def	sega_vdp_displayimage_pal	byte
def	sega_vdp_displayimage_pal2	byte

sega_vdp_displayimage

;scroll fix



	move.w	#$8F00,$C00004	; Set VDP autoincrement to 2 words/write
	move.w	#0,d7	; copy Y map position to d0 lower word

	move.l	#$40020010,$c00004 ; setup write to vsega_vdp
	move.w	d7,$c00000 ; copy y position to vsega_vdp 

	move.w	#0,d7	; copy Y map position to d7 lower word

	move.l	#$70020002,$c00004 ; setup write to vsega_vdp
	move.w	d7,$c00000 ; copy y position to vsega_vdp 


;load tile code



	move.w	#$8F02,$C00004
	clr.l	d7
	clr.l	d6
	move.w	sega_vdp_displayimage_tile,d7

	move.w	#32,d6
	mulu.w	d6,d7
	move.w	d7,d6
	and.w	#$3fff,d6
	add.w	#$4000,d6	;d6 high bytes
	rol.w	#2,d7
	and.w	#3,d7	;low byte
	swap	d6
	add.w	d7,d6

	move.l	d6,$C00004	; Set up VDP to write to VRAM address 0x0020 (LEAVE FIRST ONE BLANK 32BYTES)

	move.l	sega_vdp_displayimage_pointer,a6

	move.w	#1120,d6
	move.w	#8,d7
	mulu.w	d6,d7
	sub.w	#1,d7

sega_vdp_displayimage_lp

	move.l	(a6)+,$c00000
	dbra	d7,sega_vdp_displayimage_lp
;set display

	move.w	#0,d5
	move.w	#0,d6
	move.w	sega_vdp_displayimage_tile,d7


sega_vdp_displayimage_setscreen1
	move.w	d5,sega_vdp_displayimage_posx
	move.w	d6,sega_vdp_displayimage_posy
	move.w	d7,sega_vdp_displayimage_tile

;	sega_vdp_setplanea(posx,posy,tile,#0,#0,#0,#0) 

;	move.w	sega_vdp_displayimage_posy,d6
;	move.w	sega_vdp_displayimage_posx,d5
;	move.w	sega_vdp_displayimage_tile,d7
	clr.l	d4

;	move.b	#0,d4	;priority
	lsl.b	#2,d4
	add.b	sega_vdp_displayimage_pal,d4
	lsl.b	#1,d4
	add.b	#0,d4	;vflip
	lsl.b	#1,d4
	add.b	#0,d4	;hflip
	lsl.b	#3,d4
	lsl.l	#8,d4
	
	mulu.w	#128,d6	;64 x 2 each tile is word
	mulu.w	#2,d5	;x2 for word
	add.l	d5,d6


	lsl.l	#8,d6
	lsl.l	#8,d6
	add.l	d4,d7
	add.l	#$60000003,d6
	move.l	d6,$00c00004	;what register?
	move.w	d7,$00c00000	;written


	move.w	sega_vdp_displayimage_posy,d6
	move.w	sega_vdp_displayimage_posx,d5
	move.w	sega_vdp_displayimage_tile,d7

	add.w	#1,d7	;tile
	add.w	#1,d5	;xpos
	cmp.w	#40,d5
	blo	sega_vdp_displayimage_setscreen1
	move.w	#0,d5
	add.w	#1,d6
	cmp.w	#28,d6
	blo	sega_vdp_displayimage_setscreen1

	rts
endfunction



