Annotation of uae/src/od-dos/misc/misc.c, revision 1.1.1.3

1.1       root        1:  /*
                      2:   * UAE - The Un*x Amiga Emulator
                      3:   *
                      4:   * DOS misc routines.
                      5:   *
                      6:   * (c) 1997 Gustavo Goedert
                      7:   */
                      8: 
                      9: #include "sysconfig.h"
                     10: #include "sysdeps.h"
                     11: 
                     12: #include <dos.h>
                     13: #include <go32.h>
                     14: #include <dpmi.h>
                     15: #include <sys/farptr.h>
                     16: #include <crt0.h>
                     17: #include <signal.h>
                     18: #include <sys/fsext.h>
                     19: #include <stdlib.h>
                     20: #include <conio.h>
                     21: #include <signal.h>
                     22: 
                     23: #include "config.h"
                     24: #include "options.h"
1.1.1.3 ! root       25: #include "threaddep/thread.h"
1.1       root       26: #include "memory.h"
                     27: #include "misc/misc.h"
                     28: #include "misc/handlers.h"
                     29: #include "xwin.h"
                     30: #include "video/vbe.h"
1.1.1.2   root       31: #include "tui.h"
1.1       root       32: #include "disk.h"
                     33: #include "debug.h"
                     34: #include "picasso96.h"
1.1.1.2   root       35: #include "logo.h"
1.1       root       36: 
                     37: #define MAXMESSAGES 100
                     38: 
                     39: char *Messages[MAXMESSAGES];
                     40: int CurrentMessage = 0;
                     41: int UseScreen = 0;
                     42: char *SaveMem = NULL, *OldBufMem;
                     43: UBYTE SavedLEDb;
                     44: 
                     45: void EnterText(void);
                     46: void LeaveText(void);
                     47: void DOS_init(void);
                     48: void DOS_leave(void);
                     49: void DOS_abort(void);
                     50: void DumpMessages(void);
                     51: static int ScreenWrite(__FSEXT_Fnumber func, int *retval, va_list rest_args);
1.1.1.2   root       52: int scandir(const char *dir, struct dirent ***namelist,
                     53:        int (*select)(const struct dirent *),
                     54:        int (*cmp)(const void *, const void *));
1.1       root       55: 
                     56: extern int NeedDither, ModeNumber, UseLinear, ScreenIsPicasso, PicassoModeNumber, PicassoUseLinear;
                     57: extern char PicassoInvalidLines[];
                     58: 
1.1.1.2   root       59: int origrows;
                     60: 
                     61: int main(int argc, char **argv)
                     62: {
                     63:     time_t t;
                     64:     _go32_dpmi_registers IntRegs;
                     65:     int HasMode, i;
                     66: 
                     67:     origrows = ScreenRows();
                     68:     DOS_init();
                     69:     HasMode = 1;
                     70:     if (!SetMode(NumberOfModes-3, 1, 0))
                     71:       if (!SetMode(NumberOfModes-3, 0, 0))
                     72:        HasMode = 0;
                     73:     if (HasMode) {
                     74:       for (i=0; i<200; i++)
                     75:        CurrentMode.PutLine(&(Logo[320*i]), i);
                     76:       t = time(NULL)+5;
                     77:       while(time(NULL)<t)
                     78:        if (kbhit()) {
                     79:          getch();
                     80:          break;
                     81:        }
                     82:     }
                     83:     IntRegs.x.ax = 0x1C;
                     84:     IntRegs.h.ah = 0x00;
                     85:     IntRegs.h.al = 0x03;
                     86:     IntRegs.x.ss = IntRegs.x.sp = IntRegs.x.flags = 0;
                     87:     _go32_dpmi_simulate_int(0x10, &IntRegs);
                     88:     _set_screen_lines(50);
                     89:     clrscr();
                     90:     real_main(argc, argv);
                     91:     return 0;
                     92: }
                     93: 
1.1       root       94: void DOS_init(void) {
                     95:     int i;
                     96: 
                     97:     /* very used selector... */
                     98:     _farsetsel(_dos_ds);
                     99: 
                    100:     /* small check and setup */
                    101:     signal(SIGABRT, DOS_abort);
                    102:     atexit(DOS_leave);
                    103:     for (i=0; i<MAXMESSAGES; i++)
                    104:        Messages[i] = NULL;
                    105:     __FSEXT_set_function (fileno (stdout), ScreenWrite);
                    106:     __FSEXT_set_function (fileno (stderr), ScreenWrite);
                    107:     if(ersatzkickfile && disk_empty(0)) {
                    108:        printf ("No KickStart and no bootdisk, giving up.\n");
                    109:        exit(1);
                    110:     }
                    111:     signal(SIGINT, SIG_IGN);
                    112:     signal(SIGFPE, SIG_IGN);
                    113: 
                    114:     /* check video */
                    115:     if (!InitGfxLib()) {
                    116:        printf("Can't init GfxLib.\n");
                    117:        exit(1);
                    118:     }
                    119: 
                    120:     /* enable case on LFN systems (eg. win95) */
                    121:     if (_USE_LFN)
                    122:        _crt0_startup_flags = _CRT0_FLAG_PRESERVE_FILENAME_CASE;
                    123: }
                    124: 
                    125: void DOS_leave(void) {
1.1.1.2   root      126:     _set_screen_lines(origrows);
1.1       root      127:     DumpMessages();
1.1.1.2   root      128:     printf("have a nice day!\n");
1.1       root      129: }
                    130: 
                    131: void DOS_abort(void) {
                    132:     printf ("abort!\n");
                    133:     exit(1);
                    134: }
                    135: 
                    136: void DumpMessages(void) {
                    137:     int i, StartMessage, MessagePosition;
                    138: 
                    139:     UseScreen = 1;
                    140:     if (CurrentMessage) {
                    141:        StartMessage = CurrentMessage - MAXMESSAGES;
                    142:        if (StartMessage < 0)
                    143:            StartMessage = 0;
                    144:        for (i=StartMessage; i<CurrentMessage; i++) {
                    145:            MessagePosition = i % MAXMESSAGES;
                    146:            if (Messages[MessagePosition] != NULL)
                    147:                printf(Messages[MessagePosition]);
                    148:        }
                    149:        CurrentMessage = 0;
                    150:     }
                    151: }
                    152: 
                    153: static int ScreenWrite(__FSEXT_Fnumber func, int *retval, va_list rest_args) {
                    154:     char *buf, *mybuf;
                    155:     size_t buflen;
                    156:     int fd = va_arg (rest_args, int);
                    157:     int MessagePosition;
                    158: 
                    159:     if (func != __FSEXT_write || UseScreen)
                    160:        return 0;
                    161: 
                    162:     buf = va_arg(rest_args, char *);
                    163:     buflen = va_arg(rest_args, size_t);
                    164:     mybuf = malloc(buflen + 1);
                    165:     if (mybuf != NULL) {
                    166:        memcpy (mybuf, buf, buflen);
                    167:        mybuf[buflen] = '\0';
                    168:     }
                    169: 
                    170:     MessagePosition = CurrentMessage % MAXMESSAGES;
                    171:     if (Messages[ MessagePosition ] != NULL)
                    172:        free(Messages[ MessagePosition ]);
                    173:     Messages[ MessagePosition ] = mybuf;
                    174: 
                    175:     CurrentMessage++;
                    176: 
                    177:     *retval = buflen;
                    178:     return 1;
                    179: }
                    180: 
                    181: void EnterText(void) {
                    182:     _go32_dpmi_registers IntRegs;
                    183: 
                    184:     if (!ScreenIsPicasso) {
                    185:        if (ModeNumber != -1) {
                    186:            SavedLEDb = InitLED();
                    187:            UninstallKeyboardHandler();
                    188:            SaveMem = malloc(gfxvidinfo.rowbytes*gfxvidinfo.height);
                    189:            if (SaveMem != NULL) {
                    190:                memcpy(SaveMem, gfxvidinfo.bufmem, gfxvidinfo.rowbytes*gfxvidinfo.height);
                    191:                OldBufMem = gfxvidinfo.bufmem;
                    192:                gfxvidinfo.bufmem = SaveMem;
                    193:            }
                    194:        }
                    195:     } else {
                    196:        if (PicassoModeNumber != -1) {
                    197:            SavedLEDb = InitLED();
                    198:            UninstallKeyboardHandler();
                    199:        }
                    200:     }
                    201:     /* Set text mode */
                    202:     IntRegs.x.ax = 0x1C;
                    203:     IntRegs.h.ah = 0x00;
                    204:     IntRegs.h.al = 0x03;
                    205:     IntRegs.x.ss = IntRegs.x.sp = IntRegs.x.flags = 0;
                    206:     _go32_dpmi_simulate_int(0x10, &IntRegs);
                    207:     _set_screen_lines(50);
                    208:     clrscr();
                    209: }
                    210: 
                    211: void LeaveText(void) {
                    212:     int i;
                    213: 
                    214:     if (!ScreenIsPicasso) {
                    215:        if (ModeNumber != -1) {
                    216:            InstallKeyboardHandler();
                    217:            RestoreLEDStatus(SavedLEDb);
                    218:            /* Set graphics mode */
1.1.1.2   root      219:            SetMode(ModeNumber, UseLinear, 0);
1.1       root      220:            /* Restore screen */
                    221:            if ((gfxvidinfo.pixbytes == 1) || NeedDither)
                    222:                LoadPalette();
                    223:            if (SaveMem != NULL) {
                    224:                gfxvidinfo.bufmem = OldBufMem;
                    225:                memcpy(gfxvidinfo.bufmem, SaveMem, gfxvidinfo.rowbytes*gfxvidinfo.height);
                    226:                free(SaveMem);
                    227:            }
                    228:            for(i=0; i<gfxvidinfo.height; i++)
                    229:                flush_line(i);
                    230:        }
                    231:     } else {
                    232: #ifdef PICASSO96
                    233:        if (PicassoModeNumber != -1) {
                    234:            int i;
                    235:            char *addr = gfxmemory + (picasso96_state.Address - gfxmem_start);
                    236: 
                    237:            InstallKeyboardHandler();
                    238:            RestoreLEDStatus(SavedLEDb);
                    239:            /* Set graphics mode */
1.1.1.2   root      240:            SetMode(PicassoModeNumber, PicassoUseLinear, 0);
1.1       root      241:            /* Restore screen */
                    242:            DX_SetPalette (0, 256);
                    243:            for (i = 0; i < picasso_vidinfo.height; i++, addr += picasso96_state.BytesPerRow) {
                    244:                PicassoInvalidLines[i] = 0;
                    245:                CurrentMode.PutLine(addr, i);
                    246:            }
                    247:        }
                    248: #endif
                    249:     }
                    250: }
                    251: 
1.1.1.2   root      252: void HandleOptions(void) {
1.1       root      253:     EnterText();
1.1.1.2   root      254:     gui_changesettings ();
1.1       root      255:     LeaveText();
                    256: }
                    257: 
                    258: void EnterDebug(void) {
                    259:     EnterText();
                    260:     DumpMessages();
                    261:     signal(SIGINT, activate_debugger);
                    262:     activate_debugger();
                    263: }
                    264: 
                    265: void LeaveDebug(void) {
                    266:     signal(SIGINT, SIG_IGN);
                    267:     UseScreen = 0;
                    268:     use_debugger = 0;
                    269:     LeaveText();
                    270: }
                    271: 
                    272: void SaveScreen(void) {
                    273:     static int err=0, lastsave=0;
                    274:     char filename[13];
                    275:     FILE *imagefile;
                    276:     char targaheader[18], *ptr;
                    277:     int i, j, r, g, b, c;
                    278:     UBYTE DitherBuf[1000];
                    279: 
                    280:     if (err || ScreenIsPicasso)
                    281:        return;
                    282: 
                    283:     while(1) {
                    284:        sprintf(filename, "uae%05d.tga", lastsave);
                    285:        imagefile = fopen(filename, "rb");
                    286:        if (imagefile == NULL) {
                    287:            imagefile = fopen(filename, "wb");
                    288:            if (imagefile == NULL) {
                    289:                err = 1;
                    290:                return;
                    291:            }
                    292:            break;
                    293:        }
                    294:        fclose(imagefile);
                    295:        lastsave++;
                    296:        if (lastsave == 100000) {
                    297:            err = 1;
                    298:            return;
                    299:        }
                    300:     }
                    301:     memset(targaheader, 0, 18);
                    302:     if (CurrentMode.BitsPerPixel == 8) {
                    303:        targaheader[1] = 1;
                    304:        targaheader[2] = 1;
                    305:        *((unsigned short *)&(targaheader[5])) = 256;
                    306:        targaheader[7] = 24;
                    307:     } else
                    308:        targaheader[2] = 2;
                    309:     *((unsigned short *)&(targaheader[12])) = CurrentMode.ModeWidth;
                    310:     *((unsigned short *)&(targaheader[14])) = gfxvidinfo.height;
                    311:     targaheader[16] = CurrentMode.BitsPerPixel;
                    312:     targaheader[17] = 0x20;
                    313:     fwrite(targaheader, 18, 1, imagefile);
                    314:     if (CurrentMode.BitsPerPixel == 8) {
                    315:        for(i=0; i<256; i++) {
                    316:           ViewPalette(i, &r, &g, &b);
                    317:           fputc(b, imagefile);
                    318:           fputc(g, imagefile);
                    319:           fputc(r, imagefile);
                    320:        }
                    321:     }
                    322:     if (NeedDither) {
                    323:        for(i=0; i<gfxvidinfo.height; i++) {
                    324:            DitherLine(DitherBuf, (UWORD *)(gfxvidinfo.bufmem + i*gfxvidinfo.rowbytes), 0, i, CurrentMode.ModeWidth, CurrentMode.BitsPerPixel);
                    325:            fwrite(DitherBuf, CurrentMode.ModeWidth, 1, imagefile);
                    326:        }
                    327:     }  else {
                    328:        if (CurrentMode.BitsPerColor!=16) {
                    329:            for (i=0; i<gfxvidinfo.height; i++)
                    330:                fwrite(gfxvidinfo.bufmem + gfxvidinfo.rowbytes * i, CurrentMode.LineLength, 1, imagefile);
                    331:        } else {
                    332:            for (i=0; i<gfxvidinfo.height; i++)
                    333:                for (j=0; j<CurrentMode.LineLength; j=j+2) {
                    334:                     ptr = gfxvidinfo.bufmem + gfxvidinfo.rowbytes * i + j;
                    335:                     r = (*((int *)ptr) >> CurrentMode.RedPosition) & ((1<<CurrentMode.RedSize)-1);
                    336:                     g = (*((int *)ptr) >> CurrentMode.GreenPosition) & ((1<<CurrentMode.GreenSize)-1);
                    337:                     b = (*((int *)ptr) >> CurrentMode.BluePosition) & ((1<<CurrentMode.BlueSize)-1);
                    338:                     if (CurrentMode.RedSize == 6)
                    339:                         r = r>>1;
                    340:                     if (CurrentMode.GreenSize == 6)
                    341:                         g = g>>1;
                    342:                     if (CurrentMode.BlueSize == 6)
                    343:                         b = b>>1;
                    344:                     c = b | (g<<5) | (r<<10);
                    345:                     fwrite(&c, 2, 1, imagefile);
                    346:                }
                    347:        }
                    348:     }
                    349:     fclose(imagefile);
                    350: }
1.1.1.2   root      351: 
                    352: int scandir(const char *dir, struct dirent ***namelist,
                    353:        int (*select)(const struct dirent *),
                    354:        int (*cmp)(const void *, const void *))
                    355: {
                    356:   DIR *dp = opendir (dir);
                    357:   struct dirent **v = NULL;
                    358:   size_t vsize = 0, i;
                    359:   struct dirent *d;
                    360:   int save;
                    361: 
                    362:   if (dp == NULL)
                    363:     return -1;
                    364: 
                    365:   save = errno;
                    366:   errno = 0;
                    367: 
                    368:   i = 0;
                    369:   while ((d = readdir (dp)) != NULL)
                    370:     if (select == NULL || (*select) (d))
                    371:       {
                    372:        if (i == vsize)
                    373:          {
                    374:            struct dirent **new;
                    375:            if (vsize == 0)
                    376:              vsize = 10;
                    377:            else
                    378:              vsize *= 2;
                    379:            new = (struct dirent **) realloc (v, vsize * sizeof (*v));
                    380:            if (new == NULL)
                    381:              {
                    382:              lose:
                    383:                (void) closedir (dp);
                    384:                while (i > 0)
                    385:                  free (v[--i]);
                    386:                free (v);
                    387:                errno = ENOMEM;
                    388:                return -1;
                    389:              }
                    390:            v = new;
                    391:          }
                    392: 
                    393:        v[i] = (struct dirent *) malloc (sizeof (**v));
                    394:        if (v[i] == NULL)
                    395:          goto lose;
                    396: 
                    397:        *v[i++] = *d;
                    398:       }
                    399: 
                    400:   if (errno != 0)
                    401:     {
                    402:       save = errno;
                    403: 
                    404:       (void) closedir (dp);
                    405: 
                    406:       /* Remember to free allocated memory upon error! */
                    407:       while (i > 0) free(v[--i]);
                    408:       free(v);
                    409: 
                    410:       errno = save;
                    411:       return -1;
                    412:     }
                    413: 
                    414:   (void) closedir (dp);
                    415:   errno = save;
                    416: 
                    417:   /* Sort the list if we have a comparison function to sort with.  */
                    418:   if (cmp != NULL)
                    419:     qsort (v, i, sizeof (*v), cmp);
                    420:   *namelist = v;
                    421:   return i;
                    422: }

unix.superglobalmegacorp.com

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