Annotation of hatari/src/tos.c, revision 1.1

1.1     ! root        1: /*
        !             2:   Hatari
        !             3: 
        !             4:   Load TOS image file into ST memory, fix/setup for emulator
        !             5: 
        !             6:   The Atari ST TOS needs to be patched to help with emulation. Eg, it references the MMU chip
        !             7:   to set memory size. This is patched to the sizes we need without the complicated emulation
        !             8:   of hardware which is not needed(as yet). We also patch DMA devices and Hard Drives.
        !             9:   NOTE: TOS versions 1.06 and 1.62 were not designed for use on a real STfm. These were for the
        !            10:   STe machine ONLY. They access the DMA/Microwire addresses on boot-up which(correctly) cause a
        !            11:   bus-error on Hatari as they would in a real STfm. If a user tries to select any of these images
        !            12:   we bring up an error and default back to the built-in TOS 1.00
        !            13: */
        !            14: 
        !            15: #include "main.h"
        !            16: #include "cart.h"
        !            17: #include "debug.h"
        !            18: #include "decode.h"
        !            19: #include "dialog.h"
        !            20: #include "errlog.h"
        !            21: #include "file.h"
        !            22: #include "floppy.h"
        !            23: #include "m68000.h"
        !            24: #include "memAlloc.h"
        !            25: #include "memorySnapShot.h"
        !            26: #include "stMemory.h"
        !            27: #include "tos.h"
        !            28: #include "vdi.h"
        !            29: 
        !            30: #define szTOSImageFileName "tos.img"  /* FIXME: Make it more flexible */
        !            31: 
        !            32: 
        !            33: /* Settings for differnt memory sizes */
        !            34: static MEMORY_INFO MemoryInfo[] = {
        !            35:   0x80000,0x0000,0x00080000,     /* MEMORYSIZE_512 */
        !            36:   0x100000,0x0101,0x00100000,    /* MEMORYSIZE_1024 */
        !            37:   0x200000,0x0001,0x00200000,    /* MEMORYSIZE_2MB */
        !            38:   0x400000,0x1010,0x00400000     /* MEMORYSIZE_4MB */
        !            39: };
        !            40: 
        !            41: int nMemorySize=1; /* 0=512k, 1=1MB, 2=2MB, 3=4MB */
        !            42: 
        !            43: /* Bit masks of connected drives(we support upto C,D,E,F) */
        !            44: unsigned int ConnectedDriveMaskList[] = {
        !            45:   0x03,  /* DRIVELIST_NONE  A,B         */
        !            46:   0x07,  /* DRIVELIST_C    A,B,C       */
        !            47:   0x0F,  /* DRIVELIST_CD    A,B,C,D     */
        !            48:   0x1F,  /* DRIVELIST_CDE  A,B,C,D,E   */
        !            49:   0x3F,  /* DRIVELIST_CDEF  A,B,C,D,E,F */
        !            50: };
        !            51: 
        !            52: unsigned short int TOSVersion;          /* eg, 0x0100, 0x0102 */
        !            53: unsigned long TOSAddress,TOSSize;       /* Address in ST memory and size of TOS image */
        !            54: unsigned int ConnectedDriveMask=0x03;   /* Bit mask of connected drives, eg 0x7 is A,B,C */
        !            55: /*BOOL bOverrideTOSImage=FALSE;*/       /* Override TOS filename, used by Favourites(retains dialog TOS setting for saving) */
        !            56: /*char szTOSImageOverrideFileName[MAX_FILENAME_LENGTH];*/
        !            57: 
        !            58: /* Possible TOS file extensions to scan for */
        !            59: char *pszTOSNameExts[] = {
        !            60:   ".img",
        !            61:   ".rom",
        !            62:   ".tos",
        !            63:   NULL
        !            64: };
        !            65: 
        !            66: /* Taken from Decode.asm - Thothy */
        !            67: unsigned long STRamEnd;                 /* End of ST Ram, above this address is no-mans-land and hardware vectors */
        !            68: unsigned long STRamEnd_BusErr;          /* as above, but start of BUS error exception */
        !            69: 
        !            70: 
        !            71: 
        !            72: //-----------------------------------------------------------------------
        !            73: /*
        !            74:   Save/Restore snapshot of local variables('MemorySnapShot_Store' handles type)
        !            75: */
        !            76: void TOS_MemorySnapShot_Capture(BOOL bSave)
        !            77: {
        !            78:   // Save/Restore details
        !            79:   MemorySnapShot_Store(&TOSVersion,sizeof(TOSVersion));
        !            80:   MemorySnapShot_Store(&TOSAddress,sizeof(TOSAddress));
        !            81:   MemorySnapShot_Store(&TOSSize,sizeof(TOSSize));
        !            82:   MemorySnapShot_Store(&ConnectedDriveMask,sizeof(ConnectedDriveMask));
        !            83: }
        !            84: 
        !            85: //-----------------------------------------------------------------------
        !            86: /*
        !            87:   Load TOS Rom image file into ST memory space and fix image so can emulate correctly
        !            88:   Pre TOS 1.06 are loaded at 0xFC0000 with later ones at 0xE00000
        !            89:   If we cannot find the TOS image, or we detect an error we default to the built-in
        !            90:   TOS 1.00 image. This works great for new users who do not understand the idea of a TOS
        !            91:   Rom and are confused when presented with a 'select TOS image' dialog.
        !            92: */
        !            93: void TOS_LoadImage(void)
        !            94: {
        !            95:   void *pTOSFile = NULL;
        !            96:   unsigned short int *pVersionPtr, *pTerritoryPtr;
        !            97:   BOOL bTOSImageLoaded = FALSE;
        !            98: 
        !            99:   /* Load TOS image into memory so we can check it's vesion */
        !           100:   TOSVersion = 0;
        !           101: /*  if (bOverrideTOSImage)
        !           102:     pTOSFile = File_Read(szTOSImageOverrideFileName,NULL,NULL,pszTOSNameExts);*/
        !           103:   /* If not override TOS, if it failed to load use detault */
        !           104:   if (pTOSFile==NULL)
        !           105:     pTOSFile = File_Read(/*ConfigureParams.TOSGEM.*/szTOSImageFileName,NULL,NULL,pszTOSNameExts);
        !           106: 
        !           107:   if (pTOSFile) {
        !           108:     /* Now, look at start of image to find Version number and Territory */
        !           109:     pVersionPtr = (unsigned short int *)((unsigned long)pTOSFile+0x2);
        !           110:     pTerritoryPtr = (unsigned short int *)((unsigned long)pTOSFile+0x1c);
        !           111:     TOSVersion = STMemory_Swap68000Int(*pVersionPtr);
        !           112: 
        !           113:     /* Now see where to copy image */
        !           114:     switch(TOSVersion) {
        !           115:       case 0x0100:               /* TOS 1.00 */
        !           116:       case 0x0102:               /* TOS 1.02 */
        !           117:       case 0x0104:               /* TOS 1.04 */
        !           118:         TOSAddress = 0xFC0000;
        !           119:         TOSSize = 192*1024;      /* 192k */
        !           120:         bTOSImageLoaded = TRUE;
        !           121:         break;
        !           122: 
        !           123:       /* TOSes 1.06 and 1.62 are for the STe ONLY and so don't run on a real STfm. */
        !           124:       /* They access illegal memory addresses which don't exist on a real machine and cause the OS */
        !           125:       /* to lock up. So, if user selects one of these, show error and default to original TOS */
        !           126:       case 0x0106:          /* TOS 1.06 */
        !           127:       case 0x0162:          /* TOS 1.62 */
        !           128:         Main_Message("TOS versions 1.06 and 1.62 are NOT valid STfm images.\n\nThese were only designed for use on the STe range of machines.\n",PROG_NAME /*,MB_OK|MB_ICONINFORMATION*/);
        !           129:         bTOSImageLoaded = FALSE;
        !           130:         break;
        !           131: 
        !           132:       case 0x0205:          /* TOS 2.05 */
        !           133:       case 0x0206:          /* TOS 2.06 */
        !           134:         TOSAddress = 0xE00000;
        !           135:         TOSSize = 256*1024;      /* 256k */
        !           136:         bTOSImageLoaded = TRUE;
        !           137:         break;
        !           138:     }
        !           139: 
        !           140:     /* Copy loaded image into ST memory, if found valid one*/
        !           141:     if (bTOSImageLoaded)
        !           142:       memcpy((void *)((unsigned long)STRam+TOSAddress),pTOSFile,TOSSize);
        !           143:   }
        !           144: 
        !           145:   /* Are we allowed VDI under this TOS? */
        !           146:   if ( (TOSVersion<0x0104) && (bUseVDIRes) ) {
        !           147:     /* Warn user (exit if need to) */
        !           148:     Main_Message("To use GEM Extended resolutions, you must select TOS 1.04 or higher.",PROG_NAME /*,MB_OK|MB_ICONINFORMATION*/);
        !           149:     /* And select non VDI */
        !           150:     bUseVDIRes = ConfigureParams.TOSGEM.bUseExtGEMResolutions = FALSE; /*FIXME*/
        !           151:     /* Default TOS 1.00 */
        !           152:     bTOSImageLoaded = FALSE;
        !           153:   }
        !           154: 
        !           155:   /* We currently only can handle TOS 1.00-1.04, TOS 2.0x does not work, don't know why... */
        !           156:         if(TOSVersion>0x0104)
        !           157:          {
        !           158:           fprintf(stderr, "Hatari only support TOS 1.00, 1.02 and 1.04 at the moment. Sorry.\n");
        !           159:           /*bTOSImageLoaded=FALSE;*/
        !           160:          }
        !           161: 
        !           162:   /* Did we load a TOS image correctly? */
        !           163:   if (!bTOSImageLoaded) {
        !           164:     fprintf(stderr, "Error: No tos.img loaded!\n");
        !           165:     exit(-1);
        !           166:   }
        !           167: 
        !           168:   /* Fix TOS image, modify code for emulation */
        !           169:   TOS_FixRom();
        !           170: 
        !           171:   /* Set connected devices, memory configuration */
        !           172:   TOS_SetDefaultMemoryConfig();
        !           173: 
        !           174:   /* and free loaded image */
        !           175:   Memory_Free(pTOSFile);
        !           176: }
        !           177: 
        !           178: //-----------------------------------------------------------------------
        !           179: /*
        !           180:   Modify TOS Rom image to set default memory configuration, connected floppies and memory size
        !           181:   and skip some TOS setup code which we don't support/need.
        !           182:   As TOS Roms need to be modified we can only run images which are entered here.
        !           183: 
        !           184:   So, how do we find these addresses when we have no commented source code?
        !           185:   Easy,
        !           186:     Hdv_init: Scan start of TOS for table of move.l <addr>,$46A(a5), around 0x224 bytes in
        !           187:       and look at the first entry - that's the hdv_init address.
        !           188:     Hdv_boot: Scan start of TOS for table of move.l <addr>,$47A(a5), and look for 5th entry
        !           189:       - that's the hdv_boot address. The function starts with link,movem,jsr.
        !           190:     Boot from DMA bus: again scan at start of rom for tst.w $482, boot call will be just above it.
        !           191:     Set connected drives: search for 'clr.w' and '$4c2' to find, may use (a5) in which case op-code
        !           192:      is only 4 bytes and also note this is only do on TOS's after 1.00
        !           193: */
        !           194: void TOS_FixRom(void)
        !           195: {
        !           196:   switch(TOSVersion) {
        !           197:     /*
        !           198:       TOS 1.00 settings
        !           199:     */
        !           200:     case 0x0100:
        !           201:       /* hdv_init, initialize drives */
        !           202:       STMemory_WriteWord(0xFC0D60,RTS_OPCODE);    //RTS
        !           203: 
        !           204:       /* FC1384  JSR $FC0AF8  hdv_boot, load boot sector */
        !           205:       STMemory_WriteWord(0xFC1384,NOP_OPCODE);    //NOP
        !           206:       STMemory_WriteWord(0xFC1384+2,NOP_OPCODE);  //NOP
        !           207:       STMemory_WriteWord(0xFC1384+4,NOP_OPCODE);  //NOP
        !           208: 
        !           209:       /* FC03d6  JSR $FC04A8  Boot from DMA bus */
        !           210:       if (bUseVDIRes) {
        !           211:         STMemory_WriteWord(0xFC03D6,0xa000);      //Init Line-A
        !           212:         STMemory_WriteWord(0xFC03D6+2,0xa0ff);    //Trap Line-A(to get structure)
        !           213:       }
        !           214:       else {
        !           215:         STMemory_WriteWord(0xFC03D6,NOP_OPCODE);  //NOP
        !           216:         STMemory_WriteWord(0xFC03D6+2,NOP_OPCODE);  //NOP
        !           217:       }
        !           218: 
        !           219:       /* Timer D(MFP init 0xFC21B4), set value before call Set Timer routine */
        !           220:       STMemory_WriteWord(0xFC21F6,TIMERD_OPCODE);
        !           221: 
        !           222:       /* Modify assembler loaded into cartridge area */
        !           223:       Cart_WriteHdvAddress(0x167A);
        !           224:       break;
        !           225: 
        !           226:     /*
        !           227:       TOS 1.02 settings
        !           228:     */
        !           229:     case 0x0102:
        !           230:       /* hdv_init, initialize drives */
        !           231:       STMemory_WriteWord(0xFC0F44,RTS_OPCODE);    //RTS
        !           232: 
        !           233:       /* FC1568  JSR $FC0C2E  hdv_boot, load boot sector */
        !           234:       STMemory_WriteWord(0xFC1568,NOP_OPCODE);    //NOP
        !           235:       STMemory_WriteWord(0xFC1568+2,NOP_OPCODE);  //NOP
        !           236:       STMemory_WriteWord(0xFC1568+4,NOP_OPCODE);  //NOP
        !           237: 
        !           238:       /* FC0472  BSR.W $FC0558  Boot from DMA bus */
        !           239:       if (bUseVDIRes) {
        !           240:         STMemory_WriteWord(0xFC0472,0xa000);      //Init Line-A
        !           241:         STMemory_WriteWord(0xFC0472+2,0xa0ff);    //Trap Line-A(to get structure)
        !           242:       }
        !           243:       else {
        !           244:         STMemory_WriteWord(0xFC0472,NOP_OPCODE);  //NOP
        !           245:         STMemory_WriteWord(0xFC0472+2,NOP_OPCODE);  //NOP
        !           246:       }
        !           247: 
        !           248:       /* FC0302  CLR.L $4C2  Set connected drives */
        !           249:       STMemory_WriteWord(0xFC0302,CONDRV_OPCODE);
        !           250:       STMemory_WriteWord(0xFC0302+2,NOP_OPCODE);  //NOP
        !           251:       STMemory_WriteWord(0xFC0302+4,NOP_OPCODE);  //NOP  
        !           252: 
        !           253:       // Timer D(MFP init 0xFC2408)
        !           254:       STMemory_WriteWord(0xFC2450,TIMERD_OPCODE);
        !           255: 
        !           256:       // Modify assembler loaded into cartridge area
        !           257:       Cart_WriteHdvAddress(0x16DA);
        !           258:       break;
        !           259: 
        !           260:     /*
        !           261:       TOS 1.04 settings
        !           262:     */
        !           263:     case 0x0104:
        !           264:       /* hdv_init, initialize drives */
        !           265:       STMemory_WriteWord(0xFC16BA,RTS_OPCODE);      //RTS
        !           266: 
        !           267:       /* FC1CCE  JSR $FC0BD8  hdv_boot, load boot sector */
        !           268:       STMemory_WriteWord(0xFC1CCE,NOP_OPCODE);      //NOP
        !           269:       STMemory_WriteWord(0xFC1CCE + 2,NOP_OPCODE);  //NOP
        !           270:       STMemory_WriteWord(0xFC1CCE + 4,NOP_OPCODE);  //NOP
        !           271: 
        !           272:       /* FC0466  BSR.W $FC054C  Boot from DMA bus */
        !           273:       if (bUseVDIRes) {
        !           274:         STMemory_WriteWord(0xFC0466,0xa000);        //Init Line-A
        !           275:         STMemory_WriteWord(0xFC0466+2,0xa0ff);      //Trap Line-A(to get structure)
        !           276:       }
        !           277:       else {
        !           278:         STMemory_WriteWord(0xFC0466,NOP_OPCODE);    //NOP
        !           279:         STMemory_WriteWord(0xFC0466+2,NOP_OPCODE);  //NOP
        !           280:       }
        !           281: 
        !           282:       /* FC02E6  CLR.L $4C2(A5)  Set connected drives */
        !           283:       STMemory_WriteWord(0xFC02E6,CONDRV_OPCODE);
        !           284:       STMemory_WriteWord(0xFC02E6+2,NOP_OPCODE);    //NOP
        !           285: 
        !           286:       /* Timer D(MFP init 0xFC34FC) */
        !           287:       STMemory_WriteWord(0xFC3544,TIMERD_OPCODE);
        !           288: 
        !           289:       /* Modify assembler loaded into cartridge area */
        !           290:       Cart_WriteHdvAddress(0x181C);
        !           291:       break;
        !           292: 
        !           293:     /*
        !           294:       TOS 1.06 settings
        !           295:     */
        !           296: //    case 0x0106:
        !           297: //      // hdv_init, initialize drives
        !           298: //      STMemory_WriteWord(0xE01892,RTS_OPCODE);  //RTS
        !           299: //
        !           300: //      // E01EA6  JSR $E00D74      hdv_boot, load boot sector
        !           301: //      STMemory_WriteWord(0xE01EA6,NOP_OPCODE);  //NOP
        !           302: //      STMemory_WriteWord(0xE01EA6+2,NOP_OPCODE);  //NOP
        !           303: //      STMemory_WriteWord(0xE01EA6+4,NOP_OPCODE);  //NOP
        !           304: //
        !           305: //      // E00576  BSR.W $E0065C    Boot from DMA bus
        !           306: //      if (bUseVDIRes) {
        !           307: //        STMemory_WriteWord(0xE00576,0xa000);  //Init Line-A
        !           308: //        STMemory_WriteWord(0xE00576+2,0xa0ff);  //Trap Line-A(to get structure)
        !           309: //      }
        !           310: //      else {
        !           311: //        STMemory_WriteWord(0xE00576,NOP_OPCODE);  //NOP
        !           312: //        STMemory_WriteWord(0xE00576+2,NOP_OPCODE);  //NOP
        !           313: //      }
        !           314: //
        !           315: //      // E002DC  CLR.L $4C2(A5)    Set connected drives
        !           316: //      STMemory_WriteWord(0xE002DC,CONDRV_OPCODE);
        !           317: //      STMemory_WriteWord(0xE002DC+2,NOP_OPCODE);  //NOP
        !           318: //
        !           319: //      // Timer D(MFP init 0xE036BC)
        !           320: //      STMemory_WriteWord(0xE03704,TIMERD_OPCODE);
        !           321: //
        !           322: //      // Modify assembler loaded into cartridge area
        !           323: //      Cart_WriteHdvAddress(0x185C);
        !           324: //      break;
        !           325: 
        !           326:     /*
        !           327:       TOS 1.62 settings
        !           328:     */
        !           329: //    case 0x0162:
        !           330: //      // hdv_init, initialize drives
        !           331: //      STMemory_WriteWord(0xE01892,RTS_OPCODE);  //RTS
        !           332: //
        !           333: //      // E01EA6  JSR $E00D74      hdv_boot, load boot sector
        !           334: //      STMemory_WriteWord(0xE01EA6,NOP_OPCODE);  //NOP
        !           335: //      STMemory_WriteWord(0xE01EA6+2,NOP_OPCODE);  //NOP
        !           336: //      STMemory_WriteWord(0xE01EA6+4,NOP_OPCODE);  //NOP
        !           337: //
        !           338: //      // E00576  BSR.W $E0065C    Boot from DMA bus
        !           339: //      if (bUseVDIRes) {
        !           340: //        STMemory_WriteWord(0xE00576,0xa000);  //Init Line-A
        !           341: //        STMemory_WriteWord(0xE00576+2,0xa0ff);  //Trap Line-A(to get structure)
        !           342: //      }
        !           343: //      else {
        !           344: //        STMemory_WriteWord(0xE00576,NOP_OPCODE);  //NOP
        !           345: //        STMemory_WriteWord(0xE00576+2,NOP_OPCODE);  //NOP
        !           346: //      }
        !           347: //
        !           348: //      // E002DC  CLR.L $4C2(A5)    Set connected drives
        !           349: //      STMemory_WriteWord(0xE002DC,CONDRV_OPCODE);
        !           350: //      STMemory_WriteWord(0xE002DC+2,NOP_OPCODE);  //NOP
        !           351: //
        !           352: //      // Timer D(MFP init 0xE036BC)
        !           353: //      STMemory_WriteWord(0xE03704,TIMERD_OPCODE);
        !           354: //
        !           355: //      // Modify assembler loaded into cartridge area
        !           356: //      Cart_WriteHdvAddress(0x185C);
        !           357: //      break;
        !           358: 
        !           359:     /*
        !           360:       TOS 2.05 settings
        !           361:     */
        !           362:     case 0x0205:
        !           363:       // hdv_init, initialize drives
        !           364:       STMemory_WriteWord(0xE0468C,RTS_OPCODE);    //RTS
        !           365: 
        !           366:       // E04CA0  JSR $E00E8E      hdv_boot, load boot sector
        !           367:       STMemory_WriteWord(0xE04CA0,NOP_OPCODE);    //NOP
        !           368:       STMemory_WriteWord(0xE04CA0+2,NOP_OPCODE);  //NOP
        !           369:       STMemory_WriteWord(0xE04CA0+4,NOP_OPCODE);  //NOP
        !           370: 
        !           371:       // E006AE  BSR.W $E00794    Boot from DMA bus
        !           372:       if (bUseVDIRes) {
        !           373:         STMemory_WriteWord(0xE006AE,0xa000);      //Init Line-A
        !           374:         STMemory_WriteWord(0xE006AE + 2,0xa0ff);  //Trap Line-A(to get structure)
        !           375:       }
        !           376:       else {
        !           377:         STMemory_WriteWord(0xE006AE,NOP_OPCODE);  //NOP
        !           378:         STMemory_WriteWord(0xE006AE + 2,NOP_OPCODE);  //NOP
        !           379:       }
        !           380: 
        !           381:       // E002FC  CLR.L $4C2      Set connected drives
        !           382:       STMemory_WriteWord(0xE002FC,CONDRV_OPCODE);
        !           383:       STMemory_WriteWord(0xE002FC+2,NOP_OPCODE);  //NOP
        !           384: 
        !           385:       // Timer D(MFP init 0xE01928)
        !           386:       STMemory_WriteWord(0xE01972,TIMERD_OPCODE);
        !           387: 
        !           388:       // Modify assembler loaded into cartridge area
        !           389:       Cart_WriteHdvAddress(0x1410);
        !           390:       break;
        !           391: 
        !           392:     /*
        !           393:       TOS 2.06 settings
        !           394:     */
        !           395:     case 0x0206:
        !           396:       /* hdv_init, initialize drives */
        !           397:       STMemory_WriteWord(0xE0518E,RTS_OPCODE);    //RTS
        !           398: 
        !           399:       /* E05944  JSR  $E011DC    hdv_boot, load boot sector */
        !           400:       STMemory_WriteWord(0xE05944,NOP_OPCODE);    //NOP
        !           401:       STMemory_WriteWord(0xE05944+2,NOP_OPCODE);  //NOP
        !           402:       STMemory_WriteWord(0xE05944+4,NOP_OPCODE);  //NOP
        !           403: 
        !           404:       /* E00898  BSR.W  $E0097A    Boot from DMA bus */
        !           405:       if (bUseVDIRes) {
        !           406:         STMemory_WriteWord(0xE00898,0xa000);      //Init Line-A
        !           407:         STMemory_WriteWord(0xE00898+2,0xa0ff);    //Trap Line-A(to get structure)
        !           408:       }
        !           409:       else {
        !           410:         STMemory_WriteWord(0xE00898,NOP_OPCODE);  //NOP
        !           411:         STMemory_WriteWord(0xE00898+2,NOP_OPCODE);  //NOP
        !           412:       }
        !           413: 
        !           414:       /* E00362  CLR.L  $4C2    Set connected drives */
        !           415:       STMemory_WriteWord(0xE00362,CONDRV_OPCODE);
        !           416:       STMemory_WriteWord(0xE00362+2,NOP_OPCODE);  //NOP
        !           417: 
        !           418:       /* E007FA  MOVE.L  #$1FFFE,D7  Run checksums on 2xROMs(skip) */
        !           419:       /* Checksum is total of TOS rom image, but get incorrect results as we've */
        !           420:       /* changed bytes in the ROM! So, just skip anyway! */
        !           421:       STMemory_WriteWord(0xE007FA,BRAW_OPCODE);  //BRA.W  $E00894
        !           422:       STMemory_WriteWord(0xE007FA+2,0x98);
        !           423: 
        !           424:       /* Timer D(MFP init 0xE02206) */
        !           425:       STMemory_WriteWord(0xE02250,TIMERD_OPCODE);
        !           426: 
        !           427:       /* Modify assembler loaded into cartridge area */
        !           428:       Cart_WriteHdvAddress(0x1644);
        !           429:       break;
        !           430:   }
        !           431: }
        !           432: 
        !           433: //-----------------------------------------------------------------------
        !           434: /*
        !           435:   Set default memory configuration, connected floppies and memory size
        !           436: */
        !           437: void TOS_SetDefaultMemoryConfig(void)
        !           438: {
        !           439:   // As TOS checks hardware for memory size + connected devices on boot-up
        !           440:   // we set these values ourselves and fill in the magic numbers so TOS
        !           441:   // skips these tests which would crash the emulator as the reference the MMU
        !           442: 
        !           443:   // Fill in magic numbers, so TOS does not try to reference MMU
        !           444:   STMemory_WriteLong(0x420,0x752019f3);        // memvalid - configuration is valid
        !           445:   STMemory_WriteLong(0x43a,0x237698aa);        // another magic #
        !           446:   STMemory_WriteLong(0x51a,0x5555aaaa);        // and another
        !           447: 
        !           448:   // Set memory size, adjust for extra VDI screens if needed
        !           449:   if (bUseVDIRes) {
        !           450:     // This is enough for 1024x768x16colour(0x60000)
        !           451:     STMemory_WriteLong(0x436,MemoryInfo[/*ConfigureParams.Memory.*/nMemorySize].PhysTop-0x60000);  // mem top - upper end of user memory(before 32k screen)
        !           452:     STMemory_WriteLong(0x42e,MemoryInfo[/*ConfigureParams.Memory.*/nMemorySize].PhysTop-0x58000);  // phys top
        !           453:   }
        !           454:   else {
        !           455:     STMemory_WriteLong(0x436,MemoryInfo[/*ConfigureParams.Memory.*/nMemorySize].PhysTop-0x8000);  // mem top - upper end of user memory(before 32k screen)
        !           456:     STMemory_WriteLong(0x42e,MemoryInfo[/*ConfigureParams.Memory.*/nMemorySize].PhysTop);         // phys top
        !           457:   }
        !           458:   STMemory_WriteLong(0x424,MemoryInfo[/*ConfigureParams.Memory.*/nMemorySize].MemoryConfig);      // 512k configure 0x00=128k 0x01=512k 0x10=2Mb 11=reserved eg 0x1010 = 4Mb
        !           459: 
        !           460:   // Set memory range, and start of BUS error
        !           461:   STRamEnd = MemoryInfo[/*ConfigureParams.Memory.*/nMemorySize].MemoryEnd;  // Set end of RAM
        !           462:   STRamEnd_BusErr = 0x00420000;    // 4Mb                        // Between RAM end and this is void space(0's), after is a BUS error
        !           463: 
        !           464:   // Set TOS floppies
        !           465:   STMemory_WriteWord(0x446,nBootDrive);      // Boot up on A(0) or C(2)
        !           466:   STMemory_WriteWord(0x4a6,0x2);             // Connected floppies A,B (0 or 2)
        !           467: //FIXME   ConnectedDriveMask = ConnectedDriveMaskList[ConfigureParams.HardDisc.nDriveList];
        !           468:   STMemory_WriteLong(0x4c2,ConnectedDriveMask);    /* Drives A,B and C - NOTE some TOS images overwrite value, see 'TOS_ConnectedDrive_OpCode' */
        !           469: 
        !           470:   /* Added by Thothy: */
        !           471:   STMemory_WriteLong(0x00,STMemory_ReadLong(TOSAddress) );  /* Mirror ROM */
        !           472:   STMemory_WriteLong(0x04,STMemory_ReadLong(TOSAddress+4) );
        !           473: }

unix.superglobalmegacorp.com

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