ViewVC Help
View File | Revision Log | Show Annotations | Revision Graph | Root Listing
root/cebix/BasiliskII/src/AmigaOS/main_amiga.cpp
(Generate patch)

Comparing BasiliskII/src/AmigaOS/main_amiga.cpp (file contents):
Revision 1.9 by jlachmann, 2000-08-20T14:08:41Z vs.
Revision 1.14 by cebix, 2001-01-25T22:24:36Z

# Line 75 | Line 75 | uint32 ROMBaseMac;             // ROM base (Mac add
75   uint8 *ROMBaseHost;             // ROM base (host address space)
76   uint32 ROMSize;                 // Size of ROM
77  
78 uint32 MacsBugFlags = 0xbff;
79
78  
79   // CPU and FPU type, addressing mode
80   int CPUType;
# Line 99 | Line 97 | struct Library *AHIBase = NULL;
97   struct Library *DiskBase = NULL;
98  
99   struct Task *MainTask;                                                  // Our task
100 < uint32 ScratchMem = NULL;                                               // Scratch memory for Mac ROM writes
100 > uint8 *ScratchMem = NULL;                                               // Scratch memory for Mac ROM writes
101   APTR OldTrapHandler = NULL;                                             // Old trap handler
102   APTR OldExceptionHandler = NULL;                                // Old exception handler
103   BYTE IRQSig = -1;                                                               // "Interrupt" signal number
# Line 110 | Line 108 | static struct timerequest *timereq = NUL
108   static struct MsgPort *ahi_port = NULL;                 // Port for AHI
109   static struct AHIRequest *ahi_io = NULL;                // IORequest for AHI
110  
111 + static struct Process *xpram_proc = NULL;               // XPRAM watchdog
112 + static volatile bool xpram_proc_active = true;  // Flag for quitting the XPRAM watchdog
113 +
114   static struct Process *tick_proc = NULL;                // 60Hz process
115   static volatile bool tick_proc_active = true;   // Flag for quitting the 60Hz process
116  
# Line 122 | Line 123 | struct trap_regs;
123   extern "C" void AtomicAnd(uint32 *p, uint32 val);
124   extern "C" void AtomicOr(uint32 *p, uint32 val);
125   extern "C" void MoveVBR(void);
126 + extern "C" void DisableSuperBypass(void);
127   extern "C" void TrapHandlerAsm(void);
128   extern "C" void ExceptionHandlerAsm(void);
129   extern "C" void IllInstrHandler(trap_regs *regs);
130   extern "C" void PrivViolHandler(trap_regs *regs);
131   extern "C" void quit_emulator(void);
132 + extern "C" void AsmTriggerNMI(void);
133   uint16 EmulatedSR;                                      // Emulated SR (supervisor bit and interrupt mask)
134  
135  
136   // Prototypes
137   static void jump_to_rom(void);
138 + static void xpram_func(void);
139   static void tick_func(void);
140  
141  
# Line 139 | Line 143 | static void tick_func(void);
143   *  Main program
144   */
145  
146 < int main(void)
146 > int main(int argc, char **argv)
147   {
148          // Initialize variables
149          RAMBaseHost = NULL;
# Line 189 | Line 193 | int main(void)
193          CyberGfxBase = OpenLibrary((UBYTE *)"cybergraphics.library", 2);
194  
195          // Read preferences
196 <        PrefsInit();
196 >        PrefsInit(argc, argv);
197  
198          // Open AHI
199          ahi_port = CreateMsgPort();
# Line 230 | Line 234 | int main(void)
234          TimerBase = (struct Library *)timereq->tr_node.io_Device;
235  
236          // Allocate scratch memory
237 <        ScratchMem = (uint32)AllocMem(SCRATCH_MEM_SIZE, MEMF_PUBLIC);
237 >        ScratchMem = (uint8 *)AllocMem(SCRATCH_MEM_SIZE, MEMF_PUBLIC);
238          if (ScratchMem == NULL) {
239                  ErrorAlert(GetString(STR_NO_MEM_ERR));
240                  QuitEmulator();
# Line 245 | Line 249 | int main(void)
249                  RAMSize = 1024*1024;
250          }
251          RAMBaseHost = (uint8 *)AllocVec(RAMSize + 0x100000, MEMF_PUBLIC);
252 < //      if (RAMBaseHost == NULL) {
249 < //              ErrorAlert(GetString(STR_NO_MEM_ERR));
250 < //              QuitEmulator();
251 < //      }
252 <        if (RAMBaseHost == NULL)
253 <                {
252 >        if (RAMBaseHost == NULL) {
253                  uint32 newRAMSize = AvailMem(MEMF_LARGEST) - 0x100000;
254                  char xText[120];
255  
256                  sprintf(xText, GetString(STR_NOT_ENOUGH_MEM_WARN), RAMSize, newRAMSize);
257  
258 <                if (1 != ChoiceAlert(xText, "Use", "Quit"))
258 >                if (ChoiceAlert(xText, "Use", "Quit") != 1)
259                          QuitEmulator();
260  
261                  RAMSize = newRAMSize;
# Line 265 | Line 264 | int main(void)
264                          ErrorAlert(GetString(STR_NO_MEM_ERR));
265                          QuitEmulator();
266                  }
267 <                }
267 >        }
268          RAMBaseMac = (uint32)RAMBaseHost;
269          D(bug("Mac RAM starts at %08lx\n", RAMBaseHost));
270          ROMBaseHost = RAMBaseHost + RAMSize;
# Line 309 | Line 308 | int main(void)
308          // Move VBR away from 0 if neccessary
309          MoveVBR();
310  
311 +        // On 68060, disable Super Bypass mode because of a CPU bug that is triggered by MacOS 8
312 +        if (CPUIs68060)
313 +                DisableSuperBypass();
314 +
315          // Install trap handler
316          EmulatedSR = 0x2700;
317          OldTrapHandler = MainTask->tc_TrapCode;
# Line 321 | Line 324 | int main(void)
324          MainTask->tc_ExceptCode = (APTR)ExceptionHandlerAsm;
325          SetExcept(SIGBREAKF_CTRL_C | IRQSigMask, SIGBREAKF_CTRL_C | IRQSigMask);
326  
327 +        // Start XPRAM watchdog process
328 +        xpram_proc = CreateNewProcTags(
329 +                NP_Entry, (ULONG)xpram_func,
330 +                NP_Name, (ULONG)"Basilisk II XPRAM Watchdog",
331 +                NP_Priority, 0,
332 +                TAG_END
333 +        );
334 +
335          // Start 60Hz process
336          tick_proc = CreateNewProcTags(
337                  NP_Entry, (ULONG)tick_func,
# Line 332 | Line 343 | int main(void)
343          // Set task priority to -1 so we don't use all processing time
344          SetTaskPri(MainTask, -1);
345  
346 <        WriteMacInt32(MacsBugFlags, 0);
346 >        WriteMacInt32(0xbff, 0);        // MacsBugFlags
347  
348          // Swap stack to Mac RAM area
349          stack_swap.stk_Lower = RAMBaseHost;
# Line 368 | Line 379 | void __saveds quit_emulator(void)
379  
380   void QuitEmulator(void)
381   {
382 <        // Stop 60Hz thread
382 >        // Stop 60Hz process
383          if (tick_proc) {
384                  SetSignal(0, SIGF_SINGLE);
385                  tick_proc_active = false;
386                  Wait(SIGF_SINGLE);
387          }
388  
389 +        // Stop XPRAM watchdog process
390 +        if (xpram_proc) {
391 +                SetSignal(0, SIGF_SINGLE);
392 +                xpram_proc_active = false;
393 +                Wait(SIGF_SINGLE);
394 +        }
395 +
396          // Restore stack
397          if (stack_swapped) {
398                  stack_swapped = false;
# Line 481 | Line 499 | void TriggerNMI(void)
499  
500  
501   /*
502 < *  60Hz thread
502 > *  60Hz thread (really 60.15Hz)
503   */
504  
505   static __saveds void tick_func(void)
# Line 543 | Line 561 | static __saveds void tick_func(void)
561  
562          // Main task asked for termination, send signal
563          Forbid();
564 +        Signal(MainTask, SIGF_SINGLE);
565 + }
566 +
567 +
568 + /*
569 + *  XPRAM watchdog thread (saves XPRAM every minute)
570 + */
571 +
572 + static __saveds void xpram_func(void)
573 + {
574 +        uint8 last_xpram[256];
575 +        memcpy(last_xpram, XPRAM, 256);
576 +
577 +        while (xpram_proc_active) {
578 +                for (int i=0; i<60 && xpram_proc_active; i++)
579 +                        Delay(50);              // Only wait 1 second so we quit promptly when xpram_proc_active becomes false
580 +                if (memcmp(last_xpram, XPRAM, 256)) {
581 +                        memcpy(last_xpram, XPRAM, 256);
582 +                        SaveXPRAM();
583 +                }
584 +        }
585 +
586 +        // Main task asked for termination, send signal
587 +        Forbid();
588          Signal(MainTask, SIGF_SINGLE);
589   }
590  

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines