![]() |
|
|||||||
| Register | >> Amiga FAQ/Wiki << | Rules & Help | Members List / Moderators List | Search | Today's Posts | Mark Forums Read |
![]() |
|
|
Thread Tools |
|
|
#41 | |
|
WinUAE developer
Join Date: Aug 2001
Location: Hämeenlinna/Finland
Age: 38
Posts: 11,952
|
Quote:
TAS seems to work fine if there is no competing DMA active. TAS Dx is perfectly safe, it does not do any memory accesses. |
|
|
|
|
|
|
#42 | |
|
Registered User
Join Date: Aug 2004
Location:
Posts: 718
|
Quote:
You could try running a test program, something like this: Code:
Loop: tas d0 tas d0 tas d0 tas d0 bra.b Loop There's an old newsgroup posting which mentions some of the possible issues with TAS, see this. |
|
|
|
|
|
|
#43 |
|
Registered User
Join Date: Jul 2009
Location: Nottingham / UK
Posts: 122
|
Cool topic
![]() |
|
|
|
|
|
#44 |
|
Oldskool Demo Coder
|
Many caveats in HRM can be taken with a grain of salt, and the TAS warning like the other ones can be ignored - if you know where it's appropriate.
TAS, even to memory, is fine. But it has to be executed when no DMA (or memory refresh slots) want to fight its bus ownership. What happens is that the CPU does whatever it wants with the bus, and these other two users of the bus can't set its DMA or memory refresh address or data. This can of course cause havoc including losing data in memory, and DMA writing to the wrong address including executing programs. You could avoid the former if you do your own memory refresh of desired ranges in memory you care about, such as where the running code and data and the hardware vectors are, and avoid the latter by disabling the copper and never executing TAS instructions while blitting or bitplane/sprite/audio DMA is active, but I think this limits its usefulness somewhat... ![]() TAS Dn can of course be used anytime, anywhere, since it doesn't hog the bus.
__________________
Henrik. Programs Amiga demos, iPhone apps, websites, etc. A1000/512k - A500 2.0/040@28/4M/.5M slowmem/8M/SCSI/CF - A600 portable II 3.1/ACA630/WiFi/CF - 'A1700' 3.1/68060@80/64M/IDE-Fix Express/CF - etc."The difference between PC and Amiga is that 10yo PCs are worth $0. 20yo Amigas are worth a lot, and Amigas that are only 15yo cost a fortune!" If you like Portal 2, try my >> single player and cooperation maps << |
|
|
|
|
|
#45 |
|
Going nowhere
Join Date: Oct 2001
Location: United Kingdom
Age: 39
Posts: 5,029
|
I simply never use it, because i'll know damn well, i'll forget about not using it to access memory and then be scratching my head wondering why the fuck my program doesn't work!!!
![]()
__________________
Former member of: LSD, Scoopex, Razor 1911, Dual Crew Shining, Rednex, Fairlight.www.southwestscrap.co.uk |
|
|
|
|
|
#46 | |
|
Registered User
Join Date: Aug 2004
Location:
Posts: 718
|
Quote:
Code:
suba.l a0,a0 ;Address 0 is in chip memory Loop: tas (a0) tas (a0) tas (a0) tas (a0) bra.b Loop Code:
suba.l a0,a0 ;Address 0 is in chip memory Loop1: moveq #-1,d0 Loop2: tas (a0) dbf d0,Loop2 bra.b Loop1 |
|
|
|
|
|
|
#47 |
|
Oldskool Demo Coder
|
As stated, if you don't perform the tests in a DMA- and memory refresh-controlled environment, memory rows will be lost until you are running random words instead of code.
If you don't take care of those two things AND turn the system off, you will get trashed memory, rogue coppers, and a crash. If system is off and it's running in real fastram, the effects should be limited to rogue coppers, if disk DMA is off and blits have finished.
__________________
Henrik. Programs Amiga demos, iPhone apps, websites, etc. A1000/512k - A500 2.0/040@28/4M/.5M slowmem/8M/SCSI/CF - A600 portable II 3.1/ACA630/WiFi/CF - 'A1700' 3.1/68060@80/64M/IDE-Fix Express/CF - etc."The difference between PC and Amiga is that 10yo PCs are worth $0. 20yo Amigas are worth a lot, and Amigas that are only 15yo cost a fortune!" If you like Portal 2, try my >> single player and cooperation maps << Last edited by Photon; 30 April 2012 at 14:20. |
|
|
|
|
|
#48 |
|
Team Chaos Member
|
There are softcores on the way for the NatAmi and possibly the FPGAArcade Replay board that will not support the instructions that are not legal on the Amiga. The encoding for TAS, CAS and such was kind of added on as an afterthought in the instruction set but the possibilities of adding more useful single-core opcodes to the Apollo N68070 are likely to yield better performance in the long run.
__________________
Member: Total Chaos team and AROS Development Team. |
|
|
|
|
|
#49 | |
|
Computer Nerd
Join Date: Sep 2007
Location: Rotterdam/Netherlands
Age: 36
Posts: 1,588
|
Thanks guys for explaining the TAS problem
Could be useful when used with a data register. Shame that CAS/CAS2 always work on memory.Quote:
__________________
Random number generation is the art of producing pure gibberish as quickly as possible. - Bob Jenkins |
|
|
|
|
|
|
#50 |
|
is long gone
Join Date: Apr 2007
Location: London
Posts: 1,590
|
I agree with Thorham on that.
I thought the Natami was supposed to be compatible with classic Amigas? Not supporting all the opcodes that the native Amiga CPUs use surely automatically makes it less than 100% compatible. |
|
|
|
|
|
#51 |
|
Team Chaos Member
|
The goal for the FPGAArcade Replay is compatibility at all costs.
The goal for the NatAmi is a bit different. We want performance at all costs with just enough compatibility to run WHDLoad and all of its slaves. If you look at our homepage you'll see that we want to leave out legacy drawbacks in order to make way for more performance. Besides the legal threshold for the word "compatible" is 90% of software running on it. I think we can meet that threshold easily.
__________________
Member: Total Chaos team and AROS Development Team. |
|
|
|
|
|
#52 |
|
Registered User
Join Date: Jan 2010
Location: Kansas
Posts: 205
|
The Natami's Apollo fpga CPU currently supports TAS in hardware without the read-modify-write but it's recommended NOT to use it in case it could be used later for it's intended purpose. The following instructions will likely be trapped:
MOVEP, MOVES, PACK, UNPK They should not be used as they will be slow and the encoding space could be reused at a later time. It would be wise to replace them in any patches. MOVEP is trapped on the 68060 as well. Instructions that will likely not be supported and may have their encoding space reused are: CAS, CAS2, CMP2, CHK2, CALLM, RTM and BKPT CAS and CAS2 are not reliable on the Amiga. CMP2 and CHK2 are trapped on the 68060. CALLM/RTM are only on the 68020 and not really useful. If anyone sees a glaring 68k compatibility problem with this then speak up. The Apollo core should be very forgiving of self-modifying code which will probably be better for 68k compatibility than supporting some rarely used instructions. |
|
|
|
|
|
#53 | |
|
Oldskool Demo Coder
|
PRE-EDIT: gosh, why do I reply to the message in the inbox.
Kept the below text cos I think it voices similar previously expressed opinions in more detail.Quote:
![]() In the same list of "illegal" instructions are: clr.w certain custom chip registers, yet you wouldn't remove the clr instruction, would you? Betcha a movep to BLTSIZ wouldn't be very healthy either! Backwards compatibility is easy, forwards compatibility is harder. Now possibly made impossible by not supporting an instruction that has been in every 680x0 CPU! Please tell me they are reconsidering. ![]() Imagine that, a single sentence in a book becoming law. I think this is how myths become religions. Also: betcha I can make CAS work fine on accelerated Amigas. Trapping for patches is ...*oof* fine I guess... *grumble* *suspicious look*
__________________
Henrik. Programs Amiga demos, iPhone apps, websites, etc. A1000/512k - A500 2.0/040@28/4M/.5M slowmem/8M/SCSI/CF - A600 portable II 3.1/ACA630/WiFi/CF - 'A1700' 3.1/68060@80/64M/IDE-Fix Express/CF - etc."The difference between PC and Amiga is that 10yo PCs are worth $0. 20yo Amigas are worth a lot, and Amigas that are only 15yo cost a fortune!" If you like Portal 2, try my >> single player and cooperation maps << |
|
|
|
|
|
|
#54 | |||
|
Computer Nerd
Join Date: Sep 2007
Location: Rotterdam/Netherlands
Age: 36
Posts: 1,588
|
Quote:
![]() Quote:
Quote:
Perhaps FPGAArcade is a better choice for classic users, seeing how Natami removes what ever it wants so that it can reuse the encoding space. All those extra instructions aren't any good anyway. Software that would work perfectly fine on 680x0, won't work now. Natami is looking less attractive by the second.
__________________
Random number generation is the art of producing pure gibberish as quickly as possible. - Bob Jenkins |
|||
|
|
|
|
|
#55 | ||
|
Registered User
Join Date: Jan 2010
Location: Kansas
Posts: 205
|
Quote:
Quote:
CAS 19 cycles TAS 17 cycles (in memory) You can do the same faster with replacement code. If it was faster in any case on the Amiga then someone would have used it but it's not and that's why it's gone unused. CAS is useless without a working read-modify-write cycle that's slow on a modern processor. |
||
|
|
|
|
|
#56 | ||||
|
Registered User
Join Date: Jan 2010
Location: Kansas
Posts: 205
|
Quote:
Quote:
Quote:
Quote:
. |
||||
|
|
|
|
|
#57 |
|
is long gone
Join Date: Apr 2007
Location: London
Posts: 1,590
|
I won't say anything about what I do or don't think are the rights and wrongs of Natami compatibility or about who I do or don't agree with in the preceding discussion.
The reason I won't is that I can see that my (our) nice cosy 68000 optimisations thread, that up until now has been very useful, will very quickly descend into an off topic Natami compatibility thread. ![]() As it happens I think a thread about Natami CPU compatibility would be very interesting, but please, really do go and make it another thread. ![]() |
|
|
|
|
|
#58 |
|
Registered User
Join Date: Dec 2007
Location: Dark Kingdom
Posts: 114
|
may you explain to me these two optimizations?
|
|
|
|
|
|
#59 | |
|
Computer Nerd
Join Date: Sep 2007
Location: Rotterdam/Netherlands
Age: 36
Posts: 1,588
|
Quote:
![]() Here's one. It clamps d0 to 255 at an overflow. Use after a vlaue has been added to d0: Code:
subx.b d1,d1 or.b d1,d0
__________________
Random number generation is the art of producing pure gibberish as quickly as possible. - Bob Jenkins |
|
|
|
|
|
|
#60 | |
|
Oldskool Demo Coder
|
Quote:
CAS was mentioned. The thing is, compatibility has never been about performance but in the case of Amiga, not have to rely on Amiga programmers who have perhaps moved on (in any sense) to update software to not have it become obsolete. It might have already been used in 4K ztravaganza ztrordinairez, or I might do one just to spite you! (Well, not really feeling like it but there's the size aspect of optimization as well.) There's always been a limit to how many % of software a given ever so compatible Amiga or Amiga successor platform can support, but it's been due to other things than yanking out instructions and more about instruction behavior, caching, speed, and OS code. A compiler can make the programmer forget about the instruction set altogether, but this forum IS basically about the instruction set. And the chipsets.I'm not poking my finger in a potential success story like Natami and trapping and patching is one way (grumble) for compatibility, but as pointed out for real Amiga users to not use instructions demonstrably working on an Amiga is... not really relevant to optimization which is this topic. ![]() I think specifics of Natami supports points to its nearing conclusion, which is exciting! - and I'll help move any posts you wish regarding it or other nextgen Amiga clones to the NextGen forum. ![]()
__________________
Henrik. Programs Amiga demos, iPhone apps, websites, etc. A1000/512k - A500 2.0/040@28/4M/.5M slowmem/8M/SCSI/CF - A600 portable II 3.1/ACA630/WiFi/CF - 'A1700' 3.1/68060@80/64M/IDE-Fix Express/CF - etc."The difference between PC and Amiga is that 10yo PCs are worth $0. 20yo Amigas are worth a lot, and Amigas that are only 15yo cost a fortune!" If you like Portal 2, try my >> single player and cooperation maps << |
|
|
|
|
|
|
#61 |
|
Oldskool Demo Coder
|
Well, the prefetch feature of the 68000 is no secret. My theory was, this will cause an internal stage and another internal stage XOR a word memory access (total 2x 4 cycles) to be executed before a blit starts. The theory hasn't been tested for much more than DIVSing perspective while drawing lines 23 years ago, basically cos I couldn't find anything else that was more useful that wasn't a normal sub-12 cycle instruction. Sometimes the lines would be shorter than the DIVS cycle time of course, but it was rare. The point was that it was started immediately thus calculated internally in parallel finishing faster.
The other one is aligning table lookups (usually 14c) or a taken branch (10c) and similar with the alternating 4-cycle CMA/DMA memory access. In the vblank period, when no DMA is active it's "as written", just sum up the cycles. But while actually displaying something some of them would just be out of luck and have their CMA execute the NEXT 4-cycle slot the bitplane DMA wasn't hogging access. Normally this is too much work really (really!) since you can't really go "oh, I'll halve the number of colors on screen and I'll be able to fit one or two CMA's between bitplane accesses" cos you'd have ruined the original idea (by making it look shit) and also would have gained much more already, by removing a bitplane's DMA, both for blitter and CPU. ![]() So I haven't tried this unless I got some routine right by accident so I expect someone is going to debunk it instantly (and thunderously!)But it's basically the last straw to grip when a frameful of effect is a sequence of perfectly and godlikely optimized instructions (according to yourself of course). Considering you'd likely have to sync with raster at the start of something, you'd probably lose more by that sync than you gained! But there might be a situation. Not one that wouldn't be completely 'surpassed' by precalc or infinite bobs or whatever, of course. Hah. ![]()
__________________
Henrik. Programs Amiga demos, iPhone apps, websites, etc. A1000/512k - A500 2.0/040@28/4M/.5M slowmem/8M/SCSI/CF - A600 portable II 3.1/ACA630/WiFi/CF - 'A1700' 3.1/68060@80/64M/IDE-Fix Express/CF - etc."The difference between PC and Amiga is that 10yo PCs are worth $0. 20yo Amigas are worth a lot, and Amigas that are only 15yo cost a fortune!" If you like Portal 2, try my >> single player and cooperation maps << |
|
|
|
|
|
#62 |
|
68k wisdom
Join Date: Nov 2007
Location: Lyon (France)
Age: 40
Posts: 980
|
A few coding tricks, not specific to 68000 but still ok there i think :
Code:
; sgn - returns d1=0 if d0=0, d1=1 if d0>0, or d1=-1 if d0<0 add.l d0,d0 subx.l d1,d1 negx.l d0 addx.l d1,d1 ; quick-test to check if one byte of d0 is 00 move.l d0,d1 not.l d0 sub.l #$01010101,d1 and.l #$80808080,d0 and.l d0,d1 bne null_byte_found ; check if a=b, (d0=a, d1=b, range 0000-7FFF), but true in all cases if b=$ffff eor.w d1,d0 bgt not_equal ; instead of : scs d0 ext.w d0 ; or extb.l d0 ext.l d0 ; ; write : subx.l d0,d0 ; to see if a value is between $FFFF8000 and $7FFF, better put it in An reg : cmpa.w a0,a0 ; cmp with a0.w extended to .l, and a0.l
__________________
He who insults the other in a discussion is the one who's wrong. |
|
|
|
|
|
#63 |
|
Oldskool Demo Coder
|
Trying to optimize often leads to a few lines of strange new code that does it faster or shorter but looks irrelevant to the task
Even though this looks more like good code for implementing variable typing in a higher level language, I liked it.
__________________
Henrik. Programs Amiga demos, iPhone apps, websites, etc. A1000/512k - A500 2.0/040@28/4M/.5M slowmem/8M/SCSI/CF - A600 portable II 3.1/ACA630/WiFi/CF - 'A1700' 3.1/68060@80/64M/IDE-Fix Express/CF - etc."The difference between PC and Amiga is that 10yo PCs are worth $0. 20yo Amigas are worth a lot, and Amigas that are only 15yo cost a fortune!" If you like Portal 2, try my >> single player and cooperation maps << |
|
|
|
|
|
#64 | |
|
is long gone
Join Date: Apr 2007
Location: London
Posts: 1,590
|
Quote:
Followed by a few minutes of groping through hazy memories and realising: oh, yeah, that's why. ![]() It's another reason why I personally find it difficult to nigh on impossible to figure out other people's demo code. They did so many weird little things and optimisations that only they understood the reason for that I've got no chance. Much easier to code your own effects from scratch than figure out how some other coder did it their way. ![]() |
|
|
|
|
|
|
#65 |
|
Registered User
Join Date: Nov 2009
Location: Herford / Germany
Posts: 265
|
That's why most programming languages allow comments.
![]() |
|
|
|
|
|
#66 |
|
68k wisdom
Join Date: Nov 2007
Location: Lyon (France)
Age: 40
Posts: 980
|
I second that. Whenever i use a "trick" in asm, i add comments for each line.
But, of course, when you re-source a program, comments are gone ![]()
__________________
He who insults the other in a discussion is the one who's wrong. |
|
|
|
|
|
#67 |
|
AMOS Extensions Developer
Join Date: Jun 2007
Location: near Cambridge, UK
Age: 33
Posts: 927
|
Some great tips here
![]() Anyone else think this thread is worthy of being made "sticky"? Regards, Lonewolf10 |
|
|
|
|
|
#68 |
|
Registered User
Join Date: Dec 2007
Location: Dark Kingdom
Posts: 114
|
I second that. But I would suggest to move the thread in the ASM section
|
|
|
|
|
|
#69 |
|
68k wisdom
Join Date: Nov 2007
Location: Lyon (France)
Age: 40
Posts: 980
|
Perhaps there is a little bit too much OT here to do that, huh ?
__________________
He who insults the other in a discussion is the one who's wrong. |
|
|
|
|
|
#70 |
|
is long gone
Join Date: Apr 2007
Location: London
Posts: 1,590
|
Instead of this:
Code:
cmpi.l #num,Dn Code:
moveq.l #num,Dn
cmp.l Dn,Dn
Last edited by pmc; 16 June 2012 at 11:36. Reason: got Stung |
|
|
|
|
|
#71 |
|
Oldskool Demo Coder
|
Yes, and one I use a lot is masking or subtracting stuff "to another register". When you do gfx stuff you often go
Code:
moveq #15,d1 and.w d0,d1 Thread moved to asm forum and made sticky 8)
__________________
Henrik. Programs Amiga demos, iPhone apps, websites, etc. A1000/512k - A500 2.0/040@28/4M/.5M slowmem/8M/SCSI/CF - A600 portable II 3.1/ACA630/WiFi/CF - 'A1700' 3.1/68060@80/64M/IDE-Fix Express/CF - etc."The difference between PC and Amiga is that 10yo PCs are worth $0. 20yo Amigas are worth a lot, and Amigas that are only 15yo cost a fortune!" If you like Portal 2, try my >> single player and cooperation maps << |
|
|
|
|
|
#72 | |
|
move.l #$c0ff33,throat
Join Date: Dec 2005
Location: Berlin/Joymoney
Posts: 4,547
|
Quote:
![]()
__________________
Makes me sick when I hear all the shit that you say So much crap coming out, it must take you all day There's a space kept in hell with your name on the seat With a spike in the chair just to make it complete |
|
|
|
|
|
|
#73 |
|
is long gone
Join Date: Apr 2007
Location: London
Posts: 1,590
|
Doh! Stung again!
![]() Original post now edited. ![]() |
|
|
|
|
|
#74 |
|
Registered User
Join Date: Dec 2007
Location: Dark Kingdom
Posts: 114
|
@pmc: you probably meant to keep the small immediate value in a register different to the one against which you do the cmp:
moveq.l #num,Dx cmp.l Dx,Dn |
|
|
|
|
|
#75 |
|
is long gone
Join Date: Apr 2007
Location: London
Posts: 1,590
|
Yes. That was supposed to be implied but, as you say, it reads rather ambiguously. It's much more clear written your way.
![]() |
|
|
|
|
|
#76 |
|
is long gone
Join Date: Apr 2007
Location: London
Posts: 1,590
|
Here's on optimisation I worked out ages ago using shifting and adding instead of multiplying.
Maybe obvious or well known to others, or maybe not but well... might be useful to someone ![]() As an example, the eight binary digits in a byte represent the decimal numbers: 128 64 32 16 8 4 2 1 So, multiplying a number by shifting is pretty easy: shift left once to multiply a number by 2 for example. Code:
lsl.w #1,d0 But what about multiplying to other numbers? I've found that it's possible to do a couple of shifts and an add to multiply to other numbers. For example, if I wanted to multiply a number by 40 - in the binary digits above, there's no 40 but there are a 32 and an 8. And, as luck would have it, 32 + 8 = 40 So, if I shift a number left by five (multiply by 32) and take the same number and shift it left by three (multiply by 8) and then add the two results Code:
move.w d0,d1
lsl.w #3,d0
lsl.w #5,d1
add.w d1,d0
![]() It can also work with more than two additions - if I wanted to multiply a number by 56: Code:
move.w d0,d1
move.w d0,d2
lsl.w #3,d0
lsl.w #4,d1
lsl.w #5,d2
add.w d2,d1
add.w d1,d0
Also, you do have to watch out for shifting digits "off the end" of the size the registers in use can hold. |
|
|
|
|
|
#77 |
|
move.l #$c0ff33,throat
Join Date: Dec 2005
Location: Berlin/Joymoney
Posts: 4,547
|
On 68000, instead of doing shifts/adds, you could also use a multiplication table. Disadvantage is that you might need a spare address register (depending on where in memory your table is) and that the table needs some memory of course. Advantage is that it is faster than lots of shifts+adds.
So f.e. if you want to multiply a number in d0 by 56 you'd do this: lea multab(pc),a0 add.w d0,d0 move.w (a0,d0.w),d0 ...
__________________
Makes me sick when I hear all the shit that you say So much crap coming out, it must take you all day There's a space kept in hell with your name on the seat With a spike in the chair just to make it complete |
|
|
|
|
|
#78 |
|
is long gone
Join Date: Apr 2007
Location: London
Posts: 1,590
|
Oh yes, definitely - pre multiplying your values and just dragging them out of a table by index is better than doing calculations in the code but you know, it's nice to have options
![]() |
|
|
|
|
|
#79 |
|
move.l #$c0ff33,throat
Join Date: Dec 2005
Location: Berlin/Joymoney
Posts: 4,547
|
Of course it is.
Sometimes you don't even have the memory required for the table f.e. I just mentioned it for the sake of completeness. ![]()
__________________
Makes me sick when I hear all the shit that you say So much crap coming out, it must take you all day There's a space kept in hell with your name on the seat With a spike in the chair just to make it complete |
|
|
|
|
|
#80 |
|
Moderator
|
If you want to multiply by "nice" numbers like 40 on a 68000 and not use a multiplication table, you should do the following to avoid a second slow lsl operation rather than pmc's method:
Code:
lsl.w #3,d0 ;d0 = Number * 8
move.w d0,d1 ;d1 = Number * 8
add.w d1,d1 ;d1 = Number * 16
add.w d1,d1 ;d1 = Number * 32
add.w d1,d0 ;d0 = Number * 40
Code:
lsl.w #4,d0 ;d0 = Number * 16
move.w d0,d1 ;d1 = Number * 16
add.w d1,d1 ;d1 = Number * 32
add.w d1,d0 ;d0 = Number * 48
Code:
lsl.w #3,d0 ;d0 = Number * 8
move.w d0,d1 ;d1 = Number * 8
add.w d1,d1 ;d1 = Number * 16
move.w d1,d2 ;d2 = Number * 16
add.w d2,d2 ;d2 = Number * 32
add.w d2,d1 ;d1 = Number * 48
add.w d1,d0 ;d0 = Number * 56
Code:
lsl.w #3,d0 ;d0 = Number * 8
move.w d0,d1 ;d1 = Number * 8
lsl.w #3,d0 ;d0 = Number * 64
sub.w d1,d0 ;d0 = Number * 56
Last edited by Codetapper; 20 June 2012 at 10:44. |
|
|
|
![]() |
| Currently Active Users Viewing This Thread: 1 (0 members and 1 guests) | |
| Thread Tools | |
|
|
Similar Threads
|
||||
| Thread | Thread Starter | Forum | Replies | Last Post |
| New opcode for 68000 family | clenched | request.UAE Wishlist | 15 | 14 April 2009 15:02 |
| Looking for 68000 CPU Connector | BinoX | support.Hardware | 6 | 11 June 2007 13:01 |
| quitting on 68000? | Hungry Horace | project.WHDLoad | 60 | 19 December 2006 20:17 |
| 68000 Div/divu | dlfrsilver | support.WinUAE | 3 | 01 November 2005 11:31 |
| 3D code and/or internet code for Blitz Basic 2.1 | EdzUp | Retrogaming General Discussion | 0 | 10 February 2002 11:40 |