Annotation of frontvm/src/hostcall.c, revision 1.1.1.1

1.1       root        1: /*
                      2:   Hatari - gemdos.c
                      3: 
                      4:   This file is distributed under the GNU Public License, version 2 or at
                      5:   your option any later version. Read the file gpl.txt for details.
                      6: 
                      7:   GEMDOS intercept routines.
                      8:   These are used mainly for hard drive redirection of high level file routines.
                      9: 
                     10:   Now case is handled by using glob. See the function
                     11:   GemDOS_CreateHardDriveFileName for that. It also knows about symlinks.
                     12:   A filename is recognized on its eight first characters, do don't try to
                     13:   push this too far, or you'll get weirdness ! (But I can even run programs
                     14:   directly from a mounted cd in lower cases, so I guess it's working well !).
                     15: */
                     16: 
                     17: #include <time.h>
                     18: #include <ctype.h>
                     19: #include <SDL.h>
                     20: #include <SDL_endian.h>
                     21: 
                     22: #include <sys/stat.h>
                     23: #include <dirent.h>
                     24: #include <unistd.h>
                     25: 
                     26: #include "main.h"
                     27: #include "../m68000.h"
                     28: #include "hostcall.h"
                     29: #include "screen.h"
                     30: #include "audio.h"
                     31: #include "input.h"
                     32: #include "keymap.h"
                     33: #include "shortcut.h"
                     34: 
                     35: /*
                     36:   GEMDOS error codes, See 'The Atari Compendium' D.3
                     37:   Call_Fread, Fwrite, etc should return these.
                     38: */
                     39: #define GEMDOS_EOK      0    // OK
                     40: #define GEMDOS_ERROR   -1    // Generic error
                     41: #define GEMDOS_EDRVNR  -2    // Drive not ready
                     42: #define GEMDOS_EUNCMD  -3    // Unknown command
                     43: #define GEMDOS_E_CRC   -4    // CRC error
                     44: #define GEMDOS_EBADRQ  -5    // Bad request
                     45: #define GEMDOS_E_SEEK  -6    // Seek error
                     46: #define GEMDOS_EMEDIA  -7    // Unknown media
                     47: #define GEMDOS_ESECNF  -8    // Sector not found
                     48: #define GEMDOS_EPAPER  -9    // Out of paper
                     49: #define GEMDOS_EWRITF  -10   // Write fault
                     50: #define GEMDOS_EREADF  -11   // Read fault
                     51: #define GEMDOS_EWRPRO  -12   // Device is write protected
                     52: #define GEMDOS_E_CHNG  -14   // Media change detected
                     53: #define GEMDOS_EUNDEV  -15   // Unknown device
                     54: #define GEMDOS_EINVFN  -32   // Invalid function
                     55: #define GEMDOS_EFILNF  -33   // File not found
                     56: #define GEMDOS_EPTHNF  -34   // Path not found
                     57: #define GEMDOS_ENHNDL  -35   // No more handles
                     58: #define GEMDOS_EACCDN  -36   // Access denied
                     59: #define GEMDOS_EIHNDL  -37   // Invalid handle
                     60: #define GEMDOS_ENSMEM  -39   // Insufficient memory
                     61: #define GEMDOS_EIMBA   -40   // Invalid memory block address
                     62: #define GEMDOS_EDRIVE  -46   // Invalid drive specification
                     63: #define GEMDOS_ENSAME  -48   // Cross device rename
                     64: #define GEMDOS_ENMFIL  -49   // No more files
                     65: #define GEMDOS_ELOCKED -58   // Record is already locked
                     66: #define GEMDOS_ENSLOCK -59   // Invalid lock removal request
                     67: #define GEMDOS_ERANGE  -64   // Range error
                     68: #define GEMDOS_EINTRN  -65   // Internal error
                     69: #define GEMDOS_EPLFMT  -66   // Invalid program load format
                     70: #define GEMDOS_EGSBF   -67   // Memory block growth failure
                     71: #define GEMDOS_ELOOP   -80   // Too many symbolic links
                     72: #define GEMDOS_EMOUNT  -200  // Mount point crossed (indicator)
                     73: 
                     74: void Call_Memset ()
                     75: {
                     76:        int adr, count;
                     77:        unsigned long Params;
                     78:        
                     79:        Params = GetReg (REG_A7);
                     80:        Params -= SIZE_WORD;
                     81:        
                     82:        count = STMemory_ReadLong (Params+SIZE_WORD);
                     83:        adr = STMemory_ReadLong (Params+SIZE_WORD+SIZE_LONG);
                     84:        
                     85:        if (use_renderer == R_OLD) {
                     86:                memset (STRam+adr, 0, count);
                     87:        } else {
                     88:                memset (STRam+adr, 255, count);
                     89:        }
                     90:        fe2_bgcol = 0;
                     91: }
                     92: 
                     93: void Call_MemsetBlue ()
                     94: {
                     95:        int adr, count;
                     96:        unsigned long Params;
                     97:        
                     98:        Params = GetReg (REG_A7);
                     99:        Params -= SIZE_WORD;
                    100:        
                    101:        count = STMemory_ReadLong (Params+SIZE_WORD);
                    102:        adr = STMemory_ReadLong (Params+SIZE_WORD+SIZE_LONG);
                    103:        if (use_renderer == R_OLD) {
                    104:                memset (STRam+adr, 0xe, count);
                    105:        } else {
                    106:                memset (STRam+adr, 255, count);
                    107:        }
                    108:        fe2_bgcol = 0xe;
                    109: }
                    110: 
                    111: void Call_Memcpy ()
                    112: {
                    113:        int dest, src, count;
                    114:        unsigned long Params;
                    115:        
                    116:        Params = GetReg (REG_A7);
                    117:        Params -= SIZE_WORD;
                    118:        
                    119: 
                    120:        dest = STMemory_ReadLong (Params + SIZE_WORD);
                    121:        src = STMemory_ReadLong (Params + SIZE_WORD + SIZE_LONG);
                    122:        count = STMemory_ReadLong (Params + SIZE_WORD + 2*SIZE_LONG);
                    123: 
                    124:        memcpy (STRam+dest, STRam+src, count);
                    125: }
                    126: 
                    127: static const char mouse_bmp[256] = {
                    128:  0, 0,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
                    129:  0,15, 0,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
                    130:  0,15,15, 0,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
                    131:  0,15,15,15, 0,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
                    132:  0,15,15,15,15, 0,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
                    133:  0,15,15,15,15,15, 0,-1,-1,-1,-1,-1,-1,-1,-1,-1,
                    134:  0,15,15,15,15, 0,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
                    135:  0,15,15,15,15, 0,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
                    136:  0,15, 0,15,15,15, 0,-1,-1,-1,-1,-1,-1,-1,-1,-1,
                    137:  0, 0,-1, 0,15,15, 0,-1,-1,-1,-1,-1,-1,-1,-1,-1,
                    138: -1,-1,-1, 0,15,15,15, 0,-1,-1,-1,-1,-1,-1,-1,-1,
                    139: -1,-1,-1,-1, 0,15,15, 0,-1,-1,-1,-1,-1,-1,-1,-1,
                    140: -1,-1,-1,-1, 0,15,15,15, 0,-1,-1,-1,-1,-1,-1,-1,
                    141: -1,-1,-1,-1,-1, 0,15, 0,-1,-1,-1,-1,-1,-1,-1,-1,
                    142: -1,-1,-1,-1,-1,-1, 0,-1,-1,-1,-1,-1,-1,-1,-1,-1,
                    143: -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1
                    144: };
                    145: 
                    146: Uint8 under_mouse[256];
                    147: 
                    148: void Call_BlitCursor ()
                    149: {
                    150: #if 0
                    151:        int x, y, adr, org_x, org_y;
                    152:        Uint8 *pixbase, *pix;
                    153:        const char *bmp;
                    154:        Uint8 *save;
                    155:        unsigned long Params;
                    156:        
                    157:        Params = GetReg (REG_A7);
                    158:        Params -= SIZE_WORD;
                    159:        
                    160:        org_x = STMemory_ReadLong (Params+SIZE_WORD);
                    161:        org_y = STMemory_ReadLong (Params+SIZE_WORD+SIZE_LONG);
                    162:        adr = STMemory_ReadLong (Params+SIZE_WORD+2*SIZE_LONG);
                    163: 
                    164:        pixbase = STRam + adr + (org_y*SCREENBYTES_LINE) + org_x;
                    165:        bmp = mouse_bmp;
                    166:        save = under_mouse;
                    167: 
                    168:        for (y=0; y<16; y++) {
                    169:                if (y + org_y > SCREEN_HEIGHT_HBL) break;
                    170:                pix = pixbase;
                    171:                pixbase += SCREENBYTES_LINE;
                    172:                for (x=0; x<16; x++, pix++, bmp++, save++) {
                    173:                        if (x+org_x >= SCREENBYTES_LINE) continue;
                    174:                        *save = *pix;
                    175:                        if (*bmp != -1) *pix = *bmp;
                    176:                }
                    177:        }
                    178: #endif /* 0 */
                    179:        /* in screen.h */
                    180:        mouse_shown = 1;
                    181: }
                    182: 
                    183: void Call_RestoreUnderCursor ()
                    184: {
                    185: #if 0
                    186:        int x, y, adr, org_x, org_y;
                    187:        Uint8 *pixbase, *pix;
                    188:        char *bmp;
                    189:        unsigned long Params;
                    190:        
                    191:        Params = GetReg (REG_A7);
                    192:        Params -= SIZE_WORD;
                    193:        
                    194:        org_x = STMemory_ReadLong (Params+SIZE_WORD);
                    195:        org_y = STMemory_ReadLong (Params+SIZE_WORD+SIZE_LONG);
                    196:        adr = STMemory_ReadLong (Params+SIZE_WORD+2*SIZE_LONG);
                    197: 
                    198:        pixbase = STRam + adr + (org_y*SCREENBYTES_LINE) + org_x;
                    199:        bmp = under_mouse;
                    200: 
                    201:        for (y=0; y<16; y++) {
                    202:                if (y + org_y > SCREEN_HEIGHT_HBL) break;
                    203:                pix = pixbase;
                    204:                pixbase += SCREENBYTES_LINE;
                    205:                for (x=0; x<16; x++, pix++, bmp++) {
                    206:                        if (x+org_x >= SCREENBYTES_LINE) continue;
                    207:                        if (*bmp != -1) *pix = *bmp;
                    208:                }
                    209:        }
                    210: #endif /* 0 */
                    211: }
                    212: 
                    213: void Call_PutPix ()
                    214: {
                    215:        int col, org_x, scr;
                    216:        char *pix;
                    217:        unsigned long Params;
                    218:        
                    219:        Params = GetReg (REG_A7);
                    220:        Params -= SIZE_WORD;
                    221:        
                    222:        col = STMemory_ReadWord (Params+SIZE_WORD)>>2;
                    223:        org_x = (unsigned short) GetReg (REG_D4);
                    224:        scr = GetReg (REG_A3);
                    225: 
                    226:        /* hack to fix screen line. frontier's logic still thinks
                    227:         * there are 160 bytes per line */
                    228:        /* which screen buffer it is based on */
                    229:        if (scr & 0x100000) {
                    230:                scr -= 0x100000;
                    231:                scr *= 2;
                    232:                scr += 0x100000;
                    233:        } else {
                    234:                scr -= 0xf0000;
                    235:                scr *= 2;
                    236:                scr += 0xf0000;
                    237:        }
                    238:        pix = (char *)STRam + scr + org_x;
                    239:        *pix = col;
                    240:        return;
                    241: }
                    242: 
                    243: void Call_FillLine ()
                    244: {
                    245:        int org_x,len,scr,col;
                    246:        char *pix;
                    247:        unsigned long Params;
                    248:        
                    249:        Params = GetReg (REG_A7);
                    250:        Params -= SIZE_WORD;
                    251:        
                    252: 
                    253:        col = STMemory_ReadWord (Params+SIZE_WORD)>>2;
                    254:        org_x = (unsigned short) GetReg (REG_D4);
                    255:        len = (~GetReg (REG_D5)) & 0xffff;
                    256:        scr = GetReg (REG_A3);
                    257:        
                    258:        /* hack to fix screen line. frontier's logic still thinks
                    259:         * there are 160 bytes per line */
                    260:        /* which screen buffer it is based on */
                    261:        if (scr & 0x100000) {
                    262:                scr -= 0x100000;
                    263:                scr *= 2;
                    264:                scr += 0x100000;
                    265:        } else {
                    266:                scr -= 0xf0000;
                    267:                scr *= 2;
                    268:                scr += 0xf0000;
                    269:        }
                    270:        pix = (char *)STRam + scr;
                    271:        org_x = SCREENBYTES_LINE;
                    272:        while (org_x--) {
                    273:                *pix = col;
                    274:                pix++;
                    275:        }
                    276: }
                    277: 
                    278: /*
                    279:  * This is used by the scanner code to draw object stalks
                    280:  * which are below the plane of the scanner.
                    281:  * The mask d7 indicates which pixels in the plane to set,
                    282:  * and they are set if their current colour is zero.
                    283:  *
                    284:  * This implementation isn't the way the function is really
                    285:  * supposed to be implemented (colour and draw mask was
                    286:  * combined in d6 but the colour mask is wrong now for
                    287:  * non-planar screen).
                    288:  */
                    289: void Call_BackHLine ()
                    290: {
                    291:        int i,scr,col,bitfield;
                    292:        char *pix;
                    293:        unsigned long Params;
                    294:        
                    295:        Params = GetReg (REG_A7);
                    296:        Params -= SIZE_WORD;
                    297:        
                    298: 
                    299:        col = STMemory_ReadWord (Params+SIZE_WORD)>>2;
                    300:        scr = GetReg (REG_A3);
                    301:        bitfield = (unsigned short) GetReg (REG_D7);
                    302:        
                    303:        /* hack to fix screen line. frontier's logic still thinks
                    304:         * there are 160 bytes per line */
                    305:        /* which screen buffer it is based on */
                    306:        if (scr & 0x100000) {
                    307:                scr -= 0x100000;
                    308:                scr *= 2;
                    309:                scr += 0x100000;
                    310:        } else {
                    311:                scr -= 0xf0000;
                    312:                scr *= 2;
                    313:                scr += 0xf0000;
                    314:        }
                    315:        pix = STRam + scr;
                    316:        for (i=15; i>=0; i--) {
                    317:                if ((bitfield & (1<<i)) && (*pix == 0)) *pix = col;
                    318:                pix++;
                    319:        }
                    320: }
                    321: 
                    322: void Call_OldHLine ()
                    323: {
                    324:        int org_x,len,scr,col;
                    325:        char *pix;
                    326:        unsigned long Params;
                    327:        
                    328:        Params = GetReg (REG_A7);
                    329:        Params -= SIZE_WORD;
                    330:        
                    331: 
                    332:        col = STMemory_ReadWord (Params+SIZE_WORD)>>2;
                    333:        //printf ("col=%d, d4=%d, (idx) d5=%d, (scr_line) a3=%p\n", col, Regs[REG_D4]&0xffff, Regs[REG_D5]&0xffff, (void*)Regs[REG_A3]);
                    334:        org_x = (unsigned short) GetReg (REG_D4);
                    335:        len = (unsigned short) GetReg (REG_D5);
                    336:        scr = GetReg (REG_A3);
                    337:        
                    338:        /* hack to fix screen line. frontier's logic still thinks
                    339:         * there are 160 bytes per line */
                    340:        /* which screen buffer it is based on */
                    341:        if (scr & 0x100000) {
                    342:                scr -= 0x100000;
                    343:                scr *= 2;
                    344:                scr += 0x100000;
                    345:        } else {
                    346:                scr -= 0xf0000;
                    347:                scr *= 2;
                    348:                scr += 0xf0000;
                    349:        }
                    350:        len = len/2;
                    351:        /* horizontal line */
                    352:        pix = STRam + scr + org_x;
                    353:        while (len--) {
                    354:                *pix = col;
                    355:                pix++;
                    356:        }
                    357: }
                    358: 
                    359: void Call_HLine ()
                    360: {
                    361:        int org_x,len,scr,col;
                    362:        char *pix;
                    363: 
                    364:        col = (GetReg(REG_D1) & 0xffff)>>2;
                    365:        org_x = GetReg(REG_D4) & 0xffff;
                    366:        len = GetReg(REG_D5) & 0xffff;
                    367:        scr = GetReg(REG_A3);
                    368:        
                    369:        /* horizontal line */
                    370:        pix = STRam + scr + org_x;
                    371:        while (len--) {
                    372:                *pix = col;
                    373:                pix++;
                    374:        }
                    375: }
                    376: 
                    377: /*
                    378:  * Blits frontier format 4-plane thingy
                    379:  */
                    380: void Call_BlitBmp ()
                    381: {
                    382:        int width, height, org_x, org_y, bmp, scr;
                    383:        char *bmp_pix, *scr_pix, *ybase;
                    384:        int xpoo, i, ypoo, plane_incr;
                    385:        
                    386:        short word0, word1, word2, word3;
                    387:        unsigned long Params;
                    388:        
                    389:        Params = GetReg (REG_A7);
                    390:        Params -= SIZE_WORD;
                    391:        
                    392: 
                    393:        
                    394:        width = STMemory_ReadWord (Params+SIZE_WORD);
                    395:        height = STMemory_ReadWord (Params+SIZE_WORD*2);
                    396:        org_x = STMemory_ReadWord (Params+SIZE_WORD*3);
                    397:        org_y = STMemory_ReadWord (Params+SIZE_WORD*4);
                    398:        bmp = STMemory_ReadLong (Params+SIZE_WORD*5);
                    399:        scr = STMemory_ReadLong (Params+SIZE_WORD*5 + SIZE_LONG);
                    400: 
                    401:        /* width is in words (width/16) */
                    402:        //printf ("Blit %dx%d to %d,%d, bmp 0x%x, scr 0x%x.\n", width, height, org_x, org_y, bmp, scr);
                    403:        bmp_pix = STRam + bmp + 4;
                    404:        ybase = STRam + scr + (org_y*SCREENBYTES_LINE) + org_x;
                    405: 
                    406:        /* These checks were in the original blit routine */
                    407:        if (org_x < 0) return;
                    408:        if (org_y < 0) return;
                    409:        if (height > 200) return;
                    410:        if (width > 320) return;
                    411:        
                    412:        plane_incr = 2*height*width;
                    413:        
                    414:        ypoo = height;
                    415:        while (ypoo--) {
                    416:                scr_pix = (char *)ybase;
                    417:                ybase += SCREENBYTES_LINE;
                    418:                for (xpoo = width; xpoo; xpoo--) {
                    419:                        word0 = SDL_SwapBE16 (*((short*)bmp_pix));
                    420:                        bmp_pix += plane_incr;
                    421:                        word1 = SDL_SwapBE16 (*((short*)bmp_pix));
                    422:                        bmp_pix += plane_incr;
                    423:                        word2 = SDL_SwapBE16 (*((short*)bmp_pix));
                    424:                        bmp_pix += plane_incr;
                    425:                        word3 = SDL_SwapBE16 (*((short*)bmp_pix));
                    426:                        
                    427:                        for (i=0; i<16; i++) {
                    428:                                *scr_pix = (word0 >> (15-i))&0x1;
                    429:                                *scr_pix |= ((word1 >> (15-i))&0x1)<<1;
                    430:                                *scr_pix |= ((word2 >> (15-i))&0x1)<<2;
                    431:                                *scr_pix |= ((word3 >> (15-i))&0x1)<<3;
                    432:                                scr_pix++;
                    433:                        }
                    434:                        bmp_pix -= 3*plane_incr;
                    435:                        bmp_pix += 2;
                    436:                }
                    437:        }
                    438: #if 0
                    439:        glDisable (GL_DEPTH_TEST);
                    440:        glMatrixMode (GL_PROJECTION);
                    441:        glPushMatrix ();
                    442:        glLoadIdentity ();
                    443:        glOrtho (0, 320, 0, 200, -1, 1);
                    444: 
                    445:        glMatrixMode (GL_MODELVIEW);
                    446:        glPushMatrix ();
                    447:        glLoadIdentity ();
                    448: 
                    449:        printf ("%d,%d %dx%d\n", org_x, org_y, width*16, height);
                    450:        glTranslated (org_x, 0, 0);
                    451: 
                    452:        glBegin (GL_TRIANGLE_STRIP);
                    453:                glColor3f (0.0f, 0.0f, 1.0f);
                    454:                glVertex2i (0, 0);
                    455:                glVertex2i (width*16, 0);
                    456:                glVertex2i (0, height);
                    457:                glVertex2i (width*16, height);
                    458:        glEnd ();
                    459: 
                    460:        glMatrixMode (GL_PROJECTION);
                    461:        glPopMatrix ();
                    462:        glMatrixMode (GL_MODELVIEW);
                    463:        glPopMatrix ();
                    464:        glEnable (GL_DEPTH_TEST);
                    465: #endif 
                    466: }
                    467: 
                    468: #define SCR_W  320
                    469: 
                    470: void Call_DrawStrShadowed ()
                    471: {
                    472:        unsigned char *str;
                    473:        
                    474:        str = GetReg (REG_A0) + STRam;
                    475: 
                    476:        SetReg (REG_D1, DrawStr (
                    477:                        GetReg (REG_D1), GetReg (REG_D2),
                    478:                        GetReg (REG_D0), str, TRUE));
                    479: }
                    480: 
                    481: void Call_DrawStr ()
                    482: {
                    483:        unsigned char *str;
                    484:        
                    485:        str = GetReg (REG_A0) + STRam;
                    486: 
                    487:        SetReg (REG_D1, DrawStr (
                    488:                        GetReg (REG_D1), GetReg (REG_D2),
                    489:                        GetReg (REG_D0), str, FALSE));
                    490: }
                    491: 
                    492: void Call_SetMainPalette ()
                    493: {
                    494:        Uint32 pal_ptr;
                    495:        int i;
                    496:        unsigned long Params;
                    497: 
                    498:        Params = GetReg (REG_A7);
                    499:        Params -= SIZE_WORD;
                    500:        
                    501:        
                    502:        pal_ptr = STMemory_ReadLong (Params+SIZE_WORD);
                    503:        
                    504:        for (i=0; i<16; i++) {
                    505:                MainPalette[i] = STMemory_ReadWord (pal_ptr);
                    506:                //printf ("%hx ", MainPalette[i]);
                    507:                pal_ptr+=2;
                    508:        }
                    509:        //printf ("\n");
                    510: }
                    511: 
                    512: void Call_SetCtrlPalette ()
                    513: {
                    514:        Uint32 pal_ptr;
                    515:        int i;
                    516:        unsigned long Params;
                    517:        
                    518:        Params = GetReg (REG_A7);
                    519:        Params -= SIZE_WORD;
                    520:        
                    521:        
                    522:        pal_ptr = STMemory_ReadLong (Params+SIZE_WORD);
                    523:        
                    524:        for (i=0; i<16; i++) {
                    525:                CtrlPalette[i] = STMemory_ReadWord (pal_ptr);
                    526:                pal_ptr+=2;
                    527:        }
                    528: }
                    529: 
                    530: int len_working_ext_pal;
                    531: unsigned short working_ext_pal[240];
                    532: 
                    533: void Call_InformScreens ()
                    534: {
                    535:        unsigned long Params;
                    536:        
                    537:        Params = GetReg (REG_A7);
                    538:        Params -= SIZE_WORD;
                    539:        
                    540:        physcreen2 = STMemory_ReadLong (Params+SIZE_WORD);
                    541:        logscreen2 = STMemory_ReadLong (Params+SIZE_WORD+SIZE_LONG);
                    542:        physcreen = STMemory_ReadLong (Params+SIZE_WORD+2*SIZE_LONG);
                    543:        logscreen = STMemory_ReadLong (Params+SIZE_WORD+3*SIZE_LONG);
                    544: }
                    545: 
                    546: /* also copies the extended palette into main palette */
                    547: void Call_SetScreenBase ()
                    548: {
                    549:        int i;
                    550:        unsigned long Params;
                    551:        
                    552:        Params = GetReg (REG_A7);
                    553:        Params -= SIZE_WORD;
                    554:        
                    555:        VideoBase = STMemory_ReadLong (Params+SIZE_WORD);
                    556:        VideoRaster = STRam + VideoBase;
                    557: 
                    558:        for (i=0; i<len_working_ext_pal; i++) {
                    559:                MainPalette[16+i] = working_ext_pal[i];
                    560:        }
                    561:        len_main_palette = 16 + len_working_ext_pal;
                    562: }
                    563: 
                    564: void Call_MakeExtPalette ()
                    565: {
                    566:        int col_list, len, col_idx, col_val, i;
                    567:        unsigned long Params;
                    568:        
                    569:        Params = GetReg (REG_A7);
                    570:        Params -= SIZE_WORD;
                    571:        
                    572: 
                    573:        col_list = STMemory_ReadLong (Params+SIZE_WORD);
                    574: 
                    575:        len = STMemory_ReadWord (col_list) >> 2;
                    576:        len_working_ext_pal = len;
                    577:        col_list+=2;
                    578:        //printf ("%d colours.\n", len+2);
                    579:        for (i=0; i<len; i++) {
                    580:                col_val = STMemory_ReadWord (col_list);
                    581:                working_ext_pal[i] = col_val;
                    582:                col_list += 2;
                    583:                col_idx = STMemory_ReadWord (col_list);
                    584:                /* offset dynamic colours into extended palette
                    585:                 * range (colours 16+) */
                    586:                col_idx += 16<<2;
                    587:                STMemory_WriteWord (col_list, col_idx);
                    588:                col_list += 2;
                    589:        }
                    590: }
                    591: void Call_DumpRegs ()
                    592: {
                    593:        int i;
                    594:        printf ("D: ");
                    595:        for (i=0; i<8; i++) {
                    596:                printf ("$%x ", GetReg (i));
                    597:        } printf ("\n");
                    598:        printf ("A: ");
                    599:        for (i=0; i<8; i++) {
                    600:                printf ("$%x ", GetReg (i+8));
                    601:        } printf ("\n");
                    602: }
                    603: 
                    604: 
                    605: void Call_DumpDebug ()
                    606: {
                    607:        int i, j;
                    608:        printf ("Debug info. PC @ 68k line %d.\n", line_no);
                    609:        
                    610:        Call_DumpRegs ();
                    611:        
                    612:        printf ("Stack:");
                    613:        j = GetReg (15);
                    614:        for (i=0; i<8; i++) {
                    615:                j+=4;
                    616:                printf (" $%x", STMemory_ReadLong (j));
                    617:        }
                    618:        putchar ('\n');
                    619: }
                    620: 
                    621: 
                    622: /* mouse pos in d3,d4 */
                    623: void Call_NotifyMousePos ()
                    624: {
                    625: #if 0
                    626:        int x, y;
                    627:        
                    628:        x = GetReg (REG_D3) & 0xffff;
                    629:        y = GetReg (REG_D4) & 0xffff;
                    630: 
                    631:        x *= ScreenDraw.MouseScale;
                    632:        y *= ScreenDraw.MouseScale;
                    633:        
                    634:        SDL_EventState (SDL_MOUSEMOTION, SDL_DISABLE);
                    635:        SDL_WarpMouse (x, y);
                    636:        SDL_EventState (SDL_MOUSEMOTION, SDL_ENABLE);
                    637:        SDL_ShowCursor (SDL_ENABLE);    
                    638: #endif /* 0 */
                    639: }
                    640: 
                    641: static void Call_Idle ()
                    642: {
                    643:        SDL_Delay (0);
                    644: }
                    645: 
                    646: void Call_HostUpdate ()
                    647: {
                    648:        /* Clear any key presses which are due to be de-bounced (held for one ST frame) */
                    649:        Keymap_DebounceAllKeys();
                    650:        /* Check 'Function' keys, so if press F12 we update screen correctly to Window! */
                    651:        ShortCut_CheckKeys();
                    652:        /* And handle any messages, check for quit message */
                    653:        Main_EventHandler();         /* Process messages, set 'bQuitProgram' if user tries to quit */
                    654:        /* Pass NULL interrupt function to quit cleanly */
                    655:        //if (bQuitProgram) Int_AddAbsoluteInterrupt(4, 0L);
                    656: }
                    657: 
                    658: /* d0.b = exception number, a0 = handler. */
                    659: static void SetExceptionHandler ()
                    660: {
                    661:        /* only 32 handlers */
                    662:        exception_handlers[GetReg(0) & 31] = GetReg (8);
                    663: }
                    664: 
                    665: int DumpMess (int pos, int line)
                    666: {
                    667:        if (GetXFlag ()) putchar ('X');
                    668:        if (GetZFlag ()) putchar ('Z');
                    669:        if (GetNFlag ()) putchar ('N');
                    670:        if (GetVFlag ()) putchar ('V');
                    671:        if (GetCFlag ()) putchar ('C');
                    672:        return 0;
                    673:        printf (" $%x $%x $%x $%x $%x $%x $%x $%x*$%x $%x $%x $%x $%x $%x $%x $%x:%d\n",
                    674:                        GetReg (0),
                    675:                        GetReg (1),
                    676:                        GetReg (2),
                    677:                        GetReg (3),
                    678:                        GetReg (4),
                    679:                        GetReg (5),
                    680:                        GetReg (6),
                    681:                        GetReg (7),
                    682:                        GetReg (8),
                    683:                        GetReg (9),
                    684:                        GetReg (10),
                    685:                        GetReg (11),
                    686:                        GetReg (12),
                    687:                        GetReg (13),
                    688:                        GetReg (14),
                    689:                        GetReg (15),line_no);
                    690: }
                    691: static int _X, _Z, _N, _V, _C;
                    692: static int PrevRegs[16];
                    693: 
                    694: int changed ()
                    695: {
                    696:        int i;
                    697:        if (GetXFlag () != _X) return 1;
                    698:        if (GetZFlag () != _Z) return 1;
                    699:        if (GetNFlag () != _N) return 1;
                    700:        if (GetVFlag () != _V) return 1;
                    701:        if (GetCFlag () != _C) return 1;
                    702:        for (i=0; i<16; i++) {
                    703:                if (PrevRegs[i] != GetReg (i)) return 1;
                    704:        }
                    705:        return 0;
                    706: }
                    707: 
                    708: void DumpRegsChanged ()
                    709: {
                    710:        int i;
                    711: 
                    712:        //if (!changed ()) return;
                    713: 
                    714:        _X = GetXFlag ();
                    715:        _Z = GetZFlag ();
                    716:        _V = GetVFlag ();
                    717:        _N = GetNFlag ();
                    718:        _C = GetCFlag ();
                    719:        
                    720:        if (_X) putchar ('X');
                    721:        if (_Z) putchar ('Z');
                    722:        if (_N) putchar ('N');
                    723:        if (_V) putchar ('V');
                    724:        if (_C) putchar ('C');
                    725:        
                    726:        for (i=0; i<16; i++) {
                    727:                if (PrevRegs[i] != GetReg (i)) {
                    728:                        printf (" %c%d:%x->%x", (i<8?'d':'a'), (i<8?i:i-8), PrevRegs[i], GetReg (i));
                    729:                        PrevRegs[i] = GetReg (i);
                    730:                }
                    731:        }
                    732:        printf (" @%d\n", line_no);
                    733: }
                    734: 
                    735: static void Call_Fdelete ()
                    736: {
                    737:        int p, i;
                    738:        char filename[64];
                    739: 
                    740:        p = GetReg (REG_D1);
                    741:        for (i=0; ; i++) {
                    742:                filename[i] = STMemory_ReadByte (p++);
                    743:                if (!filename[i]) break;
                    744:        }
                    745: 
                    746:        SetReg (REG_D0, remove (filename));
                    747: }
                    748: 
                    749: static void Call_Fwrite ()
                    750: {
                    751:        int p, i;
                    752:        int pBuf = GetReg (REG_A4);
                    753:        int len = GetReg (REG_D7);
                    754:        char filename[64];
                    755:        FILE *f;
                    756: 
                    757:        p = GetReg (REG_D1);
                    758:        for (i=0; ; i++) {
                    759:                filename[i] = STMemory_ReadByte (p++);
                    760:                if (!filename[i]) break;
                    761:        }
                    762: 
                    763:        if (!(f = fopen (filename, "wb"))) {
                    764:                SetReg (REG_D0, 0);
                    765:        } else {
                    766:                SetReg (REG_D0, fwrite (STRam+pBuf, 1, len, f));
                    767:                fclose (f);
                    768:        }
                    769: }
                    770:        
                    771: static void Call_Fread ()
                    772: {
                    773:        int p, i;
                    774:        int pBuf = GetReg (REG_A4);
                    775:        int len = GetReg (REG_D7);
                    776:        char filename[64];
                    777:        FILE *f;
                    778: 
                    779:        p = GetReg (REG_D1);
                    780:        for (i=0; ; i++) {
                    781:                filename[i] = STMemory_ReadByte (p++);
                    782:                if (!filename[i]) break;
                    783:        }
                    784: 
                    785:        if (!(f = fopen (filename, "rb"))) {
                    786:                SetReg (REG_D0, 0);
                    787:        } else {
                    788:                SetReg (REG_D0, fread (STRam+pBuf, 1, len, f));
                    789:                fclose (f);
                    790:        }
                    791: }
                    792: 
                    793: #include <dirent.h>
                    794: static DIR *poodir;
                    795: 
                    796: static char cur_dir[1024];
                    797: 
                    798: static void Call_Fopendir ()
                    799: {
                    800:        int p, i;
                    801:        char name[64];
                    802: 
                    803:        p = GetReg (REG_A2);
                    804:        for (i=0; ; i++) {
                    805:                name[i] = STMemory_ReadByte (p++);
                    806:                if (!name[i]) break;
                    807:        }
                    808: 
                    809:        strncpy (cur_dir, name, 1024);
                    810:        
                    811:        poodir = opendir (name);
                    812:        if (poodir) {
                    813:                struct dirent *dent;
                    814:                /* skip '.' and '..' */
                    815:                dent = readdir (poodir);
                    816:                dent = readdir (poodir);
                    817:                SetReg (REG_D0, 0);
                    818:        } else {
                    819:                SetReg (REG_D0, -1);
                    820:        }
                    821: }
                    822: 
                    823: static void Call_Fclosedir ()
                    824: {
                    825:        closedir (poodir);
                    826: }
                    827: 
                    828: /* make sure fe2.s is allocating enough space at a0... */
                    829: #define MAX_FILENAME_LEN       14
                    830: 
                    831: static void Call_Freaddir ()
                    832: {
                    833:        int p, i, attribs, len;
                    834:        char name[MAX_FILENAME_LEN];
                    835:        /* filename into buffer (a0), attributes d2, len d1 */
                    836:        char full_path_shit[1024];
                    837:        struct stat _stat;
                    838:        struct dirent *dent = readdir (poodir);
                    839:        if (dent == NULL) {
                    840:                SetReg (REG_D0, -1);
                    841:                return;
                    842:        }
                    843:        strncpy (name, dent->d_name, MAX_FILENAME_LEN);
                    844:        name[MAX_FILENAME_LEN-1] = '\0';
                    845:        
                    846:        strncpy (full_path_shit, cur_dir, 1024);
                    847:        strncat (full_path_shit, "/", 1024);
                    848:        strncat (full_path_shit, dent->d_name, 1024);
                    849:        stat (full_path_shit, &_stat);
                    850:        
                    851:        len = _stat.st_size;
                    852:        attribs = (S_ISDIR (_stat.st_mode) ? 0x10 : 0);
                    853:        
                    854:        p = GetReg (REG_A0);
                    855:        for (i=0; i<MAX_FILENAME_LEN; i++) {
                    856:                STMemory_WriteByte (p++, name[i]);
                    857:        }
                    858:        SetReg (REG_D2, attribs);
                    859:        SetReg (REG_D1, len);
                    860:        SetReg (REG_D0, 0);
                    861: }
                    862: 
                    863: HOSTCALL hcalls [] = {
                    864:        &SetExceptionHandler,
                    865:        &Call_Memset,           /* 0x1 */
                    866:        &Call_MemsetBlue,               /* 0x2 */
                    867:        &Call_BlitCursor,               /* 0x3 */
                    868:        &Call_RestoreUnderCursor,       /* 0x4 */
                    869:        &Call_BlitBmp,          /* 0x5 */
                    870:        &Call_OldHLine,         /* 0x6 */
                    871:        &Call_HostUpdate,               /* 0x7 */
                    872:        &Call_Memcpy,           /* 0x8 */
                    873:        &Call_PutPix,           /* 0x9 */
                    874:        &Call_BackHLine,                /* 0xa */
                    875:        &Call_FillLine,         /* 0xb */
                    876:        &Call_SetMainPalette,   /* 0xc */
                    877:        &Call_SetCtrlPalette,   /* 0xd */
                    878:        &Call_SetScreenBase,            /* 0xe */
                    879:        NULL,           /* 0xf */
                    880:        &Call_DumpRegs,         /* 0x10 */
                    881:        &Call_MakeExtPalette,   /* 0x11 */
                    882:        &Call_PlaySFX,                  /* 0x12 */
                    883:        &Call_GetMouseInput,            /* 0x13 */
                    884:        &Call_GetKeyboardEvent,         /* 0x14 */
                    885:        NULL,                   /* 0x15 */
                    886:        &Call_HLine,                    /* 0x16 */
                    887:        NULL,                           /* 0x17 */
                    888:        &Call_NotifyMousePos,           /* 0x18 */
                    889:        &Call_InformScreens,            /* 0x19 */
                    890:        NULL,
                    891:        &Call_DrawStrShadowed,          /* 0x1b */
                    892:        &Call_DrawStr,                  /* 0x1c */
                    893:        &Call_PlayMusic,                /* 0x1d */
                    894:        &Call_StopMusic,                /* 0x1e */
                    895:        &Call_Idle,                     /* 0x1f */
                    896:        &Call_DumpDebug,                /* 0x20 */
                    897:        &Call_IsMusicPlaying,
                    898:        &Call_Fread,                    /* 0x22 */
                    899:        &Call_Fwrite,
                    900:        &Call_Fdelete,
                    901:        &Call_Fopendir,                 /* 0x25 */
                    902:        &Call_Freaddir,
                    903:        &Call_Fclosedir,
                    904:        NULL,
                    905:        NULL,
                    906:        NULL,
                    907:        NULL,
                    908:        NULL,
                    909:        NULL,
                    910:        NULL,
                    911:        NULL,
                    912:        NULL,                           /* 0x30 */
                    913:        NULL,
                    914:        NULL,
                    915:        NULL,
                    916:        NULL,
                    917:        NULL,
                    918:        NULL,
                    919:        NULL,
                    920:        NULL,
                    921:        NULL,
                    922:        NULL,
                    923:        NULL,
                    924:        NULL,
                    925:        NULL,
                    926:        NULL,
                    927:        NULL,
                    928:        NULL,                   /* 0x40 */
                    929:        NULL,
                    930:        NULL,
                    931:        NULL,
                    932:        NULL,
                    933:        NULL,
                    934:        NULL,
                    935:        NULL,
                    936:        NULL,
                    937:        NULL,
                    938:        NULL,
                    939:        NULL,
                    940:        NULL,
                    941:        NULL,
                    942:        NULL,
                    943:        NULL,
                    944:        NULL,                           /* 0x50 */
                    945:        NULL,
                    946:        NULL,
                    947:        NULL,
                    948:        NULL,
                    949:        NULL,
                    950:        NULL,
                    951:        NULL,
                    952:        NULL,
                    953:        NULL,
                    954:        NULL,
                    955:        NULL,
                    956:        NULL,
                    957:        NULL,
                    958:        NULL,
                    959:        NULL,
                    960:        Nu_PutTriangle,                 /* 0x60 */
                    961:        Nu_PutQuad,
                    962:        Nu_PutLine,
                    963:        Nu_PutPoint,
                    964:        Nu_PutTwinklyCircle,
                    965:        Nu_PutColoredPoint,
                    966:        Nu_PutBezierLine,
                    967:        Nu_ComplexStart,
                    968:        Nu_ComplexSNext,
                    969:        Nu_ComplexSBegin,
                    970:        Nu_ComplexEnd,
                    971:        Nu_3DViewInit,
                    972:        Nu_InsertZNode,
                    973:        Nu_ComplexStartInner,
                    974:        Nu_ComplexBezier,
                    975:        Nu_DrawScreen,
                    976:        Nu_PutTeardrop,
                    977:        Nu_PutCircle,
                    978:        Nu_PutOval,
                    979:        Nu_IsGLRenderer,
                    980:        Nu_GLClearArea,
                    981:        Nu_QueueDrawStr,
                    982:        Nu_PutCylinder,
                    983:        Nu_PutBlob,
                    984:        Nu_PutPlanet
                    985: };

unix.superglobalmegacorp.com

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