|
|
1.1 ! root 1: /* Generator is (c) James Ponder, 1997-2001 http://www.squish.net/generator/ */ ! 2: ! 3: /* user interface for svgalib (15/16 bit) */ ! 4: ! 5: #include <stdio.h> ! 6: #include <unistd.h> ! 7: ! 8: #include "generator.h" ! 9: #include <vga.h> ! 10: #include <vgakeyboard.h> ! 11: ! 12: #include "uip.h" ! 13: #include "ui.h" ! 14: #include "ui-console.h" ! 15: #include "vdp.h" ! 16: #include "mem68k.h" ! 17: ! 18: #define BANKSIZE 640*480*2 ! 19: ! 20: /*** forward reference declarations ***/ ! 21: ! 22: static int uip_getshifts(t_uipinfo *uipinfo); ! 23: ! 24: /*** static variables ***/ ! 25: ! 26: static uint8 uip_vga = 0; /* flag for whether in VGA more or not */ ! 27: static uint8 uip_displaybanknum = 0; /* view this one, write to other one */ ! 28: static t_uipinfo *uip_uipinfo = NULL; /* uipinfo */ ! 29: static uint8 uip_key[256]; /* keyboard state */ ! 30: static int uip_forceredshift = -1; /* if set, forces red shift position */ ! 31: static int uip_forcegreenshift = -1; /* if set, forces green shift position */ ! 32: static int uip_forceblueshift = -1; /* if set, forces blue shift position */ ! 33: ! 34: /*** Code ***/ ! 35: ! 36: static void uip_keyboardhandler(int scancode, int press) { ! 37: if (scancode >= 256) ! 38: return; ! 39: if (uip_key[scancode] == press) ! 40: return; ! 41: uip_key[scancode] = press; ! 42: if (press) { ! 43: if (scancode == SCANCODE_F1) { ! 44: ui_fkeys|= 1<<1; ! 45: } else if (scancode == SCANCODE_F2) { ! 46: ui_fkeys|= 1<<2; ! 47: } else if (scancode == SCANCODE_F3) { ! 48: ui_fkeys|= 1<<3; ! 49: } else if (scancode == SCANCODE_F4) { ! 50: ui_fkeys|= 1<<4; ! 51: } else if (scancode == SCANCODE_F5) { ! 52: ui_fkeys|= 1<<5; ! 53: } else if (scancode == SCANCODE_F6) { ! 54: ui_fkeys|= 1<<6; ! 55: } else if (scancode == SCANCODE_F7) { ! 56: ui_fkeys|= 1<<7; ! 57: } else if (scancode == SCANCODE_F8) { ! 58: ui_fkeys|= 1<<8; ! 59: } else if (scancode == SCANCODE_F9) { ! 60: ui_fkeys|= 1<<9; ! 61: } else if (scancode == SCANCODE_F10) { ! 62: ui_fkeys|= 1<<10; ! 63: } else if (scancode == SCANCODE_F11) { ! 64: ui_fkeys|= 1<<11; ! 65: } else if (scancode == SCANCODE_F12) { ! 66: ui_fkeys|= 1<<12; ! 67: } ! 68: } ! 69: } ! 70: ! 71: int uip_init(t_uipinfo *uipinfo) ! 72: { ! 73: uip_uipinfo = uipinfo; ! 74: printf("Initialising svgalib...\n"); ! 75: sleep(1); ! 76: if (vga_init()) { ! 77: LOG_CRITICAL(("Failed to initialise SVGALib")); ! 78: return 1; ! 79: } ! 80: return 0; ! 81: } ! 82: ! 83: int uip_vgamode(void) ! 84: { ! 85: vga_modeinfo *modeinfo; ! 86: int cardmemory; ! 87: ! 88: uip_vga = 1; ! 89: if (vga_setmode(G640x480x32K) == -1) { ! 90: LOG_CRITICAL(("640x480 @ 32K colours not supported by hardware")); ! 91: LOG_CRITICAL(("Trying 640x480 @ 64K colours...")); ! 92: if (vga_setmode(G640x480x64K) == -1) { ! 93: LOG_CRITICAL(("640x480 @ 64K colours not supported by hardware")); ! 94: uip_textmode(); ! 95: LOG_CRITICAL(("Unable to change SVGA mode, mode not supported by " ! 96: "hardware?")); ! 97: LOG_CRITICAL(("Check /etc/vga/libvga.config to ensure your card " ! 98: "is not commented out")); ! 99: return 1; ! 100: } ! 101: } ! 102: if (vga_claimvideomemory(2*BANKSIZE) == -1) { ! 103: uip_textmode(); ! 104: LOG_CRITICAL(("Unable to allocated video memory - 2MB video card " ! 105: "required.")); ! 106: return 1; ! 107: } ! 108: if ((modeinfo = vga_getmodeinfo(vga_getcurrentmode())) == NULL) { ! 109: uip_textmode(); ! 110: LOG_CRITICAL(("Unable to get current mode information")); ! 111: return 1; ! 112: } ! 113: LOG_VERBOSE(("Resolution %dx%d bytesperpixel %d linewidth %d", ! 114: modeinfo->width, modeinfo->height, modeinfo->bytesperpixel, ! 115: modeinfo->linewidth)); ! 116: if (modeinfo->width != 640 || modeinfo->height != 480 || ! 117: modeinfo->bytesperpixel != 2 || modeinfo->linewidth*480 > BANKSIZE || ! 118: (modeinfo->startaddressrange & BANKSIZE) != BANKSIZE) { ! 119: uip_textmode(); ! 120: LOG_CRITICAL(("Unexpected mode settings")); ! 121: return 1; ! 122: } ! 123: uip_uipinfo->linewidth = modeinfo->linewidth; ! 124: if (vga_setlinearaddressing() == -1) { ! 125: uip_textmode(); ! 126: LOG_CRITICAL(("Linear addressing mode not supported by hardware")); ! 127: return 1; ! 128: } ! 129: if ((uip_uipinfo->screenmem0 = vga_getgraphmem()) == NULL) { ! 130: uip_textmode(); ! 131: LOG_CRITICAL(("Failed to find start of screen memory")); ! 132: return 1; ! 133: } ! 134: uip_uipinfo->screenmem1 = uip_uipinfo->screenmem0+BANKSIZE; ! 135: if (uip_forceredshift != -1 && uip_forcegreenshift != -1 && ! 136: uip_forceblueshift != -1) { ! 137: uip_uipinfo->redshift = uip_forceredshift; ! 138: uip_uipinfo->greenshift = uip_forcegreenshift; ! 139: uip_uipinfo->blueshift = uip_forceblueshift; ! 140: } else { ! 141: switch (modeinfo->colors) { ! 142: case 32768: ! 143: LOG_VERBOSE(("Assuming colour bit positions 10,5,0 for 32k colour mode")); ! 144: uip_uipinfo->blueshift = 0; ! 145: uip_uipinfo->greenshift = 5; ! 146: uip_uipinfo->redshift = 10; ! 147: break; ! 148: case 65536: ! 149: LOG_VERBOSE(("Assuming colour bit positions 11,6,0 for 64k colour mode")); ! 150: uip_uipinfo->blueshift = 0; ! 151: uip_uipinfo->greenshift = 6; ! 152: uip_uipinfo->redshift = 11; ! 153: break; ! 154: default: ! 155: LOG_CRITICAL(("Unknown mode - %d colours?? use -c", modeinfo->colors)); ! 156: return 1; ! 157: } ! 158: } ! 159: uip_displaybank(0); /* set current to 0th bank */ ! 160: uip_clearscreen(); /* clear bank */ ! 161: ui_setupscreen(); /* setup bank */ ! 162: uip_displaybank(-1); /* toggle bank */ ! 163: uip_clearscreen(); /* clear bank */ ! 164: ui_setupscreen(); /* setup bank */ ! 165: if (keyboard_init() == -1) { ! 166: uip_textmode(); ! 167: LOG_CRITICAL(("Unable to initialise keyboard")); ! 168: return 1; ! 169: } ! 170: memset(uip_key, 0, sizeof(uip_key)); ! 171: keyboard_seteventhandler(uip_keyboardhandler); ! 172: return 0; ! 173: } ! 174: ! 175: int uip_setcolourbits(int red, int green, int blue) ! 176: { ! 177: uip_forceredshift = red; ! 178: uip_forcegreenshift = green; ! 179: uip_forceblueshift = blue; ! 180: return 0; ! 181: } ! 182: ! 183: void uip_displaybank(int bank) { ! 184: if (bank == -1) ! 185: bank = uip_displaybanknum ^ 1; ! 186: vga_setdisplaystart(bank ? BANKSIZE : 0); ! 187: uip_uipinfo->screenmem_w = bank ? uip_uipinfo->screenmem0 : ! 188: uip_uipinfo->screenmem1; ! 189: uip_displaybanknum = bank; ! 190: } ! 191: ! 192: void uip_clearscreen(void) { ! 193: memset(uip_uipinfo->screenmem_w, 0, BANKSIZE); ! 194: } ! 195: ! 196: void uip_clearmiddle(void) { ! 197: int i; ! 198: ! 199: for (i = 0; i < 240; i++) { ! 200: memset(uip_uipinfo->screenmem_w+(uip_uipinfo->linewidth)*(120+i)+ ! 201: 160*2, 0, 2*320); ! 202: } ! 203: } ! 204: ! 205: /* uip_singlebank sets write address to the current display screen */ ! 206: ! 207: void uip_singlebank(void) { ! 208: uip_uipinfo->screenmem_w = uip_displaybanknum ? uip_uipinfo->screenmem1 : ! 209: uip_uipinfo->screenmem0; ! 210: } ! 211: ! 212: /* uip_doublebank sets write address to hidden display screen */ ! 213: ! 214: void uip_doublebank(void) { ! 215: uip_uipinfo->screenmem_w = uip_displaybanknum ? uip_uipinfo->screenmem0 : ! 216: uip_uipinfo->screenmem1; ! 217: } ! 218: ! 219: void uip_textmode(void) ! 220: { ! 221: if (uip_vga) { ! 222: keyboard_setdefaulteventhandler(); ! 223: vga_setmode(0); ! 224: } ! 225: uip_vga = 0; ! 226: } ! 227: ! 228: int uip_checkkeyboard(void) ! 229: { ! 230: keyboard_update(); ! 231: mem68k_cont1_a = uip_key[SCANCODE_A] ? 1 : 0; ! 232: mem68k_cont1_b = (uip_key[SCANCODE_B] || ! 233: uip_key[SCANCODE_S]) ? 1 : 0; ! 234: mem68k_cont1_c = (uip_key[SCANCODE_C] || ! 235: uip_key[SCANCODE_D]) ? 1 : 0; ! 236: mem68k_cont1_left = uip_key[SCANCODE_CURSORBLOCKLEFT] ? 1 : 0; ! 237: mem68k_cont1_up = uip_key[SCANCODE_CURSORBLOCKUP] ? 1 : 0; ! 238: mem68k_cont1_right = uip_key[SCANCODE_CURSORBLOCKRIGHT] ? 1 : 0; ! 239: mem68k_cont1_down = uip_key[SCANCODE_CURSORBLOCKDOWN] ? 1 : 0; ! 240: mem68k_cont1_start = uip_key[SCANCODE_ENTER] ? 1 : 0; ! 241: return (uip_key[SCANCODE_ESCAPE] ? 1 : 0); ! 242: } ! 243: ! 244: void uip_vsync(void) ! 245: { ! 246: vga_waitretrace(); ! 247: } ! 248: ! 249: unsigned int uip_whichbank(void) ! 250: { ! 251: /* returns 0 or 1 - the bank being VIEWED */ ! 252: return uip_displaybanknum; ! 253: } ! 254: ! 255: uint8 uip_getchar(void) ! 256: { ! 257: char c; ! 258: ! 259: keyboard_setdefaulteventhandler(); ! 260: keyboard_close(); ! 261: c = getchar(); ! 262: keyboard_init(); ! 263: memset(uip_key, 0, sizeof(uip_key)); ! 264: keyboard_seteventhandler(uip_keyboardhandler); ! 265: return c; ! 266: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.