Annotation of generator/src/uip-svgalib.c, revision 1.1.1.1

1.1       root        1: /*****************************************************************************/
                      2: /*     Generator - Sega Genesis emulation - (c) James Ponder 1997-2000       */
                      3: /*****************************************************************************/
                      4: /*                                                                           */
                      5: /* uip-svgalib - User interface for svgalib (15 bit)                         */
                      6: /*                                                                           */
                      7: /*****************************************************************************/
                      8: 
                      9: #include <stdio.h>
                     10: #include <unistd.h>
                     11: 
                     12: #include "generator.h"
                     13: #include <vga.h>
                     14: #include <vgakeyboard.h>
                     15: 
                     16: #include "uip.h"
                     17: #include "ui.h"
                     18: #include "ui-console.h"
                     19: #include "vdp.h"
                     20: #include "mem68k.h"
                     21: 
                     22: #define BANKSIZE 640*480*2
                     23: 
                     24: /*** forward reference declarations ***/
                     25: 
                     26: /*** static variables ***/
                     27: 
                     28: static uint8 uip_vga = 0;             /* flag for whether in VGA more or not */
                     29: static uint8 uip_displaybanknum = 0;  /* view this one, write to other one */
                     30: static t_uipinfo *uip_uipinfo = NULL; /* uipinfo */
                     31: static uint8 uip_key[256];            /* keyboard state */
                     32: 
                     33: /*** Code ***/
                     34: 
                     35: static void uip_keyboardhandler(int scancode, int press) {
                     36:   if (scancode >= 256)
                     37:     return;
                     38:   if (uip_key[scancode] == press)
                     39:     return;
                     40:   uip_key[scancode] = press;
                     41:   if (press) {
                     42:     if (scancode == SCANCODE_F5) {
                     43:       ui_info^= 1;
                     44:       ui_clearnext = 2;
                     45:     } else if (scancode == SCANCODE_F6) {
                     46:       vdp_pal^= 1;
                     47:       vdp_setupvideo();
                     48:       ui_clearnext = 2;
                     49:     } else if (scancode == SCANCODE_F7) {
                     50:       vdp_overseas^= 1;
                     51:       ui_clearnext = 2;
                     52:     } else if (scancode == SCANCODE_F8) {
                     53:       ui_vdpsimple^= 1;
                     54:       ui_clearnext = 2;
                     55:     } else if (scancode == SCANCODE_F9) {
                     56:       ui_vsync^= 1;
                     57:       ui_clearnext = 2;
                     58:     } else if (scancode == SCANCODE_1) {
                     59:       vdp_layerB^= 1;
                     60:       ui_clearnext = 2;
                     61:     } else if (scancode == SCANCODE_2) {
                     62:       vdp_layerBp^= 1;
                     63:       ui_clearnext = 2;
                     64:     } else if (scancode == SCANCODE_3) {
                     65:       vdp_layerA^= 1;
                     66:       ui_clearnext = 2;
                     67:     } else if (scancode == SCANCODE_4) {
                     68:       vdp_layerAp^= 1;
                     69:       ui_clearnext = 2;
                     70:     } else if (scancode == SCANCODE_5) {
                     71:       vdp_layerW^= 1;
                     72:       ui_clearnext = 2;
                     73:     } else if (scancode == SCANCODE_6) {
                     74:       vdp_layerWp^= 1;
                     75:       ui_clearnext = 2;
                     76:     } else if (scancode == SCANCODE_7) {
                     77:       vdp_layerH^= 1;
                     78:       ui_clearnext = 2;
                     79:     } else if (scancode == SCANCODE_8) {
                     80:       vdp_layerS^= 1;
                     81:       ui_clearnext = 2;
                     82:     } else if (scancode == SCANCODE_9) {
                     83:       vdp_layerSp^= 1;
                     84:       ui_clearnext = 2;
                     85:     }
                     86:       /*
                     87:       {
                     88:        FILE *moo;
                     89:        int i;
                     90:        moo = fopen("/tmp/screenshot.raw", "w");
                     91:        for (i = 0; i < 640*480; i++) {
                     92:          fputc(((((uint16 *)uip_uipinfo.screenmem)[i]>>10) & 0x1f)<<3, moo);
                     93:          fputc(((((uint16 *)uip_uipinfo.screenmem)[i]>>5) & 0x1f)<<3, moo);
                     94:          fputc(((((uint16 *)uip_uipinfo.screenmem)[i]>>0) & 0x1f)<<3, moo);
                     95:        }
                     96:        fclose(moo);
                     97:       }
                     98:       */
                     99:   }
                    100: }
                    101: 
                    102: int uip_init(t_uipinfo *uipinfo)
                    103: {
                    104:   uip_uipinfo = uipinfo;
                    105:   printf("Initialising svgalib...\n");
                    106:   sleep(1);
                    107:   if (vga_init()) {
                    108:     LOG_CRITICAL(("Failed to initialise SVGALib"));
                    109:     return 1;
                    110:   }
                    111:   return 0;
                    112: }
                    113: 
                    114: int uip_vgamode(void)
                    115: {
                    116:   vga_modeinfo *modeinfo;
                    117:   int cardmemory;
                    118: 
                    119:   uip_vga = 1;
                    120:   if (vga_setmode(G640x480x32K) == -1) {
                    121:     uip_textmode();
                    122:     LOG_CRITICAL(("Unable to change SVGA mode, mode not supported by "
                    123:                  "hardware?"));
                    124:     LOG_CRITICAL(("Check /etc/vga/libvga.config to ensure your card "
                    125:                  "is not commented out"));
                    126:     return 1;
                    127:   }
                    128:   if (vga_claimvideomemory(2*BANKSIZE) == -1) {
                    129:     uip_textmode();
                    130:     LOG_CRITICAL(("Unable to allocated video memory - 2MB video card "
                    131:                  "required."));
                    132:     return 1;
                    133:   }
                    134:   if ((modeinfo = vga_getmodeinfo(vga_getcurrentmode())) == NULL) {
                    135:     uip_textmode();
                    136:     LOG_CRITICAL(("Unable to get current mode information"));
                    137:     return 1;
                    138:   }
                    139:   LOG_VERBOSE(("Resolution %dx%d bytesperpixel %d linewidth %d",
                    140:               modeinfo->width, modeinfo->height, modeinfo->bytesperpixel,
                    141:               modeinfo->linewidth));
                    142:   if (modeinfo->width != 640 || modeinfo->height != 480 ||
                    143:       modeinfo->bytesperpixel != 2 || modeinfo->linewidth*480 > BANKSIZE ||
                    144:       (modeinfo->startaddressrange & BANKSIZE) != BANKSIZE) {
                    145:     uip_textmode();
                    146:     LOG_CRITICAL(("Unexpected mode settings"));
                    147:     return 1;
                    148:   }
                    149:   uip_uipinfo->linewidth = modeinfo->linewidth;
                    150:   uip_uipinfo->redshift = 0;
                    151:   uip_uipinfo->greenshift = 5;
                    152:   uip_uipinfo->redshift = 10;
                    153:   if (vga_setlinearaddressing() == -1) {
                    154:     uip_textmode();
                    155:     LOG_CRITICAL(("Linear addressing mode not supported by hardware"));
                    156:     return 1;
                    157:   }
                    158:   if ((uip_uipinfo->screenmem0 = vga_getgraphmem()) == NULL) {
                    159:     uip_textmode();
                    160:     LOG_CRITICAL(("Failed to find start of screen memory"));
                    161:     return 1;
                    162:   }
                    163:   uip_uipinfo->screenmem1 = uip_uipinfo->screenmem0+BANKSIZE;
                    164:   uip_displaybank(0); /* set current to 0th bank */
                    165:   uip_clearscreen(); /* clear bank */
                    166:   ui_setupscreen(); /* setup bank */
                    167:   uip_displaybank(-1); /* toggle bank */
                    168:   uip_clearscreen(); /* clear bank */
                    169:   ui_setupscreen(); /* setup bank */
                    170:   if (keyboard_init() == -1) {
                    171:     uip_textmode();
                    172:     LOG_CRITICAL(("Unable to initialise keyboard"));
                    173:     return 1;
                    174:   }
                    175:   memset(uip_key, 0, sizeof(uip_key));
                    176:   keyboard_seteventhandler(uip_keyboardhandler);
                    177:   return 0;
                    178: }
                    179: 
                    180: void uip_displaybank(int bank) {
                    181:   if (bank == -1)
                    182:     bank = uip_displaybanknum ^ 1;
                    183:   vga_setdisplaystart(bank ? BANKSIZE : 0);
                    184:   uip_uipinfo->screenmem_w = bank ? uip_uipinfo->screenmem0 :
                    185:     uip_uipinfo->screenmem1;
                    186:   uip_displaybanknum = bank;
                    187: }
                    188: 
                    189: void uip_clearscreen(void) {
                    190:   memset(uip_uipinfo->screenmem_w, 0, BANKSIZE);
                    191: }
                    192: 
                    193: void uip_textmode(void)
                    194: {
                    195:   if (uip_vga) {
                    196:     keyboard_setdefaulteventhandler();
                    197:     vga_setmode(0);
                    198:   }
                    199:   uip_vga = 0;
                    200: }
                    201: 
                    202: int uip_checkkeyboard(void)
                    203: {
                    204:   keyboard_update();
                    205:   mem68k_cont1_a = uip_key[SCANCODE_A] ? 1 : 0;
                    206:   mem68k_cont1_b = (uip_key[SCANCODE_B] ||
                    207:                    uip_key[SCANCODE_S]) ? 1 : 0;
                    208:   mem68k_cont1_c = (uip_key[SCANCODE_C] ||
                    209:                    uip_key[SCANCODE_D]) ? 1 : 0;
                    210:   mem68k_cont1_left = uip_key[SCANCODE_CURSORBLOCKLEFT] ? 1 : 0;
                    211:   mem68k_cont1_up = uip_key[SCANCODE_CURSORBLOCKUP] ? 1 : 0;
                    212:   mem68k_cont1_right = uip_key[SCANCODE_CURSORBLOCKRIGHT] ? 1 : 0;
                    213:   mem68k_cont1_down = uip_key[SCANCODE_CURSORBLOCKDOWN] ? 1 : 0;
                    214:   mem68k_cont1_start = uip_key[SCANCODE_ENTER] ? 1 : 0;
                    215:   if (uip_key[SCANCODE_F12])
                    216:     gen_reset();
                    217:   return (uip_key[SCANCODE_ESCAPE] ? 1 : 0);
                    218: }
                    219: 
                    220: void uip_vsync(void)
                    221: {
                    222:   vga_waitretrace();
                    223: }

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.