view src/vdp.h @ 26:083347ccd508

Implemented vblank interrupts and fixed a bug in exception vector address calculation
author Michael Pavone <pavone@retrodev.com>
date Fri, 01 Apr 2016 21:34:38 -0700
parents a085f17b79e9
children 6e7bfe83d2b0
line wrap: on
line source

#ifndef VDP_H_
#define VDP_H_

typedef struct {
	uint16_t source;
	uint16_t x;
	uint8_t  hflip;
	uint8_t  palpriority;
} sprite_draw;

typedef struct {
	uint16_t *framebuffer;
	uint8_t  *drawbuffer;
	uint8_t  *readbuffer;
	uint32_t cycles;
	uint32_t clock_inc;
	int      pitch;
	
	uint16_t fifo;
	uint16_t dest_offset;
	uint16_t status;
	
	uint16_t vcounter;
	uint16_t hcounter;
	
	uint16_t vscroll;
	uint16_t hscroll;
	
	uint16_t draw_source;
	uint16_t draw_dest;
	
	
	uint16_t vram[32*512];
	uint8_t  linebuffers[328*2];
	uint16_t sram[64*2];
	uint16_t cram[64];
	
	sprite_draw sprite_draws[40];
	
	uint8_t  fifo_dest;
	uint8_t  draw_counter;
	uint8_t  hflip;
	uint8_t  palpriority;
	uint8_t  current_draw;
} vdp;

enum {
	FIFO_DEST_INVALID,
	FIFO_DEST_VRAM,
	FIFO_DEST_SRAM,
	FIFO_DEST_CRAM
};

#define VDP_STATUS_FIFO         1
#define VDP_STATUS_VRAM         2
#define VDP_STATUS_SRAM         4
#define VDP_STATUS_ENABLED      8
#define VDP_STATUS_SPRITE_SCAN  16
#define VDP_STATUS_PENDING_VINT 32

void vdp_init(vdp *context, uint32_t clock_div);
void vdp_run(vdp *context, uint32_t target);
void vdp_write_address(vdp *context, uint16_t value);
void vdp_write_data(vdp *context, uint16_t value);
void vdp_write_hscroll(vdp *context, uint16_t value);
uint32_t vdp_next_interrupt(vdp *context);
void vdp_ack_interrupt(vdp *context);
uint8_t vdp_interrupt_pending(vdp *context);

#endif //VDP_H_