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.22 by cebix, 2000-10-09T17:05:16Z vs.
Revision 1.27 by cebix, 2000-11-30T16:20:52Z

# Line 30 | Line 30
30   # include <pthread.h>
31   #endif
32  
33 < #if defined(USE_MAPPED_MEMORY) || REAL_ADDRESSING || DIRECT_ADDRESSING
33 > #if REAL_ADDRESSING || DIRECT_ADDRESSING
34   # include <sys/mman.h>
35   #endif
36  
# Line 160 | Line 160 | static bool memory_mapped_from_zero = fa
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
166
163  
164   // Prototypes
165   static void *xpram_func(void *arg);
# Line 313 | Line 309 | int main(int argc, char **argv)
309   #endif
310  
311          // Create areas for Mac RAM and ROM
312 < #if defined(USE_MAPPED_MEMORY)
317 <    good_address_map = (char *)mmap(NULL, 1<<24, PROT_READ, MAP_PRIVATE, zero_fd, 0);
318 <    address_space = (char *)mmap(NULL, 1<<24, PROT_READ | PROT_WRITE, MAP_PRIVATE, zero_fd, 0);
319 <    if ((int)address_space < 0 || (int)good_address_map < 0) {
320 <                ErrorAlert(GetString(STR_NOT_ENOUGH_MEMORY_ERR));
321 <                QuitEmulator();
322 <    }
323 <    RAMBaseHost = (uint8 *)mmap(address_space, RAMSize, PROT_READ | PROT_WRITE, MAP_PRIVATE | MAP_FIXED, zero_fd, 0);
324 <    ROMBaseHost = (uint8 *)mmap(address_space + 0x00400000, 0x80000, PROT_READ | PROT_WRITE, MAP_PRIVATE | MAP_FIXED, zero_fd, 0);
325 <        char *nam = tmpnam(NULL);
326 <    int good_address_fd = open(nam, O_CREAT | O_RDWR, 0600);
327 <        char buffer[4096];
328 <    memset(buffer, 1, sizeof(buffer));
329 <    write(good_address_fd, buffer, sizeof(buffer));
330 <    unlink(nam);
331 <    for (int i=0; i<RAMSize; i+=4096)
332 <        mmap(good_address_map + i, 4096, PROT_READ, MAP_FIXED | MAP_PRIVATE, good_address_fd, 0);
333 <    for (int i=0; i<0x80000; i+=4096)
334 <        mmap(good_address_map + i + 0x00400000, 4096, PROT_READ, MAP_FIXED | MAP_PRIVATE, good_address_fd, 0);
335 < #elif REAL_ADDRESSING || DIRECT_ADDRESSING
312 > #if REAL_ADDRESSING || DIRECT_ADDRESSING
313          // gb-- Overkill, needs to be cleaned up. Probably explode it for either
314          // real or direct addressing mode.
315   #if REAL_ADDRESSING
# Line 421 | Line 398 | int main(int argc, char **argv)
398                  printf("WARNING: Cannot detect CPU type, assuming 68020\n");
399                  CPUType = 2;
400          }
401 <        FPUType = 0;    //!!
401 >        FPUType = 1;    // NetBSD has an FPU emulation, so the FPU ought to be available at all times
402          TwentyFourBitAddressing = false;
403   #endif
404  
# Line 623 | Line 600 | void QuitEmulator(void)
600          ExitAll();
601  
602          // Free ROM/RAM areas
603 < #if REAL_ADDRESSING || DIRECT_ADDRESSING
603 > #if REAL_ADDRESSING
604          if (memory_mapped_from_zero)
605                  munmap((caddr_t)0x0000, mapped_ram_rom_size);
606 <        else if (RAMBaseHost != (uint8 *)MAP_FAILED) {
606 >        else
607 > #endif
608 > #if REAL_ADDRESSING || DIRECT_ADDRESSING
609 >        if (RAMBaseHost != (uint8 *)MAP_FAILED) {
610                  munmap((caddr_t)RAMBaseHost, mapped_ram_rom_size);
611                  RAMBaseHost = NULL;
612          }
# Line 770 | Line 750 | static void *xpram_func(void *arg)
750   {
751          while (!xpram_thread_cancel) {
752                  for (int i=0; i<60 && !xpram_thread_cancel; i++)
753 <                        Delay_usec(1000000);
753 >                        Delay_usec(999999);
754                  xpram_watchdog();
755          }
756          return NULL;
# Line 857 | Line 837 | uint64 GetTicks_usec(void)
837  
838   /*
839   *  Delay by specified number of microseconds (<1 second)
840 < *  (adapted from SDL_Delay() source)
840 > *  (adapted from SDL_Delay() source; this function is designed to provide
841 > *  the highest accuracy possible)
842   */
843  
844 + #if defined(linux)
845 + // Linux select() changes its timeout parameter upon return to contain
846 + // the remaining time. Most other unixen leave it unchanged or undefined.
847 + #define SELECT_SETS_REMAINING
848 + #elif defined(__FreeBSD__) || defined(__sun__) || defined(sgi)
849 + #define USE_NANOSLEEP
850 + #endif
851 +
852   void Delay_usec(uint32 usec)
853   {
854          int was_error;
855 < #ifndef __linux__       // Non-Linux implementations need to calculate time left
855 >
856 > #ifdef USE_NANOSLEEP
857 >        struct timespec elapsed, tv;
858 > #else
859 >        struct timeval tv;
860 > #ifndef SELECT_SETS_REMAINING
861          uint64 then, now, elapsed;
862   #endif
863 <        struct timeval tv;
863 > #endif
864  
865          // Set the timeout interval - Linux only needs to do this once
866 < #ifdef __linux__
867 <        tv.tv_sec = 0;
868 <        tv.tv_usec = usec;
866 > #ifdef SELECT_SETS_REMAINING
867 >    tv.tv_sec = 0;
868 >    tv.tv_usec = usec;
869 > #elif defined(USE_NANOSLEEP)
870 >    elapsed.tv_sec = 0;
871 >    elapsed.tv_nsec = usec * 1000;
872   #else
873 <        then = GetTicks_usec();
873 >    then = GetTicks_usec();
874   #endif
875 +
876          do {
877                  errno = 0;
878 < #ifndef __linux__
879 <                /* Calculate the time interval left (in case of interrupt) */
878 > #ifdef USE_NANOSLEEP
879 >                tv.tv_sec = elapsed.tv_sec;
880 >                tv.tv_nsec = elapsed.tv_nsec;
881 >                was_error = nanosleep(&tv, &elapsed);
882 > #else
883 > #ifndef SELECT_SETS_REMAINING
884 >                // Calculate the time interval left (in case of interrupt)
885                  now = GetTicks_usec();
886                  elapsed = now - then;
887                  then = now;
# Line 889 | Line 892 | void Delay_usec(uint32 usec)
892                  tv.tv_usec = usec;
893   #endif
894                  was_error = select(0, NULL, NULL, NULL, &tv);
895 + #endif
896          } while (was_error && (errno == EINTR));
897   }
898  
# Line 943 | Line 947 | static void sigill_handler(int sig, int
947  
948   #define STORE_SR(v) \
949          scp->sc_ps = (v) & 0xff; \
950 <        EmulatedSR = (v) & 0x2700; \
950 >        EmulatedSR = (v) & 0xe700; \
951          if (((v) & 0x0700) == 0 && InterruptFlags) \
952                  TriggerInterrupt();
953  
# Line 1006 | Line 1010 | static void sigill_handler(int sig, int
1010                  case 0x007c: {  // ori #xxxx,sr
1011                          uint16 sr = GET_SR | pc[1];
1012                          scp->sc_ps = sr & 0xff;         // oring bits into the sr can't enable interrupts, so we don't need to call STORE_SR
1013 <                        EmulatedSR = sr & 0x2700;
1013 >                        EmulatedSR = sr & 0xe700;
1014                          INC_PC(4);
1015                          break;
1016                  }
# Line 1083 | Line 1087 | static void sigill_handler(int sig, int
1087                  }
1088  
1089                  case 0xf327:    // fsave -(sp)
1090 <                        goto ill;       //!!
1090 >                        if (CPUIs68060) {
1091 >                                regs->a[7] -= 4;
1092 >                                WriteMacInt32(regs->a[7], 0x60000000);  // Idle frame
1093 >                                regs->a[7] -= 4;
1094 >                                WriteMacInt32(regs->a[7], 0);
1095 >                                regs->a[7] -= 4;
1096 >                                WriteMacInt32(regs->a[7], 0);
1097 >                        } else {
1098 >                                regs->a[7] -= 4;
1099 >                                WriteMacInt32(regs->a[7], 0x41000000);  // Idle frame
1100 >                        }
1101 >                        scp->sc_sp = regs->a[7];
1102 >                        INC_PC(2);
1103 >                        break;
1104  
1105                  case 0xf35f:    // frestore (sp)+
1106 <                        goto ill;       //!!
1106 >                        if (CPUIs68060)
1107 >                                regs->a[7] += 12;
1108 >                        else
1109 >                                regs->a[7] += 4;
1110 >                        scp->sc_sp = regs->a[7];
1111 >                        INC_PC(2);
1112 >                        break;
1113  
1114 <                case 0x4e73: {  // rte (only handles format 0)
1114 >                case 0x4e73: {  // rte
1115                          uint32 a7 = regs->a[7];
1116                          uint16 sr = ReadMacInt16(a7);
1117                          a7 += 2;
1118                          scp->sc_ps = sr & 0xff;
1119 <                        EmulatedSR = sr & 0x2700;
1119 >                        EmulatedSR = sr & 0xe700;
1120                          scp->sc_pc = ReadMacInt32(a7);
1121 <                        a7 += 6;
1122 <                        scp->sc_sp = regs->a[7] = a7;
1121 >                        a7 += 4;
1122 >                        uint16 format = ReadMacInt16(a7) >> 12;
1123 >                        a7 += 2;
1124 >                        static const int frame_adj[16] = {
1125 >                                0, 0, 4, 4, 8, 0, 0, 52, 50, 12, 24, 84, 16, 0, 0, 0
1126 >                        };
1127 >                        scp->sc_sp = regs->a[7] = a7 + frame_adj[format];
1128                          break;
1129                  }
1130  
1131                  case 0x4e7a:    // movec cr,x
1132                          switch (pc[1]) {
1105                                case 0x8801:    // movec vbr,a0
1106                                        regs->a[0] = 0;
1107                                        break;
1108                                case 0x9801:    // movec vbr,a1
1109                                        regs->a[1] = 0;
1110                                        break;
1133                                  case 0x0002:    // movec cacr,d0
1134                                          regs->d[0] = 0x3111;
1135                                          break;
# Line 1115 | Line 1137 | static void sigill_handler(int sig, int
1137                                          regs->d[1] = 0x3111;
1138                                          break;
1139                                  case 0x0003:    // movec tc,d0
1140 +                                case 0x0004:    // movec itt0,d0
1141 +                                case 0x0005:    // movec itt1,d0
1142 +                                case 0x0006:    // movec dtt0,d0
1143 +                                case 0x0007:    // movec dtt1,d0
1144 +                                case 0x0806:    // movec urp,d0
1145 +                                case 0x0807:    // movec srp,d0
1146                                          regs->d[0] = 0;
1147                                          break;
1148 +                                case 0x1000:    // movec sfc,d1
1149 +                                case 0x1001:    // movec dfc,d1
1150                                  case 0x1003:    // movec tc,d1
1151 +                                case 0x1801:    // movec vbr,d1
1152                                          regs->d[1] = 0;
1153                                          break;
1154 +                                case 0x8801:    // movec vbr,a0
1155 +                                        regs->a[0] = 0;
1156 +                                        break;
1157 +                                case 0x9801:    // movec vbr,a1
1158 +                                        regs->a[1] = 0;
1159 +                                        break;
1160                                  default:
1161                                          goto ill;
1162                          }
# Line 1128 | Line 1165 | static void sigill_handler(int sig, int
1165  
1166                  case 0x4e7b:    // movec x,cr
1167                          switch (pc[1]) {
1168 +                                case 0x1000:    // movec d1,sfc
1169 +                                case 0x1001:    // movec d1,dfc
1170                                  case 0x0801:    // movec d0,vbr
1171 +                                case 0x1801:    // movec d1,vbr
1172                                          break;
1173                                  case 0x0002:    // movec d0,cacr
1174                                  case 0x1002:    // movec d1,cacr

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines