|
|
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: };
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.