Annotation of generator/extra/ui-acorn.c, revision 1.1.1.1

1.1       root        1: /*****************************************************************************/
                      2: /*     Generator - Sega Genesis emulation - (c) James Ponder 1997-1998       */
                      3: /*****************************************************************************/
                      4: /*                                                                           */
                      5: /* ui.c - Acorn user interface                                               */
                      6: /*                                                                           */
                      7: /* *** THIS IS OUT OF DATE / NOT SUPPORTED, AND WON'T WORK ***               */
                      8: /*                                                                           */
                      9: /*****************************************************************************/
                     10: 
                     11: #include <stdlib.h>
                     12: #include <stdio.h>
                     13: 
                     14: #include <sys/swis.h>
                     15: #include <sys/os.h>
                     16: 
                     17: #include <unistd.h>
                     18: #include <sys/time.h>
                     19: 
                     20: #include <generator.h>
                     21: #include <ui.h>
                     22: #include <vdp.h>
                     23: #include <cpu68k.h>
                     24: #include <reg68k.h>
                     25: 
                     26: typedef struct {
                     27:   uint32 flags;
                     28:   uint32 xres;
                     29:   uint32 yres;
                     30:   uint32 pixdepth;
                     31:   uint32 framerate;
                     32:   uint32 settings;
                     33: } t_modeblock;
                     34: 
                     35: static uint8 *screenaddr;
                     36: static char file[256];
                     37: static unsigned int ui_bank;
                     38: 
                     39: int ui_init(int argc, char *argv[])
                     40: {
                     41:   uint32 r[10];
                     42:   os_error *errblk;
                     43:   t_modeblock *mb = malloc(sizeof(t_modeblock)+8*4);
                     44:   uint32 *vars;
                     45:   uint32 in[2];
                     46:   uint32 out[2];
                     47:   uint32 i;
                     48: 
                     49:   strcpy(file, argv[1]);
                     50: 
                     51:   if (!mb) {
                     52:     fprintf(stderr, "Out of memory!\n");
                     53:     exit(1);
                     54:   }
                     55: 
                     56:   vars = &(mb->settings);
                     57: 
                     58:   mb->flags = 1;
                     59:   mb->xres = 320;
                     60:   mb->yres = 480;
                     61:   mb->pixdepth = 3;
                     62:   mb->framerate = 60;
                     63:   *vars++ = 0;     /* ModeFlags */
                     64:   *vars++ = 128;
                     65:   *vars++ = 3;     /* NColour */
                     66:   *vars++ = 255;
                     67:   *vars++ = 4;     /* X eig factor */
                     68:   *vars++ = 2;
                     69:   *vars++ = 5;     /* Y eig factor */
                     70:   *vars++ = 2;
                     71:   *vars++ = -1;
                     72:   r[0] = (uint32)0;
                     73:   r[1] = (uint32)mb;
                     74:   errblk = os_swi(OS_ScreenMode, r);
                     75:   if (errblk) {
                     76:     fprintf(stderr, errblk->errmess);
                     77:     exit(1);
                     78:   }
                     79:   free(mb);
                     80:   r[0] = 2;
                     81:   os_swi(OS_ReadDynamicArea, r);
                     82:   if (r[1] < 320*480*2) {
                     83:     r[1]-= 320*480*2;
                     84:     i = r[1];
                     85:     errblk = os_swi(OS_ChangeDynamicArea, r);
                     86:     if (errblk) {
                     87:       fprintf(stderr, errblk->errmess);
                     88:       exit(1);
                     89:     }
                     90:     if (r[1] != i) {
                     91:       fprintf(stderr, "Cannot allocate enough screen memory\n");
                     92:       exit(1);
                     93:     }
                     94:   }
                     95:   in[0] = 149;
                     96:   in[1] = -1;
                     97:   r[0] = (uint32)in;
                     98:   r[1] = (uint32)out;
                     99:   errblk = os_swi(OS_ReadVduVariables, r);
                    100:   if (errblk) {
                    101:     fprintf(stderr, errblk->errmess);
                    102:     exit(1);
                    103:   }
                    104:   screenaddr = (uint8 *)(out[0]);
                    105: 
                    106:   cpu68k_skip = 2;
                    107:   vdp_basepixel = 32;
                    108: 
                    109:   ui_bank = 0;
                    110: 
                    111:   return(0);
                    112: }
                    113: 
                    114: char *ui_setinfo(char *name, char *copyright)
                    115: {
                    116:   return 0;
                    117: }
                    118: 
                    119: int ui_loop(void)
                    120: {
                    121:   char *retstr;
                    122: 
                    123:   if ((retstr = gen_loadimage(file))) {
                    124:     fprintf(stderr, retstr);
                    125:     exit(1);
                    126:   }
                    127:   ui_run();
                    128:   return 0;
                    129: }
                    130: 
                    131: void ui_line(unsigned int line)
                    132: {
                    133:   vdp_renderline(line, screenaddr+ui_bank*320*480+640*line);
                    134: }
                    135: 
                    136: void ui_endframe(void)
                    137: {
                    138:   unsigned int i;
                    139:   uint16 ent;
                    140:   static uint32 cbuf[256];
                    141:   uint32 r[10];
                    142:   uint8 red, green, blue;
                    143: 
                    144:   ui_bank^= 1;
                    145: 
                    146:   r[0] = 19;
                    147:   r[1] = 0;
                    148:   r[2] = 0;
                    149:   os_swi(OS_Byte, r);
                    150: 
                    151:   r[0] = 113;
                    152:   r[1] = (ui_bank^1) + 1;
                    153:   os_swi(OS_Byte, r);
                    154: 
                    155:   r[0] = 112;
                    156:   r[1] = ui_bank + 1;
                    157:   os_swi(OS_Byte, r);
                    158: 
                    159:   cbuf[0] = 0;
                    160:   cbuf[1] = 0xFFFFFF00;
                    161:   cbuf[255] = 0xFFFFFF00;
                    162: 
                    163:   for (i = 0; i < 64; i++) {
                    164:     ent = LOCENDIAN16(((uint16 *)vdp_cram)[i]);
                    165:     blue = (ent>>9) & 7;
                    166:     green = (ent>>5) & 7;
                    167:     red = (ent>>1) & 7;
                    168:     cbuf[vdp_basepixel+i]     = blue<<29 | green<<21 | red<<13;
                    169:     cbuf[vdp_basepixel+64+i]  = blue<<28 | green<<20 | red<<12;
                    170:     cbuf[vdp_basepixel+128+i] = 0x80808000 | (blue<<28 | green<<20 | red<<12);
                    171:   }
                    172:   r[0] = -1;
                    173:   r[1] = -1;
                    174:   r[2] = (uint32)cbuf;
                    175:   r[3] = 0;
                    176:   r[4] = 0;
                    177:   os_swi(ColourTrans_WritePalette, r);
                    178:   return;
                    179: }
                    180: 
                    181: void ui_run(void)
                    182: {
                    183:   uint32 r[10];
                    184:   uint32 lasttime = 0;
                    185:   uint32 frames = 0;
                    186:   uint32 clocks = 0;
                    187:   struct timeval tv;
                    188:   char tmp[100];
                    189:   uint32 start;
                    190: 
                    191:   gettimeofday(&tv, NULL);
                    192:   start = tv.tv_sec;
                    193: 
                    194:   while(0==0) {
                    195:     reg68k_framestep();
                    196:     gettimeofday(&tv, NULL);
                    197:     if (tv.tv_sec != lasttime) {
                    198:       os_vdu(7);
                    199:       os_vdu(4);
                    200:       os_vdu(31);
                    201:       os_vdu(0);
                    202:       os_vdu(59);
                    203:       sprintf(tmp, "%02d %08X %04d", cpu68k_frames - frames, regs.pc,
                    204:              tv.tv_sec - start);
                    205:       r[0] = (uint32)tmp;
                    206:       os_swi(OS_Write0, r);
                    207:       frames = cpu68k_frames;
                    208:       clocks = reg68k_clocks;
                    209:       lasttime = tv.tv_sec;;
                    210:     }
                    211:     /*
                    212:     if (cpu68k_frames > 2000) {
                    213:       os_swi(OS_ReadC, r);
                    214:     }
                    215:     */
                    216:   }
                    217: }
                    218: 
                    219: void ui_final(void)
                    220: {
                    221:   return;
                    222: }
                    223: int atexit(void (*func)(void)) {
                    224:   return -1;
                    225: }

unix.superglobalmegacorp.com

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