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

Comparing BasiliskII/src/Unix/main_unix.cpp (file contents):
Revision 1.21 by cebix, 2000-09-25T17:54:01Z vs.
Revision 1.24 by cebix, 2000-10-17T12:24:59Z

# Line 133 | Line 133 | static struct sigaction sigirq_sa;     // Vi
133   static struct sigaction sigill_sa;      // Illegal instruction
134   static void *sig_stack = NULL;          // Stack for signal handlers
135   uint16 EmulatedSR;                                      // Emulated bits of SR (supervisor bit and interrupt mask)
136 uint8 *ScratchMem = NULL;                       // Scratch memory for Mac ROM writes
136   #endif
137  
138   #if USE_SCRATCHMEM_SUBTERFUGE
139 < uint8 *ScratchMem = 0;                          // Scratch memory for Mac ROM writes
139 > uint8 *ScratchMem = NULL;                       // Scratch memory for Mac ROM writes
140   #endif
141  
142   static struct sigaction timer_sa;       // sigaction used for timer
# Line 157 | Line 156 | static bool lm_area_mapped = false;    // F
156   static bool memory_mapped_from_zero = false; // Flag: Could allocate RAM area from 0
157   #endif
158  
159 + #if REAL_ADDRESSING || DIRECT_ADDRESSING
160 + static uint32 mapped_ram_rom_size;              // Total size of mmap()ed RAM/ROM area
161 + #endif
162 +
163   #ifdef USE_MAPPED_MEMORY
164   extern char *address_space, *good_address_map;
165   #endif
# Line 269 | Line 272 | int main(int argc, char **argv)
272          const uint32 page_size = getpagesize();
273          const uint32 page_mask = page_size - 1;
274          const uint32 aligned_ram_size = (RAMSize + page_mask) & ~page_mask;
275 <        const uint32 ram_rom_size = aligned_ram_size + 0x100000;
275 >        mapped_ram_rom_size = aligned_ram_size + 0x100000;
276   #endif
277  
278   #if REAL_ADDRESSING
279          // Try to allocate the complete address space from zero
280          // gb-- the Solaris manpage about mmap(2) states that using MAP_FIXED
281          // implies undefined behaviour for further use of sbrk(), malloc(), etc.
282 < #if defined(OS_solaris)
282 >        // cebix-- on NetBSD/m68k, this causes a segfault
283 > #if defined(OS_solaris) || defined(OS_netbsd)
284          // Anyway, it doesn't work...
285          if (0) {
286   #else
287 <        if (mmap((caddr_t)0x0000, ram_rom_size, PROT_READ | PROT_WRITE, MAP_FIXED | MAP_PRIVATE, zero_fd, 0) != MAP_FAILED) {
287 >        if (mmap((caddr_t)0x0000, mapped_ram_rom_size, PROT_READ | PROT_WRITE, MAP_FIXED | MAP_PRIVATE, zero_fd, 0) != MAP_FAILED) {
288   #endif
289                  D(bug("Could allocate RAM and ROM from 0x0000\n"));
290                  memory_mapped_from_zero = true;
# Line 298 | Line 302 | int main(int argc, char **argv)
302          }
303   #endif
304  
305 < #if !EMULATED_68K || USE_SCRATCHMEM_SUBTERFUGE
305 > #if USE_SCRATCHMEM_SUBTERFUGE
306          // Allocate scratch memory
307          ScratchMem = (uint8 *)malloc(SCRATCH_MEM_SIZE);
308          if (ScratchMem == NULL) {
# Line 339 | Line 343 | int main(int argc, char **argv)
343          else
344   #endif
345          {
346 <                RAMBaseHost = (uint8 *)mmap(0, ram_rom_size, PROT_READ | PROT_WRITE, MAP_PRIVATE, zero_fd, 0);
346 >                RAMBaseHost = (uint8 *)mmap(0, mapped_ram_rom_size, PROT_READ | PROT_WRITE, MAP_PRIVATE, zero_fd, 0);
347                  if (RAMBaseHost == (uint8 *)MAP_FAILED) {
348                          ErrorAlert(GetString(STR_NO_MEM_ERR));
349                          QuitEmulator();
# Line 354 | Line 358 | int main(int argc, char **argv)
358                  QuitEmulator();
359          }
360   #endif
361 +
362   #if DIRECT_ADDRESSING
363          // Initialize MEMBaseDiff now so that Host2MacAddr in the Video module
364          // will return correct results
# Line 416 | Line 421 | int main(int argc, char **argv)
421                  printf("WARNING: Cannot detect CPU type, assuming 68020\n");
422                  CPUType = 2;
423          }
424 <        FPUType = 0;    //!!
424 >        FPUType = 1;    // NetBSD has an FPU emulation, so the FPU ought to be available at all times
425          TwentyFourBitAddressing = false;
426   #endif
427  
# Line 617 | Line 622 | void QuitEmulator(void)
622          // Deinitialize everything
623          ExitAll();
624  
625 +        // Free ROM/RAM areas
626 + #if REAL_ADDRESSING
627 +        if (memory_mapped_from_zero)
628 +                munmap((caddr_t)0x0000, mapped_ram_rom_size);
629 +        else
630 + #endif
631   #if REAL_ADDRESSING || DIRECT_ADDRESSING
621        // Unmap ROM area
622        if (ROMBaseHost != (uint8 *)MAP_FAILED) {
623                munmap((caddr_t)ROMBaseHost, 0x100000);
624                ROMBaseHost = 0;
625        }
626        
627        //Unmap RAM area
632          if (RAMBaseHost != (uint8 *)MAP_FAILED) {
633 <                const uint32 page_size = getpagesize();
634 <                const uint32 page_mask = page_size - 1;
631 <                munmap((caddr_t)RAMBaseHost, ((RAMSize + page_mask) & ~page_mask));
633 >                munmap((caddr_t)RAMBaseHost, mapped_ram_rom_size);
634 >                RAMBaseHost = NULL;
635          }
636   #else
634        // Delete ROM area
637          if (ROMBaseHost) {
638                  free(ROMBaseHost);
639                  ROMBaseHost = NULL;
640          }
639
640        // Delete RAM area
641          if (RAMBaseHost) {
642                  free(RAMBaseHost);
643                  RAMBaseHost = NULL;
644          }
645   #endif
646  
647 < #if !EMULATED_68K || USE_SCRATMEM_SUBTERFUGE
647 > #if USE_SCRATCHMEM_SUBTERFUGE
648          // Delete scratch memory area
649          if (ScratchMem) {
650                  free((void *)(ScratchMem - SCRATCH_MEM_SIZE/2));
# Line 748 | Line 748 | void TriggerInterrupt(void)
748          raise(SIG_IRQ);
749   #endif
750   }
751 +
752 + void TriggerNMI(void)
753 + {
754 +        // not yet supported
755 + }
756   #endif
757  
758  
# Line 941 | Line 946 | static void sigill_handler(int sig, int
946  
947   #define STORE_SR(v) \
948          scp->sc_ps = (v) & 0xff; \
949 <        EmulatedSR = (v) & 0x2700; \
949 >        EmulatedSR = (v) & 0xe700; \
950          if (((v) & 0x0700) == 0 && InterruptFlags) \
951                  TriggerInterrupt();
952  
# Line 1004 | Line 1009 | static void sigill_handler(int sig, int
1009                  case 0x007c: {  // ori #xxxx,sr
1010                          uint16 sr = GET_SR | pc[1];
1011                          scp->sc_ps = sr & 0xff;         // oring bits into the sr can't enable interrupts, so we don't need to call STORE_SR
1012 <                        EmulatedSR = sr & 0x2700;
1012 >                        EmulatedSR = sr & 0xe700;
1013                          INC_PC(4);
1014                          break;
1015                  }
# Line 1081 | Line 1086 | static void sigill_handler(int sig, int
1086                  }
1087  
1088                  case 0xf327:    // fsave -(sp)
1089 <                        goto ill;       //!!
1089 >                        if (CPUIs68060) {
1090 >                                regs->a[7] -= 4;
1091 >                                WriteMacInt32(regs->a[7], 0x60000000);  // Idle frame
1092 >                                regs->a[7] -= 4;
1093 >                                WriteMacInt32(regs->a[7], 0);
1094 >                                regs->a[7] -= 4;
1095 >                                WriteMacInt32(regs->a[7], 0);
1096 >                        } else {
1097 >                                regs->a[7] -= 4;
1098 >                                WriteMacInt32(regs->a[7], 0x41000000);  // Idle frame
1099 >                        }
1100 >                        scp->sc_sp = regs->a[7];
1101 >                        INC_PC(2);
1102 >                        break;
1103  
1104                  case 0xf35f:    // frestore (sp)+
1105 <                        goto ill;       //!!
1105 >                        if (CPUIs68060)
1106 >                                regs->a[7] += 12;
1107 >                        else
1108 >                                regs->a[7] += 4;
1109 >                        scp->sc_sp = regs->a[7];
1110 >                        INC_PC(2);
1111 >                        break;
1112  
1113 <                case 0x4e73: {  // rte (only handles format 0)
1113 >                case 0x4e73: {  // rte
1114                          uint32 a7 = regs->a[7];
1115                          uint16 sr = ReadMacInt16(a7);
1116                          a7 += 2;
1117                          scp->sc_ps = sr & 0xff;
1118 <                        EmulatedSR = sr & 0x2700;
1118 >                        EmulatedSR = sr & 0xe700;
1119                          scp->sc_pc = ReadMacInt32(a7);
1120 <                        a7 += 6;
1121 <                        scp->sc_sp = regs->a[7] = a7;
1120 >                        a7 += 4;
1121 >                        uint16 format = ReadMacInt16(a7) >> 12;
1122 >                        a7 += 2;
1123 >                        static const int frame_adj[16] = {
1124 >                                0, 0, 4, 4, 8, 0, 0, 52, 50, 12, 24, 84, 16, 0, 0, 0
1125 >                        };
1126 >                        scp->sc_sp = regs->a[7] = a7 + frame_adj[format];
1127                          break;
1128                  }
1129  
1130                  case 0x4e7a:    // movec cr,x
1131                          switch (pc[1]) {
1103                                case 0x8801:    // movec vbr,a0
1104                                        regs->a[0] = 0;
1105                                        break;
1106                                case 0x9801:    // movec vbr,a1
1107                                        regs->a[1] = 0;
1108                                        break;
1132                                  case 0x0002:    // movec cacr,d0
1133                                          regs->d[0] = 0x3111;
1134                                          break;
# Line 1113 | Line 1136 | static void sigill_handler(int sig, int
1136                                          regs->d[1] = 0x3111;
1137                                          break;
1138                                  case 0x0003:    // movec tc,d0
1139 +                                case 0x0004:    // movec itt0,d0
1140 +                                case 0x0005:    // movec itt1,d0
1141 +                                case 0x0006:    // movec dtt0,d0
1142 +                                case 0x0007:    // movec dtt1,d0
1143 +                                case 0x0806:    // movec urp,d0
1144 +                                case 0x0807:    // movec srp,d0
1145                                          regs->d[0] = 0;
1146                                          break;
1147 +                                case 0x1000:    // movec sfc,d1
1148 +                                case 0x1001:    // movec dfc,d1
1149                                  case 0x1003:    // movec tc,d1
1150 +                                case 0x1801:    // movec vbr,d1
1151                                          regs->d[1] = 0;
1152                                          break;
1153 +                                case 0x8801:    // movec vbr,a0
1154 +                                        regs->a[0] = 0;
1155 +                                        break;
1156 +                                case 0x9801:    // movec vbr,a1
1157 +                                        regs->a[1] = 0;
1158 +                                        break;
1159                                  default:
1160                                          goto ill;
1161                          }
# Line 1126 | Line 1164 | static void sigill_handler(int sig, int
1164  
1165                  case 0x4e7b:    // movec x,cr
1166                          switch (pc[1]) {
1167 +                                case 0x1000:    // movec d1,sfc
1168 +                                case 0x1001:    // movec d1,dfc
1169                                  case 0x0801:    // movec d0,vbr
1170 +                                case 0x1801:    // movec d1,vbr
1171                                          break;
1172                                  case 0x0002:    // movec d0,cacr
1173                                  case 0x1002:    // movec d1,cacr

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines