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.6 by cebix, 2000-07-06T16:04:24Z vs.
Revision 1.13 by cebix, 2001-01-04T19:50:22Z

# Line 97 | 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 125 | Line 125 | extern "C" void ExceptionHandlerAsm(void
125   extern "C" void IllInstrHandler(trap_regs *regs);
126   extern "C" void PrivViolHandler(trap_regs *regs);
127   extern "C" void quit_emulator(void);
128 + extern "C" void AsmTriggerNMI(void);
129   uint16 EmulatedSR;                                      // Emulated SR (supervisor bit and interrupt mask)
130  
131  
# Line 137 | Line 138 | static void tick_func(void);
138   *  Main program
139   */
140  
141 < int main(void)
141 > int main(int argc, char **argv)
142   {
143          // Initialize variables
144          RAMBaseHost = NULL;
# Line 187 | Line 188 | int main(void)
188          CyberGfxBase = OpenLibrary((UBYTE *)"cybergraphics.library", 2);
189  
190          // Read preferences
191 <        PrefsInit();
191 >        PrefsInit(argc, argv);
192  
193          // Open AHI
194          ahi_port = CreateMsgPort();
# Line 228 | Line 229 | int main(void)
229          TimerBase = (struct Library *)timereq->tr_node.io_Device;
230  
231          // Allocate scratch memory
232 <        ScratchMem = (uint32)AllocMem(SCRATCH_MEM_SIZE, MEMF_PUBLIC);
232 >        ScratchMem = (uint8 *)AllocMem(SCRATCH_MEM_SIZE, MEMF_PUBLIC);
233          if (ScratchMem == NULL) {
234                  ErrorAlert(GetString(STR_NO_MEM_ERR));
235                  QuitEmulator();
# Line 242 | Line 243 | int main(void)
243                  WarningAlert(GetString(STR_SMALL_RAM_WARN));
244                  RAMSize = 1024*1024;
245          }
246 <        RAMBaseHost = (uint8 *)AllocMem(RAMSize + 0x100000, MEMF_PUBLIC);
246 >        RAMBaseHost = (uint8 *)AllocVec(RAMSize + 0x100000, MEMF_PUBLIC);
247          if (RAMBaseHost == NULL) {
248 <                ErrorAlert(GetString(STR_NO_MEM_ERR));
249 <                QuitEmulator();
248 >                uint32 newRAMSize = AvailMem(MEMF_LARGEST) - 0x100000;
249 >                char xText[120];
250 >
251 >                sprintf(xText, GetString(STR_NOT_ENOUGH_MEM_WARN), RAMSize, newRAMSize);
252 >
253 >                if (ChoiceAlert(xText, "Use", "Quit") != 1)
254 >                        QuitEmulator();
255 >
256 >                RAMSize = newRAMSize;
257 >                RAMBaseHost = (uint8 *)AllocVec(RAMSize + 0x100000, MEMF_PUBLIC);
258 >                if (RAMBaseHost == NULL) {
259 >                        ErrorAlert(GetString(STR_NO_MEM_ERR));
260 >                        QuitEmulator();
261 >                }
262          }
263          RAMBaseMac = (uint32)RAMBaseHost;
264          D(bug("Mac RAM starts at %08lx\n", RAMBaseHost));
# Line 313 | Line 326 | int main(void)
326          // Set task priority to -1 so we don't use all processing time
327          SetTaskPri(MainTask, -1);
328  
329 +        WriteMacInt32(0xbff, 0);        // MacsBugFlags
330 +
331          // Swap stack to Mac RAM area
332          stack_swap.stk_Lower = RAMBaseHost;
333          stack_swap.stk_Upper = (ULONG)RAMBaseHost + RAMSize;
# Line 347 | Line 362 | void __saveds quit_emulator(void)
362  
363   void QuitEmulator(void)
364   {
365 +        // Stop 60Hz thread
366 +        if (tick_proc) {
367 +                SetSignal(0, SIGF_SINGLE);
368 +                tick_proc_active = false;
369 +                Wait(SIGF_SINGLE);
370 +        }
371 +
372          // Restore stack
373          if (stack_swapped) {
374                  stack_swapped = false;
# Line 360 | Line 382 | void QuitEmulator(void)
382                  FreeSignal(IRQSig);
383          }
384  
363        // Stop 60Hz thread
364        if (tick_proc) {
365                SetSignal(0, SIGF_SINGLE);
366                tick_proc_active = false;
367                Wait(SIGF_SINGLE);
368        }
369
385          // Remove trap handler
386          MainTask->tc_TrapCode = OldTrapHandler;
387  
# Line 375 | Line 390 | void QuitEmulator(void)
390  
391          // Delete RAM/ROM area
392          if (RAMBaseHost)
393 <                FreeMem(RAMBaseHost, RAMSize + 0x100000);
393 >                FreeVec(RAMBaseHost);
394  
395          // Delete scratch memory area
396          if (ScratchMem)
# Line 453 | Line 468 | void TriggerInterrupt(void)
468          Signal(MainTask, IRQSigMask);
469   }
470  
471 + void TriggerNMI(void)
472 + {
473 +        AsmTriggerNMI();
474 + }
475 +
476  
477   /*
478   *  60Hz thread
# Line 495 | Line 515 | static __saveds void tick_func(void)
515                  if (++tick_counter > 60) {
516                          tick_counter = 0;
517                          WriteMacInt32(0x20c, TimerDateTime());
518 +                        SetInterruptFlag(INTFLAG_1HZ);
519 +                        TriggerInterrupt();
520                  }
521  
522                  // Trigger 60Hz interrupt
# Line 608 | Line 630 | void __saveds IllInstrHandler(trap_regs
630                  EmulatedSR |= 0x0700;
631  
632                  // Call opcode routine
633 <                EmulOp(*(uint16 *)(r->pc), (M68kRegisters *)r);
633 >                EmulOp(opcode, (M68kRegisters *)r);
634                  r->pc += 2;
635  
636                  // Restore interrupts

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines