Annotation of hatari/src/tos.c, revision 1.1.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.