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