amiga_imgv

view src/amiga/gfx.c @ 3:663471a80c21

broken + sdl emu
author John Tsiombikas <nuclear@member.fsf.org>
date Thu, 26 Oct 2017 15:49:56 +0300
parents a4788c959918
children 0fd37effde29
line source
1 #include <stdio.h>
2 #include <proto/exec.h>
3 #include "gfx.h"
4 #include "copper.h"
5 #include "hwregs.h"
6 #include "logger.h"
8 static int scr_width, scr_height;
9 static int fb_width, fb_height;
10 static int num_bitplanes;
11 static uint16_t prev_intena, prev_intreq, prev_adkcon, prev_dmacon;
13 static unsigned char *framebuf;
14 static unsigned long fbsize;
15 static int own_framebuf;
17 int gfx_init(int nbpl, unsigned int flags)
18 {
19 uint16_t bplcon0;
21 num_bitplanes = nbpl;
22 scr_width = fb_width = (flags & GFX_HIRES) ? 640 : 320;
23 scr_height = fb_height = (flags & GFX_ILACE) ? 512 : 256;
25 Forbid();
27 prev_dmacon = REG_DMACONR;
28 REG_DMACON = CLRBITS(DMA_ALL);
30 prev_intena = REG_INTENAR;
31 prev_intreq = REG_INTREQR;
32 prev_adkcon = REG_ADKCONR;
34 if(init_copper(0, 0) == -1) {
35 return -1;
36 }
38 if(!gfx_set_framebuffer(0, scr_width, scr_height)) {
39 gfx_shutdown();
40 return -1;
41 }
43 bplcon0 = BPLCON0_COUNT(nbpl) | BPLCON0_COLOR;
44 if(flags & GFX_HIRES) bplcon0 |= BPLCON0_HIRES;
45 if(flags & GFX_ILACE) bplcon0 |= BPLCON0_LACE;
46 if(flags & GFX_HAM) bplcon0 |= BPLCON0_HOMOD;
47 if(flags & GFX_DBLPF) bplcon0 |= BPLCON0_DBLPF;
49 REG_BPLCON0 = bplcon0;
50 REG_BPLCON1 = 0; /* h-scroll */
51 REG_DIWSTART = 0x2c81; /* 81h horiz start, 2ch vertical start */
52 REG_DIWSTOP = 0x2cc1;
53 REG_DDFSTART = (flags & GFX_HIRES) ? 0x3c : 0x38;
54 REG_DDFSTOP = (flags & GFX_HIRES) ? 0xd4 : 0xd0;
56 gfx_wait_vblank();
57 gfx_begin_copperlist();
58 add_copper(COPPER_END);
60 logmsg("starting DMA\n");
61 REG_DMACON = SETBITS(DMA_BPL | DMA_COPPER | DMA_MASTER);
62 return 0;
63 }
65 void gfx_shutdown(void)
66 {
67 REG_DMACON = CLRBITS(DMA_ALL);
68 REG_DMACON = SETBITS(prev_dmacon);
70 REG_INTREQ = CLRBITS(0x7fff);
71 REG_INTREQ = SETBITS(prev_intreq);
73 REG_ADKCON = CLRBITS(0x7fff);
74 REG_ADKCON = SETBITS(prev_adkcon);
76 REG_INTENA = CLRBITS(INTEN_ALL);
77 REG_INTENA = SETBITS(prev_intena);
79 if(framebuf && own_framebuf) {
80 FreeMem(framebuf, fbsize);
81 }
82 framebuf = 0;
84 cleanup_copper();
85 Permit();
86 }
88 int gfx_screen_width(void)
89 {
90 return scr_width;
91 }
93 int gfx_screen_height(void)
94 {
95 return scr_height;
96 }
98 void *gfx_set_framebuffer(void *fb, int width, int height)
99 {
100 /*unsigned int bpl_scanline_sz = width / 8;*/
101 unsigned long sz = width * height / 8 * num_bitplanes;
102 uint32_t bpladdr;
103 uint16_t bplmod;
105 if(framebuf && own_framebuf) {
106 FreeMem(framebuf, fbsize);
107 }
109 if(fb) {
110 framebuf = fb;
111 own_framebuf = 0;
112 } else {
113 if(!(framebuf = AllocMem(sz, MEMF_CHIP))) {
114 logmsg("gfx_set_framebuffer failed to allocate %lu bytes of chip mem for framebuffer\n", sz);
115 return 0;
116 }
117 own_framebuf = 1;
118 }
120 fb_width = width;
121 fb_height = height;
122 fbsize = sz;
124 bpladdr = (uint32_t)framebuf;
125 logmsg("bitplane address: %lx\n", (unsigned long)bpladdr);
127 bplmod = (fb_width - scr_width) / 8 + fb_width / 8 * num_bitplanes;
128 REG_BPL1MOD = bplmod;
129 REG_BPL2MOD = bplmod;
131 /*
132 REG32_BPL1PT = bpladdr; bpladdr += bpl_scanline_sz;
133 REG32_BPL2PT = bpladdr; bpladdr += bpl_scanline_sz;
134 REG32_BPL3PT = bpladdr; bpladdr += bpl_scanline_sz;
135 REG32_BPL4PT = bpladdr; bpladdr += bpl_scanline_sz;
136 REG32_BPL5PT = bpladdr; bpladdr += bpl_scanline_sz;
137 REG32_BPL6PT = bpladdr;
138 */
139 return framebuf;
140 }
142 void *gfx_get_framebuffer(void)
143 {
144 return framebuf;
145 }
147 int gfx_framebuffer_width(void)
148 {
149 return fb_width;
150 }
152 int gfx_framebuffer_height(void)
153 {
154 return fb_height;
155 }
157 void gfx_begin_copperlist(void)
158 {
159 static const uint16_t bplptr[] = {
160 REGN_BPL1PTH, REGN_BPL2PTH, REGN_BPL3PTH, REGN_BPL4PTH, REGN_BPL5PTH, REGN_BPL6PTH
161 };
162 int i;
163 uint32_t bpladdr;
164 bpladdr = (uint32_t)framebuf;
166 for(i=0; i<num_bitplanes; i++) {
167 add_copper(COPPER_MOVE(bplptr[i], bpladdr >> 16));
168 add_copper(COPPER_MOVE(bplptr[i] + 2, bpladdr));
169 bpladdr += fb_width / 8 * num_bitplanes;
170 }
171 }
173 static int mouse_bnstate(void)
174 {
175 return (REG_CIAA_PORTA & CIAA_PA_FIR0) ? 0 : 1;
176 }
178 int gfx_next_event(union gfx_event *ev, int block)
179 {
180 /* TODO */
181 if(block) {
182 while(!mouse_bnstate());
183 ev->type = GFX_EV_QUIT;
184 return 1;
185 }
187 if(mouse_bnstate()) {
188 ev->type = GFX_EV_QUIT;
189 return 1;
190 }
192 return 0;
193 }
195 void gfx_wait_vpos(int x)
196 {
197 x <<= 8;
198 while((REG32_VPOSR & 0x1ff00) < x);
199 }
201 void gfx_wait_vblank(void)
202 {
203 gfx_wait_vpos(300);
204 }
206 void gfx_show_image(struct ham_image *img)
207 {
208 }