|
|
1.1 root 1: /*****************************************************************************/
2: /* Generator - Sega Genesis emulation - (c) James Ponder 1997-2000 */
3: /*****************************************************************************/
4: /* */
5: /* uip-allegro - User interface for allegro (15/16 bit) */
6: /* */
7: /*****************************************************************************/
8:
9: #include <sys/nearptr.h>
10: #include <stdio.h>
11:
12: #include "generator.h"
13: #include <allegro.h>
14:
15: #include "uip.h"
16: #include "ui.h"
17: #include "ui-console.h"
18: #include "vdp.h"
19: #include "mem68k.h"
20:
21: /*** forward reference declarations ***/
22:
23: /*** static variables ***/
24:
25: static uint8 uip_vga = 0; /* flag for whether in VGA more or not */
26: static uint8 uip_displaybanknum = 0; /* view this one, write to other one */
27: static BITMAP *uip_bank0; /* first video bank */
28: static BITMAP *uip_bank1; /* second video bank */
29: static BITMAP *uip_writebank; /* current write bank */
30: static uint8 uip_keypoll = 0; /* flag indicating requires polling */
31: static t_uipinfo *uip_uipinfo = NULL; /* uipinfo */
32:
33: /*** Code ***/
34:
35: static void uip_keyboardhandler(int scancode) {
36: int press;
37: press = (scancode & 128) ? 0 : 1;
38: scancode = scancode & 127;
39: if (press) {
40: if (scancode == KEY_F5) {
41: ui_info^= 1;
42: ui_clearnext = 2;
43: } else if (scancode == KEY_F6) {
44: vdp_pal^= 1;
45: vdp_setupvideo();
46: ui_clearnext = 2;
47: } else if (scancode == KEY_F7) {
48: vdp_overseas^= 1;
49: ui_clearnext = 2;
50: } else if (scancode == KEY_F8) {
51: ui_vdpsimple^= 1;
52: ui_clearnext = 2;
53: } else if (scancode == KEY_F9) {
54: ui_vsync^= 1;
55: ui_clearnext = 2;
56: } else if (scancode == KEY_1) {
57: vdp_layerB^= 1;
58: ui_clearnext = 2;
59: } else if (scancode == KEY_2) {
60: vdp_layerBp^= 1;
61: ui_clearnext = 2;
62: } else if (scancode == KEY_3) {
63: vdp_layerA^= 1;
64: ui_clearnext = 2;
65: } else if (scancode == KEY_4) {
66: vdp_layerAp^= 1;
67: ui_clearnext = 2;
68: } else if (scancode == KEY_5) {
69: vdp_layerW^= 1;
70: ui_clearnext = 2;
71: } else if (scancode == KEY_6) {
72: vdp_layerWp^= 1;
73: ui_clearnext = 2;
74: } else if (scancode == KEY_7) {
75: vdp_layerH^= 1;
76: ui_clearnext = 2;
77: } else if (scancode == KEY_8) {
78: vdp_layerS^= 1;
79: ui_clearnext = 2;
80: } else if (scancode == KEY_9) {
81: vdp_layerSp^= 1;
82: ui_clearnext = 2;
83: }
84: /*
85: {
86: FILE *moo;
87: int i;
88: moo = fopen("/tmp/screenshot.raw", "w");
89: for (i = 0; i < 640*480; i++) {
90: fputc(((((uint16 *)uip_uipinfo.screenmem)[i]>>10) & 0x1f)<<3, moo);
91: fputc(((((uint16 *)uip_uipinfo.screenmem)[i]>>5) & 0x1f)<<3, moo);
92: fputc(((((uint16 *)uip_uipinfo.screenmem)[i]>>0) & 0x1f)<<3, moo);
93: }
94: fclose(moo);
95: }
96: */
97: }
98: }
99:
100: END_OF_FUNCTION(uip_keyboardhandler);
101:
102: int uip_init(t_uipinfo *uipinfo)
103: {
104: uip_uipinfo = uipinfo;
105: check_cpu();
106: printf("Initialising %s - %s (%d:%d:%d:%d:%d)\n", allegro_id, cpu_vendor,
107: cpu_family, cpu_model, cpu_fpu?1:0, cpu_mmx?1:0, cpu_3dnow?1:0);
108: printf("\nNote: Allegro can take at least 5 seconds to quit!\n");
109: sleep(2);
110: if (allegro_init()) {
111: LOG_CRITICAL(("Failed to initialise allegro"));
112: return 1;
113: }
114: LOCK_VARIABLE(ui_info);
115: LOCK_VARIABLE(vdp_pal);
116: LOCK_VARIABLE(vdp_overseas);
117: LOCK_VARIABLE(ui_vdpsimple);
118: LOCK_VARIABLE(ui_vsync);
119: LOCK_VARIABLE(ui_clearnext);
120: LOCK_VARIABLE(vdp_layerB);
121: LOCK_VARIABLE(vdp_layerBp);
122: LOCK_VARIABLE(vdp_layerA);
123: LOCK_VARIABLE(vdp_layerAp);
124: LOCK_VARIABLE(vdp_layerW);
125: LOCK_VARIABLE(vdp_layerWp);
126: LOCK_VARIABLE(vdp_layerH);
127: LOCK_VARIABLE(vdp_layerS);
128: LOCK_VARIABLE(vdp_layerSp);
129: LOCK_FUNCTION(uip_keyboardhandler);
130: return 0;
131: }
132:
133: int uip_vgamode(void)
134: {
135: int depth, rate;
136: unsigned long screenbase;
137:
138: for (rate = 60; rate <= 70; rate+=10) {
139: for (depth = 15; depth <= 17; depth++) {
140: LOG_VERBOSE(("Trying mode 640x480 depth %d rate %d", depth, rate));
141: set_color_depth((depth == 17 ? 32 : depth));
142: request_refresh_rate(rate);
143: if ((set_gfx_mode(GFX_AUTODETECT, 640, 480, 0, 480*2) < 0)) {
144: LOG_VERBOSE(("Mode not supported"));
145: continue;
146: }
147: if (SCREEN_W != 640 || SCREEN_H != 480) {
148: LOG_CRITICAL(("Screen not approriate for depth %d rate %d", depth,
149: rate));
150: continue;
151: }
152: goto WHEE;
153: }
154: }
155: LOG_CRITICAL(("Failed to find suitable mode"));
156: return 1;
157: WHEE:
158: uip_vga = 1;
159: uip_uipinfo->redshift = ui_topbit(makecol(255,0,0))-4;
160: uip_uipinfo->greenshift = ui_topbit(makecol(0,255,0))-4;
161: uip_uipinfo->blueshift = ui_topbit(makecol(0,0,255))-4;
162: if ((uip_bank0 = create_video_bitmap(640, 480)) == NULL ||
163: (uip_bank1 = create_video_bitmap(640, 480)) == NULL) {
164: uip_textmode();
165: LOG_CRITICAL(("Failed to allocate memory pages"));
166: return 1;
167: }
168: if (is_linear_bitmap(uip_bank0) == 0 ||
169: is_linear_bitmap(uip_bank1) == 0 ||
170: is_video_bitmap(uip_bank0) == 0 ||
171: is_video_bitmap(uip_bank1) == 0) {
172: uip_textmode();
173: LOG_CRITICAL(("Allocated bitmaps not suitable or linear addressing mode "
174: "not supported by hardware"));
175: return 1;
176: }
177: /* don't you just hate MS platforms? */
178: __djgpp_nearptr_enable();
179: __dpmi_get_segment_base_address(uip_bank0->seg, &screenbase);
180: uip_uipinfo->screenmem0 = (uint8 *)(screenbase + uip_bank0->line[0] -
181: __djgpp_base_address);
182: __dpmi_get_segment_base_address(uip_bank1->seg, &screenbase);
183: uip_uipinfo->screenmem1 = (uint8 *)(screenbase + uip_bank1->line[0] -
184: __djgpp_base_address);
185: uip_uipinfo->linewidth = 2*VIRTUAL_W; /* 16 bit */
186: uip_displaybank(0); /* set current to 0th bank */
187: uip_clearscreen(); /* clear bank */
188: ui_setupscreen(); /* setup bank */
189: uip_displaybank(-1); /* toggle bank */
190: uip_clearscreen(); /* clear bank */
191: ui_setupscreen(); /* setup bank */
192: if (install_keyboard() == -1) {
193: uip_textmode();
194: LOG_CRITICAL(("Unable to initialise keyboard"));
195: return 1;
196: }
197: if (uip_bank0->y_ofs != 0 || uip_bank1->y_ofs != 480) {
198: uip_textmode();
199: LOG_CRITICAL(("sorry, I don't understand this video layout"));
200: return 1;
201: }
202: keyboard_lowlevel_callback = uip_keyboardhandler;
203: uip_keypoll = keyboard_needs_poll() ? 1 : 0;
204: return 0;
205: }
206:
207: void uip_displaybank(int bank) {
208: if (bank == -1)
209: bank = uip_displaybanknum ^ 1;
210: uip_writebank = bank ? uip_bank0 : uip_bank1;
211: if (show_video_bitmap(bank ? uip_bank1 : uip_bank0))
212: ui_err("Failed to page flip");
213: uip_uipinfo->screenmem_w = bank ? uip_uipinfo->screenmem0 :
214: uip_uipinfo->screenmem1;
215: uip_displaybanknum = bank;
216: }
217:
218: void uip_clearscreen(void) {
219: clear(uip_writebank);
220: }
221:
222: void uip_textmode(void)
223: {
224: if (uip_vga) {
225: remove_keyboard();
226: set_gfx_mode(GFX_TEXT, 0, 0, 0, 0);
227: }
228: uip_vga = 0;
229: }
230:
231: int uip_checkkeyboard(void)
232: {
233: if (uip_keypoll)
234: poll_keyboard();
235: mem68k_cont1_a = key[KEY_A] ? 1 : 0;
236: mem68k_cont1_b = (key[KEY_B] ||
237: key[KEY_S]) ? 1 : 0;
238: mem68k_cont1_c = (key[KEY_C] ||
239: key[KEY_D]) ? 1 : 0;
240: mem68k_cont1_left = key[KEY_LEFT] ? 1 : 0;
241: mem68k_cont1_up = key[KEY_UP] ? 1 : 0;
242: mem68k_cont1_right = key[KEY_RIGHT] ? 1 : 0;
243: mem68k_cont1_down = key[KEY_DOWN] ? 1 : 0;
244: mem68k_cont1_start = key[KEY_ENTER] ? 1 : 0;
245: if (key[KEY_F12])
246: gen_reset();
247: return (key[KEY_ESC] ? 1 : 0);
248: }
249:
250: void uip_vsync(void)
251: {
252: vsync();
253: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.