Annotation of generator/src/uip-svgalib.c, revision 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.