10 November 2018, 12:28 | #741 | |
Registered User
Join Date: Nov 2006
Location: Stockholm, Sweden
Posts: 237
|
Quote:
There is one particular situation where I have found that to be limiting in practice, and that is when I wanted to do a lookup into a global array, and fetch one single element from there. This kind of lookup: Code:
int otherTaskPriority = TaskPriorities[otherTask] Code:
lea TaskPriorities_offset(a5),a0 move.w (a0,d0.w),d1 ; d0 contains scaled index into table For any arrays that are dynamically allocated, 68000 and 8088 would use the same code for performing a single access to the array: 1) fetch the base pointer into a register, 2) perform an indexed read. In step 2 there, both 8088 and 68000 offer optional offsets. This is useful if accessing an element within a struct. 68000 has 8-byte signed offset; 8088 has 16-bit signed offset. This means 68000 would need an extra instruction if accessing member-of-struct for structs that are >128 bytes in size. I rarely come across this as being a problem. If I'm doing more than one access to the same table, I find that there is often some form of pattern in the accesses. Because of this, for 68000 code it is normally beneficial to begin the chunk of code by loading the base of the table into an address register, and do multiple indexed accesses based of that address register. It is rare that the address is made up of two independently moving indexes, where both change between every access. Therefore, even if there was a (16-bit offset + index1 + index2) addressing mode for 68000, I would very rarely use it in code that does multiple accesses to the same table. I find that a much bigger problem is that for 8088, the indices are limited to so few registers. It's [<16-bit offset> + <bx or bp> + <si or di>]. You need to be very careful about what goes into which registers and not try to walk many different data streams at the same time. It's not so bad if one is working strictly with statically allocated data structures, but as soon as code begins to manipulate dynamically allocated data structures, 8088 code can only "manage" two dynamically allocated data structures in parallel until the code will need to do register shuffling. For example, si = data_structure_1, di = data_structure_2. If there is a need to do indexed accesses to a third data structure, the code will begin shuffling base pointers in and out of si/di. I find that the benefit provided by the 8088's 16-bit offset + 2 index registers addressing is much smaller than the drawback of having fewer registers than 68000 overall and much narrower choice in which registers can be used during addressing. It gets doubly complicated for programs that need to do dynamic memory allocation. Overall, my take is that both the 8088 ISA and the 68000 ISA work well for programs of a small enough size and complexity. Is the typical program a 5-10kB executable where all memory is statically allocated up-front? Great, the 8088's instruction set is very well adapted to this. Does your program revolve around dynamic memory allocation, and it is not sufficient to pre-allocate the memory by creating large static tables? Then the 68000 instruction / IA32 set works better. Does your program need to address more than 64kB of data? Then the 68000 / IA32 instruction set works better. I like the 68000 ISA because it provides a gradual transition from small programs to large ones - well, to programs that deal with a few GBs of memory. The 8088 ISA works well for programs that dealt with up to 64kB of data, and beyond that the ISA becomes increasingly painful to use. The IA32 ISA works well for larger programs - but supporting both 8088 and IA32 programming models at the same time makes an operating system a lot more complicated than it has to be. Overall I find that the 68000 ISA compares favorably to the 8088 ISA, and equally to the IA32 ISA. Last edited by Kalms; 10 November 2018 at 12:49. |
|
10 November 2018, 13:39 | #742 | |||
Registered User
Join Date: Mar 2016
Location: Ozherele
Posts: 229
|
Quote:
Code:
if (this->config.wsReSubscribe && this->connReSubscribeFreeTsQueue.size() //resubscribe && ((tsQueueIt = [&]{ auto it = this->connReSubscribeFreeTsQueue.begin(); for (; it != this->connReSubscribeFreeTsQueue.end(); ++it){ if (this->connReadyById.find(it->second) == this->connReadyById.end()) continue; if (it->first > base::microtime()) return this->connReSubscribeFreeTsQueue.end(); if (gotNoTimeout.find(it->second) != gotNoTimeout.end()) return it; } return it;}()) != this->connReSubscribeFreeTsQueue.end())) { int connId = tsQueueIt->second; this->connReSubscribeFreeTsQueue.erase(tsQueueIt); Quote:
This discussion inspires me to write a piece of coding for my old iron Amiga-friend. I hope to find some spare time for it. Thanks. Quote:
Indeed 68000 is better for large program than 8086. But such programs were rather rare for the 80s and 80386 provided the way for convenient coding without segmentation. Last edited by litwr; 10 November 2018 at 14:11. |
|||
10 November 2018, 14:27 | #743 | ||||||||
Registered User
Join Date: Jul 2015
Location: The Netherlands
Posts: 3,410
|
Yes it is: you ignored the rather positive 68000 article frankb posted (as I suggested to him you would) and only looked at the article that was negative. Really, your bias is super obvious and pretending otherwise isn't going to fool anyone.
Quote:
Quote:
And you wonder why I feel you're overly biased - claiming the 68040 is slower than the 486 based on a list that clearly shows the 68040 to be faster instead Quote:
Quote:
Quote:
Quote:
In other words, I don't really care about one tiny example were the ARM may win. It loses (as in is slower) overall and that is the only relevant bit of information. Quote:
Quote:
It might, might get close to that (as in, it might reach a 8x advantage) on pure 32bit code (which is extremely rare on the A500), but it certainly isn't for code that uses a high number of 16 bit operations (which is true for the majority of code that targets an A500). Likewise, the Archimedes will start losing it's advantage over the A500 quite fast once complicated 2D graphics operations such as blitting or scrolling become required. You seriously overestimate the Archimedes here (what a surprise ). Last edited by roondar; 10 November 2018 at 14:55. Reason: Removed the part replying to the 64KB is enough for everyone stuff |
||||||||
10 November 2018, 14:32 | #744 | ||
Registered User
Join Date: Nov 2006
Location: Stockholm, Sweden
Posts: 237
|
Quote:
Quote:
The 68000 provided a platform which enabled hardware creators to create OSes with significant more flexibility than the 8088-based OSes. It was only by the arrival of Windows 95 that there was a common OS that would support running multiple applications and also support a single application using all the available memory in the machine. For someone living in Sweden, using and developing on PCs during 1990-1995 was a jumbled mess of niche OSes (OS/2 & Linux) and weird DOS extensions (DOS/4GW, PMODE, code-it-yourself) until Windows 95 finally arrived with a widely-available and consistent platform just like Amiga OS had provided. Now, why did it take so long? I doubt it was because it 'wasn't needed'. I think part of the reason for the long delay for common 32-bit application support on PC was because the 8088 programming model did not offer a clean gradual upgrade path to the IA32 model. Windows 3.x did the 286-protected-mode thing to support running multiple applications, and getting 32-bit support in Windows 95 required a huge overhaul of the OS and the application programming models. My estimation here is that the 8088 programming model served the actual computing needs from its release in 1978-or-so up until 1990. The 68000 programming model, on the other hand, acting like a 32-bit processor and with a broader register set, served the actual computing needs from 1980-or-so up until 2000. The first two big features missing from the original 68000 chip were floating-point computation and virtualized addressing - but introducing hardware support for these in later 68k chips did not require significant changes to the programming model itself. Around the year 2000 people would have been needing SIMD instructions. Around the year 2005 people would have been needing 64-bit address spaces. That shift to 64-bit addressing would have made the most sense by shifting the entire processor architecture to 64 bits, and that 32bit->64bit shift for the 68000 architecture would have been similar in nature and scope to the IA32->x86-64 shift. I think it is impressive for the 68000 architecture to have been relevant for the actual computing needs for 20+ years. I am a bit saddened that the business side of things made x86-based architectures win in the end. Last edited by Kalms; 10 November 2018 at 14:45. |
||
10 November 2018, 14:49 | #745 |
Registered User
Join Date: Sep 2007
Location: Stockholm
Posts: 4,332
|
|
10 November 2018, 15:08 | #746 |
Registered User
Join Date: May 2014
Location: inside the emulator
Posts: 377
|
Without a definition of "modern" the question becomes impossible to answer.
However there are a lot of languages that are inspired by C that can be considered modern with some examples being Swift (all types of it), Rust, Java, Javascript/EMCAscript(*spits*) and even Nim. |
10 November 2018, 15:30 | #747 | ||||||||
son of 68k
Join Date: Nov 2007
Location: Lyon / France
Age: 51
Posts: 5,323
|
Quote:
In a C++ class you can access your class members directly. Quote:
But C++ maybe isn't the real problem, it might be the object-oriented paradigm ? C++ has great features. For example function templates : Code:
template<class t> inline void swap(t& a, t& b) { t ttmp = a; a = b, b = ttmp; } But ok, this kind of construct is more to compensate for language primitives that should be there in any decent high-level language but are just missing No, you just need to have address registers point to whatever memory address you see fit, or use pc-relative modes where available. Quote:
Quote:
Quote:
x86 is too complex, arm is too spartan. Proving it is very easy. Just consider the time it takes to write some code that's big enough. I can do a working program doing basic stuff in a matter of minutes in amiga asm ; i don't think you can do the same with x86 (which is the reason why you don't accept coding challenges involving code >100 insns). That said, 68k's code density isn't exactly the best that can be obtained out of this kind of ISA. I re-encoded it (with a few additions of mine) and got 15% average gain. Quote:
Quote:
Quote:
Code:
move.l (anyplace,pc,d0.l),d1 Sorry, but we've proven here that it remains better even for small enough programs. And while 80386 is somewhat equivalent to 68000 featurewise, it doesn't beat 68030. |
||||||||
10 November 2018, 18:57 | #748 | |
Registered User
Join Date: Jan 2008
Location: Warsaw/Poland
Age: 55
Posts: 1,960
|
Quote:
|
|
10 November 2018, 19:33 | #749 | |||||||||||
Registered User
Join Date: Mar 2016
Location: Ozherele
Posts: 229
|
Quote:
Quote:
Quote:
Quote:
Quote:
Quote:
Indeed for some kinds of graphics Amiga 500 can show quite good results. Quote:
BTW a rather biased for 68040 article http://www.skepticfiles.org/cowtext/...1/486vs040.htm contains an interesting phrase "The 80486 has some edge, since it allows the user to implement segmentation if needed and avail oneself to its advantages." Quote:
Quote:
Quote:
Quote:
I could buy a 25MHz 80386-based system in 1992. For the approximately the same money I could get only 68020 @14-16Mhz. In 1993 I could buy a 80486-based at 80Mhz system and there was nothing comparable 68k-based. Last edited by litwr; 10 November 2018 at 20:24. |
|||||||||||
10 November 2018, 20:20 | #750 | |||
Registered User
Join Date: Mar 2016
Location: Ozherele
Posts: 229
|
Quote:
Quote:
Quote:
Code:
template<int N> struct Fib { enum {R = Fib<N - 1>::R + Fib<N - 2>::R}; }; template<> struct Fib<1> { enum {R = 1}; }; template<> struct Fib<0> { enum {R = 0}; }; Code:
long fib(int n) { return n < 1 ? 0 : n < 2 ? 1 : fib(n - 1) + fib(n - 2); } |
|||
10 November 2018, 20:29 | #751 | |
son of 68k
Join Date: Nov 2007
Location: Lyon / France
Age: 51
Posts: 5,323
|
Quote:
Of course you have to distinguish class members from local vars, especially if your classes are really a mess but it's not done this way for anyone who knows how to code. Rather, prefix the names, like this : "m_something" is the class member, "something" is the local variable. This is quite common programming convention. |
|
10 November 2018, 21:06 | #752 | |
Registered User
Join Date: Mar 2016
Location: Ozherele
Posts: 229
|
Quote:
Sorry I forgot to ask you what do you mean in detail with your phrase "But ok, this kind of construct is more to compensate for language primitives that should be there in any decent high-level language but are just missing"? |
|
11 November 2018, 00:25 | #753 | ||||||||
Registered User
Join Date: Jul 2015
Location: The Netherlands
Posts: 3,410
|
Quote:
As an example of why I feel you might be more biased than you think or want to admit: the Byte article you actually did link to had a part where the author admitted this was just his opinion and not necessarily all fact. The same article also had a really rather positive part about the 68020. Both of these things were clearly relevant to the discussion and yet, you didn't mention either of them. At any rate, this discussion about bias is getting us nowhere - all I'm essentially trying to point out is that you seem more keen on accepting stuff that makes the 68k look worse and seem rather reluctant to accept stuff that makes the 68k look better. Regardless of the reasons for why this is happening. Quote:
Even the (admittedly very rare) Amiga's equipped with a 68040 did a lot better than just a few hundred sold (see http://www.amigahistory.plus.com/sales.html - the A4000/40 is listed as selling 3800 units in Germany alone). I'm not saying that there were 68040's on every street corner, but there clearly were many more made than a few hundred. Motorola would never have bothered with a 68060 if the 68040 was that much of a failure. Quote:
Code:
PRO 486/50L 1 80486 50 40 SV 1991 $11.2K However, it doesn't really matter because we were comparing average speeds from that list. Almost all of the 486's in the list clocked in 15 MIPS, a few did below and apparently you concluded one that would do 20 if downrated. It averages out at about 15 MIPS as a result, even if we include the single 20 MIPS outlier. For the 68040@25MHz, it was split about 50/50 between 17.5 and 20MIPS, with one result giving 21. Which averages to about 18.75 MIPS. In any case, your original reply to me said the 486@25MHz was faster than the 68040 ("80486@25MHz gives slightly more"). And that is false even in the best case scenario. It's this false bit of info I've been trying to counter. Quote:
On a side note, there are some interesting details about why the 486DX/2 is the way it is (half bus speed), but I don't feel it's required to go into them here - this thread is quite big enough already! The higher clock speeds of the 486 wasn't what we were debating however, we were discussing performance differences between the more 'affordable models' of the 486/68040 and the ARM2 in 1991. And secondarily, the performance difference between these chips at the same clock speed Quote:
What I am disputing is that hand written, optimised ARM2 code is significantly better compared to the compilers available for it at the time VS hand written, optimised 386/68030 code compared to the compilers available for them at the time. I already felt this way, but feel this more so given your earlier point about how easy ARM2 code is to convert to C (and hence vice versa). Quote:
Quote:
To try and get to the bottom, I tried to get a better performance comparison. However, it's not so easy to find performance comparisons (that are better than comparing one emulator) between the A500 and ARM2. I have found some comparisons between the A500 and Amiga's running a 33Mhz 68030 though. This might be somewhat relevant as we did an earlier comparison between that and a 12MHz ARM2. I freely admit this is not the best comparison and will accept a better one if you/I can find one, but here goes: An A2000 using a 68030@33MHz is about 10x the speed of a basic A500**. The 68030@33MHz is about 1.8x the speed of an 8MHz ARM2 according to the list we've been using. This would translate to the Archimedes being about 5.6x the speed of an A500. Which seems to be about right when looking at 3D games. Again, this is not a great comparison and I'll gladly accept better ways to measure the difference, but it's still better than looking at a single application *) As an example, I've had multiple C64 emulators on my expanded A1200 (I'm excluding A64 here as it has very poor compatibility). These really varied in how fast they were - one of the Amiga C64 emulators was completely unusable for me (sub 5FPS), the other worked fairly well (closer to 25FPS). **) According to http://amiga.resource.cx/perf/aibbde.html, check the "Combo (030/33, 882/33, OCS, 3.0 in RAM)" vs the A500. Quote:
More seriously, this is kind of the point - you can't simply say the Archimedes is a lot faster than the A500 by looking at the CPU alone. If 2D graphics get involved the difference can completely vanish. It will certainly win vs the A500 for business/serious software or 3D graphics, but it won't usually win the '2D war' and to me that shows that CPU power alone isn't everything and thus doesn't tell the whole story. |
||||||||
11 November 2018, 01:14 | #754 | |
Registered User
Join Date: Sep 2007
Location: Stockholm
Posts: 4,332
|
Quote:
|
|
11 November 2018, 14:48 | #755 | |
Registered User
Join Date: May 2014
Location: inside the emulator
Posts: 377
|
Quote:
There have been at least two designs with the 486: the PC and one Unix workstation design that wasn't PC compatible. |
|
11 November 2018, 15:23 | #756 | ||
Registered User
Join Date: Mar 2018
Location: Hastings, New Zealand
Posts: 2,546
|
Quote:
Quote:
|
||
11 November 2018, 16:27 | #757 |
son of 68k
Join Date: Nov 2007
Location: Lyon / France
Age: 51
Posts: 5,323
|
I thought it was quite self-explanatory. You need to create general-purpose functions when they're not here at first place.
|
11 November 2018, 17:44 | #758 | ||
Registered User
Join Date: May 2014
Location: inside the emulator
Posts: 377
|
Quote:
Quote:
It may be either an NCR Voyager or a Sequent Symmetry 2000, not sure. Both of those used nonstandard designs (as SMP wasn't part of the PC at the time) however as I remember it the bus architecture wasn't compatible either. Will search some more. Last edited by Megol; 11 November 2018 at 18:21. |
||
11 November 2018, 17:52 | #759 |
Registered User
Join Date: Sep 2007
Location: Stockholm
Posts: 4,332
|
|
11 November 2018, 18:49 | #760 | |
Registered User
Join Date: Dec 2017
Location: france
Posts: 186
|
Quote:
The question is, what's the A500 could do with a chip ram twice as fast than the OCS one(more or less the same that the archimedes has) ?? With this kind of RAM,all the system can also run at twice the speed . Somebody know how much this would cost compared to an archimedes ?? And what's the performances we could be reach ?? |
|
Currently Active Users Viewing This Thread: 1 (0 members and 1 guests) | |
Thread Tools | |
Similar Threads | ||||
Thread | Thread Starter | Forum | Replies | Last Post |
Any software to see technical OS details? | necronom | support.Other | 3 | 02 April 2016 12:05 |
2-star rarity details? | stet | HOL suggestions and feedback | 0 | 14 December 2015 05:24 |
EAB's FTP details... | Basquemactee1 | project.Amiga File Server | 2 | 30 October 2013 22:54 |
req details for sdl | turrican3 | request.Other | 0 | 20 April 2008 22:06 |
Forum Details | BippyM | request.Other | 0 | 15 May 2006 00:56 |
|
|