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

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"
                     25: #include "threaddep/penguin.h"
                     26: #include "memory.h"
                     27: #include "misc/misc.h"
                     28: #include "misc/handlers.h"
                     29: #include "xwin.h"
                     30: #include "video/vbe.h"
                     31: #include "video/dos-supp.h"
                     32: #include "disk.h"
                     33: #include "debug.h"
                     34: #include "picasso96.h"
                     35: 
                     36: #define MAXMESSAGES 100
                     37: 
                     38: char *Messages[MAXMESSAGES];
                     39: int CurrentMessage = 0;
                     40: int UseScreen = 0;
                     41: char *SaveMem = NULL, *OldBufMem;
                     42: UBYTE SavedLEDb;
                     43: 
                     44: void EnterText(void);
                     45: void LeaveText(void);
                     46: void DOS_init(void);
                     47: void DOS_leave(void);
                     48: void DOS_abort(void);
                     49: void DumpMessages(void);
                     50: static int ScreenWrite(__FSEXT_Fnumber func, int *retval, va_list rest_args);
                     51: 
                     52: extern int NeedDither, ModeNumber, UseLinear, ScreenIsPicasso, PicassoModeNumber, PicassoUseLinear;
                     53: extern char PicassoInvalidLines[];
                     54: 
                     55: void DOS_init(void) {
                     56:     int i;
                     57: 
                     58:     /* very used selector... */
                     59:     _farsetsel(_dos_ds);
                     60: 
                     61:     /* small check and setup */
                     62:     signal(SIGABRT, DOS_abort);
                     63:     atexit(DOS_leave);
                     64:     for (i=0; i<MAXMESSAGES; i++)
                     65:        Messages[i] = NULL;
                     66:     __FSEXT_set_function (fileno (stdout), ScreenWrite);
                     67:     __FSEXT_set_function (fileno (stderr), ScreenWrite);
                     68:     if(ersatzkickfile && disk_empty(0)) {
                     69:        printf ("No KickStart and no bootdisk, giving up.\n");
                     70:        exit(1);
                     71:     }
                     72:     signal(SIGINT, SIG_IGN);
                     73:     signal(SIGFPE, SIG_IGN);
                     74: 
                     75:     /* check video */
                     76:     if (!InitGfxLib()) {
                     77:        printf("Can't init GfxLib.\n");
                     78:        exit(1);
                     79:     }
                     80: 
                     81:     /* enable case on LFN systems (eg. win95) */
                     82:     if (_USE_LFN)
                     83:        _crt0_startup_flags = _CRT0_FLAG_PRESERVE_FILENAME_CASE;
                     84: }
                     85: 
                     86: void DOS_leave(void) {
                     87:     DumpMessages();
                     88: }
                     89: 
                     90: void DOS_abort(void) {
                     91:     printf ("abort!\n");
                     92:     exit(1);
                     93: }
                     94: 
                     95: void DumpMessages(void) {
                     96:     int i, StartMessage, MessagePosition;
                     97: 
                     98:     UseScreen = 1;
                     99:     if (CurrentMessage) {
                    100:        StartMessage = CurrentMessage - MAXMESSAGES;
                    101:        if (StartMessage < 0)
                    102:            StartMessage = 0;
                    103:        for (i=StartMessage; i<CurrentMessage; i++) {
                    104:            MessagePosition = i % MAXMESSAGES;
                    105:            if (Messages[MessagePosition] != NULL)
                    106:                printf(Messages[MessagePosition]);
                    107:        }
                    108:        CurrentMessage = 0;
                    109:     }
                    110: }
                    111: 
                    112: static int ScreenWrite(__FSEXT_Fnumber func, int *retval, va_list rest_args) {
                    113:     char *buf, *mybuf;
                    114:     size_t buflen;
                    115:     int fd = va_arg (rest_args, int);
                    116:     int MessagePosition;
                    117: 
                    118:     if (func != __FSEXT_write || UseScreen)
                    119:        return 0;
                    120: 
                    121:     buf = va_arg(rest_args, char *);
                    122:     buflen = va_arg(rest_args, size_t);
                    123:     mybuf = malloc(buflen + 1);
                    124:     if (mybuf != NULL) {
                    125:        memcpy (mybuf, buf, buflen);
                    126:        mybuf[buflen] = '\0';
                    127:     }
                    128: 
                    129:     MessagePosition = CurrentMessage % MAXMESSAGES;
                    130:     if (Messages[ MessagePosition ] != NULL)
                    131:        free(Messages[ MessagePosition ]);
                    132:     Messages[ MessagePosition ] = mybuf;
                    133: 
                    134:     CurrentMessage++;
                    135: 
                    136:     *retval = buflen;
                    137:     return 1;
                    138: }
                    139: 
                    140: void EnterText(void) {
                    141:     _go32_dpmi_registers IntRegs;
                    142: 
                    143:     if (!ScreenIsPicasso) {
                    144:        if (ModeNumber != -1) {
                    145:            SavedLEDb = InitLED();
                    146:            UninstallKeyboardHandler();
                    147:            SaveMem = malloc(gfxvidinfo.rowbytes*gfxvidinfo.height);
                    148:            if (SaveMem != NULL) {
                    149:                memcpy(SaveMem, gfxvidinfo.bufmem, gfxvidinfo.rowbytes*gfxvidinfo.height);
                    150:                OldBufMem = gfxvidinfo.bufmem;
                    151:                gfxvidinfo.bufmem = SaveMem;
                    152:            }
                    153:        }
                    154:     } else {
                    155:        if (PicassoModeNumber != -1) {
                    156:            SavedLEDb = InitLED();
                    157:            UninstallKeyboardHandler();
                    158:        }
                    159:     }
                    160:     /* Set text mode */
                    161:     IntRegs.x.ax = 0x1C;
                    162:     IntRegs.h.ah = 0x00;
                    163:     IntRegs.h.al = 0x03;
                    164:     IntRegs.x.ss = IntRegs.x.sp = IntRegs.x.flags = 0;
                    165:     _go32_dpmi_simulate_int(0x10, &IntRegs);
                    166:     _set_screen_lines(50);
                    167:     clrscr();
                    168: }
                    169: 
                    170: void LeaveText(void) {
                    171:     int i;
                    172: 
                    173:     if (!ScreenIsPicasso) {
                    174:        if (ModeNumber != -1) {
                    175:            InstallKeyboardHandler();
                    176:            RestoreLEDStatus(SavedLEDb);
                    177:            /* Set graphics mode */
                    178:            SetMode(ModeNumber, UseLinear);
                    179:            /* Restore screen */
                    180:            if ((gfxvidinfo.pixbytes == 1) || NeedDither)
                    181:                LoadPalette();
                    182:            if (SaveMem != NULL) {
                    183:                gfxvidinfo.bufmem = OldBufMem;
                    184:                memcpy(gfxvidinfo.bufmem, SaveMem, gfxvidinfo.rowbytes*gfxvidinfo.height);
                    185:                free(SaveMem);
                    186:            }
                    187:            for(i=0; i<gfxvidinfo.height; i++)
                    188:                flush_line(i);
                    189:        }
                    190:     } else {
                    191: #ifdef PICASSO96
                    192:        if (PicassoModeNumber != -1) {
                    193:            int i;
                    194:            char *addr = gfxmemory + (picasso96_state.Address - gfxmem_start);
                    195: 
                    196:            InstallKeyboardHandler();
                    197:            RestoreLEDStatus(SavedLEDb);
                    198:            /* Set graphics mode */
                    199:            SetMode(PicassoModeNumber, PicassoUseLinear);
                    200:            /* Restore screen */
                    201:            DX_SetPalette (0, 256);
                    202:            for (i = 0; i < picasso_vidinfo.height; i++, addr += picasso96_state.BytesPerRow) {
                    203:                PicassoInvalidLines[i] = 0;
                    204:                CurrentMode.PutLine(addr, i);
                    205:            }
                    206:        }
                    207: #endif
                    208:     }
                    209: }
                    210: 
                    211: void HandleDisk(int num) {
                    212:     char *ptr=NULL, buf[256];
                    213: 
                    214:     EnterText();
                    215: 
                    216:     tui_reset();
                    217:     switch(num) {
                    218:      case 0:
                    219:        gotoxy(5, 4);
                    220:        cprintf("DF0:");
                    221:        ptr = tuifilereq("*.adf", currprefs.df[0]);
                    222:        break;
                    223:      case 1:
                    224:        gotoxy(5, 4);
                    225:        cprintf("DF1:");
                    226:        ptr = tuifilereq("*.adf", currprefs.df[1]);
                    227:        break;
                    228:      case 2:
                    229:        gotoxy(5, 4);
                    230:        cprintf("DF2:");
                    231:        ptr = tuifilereq("*.adf", currprefs.df[2]);
                    232:        break;
                    233:      case 3:
                    234:        gotoxy(5, 4);
                    235:        cprintf("DF3:");
                    236:        ptr = tuifilereq("*.adf", currprefs.df[3]);
                    237:        break;
                    238:     }
                    239:     tui_shutdown();
                    240:     if (ptr != NULL) {
                    241:        strcpy(buf, ptr);
                    242:        disk_insert(num, buf);
                    243:     }
                    244: 
                    245:     LeaveText();
                    246: }
                    247: 
                    248: void EnterDebug(void) {
                    249:     EnterText();
                    250:     DumpMessages();
                    251:     signal(SIGINT, activate_debugger);
                    252:     activate_debugger();
                    253: }
                    254: 
                    255: void LeaveDebug(void) {
                    256:     signal(SIGINT, SIG_IGN);
                    257:     UseScreen = 0;
                    258:     use_debugger = 0;
                    259:     LeaveText();
                    260: }
                    261: 
                    262: void SaveScreen(void) {
                    263:     static int err=0, lastsave=0;
                    264:     char filename[13];
                    265:     FILE *imagefile;
                    266:     char targaheader[18], *ptr;
                    267:     int i, j, r, g, b, c;
                    268:     UBYTE DitherBuf[1000];
                    269: 
                    270:     if (err || ScreenIsPicasso)
                    271:        return;
                    272: 
                    273:     while(1) {
                    274:        sprintf(filename, "uae%05d.tga", lastsave);
                    275:        imagefile = fopen(filename, "rb");
                    276:        if (imagefile == NULL) {
                    277:            imagefile = fopen(filename, "wb");
                    278:            if (imagefile == NULL) {
                    279:                err = 1;
                    280:                return;
                    281:            }
                    282:            break;
                    283:        }
                    284:        fclose(imagefile);
                    285:        lastsave++;
                    286:        if (lastsave == 100000) {
                    287:            err = 1;
                    288:            return;
                    289:        }
                    290:     }
                    291:     memset(targaheader, 0, 18);
                    292:     if (CurrentMode.BitsPerPixel == 8) {
                    293:        targaheader[1] = 1;
                    294:        targaheader[2] = 1;
                    295:        *((unsigned short *)&(targaheader[5])) = 256;
                    296:        targaheader[7] = 24;
                    297:     } else
                    298:        targaheader[2] = 2;
                    299:     *((unsigned short *)&(targaheader[12])) = CurrentMode.ModeWidth;
                    300:     *((unsigned short *)&(targaheader[14])) = gfxvidinfo.height;
                    301:     targaheader[16] = CurrentMode.BitsPerPixel;
                    302:     targaheader[17] = 0x20;
                    303:     fwrite(targaheader, 18, 1, imagefile);
                    304:     if (CurrentMode.BitsPerPixel == 8) {
                    305:        for(i=0; i<256; i++) {
                    306:           ViewPalette(i, &r, &g, &b);
                    307:           fputc(b, imagefile);
                    308:           fputc(g, imagefile);
                    309:           fputc(r, imagefile);
                    310:        }
                    311:     }
                    312:     if (NeedDither) {
                    313:        for(i=0; i<gfxvidinfo.height; i++) {
                    314:            DitherLine(DitherBuf, (UWORD *)(gfxvidinfo.bufmem + i*gfxvidinfo.rowbytes), 0, i, CurrentMode.ModeWidth, CurrentMode.BitsPerPixel);
                    315:            fwrite(DitherBuf, CurrentMode.ModeWidth, 1, imagefile);
                    316:        }
                    317:     }  else {
                    318:        if (CurrentMode.BitsPerColor!=16) {
                    319:            for (i=0; i<gfxvidinfo.height; i++)
                    320:                fwrite(gfxvidinfo.bufmem + gfxvidinfo.rowbytes * i, CurrentMode.LineLength, 1, imagefile);
                    321:        } else {
                    322:            for (i=0; i<gfxvidinfo.height; i++)
                    323:                for (j=0; j<CurrentMode.LineLength; j=j+2) {
                    324:                     ptr = gfxvidinfo.bufmem + gfxvidinfo.rowbytes * i + j;
                    325:                     r = (*((int *)ptr) >> CurrentMode.RedPosition) & ((1<<CurrentMode.RedSize)-1);
                    326:                     g = (*((int *)ptr) >> CurrentMode.GreenPosition) & ((1<<CurrentMode.GreenSize)-1);
                    327:                     b = (*((int *)ptr) >> CurrentMode.BluePosition) & ((1<<CurrentMode.BlueSize)-1);
                    328:                     if (CurrentMode.RedSize == 6)
                    329:                         r = r>>1;
                    330:                     if (CurrentMode.GreenSize == 6)
                    331:                         g = g>>1;
                    332:                     if (CurrentMode.BlueSize == 6)
                    333:                         b = b>>1;
                    334:                     c = b | (g<<5) | (r<<10);
                    335:                     fwrite(&c, 2, 1, imagefile);
                    336:                }
                    337:        }
                    338:     }
                    339:     fclose(imagefile);
                    340: }

unix.superglobalmegacorp.com

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